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.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{IVKr3AlRUVLKsw2fh7eXF → T1mBQqmkwKDLGtyisDCOd}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{997ce8a5-2ad501927003b41b.js → 0368f25d-ad84af92fefee68f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1165.bad13fc9151a7288.js +1 -0
- package/apps/pwa/out/_next/static/chunks/13.02a07436dec15f89.js +32 -0
- package/apps/pwa/out/_next/static/chunks/{5525.86debf231e181813.js → 1530.0e612369b6fd7ea0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +41 -0
- package/apps/pwa/out/_next/static/chunks/{7391.ebae168025c91b6a.js → 1674.2a65fd5668e1cc5f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +24 -0
- package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +74 -0
- package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7947-d0759430f8042240.js → 1993-c0007b7ad0c0ef41.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{60fb96c9.360b01d8d4927b7b.js → 1c735de4.f993a30bbd3c57c4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1dc5a567.9b092bfae3d7099b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5307.60f2209e809bd627.js → 2018.a741297bce759490.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +148 -0
- package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3902.e1e71aaac850a045.js → 2625.5d870aa999f33db1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +77 -0
- package/apps/pwa/out/_next/static/chunks/2833-0fe47af99ed13c29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +62 -0
- package/apps/pwa/out/_next/static/chunks/3103.0df8da390948bb84.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +90 -0
- package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4174.92ed04922709ac9e.js → 3408.21d1570602f4b6c0.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3589.5444a06bcf6e775c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/359-2250789a2d3499e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +36 -0
- package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9398-6aed28f0a96d0d6f.js → 3677-4215f826f6aa68e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +79 -0
- package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3f7c4ee5.3dde54f01a816613.js +122 -0
- package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7371.80c05c653b08e907.js → 4346.8601952e73bf5803.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4441-875b97f5821ed58a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +286 -0
- package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{2940-619bfd8ef337c611.js → 4705-194e64e47ca0fbdb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1335-6731f392c35216eb.js → 4718-17d2af636796a330.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7502.ccd5b8065545edd0.js → 5101.e32282718f99ed6f.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{2001.6c7e0fd02190886c.js → 5154.a118f3957ed14e36.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +23 -0
- package/apps/pwa/out/_next/static/chunks/{5173-233188df2f42c626.js → 5483-dd5d7697f6bdb106.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5637.281e5dec4ea6ecf1.js +94 -0
- package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3267c0e6.d34854e7b3984a6e.js → 56d372f2.681ab4ec4c998fae.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5852.db1f7449f4f74612.js +287 -0
- package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +1 -0
- package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6433.fc573af22bbc9ab7.js → 6236.e18cced2d5ba6afb.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +8 -0
- package/apps/pwa/out/_next/static/chunks/630.fe5a46428d63b013.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +27 -0
- package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +93 -0
- package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6866-79aa5b4e47cac6aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6544cb48.a87fe20ddf137be2.js → 6b89c8bd.24df687a820500b3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +149 -0
- package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{2871.0bca6137343b3f76.js → 7385.50a308a477bdfc21.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2985.39ccdecd36848b12.js → 7644.17e37ba6f1d4226e.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8018.a32663f04a6fc5f9.js → 8219.baa715d1deee80e2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4111.2bfedbb233ad206b.js → 8256.e3ac8421a71f82f4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8437-8d5492094b166cfa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2213.2ccbada92c33ea0f.js → 8444.4c26b379ca2b9596.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +226 -0
- package/apps/pwa/out/_next/static/chunks/8557-e7898769499cd56f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +64 -0
- package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6092.a7f99e68b188ca66.js → 8637.47f5b35afcae5e6b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8714.ff0b7ce3ec3e3ae2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3278.2e5d15b53a4091c8.js → 9214.63a510d39178e997.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +115 -0
- package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9221.7d22eaf353a2d4e7.js → 938.66ad1ef0e5abae1c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6157.0c9af021de4fb31b.js → 9512.5a76207a730e0491.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{69-0a2c8209c6d4a158.js → 967-2aa39b2d04b4c690.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7862.30a8d6482bb238eb.js → 9952.5daf5f94063a2b3e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/{page-a27b1e5a0d1b308f.js → page-406b47745b53f269.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-26e6c18a1a750cf6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-32866485913d6a04.js → page-47c5d4db587266bd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1f5a60f70cb4dd0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-bac7dee94e5eae4a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-04d00ae9b0890349.js → page-dc0a532f5b9196ec.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7a1887c4.f36b88fba31da8fd.js → b2f6ba4d.fb56fdbbf798df33.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/b6705a4f-b9a9047de9eecfd0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b313b242.cb1265eea908db61.js → cbe38a15.5a032598e39970c6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{409f1e57.d0649fc47691ebfe.js → d06f9160.a3d9062f95de8ad7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{0bb0ff36.b8d418980951e5ba.js → da5176c6.6773b6c5994e1d99.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/bin/elanous.mjs +10 -2
- package/catalog/providers/opengateway.yaml +25 -0
- package/docs/goal-context/01-goal-authoring-checks.md +8 -0
- package/docs/goal-context/03-verification-menu.md +24 -0
- package/docs/goal-context/04-mock-scenarios.md +100 -0
- package/docs/goal-context/README.md +5 -0
- package/graphs/catalog/catalog.yaml +1 -1
- package/graphs/default-loop.yaml +76 -5
- package/graphs/document-loop.yaml +71 -4
- package/graphs/implement-loop.yaml +59 -4
- package/graphs/journey/SCENARIOS.md +33 -0
- package/graphs/journey/recipes.yaml +1 -0
- package/graphs/journey/ta-journey.yaml +94 -0
- package/graphs/journey/units/author/author.yaml +20 -0
- package/graphs/journey/units/author/recipes.yaml +2 -0
- package/graphs/journey/units/author-dialogue/author-dialogue.yaml +42 -0
- package/graphs/journey/units/author-dialogue/observe.ts +96 -0
- package/graphs/journey/units/author-dialogue/recipes.yaml +10 -0
- package/graphs/journey/units/green/green.yaml +20 -0
- package/graphs/journey/units/green/recipes.yaml +2 -0
- package/graphs/journey/units/pr/pr.yaml +20 -0
- package/graphs/journey/units/pr/recipes.yaml +2 -0
- package/graphs/journey/units/remember/recipes.yaml +2 -0
- package/graphs/journey/units/remember/remember.yaml +20 -0
- package/graphs/operate-loop.yaml +71 -4
- package/graphs/overlays/stop-heal-ladder.yaml +1 -1
- package/graphs/release-rehearsal/recipes.yaml +1 -1
- package/graphs/release-rehearsal/release-rehearsal.yaml +2 -2
- package/graphs/research-loop.yaml +159 -4
- package/graphs/test-diet/test-diet.yaml +3 -0
- package/graphs/units/dispatch-pod/dispatch-pod.yaml +50 -0
- package/graphs/units/dispatch-pod/recipes.yaml +14 -0
- package/graphs/units/entry/entry.yaml +50 -0
- package/graphs/units/entry/recipes.yaml +14 -0
- package/graphs/units/harvest/harvest.yaml +25 -0
- package/graphs/units/harvest/recipes.yaml +4 -0
- package/graphs/units/land/land.yaml +45 -0
- package/graphs/units/land/recipes.yaml +3 -0
- package/graphs/units/recipes.yaml +7 -0
- package/graphs/units/recover.yaml +39 -0
- package/graphs/units/reflect/recipes.yaml +3 -0
- package/graphs/units/reflect/reflect.yaml +15 -0
- package/graphs/units/task-agent-recover-review.yaml +17 -0
- package/graphs/units/task-agent-recover-wait.yaml +17 -0
- package/graphs/units/verbs/make-doc.yaml +34 -0
- package/graphs/units/verbs/recipes.yaml +33 -0
- package/graphs/units/verbs/verify.yaml +55 -0
- package/graphs/work/recipes.yaml +2 -0
- package/graphs/work/research-report.yaml +28 -0
- package/package.json +1 -1
- package/scripts/ci-typecheck-changed.ts +69 -16
- package/scripts/coord-role-pack.ts +19 -6
- package/scripts/docs/generate-graph-anatomy.ts +19 -2
- package/scripts/graph-harvest-unit.ts +22 -0
- package/scripts/graph-units/journey-stub.ts +6 -0
- package/scripts/graph-units/land-enqueue.ts +78 -0
- package/scripts/graph-units/recover-plan.ts +15 -0
- package/scripts/graph-units/reflect-node.ts +88 -0
- package/scripts/graph-units/ta-journey-observe.ts +109 -0
- package/scripts/graph-units/verbs/headless-goal-loop.ts +152 -0
- package/scripts/graph-units/verbs/verify-stage.ts +75 -0
- package/scripts/graph-units/verbs-envelope.ts +139 -0
- package/scripts/hq/standby-snapshot.ts +30 -0
- package/scripts/public-export.ts +43 -1
- package/scripts/ratchets/train-side-invariants.sh +45 -0
- package/scripts/release-loop/auto-approve-node.ts +30 -16
- package/scripts/release-loop/docs-land-node.ts +21 -5
- package/scripts/release-loop/gate-baseline-receipt.ts +155 -0
- package/scripts/release-loop/gate-closure.ts +5 -1
- package/scripts/release-loop/gate-diff.ts +1 -1
- package/scripts/release-loop/gate-node.ts +675 -49
- package/scripts/release-loop/gate-partial.ts +68 -14
- package/scripts/release-loop/gate-radius-live.ts +177 -0
- package/scripts/release-loop/gate-radius-shadow.ts +138 -0
- package/scripts/release-loop/gate-traffic-mode.ts +128 -0
- package/scripts/release-loop/gate-triage-node.ts +5 -2
- package/scripts/release-loop/known-issues-0.2.33-approved.json +194 -0
- package/scripts/release-loop/known-issues-node.ts +77 -8
- package/scripts/release-loop/node-verdict.ts +12 -1
- package/scripts/release-loop/npm-publish-node.ts +66 -12
- package/scripts/release-loop/preflight.ts +93 -7
- package/scripts/release-loop/probe-pod-host-dirs-live.ts +5 -0
- package/scripts/release-loop/publish-node.ts +60 -9
- package/scripts/release-loop/pwa-remote.ts +166 -0
- package/scripts/release-loop/pwa-scenarios-node.ts +19 -3
- package/scripts/release-loop/resume-cap.ts +56 -0
- package/scripts/release-loop/resume-release.ts +155 -19
- package/scripts/release-loop/resume.ts +24 -1
- package/scripts/release-loop/tui-sim-node.ts +8 -2
- package/scripts/release-loop/unattended-release.ts +10 -2
- package/scripts/test-diet/lib.ts +6 -1
- package/scripts/test-diet/node.ts +194 -13
- package/scripts/ux-sim.ts +39 -0
- package/src/acp/core-turn-bridge.ts +20 -5
- package/src/acp/reasoning-thought-buffer.ts +45 -0
- package/src/agent/self-ambient-cache.ts +8 -0
- package/src/agent-substrate/acp-reviewer.ts +90 -15
- package/src/agent-substrate/pr-reviewer.ts +17 -0
- package/src/agent-substrate/review-finding-key.ts +53 -0
- package/src/agent-substrate/self-review-cli.ts +188 -18
- package/src/ask-user-question/pending-questions.ts +1 -1
- package/src/autopilot/pr-manager.ts +393 -65
- package/src/budget/run-usage-rollup.ts +1 -0
- package/src/chat/index.ts +0 -2
- package/src/chat/pickers/modal-runtime.ts +10 -27
- package/src/chat/tool-render/dispatch.ts +62 -10
- package/src/cli/agent-cli.ts +13 -2
- package/src/cli/control-cli.ts +24 -7
- package/src/cli/doctor-cli.ts +4 -1
- package/src/cli/guardian-cli.ts +10 -0
- package/src/cli/light-entry-route.ts +75 -0
- package/src/cli/llm-detect-cli.ts +23 -1
- package/src/cli/pod-cli.ts +77 -3
- package/src/cli/pr-cli.ts +81 -14
- package/src/cli/pr-land-base-read.ts +2 -0
- package/src/cli/pr-land-overlap-evidence.ts +154 -16
- package/src/cli/pr-land-pod-shadow-job.ts +3 -0
- package/src/cli/pr-land-recovery.ts +64 -0
- package/src/cli/pty-takeover-cli.ts +6 -5
- package/src/cli/release-checklist-read-cli.ts +79 -0
- package/src/cli/release-cli.ts +189 -132
- package/src/cli/release-run-if-ready.ts +29 -28
- package/src/cli/release-single-flight.ts +178 -0
- package/src/cli/remote-resolve.ts +1 -1
- package/src/cli/root-tui-entry.ts +48 -0
- package/src/cli/seat-cli.ts +37 -0
- package/src/cli/setup-cli.ts +40 -1
- package/src/cli/sim-cli.ts +22 -0
- package/src/cli/tasks-cli.ts +667 -14
- package/src/cli/usage-cli.ts +13 -11
- package/src/clipboard/history.ts +179 -13
- package/src/config.ts +8 -1
- package/src/control/control-status.ts +8 -3
- package/src/control-plane/ledger.ts +5 -3
- package/src/control-plane/server.ts +5 -3
- package/src/core-turn/short-question.ts +5 -1
- package/src/dashboard/chat/acp-chat.ts +8 -0
- package/src/dashboard/index.ts +114 -77
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +3 -0
- package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
- package/src/dashboard/input/seat-autowake.ts +56 -3
- package/src/dashboard/render/theme-resolver.ts +33 -4
- package/src/dashboard/seat-boot-preamble.ts +1 -1
- package/src/dashboard/slash-runtime/ask-clarification.ts +48 -0
- package/src/dashboard/slash-runtime/dashboard-delegated-slashes.ts +68 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +62 -322
- package/src/dashboard/slash-runtime/dashboard-log-slash.ts +208 -0
- package/src/dashboard/turn-preamble.ts +47 -1
- package/src/dashboard/turn-stream-formatter.ts +34 -1
- package/src/dashboard/turn-stream-runtime.ts +2 -0
- package/src/dashboard/turn-typeahead-prompt-zone.ts +67 -0
- package/src/domains/guardian-tick.ts +54 -2
- package/src/domains/outbound-alert.ts +3 -2
- package/src/domains/schedule-registry.ts +16 -2
- package/src/extractors.ts +3 -1
- package/src/git-fs/idle-refresh.ts +76 -0
- package/src/git-fs/index.ts +18 -7
- package/src/git-fs/retry.ts +4 -0
- package/src/git-fs/runner.ts +2 -0
- package/src/git-fs/worktree.ts +42 -4
- package/src/graph-kinds/registry.ts +2 -2
- package/src/graph-runner/runner.ts +267 -54
- package/src/grok/credential.ts +15 -3
- package/src/harness/harness-cli-command.ts +151 -38
- package/src/harness/harness-incidents.ts +37 -0
- package/src/harness/harness-pod-dispatch.ts +38 -1
- package/src/harness/harness-salvage-cli.ts +14 -2
- package/src/harness/launch-utterance-ledger.ts +208 -0
- package/src/impl-discipline/detector.ts +16 -4
- package/src/impl-discipline/system-prompt.ts +11 -0
- package/src/impl-discipline/types.ts +2 -2
- package/src/index.ts +683 -146
- package/src/intake-plane/already-built-hint.ts +91 -0
- package/src/intake-plane/requirement-funnel.ts +29 -1
- package/src/knowhow/pack.ts +199 -0
- package/src/light-cli.ts +111 -0
- package/src/llm/opengateway-models.ts +11 -0
- package/src/llm/provider-credentials.ts +14 -0
- package/src/llm/provider-detect.ts +8 -1
- package/src/llm/runtime-model-family.ts +2 -1
- package/src/llm.ts +268 -65
- package/src/loops/budget.ts +95 -0
- package/src/loops/msg-wake.ts +8 -2
- package/src/loops/orchestrator/traffic.ts +132 -1
- package/src/model-tier/llm-tier-map.ts +15 -1
- package/src/mss/logging/log-store.ts +4 -5
- package/src/native-tool-catalog.ts +15 -1
- package/src/nexus/api/graphs-api.ts +22 -3
- package/src/nexus/api/http-server.ts +1 -1
- package/src/nexus/api/loop-resources.ts +13 -1
- package/src/nexus/api/ops-api.ts +12 -0
- package/src/oauth/claude-pty-maturity.ts +66 -0
- package/src/oauth/codex-access-mirror.ts +55 -0
- package/src/oauth/codex.ts +7 -0
- package/src/oauth/fallback-chain.ts +1 -1
- package/src/onboarding/first-run.ts +5 -3
- package/src/onboarding/non-interactive.ts +64 -13
- package/src/onboarding.ts +10 -2
- package/src/ops/overview-collect.ts +54 -4
- package/src/ops/overview.ts +31 -7
- package/src/pr-tool/census.ts +282 -30
- package/src/pr-tool/inflight-registry.ts +160 -7
- package/src/prompt-library/gpt6-family-addendum.ts +14 -1
- package/src/pty-shell/herdr-agent-report.ts +442 -0
- package/src/pty-shell/pty-control-ipc.ts +5 -5
- package/src/pty-shell/pty-manifest.ts +7 -0
- package/src/pty-shell/pty-write-outcome.ts +24 -6
- package/src/pty-shell/tui-run-state.ts +117 -3
- package/src/release-loop/checklist.ts +103 -5
- package/src/release-loop/feature-store.ts +19 -2
- package/src/release-loop/landed-but-yellow.ts +129 -5
- package/src/release-loop/light-rc.ts +1 -0
- package/src/release-loop/placement.ts +10 -3
- package/src/release-loop/rehearsal.ts +205 -25
- package/src/release-loop/rubric.ts +16 -2
- package/src/repl/index.ts +174 -17
- package/src/repl/ops-msg-bridge.ts +32 -0
- package/src/self-dev/ask-launch-flow.ts +44 -5
- package/src/self-dev/cli-help-text.ts +17 -0
- package/src/self-dev/dev-cli.ts +11 -9
- package/src/self-dev/draft-residue.ts +37 -1
- package/src/self-dev/draft-sweep.ts +188 -13
- package/src/self-dev/draft-triage-rules.ts +107 -0
- package/src/self-dev/fleet-reduce.ts +3 -2
- package/src/self-dev/graph-front-nodes.ts +112 -0
- package/src/self-dev/graph-journey-nodes.ts +11 -6
- package/src/self-dev/graph-journey-route.ts +60 -6
- package/src/self-dev/harness-run-cli.ts +3 -15
- package/src/self-dev/orchestrate-cli-text.ts +10 -0
- package/src/self-dev/orchestrate.ts +79 -3
- package/src/self-dev/review-provider-fallback.ts +35 -1
- package/src/self-dev/run-supervisor.ts +107 -12
- package/src/self-dev/run-types.ts +5 -1
- package/src/self-dev/self-orchestrate-runtime.ts +1 -11
- package/src/self-dev/shard-aggregate.ts +42 -5
- package/src/self-dev/shard-run.ts +8 -1
- package/src/self-implement/blocked-draft-policy.ts +20 -0
- package/src/self-implement/classify-shadow.ts +3 -7
- package/src/self-implement/doctor-visit.ts +18 -1
- package/src/self-implement/gate-baseline.ts +95 -12
- package/src/self-implement/gate-cli.ts +1 -0
- package/src/self-implement/gate-remote.ts +40 -25
- package/src/self-implement/goal-author-decompose.ts +275 -47
- package/src/self-implement/goal-author-identity.ts +66 -0
- package/src/self-implement/goal-author-preservation-obligation.ts +35 -0
- package/src/self-implement/goal-author.ts +254 -120
- package/src/self-implement/goal-elaborate.ts +295 -0
- package/src/self-implement/goal-refine.ts +270 -0
- package/src/self-implement/graph-overlay-yaml.ts +28 -2
- package/src/self-implement/graph-unit-flatten.ts +103 -0
- package/src/self-implement/graph-unit-resolver.ts +107 -0
- package/src/self-implement/graph-yaml.ts +151 -1
- package/src/self-implement/headless-elanous-driver.ts +1 -0
- package/src/self-implement/knowhow-pack.ts +103 -0
- package/src/self-implement/orchestrator.ts +160 -45
- package/src/self-implement/pod-warm-pool-profile.ts +45 -0
- package/src/self-implement/review-mustfix-class.ts +203 -0
- package/src/self-implement/rework-budget-judgment.ts +5 -8
- package/src/self-implement/run-stop.ts +17 -2
- package/src/self-implement/running-runs.ts +29 -1
- package/src/self-implement/scope-adjacency.ts +113 -0
- package/src/self-implement/seams.ts +138 -4
- package/src/self-implement/stop-autoheal.ts +112 -2
- package/src/session/chat.ts +27 -0
- package/src/session-runtime/index.ts +1 -1
- package/src/session-runtime/retry-policy.ts +2 -1
- package/src/setup/llm-env-detect.ts +5 -0
- package/src/skills/tools/agent.ts +140 -14
- package/src/skills/tools/msg-ask.ts +100 -0
- package/src/skills/tools/ops-ledger.ts +2 -1
- package/src/skills/tools/schedule-wakeup.ts +66 -17
- package/src/steward/hold-hygiene.ts +24 -6
- package/src/steward/release-day.ts +7 -3
- package/src/steward/triage-budget.ts +194 -0
- package/src/steward/triage.ts +57 -7
- package/src/task-agent/actions.ts +69 -1
- package/src/task-agent/green-sweep.ts +4 -0
- package/src/task-agent/harvest-unit.ts +141 -0
- package/src/task-agent/live-moves.ts +257 -15
- package/src/task-agent/parent-host.ts +216 -6
- package/src/task-agent/postland-card.ts +80 -1
- package/src/task-agent/rejudge-on-head.ts +112 -26
- package/src/task-agent/repair-branch-cas.ts +4 -1
- package/src/task-agent/repair-cycle.ts +16 -3
- package/src/task-agent/run-identity.ts +4 -3
- package/src/task-agent/shadow.ts +19 -3
- package/src/task-agent/task-hand.ts +96 -36
- package/src/task-agent/tier-split.ts +127 -0
- package/src/task-agent/work-order-build.ts +24 -0
- package/src/task-agent/work-order.ts +3 -2
- package/src/task-orchestrator/generator-prompt.ts +60 -11
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +72 -3
- package/src/task-orchestrator/surfaces/pod-child-providers.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-command-job.ts +47 -8
- package/src/task-orchestrator/surfaces/pod-image-source.ts +89 -1
- package/src/task-orchestrator/surfaces/pod-lease.ts +17 -8
- package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +86 -8
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +8 -2
- package/src/task-orchestrator/surfaces/pod-pool.ts +73 -17
- package/src/task-orchestrator/surfaces/pod-provenance.ts +76 -0
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +72 -4
- package/src/task-orchestrator/surfaces/pod-warm-provenance.ts +81 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +32 -5
- package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +3 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +421 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +2 -1
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +588 -71
- package/src/task-orchestrator/surfaces/self-implement.ts +106 -2
- package/src/tool-runtime/ops-ledger-runtimes.ts +10 -2
- package/src/tool-runtime/truncation-store.ts +4 -0
- package/src/tui/README.md +2 -0
- package/src/tui/chat/background-job-status.ts +54 -0
- package/src/tui/chat/log-view.ts +80 -0
- package/src/tui/entry.ts +406 -0
- package/src/tui/input/composer.ts +144 -0
- package/src/tui/seat-mail-boot.ts +59 -0
- package/src/tui/slash/compact.ts +100 -0
- package/src/tui/slash/new-session.ts +35 -0
- package/src/tui-client/dashboard-session.ts +10 -1
- package/src/tui-client/local-chat-turn.ts +239 -0
- package/src/tui-client/local-harness-command.ts +63 -0
- package/src/tui-client/local-provider-command.ts +184 -0
- package/src/user-config/coercion.ts +36 -0
- package/src/user-config.ts +22 -43
- package/src/ux-sim/event-monkey.ts +378 -0
- package/src/ux-sim/fake-bin.ts +42 -7
- package/src/ux-sim/fault-nextmove-dispatch.ts +266 -0
- package/src/ux-sim/fault-pod-codex-503.ts +211 -0
- package/src/ux-sim/fault-scope-escape-lift.ts +189 -0
- package/src/ux-sim/scenario.ts +72 -13
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +0 -287
- package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +0 -62
- package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1654.32de4b324981a188.js +0 -23
- package/apps/pwa/out/_next/static/chunks/1834-98b64172bc1efe77.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +0 -149
- package/apps/pwa/out/_next/static/chunks/1913.7cc6fb6055b1ed3f.js +0 -41
- package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2112-e4efc21a6505d5bc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2534.e85ae21ad0dac829.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2898.fd781bc7cf01a7b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +0 -115
- package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +0 -64
- package/apps/pwa/out/_next/static/chunks/3541-ce3a5424ed5ad7f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3583.a05e88cc8d594628.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +0 -36
- package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +0 -77
- package/apps/pwa/out/_next/static/chunks/4745.67d6f99c245af3f7.js +0 -226
- package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4999.c064a4000c2a9e94.js +0 -79
- package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5304.04d24756f242a094.js +0 -148
- package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5458-16cd7a2b51b74c8c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5543.a438b8ab5a13ea47.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +0 -94
- package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6323.8672b4817a306928.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +0 -90
- package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +0 -32
- package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +0 -104
- package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6767.ea607cf0c20a25af.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +0 -93
- package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +0 -8
- package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8097-9530c03bcc550f02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +0 -1
- package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9002.e5658224e3dc1b6f.js +0 -24
- package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9138.b6e80031afb1d973.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9279-d28c5b7754d010ae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9407.e49124dedf0f5e72.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9989.3694300e5f000b14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-504204b58c82c253.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a9717a67c2eecbaf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-5c9ec30aee62dfbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-584191533721fa16.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-73c4b4bb3ac7ab5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-c0f1ca371f710b06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-46430d45a9e04eac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-3b2ebf1dc64ff0be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-25654b82094f7d22.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-8ea49a4c6dd2c6e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-ce5113aefea0a8d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0e5a41fac1c75396.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-31aaf1ed37c6df9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-3dcc1fa411e1f4e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c69247e7134d329d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-66dc5cd3a0999abe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-26ff7ff651a7217d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-617b3976981efa96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-d256f5d5d9552823.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-ce8f1907b8a6101c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-33e182a316263116.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-7607cca9b84950c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-eeab86176b03dc3b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-5b93dbae3432b996.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-77a6cb90a9cf2b10.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f47e768b5b242b5a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-eb41aa3367fc2505.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-4d13ab0b8a267e3f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-84dad32ff0fc0831.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-95306f892aa2d0ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-940fb6c217f6b470.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-8c66a3b24a745630.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7b675dfd35c36fc9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8bd0d3cf7665bcfc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-c219f2ed171131be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-40f8fa21bdae955b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-468f8313e4f1fbd9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-7bbb8fa353a246c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-4214b855d9233ea8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-936752c7aa58762e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-ec052ad359df1797.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8305570551091338.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-fad650e4793adb65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-d90e64743826e1d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a16bcfd49af86a32.js +0 -1
- package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +0 -122
- package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ebc7d829.264a0bcb6c750b50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +0 -1
- package/src/cli/g6a-registration-probe.ts +0 -16
- /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
|
-
|
|
1233
|
-
|
|
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
|
|
1607
|
-
//
|
|
1608
|
-
//
|
|
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 =
|
|
4825
|
-
|
|
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
|
-
//
|
|
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 =
|
|
8670
|
-
|
|
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
|
-
|
|
9051
|
-
|
|
9052
|
-
|
|
9053
|
-
|
|
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
|
-
|
|
9059
|
-
|
|
9060
|
-
|
|
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
|
-
|
|
9194
|
-
|
|
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
|
-
|
|
9204
|
-
|
|
9205
|
-
|
|
9206
|
-
|
|
9207
|
-
|
|
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
|
-
|
|
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 (
|
|
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 &&
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
10869
|
-
&& !
|
|
10870
|
-
&&
|
|
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
|
-
|
|
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
|
-
&&
|
|
11035
|
-
&&
|
|
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()); //
|
|
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 유지.
|