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,45 @@
|
|
|
1
|
+
/** Parent-only role selection for Task Agent launches. The child model is a separate axis. */
|
|
2
|
+
import { parseRoleLlmFlags } from '../llm/role-llm-cli.js';
|
|
3
|
+
import { isModelRole, parseRoleLlmEntry, roleLlmEnvName, type ModelRole, type RoleLlmSpec } from '../user-config.js';
|
|
4
|
+
|
|
5
|
+
const PARENT_ROLES = new Set<ModelRole>(['planning', 'classify', 'audit', 'review']);
|
|
6
|
+
|
|
7
|
+
export function taskParentRoleEnv(values: readonly string[]): Record<string, string> {
|
|
8
|
+
const env: Record<string, string> = {};
|
|
9
|
+
for (const value of values) {
|
|
10
|
+
const at = value.indexOf('=');
|
|
11
|
+
const role = value.slice(0, at);
|
|
12
|
+
if (at < 1 || !isModelRole(role) || !PARENT_ROLES.has(role)) {
|
|
13
|
+
throw new Error(`--role-llm 부모 역할이 아니다: ${JSON.stringify(value)}`);
|
|
14
|
+
}
|
|
15
|
+
let spec: RoleLlmSpec;
|
|
16
|
+
const raw = value.slice(at + 1);
|
|
17
|
+
if (raw.startsWith('{')) {
|
|
18
|
+
let parsed: unknown;
|
|
19
|
+
try { parsed = JSON.parse(raw); }
|
|
20
|
+
catch { throw new Error(`--role-llm JSON 을 읽을 수 없다: ${role}`); }
|
|
21
|
+
const entry = parseRoleLlmEntry(parsed);
|
|
22
|
+
if (!entry.ok) throw new Error(`--role-llm ${role}: ${entry.reason}`);
|
|
23
|
+
spec = entry.spec;
|
|
24
|
+
} else {
|
|
25
|
+
const parsed = parseRoleLlmFlags([value]);
|
|
26
|
+
if (!parsed.ok) throw new Error(`--role-llm ${parsed.message}`);
|
|
27
|
+
const selected = parsed.overrides[role];
|
|
28
|
+
if (!selected) throw new Error(`--role-llm 선택한 역할이 비었다: ${role}`);
|
|
29
|
+
spec = selected;
|
|
30
|
+
}
|
|
31
|
+
const name = roleLlmEnvName(role);
|
|
32
|
+
if (env[name] !== undefined) throw new Error(`--role-llm 같은 부모 역할을 두 번 고정했다: ${role}`);
|
|
33
|
+
env[name] = JSON.stringify(spec);
|
|
34
|
+
}
|
|
35
|
+
return env;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** A child model also powers planning unless the caller pinned planning explicitly. */
|
|
39
|
+
export function taskParentRolePinsForChild(
|
|
40
|
+
values: readonly string[], child?: { provider: string; model: string },
|
|
41
|
+
): string[] {
|
|
42
|
+
const env = taskParentRoleEnv(values);
|
|
43
|
+
if (!child || env[roleLlmEnvName('planning')] !== undefined) return [...values];
|
|
44
|
+
return [...values, `planning=${JSON.stringify({ provider: child.provider, model: child.model })}`];
|
|
45
|
+
}
|
|
@@ -6,16 +6,19 @@
|
|
|
6
6
|
* - 분해 규칙은 TC 몫 — 여기는 그 함수를 «주입 seam» 으로 받는다. 기본 seam 은 이 파일 한 곳(`DEFAULT_TIER_SIZED_DECOMPOSE`)에서만 정한다.
|
|
7
7
|
* - 분해기 «미배선»(seam 에 undefined 명시) = `decomposer-unavailable` → 종전처럼 한 덩어리 발사 ⊕ 기록. 기본 seam 은 TC 함수다.
|
|
8
8
|
* - 분해 «실패»(ok:false · throw · 불가피 이유 없는 상 조각 · 빈/잘못된 조각) → 발사 0 · 카드 failed(history `tier-split-failed`).
|
|
9
|
-
* - 관측: `debug.log('task-agent.hand', 'tier-split', {cid, fromTier, outcome, reason?, slices, unavoidable
|
|
9
|
+
* - 관측: `debug.log('task-agent.hand', 'tier-split', {cid, fromTier, outcome, reason?, slices, unavoidable,
|
|
10
|
+
* countScope:'accepted-slices', totalSlices, highSlices, unavoidableCount, unavoidableReasons})`.
|
|
10
11
|
*/
|
|
11
12
|
import { randomBytes } from 'node:crypto';
|
|
13
|
+
import { resolve } from 'node:path';
|
|
12
14
|
import { debug } from '../debug/log.js';
|
|
13
|
-
import { handTask, TASK_CARD_PREFIX, type HandTaskOptions, type HandTaskResult } from './task-hand.js';
|
|
15
|
+
import { handTask, nextMoveFor, parseChildLlm, taskAgentStatePath, updateTaskCard, writeTaskCards, TASK_CARD_PREFIX, type HandTaskOptions, type HandTaskResult, type TaskCard } from './task-hand.js';
|
|
14
16
|
|
|
15
17
|
// 분해 규칙·타입 정본 = TC `src/self-implement/goal-author-decompose.ts`(TIER-SIZED-DECOMPOSE · #29987).
|
|
16
18
|
import { decomposeToTierSizedSlices, type SizedSlice, type TierSizedDecomposeResult } from '../self-implement/goal-author-decompose.js';
|
|
19
|
+
import { DEVICE_FIRST_STEP } from '../self-implement/device-first.js';
|
|
17
20
|
export type { SizedSlice, TierSizedDecomposeResult };
|
|
18
|
-
export type TierSizedDecompose = (goal: string, opts?: { signal?: AbortSignal }) => Promise<TierSizedDecomposeResult>;
|
|
21
|
+
export type TierSizedDecompose = (goal: string, opts?: { signal?: AbortSignal; repositoryRoot?: string }) => Promise<TierSizedDecomposeResult>;
|
|
19
22
|
|
|
20
23
|
/** 기본 분해기 — TC `decomposeToTierSizedSlices`. seam 에 undefined 를 명시하면 «미배선»(decomposer-unavailable). */
|
|
21
24
|
export const DEFAULT_TIER_SIZED_DECOMPOSE: TierSizedDecompose | undefined = decomposeToTierSizedSlices;
|
|
@@ -40,8 +43,11 @@ export function composeSliceHandText(sliceGoal: string, parentText: string, mark
|
|
|
40
43
|
const label = INHERITED_PARENT_LABELS.exec(line)?.[1];
|
|
41
44
|
return label !== undefined && !sliceHas.has(label);
|
|
42
45
|
});
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
// 표지는 리뷰 범위를 나르므로 장치 우선 조각(총 2 이상)은 상속 줄이 없어도 남는다 —
|
|
47
|
+
// 다만 «물려받았다» 는 물려받은 줄에 대한 주장이므로 그 줄이 있을 때만 붙인다.
|
|
48
|
+
if (inherited.length === 0 && (marker.total < 2 || !sliceGoal.includes(`동작: ${DEVICE_FIRST_STEP}`))) return sliceGoal;
|
|
49
|
+
const inheritanceClaim = inherited.length > 0 ? ' 아래 계약·완료 경계는 부모 칸에서 물려받았다 — 이 조각 범위만 채운다.' : '';
|
|
50
|
+
const tag = `조각 ${marker.index}/${marker.total} — 부모 ${marker.cid ?? '(칸 없음)'}(${marker.fromTier}) 를 중 이하로 나눈 몫.${inheritanceClaim}`;
|
|
45
51
|
return [...sliceLines, tag, ...inherited].join('\n');
|
|
46
52
|
}
|
|
47
53
|
|
|
@@ -58,6 +64,12 @@ export function planTierSplit(result: TierSizedDecomposeResult): TierSplitPlan {
|
|
|
58
64
|
if (!slice.goal?.trim()) return { kind: 'blocked', reason: `empty-slice-goal: #${index + 1}` };
|
|
59
65
|
if (slice.tier === '상' && !slice.unavoidable?.trim()) return { kind: 'blocked', reason: `unjustified-상-slice: #${index + 1}` };
|
|
60
66
|
}
|
|
67
|
+
const deviceSlices = result.slices.filter((slice) => slice.deviceFirst === 'device-test');
|
|
68
|
+
if (deviceSlices.length === 0 && result.slices.some((slice) => slice.deviceFirst === 'feature'))
|
|
69
|
+
return { kind: 'blocked', reason: 'device-first-stage-missing' };
|
|
70
|
+
if (deviceSlices.length > 0 && (deviceSlices.length !== 1 || result.slices[0]?.deviceFirst !== 'device-test'
|
|
71
|
+
|| result.slices.slice(1).some((slice) => slice.deviceFirst !== 'feature')))
|
|
72
|
+
return { kind: 'blocked', reason: 'device-first-order-invalid' };
|
|
61
73
|
return { kind: 'split', slices: result.slices };
|
|
62
74
|
}
|
|
63
75
|
|
|
@@ -78,6 +90,14 @@ function record(data: Record<string, unknown>): void {
|
|
|
78
90
|
try { debug.log('task-agent.hand', 'tier-split', data); } catch { /* fail-soft */ }
|
|
79
91
|
}
|
|
80
92
|
|
|
93
|
+
function acceptedSliceCounts(slices: readonly SizedSlice[]) {
|
|
94
|
+
const unavoidableReasons = slices.filter((slice) => slice.tier === '상').map((slice) => slice.unavoidable!.trim());
|
|
95
|
+
// planTierSplit rejects every high slice without a reason, so the accepted
|
|
96
|
+
// high count and unavoidable count coincide. Keep both for the board axes.
|
|
97
|
+
return { countScope: 'accepted-slices' as const, totalSlices: slices.length, highSlices: unavoidableReasons.length,
|
|
98
|
+
unavoidableCount: unavoidableReasons.length, unavoidableReasons };
|
|
99
|
+
}
|
|
100
|
+
|
|
81
101
|
/**
|
|
82
102
|
* `tasks hand` 의 발사 앞단. 분해는 `--live` ⊕ tier 상|특 일 때만 — 중·하·tier 없음·shadow 는 `handTask` 그대로(분해 호출 0).
|
|
83
103
|
*/
|
|
@@ -88,7 +108,7 @@ export async function handTaskWithTierSplit(opts: TierSplitHandOptions): Promise
|
|
|
88
108
|
const decompose = 'decompose' in opts ? injected : DEFAULT_TIER_SIZED_DECOMPOSE;
|
|
89
109
|
const cid = hand.checklistId ?? null;
|
|
90
110
|
if (!decompose) {
|
|
91
|
-
record({ cid, fromTier, outcome: 'whole', reason: TIER_SPLIT_UNAVAILABLE, slices: [], unavoidable: [] });
|
|
111
|
+
record({ cid, fromTier, outcome: 'whole', reason: TIER_SPLIT_UNAVAILABLE, slices: [], unavoidable: [], ...acceptedSliceCounts([]) });
|
|
92
112
|
return { kind: 'whole', result: await handTask(hand), reason: TIER_SPLIT_UNAVAILABLE };
|
|
93
113
|
}
|
|
94
114
|
let plan: TierSplitPlan;
|
|
@@ -96,24 +116,74 @@ export async function handTaskWithTierSplit(opts: TierSplitHandOptions): Promise
|
|
|
96
116
|
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
97
117
|
const timedOut = new Promise<'timeout'>((resolve) => { timer = setTimeout(() => { controller.abort(); resolve('timeout'); }, decomposeTimeoutMs); });
|
|
98
118
|
try {
|
|
99
|
-
const raced = await Promise.race([decompose(hand.text.trim(), { signal: controller.signal
|
|
119
|
+
const raced = await Promise.race([decompose(hand.text.trim(), { signal: controller.signal,
|
|
120
|
+
...(hand.project ? { repositoryRoot: resolve(hand.project.target) } : {}) }), timedOut]);
|
|
100
121
|
plan = raced === 'timeout' ? { kind: 'blocked', reason: `decompose-timeout: ${decomposeTimeoutMs}ms` } : planTierSplit(raced);
|
|
101
122
|
} catch (error) {
|
|
102
123
|
plan = { kind: 'blocked', reason: `decompose-threw: ${String((error as Error)?.message ?? error).slice(0, 200)}` };
|
|
103
124
|
} finally { clearTimeout(timer); }
|
|
104
125
|
if (plan.kind === 'blocked') {
|
|
105
|
-
record({ cid, fromTier, outcome: 'blocked', reason: plan.reason, slices: [], unavoidable: [] });
|
|
126
|
+
record({ cid, fromTier, outcome: 'blocked', reason: plan.reason, slices: [], unavoidable: [], ...acceptedSliceCounts([]) });
|
|
106
127
|
return { kind: 'blocked', result: await handTask({ ...hand, tierSplitBlocked: plan.reason }), reason: plan.reason };
|
|
107
128
|
}
|
|
108
129
|
const group = `${TASK_CARD_PREFIX}split-${randomBytes(4).toString('hex')}`;
|
|
109
130
|
const total = plan.slices.length;
|
|
110
|
-
const
|
|
131
|
+
const counts = acceptedSliceCounts(plan.slices);
|
|
132
|
+
const unavoidable = counts.unavoidableReasons;
|
|
111
133
|
// 조각은 새 카드다 — 호출자 id·pr·goalId 를 조각마다 복제하면 «PR: #N» 조회·수확이 엇갈린다. 버린 것은 기록에 남긴다.
|
|
112
134
|
const dropped = { ...(hand.id ? { id: hand.id } : {}), ...(hand.cardFields?.pr !== undefined ? { pr: hand.cardFields.pr } : {}), ...(hand.cardFields?.goalId !== undefined ? { goalId: hand.cardFields.goalId } : {}) };
|
|
113
|
-
record({ cid, fromTier, outcome: 'split', group, ...(Object.keys(dropped).length ? { dropped } : {}), slices: plan.slices.map((s) => ({ tier: s.tier, files: s.files, behaviours: s.behaviours })), unavoidable
|
|
135
|
+
record({ cid, fromTier, outcome: 'split', group, ...(Object.keys(dropped).length ? { dropped } : {}), slices: plan.slices.map((s) => ({ tier: s.tier, files: s.files, behaviours: s.behaviours })), unavoidable: [...unavoidable],
|
|
136
|
+
...counts });
|
|
114
137
|
const { id: _wholeId, cardFields, ...rest } = hand;
|
|
115
138
|
const base = { ...rest, ...(cardFields?.handed !== undefined ? { cardFields: { handed: cardFields.handed } } : {}) };
|
|
116
139
|
const slices: TierSplitSliceOutcome[] = [];
|
|
140
|
+
// Device-first plans use the existing mission advance engine: only the test/device card starts.
|
|
141
|
+
// Feature cards carry an explicit `after` edge and `tasks advance` requires a merged PR before launch.
|
|
142
|
+
if (plan.slices[0]?.deviceFirst === 'device-test') {
|
|
143
|
+
const now = (hand.now ?? (() => new Date()))().toISOString();
|
|
144
|
+
const ids = plan.slices.map((_slice, index) => `${group}-${index + 1}`);
|
|
145
|
+
const mission: TaskCard = { id: group, text: hand.text, createdAt: now, status: 'handed', history: [],
|
|
146
|
+
pieces: ids, splitSource: 'device-first-tier-split', ...(hand.checklistId ? { checklistId: hand.checklistId } : {}),
|
|
147
|
+
...(hand.seat ? { seat: hand.seat } : {}) };
|
|
148
|
+
const drafts: TaskCard[] = plan.slices.map((slice, index) => ({
|
|
149
|
+
id: ids[index]!, text: composeSliceHandText(slice.goal, hand.text, { index: index + 1, total, fromTier, cid }),
|
|
150
|
+
createdAt: now, status: 'handed', history: [], mission: group,
|
|
151
|
+
after: index === 0 ? [] : [ids[0]!], tier: slice.tier,
|
|
152
|
+
tierSplit: { group, fromTier, index: index + 1, total, ...(slice.tier === '상' ? { unavoidable: slice.unavoidable!.trim() } : {}) },
|
|
153
|
+
...(hand.checklistId ? { checklistId: hand.checklistId } : {}),
|
|
154
|
+
...(hand.seat ? { seat: hand.seat } : {}),
|
|
155
|
+
...(hand.project ? { project: hand.project } : {}),
|
|
156
|
+
...(hand.completion ? { completion: hand.completion } : {}),
|
|
157
|
+
...(hand.taLand ? { taLand: true as const } : {}),
|
|
158
|
+
...(hand.childLlm ? { childLlm: parseChildLlm(hand.childLlm, hand.childLlmEffort) } : {}),
|
|
159
|
+
...(hand.parentRoleLlm?.length ? { parentRoleLlm: [...hand.parentRoleLlm] } : {}),
|
|
160
|
+
}));
|
|
161
|
+
writeTaskCards(hand.statePath ?? taskAgentStatePath(), [mission, ...drafts]);
|
|
162
|
+
const markFirstLaunchFailure = (reason: string) => {
|
|
163
|
+
updateTaskCard(hand.statePath ?? taskAgentStatePath(), group, (card) => card ? {
|
|
164
|
+
...card, status: 'failed', history: [...card.history, { at: new Date().toISOString(),
|
|
165
|
+
event: 'device-first-launch-failed', detail: reason }],
|
|
166
|
+
} : undefined);
|
|
167
|
+
};
|
|
168
|
+
for (const [index, slice] of plan.slices.entries()) {
|
|
169
|
+
if (index > 0) {
|
|
170
|
+
slices.push({ slice, result: { card: drafts[index]!, move: nextMoveFor(drafts[index]!), mode: hand.live ? 'live' : 'shadow', launched: false } });
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
const result = await handTask({ ...base, id: ids[0], text: drafts[0]!.text, tier: slice.tier,
|
|
175
|
+
mission: group, after: [], tierSplit: drafts[0]!.tierSplit });
|
|
176
|
+
slices.push({ slice, result });
|
|
177
|
+
if (hand.live && !result.launched) markFirstLaunchFailure(`first card not launched: ${result.card.status}`);
|
|
178
|
+
} catch (error) {
|
|
179
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
180
|
+
slices.push({ slice, error: reason });
|
|
181
|
+
markFirstLaunchFailure(reason);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
record({ cid, fromTier, outcome: 'device-first-deferred', group, first: ids[0], blockedUntilLanded: ids.slice(1) });
|
|
185
|
+
return { kind: 'split', group, fromTier, slices };
|
|
186
|
+
}
|
|
117
187
|
for (const [index, slice] of plan.slices.entries()) {
|
|
118
188
|
try {
|
|
119
189
|
const result = await handTask({ ...base, text: composeSliceHandText(slice.goal, hand.text, { index: index + 1, total, fromTier, cid }), tier: slice.tier,
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
* 4. 판정 신호(`verdictSignal` — 조건·관측·기대) ⊕ 현재 계약 한 줄(`contract`)
|
|
12
12
|
* 5. 경계(`boundary` — 대상 경로 · 건드리지 말 곳)
|
|
13
13
|
* 6. 예산(`budget` — 시간 · 모델 티어 · Pod 자리 · 재작업 상한)
|
|
14
|
-
* 7. 선행·짝 칸(`peers`)
|
|
14
|
+
* 7. 선행·짝 칸(`peers`) — 항목마다 조회된 상태(`state`)와 조회 시각(`observedAt`)을 보존한다
|
|
15
|
+
* (칸 이름만으로는 발사 시점의 상태를 알 수 없다 · 조회하지 않은 항목은 «모름»).
|
|
15
16
|
* 8. 선례 묶음(`precedents` — 같은 칸 앞 생애 결말·must-fix 서명)
|
|
16
17
|
* 9. 올림 규칙(`escalation` — 무엇이면 누구에게 · 돈·보안은 대표)
|
|
17
18
|
*
|
|
@@ -50,6 +51,21 @@ export interface WorkOrder {
|
|
|
50
51
|
escalation: string;
|
|
51
52
|
/** 입력에 없어 «모름»으로 채운 키. */
|
|
52
53
|
unknownFields: string[];
|
|
54
|
+
/**
|
|
55
|
+
* 선행 항목별 관측 — 지시서가 선행을 배열로 적었을 때만 있다(문자열 한 줄이면 종전 그대로 없다).
|
|
56
|
+
* 항목마다 조회된 상태와 그 상태를 조회한 시각을 보존하고, 조회하지 않은 값은 «모름»이다.
|
|
57
|
+
*/
|
|
58
|
+
dependencies?: WorkOrderDependency[];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** 선행 칸 하나의 관측 — 칸 이름 ⊕ 조회된 상태 ⊕ 그 상태를 본 시각. */
|
|
62
|
+
export interface WorkOrderDependency {
|
|
63
|
+
/** 선행 칸 id(또는 칸 이름). */
|
|
64
|
+
cell: string;
|
|
65
|
+
/** 조회된 상태(yellow·green·red …) — 조회하지 않았으면 «모름». */
|
|
66
|
+
state: string;
|
|
67
|
+
/** 상태를 조회한 시각(ISO 8601) — 조회하지 않았으면 «모름». */
|
|
68
|
+
observedAt: string;
|
|
53
69
|
}
|
|
54
70
|
|
|
55
71
|
export type ParseWorkOrderResult = { ok: true; order: WorkOrder } | { ok: false; reason: string };
|
|
@@ -63,6 +79,26 @@ function cellText(value: unknown): string {
|
|
|
63
79
|
catch { return WORK_ORDER_UNKNOWN; }
|
|
64
80
|
}
|
|
65
81
|
|
|
82
|
+
/**
|
|
83
|
+
* 선행 칸을 항목별 관측으로 읽는다 — 배열 원소가 객체면 `state`·`observedAt` 을 보존하고,
|
|
84
|
+
* 이름만 적힌 항목(문자열 등)은 조회하지 않은 것이므로 상태·시각 모두 «모름»으로 둔다.
|
|
85
|
+
* 선행 칸이 배열이 아니면(문자열 한 줄·없음) 항목 목록은 비어 있다 — 종전 문면 그대로다.
|
|
86
|
+
*/
|
|
87
|
+
function parseDependencies(value: unknown): WorkOrderDependency[] {
|
|
88
|
+
if (!Array.isArray(value)) return [];
|
|
89
|
+
return value.map((item) => {
|
|
90
|
+
if (item && typeof item === 'object' && !Array.isArray(item)) {
|
|
91
|
+
const record = item as Record<string, unknown>;
|
|
92
|
+
return {
|
|
93
|
+
cell: cellText(record['cell'] ?? record['cellId']),
|
|
94
|
+
state: cellText(record['state']),
|
|
95
|
+
observedAt: cellText(record['observedAt']),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return { cell: cellText(item), state: WORK_ORDER_UNKNOWN, observedAt: WORK_ORDER_UNKNOWN };
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
66
102
|
/**
|
|
67
103
|
* 지시서 JSON 원문을 검증한다. 깨진 JSON 은 `JSON 이 깨졌다: …`, 칸 id(문자열)가 없으면 `칸 id 가 없다`
|
|
68
104
|
* 하나로 거부하고, 그 밖의 빠진 칸은 «모름»으로 채운다(거부 아님).
|
|
@@ -84,7 +120,21 @@ export function parseWorkOrder(source: string): ParseWorkOrderResult {
|
|
|
84
120
|
if (value == null || (typeof value === 'string' && !value.trim())) unknownFields.push(field);
|
|
85
121
|
cells[field] = text;
|
|
86
122
|
}
|
|
87
|
-
|
|
123
|
+
const dependencies = parseDependencies(record['peers']);
|
|
124
|
+
return {
|
|
125
|
+
ok: true,
|
|
126
|
+
order: {
|
|
127
|
+
cellId: rawCellId.trim(), ...cells,
|
|
128
|
+
...(dependencies.length ? { dependencies } : {}),
|
|
129
|
+
unknownFields,
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** 선행 항목별 «상태 ⊕ 조회 시각» 한 줄 — 이름만 있는 항목은 «모름 (관측 모름)»으로 드러난다. */
|
|
135
|
+
function renderDependencies(dependencies: WorkOrderDependency[]): string {
|
|
136
|
+
const items = dependencies.map((dep) => `${dep.cell}=${dep.state} (관측 ${dep.observedAt})`);
|
|
137
|
+
return `선행 상태: ${items.join(' · ')}`;
|
|
88
138
|
}
|
|
89
139
|
|
|
90
140
|
/** 검증된 지시서를 사람이 읽는 골 문면으로 펼친다 — 첫 줄 «대상 경로:»(경계), 둘째 줄 «현재 계약:». */
|
|
@@ -99,6 +149,7 @@ export function renderWorkOrderGoal(order: WorkOrder): string {
|
|
|
99
149
|
`판정 신호: ${order.verdictSignal}`,
|
|
100
150
|
`예산: ${order.budget}`,
|
|
101
151
|
`선행·짝 칸: ${order.peers}`,
|
|
152
|
+
...(order.dependencies?.length ? [renderDependencies(order.dependencies)] : []),
|
|
102
153
|
`선례: ${order.precedents}`,
|
|
103
154
|
`올림 규칙: ${order.escalation}`,
|
|
104
155
|
].join('\n');
|
|
@@ -32,6 +32,7 @@ import {
|
|
|
32
32
|
type AcceptanceReport,
|
|
33
33
|
} from './acceptance.js';
|
|
34
34
|
import { recordOpsEventSafe, type OpsEventInput } from '../domains/ops-log.js';
|
|
35
|
+
import { defaultAnomalyCluster, extractContainerExit, type AnomalyCluster } from '../loops/orchestrator/anomaly-cluster.js';
|
|
35
36
|
|
|
36
37
|
// ───────────────────────── Concurrency caps ────────────────────────
|
|
37
38
|
|
|
@@ -82,6 +83,9 @@ export interface DispatcherOptions {
|
|
|
82
83
|
* acceptance.checks reference fs or subprocess (file-exists /
|
|
83
84
|
* file-contains / shell-zero). */
|
|
84
85
|
acceptanceIo?: AcceptanceIo;
|
|
86
|
+
/** ANOMALY-CLUSTER — grouping state written at the failure record point; while a signature has 3+ runs
|
|
87
|
+
* and no cause verdict, relaunches of that goal·host are deferred instead of spawned. */
|
|
88
|
+
anomalyCluster?: AnomalyCluster;
|
|
85
89
|
}
|
|
86
90
|
|
|
87
91
|
export interface DispatchTickResult {
|
|
@@ -95,7 +99,7 @@ export interface DispatchTickResult {
|
|
|
95
99
|
}>;
|
|
96
100
|
/** Ready tasks we skipped this tick due to caps. Caller may `tick()`
|
|
97
101
|
* again after any adapter completes. */
|
|
98
|
-
deferred: Array<{ taskId: string; reason: 'cap' | 'no-adapter' | 'intake-sequential' }>;
|
|
102
|
+
deferred: Array<{ taskId: string; reason: 'cap' | 'no-adapter' | 'intake-sequential' | 'anomaly-hold' }>;
|
|
99
103
|
}
|
|
100
104
|
|
|
101
105
|
export class TaskDispatcher {
|
|
@@ -103,10 +107,13 @@ export class TaskDispatcher {
|
|
|
103
107
|
private readonly activeByKind = new Map<TaskSurfaceKind, number>();
|
|
104
108
|
private readonly abortByTask = new Map<string, AbortController>();
|
|
105
109
|
private readonly now: () => number;
|
|
110
|
+
/** Production default is the process-wide cluster so tick-recorded failures gate relaunch here. */
|
|
111
|
+
private readonly anomaly: AnomalyCluster;
|
|
106
112
|
|
|
107
113
|
constructor(private readonly opts: DispatcherOptions) {
|
|
108
114
|
this.caps = { ...DEFAULT_CONCURRENCY_CAPS, ...(opts.concurrencyCaps ?? {}) };
|
|
109
115
|
this.now = opts.now ?? Date.now;
|
|
116
|
+
this.anomaly = opts.anomalyCluster ?? defaultAnomalyCluster();
|
|
110
117
|
}
|
|
111
118
|
|
|
112
119
|
/**
|
|
@@ -147,6 +154,12 @@ export class TaskDispatcher {
|
|
|
147
154
|
deferred.push({ taskId: task.id, reason: 'cap' });
|
|
148
155
|
continue;
|
|
149
156
|
}
|
|
157
|
+
// ANOMALY-CLUSTER relaunch gate: the task's goal·host relaunch is deferred while its signature has
|
|
158
|
+
// 3+ runs and no cause verdict has cleared it. Goal = task id, host = surface kind.
|
|
159
|
+
if (this.anomaly.hold(task.id, kind).hold) {
|
|
160
|
+
deferred.push({ taskId: task.id, reason: 'anomaly-hold' });
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
150
163
|
const result = this.spawn(task, adapter);
|
|
151
164
|
dispatched.push({
|
|
152
165
|
taskId: task.id,
|
|
@@ -220,6 +233,24 @@ export class TaskDispatcher {
|
|
|
220
233
|
}
|
|
221
234
|
}
|
|
222
235
|
|
|
236
|
+
/** Records one failed attempt into the anomaly cluster (goal·host key, host excluded from signature). */
|
|
237
|
+
private recordAnomalyFailure(task: Task, observation: { runId: string; kind: string; stage: string; lastLines: string[] }): void {
|
|
238
|
+
try {
|
|
239
|
+
this.anomaly.record({
|
|
240
|
+
goal: task.id,
|
|
241
|
+
host: task.surface.kind,
|
|
242
|
+
runId: observation.runId,
|
|
243
|
+
kind: observation.kind,
|
|
244
|
+
containerExit: extractContainerExit(observation.lastLines.join('\n')),
|
|
245
|
+
stage: observation.stage,
|
|
246
|
+
lastLines: observation.lastLines,
|
|
247
|
+
at: new Date(this.now()).toISOString(),
|
|
248
|
+
});
|
|
249
|
+
} catch {
|
|
250
|
+
// Observability must not alter dispatch admission or completion.
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
223
254
|
private recordOpsEvent(input: OpsEventInput): void {
|
|
224
255
|
try {
|
|
225
256
|
(this.opts.recordOpsEvent ?? recordOpsEventSafe)(input);
|
|
@@ -322,6 +353,8 @@ export class TaskDispatcher {
|
|
|
322
353
|
this.recordOps(task, 'cycle_end', nextStatus, { execStatus: exec.status, durationMs: exec.durationMs });
|
|
323
354
|
|
|
324
355
|
if (nextStatus === 'done') {
|
|
356
|
+
// Cause verdict — the same goal·host produced a clean run, so the relaunch hold is cleared.
|
|
357
|
+
this.anomaly.release(task.id, kind, '원인 판정: 실행이 정상 완료됨');
|
|
325
358
|
this.opts.bus?.emit({
|
|
326
359
|
kind: 'task-completed',
|
|
327
360
|
taskId: task.id,
|
|
@@ -337,6 +370,12 @@ export class TaskDispatcher {
|
|
|
337
370
|
reason: 'user',
|
|
338
371
|
});
|
|
339
372
|
} else {
|
|
373
|
+
this.recordAnomalyFailure(task, {
|
|
374
|
+
runId: exec.id,
|
|
375
|
+
kind: exec.status === 'timeout' ? 'timeout' : 'exit',
|
|
376
|
+
stage: 'monitor',
|
|
377
|
+
lastLines: [exec.error?.message ?? '', `Reason: ${exec.error?.code ?? 'UNKNOWN'}`],
|
|
378
|
+
});
|
|
340
379
|
this.opts.bus?.emit({
|
|
341
380
|
kind: 'task-failed',
|
|
342
381
|
taskId: task.id,
|
|
@@ -368,6 +407,12 @@ export class TaskDispatcher {
|
|
|
368
407
|
this.opts.store?.saveTask(this.opts.graph.getTask(task.id)!);
|
|
369
408
|
} catch { /* ignore illegal transition */ }
|
|
370
409
|
this.recordOps(task, 'cycle_end', 'failed', { errorCode: 'ADAPTER_ERROR', error: err instanceof Error ? err.message.slice(0, 120) : String(err) });
|
|
410
|
+
this.recordAnomalyFailure(task, {
|
|
411
|
+
runId: res.executionId,
|
|
412
|
+
kind: 'adapter-error',
|
|
413
|
+
stage: 'monitor',
|
|
414
|
+
lastLines: [err instanceof Error ? err.message : String(err)],
|
|
415
|
+
});
|
|
371
416
|
this.opts.bus?.emit({
|
|
372
417
|
kind: 'task-failed',
|
|
373
418
|
taskId: task.id,
|
|
@@ -82,6 +82,8 @@ export function buildDecomposePrompt(
|
|
|
82
82
|
|
|
83
83
|
const lines: string[] = [];
|
|
84
84
|
const isGoalAuthorCoarse = opts.profile === 'goal-author-coarse';
|
|
85
|
+
const measuredDeviceInventory = input.context?.activeSummary?.match(/^Device inventory \(measured at goal-author repository root\): .*$/mu)?.[0];
|
|
86
|
+
const measuredDevice = measuredDeviceInventory?.match(/^Device inventory \(measured at goal-author repository root\): (missing|existing): (src\/ux-sim\/[^\s,]+)$/u);
|
|
85
87
|
lines.push(
|
|
86
88
|
'You are the monad-agent Task Orchestrator decomposition planner.',
|
|
87
89
|
isGoalAuthorCoarse
|
|
@@ -205,6 +207,10 @@ export function buildDecomposePrompt(
|
|
|
205
207
|
'## Device-first decomposition (DEVICE-FIRST-AUTHORING — follow strictly)',
|
|
206
208
|
'### Existing device inventory (read from this checkout; use these names before proposing a new device)',
|
|
207
209
|
...deviceInventory(),
|
|
210
|
+
...(measuredDeviceInventory
|
|
211
|
+
? ['### Goal-author device check (measured at the target root; takes precedence over checkout inventory)',
|
|
212
|
+
measuredDeviceInventory,
|
|
213
|
+
...(measuredDevice ? [`- Use the measured ${measuredDevice[1]} status for ${measuredDevice[2]} instead of this checkout's inventory when choosing the device branch.`] : [])] : []),
|
|
208
214
|
'- The objective\'s verification plan (검증 계획/TDD) section picks a stage and ladder tier (무대·층) — e.g. a `src/ux-sim/*` stage at L2 (fake-llm·fake-bin·fake-clock). BEFORE writing slices, CHECK whether the mock device or injected event definition that this verification plan needs ALREADY EXISTS: look in `src/ux-sim/*`, the §1 device table of `docs/manual/MANUAL-ux-simulation-devices-2026-08-23.md`, and the event-monkey event kinds.',
|
|
209
215
|
'- Two branches — exactly one applies per needed device:',
|
|
210
216
|
' - Device EXISTS: its name MUST go into the verification plan wording — the slice that tests the feature carries the device\'s exact name (device file / §1 table row / event kind) in its acceptance criteria and reuses the device; never re-create it.',
|
|
@@ -126,8 +126,17 @@ export function planPodAccounts(
|
|
|
126
126
|
export function planOwnerCodexMirrorCandidates(candidates: readonly RotationCandidate[], options: {
|
|
127
127
|
accountOrder: readonly string[];
|
|
128
128
|
thresholdPercentByAccount?: Readonly<Record<string, unknown>>;
|
|
129
|
+
creditsAllowed?: boolean;
|
|
130
|
+
creditReserve?: number;
|
|
129
131
|
}): RotationCandidate[] {
|
|
130
132
|
const usable = new Set(planPodAccounts(candidates, { thresholdPercentByAccount: options.thresholdPercentByAccount }).usable);
|
|
133
|
+
// The parent has to install an access mirror before the remote Pod can use its
|
|
134
|
+
// credit fallback. Only a measured balance above the reserve admits that mirror.
|
|
135
|
+
if (usable.size === 0 && options.creditsAllowed) {
|
|
136
|
+
const reserve = typeof options.creditReserve === 'number' && Number.isFinite(options.creditReserve) && options.creditReserve >= 0
|
|
137
|
+
? options.creditReserve : CODEX_CREDIT_RESERVE_DEFAULT;
|
|
138
|
+
return creditCandidatesByBalance(candidates, reserve);
|
|
139
|
+
}
|
|
131
140
|
const rank = (name: string): number => {
|
|
132
141
|
const index = options.accountOrder.indexOf(name);
|
|
133
142
|
return index < 0 ? options.accountOrder.length : index;
|
|
@@ -7,6 +7,8 @@ import { fromJsonl, type LogRecord } from '../../mss/logging/record.js';
|
|
|
7
7
|
|
|
8
8
|
const FILE_LIMIT = 5 * 1024 * 1024;
|
|
9
9
|
const TOTAL_LIMIT = 20 * 1024 * 1024;
|
|
10
|
+
export const POD_SALVAGE_BUNDLE_FILE_LIMIT = 160 * 1024 * 1024;
|
|
11
|
+
export const POD_SALVAGE_BUNDLE_TOTAL_LIMIT = 180 * 1024 * 1024;
|
|
10
12
|
|
|
11
13
|
type Artifact = { path: string; bytes: Buffer };
|
|
12
14
|
type Incomplete = { path: string; reason: string };
|
|
@@ -50,13 +52,16 @@ export function parsePodArtifactChunks(logs: string): ParseResult {
|
|
|
50
52
|
}
|
|
51
53
|
const artifacts: Artifact[] = [];
|
|
52
54
|
const error: Incomplete[] = [];
|
|
53
|
-
let
|
|
55
|
+
let artifactBytes = 0;
|
|
56
|
+
let salvageBundleBytes = 0;
|
|
54
57
|
for (const [token, group] of groups) {
|
|
55
58
|
let path = token;
|
|
56
59
|
let reason = group.reason;
|
|
57
60
|
try {
|
|
58
61
|
path = decodePath(token);
|
|
59
62
|
if (!safeRelativePath(path)) throw new Error('unsafe relative path');
|
|
63
|
+
const salvageBundle = /^pod-salvage\/[a-zA-Z0-9._-]+\.bundle$/.test(path);
|
|
64
|
+
const fileLimit = salvageBundle ? POD_SALVAGE_BUNDLE_FILE_LIMIT : FILE_LIMIT;
|
|
60
65
|
if (!reason && group.chunks.size !== group.total) reason = 'missing chunk';
|
|
61
66
|
if (!reason) {
|
|
62
67
|
let encoded = '';
|
|
@@ -64,15 +69,20 @@ export function parsePodArtifactChunks(logs: string): ParseResult {
|
|
|
64
69
|
const chunk = group.chunks.get(i);
|
|
65
70
|
if (!chunk) { reason = 'missing chunk'; break; }
|
|
66
71
|
encoded += chunk;
|
|
67
|
-
if (encoded.length >
|
|
72
|
+
if (encoded.length > Math.ceil(fileLimit * 4 / 3) + 1024 * 1024) { reason = 'file too large'; break; }
|
|
68
73
|
}
|
|
69
74
|
if (!reason) {
|
|
70
75
|
const compressed = Buffer.from(encoded, 'base64');
|
|
71
76
|
if (compressed.toString('base64') !== encoded) throw new Error('invalid base64');
|
|
72
|
-
const bytes = gunzipSync(compressed, { maxOutputLength:
|
|
73
|
-
if (bytes.length >
|
|
74
|
-
else if (
|
|
75
|
-
|
|
77
|
+
const bytes = gunzipSync(compressed, { maxOutputLength: fileLimit + 1 });
|
|
78
|
+
if (bytes.length > fileLimit) reason = 'file too large';
|
|
79
|
+
else if ((salvageBundle ? salvageBundleBytes : artifactBytes) + bytes.length >
|
|
80
|
+
(salvageBundle ? POD_SALVAGE_BUNDLE_TOTAL_LIMIT : TOTAL_LIMIT)) reason = 'total too large';
|
|
81
|
+
else {
|
|
82
|
+
artifacts.push({ path, bytes });
|
|
83
|
+
if (salvageBundle) salvageBundleBytes += bytes.length;
|
|
84
|
+
else artifactBytes += bytes.length;
|
|
85
|
+
}
|
|
76
86
|
}
|
|
77
87
|
}
|
|
78
88
|
} catch (e) { reason = e instanceof Error ? e.message : String(e); }
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { decidePodReuseCleanup } from './pod-reuse-cleanup.js';
|
|
2
|
+
import type { WarmWorkerKey } from './pod-warm-worker-protocol.js';
|
|
3
|
+
|
|
4
|
+
/** An admitted si-v1 worker is identified by the pool, never by a Job name alone. */
|
|
5
|
+
export interface ChildPodLease {
|
|
6
|
+
workerId: string;
|
|
7
|
+
podUid: string;
|
|
8
|
+
leaseId: string;
|
|
9
|
+
generation: number;
|
|
10
|
+
key: WarmWorkerKey;
|
|
11
|
+
sourceSha: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface ChildPodReuseCommandResult {
|
|
15
|
+
status: number | null;
|
|
16
|
+
stdout?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ChildPodCleanupReceipt {
|
|
20
|
+
clean: boolean;
|
|
21
|
+
reason: string;
|
|
22
|
+
/** Known residual lower bound; null means unmeasured surfaces and no observed residue. */
|
|
23
|
+
observedResidue: number | null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Operations execute inside the admitted worker, after its child result and artifacts have been collected. */
|
|
27
|
+
export interface ChildPodReuseOperations {
|
|
28
|
+
stopChildProcesses: (lease: ChildPodLease) => Promise<{ remaining: number }>;
|
|
29
|
+
git: (lease: ChildPodLease, args: readonly string[]) => Promise<ChildPodReuseCommandResult>;
|
|
30
|
+
removeRunCredentials: (lease: ChildPodLease) => Promise<{ remaining: number }>;
|
|
31
|
+
returnLease: (lease: ChildPodLease, receipt: ChildPodCleanupReceipt) => Promise<void>;
|
|
32
|
+
quarantine: (lease: ChildPodLease, receipt: ChildPodCleanupReceipt) => Promise<void>;
|
|
33
|
+
observe: (event: 'return-decision' | 'clean-failed' | 'quarantine-failed', data: Record<string, unknown>) => void;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface ChildPodReturnResult {
|
|
37
|
+
outcome: 'returned' | 'quarantined';
|
|
38
|
+
reason: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* A completed child may return to the pool only after all four independent
|
|
43
|
+
* checks succeed. A missing return-decision observation also blocks return;
|
|
44
|
+
* the worker stays out of the lease pool until quarantine succeeds.
|
|
45
|
+
*/
|
|
46
|
+
export async function cleanAndReturnChildPod(
|
|
47
|
+
lease: ChildPodLease,
|
|
48
|
+
ops: ChildPodReuseOperations,
|
|
49
|
+
): Promise<ChildPodReturnResult> {
|
|
50
|
+
const facts = { workerId: lease.workerId, podUid: lease.podUid,
|
|
51
|
+
leaseId: lease.leaseId, generation: lease.generation };
|
|
52
|
+
const log = (event: Parameters<ChildPodReuseOperations['observe']>[0], data: Record<string, unknown>) => {
|
|
53
|
+
try { ops.observe(event, { ...facts, ...data }); } catch { /* logging must not return an unsafe lease */ }
|
|
54
|
+
};
|
|
55
|
+
let reason = '';
|
|
56
|
+
let observedResidue = 0;
|
|
57
|
+
let processMeasured = false;
|
|
58
|
+
let gitMeasured = false;
|
|
59
|
+
let credentialsMeasured = false;
|
|
60
|
+
let credentialsRemoved = false;
|
|
61
|
+
try {
|
|
62
|
+
if (!lease.workerId || !lease.podUid || !lease.leaseId || !lease.key
|
|
63
|
+
|| !Number.isSafeInteger(lease.generation) || lease.generation < 1
|
|
64
|
+
|| !lease.key.context || !lease.key.architecture
|
|
65
|
+
|| !/^sha256:[0-9a-f]{64}$/.test(lease.key.imageDigest)
|
|
66
|
+
|| !/^[0-9a-f]{64}$/.test(lease.key.lockHash)
|
|
67
|
+
|| !/^[0-9a-f]{40}$/.test(lease.sourceSha)) {
|
|
68
|
+
reason = 'invalid-lease';
|
|
69
|
+
} else {
|
|
70
|
+
const stopped = await ops.stopChildProcesses(lease);
|
|
71
|
+
if (Number.isSafeInteger(stopped.remaining) && stopped.remaining >= 0) {
|
|
72
|
+
observedResidue += stopped.remaining;
|
|
73
|
+
processMeasured = true;
|
|
74
|
+
}
|
|
75
|
+
if (!Number.isSafeInteger(stopped.remaining) || stopped.remaining !== 0) {
|
|
76
|
+
reason = 'child-processes-remain';
|
|
77
|
+
} else {
|
|
78
|
+
const plan = decidePodReuseCleanup({ base: lease.sourceSha, resetExitCode: 0,
|
|
79
|
+
cleanExitCode: 0, statusExitCode: 0, statusPorcelain: '' });
|
|
80
|
+
const reset = await ops.git(lease, plan.resetArgs);
|
|
81
|
+
if (reset.status !== 0) reason = 'reset-failed';
|
|
82
|
+
else {
|
|
83
|
+
const clean = await ops.git(lease, plan.cleanArgs);
|
|
84
|
+
if (clean.status !== 0) reason = 'clean-failed';
|
|
85
|
+
else {
|
|
86
|
+
const status = await ops.git(lease, plan.statusArgs);
|
|
87
|
+
if (status.status === 0 && typeof status.stdout === 'string') {
|
|
88
|
+
observedResidue += status.stdout.split('\0').filter(Boolean).length;
|
|
89
|
+
gitMeasured = true;
|
|
90
|
+
}
|
|
91
|
+
const decision = decidePodReuseCleanup({ base: lease.sourceSha,
|
|
92
|
+
resetExitCode: reset.status, cleanExitCode: clean.status,
|
|
93
|
+
statusExitCode: status.status, statusPorcelain: status.stdout ?? '' });
|
|
94
|
+
if (status.status === 0 && typeof status.stdout !== 'string') reason = 'status-unavailable';
|
|
95
|
+
else if (decision.outcome !== 'reuse') reason = decision.reason ?? 'worktree-not-clean';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
} catch (error) {
|
|
101
|
+
reason = `cleanup-error:${error instanceof Error ? error.message : String(error)}`;
|
|
102
|
+
}
|
|
103
|
+
// A failed process or Git check never skips credential revocation.
|
|
104
|
+
try {
|
|
105
|
+
const credentials = await ops.removeRunCredentials(lease);
|
|
106
|
+
credentialsRemoved = credentials.remaining === 0;
|
|
107
|
+
if (Number.isSafeInteger(credentials.remaining) && credentials.remaining >= 0) {
|
|
108
|
+
observedResidue += credentials.remaining;
|
|
109
|
+
credentialsMeasured = true;
|
|
110
|
+
}
|
|
111
|
+
if (!credentialsRemoved && !reason) reason = 'credentials-remain';
|
|
112
|
+
} catch (error) {
|
|
113
|
+
const credentialReason = `credential-revoke-error:${error instanceof Error ? error.message : String(error)}`;
|
|
114
|
+
reason = reason ? `${reason};${credentialReason}` : credentialReason;
|
|
115
|
+
}
|
|
116
|
+
if (!reason && credentialsRemoved) {
|
|
117
|
+
try {
|
|
118
|
+
// Git clean and credential revocation can reveal child processes that appeared after the
|
|
119
|
+
// pre-cleanup survey. A lease returns clean only when the re-survey immediately before
|
|
120
|
+
// returnLease also reports zero remaining processes.
|
|
121
|
+
const resurvey = await ops.stopChildProcesses(lease);
|
|
122
|
+
if (!Number.isSafeInteger(resurvey.remaining) || resurvey.remaining !== 0) {
|
|
123
|
+
reason = 'child-processes-resurfaced';
|
|
124
|
+
if (Number.isSafeInteger(resurvey.remaining) && resurvey.remaining > 0) observedResidue += resurvey.remaining;
|
|
125
|
+
} else {
|
|
126
|
+
// Eligibility is observed only after the final process re-survey succeeds.
|
|
127
|
+
ops.observe('return-decision', { ...facts, outcome: 'eligible' });
|
|
128
|
+
await ops.returnLease(lease, { clean: true, reason: 'clean', observedResidue: 0 });
|
|
129
|
+
log('return-decision', { outcome: 'returned' });
|
|
130
|
+
return { outcome: 'returned', reason: 'clean' };
|
|
131
|
+
}
|
|
132
|
+
} catch (error) {
|
|
133
|
+
reason = `return-or-observation-error:${error instanceof Error ? error.message : String(error)}`;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
log('clean-failed', { reason });
|
|
137
|
+
try { await ops.quarantine(lease, { clean: false, reason,
|
|
138
|
+
observedResidue: observedResidue > 0 || (processMeasured && gitMeasured && credentialsMeasured)
|
|
139
|
+
? observedResidue : null }); }
|
|
140
|
+
catch (error) {
|
|
141
|
+
log('quarantine-failed', { reason, error: error instanceof Error ? error.message : String(error) });
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
log('return-decision', { outcome: 'quarantined', reason });
|
|
145
|
+
return { outcome: 'quarantined', reason };
|
|
146
|
+
}
|