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
|
@@ -431,23 +431,17 @@ const OPENGATEWAY: TierMap = {
|
|
|
431
431
|
};
|
|
432
432
|
|
|
433
433
|
// ── AWS Bedrock (BEDROCK-PROVIDER · 2026-10-11) ───────────────────
|
|
434
|
-
// ⭐ 판단: ANTHROPIC 사다리의 «추론 수준·역할 배치»를 그대로 두고, 모델은 Bedrock 메시지 엔드포인트에서
|
|
435
|
-
// 확인한 5.5 계열 id(`src/llm/bedrock.ts` BEDROCK_MODELS · 출처 platform.claude.com «Claude in Amazon Bedrock»
|
|
436
|
-
// Supported models)로만 채운다. 아래 칸(budget·balanced)은 ANTHROPIC 이 haiku-4-5·sonnet-5 를 쓰지만, 이 PR 이
|
|
437
|
-
// 카탈로그에 올린 Bedrock id 는 5.5 셋뿐이라 같은 등급의 5.5(haiku-5-5·sonnet-5-5)로 올렸다.
|
|
438
434
|
// ⛔ bedrock 은 명시 선택 전용 — 이 표는 `--role-llm <role>=bedrock/<tier>` 같은 «명시» 해석에만 쓰인다.
|
|
439
|
-
// ⚠️ status = `wip`:
|
|
440
|
-
// 없다(자격이 API 키가 아니라 AWS 체인이라).
|
|
441
|
-
//
|
|
442
|
-
//
|
|
443
|
-
// 📏 budget·balanced(haiku/sonnet 5.5)는 runtime 실호출 200 실측(ap-northeast-2) · opus 5.5 는 «추론 프로필 목록에 있음»까지만(호출 0).
|
|
444
|
-
// status 는 그대로 `wip` — `shipping` 은 셋업 키 감지 표(PROVIDER_ENV_SPEC) 칸을 요구한다(provider-wiring-contract 시험 · 범위 밖).
|
|
435
|
+
// ⚠️ status = `wip`: mantle-openai 모델의 실제 호출 가능성은 계정별 IAM 접근 조건을 따르며,
|
|
436
|
+
// 셋업 키 감지 표(PROVIDER_ENV_SPEC)에도 없다(자격이 API 키가 아니라 AWS 체인이라).
|
|
437
|
+
// runtime Converse 모델(GLM 5.3·Kimi K3·Grok 4.7)은 OP/IAM 확인 뒤 별도 추가한다.
|
|
438
|
+
// ⛔ 아래 비-Anthropic id 들은 `src/llm/bedrock.ts` BEDROCK_MODELS 에 등록된 mantle-openai 행만 사용한다.
|
|
445
439
|
const BEDROCK: TierMap = {
|
|
446
|
-
budget: { model: '
|
|
447
|
-
balanced: { model: '
|
|
448
|
-
better: { model: '
|
|
449
|
-
best: { model: '
|
|
450
|
-
loaded: { model: '
|
|
440
|
+
budget: { model: 'zai.glm-4.7-flash', reasoningLevel: 'off', label: 'GLM 4.7 Flash (Bedrock)', rationale: 'Fast · cheap · bulk/classification', status: 'wip' },
|
|
441
|
+
balanced: { model: 'openai.gpt-6-luna', reasoningLevel: 'off', label: 'GPT-6 Luna (Bedrock)', rationale: 'Default · balanced Bedrock mantle-openai model', status: 'wip' },
|
|
442
|
+
better: { model: 'deepseek.v3.2', reasoningLevel: 'medium', label: 'DeepSeek V3.2 (Bedrock)', rationale: 'Higher quality · mantle-openai', status: 'wip' },
|
|
443
|
+
best: { model: 'zai.glm-5', reasoningLevel: 'medium', label: 'GLM 5 (Bedrock)', rationale: 'Best reasoning · mantle-openai', status: 'wip' },
|
|
444
|
+
loaded: { model: 'openai.gpt-6-sol', reasoningLevel: 'high', label: 'GPT-6 Sol (Bedrock)', rationale: 'Loaded · deep multi-step · mantle-openai', status: 'wip' },
|
|
451
445
|
};
|
|
452
446
|
|
|
453
447
|
/** 가격·창 미측정이라 기존 tier 배치를 바꾸지 않고 명시 모델로만 고르는 칸.
|
|
@@ -523,8 +517,9 @@ export function lookupOpenRouterModelSpec(model: string): LlmTierSpec | undefine
|
|
|
523
517
|
* `auto` and unknown providers have no concrete provider ladder, so both use
|
|
524
518
|
* Anthropic's balanced default instead of crossing into the Codex family.
|
|
525
519
|
* Existing execution path: src/llm/model-defaults.ts tierModel() calls this
|
|
526
|
-
* function
|
|
527
|
-
*
|
|
520
|
+
* function (`lookupLlmTierSpec(activeProviderForDefaults(provider), tier)`) to
|
|
521
|
+
* fill the active provider's model at runtime. Explicit providers keep their
|
|
522
|
+
* own ladders; CLI catalog commands reject unknown/'auto' directly. */
|
|
528
523
|
export function lookupLlmTierSpec(
|
|
529
524
|
provider: LLMProviderName,
|
|
530
525
|
tier: ModelTier,
|
package/src/msg/msg-store.ts
CHANGED
|
@@ -278,6 +278,23 @@ export class MsgStore {
|
|
|
278
278
|
: []);
|
|
279
279
|
}
|
|
280
280
|
|
|
281
|
+
/** A request and its direct replies, in insertion order, independent of recipient cursors. */
|
|
282
|
+
listThread(messageId: number, after: number = 0, limit: number = 100): Message[] {
|
|
283
|
+
if (!Number.isSafeInteger(messageId) || messageId < 1) throw new Error('message ID must be a positive integer');
|
|
284
|
+
validCursor(after);
|
|
285
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1000) throw new Error('limit must be between 1 and 1000');
|
|
286
|
+
return this.readWithSchema(hasReplyTo => {
|
|
287
|
+
const target = this.db.query(`SELECT id, ${hasReplyTo ? 'reply_to' : 'NULL AS reply_to'} FROM msg_messages WHERE id = ?`)
|
|
288
|
+
.get(messageId) as { id: number; reply_to: number | null } | null;
|
|
289
|
+
if (target === null) throw new Error(`message not found: #${messageId}`);
|
|
290
|
+
const rootId = target.reply_to ?? target.id;
|
|
291
|
+
const rows = this.db.query(`SELECT id, sender, recipient, body, kind, ${hasReplyTo ? 'reply_to' : 'NULL AS reply_to'}, created_at FROM msg_messages
|
|
292
|
+
WHERE id > ? AND (id = ? ${hasReplyTo ? 'OR reply_to = ?' : ''}) ORDER BY id ASC LIMIT ?`)
|
|
293
|
+
.all(...(hasReplyTo ? [after, rootId, rootId, limit] : [after, rootId, limit])) as MessageRow[];
|
|
294
|
+
return rows.map(fromRow);
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
|
|
281
298
|
list(recipient: string, after: number = 0, limit: number = 100): Message[] {
|
|
282
299
|
return this.listByRecipient(recipient, after, limit);
|
|
283
300
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import type { VerifierSpec } from './verifier/types.js';
|
|
9
9
|
import type { GuardianSpec } from './guardian/types.js';
|
|
10
|
-
import { ptyAvailable } from './pty-shell/
|
|
10
|
+
import { ptyAvailable } from './pty-shell/availability.js';
|
|
11
11
|
import { krFlowAvailable } from './skills/tools/kr-flow.js';
|
|
12
12
|
import { SELF_COGNITION_MCP_CATALOG_ENTRIES } from './tool-runtime/self-cognition-catalog.js';
|
|
13
13
|
import { SKILLS_LIST_DESCRIPTION } from './onboarding/entry-hints.js';
|
|
@@ -2,6 +2,7 @@ import { debug } from '../../debug/log.js';
|
|
|
2
2
|
import { GraphWizardInputError, designGraphVariantPlan, generateGraphFromPrompt, wizardInstalledPacks, type GraphWizardDeps, type GraphWizardTurn } from '../../graph-wizard/generate.js';
|
|
3
3
|
import { defaultGraphsDir } from '../../self-implement/graph-templates.js';
|
|
4
4
|
import { loadGraphTemplates } from '../../self-implement/graph-yaml.js';
|
|
5
|
+
import type { NexusEventBus } from './event-bus.js';
|
|
5
6
|
import { jsonResponse } from './json-response.js';
|
|
6
7
|
|
|
7
8
|
export function handleGraphWizardPacksGet(deps: GraphWizardDeps = {}): Response {
|
|
@@ -11,6 +12,28 @@ export function handleGraphWizardPacksGet(deps: GraphWizardDeps = {}): Response
|
|
|
11
12
|
const MAX_PROMPT = 4000;
|
|
12
13
|
const MAX_YAML = 200_000;
|
|
13
14
|
|
|
15
|
+
/** 호출 경계에서 variant 한 턴의 결말을 버스에 남긴다 — mode·reason ⊕ 조작 growth 좌표. */
|
|
16
|
+
function publishGraphCompose(eventBus: NexusEventBus | undefined, input: {
|
|
17
|
+
readonly result: Awaited<ReturnType<typeof designGraphVariantPlan>>;
|
|
18
|
+
readonly goal: string;
|
|
19
|
+
readonly templateId: string;
|
|
20
|
+
}): void {
|
|
21
|
+
const { result, goal, templateId } = input;
|
|
22
|
+
eventBus?.publish({
|
|
23
|
+
ts: Date.now(),
|
|
24
|
+
kind: 'graph.compose',
|
|
25
|
+
detail: {
|
|
26
|
+
mode: result.mode,
|
|
27
|
+
status: result.status,
|
|
28
|
+
reason: result.reason,
|
|
29
|
+
goal,
|
|
30
|
+
templateId,
|
|
31
|
+
...(result.growth ? { growth: result.growth } : {}),
|
|
32
|
+
...(result.status === 'composed' ? { overlayId: result.variant.overlay.overlayId, patches: result.variant.patches.length } : {}),
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
14
37
|
/**
|
|
15
38
|
* POST /v1/graphs/wizard {prompt, kind?, currentYaml?, history?} or
|
|
16
39
|
* {mode:'variant', prompt, goal, templateId} for one validated L2 plan (no YAML generation).
|
|
@@ -18,8 +41,9 @@ const MAX_YAML = 200_000;
|
|
|
18
41
|
* (labels·steps·recipes·dryRun·baseReason 는 v2 추가 필드 — 기존 필드는 그대로.)
|
|
19
42
|
* currentYaml 이 빈 문자열이면 «빈 캔버스»로 보고 새 그래프를 짓는다(의도) · 내용이 있는데 id 가 없거나 형식 밖이면 400.
|
|
20
43
|
* 저장하지 않는다 — 저장은 POST /v1/graphs(새 그래프) 또는 PUT /v1/graphs/<id>/yaml(내 그래프).
|
|
44
|
+
* variant 요청은 결말(mode·reason·조작 growth)을 주입된 버스에 `graph.compose` 이벤트로 남긴다.
|
|
21
45
|
*/
|
|
22
|
-
export async function handleGraphWizardPost(req: Request, deps: GraphWizardDeps = {}): Promise<Response> {
|
|
46
|
+
export async function handleGraphWizardPost(req: Request, deps: GraphWizardDeps = {}, eventBus?: NexusEventBus): Promise<Response> {
|
|
23
47
|
let body: Record<string, unknown>;
|
|
24
48
|
try {
|
|
25
49
|
const parsed: unknown = await req.json();
|
|
@@ -60,7 +84,8 @@ export async function handleGraphWizardPost(req: Request, deps: GraphWizardDeps
|
|
|
60
84
|
const template = loadGraphTemplates(deps.graphsDir ?? defaultGraphsDir()).templates[body.templateId];
|
|
61
85
|
if (!template) return jsonResponse({ error: 'bad_request', reason: `unknown templateId: ${body.templateId}` }, 400);
|
|
62
86
|
const result = await designGraphVariantPlan({ goal: body.goal, prompt, template }, deps);
|
|
63
|
-
|
|
87
|
+
publishGraphCompose(eventBus, { result, goal: body.goal, templateId: body.templateId });
|
|
88
|
+
return jsonResponse(result);
|
|
64
89
|
}
|
|
65
90
|
const result = await generateGraphFromPrompt({
|
|
66
91
|
prompt,
|
package/src/nexus/api/grid.ts
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { getUserConfig } from '../../user-config.js';
|
|
2
2
|
import { readHqLease, type HqDeps } from '../../hq/hq.js';
|
|
3
|
-
import { measurePoolLease, type PoolLeaseMeasure } from '../../task-orchestrator/surfaces/pod-lease.js';
|
|
3
|
+
import { measurePoolLease, type PoolLeaseMeasure, type PodLeaseMember } from '../../task-orchestrator/surfaces/pod-lease.js';
|
|
4
4
|
import { parsePodPool, resolvePodPoolSpec, type PodPoolMember, type PoolKubectl } from '../../task-orchestrator/surfaces/pod-pool.js';
|
|
5
|
+
import type { GateReservation } from '../../ops/overview.js';
|
|
5
6
|
|
|
6
7
|
export interface GridData {
|
|
7
8
|
/** null means the arbiter could not be read, not that no lease exists. */
|
|
8
9
|
hq: { record: ReturnType<typeof readHqLease>['record']; ageSeconds: number | null; expired: boolean | null; reason: string | null };
|
|
9
|
-
/**
|
|
10
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Configured member order; capacity comes from measurePoolLease when available. occupied is running + pending, or null on measurement failure.
|
|
12
|
+
* `gate` is GATE-RESERVE-AUTO's reservation for this member — absent when the job/cpu reading failed (unmeasured, not «no gate»).
|
|
13
|
+
*/
|
|
14
|
+
members: Array<{ context: string; capacity: number; running: number | null; pending: number | null; occupied: number | null; reason: string | null; gate?: GateReservation }>;
|
|
11
15
|
poolReason: string | null;
|
|
12
16
|
}
|
|
13
17
|
|
|
@@ -20,6 +24,21 @@ export interface GridDeps {
|
|
|
20
24
|
measure?: (members: readonly PodPoolMember[]) => PoolLeaseMeasure;
|
|
21
25
|
}
|
|
22
26
|
|
|
27
|
+
/**
|
|
28
|
+
* GATE-RESERVE-AUTO 의 예약 몫을 자원 지도 축 꼴로 옮긴다. Job/CPU 읽기가 실패한 멤버는 undefined 다 —
|
|
29
|
+
* «게이트 없음»이 아니라 «못 잼»이므로 구속 조건 후보에서 빠진다(0 으로도 무한으로도 읽지 않는다).
|
|
30
|
+
* 게이트가 안 도는 멤버(jobs 0)는 값으로 남는다: 축은 «게이트 없음»이라고 말할 수 있어야 한다.
|
|
31
|
+
*/
|
|
32
|
+
function gateOf(row: PodLeaseMember | undefined): GateReservation | undefined {
|
|
33
|
+
if (!row || typeof row.gateJobs !== 'number') return undefined;
|
|
34
|
+
return {
|
|
35
|
+
jobs: row.gateJobs,
|
|
36
|
+
unbound: typeof row.gateUnboundJobs === 'number' ? row.gateUnboundJobs : Number.NaN,
|
|
37
|
+
reservedMillicores: typeof row.gateCpuMillicores === 'number' ? row.gateCpuMillicores : Number.NaN,
|
|
38
|
+
schedulableMillicores: typeof row.schedulableCpuMillicores === 'number' ? row.schedulableCpuMillicores : Number.NaN,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
23
42
|
/** Independent, fail-soft read snapshots. No lease status/heartbeat, DNS probe Pod, host reservation or writes. */
|
|
24
43
|
export function buildGridData(deps: GridDeps = {}): GridData {
|
|
25
44
|
let hq: GridData['hq'];
|
|
@@ -45,9 +64,10 @@ export function buildGridData(deps: GridDeps = {}): GridData {
|
|
|
45
64
|
const row = byContext.get(member.context);
|
|
46
65
|
const running = row?.running ?? null;
|
|
47
66
|
const pending = row?.pending ?? null;
|
|
67
|
+
const gate = gateOf(row);
|
|
48
68
|
return { context: member.context, capacity: row?.capacity ?? member.capacity, running, pending,
|
|
49
69
|
occupied: running === null || pending === null ? null : running + pending,
|
|
50
|
-
reason: row?.reason ?? (row ? null : '측정 불가') };
|
|
70
|
+
reason: row?.reason ?? (row ? null : '측정 불가'), ...(gate ? { gate } : {}) };
|
|
51
71
|
});
|
|
52
72
|
} catch (error) {
|
|
53
73
|
poolReason = String(error);
|
|
@@ -1523,7 +1523,7 @@ export async function routeRequest(
|
|
|
1523
1523
|
if (method === 'POST' && pathname === '/v1/graphs/wizard') {
|
|
1524
1524
|
if (!opts.metaApi) return jsonResponse({ error: 'meta-api-not-wired' }, 503);
|
|
1525
1525
|
if (!checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
|
|
1526
|
-
return handleGraphWizardPost(req, opts.graphWizard);
|
|
1526
|
+
return handleGraphWizardPost(req, opts.graphWizard, opts.eventBus);
|
|
1527
1527
|
}
|
|
1528
1528
|
|
|
1529
1529
|
if (pathname === '/v1/fabric/decompose' || pathname.startsWith('/v1/fabric/plans/')) {
|
package/src/nexus/api/ops-api.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { createSeatsCache, todayKst } from './ops-seats.js';
|
|
|
11
11
|
import { liveSeatsSources } from './ops-seats-sources.js';
|
|
12
12
|
import { createOverviewCache } from '../../ops/overview-cache.js';
|
|
13
13
|
import { resourcesFromOverview } from '../../ops/resources.js';
|
|
14
|
+
import { loopsMapFromCache } from '../../ops/loops-map.js';
|
|
14
15
|
import { parseSince } from '../../ops/overview-collect.js';
|
|
15
16
|
import type { MetaApiOpts } from './meta-api.js';
|
|
16
17
|
|
|
@@ -184,6 +185,14 @@ export function readReleaseRuns(version: string | null = null,
|
|
|
184
185
|
}).sort((a, b) => b.startedAt.localeCompare(a.startedAt)).slice(0, 20);
|
|
185
186
|
}
|
|
186
187
|
|
|
188
|
+
/**
|
|
189
|
+
* 요청이 «자격을 하나라도 실어 왔는가» — operatorSignal 이 판정에 쓰는 축(베어러·프록시 헤더·쿠키)만 본다.
|
|
190
|
+
* 아무것도 없으면 401(인증 없음), 있는데 운영자가 아니면 403(권한 없음)으로 가른다.
|
|
191
|
+
*/
|
|
192
|
+
function offeredCredential(req: Request): boolean {
|
|
193
|
+
return Boolean(req.headers.get('authorization') || req.headers.get('x-elanous-operator') || req.headers.get('cookie'));
|
|
194
|
+
}
|
|
195
|
+
|
|
187
196
|
/** The sole data gate for every read-only /v1/ops endpoint. */
|
|
188
197
|
export function handleOpsApi(req: Request, metaApi: MetaApiOpts | undefined): Response | Promise<Response> {
|
|
189
198
|
const url = new URL(req.url);
|
|
@@ -195,6 +204,9 @@ export function handleOpsApi(req: Request, metaApi: MetaApiOpts | undefined): Re
|
|
|
195
204
|
debug.log('ops.api', 'refused', { path: pathname, source: signal.operatorSource });
|
|
196
205
|
// RES-FLOOR-API: no credential was offered at all — this endpoint names it 401; every other path keeps 403.
|
|
197
206
|
if (pathname === '/v1/ops/resources') return jsonResponse({ error: 'unauthorized' }, 401);
|
|
207
|
+
// LOOP-MAP-API: a request that offers no credential at all is 401 in the same body shape;
|
|
208
|
+
// a credential that is not an operator stays 403, exactly like the neighbouring ops paths.
|
|
209
|
+
if (pathname === '/v1/ops/loops-map' && !offeredCredential(req)) return jsonResponse({ error: 'unauthorized' }, 401);
|
|
198
210
|
return jsonResponse({ error: 'forbidden' }, 403);
|
|
199
211
|
}
|
|
200
212
|
const served = (response: Response): Response => {
|
|
@@ -226,12 +238,8 @@ export function handleOpsApi(req: Request, metaApi: MetaApiOpts | undefined): Re
|
|
|
226
238
|
// (name·era·beat cell observedAt; null/unmeasured value and reason preserved);
|
|
227
239
|
// no new remote fan-out of its own. Loop-edge joining is a later shard.
|
|
228
240
|
overviewCache ??= createOverviewCache();
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
generatedAt: overview.generatedAt,
|
|
232
|
-
cacheAgeMs: overview.cacheAgeMs,
|
|
233
|
-
loops: overview.loops.map((loop) => ({ name: loop.name, era: loop.era, beat: loop.beat })),
|
|
234
|
-
})), () => jsonResponse({ error: 'overview-unavailable' }, 500));
|
|
241
|
+
// peek, not get: a cold cache answers «아직 캐시 없음» instead of starting a collection.
|
|
242
|
+
return Promise.resolve(served(jsonResponse(loopsMapFromCache(overviewCache.peek()))));
|
|
235
243
|
}
|
|
236
244
|
if (pathname === '/v1/ops/seats') {
|
|
237
245
|
const date = url.searchParams.get('date') ?? todayKst();
|
package/src/nexus/state/state.ts
CHANGED
|
@@ -113,7 +113,13 @@ export interface NexusEvent {
|
|
|
113
113
|
// · tone? · glyph?). PWA's M4 `subscribeHudSegmentEvents`
|
|
114
114
|
// synthesizes a FeedbackEnvelope { kind: 'hud.segment' } and routes
|
|
115
115
|
// it through the M1 `applyHudSegmentEnvelope` accumulator.
|
|
116
|
-
| 'hud.segment'
|
|
116
|
+
| 'hud.segment'
|
|
117
|
+
// GRAPH-WIZARD variant 관측 (ARG-L2-DESIGNER-FU1 · 2026-10-23) — POST /v1/graphs/wizard 의
|
|
118
|
+
// variant 한 턴이 끝날 때 호출 경계(handleGraphWizardPost)가 한 건 발행한다. `detail` =
|
|
119
|
+
// { mode: 'variant', status: 'composed'|'fallback-standard', reason, goal, templateId,
|
|
120
|
+
// growth?: { from, outcome, nodeId, returnTo? }, overlayId?, patches? }.
|
|
121
|
+
// SSE 구독자는 `?topics=graph.compose` 로 받는다.
|
|
122
|
+
| 'graph.compose';
|
|
117
123
|
tabId?: string;
|
|
118
124
|
detail?: Record<string, unknown>;
|
|
119
125
|
}
|
|
@@ -32,6 +32,8 @@ import {
|
|
|
32
32
|
decideFallback, normalizeFallbackChain, grokQuotaFromUsageSnapshot,
|
|
33
33
|
type FallbackDecision, type FallbackInput, type FallbackStep, type RotationOutcome,
|
|
34
34
|
} from './fallback-chain.js';
|
|
35
|
+
import { collectClaudePtyMaturitySample, judgeClaudePtyMaturity, type ClaudePtyMaturity } from './claude-pty-maturity.js';
|
|
36
|
+
import type { UsageOutcomesDeps } from '../budget/usage-outcomes.js';
|
|
35
37
|
import { resolveGrokCredential } from '../grok/credential.js';
|
|
36
38
|
import { getOpenRouterApiKey } from '../config.js';
|
|
37
39
|
import { lookupOpenRouterModelSpec } from '../model-tier/llm-tier-map.js';
|
|
@@ -1087,6 +1089,29 @@ function richestCreditCandidate(candidates: readonly RotationCandidate[], reserv
|
|
|
1087
1089
|
return creditCandidatesByBalance(candidates, reserve)[0];
|
|
1088
1090
|
}
|
|
1089
1091
|
|
|
1092
|
+
/**
|
|
1093
|
+
* CLAUDE-FAILOVER-FU — 체인에 `claude-pty` 칸이 «있을 때만» 런 원장의 최근 표본을 읽어 성숙도를 낸다.
|
|
1094
|
+
*
|
|
1095
|
+
* ⛔ 다른 체인에서는 원장을 «안 읽는다» — 비용도 0 이고, claude 를 안 쓰는 구성의 판정 입력도 안 바뀐다.
|
|
1096
|
+
* ⛔ 읽기 실패·표본 결손을 «전환 가능»으로 접지 않는다 — `judgeClaudePtyMaturity(null)` 이
|
|
1097
|
+
* `sample-unreadable`(미성숙)을 내고, 판정은 `claude-pty-immature` 로 닫힌다.
|
|
1098
|
+
* ⛔ 예외도 삼켜 미성숙으로 닫는다 — 원장 I/O 때문에 폴백 판정 자체가 죽으면 안 된다.
|
|
1099
|
+
*/
|
|
1100
|
+
function claudePtyMaturityForChain(
|
|
1101
|
+
chain: readonly FallbackStep[],
|
|
1102
|
+
ledger: UsageOutcomesDeps | undefined,
|
|
1103
|
+
): ClaudePtyMaturity | undefined {
|
|
1104
|
+
if (!chain.includes('claude-pty')) return undefined;
|
|
1105
|
+
try {
|
|
1106
|
+
return judgeClaudePtyMaturity(collectClaudePtyMaturitySample(ledger ?? {}));
|
|
1107
|
+
} catch (error) {
|
|
1108
|
+
debug.log('oauth.claude-pty', 'maturity-read-failed', {
|
|
1109
|
+
reason: error instanceof Error ? error.message.slice(0, 120) : String(error).slice(0, 120),
|
|
1110
|
+
}, { level: 'warn' });
|
|
1111
|
+
return judgeClaudePtyMaturity(null);
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1090
1115
|
export function resolveRunFallback(
|
|
1091
1116
|
env: NodeJS.ProcessEnv = process.env,
|
|
1092
1117
|
deps: {
|
|
@@ -1098,6 +1123,8 @@ export function resolveRunFallback(
|
|
|
1098
1123
|
readonly openrouterAvailable?: boolean;
|
|
1099
1124
|
/** codex 크레딧 잔액 «확인» seam — 안 주면 회전 후보의 크레딧 신호(잔액 > 0 · 보유 ≠ false)로 잰다. */
|
|
1100
1125
|
readonly codexCreditsAvailable?: boolean;
|
|
1126
|
+
/** ⛔ 런 원장 «읽기» seam — 체인에 `claude-pty` 가 있을 때만 쓴다. 안 주면 실제 런 원장을 읽는다. */
|
|
1127
|
+
readonly claudePtyLedger?: UsageOutcomesDeps;
|
|
1101
1128
|
} & Pick<FallbackInput, 'currentStep' | 'currentCredentialRateLimited'> = {},
|
|
1102
1129
|
): FallbackDecision {
|
|
1103
1130
|
try {
|
|
@@ -1160,7 +1187,13 @@ export function resolveRunFallback(
|
|
|
1160
1187
|
: explicitAccount ? (explicitAccountHasCredits(snapshot, creditReserve) ? [snapshot.current.name] : [])
|
|
1161
1188
|
: codexCreditAccountNames(snapshot.candidates, creditReserve);
|
|
1162
1189
|
const codexCreditsAvailable = effectiveChain.includes('codex-credits') && (deps.codexCreditsAvailable ?? creditAccounts.length > 0);
|
|
1163
|
-
|
|
1190
|
+
// CLAUDE-FAILOVER-FU — 체인에 `claude-pty` 가 «있을 때만» 원장 성숙도를 재서 판정 입력에 싣는다.
|
|
1191
|
+
// ⛔ 없으면 `undefined` 이고 판정은 종전 그대로다(수집 0회 · 판정식 무변경).
|
|
1192
|
+
const claudePtyMaturity = claudePtyMaturityForChain(effectiveChain, deps.claudePtyLedger);
|
|
1193
|
+
const fallbackBase = {
|
|
1194
|
+
rotation, chain: effectiveChain, grokAvailable, grokQuota, openrouterFallbackModel, openrouterAvailable, codexCreditsAvailable,
|
|
1195
|
+
...(claudePtyMaturity ? { claudePtyMaturity } : {}),
|
|
1196
|
+
};
|
|
1164
1197
|
const fallbackInput: FallbackInput = deps.currentCredentialRateLimited === true && deps.currentStep
|
|
1165
1198
|
? { ...fallbackBase, currentStep: deps.currentStep, currentCredentialRateLimited: true }
|
|
1166
1199
|
: { ...fallbackBase, ...(deps.currentStep ? { currentStep: deps.currentStep } : {}) };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { LoopRow, OverviewSnapshot } from './overview.js';
|
|
2
|
+
|
|
3
|
+
/** 루프 지도의 한 칸 — 캐시 스냅숏의 루프 행을 그대로 옮긴다(합성 없음). */
|
|
4
|
+
export interface LoopsMapRow {
|
|
5
|
+
name: string;
|
|
6
|
+
era: LoopRow['era'];
|
|
7
|
+
/** 이 주기 이상 박동이 없으면 정지로 본다. null = 주기 미상(판정에서 뺀다) — 캐시 값 그대로. */
|
|
8
|
+
staleAfterSeconds: number | null;
|
|
9
|
+
/** 박동 칸: 못 잼이면 value·observedAt 이 null 이고 reason 이 남는다(캐시 그대로). */
|
|
10
|
+
beat: LoopRow['beat'];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* LOOP-MAP-API 응답 — overviewCache 의 loops 스냅숏만 투영한 것.
|
|
15
|
+
* edges(loop-edges 결합)는 후속 조각이라 여기에 넣지 않는다.
|
|
16
|
+
*/
|
|
17
|
+
export interface LoopsMap {
|
|
18
|
+
/** 캐시 스냅숏이 만든 시각. 캐시가 비면 null. */
|
|
19
|
+
generatedAt: string | null;
|
|
20
|
+
/** 요청 시각(캐시 시계)과 generatedAt 의 차이. 캐시가 비면 null. */
|
|
21
|
+
cacheAgeMs: number | null;
|
|
22
|
+
loops: LoopsMapRow[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** 캐시 미스 응답 — 원격 조회를 유발하지 않고 «아직 캐시 없음»을 그대로 말한다. */
|
|
26
|
+
const EMPTY_LOOPS_MAP: LoopsMap = { generatedAt: null, cacheAgeMs: null, loops: [] };
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* overviewCache.peek() 결과 하나를 루프 지도 응답으로 투영한다.
|
|
30
|
+
* `at` 은 캐시의 시계로 잰 «읽은 시각»이라 가짜 시계를 주입하면 cacheAgeMs 가 결정적이다.
|
|
31
|
+
* 여기서 원천을 더 읽지 않는다 — 순수 투영이다.
|
|
32
|
+
*/
|
|
33
|
+
export function loopsMapFromCache(peeked: { snapshot: OverviewSnapshot; at: number } | null): LoopsMap {
|
|
34
|
+
if (!peeked) return EMPTY_LOOPS_MAP;
|
|
35
|
+
const generatedAtMs = Date.parse(peeked.snapshot.generatedAt);
|
|
36
|
+
return {
|
|
37
|
+
generatedAt: peeked.snapshot.generatedAt,
|
|
38
|
+
cacheAgeMs: Number.isFinite(generatedAtMs) ? Math.max(0, peeked.at - generatedAtMs) : null,
|
|
39
|
+
loops: peeked.snapshot.loops.map((loop) => ({
|
|
40
|
+
name: loop.name,
|
|
41
|
+
era: loop.era,
|
|
42
|
+
staleAfterSeconds: loop.staleAfterSeconds,
|
|
43
|
+
beat: loop.beat,
|
|
44
|
+
})),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { debug } from '../debug/log.js';
|
|
2
2
|
import { parentPort, Worker } from 'node:worker_threads';
|
|
3
3
|
import { collectOverview, type CollectOptions } from './overview-collect.js';
|
|
4
|
-
import { computeVerdict, unmeasured, okCell, type OverviewSnapshot, type PodMemberRow } from './overview.js';
|
|
4
|
+
import { computeVerdict, unmeasured, okCell, type Cell, type GateReservation, type OverviewSnapshot, type PodMemberRow } from './overview.js';
|
|
5
5
|
import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
6
6
|
import { getElanousConfigDirOverride, setElanousConfigDir } from '../elanous-config-dir.js';
|
|
7
7
|
|
|
@@ -12,7 +12,7 @@ const POD_STALE_MS = 2 * POD_MS;
|
|
|
12
12
|
const MAX_MEMO = 32;
|
|
13
13
|
const MAX_PENDING = 2;
|
|
14
14
|
|
|
15
|
-
type PodReading = { context: string; occupied: number | null; reason: string | null; observedAt: number };
|
|
15
|
+
type PodReading = { context: string; occupied: number | null; reason: string | null; observedAt: number; gate?: GateReservation };
|
|
16
16
|
type OverviewData = OverviewSnapshot & ReturnType<typeof computeVerdict> & { cacheAgeMs: number; durationMs: number; sources: string[]; refreshFailed: string | null };
|
|
17
17
|
type WorkerMessage = ({ kind: 'pods' } | { kind: 'snapshot'; options: CollectOptions }) & { configDir?: string };
|
|
18
18
|
|
|
@@ -25,7 +25,7 @@ if (port) {
|
|
|
25
25
|
if (message.configDir) setElanousConfigDir(message.configDir);
|
|
26
26
|
if (message.kind === 'pods') {
|
|
27
27
|
const { buildGridData } = await import('../nexus/api/grid.js');
|
|
28
|
-
const rows = buildGridData().members.map((m) => ({ context: m.context, occupied: m.occupied, reason: m.reason, observedAt: Date.now() }));
|
|
28
|
+
const rows = buildGridData().members.map((m) => ({ context: m.context, occupied: m.occupied, reason: m.reason, observedAt: Date.now(), ...(m.gate ? { gate: m.gate } : {}) }));
|
|
29
29
|
port.postMessage({ rows });
|
|
30
30
|
} else port.postMessage({ snapshot: await collectOverview(message.options) });
|
|
31
31
|
} catch (error) {
|
|
@@ -106,6 +106,24 @@ export function createOverviewCache(deps: {
|
|
|
106
106
|
podTimer = schedule(() => { void refreshPods(); }, POD_MS);
|
|
107
107
|
podTimer.unref();
|
|
108
108
|
};
|
|
109
|
+
/**
|
|
110
|
+
* 게이트 예약 축(RES-FLOOR-BINDING 다섯째 축) — 「게이트 안 돎」은 측정된 값('none'), 못 잼은 사유를 남긴다.
|
|
111
|
+
* 둘 다 구속 조건 후보에서 빠지지만 뜻은 다르다: 하나는 «게이트가 안 돈다», 다른 하나는 «모른다».
|
|
112
|
+
*/
|
|
113
|
+
const overlayGate = (row: PodReading | undefined, at: number): Cell<GateReservation | 'none'> => {
|
|
114
|
+
const observedAt = row ? new Date(row.observedAt).toISOString() : null;
|
|
115
|
+
const stale = row !== undefined && at - row.observedAt >= POD_STALE_MS;
|
|
116
|
+
if (podFailure || !row || stale) {
|
|
117
|
+
return unmeasured('pod pool background measure', podFailure ?? (stale ? '낡음(120초)' : '측정 대기'), observedAt);
|
|
118
|
+
}
|
|
119
|
+
if (!row.gate) return unmeasured('pod pool background measure', row.reason ?? '게이트 예약 못 잼', observedAt);
|
|
120
|
+
if (row.gate.jobs === 0) return okCell<GateReservation | 'none'>('none', 'pod pool background measure', observedAt);
|
|
121
|
+
const gate = row.gate;
|
|
122
|
+
if (!Number.isFinite(gate.unbound) || !Number.isFinite(gate.reservedMillicores) || !Number.isFinite(gate.schedulableMillicores)) {
|
|
123
|
+
return unmeasured('pod pool background measure', '게이트 CPU 못 잼', observedAt);
|
|
124
|
+
}
|
|
125
|
+
return okCell<GateReservation | 'none'>(gate, 'pod pool background measure', observedAt);
|
|
126
|
+
};
|
|
109
127
|
/** Response-time Pod occupancy overlay — shared by /v1/ops/overview and /v1/ops/resources. */
|
|
110
128
|
const overlayPods = (snapshot: OverviewSnapshot, at: number): PodMemberRow[] => {
|
|
111
129
|
const byContext = new Map(podRows.map((row) => [row.context, row]));
|
|
@@ -115,7 +133,7 @@ export function createOverviewCache(deps: {
|
|
|
115
133
|
const occupied = !podFailure && row && !stale && row.occupied !== null
|
|
116
134
|
? okCell(row.occupied, 'pod pool background measure', new Date(row.observedAt).toISOString())
|
|
117
135
|
: unmeasured<number>('pod pool background measure', podFailure ?? (stale ? '낡음(120초)' : row?.reason ?? '측정 대기'), row ? new Date(row.observedAt).toISOString() : null);
|
|
118
|
-
return { ...pod, occupied };
|
|
136
|
+
return { ...pod, occupied, gate: overlayGate(row, at) };
|
|
119
137
|
});
|
|
120
138
|
};
|
|
121
139
|
const present = (entry: Entry): OverviewData => {
|
package/src/ops/overview.ts
CHANGED
|
@@ -60,7 +60,28 @@ export interface MachineLoad {
|
|
|
60
60
|
ioPressure?: IoPressure | null;
|
|
61
61
|
}
|
|
62
62
|
export interface MachineRow { name: string; load: Cell<MachineLoad> }
|
|
63
|
-
|
|
63
|
+
/**
|
|
64
|
+
* GATE-RESERVE-AUTO 가 잰 «게이트 예약 몫» — 발행 게이트 샤드가 쥔 CPU. 자원 지도의 다섯째 축이다.
|
|
65
|
+
* `harnessCpuSlotsBesideGate` 와 같은 fail-closed 규칙: 샤드가 아직 노드에 안 붙었으면 하니스 Pod 는 들어가지 않는다.
|
|
66
|
+
*/
|
|
67
|
+
export interface GateReservation {
|
|
68
|
+
/** 종결 전 게이트 샤드 Job 수 — 0 이면 게이트가 안 돈다(축 아님). */
|
|
69
|
+
jobs: number;
|
|
70
|
+
/** 그중 아직 노드에 안 붙은 샤드. */
|
|
71
|
+
unbound: number;
|
|
72
|
+
/** 샤드가 예약한 CPU(밀리코어). */
|
|
73
|
+
reservedMillicores: number;
|
|
74
|
+
/** 스케줄 가능한 노드들의 CPU 합(밀리코어). */
|
|
75
|
+
schedulableMillicores: number;
|
|
76
|
+
}
|
|
77
|
+
export interface PodMemberRow {
|
|
78
|
+
context: string; capacity: number; occupied: Cell<number>;
|
|
79
|
+
/**
|
|
80
|
+
* 게이트 예약 축 — `'none'` 은 «게이트가 안 돈다»(측정됨), `unmeasured` 는 못 잼(축에서 뺀다), 항목 없음은
|
|
81
|
+
* 이 칸에 게이트 원천이 없는 스냅숏(로컬 CLI 는 호출 경로 kubectl 0 규율로 늘 여기다).
|
|
82
|
+
*/
|
|
83
|
+
gate?: Cell<GateReservation | 'none'>;
|
|
84
|
+
}
|
|
64
85
|
export interface ParentsInfo { count: number; staleOver6h: number; oldestHours: number | null }
|
|
65
86
|
export interface SchedulerMetrics {
|
|
66
87
|
scheduleRuns: number | null;
|
|
@@ -110,7 +131,7 @@ export interface VerdictResult { verdict: Verdict; reasons: string[]; nextAction
|
|
|
110
131
|
/** 부하/코어가 이 값을 넘으면 «기계 압박»(흐름 저하의 사유). */
|
|
111
132
|
export const LOAD_PER_CORE_PRESSURE = 3;
|
|
112
133
|
|
|
113
|
-
/** 자원 지도의 축 어휘(닫힌 집합 · RES-FLOOR-BINDING).
|
|
134
|
+
/** 자원 지도의 축 어휘(닫힌 집합 · RES-FLOOR-BINDING). */
|
|
114
135
|
export type ResourceKind = 'memory' | 'cpu' | 'io' | 'slots' | 'gate';
|
|
115
136
|
|
|
116
137
|
/** 구속 조건 — 남은 비율이 최소인 축. 남은 비율 = 남은 양/전체 양(CPU 는 압박선 LOAD_PER_CORE_PRESSURE×코어를 전체로 본다). */
|
|
@@ -132,9 +153,11 @@ function remainingAmount(n: number): string {
|
|
|
132
153
|
|
|
133
154
|
/**
|
|
134
155
|
* 구속 조건 규칙(RES-FLOOR-BINDING) — 메모리·CPU·I/O·슬롯·게이트 예약 중 «남은 비율 최소»인 축이 흐름을 묶는다.
|
|
135
|
-
* 못 잰 축(하트비트 없는 호스트 · 용량 못 잼 · 하트비트에 PSI 가 없는 I/O ·
|
|
156
|
+
* 못 잰 축(하트비트 없는 호스트 · 용량 못 잼 · 하트비트에 PSI 가 없는 I/O · 게이트 CPU 못 잼)은 후보에서 뺀다
|
|
136
157
|
* — «넉넉»으로도 «바닥»으로도 읽지 않는다.
|
|
137
|
-
*
|
|
158
|
+
* 게이트 예약의 남은 비율 = (스케줄 가능 CPU − 샤드가 쥔 CPU) / 스케줄 가능 CPU. 샤드가 아직 노드에 안 붙었으면 0
|
|
159
|
+
* (하니스 Pod 는 들어가지 않는다 · `harnessCpuSlotsBesideGate` 와 같은 규칙).
|
|
160
|
+
* 측정 축이 하나도 없으면 null. 동율은 정해진 순서(호스트 순 메모리→CPU→I/O, 그 다음 슬롯, 그 다음 게이트 예약)의 첫 축이 이긴다.
|
|
138
161
|
*/
|
|
139
162
|
export function bindingResource(s: OverviewSnapshot): ResourceBinding | null {
|
|
140
163
|
const candidates: ResourceBinding[] = [];
|
|
@@ -161,6 +184,16 @@ export function bindingResource(s: OverviewSnapshot): ResourceBinding | null {
|
|
|
161
184
|
const total = capacity.podTarget + capacity.localMax;
|
|
162
185
|
candidates.push({ kind: 'slots', label: '슬롯', remainingRatio: ratio01(capacity.free / total), remainingText: `${capacity.free}/${total}자리` });
|
|
163
186
|
}
|
|
187
|
+
for (const pod of s.machines.pods) {
|
|
188
|
+
const gate = pod.gate?.value;
|
|
189
|
+
if (!gate || gate === 'none') continue;
|
|
190
|
+
const total = gate.schedulableMillicores;
|
|
191
|
+
if (!Number.isFinite(total) || total <= 0 || !Number.isFinite(gate.reservedMillicores)) continue;
|
|
192
|
+
const remaining = gate.unbound > 0 ? 0 : Math.max(0, total - gate.reservedMillicores);
|
|
193
|
+
const unbound = gate.unbound > 0 ? ` · 미배치 ${gate.unbound}` : '';
|
|
194
|
+
candidates.push({ kind: 'gate', label: `${pod.context} 게이트 예약`, remainingRatio: ratio01(remaining / total),
|
|
195
|
+
remainingText: `${remainingAmount(remaining)}/${total.toFixed(0)}밀리코어(게이트 샤드 ${gate.jobs} · 예약 ${remainingAmount(gate.reservedMillicores)}${unbound})` });
|
|
196
|
+
}
|
|
164
197
|
let binding: ResourceBinding | null = null;
|
|
165
198
|
for (const c of candidates) if (binding === null || c.remainingRatio < binding.remainingRatio) binding = c;
|
|
166
199
|
return binding;
|
|
@@ -255,7 +288,10 @@ export function unmeasuredCells(s: OverviewSnapshot): string[] {
|
|
|
255
288
|
visit('tasks.byOwner', s.tasks.byOwner); visit('tasks.done', s.tasks.done);
|
|
256
289
|
visit('tasks.launchable', s.tasks.launchable); visit('tasks.capacity', s.tasks.capacity);
|
|
257
290
|
for (const h of s.machines.hosts) visit(`machines.${h.name}`, h.load);
|
|
258
|
-
for (const p of s.machines.pods)
|
|
291
|
+
for (const p of s.machines.pods) {
|
|
292
|
+
visit(`pods.${p.context}`, p.occupied);
|
|
293
|
+
if (p.gate) visit(`pods.${p.context}.gate`, p.gate);
|
|
294
|
+
}
|
|
259
295
|
visit('machines.parents', s.machines.parents); visit('landings', s.landings);
|
|
260
296
|
if (s.throughput) visit('throughput', s.throughput);
|
|
261
297
|
if (s.schedulerMetrics) visit('schedulerMetrics', s.schedulerMetrics);
|
package/src/policy/llm-policy.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { isScalar, parseDocument } from 'yaml';
|
|
|
4
4
|
import { getElanousConfigDir } from '../elanous-config-dir.js';
|
|
5
5
|
import { DEFAULT_FALLBACK_CHAIN, isFallbackStep, type FallbackStep } from '../oauth/fallback-chain.js';
|
|
6
6
|
import { isCodexQuotaPolicy } from '../oauth/codex-quota-policy.js';
|
|
7
|
-
import { DEFAULT_BUDGET_GATE_MAX_USED_PERCENT, MODEL_ROLES, RUNTIME_LLM_PROVIDER_NAMES, parseRoleLlmEntry, parseSubscriptionReviewerSpec, type RoleLlmConfig, type SubscriptionReviewerSpec } from '../user-config.js';
|
|
7
|
+
import { DEFAULT_BUDGET_GATE_MAX_USED_PERCENT, MODEL_ROLES, RUNTIME_LLM_PROVIDER_NAMES, parseReviewerMixSpec, parseRoleLlmEntry, parseSubscriptionReviewerSpec, type RoleLlmConfig, type SubscriptionReviewerSpec } from '../user-config.js';
|
|
8
8
|
|
|
9
9
|
export interface LlmPolicy {
|
|
10
10
|
version: 1;
|
|
@@ -106,6 +106,7 @@ export function validateLlmPolicy(input: unknown): LlmPolicyValidation {
|
|
|
106
106
|
&& nonempty(g.account) && positive(g.amount) && date(g.expires) && nonempty(g.source));
|
|
107
107
|
const roles = (v: unknown) => object(v) && Object.entries(v).every(([role, spec]) => role === 'reviewer'
|
|
108
108
|
? !!parseSubscriptionReviewerSpec(spec)
|
|
109
|
+
: role === 'reviewerMix' ? !!parseReviewerMixSpec(spec)
|
|
109
110
|
: MODEL_ROLES.some(r => r === role) && object(spec)
|
|
110
111
|
&& Object.keys(spec).every(k => ['provider', 'tier', 'model'].includes(k)) && parseRoleLlmEntry(spec).ok);
|
|
111
112
|
check(input, 'policy', {
|
|
@@ -209,6 +210,7 @@ export function loadLlmPolicy(opts: LoadLlmPolicyOptions = {}): LoadedLlmPolicy
|
|
|
209
210
|
if (Object.keys(base).length) overlay.default = base;
|
|
210
211
|
add('roleLlm', legacy.roleLlm, overlay, 'roles', v => object(v) && Object.entries(v).every(([r, spec]) => r === 'reviewer'
|
|
211
212
|
? !!parseSubscriptionReviewerSpec(spec)
|
|
213
|
+
: r === 'reviewerMix' ? !!parseReviewerMixSpec(spec)
|
|
212
214
|
: MODEL_ROLES.some(k => k === r) && parseRoleLlmEntry(spec).ok));
|
|
213
215
|
add('llm.fallbackChain', llm.fallbackChain, overlay, 'fallback', v => Array.isArray(v) && v.length > 0 && v.every(isFallbackStep) && new Set(v).size === v.length);
|
|
214
216
|
const codex: Obj = {};
|
|
@@ -134,7 +134,7 @@ function askMarkerCount(ask: string): number {
|
|
|
134
134
|
return (ask.match(/(?:^|\s)(?:불변식|경계|판정\s*신호|invariant|boundary|decision\s+signal)\s*:/gi) ?? []).length;
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
-
type EnhanceSelectionSource = 'opts' | 'env' | 'config-role' | 'fallback-child' | 'default';
|
|
137
|
+
type EnhanceSelectionSource = 'opts' | 'env' | 'config-role' | 'child' | 'fallback-child' | 'default';
|
|
138
138
|
const PLANNING_FALLBACK_REASONS = new Set(['quota-exhausted', 'quota-unmeasured', 'quota-unavailable', 'no-credential-source', 'expiring', 'credential-shape', 'credential-error', 'credential-unavailable', 'unavailable']);
|
|
139
139
|
export function normalizePlanningFallbackReason(value: unknown): string {
|
|
140
140
|
return typeof value === 'string' && PLANNING_FALLBACK_REASONS.has(value) ? value : 'unavailable';
|
|
@@ -153,7 +153,7 @@ export function selectEnhanceLlm(
|
|
|
153
153
|
const forwardedModelSource = env.ELANOUS_PROMPT_ENHANCE_MODEL_RELAY === 'pod' ? env.ELANOUS_PROMPT_ENHANCE_MODEL_SOURCE : undefined;
|
|
154
154
|
const modelSource: EnhanceSelectionSource = opts.model !== undefined ? 'opts'
|
|
155
155
|
: env.ELANOUS_PROMPT_ENHANCE_MODEL
|
|
156
|
-
? forwardedModelSource === 'config-role' || forwardedModelSource === 'fallback-child' || forwardedModelSource === 'default' ? forwardedModelSource : 'env'
|
|
156
|
+
? forwardedModelSource === 'config-role' || forwardedModelSource === 'child' || forwardedModelSource === 'fallback-child' || forwardedModelSource === 'default' ? forwardedModelSource : 'env'
|
|
157
157
|
: configuredModel !== undefined ? 'config-role' : 'default';
|
|
158
158
|
const model = opts.model ?? (env.ELANOUS_PROMPT_ENHANCE_MODEL || configuredModel || env.ELANOUS_PR_REVIEW_MODEL || tierModel('better'));
|
|
159
159
|
const envEffort = env.ELANOUS_PROMPT_ENHANCE_EFFORT;
|
|
@@ -176,7 +176,7 @@ export function selectEnhanceLlm(
|
|
|
176
176
|
export function selectPlanningLlm(
|
|
177
177
|
env: NodeJS.ProcessEnv = process.env,
|
|
178
178
|
config: UserConfig = getUserConfig(),
|
|
179
|
-
): { model: string | undefined; effort: 'low' | 'medium' | 'high'; modelSource: 'env' | 'config-role' | 'fallback-child' | 'default'; fallbackReason?: string; requestedModel?: string; requestedSource?: string } {
|
|
179
|
+
): { model: string | undefined; effort: 'low' | 'medium' | 'high'; modelSource: 'env' | 'config-role' | 'child' | 'fallback-child' | 'default'; fallbackReason?: string; requestedModel?: string; requestedSource?: string } {
|
|
180
180
|
const planning = config.roleLlm?.planning;
|
|
181
181
|
const envModel = env.ELANOUS_PROMPT_ENHANCE_MODEL;
|
|
182
182
|
const roleModel = !envModel && planning && (planning.model || planning.tier || planning.provider)
|
|
@@ -186,7 +186,7 @@ export function selectPlanningLlm(
|
|
|
186
186
|
const relayed = env.ELANOUS_PROMPT_ENHANCE_MODEL_RELAY === 'pod';
|
|
187
187
|
const forwardedSource = relayed ? env.ELANOUS_PROMPT_ENHANCE_MODEL_SOURCE : undefined;
|
|
188
188
|
const modelSource = envModel
|
|
189
|
-
? forwardedSource === 'config-role' || forwardedSource === 'fallback-child' || forwardedSource === 'default' ? forwardedSource : 'env'
|
|
189
|
+
? forwardedSource === 'config-role' || forwardedSource === 'child' || forwardedSource === 'fallback-child' || forwardedSource === 'default' ? forwardedSource : 'env'
|
|
190
190
|
: roleModel ? 'config-role' : 'default';
|
|
191
191
|
const envEffort = env.ELANOUS_PROMPT_ENHANCE_EFFORT;
|
|
192
192
|
const validEnvEffort = envEffort === 'low' || envEffort === 'medium' || envEffort === 'high' ? envEffort : undefined;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { bunNativePtyAvailable } from './bun-native-pty.js';
|
|
2
|
+
|
|
3
|
+
/** Keep the capability probe independent of PTY runtime initialization. */
|
|
4
|
+
export function ptyAvailable(): boolean {
|
|
5
|
+
if (bunNativePtyAvailable()) return true;
|
|
6
|
+
try { require.resolve('node-pty'); return true; } catch { return false; }
|
|
7
|
+
}
|