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
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI-FLICKER-DRAW-INTEGRATION — one synchronized-output owner per dashboard frame.
|
|
3
|
+
*
|
|
4
|
+
* A dashboard frame is not a single write: the transient-overlay cleanup, the
|
|
5
|
+
* base frame, the coordinator modal overlay, the prompt repaint and the
|
|
6
|
+
* post-frame overlay stamp are flushed one after another. Under tmux each of
|
|
7
|
+
* those flushes is presented on its own, so a tick that rewrites the frame is
|
|
8
|
+
* visible as a flicker. Wrapping the whole compose in DEC synchronized output
|
|
9
|
+
* (`CSI ? 2026 h` … `CSI ? 2026 l`) lets the terminal present the composite
|
|
10
|
+
* frame atomically.
|
|
11
|
+
*
|
|
12
|
+
* The owner is deliberately tiny and synchronous: callers open it, draw, and
|
|
13
|
+
* close it in a `finally` so a throw inside the draw still emits the ESU and
|
|
14
|
+
* the *next* frame is not swallowed by a dangling synchronized-output region.
|
|
15
|
+
*
|
|
16
|
+
* The wrap nests with the display coordinator, which opens the same region
|
|
17
|
+
* around its own flush and whose `onRender` hook is what calls `drawNow()`.
|
|
18
|
+
* `src/display/synchronized-output-region.ts` keeps that single-owner: an
|
|
19
|
+
* inner open contributes no bytes, so the coordinator's overlay + cursor stamp
|
|
20
|
+
* stays inside the one presentation instead of being pushed out by an early
|
|
21
|
+
* inner ESU.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import {
|
|
25
|
+
SYNCHRONIZED_OUTPUT_BEGIN,
|
|
26
|
+
SYNCHRONIZED_OUTPUT_END,
|
|
27
|
+
openSynchronizedOutputRegion,
|
|
28
|
+
synchronizedOutputDisabledByEnv,
|
|
29
|
+
} from '../display/synchronized-output-region.js';
|
|
30
|
+
|
|
31
|
+
export { SYNCHRONIZED_OUTPUT_BEGIN, SYNCHRONIZED_OUTPUT_END };
|
|
32
|
+
|
|
33
|
+
export interface SynchronizedFrameOutputDeps {
|
|
34
|
+
/** Sink for the control sequences — production passes `process.stdout.write`. */
|
|
35
|
+
write: (chunk: string) => void;
|
|
36
|
+
/**
|
|
37
|
+
* Whether the sink may receive DEC 2026. Defaults to `true`. Production
|
|
38
|
+
* passes `process.stdout.isTTY` so piped/captured output stays
|
|
39
|
+
* byte-identical to what it was before this seam existed.
|
|
40
|
+
*/
|
|
41
|
+
supported?: boolean;
|
|
42
|
+
/** Environment escape hatch (`ELANOUS_SYNC_OUTPUT=off`). Defaults to `process.env`. */
|
|
43
|
+
env?: Record<string, string | undefined>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface SynchronizedFrameOutput {
|
|
47
|
+
/** Closes the region. Idempotent — a second call writes nothing. */
|
|
48
|
+
close: () => void;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function beginSynchronizedFrameOutput(
|
|
52
|
+
deps: SynchronizedFrameOutputDeps,
|
|
53
|
+
): SynchronizedFrameOutput {
|
|
54
|
+
const region = openSynchronizedOutputRegion();
|
|
55
|
+
const enabled =
|
|
56
|
+
region.outermost && deps.supported !== false && !synchronizedOutputDisabledByEnv(deps.env);
|
|
57
|
+
let closed = false;
|
|
58
|
+
if (enabled) {
|
|
59
|
+
try {
|
|
60
|
+
deps.write(SYNCHRONIZED_OUTPUT_BEGIN);
|
|
61
|
+
} catch (err) {
|
|
62
|
+
region.close();
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
close: () => {
|
|
68
|
+
if (closed) return;
|
|
69
|
+
closed = true;
|
|
70
|
+
if (enabled) deps.write(SYNCHRONIZED_OUTPUT_END);
|
|
71
|
+
region.close();
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
@@ -22,6 +22,10 @@ import { TIER_ORDER, tierRank, tiersCompatible } from './types.js';
|
|
|
22
22
|
import { resolveKeyAlias } from '../input-core/key-alias-table.js';
|
|
23
23
|
import type { DisplayEventBus } from './events.js';
|
|
24
24
|
import { paintCursor, type CursorState } from './cursor-state.js';
|
|
25
|
+
import {
|
|
26
|
+
openSynchronizedOutputRegion,
|
|
27
|
+
synchronizedOutputDisabledByEnv,
|
|
28
|
+
} from './synchronized-output-region.js';
|
|
25
29
|
import { deriveCursor, type CursorDecision } from './cursor-owner.js';
|
|
26
30
|
import {
|
|
27
31
|
createVirtualCursorRegistry,
|
|
@@ -261,7 +265,6 @@ export class DisplayCoordinator {
|
|
|
261
265
|
* even when its bytes are unchanged, because the base rows under it
|
|
262
266
|
* were just repainted. Replaces the old forceNext follow-up. */
|
|
263
267
|
private overlayRowsInvalidated = false;
|
|
264
|
-
|
|
265
268
|
private surfaces = new Map<SurfaceId, DisplaySurface>();
|
|
266
269
|
private focusNodes = new Map<SurfaceId, FocusNode>();
|
|
267
270
|
private keyBindings = new Map<string, DisplayKeyBinding>();
|
|
@@ -288,6 +291,7 @@ export class DisplayCoordinator {
|
|
|
288
291
|
private dirty = new Set<SurfaceId | 'all' | 'status' | 'dock'>();
|
|
289
292
|
private forceNext = false;
|
|
290
293
|
private scheduled: Timer | null = null;
|
|
294
|
+
private scheduleGeneration = 0;
|
|
291
295
|
// P2.2.b — cursor state. Last-writer-wins. cursorVersion bumps on
|
|
292
296
|
// every setCursor; lastEmittedCursorVersion tracks what's been
|
|
293
297
|
// written so flushCursor only emits on change.
|
|
@@ -966,6 +970,36 @@ export class DisplayCoordinator {
|
|
|
966
970
|
}, 'dashboard');
|
|
967
971
|
}
|
|
968
972
|
|
|
973
|
+
/** Mark a render dirty and flush it before returning. Used when a host
|
|
974
|
+
* already owns a synchronized output batch around the render. */
|
|
975
|
+
requestRenderNow(opts?: { region?: SurfaceId | 'all'; force?: boolean }): void {
|
|
976
|
+
this.markDirty(opts?.region ?? 'all');
|
|
977
|
+
if (opts?.force) this.forceNext = true;
|
|
978
|
+
this.scheduleGeneration += 1;
|
|
979
|
+
this.scheduled = null;
|
|
980
|
+
this.flush();
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
/** Run synchronous terminal writes inside DECSET 2026 when enabled.
|
|
984
|
+
* Coordinator flushes, the dashboard draw seam, and host paint batches
|
|
985
|
+
* share the same re-entrant region instead of emitting nested markers. */
|
|
986
|
+
withSynchronizedOutput<T>(paint: () => T): T {
|
|
987
|
+
const syncRegion = openSynchronizedOutputRegion();
|
|
988
|
+
const syncOutput = syncRegion.outermost && this.syncOutputEnabled;
|
|
989
|
+
try {
|
|
990
|
+
if (syncOutput) {
|
|
991
|
+
this.writeOverlay?.('\x1b[?2026h');
|
|
992
|
+
}
|
|
993
|
+
return paint();
|
|
994
|
+
} finally {
|
|
995
|
+
try {
|
|
996
|
+
if (syncOutput) this.writeOverlay?.('\x1b[?2026l');
|
|
997
|
+
} finally {
|
|
998
|
+
syncRegion.close();
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
|
|
969
1003
|
handle(owner: SurfaceOwner): DisplayHandle {
|
|
970
1004
|
return {
|
|
971
1005
|
owner,
|
|
@@ -2629,10 +2663,16 @@ export class DisplayCoordinator {
|
|
|
2629
2663
|
|
|
2630
2664
|
private requestFrame(): void {
|
|
2631
2665
|
if (this.scheduled !== null) return;
|
|
2632
|
-
|
|
2666
|
+
const generation = ++this.scheduleGeneration;
|
|
2667
|
+
const marker = {} as Timer;
|
|
2668
|
+
let scheduled: Timer | undefined;
|
|
2669
|
+
this.scheduled = marker;
|
|
2670
|
+
scheduled = this.scheduleFn(() => {
|
|
2671
|
+
if (generation !== this.scheduleGeneration || (this.scheduled !== marker && this.scheduled !== scheduled)) return;
|
|
2633
2672
|
this.scheduled = null;
|
|
2634
2673
|
this.flush();
|
|
2635
2674
|
}, this.frameMs);
|
|
2675
|
+
if (this.scheduled === marker) this.scheduled = scheduled;
|
|
2636
2676
|
}
|
|
2637
2677
|
|
|
2638
2678
|
private flush(): void {
|
|
@@ -2661,9 +2701,7 @@ export class DisplayCoordinator {
|
|
|
2661
2701
|
// `ELANOUS_SYNC_OUTPUT=off` for buggy terminals (none observed in
|
|
2662
2702
|
// practice, 2026-04-21). Pattern matches Textual (synchronized
|
|
2663
2703
|
// output since v0.47) + Ratatui backend buffer-swap semantics.
|
|
2664
|
-
|
|
2665
|
-
if (syncOutput) this.writeOverlay?.('\x1b[?2026h');
|
|
2666
|
-
try {
|
|
2704
|
+
this.withSynchronizedOutput(() => {
|
|
2667
2705
|
// H1.6 · W2 shadow flush. Fires rc.on('before-flush') +
|
|
2668
2706
|
// rc.on('after-flush') synchronously. Subscriber paints (if any
|
|
2669
2707
|
// are wired in Phase γ) land INSIDE the DECSET 2026 atomic-frame
|
|
@@ -2696,11 +2734,7 @@ export class DisplayCoordinator {
|
|
|
2696
2734
|
// so the prior cursor position may have been overwritten. Always
|
|
2697
2735
|
// re-assert. The bypass-batch path calls flushCursor(false).
|
|
2698
2736
|
this.flushCursor(true);
|
|
2699
|
-
}
|
|
2700
|
-
// Always close the sync block — a throw inside render hooks
|
|
2701
|
-
// must not leave the terminal stuck in "buffering" mode.
|
|
2702
|
-
if (syncOutput) this.writeOverlay?.('\x1b[?2026l');
|
|
2703
|
-
}
|
|
2737
|
+
});
|
|
2704
2738
|
this.eventBus?.emit({ type: 'render:after', request, snapshot });
|
|
2705
2739
|
this.pendingWidgetPatches = [];
|
|
2706
2740
|
this.pendingLogLines = [];
|
|
@@ -2713,8 +2747,7 @@ export class DisplayCoordinator {
|
|
|
2713
2747
|
* not a TTY (unit-test + CI environment) so overlay assertions
|
|
2714
2748
|
* don't have to strip the ?2026h / ?2026l pair. */
|
|
2715
2749
|
private get syncOutputEnabled(): boolean {
|
|
2716
|
-
|
|
2717
|
-
if (v === 'off' || v === '0' || v === 'false') return false;
|
|
2750
|
+
if (synchronizedOutputDisabledByEnv()) return false;
|
|
2718
2751
|
// Non-TTY environments (tests, piped output) gain nothing from
|
|
2719
2752
|
// atomic frame wrapping and the sequences would pollute assertions.
|
|
2720
2753
|
if (typeof process !== 'undefined' && process.stdout && process.stdout.isTTY !== true) {
|
|
@@ -5,10 +5,9 @@
|
|
|
5
5
|
// resize produced a stale paint (old input prompt row + ghost tab
|
|
6
6
|
// bar) until the next keystroke triggered a redraw.
|
|
7
7
|
//
|
|
8
|
-
// Strategy:
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// transient paint error doesn't kill the listener.
|
|
8
|
+
// Strategy: debounce resize bursts for one frame (16ms), then paint the
|
|
9
|
+
// dashboard, prompt, and overlays synchronously inside one atomic output
|
|
10
|
+
// block. Transient paint errors do not kill the listener.
|
|
12
11
|
//
|
|
13
12
|
// (3) TUI-PICKER-RESIZE-SHRINK (#76 · 2026-10-17) — then ask the
|
|
14
13
|
// coordinator for one FORCED frame. Steps (1)+(2) bypass the
|
|
@@ -28,6 +27,8 @@
|
|
|
28
27
|
|
|
29
28
|
import { debug } from '../debug/log.js';
|
|
30
29
|
|
|
30
|
+
const RESIZE_DEBOUNCE_MS = 16;
|
|
31
|
+
|
|
31
32
|
export interface ResizeListenerDeps {
|
|
32
33
|
draw: (opts?: { force?: boolean }) => void;
|
|
33
34
|
promptCtl: { repaint: () => void };
|
|
@@ -35,6 +36,9 @@ export interface ResizeListenerDeps {
|
|
|
35
36
|
* re-emitted on top of the chrome the prompt repaint just wrote.
|
|
36
37
|
* Optional: hosts without a coordinator keep the legacy two-step. */
|
|
37
38
|
requestOverlayFrame?: () => void;
|
|
39
|
+
/** Run the whole resize repaint batch inside the host's atomic output
|
|
40
|
+
* block. Nested coordinator frames must share this outer block. */
|
|
41
|
+
withSynchronizedOutput?: (paint: () => void) => void;
|
|
38
42
|
}
|
|
39
43
|
|
|
40
44
|
/** Registers the resize listener and returns a dispose fn that
|
|
@@ -42,26 +46,43 @@ export interface ResizeListenerDeps {
|
|
|
42
46
|
* fresh listener; the caller is responsible for disposing previous
|
|
43
47
|
* installations. */
|
|
44
48
|
export function installResizeListener(deps: ResizeListenerDeps): () => void {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
49
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
50
|
+
let disposed = false;
|
|
51
|
+
const repaint = (): void => {
|
|
52
|
+
timer = undefined;
|
|
53
|
+
if (disposed) return;
|
|
54
|
+
const paint = (): void => {
|
|
55
|
+
try { deps.draw({ force: true }); } catch { /* swallow — paint errors shouldn't break resize */ }
|
|
56
|
+
try { deps.promptCtl.repaint(); } catch { /* swallow */ }
|
|
57
|
+
let overlayFrame: 'requested' | 'absent' | 'failed' = 'absent';
|
|
58
|
+
if (deps.requestOverlayFrame) {
|
|
59
|
+
try {
|
|
60
|
+
deps.requestOverlayFrame();
|
|
61
|
+
overlayFrame = 'requested';
|
|
62
|
+
} catch {
|
|
63
|
+
overlayFrame = 'failed';
|
|
64
|
+
}
|
|
55
65
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
66
|
+
debug.log('display.resize', 'repaint', {
|
|
67
|
+
cols: process.stdout.columns ?? null,
|
|
68
|
+
rows: process.stdout.rows ?? null,
|
|
69
|
+
overlayFrame,
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
try {
|
|
73
|
+
if (deps.withSynchronizedOutput) deps.withSynchronizedOutput(paint);
|
|
74
|
+
else paint();
|
|
75
|
+
} catch { /* resize painting must not detach the listener */ }
|
|
76
|
+
};
|
|
77
|
+
const handler = (): void => {
|
|
78
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
79
|
+
timer = setTimeout(repaint, RESIZE_DEBOUNCE_MS);
|
|
62
80
|
};
|
|
63
81
|
process.stdout.on('resize', handler);
|
|
64
82
|
return (): void => {
|
|
83
|
+
disposed = true;
|
|
84
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
85
|
+
timer = undefined;
|
|
65
86
|
process.stdout.removeListener('resize', handler);
|
|
66
87
|
};
|
|
67
88
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DECSET 2026 (synchronized output) region registry.
|
|
3
|
+
*
|
|
4
|
+
* Two owners wrap their writes in `CSI ? 2026 h` … `CSI ? 2026 l`: the
|
|
5
|
+
* display coordinator (`flush()`) and the dashboard draw seam
|
|
6
|
+
* (`src/dashboard/synchronized-frame-output.ts`). They nest — the
|
|
7
|
+
* coordinator opens a region and its `onRender` hook runs `drawNow()`,
|
|
8
|
+
* which wants the same wrap for the frame + prompt repaint. A second pair
|
|
9
|
+
* emitted inside the outer one is not harmless: the inner ESU flushes the
|
|
10
|
+
* terminal early, so everything the coordinator writes afterwards (modal
|
|
11
|
+
* overlay, cursor) lands in a separate presentation — exactly the flicker
|
|
12
|
+
* the wrap exists to prevent.
|
|
13
|
+
*
|
|
14
|
+
* The registry makes the wrap re-entrant: whoever opens first owns the
|
|
15
|
+
* byte pair; nested openers contribute no bytes and never close the outer
|
|
16
|
+
* region. Every opener must close its handle (idempotent) so the depth
|
|
17
|
+
* stays balanced even when a draw throws.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
export const SYNCHRONIZED_OUTPUT_BEGIN = '\x1b[?2026h';
|
|
21
|
+
export const SYNCHRONIZED_OUTPUT_END = '\x1b[?2026l';
|
|
22
|
+
|
|
23
|
+
export interface SynchronizedOutputRegion {
|
|
24
|
+
/** true when this region owns the emitted BSU/ESU pair. */
|
|
25
|
+
readonly outermost: boolean;
|
|
26
|
+
/** Idempotent — closes this region exactly once. */
|
|
27
|
+
close(): void;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let openDepth = 0;
|
|
31
|
+
|
|
32
|
+
/** True while any owner holds a synchronized-output region open. */
|
|
33
|
+
export function isSynchronizedOutputRegionOpen(): boolean {
|
|
34
|
+
return openDepth > 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* `ELANOUS_SYNC_OUTPUT=off|0|false` escape hatch for terminals that
|
|
39
|
+
* mishandle DEC 2026. Anything else (including unset) keeps the wrap on.
|
|
40
|
+
*/
|
|
41
|
+
export function synchronizedOutputDisabledByEnv(
|
|
42
|
+
env: Record<string, string | undefined> = process.env,
|
|
43
|
+
): boolean {
|
|
44
|
+
const value = (env.ELANOUS_SYNC_OUTPUT ?? 'on').toLowerCase();
|
|
45
|
+
return value === 'off' || value === '0' || value === 'false';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function openSynchronizedOutputRegion(): SynchronizedOutputRegion {
|
|
49
|
+
const outermost = openDepth === 0;
|
|
50
|
+
openDepth += 1;
|
|
51
|
+
let closed = false;
|
|
52
|
+
return {
|
|
53
|
+
outermost,
|
|
54
|
+
close(): void {
|
|
55
|
+
if (closed) return;
|
|
56
|
+
closed = true;
|
|
57
|
+
if (openDepth > 0) openDepth -= 1;
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
@@ -172,10 +172,58 @@ export function recordInboundTurn(
|
|
|
172
172
|
finally { if (ownDb) db.close(); }
|
|
173
173
|
}
|
|
174
174
|
|
|
175
|
+
/** 발화 «원천» — 사람이 말한 것과 시험 fixture·외부 CLI agent 가 던진 것을 계측상 구분한다.
|
|
176
|
+
* ⛔ 원천 표기가 없는 0건을 «사람 표본 0» 으로 오인하면 안 되고, 반대로 시험 fixture 가
|
|
177
|
+
* 사람과 같은 서피스(cli·telegram)에 기록됐다는 이유로 사람 표본으로 세어도 안 된다. */
|
|
178
|
+
export type SurfaceUtteranceOrigin = 'human' | 'test-fixture' | 'external-cli-agent' | 'elanous-self' | 'unknown';
|
|
179
|
+
|
|
180
|
+
const TEST_FIXTURE_ORIGIN = /^(?:test-fixture|test_fixture|fixture|test|test-runner|bun-test)$/i;
|
|
181
|
+
const HUMAN_ORIGIN = /^(?:human|user|tui|pwa|telegram|discord|cli)$/i;
|
|
182
|
+
const EXTERNAL_CLI_AGENT_ORIGIN = /^(?:claude-code|codex|gemini|agent|external|external-cli-agent|external:[\w-]+|ext:[\w-]+)$/i;
|
|
183
|
+
const HUMAN_PROSE_SURFACE = /^(?:cli|tui|pwa|telegram|discord|ipad|watch)$/i;
|
|
184
|
+
|
|
185
|
+
function refsOf(raw: string | null): Record<string, unknown> {
|
|
186
|
+
if (!raw) return {};
|
|
187
|
+
try {
|
|
188
|
+
const value: unknown = JSON.parse(raw);
|
|
189
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {};
|
|
190
|
+
} catch { return {}; }
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/** 원천 분류기 — provenance(recordInboundTurn opts.origin → refs.origin/tags.origin:<origin>)
|
|
194
|
+
* 표기를 먼저 읽고, 표기가 없을 때만 서피스로 추정한다. 시험 fixture 는 서피스 추정 «전에» 가른다. */
|
|
195
|
+
export function classifySurfaceUtteranceOrigin(
|
|
196
|
+
row: Pick<SurfaceEventRow, 'direction' | 'surface' | 'kind' | 'refs' | 'tags'>,
|
|
197
|
+
): SurfaceUtteranceOrigin {
|
|
198
|
+
if (row.direction !== 'inbound') return 'unknown';
|
|
199
|
+
const refs = refsOf(row.refs);
|
|
200
|
+
const explicit = typeof refs.origin === 'string' ? refs.origin : undefined;
|
|
201
|
+
const utteranceOrigin = typeof refs.utteranceOrigin === 'string' ? refs.utteranceOrigin : undefined;
|
|
202
|
+
const fixtureTagged = (row.tags ?? '').split(/\s+/).filter(Boolean)
|
|
203
|
+
.some((tag) => TEST_FIXTURE_ORIGIN.test(tag.split(':').pop() ?? ''));
|
|
204
|
+
if ((utteranceOrigin && TEST_FIXTURE_ORIGIN.test(utteranceOrigin)) || (explicit && TEST_FIXTURE_ORIGIN.test(explicit)) || fixtureTagged) {
|
|
205
|
+
return 'test-fixture';
|
|
206
|
+
}
|
|
207
|
+
if (utteranceOrigin === 'human') return 'human';
|
|
208
|
+
if (utteranceOrigin === 'agent') return 'external-cli-agent';
|
|
209
|
+
if (explicit) {
|
|
210
|
+
if (HUMAN_ORIGIN.test(explicit)) return 'human';
|
|
211
|
+
if (EXTERNAL_CLI_AGENT_ORIGIN.test(explicit)) return 'external-cli-agent';
|
|
212
|
+
}
|
|
213
|
+
// recordInboundTurn marks its recorder as elanous-self; on chat Q&A the speaker is the human.
|
|
214
|
+
if (row.kind === 'qna' && /^(?:telegram|discord)$/i.test(row.surface)) return 'human';
|
|
215
|
+
if (explicit === 'elanous-self') return 'elanous-self';
|
|
216
|
+
if (/^ext:/i.test(row.surface)) return 'external-cli-agent';
|
|
217
|
+
if (HUMAN_PROSE_SURFACE.test(row.surface)) return 'human';
|
|
218
|
+
return 'unknown';
|
|
219
|
+
}
|
|
220
|
+
|
|
175
221
|
export interface SurfaceUtteranceQuery {
|
|
176
222
|
from: string;
|
|
177
223
|
to: string;
|
|
178
224
|
surface?: string;
|
|
225
|
+
/** 원천 필터(선택) — 미지정이면 종전과 같이 창 안의 모든 발화를 읽는다(보존 계약). */
|
|
226
|
+
origin?: SurfaceUtteranceOrigin | readonly SurfaceUtteranceOrigin[];
|
|
179
227
|
}
|
|
180
228
|
|
|
181
229
|
/** Read every event in a half-open UTC interval without touching recall state. */
|
|
@@ -183,9 +231,40 @@ export function querySurfaceUtterances(db: Database, opts: SurfaceUtteranceQuery
|
|
|
183
231
|
const where = ["julianday(e.ts) >= julianday(?)", "julianday(e.ts) < julianday(?)", "e.direction = 'inbound'", "e.kind IN ('utterance', 'qna')"];
|
|
184
232
|
const params: string[] = [opts.from, opts.to];
|
|
185
233
|
if (opts.surface) { where.push('e.surface = ?'); params.push(opts.surface); }
|
|
186
|
-
|
|
234
|
+
const rows = db.prepare(
|
|
187
235
|
`SELECT e.* FROM events e WHERE ${where.join(' AND ')} ORDER BY julianday(e.ts) ASC, e.id ASC`,
|
|
188
236
|
).all(...params) as SurfaceEventRow[];
|
|
237
|
+
if (opts.origin === undefined) return rows;
|
|
238
|
+
const wanted = new Set<SurfaceUtteranceOrigin>(typeof opts.origin === 'string' ? [opts.origin] : opts.origin);
|
|
239
|
+
return rows.filter((row) => wanted.has(classifySurfaceUtteranceOrigin(row)));
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** 원천별 발화 수 — «사람 원천 0» 을 사람 표본으로 읽지 않게 하는 계측 입구(read-only·recall 무접촉). */
|
|
243
|
+
export interface SurfaceUtteranceOriginCounts {
|
|
244
|
+
human: number;
|
|
245
|
+
testFixture: number;
|
|
246
|
+
externalCliAgent: number;
|
|
247
|
+
elanousSelf: number;
|
|
248
|
+
unknown: number;
|
|
249
|
+
total: number;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export function countSurfaceUtterancesByOrigin(
|
|
253
|
+
db: Database,
|
|
254
|
+
opts: Omit<SurfaceUtteranceQuery, 'origin'>,
|
|
255
|
+
): SurfaceUtteranceOriginCounts {
|
|
256
|
+
const counts: SurfaceUtteranceOriginCounts = { human: 0, testFixture: 0, externalCliAgent: 0, elanousSelf: 0, unknown: 0, total: 0 };
|
|
257
|
+
for (const row of querySurfaceUtterances(db, opts)) {
|
|
258
|
+
counts.total += 1;
|
|
259
|
+
switch (classifySurfaceUtteranceOrigin(row)) {
|
|
260
|
+
case 'human': counts.human += 1; break;
|
|
261
|
+
case 'test-fixture': counts.testFixture += 1; break;
|
|
262
|
+
case 'external-cli-agent': counts.externalCliAgent += 1; break;
|
|
263
|
+
case 'elanous-self': counts.elanousSelf += 1; break;
|
|
264
|
+
default: counts.unknown += 1;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return counts;
|
|
189
268
|
}
|
|
190
269
|
|
|
191
270
|
export interface QueryEventsOpts {
|
|
@@ -10,6 +10,41 @@ import { debug } from '../debug/log.js';
|
|
|
10
10
|
import { peerEditRunGate } from '../nexus/api/graph-peer-edit.js';
|
|
11
11
|
import { OUTPUT_KINDS, pickDefaultOutput, type OutputKind } from './default-outputs.js';
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* 코드포인트 순서 비교 — `localeCompare` 는 «실행 로케일의 ICU 콜레이션» 을 쓰므로 같은 문자열 쌍의 대소가
|
|
15
|
+
* 플랫폼/로케일마다 뒤집힌다(실측: '🎉party' vs '2026-10-23', 'alpha' vs 'Zebra' 는 콜레이션과 코드포인트가 반대).
|
|
16
|
+
* 순서가 실행 환경에 따라 달라지면 «가장 새 것» 선택이 재현 불가능해진다 — 그래서 코드포인트로 고정한다.
|
|
17
|
+
*/
|
|
18
|
+
export function compareCodePoints(a: string, b: string): number {
|
|
19
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** 숫자 구간의 선행 0 을 지운다(01 == 1). */
|
|
23
|
+
const stripLeadingZeros = (digits: string): string => digits.replace(/^0+(?=\d)/, '');
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 버전 문자열 비교 — 숫자 구간만 «수치» 로, 나머지는 «코드포인트» 로 비교한다.
|
|
27
|
+
* `localeCompare(..., { numeric: true })` 의 수치 규칙은 그대로 두고 콜레이션 의존만 걷어낸 등가물이다.
|
|
28
|
+
*/
|
|
29
|
+
export function compareVersionish(a: string, b: string): number {
|
|
30
|
+
const chunks = (value: string): string[] => value.match(/\d+|\D+/g) ?? [];
|
|
31
|
+
const left = chunks(a);
|
|
32
|
+
const right = chunks(b);
|
|
33
|
+
for (let index = 0; index < Math.min(left.length, right.length); index += 1) {
|
|
34
|
+
const [x, y] = [left[index]!, right[index]!];
|
|
35
|
+
if (/^\d/.test(x) && /^\d/.test(y)) {
|
|
36
|
+
const [dx, dy] = [stripLeadingZeros(x), stripLeadingZeros(y)];
|
|
37
|
+
if (dx.length !== dy.length) return dx.length < dy.length ? -1 : 1;
|
|
38
|
+
const digits = compareCodePoints(dx, dy);
|
|
39
|
+
if (digits !== 0) return digits;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const text = compareCodePoints(x, y);
|
|
43
|
+
if (text !== 0) return text;
|
|
44
|
+
}
|
|
45
|
+
return left.length === right.length ? 0 : left.length < right.length ? -1 : 1;
|
|
46
|
+
}
|
|
47
|
+
|
|
13
48
|
export interface InstalledGraph {
|
|
14
49
|
id: string;
|
|
15
50
|
title: string;
|
|
@@ -43,7 +78,7 @@ export function installedPluginGraphs(pluginsRoot = join(elanousStateRoot(), 'pl
|
|
|
43
78
|
};
|
|
44
79
|
for (const market of dirs(pluginsRoot)) {
|
|
45
80
|
for (const name of dirs(join(pluginsRoot, market))) {
|
|
46
|
-
const versions = dirs(join(pluginsRoot, market, name)).sort((a, b) => b
|
|
81
|
+
const versions = dirs(join(pluginsRoot, market, name)).sort((a, b) => compareVersionish(b, a));
|
|
47
82
|
const version = versions[0];
|
|
48
83
|
if (!version) continue;
|
|
49
84
|
const root = join(pluginsRoot, market, name, version);
|
|
@@ -146,7 +181,7 @@ export function latestFieldFolder(configRoot = getElanousConfigDir()): string |
|
|
|
146
181
|
const photos = readdirSync(path, { withFileTypes: true }).filter(file => file.isFile() && /\.(?:png|jpe?g|webp|heic)$/i.test(file.name));
|
|
147
182
|
for (const photo of photos) {
|
|
148
183
|
const time = statSync(join(path, photo.name)).mtimeMs;
|
|
149
|
-
if (!latest || time > latest.time || (time === latest.time && path
|
|
184
|
+
if (!latest || time > latest.time || (time === latest.time && compareCodePoints(path, latest.path) > 0)) latest = { path, time };
|
|
150
185
|
}
|
|
151
186
|
} catch { /* Unreadable event does not supply photos. */ }
|
|
152
187
|
}
|
|
@@ -88,8 +88,6 @@ export function activeRunsForGoal(goalId: string, deps: ActiveRunsForGoalDeps =
|
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
const LAUNCH_BUDGET_PROVIDER: Readonly<Record<string, string>> = { 'codex-rotate': CODEX_PROVIDER, grok: GROK_PROVIDER };
|
|
92
|
-
|
|
93
91
|
/**
|
|
94
92
|
* L6 발사 관문의 예산 입력 보정 — 발사 우주의 config 에 체인이 없으면(작업 트리 = 시험 우주) 막지 않고
|
|
95
93
|
* 코드 기본 체인으로 판단한다. `--child-llm-provider` 를 명시했으면 그것이 체인이다(예산 판정 밖 provider 는 통과).
|
|
@@ -98,6 +96,9 @@ export function harnessLaunchBudgetDecision(
|
|
|
98
96
|
inputs: BudgetInputs,
|
|
99
97
|
opts: { readonly childLlmProvider?: string; readonly childLlmModel?: string } = {},
|
|
100
98
|
): { readonly decision: BudgetDecision; readonly warning?: string; readonly unmeasuredProvider?: string } {
|
|
99
|
+
// Resolve imported provider constants only when the launch gate is called.
|
|
100
|
+
// This module participates in the CLI/tool catalog import cycle.
|
|
101
|
+
const launchBudgetProvider: Readonly<Record<string, string>> = { 'codex-rotate': CODEX_PROVIDER, grok: GROK_PROVIDER };
|
|
101
102
|
const explicit = opts.childLlmProvider?.trim();
|
|
102
103
|
const judged = (selected: BudgetInputs) => {
|
|
103
104
|
const { decision, unmeasuredProvider } = decideLaunchBudget(selected);
|
|
@@ -114,7 +115,7 @@ export function harnessLaunchBudgetDecision(
|
|
|
114
115
|
return judged({ ...inputs, preference: { ...inputs.preference, chain } });
|
|
115
116
|
}
|
|
116
117
|
if (inputs.preference.chain.length > 0) return judged(inputs);
|
|
117
|
-
const chain = DEFAULT_FALLBACK_CHAIN.map((step) => ({ provider:
|
|
118
|
+
const chain = DEFAULT_FALLBACK_CHAIN.map((step) => ({ provider: launchBudgetProvider[step] ?? step }));
|
|
118
119
|
const result = judged({ ...inputs, preference: { ...inputs.preference, chain } });
|
|
119
120
|
return {
|
|
120
121
|
...result,
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { debug } from '../debug/log.js';
|
|
2
|
+
|
|
3
|
+
export type CliStderrRecord = {
|
|
4
|
+
readonly source: 'git' | 'gh';
|
|
5
|
+
readonly exitCode: number;
|
|
6
|
+
readonly raw: Buffer;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export type CliStderrSink = (record: CliStderrRecord) => void;
|
|
10
|
+
|
|
11
|
+
let activeSink: CliStderrSink | null = null;
|
|
12
|
+
|
|
13
|
+
export function hasCliStderrSink(): boolean {
|
|
14
|
+
return activeSink !== null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Install a surface-specific sink; without one, CLI stderr keeps its process contract. */
|
|
18
|
+
export function setCliStderrSink(sink: CliStderrSink | null): () => void {
|
|
19
|
+
const previous = activeSink;
|
|
20
|
+
activeSink = sink;
|
|
21
|
+
return () => {
|
|
22
|
+
if (activeSink === sink) activeSink = previous;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Preserve raw bytes for the caller and keep ordinary CLI invocations on process.stderr. */
|
|
27
|
+
export function writeCliStderr(record: CliStderrRecord): void {
|
|
28
|
+
const sink = activeSink;
|
|
29
|
+
if (!sink) {
|
|
30
|
+
process.stderr.write(record.raw);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// A failed screen redraw must not fall through to the physical TTY and overwrite its prompt.
|
|
34
|
+
try { sink(record); } catch (error) {
|
|
35
|
+
// Keep the prompt isolated, but leave a forensic breadcrumb for a failed presentation path.
|
|
36
|
+
try {
|
|
37
|
+
debug.log('tui.cli-stderr', 'sink-failed', {
|
|
38
|
+
source: record.source,
|
|
39
|
+
exitCode: record.exitCode,
|
|
40
|
+
byteLength: record.raw.length,
|
|
41
|
+
errorName: error instanceof Error ? error.name : typeof error,
|
|
42
|
+
});
|
|
43
|
+
} catch { /* never fall through to the physical TTY */ }
|
|
44
|
+
}
|
|
45
|
+
}
|
package/src/git-fs/gh-cli.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { spawn, spawnSync } from 'node:child_process';
|
|
2
2
|
import { debug } from '../debug/log.js';
|
|
3
|
+
import { writeCliStderr } from './cli-stderr.js';
|
|
3
4
|
|
|
4
5
|
const LF = 0x0a;
|
|
5
6
|
const MAX_GH_RETRY_ATTEMPTS = 3;
|
|
@@ -195,14 +196,16 @@ export function runGhCli(args: string[]): void {
|
|
|
195
196
|
const auxiliaryFailure = exitCode === 0 ? undefined : auxiliaryFailureSignature(stderr);
|
|
196
197
|
|
|
197
198
|
if (stdout.length) process.stdout.write(stdout);
|
|
198
|
-
|
|
199
|
+
const stderrChunks: Buffer[] = [];
|
|
200
|
+
if (stderr.length) stderrChunks.push(stderr);
|
|
199
201
|
// ⛔⭐⭐⭐⭐⭐ **상태 줄은 `stderr` 로** — `git-cli.ts` 의 같은 주석이 canonical.
|
|
200
202
|
// `--json` 산출 뒤에 비-JSON 한 줄이 붙으면 ***모든 JSON 소비자가 죽는다***(`jq: parse error` 실측).
|
|
201
203
|
// stdout 은 ***원 바이트 그대로만*** 나간다.
|
|
202
204
|
const endsWithoutLf = (buffer: Buffer): boolean => buffer.length > 0 && buffer[buffer.length - 1] !== LF;
|
|
203
|
-
if (endsWithoutLf(stderr))
|
|
205
|
+
if (endsWithoutLf(stderr)) stderrChunks.push(Buffer.from('\n'));
|
|
204
206
|
|
|
205
|
-
|
|
207
|
+
stderrChunks.push(Buffer.from(`${statusLine(label, result, auxiliaryFailure)}\n`));
|
|
208
|
+
writeCliStderr({ source: 'gh', exitCode, raw: Buffer.concat(stderrChunks) });
|
|
206
209
|
process.exitCode = exitCode;
|
|
207
210
|
if (auxiliaryFailure) {
|
|
208
211
|
debug.log('gh.cli', 'partial-outcome', {
|
package/src/git-fs/git-cli.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { spawnSync } from 'node:child_process';
|
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { debug } from '../debug/log.js';
|
|
5
|
+
import { hasCliStderrSink, writeCliStderr } from './cli-stderr.js';
|
|
5
6
|
import { runGitWithRetry, type GitRunner } from './retry.js';
|
|
6
7
|
|
|
7
8
|
const LF = 0x0a;
|
|
@@ -134,7 +135,11 @@ export function runGitCli(args: string[]): void {
|
|
|
134
135
|
// ⛔ 실행 «전» 스냅샷 — 이 명령이 마커를 남길 수 있는 종류일 때만 잰다(무관한 명령엔 비용 0).
|
|
135
136
|
const probesForRun = SUBCOMMAND_PROBES[subcommand];
|
|
136
137
|
const probesBefore = probesForRun ? probeSnapshot(args, probesForRun, process.env) : undefined;
|
|
137
|
-
|
|
138
|
+
const stderrChunks: Buffer[] = [];
|
|
139
|
+
if (HELP_ARGUMENTS.has(args[0] ?? '')) {
|
|
140
|
+
if (hasCliStderrSink()) stderrChunks.push(Buffer.from(HELP_GUIDANCE));
|
|
141
|
+
else process.stderr.write(HELP_GUIDANCE);
|
|
142
|
+
}
|
|
138
143
|
let attempts = 0;
|
|
139
144
|
let rawStdout: Buffer = Buffer.alloc(0);
|
|
140
145
|
let rawStderr: Buffer = Buffer.alloc(0);
|
|
@@ -154,7 +159,7 @@ export function runGitCli(args: string[]): void {
|
|
|
154
159
|
const result = runGitWithRetry(args, runner);
|
|
155
160
|
|
|
156
161
|
if (rawStdout.length) process.stdout.write(rawStdout);
|
|
157
|
-
if (rawStderr.length)
|
|
162
|
+
if (rawStderr.length) stderrChunks.push(rawStderr);
|
|
158
163
|
|
|
159
164
|
// ⛔⭐⭐⭐⭐⭐ **상태 줄은 `stderr` 로 나간다** — 2026-08-09 정정(라이브에서 «둘이» 밟았다).
|
|
160
165
|
// 초판은 stdout 에 썼다. 그러면 ***산출을 값으로 쓰는 모든 소비자가 깨진다***:
|
|
@@ -166,7 +171,7 @@ export function runGitCli(args: string[]): void {
|
|
|
166
171
|
// `git`·`gh` 자신의 오류도 똑같이 사라지므로 일관된다.
|
|
167
172
|
// ⇒ 📌 stdout 은 이제 ***원 바이트 그대로만*** 나간다(separator 도 안 붙인다).
|
|
168
173
|
const endsWithoutLf = (buf: Buffer): boolean => buf.length > 0 && buf[buf.length - 1] !== LF;
|
|
169
|
-
if (endsWithoutLf(rawStderr))
|
|
174
|
+
if (endsWithoutLf(rawStderr)) stderrChunks.push(Buffer.from('\n'));
|
|
170
175
|
|
|
171
176
|
const exitCode = result.status ?? 1;
|
|
172
177
|
const leftKind = exitCode !== 0 && probesForRun
|
|
@@ -176,11 +181,12 @@ export function runGitCli(args: string[]): void {
|
|
|
176
181
|
const leftReason = leftKind
|
|
177
182
|
? `${leftKind}-${hasUnmergedPaths(args, process.env) ? 'conflict' : 'in-progress'}`
|
|
178
183
|
: undefined;
|
|
179
|
-
|
|
184
|
+
stderrChunks.push(Buffer.from(
|
|
180
185
|
`[git] ${subcommand} ${exitCode === 0 ? 'ok' : 'FAILED'} rc=${exitCode}`
|
|
181
186
|
+ (leftReason ? ` worktree-changed=yes reason=${leftReason}` : '')
|
|
182
187
|
+ '\n',
|
|
183
|
-
);
|
|
188
|
+
));
|
|
189
|
+
writeCliStderr({ source: 'git', exitCode, raw: Buffer.concat(stderrChunks) });
|
|
184
190
|
process.exitCode = exitCode;
|
|
185
191
|
debug.log('git.cli', 'completed', {
|
|
186
192
|
subcommand,
|