elanous 0.2.36 → 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/{uC-N0emedeNOFuaBQFv-I → 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/{4286.b70c4520306817e8.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/{3410.7f9af5ab77cbe65f.js → 1746.3563617ea64023a3.js} +1 -1
- 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/1ed5e8af.cf424815c7c0efad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9250-072df22eaadaa6b5.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/210.90b2cbd64926cf34.js +32 -0
- package/apps/pwa/out/_next/static/chunks/{3727.7949ccaacaa71242.js → 2283.edd9627b7bdfb546.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2318-450e75d07605b8fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4615.8525eb0add35eba6.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/{5711.957b095705c12560.js → 3199.6a1a9b0e6cd01dc6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2986.45d7652e4f13557e.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/{7481.39f7a4654907bf6e.js → 4313.76f232c304a15bde.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4337e36d.f42c3b391b3d8f20.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{6943.c6b24124853a47b2.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/{3757-180308bc61021b05.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/4833-7934c592c5569f00.js +1 -0
- 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/{771.c3cdb6c1f7f47c02.js → 4931.95cc6dbd230774ca.js} +3 -3
- 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/{552.b7d061ad91eeac51.js → 5046.7fd5cbd859299448.js} +2 -2
- 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/{9f31e478.fefcbcd3c388ebc5.js → 58edce7d.f1b0c72acf13b123.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +93 -0
- package/apps/pwa/out/_next/static/chunks/{3136.30aaaa5fa03662a3.js → 5952.294fc574a8625184.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{da5ecc5c-b005ad8cac737d57.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/{3324.a09703033abcbd2f.js → 6252.240578f10952e091.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8904.7d51af2dc033965c.js → 6680.6a693c28aae4cd19.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{275-02ea4c2a33980422.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/{528.38ce20ef8aa251ff.js → 6819.be5c9c4d67f22922.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3a3d9966.cc4d4585a2708e7c.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/{4304.e9b2512834a9e23e.js → 7424.c0fe2a595d4232b5.js} +1 -1
- 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/{2683.c9773a0c589b031b.js → 7867.e8725745ddd1d940.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/{6466-92e65a48490b68a9.js → 7893-e444a1b0809cd1e4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{ccae1c4b-0cf414f5eff1b10d.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/{3840-5825d56d46976a92.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/{873d6c12.09bd499f57171543.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/{575.d929793a53f27c4b.js → 9151.a2c51e93f9156dae.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +1 -0
- 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/{190.285c832bd9626f8c.js → 958.53a8dcf4729e6997.js} +1 -1
- 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-e2de2e59111c9aad.js → page-3337c6a1328c2674.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/{page-f2b2e4bf6e981450.js → page-89acd5d68c0bc560.js} +1 -1
- 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-2af16e62c12f22df.js → page-fe986fe79b107546.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-1e5da297557d2354.js +1 -0
- 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-88a1edbff62eaf1d.js +1 -0
- 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-443364c9e4a23b31.js +1 -0
- 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-ac2c1e6169cfce57.js +1 -0
- 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/{053a429e.9a63436527cc751c.js → d9815f84.4918f682a45a8502.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{ceba0382.650712b56b85b582.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/graphs/drafts/recipes.yaml +27 -7
- 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/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/codex-fallback-live-probe.ts +17 -15
- package/scripts/fleet/node-setup.sh +32 -2
- package/scripts/fleet/run-light-worker.sh +9 -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 +140 -0
- package/scripts/release-loop/gate-closure.ts +48 -0
- package/scripts/release-loop/gate-diff.ts +2 -1
- package/scripts/release-loop/known-issues-node.ts +6 -4
- package/scripts/release-loop/notes-repair.ts +216 -0
- package/scripts/release-loop/prepare-node.ts +61 -5
- package/scripts/release-loop/resume-release.ts +114 -4
- package/scripts/release-loop/resume-test-traffic.ts +10 -0
- package/scripts/release-loop/version-node.ts +81 -12
- package/scripts/train/green-leg.ts +176 -0
- package/scripts/tui-continue-real-evidence.ts +47 -0
- package/scripts/ux-sim.ts +1 -1
- package/src/acp/client.ts +31 -5
- package/src/acp/core-turn-bridge.ts +6 -0
- package/src/acp/stderr-summary.ts +49 -0
- package/src/agent/monad-agent-turn.ts +1 -0
- package/src/agent/terminal-surface.ts +217 -0
- package/src/agent-substrate/pr-reviewer.ts +11 -3
- package/src/agent-substrate/self-review-cli.ts +343 -31
- package/src/autopilot/lineage/sources.ts +1 -1
- package/src/autopilot/pr-manager.ts +64 -13
- package/src/boot/daemon-runtime.ts +35 -3
- package/src/boot/daemon-tools/pty-shell.ts +2 -1
- package/src/budget/run-usage-rollup.ts +12 -7
- package/src/budget/unified-usage.ts +20 -0
- package/src/capture/tui-self-report.ts +32 -3
- package/src/cli/autopilot-cli.ts +24 -9
- package/src/cli/decisions-cli.ts +7 -4
- package/src/cli/doctor-cli.ts +116 -7
- package/src/cli/logs-cli.ts +357 -2
- package/src/cli/memory-cli.ts +30 -1
- package/src/cli/msg-cli.ts +15 -11
- package/src/cli/pr-granularity.ts +5 -3
- package/src/cli/release-checklist-read-cli.ts +109 -4
- package/src/cli/release-cli.ts +43 -10
- package/src/cli/self-update.ts +23 -5
- package/src/cli/self-utterances-cli.ts +13 -16
- package/src/cli/tasks-cli.ts +309 -11
- 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-goal-loop.ts +5 -2
- package/src/core-turn/types.ts +2 -0
- package/src/dashboard/chat/acp-chat.ts +9 -0
- package/src/dashboard/index.ts +97 -13
- package/src/dashboard/input/agent-wake.ts +43 -0
- package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
- package/src/dashboard/replay-preview.ts +25 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +17 -8
- package/src/dashboard/synchronized-frame-output.ts +74 -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/surface-events.ts +80 -1
- 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/graph-runner/graph-cli.ts +26 -2
- package/src/graph-runner/graph-run-api.ts +3 -2
- package/src/graph-runner/runner.ts +17 -5
- package/src/graph-wizard/generate.ts +29 -6
- package/src/harness/harness-cli-command.ts +179 -33
- package/src/harness/review-adapter.ts +26 -6
- package/src/index.ts +116 -13
- package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
- 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.ts +123 -11
- 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/orchestrator/anomaly-cluster.ts +243 -0
- package/src/loops/orchestrator/tick.ts +49 -4
- package/src/model-tier/llm-tier-map.ts +12 -17
- package/src/msg/msg-store.ts +17 -0
- package/src/native-tool-catalog.ts +1 -1
- package/src/nexus/api/graph-wizard-api.ts +27 -2
- 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/state/state.ts +7 -1
- package/src/oauth/codex-account-store.ts +34 -1
- package/src/ops/loops-map.ts +46 -0
- package/src/ops/overview-cache.ts +22 -4
- package/src/ops/overview.ts +41 -5
- package/src/policy/llm-policy.ts +3 -1
- package/src/prompt-enhance/enhance.ts +4 -4
- package/src/pty-shell/availability.ts +7 -0
- package/src/pty-shell/herdr-agent-report.ts +40 -31
- 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 +187 -18
- package/src/pty-shell/registry.ts +25 -15
- package/src/pty-shell/tui-run-state.ts +235 -1
- package/src/release-loop/checklist.ts +50 -5
- package/src/release-loop/feature-store.ts +9 -9
- package/src/release-loop/landed-but-yellow.ts +93 -12
- package/src/repl/index.ts +8 -0
- 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 +29 -18
- package/src/self-dev/dev-pipeline.ts +29 -7
- package/src/self-dev/draft-sweep.ts +241 -16
- package/src/self-dev/draft-triage-rules.ts +19 -5
- package/src/self-dev/review-provider-fallback.ts +45 -7
- package/src/self-dev/shard-plan.ts +48 -0
- package/src/self-dev/shard-run.ts +50 -3
- package/src/self-implement/doctor-visit.ts +83 -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.ts +333 -18
- package/src/self-implement/goal-supervisor-fill.ts +75 -26
- package/src/self-implement/importer-test-index.ts +215 -2
- package/src/self-implement/knowhow-pack.ts +5 -5
- package/src/self-implement/orchestrator.ts +318 -25
- package/src/self-implement/review-round-brief.ts +300 -0
- package/src/self-implement/rework-policy.ts +14 -0
- package/src/self-implement/run-ledger.ts +170 -6
- package/src/self-implement/run-stop.ts +1 -1
- package/src/self-implement/running-runs.ts +17 -3
- package/src/self-implement/seams.ts +12 -6
- 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/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/skills/tools/pty.ts +5 -0
- package/src/status/metrics.ts +12 -1
- package/src/steward/rejudge-tick.ts +12 -5
- package/src/steward/resync-tick.ts +31 -4
- package/src/task-agent/actions.ts +199 -4
- 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/live-moves.ts +48 -3
- 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/parent-host.ts +21 -11
- package/src/task-agent/rejudge-on-head.ts +72 -5
- package/src/task-agent/repair-cycle.ts +41 -0
- package/src/task-agent/repair-next-move.ts +12 -2
- package/src/task-agent/review-prior-fix.ts +12 -2
- package/src/task-agent/shadow.ts +188 -5
- package/src/task-agent/task-hand.ts +158 -13
- package/src/task-agent/task-parent-role-llm.ts +9 -0
- package/src/task-agent/tier-split.ts +4 -3
- 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-artifact-return.ts +16 -6
- 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-pool.ts +50 -4
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +15 -9
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +217 -36
- package/src/task-orchestrator/surfaces/self-implement.ts +4 -0
- package/src/testing/linux-env.ts +177 -0
- package/src/tui/chat/goal-interim.ts +5 -1
- package/src/tui/entry.ts +258 -4
- package/src/tui/input/at-picker.ts +55 -0
- package/src/tui/slash/resume.ts +35 -12
- 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 +4 -3
- 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 +158 -4
- package/src/ux-sim/fake-gh.ts +174 -0
- package/src/ux-sim/fake-kubectl.ts +142 -0
- package/src/ux-sim/fake-llm.ts +6 -1
- package/src/ux-sim/next-tui-seat-scenarios.ts +124 -6
- 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/task-agent-parent-host-device.ts +264 -0
- package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +0 -287
- package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +0 -36
- package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +0 -149
- package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +0 -24
- package/apps/pwa/out/_next/static/chunks/2812ca6a.3b9f4a7a08885744.js +0 -1
- package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +0 -24
- package/apps/pwa/out/_next/static/chunks/3031-85328a92fcce4da6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3148-98efd4869d660a87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +0 -226
- package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +0 -8
- package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +0 -32
- package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +0 -286
- package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +0 -1
- package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +0 -74
- package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4116.a84a92a2492c080e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +0 -148
- package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +0 -122
- package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/599.c39c571b6733f2a2.js +0 -41
- package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +0 -79
- package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6566.926a1d1b7c911442.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +0 -1
- package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6925.562d532110879886.js +0 -1
- package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7784.1f0ac4a16d190cf4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7891.03f910124a737985.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8037.e254fd797aa224d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +0 -1
- package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +0 -62
- package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +0 -90
- package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +0 -77
- package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9514.131c52cc75fe6439.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-e7abc34a48a6f71e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-c15958835534404b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +0 -1
- /package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → 8kITumG9GAZ1LwT9POrAR}/_ssgManifest.js +0 -0
|
@@ -302,3 +302,128 @@ export async function condenseContextWindowWithReport(
|
|
|
302
302
|
catch { /* Observation must not stop condensation. */ }
|
|
303
303
|
return { cards, skipped, folded, droppedHarnessChild, funnel };
|
|
304
304
|
}
|
|
305
|
+
|
|
306
|
+
// ─── Claude 자동 기억 가져오기 (MEMORY-IMPORT-CLAUDE · 대표 10-12) ──────────────────────────────
|
|
307
|
+
// `~/.claude/projects/<project>/memory/*.md` 의 frontmatter(name·description·type)를 엘라누스
|
|
308
|
+
// 장기 기억 레코드로 옮긴다. 파일 읽기·저장은 호출자 몫 — 여기는 순수 변환만 둔다(에이전트 무관).
|
|
309
|
+
|
|
310
|
+
/** Claude 기억 파일 frontmatter 의 type 값 — 큐레이션 기억 type 어휘와 같다. */
|
|
311
|
+
export type ClaudeMemoryType = 'user' | 'feedback' | 'project' | 'reference';
|
|
312
|
+
|
|
313
|
+
/** 가져온 기억이 앉는 신뢰 사다리 맨 아래 칸 — 승격된 카드·결정을 덮지 않는다. */
|
|
314
|
+
export const CLAUDE_MEMORY_TRUST = 'memory';
|
|
315
|
+
|
|
316
|
+
/** 가져온 기억의 seat 표식 — 어떤 에이전트(codex·elanous TUI)든 같은 자리에서 읽는다. */
|
|
317
|
+
export const CLAUDE_MEMORY_SEAT = 'claude-memory';
|
|
318
|
+
|
|
319
|
+
/** 디스크에서 읽은 Claude 기억 파일 하나(경로 ⊕ 원문). */
|
|
320
|
+
export interface ClaudeMemoryFile { path: string; text: string }
|
|
321
|
+
|
|
322
|
+
/** MemoryItem 계약에 파일 자신의 이름 3종(name·description·type)을 그대로 얹은 레코드. */
|
|
323
|
+
export interface ClaudeMemoryItem extends MemoryItem {
|
|
324
|
+
name: string;
|
|
325
|
+
description: string;
|
|
326
|
+
type: ClaudeMemoryType;
|
|
327
|
+
body: string;
|
|
328
|
+
trust: typeof CLAUDE_MEMORY_TRUST;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export type ClaudeMemorySkipReason = 'no-frontmatter' | 'no-name' | 'no-description' | 'unknown-type';
|
|
332
|
+
|
|
333
|
+
export interface ClaudeMemoryImport {
|
|
334
|
+
items: ClaudeMemoryItem[];
|
|
335
|
+
/** 같은 name 이 두 번 나오면 뒤 파일이 이긴다(덮어쓰기). */
|
|
336
|
+
overwritten: number;
|
|
337
|
+
skipped: Partial<Record<ClaudeMemorySkipReason, number>>;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const CLAUDE_MEMORY_TYPES: readonly ClaudeMemoryType[] = ['user', 'feedback', 'project', 'reference'];
|
|
341
|
+
|
|
342
|
+
/** 출처 표시 — 원장의 `^(https?://|elanous://)` 링크 계약을 넓히지 않고 그대로 만족한다. */
|
|
343
|
+
export function claudeMemorySource(name: string): string {
|
|
344
|
+
return `elanous://claude-memory/${encodeURIComponent(name.trim())}`;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/** 낡음 표시 — «10-14 기준» 처럼 기준일의 월-일을 남긴다. */
|
|
348
|
+
export function claudeMemoryStalenessNote(asOf: string): string {
|
|
349
|
+
return `«${claudeMemoryInstant(asOf).slice(5, 10)} 기준»`;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function claudeMemoryInstant(asOf: string): string {
|
|
353
|
+
const ms = Date.parse(asOf);
|
|
354
|
+
if (!Number.isFinite(ms)) throw new Error(`claude memory asOf is not a date: ${asOf}`);
|
|
355
|
+
return new Date(ms).toISOString();
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function claudeFrontmatter(text: string): { fields: Record<string, string>; body: string } | undefined {
|
|
359
|
+
const normalized = text.replace(/^\uFEFF/, '').replace(/\r\n?/g, '\n');
|
|
360
|
+
if (!normalized.startsWith('---\n')) return undefined;
|
|
361
|
+
const close = normalized.indexOf('\n---', 3);
|
|
362
|
+
if (close < 0) return undefined;
|
|
363
|
+
const fields: Record<string, string> = {};
|
|
364
|
+
for (const line of normalized.slice(4, close).split('\n')) {
|
|
365
|
+
const match = /^([A-Za-z][\w-]*)\s*:\s*(.*)$/.exec(line);
|
|
366
|
+
if (match) fields[match[1]] = match[2].replace(/^(['"])([\s\S]*)\1$/, '$2').trim();
|
|
367
|
+
}
|
|
368
|
+
return { fields, body: normalized.slice(close + 4).replace(/^\n+/, '').trim() };
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
function claudeMemoryProject(path: string): string {
|
|
372
|
+
const parts = path.split(/[\\/]/).filter(Boolean);
|
|
373
|
+
const projectsAt = parts.indexOf('projects');
|
|
374
|
+
if (projectsAt >= 0 && parts[projectsAt + 2] === 'memory') return parts[projectsAt + 1];
|
|
375
|
+
const memoryAt = parts.lastIndexOf('memory');
|
|
376
|
+
return memoryAt > 0 ? parts[memoryAt - 1] : '(unknown)';
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* Claude 기억 파일 하나 → 장기 기억 레코드. 형식이 안 맞으면 이유와 함께 건너뛴다.
|
|
381
|
+
* claim 이 없는 레코드지만 source 가 `elanous://claude-memory/<name>` 링크라 원장 계약을 지킨다.
|
|
382
|
+
*/
|
|
383
|
+
export function importClaudeMemory(
|
|
384
|
+
file: ClaudeMemoryFile,
|
|
385
|
+
options: { asOf: string },
|
|
386
|
+
): { ok: true; item: ClaudeMemoryItem } | { ok: false; reason: ClaudeMemorySkipReason } {
|
|
387
|
+
const parsed = claudeFrontmatter(file.text);
|
|
388
|
+
if (!parsed) return { ok: false, reason: 'no-frontmatter' };
|
|
389
|
+
const name = (parsed.fields.name ?? '').trim();
|
|
390
|
+
if (!name) return { ok: false, reason: 'no-name' };
|
|
391
|
+
const description = (parsed.fields.description ?? '').trim();
|
|
392
|
+
if (!description) return { ok: false, reason: 'no-description' };
|
|
393
|
+
const type = (parsed.fields.type ?? '').trim().toLowerCase();
|
|
394
|
+
if (!CLAUDE_MEMORY_TYPES.includes(type as ClaudeMemoryType)) return { ok: false, reason: 'unknown-type' };
|
|
395
|
+
return { ok: true, item: {
|
|
396
|
+
project: claudeMemoryProject(file.path),
|
|
397
|
+
seat: CLAUDE_MEMORY_SEAT,
|
|
398
|
+
topic: name,
|
|
399
|
+
summary: `${claudeMemoryStalenessNote(options.asOf)} ${description}`,
|
|
400
|
+
source: claudeMemorySource(name),
|
|
401
|
+
updatedAt: claudeMemoryInstant(options.asOf),
|
|
402
|
+
status: 'active',
|
|
403
|
+
name,
|
|
404
|
+
description,
|
|
405
|
+
type: type as ClaudeMemoryType,
|
|
406
|
+
body: parsed.body,
|
|
407
|
+
trust: CLAUDE_MEMORY_TRUST,
|
|
408
|
+
} };
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/** 여러 파일을 한 번에 — name 이 겹치면 뒤 파일이 이긴다(덮어쓰기). */
|
|
412
|
+
export function importClaudeMemories(
|
|
413
|
+
files: readonly ClaudeMemoryFile[],
|
|
414
|
+
options: { asOf: string },
|
|
415
|
+
): ClaudeMemoryImport {
|
|
416
|
+
const byName = new Map<string, ClaudeMemoryItem>();
|
|
417
|
+
const skipped: Partial<Record<ClaudeMemorySkipReason, number>> = {};
|
|
418
|
+
let overwritten = 0;
|
|
419
|
+
for (const file of files) {
|
|
420
|
+
const outcome = importClaudeMemory(file, options);
|
|
421
|
+
if (!outcome.ok) {
|
|
422
|
+
skipped[outcome.reason] = (skipped[outcome.reason] ?? 0) + 1;
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
if (byName.has(outcome.item.name)) overwritten += 1;
|
|
426
|
+
byName.set(outcome.item.name, outcome.item);
|
|
427
|
+
}
|
|
428
|
+
return { items: [...byName.values()], overwritten, skipped };
|
|
429
|
+
}
|
|
@@ -185,7 +185,7 @@ export const GOAL_FINAL_ITERATION_NOTE =
|
|
|
185
185
|
'[last iteration] 이번이 이 목표의 마지막 반복이다. 이번에 끝내지 못하면 답 끝에 최종 보고를 한 번 써라: 한 것 · 남은 것 · 확인한 증거.';
|
|
186
186
|
|
|
187
187
|
/** 중간 답이 «최종 보고형»(미완 목록)인가 — 관측 전용(행동을 바꾸지 않는다). */
|
|
188
|
-
const INTERIM_REPORT_SHAPED = /(?:보고할 수
|
|
188
|
+
const INTERIM_REPORT_SHAPED = /(?:보고할 수 없|하지\s?못했습니다|못\s?했습니다|완료되지 않았|검증되지 않았|확인하지 못했|not (?:yet )?(?:verified|completed)|cannot report)/i;
|
|
189
189
|
export function isInterimReportShaped(text: string): boolean {
|
|
190
190
|
return INTERIM_REPORT_SHAPED.test(text);
|
|
191
191
|
}
|
|
@@ -631,12 +631,15 @@ export async function runGoalLoop(
|
|
|
631
631
|
const reinject = (content: string): void => {
|
|
632
632
|
if (iterations >= maxIterations) return;
|
|
633
633
|
const lastIteration = iterations === maxIterations - 1;
|
|
634
|
+
const reportShaped = isInterimReportShaped(lastResult.finalText);
|
|
634
635
|
try {
|
|
635
636
|
debug.log('goal.loop', 'interim-reply', {
|
|
636
637
|
sessionId: ctx.sessionId, ...runAttribution, iteration: iterations, lastIteration,
|
|
637
|
-
reportShaped
|
|
638
|
+
reportShaped, finalChars: lastResult.finalText.length,
|
|
638
639
|
}, { level: 'debug' });
|
|
639
640
|
} catch { /* 관측 실패가 루프를 막지 않는다 */ }
|
|
641
|
+
// Only a real continuation is interim; terminal and last-iteration answers stay visible.
|
|
642
|
+
if (lastResult.finalText.trim()) ctx.callbacks?.onGoalInterim?.(lastResult.finalText, iterations);
|
|
640
643
|
const nextIteration = iterations + 1;
|
|
641
644
|
const toolBudget = ctx.maxToolTurns ?? TOOL_LOOP_MAX_TURNS_DEFAULT;
|
|
642
645
|
const shouldAttachDelegateHint = shouldHintDelegate({
|
package/src/core-turn/types.ts
CHANGED
|
@@ -103,6 +103,8 @@ export interface CoreTurnCallbacks {
|
|
|
103
103
|
* persist this into their history store so the next user turn
|
|
104
104
|
* sees real tool evidence rather than a string summary. */
|
|
105
105
|
onTurnComplete?(newMessages: LLMMessage[]): void;
|
|
106
|
+
/** A goal iteration has finished but the goal remains open. Display-only signal; never replaces the turn history. */
|
|
107
|
+
onGoalInterim?(text: string, iteration: number): void;
|
|
106
108
|
/** Codex Responses API reasoning summary stream (gpt-5 family).
|
|
107
109
|
* `summary_part_added` marks a paragraph break between successive
|
|
108
110
|
* parts; `summary_delta` carries the streamed text. Only fires when
|
|
@@ -89,6 +89,8 @@ export interface AcpChatHandlers {
|
|
|
89
89
|
/** Append streamed assistant text. Caller accumulates + redraws.
|
|
90
90
|
* Receives each chunk exactly as the ACP agent emits it. */
|
|
91
91
|
appendChunk: (delta: string) => void;
|
|
92
|
+
/** A goal iteration ended; fold only that interim reply in the visible pane. */
|
|
93
|
+
foldGoalInterim?: (text: string) => void;
|
|
92
94
|
/** Called once per tool_call event with a rendered label like
|
|
93
95
|
* "→ tool: read_file(/tmp/foo)". Dashboard writes these into the
|
|
94
96
|
* log pane with a subdued style. */
|
|
@@ -430,6 +432,13 @@ export class DashboardAcpChat {
|
|
|
430
432
|
private dispatchUpdate(update: SessionUpdate, handlers: AcpChatHandlers, sess: AcpChatSession): void {
|
|
431
433
|
switch (update.sessionUpdate) {
|
|
432
434
|
case 'agent_message_chunk': {
|
|
435
|
+
const interim = (update as typeof update & { _meta?: { goalInterim?: unknown } })._meta?.goalInterim;
|
|
436
|
+
if (typeof interim === 'string') {
|
|
437
|
+
this.closeStreamBuffer(sess, 'flush');
|
|
438
|
+
handlers.foldGoalInterim?.(interim);
|
|
439
|
+
handlers.redraw?.();
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
433
442
|
const c = update.content;
|
|
434
443
|
if (c.type === 'text') {
|
|
435
444
|
this.routeText(sess, c.text, handlers);
|
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 {
|
|
@@ -947,7 +1003,7 @@ import { runPtySnapshot, type PtyTakeoverCommandDeps } from '../cli/pty-takeover
|
|
|
947
1003
|
import { requestRemotePtyControl } from '../pty-shell/pty-control-ipc.js';
|
|
948
1004
|
import { getHarnessRunId } from '../harness/harness-space.js';
|
|
949
1005
|
import { formatPtyCallLine, formatPtyResultLine } from '../pty-activity-log.js';
|
|
950
|
-
import { getSessionMetrics } from '../status/metrics.js';
|
|
1006
|
+
import { getSessionMetrics, noteRestoredContext } from '../status/metrics.js';
|
|
951
1007
|
import {
|
|
952
1008
|
createContextRegistry, tokenizeInput, pruneUnreferenced,
|
|
953
1009
|
addAttachmentEx as ctxAddEx,
|
|
@@ -1024,7 +1080,7 @@ import {
|
|
|
1024
1080
|
deriveDaemonHttpBase,
|
|
1025
1081
|
fetchDaemonSessionHistory,
|
|
1026
1082
|
} from './acp-boot.js';
|
|
1027
|
-
import {
|
|
1083
|
+
import { renderRestoredTranscriptLines } from './replay-preview.js';
|
|
1028
1084
|
import {
|
|
1029
1085
|
buildDashboardTurnPreamble,
|
|
1030
1086
|
} from './turn-preamble.js';
|
|
@@ -1062,6 +1118,7 @@ import { spawnCodingAgent, CodingAgentBinaryMissing } from '../terminal/coding-a
|
|
|
1062
1118
|
import type { TerminalSession } from '../terminal/session-registry.js';
|
|
1063
1119
|
import { createSessionPickerModal } from '../session/picker-modal.js';
|
|
1064
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';
|
|
1065
1122
|
// TUI 부활 S-b — 타임트래블 포크 엔진 (codex ForkSnapshot 동형 · 2026-07-09
|
|
1066
1123
|
// 이식 후 호출처 0 이던 방치 자산 회수). 순수 히스토리 절단 로직만 소비;
|
|
1067
1124
|
// 영속은 세션 스토어(forkSessionFromHistory)가 담당한다.
|
|
@@ -1213,7 +1270,7 @@ import { type ExecutionSurfaceHandle } from '../display/index.js';
|
|
|
1213
1270
|
import { AgentSurfaceStore, renderAgentDetail, renderAgentRoster, type AgentSurfaceState } from '../display/agent-surface.js';
|
|
1214
1271
|
import { globalAgentFlash } from '../display/agent-flash.js';
|
|
1215
1272
|
import { globalTaskNotificationQueue, type TaskNotificationQueue, type PendingTaskNotification } from '../agent/task-notification.js';
|
|
1216
|
-
import { createDashboardAgentWakeNotify,
|
|
1273
|
+
import { createDashboardAgentWakeNotify, installSeatedAgentWake, wrapAgentWakePort } from './input/agent-wake.js';
|
|
1217
1274
|
import { renderDebugEventDetail, renderDebugEventRows, renderDebugStack, renderPromptInjectionDebug } from '../display/debug-surface.js';
|
|
1218
1275
|
import { buildDebugCallStack } from '../debug/call-stack.js';
|
|
1219
1276
|
import { buildAstGrepHostTool } from '../skills/tools/ast-grep.js';
|
|
@@ -2752,16 +2809,18 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
2752
2809
|
// Pickers share the composer bottom slot.
|
|
2753
2810
|
const placement = resolveDecisionPickerPlacement({ height: 16 });
|
|
2754
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));
|
|
2755
2814
|
const fmtRow = (m: (typeof rows)[number]): string => {
|
|
2756
2815
|
const marker = m.id === attachedSessionId ? '▸ ' : ' ';
|
|
2757
|
-
const ts = m.updatedAt
|
|
2816
|
+
const ts = sessionListTime(m.updatedAt);
|
|
2758
2817
|
const binds: string[] = [];
|
|
2759
2818
|
if (m.bindings?.cli) binds.push('cli');
|
|
2760
2819
|
if (m.bindings?.telegram) binds.push('tg');
|
|
2761
2820
|
if (m.bindings?.discord) binds.push('dc');
|
|
2762
2821
|
const bindStr = binds.length > 0 ? `[${binds.join(',')}]` : '';
|
|
2763
2822
|
const title = (m.title || '(no title)').slice(0, 42);
|
|
2764
|
-
return `${marker}${m.id
|
|
2823
|
+
return `${marker}${idPrefixCell(idPrefixes, m.id)} ${ts} ${String(m.messageCount).padStart(3)}t ${bindStr.padEnd(9)} ${title}`;
|
|
2765
2824
|
};
|
|
2766
2825
|
const handle = createSearchModal({
|
|
2767
2826
|
id: `session-resume:${Date.now().toString(36)}`,
|
|
@@ -2788,7 +2847,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
2788
2847
|
promptCtl.submit(`/session load ${id}`);
|
|
2789
2848
|
} else {
|
|
2790
2849
|
// 입력 루프 비활성 등으로 합성 submit 불가 — 수동 안내 폴백.
|
|
2791
|
-
chatLines.push(C.muted(` /session load ${
|
|
2850
|
+
chatLines.push(C.muted(` /session load ${idPrefixes.get(id) ?? id} 를 입력해 재개하세요`));
|
|
2792
2851
|
chatScrollOffset = -1;
|
|
2793
2852
|
draw();
|
|
2794
2853
|
}
|
|
@@ -11337,7 +11396,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
11337
11396
|
try { mouseWiring.toasts().push({ text, kind, ttlMs: 1200 }); } catch { /* ignore */ }
|
|
11338
11397
|
};
|
|
11339
11398
|
|
|
11340
|
-
|
|
11399
|
+
const drawFrameNow = ({ force: forceFromCoordinator = false } = {}) => {
|
|
11341
11400
|
const { rows: termRows, cols } = termSize();
|
|
11342
11401
|
const totalW = cols - 1;
|
|
11343
11402
|
|
|
@@ -11781,6 +11840,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
11781
11840
|
if (overlay.length > 0) process.stdout.write(overlay);
|
|
11782
11841
|
} catch { /* overlay must not crash main draw */ }
|
|
11783
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
|
+
};
|
|
11784
11852
|
draw = (opts = {}) => {
|
|
11785
11853
|
if (debug.enabled) {
|
|
11786
11854
|
const now = Date.now();
|
|
@@ -12645,7 +12713,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
12645
12713
|
const disposeResizeListener = installResizeListener({
|
|
12646
12714
|
draw: (opts) => draw(opts),
|
|
12647
12715
|
promptCtl,
|
|
12648
|
-
requestOverlayFrame: () => display.
|
|
12716
|
+
requestOverlayFrame: () => display.requestRenderNow({ force: true }),
|
|
12717
|
+
withSynchronizedOutput: (paint) => display.withSynchronizedOutput(paint),
|
|
12649
12718
|
});
|
|
12650
12719
|
process.on('exit', disposeResizeListener);
|
|
12651
12720
|
// 외부 주입(`pty text`)을 사용자 타이핑과 섞지 않고 별도 대기열로 — 결함 #6(10-14).
|
|
@@ -13267,14 +13336,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13267
13336
|
// ⭐ TUI-AGENT-IDLE-WAKE — 배경 자식(⊕ RunShell bg) 완료 큐의 «유일한» 구독(onEnqueue 구독 0 → 1).
|
|
13268
13337
|
// 채팅 한 줄 «✓ 위임 끝: <이름> — 다음 턴에 결과» · 결과는 다음 턴 preamble 이 싣는다.
|
|
13269
13338
|
// ⛔ 입력칸·injectKey·pty 주입 0(대표 비침투). dedupe·수명은 모듈, 여기선 배선만.
|
|
13270
|
-
const agentWake =
|
|
13339
|
+
const agentWake = installSeatedAgentWake({
|
|
13271
13340
|
subscribe: (listener) => subscribeDashboardAgentResults(
|
|
13272
13341
|
globalTaskNotificationQueue, listener, (line) => { pushChatLine(C.muted(line)); draw(); },
|
|
13273
13342
|
),
|
|
13274
13343
|
// 그리기 실패는 삼키지 않는다 — 모듈이 잡아 notified{shown:false} 로 남긴다.
|
|
13275
13344
|
notify: createDashboardAgentWakeNotify((line) => { chatLines.push(C.muted(line)); }, () => draw()),
|
|
13276
13345
|
// 조각 2 — 자리 TUI ∧ 유휴면 H2 문으로 다음 턴(origin child-complete) · 판정은 모듈.
|
|
13277
|
-
|
|
13346
|
+
startTurnIfIdle: (text, opts) => internalTurnGate.startTurnIfIdle(text, opts),
|
|
13347
|
+
getCwd: () => workingDir.cwd,
|
|
13348
|
+
isPending: (taskId) => globalTaskNotificationQueue.has(taskId),
|
|
13278
13349
|
});
|
|
13279
13350
|
disposeDashboardAgentWake = () => agentWake.dispose();
|
|
13280
13351
|
|
|
@@ -15236,14 +15307,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15236
15307
|
chat.history.push(m as ChatMessage);
|
|
15237
15308
|
}
|
|
15238
15309
|
const turns = past.length;
|
|
15239
|
-
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);
|
|
15240
15312
|
// BACKLOG #1 — markdown-aware preview rendering. Replaces
|
|
15241
15313
|
// the previous one-line `slice(0, 100)` snippet so tables
|
|
15242
15314
|
// / bold / lists in replayed turns look the same as when
|
|
15243
15315
|
// they were originally streamed (`formatResponse` path).
|
|
15244
15316
|
const previewWidth = Math.max(40, termSize().cols - 8);
|
|
15245
15317
|
const previewWrap = getUserConfig().chat.rendering.wrap;
|
|
15246
|
-
const previewLines =
|
|
15318
|
+
const previewLines = renderRestoredTranscriptLines(past, {
|
|
15247
15319
|
maxWidth: previewWidth,
|
|
15248
15320
|
wrapOpts: previewWrap,
|
|
15249
15321
|
});
|
|
@@ -15285,7 +15357,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15285
15357
|
if (resume.repaired) {
|
|
15286
15358
|
chatLines.push(C.muted(` 깨진 도구 호출·결과 짝을 잘라 이어받았다(호출 ${resume.repaired.removedCalls} · 결과 ${resume.repaired.removedResults})`));
|
|
15287
15359
|
}
|
|
15288
|
-
|
|
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.'));
|
|
15289
15370
|
}
|
|
15290
15371
|
}
|
|
15291
15372
|
observeSessionStart({
|
|
@@ -17866,6 +17947,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
17866
17947
|
},
|
|
17867
17948
|
};
|
|
17868
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
|
+
}
|
|
17869
17953
|
if (debug.enabled) {
|
|
17870
17954
|
debug.log('dashboard.slash.dispatch', cmdLower, {
|
|
17871
17955
|
argsCount: args.length,
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
// 턴 중(NotIdle)·입력 중(HumanTyping)에 온 완료는 «대기»: 입력칸이 다시 뜰 때(`wrapAgentWakePort`) 그 결과가
|
|
14
14
|
// 아직 큐에 남아 있으면(=어느 턴도 안 실었으면) 한 번만 다시 청한다. 이미 실렸으면(drain) 아무것도 안 한다.
|
|
15
15
|
// ⛔ 같은 알림(taskId)은 한 번만 — 큐 `seen` 이 `clear()` 로 비워져도, 대시보드가 재진입해도 막는다.
|
|
16
|
+
// ⭐ 생산 조립은 `installSeatedAgentWake` «하나» — `src/dashboard/index.ts` 의 `showDashboard` 가 그 함수만
|
|
17
|
+
// 부르고, 이 파일의 무대 시험이 «같은 함수»를 지난다(문자열 배선 확인이 아니라 생산 호출 경로 증거).
|
|
16
18
|
//
|
|
17
19
|
// 세 얼굴:
|
|
18
20
|
// 관측 = debug.log('tui.agent-wake', 'notified' | 'opened' | 'rejected' | 'deferred', { taskId, agent, state, seat, shown, reason })
|
|
@@ -240,6 +242,47 @@ export function installAgentWake(deps: Omit<AgentWakeDeps, 'handled'>): AgentWak
|
|
|
240
242
|
return own;
|
|
241
243
|
}
|
|
242
244
|
|
|
245
|
+
/** 대시보드가 넘기는 «생산 포트» — showDashboard 가 실제로 채우는 모양 그대로. */
|
|
246
|
+
export interface DashboardAgentWakePorts {
|
|
247
|
+
/** 큐 구독 — `subscribeDashboardAgentResults(globalTaskNotificationQueue, …)` 가 여기로 들어온다. */
|
|
248
|
+
subscribe: AgentWakeDeps['subscribe'];
|
|
249
|
+
/** 채팅 한 줄 — `createDashboardAgentWakeNotify(pushLine, draw)`. */
|
|
250
|
+
notify: AgentWakeDeps['notify'];
|
|
251
|
+
/** H2 문 — `internalTurnGate.startTurnIfIdle`. 자리 TUI ∧ 유휴일 때만 실제로 열린다. */
|
|
252
|
+
startTurnIfIdle: AgentWakeOpenTurnDeps['startTurnIfIdle'];
|
|
253
|
+
/** 지금 화면의 cwd(자리 판정 입력) — `() => workingDir.cwd`. */
|
|
254
|
+
getCwd: () => string;
|
|
255
|
+
/** 그 완료가 아직 어느 턴에도 안 실렸나 — `globalTaskNotificationQueue.has`. «대기» 재시도의 근거. */
|
|
256
|
+
isPending: (taskId: string) => boolean;
|
|
257
|
+
/** 시험·주입 자리(생산은 안 넘긴다 — 기본 `homedir()`·`detectSeatTui`·`setTimeout 0`). */
|
|
258
|
+
home?: string;
|
|
259
|
+
detectSeat?: AgentWakeOpenTurnDeps['detectSeat'];
|
|
260
|
+
defer?: AgentWakeOpenTurnDeps['defer'];
|
|
261
|
+
log?: AgentWakeDeps['log'];
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* 대시보드 생산 조립 — `showDashboard` 는 이 함수 «하나»만 부른다.
|
|
266
|
+
* 알림(조각 1)과 «자리 TUI ∧ 유휴 → H2 한 턴(origin child-complete)»(조각 2)을 같은 큐 구독에서 낸다.
|
|
267
|
+
* 중복 거부(같은 taskId 한 번)·DEFERRABLE 대기→입력칸 재시도·수명은 `createAgentWake` 몫이다.
|
|
268
|
+
*/
|
|
269
|
+
export function installSeatedAgentWake(ports: DashboardAgentWakePorts): AgentWakeController {
|
|
270
|
+
const openTurn: AgentWakeOpenTurnDeps = {
|
|
271
|
+
startTurnIfIdle: ports.startTurnIfIdle,
|
|
272
|
+
getCwd: ports.getCwd,
|
|
273
|
+
isPending: ports.isPending,
|
|
274
|
+
...(ports.home !== undefined ? { home: ports.home } : {}),
|
|
275
|
+
...(ports.detectSeat !== undefined ? { detectSeat: ports.detectSeat } : {}),
|
|
276
|
+
...(ports.defer !== undefined ? { defer: ports.defer } : {}),
|
|
277
|
+
};
|
|
278
|
+
return installAgentWake({
|
|
279
|
+
subscribe: ports.subscribe,
|
|
280
|
+
notify: ports.notify,
|
|
281
|
+
openTurn,
|
|
282
|
+
...(ports.log !== undefined ? { log: ports.log } : {}),
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
|
|
243
286
|
/** 시험 격리용 — 설치·공유 dedupe 를 비운다. */
|
|
244
287
|
export function resetAgentWakeForTest(): void {
|
|
245
288
|
installed?.dispose();
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { NormalizedAttachment } from '../../acp/content-blocks.js';
|
|
2
2
|
import { debug } from '../../debug/log.js';
|
|
3
3
|
import type { ControlSignalBus } from '../../input/control-signal.js';
|
|
4
|
+
import { classifyInterimReply, formatInterimFoldLine } from '../../tui/chat/goal-interim.js';
|
|
4
5
|
import {
|
|
5
6
|
createTurnOutputBundle,
|
|
6
7
|
runTurnOutputBundleSettle,
|
|
@@ -76,6 +77,8 @@ export function dispatchDashboardChatMainAcpSend(
|
|
|
76
77
|
let firstChunk = true;
|
|
77
78
|
let assistantTextActive = false;
|
|
78
79
|
let assistantBodyStart = -1;
|
|
80
|
+
let assistantBodyEnd = -1;
|
|
81
|
+
const interimBodyRanges: Array<{ start: number; end: number }> = [];
|
|
79
82
|
let assistantBodyText = '';
|
|
80
83
|
let assistantRunUsesPrefix = false;
|
|
81
84
|
|
|
@@ -91,6 +94,7 @@ export function dispatchDashboardChatMainAcpSend(
|
|
|
91
94
|
if (firstChunk) firstChunk = false;
|
|
92
95
|
assistantBodyText = '';
|
|
93
96
|
assistantBodyStart = -1;
|
|
97
|
+
assistantBodyEnd = -1;
|
|
94
98
|
assistantTextActive = true;
|
|
95
99
|
}
|
|
96
100
|
assistantBodyText += delta;
|
|
@@ -110,7 +114,7 @@ export function dispatchDashboardChatMainAcpSend(
|
|
|
110
114
|
deps.autoTtsHooks?.pushChunk(delta);
|
|
111
115
|
const rendered = deps.formatAssistantLines(assistantBodyText);
|
|
112
116
|
if (assistantBodyStart < 0) assistantBodyStart = deps.chatLines.length;
|
|
113
|
-
deps.chatLines.
|
|
117
|
+
deps.chatLines.splice(assistantBodyStart, Math.max(0, assistantBodyEnd - assistantBodyStart));
|
|
114
118
|
rendered.forEach((line, index) => {
|
|
115
119
|
if (index === 0 && assistantRunUsesPrefix) {
|
|
116
120
|
deps.chatLines.push(`${deps.formatAssistantPrefix(display)} ${line}`);
|
|
@@ -118,8 +122,24 @@ export function dispatchDashboardChatMainAcpSend(
|
|
|
118
122
|
deps.chatLines.push(` ${line}`);
|
|
119
123
|
}
|
|
120
124
|
});
|
|
125
|
+
assistantBodyEnd = assistantBodyStart + rendered.length;
|
|
126
|
+
if (interimBodyRanges.at(-1)?.start === assistantBodyStart) interimBodyRanges[interimBodyRanges.length - 1]!.end = assistantBodyEnd;
|
|
127
|
+
else interimBodyRanges.push({ start: assistantBodyStart, end: assistantBodyEnd });
|
|
121
128
|
deps.setChatScrollToTail();
|
|
122
129
|
},
|
|
130
|
+
foldGoalInterim: (text) => {
|
|
131
|
+
const verdict = classifyInterimReply(text.split('\n'));
|
|
132
|
+
if (verdict.interim && interimBodyRanges.length > 0) {
|
|
133
|
+
const first = interimBodyRanges[0]!.start;
|
|
134
|
+
for (const { start, end } of [...interimBodyRanges].reverse()) deps.chatLines.splice(start, end - start);
|
|
135
|
+
deps.chatLines.splice(first, 0, ` ${formatInterimFoldLine(verdict.summary)}`);
|
|
136
|
+
deps.setChatScrollToTail();
|
|
137
|
+
}
|
|
138
|
+
interimBodyRanges.length = 0;
|
|
139
|
+
assistantTextActive = false;
|
|
140
|
+
assistantBodyStart = -1;
|
|
141
|
+
assistantBodyEnd = -1;
|
|
142
|
+
},
|
|
123
143
|
pushToolCall: (tool) => {
|
|
124
144
|
deps.chatLines.push(deps.formatToolLine(tool));
|
|
125
145
|
deps.setChatScrollToTail();
|
|
@@ -105,3 +105,28 @@ export function renderReplayPreviewLines(
|
|
|
105
105
|
}
|
|
106
106
|
return lines;
|
|
107
107
|
}
|
|
108
|
+
|
|
109
|
+
/** Restored transcripts longer than this show their tail plus one «earlier N messages» line. */
|
|
110
|
+
export const RESTORED_TRANSCRIPT_MAX_MESSAGES = 200;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* The restored conversation in full (TUI-RESUME-PICKER ③): every user/assistant message, every line —
|
|
114
|
+
* not the 5-message, 2-line preview. Resuming used to leave the chat log blank but for that preview,
|
|
115
|
+
* so the user could not see what they were continuing. Very long sessions keep the last
|
|
116
|
+
* `maxMessages` and say how many were left out.
|
|
117
|
+
*/
|
|
118
|
+
export function renderRestoredTranscriptLines(
|
|
119
|
+
messages: readonly ReplayPreviewMessage[],
|
|
120
|
+
opts: Omit<ReplayPreviewOpts, 'tail' | 'perMessageLines'> & { maxMessages?: number },
|
|
121
|
+
): string[] {
|
|
122
|
+
const visible = messages.filter((m) => m.role !== 'system' && extractReplayText(m.content).length > 0);
|
|
123
|
+
const max = opts.maxMessages ?? RESTORED_TRANSCRIPT_MAX_MESSAGES;
|
|
124
|
+
const hidden = Math.max(0, visible.length - max);
|
|
125
|
+
const lines = hidden > 0 ? [C.muted(` … 앞 ${hidden}개 메시지 생략 (최근 ${max}개 표시)`)] : [];
|
|
126
|
+
return lines.concat(renderReplayPreviewLines(visible.slice(-max), {
|
|
127
|
+
maxWidth: opts.maxWidth,
|
|
128
|
+
...(opts.wrapOpts ? { wrapOpts: opts.wrapOpts } : {}),
|
|
129
|
+
tail: max,
|
|
130
|
+
perMessageLines: Number.MAX_SAFE_INTEGER,
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
@@ -364,13 +364,15 @@ import {
|
|
|
364
364
|
attachTelegramBinding as sessionAttachTelegram,
|
|
365
365
|
listBoundSessions as sessionListBound,
|
|
366
366
|
} from '../../session/index.js';
|
|
367
|
+
import { idPrefixCell, sessionIdPrefixes, sessionListTime } from '../../session/id-prefix.js';
|
|
367
368
|
import { safeReadLock as telegramSafeReadLock, defaultLockPath as telegramDefaultLockPath } from '../../telegram-lock.js';
|
|
368
369
|
import { userConfigPath as userConfigPathFn } from '../../user-config.js';
|
|
369
370
|
import { dirname as pathDirname, relative, resolve as resolvePath } from 'node:path';
|
|
370
371
|
import { existsSync, readFileSync, statSync, writeFileSync } from 'node:fs';
|
|
371
372
|
import { installPlugin, listInstalledPlugins, type InstalledPlugin } from '../../plugins/install/plugin-install.js';
|
|
372
373
|
import type { SurfaceUx } from '../../agent/surface-ux/types.js';
|
|
373
|
-
import {
|
|
374
|
+
import { renderRestoredTranscriptLines } from '../replay-preview.js';
|
|
375
|
+
import { noteRestoredContext } from '../../status/metrics.js';
|
|
374
376
|
import {
|
|
375
377
|
deriveDaemonHttpBase,
|
|
376
378
|
fetchDaemonSessionList,
|
|
@@ -2395,6 +2397,8 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2395
2397
|
}
|
|
2396
2398
|
} else if (result.kind === 'stopped-before-authoring') {
|
|
2397
2399
|
ctx.chatLines.push(ctx.error(' ⛔ 저작 «전» 예비 검사에서 막혔다 — 위 이름을 확인하라'));
|
|
2400
|
+
} else if (result.kind === 'stopped-by-timebox') {
|
|
2401
|
+
ctx.chatLines.push(ctx.error(` ⛔ AUTHOR-TIMEBOX 초과로 접지 없이 끝났다 — 골은 남아 있다: ${result.goalFile}`));
|
|
2398
2402
|
} else {
|
|
2399
2403
|
ctx.chatLines.push(ctx.error(` ⛔ 전제 검사에서 막혔다 — 골은 남아 있다: ${result.goalFile}`));
|
|
2400
2404
|
}
|
|
@@ -2602,6 +2606,8 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2602
2606
|
if (seSub === 'list' || seSub === 'ls') {
|
|
2603
2607
|
const limit = args[1] ? Math.max(1, Math.min(50, Number(args[1]) || 10)) : 10;
|
|
2604
2608
|
const rows = sessionListSessions({ limit });
|
|
2609
|
+
// Unique prefixes, not a fixed 8 — `/session load <shown prefix>` must resolve (TUI-RESUME-PICKER).
|
|
2610
|
+
const idPrefixes = sessionIdPrefixes(rows.map((m) => m.id));
|
|
2605
2611
|
// Tier 1 daemon merge — when attached to a remote daemon w/ a
|
|
2606
2612
|
// derivable HTTP base, fetch the daemon's session list too so
|
|
2607
2613
|
// the user sees web/PWA/other-client sessions alongside their
|
|
@@ -2628,9 +2634,9 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2628
2634
|
if (m.bindings?.telegram) binds.push(`tg:${m.bindings.telegram.chatId}`);
|
|
2629
2635
|
if (m.bindings?.discord) binds.push(`dc:${m.bindings.discord.channelId}`);
|
|
2630
2636
|
const bindStr = binds.length > 0 ? ctx.subtext(`[${binds.join(' ')}]`) : '';
|
|
2631
|
-
const ts = m.updatedAt
|
|
2637
|
+
const ts = sessionListTime(m.updatedAt);
|
|
2632
2638
|
const title = (m.title || '(no title)').slice(0, 48);
|
|
2633
|
-
ctx.chatLines.push(` ${marker} ${ctx.text(m.id
|
|
2639
|
+
ctx.chatLines.push(` ${marker} ${ctx.text(idPrefixCell(idPrefixes, m.id))} ${ctx.muted(ts)} ${ctx.muted(`${m.messageCount}t`.padStart(4))} ${bindStr.padEnd(10)} ${title}`);
|
|
2634
2640
|
}
|
|
2635
2641
|
}
|
|
2636
2642
|
if (daemonRows.length > 0) {
|
|
@@ -2734,13 +2740,14 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2734
2740
|
}
|
|
2735
2741
|
ctx.setAttachedSessionId(match.id);
|
|
2736
2742
|
try { sessionSetActiveId(match.id); } catch { /* best-effort */ }
|
|
2743
|
+
noteRestoredContext(chatHistory);
|
|
2737
2744
|
ctx.chatLines.push('');
|
|
2738
2745
|
ctx.chatLines.push(ctx.success(` ✓ swapped to daemon session ${match.id}`));
|
|
2739
2746
|
if (past && past.length > 0) {
|
|
2740
|
-
ctx.chatLines.push(ctx.muted(` ${past.length} turn${past.length === 1 ? '' : 's'} restored
|
|
2747
|
+
ctx.chatLines.push(ctx.muted(` ${past.length} turn${past.length === 1 ? '' : 's'} restored:`));
|
|
2741
2748
|
const swapPreviewWidth = Math.max(40, termSize().cols - 8);
|
|
2742
2749
|
const swapPreviewWrap = getUserConfig().chat.rendering.wrap;
|
|
2743
|
-
const swapPreviewLines =
|
|
2750
|
+
const swapPreviewLines = renderRestoredTranscriptLines(past, {
|
|
2744
2751
|
maxWidth: swapPreviewWidth,
|
|
2745
2752
|
wrapOpts: swapPreviewWrap,
|
|
2746
2753
|
});
|
|
@@ -2792,11 +2799,13 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2792
2799
|
// side /attach (no-arg) picks up the same session automatically.
|
|
2793
2800
|
try { sessionSetActiveId(resolvedId); } catch { /* best-effort */ }
|
|
2794
2801
|
ctx.chatLines.push('');
|
|
2795
|
-
ctx.chatLines.push(ctx.success(` ✓ loaded session ${resolvedId.
|
|
2796
|
-
ctx.chatLines.push(ctx.muted(` ${loaded.history.length} turns restored
|
|
2802
|
+
ctx.chatLines.push(ctx.success(` ✓ loaded session ${sessionIdPrefixes([resolvedId]).get(resolvedId) ?? resolvedId} (${loaded.meta.title || '(no title)'})`));
|
|
2803
|
+
ctx.chatLines.push(ctx.muted(` ${loaded.history.length} turns restored:`));
|
|
2804
|
+
const restoredTokens = noteRestoredContext(chatHistory);
|
|
2805
|
+
debug.log('chat.session.load', 'restored', { sessionId: resolvedId, turns: loaded.history.length, estimatedContextTokens: restoredTokens });
|
|
2797
2806
|
const loadPreviewWidth = Math.max(40, termSize().cols - 8);
|
|
2798
2807
|
const loadPreviewWrap = getUserConfig().chat.rendering.wrap;
|
|
2799
|
-
const loadPreviewLines =
|
|
2808
|
+
const loadPreviewLines = renderRestoredTranscriptLines(loaded.history, {
|
|
2800
2809
|
maxWidth: loadPreviewWidth,
|
|
2801
2810
|
wrapOpts: loadPreviewWrap,
|
|
2802
2811
|
});
|