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
|
@@ -33,6 +33,11 @@ export const WAKEUP_MIN_DELAY_MS = 60_000;
|
|
|
33
33
|
export const WAKEUP_MAX_ENTRIES = 5;
|
|
34
34
|
export const WAKEUP_REPEAT_TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
35
35
|
export const WAKEUP_RETRY_DELAY_MS = 60_000;
|
|
36
|
+
/** 바쁨(NotIdle)·사람 입력 중(HumanTyping)으로 못 연 깨움을 «버리지 않고» 미루는 상한 — 첫 예정 시각부터.
|
|
37
|
+
* TUI-WAKEUP-DEFER-NOT-DROP(10-22 OPT w7: 02:38·02:39 NotIdle → dropped · codex 는 idle 때 골을 이어가고 바쁘면 미룬다). */
|
|
38
|
+
export const WAKEUP_DEFER_MAX_MS = 30 * 60_000;
|
|
39
|
+
/** 미룸 대상인 거부 이유 — 곧 풀리는 «지금 바쁨» 뿐이다(Disabled·Cap·Superseded 는 미뤄도 안 풀린다). */
|
|
40
|
+
const WAKEUP_DEFERRABLE_REASONS: ReadonlySet<string> = new Set(['NotIdle', 'HumanTyping']);
|
|
36
41
|
/** 일회성 지연의 상한 — 반복 TTL 과 같은 7일(그보다 먼 일은 cron `schedule_manage` 몫). */
|
|
37
42
|
export const WAKEUP_MAX_DELAY_MS = WAKEUP_REPEAT_TTL_MS;
|
|
38
43
|
/** 한 턴 안 schedule·cancel 호출 합계 상한 — 넘으면 «다음 턴에» 로 거부(예약·취소 고리 차단). */
|
|
@@ -260,18 +265,32 @@ export function createWakeupScheduler(deps: WakeupSchedulerDeps): WakeupSchedule
|
|
|
260
265
|
log('tui.wakeup', 'rejected', {
|
|
261
266
|
id, reason: result.reason, ...(result.detail ? { detail: result.detail } : {}), retried: entry.retried,
|
|
262
267
|
});
|
|
263
|
-
|
|
264
|
-
|
|
268
|
+
const deferrable = WAKEUP_DEFERRABLE_REASONS.has(result.reason);
|
|
269
|
+
if (deferrable) {
|
|
270
|
+
// 바쁨·사람 입력 중 — 버리지 않고 1분마다 다시 청한다(같은 회차). 상한 = 첫 예정 시각 + WAKEUP_DEFER_MAX_MS,
|
|
271
|
+
// 반복이면 다음 회차 시각도 상한(그 회차가 이 깨움을 대신한다).
|
|
272
|
+
const nextTry = t + WAKEUP_RETRY_DELAY_MS;
|
|
273
|
+
// 상한 시각의 시도까지는 한다(<=) · 반복은 다음 회차 시각과 겹치면 그 회차에 넘긴다(<).
|
|
274
|
+
const withinDeferCap = nextTry <= entry.dueAt + WAKEUP_DEFER_MAX_MS;
|
|
275
|
+
const beforeNextTick = !entry.repeatMs || nextTry < entry.dueAt + entry.repeatMs;
|
|
276
|
+
if (withinDeferCap && beforeNextTick) {
|
|
277
|
+
entry.retried = true;
|
|
278
|
+
timers.set(id, setTimer(() => fire(id), WAKEUP_RETRY_DELAY_MS));
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
} else if (!entry.retried) {
|
|
282
|
+
// 바쁨이 아닌 거부 — 1분 뒤 한 번만 다시 청한다(기존 계약).
|
|
265
283
|
entry.retried = true;
|
|
266
284
|
timers.set(id, setTimer(() => fire(id), WAKEUP_RETRY_DELAY_MS));
|
|
267
285
|
return;
|
|
268
286
|
}
|
|
287
|
+
const exhausted = deferrable ? 'defer-exhausted' : 'retry-exhausted';
|
|
269
288
|
if (entry.repeatMs) {
|
|
270
|
-
log('tui.wakeup', 'skipped', { id, reason:
|
|
289
|
+
log('tui.wakeup', 'skipped', { id, reason: exhausted, next: 'repeat' });
|
|
271
290
|
advance(entry, t);
|
|
272
291
|
return;
|
|
273
292
|
}
|
|
274
|
-
log('tui.wakeup', 'skipped', { id, reason:
|
|
293
|
+
log('tui.wakeup', 'skipped', { id, reason: exhausted, next: 'dropped' });
|
|
275
294
|
deps.notify?.(`⏰ 예약 깨움 놓침(${id}): ${entry.reason} — ${result.reason}`);
|
|
276
295
|
drop(id);
|
|
277
296
|
};
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
getShellRunnerDeps,
|
|
33
33
|
} from '../../shell-runner/dispatch.js';
|
|
34
34
|
import type { ShellHandle, ShellResult as RunnerResult } from '../../shell-runner/types.js';
|
|
35
|
-
import { debug } from '../../debug/log.js';
|
|
35
|
+
import { debug, redactSecretText, redactSecrets } from '../../debug/log.js';
|
|
36
36
|
import { getSessionCwd } from '../../session/working-dir.js';
|
|
37
37
|
import { getUserConfig } from '../../user-config.js';
|
|
38
38
|
import { SCHEDULE_WAKEUP_TOOL_NAME } from './schedule-wakeup.js';
|
|
@@ -515,8 +515,62 @@ function withLongSleepWarning(
|
|
|
515
515
|
return { ...result, output: `${formatLongSleepWarning(finding, bgAvailable, resumeHint)}\n${result.output}` };
|
|
516
516
|
}
|
|
517
517
|
|
|
518
|
-
|
|
519
|
-
|
|
518
|
+
/** The per-event cap holds for the whole recorded args text, including the
|
|
519
|
+
* truncation marker. Source: TUI-OBS-TRACE-PERSIST GOAL STEPS (2048 chars). */
|
|
520
|
+
export const SHELL_DISPATCH_ARGS_TEXT_LIMIT = 2048;
|
|
521
|
+
|
|
522
|
+
interface BoundedShellArgsText {
|
|
523
|
+
/** Redacted JSON text of the arguments received by dispatchRunShell. */
|
|
524
|
+
argsText: string;
|
|
525
|
+
/** True when argsText was cut to the cap. */
|
|
526
|
+
argsTextTruncated: boolean;
|
|
527
|
+
/** Length of the full redacted JSON text before bounding. */
|
|
528
|
+
argsTextChars: number;
|
|
529
|
+
/** Short scalar remains readable even if argsText itself is compacted. */
|
|
530
|
+
argsTextMarker?: string;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
function stringifyShellArgs(rawArgs: unknown): string {
|
|
534
|
+
try {
|
|
535
|
+
const json = JSON.stringify(redactSecrets(rawArgs));
|
|
536
|
+
if (json !== undefined) return json;
|
|
537
|
+
} catch { /* circular / BigInt args — redact fallback text too */ }
|
|
538
|
+
try {
|
|
539
|
+
return redactSecretText(String(rawArgs));
|
|
540
|
+
} catch {
|
|
541
|
+
return '[unserializable shell args]';
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/** Bounded, secret-redacted serialization for one RunShell dispatch record. */
|
|
546
|
+
export function boundedShellArgsText(
|
|
547
|
+
rawArgs: unknown,
|
|
548
|
+
): BoundedShellArgsText {
|
|
549
|
+
const full = stringifyShellArgs(rawArgs);
|
|
550
|
+
if (full.length <= SHELL_DISPATCH_ARGS_TEXT_LIMIT) {
|
|
551
|
+
return { argsText: full, argsTextTruncated: false, argsTextChars: full.length };
|
|
552
|
+
}
|
|
553
|
+
const argsTextMarker = '[truncated]';
|
|
554
|
+
const prefixLen = SHELL_DISPATCH_ARGS_TEXT_LIMIT - argsTextMarker.length - 1;
|
|
555
|
+
return {
|
|
556
|
+
argsText: `${full.slice(0, prefixLen)} ${argsTextMarker}`,
|
|
557
|
+
argsTextTruncated: true,
|
|
558
|
+
argsTextChars: full.length,
|
|
559
|
+
argsTextMarker,
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
function logShellDispatch(
|
|
564
|
+
event: string,
|
|
565
|
+
data: Record<string, unknown>,
|
|
566
|
+
argsTrace?: BoundedShellArgsText,
|
|
567
|
+
): void {
|
|
568
|
+
debug.log(
|
|
569
|
+
'shell.dispatch',
|
|
570
|
+
event,
|
|
571
|
+
argsTrace ? { ...data, ...argsTrace } : data,
|
|
572
|
+
{ compact: { stringMax: SHELL_DISPATCH_ARGS_TEXT_LIMIT } },
|
|
573
|
+
);
|
|
520
574
|
}
|
|
521
575
|
|
|
522
576
|
// ── bg completion → turn notification queue (TUI-BG-SHELL) ───────────
|
|
@@ -588,8 +642,9 @@ export async function dispatchRunShell(
|
|
|
588
642
|
const network = asNetwork(rawArgs.network);
|
|
589
643
|
const mode = asMode(rawArgs.mode);
|
|
590
644
|
const description = typeof rawArgs.description === 'string' ? rawArgs.description : undefined;
|
|
645
|
+
const argsTrace = boundedShellArgsText(rawArgs);
|
|
591
646
|
if (command[0] === 'cd') {
|
|
592
|
-
logShellDispatch('cd.rejected', { reason: 'argv-state-does-not-persist' });
|
|
647
|
+
logShellDispatch('cd.rejected', { reason: 'argv-state-does-not-persist' }, argsTrace);
|
|
593
648
|
return rejectedCdResult();
|
|
594
649
|
}
|
|
595
650
|
const ledgerCliMatch = matchLedgerCli(command, opts.availableToolNames);
|
|
@@ -627,7 +682,7 @@ export async function dispatchRunShell(
|
|
|
627
682
|
signal: opts.signal,
|
|
628
683
|
deps,
|
|
629
684
|
});
|
|
630
|
-
logShellDispatch(`runner.${result.outcome}`, { cwd: effectiveCwd, cwdSource });
|
|
685
|
+
logShellDispatch(`runner.${result.outcome}`, { cwd: effectiveCwd, cwdSource }, argsTrace);
|
|
631
686
|
return withLongSleepWarning(result, longSleep, bgAvailable, resumeHint);
|
|
632
687
|
}
|
|
633
688
|
|
|
@@ -641,7 +696,7 @@ export async function dispatchRunShell(
|
|
|
641
696
|
signal: opts.signal,
|
|
642
697
|
});
|
|
643
698
|
|
|
644
|
-
logShellDispatch(`legacy.${result.outcome}`, { cwd: effectiveCwd, cwdSource });
|
|
699
|
+
logShellDispatch(`legacy.${result.outcome}`, { cwd: effectiveCwd, cwdSource }, argsTrace);
|
|
645
700
|
const summary = formatSummary(result);
|
|
646
701
|
return withLongSleepWarning({
|
|
647
702
|
output: summary,
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
// overflowed.
|
|
19
19
|
|
|
20
20
|
import type { LLMToolSpec } from '../../llm.js';
|
|
21
|
-
import { getDashboardTerminalSessions } from '../../dashboard/terminal/session.js';
|
|
22
21
|
import type { TerminalSessionRegistry } from '../../terminal/session-registry.js';
|
|
23
22
|
|
|
24
23
|
const CHUNK_BYTES = 256;
|
|
@@ -92,7 +91,7 @@ export async function dispatchTerminalModalInject(
|
|
|
92
91
|
rawArgs: Record<string, unknown>,
|
|
93
92
|
deps: DispatchInjectDeps = {},
|
|
94
93
|
): Promise<{ output: string }> {
|
|
95
|
-
const registry = deps.registry ?? getDashboardTerminalSessions();
|
|
94
|
+
const registry = deps.registry ?? (await import('../../dashboard/terminal/session.js')).getDashboardTerminalSessions();
|
|
96
95
|
const id = String(rawArgs.id ?? '').trim();
|
|
97
96
|
if (!id) throw new Error(`'id' is required`);
|
|
98
97
|
const session = registry.get(id);
|
|
@@ -14,11 +14,13 @@
|
|
|
14
14
|
import type { LLMToolSpec } from '../../llm.js';
|
|
15
15
|
import { truncateOutput } from '../../output-truncation.js';
|
|
16
16
|
import { getSessionCwd } from '../../session/working-dir.js';
|
|
17
|
-
import {
|
|
18
|
-
getDashboardTerminalSessions,
|
|
19
|
-
} from '../../dashboard/terminal/session.js';
|
|
20
17
|
import type { TerminalSession, TerminalSessionRegistry } from '../../terminal/session-registry.js';
|
|
21
18
|
|
|
19
|
+
async function getDashboardTerminalSessions(): Promise<TerminalSessionRegistry> {
|
|
20
|
+
const { getDashboardTerminalSessions: getSessions } = await import('../../dashboard/terminal/session.js');
|
|
21
|
+
return getSessions() as TerminalSessionRegistry;
|
|
22
|
+
}
|
|
23
|
+
|
|
22
24
|
const DEFAULT_MAX_BYTES = 64 * 1024;
|
|
23
25
|
|
|
24
26
|
// ─── terminal_modal_list ────────────────────────────────────────
|
|
@@ -43,7 +45,7 @@ export async function dispatchTerminalModalList(
|
|
|
43
45
|
rawArgs: Record<string, unknown>,
|
|
44
46
|
deps?: { registry?: TerminalSessionRegistry },
|
|
45
47
|
): Promise<{ output: string }> {
|
|
46
|
-
const registry = deps?.registry ?? getDashboardTerminalSessions();
|
|
48
|
+
const registry = deps?.registry ?? await getDashboardTerminalSessions();
|
|
47
49
|
const includeExited = rawArgs.include_exited === true;
|
|
48
50
|
const sessions = registry.list().filter(s => includeExited || s.state !== 'exited');
|
|
49
51
|
if (sessions.length === 0) {
|
|
@@ -92,7 +94,7 @@ export async function dispatchTerminalModalObserve(
|
|
|
92
94
|
rawArgs: Record<string, unknown>,
|
|
93
95
|
deps?: { registry?: TerminalSessionRegistry },
|
|
94
96
|
): Promise<{ output: string }> {
|
|
95
|
-
const registry = deps?.registry ?? getDashboardTerminalSessions();
|
|
97
|
+
const registry = deps?.registry ?? await getDashboardTerminalSessions();
|
|
96
98
|
const id = String(rawArgs.id ?? '').trim();
|
|
97
99
|
if (!id) throw new Error(`'id' is required`);
|
|
98
100
|
const session = registry.get(id);
|
|
@@ -155,7 +157,7 @@ export async function dispatchTerminalModalFocus(
|
|
|
155
157
|
termRows?: number;
|
|
156
158
|
},
|
|
157
159
|
): Promise<{ output: string }> {
|
|
158
|
-
const registry = deps?.registry ?? getDashboardTerminalSessions();
|
|
160
|
+
const registry = deps?.registry ?? await getDashboardTerminalSessions();
|
|
159
161
|
const id = String(rawArgs.id ?? '').trim();
|
|
160
162
|
if (!id) throw new Error(`'id' is required`);
|
|
161
163
|
const prior = registry.foreground()?.id ?? null;
|
|
@@ -191,7 +193,7 @@ export async function dispatchTerminalModalDetach(
|
|
|
191
193
|
rawArgs: Record<string, unknown>,
|
|
192
194
|
deps?: { registry?: TerminalSessionRegistry },
|
|
193
195
|
): Promise<{ output: string }> {
|
|
194
|
-
const registry = deps?.registry ?? getDashboardTerminalSessions();
|
|
196
|
+
const registry = deps?.registry ?? await getDashboardTerminalSessions();
|
|
195
197
|
const id = typeof rawArgs.id === 'string' && rawArgs.id.length > 0
|
|
196
198
|
? rawArgs.id
|
|
197
199
|
: registry.foreground()?.id;
|
|
@@ -227,7 +229,7 @@ export async function dispatchTerminalModalKill(
|
|
|
227
229
|
rawArgs: Record<string, unknown>,
|
|
228
230
|
deps?: { registry?: TerminalSessionRegistry },
|
|
229
231
|
): Promise<{ output: string }> {
|
|
230
|
-
const registry = deps?.registry ?? getDashboardTerminalSessions();
|
|
232
|
+
const registry = deps?.registry ?? await getDashboardTerminalSessions();
|
|
231
233
|
const id = String(rawArgs.id ?? '').trim();
|
|
232
234
|
if (!id) throw new Error(`'id' is required`);
|
|
233
235
|
const session = registry.kill(id);
|
package/src/skills/url-router.ts
CHANGED
|
@@ -108,11 +108,50 @@ function containsAny(haystack: string, needles: string[]): string | null {
|
|
|
108
108
|
return null;
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
+
// ── Work-context guard (URL-ROUTE-WORK-CONTEXT-GUARD · 10-22) ──
|
|
112
|
+
// Observed: a long n8n work instruction carrying «RSS URL https://hnrss.org/frontpage
|
|
113
|
+
// · Limit 5 …» (a value to type into a node) was rewritten into an omni-digest run.
|
|
114
|
+
// The config guardKeywords did not stop it, and a user config replaces that list
|
|
115
|
+
// wholesale — so this guard lives in code and always applies.
|
|
116
|
+
|
|
117
|
+
/** «Put this value into a field» phrasing — the URL is data, not a digest target. */
|
|
118
|
+
const FIELD_INPUT_WORDS = [
|
|
119
|
+
'입력', '넣어', '넣고', '넣기', '붙여넣', '칸에', '노드에', '필드에', '란에',
|
|
120
|
+
'로 설정', '으로 설정', '에 설정', '설정해',
|
|
121
|
+
'paste into', 'type into', 'fill in', 'into the field', 'enter it',
|
|
122
|
+
];
|
|
123
|
+
/** Text outside the URLs longer than this is a work instruction, not «summarize this». */
|
|
124
|
+
export const WORK_INSTRUCTION_MIN_CHARS = 160;
|
|
125
|
+
/** Step separators (`·` `→` `->`, numbered/bulleted lines) that mark a multi-step task. */
|
|
126
|
+
const STEP_MARKER_RE = /·|→|->|^\s*(?:\d+[.)]|[-*•])\s+/gmu;
|
|
127
|
+
|
|
128
|
+
/** A URL written as a labelled value — «RSS URL https://…», «Webhook URL: https://…», «endpoint=https://…».
|
|
129
|
+
* Matched against the text with each URL replaced by a marker, so a label inside a URL
|
|
130
|
+
* (`https://a.com/?url=https://b.com`) is never read as one. */
|
|
131
|
+
const URL_MARK = '\u0000';
|
|
132
|
+
/** Words that ask for a digest of the URL — they exempt the labelled-URL check (not the other guards). */
|
|
133
|
+
const DIGEST_REQUEST_WORDS = ['요약', '정리', '분석', 'summar', 'digest', 'tl;dr', 'tldr'];
|
|
134
|
+
const LABELLED_URL_RE = /(?:^|[^\p{L}\p{N}])(?:url|uri|endpoint)\s*[:=]?\s*\u0000/iu;
|
|
135
|
+
|
|
136
|
+
/** Why this URL-bearing text must stay on the LLM path, or null when it may route. */
|
|
137
|
+
export function workContextGuardReason(text: string): string | null {
|
|
138
|
+
const rest = text.replace(URL_RE, ' ').replace(/\s+/g, ' ').trim();
|
|
139
|
+
const field = containsAny(rest.toLowerCase(), FIELD_INPUT_WORDS);
|
|
140
|
+
if (field) return `field-input("${field}")`;
|
|
141
|
+
// An explicit digest request («URL https://… 요약해줘») names the URL to summarize, so the label alone does not hold it back.
|
|
142
|
+
if (LABELLED_URL_RE.test(text.replace(URL_RE, URL_MARK)) && !containsAny(rest.toLowerCase(), DIGEST_REQUEST_WORDS)) return 'labelled-url-value';
|
|
143
|
+
if (rest.length > WORK_INSTRUCTION_MIN_CHARS) return `long-instruction(${rest.length})`;
|
|
144
|
+
const steps = text.replace(URL_RE, ' ').match(STEP_MARKER_RE)?.length ?? 0;
|
|
145
|
+
if (steps >= 2) return `multi-step(${steps})`;
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
|
|
111
149
|
/** Main entry. Returns a routing decision when the text contains a URL
|
|
112
150
|
* that should be auto-processed, or null when:
|
|
113
151
|
* - routing disabled,
|
|
114
152
|
* - no URL present,
|
|
115
|
-
* - a guard keyword is present (defer to the LLM — R5/R8)
|
|
153
|
+
* - a guard keyword is present (defer to the LLM — R5/R8),
|
|
154
|
+
* - the URL sits inside a work instruction (`workContextGuardReason`).
|
|
116
155
|
*
|
|
117
156
|
* Callers (TUI dashboard / Telegram agent) then decide auto-fire vs
|
|
118
157
|
* suggest, and run the mapped skill (two-stage per P4). */
|
|
@@ -132,6 +171,7 @@ export function detectUrlRoute(
|
|
|
132
171
|
// "반박해봐", "구현해줘") is NOT a digest request — defer to the LLM.
|
|
133
172
|
const guardHit = containsAny(haystack, cfg.guardKeywords);
|
|
134
173
|
if (guardHit) return null;
|
|
174
|
+
if (workContextGuardReason(text)) return null;
|
|
135
175
|
|
|
136
176
|
const url = urls[0]!;
|
|
137
177
|
const kind = classifyUrl(url);
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { runGraph, type GraphRunState } from '../graph-runner/runner.js';
|
|
5
|
+
import type { WorkflowDeps } from '../workflow-runtime/types.js';
|
|
6
|
+
|
|
7
|
+
const WIZARD_GRAPH = resolve(import.meta.dir, '../../graphs/wizard/wizard-loop.yaml');
|
|
8
|
+
const FIRST_RESEARCH_PATH = ['intake', 'classify', 'ground'] as const;
|
|
9
|
+
|
|
10
|
+
export interface WizardRequestRunOptions {
|
|
11
|
+
/** Stable caller-supplied identity, or generated for this request. */
|
|
12
|
+
runId?: string;
|
|
13
|
+
/** Isolated graph-run ledger root. */
|
|
14
|
+
stateRoot?: string;
|
|
15
|
+
/** Injected for controlled runs; omitted to use the graph runner's production LLM. */
|
|
16
|
+
callLLM?: (prompt: string) => Promise<string>;
|
|
17
|
+
/** Injected command runner for isolated execution and deterministic verification. */
|
|
18
|
+
runBash?: WorkflowDeps['runBash'];
|
|
19
|
+
log?: (event: string, data: Record<string, unknown>) => void;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface WizardRequestRun {
|
|
23
|
+
runId: string;
|
|
24
|
+
status: GraphRunState['status'];
|
|
25
|
+
path: string[];
|
|
26
|
+
/** Observed graph edges; every record is stamped with the enclosing run identity. */
|
|
27
|
+
transitions: Array<{ from: string; to: string; runId: string }>;
|
|
28
|
+
state: GraphRunState;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Run one request through the wizard graph and expose its first research transition. */
|
|
32
|
+
export async function runWizardRequest(
|
|
33
|
+
request: string,
|
|
34
|
+
options: WizardRequestRunOptions = {},
|
|
35
|
+
): Promise<WizardRequestRun> {
|
|
36
|
+
const normalizedRequest = request.trim();
|
|
37
|
+
if (!normalizedRequest) throw new TypeError('wizard request must not be empty');
|
|
38
|
+
if (!existsSync(WIZARD_GRAPH)) throw new Error(`wizard-loop graph is missing: ${WIZARD_GRAPH}`);
|
|
39
|
+
|
|
40
|
+
const runId = options.runId ?? randomUUID();
|
|
41
|
+
const state = await runGraph(WIZARD_GRAPH, {
|
|
42
|
+
runId,
|
|
43
|
+
input: { request: normalizedRequest },
|
|
44
|
+
quiet: true,
|
|
45
|
+
deps: {
|
|
46
|
+
...(options.stateRoot ? { root: options.stateRoot } : {}),
|
|
47
|
+
...(options.callLLM ? { callLLM: options.callLLM } : {}),
|
|
48
|
+
...(options.runBash ? { runBash: options.runBash } : {}),
|
|
49
|
+
...(options.log ? { log: options.log } : {}),
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
if (state.runId !== runId) throw new Error(`wizard run identity changed: expected ${runId}, got ${state.runId}`);
|
|
54
|
+
const transitions = state.path.slice(1).map((to, index) => ({
|
|
55
|
+
from: state.path[index]!,
|
|
56
|
+
to,
|
|
57
|
+
runId: state.runId,
|
|
58
|
+
}));
|
|
59
|
+
const firstResearchPath = state.path.slice(0, Math.min(state.path.length, FIRST_RESEARCH_PATH.length));
|
|
60
|
+
if (!firstResearchPath.every((nodeId, index) => nodeId === FIRST_RESEARCH_PATH[index]) ||
|
|
61
|
+
(state.status === 'awaiting-approval' && firstResearchPath.length !== FIRST_RESEARCH_PATH.length)) {
|
|
62
|
+
throw new Error(`wizard request did not reach the first research steps: ${firstResearchPath.join(' → ')}`);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return { runId: state.runId, status: state.status, path: [...state.path], transitions, state };
|
|
66
|
+
}
|
package/src/status/bar.ts
CHANGED
|
@@ -290,6 +290,25 @@ export function runningBuildSegment(state: RunningBuildState | null | undefined,
|
|
|
290
290
|
return strongText(`${label} ⟳ 재기동 필요${target}`, 'yellow', opts);
|
|
291
291
|
}
|
|
292
292
|
|
|
293
|
+
/** 이번 턴 «실제로» 응답한 공급자·모델 (TUI-MODEL-BADGE-ACTUAL · 10-16 · #24·#66).
|
|
294
|
+
*
|
|
295
|
+
* 턴 «시작»에 고른 결정(`RouteDecision`)과 실제 응답은 다를 수 있다 — 폴백 체인이
|
|
296
|
+
* 다른 공급자로 넘기면(예 codex → grok) 배지가 «지금» 으로 보여야 하는 것은 이쪽이다.
|
|
297
|
+
* 완료 배지(`src/tui/chat/execution-badge.ts`)와 같은 원천(`src/llm/route-decision.ts`)을 쓴다. */
|
|
298
|
+
export interface ModelExecutionActual {
|
|
299
|
+
provider?: string;
|
|
300
|
+
/** 실제로 응답한 모델 id — 있으면 배지의 «지금» 은 이 값이다. */
|
|
301
|
+
model: string;
|
|
302
|
+
/** 폴백이면 턴이 «고른» 모델 — 배지가 `고른 → 실제` 로 드러낸다(폴백 아니면 없음/null). */
|
|
303
|
+
fallbackFrom?: string | null;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/** 상태줄 배지 입력 — 설정/런타임 값 ⊕ (있으면) 이번 턴 실제 실행.
|
|
307
|
+
* `actual` 이 없는 호출자는 종전과 완전히 같은 배지를 얻는다(추가 필드는 선택). */
|
|
308
|
+
export interface StatusModelInfo extends Pick<ActiveProviderInfo, 'provider' | 'model'> {
|
|
309
|
+
actual?: ModelExecutionActual | null;
|
|
310
|
+
}
|
|
311
|
+
|
|
293
312
|
/** Truncate a model id at the first parameter-size marker (e.g.
|
|
294
313
|
* `qwen3.6-35b-a3b-ud-mlx` → `qwen3.6-35b`). The marker pattern
|
|
295
314
|
* matches one or more digits followed by `b`/`B` (e.g. `7b`, `35b`,
|
|
@@ -319,19 +338,22 @@ function truncateAtParamSize(model: string): string {
|
|
|
319
338
|
* - `local:qwen3.6-35b-a3b-ud-mlx` → `local:qwen3.6-35b`
|
|
320
339
|
* - `node-b:qwen2.5-72b-instruct` → `node-b:qwen2.5-72b`
|
|
321
340
|
* - `claude-opus-4-6` → unchanged (no `\d+b` marker) */
|
|
322
|
-
export function modelSegment(info:
|
|
323
|
-
|
|
324
|
-
|
|
341
|
+
export function modelSegment(info: StatusModelInfo, opts: StatusBarRenderOptions = {}): string {
|
|
342
|
+
// 이번 턴 실제 실행이 있으면 그 값이 «지금» 이다 — 설정/런타임 값은 실행 전 기본값일 뿐.
|
|
343
|
+
const actual = info.actual?.model && info.actual.model !== '(none)' ? info.actual : null;
|
|
344
|
+
const provider = actual?.provider?.trim() || info.provider;
|
|
345
|
+
const model = actual?.model ?? info.model;
|
|
346
|
+
if (!model || model === '(none)') {
|
|
347
|
+
return strongText(provider, 'pink', opts);
|
|
325
348
|
}
|
|
326
349
|
// Step 1 — derive the display string with node prefix when local.
|
|
327
350
|
let display: string;
|
|
328
|
-
let model = info.model;
|
|
329
351
|
if (model.startsWith('local-llm:')) {
|
|
330
352
|
const rest = model.slice('local-llm:'.length);
|
|
331
353
|
display = rest.includes(':') ? rest : `local:${rest}`;
|
|
332
354
|
} else if (model.startsWith('local:')) {
|
|
333
355
|
display = model;
|
|
334
|
-
} else if (
|
|
356
|
+
} else if (provider === 'local') {
|
|
335
357
|
display = `local:${model}`;
|
|
336
358
|
} else {
|
|
337
359
|
display = model;
|
|
@@ -349,6 +371,11 @@ export function modelSegment(info: Pick<ActiveProviderInfo, 'provider' | 'model'
|
|
|
349
371
|
display = truncateAtParamSize(display);
|
|
350
372
|
}
|
|
351
373
|
}
|
|
374
|
+
// Step 3 — 폴백이면 «처음 → 실제». 고른 값과 실제가 같으면 화살표를 꾸미지 않는다.
|
|
375
|
+
const from = actual?.fallbackFrom?.trim();
|
|
376
|
+
if (from && from !== model) {
|
|
377
|
+
display = `${opts.compact ? truncateAtParamSize(from) : from} → ${display}`;
|
|
378
|
+
}
|
|
352
379
|
return strongText(display, 'pink', opts);
|
|
353
380
|
}
|
|
354
381
|
|
|
@@ -798,7 +825,8 @@ function dockStripDetail(dockedCount: number, dormantCount: number): string {
|
|
|
798
825
|
|
|
799
826
|
export interface StatusBarState {
|
|
800
827
|
cwd: string;
|
|
801
|
-
|
|
828
|
+
/** 설정/런타임 공급자·모델 ⊕ (있으면) 이번 턴 실제 실행 — 배지는 실제를 «지금» 으로 쓴다. */
|
|
829
|
+
providerInfo: StatusModelInfo;
|
|
802
830
|
gitBranch?: string;
|
|
803
831
|
contextUsedTokens?: number;
|
|
804
832
|
tmuxLabel?: string | null;
|
package/src/status/metrics.ts
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
import { costForUsageDetailed, type TokenUsage } from '../models/costs.js';
|
|
18
18
|
import { resolveModelContextWindow } from '../models/context-window.js';
|
|
19
|
-
import { DEFAULT_TOKEN_BUDGET, estimateTokens } from '../tokens.js';
|
|
19
|
+
import { DEFAULT_TOKEN_BUDGET, estimateMessagesTokens, estimateTokens } from '../tokens.js';
|
|
20
20
|
|
|
21
21
|
export interface SessionMetrics {
|
|
22
22
|
/** Cumulative input tokens sent this session. */
|
|
@@ -119,6 +119,17 @@ export function recordTurn(input: RecordTurnInput): SessionMetrics {
|
|
|
119
119
|
return singleton;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
+
/**
|
|
123
|
+
* A conversation was just restored (`/session load` · `--resume`): the next turn will send all of it,
|
|
124
|
+
* so the ctx readout shows that size now instead of 0 until the first turn reports real usage
|
|
125
|
+
* (TUI-RESUME-PICKER ④). The first `recordTurn` replaces it with the provider's number.
|
|
126
|
+
*/
|
|
127
|
+
export function noteRestoredContext(history: readonly { role: string; content: unknown }[]): number {
|
|
128
|
+
const used = estimateMessagesTokens(history.map((m) => ({ role: m.role, content: typeof m.content === 'string' ? m.content : JSON.stringify(m.content ?? '') })));
|
|
129
|
+
singleton.lastContextUsed = used;
|
|
130
|
+
return used;
|
|
131
|
+
}
|
|
132
|
+
|
|
122
133
|
/** Elapsed time since session start, in seconds. Updated on every
|
|
123
134
|
* call (doesn't depend on recordTurn firing). */
|
|
124
135
|
export function sessionElapsedSec(): number {
|
|
@@ -10,8 +10,29 @@
|
|
|
10
10
|
|
|
11
11
|
import { inspectActiveProvider, type ActiveProviderInfo } from '../provider-summary.js';
|
|
12
12
|
import { getUserConfig, type UserConfig } from '../user-config.js';
|
|
13
|
+
import { currentRouteDecision, currentRouteExecution } from '../llm/route-decision.js';
|
|
14
|
+
import type { ModelExecutionActual } from './bar.js';
|
|
13
15
|
|
|
14
|
-
export type StatusProviderInfo = Pick<ActiveProviderInfo, 'provider' | 'model'
|
|
16
|
+
export type StatusProviderInfo = Pick<ActiveProviderInfo, 'provider' | 'model'> & {
|
|
17
|
+
/** TUI-MODEL-BADGE-ACTUAL (10-16) — 이번 턴 «실제» 실행. 있으면 배지는 이 값을 «지금» 으로 쓴다. */
|
|
18
|
+
actual?: ModelExecutionActual | null;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/** 표면의 이번 턴 «실제» 실행을 배지 입력 꼴로 옮긴다 — 결정(턴 시작에 고른 값)과 다르면
|
|
22
|
+
* `fallbackFrom` 이 채워져 배지가 `고른 → 실제` 를 보인다. 실행 기록이 없으면 null(꾸미지 않는다).
|
|
23
|
+
* 원천은 완료 배지와 «같은» 맵(`src/llm/route-decision.ts`)이다 — 두 표면이 다른 말을 하지 않게. */
|
|
24
|
+
export function statusModelActual(surface = 'dashboard'): ModelExecutionActual | null {
|
|
25
|
+
const execution = currentRouteExecution(surface);
|
|
26
|
+
const model = execution?.model?.trim();
|
|
27
|
+
if (!model) return null;
|
|
28
|
+
const provider = execution?.provider?.trim();
|
|
29
|
+
const planned = currentRouteDecision(surface)?.model?.trim();
|
|
30
|
+
return {
|
|
31
|
+
model,
|
|
32
|
+
...(provider ? { provider } : {}),
|
|
33
|
+
...(planned && planned !== model ? { fallbackFrom: planned } : {}),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
15
36
|
|
|
16
37
|
export interface StatusProviderInfoReaderDeps {
|
|
17
38
|
readConfig?: () => UserConfig;
|
|
@@ -23,9 +44,15 @@ export interface StatusProviderInfoReaderDeps {
|
|
|
23
44
|
maxAgeMs?: number;
|
|
24
45
|
}
|
|
25
46
|
|
|
47
|
+
/** 상태줄이 매 렌더 부르는 리더 — `actual`(이번 턴 실제 실행)은 선택이라 종전 호출 그대로도 된다. */
|
|
48
|
+
export type StatusProviderInfoReader = (
|
|
49
|
+
runtimeModel?: string,
|
|
50
|
+
actual?: ModelExecutionActual | null,
|
|
51
|
+
) => StatusProviderInfo;
|
|
52
|
+
|
|
26
53
|
export function createStatusProviderInfoReader(
|
|
27
54
|
deps: StatusProviderInfoReaderDeps = {},
|
|
28
|
-
):
|
|
55
|
+
): StatusProviderInfoReader {
|
|
29
56
|
const readConfig = deps.readConfig ?? (() => getUserConfig());
|
|
30
57
|
const inspect = deps.inspect ?? ((cfg, runtimeModel) => inspectActiveProvider(cfg, runtimeModel));
|
|
31
58
|
const now = deps.now ?? Date.now;
|
|
@@ -39,20 +66,24 @@ export function createStatusProviderInfoReader(
|
|
|
39
66
|
inspectedAt: number;
|
|
40
67
|
} | null = null;
|
|
41
68
|
|
|
42
|
-
|
|
69
|
+
/** `actual` — 이번 턴 실제 실행(있으면). 기억은 설정/런타임 값만 하고, 실행은 «매 렌더»
|
|
70
|
+
* 달라지므로 기억 밖에서 덧씌운다(낡은 실행이 굳지 않게). */
|
|
71
|
+
return (runtimeModel?: string, actual?: ModelExecutionActual | null): StatusProviderInfo => {
|
|
43
72
|
const t = now();
|
|
44
73
|
// ⛔ 조기 반환에도 최대 수명을 건다 — TTL 만 보면 «29초에 설정 확인 → 30.001초 렌더»가 재판정 없이 지나간다.
|
|
45
74
|
const fresh = memo !== null && t - memo.inspectedAt < maxAgeMs;
|
|
46
|
-
if (memo && fresh && memo.runtimeModel === runtimeModel && t - memo.checkedAt < ttlMs)
|
|
75
|
+
if (memo && fresh && memo.runtimeModel === runtimeModel && t - memo.checkedAt < ttlMs) {
|
|
76
|
+
return actual ? { ...memo.info, actual } : memo.info;
|
|
77
|
+
}
|
|
47
78
|
// getUserConfig() 는 파일 mtime 이 같으면 «같은 객체»를, 바뀌면 새 객체를 돌려준다(user-config.ts getUserConfig).
|
|
48
79
|
const cfg = readConfig();
|
|
49
80
|
if (memo && fresh && memo.cfg === cfg && memo.runtimeModel === runtimeModel) {
|
|
50
81
|
memo.checkedAt = t;
|
|
51
|
-
return memo.info;
|
|
82
|
+
return actual ? { ...memo.info, actual } : memo.info;
|
|
52
83
|
}
|
|
53
84
|
const full = inspect(cfg, runtimeModel);
|
|
54
85
|
const info: StatusProviderInfo = { provider: full.provider, model: full.model };
|
|
55
86
|
memo = { info, cfg, runtimeModel, checkedAt: t, inspectedAt: t };
|
|
56
|
-
return info;
|
|
87
|
+
return actual ? { ...info, actual } : info;
|
|
57
88
|
};
|
|
58
89
|
}
|
|
@@ -19,7 +19,7 @@ import { debug } from '../debug/log.js';
|
|
|
19
19
|
import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
20
20
|
import { spawnElanous } from '../instance/spawn-elanous.js';
|
|
21
21
|
import { getUserConfig } from '../user-config.js';
|
|
22
|
-
import { resyncPendingPath } from './resync-tick.js';
|
|
22
|
+
import { resyncPendingPath, resyncPendingRecoveryPath } from './resync-tick.js';
|
|
23
23
|
|
|
24
24
|
export const REJUDGE_TICK_EVENT = 'rejudge-tick';
|
|
25
25
|
export const REJUDGE_DEFAULT_MAX_LOAD = 60;
|
|
@@ -63,8 +63,16 @@ function defaultStampPath(): string {
|
|
|
63
63
|
function readStamp(path: string): string | null {
|
|
64
64
|
try {
|
|
65
65
|
const value = (JSON.parse(readFileSync(path, 'utf8')) as { startedAt?: unknown }).startedAt;
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
if (typeof value !== 'string' || !Number.isFinite(Date.parse(value))) {
|
|
67
|
+
throw new Error(`invalid steward stamp startedAt: ${path}`);
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
} catch (error) {
|
|
71
|
+
// A missing stamp is the first tick. A corrupt or unreadable existing stamp is not:
|
|
72
|
+
// claiming it would overwrite the evidence and could launch an overlapping rejudge.
|
|
73
|
+
if ((error as NodeJS.ErrnoException).code === 'ENOENT') return null;
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
68
76
|
}
|
|
69
77
|
|
|
70
78
|
/** Same universe as this process (env inherited) · same installed version (entry next to this module). */
|
|
@@ -137,11 +145,18 @@ export async function rejudgeTick(deps: RejudgeTickDeps = {}): Promise<RejudgeTi
|
|
|
137
145
|
}
|
|
138
146
|
}
|
|
139
147
|
|
|
148
|
+
/**
|
|
149
|
+
* The resync marker, or its recovery sibling when the primary record could not be written after a push. Both carry
|
|
150
|
+
* `{ savedAt }`, so a same-tick rejudge still sees the new head instead of falling back to the cadence alone.
|
|
151
|
+
*/
|
|
140
152
|
function readPending(path: string): string | null {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
153
|
+
for (const candidate of [path, resyncPendingRecoveryPath(path)]) {
|
|
154
|
+
try {
|
|
155
|
+
const value = (JSON.parse(readFileSync(candidate, 'utf8')) as { savedAt?: unknown }).savedAt;
|
|
156
|
+
if (typeof value === 'string' && Number.isFinite(Date.parse(value))) return value;
|
|
157
|
+
} catch { /* missing or unreadable: fall through to the recovery marker */ }
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
145
160
|
}
|
|
146
161
|
|
|
147
162
|
if (import.meta.main) {
|
|
@@ -16,6 +16,36 @@ type ResyncTickResult = { decision: 'ran' | 'failed' | 'skipped-release' | 'skip
|
|
|
16
16
|
|
|
17
17
|
export function resyncPendingPath(): string { return join(effectiveInstanceRoot(), 'steward', 'resync-pending.json'); }
|
|
18
18
|
|
|
19
|
+
/**
|
|
20
|
+
* Fallback marker for the same-tick rejudge node when the primary marker cannot be written after a successful
|
|
21
|
+
* remote push. It lives next to the primary marker and carries the same `{ savedAt }` shape, so the consumer
|
|
22
|
+
* contract does not change — only the location the marker is read from.
|
|
23
|
+
*/
|
|
24
|
+
export function resyncPendingRecoveryPath(pendingPath: string = resyncPendingPath()): string {
|
|
25
|
+
return join(dirname(pendingPath), 'resync-pending-recovery.json');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Best-effort marker write: a record failure must not undo the completed push or hide its new head. */
|
|
29
|
+
function recordResyncPending(pendingPath: string): void {
|
|
30
|
+
const savedAt = new Date().toISOString();
|
|
31
|
+
try {
|
|
32
|
+
mkdirSync(dirname(pendingPath), { recursive: true });
|
|
33
|
+
writeFileSync(pendingPath, JSON.stringify({ savedAt }));
|
|
34
|
+
} catch (error) {
|
|
35
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
36
|
+
console.error(`steward resync: pending record write failed — ${message}`);
|
|
37
|
+
try {
|
|
38
|
+
const recoveryPath = resyncPendingRecoveryPath(pendingPath);
|
|
39
|
+
mkdirSync(dirname(recoveryPath), { recursive: true });
|
|
40
|
+
writeFileSync(recoveryPath, JSON.stringify({ savedAt }));
|
|
41
|
+
console.error(`steward resync: pending record recovered at ${recoveryPath}`);
|
|
42
|
+
} catch (fallbackError) {
|
|
43
|
+
// Nothing left to write: the tick still reports `ran` with the pushed summary, and the failure stays observable.
|
|
44
|
+
console.error(`steward resync: pending record recovery failed — ${fallbackError instanceof Error ? fallbackError.message : String(fallbackError)}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
19
49
|
/** The same registered, detached OP checkout used by steward launch; the installed package is not a git repository. */
|
|
20
50
|
export function stewardResyncRepoRoot(
|
|
21
51
|
resolveSeat: typeof resolveHqLaunchSeat = resolveHqLaunchSeat,
|
|
@@ -185,10 +215,7 @@ export async function resyncTickWithReleaseProbe(
|
|
|
185
215
|
result = { decision: 'skipped-release-window', reason: window === 'inside' ? 'scheduled release window' : 'release schedule unavailable' };
|
|
186
216
|
} else {
|
|
187
217
|
const summary = await run();
|
|
188
|
-
if (summary.saved > 0)
|
|
189
|
-
mkdirSync(dirname(pendingPath), { recursive: true });
|
|
190
|
-
writeFileSync(pendingPath, JSON.stringify({ savedAt: new Date().toISOString() }));
|
|
191
|
-
}
|
|
218
|
+
if (summary.saved > 0) recordResyncPending(pendingPath);
|
|
192
219
|
result = { decision: 'ran', summary };
|
|
193
220
|
}
|
|
194
221
|
}
|