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,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI-FLICKER-DRAW-INTEGRATION — one synchronized-output owner per dashboard frame.
|
|
3
|
+
*
|
|
4
|
+
* A dashboard frame is not a single write: the transient-overlay cleanup, the
|
|
5
|
+
* base frame, the coordinator modal overlay, the prompt repaint and the
|
|
6
|
+
* post-frame overlay stamp are flushed one after another. Under tmux each of
|
|
7
|
+
* those flushes is presented on its own, so a tick that rewrites the frame is
|
|
8
|
+
* visible as a flicker. Wrapping the whole compose in DEC synchronized output
|
|
9
|
+
* (`CSI ? 2026 h` … `CSI ? 2026 l`) lets the terminal present the composite
|
|
10
|
+
* frame atomically.
|
|
11
|
+
*
|
|
12
|
+
* The owner is deliberately tiny and synchronous: callers open it, draw, and
|
|
13
|
+
* close it in a `finally` so a throw inside the draw still emits the ESU and
|
|
14
|
+
* the *next* frame is not swallowed by a dangling synchronized-output region.
|
|
15
|
+
*
|
|
16
|
+
* The wrap nests with the display coordinator, which opens the same region
|
|
17
|
+
* around its own flush and whose `onRender` hook is what calls `drawNow()`.
|
|
18
|
+
* `src/display/synchronized-output-region.ts` keeps that single-owner: an
|
|
19
|
+
* inner open contributes no bytes, so the coordinator's overlay + cursor stamp
|
|
20
|
+
* stays inside the one presentation instead of being pushed out by an early
|
|
21
|
+
* inner ESU.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import {
|
|
25
|
+
SYNCHRONIZED_OUTPUT_BEGIN,
|
|
26
|
+
SYNCHRONIZED_OUTPUT_END,
|
|
27
|
+
openSynchronizedOutputRegion,
|
|
28
|
+
synchronizedOutputDisabledByEnv,
|
|
29
|
+
} from '../display/synchronized-output-region.js';
|
|
30
|
+
|
|
31
|
+
export { SYNCHRONIZED_OUTPUT_BEGIN, SYNCHRONIZED_OUTPUT_END };
|
|
32
|
+
|
|
33
|
+
export interface SynchronizedFrameOutputDeps {
|
|
34
|
+
/** Sink for the control sequences — production passes `process.stdout.write`. */
|
|
35
|
+
write: (chunk: string) => void;
|
|
36
|
+
/**
|
|
37
|
+
* Whether the sink may receive DEC 2026. Defaults to `true`. Production
|
|
38
|
+
* passes `process.stdout.isTTY` so piped/captured output stays
|
|
39
|
+
* byte-identical to what it was before this seam existed.
|
|
40
|
+
*/
|
|
41
|
+
supported?: boolean;
|
|
42
|
+
/** Environment escape hatch (`ELANOUS_SYNC_OUTPUT=off`). Defaults to `process.env`. */
|
|
43
|
+
env?: Record<string, string | undefined>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface SynchronizedFrameOutput {
|
|
47
|
+
/** Closes the region. Idempotent — a second call writes nothing. */
|
|
48
|
+
close: () => void;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function beginSynchronizedFrameOutput(
|
|
52
|
+
deps: SynchronizedFrameOutputDeps,
|
|
53
|
+
): SynchronizedFrameOutput {
|
|
54
|
+
const region = openSynchronizedOutputRegion();
|
|
55
|
+
const enabled =
|
|
56
|
+
region.outermost && deps.supported !== false && !synchronizedOutputDisabledByEnv(deps.env);
|
|
57
|
+
let closed = false;
|
|
58
|
+
if (enabled) {
|
|
59
|
+
try {
|
|
60
|
+
deps.write(SYNCHRONIZED_OUTPUT_BEGIN);
|
|
61
|
+
} catch (err) {
|
|
62
|
+
region.close();
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
close: () => {
|
|
68
|
+
if (closed) return;
|
|
69
|
+
closed = true;
|
|
70
|
+
if (enabled) deps.write(SYNCHRONIZED_OUTPUT_END);
|
|
71
|
+
region.close();
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// TUI-TYPING-LAG — bounded-chunk drain queue for the log plane.
|
|
2
|
+
//
|
|
3
|
+
// A worker that floods the log (streaming chunks, subagent output) used to hand
|
|
4
|
+
// the main thread one synchronous drain of the whole burst (e.g. StoreSink's
|
|
5
|
+
// detached flush inserting thousands of sqlite rows in one macrotask), so a key
|
|
6
|
+
// typed meanwhile waited for the entire drain (0.25–2.4s stalls). This queue
|
|
7
|
+
// drains at most `batchSize` items per scheduled tick and schedules the remainder
|
|
8
|
+
// as a NEW tick, so the event loop gets back to I/O (stdin) between chunks.
|
|
9
|
+
//
|
|
10
|
+
// Zero imports on purpose: the log sinks under
|
|
11
|
+
// src/mss/logging import it without creating a cycle.
|
|
12
|
+
|
|
13
|
+
/** Scheduler seam — production uses setImmediate / setTimeout(unref); stages inject a fake clock. */
|
|
14
|
+
export interface DebugBatchScheduler {
|
|
15
|
+
schedule(run: () => void, delayMs: number): unknown;
|
|
16
|
+
cancel(handle: unknown): void;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const defaultDebugBatchScheduler: DebugBatchScheduler = {
|
|
20
|
+
schedule(run, delayMs) {
|
|
21
|
+
if (delayMs <= 0) return { immediate: setImmediate(run) };
|
|
22
|
+
const timer = setTimeout(run, delayMs);
|
|
23
|
+
(timer as unknown as { unref?: () => void }).unref?.();
|
|
24
|
+
return { timeout: timer };
|
|
25
|
+
},
|
|
26
|
+
cancel(handle) {
|
|
27
|
+
const h = handle as { immediate?: ReturnType<typeof setImmediate>; timeout?: ReturnType<typeof setTimeout> } | null;
|
|
28
|
+
if (!h) return;
|
|
29
|
+
if (h.immediate !== undefined) clearImmediate(h.immediate);
|
|
30
|
+
if (h.timeout !== undefined) clearTimeout(h.timeout);
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export interface DebugLogBatchQueueOptions<T> {
|
|
35
|
+
/** Max items handed to `drain` per scheduled tick. `Infinity` = whole queue in one tick. */
|
|
36
|
+
batchSize: number;
|
|
37
|
+
/** Delay before each scheduled tick (0 = next loop iteration). */
|
|
38
|
+
flushDelayMs?: number;
|
|
39
|
+
scheduler?: DebugBatchScheduler;
|
|
40
|
+
/** Return `false` to stop chunking (e.g. the store is contended) — the remainder stays queued, unscheduled. */
|
|
41
|
+
drain: (items: T[]) => void | boolean;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export class DebugLogBatchQueue<T> {
|
|
45
|
+
private items: T[] = [];
|
|
46
|
+
private handle: unknown = null;
|
|
47
|
+
private hasHandle = false;
|
|
48
|
+
private flushCount = 0;
|
|
49
|
+
private readonly batchSize: number;
|
|
50
|
+
private readonly flushDelayMs: number;
|
|
51
|
+
private readonly scheduler: DebugBatchScheduler;
|
|
52
|
+
private readonly drainFn: (items: T[]) => void | boolean;
|
|
53
|
+
|
|
54
|
+
constructor(opts: DebugLogBatchQueueOptions<T>) {
|
|
55
|
+
this.batchSize = opts.batchSize > 0 ? opts.batchSize : 1;
|
|
56
|
+
this.flushDelayMs = Math.max(0, opts.flushDelayMs ?? 0);
|
|
57
|
+
this.scheduler = opts.scheduler ?? defaultDebugBatchScheduler;
|
|
58
|
+
this.drainFn = opts.drain;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
get pending(): number { return this.items.length; }
|
|
62
|
+
get flushes(): number { return this.flushCount; }
|
|
63
|
+
get scheduled(): boolean { return this.hasHandle; }
|
|
64
|
+
|
|
65
|
+
/** Enqueue without draining — the caller decides when to `schedule()`. */
|
|
66
|
+
push(item: T): void { this.items.push(item); }
|
|
67
|
+
|
|
68
|
+
/** Arm one drain tick (idempotent while a tick is in flight). */
|
|
69
|
+
schedule(): void {
|
|
70
|
+
if (this.hasHandle || this.items.length === 0) return;
|
|
71
|
+
this.hasHandle = true;
|
|
72
|
+
this.handle = this.scheduler.schedule(() => this.tick(), this.flushDelayMs);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Drop up to `count` oldest items; returns how many were dropped. */
|
|
76
|
+
dropOldest(count: number): number {
|
|
77
|
+
if (count <= 0) return 0;
|
|
78
|
+
const dropped = Math.min(count, this.items.length);
|
|
79
|
+
this.items.splice(0, dropped);
|
|
80
|
+
return dropped;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Synchronous full drain (exit / explicit flush) — one `drain` call, pending tick cancelled. */
|
|
84
|
+
flushAll(): void {
|
|
85
|
+
this.cancelTick();
|
|
86
|
+
if (this.items.length === 0) return;
|
|
87
|
+
const all = this.items;
|
|
88
|
+
this.items = [];
|
|
89
|
+
this.flushCount += 1;
|
|
90
|
+
this.drainFn(all);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Disarm the pending tick (items stay queued) — e.g. the store is contended. */
|
|
94
|
+
cancelScheduled(): void { this.cancelTick(); }
|
|
95
|
+
|
|
96
|
+
private cancelTick(): void {
|
|
97
|
+
if (!this.hasHandle) return;
|
|
98
|
+
this.scheduler.cancel(this.handle);
|
|
99
|
+
this.handle = null;
|
|
100
|
+
this.hasHandle = false;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
private tick(): void {
|
|
104
|
+
this.handle = null;
|
|
105
|
+
this.hasHandle = false;
|
|
106
|
+
if (this.items.length === 0) return;
|
|
107
|
+
const chunk = Number.isFinite(this.batchSize)
|
|
108
|
+
? this.items.splice(0, this.batchSize)
|
|
109
|
+
: this.items.splice(0, this.items.length);
|
|
110
|
+
this.flushCount += 1;
|
|
111
|
+
let keepGoing = true;
|
|
112
|
+
try {
|
|
113
|
+
keepGoing = this.drainFn(chunk) !== false;
|
|
114
|
+
} finally {
|
|
115
|
+
// The remainder is a separate tick so stdin can be served between chunks.
|
|
116
|
+
if (keepGoing) this.schedule();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// TUI-LOG-SESSION-TAG (0.2.36 · 10-23) — tell TUIs apart in one logs.db.
|
|
2
|
+
//
|
|
3
|
+
// Several TUIs (classic `elanous` / `--legacy` and `--tui next`) on one host write to the same logs.db
|
|
4
|
+
// with surface `tui`. Their rows had no pid and usually no session_id (the dashboard does not set the
|
|
5
|
+
// ambient session), so the 10-23 n8n SIGTTIN incident could not tell which TUI's `tui.event-loop stall`
|
|
6
|
+
// was which. This wraps the TUI's logs.db sink and stamps every plain-object payload with:
|
|
7
|
+
// tuiPid — the TUI process id
|
|
8
|
+
// tuiName — the `--name` launch alias (when given)
|
|
9
|
+
// tuiSession — the chat session the TUI currently owns (getTuiOwnedSession, when known)
|
|
10
|
+
// Caller-supplied fields win; primitive / non-plain payloads are left untouched; an absent payload becomes
|
|
11
|
+
// the tag object. No schema change — the tag rides in the existing `data` column.
|
|
12
|
+
//
|
|
13
|
+
// Query: `elanous logs --surface tui --grep '"tuiName":"n8n"'` · `--grep '"tuiPid":20960'`
|
|
14
|
+
// or `--json | jq 'select((.data|fromjson? // {}).tuiName == "n8n")'`.
|
|
15
|
+
|
|
16
|
+
import type { LogSink } from '../mss/logging/sink.js';
|
|
17
|
+
import type { LogRecord } from '../mss/logging/record.js';
|
|
18
|
+
|
|
19
|
+
export interface TuiLogTag {
|
|
20
|
+
pid: number;
|
|
21
|
+
name?: string;
|
|
22
|
+
/** Current owned chat session id, or null. Called per record — keep it cheap. */
|
|
23
|
+
session?: () => string | null | undefined;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
27
|
+
if (value === null || typeof value !== 'object') return false;
|
|
28
|
+
const p = Object.getPrototypeOf(value);
|
|
29
|
+
return p === Object.prototype || p === null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Pure — returns the record with the tag applied (a new object when changed). */
|
|
33
|
+
export function tagTuiRecord(rec: LogRecord, tag: TuiLogTag): LogRecord {
|
|
34
|
+
let session: string | null | undefined;
|
|
35
|
+
try { session = tag.session?.(); } catch { session = undefined; }
|
|
36
|
+
const add: Record<string, unknown> = { tuiPid: tag.pid };
|
|
37
|
+
const name = tag.name?.trim();
|
|
38
|
+
if (name) add.tuiName = name;
|
|
39
|
+
if (session) add.tuiSession = session;
|
|
40
|
+
if (rec.data === undefined) return { ...rec, data: add };
|
|
41
|
+
if (!isPlainObject(rec.data)) return rec;
|
|
42
|
+
const data = rec.data;
|
|
43
|
+
const missing = Object.entries(add).filter(([k]) => !Object.hasOwn(data, k));
|
|
44
|
+
if (missing.length === 0) return rec;
|
|
45
|
+
return { ...rec, data: { ...data, ...Object.fromEntries(missing) } };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Process-wide tag state — the TUI's self-report fills it (`--name` at launch, the owned session on every
|
|
49
|
+
// claim) so the sink wrapper needs no import of the TUI modules (no cycle · no hub edit).
|
|
50
|
+
let processName: string | undefined;
|
|
51
|
+
let processSession: string | null = null;
|
|
52
|
+
export function setTuiLogName(name: string | undefined): void { processName = name?.trim() || undefined; }
|
|
53
|
+
export function setTuiLogSession(id: string | null): void { processSession = id || null; }
|
|
54
|
+
/** The tag for this process: pid ⊕ the state above. */
|
|
55
|
+
export function processTuiLogTag(): TuiLogTag {
|
|
56
|
+
return { pid: process.pid, get name() { return processName; }, session: () => processSession };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Wraps a sink so every record it receives is tagged. */
|
|
60
|
+
export function withTuiLogTag(inner: LogSink, tag: TuiLogTag): LogSink {
|
|
61
|
+
return {
|
|
62
|
+
name: inner.name,
|
|
63
|
+
emit(rec: LogRecord): void { inner.emit(tagTuiRecord(rec, tag)); },
|
|
64
|
+
...(inner.flush ? { flush: () => inner.flush?.() } : {}),
|
|
65
|
+
...(inner.clear ? { clear: () => inner.clear?.() } : {}),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
@@ -447,7 +447,14 @@ function recentToolTrail(task: AgentTask, limit: number, cache: ScanCache): Agen
|
|
|
447
447
|
return trail;
|
|
448
448
|
}
|
|
449
449
|
|
|
450
|
+
/** Tool calls the child made: the live counter (bumped as each call starts) or the
|
|
451
|
+
* tool_use blocks in its history, whichever is larger — history lags until a tool
|
|
452
|
+
* loop completes and stays short when the run is aborted or errors. */
|
|
450
453
|
function countToolUses(task: AgentTask, cache: ScanCache): number {
|
|
454
|
+
return Math.max(task.toolCallCount ?? 0, countHistoryToolUses(task, cache));
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
function countHistoryToolUses(task: AgentTask, cache: ScanCache): number {
|
|
451
458
|
const len = task.messages?.length ?? 0;
|
|
452
459
|
if (len === 0) return 0;
|
|
453
460
|
const cached = cache.count.get(task.id);
|
|
@@ -22,6 +22,10 @@ import { TIER_ORDER, tierRank, tiersCompatible } from './types.js';
|
|
|
22
22
|
import { resolveKeyAlias } from '../input-core/key-alias-table.js';
|
|
23
23
|
import type { DisplayEventBus } from './events.js';
|
|
24
24
|
import { paintCursor, type CursorState } from './cursor-state.js';
|
|
25
|
+
import {
|
|
26
|
+
openSynchronizedOutputRegion,
|
|
27
|
+
synchronizedOutputDisabledByEnv,
|
|
28
|
+
} from './synchronized-output-region.js';
|
|
25
29
|
import { deriveCursor, type CursorDecision } from './cursor-owner.js';
|
|
26
30
|
import {
|
|
27
31
|
createVirtualCursorRegistry,
|
|
@@ -261,7 +265,6 @@ export class DisplayCoordinator {
|
|
|
261
265
|
* even when its bytes are unchanged, because the base rows under it
|
|
262
266
|
* were just repainted. Replaces the old forceNext follow-up. */
|
|
263
267
|
private overlayRowsInvalidated = false;
|
|
264
|
-
|
|
265
268
|
private surfaces = new Map<SurfaceId, DisplaySurface>();
|
|
266
269
|
private focusNodes = new Map<SurfaceId, FocusNode>();
|
|
267
270
|
private keyBindings = new Map<string, DisplayKeyBinding>();
|
|
@@ -288,6 +291,7 @@ export class DisplayCoordinator {
|
|
|
288
291
|
private dirty = new Set<SurfaceId | 'all' | 'status' | 'dock'>();
|
|
289
292
|
private forceNext = false;
|
|
290
293
|
private scheduled: Timer | null = null;
|
|
294
|
+
private scheduleGeneration = 0;
|
|
291
295
|
// P2.2.b — cursor state. Last-writer-wins. cursorVersion bumps on
|
|
292
296
|
// every setCursor; lastEmittedCursorVersion tracks what's been
|
|
293
297
|
// written so flushCursor only emits on change.
|
|
@@ -966,6 +970,36 @@ export class DisplayCoordinator {
|
|
|
966
970
|
}, 'dashboard');
|
|
967
971
|
}
|
|
968
972
|
|
|
973
|
+
/** Mark a render dirty and flush it before returning. Used when a host
|
|
974
|
+
* already owns a synchronized output batch around the render. */
|
|
975
|
+
requestRenderNow(opts?: { region?: SurfaceId | 'all'; force?: boolean }): void {
|
|
976
|
+
this.markDirty(opts?.region ?? 'all');
|
|
977
|
+
if (opts?.force) this.forceNext = true;
|
|
978
|
+
this.scheduleGeneration += 1;
|
|
979
|
+
this.scheduled = null;
|
|
980
|
+
this.flush();
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
/** Run synchronous terminal writes inside DECSET 2026 when enabled.
|
|
984
|
+
* Coordinator flushes, the dashboard draw seam, and host paint batches
|
|
985
|
+
* share the same re-entrant region instead of emitting nested markers. */
|
|
986
|
+
withSynchronizedOutput<T>(paint: () => T): T {
|
|
987
|
+
const syncRegion = openSynchronizedOutputRegion();
|
|
988
|
+
const syncOutput = syncRegion.outermost && this.syncOutputEnabled;
|
|
989
|
+
try {
|
|
990
|
+
if (syncOutput) {
|
|
991
|
+
this.writeOverlay?.('\x1b[?2026h');
|
|
992
|
+
}
|
|
993
|
+
return paint();
|
|
994
|
+
} finally {
|
|
995
|
+
try {
|
|
996
|
+
if (syncOutput) this.writeOverlay?.('\x1b[?2026l');
|
|
997
|
+
} finally {
|
|
998
|
+
syncRegion.close();
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
|
|
969
1003
|
handle(owner: SurfaceOwner): DisplayHandle {
|
|
970
1004
|
return {
|
|
971
1005
|
owner,
|
|
@@ -2629,10 +2663,16 @@ export class DisplayCoordinator {
|
|
|
2629
2663
|
|
|
2630
2664
|
private requestFrame(): void {
|
|
2631
2665
|
if (this.scheduled !== null) return;
|
|
2632
|
-
|
|
2666
|
+
const generation = ++this.scheduleGeneration;
|
|
2667
|
+
const marker = {} as Timer;
|
|
2668
|
+
let scheduled: Timer | undefined;
|
|
2669
|
+
this.scheduled = marker;
|
|
2670
|
+
scheduled = this.scheduleFn(() => {
|
|
2671
|
+
if (generation !== this.scheduleGeneration || (this.scheduled !== marker && this.scheduled !== scheduled)) return;
|
|
2633
2672
|
this.scheduled = null;
|
|
2634
2673
|
this.flush();
|
|
2635
2674
|
}, this.frameMs);
|
|
2675
|
+
if (this.scheduled === marker) this.scheduled = scheduled;
|
|
2636
2676
|
}
|
|
2637
2677
|
|
|
2638
2678
|
private flush(): void {
|
|
@@ -2661,9 +2701,7 @@ export class DisplayCoordinator {
|
|
|
2661
2701
|
// `ELANOUS_SYNC_OUTPUT=off` for buggy terminals (none observed in
|
|
2662
2702
|
// practice, 2026-04-21). Pattern matches Textual (synchronized
|
|
2663
2703
|
// output since v0.47) + Ratatui backend buffer-swap semantics.
|
|
2664
|
-
|
|
2665
|
-
if (syncOutput) this.writeOverlay?.('\x1b[?2026h');
|
|
2666
|
-
try {
|
|
2704
|
+
this.withSynchronizedOutput(() => {
|
|
2667
2705
|
// H1.6 · W2 shadow flush. Fires rc.on('before-flush') +
|
|
2668
2706
|
// rc.on('after-flush') synchronously. Subscriber paints (if any
|
|
2669
2707
|
// are wired in Phase γ) land INSIDE the DECSET 2026 atomic-frame
|
|
@@ -2696,11 +2734,7 @@ export class DisplayCoordinator {
|
|
|
2696
2734
|
// so the prior cursor position may have been overwritten. Always
|
|
2697
2735
|
// re-assert. The bypass-batch path calls flushCursor(false).
|
|
2698
2736
|
this.flushCursor(true);
|
|
2699
|
-
}
|
|
2700
|
-
// Always close the sync block — a throw inside render hooks
|
|
2701
|
-
// must not leave the terminal stuck in "buffering" mode.
|
|
2702
|
-
if (syncOutput) this.writeOverlay?.('\x1b[?2026l');
|
|
2703
|
-
}
|
|
2737
|
+
});
|
|
2704
2738
|
this.eventBus?.emit({ type: 'render:after', request, snapshot });
|
|
2705
2739
|
this.pendingWidgetPatches = [];
|
|
2706
2740
|
this.pendingLogLines = [];
|
|
@@ -2713,8 +2747,7 @@ export class DisplayCoordinator {
|
|
|
2713
2747
|
* not a TTY (unit-test + CI environment) so overlay assertions
|
|
2714
2748
|
* don't have to strip the ?2026h / ?2026l pair. */
|
|
2715
2749
|
private get syncOutputEnabled(): boolean {
|
|
2716
|
-
|
|
2717
|
-
if (v === 'off' || v === '0' || v === 'false') return false;
|
|
2750
|
+
if (synchronizedOutputDisabledByEnv()) return false;
|
|
2718
2751
|
// Non-TTY environments (tests, piped output) gain nothing from
|
|
2719
2752
|
// atomic frame wrapping and the sequences would pollute assertions.
|
|
2720
2753
|
if (typeof process !== 'undefined' && process.stdout && process.stdout.isTTY !== true) {
|
|
@@ -5,10 +5,9 @@
|
|
|
5
5
|
// resize produced a stale paint (old input prompt row + ghost tab
|
|
6
6
|
// bar) until the next keystroke triggered a redraw.
|
|
7
7
|
//
|
|
8
|
-
// Strategy:
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// transient paint error doesn't kill the listener.
|
|
8
|
+
// Strategy: debounce resize bursts for one frame (16ms), then paint the
|
|
9
|
+
// dashboard, prompt, and overlays synchronously inside one atomic output
|
|
10
|
+
// block. Transient paint errors do not kill the listener.
|
|
12
11
|
//
|
|
13
12
|
// (3) TUI-PICKER-RESIZE-SHRINK (#76 · 2026-10-17) — then ask the
|
|
14
13
|
// coordinator for one FORCED frame. Steps (1)+(2) bypass the
|
|
@@ -28,6 +27,8 @@
|
|
|
28
27
|
|
|
29
28
|
import { debug } from '../debug/log.js';
|
|
30
29
|
|
|
30
|
+
const RESIZE_DEBOUNCE_MS = 16;
|
|
31
|
+
|
|
31
32
|
export interface ResizeListenerDeps {
|
|
32
33
|
draw: (opts?: { force?: boolean }) => void;
|
|
33
34
|
promptCtl: { repaint: () => void };
|
|
@@ -35,6 +36,9 @@ export interface ResizeListenerDeps {
|
|
|
35
36
|
* re-emitted on top of the chrome the prompt repaint just wrote.
|
|
36
37
|
* Optional: hosts without a coordinator keep the legacy two-step. */
|
|
37
38
|
requestOverlayFrame?: () => void;
|
|
39
|
+
/** Run the whole resize repaint batch inside the host's atomic output
|
|
40
|
+
* block. Nested coordinator frames must share this outer block. */
|
|
41
|
+
withSynchronizedOutput?: (paint: () => void) => void;
|
|
38
42
|
}
|
|
39
43
|
|
|
40
44
|
/** Registers the resize listener and returns a dispose fn that
|
|
@@ -42,26 +46,43 @@ export interface ResizeListenerDeps {
|
|
|
42
46
|
* fresh listener; the caller is responsible for disposing previous
|
|
43
47
|
* installations. */
|
|
44
48
|
export function installResizeListener(deps: ResizeListenerDeps): () => void {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
49
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
50
|
+
let disposed = false;
|
|
51
|
+
const repaint = (): void => {
|
|
52
|
+
timer = undefined;
|
|
53
|
+
if (disposed) return;
|
|
54
|
+
const paint = (): void => {
|
|
55
|
+
try { deps.draw({ force: true }); } catch { /* swallow — paint errors shouldn't break resize */ }
|
|
56
|
+
try { deps.promptCtl.repaint(); } catch { /* swallow */ }
|
|
57
|
+
let overlayFrame: 'requested' | 'absent' | 'failed' = 'absent';
|
|
58
|
+
if (deps.requestOverlayFrame) {
|
|
59
|
+
try {
|
|
60
|
+
deps.requestOverlayFrame();
|
|
61
|
+
overlayFrame = 'requested';
|
|
62
|
+
} catch {
|
|
63
|
+
overlayFrame = 'failed';
|
|
64
|
+
}
|
|
55
65
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
66
|
+
debug.log('display.resize', 'repaint', {
|
|
67
|
+
cols: process.stdout.columns ?? null,
|
|
68
|
+
rows: process.stdout.rows ?? null,
|
|
69
|
+
overlayFrame,
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
try {
|
|
73
|
+
if (deps.withSynchronizedOutput) deps.withSynchronizedOutput(paint);
|
|
74
|
+
else paint();
|
|
75
|
+
} catch { /* resize painting must not detach the listener */ }
|
|
76
|
+
};
|
|
77
|
+
const handler = (): void => {
|
|
78
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
79
|
+
timer = setTimeout(repaint, RESIZE_DEBOUNCE_MS);
|
|
62
80
|
};
|
|
63
81
|
process.stdout.on('resize', handler);
|
|
64
82
|
return (): void => {
|
|
83
|
+
disposed = true;
|
|
84
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
85
|
+
timer = undefined;
|
|
65
86
|
process.stdout.removeListener('resize', handler);
|
|
66
87
|
};
|
|
67
88
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DECSET 2026 (synchronized output) region registry.
|
|
3
|
+
*
|
|
4
|
+
* Two owners wrap their writes in `CSI ? 2026 h` … `CSI ? 2026 l`: the
|
|
5
|
+
* display coordinator (`flush()`) and the dashboard draw seam
|
|
6
|
+
* (`src/dashboard/synchronized-frame-output.ts`). They nest — the
|
|
7
|
+
* coordinator opens a region and its `onRender` hook runs `drawNow()`,
|
|
8
|
+
* which wants the same wrap for the frame + prompt repaint. A second pair
|
|
9
|
+
* emitted inside the outer one is not harmless: the inner ESU flushes the
|
|
10
|
+
* terminal early, so everything the coordinator writes afterwards (modal
|
|
11
|
+
* overlay, cursor) lands in a separate presentation — exactly the flicker
|
|
12
|
+
* the wrap exists to prevent.
|
|
13
|
+
*
|
|
14
|
+
* The registry makes the wrap re-entrant: whoever opens first owns the
|
|
15
|
+
* byte pair; nested openers contribute no bytes and never close the outer
|
|
16
|
+
* region. Every opener must close its handle (idempotent) so the depth
|
|
17
|
+
* stays balanced even when a draw throws.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
export const SYNCHRONIZED_OUTPUT_BEGIN = '\x1b[?2026h';
|
|
21
|
+
export const SYNCHRONIZED_OUTPUT_END = '\x1b[?2026l';
|
|
22
|
+
|
|
23
|
+
export interface SynchronizedOutputRegion {
|
|
24
|
+
/** true when this region owns the emitted BSU/ESU pair. */
|
|
25
|
+
readonly outermost: boolean;
|
|
26
|
+
/** Idempotent — closes this region exactly once. */
|
|
27
|
+
close(): void;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let openDepth = 0;
|
|
31
|
+
|
|
32
|
+
/** True while any owner holds a synchronized-output region open. */
|
|
33
|
+
export function isSynchronizedOutputRegionOpen(): boolean {
|
|
34
|
+
return openDepth > 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* `ELANOUS_SYNC_OUTPUT=off|0|false` escape hatch for terminals that
|
|
39
|
+
* mishandle DEC 2026. Anything else (including unset) keeps the wrap on.
|
|
40
|
+
*/
|
|
41
|
+
export function synchronizedOutputDisabledByEnv(
|
|
42
|
+
env: Record<string, string | undefined> = process.env,
|
|
43
|
+
): boolean {
|
|
44
|
+
const value = (env.ELANOUS_SYNC_OUTPUT ?? 'on').toLowerCase();
|
|
45
|
+
return value === 'off' || value === '0' || value === 'false';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function openSynchronizedOutputRegion(): SynchronizedOutputRegion {
|
|
49
|
+
const outermost = openDepth === 0;
|
|
50
|
+
openDepth += 1;
|
|
51
|
+
let closed = false;
|
|
52
|
+
return {
|
|
53
|
+
outermost,
|
|
54
|
+
close(): void {
|
|
55
|
+
if (closed) return;
|
|
56
|
+
closed = true;
|
|
57
|
+
if (openDepth > 0) openDepth -= 1;
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
@@ -10,20 +10,33 @@
|
|
|
10
10
|
/**
|
|
11
11
|
* 독립 프로세스에서 logs.db 싱크를 등록한다. 반환된 off 는 process 'exit' 에 자동 배선된다.
|
|
12
12
|
* @param surface 이 프로세스가 남기는 로그의 surface 라벨(예: 'scheduler'·'autopilot').
|
|
13
|
+
* @param opts.wrapSink logs.db 싱크를 감싼다(예: TUI 는 pid·`--name`·세션을 data 에 찍는다 — debug/tui-log-tag.ts).
|
|
13
14
|
*/
|
|
14
|
-
export async function registerStandaloneLogSink(
|
|
15
|
+
export async function registerStandaloneLogSink(
|
|
16
|
+
surface: string,
|
|
17
|
+
opts: { wrapSink?: (sink: import('../mss/logging/sink.js').LogSink) => import('../mss/logging/sink.js').LogSink } = {},
|
|
18
|
+
): Promise<boolean> {
|
|
15
19
|
try {
|
|
16
20
|
const [storeMod, dbgMod, cfgMod] = await Promise.all([
|
|
17
21
|
import('../mss/logging/log-store.js'),
|
|
18
22
|
import('../debug/log.js'),
|
|
19
23
|
import('../user-config.js'),
|
|
20
24
|
]);
|
|
25
|
+
// TUI-LOG-SESSION-TAG — 한 logs.db 를 여러 TUI(클래식·next)가 쓴다: 행마다 pid·`--name`·소유 세션을 data 에 찍는다.
|
|
26
|
+
if (surface === 'tui' && !opts.wrapSink) {
|
|
27
|
+
const tagMod = await import('../debug/tui-log-tag.js');
|
|
28
|
+
const tag = tagMod.processTuiLogTag();
|
|
29
|
+
opts = { ...opts, wrapSink: (s) => tagMod.withTuiLogTag(s, tag) };
|
|
30
|
+
}
|
|
21
31
|
const logsCfg = cfgMod.getUserConfig().logs;
|
|
22
32
|
storeMod.setLogInstanceName(logsCfg.instanceName);
|
|
33
|
+
// TUI-TYPING-LAG — TUI 는 워커 로그 폭주를 덩어리로 나눠 넣는다(키가 drain 전체를 기다리지 않게).
|
|
34
|
+
const drainChunkSize = storeMod.logStoreDrainChunkForSurface(surface);
|
|
23
35
|
const offStore = storeMod.registerLogStoreSink(
|
|
24
|
-
(s) => dbgMod.debug.registerSink(s),
|
|
36
|
+
(s) => dbgMod.debug.registerSink(opts.wrapSink ? opts.wrapSink(s) : s),
|
|
25
37
|
surface,
|
|
26
38
|
logsCfg.retention,
|
|
39
|
+
drainChunkSize !== undefined ? { drainChunkSize } : {},
|
|
27
40
|
);
|
|
28
41
|
if (!offStore) return false;
|
|
29
42
|
process.on('exit', offStore);
|