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
package/src/tui/slash/resume.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// n8n restart «/resume» started an investigation instead of showing the sessions to pick from.
|
|
4
4
|
import { debug } from '../../debug/log.js';
|
|
5
5
|
import { listSessions, resolveSessionId, setActiveSessionId, type SessionMeta } from '../../session/index.js';
|
|
6
|
+
import { idPrefixCell, sessionIdPrefixes, sessionListTime } from '../../session/id-prefix.js';
|
|
6
7
|
|
|
7
8
|
export const RESUME_BUSY_STATUS = '응답 중에는 /resume 을 받지 않습니다 · 완료(또는 Esc 취소) 뒤 다시';
|
|
8
9
|
/** Rows shown by `/resume` · `/session list`. */
|
|
@@ -32,44 +33,66 @@ export function resumeCandidates(activeId: string | null, limit = RESUME_LIST_LI
|
|
|
32
33
|
return listSessions({ limit, hideEmpty: true, ...(activeId ? { keepIds: [activeId] } : {}) });
|
|
33
34
|
}
|
|
34
35
|
|
|
35
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* One numbered line per session: number · marker · unique id prefix · updated · turns · title.
|
|
38
|
+
* The number is what `/resume <n>` takes (next TUI has no arrow picker — the list is the picker);
|
|
39
|
+
* the prefix grows past 8 characters when another stored session shares them.
|
|
40
|
+
*/
|
|
36
41
|
export function resumeListLines(rows: readonly SessionMeta[], activeId: string | null): string[] {
|
|
37
42
|
if (rows.length === 0) return ['저장된 대화 없음'];
|
|
43
|
+
const prefixes = sessionIdPrefixes(rows.map((m) => m.id));
|
|
44
|
+
const numberWidth = String(rows.length).length;
|
|
38
45
|
return [
|
|
39
|
-
`최근 대화 ${rows.length}개 · /resume <id 앞자리> 로 이어 가기`,
|
|
40
|
-
...rows.map((m) => {
|
|
46
|
+
`최근 대화 ${rows.length}개 · /resume <번호> 또는 /resume <id 앞자리> 로 이어 가기`,
|
|
47
|
+
...rows.map((m, i) => {
|
|
41
48
|
const marker = m.id === activeId ? '▸' : ' ';
|
|
42
|
-
const when = m.updatedAt
|
|
49
|
+
const when = sessionListTime(m.updatedAt);
|
|
43
50
|
const title = (m.title || '(제목 없음)').split('\n')[0]!.slice(0, 48);
|
|
44
|
-
return `${marker} ${m.id
|
|
51
|
+
return `${String(i + 1).padStart(numberWidth)}. ${marker} ${idPrefixCell(prefixes, m.id)} ${when} ${String(m.messageCount).padStart(3)}t ${title}`;
|
|
45
52
|
}),
|
|
46
53
|
];
|
|
47
54
|
}
|
|
48
55
|
|
|
56
|
+
/** `/resume 3` → the 3rd row of the list the user saw. Only 1–3 digits within the list count as a number. */
|
|
57
|
+
export function resumeRowByNumber(arg: string, rows: readonly SessionMeta[]): SessionMeta | null {
|
|
58
|
+
if (!/^\d{1,3}$/.test(arg)) return null;
|
|
59
|
+
const n = Number(arg);
|
|
60
|
+
return n >= 1 && n <= rows.length ? rows[n - 1]! : null;
|
|
61
|
+
}
|
|
62
|
+
|
|
49
63
|
export type ResumeTuiSessionResult =
|
|
50
64
|
| { readonly kind: 'started'; readonly id: string; readonly status: string }
|
|
51
65
|
| { readonly kind: 'rejected'; readonly status: string };
|
|
52
66
|
|
|
53
67
|
/** Resolve the prefix and make that session active; rejects while a turn runs or when the prefix misses. */
|
|
54
|
-
export function requestResumeTuiSession(input: {
|
|
68
|
+
export function requestResumeTuiSession(input: {
|
|
69
|
+
readonly busy: boolean;
|
|
70
|
+
readonly from: string | null;
|
|
71
|
+
readonly prefix: string;
|
|
72
|
+
/** The rows the last `/resume` list showed, so `/resume <n>` picks the row the user saw. */
|
|
73
|
+
readonly rows?: readonly SessionMeta[];
|
|
74
|
+
}): ResumeTuiSessionResult {
|
|
55
75
|
const { busy, from, prefix } = input;
|
|
56
76
|
if (busy) {
|
|
57
77
|
debug.log('tui.next', 'session-resume-rejected', { from, prefix, reason: 'busy' });
|
|
58
78
|
return { kind: 'rejected', status: RESUME_BUSY_STATUS };
|
|
59
79
|
}
|
|
60
|
-
|
|
80
|
+
const byNumber = input.rows ? resumeRowByNumber(prefix, input.rows) : null;
|
|
81
|
+
let id: string | null = byNumber?.id ?? null;
|
|
61
82
|
try {
|
|
62
|
-
id = resolveSessionId(prefix);
|
|
83
|
+
if (!byNumber) id = resolveSessionId(prefix);
|
|
63
84
|
} catch (error) {
|
|
64
85
|
debug.log('tui.next', 'session-resume-rejected', { from, prefix, reason: 'ambiguous' });
|
|
65
86
|
return { kind: 'rejected', status: error instanceof Error ? error.message : String(error) };
|
|
66
87
|
}
|
|
67
88
|
if (!id) {
|
|
68
89
|
debug.log('tui.next', 'session-resume-rejected', { from, prefix, reason: 'not-found' });
|
|
69
|
-
return { kind: 'rejected', status: `"${prefix}"
|
|
90
|
+
return { kind: 'rejected', status: `"${prefix}" 번호·앞자리에 맞는 대화 없음 · /resume 으로 목록 보기` };
|
|
70
91
|
}
|
|
71
|
-
|
|
92
|
+
const shortId = sessionIdPrefixes([id]).get(id) ?? id;
|
|
93
|
+
if (id === from) return { kind: 'rejected', status: `이미 이 대화다 · ${shortId}` };
|
|
72
94
|
setActiveSessionId(id);
|
|
73
|
-
debug.log('tui.next', 'session-resume', { from, to: id });
|
|
74
|
-
|
|
95
|
+
debug.log('tui.next', 'session-resume', { from, to: id, by: byNumber ? 'number' : 'prefix' });
|
|
96
|
+
const shortFrom = from ? (sessionIdPrefixes([from]).get(from) ?? from) : '없음';
|
|
97
|
+
return { kind: 'started', id, status: `대화 이어 가기 · ${shortId} · 이전 = ${shortFrom}` };
|
|
75
98
|
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// TUI-SLASH-SIGNALS — Next TUI `/signals` 슬래시 묶음(관측 전용).
|
|
2
|
+
//
|
|
3
|
+
// classic 의 /signals 는 dashboard 전용 registry/runtime 에 살지만, 이 handler 는 Next TUI 가
|
|
4
|
+
// 직접 소유한다. src/input/control-signal-observer.ts 의 실제 defaultControlSignalObserver()
|
|
5
|
+
// 싱글턴에서 읽기 API(list·latest·countsByKind)만 소비한다 — observer mutation(clear·detach)과
|
|
6
|
+
// signal emission(버스 발행)은 명시적으로 범위 밖이며, dashboard/index.ts 는 import 하지 않는다.
|
|
7
|
+
|
|
8
|
+
import { defaultControlSignalObserver } from '../../input/control-signal-observer.js';
|
|
9
|
+
import type { ControlSignal } from '../../input/control-signal.js';
|
|
10
|
+
|
|
11
|
+
/** `/signals`가 ctx 에서 쓰는 것만(구조 타입 — NextTuiContext 가 이 계약을 만족한다). */
|
|
12
|
+
export interface SignalsSlashContext {
|
|
13
|
+
chatLines: string[];
|
|
14
|
+
setChatScrollOffset(value: number): void;
|
|
15
|
+
muted(text: string): string;
|
|
16
|
+
accent(text: string): string;
|
|
17
|
+
text(text: string): string;
|
|
18
|
+
error(text: string): string;
|
|
19
|
+
warning(text: string): string;
|
|
20
|
+
info(text: string): string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const SIGNALS_USAGE = 'usage: /signals [help|status|latest|list [kind]]';
|
|
24
|
+
|
|
25
|
+
function signalClock(createdAt: string): string {
|
|
26
|
+
return createdAt.slice(11, 19);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** 관측된 신호 한 줄 요약 — 관측 API가 보증하는 필드(kind·urgency·createdAt·scope.sessionId)만 읽는다. */
|
|
30
|
+
function signalSummary(signal: ControlSignal): string {
|
|
31
|
+
const sessionId = signal.scope?.sessionId;
|
|
32
|
+
return `[${signal.urgency}] ${signal.kind} · ${signalClock(signal.createdAt)}${sessionId ? ` · session ${sessionId}` : ''}`;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function signalsHelp(ctx: SignalsSlashContext): void {
|
|
36
|
+
ctx.chatLines.push(ctx.accent('❯ /signals help'));
|
|
37
|
+
ctx.chatLines.push(ctx.warning(` ${SIGNALS_USAGE}`));
|
|
38
|
+
ctx.chatLines.push(ctx.muted(' · status — 종류별 관측 신호 수 요약'));
|
|
39
|
+
ctx.chatLines.push(ctx.muted(' · latest — 최신 신호 1건'));
|
|
40
|
+
ctx.chatLines.push(ctx.muted(' · list [kind] — 신호 목록(선택 kind 필터)'));
|
|
41
|
+
ctx.chatLines.push(ctx.muted(' · clear·emit 은 관측 전용 경계상 이 명령 범위 밖입니다'));
|
|
42
|
+
ctx.setChatScrollOffset(-1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function signalsStatus(ctx: SignalsSlashContext): void {
|
|
46
|
+
ctx.chatLines.push(ctx.accent('❯ /signals status'));
|
|
47
|
+
const counts = defaultControlSignalObserver().countsByKind();
|
|
48
|
+
const kinds = Object.keys(counts).sort();
|
|
49
|
+
const total = kinds.reduce((sum, kind) => sum + (counts[kind] ?? 0), 0);
|
|
50
|
+
if (total === 0) {
|
|
51
|
+
ctx.chatLines.push(ctx.muted(' 관측된 신호 없음 (총 0건)'));
|
|
52
|
+
ctx.setChatScrollOffset(-1);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
ctx.chatLines.push(ctx.text(` 신호 총 ${total}건 · 종류 ${kinds.length}종`));
|
|
56
|
+
for (const kind of kinds) {
|
|
57
|
+
ctx.chatLines.push(ctx.muted(` · ${kind} ×${counts[kind] ?? 0}`));
|
|
58
|
+
}
|
|
59
|
+
ctx.setChatScrollOffset(-1);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function signalsLatest(ctx: SignalsSlashContext): void {
|
|
63
|
+
ctx.chatLines.push(ctx.accent('❯ /signals latest'));
|
|
64
|
+
const latest = defaultControlSignalObserver().latest();
|
|
65
|
+
if (!latest) {
|
|
66
|
+
ctx.chatLines.push(ctx.muted(' 최신 신호 없음 — 아직 관측된 control-signal 이 없습니다'));
|
|
67
|
+
} else {
|
|
68
|
+
ctx.chatLines.push(` ${ctx.info(signalSummary(latest))}`);
|
|
69
|
+
}
|
|
70
|
+
ctx.setChatScrollOffset(-1);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function signalsList(args: string[], ctx: SignalsSlashContext): void {
|
|
74
|
+
const kind = (args[1] ?? '').trim();
|
|
75
|
+
const signals = defaultControlSignalObserver().list(kind ? { kind } : undefined);
|
|
76
|
+
ctx.chatLines.push(ctx.accent(`❯ /signals list${kind ? ` ${kind}` : ''} (${signals.length}건)`));
|
|
77
|
+
if (signals.length === 0) {
|
|
78
|
+
ctx.chatLines.push(ctx.muted(' 관측된 신호 없음'));
|
|
79
|
+
}
|
|
80
|
+
for (const [index, signal] of signals.entries()) {
|
|
81
|
+
ctx.chatLines.push(` ${ctx.muted(`${index + 1}. ${signalSummary(signal)}`)}`);
|
|
82
|
+
}
|
|
83
|
+
ctx.setChatScrollOffset(-1);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** `/signals` 본체 — 관측 전용. help·status·latest·list 만 실행하고 clear·emit 은 거절한다. */
|
|
87
|
+
export async function handleSignalsSlash(args: string[], ctx: SignalsSlashContext): Promise<void> {
|
|
88
|
+
const sub = (args[0] ?? 'status').toLowerCase();
|
|
89
|
+
ctx.chatLines.push('');
|
|
90
|
+
if (sub === 'help') {
|
|
91
|
+
signalsHelp(ctx);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (sub === 'status') {
|
|
95
|
+
signalsStatus(ctx);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (sub === 'latest') {
|
|
99
|
+
signalsLatest(ctx);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (sub === 'list') {
|
|
103
|
+
signalsList(args, ctx);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
ctx.chatLines.push(ctx.accent(`❯ /signals ${sub}`));
|
|
107
|
+
if (sub === 'clear' || sub === 'emit') {
|
|
108
|
+
ctx.chatLines.push(ctx.error(` ✗ out of scope — /signals는 관측 전용입니다 (${sub} 미지원)`));
|
|
109
|
+
} else {
|
|
110
|
+
ctx.chatLines.push(ctx.warning(` unknown subcommand: ${sub}`));
|
|
111
|
+
}
|
|
112
|
+
ctx.chatLines.push(ctx.warning(` ${SIGNALS_USAGE}`));
|
|
113
|
+
ctx.setChatScrollOffset(-1);
|
|
114
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/** Read-only terminal view exposed to the Next TUI. Tests can inject an isolated fake. */
|
|
2
|
+
export interface NextTuiTermSession {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly title: string;
|
|
5
|
+
readonly kind: string;
|
|
6
|
+
readonly status: 'running' | 'backgrounded' | 'completed' | 'killed' | 'exited';
|
|
7
|
+
readonly cwd?: string;
|
|
8
|
+
readonly exitCode?: number | null;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface NextTuiTermSlashContext {
|
|
12
|
+
readonly chatLines: string[];
|
|
13
|
+
readonly setChatScrollOffset: (value: number) => void;
|
|
14
|
+
readonly sessions: { list(): readonly NextTuiTermSession[] | Promise<readonly NextTuiTermSession[]> };
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const isLive = (session: NextTuiTermSession): boolean =>
|
|
18
|
+
session.status === 'running' || session.status === 'backgrounded';
|
|
19
|
+
|
|
20
|
+
const unknownOrValue = (value: string | number | null | undefined): string =>
|
|
21
|
+
value === null || value === undefined || value === '' ? 'unknown' : String(value);
|
|
22
|
+
|
|
23
|
+
function sessionLines(sessions: readonly NextTuiTermSession[]): string[] {
|
|
24
|
+
if (sessions.length === 0) return [' No terminal sessions.'];
|
|
25
|
+
return sessions.map((session) => {
|
|
26
|
+
const exit = isLive(session) ? 'not-exited' : unknownOrValue(session.exitCode);
|
|
27
|
+
return ` ${session.status.padEnd(12)} ${session.id.slice(-8)} ${session.title} · cwd=${unknownOrValue(session.cwd)} · exitCode=${exit}`;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function matrixLines(sessions: readonly NextTuiTermSession[]): string[] {
|
|
32
|
+
if (sessions.length === 0) return [' No terminal sessions.'];
|
|
33
|
+
return [
|
|
34
|
+
' term:ID character transport placement groups title',
|
|
35
|
+
...sessions.map((session) => {
|
|
36
|
+
const dead = isLive(session) ? '' : ' exited';
|
|
37
|
+
return ` ${session.id.padEnd(10)} ${session.kind.padEnd(12)} pty pty - ${session.title}${dead}`;
|
|
38
|
+
}),
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Next TUI exposes only read-only terminal inventory and status. */
|
|
43
|
+
export async function handleNextTuiTermSlash(args: string[], context: NextTuiTermSlashContext): Promise<void> {
|
|
44
|
+
const command = (args[0] ?? 'help').trim().toLowerCase();
|
|
45
|
+
if (command === '' || command === 'help') {
|
|
46
|
+
context.chatLines.push(
|
|
47
|
+
' /term help Show Next TUI terminal commands.',
|
|
48
|
+
' /term list List terminal sessions.',
|
|
49
|
+
' /term status Show live/exited session counts.',
|
|
50
|
+
' /term matrix Show terminal transport and liveness.',
|
|
51
|
+
' Unknown cwd or exit codes are shown as unknown.',
|
|
52
|
+
' Mutating terminal commands remain on the classic terminal surface.',
|
|
53
|
+
);
|
|
54
|
+
} else if (command === 'status') {
|
|
55
|
+
const sessions = await context.sessions.list();
|
|
56
|
+
const live = sessions.filter(isLive).length;
|
|
57
|
+
const exited = sessions.length - live;
|
|
58
|
+
context.chatLines.push(` Terminal sessions: ${live} live · ${exited} exited.`);
|
|
59
|
+
} else if (command === 'list' || command === 'matrix') {
|
|
60
|
+
const sessions = await context.sessions.list();
|
|
61
|
+
context.chatLines.push(...(command === 'list' ? sessionLines(sessions) : matrixLines(sessions)));
|
|
62
|
+
} else {
|
|
63
|
+
context.chatLines.push(` Unsupported /term command in Next TUI: ${command}. Try /term help.`);
|
|
64
|
+
}
|
|
65
|
+
context.setChatScrollOffset(-1);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** The entry point reaches this only for `/term` or `/terminal` input. */
|
|
69
|
+
export async function dispatchNextTermSlash(args: string[], context: NextTuiTermSlashContext): Promise<void> {
|
|
70
|
+
await handleNextTuiTermSlash(args, context);
|
|
71
|
+
}
|
|
@@ -155,11 +155,11 @@ class LocalChatSession {
|
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
-
async turn(prompt: string, writePrompt?: (payload: string) => Promise<void>, onDelta?: (text: string) => void): Promise<TurnResult> {
|
|
158
|
+
async turn(prompt: string, writePrompt?: (payload: string) => Promise<void>, onDelta?: (text: string) => void, attachments: readonly string[] = []): Promise<TurnResult> {
|
|
159
159
|
if (this.closed) throw new Error('REPL child exited');
|
|
160
160
|
if (this.waiting) throw new Error('REPL turn already running');
|
|
161
161
|
const turnId = `tui-${++this.turnCount}`;
|
|
162
|
-
const payload =
|
|
162
|
+
const payload = JSON.stringify({ prompt, id: turnId, ...(attachments.length ? { attachments } : {}) }) + '\n';
|
|
163
163
|
const response = new Promise<TurnResult>((resolve, reject) => { this.waiting = { turnId, onDelta, resolve, reject }; });
|
|
164
164
|
try {
|
|
165
165
|
if (writePrompt) await writePrompt(payload);
|
|
@@ -237,6 +237,7 @@ export async function runLocalChatTurn(
|
|
|
237
237
|
writePrompt?: (payload: string) => Promise<void>,
|
|
238
238
|
onDelta?: (text: string) => void,
|
|
239
239
|
compact: LocalChatTurnCompact = {},
|
|
240
|
+
attachments: readonly string[] = [],
|
|
240
241
|
): Promise<void> {
|
|
241
242
|
if (signal.aborted) throw new Error('응답을 취소했습니다');
|
|
242
243
|
if (!cli) throw new Error('elanous CLI entry is unavailable');
|
|
@@ -258,7 +259,7 @@ export async function runLocalChatTurn(
|
|
|
258
259
|
try {
|
|
259
260
|
result = await session.turn(text, writePrompt, (delta) => {
|
|
260
261
|
if (!signal.aborted) onDelta?.(delta);
|
|
261
|
-
});
|
|
262
|
+
}, attachments);
|
|
262
263
|
} catch (error) {
|
|
263
264
|
if (signal.aborted) throw new Error('응답을 취소했습니다');
|
|
264
265
|
await closeLocalChatSession(sessionId);
|
package/src/user-config.ts
CHANGED
|
@@ -3391,8 +3391,22 @@ export function parseSubscriptionReviewerSpec(raw: unknown): SubscriptionReviewe
|
|
|
3391
3391
|
return { provider: 'claude-acp', ...(v.executor ? { executor: v.executor as 'cct' | 'cc' } : {}) };
|
|
3392
3392
|
}
|
|
3393
3393
|
|
|
3394
|
+
/** Stable PR-number allocation for the three self-review lanes. Zero disables a lane. */
|
|
3395
|
+
export interface ReviewerMixSpec { sol: number; claude: number; glm: number }
|
|
3396
|
+
|
|
3397
|
+
export function parseReviewerMixSpec(raw: unknown): ReviewerMixSpec | undefined {
|
|
3398
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
|
|
3399
|
+
const value = raw as Record<string, unknown>;
|
|
3400
|
+
if (Object.keys(value).some(key => key !== 'sol' && key !== 'claude' && key !== 'glm')) return undefined;
|
|
3401
|
+
const weights = [value.sol, value.claude, value.glm];
|
|
3402
|
+
if (weights.some(weight => !Number.isSafeInteger(weight) || (weight as number) < 0) ||
|
|
3403
|
+
weights.every(weight => weight === 0) ||
|
|
3404
|
+
!Number.isSafeInteger(weights.reduce<number>((sum, weight) => sum + (weight as number), 0))) return undefined;
|
|
3405
|
+
return { sol: value.sol as number, claude: value.claude as number, glm: value.glm as number };
|
|
3406
|
+
}
|
|
3407
|
+
|
|
3394
3408
|
/** 역할별 LLM 선택(sparse). `reviewer` is the opt-in harness ACP lane. */
|
|
3395
|
-
export type RoleLlmConfig = Partial<Record<ModelRole, RoleLlmSpec>> & { reviewer?: SubscriptionReviewerSpec };
|
|
3409
|
+
export type RoleLlmConfig = Partial<Record<ModelRole, RoleLlmSpec>> & { reviewer?: SubscriptionReviewerSpec; reviewerMix?: ReviewerMixSpec };
|
|
3396
3410
|
|
|
3397
3411
|
export type ModelResolutionSource = 'config' | 'tier' | 'environment' | 'default';
|
|
3398
3412
|
|
|
@@ -4354,6 +4368,10 @@ function parseRoleLlmConfig(raw: unknown): RoleLlmConfig | undefined {
|
|
|
4354
4368
|
parsed.reviewer = parseSubscriptionReviewerSpec(values.reviewer);
|
|
4355
4369
|
if (!parsed.reviewer) warnUserConfigDrop('roleLlm.reviewer', 'claude-acp reviewer 설정이 유효하지 않아 무시');
|
|
4356
4370
|
}
|
|
4371
|
+
if (values.reviewerMix !== undefined) {
|
|
4372
|
+
parsed.reviewerMix = parseReviewerMixSpec(values.reviewerMix);
|
|
4373
|
+
if (!parsed.reviewerMix) warnUserConfigDrop('roleLlm.reviewerMix', '리뷰 비율 설정이 유효하지 않아 무시');
|
|
4374
|
+
}
|
|
4357
4375
|
// ⛔ config 로딩은 «나머지를 살리려고» 잘못된 칸을 버리는데, 그 사실이 어디에도 안 남으면
|
|
4358
4376
|
// 사용자는 「왜 내 설정이 안 먹지」를 영영 못 푼다(CLI 는 이름을 대며 거부하는데 여기만 조용했다).
|
|
4359
4377
|
// ⇒ 버린 것을 «이름과 이유»로 남긴다. 로딩 자체는 계속한다.
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// ux-sim device — boot daemon-tools PtyShellStart stage (L2: env injection).
|
|
2
|
+
//
|
|
3
|
+
// TUI-NO-SELF-NEST (#27) needs evidence that travels the REAL call path, not
|
|
4
|
+
// a source-string check: the stage below injects a TUI PTY context
|
|
5
|
+
// (ELANOUS_PARENT_PTY_ID / ELANOUS_NEST_DEPTH — the same material
|
|
6
|
+
// src/pty-shell/registry.ts stamps into a child's identity) and then calls
|
|
7
|
+
// the production dispatcher `dispatchPtyShellTool` in
|
|
8
|
+
// src/boot/daemon-tools/pty-shell.ts, which is where PtyShellStart is
|
|
9
|
+
// actually served. The stage records command · rc · output tail so the run
|
|
10
|
+
// transcript can go straight into a PR body.
|
|
11
|
+
//
|
|
12
|
+
// The stage never wants a live nested TUI: when a scenario is expected to be
|
|
13
|
+
// refused, the dispatcher answers with `{ output: guidance }` and no PTY is
|
|
14
|
+
// created. If a scenario slips through, the stage kills the spawned PTY
|
|
15
|
+
// before reporting so the run leaves nothing behind.
|
|
16
|
+
|
|
17
|
+
import { dispatchPtyShellTool } from '../boot/daemon-tools/pty-shell.js';
|
|
18
|
+
import {
|
|
19
|
+
decideTuiSelfNest,
|
|
20
|
+
TUI_SELF_NEST_REJECT_MARKER,
|
|
21
|
+
type TuiSelfNestDecision,
|
|
22
|
+
} from '../agent/terminal-surface.js';
|
|
23
|
+
|
|
24
|
+
export interface PtyShellStageInput {
|
|
25
|
+
/** argv of the spawn request — e.g. ['eln'] or ['/usr/bin/eln', 'chat']. */
|
|
26
|
+
argv: string[];
|
|
27
|
+
/** Injected "inside a TUI" material. null ⇒ no TUI context. */
|
|
28
|
+
parentPtyId?: string | null;
|
|
29
|
+
/** Injected nest depth (ELANOUS_NEST_DEPTH). */
|
|
30
|
+
nestDepth?: number;
|
|
31
|
+
/** Extra PtyShellStart args (workdir, env, …) merged into the call. */
|
|
32
|
+
extraArgs?: Record<string, unknown>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface PtyShellStageResult {
|
|
36
|
+
/** The argv as it crossed the production dispatcher. */
|
|
37
|
+
command: string;
|
|
38
|
+
/** 0 = the stage produced the outcome the scenario asked for. */
|
|
39
|
+
rc: number;
|
|
40
|
+
/** True when the production path refused the spawn with guidance. */
|
|
41
|
+
rejected: boolean;
|
|
42
|
+
/** Full output returned by the production dispatcher. */
|
|
43
|
+
output: string;
|
|
44
|
+
/** Last 3 lines of output — what the PR body quotes. */
|
|
45
|
+
outputTail: string;
|
|
46
|
+
/** A PTY that was created despite the scenario (leak guard). */
|
|
47
|
+
spawnedPid: string | null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const ENV_KEYS = ['ELANOUS_PARENT_PTY_ID', 'ELANOUS_NEST_DEPTH', 'ELANOUS_PTY_ID'] as const;
|
|
51
|
+
|
|
52
|
+
function snapshotEnv(): Record<string, string | undefined> {
|
|
53
|
+
const saved: Record<string, string | undefined> = {};
|
|
54
|
+
for (const key of ENV_KEYS) saved[key] = process.env[key];
|
|
55
|
+
return saved;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function restoreEnv(saved: Record<string, string | undefined>): void {
|
|
59
|
+
for (const key of ENV_KEYS) {
|
|
60
|
+
const value = saved[key];
|
|
61
|
+
if (value === undefined) delete process.env[key];
|
|
62
|
+
else process.env[key] = value;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function tailOf(output: string, lines = 3): string {
|
|
67
|
+
return output.split('\n').filter((l) => l.length > 0).slice(-lines).join('\n');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Apply the scenario's TUI context to this process, exactly as a TUI-owned
|
|
71
|
+
* seat shell would have it, then run the production PtyShellStart path. */
|
|
72
|
+
export async function runPtyShellStartStage(input: PtyShellStageInput): Promise<PtyShellStageResult> {
|
|
73
|
+
const saved = snapshotEnv();
|
|
74
|
+
const parentPtyId = input.parentPtyId ?? null;
|
|
75
|
+
const nestDepth = input.nestDepth ?? 0;
|
|
76
|
+
try {
|
|
77
|
+
if (parentPtyId) {
|
|
78
|
+
process.env.ELANOUS_PARENT_PTY_ID = parentPtyId;
|
|
79
|
+
// pty-identity's getCurrentPtyId() reads its own pty id; mirror it so
|
|
80
|
+
// the stage exercises both halves of readTuiNestEnv's source chain.
|
|
81
|
+
process.env.ELANOUS_PTY_ID = parentPtyId;
|
|
82
|
+
} else {
|
|
83
|
+
delete process.env.ELANOUS_PARENT_PTY_ID;
|
|
84
|
+
delete process.env.ELANOUS_PTY_ID;
|
|
85
|
+
}
|
|
86
|
+
if (nestDepth > 0) process.env.ELANOUS_NEST_DEPTH = String(nestDepth);
|
|
87
|
+
else delete process.env.ELANOUS_NEST_DEPTH;
|
|
88
|
+
|
|
89
|
+
const [cmd, ...args] = input.argv;
|
|
90
|
+
const result = await dispatchPtyShellTool('PtyShellStart', {
|
|
91
|
+
...(input.extraArgs ?? {}),
|
|
92
|
+
cmd: cmd ?? '',
|
|
93
|
+
args,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
const shaped = (result ?? {}) as { output?: unknown; process_id?: unknown; id?: unknown };
|
|
97
|
+
const output = typeof shaped.output === 'string' ? shaped.output : JSON.stringify(result ?? null);
|
|
98
|
+
const rejected = output.includes(TUI_SELF_NEST_REJECT_MARKER);
|
|
99
|
+
const rawPid = shaped.process_id ?? shaped.id;
|
|
100
|
+
const spawnedPid = rejected || rawPid === undefined ? null : String(rawPid);
|
|
101
|
+
if (spawnedPid) {
|
|
102
|
+
try { await dispatchPtyShellTool('PtyShellKill', { process_id: spawnedPid }); } catch { /* leak guard */ }
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
command: input.argv.join(' '),
|
|
106
|
+
rc: rejected ? 0 : 1,
|
|
107
|
+
rejected,
|
|
108
|
+
output,
|
|
109
|
+
outputTail: tailOf(output),
|
|
110
|
+
spawnedPid,
|
|
111
|
+
};
|
|
112
|
+
} finally {
|
|
113
|
+
restoreEnv(saved);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Classifier-only view of the same scenario — used for the allow-list rows
|
|
118
|
+
* (commands that must keep running) without spawning anything. */
|
|
119
|
+
export function inspectPtyShellStartStage(input: PtyShellStageInput): TuiSelfNestDecision {
|
|
120
|
+
const saved = snapshotEnv();
|
|
121
|
+
try {
|
|
122
|
+
if (input.parentPtyId) {
|
|
123
|
+
process.env.ELANOUS_PARENT_PTY_ID = input.parentPtyId;
|
|
124
|
+
process.env.ELANOUS_PTY_ID = input.parentPtyId;
|
|
125
|
+
} else {
|
|
126
|
+
delete process.env.ELANOUS_PARENT_PTY_ID;
|
|
127
|
+
delete process.env.ELANOUS_PTY_ID;
|
|
128
|
+
}
|
|
129
|
+
if ((input.nestDepth ?? 0) > 0) process.env.ELANOUS_NEST_DEPTH = String(input.nestDepth);
|
|
130
|
+
else delete process.env.ELANOUS_NEST_DEPTH;
|
|
131
|
+
const [cmd, ...args] = input.argv;
|
|
132
|
+
return decideTuiSelfNest([cmd ?? '', ...args]);
|
|
133
|
+
} finally {
|
|
134
|
+
restoreEnv(saved);
|
|
135
|
+
}
|
|
136
|
+
}
|