elanous 0.2.35 → 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/{T1mBQqmkwKDLGtyisDCOd → 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/{9952.5daf5f94063a2b3e.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/1746.3563617ea64023a3.js +115 -0
- 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/{1dc5a567.9b092bfae3d7099b.js → 1ed5e8af.cf424815c7c0efad.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4705-194e64e47ca0fbdb.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/{13.02a07436dec15f89.js → 210.90b2cbd64926cf34.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9512.5a76207a730e0491.js → 2283.edd9627b7bdfb546.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{6866-79aa5b4e47cac6aa.js → 2318-450e75d07605b8fe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{938.66ad1ef0e5abae1c.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/3199.6a1a9b0e6cd01dc6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9214.63a510d39178e997.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/{2018.a741297bce759490.js → 4313.76f232c304a15bde.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1165.bad13fc9151a7288.js → 4324.c99ba3e83eb1b691.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3f7c4ee5.3dde54f01a816613.js → 4337e36d.f42c3b391b3d8f20.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7385.50a308a477bdfc21.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/{8557-e7898769499cd56f.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/{5483-dd5d7697f6bdb106.js → 4833-7934c592c5569f00.js} +1 -1
- 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/{8444.4c26b379ca2b9596.js → 4931.95cc6dbd230774ca.js} +17 -17
- 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/{3408.21d1570602f4b6c0.js → 5046.7fd5cbd859299448.js} +1 -1
- 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/58edce7d.f1b0c72acf13b123.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +93 -0
- package/apps/pwa/out/_next/static/chunks/5952.294fc574a8625184.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b6705a4f-b9a9047de9eecfd0.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/6252.240578f10952e091.js +34 -0
- package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5101.e32282718f99ed6f.js → 6680.6a693c28aae4cd19.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4718-17d2af636796a330.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/{6236.e18cced2d5ba6afb.js → 6819.be5c9c4d67f22922.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2833-0fe47af99ed13c29.js → 6971-fb5f9dc0a2cb5d2d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{da5176c6.6773b6c5994e1d99.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/7424.c0fe2a595d4232b5.js +23 -0
- 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/{7644.17e37ba6f1d4226e.js → 7867.e8725745ddd1d940.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{0368f25d-ad84af92fefee68f.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/{359-2250789a2d3499e7.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/{b2f6ba4d.fb56fdbbf798df33.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/{1530.0e612369b6fd7ea0.js → 9151.a2c51e93f9156dae.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4441-875b97f5821ed58a.js → 9175-7d383df15a82e2be.js} +1 -1
- 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/958.53a8dcf4729e6997.js +64 -0
- 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-3337c6a1328c2674.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +1 -0
- 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-fe986fe79b107546.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-47c5d4db587266bd.js → page-1e5da297557d2354.js} +1 -1
- 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-1f5a60f70cb4dd0c.js → page-88a1edbff62eaf1d.js} +1 -1
- 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-bac7dee94e5eae4a.js → page-443364c9e4a23b31.js} +1 -1
- 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-dc0a532f5b9196ec.js → page-ac2c1e6169cfce57.js} +1 -1
- 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/{d06f9160.a3d9062f95de8ad7.js → d9815f84.4918f682a45a8502.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{cbe38a15.5a032598e39970c6.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/docs/goal-context/05-authoring-lessons.jsonl +47 -0
- package/docs/goal-context/README.md +3 -0
- package/graphs/default-loop.yaml +6 -1
- package/graphs/drafts/recipes.yaml +27 -7
- package/graphs/implement-loop.yaml +24 -0
- package/graphs/release/recipes.yaml +6 -0
- package/graphs/release/release-loop.yaml +17 -4
- package/graphs/wizard/recipes.yaml +44 -0
- package/graphs/wizard/wizard-loop.yaml +44 -0
- 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/research-report.yaml +2 -0
- 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/ci-typecheck-changed.ts +139 -5
- package/scripts/codex-fallback-live-probe.ts +17 -15
- package/scripts/coord-role-pack.ts +1 -1
- package/scripts/first10-gate.ts +416 -0
- package/scripts/fleet/node-setup.sh +32 -2
- package/scripts/fleet/run-light-worker.sh +9 -0
- package/scripts/fleet/wsl-node-setup.sh +432 -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 +344 -8
- package/scripts/release-loop/gate-closure.ts +48 -0
- package/scripts/release-loop/gate-diff.ts +2 -1
- package/scripts/release-loop/gate-node.ts +249 -53
- package/scripts/release-loop/known-issues-node.ts +6 -4
- package/scripts/release-loop/node-verdict.ts +2 -0
- package/scripts/release-loop/notes-repair.ts +216 -0
- package/scripts/release-loop/prepare-node.ts +61 -5
- package/scripts/release-loop/resume-cap.ts +14 -34
- package/scripts/release-loop/resume-release.ts +151 -15
- package/scripts/release-loop/resume-test-traffic.ts +10 -0
- package/scripts/release-loop/traffic-node.ts +59 -0
- package/scripts/release-loop/traffic-transition.ts +159 -0
- package/scripts/release-loop/version-node.ts +81 -12
- package/scripts/rhythm/daily.ts +137 -3
- package/scripts/train/green-leg.ts +176 -0
- package/scripts/tui-continue-real-evidence.ts +47 -0
- package/scripts/ux-sim.ts +53 -0
- package/skills/README.md +1 -0
- package/src/acp/client.ts +31 -5
- package/src/acp/core-turn-bridge.ts +54 -6
- package/src/acp/stderr-summary.ts +49 -0
- package/src/agent/delegate-hint.ts +16 -0
- package/src/agent/monad-agent-turn.ts +1 -0
- package/src/agent/runner.ts +82 -2
- package/src/agent/task-notification.ts +56 -10
- package/src/agent/terminal-surface.ts +217 -0
- package/src/agent/types.ts +4 -0
- package/src/agent-substrate/pr-reviewer.ts +64 -4
- 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 +490 -26
- package/src/autopilot/lineage/sources.ts +1 -1
- package/src/autopilot/mission-codebase-gate.ts +141 -12
- package/src/autopilot/pr-manager.ts +89 -18
- package/src/boot/daemon-runtime.ts +35 -3
- package/src/boot/daemon-tools/pty-shell.ts +2 -1
- package/src/boot/daemon-tools/self-implement.ts +1 -0
- package/src/budget/run-usage-rollup.ts +12 -7
- package/src/budget/unified-usage.ts +20 -0
- package/src/budget/usage-outcomes.ts +8 -4
- package/src/capture/tui-self-report.ts +132 -1
- package/src/chat/goal-continue-verdict.ts +41 -0
- package/src/chat/index.ts +30 -4
- package/src/chat/internal-turn-origin.ts +1 -0
- package/src/chat/paste-fold.ts +86 -0
- 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/autopilot-cli.ts +24 -9
- package/src/cli/config-audit.ts +119 -0
- package/src/cli/decisions-cli.ts +7 -4
- package/src/cli/doctor-cli.ts +137 -6
- package/src/cli/guardian-cli.ts +10 -0
- package/src/cli/herdr-cli.ts +34 -0
- package/src/cli/light-entry-route.ts +6 -3
- package/src/cli/log-event-names.ts +2 -0
- package/src/cli/logs-cli.ts +357 -2
- package/src/cli/make-cli.ts +247 -11
- package/src/cli/memory-cli.ts +30 -1
- package/src/cli/msg-cli.ts +132 -14
- package/src/cli/pr-cli.ts +29 -16
- package/src/cli/pr-granularity.ts +5 -3
- 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-recovery.ts +117 -1
- package/src/cli/pty-takeover-cli.ts +8 -7
- package/src/cli/release-checklist-read-cli.ts +109 -4
- package/src/cli/release-cli.ts +64 -15
- package/src/cli/release-single-flight.ts +1 -1
- package/src/cli/self-update.ts +23 -5
- package/src/cli/self-utterances-cli.ts +13 -16
- package/src/cli/tasks-card-show.ts +162 -0
- package/src/cli/tasks-cli.ts +868 -352
- package/src/cli/tasks-read-cli.ts +197 -0
- 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-core-turn.ts +4 -2
- package/src/core-turn/run-goal-loop.ts +76 -16
- package/src/core-turn/types.ts +8 -1
- package/src/dashboard/chat/acp-chat.ts +9 -0
- package/src/dashboard/context/keys.ts +8 -31
- package/src/dashboard/index.ts +299 -62
- package/src/dashboard/input/agent-wake.ts +50 -1
- package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -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/replay-preview.ts +25 -0
- 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 +20 -10
- package/src/dashboard/slash-runtime/model-choices.ts +15 -0
- package/src/dashboard/stale-install-check.ts +3 -99
- package/src/dashboard/synchronized-frame-output.ts +74 -0
- 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/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/standalone-log-sink.ts +15 -2
- package/src/domains/surface-events.ts +80 -1
- package/src/esc-abort-gate.ts +69 -0
- 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/git-fs/worktree.ts +95 -1
- package/src/graph-runner/graph-cli.ts +44 -2
- package/src/graph-runner/graph-run-api.ts +3 -2
- package/src/graph-runner/runner.ts +37 -16
- package/src/graph-wizard/generate.ts +131 -4
- package/src/graph-wizard/steps.ts +15 -0
- package/src/grounding/proactive-ground.ts +86 -0
- package/src/harness/control-inbox.ts +49 -1
- package/src/harness/harness-cli-command.ts +230 -40
- package/src/harness/harness-incidents.ts +52 -1
- package/src/harness/pod-control-send.ts +33 -5
- package/src/harness/review-adapter.ts +26 -6
- 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/index.ts +443 -25
- package/src/input-core/context-key-runtime.ts +21 -0
- package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
- package/src/light-cli.ts +6 -1
- 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-wellformed.ts +70 -0
- package/src/llm.ts +158 -15
- 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/msg-wake.ts +35 -39
- package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
- package/src/loops/orchestrator/inbox.ts +59 -11
- package/src/loops/orchestrator/knowhow-pack.ts +364 -0
- package/src/loops/orchestrator/tick.ts +54 -5
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/model-tier/llm-tier-map.ts +12 -17
- package/src/models/prompts.ts +17 -2
- package/src/msg/msg-post-office.ts +116 -0
- package/src/msg/msg-store.ts +17 -0
- package/src/mss/logging/log-store.ts +79 -22
- package/src/native-tool-catalog.ts +1 -1
- package/src/nexus/api/decisions-route.ts +38 -18
- package/src/nexus/api/graph-wizard-api.ts +46 -3
- 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/boot/register-mcp-clients.ts +263 -38
- package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
- package/src/nexus/state/state.ts +7 -1
- package/src/oauth/codex-account-store.ts +34 -1
- package/src/onboarding/first-run.ts +37 -6
- package/src/onboarding/web-first.ts +43 -11
- package/src/ops/loops-map.ts +46 -0
- package/src/ops/overview-cache.ts +22 -4
- package/src/ops/overview-collect.ts +12 -6
- package/src/ops/overview.ts +44 -8
- package/src/persona/loader.ts +11 -0
- package/src/persona/types.ts +8 -0
- package/src/policy/llm-policy.ts +3 -1
- package/src/prompt-enhance/enhance.ts +4 -4
- package/src/prompt-library/session-guidance.ts +14 -0
- package/src/provider-summary.ts +8 -0
- package/src/pty-shell/availability.ts +7 -0
- package/src/pty-shell/herdr-agent-report.ts +155 -37
- package/src/pty-shell/herdr-prompt.ts +266 -0
- 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 +327 -15
- package/src/pty-shell/pty-special-keys.ts +42 -2
- package/src/pty-shell/registry.ts +25 -15
- package/src/pty-shell/stale-install-check.ts +99 -0
- package/src/pty-shell/tui-run-state.ts +249 -3
- package/src/release-loop/auto-start.ts +20 -2
- package/src/release-loop/checklist.ts +126 -9
- package/src/release-loop/feature-store.ts +9 -9
- package/src/release-loop/landed-but-yellow.ts +93 -12
- package/src/release-loop/rehearsal.ts +36 -20
- package/src/repl/index.ts +27 -1
- package/src/seat-loop/knowhow-lint.ts +1 -1
- 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 +183 -20
- package/src/self-dev/decompose.ts +61 -0
- package/src/self-dev/dev-cli.ts +37 -3
- package/src/self-dev/dev-pipeline.ts +37 -9
- package/src/self-dev/draft-sweep.ts +241 -16
- package/src/self-dev/draft-triage-rules.ts +50 -5
- package/src/self-dev/glm-credential-guard.ts +77 -0
- package/src/self-dev/graph-journey-nodes.ts +1 -0
- package/src/self-dev/graph-journey-route.ts +12 -2
- 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 +45 -7
- package/src/self-dev/run-supervisor.ts +55 -2
- package/src/self-dev/run-types.ts +1 -1
- package/src/self-dev/shard-plan.ts +48 -0
- package/src/self-dev/shard-run.ts +50 -3
- package/src/self-health/autoheal.ts +153 -0
- package/src/self-health/signatures.ts +6 -0
- package/src/self-implement/device-first.ts +116 -0
- package/src/self-implement/doctor-visit.ts +322 -1
- package/src/self-implement/evidence-command-budget.ts +80 -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-cli.ts +1 -0
- package/src/self-implement/goal-author-decompose.ts +265 -4
- package/src/self-implement/goal-author.ts +366 -26
- package/src/self-implement/goal-elaborate.ts +176 -22
- package/src/self-implement/goal-refine.ts +3 -0
- package/src/self-implement/goal-supervisor-fill.ts +75 -26
- package/src/self-implement/graph-variant.ts +40 -6
- package/src/self-implement/headless-elanous-driver.ts +19 -3
- package/src/self-implement/importer-test-index.ts +215 -2
- package/src/self-implement/knowhow-pack.ts +5 -5
- package/src/self-implement/off-diff-evidence.ts +58 -6
- package/src/self-implement/orchestrator.ts +536 -42
- 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/review-round-brief.ts +300 -0
- package/src/self-implement/rework-policy.ts +44 -0
- package/src/self-implement/run-ledger.ts +278 -6
- package/src/self-implement/run-stop.ts +1 -1
- package/src/self-implement/run-ttl.ts +38 -24
- package/src/self-implement/running-runs.ts +17 -3
- package/src/self-implement/scope-adjacency.ts +3 -1
- package/src/self-implement/seams.ts +72 -10
- 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/self-implement/wiring-check.ts +358 -0
- 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/shell-env-bootstrap.ts +11 -4
- package/src/skills/runner.ts +4 -2
- package/src/skills/tools/agent.ts +290 -48
- package/src/skills/tools/pty.ts +5 -0
- 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/metrics.ts +12 -1
- package/src/status/status-provider-info.ts +37 -6
- package/src/steward/rejudge-tick.ts +22 -7
- package/src/steward/resync-tick.ts +31 -4
- package/src/steward/ta-repair-event-collect.ts +17 -6
- package/src/task-agent/actions.ts +202 -5
- 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/land-queue.ts +21 -8
- package/src/task-agent/live-moves.ts +70 -9
- 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/mission.ts +30 -0
- package/src/task-agent/parent-host.ts +21 -11
- package/src/task-agent/rejudge-on-head.ts +87 -5
- package/src/task-agent/repair-cycle.ts +179 -32
- package/src/task-agent/repair-next-move.ts +42 -4
- package/src/task-agent/repair-outcomes.ts +29 -0
- package/src/task-agent/repair-worker.ts +14 -4
- package/src/task-agent/review-prior-fix.ts +12 -2
- package/src/task-agent/shadow.ts +229 -8
- package/src/task-agent/task-card-prefix.ts +2 -0
- package/src/task-agent/task-hand.ts +630 -30
- package/src/task-agent/task-parent-role-llm.ts +45 -0
- package/src/task-agent/tier-split.ts +80 -10
- 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-account-broker.ts +9 -0
- package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
- package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +86 -5
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
- package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
- 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-manifest-test-normalize.ts +11 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +126 -8
- package/src/task-orchestrator/surfaces/pod-provenance.ts +8 -2
- 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-warm-worker-protocol.ts +4 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +491 -36
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +612 -54
- package/src/task-orchestrator/surfaces/self-implement.ts +46 -2
- package/src/testing/linux-env.ts +177 -0
- package/src/tool-runtime/index.ts +15 -2
- package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
- package/src/tty-foreground.ts +155 -0
- package/src/tui/chat/goal-interim.ts +177 -0
- package/src/tui/chat/log-view.ts +205 -18
- package/src/tui/chat/self-health-status.ts +232 -0
- package/src/tui/entry.ts +623 -80
- package/src/tui/input/at-picker.ts +55 -0
- package/src/tui/input/composer.ts +8 -1
- package/src/tui/slash/compact-command.ts +7 -0
- package/src/tui/slash/compact.ts +1 -7
- package/src/tui/slash/resume.ts +98 -0
- 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 +49 -5
- 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 +19 -1
- package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
- package/src/ux-sim/classic-tui-seat-scenarios.ts +670 -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 +3 -2
- package/src/ux-sim/fake-bin.ts +45 -0
- package/src/ux-sim/fake-gh.ts +174 -0
- package/src/ux-sim/fake-herdr.ts +238 -0
- package/src/ux-sim/fake-kubectl.ts +142 -0
- package/src/ux-sim/fake-llm.ts +116 -6
- package/src/ux-sim/fault-glm-no-credential.ts +116 -0
- package/src/ux-sim/fault-nextmove-dispatch.ts +102 -1
- package/src/ux-sim/fault-scope-escape-lift.ts +33 -6
- 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 +749 -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/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/subagent-tools-device.ts +81 -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/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/1540.af38731fa7c4a3e0.js +0 -41
- package/apps/pwa/out/_next/static/chunks/1674.2a65fd5668e1cc5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +0 -24
- package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +0 -74
- package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1993-c0007b7ad0c0ef41.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1c735de4.f993a30bbd3c57c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +0 -148
- package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2625.5d870aa999f33db1.js +0 -34
- package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +0 -77
- package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +0 -62
- package/apps/pwa/out/_next/static/chunks/3103.0df8da390948bb84.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +0 -90
- package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3589.5444a06bcf6e775c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3677-4215f826f6aa68e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +0 -79
- package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4346.8601952e73bf5803.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +0 -24
- package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5154.a118f3957ed14e36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +0 -23
- package/apps/pwa/out/_next/static/chunks/5637.281e5dec4ea6ecf1.js +0 -94
- package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/56d372f2.681ab4ec4c998fae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5852.db1f7449f4f74612.js +0 -287
- package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +0 -1
- package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +0 -8
- package/apps/pwa/out/_next/static/chunks/630.fe5a46428d63b013.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +0 -93
- package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6b89c8bd.24df687a820500b3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +0 -149
- package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +0 -104
- package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8219.baa715d1deee80e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8256.e3ac8421a71f82f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8437-8d5492094b166cfa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +0 -226
- package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +0 -64
- package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8637.47f5b35afcae5e6b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8714.ff0b7ce3ec3e3ae2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +0 -115
- package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/967-2aa39b2d04b4c690.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-406b47745b53f269.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-26e6c18a1a750cf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +0 -1
- /package/apps/pwa/out/_next/static/{T1mBQqmkwKDLGtyisDCOd → 8kITumG9GAZ1LwT9POrAR}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createContextKeyService, type ContextKeyService, type ContextKeys } from './context-keys.js';
|
|
2
|
+
|
|
3
|
+
// Shared lazy singleton for context-key consumers outside the dashboard.
|
|
4
|
+
let service: ContextKeyService | null = null;
|
|
5
|
+
|
|
6
|
+
export function getRuntimeContextKeyService(): ContextKeyService {
|
|
7
|
+
if (!service) service = createContextKeyService();
|
|
8
|
+
return service;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function getRuntimeContextKeys(): Readonly<ContextKeys> {
|
|
12
|
+
return getRuntimeContextKeyService().keys;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function updateRuntimeContextKeys(patch: Partial<ContextKeys>): void {
|
|
16
|
+
getRuntimeContextKeyService().update(patch);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function resetRuntimeContextKeysForTests(): void {
|
|
20
|
+
service = null;
|
|
21
|
+
}
|
|
@@ -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 }));
|
package/src/light-cli.ts
CHANGED
|
@@ -11,7 +11,7 @@ export async function runLightCli(route: LightCliRoute): Promise<void> {
|
|
|
11
11
|
// warns when the removed ELANOUS_CONFIG_DIR env var disagrees with it.
|
|
12
12
|
// Preserve that observable warning on hot routes without loading the
|
|
13
13
|
// resolver for the common case where the ignored env var is absent.
|
|
14
|
-
if (['msg', 'pty', 'logs', 'tasks'].includes(route) && process.env.ELANOUS_CONFIG_DIR !== undefined) {
|
|
14
|
+
if (['msg', 'pty', 'logs', 'tasks', 'tasks-read'].includes(route) && process.env.ELANOUS_CONFIG_DIR !== undefined) {
|
|
15
15
|
const { getElanousConfigDir } = await import('./elanous-config-dir.js');
|
|
16
16
|
getElanousConfigDir();
|
|
17
17
|
}
|
|
@@ -45,6 +45,11 @@ export async function runLightCli(route: LightCliRoute): Promise<void> {
|
|
|
45
45
|
registerTasksCommands(program);
|
|
46
46
|
break;
|
|
47
47
|
}
|
|
48
|
+
case 'tasks-read': {
|
|
49
|
+
const { registerTaskReadCommands } = await import('./cli/tasks-read-cli.js');
|
|
50
|
+
registerTaskReadCommands(program);
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
48
53
|
case 'pty': {
|
|
49
54
|
const { registerPtyTakeoverCommands } = await import('./cli/pty-takeover-cli.js');
|
|
50
55
|
registerPtyTakeoverCommands(program);
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// ── LLM 요청 본문 서로게이트 정리 (TUI-RECOVER-SKIPS-CREDITS · 0.2.36 · 2026-10-22 · OP P0) ──────────
|
|
2
|
+
//
|
|
3
|
+
// 🚨 실물(n8n 세션 · 설치본 99edcfa): 매 턴 즉시 실패 «자동 회복 2회 실패».
|
|
4
|
+
// grok 원문 `Failed to parse the request body as JSON: messages[19].content: unexpected end of hex escape`
|
|
5
|
+
// ⊕ 같은 요청에 codex `400 {"detail":"Bad Request"}`. 크레딧·폴백 순서 문제가 아니다 — 이력의 글 하나에
|
|
6
|
+
// «짝 없는 서로게이트»(이모지를 UTF-16 단위로 자른 반토막)가 섞여 JSON 본문이 깨졌다. 새 세션⊕요약도 그 글을 싣는다.
|
|
7
|
+
// ⭐ 보내기 직전에 모든 문자열의 짝 없는 서로게이트를 U+FFFD 로 바꾼다 — 바뀐 메시지만 새로 만든다.
|
|
8
|
+
//
|
|
9
|
+
// 세 얼굴: 관측 = debug.log('llm.request', 'lone-surrogate-fixed', { messages, strings }) · 인지 = 짝 없는 서로게이트 ·
|
|
10
|
+
// 힐링 = U+FFFD 치환(글 하나가 깨져도 턴은 돈다) · 실패 없음.
|
|
11
|
+
|
|
12
|
+
/** 짝 없는 서로게이트를 U+FFFD 로 — 바뀌었으면 새 문자열. */
|
|
13
|
+
export function wellFormedString(value: string): string {
|
|
14
|
+
const fn = (value as { toWellFormed?: () => string }).toWellFormed;
|
|
15
|
+
if (typeof fn === 'function') return fn.call(value);
|
|
16
|
+
return value.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g, '�');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function isWellFormed(value: string): boolean {
|
|
20
|
+
const fn = (value as { isWellFormed?: () => boolean }).isWellFormed;
|
|
21
|
+
if (typeof fn === 'function') return fn.call(value);
|
|
22
|
+
return wellFormedString(value) === value;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** 값 속 문자열(객체 «키» 포함)을 훑어 고친다 — 바뀐 곳이 없으면 같은 참조를 돌려준다.
|
|
26
|
+
* 깊이 제한은 두지 않는다(깊은 곳에 남으면 본문이 그대로 깨진다 · r1 must-fix) — 순환은 지금 걷는 경로 집합으로 끊는다. */
|
|
27
|
+
function fixValue(value: unknown, count: { strings: number }, path: WeakSet<object>): unknown {
|
|
28
|
+
if (typeof value === 'string') {
|
|
29
|
+
if (isWellFormed(value)) return value;
|
|
30
|
+
count.strings += 1;
|
|
31
|
+
return wellFormedString(value);
|
|
32
|
+
}
|
|
33
|
+
if (value === null || typeof value !== 'object') return value;
|
|
34
|
+
if (path.has(value)) return value;
|
|
35
|
+
path.add(value);
|
|
36
|
+
try {
|
|
37
|
+
if (Array.isArray(value)) {
|
|
38
|
+
let out: unknown[] | null = null;
|
|
39
|
+
value.forEach((item, i) => {
|
|
40
|
+
const next = fixValue(item, count, path);
|
|
41
|
+
if (next !== item) { out ??= [...value]; out[i] = next; }
|
|
42
|
+
});
|
|
43
|
+
return out ?? value;
|
|
44
|
+
}
|
|
45
|
+
const proto = Object.getPrototypeOf(value);
|
|
46
|
+
if (proto !== Object.prototype && proto !== null) return value;
|
|
47
|
+
let changed = false;
|
|
48
|
+
const entries = Object.entries(value as Record<string, unknown>).map(([key, item]) => {
|
|
49
|
+
const nextKey = fixValue(key, count, path) as string;
|
|
50
|
+
const next = fixValue(item, count, path);
|
|
51
|
+
if (nextKey !== key || next !== item) changed = true;
|
|
52
|
+
return [nextKey, next] as const;
|
|
53
|
+
});
|
|
54
|
+
return changed ? Object.fromEntries(entries) : value;
|
|
55
|
+
} finally {
|
|
56
|
+
path.delete(value);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** 메시지 배열 — 고친 메시지 수·문자열 수와 함께. 바뀐 게 없으면 같은 배열. */
|
|
61
|
+
export function wellFormedLLMMessages<T>(messages: readonly T[]): { messages: T[]; fixedMessages: number; fixedStrings: number } {
|
|
62
|
+
const count = { strings: 0 };
|
|
63
|
+
let fixedMessages = 0;
|
|
64
|
+
let out: T[] | null = null;
|
|
65
|
+
messages.forEach((message, i) => {
|
|
66
|
+
const next = fixValue(message, count, new WeakSet<object>()) as T;
|
|
67
|
+
if (next !== message) { fixedMessages += 1; out ??= [...messages]; out[i] = next; }
|
|
68
|
+
});
|
|
69
|
+
return { messages: out ?? (messages as T[]), fixedMessages, fixedStrings: count.strings };
|
|
70
|
+
}
|
package/src/llm.ts
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
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 {
|
|
5
|
+
import { wellFormedLLMMessages } from './llm-wellformed.js';
|
|
6
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
6
7
|
import { testFakeLlmEnabled, testFakeLlmProvider } from './ux-sim/fake-llm.js';
|
|
7
8
|
import { realpathSync } from 'node:fs';
|
|
8
9
|
import { resolve } from 'node:path';
|
|
@@ -60,6 +61,8 @@ import { resolveModelAlias } from './intelligence-map/model-alias.js';
|
|
|
60
61
|
import { BUILTIN_CATALOG, reasoningEffortCeiling as reasoningEffortCeilingOf } from './intelligence-map/model-catalog.js';
|
|
61
62
|
import { inferProviderFromModel as registryInferProviderFromModel } from './registry/normalize.js';
|
|
62
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';
|
|
63
66
|
import { undoTurnRuntime } from './tool-runtime/undo-turn-runtime.js';
|
|
64
67
|
import { listSnapshots } from './undo-turn/index.js';
|
|
65
68
|
// Zero-dep spec module (no tool-runtime registry) — safe for this hot path.
|
|
@@ -275,6 +278,61 @@ export interface LLMToolSpec {
|
|
|
275
278
|
parameters: Record<string, unknown>; // JSONSchema
|
|
276
279
|
}
|
|
277
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
|
+
|
|
278
336
|
/** Events produced by a streaming provider call. Text deltas arrive
|
|
279
337
|
* incrementally; tool_call events are emitted as COMPLETE units once
|
|
280
338
|
* the provider finishes streaming the tool_use block — callers don't
|
|
@@ -358,6 +416,8 @@ export interface LLMOpts {
|
|
|
358
416
|
usageRole?: ModelRole;
|
|
359
417
|
/** Optional per-call metering phase; absent calls keep the existing ledger shape. */
|
|
360
418
|
usagePhase?: string;
|
|
419
|
+
/** Optional per-call self-dev job kind; absent calls keep the existing ledger shape. */
|
|
420
|
+
usageJobKind?: string;
|
|
361
421
|
/** Optional streamLLM usage-ledger site override (defaults to "stream-llm"). */
|
|
362
422
|
usageSite?: string;
|
|
363
423
|
/**
|
|
@@ -2555,7 +2615,7 @@ export function sanitizeToolSchemaForKimi(schema: unknown): unknown {
|
|
|
2555
2615
|
]));
|
|
2556
2616
|
}
|
|
2557
2617
|
|
|
2558
|
-
export function toOpenAITools(tools: LLMToolSpec[] | undefined, kimi = false): any[] | undefined {
|
|
2618
|
+
export function toOpenAITools(tools: LLMToolSpec[] | undefined, kimi = false, grokTupleItems = false): any[] | undefined {
|
|
2559
2619
|
const unique = dedupeToolsByName(tools);
|
|
2560
2620
|
if (!unique || unique.length === 0) return undefined;
|
|
2561
2621
|
return unique.map(t => ({
|
|
@@ -2564,7 +2624,9 @@ export function toOpenAITools(tools: LLMToolSpec[] | undefined, kimi = false): a
|
|
|
2564
2624
|
name: t.name, description: t.description,
|
|
2565
2625
|
parameters: kimi
|
|
2566
2626
|
? sanitizeToolSchemaForKimi(strictifyToolSchema(t.parameters))
|
|
2567
|
-
:
|
|
2627
|
+
: grokTupleItems
|
|
2628
|
+
? sanitizeToolSchemaForGrok(strictifyToolSchema(t.parameters))
|
|
2629
|
+
: strictifyToolSchema(t.parameters),
|
|
2568
2630
|
},
|
|
2569
2631
|
}));
|
|
2570
2632
|
}
|
|
@@ -4460,6 +4522,12 @@ function providerByName(name: string): LLMProvider | undefined {
|
|
|
4460
4522
|
return PROVIDERS[name] ?? automaticProviderCandidates().find((candidate) => candidate.name === name);
|
|
4461
4523
|
}
|
|
4462
4524
|
|
|
4525
|
+
/** TUI-400-AUTOHEAL-FALLBACK — 같은 턴에서 `failedProviders` 가 실패했을 때 `llm.fallbackChain`(⊕ auto 후보)의
|
|
4526
|
+
* «다음» 공급자. 턴 안 폴백과 같은 해석(`explainFallbackCandidates`)을 그대로 쓴다 — 체인을 따로 읽지 않는다. */
|
|
4527
|
+
export function nextTurnFallbackProvider(failedProviders: readonly string[]): LLMProvider | undefined {
|
|
4528
|
+
return firstAvailableFallbackProvider(new Set(failedProviders), {});
|
|
4529
|
+
}
|
|
4530
|
+
|
|
4463
4531
|
function firstAvailableFallbackProvider(attempted: ReadonlySet<string>, opts: LLMOpts): LLMProvider | undefined {
|
|
4464
4532
|
// A candidate may lose its credential between chain enumeration and the
|
|
4465
4533
|
// switch. Keep scanning the ordered chain instead of stopping at that slot.
|
|
@@ -4745,6 +4813,11 @@ async function consumeProviderText(
|
|
|
4745
4813
|
let full = '';
|
|
4746
4814
|
let usage: ObservedUsage | undefined;
|
|
4747
4815
|
try {
|
|
4816
|
+
const wf = wellFormedLLMMessages(messages);
|
|
4817
|
+
if (wf.fixedMessages > 0) {
|
|
4818
|
+
debug.log('llm.request', 'lone-surrogate-fixed', { site: 'streamLLM', provider: provider.name, messages: wf.fixedMessages, strings: wf.fixedStrings }, { level: 'warn' });
|
|
4819
|
+
messages = wf.messages;
|
|
4820
|
+
}
|
|
4748
4821
|
iterator = (provider.streamChat
|
|
4749
4822
|
? provider.streamChat(messages, opts)
|
|
4750
4823
|
: provider.chat(messages, opts))[Symbol.asyncIterator]();
|
|
@@ -4856,7 +4929,7 @@ export async function streamLLM(
|
|
|
4856
4929
|
if (consumed.ok) {
|
|
4857
4930
|
if (consumed.usage !== 'unmeasured') {
|
|
4858
4931
|
try {
|
|
4859
|
-
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 });
|
|
4860
4933
|
} catch { /* best-effort observation */ }
|
|
4861
4934
|
}
|
|
4862
4935
|
debug.log('llm', 'outcome', { provider: activeProvider.name, status: 'ok', kind: 'streamLLM', durationMs: Date.now() - started });
|
|
@@ -5863,7 +5936,7 @@ const TOOL_LOOP_PHASE_DIRECTIVES: Record<ToolLoopFollowupPhase, (autoNarrowedRea
|
|
|
5863
5936
|
+ '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.',
|
|
5864
5937
|
'repair-action': () =>
|
|
5865
5938
|
'REPAIR ACTION REQUIRED — execution has already failed or a debugging repair step is armed. '
|
|
5866
|
-
+ 'Stop gathering more files and move to Edit/Write/RunShell/Bash or a narrow code-intel followup (Read/Lsp/AstGrep/Grep content/count), '
|
|
5939
|
+
+ 'Stop gathering more files and move to Edit/Write/RunShell/Bash or a narrow code-intel followup (Read/ListDir/Lsp/AstGrep/Grep content/count), '
|
|
5867
5940
|
+ 'ops ledger/delegate tools (MsgList/MsgPost/MsgAck/Checklist*/AgentOutput) still run, '
|
|
5868
5941
|
+ 'or answer in plain text if no code change is needed (e.g. a read-only investigation whose finding is the deliverable).',
|
|
5869
5942
|
'verify-action': () =>
|
|
@@ -7800,6 +7873,10 @@ const REPAIR_ACTION_TOOLS = new Set([
|
|
|
7800
7873
|
'Plan',
|
|
7801
7874
|
'MarkStepDone',
|
|
7802
7875
|
'Read',
|
|
7876
|
+
// ListDir is always one directory, never recursive — as narrow as Read. A failed step
|
|
7877
|
+
// is often «is the output there?»; rejecting it pushed the model to `ls` via shell
|
|
7878
|
+
// (n8n session 10-22: ListDir show_hidden=true ×2 rejected after a benign exit 128).
|
|
7879
|
+
'ListDir',
|
|
7803
7880
|
'Lsp',
|
|
7804
7881
|
'AstGrep',
|
|
7805
7882
|
'ast_grep_search',
|
|
@@ -8088,17 +8165,19 @@ export function billingRouteForProvider(provider: string | undefined, model: str
|
|
|
8088
8165
|
}
|
|
8089
8166
|
|
|
8090
8167
|
/** Observe usage with optional site/role metadata; a provider-name string remains supported. */
|
|
8091
|
-
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 {
|
|
8092
8169
|
try {
|
|
8093
8170
|
const providerName = typeof providerNameOrOptions === 'string' ? providerNameOrOptions : providerNameOrOptions?.providerName;
|
|
8094
8171
|
const site = (typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.site) ?? 'agent-turn';
|
|
8095
8172
|
const role = typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.role;
|
|
8096
8173
|
const phase = typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.phase;
|
|
8174
|
+
const jobKind = typeof providerNameOrOptions === 'string' ? undefined : providerNameOrOptions?.jobKind;
|
|
8097
8175
|
const billing = billingRouteForProvider(providerName, model);
|
|
8098
8176
|
debug.log('llm.usage', 'llm-usage', {
|
|
8099
8177
|
site,
|
|
8100
8178
|
...(role !== undefined ? { role } : {}),
|
|
8101
8179
|
...(phase !== undefined ? { phase } : {}),
|
|
8180
|
+
...(jobKind !== undefined ? { jobKind } : {}),
|
|
8102
8181
|
model,
|
|
8103
8182
|
...(usage.provider !== undefined && { provider: usage.provider }),
|
|
8104
8183
|
// ⭐ `provider` 는 «선 어댑터»(openai/anthropic)다 — 과금 주체는 별칭 칸으로(BACKLOG B10).
|
|
@@ -8225,25 +8304,37 @@ function applyCodexBehaviorGuard(
|
|
|
8225
8304
|
return enabled;
|
|
8226
8305
|
}
|
|
8227
8306
|
|
|
8307
|
+
function orchestrationId(): string {
|
|
8308
|
+
return randomUUID();
|
|
8309
|
+
}
|
|
8310
|
+
|
|
8228
8311
|
export async function streamLLMWithTools(
|
|
8229
8312
|
messages: LLMMessage[],
|
|
8230
8313
|
handlers: StreamWithToolsHandlers,
|
|
8231
8314
|
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;
|
|
8315
|
+
/** TUI-400-AUTOHEAL-FALLBACK — 이 턴을 «이 공급자부터» 연다(`provider` 와 달리 폴백은 그대로 허용).
|
|
8316
|
+
* 모델은 그 공급자의 기본 모델(앞 공급자 모델 이름은 안 옮긴다 — 호출부가 `model` 을 비운다). */
|
|
8317
|
+
initialProvider?: LLMProvider;
|
|
8318
|
+
/** 이 턴 폴백 후보에서 뺄 공급자(이미 같은 턴에서 실패한 쪽 — 되돌아가지 않게). */
|
|
8319
|
+
skipProviders?: readonly string[];
|
|
8232
8320
|
} = {},
|
|
8233
8321
|
): Promise<string> {
|
|
8234
|
-
const provider = opts.provider ?? resolveDefaultProvider(opts.model);
|
|
8322
|
+
const provider = opts.provider ?? opts.initialProvider ?? resolveDefaultProvider(opts.model);
|
|
8235
8323
|
const initial = finalizeStreamingProviderModel(provider, opts.model ?? provider.defaultModel);
|
|
8236
8324
|
let activeProvider = initial.provider;
|
|
8237
8325
|
let activeModel = initial.model;
|
|
8238
8326
|
opts.onResolvedProvider?.(activeProvider.name, activeModel);
|
|
8239
|
-
const attemptedProviders = new Set<string>([activeProvider.name]);
|
|
8327
|
+
const attemptedProviders = new Set<string>([activeProvider.name, ...(opts.skipProviders ?? [])]);
|
|
8240
8328
|
let blockedProviders: ProviderFallbackAttempt[] = [];
|
|
8241
8329
|
const effectiveModel = activeModel;
|
|
8242
8330
|
const modelFamily = getModelFamily(effectiveModel);
|
|
8331
|
+
const orchestration = orchestrationId();
|
|
8332
|
+
const followupHardStopStats = { wouldBlock: 0, blocked: 0 };
|
|
8243
8333
|
// Preserve pre-existing GPT-6 behavior while observing Codex-only sites.
|
|
8244
8334
|
const codexBehaviorGuards = usesCodexBehaviorGuards(effectiveModel);
|
|
8245
8335
|
const codexGuardCandidate = codexBehaviorGuards || isGpt6GenerationModel(effectiveModel);
|
|
8246
8336
|
debug.log('llm.router', 'streamLLMWithTools', {
|
|
8337
|
+
orchestrationId: orchestration,
|
|
8247
8338
|
provider: provider.name,
|
|
8248
8339
|
model: effectiveModel,
|
|
8249
8340
|
modelFamily,
|
|
@@ -8794,7 +8885,34 @@ export async function streamLLMWithTools(
|
|
|
8794
8885
|
activeModel = finalized.model;
|
|
8795
8886
|
opts.onResolvedProvider?.(activeProvider.name, activeModel);
|
|
8796
8887
|
turnOpts = { ...turnOpts, model: activeModel };
|
|
8797
|
-
|
|
8888
|
+
// 짝 없는 서로게이트(잘린 이모지)가 섞이면 공급자가 본문 JSON 을 못 읽는다(10-22 n8n 매 턴 400) — 이력 자체를 고친다(다음 요청에 다시 안 실리게).
|
|
8889
|
+
const wf = wellFormedLLMMessages(history);
|
|
8890
|
+
if (wf.fixedMessages > 0) {
|
|
8891
|
+
debug.log('llm.request', 'lone-surrogate-fixed', { site: 'tool-loop', provider: activeProvider.name, messages: wf.fixedMessages, strings: wf.fixedStrings }, { level: 'warn' });
|
|
8892
|
+
history.splice(0, history.length, ...wf.messages);
|
|
8893
|
+
}
|
|
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]();
|
|
8798
8916
|
}
|
|
8799
8917
|
step = await Promise.race([
|
|
8800
8918
|
streamIter.next().then((r) => ({ idle: false as const, r })),
|
|
@@ -8971,7 +9089,7 @@ export async function streamLLMWithTools(
|
|
|
8971
9089
|
// ⭐ 주 에이전트 턴의 토큰·비용을 «게이트 없이» 남긴다(2026-09-24 실측: 이 줄이 없어 3시간 `llm.usage`
|
|
8972
9090
|
// 18행이 전부 곁가지 두 자리였고, 하니스 런 비용의 거의 전부가 관측 밖이었다). 곁가지와 같은 모양 ·
|
|
8973
9091
|
// 모르는 모델은 금액 대신 `cost.kind='unknown'`. runId 는 debug.log 가 붙인다. 실패해도 턴은 계속.
|
|
8974
|
-
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 });
|
|
8975
9093
|
// Wave A1 (2026-05-04) — turn-level cache hit rate forensic.
|
|
8976
9094
|
// Each provider's usage event carries inputTokens / outputTokens
|
|
8977
9095
|
// / cacheReadInputTokens (when cache hit). Emit the per-turn
|
|
@@ -9361,13 +9479,23 @@ export async function streamLLMWithTools(
|
|
|
9361
9479
|
// done, just write the answer" UX which we must not preempt.
|
|
9362
9480
|
const codexImmediateInspectActionStop = followupInspectActionHeld && followupHardStopEnabled;
|
|
9363
9481
|
if (followupHardStopHeld) {
|
|
9364
|
-
|
|
9365
|
-
(codexImmediateInspectStop && codexInspectSynthesisGrace <= 0)
|
|
9482
|
+
const followupHardStopBlocked = (codexImmediateInspectStop && codexInspectSynthesisGrace <= 0)
|
|
9366
9483
|
|| (codexImmediateRepairStop && codexRepairActionGrace <= 0)
|
|
9367
|
-
|| (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
|
+
}
|
|
9368
9495
|
}
|
|
9369
9496
|
if (codexImmediateInspectStop && codexInspectSynthesisGrace <= 0) {
|
|
9370
9497
|
debug.log('llm.router', 'tool-loop.inspect-synthesis-phase.codex-immediate-stop', {
|
|
9498
|
+
orchestrationId: orchestration,
|
|
9371
9499
|
turn,
|
|
9372
9500
|
maxTurns,
|
|
9373
9501
|
autoNarrowedReadCount,
|
|
@@ -11372,7 +11500,12 @@ function makeOpenAICompatProvider(
|
|
|
11372
11500
|
throw new Error(`${name} unavailable: configure apiKey via \`elanous setup\``);
|
|
11373
11501
|
}
|
|
11374
11502
|
const activeModel = opts.model || model;
|
|
11375
|
-
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
|
+
);
|
|
11376
11509
|
const deepSeek = name === 'openrouter' && isOpenRouterDeepSeekWireModel(openRouterWireModel(activeModel));
|
|
11377
11510
|
// OR-TOOLCHOICE-PASS (2026-10-10) — OpenRouter 경로만 호출자 toolChoice 를 싣는다.
|
|
11378
11511
|
// ⛔ grok/openai 호환 경로는 손대지 않는다(무회귀). toolChoice 가 없거나 tools 가 없으면 키 자체를 안 싣는다.
|
|
@@ -11985,7 +12118,11 @@ export function anyProviderAvailable(userConfig?: UserConfig): boolean {
|
|
|
11985
12118
|
} catch { return false; }
|
|
11986
12119
|
}
|
|
11987
12120
|
} catch { /* fall through to env check */ }
|
|
11988
|
-
|
|
12121
|
+
if (Object.values(PROVIDERS).some(p => p.name !== 'bedrock' && p.name !== 'opengateway' && p.available())) return true; // 명시 전용 공급자는 auto 가용성 아님
|
|
12122
|
+
// 시험 fake 를 «공급자 있음» 으로 치는 것은 격리 라이브 TUI 무대가 명시로 켤 때만(ELANOUS_TEST_FAKE_LLM_AS_PROVIDER=1).
|
|
12123
|
+
// ⛔ gate 시험 env 는 ELANOUS_TEST_FAKE_LLM=1 을 «전역» 으로 켠다(scripts/lib/gate-test-env.ts) — 그 스위치만으로 가용성이
|
|
12124
|
+
// 참이 되면 «아무것도 없으면 false» 계약과 가용성으로 갈리는 기능(dart·dig-engine 등)이 gate 에서 모두 바뀐다(열차 #30208 introduced 2).
|
|
12125
|
+
return process.env.ELANOUS_TEST_FAKE_LLM_AS_PROVIDER === '1' && testFakeLlmEnabled();
|
|
11989
12126
|
}
|
|
11990
12127
|
|
|
11991
12128
|
/** 직결 배선이 없는 계열 → OpenRouter 에서 그 벤더의 대표 모델(사다리 `openrouter` 에 선 것). */
|
|
@@ -11995,6 +12132,12 @@ const OPENROUTER_ROUTE_FOR_WIP_PROVIDER = {
|
|
|
11995
12132
|
glm: 'openrouter/z-ai/glm-5.3',
|
|
11996
12133
|
} as const;
|
|
11997
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
|
+
|
|
11998
12141
|
/** Top-level resolver. Honors user-config first; falls through to
|
|
11999
12142
|
* env-var / auto-detect when provider is 'auto'. */
|
|
12000
12143
|
export function getProviderForConfig(
|