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
|
@@ -30,7 +30,7 @@ export function harnessRunsToLineage(entries: readonly RunLedgerTimelineEntry[])
|
|
|
30
30
|
store: 'observation' as const,
|
|
31
31
|
at: entry.executedAt,
|
|
32
32
|
seq: entry.pieceIndex,
|
|
33
|
-
summary: `self-implement run ${entry.runId}${entry.orchestrationId ? ` · orchestration ${entry.orchestrationId}` : ''}${entry.shardId ? ` · shard ${entry.shardId}` : ''}${entry.pieceTotal !== undefined ? ` · ${entry.pieceTotal} pieces` : ''}`,
|
|
33
|
+
summary: `self-implement run ${entry.runId}${entry.orchestrationId ? ` · orchestration ${entry.orchestrationId}` : ''}${entry.shardId ? ` · shard ${entry.shardId}` : ''}${entry.pieceTotal !== undefined ? ` · ${entry.pieceTotal} pieces` : ''}${entry.unitVisits?.orphanCount ? ` · graph.unit orphan ${entry.unitVisits.orphanCount}` : ''}`,
|
|
34
34
|
}));
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -28,6 +28,116 @@ import { llmUsageCostFields } from '../budget/llm-cost.js';
|
|
|
28
28
|
|
|
29
29
|
const execFileAsync = promisify(execFile);
|
|
30
30
|
|
|
31
|
+
/** git 서브프로세스 대역 — term grep 동시성 계약을 실제 git 없이 재기 위한 교체점. */
|
|
32
|
+
export type ExecFileLike = (
|
|
33
|
+
file: string,
|
|
34
|
+
args: readonly string[],
|
|
35
|
+
options: { cwd?: string; encoding: 'utf-8'; maxBuffer: number },
|
|
36
|
+
) => Promise<{ stdout: string; stderr?: string }>;
|
|
37
|
+
|
|
38
|
+
const defaultExecFile: ExecFileLike = execFileAsync as unknown as ExecFileLike;
|
|
39
|
+
let execFileImpl: ExecFileLike = defaultExecFile;
|
|
40
|
+
|
|
41
|
+
/** 테스트 seam — null/미지정이면 실제 git 서브프로세스로 되돌린다. */
|
|
42
|
+
export function setExecFileForTest(fn?: ExecFileLike | null): void {
|
|
43
|
+
execFileImpl = fn ?? defaultExecFile;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** term 별 git grep 동시 실행 상한(기본 3 · OP 06:3x 실측 13개 동시 부하 101 을 막는다). */
|
|
47
|
+
export const TERM_GREP_CONCURRENCY = 3;
|
|
48
|
+
let termGrepConcurrency: number = TERM_GREP_CONCURRENCY;
|
|
49
|
+
|
|
50
|
+
/** 테스트 seam — 상한 없음(Infinity)과 결과 불변을 비교하기 위해 올린다. */
|
|
51
|
+
export function setTermGrepConcurrencyForTest(value?: number | null): void {
|
|
52
|
+
termGrepConcurrency = value ?? TERM_GREP_CONCURRENCY;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** 상한 클램프 — 풀 크기와 관측값이 같은 규칙을 쓰게 한 곳에 둔다. */
|
|
56
|
+
function effectiveConcurrency(concurrency: number, width: number): number {
|
|
57
|
+
const limit = Number.isFinite(concurrency) ? Math.max(1, Math.floor(concurrency)) : width;
|
|
58
|
+
return Math.max(1, Math.min(limit, width));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** 동시 실행 상한 풀 — 결과 순서는 입력 순서 그대로(순위 계산이 순서에 의존하지 않게). */
|
|
62
|
+
async function mapWithConcurrency<T, R>(
|
|
63
|
+
items: readonly T[],
|
|
64
|
+
concurrency: number,
|
|
65
|
+
worker: (item: T) => Promise<R>,
|
|
66
|
+
): Promise<R[]> {
|
|
67
|
+
const results = new Array<R>(items.length);
|
|
68
|
+
const size = effectiveConcurrency(concurrency, items.length);
|
|
69
|
+
let cursor = 0;
|
|
70
|
+
await Promise.all(
|
|
71
|
+
Array.from({ length: size }, async () => {
|
|
72
|
+
for (let index = cursor++; index < items.length; index = cursor++) {
|
|
73
|
+
results[index] = await worker(items[index]!);
|
|
74
|
+
}
|
|
75
|
+
}),
|
|
76
|
+
);
|
|
77
|
+
return results;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** cwd seam 복원의 **단일 소유** — `process.chdir` 로 되돌리는 곳은 이 묶음(acquire/release) 하나뿐이다.
|
|
81
|
+
*
|
|
82
|
+
* ⛔ 왜 «생산» 이 소유하나: 한 번의 grounding 런은 persistent 코드 채널·skill 도구처럼 **임의 코드**를
|
|
83
|
+
* 지나고(`dispatchTool` → shell·pty), 그 코드가 cwd 를 옮긴 채 끝날 수 있다. 되돌리기를 «각 의존성» 에
|
|
84
|
+
* 맡기면 런이 마감(타임아웃)·예외로 끝나는 순간 그 되돌리기가 통째로 빠지고, 다음 런의 seam
|
|
85
|
+
* (`deps.cwd ?? process.cwd()`)이 **엉뚱한 트리를 저장소 루트로 읽어** 조용히 0건 grounding 을 낸다
|
|
86
|
+
* (#29343 r3 지적: 타임아웃 뒤 cwd seam 오염).
|
|
87
|
+
*
|
|
88
|
+
* ⛔ 소유는 «런마다» 가 아니라 «겹친 런 묶음» 하나다 — cwd 는 프로세스 전역이므로 런별 스냅샷은 겹침에서
|
|
89
|
+
* 깨진다(A 가 임시 트리로 옮긴 사이 B 가 시작하면 B 가 그 임시 트리를 «시작 자리» 로 저장하고, A 가 되돌린
|
|
90
|
+
* 뒤 B 가 다시 임시 트리로 되돌린다). ⇒ 첫 런이 시작 자리를 한 번 스냅샷하고, 겹쳐 들어온 런은 그 값을
|
|
91
|
+
* seam 으로 «물려받으며», 마지막으로 나가는 런만 되돌린다. 마감으로 «버려진» 런도 본문이 끝날 때까지
|
|
92
|
+
* holder 로 남으므로, 마감 뒤에 재개된 본문이 cwd 를 옮겨도 그 뒤의 런은 오염된 자리를 seam 으로 읽지 않고
|
|
93
|
+
* 본문이 끝나는 순간 되돌려진다.
|
|
94
|
+
* ⛔ 복원 보장의 «경계»: 복원은 런의 수명 안에서만 소유한다. 호출자가 마감으로 버렸는데 본문이 «끝나지
|
|
95
|
+
* 않으면» 전역 cwd 는 그 본문이 끝날 때까지 옮겨진 채 남는다 — 이 함수에는 호출자의 마감 신호가 들어오지
|
|
96
|
+
* 않고, 진행 중인 본문 밑의 cwd 를 남이 바꾸면 그 본문을 깨뜨린다. 그 사이 보장되는 것은 «겹쳐 들어온
|
|
97
|
+
* grounding 런의 seam 이 오염된 자리를 읽지 않는다» 이고, 본문이 끝나는 순간 마지막 holder 가 되돌린다
|
|
98
|
+
* (mission-codebase-gate.test.ts «마감 뒤 재개» 시험이 이 경계를 그대로 잰다).
|
|
99
|
+
* ⛔ 되돌리기 실패는 grounding 결과를 바꾸지 않되 «조용히 삼키지» 않는다 — `mission.grounding`
|
|
100
|
+
* `cwd-restore-failed` 로 남긴다(기존 이벤트 형식은 그대로). */
|
|
101
|
+
interface CwdSeamOwner { root: string; holders: number }
|
|
102
|
+
let cwdSeamOwner: CwdSeamOwner | null = null;
|
|
103
|
+
|
|
104
|
+
/** 소유 토큰 — `owned=false` 면 이 런은 묶음에 들지 않았다(시작 자리를 못 읽었다) ⇒ 되돌릴 것도 없다.
|
|
105
|
+
* ⛔ 절대 throw 하지 않는다: 지워진 cwd 에서도 `deps.cwd` 를 받은 호출은 예전처럼 진행해야 한다. */
|
|
106
|
+
interface CwdSeamLease { root: string | null; owned: boolean }
|
|
107
|
+
|
|
108
|
+
function acquireCwdSeam(): CwdSeamLease {
|
|
109
|
+
if (!cwdSeamOwner) {
|
|
110
|
+
let root: string;
|
|
111
|
+
try { root = process.cwd(); } catch { return { root: null, owned: false }; }
|
|
112
|
+
cwdSeamOwner = { root, holders: 0 };
|
|
113
|
+
}
|
|
114
|
+
cwdSeamOwner.holders += 1;
|
|
115
|
+
return { root: cwdSeamOwner.root, owned: true };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function releaseCwdSeam(lease: CwdSeamLease): void {
|
|
119
|
+
if (!lease.owned) return;
|
|
120
|
+
const owner = cwdSeamOwner;
|
|
121
|
+
if (!owner) return;
|
|
122
|
+
owner.holders -= 1;
|
|
123
|
+
if (owner.holders > 0) return;
|
|
124
|
+
cwdSeamOwner = null;
|
|
125
|
+
let current: string | null = null;
|
|
126
|
+
try { current = process.cwd(); } catch { /* 지워진 자리 — 아래에서 되돌린다 */ }
|
|
127
|
+
if (current === owner.root) return;
|
|
128
|
+
try {
|
|
129
|
+
process.chdir(owner.root);
|
|
130
|
+
} catch (e) {
|
|
131
|
+
try {
|
|
132
|
+
debug.log('mission.grounding', 'cwd-restore-failed', {
|
|
133
|
+
root: owner.root,
|
|
134
|
+
current,
|
|
135
|
+
error: e instanceof Error ? e.message.slice(0, 200) : String(e).slice(0, 200),
|
|
136
|
+
}, { level: 'warn' });
|
|
137
|
+
} catch { /* 관측 실패가 grounding 을 바꾸지 않는다 */ }
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
31
141
|
function logLlmUsage(site: 'codebase-gate-injected' | 'codebase-gate-dynamic', model: string, usage: LLMUsage): void {
|
|
32
142
|
try {
|
|
33
143
|
debug.log('llm.usage', 'llm-usage', {
|
|
@@ -215,28 +325,37 @@ export function commonTermCoverageWeight(matchLines: number): number {
|
|
|
215
325
|
}
|
|
216
326
|
|
|
217
327
|
async function searchRepository(terms: string[], limit: number, cwd: string | undefined, paths: string[], commonPaths = paths): Promise<string[]> {
|
|
218
|
-
|
|
328
|
+
// 같은 키워드는 한 번만 실행한다 — 실행·랭킹이 같은 목록을 쓰므로 결과는 결정적이다.
|
|
329
|
+
const uniqueTerms = [...new Set(terms)];
|
|
330
|
+
if (!uniqueTerms.length) return [];
|
|
219
331
|
const fileTerms = new Map<string, Set<string>>(); // file → 매칭된 서로 다른 term
|
|
220
332
|
const fileLines = new Map<string, number>(); // file → 총 매칭 라인 수
|
|
221
333
|
const fileTermLines = new Map<string, Map<string, number>>(); // file → term별 매칭 라인 수
|
|
222
334
|
const tooCommon = new Set<string>(); // 200+ 파일 매칭 = 밀도 감쇠 대상
|
|
223
|
-
const trackedPaths = await
|
|
335
|
+
const trackedPaths = await execFileImpl('git', ['ls-files', '--', ...paths], { ...(cwd ? { cwd } : {}), encoding: 'utf-8', maxBuffer: 8_000_000 })
|
|
224
336
|
.then(({ stdout }) => stdout.split('\n').filter(Boolean))
|
|
225
337
|
.catch(() => [] as string[]);
|
|
226
|
-
const pathMatches = new Map(
|
|
227
|
-
// term별 git grep 을
|
|
228
|
-
//
|
|
229
|
-
|
|
338
|
+
const pathMatches = new Map(uniqueTerms.map((term) => [term, trackedPaths.filter((file) => file.toLowerCase().includes(term)).length]));
|
|
339
|
+
// term별 git grep 을 동시 실행 상한 풀(기본 3)로 돌린다 — 무제한 병렬은 mbp 1분 부하 101·git grep
|
|
340
|
+
// 13개 동시(OP 06:3x 실측)를 만들었다. git grep=현재 워킹트리 파일 검색(history 아님)·
|
|
341
|
+
// gitignore/바이너리 자동 제외. 호출자가 코드와 문서를 분리한다.
|
|
342
|
+
const termGrepStartedAt = Date.now();
|
|
343
|
+
const perTerm = await mapWithConcurrency(uniqueTerms, termGrepConcurrency, async (t) => {
|
|
230
344
|
try {
|
|
231
345
|
// -c: file:count. -i 무시·-I 바이너리제외. term 하나씩(어느 term 이 걸렸는지 추적).
|
|
232
|
-
const { stdout } = await
|
|
346
|
+
const { stdout } = await execFileImpl('git', ['grep', '-c', '-i', '-I', '-e', t, '--', ...paths], { ...(cwd ? { cwd } : {}), encoding: 'utf-8', maxBuffer: 8_000_000 });
|
|
233
347
|
const rows = stdout.split('\n').filter(Boolean);
|
|
234
|
-
const commonRows = commonPaths === paths ? rows : await
|
|
348
|
+
const commonRows = commonPaths === paths ? rows : await execFileImpl('git', ['grep', '-c', '-i', '-I', '-e', t, '--', ...commonPaths], { ...(cwd ? { cwd } : {}), encoding: 'utf-8', maxBuffer: 8_000_000 })
|
|
235
349
|
.then(({ stdout }) => stdout.split('\n').filter(Boolean))
|
|
236
350
|
.catch(() => [] as string[]);
|
|
237
351
|
return { t, rows, commonCount: commonRows.length };
|
|
238
352
|
} catch { return { t, rows: [] as string[], commonCount: 0 }; } // git grep no-match = exit 1(throw) → 빈 결과
|
|
239
|
-
})
|
|
353
|
+
});
|
|
354
|
+
debug.log('grounding.search', 'term-grep-batch', {
|
|
355
|
+
terms: uniqueTerms.length,
|
|
356
|
+
concurrency: effectiveConcurrency(termGrepConcurrency, uniqueTerms.length),
|
|
357
|
+
ms: Date.now() - termGrepStartedAt,
|
|
358
|
+
});
|
|
240
359
|
for (const { t, rows, commonCount } of perTerm) {
|
|
241
360
|
if (commonCount > 200) {
|
|
242
361
|
tooCommon.add(t);
|
|
@@ -260,7 +379,7 @@ async function searchRepository(terms: string[], limit: number, cwd: string | un
|
|
|
260
379
|
const cover = [...ts].reduce((total, term) => total + (tooCommon.has(term)
|
|
261
380
|
? commonTermCoverageWeight(termLines?.get(term) ?? 0)
|
|
262
381
|
: 1), 0);
|
|
263
|
-
const nameTerms =
|
|
382
|
+
const nameTerms = uniqueTerms.filter((t) => f.toLowerCase().includes(t));
|
|
264
383
|
const nameWeight = nameTerms.reduce((total, term) => {
|
|
265
384
|
const matches = pathMatches.get(term) ?? 0;
|
|
266
385
|
// 경로상 유일한 식별자는 강한 +25를 유지하고, 공유 조각은 매칭 경로 수에 반비례해 감쇠한다.
|
|
@@ -531,8 +650,12 @@ export async function groundMissionInCodebase(
|
|
|
531
650
|
goal: string, deps: { cwd?: string; seedPaths?: readonly string[]; searchTerms?: SearchTermFn; skillIndex?: SkillIndexFn; pickSkills?: SkillPickFn; recallMemory?: RecallMemoryFn; recallSelf?: RecallSelfFn; refDigest?: RefDigestFn; persistent?: PersistentGroundingDeps | false } & CapsuleGroundingDeps = {},
|
|
532
651
|
): Promise<CodebaseGrounding> {
|
|
533
652
|
// 호출자가 준 root를 모든 저장소 채널과 corpus 관측에 공유한다. 미지정 호출은 기존처럼 프로세스 cwd를 쓴다.
|
|
653
|
+
// ⛔ seam 은 «읽기» 만 하지 않는다 — 시작 자리를 소유자(acquireCwdSeam)에게서 받고 finally 에서 돌려준다.
|
|
654
|
+
// 겹친 런은 첫 런의 스냅샷을 물려받으므로, 다른 런이 옮겨 놓은 cwd 를 시작 자리로 읽지 않는다.
|
|
655
|
+
const cwdLease = acquireCwdSeam();
|
|
534
656
|
const cwdSource = deps.cwd === undefined ? 'process' : 'caller';
|
|
535
|
-
|
|
657
|
+
// 시작 자리를 못 읽었으면(지워진 cwd) 소유하지 않는다 — caller root 는 그대로 쓰고, 미지정이면 예전처럼 process.cwd() 가 판정한다.
|
|
658
|
+
const searchRoot = deps.cwd ?? cwdLease.root ?? process.cwd();
|
|
536
659
|
const startedAt = performance.now();
|
|
537
660
|
let searchTermsElapsedMs = 0;
|
|
538
661
|
let persistentElapsedMs = 0;
|
|
@@ -695,7 +818,13 @@ export async function groundMissionInCodebase(
|
|
|
695
818
|
debug.log('mission.grounding', 'corpus', { grounded: false, reason: 'error', cwd: searchRoot, cwdSource, error: e instanceof Error ? e.message.slice(0, 200) : String(e).slice(0, 200), persistentEvidence: null, persistentStopReason: null, codeChannel: 'failed' }, { level: 'warn' });
|
|
696
819
|
return { grounded: false, context: '', files: [], persistentEvidence: [], skillFacts: [], codeFacts: [], memoryFacts: [], documentFacts: [], refFacts: [], ptyFacts: [] };
|
|
697
820
|
} finally {
|
|
698
|
-
|
|
821
|
+
// 정상·예외·타임아웃 어느 경로로 끝났든 소유를 돌려준다 — 마지막 holder 가 시작 자리로 되돌린다.
|
|
822
|
+
// 되돌리기를 관측보다 «먼저» 둔다: 관측이 무엇을 하든 복원이 빠지지 않는다.
|
|
823
|
+
try {
|
|
824
|
+
releaseCwdSeam(cwdLease);
|
|
825
|
+
} finally {
|
|
826
|
+
observeTiming();
|
|
827
|
+
}
|
|
699
828
|
}
|
|
700
829
|
}
|
|
701
830
|
|
|
@@ -127,7 +127,7 @@ export interface UpsertPrResult { url: string; reused: boolean }
|
|
|
127
127
|
* 나머지 reason(add/commit/push/gh)은 진짜 실패로 detail(stderr)과 함께 관측·pr-failed. */
|
|
128
128
|
export type UpsertPrOutcome =
|
|
129
129
|
| { ok: true; url: string; reused: boolean; labelsApplied?: boolean; labelsOmitted?: boolean;
|
|
130
|
-
supersededPr?: number }
|
|
130
|
+
supersededPr?: number; boundCardHeadRefName?: string }
|
|
131
131
|
| { ok: false; reason: 'add' | 'commit' | 'base' | 'noop' | 'push' | 'gh' | 'guard'; detail: string;
|
|
132
132
|
incident?: PrCreateFailureIncident };
|
|
133
133
|
|
|
@@ -186,9 +186,9 @@ function readPrMergeState(run: CmdRunner, prNumber: number, cwd?: string): Merge
|
|
|
186
186
|
|
|
187
187
|
/** 열린 PR 조회의 판별 가능한 결과. `SKIPPED`는 기본 브랜치 표식이라 gh를 호출하지 않았음을 뜻한다. */
|
|
188
188
|
export type FindPrForBranchOutcome =
|
|
189
|
-
| { status: 'ok OUTPUT'; url: string }
|
|
190
|
-
| { status: 'ok EMPTY'; url: null }
|
|
191
|
-
| { status: 'FAILED'; url: null; rc?: number; stderrTail?: string }
|
|
189
|
+
| { status: 'ok OUTPUT'; url: string; rc?: number; stderrTail?: string }
|
|
190
|
+
| { status: 'ok EMPTY'; url: null; rc?: number; stderrTail?: string }
|
|
191
|
+
| { status: 'FAILED'; url: null; rc?: number; stderrTail?: string; stdoutTail?: string }
|
|
192
192
|
| { status: 'SKIPPED'; url: null };
|
|
193
193
|
|
|
194
194
|
export interface PrManager {
|
|
@@ -264,10 +264,10 @@ export function prBaseFromComparison(comparisonBase: string): string {
|
|
|
264
264
|
* Feature-branch HEAD-only commits are excluded because the range is the base
|
|
265
265
|
* ref itself, not `HEAD`. Network/`gh` are never used.
|
|
266
266
|
*/
|
|
267
|
-
export function landingHistoryGitLogArgs(since: string, baseRef: string): string[] {
|
|
267
|
+
export function landingHistoryGitLogArgs(since: string | null, baseRef: string): string[] {
|
|
268
268
|
return [
|
|
269
269
|
'log',
|
|
270
|
-
`--since=${since}
|
|
270
|
+
...(since === null ? [] : [`--since=${since}`]),
|
|
271
271
|
'--pretty=format:commit %H',
|
|
272
272
|
'--name-only',
|
|
273
273
|
'--no-merges',
|
|
@@ -338,8 +338,12 @@ export interface PrCreateStageObservation {
|
|
|
338
338
|
ran: boolean;
|
|
339
339
|
rc?: number;
|
|
340
340
|
stderrTail?: string;
|
|
341
|
+
stdoutTail?: string;
|
|
341
342
|
/** push 단계 전용 — force-push 최종 성공 여부. */
|
|
342
343
|
ok?: boolean;
|
|
344
|
+
/** gh 단계 전용 — 재시도 전후의 목록 조회와 생성 명령을 각각 보존한다. */
|
|
345
|
+
lookup?: PrCreateStageObservation;
|
|
346
|
+
create?: PrCreateStageObservation;
|
|
343
347
|
}
|
|
344
348
|
/** PR 생성 실패 한 건 — push/gh 두 단계 관측을 하나의 기록에. */
|
|
345
349
|
export interface PrCreateFailureIncident {
|
|
@@ -380,8 +384,26 @@ export function recordPrCreateFailureIncident(incident: PrCreateFailureIncident)
|
|
|
380
384
|
...(incident.runId ? { runId: sanitizeCredentialText(incident.runId) } : {}),
|
|
381
385
|
branch: sanitizeCredentialText(incident.branch),
|
|
382
386
|
remote: sanitizeCredentialText(incident.remote),
|
|
383
|
-
push: {
|
|
384
|
-
|
|
387
|
+
push: {
|
|
388
|
+
...incident.push,
|
|
389
|
+
...(incident.push.stderrTail ? { stderrTail: stderrTailOf(incident.push.stderrTail) } : {}),
|
|
390
|
+
...(incident.push.stdoutTail ? { stdoutTail: stderrTailOf(incident.push.stdoutTail) } : {}),
|
|
391
|
+
},
|
|
392
|
+
gh: {
|
|
393
|
+
...incident.gh,
|
|
394
|
+
...(incident.gh.stderrTail ? { stderrTail: stderrTailOf(incident.gh.stderrTail) } : {}),
|
|
395
|
+
...(incident.gh.stdoutTail ? { stdoutTail: stderrTailOf(incident.gh.stdoutTail) } : {}),
|
|
396
|
+
...(incident.gh.lookup ? { lookup: {
|
|
397
|
+
...incident.gh.lookup,
|
|
398
|
+
...(incident.gh.lookup.stderrTail ? { stderrTail: stderrTailOf(incident.gh.lookup.stderrTail) } : {}),
|
|
399
|
+
...(incident.gh.lookup.stdoutTail ? { stdoutTail: stderrTailOf(incident.gh.lookup.stdoutTail) } : {}),
|
|
400
|
+
} } : {}),
|
|
401
|
+
...(incident.gh.create ? { create: {
|
|
402
|
+
...incident.gh.create,
|
|
403
|
+
...(incident.gh.create.stderrTail ? { stderrTail: stderrTailOf(incident.gh.create.stderrTail) } : {}),
|
|
404
|
+
...(incident.gh.create.stdoutTail ? { stdoutTail: stderrTailOf(incident.gh.create.stdoutTail) } : {}),
|
|
405
|
+
} } : {}),
|
|
406
|
+
},
|
|
385
407
|
};
|
|
386
408
|
debug.log('autopilot.pr-manager', 'pr-create-failure-incident', safe);
|
|
387
409
|
return safe;
|
|
@@ -533,17 +555,37 @@ function reuseSameCellPr(run: CmdRunner, input: UpsertPrInput, target: NonNullab
|
|
|
533
555
|
if (!runKey) return fail(input.runId ? 'new run id invalid for scratch ref' : 'run id required for scratch ref');
|
|
534
556
|
const scratch = `self-impl/pr-create-r${runKey}-${randomUUID()}`;
|
|
535
557
|
const scratchRef = `refs/heads/${scratch}`;
|
|
558
|
+
// ⛔ push 보고는 원격의 진실이 아니다 — ref 를 만든 뒤에도 exit≠0 으로 끝날 수 있고, 삭제가
|
|
559
|
+
// 실패로 보고돼도 이미 지워졌을 수 있다. 그래서 새 draft 결과가 확정되는 즉시 **이 시도가
|
|
560
|
+
// 만든 scratch ref 하나만** 상대로 「남았나 보고 → 지운다」. 지우지 못하면 그 이유를 원장에
|
|
561
|
+
// 남긴다(다른 ref·가지·PR 은 건드리지 않는다).
|
|
562
|
+
const reapScratchRef = (outcome: 'branch-created' | 'create-refused' | 'upload-failed'): void => {
|
|
563
|
+
// 업로드가 실패로 보고돼도 원격에 ref 가 남아 있을 수 있다 — 먼저 읽고 건너뛰면 «읽은 뒤
|
|
564
|
+
// 늦게 착지한» ref 가 남는 창이 생긴다. 그래서 결과와 무관하게 늘 삭제를 시도하고,
|
|
565
|
+
// 원격이 «그런 ref 없음» 이라 답하면 이미 없는 것이므로 정리 실패로 세지 않는다.
|
|
566
|
+
let removed = run('git', ['-C', cwd, 'push', 'origin', `:${scratchRef}`]);
|
|
567
|
+
if (!removed.ok && isTransientPushFailure(removed.err || removed.out))
|
|
568
|
+
removed = run('git', ['-C', cwd, 'push', 'origin', `:${scratchRef}`]);
|
|
569
|
+
if (removed.ok) return;
|
|
570
|
+
if (/remote ref does not exist/i.test(`${removed.err ?? ''}\n${removed.out ?? ''}`)) {
|
|
571
|
+
debug.log('autopilot.pr-manager', 'same-cell-scratch-absent', { scratchRef, outcome });
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
debug.log('autopilot.pr-manager', 'same-cell-scratch-cleanup-failed',
|
|
575
|
+
{ scratchRef, outcome, detail: removed.err || removed.out,
|
|
576
|
+
stderr: removed.err ?? '', stdout: removed.out, truncated: false }, { level: 'warn' });
|
|
577
|
+
};
|
|
536
578
|
const uploaded = run('git', ['-C', cwd, 'push', 'origin', `HEAD:${scratchRef}`]);
|
|
537
|
-
if (!uploaded.ok)
|
|
579
|
+
if (!uploaded.ok) {
|
|
580
|
+
reapScratchRef('upload-failed');
|
|
581
|
+
return fail(`new run object upload failed: ${(uploaded.err || uploaded.out).slice(0, 220)}`);
|
|
582
|
+
}
|
|
538
583
|
const repository = run('gh', ['repo', 'view', '--json', 'nameWithOwner', '-q', '.nameWithOwner'], { cwd });
|
|
539
584
|
const repoName = repository.out.trim();
|
|
540
585
|
const createdRef = repository.ok && /^[^/\s]+\/[^/\s]+$/.test(repoName)
|
|
541
586
|
? run('gh', ['api', '--method', 'POST', `repos/${repoName}/git/refs`, '-f', `ref=${newRef}`, '-f', `sha=${localHead.out.trim()}`], { cwd })
|
|
542
587
|
: { ok: false, out: '', err: 'repository identity unavailable' };
|
|
543
|
-
|
|
544
|
-
if (!removedScratch.ok) debug.log('autopilot.pr-manager', 'same-cell-scratch-cleanup-failed',
|
|
545
|
-
{ scratchRef, detail: removedScratch.err || removedScratch.out,
|
|
546
|
-
stderr: removedScratch.err ?? '', stdout: removedScratch.out, truncated: false }, { level: 'warn' });
|
|
588
|
+
reapScratchRef(createdRef.ok ? 'branch-created' : 'create-refused');
|
|
547
589
|
if (!createdRef.ok) return fail(`new run branch create refused: ${(createdRef.err || createdRef.out).slice(0, 220)}`);
|
|
548
590
|
const stateLabels = new Set(labelsForAxis('state').map(label => label.name));
|
|
549
591
|
const labels = [...new Set([...(input.labels ?? []).filter(label => !stateLabels.has(label as typeof PR_LABEL_NAMES.running)),
|
|
@@ -595,7 +637,8 @@ function reuseSameCellPr(run: CmdRunner, input: UpsertPrInput, target: NonNullab
|
|
|
595
637
|
if (!pushed.ok) return fail(`fast-forward push refused: ${(pushed.err || pushed.out).slice(0, 220)}`);
|
|
596
638
|
debug.log('autopilot.pr-manager', 'same-cell-push-decision', { ...pushEvidence, outcome: 'allowed', reason: 'bound-card-pr-head-fast-forward' });
|
|
597
639
|
debug.log('autopilot.pr-manager', 'same-cell-reused', { pr: target.number, cellId: target.cellId, cardId: target.cardId, branch: target.branch });
|
|
598
|
-
|
|
640
|
+
const edited = editExistingPr(run, input, pr.url);
|
|
641
|
+
return edited.ok ? { ...edited, boundCardHeadRefName: target.branch } : edited;
|
|
599
642
|
}
|
|
600
643
|
|
|
601
644
|
/** ★ PR 매니저 팩토리(대표 2026-07-12) — CmdRunner 주입(테스트 스텁). 실 배선은 기본 러너. */
|
|
@@ -622,13 +665,23 @@ export function makePrManager(
|
|
|
622
665
|
}
|
|
623
666
|
const r = run('gh', ['pr', 'list', '--head', branch, '--state', 'open', '--json', 'url', '--jq', '.[0].url // ""'], cwd ? { cwd } : undefined);
|
|
624
667
|
const url = r.out.trim() || null;
|
|
668
|
+
const lookupEvidence = {
|
|
669
|
+
...(typeof r.rc === 'number' ? { rc: r.rc } : {}),
|
|
670
|
+
...(stderrTailOf(r.err) ? { stderrTail: stderrTailOf(r.err) } : {}),
|
|
671
|
+
};
|
|
672
|
+
const lookupFailureEvidence = {
|
|
673
|
+
...lookupEvidence,
|
|
674
|
+
...(stderrTailOf(r.out) ? { stdoutTail: stderrTailOf(r.out) } : {}),
|
|
675
|
+
};
|
|
625
676
|
const outcome: FindPrForBranchOutcome = !r.ok
|
|
626
|
-
? { status: 'FAILED', url: null,
|
|
627
|
-
...(typeof r.rc === 'number' ? { rc: r.rc } : {}),
|
|
628
|
-
...(stderrTailOf(r.err || r.out) ? { stderrTail: stderrTailOf(r.err || r.out) } : {}) }
|
|
677
|
+
? { status: 'FAILED', url: null, ...lookupFailureEvidence }
|
|
629
678
|
: url
|
|
630
679
|
? { status: 'ok OUTPUT', url }
|
|
631
680
|
: { status: 'ok EMPTY', url: null };
|
|
681
|
+
if (r.ok) {
|
|
682
|
+
for (const [key, value] of Object.entries(lookupEvidence))
|
|
683
|
+
if (value !== undefined) Object.defineProperty(outcome, key, { value, enumerable: false });
|
|
684
|
+
}
|
|
632
685
|
debug.log('autopilot.pr-manager', 'lookup', {
|
|
633
686
|
branch,
|
|
634
687
|
// ⚠️ 조회는 --jq '.[0].url' 이라 최대 한 줄이다 — "매칭된 PR 수"가 아니라 "돌아온 URL 줄 수"다.
|
|
@@ -825,11 +878,22 @@ export function makePrManager(
|
|
|
825
878
|
const waitForPushRetry = input.waitForPushRetry ?? defaultWaitForPushRetry;
|
|
826
879
|
// ★ 칸 PR-CREATE-FAIL-OBSERVE-FU — push/gh 단계 관측을 쌓아 실패 시 한 incident 로.
|
|
827
880
|
const pushStage: PrCreateStageObservation = { stage: 'push', ran: false };
|
|
828
|
-
const ghStage: PrCreateStageObservation = {
|
|
881
|
+
const ghStage: PrCreateStageObservation = {
|
|
882
|
+
stage: 'gh', ran: false,
|
|
883
|
+
lookup: { stage: 'gh', ran: false },
|
|
884
|
+
create: { stage: 'gh', ran: false },
|
|
885
|
+
};
|
|
886
|
+
const observeGhCommand = (r: CmdResult): PrCreateStageObservation => ({
|
|
887
|
+
stage: 'gh', ran: true, ...(typeof r.rc === 'number' ? { rc: r.rc } : {}),
|
|
888
|
+
...(stderrTailOf(r.err) ? { stderrTail: stderrTailOf(r.err) } : {}),
|
|
889
|
+
...(stderrTailOf(r.out) ? { stdoutTail: stderrTailOf(r.out) } : {}),
|
|
890
|
+
});
|
|
829
891
|
const markGhRan = (r: CmdResult): CmdResult => {
|
|
830
892
|
ghStage.ran = true;
|
|
831
893
|
ghStage.rc = r.rc;
|
|
832
894
|
ghStage.stderrTail = stderrTailOf(r.err);
|
|
895
|
+
ghStage.stdoutTail = stderrTailOf(r.out);
|
|
896
|
+
ghStage.create = observeGhCommand(r);
|
|
833
897
|
return r;
|
|
834
898
|
};
|
|
835
899
|
const failedCreate = (reason: 'push' | 'gh', detail: string): UpsertPrOutcome =>
|
|
@@ -857,9 +921,16 @@ export function makePrManager(
|
|
|
857
921
|
const existing = findPrForBranchOutcome(input.branch, cwd);
|
|
858
922
|
if (existing.status !== 'SKIPPED') {
|
|
859
923
|
ghStage.ran = true;
|
|
924
|
+
ghStage.lookup = {
|
|
925
|
+
stage: 'gh', ran: true,
|
|
926
|
+
...(typeof existing.rc === 'number' ? { rc: existing.rc } : {}),
|
|
927
|
+
...(existing.stderrTail ? { stderrTail: existing.stderrTail } : {}),
|
|
928
|
+
...(existing.status === 'FAILED' && existing.stdoutTail ? { stdoutTail: existing.stdoutTail } : {}),
|
|
929
|
+
};
|
|
860
930
|
if (existing.status === 'FAILED') {
|
|
861
931
|
ghStage.rc = existing.rc;
|
|
862
932
|
ghStage.stderrTail = existing.stderrTail;
|
|
933
|
+
ghStage.stdoutTail = existing.stdoutTail;
|
|
863
934
|
}
|
|
864
935
|
}
|
|
865
936
|
if (existing.url) {
|
|
@@ -54,6 +54,7 @@ import type { CoreTurnDispatchTool } from '../core-turn/index.js';
|
|
|
54
54
|
import { elanousSelfAccessPrompt } from '../agent/self-ambient.js';
|
|
55
55
|
import { createToolCwdResolver, type ToolCwdResolver } from './tool-cwd.js';
|
|
56
56
|
import { resolveSessionProjectContext } from '../project/session-context.js';
|
|
57
|
+
import { buildUniversalPreamble, loadProjectAnchorWithMeta } from '../prompt-library/universal-preamble.js';
|
|
57
58
|
import { debug } from '../debug/log.js';
|
|
58
59
|
import { resolvePersonaAddress } from '../intake-plane/persona-answer.js';
|
|
59
60
|
import { awaitGlobalPersonaLoad, getGlobalPersonaRegistry } from '../persona/global-registry.js';
|
|
@@ -601,13 +602,34 @@ export function createDaemonRunTurn(
|
|
|
601
602
|
}
|
|
602
603
|
const killNonDetachedPty = opts.killNonDetachedPty;
|
|
603
604
|
|
|
605
|
+
// TUI-CONTINUE-SESSION (0.2.35) — inject the daemon TUI preamble once per
|
|
606
|
+
// runtime, even when `--continue` reattaches persisted history. Never use
|
|
607
|
+
// the ACP client's cwd as an anchor path; project/session context is server-owned.
|
|
608
|
+
const preambleInjectedSessions = new Set<string>();
|
|
609
|
+
|
|
604
610
|
const deps: CoreTurnBridgeDeps = {
|
|
605
611
|
// Persists the user message AND builds the LLM-facing list. See
|
|
606
612
|
// daemon-history-helper.ts for the per-turn shape. Cleanup C1
|
|
607
613
|
// moved this out of an inline closure to fix the user-message
|
|
608
614
|
// persistence bug uniformly across all daemon paths.
|
|
609
615
|
getMessages: ({ sessionId, userText, promptBlocks, promptMeta }) => {
|
|
610
|
-
const
|
|
616
|
+
const isFirstTurn = history.get(sessionId).length === 0;
|
|
617
|
+
const projectContext = resolveSessionProjectContext(sessionId);
|
|
618
|
+
const inputSource = readInputSourceMeta(promptMeta as Record<string, unknown> | undefined);
|
|
619
|
+
// The daemon API is the local CLI/TUI prompt route. Other ACP surfaces
|
|
620
|
+
// keep their existing system prompt unchanged.
|
|
621
|
+
const isDaemonTuiTurn = inputSource?.kind === 'daemon-api';
|
|
622
|
+
const anchorCwd = isDaemonTuiTurn ? projectContext?.cwd : undefined;
|
|
623
|
+
const firstTurnPreamble = anchorCwd && !preambleInjectedSessions.has(sessionId)
|
|
624
|
+
? buildUniversalPreamble({
|
|
625
|
+
cwd: anchorCwd,
|
|
626
|
+
...(surface.specs.length > 0 ? { enabledTools: surface.specs.map((spec) => spec.name) } : {}),
|
|
627
|
+
})
|
|
628
|
+
: [];
|
|
629
|
+
if (firstTurnPreamble.length > 0) preambleInjectedSessions.add(sessionId);
|
|
630
|
+
// `buildUniversalPreamble` carries the project AGENTS.md on the TUI's
|
|
631
|
+
// first attached turn. Do not also append `projectInstructions` there.
|
|
632
|
+
const projectInstructions = firstTurnPreamble.length > 0 ? undefined : projectContext?.instructions;
|
|
611
633
|
const baseSystemPrompt = [composeDaemonSystemPrompt(opts.systemPrompt, promptMeta, sessionId), projectInstructions]
|
|
612
634
|
.filter(Boolean).join('\n\n');
|
|
613
635
|
// Image-pipeline followup #4 (2026-05-05) — append daemon webterm
|
|
@@ -631,11 +653,21 @@ export function createDaemonRunTurn(
|
|
|
631
653
|
const hasNonTextBlock = !!promptBlocks?.some(
|
|
632
654
|
(b) => (b as { type?: string }).type !== 'text',
|
|
633
655
|
);
|
|
634
|
-
const isFirstTurn = history.get(sessionId).length === 0;
|
|
635
656
|
const messages = hasNonTextBlock
|
|
636
657
|
? appendUserPromptBlocksAndBuildMessages(history, sessionId, promptBlocks!, systemPrompt)
|
|
637
658
|
: appendUserAndBuildMessages(history, sessionId, userText, systemPrompt);
|
|
638
|
-
|
|
659
|
+
const withPersona = prependChatPersonaOnLaterTurn(messages, isFirstTurn);
|
|
660
|
+
if (firstTurnPreamble.length === 0) return withPersona;
|
|
661
|
+
const anchor = loadProjectAnchorWithMeta(anchorCwd!);
|
|
662
|
+
debug.log('boot.daemon-runtime', 'first-turn-universal-preamble', {
|
|
663
|
+
sessionId,
|
|
664
|
+
cwd: anchorCwd,
|
|
665
|
+
source: projectContext ? 'project' : 'daemon',
|
|
666
|
+
systemMessages: firstTurnPreamble.length,
|
|
667
|
+
anchorFiles: anchor.files.map((file) => file.filename),
|
|
668
|
+
localAnchorFiles: anchor.files.filter((file) => file.local).map((file) => file.filename),
|
|
669
|
+
});
|
|
670
|
+
return [...firstTurnPreamble, ...withPersona];
|
|
639
671
|
},
|
|
640
672
|
getTools: () => surface.specs,
|
|
641
673
|
dispatchTool: terminalCapableDispatch(surfaceHasPtyShell, async (name, args, ctx) => {
|
|
@@ -106,9 +106,10 @@ export async function dispatchPtyShellTool(
|
|
|
106
106
|
ctx?: DaemonToolDispatchCtx,
|
|
107
107
|
): Promise<unknown> {
|
|
108
108
|
switch (name) {
|
|
109
|
-
case 'PtyShellStart':
|
|
109
|
+
case 'PtyShellStart': {
|
|
110
110
|
// Autonomous surface — auto-approve the spawn (no HITL babysitting).
|
|
111
111
|
return dispatchPtyShellStart(args, { requireApproval: false });
|
|
112
|
+
}
|
|
112
113
|
case 'PtyShellPoll':
|
|
113
114
|
return dispatchPtyShellPoll(args);
|
|
114
115
|
case 'PtyShellSend':
|
|
@@ -286,6 +286,7 @@ export async function dispatchSelfImplement(
|
|
|
286
286
|
goalFile = (await authorGoal(goalSourceText, ctx.cwd, {
|
|
287
287
|
goalTitle: feature,
|
|
288
288
|
decomposeSteps: createDecomposeSteps(ctx.signal, {
|
|
289
|
+
repositoryRoot: ctx.cwd,
|
|
289
290
|
...(adversarialReview !== undefined ? { adversarialReview } : {}),
|
|
290
291
|
...(recentStepCounts !== undefined ? { recentStepCounts } : {}),
|
|
291
292
|
}),
|
|
@@ -6,6 +6,7 @@ export interface RunUsageInput {
|
|
|
6
6
|
site?: string | null;
|
|
7
7
|
role?: string | null;
|
|
8
8
|
phase?: string | null;
|
|
9
|
+
jobKind?: string | null;
|
|
9
10
|
model?: string | null;
|
|
10
11
|
billingProvider?: string | null;
|
|
11
12
|
billing?: BillingRoute | null;
|
|
@@ -30,9 +31,11 @@ export interface RunUsageRow {
|
|
|
30
31
|
runId: string;
|
|
31
32
|
role?: string;
|
|
32
33
|
site?: string;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
jobKind?: string;
|
|
35
|
+
/** by:'job' 행은 종류별·호스트 합산 표이므로 실지 않는다(첫 행 대표값 오표출 방지). */
|
|
36
|
+
model?: string;
|
|
37
|
+
billingProvider?: string;
|
|
38
|
+
billing?: string;
|
|
36
39
|
hostIds: string[];
|
|
37
40
|
calls: number;
|
|
38
41
|
inputTokens: number;
|
|
@@ -47,21 +50,23 @@ export interface RunUsageRow {
|
|
|
47
50
|
}
|
|
48
51
|
|
|
49
52
|
/** Aggregate llm-usage observations without turning unavailable prices into a known zero. */
|
|
50
|
-
export function rollupRunUsage(...[rows, opts]: [rows: readonly RunUsageInput[], opts?: { by?: 'run' | 'role' }]): RunUsageRow[] {
|
|
53
|
+
export function rollupRunUsage(...[rows, opts]: [rows: readonly RunUsageInput[], opts?: { by?: 'run' | 'role' | 'job' }]): RunUsageRow[] {
|
|
51
54
|
const groups = new Map<string, RunUsageRow>();
|
|
52
55
|
const byRole = opts?.by === 'role';
|
|
56
|
+
const byJob = opts?.by === 'job';
|
|
53
57
|
for (const data of rows) {
|
|
54
|
-
const runId = byRole ? '(all)' : data.runId ?? '(none)';
|
|
58
|
+
const runId = byRole || byJob ? '(all)' : data.runId ?? '(none)';
|
|
55
59
|
const role = data.role ?? '(none)';
|
|
56
60
|
const site = data.site ?? '(none)';
|
|
61
|
+
const jobKind = data.jobKind ?? '(none)';
|
|
57
62
|
const model = data.model ?? '(none)';
|
|
58
63
|
const billingProvider = data.billingProvider ?? '(none)';
|
|
59
64
|
const billing = data.billing ?? '(none)';
|
|
60
|
-
const key = JSON.stringify(byRole ? [role, site, model, billingProvider, billing] : [runId, model, billingProvider, billing]);
|
|
65
|
+
const key = JSON.stringify(byRole ? [role, site, model, billingProvider, billing] : byJob ? [jobKind] : [runId, model, billingProvider, billing]);
|
|
61
66
|
let row = groups.get(key);
|
|
62
67
|
if (!row) {
|
|
63
68
|
row = {
|
|
64
|
-
runId, ...(byRole ? { role, site } : {}), model, billingProvider, billing, hostIds: [], calls: 0,
|
|
69
|
+
runId, ...(byRole ? { role, site } : {}), ...(byJob ? { jobKind } : { model, billingProvider, billing }), hostIds: [], calls: 0,
|
|
65
70
|
inputTokens: 0, outputTokens: 0, cacheReadInputTokens: 0,
|
|
66
71
|
cacheCreationInputTokens: 0, reasoningOutputTokens: 0,
|
|
67
72
|
usdKnown: 0, unknownCostCalls: 0, includedCalls: 0, apiEquivalentUsd: 0,
|
|
@@ -458,6 +458,7 @@ function subscriptionFromCodexSnapshot(snap: UsageSnapshot): SubscriptionAxis {
|
|
|
458
458
|
* ⛔ 키가 없으면 행을 «안» 만든다(accounts=0 → 「없음」) — 키 없음은 «0달러»가 아니다.
|
|
459
459
|
* 📏 응답 모양(실측 2026-09-23): `{data:{total_credits, total_usage}}` (USD). */
|
|
460
460
|
export const OPENROUTER_CREDITS_ENDPOINT = 'https://openrouter.ai/api/v1/credits';
|
|
461
|
+
export const OPENROUTER_KEY_ENDPOINT = 'https://openrouter.ai/api/v1/key';
|
|
461
462
|
async function collectOpenRouterRows(deps: UnifiedUsageDeps): Promise<AccountUsageRow[]> {
|
|
462
463
|
// ⛔ 시험 런타임은 seam 이 없으면 «키 없음»으로 본다 — 키 캐시는 «파일»이라 env 스크럽을 통과해
|
|
463
464
|
// 기존 시험들이 실제 네트워크를 치게 된다(seam 을 모르는 옛 시험이 다수).
|
|
@@ -483,8 +484,27 @@ async function collectOpenRouterRows(deps: UnifiedUsageDeps): Promise<AccountUsa
|
|
|
483
484
|
const used = typeof body.data?.total_usage === 'number' ? body.data.total_usage : null;
|
|
484
485
|
if (total === null || used === null) return [{ ...base, credits: { status: 'error', detail: 'upstream-shape' } }];
|
|
485
486
|
const balance = Math.round((total - used) * 100) / 100;
|
|
487
|
+
let note: string | undefined;
|
|
488
|
+
try {
|
|
489
|
+
const keyRes = await (deps.fetchOpenRouterImpl ?? fetch)(OPENROUTER_KEY_ENDPOINT, {
|
|
490
|
+
headers: { authorization: `Bearer ${key}` },
|
|
491
|
+
signal: AbortSignal.timeout(10_000),
|
|
492
|
+
});
|
|
493
|
+
if (keyRes.ok) {
|
|
494
|
+
const keyBody = (await keyRes.json()) as { data?: { limit?: unknown; limit_remaining?: unknown } };
|
|
495
|
+
const limit = keyBody.data?.limit;
|
|
496
|
+
const limitRemaining = keyBody.data?.limit_remaining;
|
|
497
|
+
if (typeof limit === 'number' && Number.isFinite(limit)
|
|
498
|
+
&& typeof limitRemaining === 'number' && Number.isFinite(limitRemaining)) {
|
|
499
|
+
note = `키 한도 남은 금액 $${limitRemaining.toFixed(2)}`;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
} catch {
|
|
503
|
+
// Key metadata is optional; preserve the successful credits row when unavailable.
|
|
504
|
+
}
|
|
486
505
|
return [{
|
|
487
506
|
...base,
|
|
507
|
+
...(note ? { note } : {}),
|
|
488
508
|
credits: {
|
|
489
509
|
status: 'ok',
|
|
490
510
|
usedPercent: total > 0 ? Math.round((used / total) * 1000) / 10 : null,
|
|
@@ -70,6 +70,8 @@ export function providerLabel(entries: readonly RunLedgerEntry[]): string {
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
function blockReason(entry: RunLedgerEntry): string | undefined {
|
|
73
|
+
// Intermediate events (notably node-skipped(reason=condition)) are not stop reasons.
|
|
74
|
+
if (entry.event !== 'failed' && !(entry.event === 'run-status' && entry.data.runStatus === 'failed')) return undefined;
|
|
73
75
|
return stringField(entry.data, 'stopReason')
|
|
74
76
|
?? stringField(entry.data, 'reason')
|
|
75
77
|
?? stringField(entry.data, 'verdict')
|
|
@@ -95,11 +97,13 @@ export function classifyLedgerRun(entries: readonly RunLedgerEntry[], nowMs: num
|
|
|
95
97
|
).size;
|
|
96
98
|
const merged = [...entries].reverse().find((entry) => entry.event === 'merged' && entry.data.merged === true);
|
|
97
99
|
const drafted = [...entries].reverse().find((entry) => entry.event === 'pr-opened' && entry.data.draft !== false);
|
|
98
|
-
const failed = [...entries].reverse().find((entry) => entry.event === 'failed'
|
|
100
|
+
const failed = [...entries].reverse().find((entry) => entry.event === 'failed'
|
|
101
|
+
|| entry.event === 'run-status' && entry.data.runStatus === 'failed');
|
|
99
102
|
const outcome: OutcomeKind = merged ? 'landed' : drafted ? 'draft' : failed ? 'failed' : 'open';
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
+
// Only failure events may explain a stop. A trailing failed status marker can
|
|
104
|
+
// omit the reason supplied by an earlier failed event; intermediate skips cannot.
|
|
105
|
+
const reason = outcome === 'failed'
|
|
106
|
+
? [...entries].reverse().map(blockReason).find((value) => value !== undefined) ?? 'unclassified'
|
|
103
107
|
: undefined;
|
|
104
108
|
return {
|
|
105
109
|
provider: providerLabel(entries),
|