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