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