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
package/src/dashboard/index.ts
CHANGED
|
@@ -255,6 +255,62 @@ import {
|
|
|
255
255
|
getDashboardContextMenuRegistry,
|
|
256
256
|
} from './context-menu/registry.js';
|
|
257
257
|
import { createTransientOverlayHost } from '../display/transient-overlay-host.js';
|
|
258
|
+
import { beginSynchronizedFrameOutput } from './synchronized-frame-output.js';
|
|
259
|
+
import type { SynchronizedFrameOutputDeps } from './synchronized-frame-output.js';
|
|
260
|
+
export {
|
|
261
|
+
beginSynchronizedFrameOutput,
|
|
262
|
+
SYNCHRONIZED_OUTPUT_BEGIN,
|
|
263
|
+
SYNCHRONIZED_OUTPUT_END,
|
|
264
|
+
} from './synchronized-frame-output.js';
|
|
265
|
+
export type {
|
|
266
|
+
SynchronizedFrameOutput,
|
|
267
|
+
SynchronizedFrameOutputDeps,
|
|
268
|
+
} from './synchronized-frame-output.js';
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* TUI-FLICKER-DRAW-INTEGRATION — the single synchronized-output owner that every
|
|
272
|
+
* dashboard draw entry goes through: BSU → draw body (frame + coordinator modal
|
|
273
|
+
* overlay + prompt repaint) → ESU. The finally keeps the region closed when the
|
|
274
|
+
* body throws, so a failed compose cannot leave a dangling BSU that swallows the
|
|
275
|
+
* next frame.
|
|
276
|
+
*/
|
|
277
|
+
export function runSynchronizedFrameDraw<T>(
|
|
278
|
+
drawBody: () => T,
|
|
279
|
+
deps: SynchronizedFrameOutputDeps,
|
|
280
|
+
): T {
|
|
281
|
+
const frame = beginSynchronizedFrameOutput(deps);
|
|
282
|
+
try {
|
|
283
|
+
return drawBody();
|
|
284
|
+
} finally {
|
|
285
|
+
frame.close();
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export interface SynchronizedFrameDrawSink {
|
|
290
|
+
write: (chunk: string) => void;
|
|
291
|
+
/** Production passes `process.stdout.isTTY`: only a tty receives DEC 2026. */
|
|
292
|
+
isTTY?: boolean;
|
|
293
|
+
/** Environment for the `ELANOUS_SYNC_OUTPUT` escape hatch. Defaults to `process.env`. */
|
|
294
|
+
env?: Record<string, string | undefined>;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* TUI-FLICKER-DRAW-INTEGRATION — production entry for a synchronized dashboard
|
|
299
|
+
* frame. `drawNow` (the single draw function both the force path and the queued
|
|
300
|
+
* microtask path call) hands its compose body to this function, so the tty gate
|
|
301
|
+
* and the BSU/ESU ownership live in exactly one place.
|
|
302
|
+
*/
|
|
303
|
+
export function drawDashboardFrameSynchronized<T>(
|
|
304
|
+
drawBody: () => T,
|
|
305
|
+
sink: SynchronizedFrameDrawSink = process.stdout,
|
|
306
|
+
): T {
|
|
307
|
+
return runSynchronizedFrameDraw(drawBody, {
|
|
308
|
+
write: (chunk) => { sink.write(chunk); },
|
|
309
|
+
supported: sink.isTTY === true,
|
|
310
|
+
env: sink.env,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
|
|
258
314
|
import { configureThemeIconsGetter } from '../theme/icons.js';
|
|
259
315
|
import { configureModalAdapterTheme } from '../ui/modal-adapter.js';
|
|
260
316
|
import {
|
|
@@ -328,6 +384,7 @@ import { composeDashboardKeyHandlers, dispatchDashboardKey } from './input/key-d
|
|
|
328
384
|
import { runDashboardChatMainEntry } from './input/chat-main-entry-runtime.js';
|
|
329
385
|
import { createMirrorDrawThrottle } from './mirror-draw-throttle.js';
|
|
330
386
|
import { runDashboardChatMainPlainTurn } from './input/chat-main-plain-turn-runtime.js';
|
|
387
|
+
import { createDashboardTurnAutoheal } from './input/turn-autoheal.js';
|
|
331
388
|
import {
|
|
332
389
|
createDashboardChatMainTurnSubmit,
|
|
333
390
|
runDashboardChatMainSubmitIntent,
|
|
@@ -451,7 +508,7 @@ import { FoldStack } from '../fold-stack.js';
|
|
|
451
508
|
import { getSkillIndex, reloadSkillIndex, applySkillFilter, skillIndexProblems } from '../skills/index.js';
|
|
452
509
|
import { skillRepairNotice } from '../skills/repair.js';
|
|
453
510
|
import type { DetectResult } from '../skills/router.js';
|
|
454
|
-
import { detectUrlRoute } from '../skills/url-router.js';
|
|
511
|
+
import { detectUrlRoute, extractUrls, workContextGuardReason } from '../skills/url-router.js';
|
|
455
512
|
import {
|
|
456
513
|
observeDevRequestRouteFailSoft,
|
|
457
514
|
type DevRequestRoutingConfig,
|
|
@@ -541,6 +598,54 @@ export function settleEscAbortPendingLines(lines: string[], fromIndex: number):
|
|
|
541
598
|
}
|
|
542
599
|
}
|
|
543
600
|
|
|
601
|
+
export interface EscAbortPendingSoftStopDeps {
|
|
602
|
+
/** Live foreground harness space for this turn — null when unidentified or multiple runs. */
|
|
603
|
+
getActiveHarnessSpace: () => string | null;
|
|
604
|
+
/** Push a line into the chat transcript. */
|
|
605
|
+
pushChatLine: (line: string) => void;
|
|
606
|
+
/** Self-implement hint line; returns true when it consumed the event. */
|
|
607
|
+
showHarnessEscHint: (targets: readonly string[]) => boolean;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
export type EscAbortPendingSoftStopOutcome = 'stopped' | 'failed' | 'hint' | 'waiting';
|
|
611
|
+
|
|
612
|
+
export interface EscAbortPendingSoftStopResult {
|
|
613
|
+
outcome: EscAbortPendingSoftStopOutcome;
|
|
614
|
+
/** Harness space that received the durable stop marker, when any. */
|
|
615
|
+
stoppedHarnessSpace: string | null;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
/**
|
|
619
|
+
* ⭐ TUI-ESC-EXIT production seam — the ESC soft-stop callback that
|
|
620
|
+
* `attachChatStreamingKeys` wires into `createEscAbortGate`'s
|
|
621
|
+
* `onAbortPending`, extracted as a directly callable export so the incident
|
|
622
|
+
* test (test/esc-harness-stop.test.ts) exercises the same function the
|
|
623
|
+
* dashboard executes. Identified foreground harness space → enqueue the real
|
|
624
|
+
* durable soft-stop marker (`enqueueSoftStop`) and verify it
|
|
625
|
+
* (`readSoftStopRequestStatus`), pushing the Korean stopped/failure line;
|
|
626
|
+
* unidentified/multiple-run falls back to the self-implement hint, else the
|
|
627
|
+
* caller paints the waiting line (`waiting`).
|
|
628
|
+
*/
|
|
629
|
+
export function runEscAbortPendingSoftStop(
|
|
630
|
+
targets: readonly string[],
|
|
631
|
+
deps: EscAbortPendingSoftStopDeps,
|
|
632
|
+
): EscAbortPendingSoftStopResult {
|
|
633
|
+
const spaceId = deps.getActiveHarnessSpace();
|
|
634
|
+
if (spaceId) {
|
|
635
|
+
try {
|
|
636
|
+
enqueueSoftStop(spaceId);
|
|
637
|
+
if (readSoftStopRequestStatus(spaceId).status !== 'present') throw new Error('soft-stop marker not persisted');
|
|
638
|
+
deps.pushChatLine(' ⏹ 멈췄다 — 해당 하니스 런에 중단 요청을 보냈습니다.');
|
|
639
|
+
return { outcome: 'stopped', stoppedHarnessSpace: spaceId };
|
|
640
|
+
} catch {
|
|
641
|
+
deps.pushChatLine(' ⚠ 하니스 런 중단 요청을 보내지 못했습니다. /harness runs 에서 확인해 주세요.');
|
|
642
|
+
return { outcome: 'failed', stoppedHarnessSpace: null };
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
if (deps.showHarnessEscHint(targets)) return { outcome: 'hint', stoppedHarnessSpace: null };
|
|
646
|
+
return { outcome: 'waiting', stoppedHarnessSpace: null };
|
|
647
|
+
}
|
|
648
|
+
|
|
544
649
|
export type DashboardToolDispatchSignalSource = 'parent-turn' | 'fallback';
|
|
545
650
|
|
|
546
651
|
export interface DashboardToolDispatchSignalObservation {
|
|
@@ -646,7 +751,7 @@ import { getModelFamily, getModelTier } from '../models/prompts.js';
|
|
|
646
751
|
import { buildPromptInjection, getPromptBankStore } from '../prompt-bank/index.js';
|
|
647
752
|
import { getInputHistoryStore } from '../input-history.js';
|
|
648
753
|
import { inspectActiveProvider } from '../provider-summary.js';
|
|
649
|
-
import { createStatusProviderInfoReader } from '../status/status-provider-info.js';
|
|
754
|
+
import { createStatusProviderInfoReader, statusModelActual } from '../status/status-provider-info.js';
|
|
650
755
|
import { activeCodexAccountView } from '../oauth/codex-account-store.js';
|
|
651
756
|
import { buildDashboardStatusLines, readDashboardSeatsNow, type DashboardStatusLinesInput } from './dashboard-status-lines.js';
|
|
652
757
|
import { buildFirstScreenBand, resolveTuiDaemonLink, type TuiDaemonLink } from './first-screen-band.js';
|
|
@@ -898,7 +1003,7 @@ import { runPtySnapshot, type PtyTakeoverCommandDeps } from '../cli/pty-takeover
|
|
|
898
1003
|
import { requestRemotePtyControl } from '../pty-shell/pty-control-ipc.js';
|
|
899
1004
|
import { getHarnessRunId } from '../harness/harness-space.js';
|
|
900
1005
|
import { formatPtyCallLine, formatPtyResultLine } from '../pty-activity-log.js';
|
|
901
|
-
import { getSessionMetrics } from '../status/metrics.js';
|
|
1006
|
+
import { getSessionMetrics, noteRestoredContext } from '../status/metrics.js';
|
|
902
1007
|
import {
|
|
903
1008
|
createContextRegistry, tokenizeInput, pruneUnreferenced,
|
|
904
1009
|
addAttachmentEx as ctxAddEx,
|
|
@@ -975,7 +1080,7 @@ import {
|
|
|
975
1080
|
deriveDaemonHttpBase,
|
|
976
1081
|
fetchDaemonSessionHistory,
|
|
977
1082
|
} from './acp-boot.js';
|
|
978
|
-
import {
|
|
1083
|
+
import { renderRestoredTranscriptLines } from './replay-preview.js';
|
|
979
1084
|
import {
|
|
980
1085
|
buildDashboardTurnPreamble,
|
|
981
1086
|
} from './turn-preamble.js';
|
|
@@ -1013,6 +1118,7 @@ import { spawnCodingAgent, CodingAgentBinaryMissing } from '../terminal/coding-a
|
|
|
1013
1118
|
import type { TerminalSession } from '../terminal/session-registry.js';
|
|
1014
1119
|
import { createSessionPickerModal } from '../session/picker-modal.js';
|
|
1015
1120
|
import { listSessions as listChatSessionsForResume, adoptSession as adoptChatSession, setActiveSessionId as markActiveChatSession } from '../session/index.js';
|
|
1121
|
+
import { idPrefixCell, sessionIdPrefixes, sessionListTime } from '../session/id-prefix.js';
|
|
1016
1122
|
// TUI 부활 S-b — 타임트래블 포크 엔진 (codex ForkSnapshot 동형 · 2026-07-09
|
|
1017
1123
|
// 이식 후 호출처 0 이던 방치 자산 회수). 순수 히스토리 절단 로직만 소비;
|
|
1018
1124
|
// 영속은 세션 스토어(forkSessionFromHistory)가 담당한다.
|
|
@@ -1039,7 +1145,9 @@ import { createQuitConfirmationState, gracefulQuit, type QuitConfirmationState }
|
|
|
1039
1145
|
import { consumeTurnEndInterrupted, handoffTurnTypeaheadAtTurnEnd, releaseTurnTypeaheadPending, runTurnTypeaheadPushNow, steerLastTurnTypeaheadSubmission } from './input/turn-steer-bridge.js';
|
|
1040
1146
|
import { abortTurnOnly } from '../turn-abort-scope.js';
|
|
1041
1147
|
import { consumeInternalTurnYield, createInternalTurnGate, formatInternalTurnBanner, resolveInternalTurnSubmitIntent, type InternalTurnRequest } from './input/internal-turn.js';
|
|
1148
|
+
import { createClassicInterimFold } from './input/goal-interim.js';
|
|
1042
1149
|
import { createSeatAutowake } from './input/seat-autowake.js';
|
|
1150
|
+
import { createGoalContinue } from './input/goal-continue.js';
|
|
1043
1151
|
import { createDashboardWakeupScheduler, registerScheduleWakeupHostTool } from '../skills/tools/schedule-wakeup.js';
|
|
1044
1152
|
import { createAttachmentRowMap } from '../log-pane/attachment-row-map.js';
|
|
1045
1153
|
import { createAttachmentPopup, type AttachmentPopupAction } from '../log-pane/attachment-popup.js';
|
|
@@ -1067,7 +1175,7 @@ import {
|
|
|
1067
1175
|
AGENT_ACTIVITY_SEGMENT_KEY,
|
|
1068
1176
|
PULSE_HALF_PERIOD_MS,
|
|
1069
1177
|
} from '../agent-activity-hud.js';
|
|
1070
|
-
import { DASHBOARD_CLARIFICATION_REQUEST, consumeStreamingTopModalEscape, createEscAbortGate, createHarnessEscHint, routeStreamingEscapeKey } from '../esc-abort-gate.js';
|
|
1178
|
+
import { DASHBOARD_CLARIFICATION_REQUEST, consumeStreamingTopModalEscape, createEscAbortGate, createEscAbortPendingGate, createHarnessEscHint, routeStreamingEscapeKey } from '../esc-abort-gate.js';
|
|
1071
1179
|
import { enqueueSoftStop, readSoftStopRequestStatus } from '../harness/control-inbox.js';
|
|
1072
1180
|
import { setSelfImplementSoftStopSpaceObserver } from '../self-implement/self-implement-runtime.js';
|
|
1073
1181
|
import { createViEditor, type ViEditorHandle } from '../vi-editor.js';
|
|
@@ -1161,14 +1269,33 @@ import { agentBatchScratchTitle, renderAgentBatchScratch } from '../display/agen
|
|
|
1161
1269
|
import { type ExecutionSurfaceHandle } from '../display/index.js';
|
|
1162
1270
|
import { AgentSurfaceStore, renderAgentDetail, renderAgentRoster, type AgentSurfaceState } from '../display/agent-surface.js';
|
|
1163
1271
|
import { globalAgentFlash } from '../display/agent-flash.js';
|
|
1164
|
-
import { globalTaskNotificationQueue } from '../agent/task-notification.js';
|
|
1165
|
-
import { createDashboardAgentWakeNotify,
|
|
1272
|
+
import { globalTaskNotificationQueue, type TaskNotificationQueue, type PendingTaskNotification } from '../agent/task-notification.js';
|
|
1273
|
+
import { createDashboardAgentWakeNotify, installSeatedAgentWake, wrapAgentWakePort } from './input/agent-wake.js';
|
|
1166
1274
|
import { renderDebugEventDetail, renderDebugEventRows, renderDebugStack, renderPromptInjectionDebug } from '../display/debug-surface.js';
|
|
1167
1275
|
import { buildDebugCallStack } from '../debug/call-stack.js';
|
|
1168
1276
|
import { buildAstGrepHostTool } from '../skills/tools/ast-grep.js';
|
|
1169
1277
|
import { buildLspHostTool } from '../skills/tools/lsp/index.js';
|
|
1170
1278
|
import { PluginHost } from '../plugins/core/host.js';
|
|
1171
1279
|
|
|
1280
|
+
/** Keep wake notifications immediate; display completed results only when a turn drains them. */
|
|
1281
|
+
export function subscribeDashboardAgentResults(
|
|
1282
|
+
queue: TaskNotificationQueue,
|
|
1283
|
+
listener: (notification: PendingTaskNotification) => void,
|
|
1284
|
+
pushHistoryLine: (line: string) => void,
|
|
1285
|
+
): () => void {
|
|
1286
|
+
const offWake = queue.onEnqueue(listener);
|
|
1287
|
+
const offDrain = queue.onDrain((items) => {
|
|
1288
|
+
for (const notification of items) {
|
|
1289
|
+
if (notification.resultPath) {
|
|
1290
|
+
pushHistoryLine(` Agent result · full result: ${notification.resultPath} · summary: ${notification.output}`);
|
|
1291
|
+
} else if (notification.preservationError) {
|
|
1292
|
+
pushHistoryLine(` Agent result preservation failed: ${notification.preservationError} · ${notification.output}`);
|
|
1293
|
+
}
|
|
1294
|
+
}
|
|
1295
|
+
});
|
|
1296
|
+
return () => { offWake(); offDrain(); };
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1172
1299
|
/** Register the same L2 host tools used by the live TUI before each turn's catalog is assembled. */
|
|
1173
1300
|
export function registerDashboardCoreHostTools(host: Pick<PluginHost, 'registerHostTool'>): void {
|
|
1174
1301
|
const coreMod = require('../domains/core-tools.js') as typeof import('../domains/core-tools.js');
|
|
@@ -1403,6 +1530,10 @@ const isPluginBusy = (host: { active(): { plugin: { isBusy?: (s: any) => boolean
|
|
|
1403
1530
|
// ── Main dashboard ──
|
|
1404
1531
|
|
|
1405
1532
|
export interface ShowDashboardOptions {
|
|
1533
|
+
/** Internal startup timing signal for the completed synchronous setup: persona load,
|
|
1534
|
+
* input-core bootstrap, plugin discovery and the widget host. This is the pre-frame block
|
|
1535
|
+
* that `onFirstFrameRendered` used to hide behind one number. Elapsed ms since entry. */
|
|
1536
|
+
onSyncSetupComplete?: (elapsedMs: number) => void;
|
|
1406
1537
|
/** Internal startup timing signal for the first successfully flushed dashboard frame. */
|
|
1407
1538
|
onFirstFrameRendered?: () => void;
|
|
1408
1539
|
/** Force debug sinks on at launch (file + mirror). Equivalent to
|
|
@@ -1877,7 +2008,34 @@ export function applyDashboardStreamingTypeaheadKey(
|
|
|
1877
2008
|
return applyTurnTypeaheadKey(state, key, isImmediate);
|
|
1878
2009
|
}
|
|
1879
2010
|
|
|
2011
|
+
/** TUI-BOOT-TIMING-HOLES — show-dashboard 동기 셋업 창(첫 프레임 직전) 계측기.
|
|
2012
|
+
* `finish()` 는 한 번만 보고하고, 보고가 던져도 부팅을 막지 않는다(fail-open). */
|
|
2013
|
+
export interface SyncSetupWindow {
|
|
2014
|
+
/** 셋업이 끝난 지점에서 호출 — 진입 이후 경과 ms 를 보고한다. */
|
|
2015
|
+
finish(): void;
|
|
2016
|
+
}
|
|
2017
|
+
|
|
2018
|
+
export function openSyncSetupWindow(
|
|
2019
|
+
report: ((elapsedMs: number) => void) | undefined,
|
|
2020
|
+
now: () => number = () => performance.now(),
|
|
2021
|
+
): SyncSetupWindow {
|
|
2022
|
+
const startedAt = now();
|
|
2023
|
+
let finished = false;
|
|
2024
|
+
return {
|
|
2025
|
+
finish(): void {
|
|
2026
|
+
if (finished) return;
|
|
2027
|
+
finished = true;
|
|
2028
|
+
if (!report) return;
|
|
2029
|
+
try {
|
|
2030
|
+
report(now() - startedAt);
|
|
2031
|
+
} catch { /* timing signal must never break boot */ }
|
|
2032
|
+
},
|
|
2033
|
+
};
|
|
2034
|
+
}
|
|
2035
|
+
|
|
1880
2036
|
export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<DashboardAction> {
|
|
2037
|
+
// TUI-BOOT-TIMING-HOLES — 첫 프레임 직전 동기 셋업 구간을 여기서 연다(셋업 종료 지점에서 닫는다).
|
|
2038
|
+
const syncSetupWindow = openSyncSetupWindow(opts.onSyncSetupComplete);
|
|
1881
2039
|
let firstDashboardFrameRendered = false;
|
|
1882
2040
|
await awaitGlobalPersonaLoad().catch(() => {});
|
|
1883
2041
|
const dashboardQuitConfirmationState = createQuitConfirmationState();
|
|
@@ -2651,16 +2809,18 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
2651
2809
|
// Pickers share the composer bottom slot.
|
|
2652
2810
|
const placement = resolveDecisionPickerPlacement({ height: 16 });
|
|
2653
2811
|
const modalWidth = placement.width;
|
|
2812
|
+
// Unique prefixes, not a fixed 8 — two sessions sharing 8 characters used to look identical (TUI-RESUME-PICKER).
|
|
2813
|
+
const idPrefixes = sessionIdPrefixes(rows.map((m) => m.id));
|
|
2654
2814
|
const fmtRow = (m: (typeof rows)[number]): string => {
|
|
2655
2815
|
const marker = m.id === attachedSessionId ? '▸ ' : ' ';
|
|
2656
|
-
const ts = m.updatedAt
|
|
2816
|
+
const ts = sessionListTime(m.updatedAt);
|
|
2657
2817
|
const binds: string[] = [];
|
|
2658
2818
|
if (m.bindings?.cli) binds.push('cli');
|
|
2659
2819
|
if (m.bindings?.telegram) binds.push('tg');
|
|
2660
2820
|
if (m.bindings?.discord) binds.push('dc');
|
|
2661
2821
|
const bindStr = binds.length > 0 ? `[${binds.join(',')}]` : '';
|
|
2662
2822
|
const title = (m.title || '(no title)').slice(0, 42);
|
|
2663
|
-
return `${marker}${m.id
|
|
2823
|
+
return `${marker}${idPrefixCell(idPrefixes, m.id)} ${ts} ${String(m.messageCount).padStart(3)}t ${bindStr.padEnd(9)} ${title}`;
|
|
2664
2824
|
};
|
|
2665
2825
|
const handle = createSearchModal({
|
|
2666
2826
|
id: `session-resume:${Date.now().toString(36)}`,
|
|
@@ -2687,7 +2847,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
2687
2847
|
promptCtl.submit(`/session load ${id}`);
|
|
2688
2848
|
} else {
|
|
2689
2849
|
// 입력 루프 비활성 등으로 합성 submit 불가 — 수동 안내 폴백.
|
|
2690
|
-
chatLines.push(C.muted(` /session load ${
|
|
2850
|
+
chatLines.push(C.muted(` /session load ${idPrefixes.get(id) ?? id} 를 입력해 재개하세요`));
|
|
2691
2851
|
chatScrollOffset = -1;
|
|
2692
2852
|
draw();
|
|
2693
2853
|
}
|
|
@@ -3357,7 +3517,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3357
3517
|
// ⭐ H2 내부 턴 문(TUI-H2-INTERNAL-TURN) — 자율 재개(H3·H4·H5)가 지나갈 «문 하나». 판정은 모듈,
|
|
3358
3518
|
// 여기선 상태를 읽어 넘기기만 한다(⚠️ promptCtl·가시성 함수는 아래에서 선언 — 호출 시점엔 있다).
|
|
3359
3519
|
const internalTurnGate = createInternalTurnGate({
|
|
3360
|
-
isTurnRunning: () => streamingInFlight,
|
|
3520
|
+
isTurnRunning: () => streamingInFlight || dashboardAcpChat.isBusy() || internalTurnGate.isInternalTurnActive(),
|
|
3361
3521
|
isInputForeground: () =>
|
|
3362
3522
|
chatMainInputVisibilityState().inputOwnership?.owner === 'chat-main' && !topBlockingForegroundModal(),
|
|
3363
3523
|
getBufferText: () => promptCtl.getBufferText?.(),
|
|
@@ -3373,7 +3533,21 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3373
3533
|
});
|
|
3374
3534
|
// Set only by the failed-turn callback and consumed by that turn's streaming cleanup.
|
|
3375
3535
|
let autowakeTurnFailureRaw: string | null = null;
|
|
3376
|
-
|
|
3536
|
+
// ⭐ TURN-END-BEFORE-GOAL 골 이어가기 — 답이 «…하겠습니다/해야 합니다» 로 끝났는데 결과물이 없으면 H2 문으로 한 턴 더.
|
|
3537
|
+
// 판정·상한은 모듈(goal-continue.ts), 여기선 배선만(입력칸 무접촉).
|
|
3538
|
+
const goalContinue = createGoalContinue({
|
|
3539
|
+
startTurnIfIdle: (text, opts) => internalTurnGate.startTurnIfIdle(text, opts),
|
|
3540
|
+
notify: (line) => { chatLines.push(C.muted(line)); draw(); },
|
|
3541
|
+
});
|
|
3542
|
+
const internalTurnYieldPort = wrapAgentWakePort(goalContinue.wrapPort(seatAutowake.wrapPort(internalTurnGate.port)));
|
|
3543
|
+
// ⭐ TUI-GOAL-INTERIM-QUIET — 이어가기 내부 턴이 열리면 «바로 앞» 중간 보고(못 했다·약속) 문단을 한 줄로 접는다.
|
|
3544
|
+
// 끼워 넣은 사람 에코가 있으면 줄 위치를 믿지 않고 접지 않는다(판정·관측은 goal-interim.ts).
|
|
3545
|
+
const goalInterimFold = createClassicInterimFold({ canFold: () => liveTypeaheadEchoes.length === 0 });
|
|
3546
|
+
/** 지금 턴의 스트림 런타임 — 턴 끝에 «마지막 답 블록» 시작을 읽는다(없으면 null → 접지 않는다). */
|
|
3547
|
+
let latestTurnStream: { getAssistantStart(): number } | null = null;
|
|
3548
|
+
const latestTurnReplyStart = (): number | null => {
|
|
3549
|
+
try { return latestTurnStream?.getAssistantStart() ?? null; } catch { return null; }
|
|
3550
|
+
};
|
|
3377
3551
|
// ⭐ H5 자기 예약 깨움(TUI-H5-SCHEDULE-WAKEUP) — 프로세스 안 타이머가 그 시각에 H2 문으로 한 턴을 청한다.
|
|
3378
3552
|
// 직전 회차 판정 = 그 예약이 연 내부 턴이 아직 도나. 도구 등록은 아래 host tool 자리(하니스 자식 제외).
|
|
3379
3553
|
const wakeupScheduler = createDashboardWakeupScheduler(internalTurnGate, {
|
|
@@ -3741,7 +3915,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3741
3915
|
return mouseWiring.buildStatusLine({
|
|
3742
3916
|
swd,
|
|
3743
3917
|
gitState,
|
|
3744
|
-
|
|
3918
|
+
// TUI-MODEL-BADGE-ACTUAL (10-16) — 배지의 «지금» 은 이번 턴 실제 실행(폴백이면 «처음 → 실제»).
|
|
3919
|
+
providerInfo: readStatusProviderInfo(activeAcpRuntimeModel(), statusModelActual('dashboard')),
|
|
3745
3920
|
contextUsedTokens: metrics.lastContextUsed,
|
|
3746
3921
|
tmuxLabel: tmuxStatusLabel,
|
|
3747
3922
|
sshLabel: sshStatusLabel,
|
|
@@ -6582,7 +6757,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6582
6757
|
});
|
|
6583
6758
|
let clarificationModalId: string | null = null;
|
|
6584
6759
|
|
|
6585
|
-
|
|
6760
|
+
// `turnEnd: false` — a phase inside a turn (skill-route detection) that attaches the same keys: its teardown is
|
|
6761
|
+
// not a turn end (TUI-ORPHAN-AUTO-RESUME-STOP E4 · 10-23: it reset seat-autowake's orphan-400 streak every turn).
|
|
6762
|
+
const attachChatStreamingKeys = (abortCtrl: AbortController, phase: { turnEnd?: boolean } = {}): () => void => {
|
|
6586
6763
|
const chatLinesStartIndex = chatLines.length;
|
|
6587
6764
|
userScrolledDuringStream = false;
|
|
6588
6765
|
const SCROLL_KEYS = new Set(['j', 'k', 'down', 'up', 'pageup', 'pagedown', 'home', 'end', 'g', 'G']);
|
|
@@ -6592,8 +6769,20 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6592
6769
|
// so the user can make an informed call.
|
|
6593
6770
|
let abortGateModalId: string | null = null;
|
|
6594
6771
|
const showHarnessEscHint = createHarnessEscHint((line) => pushChatLine(line));
|
|
6595
|
-
let stoppedHarnessSpace: string | null = null;
|
|
6596
6772
|
const activeHarnessSpace = (): string | null => activeEscHarnessSpace(escAbortToolState, escHarnessSpacesByCallId);
|
|
6773
|
+
// ⭐ TUI-ESC-EXIT — `createEscAbortPendingGate` is the production
|
|
6774
|
+
// onAbortPending/onAbortRepeat seam shared with the incident test in
|
|
6775
|
+
// test/esc-harness-stop.test.ts; `runEscAbortPendingSoftStop` remains the
|
|
6776
|
+
// production soft-stop callback. The gate keeps an earlier successful
|
|
6777
|
+
// stopped space across later waiting/hint/failed callbacks.
|
|
6778
|
+
const escAbortPendingGate = createEscAbortPendingGate({
|
|
6779
|
+
runSoftStop: runEscAbortPendingSoftStop,
|
|
6780
|
+
formatWaitingTargets: formatEscAbortWaitingTargets,
|
|
6781
|
+
getActiveHarnessSpace: activeHarnessSpace,
|
|
6782
|
+
pushChatLine: (line) => pushChatLine(line),
|
|
6783
|
+
showHarnessEscHint,
|
|
6784
|
+
afterAbortEvent: () => { chatScrollOffset = -1; },
|
|
6785
|
+
});
|
|
6597
6786
|
const escGate = createEscAbortGate({
|
|
6598
6787
|
abortCtrl,
|
|
6599
6788
|
getRunningCount: () => getEscAbortRunningCount(escAbortToolState),
|
|
@@ -6608,28 +6797,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6608
6797
|
getTheme: () => currentThemeTokens(),
|
|
6609
6798
|
getWaitingTargetNames: () => getEscAbortWaitingToolNames(escAbortToolState),
|
|
6610
6799
|
shouldAbortImmediately: () => activeHarnessSpace() !== null,
|
|
6611
|
-
|
|
6612
|
-
|
|
6613
|
-
|
|
6614
|
-
|
|
6615
|
-
|
|
6616
|
-
if (readSoftStopRequestStatus(spaceId).status !== 'present') throw new Error('soft-stop marker not persisted');
|
|
6617
|
-
stoppedHarnessSpace = spaceId;
|
|
6618
|
-
pushChatLine(' ⏹ 멈췄다 — 해당 하니스 런에 중단 요청을 보냈습니다.');
|
|
6619
|
-
} catch {
|
|
6620
|
-
pushChatLine(' ⚠ 하니스 런 중단 요청을 보내지 못했습니다. /harness runs 에서 확인해 주세요.');
|
|
6621
|
-
}
|
|
6622
|
-
} else if (!showHarnessEscHint(targets)) {
|
|
6623
|
-
pushChatLine(` ⏳ 중단 요청됨 — ${formatEscAbortWaitingTargets(targets)} 종료를 기다리는 중입니다.`);
|
|
6624
|
-
}
|
|
6625
|
-
chatScrollOffset = -1;
|
|
6626
|
-
},
|
|
6627
|
-
onAbortRepeat: ({ repeat, targets }) => {
|
|
6628
|
-
if (!stoppedHarnessSpace && !showHarnessEscHint(targets)) {
|
|
6629
|
-
pushChatLine(` ⏳ ESC 재시도 ${repeat}회 — ${formatEscAbortWaitingTargets(targets)} 종료를 기다리는 중입니다.`);
|
|
6630
|
-
}
|
|
6631
|
-
chatScrollOffset = -1;
|
|
6632
|
-
},
|
|
6800
|
+
// ⭐ TUI-ESC-EXIT — `runEscAbortPendingSoftStop` is the production
|
|
6801
|
+
// soft-stop callback seam; the incident test in
|
|
6802
|
+
// test/esc-harness-stop.test.ts exercises this same function.
|
|
6803
|
+
onAbortPending: escAbortPendingGate.onAbortPending,
|
|
6804
|
+
onAbortRepeat: escAbortPendingGate.onAbortRepeat,
|
|
6633
6805
|
// ⭐⭐⭐ 턴을 멈추기 «전»에 살아남을 자식을 백그라운드 라우팅으로 넘긴다(`R4a` · 2026-08-19).
|
|
6634
6806
|
// ⛔ 없으면 `R1` 이후 자식이 «고아»가 된다 — 살아 있는데 완료를 실어 나를 채널이 없다
|
|
6635
6807
|
// (`task-notification` 은 background 만 본다 · 부모 툴 루프는 턴과 함께 사라졌다).
|
|
@@ -6874,6 +7046,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6874
7046
|
const r = applyDashboardStreamingTypeaheadKey(turnTypeaheadRef.state, k, isStreamingImmediateSlash);
|
|
6875
7047
|
if (r.consumed) {
|
|
6876
7048
|
turnTypeaheadRef.state = r.state;
|
|
7049
|
+
// TUI-PASTE-WHILE-STREAMING — 턴 중 붙여넣기를 버퍼가 받았다(종전엔 조용히 버려졌다).
|
|
7050
|
+
if (r.pasted) { try { debug.log('tui.paste', r.pasted.folded ? 'folded' : 'kept', { during: 'streaming', lines: r.pasted.lines, chars: r.pasted.chars }); } catch { /* fail-soft */ } }
|
|
6877
7051
|
if (r.submissionDisposition) {
|
|
6878
7052
|
debug.log('dashboard.turn-typeahead', 'submission-classified', {
|
|
6879
7053
|
length: (r.immediateSubmission ?? turnTypeaheadRef.state.queuedSubmissions.at(-1))?.length ?? 0,
|
|
@@ -7171,7 +7345,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7171
7345
|
runTurnTeardownStep('stream-keys-detach', cleanup);
|
|
7172
7346
|
runTurnTeardownStep('esc-gate-dispose', () => { escGate.dispose(); });
|
|
7173
7347
|
try {
|
|
7174
|
-
if (!
|
|
7348
|
+
if (!escAbortPendingGate.getStoppedHarnessSpace()) settleEscAbortPendingLines(chatLines, chatLinesStartIndex);
|
|
7175
7349
|
} catch (err) {
|
|
7176
7350
|
const message = err instanceof Error ? err.message : String(err);
|
|
7177
7351
|
const stackHead = err instanceof Error ? err.stack?.split('\n')[1]?.trim() : undefined;
|
|
@@ -7184,7 +7358,18 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7184
7358
|
reportTuiTurn('idle');
|
|
7185
7359
|
const failedTurnRaw = autowakeTurnFailureRaw;
|
|
7186
7360
|
autowakeTurnFailureRaw = null;
|
|
7187
|
-
seatAutowake.noteTurnEnded({ sessionId: currentChatPersonaSessionId(), lastLine: chatLines.at(-1) ?? '', errorDetail: failedTurnRaw ?? undefined });
|
|
7361
|
+
if (phase.turnEnd !== false) seatAutowake.noteTurnEnded({ sessionId: currentChatPersonaSessionId(), lastLine: chatLines.at(-1) ?? '', errorDetail: failedTurnRaw ?? undefined });
|
|
7362
|
+
try {
|
|
7363
|
+
// «이번 턴»이 그린 줄만 본다 — 앞 턴의 ✘·취소 표시가 이번 턴 판정에 새지 않게(r1 must-fix).
|
|
7364
|
+
const turnLines = chatLines.slice(chatLinesStartIndex);
|
|
7365
|
+
const tailLines = turnLines.slice(-16);
|
|
7366
|
+
// 실패(✘)·취소로 끝난 턴은 이어가지 않는다 — 사람이 판단할 자리다.
|
|
7367
|
+
const failed = failedTurnRaw !== null || turnLines.some((line) => /✘ 실패|응답 취소|취소됨/.test(line));
|
|
7368
|
+
// 마지막 답 블록만 — 스트림 applier 의 assistantStart(이번 턴 범위 안일 때). 도구 줄은 그 앞에 남는다.
|
|
7369
|
+
const replyStart = latestTurnReplyStart();
|
|
7370
|
+
goalInterimFold.noteTurnEnded(chatLines, replyStart !== null && replyStart >= chatLinesStartIndex ? replyStart : chatLines.length);
|
|
7371
|
+
goalContinue.noteTurnEnded({ lines: tailLines, failed });
|
|
7372
|
+
} catch { /* fail-soft: 골 이어가기는 턴 정리를 막지 않는다 */ }
|
|
7188
7373
|
}
|
|
7189
7374
|
};
|
|
7190
7375
|
};
|
|
@@ -11211,7 +11396,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
11211
11396
|
try { mouseWiring.toasts().push({ text, kind, ttlMs: 1200 }); } catch { /* ignore */ }
|
|
11212
11397
|
};
|
|
11213
11398
|
|
|
11214
|
-
|
|
11399
|
+
const drawFrameNow = ({ force: forceFromCoordinator = false } = {}) => {
|
|
11215
11400
|
const { rows: termRows, cols } = termSize();
|
|
11216
11401
|
const totalW = cols - 1;
|
|
11217
11402
|
|
|
@@ -11552,8 +11737,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
11552
11737
|
const frameCursorDecision = display.cursorDecision();
|
|
11553
11738
|
renderDashboardFrame(baseLines, composeDashboardFrameWithCoordinatorModal(display, {
|
|
11554
11739
|
onFrameWriteComplete: firstDashboardFrameRendered ? undefined : (error) => {
|
|
11555
|
-
if (
|
|
11740
|
+
if (firstDashboardFrameRendered) return;
|
|
11741
|
+
// TUI-BOOT-TIMING-HOLES — 셋업 창은 «첫 프레임 flush 완료» 에 닫는다(진입~flush).
|
|
11742
|
+
// 실패한 flush 도 창을 닫아 신호가 영영 오지 않는 일을 막는다(재시도 의미론은 그대로:
|
|
11743
|
+
// 첫 프레임 신호는 다음 성공 flush 가 낸다).
|
|
11744
|
+
if (error) {
|
|
11745
|
+
syncSetupWindow.finish();
|
|
11746
|
+
return;
|
|
11747
|
+
}
|
|
11556
11748
|
firstDashboardFrameRendered = true;
|
|
11749
|
+
syncSetupWindow.finish();
|
|
11557
11750
|
try { opts.onFirstFrameRendered?.(); } catch { /* timing must not break dashboard */ }
|
|
11558
11751
|
},
|
|
11559
11752
|
overlay: modalFrame,
|
|
@@ -11647,6 +11840,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
11647
11840
|
if (overlay.length > 0) process.stdout.write(overlay);
|
|
11648
11841
|
} catch { /* overlay must not crash main draw */ }
|
|
11649
11842
|
};
|
|
11843
|
+
// TUI-FLICKER-DRAW-INTEGRATION — one synchronized-output owner for the whole
|
|
11844
|
+
// frame compose: BSU → frame (+ coordinator modal overlay) → prompt repaint →
|
|
11845
|
+
// ESU. Both draw entry paths (force and queued microtask) call this same
|
|
11846
|
+
// seam, and the finally keeps the region closed when a compose throws so the
|
|
11847
|
+
// next frame is not swallowed by a dangling BSU. `supported` is the tty gate:
|
|
11848
|
+
// piped/captured output keeps the bytes it had before this seam existed.
|
|
11849
|
+
drawNow = (opts = {}) => {
|
|
11850
|
+
drawDashboardFrameSynchronized(() => { drawFrameNow(opts); }, process.stdout);
|
|
11851
|
+
};
|
|
11650
11852
|
draw = (opts = {}) => {
|
|
11651
11853
|
if (debug.enabled) {
|
|
11652
11854
|
const now = Date.now();
|
|
@@ -12511,7 +12713,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
12511
12713
|
const disposeResizeListener = installResizeListener({
|
|
12512
12714
|
draw: (opts) => draw(opts),
|
|
12513
12715
|
promptCtl,
|
|
12514
|
-
requestOverlayFrame: () => display.
|
|
12716
|
+
requestOverlayFrame: () => display.requestRenderNow({ force: true }),
|
|
12717
|
+
withSynchronizedOutput: (paint) => display.withSynchronizedOutput(paint),
|
|
12515
12718
|
});
|
|
12516
12719
|
process.on('exit', disposeResizeListener);
|
|
12517
12720
|
// 외부 주입(`pty text`)을 사용자 타이핑과 섞지 않고 별도 대기열로 — 결함 #6(10-14).
|
|
@@ -13133,12 +13336,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13133
13336
|
// ⭐ TUI-AGENT-IDLE-WAKE — 배경 자식(⊕ RunShell bg) 완료 큐의 «유일한» 구독(onEnqueue 구독 0 → 1).
|
|
13134
13337
|
// 채팅 한 줄 «✓ 위임 끝: <이름> — 다음 턴에 결과» · 결과는 다음 턴 preamble 이 싣는다.
|
|
13135
13338
|
// ⛔ 입력칸·injectKey·pty 주입 0(대표 비침투). dedupe·수명은 모듈, 여기선 배선만.
|
|
13136
|
-
const agentWake =
|
|
13137
|
-
subscribe: (listener) =>
|
|
13339
|
+
const agentWake = installSeatedAgentWake({
|
|
13340
|
+
subscribe: (listener) => subscribeDashboardAgentResults(
|
|
13341
|
+
globalTaskNotificationQueue, listener, (line) => { pushChatLine(C.muted(line)); draw(); },
|
|
13342
|
+
),
|
|
13138
13343
|
// 그리기 실패는 삼키지 않는다 — 모듈이 잡아 notified{shown:false} 로 남긴다.
|
|
13139
13344
|
notify: createDashboardAgentWakeNotify((line) => { chatLines.push(C.muted(line)); }, () => draw()),
|
|
13140
13345
|
// 조각 2 — 자리 TUI ∧ 유휴면 H2 문으로 다음 턴(origin child-complete) · 판정은 모듈.
|
|
13141
|
-
|
|
13346
|
+
startTurnIfIdle: (text, opts) => internalTurnGate.startTurnIfIdle(text, opts),
|
|
13347
|
+
getCwd: () => workingDir.cwd,
|
|
13348
|
+
isPending: (taskId) => globalTaskNotificationQueue.has(taskId),
|
|
13142
13349
|
});
|
|
13143
13350
|
disposeDashboardAgentWake = () => agentWake.dispose();
|
|
13144
13351
|
|
|
@@ -14841,7 +15048,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
14841
15048
|
let acpDispatchToolSelf: CoreTurnDispatchTool | null = null;
|
|
14842
15049
|
let acpToolDispatchCount = 0;
|
|
14843
15050
|
const trMod = await import('../tool-runtime/index.js');
|
|
14844
|
-
trMod.registerAllDefaultToolRuntimes();
|
|
15051
|
+
trMod.registerAllDefaultToolRuntimes({ mcpLazyBoot: true });
|
|
14845
15052
|
acpToolRuntime = trMod;
|
|
14846
15053
|
acpPersistToolOutputPreview = (
|
|
14847
15054
|
await import('../tool-runtime/truncation-store.js')
|
|
@@ -15100,14 +15307,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15100
15307
|
chat.history.push(m as ChatMessage);
|
|
15101
15308
|
}
|
|
15102
15309
|
const turns = past.length;
|
|
15103
|
-
chatLines.push(C.muted(` ${turns} turn${turns === 1 ? '' : 's'} restored
|
|
15310
|
+
chatLines.push(C.muted(` ${turns} turn${turns === 1 ? '' : 's'} restored:`));
|
|
15311
|
+
noteRestoredContext(chat.history);
|
|
15104
15312
|
// BACKLOG #1 — markdown-aware preview rendering. Replaces
|
|
15105
15313
|
// the previous one-line `slice(0, 100)` snippet so tables
|
|
15106
15314
|
// / bold / lists in replayed turns look the same as when
|
|
15107
15315
|
// they were originally streamed (`formatResponse` path).
|
|
15108
15316
|
const previewWidth = Math.max(40, termSize().cols - 8);
|
|
15109
15317
|
const previewWrap = getUserConfig().chat.rendering.wrap;
|
|
15110
|
-
const previewLines =
|
|
15318
|
+
const previewLines = renderRestoredTranscriptLines(past, {
|
|
15111
15319
|
maxWidth: previewWidth,
|
|
15112
15320
|
wrapOpts: previewWrap,
|
|
15113
15321
|
});
|
|
@@ -15149,7 +15357,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15149
15357
|
if (resume.repaired) {
|
|
15150
15358
|
chatLines.push(C.muted(` 깨진 도구 호출·결과 짝을 잘라 이어받았다(호출 ${resume.repaired.removedCalls} · 결과 ${resume.repaired.removedResults})`));
|
|
15151
15359
|
}
|
|
15152
|
-
|
|
15360
|
+
// TUI-RESUME-PICKER ②③④ — `--resume` used to leave the chat log blank and ctx at 0, so the user could
|
|
15361
|
+
// not see that 379 messages had come back. Show the restored conversation and its size now.
|
|
15362
|
+
chatLines.push(C.muted(` ${resume.turns} turns restored:`));
|
|
15363
|
+
for (const line of renderRestoredTranscriptLines(chat.history, {
|
|
15364
|
+
maxWidth: Math.max(40, termSize().cols - 8),
|
|
15365
|
+
wrapOpts: getUserConfig().chat.rendering.wrap,
|
|
15366
|
+
})) chatLines.push(line);
|
|
15367
|
+
const restoredTokens = noteRestoredContext(chat.history);
|
|
15368
|
+
debug.log('chat.session.resume', 'restored', { sessionId: resume.sessionId, turns: resume.turns, estimatedContextTokens: restoredTokens });
|
|
15369
|
+
chatLines.push(C.muted(' Next turn continues this conversation.'));
|
|
15153
15370
|
}
|
|
15154
15371
|
}
|
|
15155
15372
|
observeSessionStart({
|
|
@@ -16240,6 +16457,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16240
16457
|
// those tokens into the initial buffer so the user can just type
|
|
16241
16458
|
// their question next to the pre-filled [PDF #N] tokens.
|
|
16242
16459
|
let nextInitial: string | undefined = inputEntry.initialText;
|
|
16460
|
+
// TUI-PASTE-WHILE-STREAMING — 턴 중 접은 붙여넣기 토큰의 원문(넘김 입력창이 넘겨받는다 · 글에 토큰이 없으면 버린다).
|
|
16461
|
+
let nextInitialPastes: Array<[string, string]> = [];
|
|
16243
16462
|
let exitInputLoop = false;
|
|
16244
16463
|
let lastTurnFinalStatus: 'completed' | 'interrupted' | 'failed' | undefined;
|
|
16245
16464
|
|
|
@@ -16271,6 +16490,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16271
16490
|
});
|
|
16272
16491
|
lastTurnFinalStatus = undefined;
|
|
16273
16492
|
nextInitial = drained.nextInitial;
|
|
16493
|
+
nextInitialPastes = [...nextInitialPastes, ...(drained.initialPastes ?? [])].filter(([token]) => nextInitial?.includes(token));
|
|
16274
16494
|
const queuedTurnEndText = drained.injectEnter ? drained.nextInitial : undefined;
|
|
16275
16495
|
if (interrupted && queuedBeforeDrain > 0) {
|
|
16276
16496
|
debug.log('dashboard.turn-typeahead', 'restored-after-interrupt', { count: queuedBeforeDrain });
|
|
@@ -16310,6 +16530,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16310
16530
|
debugLog: debug.enabled ? (event, label, payload) => debug.log(event, label, payload) : undefined,
|
|
16311
16531
|
textInputOpts: {
|
|
16312
16532
|
internalTurnYield: internalTurnYieldPort,
|
|
16533
|
+
...(nextInitialPastes.length ? { initialPastes: nextInitialPastes } : {}),
|
|
16313
16534
|
onScrollKey: (name) => {
|
|
16314
16535
|
const { rows } = termSize();
|
|
16315
16536
|
const viewport = computePromptFrameLogViewportBounds(
|
|
@@ -16808,7 +17029,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16808
17029
|
|
|
16809
17030
|
// Save to durable input history. Up/down reads the in-memory
|
|
16810
17031
|
// tail, while slash/LLM tools can search the full store.
|
|
16811
|
-
if (!internalTurn) internalTurnGate.noteHumanTurn();
|
|
17032
|
+
if (!internalTurn) { internalTurnGate.noteHumanTurn(); goalContinue.noteHumanTurn(); goalInterimFold.noteHumanTurn(); }
|
|
16812
17033
|
if (postTurn.historyRecord && !internalTurn) {
|
|
16813
17034
|
inputHistoryStore.record(postTurn.historyRecord);
|
|
16814
17035
|
refreshInputHistory();
|
|
@@ -17713,23 +17934,22 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
17713
17934
|
setWorkingFocusPreview: () => { setWorkingFocus('preview', 'slash-term-move-preview'); },
|
|
17714
17935
|
nextTerminalVwSlotId: (terminalId) => `term-slot:${terminalId}`,
|
|
17715
17936
|
},
|
|
17716
|
-
// TUI-LOOP-COMMAND —
|
|
17717
|
-
//
|
|
17718
|
-
// idle/busy 신호는 대시보드 루프가 이미 쓰는 것을 그대로 쓴다 —
|
|
17719
|
-
// 스트리밍 턴(streamingInFlight · reportTuiTurn busy/idle) +
|
|
17720
|
-
// ACP 세션 바쁨(dashboardAcpChat.isBusy()). 프롬프트 제출은
|
|
17721
|
-
// 플러그인 submitDashboardText 와 같은 기존 제출 틈
|
|
17722
|
-
// (dispatchDashboardSubmitText)으로 낸다 — 새 제출 경로를 만들지 않는다.
|
|
17937
|
+
// TUI-LOOP-COMMAND — the scheduler ticks; H2 alone judges whether
|
|
17938
|
+
// an internal turn can open. A rejection waits for the next tick.
|
|
17723
17939
|
loopCommand: {
|
|
17724
|
-
isIdle: () =>
|
|
17940
|
+
isIdle: () => true,
|
|
17725
17941
|
submitPrompt: (prompt: string) => {
|
|
17726
|
-
|
|
17727
|
-
|
|
17942
|
+
const result = internalTurnGate.startTurnIfIdle(prompt, { origin: 'scheduled', reason: '/loop' });
|
|
17943
|
+
if (result.opened) debug.log('dashboard.loop', 'fired', { turnId: result.turnId });
|
|
17944
|
+
else debug.log('dashboard.loop', 'rejected', { reason: result.reason });
|
|
17728
17945
|
},
|
|
17729
17946
|
schedulerRef: dashboardLoopSchedulerRef,
|
|
17730
17947
|
},
|
|
17731
17948
|
};
|
|
17732
17949
|
const slashOutcome = await dashboardSlashRegistry.dispatch(cmdLower, args, slashCtx);
|
|
17950
|
+
if (cmdLower === 'mission') {
|
|
17951
|
+
debug.log('tui.legacy-slash-use', 'mission', { surface: 'classic', tuiSession: null });
|
|
17952
|
+
}
|
|
17733
17953
|
if (debug.enabled) {
|
|
17734
17954
|
debug.log('dashboard.slash.dispatch', cmdLower, {
|
|
17735
17955
|
argsCount: args.length,
|
|
@@ -18176,6 +18396,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18176
18396
|
// array but doesn't paint until after the skill router's
|
|
18177
18397
|
// classifier LLM call returns (~1-2s of visual silence).
|
|
18178
18398
|
if (internalTurn) {
|
|
18399
|
+
try { goalInterimFold.foldBeforeInternalTurn(chatLines, internalTurn.origin, C.muted); } catch { /* fail-soft: 접기는 턴을 막지 않는다 */ }
|
|
18179
18400
|
chatLines.push(C.muted(` ${formatInternalTurnBanner(internalTurn)}`));
|
|
18180
18401
|
chatScrollOffset = -1;
|
|
18181
18402
|
} else {
|
|
@@ -18221,6 +18442,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18221
18442
|
// through to keyword routing in those cases.
|
|
18222
18443
|
{
|
|
18223
18444
|
const urlDec = detectUrlRoute(tok.text, getUserConfig().skills.urlRouting);
|
|
18445
|
+
const urlGuard = urlDec ? null : workContextGuardReason(tok.text);
|
|
18446
|
+
if (urlGuard && extractUrls(tok.text).length > 0) {
|
|
18447
|
+
debug.log('skill.router', 'url-route-guarded', { reason: urlGuard, textLength: tok.text.length });
|
|
18448
|
+
}
|
|
18224
18449
|
if (urlDec) {
|
|
18225
18450
|
debug.log('skill.router', 'url-route', {
|
|
18226
18451
|
kind: urlDec.kind, skill: urlDec.skill, absorb: urlDec.absorb,
|
|
@@ -18272,7 +18497,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18272
18497
|
const detectTier = getModelTier(getUserConfig().llm.provider, getUserConfig().llm.model);
|
|
18273
18498
|
const routeStartedAt = Date.now();
|
|
18274
18499
|
const route = await runAbortableDashboardSkillRoute({
|
|
18275
|
-
attachKeys: attachChatStreamingKeys,
|
|
18500
|
+
attachKeys: (ctrl: AbortController) => attachChatStreamingKeys(ctrl, { turnEnd: false }),
|
|
18276
18501
|
detect: (signal) => detectDashboardSkillRoute(tok.text, visibleIndex, {
|
|
18277
18502
|
llmFallback: userCfg.llmFallback,
|
|
18278
18503
|
keywordScoreThreshold: userCfg.keywordScoreThreshold,
|
|
@@ -18537,7 +18762,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18537
18762
|
return buildDashboardOptionalToolSpecs({
|
|
18538
18763
|
userConfig: uc,
|
|
18539
18764
|
termSize,
|
|
18540
|
-
registerAllDefaultToolRuntimes: () => { toolRuntime.registerAllDefaultToolRuntimes(); },
|
|
18765
|
+
registerAllDefaultToolRuntimes: () => { toolRuntime.registerAllDefaultToolRuntimes({ mcpLazyBoot: true }); },
|
|
18541
18766
|
setTerminalModalRuntimeDeps: (deps) => { toolRuntime.setTerminalModalRuntimeDeps(deps); },
|
|
18542
18767
|
...buildDefaultDashboardToolBuilders(),
|
|
18543
18768
|
}) as unknown[];
|
|
@@ -18584,6 +18809,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18584
18809
|
renderedToolRuntime,
|
|
18585
18810
|
brainIcon: ICONS.brain,
|
|
18586
18811
|
});
|
|
18812
|
+
latestTurnStream = turnStreamRuntime;
|
|
18587
18813
|
return {
|
|
18588
18814
|
...turnStreamRuntime,
|
|
18589
18815
|
onText: (chunk, accumulated) => {
|
|
@@ -18642,6 +18868,17 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18642
18868
|
},
|
|
18643
18869
|
resetAcpTurnRef: () => resetDashboardAcpTurnRef(acpTurnRef),
|
|
18644
18870
|
acpSession: dashboardAcpSession,
|
|
18871
|
+
// TUI-400-AUTOHEAL-FALLBACK(대표 10-22) — 400(대화 기록 어긋남)이면 ① 새 세션 ⊕ 요약 ② 다음 공급자로 스스로 회복.
|
|
18872
|
+
autoheal: createDashboardTurnAutoheal({
|
|
18873
|
+
session: dashboardAcpSession,
|
|
18874
|
+
getCwd: getSessionCwd,
|
|
18875
|
+
onRenewed: (sessionId) => {
|
|
18876
|
+
acpSessionIdRef.current = sessionId;
|
|
18877
|
+
observeSessionStart({ surface: 'tui', origin: 'new', reason: 'autoheal-400', sessionId });
|
|
18878
|
+
},
|
|
18879
|
+
remote: daemonAttached,
|
|
18880
|
+
activeModel: () => resolveDashboardActiveModel(tok.text) ?? undefined,
|
|
18881
|
+
}),
|
|
18645
18882
|
control: {
|
|
18646
18883
|
signalBus: dashboardControlSignals,
|
|
18647
18884
|
},
|