elanous 0.2.34 → 0.2.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (802) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/chunks/{abb4b98b.163e0f56e84ae35d.js → 053a429e.9a63436527cc751c.js} +1 -1
  4. package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +287 -0
  5. package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +64 -0
  11. package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +36 -0
  12. package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +149 -0
  15. package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/{6086.913a69e6fa3e4a8b.js → 2683.c9773a0c589b031b.js} +4 -4
  20. package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +24 -0
  21. package/apps/pwa/out/_next/static/chunks/{5576-82d3703636d5c4b9.js → 275-02ea4c2a33980422.js} +3 -3
  22. package/apps/pwa/out/_next/static/chunks/{ffdc3a04.b9c23c1b28dd4a96.js → 2812ca6a.3b9f4a7a08885744.js} +1 -1
  23. package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +24 -0
  26. package/apps/pwa/out/_next/static/chunks/{9550.d5f76828f972058c.js → 2986.45d7652e4f13557e.js} +2 -2
  27. package/apps/pwa/out/_next/static/chunks/3031-85328a92fcce4da6.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/{8817.61bb7ffbba502ecb.js → 3136.30aaaa5fa03662a3.js} +1 -1
  29. package/apps/pwa/out/_next/static/chunks/{9131-fce7256c4180c4a5.js → 3148-98efd4869d660a87.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/{3498.cf2a15a8a9e5b926.js → 3155.2587a55196ecb394.js} +3 -3
  31. package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/{3103.84470c8445962f04.js → 3324.a09703033abcbd2f.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +8 -0
  36. package/apps/pwa/out/_next/static/chunks/3410.7f9af5ab77cbe65f.js +115 -0
  37. package/apps/pwa/out/_next/static/chunks/{3819.163d4777f0a597f6.js → 3538.a445e50bb359d068.js} +2 -2
  38. package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +286 -0
  40. package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/{3414.172ad4ca2d9b08e8.js → 3727.7949ccaacaa71242.js} +2 -2
  42. package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3757-180308bc61021b05.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +74 -0
  45. package/apps/pwa/out/_next/static/chunks/3840-5825d56d46976a92.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/{9b48c871.204d5d13e7809bd0.js → 3a3d9966.cc4d4585a2708e7c.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4116.a84a92a2492c080e.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +104 -0
  51. package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/{6740.43de73fc427c9fe2.js → 4286.b70c4520306817e8.js} +1 -1
  53. package/apps/pwa/out/_next/static/chunks/4304.e9b2512834a9e23e.js +23 -0
  54. package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{8548.036c344973968847.js → 4615.8525eb0add35eba6.js} +1 -1
  56. package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +148 -0
  57. package/apps/pwa/out/_next/static/chunks/{3411-f87314c6c66ebc73.js → 5085-bce4904931767ca6.js} +1 -1
  58. package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +93 -0
  59. package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/{3110.0a7065f25c841818.js → 528.38ce20ef8aa251ff.js} +16 -16
  61. package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +122 -0
  62. package/apps/pwa/out/_next/static/chunks/{1644.35dd25240ae24e4b.js → 552.b7d061ad91eeac51.js} +2 -2
  63. package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{3837.722e053fb9f321ad.js → 5711.957b095705c12560.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/{2124.ed5bf480cea7f85b.js → 575.d929793a53f27c4b.js} +1 -1
  66. package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{7562.948255cbc3e79d33.js → 599.c39c571b6733f2a2.js} +2 -2
  70. package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +79 -0
  71. package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/6566.926a1d1b7c911442.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +27 -0
  84. package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/{5446.edf141cff9ef647d.js → 6925.562d532110879886.js} +1 -1
  86. package/apps/pwa/out/_next/static/chunks/{7005.1623d2aea78eb85f.js → 6943.c6b24124853a47b2.js} +1 -1
  87. package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/{8368.014caa8de2f5af34.js → 7481.39f7a4654907bf6e.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/{2554.3b5e200f5f5cfcd6.js → 771.c3cdb6c1f7f47c02.js} +16 -16
  92. package/apps/pwa/out/_next/static/chunks/7784.1f0ac4a16d190cf4.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{3121.779fafe3e44612c5.js → 7891.03f910124a737985.js} +1 -1
  96. package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8037.e254fd797aa224d1.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +62 -0
  100. package/apps/pwa/out/_next/static/chunks/{9a8cb466.cc9fc9e6e46038aa.js → 873d6c12.09bd499f57171543.js} +1 -1
  101. package/apps/pwa/out/_next/static/chunks/{7431.3051e9b8a4372d2d.js → 8904.7d51af2dc033965c.js} +2 -2
  102. package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +90 -0
  104. package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +94 -0
  105. package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/{1895-60ed0e341c658bd4.js → 9250-072df22eaadaa6b5.js} +1 -1
  107. package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +77 -0
  111. package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/{2547.dd27303624cb4da8.js → 9514.131c52cc75fe6439.js} +1 -1
  115. package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9f31e478.fefcbcd3c388ebc5.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/{page-4fb31eb476dcbad3.js → page-083747f1d4518f61.js} +1 -1
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-e7abc34a48a6f71e.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-c15958835534404b.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{5014f970-22bef0b5210f7d60.js → ccae1c4b-0cf414f5eff1b10d.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/{4fa33ebd.21c1bd5b294496e6.js → ceba0382.650712b56b85b582.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/da5ecc5c-b005ad8cac737d57.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +1 -0
  183. package/apps/pwa/out/_next/static/{L04y73dlwKeTW-GetaTF3 → uC-N0emedeNOFuaBQFv-I}/_buildManifest.js +1 -1
  184. package/apps/pwa/out/approvals/index.html +1 -1
  185. package/apps/pwa/out/approvals/index.txt +22 -22
  186. package/apps/pwa/out/autopilot/index.html +1 -1
  187. package/apps/pwa/out/autopilot/index.txt +22 -22
  188. package/apps/pwa/out/board/index.html +1 -1
  189. package/apps/pwa/out/board/index.txt +22 -22
  190. package/apps/pwa/out/botlab/index.html +1 -1
  191. package/apps/pwa/out/botlab/index.txt +21 -21
  192. package/apps/pwa/out/bots/index.html +1 -1
  193. package/apps/pwa/out/bots/index.txt +21 -21
  194. package/apps/pwa/out/ceo/index.html +1 -1
  195. package/apps/pwa/out/ceo/index.txt +22 -22
  196. package/apps/pwa/out/chat/index.html +1 -1
  197. package/apps/pwa/out/chat/index.txt +21 -21
  198. package/apps/pwa/out/consult/index.html +1 -1
  199. package/apps/pwa/out/consult/index.txt +22 -22
  200. package/apps/pwa/out/control/index.html +1 -1
  201. package/apps/pwa/out/control/index.txt +22 -22
  202. package/apps/pwa/out/decisions/index.html +1 -1
  203. package/apps/pwa/out/decisions/index.txt +21 -21
  204. package/apps/pwa/out/design-check/index.html +1 -1
  205. package/apps/pwa/out/design-check/index.txt +22 -22
  206. package/apps/pwa/out/editor/index.html +1 -1
  207. package/apps/pwa/out/editor/index.txt +22 -22
  208. package/apps/pwa/out/exec/index.html +1 -1
  209. package/apps/pwa/out/exec/index.txt +22 -22
  210. package/apps/pwa/out/field/index.html +1 -1
  211. package/apps/pwa/out/field/index.txt +22 -22
  212. package/apps/pwa/out/healthz +1 -1
  213. package/apps/pwa/out/index.html +1 -1
  214. package/apps/pwa/out/index.txt +21 -21
  215. package/apps/pwa/out/inside/index.html +1 -1
  216. package/apps/pwa/out/inside/index.txt +21 -21
  217. package/apps/pwa/out/intake/index.html +1 -1
  218. package/apps/pwa/out/intake/index.txt +22 -22
  219. package/apps/pwa/out/live/index.html +1 -1
  220. package/apps/pwa/out/live/index.txt +22 -22
  221. package/apps/pwa/out/live-run/index.html +1 -1
  222. package/apps/pwa/out/live-run/index.txt +22 -22
  223. package/apps/pwa/out/loops/index.html +1 -1
  224. package/apps/pwa/out/loops/index.txt +21 -21
  225. package/apps/pwa/out/market/index.html +1 -1
  226. package/apps/pwa/out/market/index.txt +21 -21
  227. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  228. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  229. package/apps/pwa/out/morning/index.html +1 -1
  230. package/apps/pwa/out/morning/index.txt +22 -22
  231. package/apps/pwa/out/observatory/index.html +1 -1
  232. package/apps/pwa/out/observatory/index.txt +22 -22
  233. package/apps/pwa/out/ops/checklist/index.html +1 -1
  234. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  235. package/apps/pwa/out/ops/release/index.html +1 -1
  236. package/apps/pwa/out/ops/release/index.txt +21 -21
  237. package/apps/pwa/out/ops/seats/index.html +1 -1
  238. package/apps/pwa/out/ops/seats/index.txt +21 -21
  239. package/apps/pwa/out/outputs/index.html +1 -1
  240. package/apps/pwa/out/outputs/index.txt +21 -21
  241. package/apps/pwa/out/reflection/index.html +1 -1
  242. package/apps/pwa/out/reflection/index.txt +22 -22
  243. package/apps/pwa/out/scheduler/index.html +1 -1
  244. package/apps/pwa/out/scheduler/index.txt +22 -22
  245. package/apps/pwa/out/sessions/index.html +1 -1
  246. package/apps/pwa/out/sessions/index.txt +21 -21
  247. package/apps/pwa/out/settings/devices/index.html +1 -1
  248. package/apps/pwa/out/settings/devices/index.txt +22 -22
  249. package/apps/pwa/out/settings/index.html +1 -1
  250. package/apps/pwa/out/settings/index.txt +22 -22
  251. package/apps/pwa/out/setup/done/index.html +1 -1
  252. package/apps/pwa/out/setup/done/index.txt +22 -22
  253. package/apps/pwa/out/setup/index.html +1 -1
  254. package/apps/pwa/out/setup/index.txt +22 -22
  255. package/apps/pwa/out/share/index.html +1 -1
  256. package/apps/pwa/out/share/index.txt +22 -22
  257. package/apps/pwa/out/showroom/index.html +1 -1
  258. package/apps/pwa/out/showroom/index.txt +21 -21
  259. package/apps/pwa/out/tasks/index.html +1 -1
  260. package/apps/pwa/out/tasks/index.txt +22 -22
  261. package/apps/pwa/out/term/index.html +1 -1
  262. package/apps/pwa/out/term/index.txt +22 -22
  263. package/apps/pwa/out/today/index.html +1 -1
  264. package/apps/pwa/out/today/index.txt +22 -22
  265. package/apps/pwa/out/trace/index.html +1 -1
  266. package/apps/pwa/out/trace/index.txt +22 -22
  267. package/apps/pwa/out/vault/index.html +1 -1
  268. package/apps/pwa/out/vault/index.txt +22 -22
  269. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  270. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  271. package/apps/pwa/out/workflows/index.html +1 -1
  272. package/apps/pwa/out/workflows/index.txt +22 -22
  273. package/apps/pwa/out/workspace/index.html +1 -1
  274. package/apps/pwa/out/workspace/index.txt +22 -22
  275. package/apps/pwa/out/worktrees/index.html +1 -1
  276. package/apps/pwa/out/worktrees/index.txt +22 -22
  277. package/bin/elanous.mjs +3 -2
  278. package/catalog/providers/opengateway.yaml +25 -0
  279. package/docs/goal-context/01-goal-authoring-checks.md +8 -0
  280. package/docs/goal-context/03-verification-menu.md +24 -0
  281. package/docs/goal-context/04-mock-scenarios.md +100 -0
  282. package/docs/goal-context/05-authoring-lessons.jsonl +47 -0
  283. package/docs/goal-context/README.md +7 -0
  284. package/graphs/catalog/catalog.yaml +1 -1
  285. package/graphs/default-loop.yaml +63 -4
  286. package/graphs/document-loop.yaml +51 -3
  287. package/graphs/implement-loop.yaml +77 -4
  288. package/graphs/journey/ta-journey.yaml +11 -1
  289. package/graphs/journey/units/author-dialogue/author-dialogue.yaml +42 -0
  290. package/graphs/journey/units/author-dialogue/observe.ts +96 -0
  291. package/graphs/journey/units/author-dialogue/recipes.yaml +10 -0
  292. package/graphs/operate-loop.yaml +51 -3
  293. package/graphs/release/recipes.yaml +6 -0
  294. package/graphs/release/release-loop.yaml +17 -4
  295. package/graphs/research-loop.yaml +137 -3
  296. package/graphs/test-diet/test-diet.yaml +3 -0
  297. package/graphs/wizard/recipes.yaml +44 -0
  298. package/graphs/wizard/wizard-loop.yaml +44 -0
  299. package/graphs/work/research-report.yaml +2 -0
  300. package/package.json +1 -1
  301. package/scripts/ci-typecheck-changed.ts +139 -5
  302. package/scripts/coord-role-pack.ts +19 -6
  303. package/scripts/first10-gate.ts +416 -0
  304. package/scripts/fleet/wsl-node-setup.sh +432 -0
  305. package/scripts/hq/standby-snapshot.ts +17 -12
  306. package/scripts/release-loop/docs-land-node.ts +21 -5
  307. package/scripts/release-loop/docs-node.ts +204 -8
  308. package/scripts/release-loop/gate-baseline-receipt.ts +155 -0
  309. package/scripts/release-loop/gate-node.ts +427 -72
  310. package/scripts/release-loop/gate-partial.ts +65 -11
  311. package/scripts/release-loop/gate-radius-live.ts +177 -0
  312. package/scripts/release-loop/gate-radius-shadow.ts +1 -1
  313. package/scripts/release-loop/node-verdict.ts +14 -1
  314. package/scripts/release-loop/npm-publish-node.ts +66 -12
  315. package/scripts/release-loop/probe-pod-host-dirs-live.ts +5 -0
  316. package/scripts/release-loop/pwa-remote.ts +166 -0
  317. package/scripts/release-loop/pwa-scenarios-node.ts +19 -3
  318. package/scripts/release-loop/resume-cap.ts +14 -34
  319. package/scripts/release-loop/resume-release.ts +78 -15
  320. package/scripts/release-loop/traffic-node.ts +59 -0
  321. package/scripts/release-loop/traffic-transition.ts +159 -0
  322. package/scripts/release-loop/unattended-release.ts +2 -0
  323. package/scripts/rhythm/daily.ts +137 -3
  324. package/scripts/test-diet/lib.ts +6 -1
  325. package/scripts/test-diet/node.ts +194 -13
  326. package/scripts/ux-sim.ts +92 -0
  327. package/skills/README.md +1 -0
  328. package/src/acp/core-turn-bridge.ts +48 -6
  329. package/src/agent/delegate-hint.ts +16 -0
  330. package/src/agent/runner.ts +82 -2
  331. package/src/agent/self-ambient-cache.ts +8 -0
  332. package/src/agent/task-notification.ts +56 -10
  333. package/src/agent/types.ts +4 -0
  334. package/src/agent-substrate/acp-reviewer.ts +39 -4
  335. package/src/agent-substrate/pr-reviewer.ts +72 -3
  336. package/src/agent-substrate/review-intent.ts +29 -2
  337. package/src/agent-substrate/review-observation.ts +3 -0
  338. package/src/agent-substrate/self-review-cli.ts +229 -28
  339. package/src/autopilot/mission-codebase-gate.ts +141 -12
  340. package/src/autopilot/pr-manager.ts +240 -41
  341. package/src/boot/daemon-tools/self-implement.ts +1 -0
  342. package/src/budget/run-usage-rollup.ts +1 -0
  343. package/src/budget/usage-outcomes.ts +8 -4
  344. package/src/capture/tui-self-report.ts +102 -0
  345. package/src/chat/goal-continue-verdict.ts +41 -0
  346. package/src/chat/index.ts +30 -6
  347. package/src/chat/internal-turn-origin.ts +1 -0
  348. package/src/chat/paste-fold.ts +86 -0
  349. package/src/chat/pickers/modal-runtime.ts +10 -27
  350. package/src/chat/tool-render/block.ts +32 -0
  351. package/src/chat/tool-render/dispatch.ts +2 -20
  352. package/src/chat/tool-render/result-text.ts +98 -0
  353. package/src/chat/turn-typeahead.ts +70 -7
  354. package/src/cli/agent-cli.ts +13 -2
  355. package/src/cli/config-audit.ts +119 -0
  356. package/src/cli/doctor-cli.ts +26 -1
  357. package/src/cli/guardian-cli.ts +10 -0
  358. package/src/cli/herdr-cli.ts +34 -0
  359. package/src/cli/light-entry-route.ts +50 -7
  360. package/src/cli/log-event-names.ts +2 -0
  361. package/src/cli/make-cli.ts +247 -11
  362. package/src/cli/msg-cli.ts +117 -3
  363. package/src/cli/pod-cli.ts +77 -3
  364. package/src/cli/pr-cli.ts +34 -18
  365. package/src/cli/pr-land-base-read.ts +11 -2
  366. package/src/cli/pr-land-heavy-remote.ts +6 -3
  367. package/src/cli/pr-land-overlap-evidence.ts +23 -4
  368. package/src/cli/pr-land-pod-shadow-job.ts +3 -0
  369. package/src/cli/pr-land-recovery.ts +117 -1
  370. package/src/cli/pty-takeover-cli.ts +8 -7
  371. package/src/cli/release-checklist-read-cli.ts +79 -0
  372. package/src/cli/release-cli.ts +92 -106
  373. package/src/cli/release-single-flight.ts +1 -1
  374. package/src/cli/remote-resolve.ts +1 -1
  375. package/src/cli/root-tui-entry.ts +48 -0
  376. package/src/cli/sim-cli.ts +22 -0
  377. package/src/cli/tasks-card-show.ts +162 -0
  378. package/src/cli/tasks-cli.ts +1065 -338
  379. package/src/cli/tasks-read-cli.ts +197 -0
  380. package/src/cli/usage-cli.ts +13 -11
  381. package/src/clipboard/history.ts +179 -13
  382. package/src/config.ts +8 -1
  383. package/src/core-turn/run-core-turn.ts +4 -2
  384. package/src/core-turn/run-goal-loop.ts +73 -16
  385. package/src/core-turn/types.ts +6 -1
  386. package/src/dashboard/chat/acp-chat.ts +8 -0
  387. package/src/dashboard/context/keys.ts +8 -31
  388. package/src/dashboard/index.ts +280 -59
  389. package/src/dashboard/input/agent-wake.ts +7 -1
  390. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +146 -3
  391. package/src/dashboard/input/chat-main-slash-command.ts +4 -2
  392. package/src/dashboard/input/goal-continue.ts +210 -0
  393. package/src/dashboard/input/goal-interim.ts +2 -0
  394. package/src/dashboard/input/internal-turn.ts +2 -8
  395. package/src/dashboard/input/seat-autowake.ts +9 -7
  396. package/src/dashboard/input/turn-autoheal.ts +52 -0
  397. package/src/dashboard/render/theme-resolver.ts +33 -4
  398. package/src/dashboard/seat-boot-preamble.ts +132 -5
  399. package/src/dashboard/slash-runtime/chat-persona.ts +65 -8
  400. package/src/dashboard/slash-runtime/dashboard-handlers.ts +3 -2
  401. package/src/dashboard/slash-runtime/model-choices.ts +15 -0
  402. package/src/dashboard/stale-install-check.ts +3 -99
  403. package/src/debug/batch-queue.ts +119 -0
  404. package/src/debug/tui-log-tag.ts +67 -0
  405. package/src/display/agent-surface.ts +7 -0
  406. package/src/domains/schedule-registry.ts +16 -2
  407. package/src/domains/standalone-log-sink.ts +15 -2
  408. package/src/esc-abort-gate.ts +69 -0
  409. package/src/git-fs/idle-refresh.ts +76 -0
  410. package/src/git-fs/index.ts +18 -7
  411. package/src/git-fs/worktree.ts +137 -5
  412. package/src/graph-kinds/registry.ts +2 -2
  413. package/src/graph-runner/graph-cli.ts +18 -0
  414. package/src/graph-runner/runner.ts +173 -21
  415. package/src/graph-wizard/generate.ts +108 -4
  416. package/src/graph-wizard/steps.ts +15 -0
  417. package/src/grok/credential.ts +10 -3
  418. package/src/grounding/proactive-ground.ts +86 -0
  419. package/src/harness/control-inbox.ts +49 -1
  420. package/src/harness/harness-cli-command.ts +163 -35
  421. package/src/harness/harness-incidents.ts +85 -1
  422. package/src/harness/launch-utterance-ledger.ts +208 -0
  423. package/src/harness/pod-control-send.ts +33 -5
  424. package/src/harness/self-send-remote.ts +69 -0
  425. package/src/harness/self-send-routing-guard.ts +6 -0
  426. package/src/harness/self-send-target.ts +4 -3
  427. package/src/impl-discipline/detector.ts +16 -4
  428. package/src/impl-discipline/system-prompt.ts +11 -0
  429. package/src/impl-discipline/types.ts +2 -2
  430. package/src/index.ts +822 -154
  431. package/src/input-core/context-key-runtime.ts +21 -0
  432. package/src/intake-plane/already-built-hint.ts +4 -2
  433. package/src/intake-plane/requirement-funnel.ts +29 -1
  434. package/src/light-cli.ts +32 -11
  435. package/src/llm/opengateway-models.ts +11 -0
  436. package/src/llm/provider-credentials.ts +14 -0
  437. package/src/llm/provider-detect.ts +8 -1
  438. package/src/llm/runtime-model-family.ts +2 -1
  439. package/src/llm-wellformed.ts +70 -0
  440. package/src/llm.ts +247 -59
  441. package/src/loops/msg-wake.ts +35 -39
  442. package/src/loops/orchestrator/inbox.ts +59 -11
  443. package/src/loops/orchestrator/knowhow-pack.ts +364 -0
  444. package/src/loops/orchestrator/tick.ts +5 -1
  445. package/src/maturity/feature-maturity.ts +1 -1
  446. package/src/model-tier/llm-tier-map.ts +15 -1
  447. package/src/models/prompts.ts +17 -2
  448. package/src/msg/msg-post-office.ts +116 -0
  449. package/src/mss/logging/log-store.ts +79 -22
  450. package/src/native-tool-catalog.ts +15 -1
  451. package/src/nexus/api/decisions-route.ts +38 -18
  452. package/src/nexus/api/graph-wizard-api.ts +20 -2
  453. package/src/nexus/api/loop-resources.ts +13 -1
  454. package/src/nexus/boot/register-mcp-clients.ts +263 -38
  455. package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
  456. package/src/oauth/codex.ts +7 -0
  457. package/src/onboarding/first-run.ts +37 -6
  458. package/src/onboarding/web-first.ts +43 -11
  459. package/src/ops/overview-collect.ts +30 -9
  460. package/src/ops/overview.ts +22 -9
  461. package/src/persona/loader.ts +11 -0
  462. package/src/persona/types.ts +8 -0
  463. package/src/pr-tool/census.ts +261 -27
  464. package/src/prompt-library/session-guidance.ts +14 -0
  465. package/src/provider-summary.ts +8 -0
  466. package/src/pty-shell/herdr-agent-report.ts +118 -9
  467. package/src/pty-shell/herdr-prompt.ts +266 -0
  468. package/src/pty-shell/pty-control-ipc.ts +151 -8
  469. package/src/pty-shell/pty-manifest.ts +7 -0
  470. package/src/pty-shell/pty-special-keys.ts +42 -2
  471. package/src/pty-shell/stale-install-check.ts +99 -0
  472. package/src/pty-shell/tui-run-state.ts +14 -2
  473. package/src/release-loop/auto-start.ts +20 -2
  474. package/src/release-loop/checklist.ts +100 -4
  475. package/src/release-loop/landed-but-yellow.ts +129 -5
  476. package/src/release-loop/light-rc.ts +1 -0
  477. package/src/release-loop/rehearsal.ts +37 -21
  478. package/src/repl/index.ts +192 -17
  479. package/src/repl/ops-msg-bridge.ts +32 -0
  480. package/src/seat-loop/knowhow-lint.ts +1 -1
  481. package/src/self-dev/ask-launch-flow.ts +44 -5
  482. package/src/self-dev/cli-help-text.ts +17 -0
  483. package/src/self-dev/decompose-proposal.ts +172 -20
  484. package/src/self-dev/decompose.ts +61 -0
  485. package/src/self-dev/dev-cli.ts +48 -12
  486. package/src/self-dev/dev-pipeline.ts +8 -2
  487. package/src/self-dev/draft-residue.ts +37 -1
  488. package/src/self-dev/draft-sweep.ts +137 -11
  489. package/src/self-dev/draft-triage-rules.ts +138 -0
  490. package/src/self-dev/fleet-reduce.ts +3 -2
  491. package/src/self-dev/glm-credential-guard.ts +77 -0
  492. package/src/self-dev/graph-front-nodes.ts +112 -0
  493. package/src/self-dev/graph-journey-nodes.ts +2 -0
  494. package/src/self-dev/graph-journey-route.ts +12 -2
  495. package/src/self-dev/harness-run-cli.ts +3 -15
  496. package/src/self-dev/orchestrate-cli-text.ts +10 -0
  497. package/src/self-dev/orchestrate-cli.ts +68 -3
  498. package/src/self-dev/orchestrate.ts +116 -17
  499. package/src/self-dev/review-provider-fallback.ts +35 -1
  500. package/src/self-dev/run-supervisor.ts +55 -2
  501. package/src/self-dev/run-types.ts +1 -1
  502. package/src/self-dev/self-orchestrate-runtime.ts +1 -11
  503. package/src/self-dev/shard-aggregate.ts +42 -5
  504. package/src/self-dev/shard-run.ts +8 -1
  505. package/src/self-health/autoheal.ts +153 -0
  506. package/src/self-health/signatures.ts +6 -0
  507. package/src/self-implement/blocked-draft-policy.ts +20 -0
  508. package/src/self-implement/classify-shadow.ts +3 -7
  509. package/src/self-implement/device-first.ts +116 -0
  510. package/src/self-implement/doctor-visit.ts +257 -2
  511. package/src/self-implement/evidence-command-budget.ts +80 -0
  512. package/src/self-implement/gate-baseline.ts +56 -17
  513. package/src/self-implement/gate-cli.ts +1 -0
  514. package/src/self-implement/gate-remote.ts +31 -20
  515. package/src/self-implement/goal-author-cli.ts +1 -0
  516. package/src/self-implement/goal-author-decompose.ts +534 -45
  517. package/src/self-implement/goal-author.ts +282 -7
  518. package/src/self-implement/goal-elaborate.ts +449 -0
  519. package/src/self-implement/goal-refine.ts +273 -0
  520. package/src/self-implement/graph-overlay-yaml.ts +14 -3
  521. package/src/self-implement/graph-variant.ts +40 -6
  522. package/src/self-implement/headless-elanous-driver.ts +19 -3
  523. package/src/self-implement/off-diff-evidence.ts +58 -6
  524. package/src/self-implement/orchestrator.ts +370 -62
  525. package/src/self-implement/pod-warm-pool-profile.ts +1 -0
  526. package/src/self-implement/pwa-import-graph.ts +1 -1
  527. package/src/self-implement/rework-budget-judgment.ts +5 -8
  528. package/src/self-implement/rework-policy.ts +30 -0
  529. package/src/self-implement/run-ledger.ts +108 -0
  530. package/src/self-implement/run-stop.ts +10 -1
  531. package/src/self-implement/run-ttl.ts +38 -24
  532. package/src/self-implement/running-runs.ts +29 -1
  533. package/src/self-implement/scope-adjacency.ts +115 -0
  534. package/src/self-implement/seams.ts +187 -28
  535. package/src/self-implement/stop-autoheal.ts +87 -1
  536. package/src/self-implement/wiring-check.ts +358 -0
  537. package/src/session-runtime/index.ts +1 -1
  538. package/src/setup/llm-env-detect.ts +5 -0
  539. package/src/shell-env-bootstrap.ts +11 -4
  540. package/src/skills/runner.ts +4 -2
  541. package/src/skills/tools/agent.ts +408 -40
  542. package/src/skills/tools/msg-ask.ts +100 -0
  543. package/src/skills/tools/ops-ledger.ts +2 -1
  544. package/src/skills/tools/schedule-wakeup.ts +23 -4
  545. package/src/skills/tools/shell.ts +61 -6
  546. package/src/skills/tools/terminal-modal-inject.ts +1 -2
  547. package/src/skills/tools/terminal-modal.ts +10 -8
  548. package/src/skills/url-router.ts +41 -1
  549. package/src/smart-wizard/run.ts +66 -0
  550. package/src/status/bar.ts +34 -6
  551. package/src/status/status-provider-info.ts +37 -6
  552. package/src/steward/hold-hygiene.ts +24 -6
  553. package/src/steward/rejudge-tick.ts +10 -2
  554. package/src/steward/ta-repair-event-collect.ts +17 -6
  555. package/src/steward/triage-budget.ts +194 -0
  556. package/src/steward/triage.ts +20 -3
  557. package/src/task-agent/actions.ts +72 -2
  558. package/src/task-agent/green-sweep.ts +4 -0
  559. package/src/task-agent/land-queue.ts +21 -8
  560. package/src/task-agent/live-moves.ts +182 -10
  561. package/src/task-agent/mission.ts +30 -0
  562. package/src/task-agent/parent-host.ts +123 -3
  563. package/src/task-agent/rejudge-on-head.ts +15 -0
  564. package/src/task-agent/repair-cycle.ts +138 -32
  565. package/src/task-agent/repair-next-move.ts +31 -3
  566. package/src/task-agent/repair-outcomes.ts +29 -0
  567. package/src/task-agent/repair-worker.ts +14 -4
  568. package/src/task-agent/shadow.ts +48 -4
  569. package/src/task-agent/task-card-prefix.ts +2 -0
  570. package/src/task-agent/task-hand.ts +525 -57
  571. package/src/task-agent/task-parent-role-llm.ts +36 -0
  572. package/src/task-agent/tier-split.ts +196 -0
  573. package/src/task-agent/work-order-build.ts +2 -0
  574. package/src/task-agent/work-order.ts +3 -2
  575. package/src/task-orchestrator/generator-prompt.ts +60 -11
  576. package/src/task-orchestrator/surfaces/pod-account-broker.ts +42 -0
  577. package/src/task-orchestrator/surfaces/pod-child-providers.ts +1 -1
  578. package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
  579. package/src/task-orchestrator/surfaces/pod-command-job.ts +130 -11
  580. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
  581. package/src/task-orchestrator/surfaces/pod-image-source.ts +89 -1
  582. package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
  583. package/src/task-orchestrator/surfaces/pod-lease.ts +17 -8
  584. package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +19 -2
  585. package/src/task-orchestrator/surfaces/pod-pool.ts +76 -4
  586. package/src/task-orchestrator/surfaces/pod-provenance.ts +82 -0
  587. package/src/task-orchestrator/surfaces/pod-repair-commit.ts +18 -3
  588. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +16 -0
  589. package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +224 -0
  590. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +201 -0
  591. package/src/task-orchestrator/surfaces/pod-si-warm-provider.ts +444 -0
  592. package/src/task-orchestrator/surfaces/pod-si-warm-runner.ts +387 -0
  593. package/src/task-orchestrator/surfaces/pod-si-warm-transport.ts +157 -0
  594. package/src/task-orchestrator/surfaces/pod-source-receive.ts +18 -0
  595. package/src/task-orchestrator/surfaces/pod-warm-provenance.ts +81 -0
  596. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +6 -2
  597. package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +7 -0
  598. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +521 -40
  599. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
  600. package/src/task-orchestrator/surfaces/self-implement-pod.ts +759 -50
  601. package/src/task-orchestrator/surfaces/self-implement.ts +65 -2
  602. package/src/tool-runtime/index.ts +15 -2
  603. package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
  604. package/src/tool-runtime/ops-ledger-runtimes.ts +10 -2
  605. package/src/tty-foreground.ts +155 -0
  606. package/src/tui/README.md +2 -0
  607. package/src/tui/chat/background-job-status.ts +54 -0
  608. package/src/tui/chat/goal-interim.ts +173 -0
  609. package/src/tui/chat/log-view.ts +267 -0
  610. package/src/tui/chat/self-health-status.ts +232 -0
  611. package/src/tui/entry.ts +695 -0
  612. package/src/tui/input/composer.ts +151 -0
  613. package/src/tui/seat-mail-boot.ts +59 -0
  614. package/src/tui/slash/compact-command.ts +7 -0
  615. package/src/tui/slash/compact.ts +94 -0
  616. package/src/tui/slash/new-session.ts +35 -0
  617. package/src/tui/slash/resume.ts +75 -0
  618. package/src/tui-client/local-chat-turn.ts +282 -0
  619. package/src/tui-client/local-harness-command.ts +63 -0
  620. package/src/tui-client/local-provider-command.ts +184 -0
  621. package/src/tui-client/next-dashboard-runtime.ts +8 -0
  622. package/src/tui-client/next-loop-command.ts +70 -0
  623. package/src/tui-client/next-wakeup.ts +191 -0
  624. package/src/tui.ts +37 -0
  625. package/src/ui/modal-adapter.ts +2 -2
  626. package/src/user-config.ts +4 -2
  627. package/src/ux-sim/classic-tui-seat-scenarios.ts +516 -0
  628. package/src/ux-sim/cli-config-audit-device.ts +121 -0
  629. package/src/ux-sim/dashboard-event-loop-stall-monitor-device.ts +238 -0
  630. package/src/ux-sim/event-monkey.ts +379 -0
  631. package/src/ux-sim/fake-bin.ts +87 -7
  632. package/src/ux-sim/fake-herdr.ts +238 -0
  633. package/src/ux-sim/fake-llm.ts +111 -6
  634. package/src/ux-sim/fault-glm-no-credential.ts +116 -0
  635. package/src/ux-sim/fault-nextmove-dispatch.ts +367 -0
  636. package/src/ux-sim/fault-pod-codex-503.ts +211 -0
  637. package/src/ux-sim/fault-scope-escape-lift.ts +216 -0
  638. package/src/ux-sim/fault-tui-400-autoheal.ts +297 -0
  639. package/src/ux-sim/goal-device.ts +619 -0
  640. package/src/ux-sim/in-process-cli.ts +22 -5
  641. package/src/ux-sim/mock-authoring-first-run-child.ts +35 -0
  642. package/src/ux-sim/mock-authoring-first-run.ts +97 -0
  643. package/src/ux-sim/mock-seat-pty-frame-child.ts +29 -0
  644. package/src/ux-sim/mock-seat-pty-frame.ts +297 -0
  645. package/src/ux-sim/mock-seat-pty-sequence-child.ts +21 -0
  646. package/src/ux-sim/mock-seat-pty-sequence.ts +206 -0
  647. package/src/ux-sim/next-tui-seat-scenarios.ts +631 -0
  648. package/src/ux-sim/onboarding-first-run-device.ts +269 -0
  649. package/src/ux-sim/pty-key-modifiers-device.ts +85 -0
  650. package/src/ux-sim/subagent-tools-device.ts +81 -0
  651. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +250 -0
  652. package/src/ux-sim/tty-foreground-steal-child.ts +21 -0
  653. package/src/version/packed-revision.json +1 -1
  654. package/apps/pwa/out/_next/static/chunks/1162.c69abda138c7ce43.js +0 -79
  655. package/apps/pwa/out/_next/static/chunks/1449-1fede62af84c3e43.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/1598-13fc845935e816df.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/1639.62c5e16fa20d242f.js +0 -94
  658. package/apps/pwa/out/_next/static/chunks/1661-adb8b2babc9aaf8c.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/2147.107c0fc6146fb15a.js +0 -23
  660. package/apps/pwa/out/_next/static/chunks/2202-ef1c9b000c3074fc.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/2247.1e326638ee43e672.js +0 -115
  662. package/apps/pwa/out/_next/static/chunks/2268.56e1e3d58180abae.js +0 -8
  663. package/apps/pwa/out/_next/static/chunks/2469-606819c812414021.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/2593.e53c1620c0bb3599.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/2690.e96671114222676a.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/2898-79ee1a5cc0cd9d13.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/298.26099a9f65e5c8ff.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/2987-30cf9c2eb7b8bdd5.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/2992.51fc2a7295bd8139.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/3001-5a52788c813b6113.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/3014-291245fba9df7b5b.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/3068.ee78201f0251a18d.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/3083.cd399a17e9365f78.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/3117-e1c474683fd1f824.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/3251-2c17bd5a91f8de2e.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/326.3fb32322bb2ddf6d.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/3421-7ff7fbaa156985a7.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/381.f55dc63ea87735e6.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/4129-ab0a6189f1778633.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/4361.93d14ba594b3a035.js +0 -104
  681. package/apps/pwa/out/_next/static/chunks/4364.7a7eb19cceb67d2f.js +0 -286
  682. package/apps/pwa/out/_next/static/chunks/4406.d71f506f7c3ee9d3.js +0 -149
  683. package/apps/pwa/out/_next/static/chunks/4461.2ad1514180ae7e29.js +0 -148
  684. package/apps/pwa/out/_next/static/chunks/4479.bd309cbe0e3842ee.js +0 -64
  685. package/apps/pwa/out/_next/static/chunks/4522-05966f777d66d13b.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/4543-9a3e9812e845de65.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/4557.f8f1d84a0d90d590.js +0 -74
  688. package/apps/pwa/out/_next/static/chunks/4589-79b11542179ef58c.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/4633-9f8f9f88ffbb8f5c.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/4831.23af4d10c0697b5e.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/4983.5951b85724f61f2a.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/5028-f0722e6114c313e7.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/5249.96a848656b582a93.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/5311.16e0ffbfa5468b80.js +0 -62
  695. package/apps/pwa/out/_next/static/chunks/5489.ec2dd1b5272a19dc.js +0 -24
  696. package/apps/pwa/out/_next/static/chunks/559.df87695df637920c.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/5618-5c88f2f70178c4ad.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/5764.05487bf0b73ddb6b.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/5930.e678826c3f831aab.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/5dfb57f7.f2e3305326202474.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/6053-d893974de92e6198.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/6200-cefd6f33f59d765e.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/6314-edeba650ae686ac9.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/6316-bc9a9b74d7842d79.js +0 -1
  705. package/apps/pwa/out/_next/static/chunks/6476-13b9779b73528008.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/666-04db3ac4c8e3c66f.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/670.682e55106ef915a6.js +0 -77
  708. package/apps/pwa/out/_next/static/chunks/6816.b7ba9d0a1a4a46a7.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/690-fbbcc777f189af37.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/6989.0d3d4020e5cb3df6.js +0 -90
  711. package/apps/pwa/out/_next/static/chunks/7193-cf355cca5ba6c5d5.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/7217-d17393fe7af78fa6.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/7232.24edbd938a69c8d0.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/7295cd1e.b4b557908888eeee.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/7323.adb02de21991883c.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/7386.5d8e7e42e818dfb6.js +0 -287
  717. package/apps/pwa/out/_next/static/chunks/7448.478958ffbbba0ac0.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/7537.ba2208c5c656b8a3.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/7596-962ae6db6cfc9c83.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/7671.cff51beac212a2ba.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/7883.3916734ee16d3e58.js +0 -27
  722. package/apps/pwa/out/_next/static/chunks/7952.b192c31b6a0e00cc.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/801.5b24e81eded22d1b.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/8176.8c9a8613f5a01ac1.js +0 -36
  725. package/apps/pwa/out/_next/static/chunks/819e78a6.fa3dd7f7da19bf61.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/8220-78978450c3183d8d.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/8221-eb60b5bc692a3361.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/826.e9a26064f474949e.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/8459-a351487a4480f584.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/8482-75823d513a4ce151.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/8488.8da515248cda3f3a.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/8584.388a1779d9b203af.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/8637.a55e098e61ffefb8.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/9207-8e6a12db30373f32.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/9263-00ae932c62696a86.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/9318.caafc3a130e8769c.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/932.da3fb55951882562.js +0 -93
  738. package/apps/pwa/out/_next/static/chunks/9433.002f8426ac75b6b7.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/9464.dd631a5a14b1d660.js +0 -24
  740. package/apps/pwa/out/_next/static/chunks/9739.8d5f36ac67a3b236.js +0 -1
  741. package/apps/pwa/out/_next/static/chunks/9743.beeabb9d5f86abe4.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/9843-a23d3f32dc43f715.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/994-28211077c7c587d5.js +0 -1
  744. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-3b4c947f174e33d8.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/app/approvals/page-369d5ce99483f859.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-63c0ed0eb26e5fce.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/app/board/page-62802c6003bc85cc.js +0 -1
  748. package/apps/pwa/out/_next/static/chunks/app/botlab/page-ecb41560d4e77be9.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/app/bots/page-7b65ad8130c93e95.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8755477c15a9060c.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/app/chat/page-5725447dd972c471.js +0 -1
  752. package/apps/pwa/out/_next/static/chunks/app/consult/page-b979de0591a69375.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/app/control/page-6d0796bf4633751a.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/app/decisions/page-59c31dc0394e67b4.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/app/design-check/page-12dfc95f6cc5c718.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/app/editor/page-25788244e66aa4dd.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/app/exec/page-a2555dc705466322.js +0 -1
  758. package/apps/pwa/out/_next/static/chunks/app/healthz/route-3b4c947f174e33d8.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/app/inside/page-578729adbeaa40cb.js +0 -1
  760. package/apps/pwa/out/_next/static/chunks/app/intake/page-a1d20fffbec35205.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/app/layout-4a558f94516b8004.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/app/live/page-9e3834705b86145e.js +0 -1
  763. package/apps/pwa/out/_next/static/chunks/app/live-run/page-d7bff0f0905a662c.js +0 -1
  764. package/apps/pwa/out/_next/static/chunks/app/loops/page-cb1c5fe746ea4014.js +0 -1
  765. package/apps/pwa/out/_next/static/chunks/app/market/page-9ee320507356582a.js +0 -1
  766. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66fd183b74835886.js +0 -1
  767. package/apps/pwa/out/_next/static/chunks/app/morning/page-3272a064a01a9927.js +0 -1
  768. package/apps/pwa/out/_next/static/chunks/app/not-found-f281b7a7f6ef2529.js +0 -1
  769. package/apps/pwa/out/_next/static/chunks/app/observatory/page-d45a65f8b7124fcd.js +0 -1
  770. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-e9c1fe684dd19a66.js +0 -1
  771. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-b8322932fc6e34de.js +0 -1
  772. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-82c66d9af2290575.js +0 -1
  773. package/apps/pwa/out/_next/static/chunks/app/outputs/page-63c6752009c97b05.js +0 -1
  774. package/apps/pwa/out/_next/static/chunks/app/page-bb33d42ebc358aec.js +0 -1
  775. package/apps/pwa/out/_next/static/chunks/app/reflection/page-7e4c9379197d7214.js +0 -1
  776. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-38bf1e9a7001732b.js +0 -1
  777. package/apps/pwa/out/_next/static/chunks/app/sessions/page-2e5b752012389d56.js +0 -1
  778. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-398c0faa173203f7.js +0 -1
  779. package/apps/pwa/out/_next/static/chunks/app/settings/page-002f53a965b6445c.js +0 -1
  780. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-7f75997f61a26269.js +0 -1
  781. package/apps/pwa/out/_next/static/chunks/app/setup/layout-3b4c947f174e33d8.js +0 -1
  782. package/apps/pwa/out/_next/static/chunks/app/setup/page-05631753294f23fb.js +0 -1
  783. package/apps/pwa/out/_next/static/chunks/app/share/page-edd700fd2cc3d7f8.js +0 -1
  784. package/apps/pwa/out/_next/static/chunks/app/showroom/page-105f83ecb4594365.js +0 -1
  785. package/apps/pwa/out/_next/static/chunks/app/tasks/page-5823e87d2017f19c.js +0 -1
  786. package/apps/pwa/out/_next/static/chunks/app/term/page-df3445b207ceceab.js +0 -1
  787. package/apps/pwa/out/_next/static/chunks/app/today/page-b51ca09566c03de7.js +0 -1
  788. package/apps/pwa/out/_next/static/chunks/app/trace/page-8aacd5ded5dbac60.js +0 -1
  789. package/apps/pwa/out/_next/static/chunks/app/vault/page-bae3365a0b3c6a8e.js +0 -1
  790. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ed52b48ff1aa7fd.js +0 -1
  791. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b6f8cad35fe00946.js +0 -1
  792. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6d25ceda500d2457.js +0 -1
  793. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-b6401a5f2c962fe8.js +0 -1
  794. package/apps/pwa/out/_next/static/chunks/ebf6cf5e.0d2f887b040e80fb.js +0 -122
  795. package/apps/pwa/out/_next/static/chunks/f09ec7d7-d29abe23edcbb193.js +0 -1
  796. package/apps/pwa/out/_next/static/chunks/framework-9322cb8a56ac081c.js +0 -1
  797. package/apps/pwa/out/_next/static/chunks/main-2fbab294e49a1561.js +0 -1
  798. package/apps/pwa/out/_next/static/chunks/main-app-f36729f56621a8f3.js +0 -1
  799. package/apps/pwa/out/_next/static/chunks/pages/_app-2a62e450b47c6114.js +0 -1
  800. package/apps/pwa/out/_next/static/chunks/pages/_error-5e17f7b445f34d43.js +0 -1
  801. package/apps/pwa/out/_next/static/chunks/webpack-b4263e2190ea7adf.js +0 -1
  802. /package/apps/pwa/out/_next/static/{L04y73dlwKeTW-GetaTF3 → uC-N0emedeNOFuaBQFv-I}/_ssgManifest.js +0 -0
package/src/llm.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  // Unified streaming interface for Grok (xAI), OpenAI, Anthropic, Local (OpenAI-compatible).
3
3
  // Auto-routes based on model name prefix, or picks the first available provider.
4
4
 
5
+ import { wellFormedLLMMessages } from './llm-wellformed.js';
5
6
  import { createHash } from 'node:crypto';
6
7
  import { testFakeLlmEnabled, testFakeLlmProvider } from './ux-sim/fake-llm.js';
7
8
  import { realpathSync } from 'node:fs';
@@ -19,11 +20,13 @@ import {
19
20
  getOpenAIApiKey, OPENAI_MODEL, OPENAI_API_URL,
20
21
  getAnthropicApiKey, ANTHROPIC_MODEL, ANTHROPIC_API_URL,
21
22
  getOpenRouterApiKey, OPENROUTER_API_URL, OPENROUTER_MODEL,
23
+ getOpenGatewayApiKey, OPENGATEWAY_API_URL, OPENGATEWAY_MODEL,
22
24
  getLocalLLMUrl, LOCAL_LLM_MODEL,
23
25
  getGeminiApiKey, GEMINI_MODEL,
24
26
  DEFAULT_PROVIDER,
25
27
  } from './config.js';
26
28
  import { debug, redactSecrets, redactSecretText } from './debug/log.js';
29
+ import { isVerifiedOpenGatewayModel } from './llm/opengateway-models.js';
27
30
  import { llmUsageCostFields } from './budget/llm-cost.js';
28
31
  import { accumulateByokUsage } from './llm/openrouter-byok-cost.js';
29
32
  import { ACTION_PHASE_OPS_TOOLS, isSteeredShellRejection, REPAIR_PHASE_READ_ONLY_OPS_TOOLS } from './llm/tool-loop-steered-rejection.js';
@@ -354,6 +357,8 @@ export interface LLMOpts {
354
357
  onUsage?(usage: LLMUsage): void;
355
358
  /** Optional model role attached to this request's usage observation. */
356
359
  usageRole?: ModelRole;
360
+ /** Optional per-call metering phase; absent calls keep the existing ledger shape. */
361
+ usagePhase?: string;
357
362
  /** Optional streamLLM usage-ledger site override (defaults to "stream-llm"). */
358
363
  usageSite?: string;
359
364
  /**
@@ -1229,8 +1234,10 @@ export async function* parseOpenAISSELines(
1229
1234
  }
1230
1235
  };
1231
1236
  for await (const line of lines as AsyncIterable<string>) {
1232
- if (!line.startsWith('data: ')) continue;
1233
- const data = line.slice(6).trim();
1237
+ // SSE permits both `data: {...}` and `data:{...}`. OpenGateway emits
1238
+ // the latter, so requiring a space silently discarded its whole stream.
1239
+ if (!line.startsWith('data:')) continue;
1240
+ const data = line.slice(5).trim();
1234
1241
  if (data === '[DONE]') continue;
1235
1242
  let parsed: any;
1236
1243
  try { parsed = JSON.parse(data); } catch { continue; }
@@ -1413,6 +1420,7 @@ function retryOptsFor(
1413
1420
 
1414
1421
  function inferOpenAIProviderName(url: string): string {
1415
1422
  if (/^https?:\/\/openrouter\.ai(?::\d+)?(?:\/|$)/i.test(url)) return 'openrouter';
1423
+ if (/^https?:\/\/apis\.opengateway\.ai(?::\d+)?(?:\/|$)/i.test(url)) return 'opengateway';
1416
1424
  if (url.includes('x.ai')) return 'grok';
1417
1425
  if (url.includes('openai.com')) return 'openai';
1418
1426
  if (url.includes('localhost') || url.includes('127.0.0.1')) return 'local';
@@ -4044,6 +4052,14 @@ export const PROVIDERS: Record<string, LLMProvider> = {
4044
4052
  streamChat: (messages, opts = {}) => makeOpenRouterProvider({ provider: 'openrouter' }).streamChat!(messages, opts),
4045
4053
  chat: (messages, opts = {}) => makeOpenRouterProvider({ provider: 'openrouter' }).chat!(messages, opts),
4046
4054
  },
4055
+ // Explicit choice only. A new key never changes the established auto-provider order.
4056
+ opengateway: {
4057
+ name: 'opengateway',
4058
+ get defaultModel() { return OPENGATEWAY_MODEL; },
4059
+ available: () => !!getOpenGatewayApiKey(),
4060
+ streamChat: (messages, opts = {}) => makeOpenGatewayProvider({ provider: 'opengateway' }).streamChat!(messages, opts),
4061
+ chat: (messages, opts = {}) => makeOpenGatewayProvider({ provider: 'opengateway' }).chat!(messages, opts),
4062
+ },
4047
4063
  bedrock: BedrockProvider, // 명시 선택 전용 — 자동 순서·폴백 체인에 «안» 넣는다(src/llm/bedrock-provider.ts)
4048
4064
  };
4049
4065
 
@@ -4231,13 +4247,15 @@ export function decideProviderForConfig(
4231
4247
  return { provider, model: selectedModel, auth: baseUrl || getLocalLLMUrl() ? 'local' : 'none' };
4232
4248
  case 'openrouter':
4233
4249
  return { provider, model: selectedModel, auth: apiKey || getOpenRouterApiKey() ? 'apikey' : 'none' };
4250
+ case 'opengateway':
4251
+ return { provider, model: selectedModel, auth: apiKey || getOpenGatewayApiKey() ? 'apikey' : 'none' };
4234
4252
  case 'bedrock': return { provider, model: selectedModel, auth: authKindForProvider('bedrock', selectedModel) };
4235
4253
  }
4236
4254
  throw new Error(`unknown provider: ${provider as string}`);
4237
4255
  }
4238
4256
 
4239
4257
  function isKnownProviderName(provider: string): provider is ConcreteProviderName {
4240
- return provider === 'grok' || provider === 'openai' || provider === 'openai-codex' || provider === 'anthropic' || provider === 'gemini' || provider === 'local' || provider === 'openrouter' || provider === 'bedrock';
4258
+ return provider === 'grok' || provider === 'openai' || provider === 'openai-codex' || provider === 'anthropic' || provider === 'gemini' || provider === 'local' || provider === 'openrouter' || provider === 'opengateway' || provider === 'bedrock';
4241
4259
  }
4242
4260
 
4243
4261
  function authKindForProvider(provider: string, model: string, apiKey?: string): ProviderDecisionAuth {
@@ -4252,6 +4270,7 @@ function authKindForProvider(provider: string, model: string, apiKey?: string):
4252
4270
  if (provider === 'anthropic') return getAnthropicApiKey() ? 'apikey' : 'none';
4253
4271
  if (provider === 'gemini') return getGeminiApiKey() ? 'apikey' : 'none';
4254
4272
  if (provider === 'openrouter') return getOpenRouterApiKey() ? 'apikey' : 'none';
4273
+ if (provider === 'opengateway') return getOpenGatewayApiKey() ? 'apikey' : 'none';
4255
4274
  if (provider === 'bedrock') return BedrockProvider.available() ? 'apikey' : 'none';
4256
4275
  if (provider === 'openai-codex') {
4257
4276
  try {
@@ -4272,6 +4291,7 @@ function defaultModelForProvider(provider: ConcreteProviderName): string {
4272
4291
  case 'gemini': return GEMINI_MODEL;
4273
4292
  case 'local': return LOCAL_LLM_MODEL;
4274
4293
  case 'openrouter': return OPENROUTER_MODEL;
4294
+ case 'opengateway': return OPENGATEWAY_MODEL;
4275
4295
  case 'bedrock': return BedrockProvider.defaultModel;
4276
4296
  }
4277
4297
  throw new Error(`unknown provider: ${provider as string}`);
@@ -4441,6 +4461,12 @@ function providerByName(name: string): LLMProvider | undefined {
4441
4461
  return PROVIDERS[name] ?? automaticProviderCandidates().find((candidate) => candidate.name === name);
4442
4462
  }
4443
4463
 
4464
+ /** TUI-400-AUTOHEAL-FALLBACK — 같은 턴에서 `failedProviders` 가 실패했을 때 `llm.fallbackChain`(⊕ auto 후보)의
4465
+ * «다음» 공급자. 턴 안 폴백과 같은 해석(`explainFallbackCandidates`)을 그대로 쓴다 — 체인을 따로 읽지 않는다. */
4466
+ export function nextTurnFallbackProvider(failedProviders: readonly string[]): LLMProvider | undefined {
4467
+ return firstAvailableFallbackProvider(new Set(failedProviders), {});
4468
+ }
4469
+
4444
4470
  function firstAvailableFallbackProvider(attempted: ReadonlySet<string>, opts: LLMOpts): LLMProvider | undefined {
4445
4471
  // A candidate may lose its credential between chain enumeration and the
4446
4472
  // switch. Keep scanning the ordered chain instead of stopping at that slot.
@@ -4726,6 +4752,11 @@ async function consumeProviderText(
4726
4752
  let full = '';
4727
4753
  let usage: ObservedUsage | undefined;
4728
4754
  try {
4755
+ const wf = wellFormedLLMMessages(messages);
4756
+ if (wf.fixedMessages > 0) {
4757
+ debug.log('llm.request', 'lone-surrogate-fixed', { site: 'streamLLM', provider: provider.name, messages: wf.fixedMessages, strings: wf.fixedStrings }, { level: 'warn' });
4758
+ messages = wf.messages;
4759
+ }
4729
4760
  iterator = (provider.streamChat
4730
4761
  ? provider.streamChat(messages, opts)
4731
4762
  : provider.chat(messages, opts))[Symbol.asyncIterator]();
@@ -4837,7 +4868,7 @@ export async function streamLLM(
4837
4868
  if (consumed.ok) {
4838
4869
  if (consumed.usage !== 'unmeasured') {
4839
4870
  try {
4840
- logAgentTurnUsage(activeModel, consumed.usage, { providerName: activeProvider.name, site: opts.usageSite ?? 'stream-llm', role: opts.usageRole });
4871
+ logAgentTurnUsage(activeModel, consumed.usage, { providerName: activeProvider.name, site: opts.usageSite ?? 'stream-llm', role: opts.usageRole, phase: opts.usagePhase });
4841
4872
  } catch { /* best-effort observation */ }
4842
4873
  }
4843
4874
  debug.log('llm', 'outcome', { provider: activeProvider.name, status: 'ok', kind: 'streamLLM', durationMs: Date.now() - started });
@@ -5844,7 +5875,7 @@ const TOOL_LOOP_PHASE_DIRECTIVES: Record<ToolLoopFollowupPhase, (autoNarrowedRea
5844
5875
  + 'Stop gathering more files and run the code, tests, or repro command first via RunShell/Bash, or answer in plain text if execution is unnecessary.',
5845
5876
  'repair-action': () =>
5846
5877
  'REPAIR ACTION REQUIRED — execution has already failed or a debugging repair step is armed. '
5847
- + 'Stop gathering more files and move to Edit/Write/RunShell/Bash or a narrow code-intel followup (Read/Lsp/AstGrep/Grep content/count), '
5878
+ + 'Stop gathering more files and move to Edit/Write/RunShell/Bash or a narrow code-intel followup (Read/ListDir/Lsp/AstGrep/Grep content/count), '
5848
5879
  + 'ops ledger/delegate tools (MsgList/MsgPost/MsgAck/Checklist*/AgentOutput) still run, '
5849
5880
  + 'or answer in plain text if no code change is needed (e.g. a read-only investigation whose finding is the deliverable).',
5850
5881
  'verify-action': () =>
@@ -7781,6 +7812,10 @@ const REPAIR_ACTION_TOOLS = new Set([
7781
7812
  'Plan',
7782
7813
  'MarkStepDone',
7783
7814
  'Read',
7815
+ // ListDir is always one directory, never recursive — as narrow as Read. A failed step
7816
+ // is often «is the output there?»; rejecting it pushed the model to `ls` via shell
7817
+ // (n8n session 10-22: ListDir show_hidden=true ×2 rejected after a benign exit 128).
7818
+ 'ListDir',
7784
7819
  'Lsp',
7785
7820
  'AstGrep',
7786
7821
  'ast_grep_search',
@@ -8069,15 +8104,17 @@ export function billingRouteForProvider(provider: string | undefined, model: str
8069
8104
  }
8070
8105
 
8071
8106
  /** Observe usage with optional site/role metadata; a provider-name string remains supported. */
8072
- export function logAgentTurnUsage(model: string, usage: LLMUsage, providerNameOrOptions?: string | { providerName?: string; site?: string; role?: ModelRole }): void {
8107
+ export function logAgentTurnUsage(model: string, usage: LLMUsage, providerNameOrOptions?: string | { providerName?: string; site?: string; role?: ModelRole; phase?: string }): void {
8073
8108
  try {
8074
8109
  const providerName = typeof providerNameOrOptions === 'string' ? providerNameOrOptions : providerNameOrOptions?.providerName;
8075
8110
  const site = (typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.site) ?? 'agent-turn';
8076
8111
  const role = typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.role;
8112
+ const phase = typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.phase;
8077
8113
  const billing = billingRouteForProvider(providerName, model);
8078
8114
  debug.log('llm.usage', 'llm-usage', {
8079
8115
  site,
8080
8116
  ...(role !== undefined ? { role } : {}),
8117
+ ...(phase !== undefined ? { phase } : {}),
8081
8118
  model,
8082
8119
  ...(usage.provider !== undefined && { provider: usage.provider }),
8083
8120
  // ⭐ `provider` 는 «선 어댑터»(openai/anthropic)다 — 과금 주체는 별칭 칸으로(BACKLOG B10).
@@ -8126,29 +8163,112 @@ export function attachFinalAnswerSupplement(
8126
8163
  return base + '\n\n' + supplement.trim();
8127
8164
  }
8128
8165
 
8166
+ export const GPT6_CODEX_GUARD_IDS = [
8167
+ 'anchor-grep',
8168
+ 'anchor-read',
8169
+ 'literal-glob',
8170
+ 'search-only-streak',
8171
+ 'post-read-broad-search',
8172
+ 'same-args-dedup',
8173
+ 'broad-spot-repeat',
8174
+ 'exploration-budget',
8175
+ 'inspect-budget',
8176
+ 'followup-hard-stop',
8177
+ 'max-turns',
8178
+ 'force-synthesis',
8179
+ ] as const;
8180
+ export type Gpt6CodexGuardId = typeof GPT6_CODEX_GUARD_IDS[number];
8181
+ export type Gpt6CodexGuardStats = Record<Gpt6CodexGuardId, { wouldBlock: number; blocked: number }>;
8182
+
8183
+ type Gpt6CodexGuardFlags = Record<Gpt6CodexGuardId, boolean>;
8184
+ const GPT6_CODEX_GUARD_DEFAULTS: Gpt6CodexGuardFlags = Object.fromEntries(
8185
+ GPT6_CODEX_GUARD_IDS.map((id) => [id, false]),
8186
+ ) as Gpt6CodexGuardFlags;
8187
+ let gpt6CodexGuardOverrides: Partial<Gpt6CodexGuardFlags> = {};
8188
+ const gpt6CodexGuardStats: Gpt6CodexGuardStats = Object.fromEntries(
8189
+ GPT6_CODEX_GUARD_IDS.map((id) => [id, { wouldBlock: 0, blocked: 0 }]),
8190
+ ) as Gpt6CodexGuardStats;
8191
+
8192
+ export function getGpt6CodexGuardFlags(): Gpt6CodexGuardFlags {
8193
+ return { ...GPT6_CODEX_GUARD_DEFAULTS, ...gpt6CodexGuardOverrides };
8194
+ }
8195
+
8196
+ export function getGpt6CodexGuardStats(): Gpt6CodexGuardStats {
8197
+ return Object.fromEntries(
8198
+ GPT6_CODEX_GUARD_IDS.map((id) => [id, { ...gpt6CodexGuardStats[id] }]),
8199
+ ) as Gpt6CodexGuardStats;
8200
+ }
8201
+
8202
+ export function resetGpt6CodexGuardObservations(): void {
8203
+ for (const id of GPT6_CODEX_GUARD_IDS) {
8204
+ gpt6CodexGuardStats[id].wouldBlock = 0;
8205
+ gpt6CodexGuardStats[id].blocked = 0;
8206
+ }
8207
+ }
8208
+
8209
+ /** @internal Test seam for the staged GPT-6 guard rollout. */
8210
+ export function _setGpt6CodexGuardFlagsForTest(flags: Partial<Gpt6CodexGuardFlags> | undefined): void {
8211
+ gpt6CodexGuardOverrides = flags ? { ...flags } : {};
8212
+ }
8213
+
8214
+ // Counter semantics (GPT-6 models only): `wouldBlock` = the guard predicate held;
8215
+ // `blocked` = the guard actually stopped/rejected. Grace burns and arming are NOT blocks.
8216
+ // `force-synthesis` is an intervention, not a rejection: blocked = the no-tools pass was
8217
+ // attempted; its met/unmet outcome is told apart only by events (`force-synthesis-pass.emitted`
8218
+ // vs `synthesis-ignored.hard-stop`).
8219
+ // ⚠️ Scope: the tally is module-level (process-global) — concurrent streams in one process
8220
+ // add into the same counters; there is no per-stream / per-run split.
8221
+ function gpt6CodexGuardEnabled(id: Gpt6CodexGuardId, model: string, legacyEnabled = false): boolean {
8222
+ // Rollout flags may add guards, but cannot disable behavior already active.
8223
+ return !isGpt6GenerationModel(model) || legacyEnabled || getGpt6CodexGuardFlags()[id];
8224
+ }
8225
+
8226
+ function noteGpt6CodexGuard(id: Gpt6CodexGuardId, model: string, blocked: boolean): void {
8227
+ if (!isGpt6GenerationModel(model)) return;
8228
+ gpt6CodexGuardStats[id].wouldBlock++;
8229
+ if (blocked) gpt6CodexGuardStats[id].blocked++;
8230
+ }
8231
+
8232
+ function applyCodexBehaviorGuard(
8233
+ id: Gpt6CodexGuardId,
8234
+ model: string,
8235
+ wouldBlock: boolean,
8236
+ legacyEnabled = false,
8237
+ ): boolean {
8238
+ if (!wouldBlock) return false;
8239
+ const enabled = gpt6CodexGuardEnabled(id, model, legacyEnabled);
8240
+ noteGpt6CodexGuard(id, model, enabled);
8241
+ return enabled;
8242
+ }
8243
+
8129
8244
  export async function streamLLMWithTools(
8130
8245
  messages: LLMMessage[],
8131
8246
  handlers: StreamWithToolsHandlers,
8132
8247
  opts: LLMOpts & { provider?: LLMProvider; missionContext?: { missionId: string; phaseId: string; onOverload?: (info: { turn: number; consecutiveFailures: number; reason: string }) => void; pollSignal?: () => { kind: 'abort' | 'pause'; reason?: string } | undefined }; contextStrategy?: import('./agent-substrate/context-strategy.js').ContextStrategy;
8248
+ /** TUI-400-AUTOHEAL-FALLBACK — 이 턴을 «이 공급자부터» 연다(`provider` 와 달리 폴백은 그대로 허용).
8249
+ * 모델은 그 공급자의 기본 모델(앞 공급자 모델 이름은 안 옮긴다 — 호출부가 `model` 을 비운다). */
8250
+ initialProvider?: LLMProvider;
8251
+ /** 이 턴 폴백 후보에서 뺄 공급자(이미 같은 턴에서 실패한 쪽 — 되돌아가지 않게). */
8252
+ skipProviders?: readonly string[];
8133
8253
  } = {},
8134
8254
  ): Promise<string> {
8135
- const provider = opts.provider ?? resolveDefaultProvider(opts.model);
8255
+ const provider = opts.provider ?? opts.initialProvider ?? resolveDefaultProvider(opts.model);
8136
8256
  const initial = finalizeStreamingProviderModel(provider, opts.model ?? provider.defaultModel);
8137
8257
  let activeProvider = initial.provider;
8138
8258
  let activeModel = initial.model;
8139
8259
  opts.onResolvedProvider?.(activeProvider.name, activeModel);
8140
- const attemptedProviders = new Set<string>([activeProvider.name]);
8260
+ const attemptedProviders = new Set<string>([activeProvider.name, ...(opts.skipProviders ?? [])]);
8141
8261
  let blockedProviders: ProviderFallbackAttempt[] = [];
8142
8262
  const effectiveModel = activeModel;
8143
8263
  const modelFamily = getModelFamily(effectiveModel);
8144
- // TUI-GPT6-GUARD-PARITY — codex «모델 행동» 가드 켬 여부(단일 원천 = models/prompts.ts
8145
- // usesCodexBehaviorGuards). gpt-6 세대도 true. 넓힌 자리·안 넓힌 자리는 그 함수 주석이 정본.
8264
+ // Preserve pre-existing GPT-6 behavior while observing Codex-only sites.
8146
8265
  const codexBehaviorGuards = usesCodexBehaviorGuards(effectiveModel);
8266
+ const codexGuardCandidate = codexBehaviorGuards || isGpt6GenerationModel(effectiveModel);
8147
8267
  debug.log('llm.router', 'streamLLMWithTools', {
8148
8268
  provider: provider.name,
8149
8269
  model: effectiveModel,
8150
8270
  modelFamily,
8151
- codexBehaviorGuards,
8271
+ codexBehaviorGuards: codexGuardCandidate,
8152
8272
  messageCount: messages.length,
8153
8273
  messageRoles: summarizeRoles(messages),
8154
8274
  tools: opts.tools?.map(t => t.name),
@@ -8695,6 +8815,12 @@ export async function streamLLMWithTools(
8695
8815
  activeModel = finalized.model;
8696
8816
  opts.onResolvedProvider?.(activeProvider.name, activeModel);
8697
8817
  turnOpts = { ...turnOpts, model: activeModel };
8818
+ // 짝 없는 서로게이트(잘린 이모지)가 섞이면 공급자가 본문 JSON 을 못 읽는다(10-22 n8n 매 턴 400) — 이력 자체를 고친다(다음 요청에 다시 안 실리게).
8819
+ const wf = wellFormedLLMMessages(history);
8820
+ if (wf.fixedMessages > 0) {
8821
+ debug.log('llm.request', 'lone-surrogate-fixed', { site: 'tool-loop', provider: activeProvider.name, messages: wf.fixedMessages, strings: wf.fixedStrings }, { level: 'warn' });
8822
+ history.splice(0, history.length, ...wf.messages);
8823
+ }
8698
8824
  streamIter = activeProvider.streamChat!(history, turnOpts)[Symbol.asyncIterator]();
8699
8825
  }
8700
8826
  step = await Promise.race([
@@ -8872,7 +8998,7 @@ export async function streamLLMWithTools(
8872
8998
  // ⭐ 주 에이전트 턴의 토큰·비용을 «게이트 없이» 남긴다(2026-09-24 실측: 이 줄이 없어 3시간 `llm.usage`
8873
8999
  // 18행이 전부 곁가지 두 자리였고, 하니스 런 비용의 거의 전부가 관측 밖이었다). 곁가지와 같은 모양 ·
8874
9000
  // 모르는 모델은 금액 대신 `cost.kind='unknown'`. runId 는 debug.log 가 붙인다. 실패해도 턴은 계속.
8875
- logAgentTurnUsage(activeModel, ev.usage, { providerName: activeProvider.name, role: opts.usageRole });
9001
+ logAgentTurnUsage(activeModel, ev.usage, { providerName: activeProvider.name, role: opts.usageRole, phase: opts.usagePhase });
8876
9002
  // Wave A1 (2026-05-04) — turn-level cache hit rate forensic.
8877
9003
  // Each provider's usage event carries inputTokens / outputTokens
8878
9004
  // / cacheReadInputTokens (when cache hit). Emit the per-turn
@@ -9087,19 +9213,27 @@ export async function streamLLMWithTools(
9087
9213
  // the notice in a tool_result but keeps making tool calls until
9088
9214
  // maxTurns hard-stops it, producing 0 chars of output. Hard
9089
9215
  // rejection forces the synthesis that soft pressure couldn't.
9090
- const inSynthesisPhase =
9216
+ const inSynthesisPhase = applyCodexBehaviorGuard(
9217
+ 'max-turns',
9218
+ effectiveModel,
9091
9219
  !terminalOnlyTurn
9092
- && maxTurns >= BUDGET_WARNING_MIN_TURNS
9093
- && turn >= maxTurns - FINAL_SYNTHESIS_TURNS;
9094
- const codexInspectionStillProgressing =
9095
- modelFamily === 'codex'
9220
+ && maxTurns >= BUDGET_WARNING_MIN_TURNS
9221
+ && turn >= maxTurns - FINAL_SYNTHESIS_TURNS,
9222
+ true,
9223
+ );
9224
+ const codexInspectionStillProgressing = codexGuardCandidate
9225
+ && (modelFamily === 'codex' || getGpt6CodexGuardFlags()['inspect-budget'])
9096
9226
  && autoNarrowedReadCount > 0
9097
9227
  && autoNarrowedReadCount < inspectBudgetThreshold;
9098
- const inExplorationSynthesisPhase =
9228
+ const inExplorationSynthesisPhase = applyCodexBehaviorGuard(
9229
+ 'exploration-budget',
9230
+ effectiveModel,
9099
9231
  !terminalOnlyTurn
9100
- && exploratoryTurnStreak >= explorationThresholdForTurn
9101
- && isExploratoryTurn(pendingCalls)
9102
- && !codexInspectionStillProgressing;
9232
+ && exploratoryTurnStreak >= explorationThresholdForTurn
9233
+ && isExploratoryTurn(pendingCalls)
9234
+ && !codexInspectionStillProgressing,
9235
+ true,
9236
+ );
9103
9237
  const inInspectSynthesisPhase =
9104
9238
  !terminalOnlyTurn
9105
9239
  && inspectSynthesisArmed
@@ -9232,8 +9366,19 @@ export async function streamLLMWithTools(
9232
9366
  // as in the original PR #768 design. Forensic events at both the
9233
9367
  // grace-burn and the hard-stop branches so log/latest can audit
9234
9368
  // exactly which path each turn took.
9235
- const codexImmediateInspectStop = inInspectSynthesisPhase && modelFamily === 'codex';
9236
- const codexImmediateRepairStop = inRepairActionPhase && modelFamily === 'codex';
9369
+ // followup-hard-stop counting happens once per turn below the grace branches:
9370
+ // wouldBlock when any predicate held, blocked only when a grace=0 immediate stop fired.
9371
+ const followupHardStopEnabled = codexGuardCandidate
9372
+ && gpt6CodexGuardEnabled('followup-hard-stop', effectiveModel);
9373
+ const followupInspectActionHeld =
9374
+ inInspectActionPhase
9375
+ && !verifyActionArmed
9376
+ && editedFilePaths.length === 0
9377
+ && !executionLoopState.lastCommand;
9378
+ const followupHardStopHeld = codexGuardCandidate
9379
+ && (inInspectSynthesisPhase || inRepairActionPhase || followupInspectActionHeld);
9380
+ const codexImmediateInspectStop = inInspectSynthesisPhase && followupHardStopEnabled;
9381
+ const codexImmediateRepairStop = inRepairActionPhase && followupHardStopEnabled;
9237
9382
  // codexImmediateInspectActionStop predicate (PR #768 original):
9238
9383
  // restricted to pure-exploration state (no edits applied AND no
9239
9384
  // execution attempted). When edits/execution already happened the
@@ -9241,12 +9386,13 @@ export async function streamLLMWithTools(
9241
9386
  // logic (`buildFinalizationPolicySnapshot` → `[FINAL ANSWER
9242
9387
  // REQUIRED]`) can run — that branch produces a tailored "verify
9243
9388
  // done, just write the answer" UX which we must not preempt.
9244
- const codexImmediateInspectActionStop =
9245
- inInspectActionPhase
9246
- && modelFamily === 'codex'
9247
- && !verifyActionArmed
9248
- && editedFilePaths.length === 0
9249
- && !executionLoopState.lastCommand;
9389
+ const codexImmediateInspectActionStop = followupInspectActionHeld && followupHardStopEnabled;
9390
+ if (followupHardStopHeld) {
9391
+ noteGpt6CodexGuard('followup-hard-stop', effectiveModel,
9392
+ (codexImmediateInspectStop && codexInspectSynthesisGrace <= 0)
9393
+ || (codexImmediateRepairStop && codexRepairActionGrace <= 0)
9394
+ || (codexImmediateInspectActionStop && codexInspectActionGrace <= 0));
9395
+ }
9250
9396
  if (codexImmediateInspectStop && codexInspectSynthesisGrace <= 0) {
9251
9397
  debug.log('llm.router', 'tool-loop.inspect-synthesis-phase.codex-immediate-stop', {
9252
9398
  turn,
@@ -9370,7 +9516,11 @@ export async function streamLLMWithTools(
9370
9516
  inspectRejectionCount++;
9371
9517
  explorationRejectionCount = 0;
9372
9518
  synthesisRejectionCount = 0;
9373
- if (modelFamily === 'codex' || inspectRejectionCount >= 2) {
9519
+ // Already tallied above (followupHardStopHeld) — no second count for the same turn.
9520
+ // When followupHardStopEnabled is true this branch is unreachable for this phase
9521
+ // (codexImmediateInspectStop takes the turn), so a stop here is the generic
9522
+ // second-rejection path, not the GPT-6 guard — it is intentionally not `blocked`.
9523
+ if (followupHardStopEnabled || inspectRejectionCount >= 2) {
9374
9524
  hardStopText = buildIgnoredSynthesisNotice('inspect');
9375
9525
  }
9376
9526
  } else if (inInspectActionPhase) {
@@ -9985,7 +10135,7 @@ export async function streamLLMWithTools(
9985
10135
  debug.log('llm.router', 'tool-loop.dedup-blocked', { turn, tool: call.name, signature: signatureOf(call), priorCount: repeatedError.count, threshold: DEDUP_THRESHOLD, reason: 'repeated-error' });
9986
10136
  return { result: `${buildDedupStub(call, repeatedError.count)} Every one of those calls failed with the same error: ${repeatedError.error.slice(0, 200)}`, isError: false, phaseRejected: false };
9987
10137
  }
9988
- if (codexBehaviorGuards && EXPLORATORY_TOOLS.has(call.name)) {
10138
+ if (codexGuardCandidate && EXPLORATORY_TOOLS.has(call.name)) {
9989
10139
  // W4-anchor — Anchor file Grep blocking. AGENTS.md / CLAUDE.md
9990
10140
  // are already in the system prompt; greppling them is pure
9991
10141
  // token waste and trains codex to ignore the in-prompt copy.
@@ -9993,7 +10143,7 @@ export async function streamLLMWithTools(
9993
10143
  // every attempt gets the redirect. No threshold — anchor
9994
10144
  // grep is structurally redundant.
9995
10145
  const anchor = isAnchorGrep(call);
9996
- if (anchor !== null) {
10146
+ if (anchor !== null && applyCodexBehaviorGuard('anchor-grep', effectiveModel, true, true)) {
9997
10147
  if (debug.enabled) {
9998
10148
  debug.log('llm.router', 'tool-loop.anchor-grep-blocked', {
9999
10149
  turn,
@@ -10042,6 +10192,7 @@ export async function streamLLMWithTools(
10042
10192
  && autoNarrowedReadCount === 0
10043
10193
  && searchOnlyTurnStreak >= 3
10044
10194
  && SEARCH_ONLY_TOOLS.has(call.name)
10195
+ && applyCodexBehaviorGuard('search-only-streak', effectiveModel, true, true)
10045
10196
  ) {
10046
10197
  if (debug.enabled) {
10047
10198
  debug.log('llm.router', 'tool-loop.search-only-streak-blocked', {
@@ -10087,7 +10238,7 @@ export async function streamLLMWithTools(
10087
10238
  }
10088
10239
  return false;
10089
10240
  })();
10090
- if (isBroadPostRead) {
10241
+ if (isBroadPostRead && applyCodexBehaviorGuard('post-read-broad-search', effectiveModel, true, true)) {
10091
10242
  if (debug.enabled) {
10092
10243
  debug.log('llm.router', 'tool-loop.post-read-broad-blocked', {
10093
10244
  turn,
@@ -10122,7 +10273,7 @@ export async function streamLLMWithTools(
10122
10273
  // decided per-call by `anchorStubContext`, which inspects the
10123
10274
  // fences in `messages`. Companion to W4-anchor (Grep).
10124
10275
  const anchorRead = isAnchorRead(call);
10125
- if (anchorRead !== null) {
10276
+ if (anchorRead !== null && applyCodexBehaviorGuard('anchor-read', effectiveModel, true, true)) {
10126
10277
  if (debug.enabled) {
10127
10278
  debug.log('llm.router', 'tool-loop.anchor-read-blocked', {
10128
10279
  turn,
@@ -10150,7 +10301,7 @@ export async function streamLLMWithTools(
10150
10301
  // path is the next step. Block FIRST so the model is steered
10151
10302
  // to Read directly instead of Glob → Read pair.
10152
10303
  const literalPath = literalGlobPath(call);
10153
- if (literalPath !== null) {
10304
+ if (literalPath !== null && applyCodexBehaviorGuard('literal-glob', effectiveModel, true, true)) {
10154
10305
  if (debug.enabled) {
10155
10306
  debug.log('llm.router', 'tool-loop.literal-glob-blocked', {
10156
10307
  turn,
@@ -10179,7 +10330,8 @@ export async function streamLLMWithTools(
10179
10330
  const sig = signatureOf(call);
10180
10331
  const priorCount = seenToolCallSignatures.get(sig) ?? 0;
10181
10332
  seenToolCallSignatures.set(sig, priorCount + 1);
10182
- if (priorCount + 1 >= DEDUP_THRESHOLD) {
10333
+ if (priorCount + 1 >= DEDUP_THRESHOLD
10334
+ && applyCodexBehaviorGuard('same-args-dedup', effectiveModel, true, true)) {
10183
10335
  const stub = buildDedupStub(call, priorCount);
10184
10336
  if (debug.enabled) {
10185
10337
  debug.log('llm.router', 'tool-loop.dedup-blocked', {
@@ -10199,7 +10351,8 @@ export async function streamLLMWithTools(
10199
10351
  if (spotInfo !== null) {
10200
10352
  const priorSpot = seenBroadSpots.get(spotInfo.key) ?? 0;
10201
10353
  seenBroadSpots.set(spotInfo.key, priorSpot + 1);
10202
- if (priorSpot + 1 >= spotInfo.threshold) {
10354
+ if (priorSpot + 1 >= spotInfo.threshold
10355
+ && applyCodexBehaviorGuard('broad-spot-repeat', effectiveModel, true, true)) {
10203
10356
  if (debug.enabled) {
10204
10357
  debug.log('llm.router', 'tool-loop.broad-spot-blocked', {
10205
10358
  turn,
@@ -10324,7 +10477,7 @@ export async function streamLLMWithTools(
10324
10477
  // W4-A — Track Read dispatches (only successful ones; error
10325
10478
  // results don't count as "the file is in your context"). The
10326
10479
  // post-Read broad-search guard above reads this counter.
10327
- if (call.name === 'Read' && !isError && codexBehaviorGuards) {
10480
+ if (call.name === 'Read' && !isError && codexGuardCandidate) {
10328
10481
  dispatchedReadCount++;
10329
10482
  }
10330
10483
  return { result, isError, phaseRejected: false };
@@ -10676,28 +10829,31 @@ export async function streamLLMWithTools(
10676
10829
  && looksLikeStructuralAnalysis(history)
10677
10830
  && autoNarrowedInspections.length >= 2
10678
10831
  && narrowingBlockedCount >= 1;
10679
- if (modelFamily === 'codex' && autoNarrowedReadCount >= inspectBudgetThreshold) {
10832
+ if (codexGuardCandidate
10833
+ && (modelFamily === 'codex' || getGpt6CodexGuardFlags()['inspect-budget'])
10834
+ && autoNarrowedReadCount >= inspectBudgetThreshold) {
10680
10835
  inspectSynthesisArmed = true;
10681
10836
  }
10837
+ const inspectBudgetExecutionHeld = codexGuardCandidate
10838
+ && autoNarrowedThisTurn > 0
10839
+ && autoNarrowedInspections.length > 0
10840
+ && autoNarrowedReadCount >= inspectBudgetThreshold
10841
+ && inspectFollowupMode === 'execution';
10842
+ // Arming is a would-block signal only: it rejects nothing this turn, so blocked stays 0.
10843
+ if (inspectBudgetExecutionHeld) noteGpt6CodexGuard('inspect-budget', effectiveModel, false);
10682
10844
  if (structuralInspectFallbackReady) {
10683
10845
  hardStopText = buildInspectFallbackSummary(autoNarrowedInspections);
10684
10846
  hardStopReason = 'structural-inspect-fallback-ready';
10685
10847
  } else if (
10686
- modelFamily === 'codex'
10687
- && autoNarrowedThisTurn > 0
10848
+ autoNarrowedThisTurn > 0
10688
10849
  && autoNarrowedInspections.length > 0
10689
10850
  && autoNarrowedReadCount >= inspectBudgetThreshold
10690
10851
  && inspectFollowupMode === 'synthesis'
10852
+ && applyCodexBehaviorGuard('inspect-budget', effectiveModel, codexGuardCandidate)
10691
10853
  ) {
10692
10854
  hardStopText = buildInspectFallbackSummary(autoNarrowedInspections);
10693
10855
  hardStopReason = 'codex-inspect-budget-synthesis';
10694
- } else if (
10695
- modelFamily === 'codex'
10696
- && autoNarrowedThisTurn > 0
10697
- && autoNarrowedInspections.length > 0
10698
- && autoNarrowedReadCount >= inspectBudgetThreshold
10699
- && inspectFollowupMode === 'execution'
10700
- ) {
10856
+ } else if (inspectBudgetExecutionHeld && gpt6CodexGuardEnabled('inspect-budget', effectiveModel)) {
10701
10857
  inspectSynthesisArmed = true;
10702
10858
  debug.log('llm.router', 'tool-loop.inspect-synthesis-armed', {
10703
10859
  turn,
@@ -10904,12 +11060,12 @@ export async function streamLLMWithTools(
10904
11060
  // forceSynthesisOutcome="skipped" (was: non-codex-family). Same
10905
11061
  // fix shape (no-tools synthesis with prior tool_results as
10906
11062
  // context) lifts the empty reply to substantive answer.
10907
- const isForceSynthesisFamily =
10908
- codexBehaviorGuards || modelFamily === 'gemini';
11063
+ const isForceSynthesisFamily = codexGuardCandidate || modelFamily === 'gemini';
10909
11064
  const shouldForceSynthesis =
10910
- isForceSynthesisFamily
10911
- && !isUserInterventionRequired
10912
- && !forceSynthesisAttempted;
11065
+ !isUserInterventionRequired
11066
+ && !forceSynthesisAttempted
11067
+ && (modelFamily === 'gemini'
11068
+ || applyCodexBehaviorGuard('force-synthesis', effectiveModel, codexGuardCandidate, true));
10913
11069
  let synthesizedText: string | null = null;
10914
11070
  if (shouldForceSynthesis) {
10915
11071
  forceSynthesisAttempted = true;
@@ -10988,9 +11144,10 @@ export async function streamLLMWithTools(
10988
11144
  // synthesis attempt. Extended to gemini 2026-05-04 alongside
10989
11145
  // W5-E/W5-F for the same pathology shape.
10990
11146
  if (
10991
- (modelFamily === 'codex' || modelFamily === 'gemini')
10992
- && !forceSynthesisAttempted
11147
+ !forceSynthesisAttempted
10993
11148
  && noContentReadTurnStreak >= 4
11149
+ && (modelFamily === 'gemini'
11150
+ || applyCodexBehaviorGuard('force-synthesis', effectiveModel, codexGuardCandidate, true))
10994
11151
  ) {
10995
11152
  forceSynthesisAttempted = true;
10996
11153
  const earlyText = await tryForceSynthesisPass({
@@ -11073,8 +11230,9 @@ export async function streamLLMWithTools(
11073
11230
  let synthesizedText: string | null = null;
11074
11231
  const shouldForceSynthesisOnBudget =
11075
11232
  loopTermination === 'budget-exhausted'
11076
- && (codexBehaviorGuards || modelFamily === 'gemini')
11077
- && !forceSynthesisAttempted;
11233
+ && !forceSynthesisAttempted
11234
+ && (modelFamily === 'gemini'
11235
+ || applyCodexBehaviorGuard('force-synthesis', effectiveModel, codexGuardCandidate, true));
11078
11236
  if (shouldForceSynthesisOnBudget) {
11079
11237
  forceSynthesisAttempted = true;
11080
11238
  synthesizedText = await tryForceSynthesisPass({
@@ -11369,6 +11527,27 @@ function makeOpenRouterProvider(cfg: UCLLMConfig): LLMProvider {
11369
11527
  return inner;
11370
11528
  }
11371
11529
 
11530
+ /** The OpenGateway wire is standard OpenAI Chat Completions with a distinct URL and credential. */
11531
+ function makeOpenGatewayProvider(cfg: UCLLMConfig): LLMProvider {
11532
+ const selectedModel = cfg.model || OPENGATEWAY_MODEL;
11533
+ if (!isVerifiedOpenGatewayModel(selectedModel)) throw new Error(`opengateway model not verified: ${selectedModel}`);
11534
+ const portableKey = getOpenGatewayApiKey();
11535
+ if (cfg.apiKey?.trim() && portableKey && cfg.apiKey.trim() !== portableKey)
11536
+ throw new Error('opengateway config apiKey conflicts with env/cache key');
11537
+ const inner = makeOpenAICompatProvider('opengateway', selectedModel, OPENGATEWAY_API_URL,
11538
+ { ...cfg, reasoningLevel: undefined, apiKey: cfg.apiKey?.trim() || portableKey },
11539
+ { model: (model) => model.startsWith('opengateway/') ? model.slice('opengateway/'.length) : model,
11540
+ omitDefaultTemperature: true, omitMaxTokens: true,
11541
+ extraBody: { stream_options: { include_usage: true } } });
11542
+ return { ...inner, async *streamChat(messages, opts = {}) {
11543
+ if (opts.model && !isVerifiedOpenGatewayModel(opts.model)) throw new Error(`opengateway model not verified: ${opts.model}`);
11544
+ yield* inner.streamChat!(messages, { ...opts, reasoningEffort: undefined });
11545
+ }, async *chat(messages, opts = {}) {
11546
+ if (opts.model && !isVerifiedOpenGatewayModel(opts.model)) throw new Error(`opengateway model not verified: ${opts.model}`);
11547
+ yield* inner.chat!(messages, { ...opts, reasoningEffort: undefined });
11548
+ } };
11549
+ }
11550
+
11372
11551
  /** OR-TOOLARGS-REPAIR — 깨진 도구 인자 호출에 돌려주는 오류 문면(도구는 실행되지 않았다). */
11373
11552
  export function buildInvalidToolArgsMessage(info: ToolArgsInvalid): string {
11374
11553
  const truncated = info.finishReason === 'length';
@@ -11833,7 +12012,11 @@ export function anyProviderAvailable(userConfig?: UserConfig): boolean {
11833
12012
  } catch { return false; }
11834
12013
  }
11835
12014
  } catch { /* fall through to env check */ }
11836
- return Object.values(PROVIDERS).some(p => p.name !== 'bedrock' && p.available()); // bedrock 은 auto 후보가 아니다
12015
+ if (Object.values(PROVIDERS).some(p => p.name !== 'bedrock' && p.name !== 'opengateway' && p.available())) return true; // 명시 전용 공급자는 auto 가용성 아님
12016
+ // 시험 fake 를 «공급자 있음» 으로 치는 것은 격리 라이브 TUI 무대가 명시로 켤 때만(ELANOUS_TEST_FAKE_LLM_AS_PROVIDER=1).
12017
+ // ⛔ gate 시험 env 는 ELANOUS_TEST_FAKE_LLM=1 을 «전역» 으로 켠다(scripts/lib/gate-test-env.ts) — 그 스위치만으로 가용성이
12018
+ // 참이 되면 «아무것도 없으면 false» 계약과 가용성으로 갈리는 기능(dart·dig-engine 등)이 gate 에서 모두 바뀐다(열차 #30208 introduced 2).
12019
+ return process.env.ELANOUS_TEST_FAKE_LLM_AS_PROVIDER === '1' && testFakeLlmEnabled();
11837
12020
  }
11838
12021
 
11839
12022
  /** 직결 배선이 없는 계열 → OpenRouter 에서 그 벤더의 대표 모델(사다리 `openrouter` 에 선 것). */
@@ -11890,6 +12073,9 @@ export function getProviderForConfig(
11890
12073
  // Preserve the requesting config for OpenRouter, not the config-free singleton.
11891
12074
  return makeOpenRouterProvider({ provider: 'openrouter', model: decision.model, reasoningLevel: userConfig.llm.reasoningLevel });
11892
12075
  }
12076
+ if (resolvedProviderName === 'opengateway') {
12077
+ return makeOpenGatewayProvider({ provider: 'opengateway', model: decision.model, reasoningLevel: userConfig.llm.reasoningLevel });
12078
+ }
11893
12079
  return PROVIDERS[resolvedProviderName]!;
11894
12080
  }
11895
12081
  if (!isKnownProviderName(resolvedProviderName)) {
@@ -11930,6 +12116,8 @@ export function getProviderForConfig(
11930
12116
  return makeCodexProvider(llm);
11931
12117
  case 'openrouter':
11932
12118
  return makeOpenRouterProvider(userConfig.llm.provider === 'openrouter' ? llm : { provider: 'openrouter', model: decision.model, reasoningLevel: llm.reasoningLevel });
12119
+ case 'opengateway':
12120
+ return makeOpenGatewayProvider(userConfig.llm.provider === 'opengateway' ? llm : { provider: 'opengateway', model: decision.model, reasoningLevel: llm.reasoningLevel });
11933
12121
  case 'anthropic':
11934
12122
  return makeAnthropicProvider(llm);
11935
12123
  case 'bedrock': return makeBedrockProvider(llm);
@@ -11958,7 +12146,7 @@ export function getProviderForConfig(
11958
12146
  // union without a case here fails loud at first call.
11959
12147
  throw new Error(`unknown provider: ${provider as string}`);
11960
12148
  }
11961
- import { getModelFamily, usesCodexBehaviorGuards } from './models/prompts.js';
12149
+ import { getModelFamily, isGpt6GenerationModel, usesCodexBehaviorGuards } from './models/prompts.js';
11962
12150
  import type { ModelFamily } from './models/prompts.js';
11963
12151
 
11964
12152
  // COMPAT(llm-facade-openai-sampling-fields) · 기존 llm.ts 공개 API 유지.