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,60 @@
|
|
|
1
|
+
// Shortest session-id prefix that still names exactly one session (TUI-RESUME-PICKER).
|
|
2
|
+
// Lists used to cut every id to 8 characters, so two sessions sharing those 8 looked the same and
|
|
3
|
+
// `/session load <shown prefix>` failed as ambiguous. `resolveSessionId` searches the whole index,
|
|
4
|
+
// so uniqueness is measured against every id there — not only the rows on screen.
|
|
5
|
+
import { listSessions } from './index.js';
|
|
6
|
+
|
|
7
|
+
/** Never shorter than this, so short lists keep the familiar 8-character look. */
|
|
8
|
+
export const SESSION_ID_PREFIX_MIN = 8;
|
|
9
|
+
|
|
10
|
+
function commonPrefixLength(a: string, b: string): number {
|
|
11
|
+
const n = Math.min(a.length, b.length);
|
|
12
|
+
let i = 0;
|
|
13
|
+
while (i < n && a.charCodeAt(i) === b.charCodeAt(i)) i++;
|
|
14
|
+
return i;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* For each id in `ids`, the shortest prefix (≥ `min`) that no other id in `universe` starts with.
|
|
19
|
+
* An id that is itself a prefix of another id gets the whole id (resolveSessionId takes an exact match).
|
|
20
|
+
*/
|
|
21
|
+
export function uniqueIdPrefixes(ids: readonly string[], universe: readonly string[], min = SESSION_ID_PREFIX_MIN): Map<string, string> {
|
|
22
|
+
const sorted = [...new Set([...universe, ...ids])].sort();
|
|
23
|
+
const position = new Map(sorted.map((id, i) => [id, i]));
|
|
24
|
+
const out = new Map<string, string>();
|
|
25
|
+
for (const id of ids) {
|
|
26
|
+
if (out.has(id)) continue;
|
|
27
|
+
const i = position.get(id)!;
|
|
28
|
+
// In sorted order the longest shared prefix is always with a direct neighbour.
|
|
29
|
+
const shared = Math.max(
|
|
30
|
+
i > 0 ? commonPrefixLength(id, sorted[i - 1]!) : 0,
|
|
31
|
+
i + 1 < sorted.length ? commonPrefixLength(id, sorted[i + 1]!) : 0,
|
|
32
|
+
);
|
|
33
|
+
out.set(id, id.slice(0, Math.min(id.length, Math.max(min, shared + 1))));
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** `uniqueIdPrefixes` against every session in the store (the set `/session load` resolves in). */
|
|
39
|
+
export function sessionIdPrefixes(ids: readonly string[], root?: string): Map<string, string> {
|
|
40
|
+
const universe = (root === undefined ? listSessions() : listSessions({}, root)).map((m) => m.id);
|
|
41
|
+
return uniqueIdPrefixes(ids, universe);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Display helper: the unique prefix of one id, padded so a column stays aligned. */
|
|
45
|
+
export function idPrefixCell(prefixes: ReadonlyMap<string, string>, id: string): string {
|
|
46
|
+
const width = Math.max(SESSION_ID_PREFIX_MIN, ...[...prefixes.values()].map((p) => p.length));
|
|
47
|
+
return (prefixes.get(id) ?? id.slice(0, SESSION_ID_PREFIX_MIN)).padEnd(width);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const pad2 = (n: number) => String(n).padStart(2, '0');
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* `MM-DD HH:mm` in the viewer's local time zone. Lists used to slice the stored UTC ISO string
|
|
54
|
+
* (`updatedAt.slice(5, 16)`), so a KST viewer saw 16:24 for a session touched at 01:24.
|
|
55
|
+
*/
|
|
56
|
+
export function sessionListTime(iso: string): string {
|
|
57
|
+
const d = new Date(iso);
|
|
58
|
+
if (Number.isNaN(d.getTime())) return iso.slice(5, 16).replace('T', ' ');
|
|
59
|
+
return `${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} ${pad2(d.getHours())}:${pad2(d.getMinutes())}`;
|
|
60
|
+
}
|
package/src/session/index.ts
CHANGED
|
@@ -304,6 +304,8 @@ export interface SerializedMessage {
|
|
|
304
304
|
toolArgs?: unknown;
|
|
305
305
|
toolResult?: unknown;
|
|
306
306
|
tokenEstimate?: number;
|
|
307
|
+
/** Goal-loop iteration reply, not the final assistant answer. */
|
|
308
|
+
goalInterim?: boolean;
|
|
307
309
|
/** Per-turn stable identifier. Auto-populated by `appendMessage` when the
|
|
308
310
|
* caller omits it (SAM S0 seed · M1.2 narrow). The wire format stays a
|
|
309
311
|
* bare 26-char ULID; external inputs should pass through `asTurnUri()`
|
|
@@ -1513,6 +1515,8 @@ export function resolveSessionId(
|
|
|
1513
1515
|
root: string = sessionRoot(),
|
|
1514
1516
|
): string | null {
|
|
1515
1517
|
const idx = readIndex(root);
|
|
1518
|
+
// A whole id wins even when it is also the start of a longer id — otherwise that session could never be named.
|
|
1519
|
+
if (idx.some(m => m.id === prefix)) return prefix;
|
|
1516
1520
|
const matches = idx.filter(m => m.id.startsWith(prefix));
|
|
1517
1521
|
if (matches.length === 0) return null;
|
|
1518
1522
|
if (matches.length > 1) {
|
|
@@ -1702,12 +1702,20 @@ function buildEssentialSessionRuntimeToolSpecs(opts: {
|
|
|
1702
1702
|
.map(tool => tool.spec)
|
|
1703
1703
|
: [];
|
|
1704
1704
|
});
|
|
1705
|
+
// External MCP proxy runtimes are registered asynchronously by the TUI boot
|
|
1706
|
+
// path and carry both `mcp` and `tui` surfaces. They are intentionally not
|
|
1707
|
+
// part of the fixed built-in family allowlist above; include these explicit
|
|
1708
|
+
// dynamic capabilities so ACP can advertise and dispatch their exact IDs.
|
|
1709
|
+
const mcpProxySpecs = opts.runtimeTools
|
|
1710
|
+
.filter(tool => tool.id.includes('.') && tool.surfaces?.includes('mcp') && tool.surfaces.includes('tui'))
|
|
1711
|
+
.filter(tool => isToolAvailable(tool.spec.name, opts.toolAvailability))
|
|
1712
|
+
.map(tool => tool.spec);
|
|
1705
1713
|
const optionalByName = new Map(opts.optionalTools.map(tool => [tool.name, tool] as const));
|
|
1706
1714
|
const optionalSpecs = ESSENTIAL_OPTIONAL_TOOL_NAMES
|
|
1707
1715
|
.map(name => optionalByName.get(name))
|
|
1708
1716
|
.filter((tool): tool is LLMToolSpec => !!tool)
|
|
1709
1717
|
.filter(tool => isToolAvailable(tool.name, opts.toolAvailability));
|
|
1710
|
-
return [...nativeSpecs, ...hostSpecs, ...runtimeSpecs, ...optionalSpecs];
|
|
1718
|
+
return [...nativeSpecs, ...hostSpecs, ...runtimeSpecs, ...mcpProxySpecs, ...optionalSpecs];
|
|
1711
1719
|
}
|
|
1712
1720
|
|
|
1713
1721
|
export function buildSessionRuntimeToolSpecs(opts: {
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
|
|
51
51
|
/// <reference path="./vendor-types.d.ts" />
|
|
52
52
|
|
|
53
|
-
import { spawnSync } from 'node:child_process';
|
|
53
|
+
import { spawnSync, type SpawnSyncOptionsWithStringEncoding } from 'node:child_process';
|
|
54
54
|
import { basename } from 'node:path';
|
|
55
55
|
import { debug } from './debug/log.js';
|
|
56
56
|
|
|
@@ -136,7 +136,8 @@ export function runPrintenvCapture(): Record<string, string> | null {
|
|
|
136
136
|
const shellStart = performance.now();
|
|
137
137
|
let res: ReturnType<typeof spawnSync>;
|
|
138
138
|
try {
|
|
139
|
-
|
|
139
|
+
// `detached` is honoured by spawnSync (uv_spawn → setsid) but missing from SpawnSyncOptions.
|
|
140
|
+
const opts: SpawnSyncOptionsWithStringEncoding & { detached: boolean } = {
|
|
140
141
|
env: seedEnv,
|
|
141
142
|
encoding: 'utf8',
|
|
142
143
|
timeout: TIMEOUT_MS,
|
|
@@ -144,7 +145,13 @@ export function runPrintenvCapture(): Record<string, string> | null {
|
|
|
144
145
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
145
146
|
// Don't inherit our stdio — rc files that run `clear` or issue
|
|
146
147
|
// OSC sequences would corrupt our TUI output otherwise.
|
|
147
|
-
|
|
148
|
+
// TUI-SIGTTIN-SUSPEND (10-23 n8n): an interactive shell opens /dev/tty even with stdin ignored and
|
|
149
|
+
// takes the terminal's foreground group for its own job control; it never hands it back (exec'd
|
|
150
|
+
// printenv · SIGKILL on timeout), so the TUI's next stdin read stops it with SIGTTIN. `detached`
|
|
151
|
+
// = setsid: no controlling tty, so the capture cannot touch the TUI's terminal at all.
|
|
152
|
+
detached: true,
|
|
153
|
+
};
|
|
154
|
+
res = spawnSync(shell, ['-l', '-i', '-c', 'printenv'], opts);
|
|
148
155
|
} catch {
|
|
149
156
|
logBootPhase('login-env.shell', shellStart, 'error');
|
|
150
157
|
return null;
|
|
@@ -169,7 +176,7 @@ export async function warmCapturedEnv(spawn: typeof Bun.spawn = Bun.spawn): Prom
|
|
|
169
176
|
const start = Date.now();
|
|
170
177
|
const shellStart = performance.now();
|
|
171
178
|
try {
|
|
172
|
-
const proc = spawn([seed.shell, '-l', '-i', '-c', 'printenv'], { env: seed.seedEnv as Record<string, string>, stdin: 'ignore', stdout: 'pipe', stderr: 'ignore' });
|
|
179
|
+
const proc = spawn([seed.shell, '-l', '-i', '-c', 'printenv'], { env: seed.seedEnv as Record<string, string>, stdin: 'ignore', stdout: 'pipe', stderr: 'ignore', detached: true });
|
|
173
180
|
// A grandchild (e.g. a pyenv rehash) can keep the stdout pipe open after the shell is killed,
|
|
174
181
|
// so the timeout settles the race itself instead of waiting for EOF.
|
|
175
182
|
let timer: ReturnType<typeof setTimeout> | undefined;
|
package/src/skills/runner.ts
CHANGED
|
@@ -171,7 +171,6 @@ import {
|
|
|
171
171
|
buildLlmRequestInstallTool,
|
|
172
172
|
dispatchLlmRequestInstall,
|
|
173
173
|
} from './tools/llm-install.js';
|
|
174
|
-
import { createInjectApprover } from '../dashboard/runtime/approvers.js';
|
|
175
174
|
import {
|
|
176
175
|
buildBrowserOpenTool,
|
|
177
176
|
buildBrowserNavigateTool,
|
|
@@ -1526,7 +1525,10 @@ async function executeSkillUnrecorded(
|
|
|
1526
1525
|
TerminalModalFocus: (a) => dispatchTerminalModalFocus(a),
|
|
1527
1526
|
TerminalModalDetach: (a) => dispatchTerminalModalDetach(a),
|
|
1528
1527
|
TerminalModalKill: (a) => dispatchTerminalModalKill(a),
|
|
1529
|
-
TerminalModalInject: (a) =>
|
|
1528
|
+
TerminalModalInject: async (a) => {
|
|
1529
|
+
const { createInjectApprover } = await import('../dashboard/runtime/approvers.js');
|
|
1530
|
+
return dispatchTerminalModalInject(a, { approver: createInjectApprover() });
|
|
1531
|
+
},
|
|
1530
1532
|
// H5 P2 · embodied-agent TTY observability.
|
|
1531
1533
|
SnapshotPtyState: (a) => dispatchSnapshotPtyState(a),
|
|
1532
1534
|
ListPtySnapshots: (a) => dispatchListPtySnapshots(a),
|
|
@@ -119,11 +119,121 @@ export function countSessionBackgroundFanout(session: object): number {
|
|
|
119
119
|
return backgroundFanoutSlots.get(session) ?? 0;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
/** Release one of this session's fan-out slots (floors at zero)
|
|
122
|
+
/** Release one of this session's fan-out slots (floors at zero) and hand the
|
|
123
|
+
* freed slot to the next waiting launch (see `admitNextBackgroundAdmission`). */
|
|
123
124
|
function releaseBackgroundFanoutSlot(session: object): void {
|
|
124
125
|
const live = backgroundFanoutSlots.get(session);
|
|
125
126
|
if (live === undefined || live <= 1) backgroundFanoutSlots.delete(session);
|
|
126
127
|
else backgroundFanoutSlots.set(session, live - 1);
|
|
128
|
+
admitNextBackgroundAdmission(session);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Admission class for a waiting background launch. A launch that names a
|
|
132
|
+
* concrete agent definition is a SUBAGENT spawn (the parent asked for a
|
|
133
|
+
* specific worker); the default general-purpose fan-out is a GENERAL worker.
|
|
134
|
+
* Subagent spawns enter the shared queue first because they carry the
|
|
135
|
+
* parent's explicit delegation intent — a general worker can be re-issued
|
|
136
|
+
* in the foreground at no cost, a named subagent cannot. */
|
|
137
|
+
export type BackgroundAdmissionPriority = 'subagent' | 'general';
|
|
138
|
+
|
|
139
|
+
/** A launch waiting for a fan-out slot. `seq` is the process-wide arrival
|
|
140
|
+
* ordinal; equal-priority entries are admitted oldest-first (FIFO). */
|
|
141
|
+
export interface BackgroundAdmissionEntry {
|
|
142
|
+
priority: BackgroundAdmissionPriority;
|
|
143
|
+
seq: number;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Pick the index of the next entry to admit from a waiting queue: subagent
|
|
147
|
+
* entries before general ones, oldest (`seq`) first inside a class.
|
|
148
|
+
* Returns -1 for an empty queue. Pure — the queue order itself never has to
|
|
149
|
+
* be pre-sorted. */
|
|
150
|
+
export function selectNextAdmissionIndex(
|
|
151
|
+
entries: readonly BackgroundAdmissionEntry[],
|
|
152
|
+
): number {
|
|
153
|
+
let oldestSubagent = -1;
|
|
154
|
+
let oldestAny = -1;
|
|
155
|
+
for (let i = 0; i < entries.length; i++) {
|
|
156
|
+
const entry = entries[i]!;
|
|
157
|
+
if (oldestAny === -1 || entry.seq < entries[oldestAny]!.seq) oldestAny = i;
|
|
158
|
+
if (
|
|
159
|
+
entry.priority === 'subagent'
|
|
160
|
+
&& (oldestSubagent === -1 || entry.seq < entries[oldestSubagent]!.seq)
|
|
161
|
+
) {
|
|
162
|
+
oldestSubagent = i;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return oldestSubagent >= 0 ? oldestSubagent : oldestAny;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** Classify a dispatch for admission priority (see BackgroundAdmissionPriority). */
|
|
169
|
+
export function classifyBackgroundAdmissionPriority(
|
|
170
|
+
requestedType: string,
|
|
171
|
+
): BackgroundAdmissionPriority {
|
|
172
|
+
return requestedType === 'general-purpose' ? 'general' : 'subagent';
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
interface QueuedBackgroundAdmission extends BackgroundAdmissionEntry {
|
|
176
|
+
admit: () => void;
|
|
177
|
+
abandon: () => void;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** The SHARED waiting queue, per session (same scope as the slot ledger, so
|
|
181
|
+
* a busy session's waiters cannot head-of-line block another session).
|
|
182
|
+
* Entries live only while the fan-out ceiling is full and their launch
|
|
183
|
+
* opted in with `wait_for_slot`; every other launch keeps the immediate
|
|
184
|
+
* `background-fanout-limit` refusal. */
|
|
185
|
+
const backgroundAdmissionQueues = new WeakMap<object, QueuedBackgroundAdmission[]>();
|
|
186
|
+
let backgroundAdmissionSeq = 0;
|
|
187
|
+
|
|
188
|
+
/** Park this launch on the session's shared queue and resolve `true` when it
|
|
189
|
+
* is admitted — the admitting release has ALREADY reserved the slot for it,
|
|
190
|
+
* so no dispatch can slip in between the handoff and the spawn. Resolves
|
|
191
|
+
* `false` when the caller's abort signal fires while it waits. */
|
|
192
|
+
function waitForBackgroundFanoutSlot(
|
|
193
|
+
session: object,
|
|
194
|
+
priority: BackgroundAdmissionPriority,
|
|
195
|
+
signal?: AbortSignal,
|
|
196
|
+
): Promise<boolean> {
|
|
197
|
+
if (signal?.aborted) return Promise.resolve(false);
|
|
198
|
+
return new Promise<boolean>((resolve) => {
|
|
199
|
+
let settled = false;
|
|
200
|
+
const entry: QueuedBackgroundAdmission = {
|
|
201
|
+
priority,
|
|
202
|
+
seq: backgroundAdmissionSeq++,
|
|
203
|
+
admit: () => finish(true),
|
|
204
|
+
abandon: () => finish(false),
|
|
205
|
+
};
|
|
206
|
+
// Always mutate the CURRENT queue (never a snapshot): entries settle out of
|
|
207
|
+
// order under priority admission, and writing back a stale array would
|
|
208
|
+
// resurrect an entry that was already admitted or abandoned.
|
|
209
|
+
function finish(admitted: boolean): void {
|
|
210
|
+
if (settled) return;
|
|
211
|
+
settled = true;
|
|
212
|
+
signal?.removeEventListener('abort', onAbort);
|
|
213
|
+
const rest = (backgroundAdmissionQueues.get(session) ?? []).filter(e => e !== entry);
|
|
214
|
+
if (rest.length > 0) backgroundAdmissionQueues.set(session, rest);
|
|
215
|
+
else backgroundAdmissionQueues.delete(session);
|
|
216
|
+
resolve(admitted);
|
|
217
|
+
}
|
|
218
|
+
const onAbort = (): void => { entry.abandon(); };
|
|
219
|
+
const queue = backgroundAdmissionQueues.get(session) ?? [];
|
|
220
|
+
queue.push(entry);
|
|
221
|
+
backgroundAdmissionQueues.set(session, queue);
|
|
222
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/** Admit exactly one waiter for a slot that just opened, reserving the slot
|
|
227
|
+
* in this same synchronous block as the release. Selection is delegated to
|
|
228
|
+
* the pure `selectNextAdmissionIndex` (subagent first, FIFO inside a class). */
|
|
229
|
+
function admitNextBackgroundAdmission(session: object): void {
|
|
230
|
+
const queue = backgroundAdmissionQueues.get(session);
|
|
231
|
+
if (!queue || queue.length === 0) return;
|
|
232
|
+
const index = selectNextAdmissionIndex(queue);
|
|
233
|
+
if (index < 0) return;
|
|
234
|
+
const entry = queue[index]!;
|
|
235
|
+
backgroundFanoutSlots.set(session, countSessionBackgroundFanout(session) + 1);
|
|
236
|
+
entry.admit();
|
|
127
237
|
}
|
|
128
238
|
|
|
129
239
|
/** Fallback agent when subagent_type is missing or unresolvable. The
|
|
@@ -161,6 +271,12 @@ export interface AgentToolArgs {
|
|
|
161
271
|
* child keeps running; completion emits a task-notification
|
|
162
272
|
* (P2) which the parent sees in the next turn's user message. */
|
|
163
273
|
run_in_background?: boolean;
|
|
274
|
+
/** When true, a background launch that hits the fan-out ceiling WAITS on
|
|
275
|
+
* the session's shared admission queue instead of being refused: it spawns
|
|
276
|
+
* as soon as a live background agent terminals (subagent waits are
|
|
277
|
+
* admitted before general-purpose ones, FIFO inside each class). Omitted
|
|
278
|
+
* or false keeps the immediate `background-fanout-limit` refusal. */
|
|
279
|
+
wait_for_slot?: boolean;
|
|
164
280
|
/** UI label for this spawn — shown on agent-roster so siblings
|
|
165
281
|
* sharing a definition are distinguishable. Takes precedence
|
|
166
282
|
* over `description` as task.label. */
|
|
@@ -230,6 +346,10 @@ export function buildAgentTool(): LLMToolSpec {
|
|
|
230
346
|
' • You want to fan out N independent workers in parallel — call Agent N times in the same turn; each runs independently.\n' +
|
|
231
347
|
' • A SKILL.md instructs you to "spawn N expert agents" / "use the Agent tool" — that is exactly this tool.\n' +
|
|
232
348
|
'\n' +
|
|
349
|
+
'Delegate heavy multistep work that would overflow your context, fan out independent units in parallel, ' +
|
|
350
|
+
'and hand off long investigations; use run_in_background for long-running work so you can keep coordinating ' +
|
|
351
|
+
'and finish after the results arrive.\n' +
|
|
352
|
+
'\n' +
|
|
233
353
|
'The sub-agent gets its own tools (Bash/Read/Edit/Grep/WebFetch by default) and its own ' +
|
|
234
354
|
'turn budget (default 20). It returns ONE final message which becomes your tool_result. ' +
|
|
235
355
|
'Pass everything the worker needs (data, persona, framing) inside `prompt` — the worker ' +
|
|
@@ -257,6 +377,10 @@ export function buildAgentTool(): LLMToolSpec {
|
|
|
257
377
|
type: 'boolean',
|
|
258
378
|
description: 'When true, returns the spawn handle immediately instead of waiting for completion. The child keeps running; its final message arrives in your next turn as a <task-notification> user message. Use for long-running explorations (multi-minute research, 10+ tool calls) so you can keep working in parallel.',
|
|
259
379
|
},
|
|
380
|
+
wait_for_slot: {
|
|
381
|
+
type: 'boolean',
|
|
382
|
+
description: 'Only meaningful with run_in_background. When the per-session background fan-out ceiling is already full, this launch waits on the shared admission queue instead of being refused, and spawns as soon as one live background agent finishes. Waiting subagent spawns (ones that name a subagent_type) are admitted before general-purpose ones; launches with the same class keep arrival order. Omit it to get the immediate "NOT SPAWNED" refusal and re-issue later.',
|
|
383
|
+
},
|
|
260
384
|
name: {
|
|
261
385
|
type: 'string',
|
|
262
386
|
description: 'Optional UI label for this spawn (shown in agent-roster / logs). Useful when fanning out N workers with the same subagent_type — give each a distinct name so the roster can tell them apart.',
|
|
@@ -277,12 +401,12 @@ export function buildAgentTool(): LLMToolSpec {
|
|
|
277
401
|
},
|
|
278
402
|
tool_filter: {
|
|
279
403
|
type: 'object',
|
|
280
|
-
description: 'Optional per-spawn tool
|
|
404
|
+
description: 'Optional per-spawn tool filter. The sub-agent inherits the parent\'s full tool registry by default; usually omit this field. Only `deny` is applied (hide specific tools). `allow` is ignored unless the user explicitly enabled narrowing, so do not try to restrict the child with it.',
|
|
281
405
|
properties: {
|
|
282
406
|
allow: {
|
|
283
407
|
type: 'array',
|
|
284
408
|
items: { type: 'string' },
|
|
285
|
-
description: '
|
|
409
|
+
description: 'Ignored by default (the child keeps every tool). Applied only when the user explicitly enabled narrowing; then unknown names are ignored with a warning and a filter that would leave 0 tools is refused (NOT SPAWNED).',
|
|
286
410
|
},
|
|
287
411
|
deny: {
|
|
288
412
|
type: 'array',
|
|
@@ -383,6 +507,7 @@ export async function dispatchAgent(
|
|
|
383
507
|
|
|
384
508
|
// PFC-S1 P1: new optional fields.
|
|
385
509
|
const runInBackground = args.run_in_background === true;
|
|
510
|
+
const waitsForSlot = args.wait_for_slot === true;
|
|
386
511
|
const spawnName = typeof args.name === 'string' && args.name.trim() ? args.name.trim() : undefined;
|
|
387
512
|
const teamName = typeof args.team_name === 'string' && args.team_name.trim() ? args.team_name.trim() : undefined;
|
|
388
513
|
const isolation = args.isolation === 'worktree' || args.isolation === 'cwd'
|
|
@@ -498,41 +623,82 @@ export async function dispatchAgent(
|
|
|
498
623
|
// slot re-opens the moment any background agent finishes, which is what
|
|
499
624
|
// lets the next launch through again.
|
|
500
625
|
let fanoutSession: object | undefined;
|
|
626
|
+
// Set when the shared admission queue handed this dispatch its slot while it
|
|
627
|
+
// waited (see `admitNextBackgroundAdmission`) — the reservation block below
|
|
628
|
+
// must then not take a second one.
|
|
629
|
+
let fanoutSlotReserved = false;
|
|
501
630
|
if (runInBackground) {
|
|
502
631
|
// Per-session scope: slots count against THIS session's cache
|
|
503
632
|
// identity (shared fallback bucket for cache-less callers), so a
|
|
504
633
|
// busy OTHER session cannot starve this one's first launch.
|
|
505
634
|
fanoutSession = opts.sessionCache ?? UNSCOPED_BACKGROUND_FANOUT_SESSION;
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
635
|
+
if (countSessionBackgroundFanout(fanoutSession) >= AGENT_TOOL_BACKGROUND_FANOUT_CEILING) {
|
|
636
|
+
// Not spawned: no registry task, no provider call, no cache entry.
|
|
637
|
+
// taskId is a sentinel (like 'dedup' above) so a caller can tell a
|
|
638
|
+
// refusal from a real spawn without parsing the prose. The live count
|
|
639
|
+
// is re-read here so an abandoned wait reports the current number.
|
|
640
|
+
const refuseForCeiling = (): AgentToolResult => {
|
|
641
|
+
const liveBackground = countSessionBackgroundFanout(fanoutSession!);
|
|
642
|
+
debug.log('agent.spawn', 'background-fanout-limit', {
|
|
643
|
+
cid: debugCorrelationId,
|
|
644
|
+
requestedType,
|
|
645
|
+
description: description.slice(0, 80),
|
|
646
|
+
liveBackground,
|
|
647
|
+
ceiling: AGENT_TOOL_BACKGROUND_FANOUT_CEILING,
|
|
648
|
+
}, { level: 'warn' });
|
|
649
|
+
return {
|
|
650
|
+
output:
|
|
651
|
+
`NOT SPAWNED — ${liveBackground} background agents are already live and the ` +
|
|
652
|
+
`fan-out ceiling is ${AGENT_TOOL_BACKGROUND_FANOUT_CEILING}. A slot reopens as ` +
|
|
653
|
+
`soon as one of them reaches a terminal state (done/error/aborted); its result ` +
|
|
654
|
+
`then arrives as a task-notification. Either wait for one to finish, fold this ` +
|
|
655
|
+
`work into an existing background spawn, or re-issue it without ` +
|
|
656
|
+
`run_in_background so it runs in the foreground.`,
|
|
657
|
+
agent: requestedType,
|
|
658
|
+
cid: debugCorrelationId,
|
|
659
|
+
durationMs: 0,
|
|
660
|
+
maxTurns: requestedMaxTurns,
|
|
661
|
+
taskId: 'background-fanout-limit',
|
|
662
|
+
};
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
// Shared waiting queue — opt-in only. Launches that did not pass
|
|
666
|
+
// `wait_for_slot` keep the immediate refusal above, byte for byte.
|
|
667
|
+
if (!waitsForSlot) return refuseForCeiling();
|
|
668
|
+
|
|
669
|
+
const admissionPriority = classifyBackgroundAdmissionPriority(requestedType);
|
|
670
|
+
debug.log('agent.spawn', 'background-queue-wait', {
|
|
509
671
|
cid: debugCorrelationId,
|
|
510
672
|
requestedType,
|
|
511
673
|
description: description.slice(0, 80),
|
|
512
|
-
|
|
674
|
+
priority: admissionPriority,
|
|
675
|
+
liveBackground: countSessionBackgroundFanout(fanoutSession),
|
|
513
676
|
ceiling: AGENT_TOOL_BACKGROUND_FANOUT_CEILING,
|
|
514
677
|
}, { level: 'warn' });
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
678
|
+
const admitted = await waitForBackgroundFanoutSlot(fanoutSession, admissionPriority, opts.signal);
|
|
679
|
+
if (!admitted) {
|
|
680
|
+
debug.log('agent.spawn', 'background-queue-abandoned', {
|
|
681
|
+
cid: debugCorrelationId,
|
|
682
|
+
requestedType,
|
|
683
|
+
description: description.slice(0, 80),
|
|
684
|
+
priority: admissionPriority,
|
|
685
|
+
reason: 'aborted-while-waiting',
|
|
686
|
+
}, { level: 'warn' });
|
|
687
|
+
return refuseForCeiling();
|
|
688
|
+
}
|
|
689
|
+
// The admitting release already reserved this dispatch's slot.
|
|
690
|
+
fanoutSlotReserved = true;
|
|
691
|
+
debug.log('agent.spawn', 'background-queue-admit', {
|
|
527
692
|
cid: debugCorrelationId,
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
693
|
+
requestedType,
|
|
694
|
+
description: description.slice(0, 80),
|
|
695
|
+
priority: admissionPriority,
|
|
696
|
+
liveBackground: countSessionBackgroundFanout(fanoutSession),
|
|
697
|
+
});
|
|
532
698
|
}
|
|
533
699
|
}
|
|
534
700
|
|
|
535
|
-
if (fanoutSession !== undefined) {
|
|
701
|
+
if (fanoutSession !== undefined && !fanoutSlotReserved) {
|
|
536
702
|
// Atomic reservation: taken in the SAME synchronous block as the
|
|
537
703
|
// ceiling check above, before any await — concurrent dispatches
|
|
538
704
|
// cannot all pass the check and push this session past the ceiling
|
|
@@ -716,32 +882,44 @@ export async function dispatchAgent(
|
|
|
716
882
|
// Strip the Agent tool itself from the sub-agent's available tools.
|
|
717
883
|
// One level of nesting only — see file header rationale.
|
|
718
884
|
childTools = stripAgentToolForOneLevelNesting(childTools);
|
|
719
|
-
// Wave 5 E1 — apply per-spawn tool_filter.
|
|
720
|
-
//
|
|
721
|
-
//
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
: null;
|
|
730
|
-
const denyList = Array.isArray(toolFilter.deny)
|
|
731
|
-
? new Set((toolFilter.deny as unknown[]).filter((n): n is string => typeof n === 'string'))
|
|
732
|
-
: null;
|
|
733
|
-
childTools = childTools.filter((t) => {
|
|
734
|
-
if (denyList && denyList.has(t.name)) return false;
|
|
735
|
-
if (allowList && !allowList.has(t.name)) return false;
|
|
736
|
-
return true;
|
|
737
|
-
});
|
|
885
|
+
// Wave 5 E1 — apply per-spawn tool_filter (SUBAGENT-TOOLS-EMPTY · 0.2.36 · 대표 «서브에이전트에 제약이 생기지 않게»).
|
|
886
|
+
// 기본 = 메인과 같은 도구 전부(필터 없음). allow 는 «좁히기»일 때만 — 모르는 이름은 무시하고 경고,
|
|
887
|
+
// 아는 이름이 하나도 없으면 allow 전체를 무시(이름 불일치로 49→0 이 되던 10-22 실물). 결과가 0개면
|
|
888
|
+
// 발사하지 않는다(조용히 빈손 금지 — «0 tools · Blocked» 로 끝나 «✓ done» 처럼 보이던 것).
|
|
889
|
+
// SUBAGENT-NO-NARROWING(0.2.36 · 대표 22:5x «서브에이전트에 제약 없게») — 모델이 넘긴 allow 는 기본 «무시», deny 만 반영.
|
|
890
|
+
// (10-22 n8n 실물: 49 → 9 로 좁혀진 자식 둘이 1분 만에 «완료 못함».) 좁히기는 사람이 명시할 때만 — ELANOUS_SUBAGENT_HONOR_ALLOW=1
|
|
891
|
+
// 또는 agent 정의(.md)의 tools 목록(위에서 이미 반영).
|
|
892
|
+
const filtered = applySpawnToolFilter(childTools, args.tool_filter, { honorAllow: subagentHonorsModelAllow() });
|
|
893
|
+
childTools = filtered.tools;
|
|
894
|
+
if (filtered.applied || filtered.unknownAllow.length > 0 || filtered.unknownDeny.length > 0) {
|
|
738
895
|
debug.log('agent.spawn', 'tool-filter', {
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
896
|
+
cid: debugCorrelationId,
|
|
897
|
+
allowSize: filtered.allowSize,
|
|
898
|
+
denySize: filtered.denySize,
|
|
899
|
+
available: filtered.available,
|
|
742
900
|
remaining: childTools.length,
|
|
743
|
-
removed:
|
|
744
|
-
|
|
901
|
+
removed: filtered.available - childTools.length,
|
|
902
|
+
...(filtered.unknownAllow.length ? { unknownAllow: filtered.unknownAllow.slice(0, 20) } : {}),
|
|
903
|
+
...(filtered.unknownDeny.length ? { unknownDeny: filtered.unknownDeny.slice(0, 20) } : {}),
|
|
904
|
+
...(filtered.allowIgnored ? { allowIgnored: filtered.allowIgnored } : {}),
|
|
905
|
+
}, filtered.unknownAllow.length || filtered.unknownDeny.length || filtered.allowIgnored ? { level: 'warn' } : undefined);
|
|
906
|
+
}
|
|
907
|
+
if (childTools.length === 0 && filtered.available > 0) {
|
|
908
|
+
debug.log('agent.spawn', 'no-tools-refused', {
|
|
909
|
+
cid: debugCorrelationId, requestedType, description: description.slice(0, 80),
|
|
910
|
+
available: filtered.available, denySize: filtered.denySize,
|
|
911
|
+
}, { level: 'warn' });
|
|
912
|
+
return {
|
|
913
|
+
output:
|
|
914
|
+
`NOT SPAWNED — the tool_filter would leave this sub-agent with 0 of ${filtered.available} tools, ` +
|
|
915
|
+
`so it could not read files or run commands. Omit tool_filter to inherit the parent's full tool set, ` +
|
|
916
|
+
`or narrow with real tool names (for example: ${childToolNamesSample(filtered.availableNames)}).`,
|
|
917
|
+
agent: requestedType,
|
|
918
|
+
cid: debugCorrelationId,
|
|
919
|
+
durationMs: 0,
|
|
920
|
+
maxTurns: requestedMaxTurns,
|
|
921
|
+
taskId: 'no-tools-refused',
|
|
922
|
+
};
|
|
745
923
|
}
|
|
746
924
|
|
|
747
925
|
const hasNoTools = childTools.length === 0;
|
|
@@ -1034,3 +1212,67 @@ export async function dispatchAgent(
|
|
|
1034
1212
|
releaseReservedFanoutSlot();
|
|
1035
1213
|
}
|
|
1036
1214
|
}
|
|
1215
|
+
|
|
1216
|
+
// ── SUBAGENT-TOOLS-EMPTY: per-spawn tool filter (pure) ──────────────────────────────────────
|
|
1217
|
+
|
|
1218
|
+
export interface SpawnToolFilterResult<T extends { name: string }> {
|
|
1219
|
+
tools: T[];
|
|
1220
|
+
available: number;
|
|
1221
|
+
availableNames: string[];
|
|
1222
|
+
applied: boolean;
|
|
1223
|
+
allowSize?: number;
|
|
1224
|
+
denySize?: number;
|
|
1225
|
+
unknownAllow: string[];
|
|
1226
|
+
unknownDeny: string[];
|
|
1227
|
+
/** allow 를 통째로 무시했다 — 이유(빈 배열 · 아는 이름 없음 · 모델이 넘긴 allow 는 기본 무시). */
|
|
1228
|
+
allowIgnored?: 'empty' | 'no-known-names' | 'model-allow-ignored';
|
|
1229
|
+
}
|
|
1230
|
+
|
|
1231
|
+
/** 모델이 넘긴 tool_filter.allow 로 좁히는가 — 사람이 명시할 때만(기본 false). */
|
|
1232
|
+
export function subagentHonorsModelAllow(env: NodeJS.ProcessEnv = process.env): boolean {
|
|
1233
|
+
return /^(1|true|on)$/i.test((env.ELANOUS_SUBAGENT_HONOR_ALLOW ?? '').trim());
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
/** 기본 = 전부 상속 · deny = 아는 이름 빼기 · allow 는 `honorAllow` 일 때만 아는 이름으로 좁히기(없으면 무시). 넓히지는 못한다. */
|
|
1237
|
+
export function applySpawnToolFilter<T extends { name: string }>(
|
|
1238
|
+
tools: readonly T[],
|
|
1239
|
+
rawFilter: unknown,
|
|
1240
|
+
opts: { honorAllow?: boolean } = {},
|
|
1241
|
+
): SpawnToolFilterResult<T> {
|
|
1242
|
+
const available = tools.length;
|
|
1243
|
+
const availableNames = tools.map((t) => t.name);
|
|
1244
|
+
const known = new Set(availableNames);
|
|
1245
|
+
const filter = rawFilter && typeof rawFilter === 'object' && !Array.isArray(rawFilter)
|
|
1246
|
+
? rawFilter as { allow?: unknown; deny?: unknown }
|
|
1247
|
+
: undefined;
|
|
1248
|
+
if (!filter) return { tools: [...tools], available, availableNames, applied: false, unknownAllow: [], unknownDeny: [] };
|
|
1249
|
+
const names = (v: unknown): string[] | null => (Array.isArray(v) ? v.filter((n): n is string => typeof n === 'string' && n.trim() !== '') : null);
|
|
1250
|
+
const allowRaw = names(filter.allow);
|
|
1251
|
+
const denyRaw = names(filter.deny);
|
|
1252
|
+
const unknownAllow = (allowRaw ?? []).filter((n) => !known.has(n));
|
|
1253
|
+
const unknownDeny = (denyRaw ?? []).filter((n) => !known.has(n));
|
|
1254
|
+
const allowKnown = (allowRaw ?? []).filter((n) => known.has(n));
|
|
1255
|
+
let allowIgnored: SpawnToolFilterResult<T>['allowIgnored'];
|
|
1256
|
+
let allow: Set<string> | null = null;
|
|
1257
|
+
if (allowRaw) {
|
|
1258
|
+
if (allowRaw.length === 0) allowIgnored = 'empty';
|
|
1259
|
+
else if (!opts.honorAllow) allowIgnored = 'model-allow-ignored';
|
|
1260
|
+
else if (allowKnown.length === 0) allowIgnored = 'no-known-names';
|
|
1261
|
+
else allow = new Set(allowKnown);
|
|
1262
|
+
}
|
|
1263
|
+
const deny = new Set((denyRaw ?? []).filter((n) => known.has(n)));
|
|
1264
|
+
const kept = tools.filter((t) => !deny.has(t.name) && (!allow || allow.has(t.name)));
|
|
1265
|
+
return {
|
|
1266
|
+
tools: kept, available, availableNames, applied: true,
|
|
1267
|
+
...(allowRaw ? { allowSize: allowRaw.length } : {}),
|
|
1268
|
+
...(denyRaw ? { denySize: denyRaw.length } : {}),
|
|
1269
|
+
unknownAllow, unknownDeny,
|
|
1270
|
+
...(allowIgnored ? { allowIgnored } : {}),
|
|
1271
|
+
};
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
function childToolNamesSample(names: readonly string[]): string {
|
|
1275
|
+
const preferred = ['Read', 'Grep', 'Glob', 'RunShell', 'Write', 'Edit'].filter((n) => names.includes(n));
|
|
1276
|
+
return (preferred.length ? preferred : names.slice(0, 6)).join(', ');
|
|
1277
|
+
}
|
|
1278
|
+
|
package/src/skills/tools/pty.ts
CHANGED
|
@@ -149,6 +149,11 @@ export async function dispatchPtyShellStart(
|
|
|
149
149
|
opts: PtyDispatchOpts = {},
|
|
150
150
|
): Promise<{ output: string }> {
|
|
151
151
|
const args = validateStart(rawArgs);
|
|
152
|
+
// Keep the self-nest guard at the shared production boundary: the daemon
|
|
153
|
+
// tool surface and the skills runner both reach this dispatcher.
|
|
154
|
+
const { decideTuiSelfNest } = await import('../../agent/terminal-surface.js');
|
|
155
|
+
const selfNest = decideTuiSelfNest([args.cmd, ...(args.args ?? [])]);
|
|
156
|
+
if (selfNest.reject) return { output: selfNest.output ?? '' };
|
|
152
157
|
const boundaryReject = harnessCommandWriteReject([args.cmd, ...(args.args ?? [])], args.workdir ?? process.cwd(), 'pty-start');
|
|
153
158
|
if (boundaryReject) return { output: boundaryReject };
|
|
154
159
|
if (!ptyAvailable()) {
|