elanous 0.2.32 → 0.2.35

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 (753) 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/{IVKr3AlRUVLKsw2fh7eXF → T1mBQqmkwKDLGtyisDCOd}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{997ce8a5-2ad501927003b41b.js → 0368f25d-ad84af92fefee68f.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1165.bad13fc9151a7288.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/13.02a07436dec15f89.js +32 -0
  7. package/apps/pwa/out/_next/static/chunks/{5525.86debf231e181813.js → 1530.0e612369b6fd7ea0.js} +1 -1
  8. package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +41 -0
  9. package/apps/pwa/out/_next/static/chunks/{7391.ebae168025c91b6a.js → 1674.2a65fd5668e1cc5f.js} +1 -1
  10. package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +24 -0
  11. package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +74 -0
  12. package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/{7947-d0759430f8042240.js → 1993-c0007b7ad0c0ef41.js} +1 -1
  15. package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/{60fb96c9.360b01d8d4927b7b.js → 1c735de4.f993a30bbd3c57c4.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/1dc5a567.9b092bfae3d7099b.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/{5307.60f2209e809bd627.js → 2018.a741297bce759490.js} +1 -1
  19. package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +148 -0
  23. package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/{3902.e1e71aaac850a045.js → 2625.5d870aa999f33db1.js} +1 -1
  25. package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +77 -0
  26. package/apps/pwa/out/_next/static/chunks/2833-0fe47af99ed13c29.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +62 -0
  29. package/apps/pwa/out/_next/static/chunks/3103.0df8da390948bb84.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +90 -0
  31. package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{4174.92ed04922709ac9e.js → 3408.21d1570602f4b6c0.js} +2 -2
  33. package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/3589.5444a06bcf6e775c.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/359-2250789a2d3499e7.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +36 -0
  37. package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/{9398-6aed28f0a96d0d6f.js → 3677-4215f826f6aa68e5.js} +1 -1
  39. package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +79 -0
  40. package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3f7c4ee5.3dde54f01a816613.js +122 -0
  42. package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/{7371.80c05c653b08e907.js → 4346.8601952e73bf5803.js} +1 -1
  44. package/apps/pwa/out/_next/static/chunks/4441-875b97f5821ed58a.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +286 -0
  46. package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +24 -0
  49. package/apps/pwa/out/_next/static/chunks/{2940-619bfd8ef337c611.js → 4705-194e64e47ca0fbdb.js} +1 -1
  50. package/apps/pwa/out/_next/static/chunks/{1335-6731f392c35216eb.js → 4718-17d2af636796a330.js} +3 -3
  51. package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/{7502.ccd5b8065545edd0.js → 5101.e32282718f99ed6f.js} +2 -2
  57. package/apps/pwa/out/_next/static/chunks/{2001.6c7e0fd02190886c.js → 5154.a118f3957ed14e36.js} +1 -1
  58. package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +23 -0
  61. package/apps/pwa/out/_next/static/chunks/{5173-233188df2f42c626.js → 5483-dd5d7697f6bdb106.js} +1 -1
  62. package/apps/pwa/out/_next/static/chunks/5637.281e5dec4ea6ecf1.js +94 -0
  63. package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{3267c0e6.d34854e7b3984a6e.js → 56d372f2.681ab4ec4c998fae.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5852.db1f7449f4f74612.js +287 -0
  67. package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/{6433.fc573af22bbc9ab7.js → 6236.e18cced2d5ba6afb.js} +17 -17
  74. package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +8 -0
  75. package/apps/pwa/out/_next/static/chunks/630.fe5a46428d63b013.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +27 -0
  78. package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +93 -0
  80. package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6866-79aa5b4e47cac6aa.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/{6544cb48.a87fe20ddf137be2.js → 6b89c8bd.24df687a820500b3.js} +1 -1
  83. package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +149 -0
  87. package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +104 -0
  88. package/apps/pwa/out/_next/static/chunks/{2871.0bca6137343b3f76.js → 7385.50a308a477bdfc21.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/{2985.39ccdecd36848b12.js → 7644.17e37ba6f1d4226e.js} +4 -4
  90. package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/{8018.a32663f04a6fc5f9.js → 8219.baa715d1deee80e2.js} +1 -1
  95. package/apps/pwa/out/_next/static/chunks/{4111.2bfedbb233ad206b.js → 8256.e3ac8421a71f82f4.js} +1 -1
  96. package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/8437-8d5492094b166cfa.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/{2213.2ccbada92c33ea0f.js → 8444.4c26b379ca2b9596.js} +17 -17
  100. package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +226 -0
  101. package/apps/pwa/out/_next/static/chunks/8557-e7898769499cd56f.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +64 -0
  104. package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/{6092.a7f99e68b188ca66.js → 8637.47f5b35afcae5e6b.js} +1 -1
  106. package/apps/pwa/out/_next/static/chunks/8714.ff0b7ce3ec3e3ae2.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/{3278.2e5d15b53a4091c8.js → 9214.63a510d39178e997.js} +2 -2
  111. package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +115 -0
  112. package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/{9221.7d22eaf353a2d4e7.js → 938.66ad1ef0e5abae1c.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/{6157.0c9af021de4fb31b.js → 9512.5a76207a730e0491.js} +2 -2
  115. package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/{69-0a2c8209c6d4a158.js → 967-2aa39b2d04b4c690.js} +1 -1
  117. package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/{7862.30a8d6482bb238eb.js → 9952.5daf5f94063a2b3e.js} +1 -1
  120. package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/{page-a27b1e5a0d1b308f.js → page-406b47745b53f269.js} +1 -1
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-26e6c18a1a750cf6.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/{page-32866485913d6a04.js → page-47c5d4db587266bd.js} +1 -1
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1f5a60f70cb4dd0c.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-bac7dee94e5eae4a.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/{page-04d00ae9b0890349.js → page-dc0a532f5b9196ec.js} +1 -1
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{7a1887c4.f36b88fba31da8fd.js → b2f6ba4d.fb56fdbbf798df33.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/b6705a4f-b9a9047de9eecfd0.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/{b313b242.cb1265eea908db61.js → cbe38a15.5a032598e39970c6.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/{409f1e57.d0649fc47691ebfe.js → d06f9160.a3d9062f95de8ad7.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/{0bb0ff36.b8d418980951e5ba.js → da5176c6.6773b6c5994e1d99.js} +7 -7
  178. package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +1 -0
  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 +10 -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/README.md +5 -0
  283. package/graphs/catalog/catalog.yaml +1 -1
  284. package/graphs/default-loop.yaml +76 -5
  285. package/graphs/document-loop.yaml +71 -4
  286. package/graphs/implement-loop.yaml +59 -4
  287. package/graphs/journey/SCENARIOS.md +33 -0
  288. package/graphs/journey/recipes.yaml +1 -0
  289. package/graphs/journey/ta-journey.yaml +94 -0
  290. package/graphs/journey/units/author/author.yaml +20 -0
  291. package/graphs/journey/units/author/recipes.yaml +2 -0
  292. package/graphs/journey/units/author-dialogue/author-dialogue.yaml +42 -0
  293. package/graphs/journey/units/author-dialogue/observe.ts +96 -0
  294. package/graphs/journey/units/author-dialogue/recipes.yaml +10 -0
  295. package/graphs/journey/units/green/green.yaml +20 -0
  296. package/graphs/journey/units/green/recipes.yaml +2 -0
  297. package/graphs/journey/units/pr/pr.yaml +20 -0
  298. package/graphs/journey/units/pr/recipes.yaml +2 -0
  299. package/graphs/journey/units/remember/recipes.yaml +2 -0
  300. package/graphs/journey/units/remember/remember.yaml +20 -0
  301. package/graphs/operate-loop.yaml +71 -4
  302. package/graphs/overlays/stop-heal-ladder.yaml +1 -1
  303. package/graphs/release-rehearsal/recipes.yaml +1 -1
  304. package/graphs/release-rehearsal/release-rehearsal.yaml +2 -2
  305. package/graphs/research-loop.yaml +159 -4
  306. package/graphs/test-diet/test-diet.yaml +3 -0
  307. package/graphs/units/dispatch-pod/dispatch-pod.yaml +50 -0
  308. package/graphs/units/dispatch-pod/recipes.yaml +14 -0
  309. package/graphs/units/entry/entry.yaml +50 -0
  310. package/graphs/units/entry/recipes.yaml +14 -0
  311. package/graphs/units/harvest/harvest.yaml +25 -0
  312. package/graphs/units/harvest/recipes.yaml +4 -0
  313. package/graphs/units/land/land.yaml +45 -0
  314. package/graphs/units/land/recipes.yaml +3 -0
  315. package/graphs/units/recipes.yaml +7 -0
  316. package/graphs/units/recover.yaml +39 -0
  317. package/graphs/units/reflect/recipes.yaml +3 -0
  318. package/graphs/units/reflect/reflect.yaml +15 -0
  319. package/graphs/units/task-agent-recover-review.yaml +17 -0
  320. package/graphs/units/task-agent-recover-wait.yaml +17 -0
  321. package/graphs/units/verbs/make-doc.yaml +34 -0
  322. package/graphs/units/verbs/recipes.yaml +33 -0
  323. package/graphs/units/verbs/verify.yaml +55 -0
  324. package/graphs/work/recipes.yaml +2 -0
  325. package/graphs/work/research-report.yaml +28 -0
  326. package/package.json +1 -1
  327. package/scripts/ci-typecheck-changed.ts +69 -16
  328. package/scripts/coord-role-pack.ts +19 -6
  329. package/scripts/docs/generate-graph-anatomy.ts +19 -2
  330. package/scripts/graph-harvest-unit.ts +22 -0
  331. package/scripts/graph-units/journey-stub.ts +6 -0
  332. package/scripts/graph-units/land-enqueue.ts +78 -0
  333. package/scripts/graph-units/recover-plan.ts +15 -0
  334. package/scripts/graph-units/reflect-node.ts +88 -0
  335. package/scripts/graph-units/ta-journey-observe.ts +109 -0
  336. package/scripts/graph-units/verbs/headless-goal-loop.ts +152 -0
  337. package/scripts/graph-units/verbs/verify-stage.ts +75 -0
  338. package/scripts/graph-units/verbs-envelope.ts +139 -0
  339. package/scripts/hq/standby-snapshot.ts +30 -0
  340. package/scripts/public-export.ts +43 -1
  341. package/scripts/ratchets/train-side-invariants.sh +45 -0
  342. package/scripts/release-loop/auto-approve-node.ts +30 -16
  343. package/scripts/release-loop/docs-land-node.ts +21 -5
  344. package/scripts/release-loop/gate-baseline-receipt.ts +155 -0
  345. package/scripts/release-loop/gate-closure.ts +5 -1
  346. package/scripts/release-loop/gate-diff.ts +1 -1
  347. package/scripts/release-loop/gate-node.ts +675 -49
  348. package/scripts/release-loop/gate-partial.ts +68 -14
  349. package/scripts/release-loop/gate-radius-live.ts +177 -0
  350. package/scripts/release-loop/gate-radius-shadow.ts +138 -0
  351. package/scripts/release-loop/gate-traffic-mode.ts +128 -0
  352. package/scripts/release-loop/gate-triage-node.ts +5 -2
  353. package/scripts/release-loop/known-issues-0.2.33-approved.json +194 -0
  354. package/scripts/release-loop/known-issues-node.ts +77 -8
  355. package/scripts/release-loop/node-verdict.ts +12 -1
  356. package/scripts/release-loop/npm-publish-node.ts +66 -12
  357. package/scripts/release-loop/preflight.ts +93 -7
  358. package/scripts/release-loop/probe-pod-host-dirs-live.ts +5 -0
  359. package/scripts/release-loop/publish-node.ts +60 -9
  360. package/scripts/release-loop/pwa-remote.ts +166 -0
  361. package/scripts/release-loop/pwa-scenarios-node.ts +19 -3
  362. package/scripts/release-loop/resume-cap.ts +56 -0
  363. package/scripts/release-loop/resume-release.ts +155 -19
  364. package/scripts/release-loop/resume.ts +24 -1
  365. package/scripts/release-loop/tui-sim-node.ts +8 -2
  366. package/scripts/release-loop/unattended-release.ts +10 -2
  367. package/scripts/test-diet/lib.ts +6 -1
  368. package/scripts/test-diet/node.ts +194 -13
  369. package/scripts/ux-sim.ts +39 -0
  370. package/src/acp/core-turn-bridge.ts +20 -5
  371. package/src/acp/reasoning-thought-buffer.ts +45 -0
  372. package/src/agent/self-ambient-cache.ts +8 -0
  373. package/src/agent-substrate/acp-reviewer.ts +90 -15
  374. package/src/agent-substrate/pr-reviewer.ts +17 -0
  375. package/src/agent-substrate/review-finding-key.ts +53 -0
  376. package/src/agent-substrate/self-review-cli.ts +188 -18
  377. package/src/ask-user-question/pending-questions.ts +1 -1
  378. package/src/autopilot/pr-manager.ts +393 -65
  379. package/src/budget/run-usage-rollup.ts +1 -0
  380. package/src/chat/index.ts +0 -2
  381. package/src/chat/pickers/modal-runtime.ts +10 -27
  382. package/src/chat/tool-render/dispatch.ts +62 -10
  383. package/src/cli/agent-cli.ts +13 -2
  384. package/src/cli/control-cli.ts +24 -7
  385. package/src/cli/doctor-cli.ts +4 -1
  386. package/src/cli/guardian-cli.ts +10 -0
  387. package/src/cli/light-entry-route.ts +75 -0
  388. package/src/cli/llm-detect-cli.ts +23 -1
  389. package/src/cli/pod-cli.ts +77 -3
  390. package/src/cli/pr-cli.ts +81 -14
  391. package/src/cli/pr-land-base-read.ts +2 -0
  392. package/src/cli/pr-land-overlap-evidence.ts +154 -16
  393. package/src/cli/pr-land-pod-shadow-job.ts +3 -0
  394. package/src/cli/pr-land-recovery.ts +64 -0
  395. package/src/cli/pty-takeover-cli.ts +6 -5
  396. package/src/cli/release-checklist-read-cli.ts +79 -0
  397. package/src/cli/release-cli.ts +189 -132
  398. package/src/cli/release-run-if-ready.ts +29 -28
  399. package/src/cli/release-single-flight.ts +178 -0
  400. package/src/cli/remote-resolve.ts +1 -1
  401. package/src/cli/root-tui-entry.ts +48 -0
  402. package/src/cli/seat-cli.ts +37 -0
  403. package/src/cli/setup-cli.ts +40 -1
  404. package/src/cli/sim-cli.ts +22 -0
  405. package/src/cli/tasks-cli.ts +667 -14
  406. package/src/cli/usage-cli.ts +13 -11
  407. package/src/clipboard/history.ts +179 -13
  408. package/src/config.ts +8 -1
  409. package/src/control/control-status.ts +8 -3
  410. package/src/control-plane/ledger.ts +5 -3
  411. package/src/control-plane/server.ts +5 -3
  412. package/src/core-turn/short-question.ts +5 -1
  413. package/src/dashboard/chat/acp-chat.ts +8 -0
  414. package/src/dashboard/index.ts +114 -77
  415. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +3 -0
  416. package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
  417. package/src/dashboard/input/seat-autowake.ts +56 -3
  418. package/src/dashboard/render/theme-resolver.ts +33 -4
  419. package/src/dashboard/seat-boot-preamble.ts +1 -1
  420. package/src/dashboard/slash-runtime/ask-clarification.ts +48 -0
  421. package/src/dashboard/slash-runtime/dashboard-delegated-slashes.ts +68 -0
  422. package/src/dashboard/slash-runtime/dashboard-handlers.ts +62 -322
  423. package/src/dashboard/slash-runtime/dashboard-log-slash.ts +208 -0
  424. package/src/dashboard/turn-preamble.ts +47 -1
  425. package/src/dashboard/turn-stream-formatter.ts +34 -1
  426. package/src/dashboard/turn-stream-runtime.ts +2 -0
  427. package/src/dashboard/turn-typeahead-prompt-zone.ts +67 -0
  428. package/src/domains/guardian-tick.ts +54 -2
  429. package/src/domains/outbound-alert.ts +3 -2
  430. package/src/domains/schedule-registry.ts +16 -2
  431. package/src/extractors.ts +3 -1
  432. package/src/git-fs/idle-refresh.ts +76 -0
  433. package/src/git-fs/index.ts +18 -7
  434. package/src/git-fs/retry.ts +4 -0
  435. package/src/git-fs/runner.ts +2 -0
  436. package/src/git-fs/worktree.ts +42 -4
  437. package/src/graph-kinds/registry.ts +2 -2
  438. package/src/graph-runner/runner.ts +267 -54
  439. package/src/grok/credential.ts +15 -3
  440. package/src/harness/harness-cli-command.ts +151 -38
  441. package/src/harness/harness-incidents.ts +37 -0
  442. package/src/harness/harness-pod-dispatch.ts +38 -1
  443. package/src/harness/harness-salvage-cli.ts +14 -2
  444. package/src/harness/launch-utterance-ledger.ts +208 -0
  445. package/src/impl-discipline/detector.ts +16 -4
  446. package/src/impl-discipline/system-prompt.ts +11 -0
  447. package/src/impl-discipline/types.ts +2 -2
  448. package/src/index.ts +683 -146
  449. package/src/intake-plane/already-built-hint.ts +91 -0
  450. package/src/intake-plane/requirement-funnel.ts +29 -1
  451. package/src/knowhow/pack.ts +199 -0
  452. package/src/light-cli.ts +111 -0
  453. package/src/llm/opengateway-models.ts +11 -0
  454. package/src/llm/provider-credentials.ts +14 -0
  455. package/src/llm/provider-detect.ts +8 -1
  456. package/src/llm/runtime-model-family.ts +2 -1
  457. package/src/llm.ts +268 -65
  458. package/src/loops/budget.ts +95 -0
  459. package/src/loops/msg-wake.ts +8 -2
  460. package/src/loops/orchestrator/traffic.ts +132 -1
  461. package/src/model-tier/llm-tier-map.ts +15 -1
  462. package/src/mss/logging/log-store.ts +4 -5
  463. package/src/native-tool-catalog.ts +15 -1
  464. package/src/nexus/api/graphs-api.ts +22 -3
  465. package/src/nexus/api/http-server.ts +1 -1
  466. package/src/nexus/api/loop-resources.ts +13 -1
  467. package/src/nexus/api/ops-api.ts +12 -0
  468. package/src/oauth/claude-pty-maturity.ts +66 -0
  469. package/src/oauth/codex-access-mirror.ts +55 -0
  470. package/src/oauth/codex.ts +7 -0
  471. package/src/oauth/fallback-chain.ts +1 -1
  472. package/src/onboarding/first-run.ts +5 -3
  473. package/src/onboarding/non-interactive.ts +64 -13
  474. package/src/onboarding.ts +10 -2
  475. package/src/ops/overview-collect.ts +54 -4
  476. package/src/ops/overview.ts +31 -7
  477. package/src/pr-tool/census.ts +282 -30
  478. package/src/pr-tool/inflight-registry.ts +160 -7
  479. package/src/prompt-library/gpt6-family-addendum.ts +14 -1
  480. package/src/pty-shell/herdr-agent-report.ts +442 -0
  481. package/src/pty-shell/pty-control-ipc.ts +5 -5
  482. package/src/pty-shell/pty-manifest.ts +7 -0
  483. package/src/pty-shell/pty-write-outcome.ts +24 -6
  484. package/src/pty-shell/tui-run-state.ts +117 -3
  485. package/src/release-loop/checklist.ts +103 -5
  486. package/src/release-loop/feature-store.ts +19 -2
  487. package/src/release-loop/landed-but-yellow.ts +129 -5
  488. package/src/release-loop/light-rc.ts +1 -0
  489. package/src/release-loop/placement.ts +10 -3
  490. package/src/release-loop/rehearsal.ts +205 -25
  491. package/src/release-loop/rubric.ts +16 -2
  492. package/src/repl/index.ts +174 -17
  493. package/src/repl/ops-msg-bridge.ts +32 -0
  494. package/src/self-dev/ask-launch-flow.ts +44 -5
  495. package/src/self-dev/cli-help-text.ts +17 -0
  496. package/src/self-dev/dev-cli.ts +11 -9
  497. package/src/self-dev/draft-residue.ts +37 -1
  498. package/src/self-dev/draft-sweep.ts +188 -13
  499. package/src/self-dev/draft-triage-rules.ts +107 -0
  500. package/src/self-dev/fleet-reduce.ts +3 -2
  501. package/src/self-dev/graph-front-nodes.ts +112 -0
  502. package/src/self-dev/graph-journey-nodes.ts +11 -6
  503. package/src/self-dev/graph-journey-route.ts +60 -6
  504. package/src/self-dev/harness-run-cli.ts +3 -15
  505. package/src/self-dev/orchestrate-cli-text.ts +10 -0
  506. package/src/self-dev/orchestrate.ts +79 -3
  507. package/src/self-dev/review-provider-fallback.ts +35 -1
  508. package/src/self-dev/run-supervisor.ts +107 -12
  509. package/src/self-dev/run-types.ts +5 -1
  510. package/src/self-dev/self-orchestrate-runtime.ts +1 -11
  511. package/src/self-dev/shard-aggregate.ts +42 -5
  512. package/src/self-dev/shard-run.ts +8 -1
  513. package/src/self-implement/blocked-draft-policy.ts +20 -0
  514. package/src/self-implement/classify-shadow.ts +3 -7
  515. package/src/self-implement/doctor-visit.ts +18 -1
  516. package/src/self-implement/gate-baseline.ts +95 -12
  517. package/src/self-implement/gate-cli.ts +1 -0
  518. package/src/self-implement/gate-remote.ts +40 -25
  519. package/src/self-implement/goal-author-decompose.ts +275 -47
  520. package/src/self-implement/goal-author-identity.ts +66 -0
  521. package/src/self-implement/goal-author-preservation-obligation.ts +35 -0
  522. package/src/self-implement/goal-author.ts +254 -120
  523. package/src/self-implement/goal-elaborate.ts +295 -0
  524. package/src/self-implement/goal-refine.ts +270 -0
  525. package/src/self-implement/graph-overlay-yaml.ts +28 -2
  526. package/src/self-implement/graph-unit-flatten.ts +103 -0
  527. package/src/self-implement/graph-unit-resolver.ts +107 -0
  528. package/src/self-implement/graph-yaml.ts +151 -1
  529. package/src/self-implement/headless-elanous-driver.ts +1 -0
  530. package/src/self-implement/knowhow-pack.ts +103 -0
  531. package/src/self-implement/orchestrator.ts +160 -45
  532. package/src/self-implement/pod-warm-pool-profile.ts +45 -0
  533. package/src/self-implement/review-mustfix-class.ts +203 -0
  534. package/src/self-implement/rework-budget-judgment.ts +5 -8
  535. package/src/self-implement/run-stop.ts +17 -2
  536. package/src/self-implement/running-runs.ts +29 -1
  537. package/src/self-implement/scope-adjacency.ts +113 -0
  538. package/src/self-implement/seams.ts +138 -4
  539. package/src/self-implement/stop-autoheal.ts +112 -2
  540. package/src/session/chat.ts +27 -0
  541. package/src/session-runtime/index.ts +1 -1
  542. package/src/session-runtime/retry-policy.ts +2 -1
  543. package/src/setup/llm-env-detect.ts +5 -0
  544. package/src/skills/tools/agent.ts +140 -14
  545. package/src/skills/tools/msg-ask.ts +100 -0
  546. package/src/skills/tools/ops-ledger.ts +2 -1
  547. package/src/skills/tools/schedule-wakeup.ts +66 -17
  548. package/src/steward/hold-hygiene.ts +24 -6
  549. package/src/steward/release-day.ts +7 -3
  550. package/src/steward/triage-budget.ts +194 -0
  551. package/src/steward/triage.ts +57 -7
  552. package/src/task-agent/actions.ts +69 -1
  553. package/src/task-agent/green-sweep.ts +4 -0
  554. package/src/task-agent/harvest-unit.ts +141 -0
  555. package/src/task-agent/live-moves.ts +257 -15
  556. package/src/task-agent/parent-host.ts +216 -6
  557. package/src/task-agent/postland-card.ts +80 -1
  558. package/src/task-agent/rejudge-on-head.ts +112 -26
  559. package/src/task-agent/repair-branch-cas.ts +4 -1
  560. package/src/task-agent/repair-cycle.ts +16 -3
  561. package/src/task-agent/run-identity.ts +4 -3
  562. package/src/task-agent/shadow.ts +19 -3
  563. package/src/task-agent/task-hand.ts +96 -36
  564. package/src/task-agent/tier-split.ts +127 -0
  565. package/src/task-agent/work-order-build.ts +24 -0
  566. package/src/task-agent/work-order.ts +3 -2
  567. package/src/task-orchestrator/generator-prompt.ts +60 -11
  568. package/src/task-orchestrator/surfaces/pod-account-broker.ts +72 -3
  569. package/src/task-orchestrator/surfaces/pod-child-providers.ts +1 -1
  570. package/src/task-orchestrator/surfaces/pod-command-job.ts +47 -8
  571. package/src/task-orchestrator/surfaces/pod-image-source.ts +89 -1
  572. package/src/task-orchestrator/surfaces/pod-lease.ts +17 -8
  573. package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +86 -8
  574. package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +8 -2
  575. package/src/task-orchestrator/surfaces/pod-pool.ts +73 -17
  576. package/src/task-orchestrator/surfaces/pod-provenance.ts +76 -0
  577. package/src/task-orchestrator/surfaces/pod-source-receive.ts +72 -4
  578. package/src/task-orchestrator/surfaces/pod-warm-provenance.ts +81 -0
  579. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +32 -5
  580. package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +3 -0
  581. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +421 -0
  582. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +2 -1
  583. package/src/task-orchestrator/surfaces/self-implement-pod.ts +588 -71
  584. package/src/task-orchestrator/surfaces/self-implement.ts +106 -2
  585. package/src/tool-runtime/ops-ledger-runtimes.ts +10 -2
  586. package/src/tool-runtime/truncation-store.ts +4 -0
  587. package/src/tui/README.md +2 -0
  588. package/src/tui/chat/background-job-status.ts +54 -0
  589. package/src/tui/chat/log-view.ts +80 -0
  590. package/src/tui/entry.ts +406 -0
  591. package/src/tui/input/composer.ts +144 -0
  592. package/src/tui/seat-mail-boot.ts +59 -0
  593. package/src/tui/slash/compact.ts +100 -0
  594. package/src/tui/slash/new-session.ts +35 -0
  595. package/src/tui-client/dashboard-session.ts +10 -1
  596. package/src/tui-client/local-chat-turn.ts +239 -0
  597. package/src/tui-client/local-harness-command.ts +63 -0
  598. package/src/tui-client/local-provider-command.ts +184 -0
  599. package/src/user-config/coercion.ts +36 -0
  600. package/src/user-config.ts +22 -43
  601. package/src/ux-sim/event-monkey.ts +378 -0
  602. package/src/ux-sim/fake-bin.ts +42 -7
  603. package/src/ux-sim/fault-nextmove-dispatch.ts +266 -0
  604. package/src/ux-sim/fault-pod-codex-503.ts +211 -0
  605. package/src/ux-sim/fault-scope-escape-lift.ts +189 -0
  606. package/src/ux-sim/scenario.ts +72 -13
  607. package/src/version/packed-revision.json +1 -1
  608. package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +0 -27
  611. package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +0 -287
  612. package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +0 -62
  613. package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/1654.32de4b324981a188.js +0 -23
  617. package/apps/pwa/out/_next/static/chunks/1834-98b64172bc1efe77.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +0 -149
  619. package/apps/pwa/out/_next/static/chunks/1913.7cc6fb6055b1ed3f.js +0 -41
  620. package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/2112-e4efc21a6505d5bc.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/2534.e85ae21ad0dac829.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/2898.fd781bc7cf01a7b7.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +0 -115
  629. package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +0 -64
  630. package/apps/pwa/out/_next/static/chunks/3541-ce3a5424ed5ad7f1.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/3583.a05e88cc8d594628.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +0 -36
  636. package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +0 -286
  640. package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +0 -77
  641. package/apps/pwa/out/_next/static/chunks/4745.67d6f99c245af3f7.js +0 -226
  642. package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/4999.c064a4000c2a9e94.js +0 -79
  644. package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/5304.04d24756f242a094.js +0 -148
  647. package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/5458-16cd7a2b51b74c8c.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/5543.a438b8ab5a13ea47.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +0 -74
  653. package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +0 -94
  655. package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/6323.8672b4817a306928.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +0 -90
  661. package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +0 -32
  662. package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +0 -104
  663. package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/6767.ea607cf0c20a25af.js +0 -24
  668. package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +0 -93
  669. package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +0 -8
  674. package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/8097-9530c03bcc550f02.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/9002.e5658224e3dc1b6f.js +0 -24
  685. package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/9138.b6e80031afb1d973.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/9279-d28c5b7754d010ae.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/9407.e49124dedf0f5e72.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/9989.3694300e5f000b14.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/app/approvals/page-504204b58c82c253.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a9717a67c2eecbaf.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/app/board/page-5c9ec30aee62dfbf.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/app/botlab/page-584191533721fa16.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/app/bots/page-73c4b4bb3ac7ab5f.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/app/ceo/page-c0f1ca371f710b06.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/app/chat/page-46430d45a9e04eac.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/app/consult/page-3b2ebf1dc64ff0be.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/app/decisions/page-25654b82094f7d22.js +0 -1
  705. package/apps/pwa/out/_next/static/chunks/app/design-check/page-8ea49a4c6dd2c6e7.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/app/editor/page-ce5113aefea0a8d1.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/app/exec/page-0e5a41fac1c75396.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/app/field/page-31aaf1ed37c6df9a.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/app/inside/page-3dcc1fa411e1f4e0.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/app/intake/page-c69247e7134d329d.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/app/layout-66dc5cd3a0999abe.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/app/live/page-26ff7ff651a7217d.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/app/live-run/page-617b3976981efa96.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/app/loops/page-d256f5d5d9552823.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/app/market/page-ce8f1907b8a6101c.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-33e182a316263116.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/app/not-found-7607cca9b84950c6.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/app/observatory/page-eeab86176b03dc3b.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-5b93dbae3432b996.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-77a6cb90a9cf2b10.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f47e768b5b242b5a.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/app/outputs/page-eb41aa3367fc2505.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/app/page-4d13ab0b8a267e3f.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/app/reflection/page-84dad32ff0fc0831.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-95306f892aa2d0ee.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/app/sessions/page-940fb6c217f6b470.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-8c66a3b24a745630.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/app/settings/page-7b675dfd35c36fc9.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8bd0d3cf7665bcfc.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/app/setup/page-c219f2ed171131be.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/app/share/page-40f8fa21bdae955b.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/app/showroom/page-468f8313e4f1fbd9.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/app/tasks/page-7bbb8fa353a246c4.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/app/today/page-4214b855d9233ea8.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/app/trace/page-936752c7aa58762e.js +0 -1
  738. package/apps/pwa/out/_next/static/chunks/app/vault/page-ec052ad359df1797.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8305570551091338.js +0 -1
  740. package/apps/pwa/out/_next/static/chunks/app/workflows/page-fad650e4793adb65.js +0 -1
  741. package/apps/pwa/out/_next/static/chunks/app/workspace/page-d90e64743826e1d8.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a16bcfd49af86a32.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +0 -122
  744. package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/ebc7d829.264a0bcb6c750b50.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +0 -1
  748. package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +0 -1
  752. package/src/cli/g6a-registration-probe.ts +0 -16
  753. /package/apps/pwa/out/_next/static/{IVKr3AlRUVLKsw2fh7eXF → T1mBQqmkwKDLGtyisDCOd}/_ssgManifest.js +0 -0
package/src/llm.ts CHANGED
@@ -19,11 +19,13 @@ import {
19
19
  getOpenAIApiKey, OPENAI_MODEL, OPENAI_API_URL,
20
20
  getAnthropicApiKey, ANTHROPIC_MODEL, ANTHROPIC_API_URL,
21
21
  getOpenRouterApiKey, OPENROUTER_API_URL, OPENROUTER_MODEL,
22
+ getOpenGatewayApiKey, OPENGATEWAY_API_URL, OPENGATEWAY_MODEL,
22
23
  getLocalLLMUrl, LOCAL_LLM_MODEL,
23
24
  getGeminiApiKey, GEMINI_MODEL,
24
25
  DEFAULT_PROVIDER,
25
26
  } from './config.js';
26
27
  import { debug, redactSecrets, redactSecretText } from './debug/log.js';
28
+ import { isVerifiedOpenGatewayModel } from './llm/opengateway-models.js';
27
29
  import { llmUsageCostFields } from './budget/llm-cost.js';
28
30
  import { accumulateByokUsage } from './llm/openrouter-byok-cost.js';
29
31
  import { ACTION_PHASE_OPS_TOOLS, isSteeredShellRejection, REPAIR_PHASE_READ_ONLY_OPS_TOOLS } from './llm/tool-loop-steered-rejection.js';
@@ -354,6 +356,8 @@ export interface LLMOpts {
354
356
  onUsage?(usage: LLMUsage): void;
355
357
  /** Optional model role attached to this request's usage observation. */
356
358
  usageRole?: ModelRole;
359
+ /** Optional per-call metering phase; absent calls keep the existing ledger shape. */
360
+ usagePhase?: string;
357
361
  /** Optional streamLLM usage-ledger site override (defaults to "stream-llm"). */
358
362
  usageSite?: string;
359
363
  /**
@@ -1229,8 +1233,10 @@ export async function* parseOpenAISSELines(
1229
1233
  }
1230
1234
  };
1231
1235
  for await (const line of lines as AsyncIterable<string>) {
1232
- if (!line.startsWith('data: ')) continue;
1233
- const data = line.slice(6).trim();
1236
+ // SSE permits both `data: {...}` and `data:{...}`. OpenGateway emits
1237
+ // the latter, so requiring a space silently discarded its whole stream.
1238
+ if (!line.startsWith('data:')) continue;
1239
+ const data = line.slice(5).trim();
1234
1240
  if (data === '[DONE]') continue;
1235
1241
  let parsed: any;
1236
1242
  try { parsed = JSON.parse(data); } catch { continue; }
@@ -1413,6 +1419,7 @@ function retryOptsFor(
1413
1419
 
1414
1420
  function inferOpenAIProviderName(url: string): string {
1415
1421
  if (/^https?:\/\/openrouter\.ai(?::\d+)?(?:\/|$)/i.test(url)) return 'openrouter';
1422
+ if (/^https?:\/\/apis\.opengateway\.ai(?::\d+)?(?:\/|$)/i.test(url)) return 'opengateway';
1416
1423
  if (url.includes('x.ai')) return 'grok';
1417
1424
  if (url.includes('openai.com')) return 'openai';
1418
1425
  if (url.includes('localhost') || url.includes('127.0.0.1')) return 'local';
@@ -1586,6 +1593,7 @@ type ResponsesInputItem =
1586
1593
  export interface MessagesToResponsesInputOpts {
1587
1594
  acceptToolImages?: boolean;
1588
1595
  acceptUserMessageImages?: boolean;
1596
+ onOrphanToolResult?: (callId: string) => void;
1589
1597
  }
1590
1598
 
1591
1599
  /** Exported for tests. Converts the unified LLMMessage shape into the
@@ -1603,21 +1611,23 @@ export function messagesToResponsesInput(
1603
1611
  // P-3 §6.9 — user-message image gating (default true; current gpt-5
1604
1612
  // family all vision-capable per allowlist).
1605
1613
  const acceptUserImages = opts.acceptUserMessageImages ?? true;
1606
- // First pass — collect every tool_result.tool_use_id that ever
1607
- // appears across the message list. Second pass below uses this set
1608
- // to drop orphan tool_use blocks (assistant invoked a tool but no
1609
- // matching tool_result followed). Orphans happen when the runtime
1614
+ // First pass — collect both sides of each tool round. Second pass
1615
+ // drops either side when its partner is absent from retained history.
1616
+ // Orphan tool_use blocks happen when the runtime
1610
1617
  // pre-empts dispatch (e.g. W5-G early force-synthesis fires
1611
1618
  // immediately after the assistant's tool_use stream completes but
1612
1619
  // before dispatchTool runs) — codex Responses API hard-rejects
1613
1620
  // function_call without function_call_output ("No tool output
1614
1621
  // found for function call X" → 400).
1615
1622
  const seenToolResultIds = new Set<string>();
1623
+ const seenToolUseIds = new Set<string>();
1616
1624
  for (const m of messages) {
1617
1625
  if (!Array.isArray(m.content)) continue;
1618
1626
  for (const b of m.content) {
1619
1627
  if (b && typeof b === 'object' && b.type === 'tool_result' && b.tool_use_id) {
1620
1628
  seenToolResultIds.add(b.tool_use_id);
1629
+ } else if (m.role === 'assistant' && b && typeof b === 'object' && b.type === 'tool_use' && b.id) {
1630
+ seenToolUseIds.add(b.id);
1621
1631
  }
1622
1632
  }
1623
1633
  }
@@ -1695,6 +1705,13 @@ export function messagesToResponsesInput(
1695
1705
  call_id: b.id,
1696
1706
  });
1697
1707
  } else if (b.type === 'tool_result') {
1708
+ // A restored/truncated session can retain an output after its
1709
+ // assistant call was removed. Codex rejects that wire item with
1710
+ // "No tool call found for function call output" on every retry.
1711
+ if (!seenToolUseIds.has(b.tool_use_id)) {
1712
+ opts.onOrphanToolResult?.(b.tool_use_id);
1713
+ continue;
1714
+ }
1698
1715
  // Image-pipeline P3 (2026-05-05) — when the caller opted in
1699
1716
  // (acceptToolImages, set by Codex provider for gpt-5 family)
1700
1717
  // AND the tool_result content carries image bytes, emit the
@@ -4016,6 +4033,13 @@ export const PROVIDERS: Record<string, LLMProvider> = {
4016
4033
  streamChat: (messages, opts = {}) => makeCodexProvider({ provider: 'openai-codex' }).streamChat!(messages, opts),
4017
4034
  chat: (messages, opts = {}) => makeCodexProvider({ provider: 'openai-codex' }).chat!(messages, opts),
4018
4035
  },
4036
+ glm: {
4037
+ name: 'glm',
4038
+ get defaultModel() { return configuredZaiProvider().defaultModel; },
4039
+ available: () => zaiCodingPlanAvailable(),
4040
+ streamChat: (messages, opts = {}) => configuredZaiProvider().streamChat!(messages, opts),
4041
+ chat: (messages, opts = {}) => configuredZaiProvider().chat!(messages, opts),
4042
+ },
4019
4043
  anthropic: AnthropicProvider,
4020
4044
  local: LocalProvider,
4021
4045
  gemini: GeminiProvider,
@@ -4027,9 +4051,22 @@ export const PROVIDERS: Record<string, LLMProvider> = {
4027
4051
  streamChat: (messages, opts = {}) => makeOpenRouterProvider({ provider: 'openrouter' }).streamChat!(messages, opts),
4028
4052
  chat: (messages, opts = {}) => makeOpenRouterProvider({ provider: 'openrouter' }).chat!(messages, opts),
4029
4053
  },
4054
+ // Explicit choice only. A new key never changes the established auto-provider order.
4055
+ opengateway: {
4056
+ name: 'opengateway',
4057
+ get defaultModel() { return OPENGATEWAY_MODEL; },
4058
+ available: () => !!getOpenGatewayApiKey(),
4059
+ streamChat: (messages, opts = {}) => makeOpenGatewayProvider({ provider: 'opengateway' }).streamChat!(messages, opts),
4060
+ chat: (messages, opts = {}) => makeOpenGatewayProvider({ provider: 'opengateway' }).chat!(messages, opts),
4061
+ },
4030
4062
  bedrock: BedrockProvider, // 명시 선택 전용 — 자동 순서·폴백 체인에 «안» 넣는다(src/llm/bedrock-provider.ts)
4031
4063
  };
4032
4064
 
4065
+ function configuredZaiProvider(): LLMProvider {
4066
+ const { getUserConfig } = require('./user-config.js') as typeof import('./user-config.js');
4067
+ return makeZaiCodingPlanProvider(getUserConfig().llm);
4068
+ }
4069
+
4033
4070
  const AUTOMATIC_PROVIDER_ORDER = ['grok', 'anthropic', 'gemini', 'local'] as const;
4034
4071
  const PROVIDER_DECISION_ORDER = ['grok', 'anthropic', 'openai', 'gemini', 'local', 'openrouter'] as const;
4035
4072
  const SUBSCRIPTION_DECISION_ORDER = ['openai-codex', 'grok'] as const;
@@ -4209,13 +4246,15 @@ export function decideProviderForConfig(
4209
4246
  return { provider, model: selectedModel, auth: baseUrl || getLocalLLMUrl() ? 'local' : 'none' };
4210
4247
  case 'openrouter':
4211
4248
  return { provider, model: selectedModel, auth: apiKey || getOpenRouterApiKey() ? 'apikey' : 'none' };
4249
+ case 'opengateway':
4250
+ return { provider, model: selectedModel, auth: apiKey || getOpenGatewayApiKey() ? 'apikey' : 'none' };
4212
4251
  case 'bedrock': return { provider, model: selectedModel, auth: authKindForProvider('bedrock', selectedModel) };
4213
4252
  }
4214
4253
  throw new Error(`unknown provider: ${provider as string}`);
4215
4254
  }
4216
4255
 
4217
4256
  function isKnownProviderName(provider: string): provider is ConcreteProviderName {
4218
- return provider === 'grok' || provider === 'openai' || provider === 'openai-codex' || provider === 'anthropic' || provider === 'gemini' || provider === 'local' || provider === 'openrouter' || provider === 'bedrock';
4257
+ return provider === 'grok' || provider === 'openai' || provider === 'openai-codex' || provider === 'anthropic' || provider === 'gemini' || provider === 'local' || provider === 'openrouter' || provider === 'opengateway' || provider === 'bedrock';
4219
4258
  }
4220
4259
 
4221
4260
  function authKindForProvider(provider: string, model: string, apiKey?: string): ProviderDecisionAuth {
@@ -4230,6 +4269,7 @@ function authKindForProvider(provider: string, model: string, apiKey?: string):
4230
4269
  if (provider === 'anthropic') return getAnthropicApiKey() ? 'apikey' : 'none';
4231
4270
  if (provider === 'gemini') return getGeminiApiKey() ? 'apikey' : 'none';
4232
4271
  if (provider === 'openrouter') return getOpenRouterApiKey() ? 'apikey' : 'none';
4272
+ if (provider === 'opengateway') return getOpenGatewayApiKey() ? 'apikey' : 'none';
4233
4273
  if (provider === 'bedrock') return BedrockProvider.available() ? 'apikey' : 'none';
4234
4274
  if (provider === 'openai-codex') {
4235
4275
  try {
@@ -4250,6 +4290,7 @@ function defaultModelForProvider(provider: ConcreteProviderName): string {
4250
4290
  case 'gemini': return GEMINI_MODEL;
4251
4291
  case 'local': return LOCAL_LLM_MODEL;
4252
4292
  case 'openrouter': return OPENROUTER_MODEL;
4293
+ case 'opengateway': return OPENGATEWAY_MODEL;
4253
4294
  case 'bedrock': return BedrockProvider.defaultModel;
4254
4295
  }
4255
4296
  throw new Error(`unknown provider: ${provider as string}`);
@@ -4419,6 +4460,16 @@ function providerByName(name: string): LLMProvider | undefined {
4419
4460
  return PROVIDERS[name] ?? automaticProviderCandidates().find((candidate) => candidate.name === name);
4420
4461
  }
4421
4462
 
4463
+ function firstAvailableFallbackProvider(attempted: ReadonlySet<string>, opts: LLMOpts): LLMProvider | undefined {
4464
+ // A candidate may lose its credential between chain enumeration and the
4465
+ // switch. Keep scanning the ordered chain instead of stopping at that slot.
4466
+ for (const name of remainingFallbackProviderNames(attempted, opts)) {
4467
+ const candidate = providerByName(name);
4468
+ if (candidate?.available()) return candidate;
4469
+ }
4470
+ return undefined;
4471
+ }
4472
+
4422
4473
  function finalizeStreamingProviderModel(provider: LLMProvider, model: string): { provider: LLMProvider; model: string } {
4423
4474
  if (!isKnownProviderName(provider.name)) return { provider, model };
4424
4475
 
@@ -4805,7 +4856,7 @@ export async function streamLLM(
4805
4856
  if (consumed.ok) {
4806
4857
  if (consumed.usage !== 'unmeasured') {
4807
4858
  try {
4808
- logAgentTurnUsage(activeModel, consumed.usage, { providerName: activeProvider.name, site: opts.usageSite ?? 'stream-llm', role: opts.usageRole });
4859
+ logAgentTurnUsage(activeModel, consumed.usage, { providerName: activeProvider.name, site: opts.usageSite ?? 'stream-llm', role: opts.usageRole, phase: opts.usagePhase });
4809
4860
  } catch { /* best-effort observation */ }
4810
4861
  }
4811
4862
  debug.log('llm', 'outcome', { provider: activeProvider.name, status: 'ok', kind: 'streamLLM', durationMs: Date.now() - started });
@@ -4821,8 +4872,11 @@ export async function streamLLM(
4821
4872
 
4822
4873
  const err: any = consumed.error;
4823
4874
  if (err instanceof OverloadFailoverError && !opts.provider) {
4824
- const switched = providerByName('grok');
4825
- if (switched && !attemptedProviders.has(switched.name) && switched.available() && full.length === 0) {
4875
+ const switched = activeProvider.name === 'openai-codex'
4876
+ ? firstAvailableFallbackProvider(attemptedProviders, opts)
4877
+ : providerByName('grok');
4878
+ if (switched && !attemptedProviders.has(switched.name)
4879
+ && (activeProvider.name === 'openai-codex' || switched.available()) && full.length === 0) {
4826
4880
  debug.log('llm.router', 'overload-failover', {
4827
4881
  blockedProvider: activeProvider.name,
4828
4882
  fallbackProvider: switched.name,
@@ -8034,15 +8088,17 @@ export function billingRouteForProvider(provider: string | undefined, model: str
8034
8088
  }
8035
8089
 
8036
8090
  /** Observe usage with optional site/role metadata; a provider-name string remains supported. */
8037
- export function logAgentTurnUsage(model: string, usage: LLMUsage, providerNameOrOptions?: string | { providerName?: string; site?: string; role?: ModelRole }): void {
8091
+ export function logAgentTurnUsage(model: string, usage: LLMUsage, providerNameOrOptions?: string | { providerName?: string; site?: string; role?: ModelRole; phase?: string }): void {
8038
8092
  try {
8039
8093
  const providerName = typeof providerNameOrOptions === 'string' ? providerNameOrOptions : providerNameOrOptions?.providerName;
8040
8094
  const site = (typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.site) ?? 'agent-turn';
8041
8095
  const role = typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.role;
8096
+ const phase = typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.phase;
8042
8097
  const billing = billingRouteForProvider(providerName, model);
8043
8098
  debug.log('llm.usage', 'llm-usage', {
8044
8099
  site,
8045
8100
  ...(role !== undefined ? { role } : {}),
8101
+ ...(phase !== undefined ? { phase } : {}),
8046
8102
  model,
8047
8103
  ...(usage.provider !== undefined && { provider: usage.provider }),
8048
8104
  // ⭐ `provider` 는 «선 어댑터»(openai/anthropic)다 — 과금 주체는 별칭 칸으로(BACKLOG B10).
@@ -8091,6 +8147,84 @@ export function attachFinalAnswerSupplement(
8091
8147
  return base + '\n\n' + supplement.trim();
8092
8148
  }
8093
8149
 
8150
+ export const GPT6_CODEX_GUARD_IDS = [
8151
+ 'anchor-grep',
8152
+ 'anchor-read',
8153
+ 'literal-glob',
8154
+ 'search-only-streak',
8155
+ 'post-read-broad-search',
8156
+ 'same-args-dedup',
8157
+ 'broad-spot-repeat',
8158
+ 'exploration-budget',
8159
+ 'inspect-budget',
8160
+ 'followup-hard-stop',
8161
+ 'max-turns',
8162
+ 'force-synthesis',
8163
+ ] as const;
8164
+ export type Gpt6CodexGuardId = typeof GPT6_CODEX_GUARD_IDS[number];
8165
+ export type Gpt6CodexGuardStats = Record<Gpt6CodexGuardId, { wouldBlock: number; blocked: number }>;
8166
+
8167
+ type Gpt6CodexGuardFlags = Record<Gpt6CodexGuardId, boolean>;
8168
+ const GPT6_CODEX_GUARD_DEFAULTS: Gpt6CodexGuardFlags = Object.fromEntries(
8169
+ GPT6_CODEX_GUARD_IDS.map((id) => [id, false]),
8170
+ ) as Gpt6CodexGuardFlags;
8171
+ let gpt6CodexGuardOverrides: Partial<Gpt6CodexGuardFlags> = {};
8172
+ const gpt6CodexGuardStats: Gpt6CodexGuardStats = Object.fromEntries(
8173
+ GPT6_CODEX_GUARD_IDS.map((id) => [id, { wouldBlock: 0, blocked: 0 }]),
8174
+ ) as Gpt6CodexGuardStats;
8175
+
8176
+ export function getGpt6CodexGuardFlags(): Gpt6CodexGuardFlags {
8177
+ return { ...GPT6_CODEX_GUARD_DEFAULTS, ...gpt6CodexGuardOverrides };
8178
+ }
8179
+
8180
+ export function getGpt6CodexGuardStats(): Gpt6CodexGuardStats {
8181
+ return Object.fromEntries(
8182
+ GPT6_CODEX_GUARD_IDS.map((id) => [id, { ...gpt6CodexGuardStats[id] }]),
8183
+ ) as Gpt6CodexGuardStats;
8184
+ }
8185
+
8186
+ export function resetGpt6CodexGuardObservations(): void {
8187
+ for (const id of GPT6_CODEX_GUARD_IDS) {
8188
+ gpt6CodexGuardStats[id].wouldBlock = 0;
8189
+ gpt6CodexGuardStats[id].blocked = 0;
8190
+ }
8191
+ }
8192
+
8193
+ /** @internal Test seam for the staged GPT-6 guard rollout. */
8194
+ export function _setGpt6CodexGuardFlagsForTest(flags: Partial<Gpt6CodexGuardFlags> | undefined): void {
8195
+ gpt6CodexGuardOverrides = flags ? { ...flags } : {};
8196
+ }
8197
+
8198
+ // Counter semantics (GPT-6 models only): `wouldBlock` = the guard predicate held;
8199
+ // `blocked` = the guard actually stopped/rejected. Grace burns and arming are NOT blocks.
8200
+ // `force-synthesis` is an intervention, not a rejection: blocked = the no-tools pass was
8201
+ // attempted; its met/unmet outcome is told apart only by events (`force-synthesis-pass.emitted`
8202
+ // vs `synthesis-ignored.hard-stop`).
8203
+ // ⚠️ Scope: the tally is module-level (process-global) — concurrent streams in one process
8204
+ // add into the same counters; there is no per-stream / per-run split.
8205
+ function gpt6CodexGuardEnabled(id: Gpt6CodexGuardId, model: string, legacyEnabled = false): boolean {
8206
+ // Rollout flags may add guards, but cannot disable behavior already active.
8207
+ return !isGpt6GenerationModel(model) || legacyEnabled || getGpt6CodexGuardFlags()[id];
8208
+ }
8209
+
8210
+ function noteGpt6CodexGuard(id: Gpt6CodexGuardId, model: string, blocked: boolean): void {
8211
+ if (!isGpt6GenerationModel(model)) return;
8212
+ gpt6CodexGuardStats[id].wouldBlock++;
8213
+ if (blocked) gpt6CodexGuardStats[id].blocked++;
8214
+ }
8215
+
8216
+ function applyCodexBehaviorGuard(
8217
+ id: Gpt6CodexGuardId,
8218
+ model: string,
8219
+ wouldBlock: boolean,
8220
+ legacyEnabled = false,
8221
+ ): boolean {
8222
+ if (!wouldBlock) return false;
8223
+ const enabled = gpt6CodexGuardEnabled(id, model, legacyEnabled);
8224
+ noteGpt6CodexGuard(id, model, enabled);
8225
+ return enabled;
8226
+ }
8227
+
8094
8228
  export async function streamLLMWithTools(
8095
8229
  messages: LLMMessage[],
8096
8230
  handlers: StreamWithToolsHandlers,
@@ -8106,14 +8240,14 @@ export async function streamLLMWithTools(
8106
8240
  let blockedProviders: ProviderFallbackAttempt[] = [];
8107
8241
  const effectiveModel = activeModel;
8108
8242
  const modelFamily = getModelFamily(effectiveModel);
8109
- // TUI-GPT6-GUARD-PARITY — codex «모델 행동» 가드 켬 여부(단일 원천 = models/prompts.ts
8110
- // usesCodexBehaviorGuards). gpt-6 세대도 true. 넓힌 자리·안 넓힌 자리는 그 함수 주석이 정본.
8243
+ // Preserve pre-existing GPT-6 behavior while observing Codex-only sites.
8111
8244
  const codexBehaviorGuards = usesCodexBehaviorGuards(effectiveModel);
8245
+ const codexGuardCandidate = codexBehaviorGuards || isGpt6GenerationModel(effectiveModel);
8112
8246
  debug.log('llm.router', 'streamLLMWithTools', {
8113
8247
  provider: provider.name,
8114
8248
  model: effectiveModel,
8115
8249
  modelFamily,
8116
- codexBehaviorGuards,
8250
+ codexBehaviorGuards: codexGuardCandidate,
8117
8251
  messageCount: messages.length,
8118
8252
  messageRoles: summarizeRoles(messages),
8119
8253
  tools: opts.tools?.map(t => t.name),
@@ -8501,6 +8635,8 @@ export async function streamLLMWithTools(
8501
8635
  }
8502
8636
  }
8503
8637
  let turnText = '';
8638
+ // TUI-TURN-NARRATION — 이 라운드에 받은 추론 요약 글자 수(내용은 남기지 않는다).
8639
+ let turnReasoningChars = 0;
8504
8640
  turnReasoningDetails = undefined;
8505
8641
  const pendingCalls: Array<{
8506
8642
  id: string;
@@ -8638,6 +8774,7 @@ export async function streamLLMWithTools(
8638
8774
  fullText = fullText.slice(0, fullText.length - turnText.length);
8639
8775
  turnText = '';
8640
8776
  }
8777
+ turnReasoningChars = 0;
8641
8778
  retryDisplay.arm();
8642
8779
  turnReasoningDetails = undefined;
8643
8780
  evCount = 0;
@@ -8666,8 +8803,11 @@ export async function streamLLMWithTools(
8666
8803
  } catch (err) {
8667
8804
  if (idleTimer) clearTimeout(idleTimer);
8668
8805
  if (err instanceof OverloadFailoverError && !opts.provider) {
8669
- const switched = providerByName('grok');
8670
- if (switched && !attemptedProviders.has(switched.name) && switched.available() && evCount === 0) {
8806
+ const switched = activeProvider.name === 'openai-codex'
8807
+ ? firstAvailableFallbackProvider(attemptedProviders, opts)
8808
+ : providerByName('grok');
8809
+ if (switched && !attemptedProviders.has(switched.name)
8810
+ && (activeProvider.name === 'openai-codex' || switched.available()) && evCount === 0) {
8671
8811
  debug.log('llm.router', 'overload-failover', {
8672
8812
  turn,
8673
8813
  blockedProvider: activeProvider.name,
@@ -8797,6 +8937,7 @@ export async function streamLLMWithTools(
8797
8937
  // OpenAI-compat `delta.reasoning_content` field — same
8798
8938
  // consumer-side semantics as summary_delta, no part index.
8799
8939
  // Callers that don't render reasoning skip silently.
8940
+ if (ev.kind !== 'summary_part_added') turnReasoningChars += ev.delta.length;
8800
8941
  if (ev.kind === 'summary_part_added') {
8801
8942
  handlers.onReasoning?.({
8802
8943
  kind: 'summary_part_added',
@@ -8830,7 +8971,7 @@ export async function streamLLMWithTools(
8830
8971
  // ⭐ 주 에이전트 턴의 토큰·비용을 «게이트 없이» 남긴다(2026-09-24 실측: 이 줄이 없어 3시간 `llm.usage`
8831
8972
  // 18행이 전부 곁가지 두 자리였고, 하니스 런 비용의 거의 전부가 관측 밖이었다). 곁가지와 같은 모양 ·
8832
8973
  // 모르는 모델은 금액 대신 `cost.kind='unknown'`. runId 는 debug.log 가 붙인다. 실패해도 턴은 계속.
8833
- logAgentTurnUsage(activeModel, ev.usage, { providerName: activeProvider.name, role: opts.usageRole });
8974
+ logAgentTurnUsage(activeModel, ev.usage, { providerName: activeProvider.name, role: opts.usageRole, phase: opts.usagePhase });
8834
8975
  // Wave A1 (2026-05-04) — turn-level cache hit rate forensic.
8835
8976
  // Each provider's usage event carries inputTokens / outputTokens
8836
8977
  // / cacheReadInputTokens (when cache hit). Emit the per-turn
@@ -8873,7 +9014,7 @@ export async function streamLLMWithTools(
8873
9014
 
8874
9015
  // hang 진단 — for-await(SSE 스트림) 정상 종료 확정. 이 로그가 없으면 codex SSE 스트림 hang.
8875
9016
  emitRetryDisplayStep(retryDisplay.settle(turnText));
8876
- debug.log('llm.stream', 'consume-end', { turn, evCount, lastEvType, textChars: turnText.length, pendingCalls: pendingCalls.length });
9017
+ debug.log('llm.stream', 'consume-end', { turn, evCount, lastEvType, textChars: turnText.length, reasoningChars: turnReasoningChars, pendingCalls: pendingCalls.length });
8877
9018
  const turnInfo = {
8878
9019
  turn,
8879
9020
  durationMs: Date.now() - turnStartedAt,
@@ -9045,19 +9186,27 @@ export async function streamLLMWithTools(
9045
9186
  // the notice in a tool_result but keeps making tool calls until
9046
9187
  // maxTurns hard-stops it, producing 0 chars of output. Hard
9047
9188
  // rejection forces the synthesis that soft pressure couldn't.
9048
- const inSynthesisPhase =
9189
+ const inSynthesisPhase = applyCodexBehaviorGuard(
9190
+ 'max-turns',
9191
+ effectiveModel,
9049
9192
  !terminalOnlyTurn
9050
- && maxTurns >= BUDGET_WARNING_MIN_TURNS
9051
- && turn >= maxTurns - FINAL_SYNTHESIS_TURNS;
9052
- const codexInspectionStillProgressing =
9053
- modelFamily === 'codex'
9193
+ && maxTurns >= BUDGET_WARNING_MIN_TURNS
9194
+ && turn >= maxTurns - FINAL_SYNTHESIS_TURNS,
9195
+ true,
9196
+ );
9197
+ const codexInspectionStillProgressing = codexGuardCandidate
9198
+ && (modelFamily === 'codex' || getGpt6CodexGuardFlags()['inspect-budget'])
9054
9199
  && autoNarrowedReadCount > 0
9055
9200
  && autoNarrowedReadCount < inspectBudgetThreshold;
9056
- const inExplorationSynthesisPhase =
9201
+ const inExplorationSynthesisPhase = applyCodexBehaviorGuard(
9202
+ 'exploration-budget',
9203
+ effectiveModel,
9057
9204
  !terminalOnlyTurn
9058
- && exploratoryTurnStreak >= explorationThresholdForTurn
9059
- && isExploratoryTurn(pendingCalls)
9060
- && !codexInspectionStillProgressing;
9205
+ && exploratoryTurnStreak >= explorationThresholdForTurn
9206
+ && isExploratoryTurn(pendingCalls)
9207
+ && !codexInspectionStillProgressing,
9208
+ true,
9209
+ );
9061
9210
  const inInspectSynthesisPhase =
9062
9211
  !terminalOnlyTurn
9063
9212
  && inspectSynthesisArmed
@@ -9190,8 +9339,19 @@ export async function streamLLMWithTools(
9190
9339
  // as in the original PR #768 design. Forensic events at both the
9191
9340
  // grace-burn and the hard-stop branches so log/latest can audit
9192
9341
  // exactly which path each turn took.
9193
- const codexImmediateInspectStop = inInspectSynthesisPhase && modelFamily === 'codex';
9194
- const codexImmediateRepairStop = inRepairActionPhase && modelFamily === 'codex';
9342
+ // followup-hard-stop counting happens once per turn below the grace branches:
9343
+ // wouldBlock when any predicate held, blocked only when a grace=0 immediate stop fired.
9344
+ const followupHardStopEnabled = codexGuardCandidate
9345
+ && gpt6CodexGuardEnabled('followup-hard-stop', effectiveModel);
9346
+ const followupInspectActionHeld =
9347
+ inInspectActionPhase
9348
+ && !verifyActionArmed
9349
+ && editedFilePaths.length === 0
9350
+ && !executionLoopState.lastCommand;
9351
+ const followupHardStopHeld = codexGuardCandidate
9352
+ && (inInspectSynthesisPhase || inRepairActionPhase || followupInspectActionHeld);
9353
+ const codexImmediateInspectStop = inInspectSynthesisPhase && followupHardStopEnabled;
9354
+ const codexImmediateRepairStop = inRepairActionPhase && followupHardStopEnabled;
9195
9355
  // codexImmediateInspectActionStop predicate (PR #768 original):
9196
9356
  // restricted to pure-exploration state (no edits applied AND no
9197
9357
  // execution attempted). When edits/execution already happened the
@@ -9199,12 +9359,13 @@ export async function streamLLMWithTools(
9199
9359
  // logic (`buildFinalizationPolicySnapshot` → `[FINAL ANSWER
9200
9360
  // REQUIRED]`) can run — that branch produces a tailored "verify
9201
9361
  // done, just write the answer" UX which we must not preempt.
9202
- const codexImmediateInspectActionStop =
9203
- inInspectActionPhase
9204
- && modelFamily === 'codex'
9205
- && !verifyActionArmed
9206
- && editedFilePaths.length === 0
9207
- && !executionLoopState.lastCommand;
9362
+ const codexImmediateInspectActionStop = followupInspectActionHeld && followupHardStopEnabled;
9363
+ if (followupHardStopHeld) {
9364
+ noteGpt6CodexGuard('followup-hard-stop', effectiveModel,
9365
+ (codexImmediateInspectStop && codexInspectSynthesisGrace <= 0)
9366
+ || (codexImmediateRepairStop && codexRepairActionGrace <= 0)
9367
+ || (codexImmediateInspectActionStop && codexInspectActionGrace <= 0));
9368
+ }
9208
9369
  if (codexImmediateInspectStop && codexInspectSynthesisGrace <= 0) {
9209
9370
  debug.log('llm.router', 'tool-loop.inspect-synthesis-phase.codex-immediate-stop', {
9210
9371
  turn,
@@ -9328,7 +9489,11 @@ export async function streamLLMWithTools(
9328
9489
  inspectRejectionCount++;
9329
9490
  explorationRejectionCount = 0;
9330
9491
  synthesisRejectionCount = 0;
9331
- if (modelFamily === 'codex' || inspectRejectionCount >= 2) {
9492
+ // Already tallied above (followupHardStopHeld) — no second count for the same turn.
9493
+ // When followupHardStopEnabled is true this branch is unreachable for this phase
9494
+ // (codexImmediateInspectStop takes the turn), so a stop here is the generic
9495
+ // second-rejection path, not the GPT-6 guard — it is intentionally not `blocked`.
9496
+ if (followupHardStopEnabled || inspectRejectionCount >= 2) {
9332
9497
  hardStopText = buildIgnoredSynthesisNotice('inspect');
9333
9498
  }
9334
9499
  } else if (inInspectActionPhase) {
@@ -9943,7 +10108,7 @@ export async function streamLLMWithTools(
9943
10108
  debug.log('llm.router', 'tool-loop.dedup-blocked', { turn, tool: call.name, signature: signatureOf(call), priorCount: repeatedError.count, threshold: DEDUP_THRESHOLD, reason: 'repeated-error' });
9944
10109
  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 };
9945
10110
  }
9946
- if (codexBehaviorGuards && EXPLORATORY_TOOLS.has(call.name)) {
10111
+ if (codexGuardCandidate && EXPLORATORY_TOOLS.has(call.name)) {
9947
10112
  // W4-anchor — Anchor file Grep blocking. AGENTS.md / CLAUDE.md
9948
10113
  // are already in the system prompt; greppling them is pure
9949
10114
  // token waste and trains codex to ignore the in-prompt copy.
@@ -9951,7 +10116,7 @@ export async function streamLLMWithTools(
9951
10116
  // every attempt gets the redirect. No threshold — anchor
9952
10117
  // grep is structurally redundant.
9953
10118
  const anchor = isAnchorGrep(call);
9954
- if (anchor !== null) {
10119
+ if (anchor !== null && applyCodexBehaviorGuard('anchor-grep', effectiveModel, true, true)) {
9955
10120
  if (debug.enabled) {
9956
10121
  debug.log('llm.router', 'tool-loop.anchor-grep-blocked', {
9957
10122
  turn,
@@ -10000,6 +10165,7 @@ export async function streamLLMWithTools(
10000
10165
  && autoNarrowedReadCount === 0
10001
10166
  && searchOnlyTurnStreak >= 3
10002
10167
  && SEARCH_ONLY_TOOLS.has(call.name)
10168
+ && applyCodexBehaviorGuard('search-only-streak', effectiveModel, true, true)
10003
10169
  ) {
10004
10170
  if (debug.enabled) {
10005
10171
  debug.log('llm.router', 'tool-loop.search-only-streak-blocked', {
@@ -10045,7 +10211,7 @@ export async function streamLLMWithTools(
10045
10211
  }
10046
10212
  return false;
10047
10213
  })();
10048
- if (isBroadPostRead) {
10214
+ if (isBroadPostRead && applyCodexBehaviorGuard('post-read-broad-search', effectiveModel, true, true)) {
10049
10215
  if (debug.enabled) {
10050
10216
  debug.log('llm.router', 'tool-loop.post-read-broad-blocked', {
10051
10217
  turn,
@@ -10080,7 +10246,7 @@ export async function streamLLMWithTools(
10080
10246
  // decided per-call by `anchorStubContext`, which inspects the
10081
10247
  // fences in `messages`. Companion to W4-anchor (Grep).
10082
10248
  const anchorRead = isAnchorRead(call);
10083
- if (anchorRead !== null) {
10249
+ if (anchorRead !== null && applyCodexBehaviorGuard('anchor-read', effectiveModel, true, true)) {
10084
10250
  if (debug.enabled) {
10085
10251
  debug.log('llm.router', 'tool-loop.anchor-read-blocked', {
10086
10252
  turn,
@@ -10108,7 +10274,7 @@ export async function streamLLMWithTools(
10108
10274
  // path is the next step. Block FIRST so the model is steered
10109
10275
  // to Read directly instead of Glob → Read pair.
10110
10276
  const literalPath = literalGlobPath(call);
10111
- if (literalPath !== null) {
10277
+ if (literalPath !== null && applyCodexBehaviorGuard('literal-glob', effectiveModel, true, true)) {
10112
10278
  if (debug.enabled) {
10113
10279
  debug.log('llm.router', 'tool-loop.literal-glob-blocked', {
10114
10280
  turn,
@@ -10137,7 +10303,8 @@ export async function streamLLMWithTools(
10137
10303
  const sig = signatureOf(call);
10138
10304
  const priorCount = seenToolCallSignatures.get(sig) ?? 0;
10139
10305
  seenToolCallSignatures.set(sig, priorCount + 1);
10140
- if (priorCount + 1 >= DEDUP_THRESHOLD) {
10306
+ if (priorCount + 1 >= DEDUP_THRESHOLD
10307
+ && applyCodexBehaviorGuard('same-args-dedup', effectiveModel, true, true)) {
10141
10308
  const stub = buildDedupStub(call, priorCount);
10142
10309
  if (debug.enabled) {
10143
10310
  debug.log('llm.router', 'tool-loop.dedup-blocked', {
@@ -10157,7 +10324,8 @@ export async function streamLLMWithTools(
10157
10324
  if (spotInfo !== null) {
10158
10325
  const priorSpot = seenBroadSpots.get(spotInfo.key) ?? 0;
10159
10326
  seenBroadSpots.set(spotInfo.key, priorSpot + 1);
10160
- if (priorSpot + 1 >= spotInfo.threshold) {
10327
+ if (priorSpot + 1 >= spotInfo.threshold
10328
+ && applyCodexBehaviorGuard('broad-spot-repeat', effectiveModel, true, true)) {
10161
10329
  if (debug.enabled) {
10162
10330
  debug.log('llm.router', 'tool-loop.broad-spot-blocked', {
10163
10331
  turn,
@@ -10282,7 +10450,7 @@ export async function streamLLMWithTools(
10282
10450
  // W4-A — Track Read dispatches (only successful ones; error
10283
10451
  // results don't count as "the file is in your context"). The
10284
10452
  // post-Read broad-search guard above reads this counter.
10285
- if (call.name === 'Read' && !isError && codexBehaviorGuards) {
10453
+ if (call.name === 'Read' && !isError && codexGuardCandidate) {
10286
10454
  dispatchedReadCount++;
10287
10455
  }
10288
10456
  return { result, isError, phaseRejected: false };
@@ -10634,28 +10802,31 @@ export async function streamLLMWithTools(
10634
10802
  && looksLikeStructuralAnalysis(history)
10635
10803
  && autoNarrowedInspections.length >= 2
10636
10804
  && narrowingBlockedCount >= 1;
10637
- if (modelFamily === 'codex' && autoNarrowedReadCount >= inspectBudgetThreshold) {
10805
+ if (codexGuardCandidate
10806
+ && (modelFamily === 'codex' || getGpt6CodexGuardFlags()['inspect-budget'])
10807
+ && autoNarrowedReadCount >= inspectBudgetThreshold) {
10638
10808
  inspectSynthesisArmed = true;
10639
10809
  }
10810
+ const inspectBudgetExecutionHeld = codexGuardCandidate
10811
+ && autoNarrowedThisTurn > 0
10812
+ && autoNarrowedInspections.length > 0
10813
+ && autoNarrowedReadCount >= inspectBudgetThreshold
10814
+ && inspectFollowupMode === 'execution';
10815
+ // Arming is a would-block signal only: it rejects nothing this turn, so blocked stays 0.
10816
+ if (inspectBudgetExecutionHeld) noteGpt6CodexGuard('inspect-budget', effectiveModel, false);
10640
10817
  if (structuralInspectFallbackReady) {
10641
10818
  hardStopText = buildInspectFallbackSummary(autoNarrowedInspections);
10642
10819
  hardStopReason = 'structural-inspect-fallback-ready';
10643
10820
  } else if (
10644
- modelFamily === 'codex'
10645
- && autoNarrowedThisTurn > 0
10821
+ autoNarrowedThisTurn > 0
10646
10822
  && autoNarrowedInspections.length > 0
10647
10823
  && autoNarrowedReadCount >= inspectBudgetThreshold
10648
10824
  && inspectFollowupMode === 'synthesis'
10825
+ && applyCodexBehaviorGuard('inspect-budget', effectiveModel, codexGuardCandidate)
10649
10826
  ) {
10650
10827
  hardStopText = buildInspectFallbackSummary(autoNarrowedInspections);
10651
10828
  hardStopReason = 'codex-inspect-budget-synthesis';
10652
- } else if (
10653
- modelFamily === 'codex'
10654
- && autoNarrowedThisTurn > 0
10655
- && autoNarrowedInspections.length > 0
10656
- && autoNarrowedReadCount >= inspectBudgetThreshold
10657
- && inspectFollowupMode === 'execution'
10658
- ) {
10829
+ } else if (inspectBudgetExecutionHeld && gpt6CodexGuardEnabled('inspect-budget', effectiveModel)) {
10659
10830
  inspectSynthesisArmed = true;
10660
10831
  debug.log('llm.router', 'tool-loop.inspect-synthesis-armed', {
10661
10832
  turn,
@@ -10862,12 +11033,12 @@ export async function streamLLMWithTools(
10862
11033
  // forceSynthesisOutcome="skipped" (was: non-codex-family). Same
10863
11034
  // fix shape (no-tools synthesis with prior tool_results as
10864
11035
  // context) lifts the empty reply to substantive answer.
10865
- const isForceSynthesisFamily =
10866
- codexBehaviorGuards || modelFamily === 'gemini';
11036
+ const isForceSynthesisFamily = codexGuardCandidate || modelFamily === 'gemini';
10867
11037
  const shouldForceSynthesis =
10868
- isForceSynthesisFamily
10869
- && !isUserInterventionRequired
10870
- && !forceSynthesisAttempted;
11038
+ !isUserInterventionRequired
11039
+ && !forceSynthesisAttempted
11040
+ && (modelFamily === 'gemini'
11041
+ || applyCodexBehaviorGuard('force-synthesis', effectiveModel, codexGuardCandidate, true));
10871
11042
  let synthesizedText: string | null = null;
10872
11043
  if (shouldForceSynthesis) {
10873
11044
  forceSynthesisAttempted = true;
@@ -10946,9 +11117,10 @@ export async function streamLLMWithTools(
10946
11117
  // synthesis attempt. Extended to gemini 2026-05-04 alongside
10947
11118
  // W5-E/W5-F for the same pathology shape.
10948
11119
  if (
10949
- (modelFamily === 'codex' || modelFamily === 'gemini')
10950
- && !forceSynthesisAttempted
11120
+ !forceSynthesisAttempted
10951
11121
  && noContentReadTurnStreak >= 4
11122
+ && (modelFamily === 'gemini'
11123
+ || applyCodexBehaviorGuard('force-synthesis', effectiveModel, codexGuardCandidate, true))
10952
11124
  ) {
10953
11125
  forceSynthesisAttempted = true;
10954
11126
  const earlyText = await tryForceSynthesisPass({
@@ -11031,8 +11203,9 @@ export async function streamLLMWithTools(
11031
11203
  let synthesizedText: string | null = null;
11032
11204
  const shouldForceSynthesisOnBudget =
11033
11205
  loopTermination === 'budget-exhausted'
11034
- && (codexBehaviorGuards || modelFamily === 'gemini')
11035
- && !forceSynthesisAttempted;
11206
+ && !forceSynthesisAttempted
11207
+ && (modelFamily === 'gemini'
11208
+ || applyCodexBehaviorGuard('force-synthesis', effectiveModel, codexGuardCandidate, true));
11036
11209
  if (shouldForceSynthesisOnBudget) {
11037
11210
  forceSynthesisAttempted = true;
11038
11211
  synthesizedText = await tryForceSynthesisPass({
@@ -11327,6 +11500,27 @@ function makeOpenRouterProvider(cfg: UCLLMConfig): LLMProvider {
11327
11500
  return inner;
11328
11501
  }
11329
11502
 
11503
+ /** The OpenGateway wire is standard OpenAI Chat Completions with a distinct URL and credential. */
11504
+ function makeOpenGatewayProvider(cfg: UCLLMConfig): LLMProvider {
11505
+ const selectedModel = cfg.model || OPENGATEWAY_MODEL;
11506
+ if (!isVerifiedOpenGatewayModel(selectedModel)) throw new Error(`opengateway model not verified: ${selectedModel}`);
11507
+ const portableKey = getOpenGatewayApiKey();
11508
+ if (cfg.apiKey?.trim() && portableKey && cfg.apiKey.trim() !== portableKey)
11509
+ throw new Error('opengateway config apiKey conflicts with env/cache key');
11510
+ const inner = makeOpenAICompatProvider('opengateway', selectedModel, OPENGATEWAY_API_URL,
11511
+ { ...cfg, reasoningLevel: undefined, apiKey: cfg.apiKey?.trim() || portableKey },
11512
+ { model: (model) => model.startsWith('opengateway/') ? model.slice('opengateway/'.length) : model,
11513
+ omitDefaultTemperature: true, omitMaxTokens: true,
11514
+ extraBody: { stream_options: { include_usage: true } } });
11515
+ return { ...inner, async *streamChat(messages, opts = {}) {
11516
+ if (opts.model && !isVerifiedOpenGatewayModel(opts.model)) throw new Error(`opengateway model not verified: ${opts.model}`);
11517
+ yield* inner.streamChat!(messages, { ...opts, reasoningEffort: undefined });
11518
+ }, async *chat(messages, opts = {}) {
11519
+ if (opts.model && !isVerifiedOpenGatewayModel(opts.model)) throw new Error(`opengateway model not verified: ${opts.model}`);
11520
+ yield* inner.chat!(messages, { ...opts, reasoningEffort: undefined });
11521
+ } };
11522
+ }
11523
+
11330
11524
  /** OR-TOOLARGS-REPAIR — 깨진 도구 인자 호출에 돌려주는 오류 문면(도구는 실행되지 않았다). */
11331
11525
  export function buildInvalidToolArgsMessage(info: ToolArgsInvalid): string {
11332
11526
  const truncated = info.finishReason === 'length';
@@ -11489,6 +11683,10 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
11489
11683
  const { instructions, input } = messagesToResponsesInput(messages, {
11490
11684
  acceptToolImages: codexAcceptToolImages,
11491
11685
  acceptUserMessageImages: codexAcceptUserImages,
11686
+ onOrphanToolResult: (callId) => {
11687
+ try { debug.log('llm.codex', 'orphan-tool-output-dropped', { callId }); }
11688
+ catch { /* observation must not block the request */ }
11689
+ },
11492
11690
  });
11493
11691
  const tools = toCodexResponsesTools(opts.tools, opts.serverTools);
11494
11692
  // Codex backend rejects max_output_tokens + temperature — omit.
@@ -11787,7 +11985,7 @@ export function anyProviderAvailable(userConfig?: UserConfig): boolean {
11787
11985
  } catch { return false; }
11788
11986
  }
11789
11987
  } catch { /* fall through to env check */ }
11790
- return Object.values(PROVIDERS).some(p => p.name !== 'bedrock' && p.available()); // bedrock 은 auto 후보가 아니다
11988
+ return Object.values(PROVIDERS).some(p => p.name !== 'bedrock' && p.name !== 'opengateway' && p.available()); // 명시 전용 공급자는 auto 가용성 아님
11791
11989
  }
11792
11990
 
11793
11991
  /** 직결 배선이 없는 계열 → OpenRouter 에서 그 벤더의 대표 모델(사다리 `openrouter` 에 선 것). */
@@ -11844,6 +12042,9 @@ export function getProviderForConfig(
11844
12042
  // Preserve the requesting config for OpenRouter, not the config-free singleton.
11845
12043
  return makeOpenRouterProvider({ provider: 'openrouter', model: decision.model, reasoningLevel: userConfig.llm.reasoningLevel });
11846
12044
  }
12045
+ if (resolvedProviderName === 'opengateway') {
12046
+ return makeOpenGatewayProvider({ provider: 'opengateway', model: decision.model, reasoningLevel: userConfig.llm.reasoningLevel });
12047
+ }
11847
12048
  return PROVIDERS[resolvedProviderName]!;
11848
12049
  }
11849
12050
  if (!isKnownProviderName(resolvedProviderName)) {
@@ -11884,6 +12085,8 @@ export function getProviderForConfig(
11884
12085
  return makeCodexProvider(llm);
11885
12086
  case 'openrouter':
11886
12087
  return makeOpenRouterProvider(userConfig.llm.provider === 'openrouter' ? llm : { provider: 'openrouter', model: decision.model, reasoningLevel: llm.reasoningLevel });
12088
+ case 'opengateway':
12089
+ return makeOpenGatewayProvider(userConfig.llm.provider === 'opengateway' ? llm : { provider: 'opengateway', model: decision.model, reasoningLevel: llm.reasoningLevel });
11887
12090
  case 'anthropic':
11888
12091
  return makeAnthropicProvider(llm);
11889
12092
  case 'bedrock': return makeBedrockProvider(llm);
@@ -11912,7 +12115,7 @@ export function getProviderForConfig(
11912
12115
  // union without a case here fails loud at first call.
11913
12116
  throw new Error(`unknown provider: ${provider as string}`);
11914
12117
  }
11915
- import { getModelFamily, usesCodexBehaviorGuards } from './models/prompts.js';
12118
+ import { getModelFamily, isGpt6GenerationModel, usesCodexBehaviorGuards } from './models/prompts.js';
11916
12119
  import type { ModelFamily } from './models/prompts.js';
11917
12120
 
11918
12121
  // COMPAT(llm-facade-openai-sampling-fields) · 기존 llm.ts 공개 API 유지.