elanous 0.2.23 → 0.2.25
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/chunks/1027.a0f04663d24c2779.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +1 -0
- package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +36 -0
- package/apps/pwa/out/_next/static/chunks/1146.80d15ea7c6e6ee95.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1157.f08bf2b70915e176.js +148 -0
- package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1454-37fd16f479f5554a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8532.a86e99acf9b761cb.js → 1516.83dd2c1b86b4e507.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{89849432.9eaa2f4c9c010965.js → 16e57f67.3ea19e893461e611.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1505.5826671109111e75.js → 1743.563d3168e95825ef.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2528.3868070ef1be69f9.js +24 -0
- package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2697.76ca2ac3efef6f3b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +32 -0
- package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2846.d6a433b8663819a5.js +309 -0
- package/apps/pwa/out/_next/static/chunks/3143.257997a5f1ed79df.js +34 -0
- package/apps/pwa/out/_next/static/chunks/{5967-c0a80f8ffe5d4050.js → 3259-86f3be56e43eaf6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3309.364573ceedbdfd5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +287 -0
- package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5578.ac963634373b28c6.js → 4084.15ecaf4240bd9e77.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8438.ee7f0df3b3f6fcb4.js → 4204.a409ab6250c0f6a8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +8 -0
- package/apps/pwa/out/_next/static/chunks/4565-67e4c620597965c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7905.b230b9d06cb4ad5d.js → 4593.10f5b9bd702d4a6c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +104 -0
- package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{8569.b853a8daa8f31d12.js → 5081.a240b63fad28663a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2528.0af5c0e1fad88df6.js → 5408.377c8c543635b81f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9502-32c5dc22e8f120f5.js → 5492-e05e26a033ba80d2.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/5785-ea8d2c633b6688e3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/599-a914cc0468f56143.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +23 -0
- package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5974.360f8441eb0ac1ec.js → 6196.34d6b229079e9e28.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +77 -0
- package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +64 -0
- package/apps/pwa/out/_next/static/chunks/{ce383d63.d2ede338788ed18e.js → 65ebff95.081daeff622d238e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +2 -0
- package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{83cfc5c8.349535543c1548b6.js → 6def8a8e.c81f9ca41028eccf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2721.bc9a8f36bd85c07a.js → 7483.ba01c6c209b81bba.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{6702.ebbd165d5e4a4a14.js → 7752.5cbdd0b433c54af9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8925-2abfb48af477fb7f.js → 8085-1e5fce59500a2cc2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +226 -0
- package/apps/pwa/out/_next/static/chunks/{b4e12462-5fab4a813a63dadd.js → 83a80514-b897b64df43ce108.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +93 -0
- package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{8264.00e434fbd02e9311.js → 8578.dff22d988cc2b106.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +115 -0
- package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +41 -0
- package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +74 -0
- package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +94 -0
- package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7518.49161e8f5814abdb.js → 9311.24c8f5ea793253dd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9976.8f28864317639fe6.js → 94.4cfed21c0b781a06.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/949.1e7d45ccb71580aa.js +90 -0
- package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{0e3acd34.d42b2ef87fdf4234.js → 973cbf1b.3bbcf2b41548eca7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6571-926ddf024a6ad5df.js → 9917-9e26abc5f7772735.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9938.b23e4d4dfa0114cd.js +79 -0
- package/apps/pwa/out/_next/static/chunks/{740.90b31555290236a9.js → 9974.e77b4ff4884557b3.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{4c5e95ce.83e9b16add6fcd8c.js → ab4d57c2.e90bc2cb31949045.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-9360b1285b2a346e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f08f6529d09ffae1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-f000d54d258f9ef6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-ad3bd8084048bee4.js → page-b12149c51f7d04b1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-22f674e7e4c2c9d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8888733e40cea6d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-9717ec6964b92276.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-44eaad486bc98a45.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-97fa6cf3d34c7eb9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-305cd294e754906e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/{page-a648bc464c9dc754.js → page-dea4b795741126fd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-35e05d7450461a67.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-45889e7070d11126.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-16a2e893f83ae4d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-b2638013c0bf7dfd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-56888bc744e08dac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-c44f93a41167536f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-952c6ceec6d9de38.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-6d0202af568f4c63.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-1b810474507f3702.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-74366ae2693a7d95.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-4fb6fc34e20c07b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-e9502921f4f01b1f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-b6169ea2f09cf287.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-6a14333d1b1b3967.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-8c91a9a66c9ec90a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-48fb31810693c357.js → page-4e634c5b98fd4e93.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ed3070d637850548.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/{page-cb154acadb025414.js → page-b9cc8a10bc6078b4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/page-3d3fc73dd187ed52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-128458c8d86fbb5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-9c04dac0831c2bbb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-cf0c2b0183991d09.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-04de9ca6d52a3893.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-62527677bbc2fdc4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-9a2e09c4a311764c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-bfeb35d69e8b24bb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-89cb33bced824e4a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-b008aff96be56654.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-814394dcbae789b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-6a87325c87f09dd2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-6445ac4cbb8dd869.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-852170303c6cd755.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-087ceeb975ef272b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-97c7361cc2a19319.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-20162174b77f96cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-8c6901833f897496.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-05a4b2c9b91034aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{53746282.1be36038d1abd949.js → e117f801.e92bf10242653497.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/e87d89b9.2e71c0ae475d28a1.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{0673cc54.8e2ef1c23e49e190.js → f4dfbfc0.a69fb12f854882aa.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +1 -0
- package/apps/pwa/out/_next/static/css/72becfd42807b50d.css +1 -0
- package/apps/pwa/out/_next/static/{rfkMm4movqkqMebBrCXiR → dRS6lEhSRRBr1abbzp7fJ}/_buildManifest.js +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/catalog/models/openrouter/deepseek-v4-pro-0813.yaml +39 -0
- package/catalog/models/openrouter/deepseek-v4.1-flash.yaml +38 -0
- package/catalog/models/openrouter/glm-5.3-flash.yaml +35 -0
- package/catalog/providers/openrouter.yaml +2 -0
- package/graphs/implement-loop.yaml +31 -0
- package/graphs/ops/harness-gc.yaml +17 -0
- package/graphs/ops/recipes.yaml +3 -0
- package/graphs/overlays/README.md +1 -1
- package/graphs/overlays/stop-heal-ladder.yaml +105 -0
- package/graphs/release/release-loop.yaml +5 -5
- package/graphs/steward/recipes.yaml +4 -0
- package/graphs/steward/steward.yaml +10 -1
- package/package.json +1 -1
- package/scripts/add-api-key.sh +1 -1
- package/scripts/bench-report.ts +46 -1
- package/scripts/ci-typecheck-changed.ts +73 -14
- package/scripts/fleet/bedrock-pod-secret.ts +122 -0
- package/scripts/fleet/node-setup-linux.sh +97 -0
- package/scripts/fleet/node-setup.sh +11 -0
- package/scripts/fleet/zai-pod-secret.ts +86 -0
- package/scripts/land-global-checks.ts +3 -0
- package/scripts/measure-log-diet-2.ts +213 -0
- package/scripts/measure-tsc-affected-roots.ts +289 -0
- package/scripts/release-loop/auto-approve-node.ts +6 -0
- package/scripts/release-loop/gate-closure.ts +286 -0
- package/scripts/release-loop/gate-executor.ts +28 -0
- package/scripts/release-loop/gate-node.ts +333 -37
- package/scripts/release-loop/gate-partial.ts +34 -6
- package/scripts/release-loop/ops-upgrade-node.ts +63 -42
- package/scripts/release-loop/publish-node.ts +6 -0
- package/scripts/release-loop/resume-release.ts +46 -13
- package/scripts/release-loop/resume.ts +110 -4
- package/scripts/release-loop/unattended-release.ts +22 -7
- package/scripts/tsc-baseline-cache.ts +172 -0
- package/scripts/usage-rollup.ts +72 -6
- package/scripts/ux-sim.ts +30 -1
- package/skills/youtube-master/scripts/main.ts +4 -1
- package/skills/youtube-master/src/obsidian.ts +9 -0
- package/src/agent/run-context.ts +10 -0
- package/src/agent-mission/driver.ts +18 -3
- package/src/agent-mission/resource-ladder.ts +8 -3
- package/src/agent-mission/review-loop.ts +8 -2
- package/src/agent-substrate/acp-implementer.ts +146 -0
- package/src/agent-substrate/pr-reviewer.ts +60 -13
- package/src/agent-substrate/self-review-cli.ts +170 -15
- package/src/autopilot/mission-critique.ts +18 -5
- package/src/autopilot/mission-feasibility-negotiate.ts +11 -10
- package/src/autopilot/mission-trace.ts +12 -1
- package/src/autopilot/system-lookback-run.ts +16 -10
- package/src/bench/bench.ts +183 -0
- package/src/budget/cost-tier-advisor.ts +91 -0
- package/src/budget/fetchers/grok.ts +15 -5
- package/src/budget/llm-cost.ts +37 -5
- package/src/budget/shadow-arms.ts +77 -0
- package/src/budget/types.ts +10 -2
- package/src/budget/unified-usage.ts +256 -10
- package/src/cli/bench-cli.ts +34 -0
- package/src/cli/doctor-cli.ts +21 -0
- package/src/cli/friendly-errors.ts +113 -0
- package/src/cli/guardian-cli.ts +26 -1
- package/src/cli/image-cli.ts +101 -0
- package/src/cli/intake-cli.ts +3 -1
- package/src/cli/log-event-names.ts +4 -0
- package/src/cli/memory-cli.ts +182 -0
- package/src/cli/model-watch-cli.ts +4 -1
- package/src/cli/pr-cli.ts +62 -5
- package/src/cli/pr-land-overlap-evidence.ts +160 -12
- package/src/cli/pr-land-pod-shadow.ts +54 -0
- package/src/cli/release-cli.ts +27 -16
- package/src/cli/release-run-if-ready.ts +11 -0
- package/src/cli/resource-cli.ts +48 -0
- package/src/cli/retro-cli.ts +12 -3
- package/src/cli/rfc-status.ts +52 -2
- package/src/cli/seat-requests-cli.ts +25 -0
- package/src/cli/self-update.ts +104 -0
- package/src/cli/tasks-cli.ts +139 -10
- package/src/cli/usage-cli.ts +93 -8
- package/src/compact/verify-probe.ts +23 -3
- package/src/context-card/index.ts +50 -0
- package/src/control/control-status.ts +30 -1
- package/src/core-turn/run-goal-loop.ts +5 -4
- package/src/dashboard/ad-run-setup-bindings.ts +279 -0
- package/src/dashboard/index.ts +18 -276
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +4 -138
- package/src/dashboard/slash-runtime/shell-slash.ts +145 -0
- package/src/dashboard/stale-install-check.ts +11 -0
- package/src/debug/log-diet.ts +53 -10
- package/src/debug/log.ts +19 -1
- package/src/domains/morning-essential.ts +18 -3
- package/src/domains/release-tool.ts +43 -0
- package/src/error-report/report.ts +21 -4
- package/src/execution-loop/launch-gate.ts +158 -2
- package/src/fleet/host-doctor.ts +375 -0
- package/src/github/pr-labels.ts +1 -0
- package/src/goals/judge.ts +20 -6
- package/src/graph-runner/graph-cli.ts +42 -1
- package/src/graph-runner/runner.ts +176 -11
- package/src/graph-wizard/archetypes.ts +14 -8
- package/src/graph-wizard/generate.ts +77 -1
- package/src/grok/usage.ts +23 -2
- package/src/grok.ts +13 -7
- package/src/grounding/ref-index.ts +253 -0
- package/src/harness/dispatch-backpressure.ts +10 -2
- package/src/harness/harness-clean.ts +199 -78
- package/src/harness/harness-cli-command.ts +176 -52
- package/src/harness/harness-gc.ts +331 -0
- package/src/harness/harness-stop.ts +82 -10
- package/src/harness/harness-substrate-default.ts +142 -7
- package/src/harness/launch-registry.ts +6 -0
- package/src/harness/worktree-branch-prefix.ts +9 -0
- package/src/hq/fence.ts +187 -0
- package/src/hq/seats.ts +38 -22
- package/src/images/image-ledger.ts +179 -0
- package/src/index.ts +110 -186
- package/src/instance/child-scope.ts +32 -1
- package/src/instance/dev-project.ts +133 -0
- package/src/instance/resolve.ts +24 -0
- package/src/instance/spawn-elanous.ts +45 -0
- package/src/intake-plane/collect-github.ts +7 -2
- package/src/intake-plane/lens.ts +46 -4
- package/src/intake-plane/ref-prefetch.ts +110 -0
- package/src/intake-plane/requirement-funnel.ts +53 -1
- package/src/intelligence-map/catalog-feed.ts +119 -0
- package/src/intelligence-map/model-catalog.ts +72 -0
- package/src/intelligence-map/model-watch-intake.ts +40 -0
- package/src/intelligence-map/model-watch-mission.ts +14 -1
- package/src/llm/bedrock-eventstream.ts +215 -0
- package/src/llm/bedrock-provider.ts +114 -41
- package/src/llm/bedrock.ts +174 -28
- package/src/llm/open-weight-discipline.ts +21 -0
- package/src/llm/openrouter-byok-cost.ts +96 -0
- package/src/llm/openrouter-deepseek.ts +151 -0
- package/src/llm/openrouter-upstream-pins.config.ts +25 -0
- package/src/llm/zai-coding-plan.ts +700 -0
- package/src/llm.ts +91 -24
- package/src/loops/checker.ts +148 -9
- package/src/loops/orchestrator/resync-shadow.ts +34 -7
- package/src/maturity/feature-maturity.ts +3 -3
- package/src/model-tier/llm-tier-map.ts +9 -5
- package/src/models/prompts.ts +2 -1
- package/src/mss/logging/log-store.ts +58 -11
- package/src/nexus/api/http-server.ts +22 -0
- package/src/nexus/api/missions.ts +73 -2
- package/src/nexus/api/ops-api.ts +18 -0
- package/src/nexus/index.ts +7 -75
- package/src/nexus/tools-kind.ts +78 -0
- package/src/oauth/codex-account-rotation.ts +43 -3
- package/src/oauth/codex-account-store.ts +339 -27
- package/src/oauth/codex-quota-policy.ts +33 -4
- package/src/oauth/fallback-chain.ts +53 -15
- package/src/onboarding/first-run.ts +37 -18
- package/src/onboarding/web-first.ts +20 -2
- package/src/ops/machine-heartbeat.ts +185 -0
- package/src/ops/overview-cache.ts +175 -0
- package/src/ops/overview.ts +8 -0
- package/src/preview/terminal.ts +15 -5
- package/src/project/project-store.ts +20 -0
- package/src/prompt-cache/openai.ts +3 -0
- package/src/prompt-cache/types.ts +5 -0
- package/src/prompt-enhance/enhance.ts +23 -0
- package/src/release-loop/auto-start.ts +7 -5
- package/src/release-loop/checklist.ts +11 -1
- package/src/release-loop/gate-shards.ts +4 -0
- package/src/release-loop/light-rc.ts +84 -13
- package/src/release-loop/merged-pr-checklist.ts +35 -5
- package/src/release-loop/placement.ts +16 -1
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/requirements/requirement-ledger.ts +536 -0
- package/src/retro/daily.ts +5 -5
- package/src/seat-loop/duty-ledger.ts +64 -0
- package/src/seat-loop/seat-loop.ts +32 -10
- package/src/self-dev/decompose.ts +37 -3
- package/src/self-dev/dev-cli.ts +44 -10
- package/src/self-dev/dev-pipeline.ts +39 -9
- package/src/self-dev/draft-residue.ts +27 -5
- package/src/self-dev/draft-sweep.ts +151 -0
- package/src/self-dev/fabric-decompose-adapter.ts +9 -2
- package/src/self-dev/graph-journey-route.ts +6 -0
- package/src/self-dev/orchestrate-cli.ts +25 -3
- package/src/self-dev/orchestrate.ts +41 -6
- package/src/self-dev/run-supervisor.ts +218 -15
- package/src/self-dev/run-types.ts +13 -0
- package/src/self-dev/supervisor-verdict-edges.ts +1 -0
- package/src/self-implement/budget-gate.ts +53 -13
- package/src/self-implement/child-context-composition.ts +139 -0
- package/src/self-implement/child-llm-preference.ts +13 -5
- package/src/self-implement/claude-acp-implement.ts +67 -0
- package/src/self-implement/flex-signals.ts +59 -0
- package/src/self-implement/frozen-merges.ts +8 -3
- package/src/self-implement/gate-cli.ts +29 -10
- package/src/self-implement/gate-remote.ts +4 -1
- package/src/self-implement/goal-author-decompose.ts +10 -2
- package/src/self-implement/goal-author.ts +36 -11
- package/src/self-implement/goal-new-paths.ts +42 -0
- package/src/self-implement/graph-overlay-condition.ts +28 -0
- package/src/self-implement/graph-overlay-yaml.ts +41 -7
- package/src/self-implement/graph-templates.ts +33 -1
- package/src/self-implement/graph-yaml.ts +56 -0
- package/src/self-implement/heal-intake.ts +5 -1
- package/src/self-implement/host-regate.ts +124 -30
- package/src/self-implement/importer-test-index.ts +3 -1
- package/src/self-implement/l8-merge-queue.ts +80 -2
- package/src/self-implement/merge-train.ts +19 -0
- package/src/self-implement/off-diff-evidence.ts +40 -1
- package/src/self-implement/orchestrator.ts +230 -32
- package/src/self-implement/premise-review.ts +159 -0
- package/src/self-implement/regate-detail.ts +79 -0
- package/src/self-implement/review-deferred-to-host.ts +21 -0
- package/src/self-implement/rework-budget-judgment.ts +23 -3
- package/src/self-implement/running-runs.ts +75 -5
- package/src/self-implement/scope-adjacency.ts +23 -0
- package/src/self-implement/seams.ts +89 -8
- package/src/self-implement/self-implement-cli.ts +9 -4
- package/src/self-implement/stop-autoheal.ts +69 -2
- package/src/session-runtime/retry-policy.ts +2 -1
- package/src/skills/tools/agent.ts +16 -1
- package/src/skills/tools/persistent-grounding.ts +11 -1
- package/src/skills/tools/shell.ts +33 -1
- package/src/steward/launch.ts +5 -4
- package/src/steward/rejudge-tick.ts +142 -0
- package/src/steward/triage-budget.ts +62 -0
- package/src/steward/triage.ts +83 -22
- package/src/task-agent/actions.ts +62 -5
- package/src/task-agent/board.ts +92 -3
- package/src/task-agent/card-evidence.ts +88 -1
- package/src/task-agent/completion-evidence.ts +5 -0
- package/src/task-agent/cover.ts +166 -3
- package/src/task-agent/judge.ts +16 -0
- package/src/task-agent/land-order-ledger.ts +95 -0
- package/src/task-agent/live-move-history.ts +87 -1
- package/src/task-agent/live-moves.ts +350 -20
- package/src/task-agent/parent-host.ts +27 -3
- package/src/task-agent/rejudge-on-head.ts +223 -24
- package/src/task-agent/review-prior-fix.ts +146 -0
- package/src/task-agent/review-result-capture.ts +3 -1
- package/src/task-agent/run-adopt.ts +136 -0
- package/src/task-agent/shadow.ts +65 -9
- package/src/task-agent/task-hand.ts +57 -7
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +38 -5
- package/src/task-orchestrator/surfaces/pod-bedrock-child.ts +74 -0
- package/src/task-orchestrator/surfaces/pod-child-default.ts +50 -0
- package/src/task-orchestrator/surfaces/pod-child-providers.ts +14 -1
- package/src/task-orchestrator/surfaces/pod-command-job.ts +14 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +79 -6
- package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +122 -0
- package/src/task-orchestrator/surfaces/pod-lease.ts +17 -5
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +11 -5
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +23 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +73 -4
- package/src/task-orchestrator/surfaces/pod-zai-child.ts +101 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +432 -35
- package/src/task-orchestrator/surfaces/self-implement.ts +19 -1
- package/src/typecheck-ratchet.ts +1 -0
- package/src/user-config.ts +69 -15
- package/src/ux-sim/fault-cred-expiry.ts +100 -0
- package/src/ux-sim/fault-pod-death.ts +74 -0
- package/src/ux-sim/fault-pool-cap.ts +81 -0
- package/src/version/packed-revision.json +1 -1
- package/src/webclone/qa-table.ts +22 -0
- package/src/workflow-runtime/triggers/registry.ts +59 -0
- package/src/workflow-runtime/triggers/webhook-source.ts +35 -5
- package/apps/pwa/out/_next/static/chunks/0a09e062-34f747a17d8d8c2e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1168.a0fb3d9db76c00bd.js +0 -77
- package/apps/pwa/out/_next/static/chunks/1325-dc3f3c21eb181cb4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1357.a843c41d2cd7ec31.js +0 -34
- package/apps/pwa/out/_next/static/chunks/1430.53f49882b17607c2.js +0 -24
- package/apps/pwa/out/_next/static/chunks/1459-be6509b3419d8a9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/153.0a4e3cd516930491.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1572.7bc291352e241a45.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1593-d07ad068c120dfb0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1608.b7c900baa56cab32.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1615-4d8156febaac4b35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1646.e03f0fbc26bc72f6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1669-da843ed73aa301f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/176.13ba0659e3e96fd4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1990.9c60f495ef33c070.js +0 -36
- package/apps/pwa/out/_next/static/chunks/2042e469.f86158dd5c1e51a1.js +0 -122
- package/apps/pwa/out/_next/static/chunks/2543-28ec6aeb80a5e1e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2561.43c99d6ee914ee6a.js +0 -62
- package/apps/pwa/out/_next/static/chunks/2638.b39ab2f674caa1a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/272-b23d2e92161d11fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2778.67e0c1d484189ccf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2841.10ff309f6a3168af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2886-9639f97d523d752a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2978.57fb87ce21cc5a85.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3664.15f968c39d15bd28.js +0 -149
- package/apps/pwa/out/_next/static/chunks/3786-935eb3fcde90e496.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3813.df4a01ae89c6f63f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3961-fbef064c213b2b18.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3992.f79c70480e8c4077.js +0 -309
- package/apps/pwa/out/_next/static/chunks/40-413e8641de9ed1e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4054-521f11a503daed64.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4315.e7356f34c7d8ec79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4489-bf629de6f04f7681.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4540.557733cc88c6a82b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/462.0275b4338c5b6337.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4658-7ed9266098a787e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4945-0f4046cfc3228ea3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5105-18b4165c5d3a86b0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5205-6992210fe31f45f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5287-72898b126d722457.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5313.1697309c532b9856.js +0 -2
- package/apps/pwa/out/_next/static/chunks/5474.991b90688c3cb321.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5544-871146192d095594.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5935.d5e8ca3e096772e8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6006.84e8b418a7a0db97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6013-1267ba7454d6764b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6038-1e0f7ee1086da4cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/617.709dd0019fe99796.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6261.fb9bf94947094636.js +0 -74
- package/apps/pwa/out/_next/static/chunks/6411.1966866fae31ffa9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6481-b829d99aa8d158f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6541.2b7daa043100d0fa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6597.2d7a6d77ab485b27.js +0 -64
- package/apps/pwa/out/_next/static/chunks/67.5dd2dc543c2fa3de.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6777-312496b0d774719b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/681.0116f7036cfb4e8d.js +0 -32
- package/apps/pwa/out/_next/static/chunks/6871.30b2bf23b3126e36.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6882.737d366d54e29d83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7035.54c2c535164b1c9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7086-8bfa7e8f796a03d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7126.5e5599f251726b67.js +0 -93
- package/apps/pwa/out/_next/static/chunks/7203-47ff0740a293e284.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7268.017f49dafb5f0ff3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7355.5d65a87e9567ae08.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7392.4018c2a62177f296.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7471.3a3d1be50559cfb8.js +0 -148
- package/apps/pwa/out/_next/static/chunks/7500.73489a345cef2201.js +0 -226
- package/apps/pwa/out/_next/static/chunks/7565.c2f72a15c1ed0396.js +0 -27
- package/apps/pwa/out/_next/static/chunks/7651.6d1c984d3d8587a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7713.7ab863ed59b2d661.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7793.d7cd2026767ddd54.js +0 -115
- package/apps/pwa/out/_next/static/chunks/7837.c7c267e5dceadb11.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7891.09266382daf70d1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7990-cbf6a01bcbdcb7e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8119-819c549e0c197786.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8186-74ea19a3700d04a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8267-e7b3262b735ae106.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8386.86518e55b75f7cf5.js +0 -8
- package/apps/pwa/out/_next/static/chunks/8437.ba6eeeb29590042f.js +0 -23
- package/apps/pwa/out/_next/static/chunks/8469-1500be57e582296f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8483-7164cecdaf178ca6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8722-4c940f02c496ad36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/887-41d0dcf5af48c628.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9039.da86361496797522.js +0 -90
- package/apps/pwa/out/_next/static/chunks/905.d5745a25884754d4.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9089-d909f3d4478b0628.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9096.dc5c7a267f83790c.js +0 -41
- package/apps/pwa/out/_next/static/chunks/93.a567257b6bdb7fe4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9320.419acb9665b46597.js +0 -287
- package/apps/pwa/out/_next/static/chunks/9356.b8ceda6634612ff8.js +0 -79
- package/apps/pwa/out/_next/static/chunks/94.e9e1043b35cd3eed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9400-7498ea90b2e6ee8f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9930-58644af9c813d6e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9932.367cf4725fedd6e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9935.1628b904cdc8ce0e.js +0 -104
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-a2aa8709d193ee0d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d5341ac96203a983.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-0160ab83c8685a12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-55c631c032dcc47e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-e6784759a2531031.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-5c5d0e370f495ef6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-c325e21543cd48a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-6168a7c43e6ef8f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-31417d3604154a6d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-e9606dc0bdec9305.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-25bb425afdb27541.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-32d72fdef1afe11a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-d27b794c8ba76bbb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-a2aa8709d193ee0d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-2bd9ce9c020d02d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a34096245e63b9f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-22170f4f00a15496.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-4cc66d22ca4ec502.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-83b14c729fcea837.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-6e2781c523dad761.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-26dd415c8f13f341.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-ccdb83ed40c8d724.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-7ad3de8fa06fdea9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-015c02c4fec4023e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-6b0ae5b5c42f6d2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-786111f30b6f0969.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e17cce5e2ed0fee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-16258e956ea93fc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-c2dd2b19c93f90ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-85f35dd1dd96ae87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-d3c007c8a0ddd7ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-7837ce2aacb97b04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7350ee93f4fe1033.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-00723458575f2b19.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-a2aa8709d193ee0d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-745d9b6c015076f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-736d33c7414a8a1a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-119be9a0444d2482.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-fa806c018833e332.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-c782041b5f5199ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-d431fbdea6ad93dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-0c056abff82b9891.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-242d668e4fbf72c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-847c3de6ca8a4416.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-81dd0d8ae923ed72.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-74e69ba2c8e970d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-70038f41ae7cf931.js +0 -1
- package/apps/pwa/out/_next/static/chunks/cd39fa05.fac4545f42a3ef70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-b2763b10dc6b3836.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-27893e93b0ec193d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-f280047194e1daf8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-e90eff2d0b70564c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-70f2d654b3435d34.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-4794f053bd5e4230.js +0 -1
- package/apps/pwa/out/_next/static/css/5619d59e87eddf66.css +0 -1
- /package/apps/pwa/out/_next/static/{rfkMm4movqkqMebBrCXiR → dRS6lEhSRRBr1abbzp7fJ}/_ssgManifest.js +0 -0
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// ── 런 슈퍼바이저 — 「끝까지 돌린다」를 «판정»으로 만든다 ───────────────────────
|
|
2
2
|
|
|
3
|
-
import { hasDelivered, triageRun, type FailureClassification } from './orchestrate.js';
|
|
3
|
+
import { hasDelivered, resumeKey, triageRun, type FailureClassification } from './orchestrate.js';
|
|
4
4
|
import type { DeployVerifyFinding } from '../harness/browser-verify.js';
|
|
5
|
-
import type { SelfDevJobResult, SupervisorStopReason, SupervisorNext } from './run-types.js';
|
|
5
|
+
import type { SelfDevJobResult, SupervisorStopReason, SupervisorNext, ReviewRework } from './run-types.js';
|
|
6
|
+
import { authorRepairGoal } from '../harness/helper-repair.js';
|
|
6
7
|
export type { SupervisorStopReason } from './run-types.js';
|
|
7
8
|
import { recordSelfDevRunSupervisorStop, selfDevRunsDir } from './run-store.js';
|
|
8
9
|
import { debug } from '../debug/log.js';
|
|
@@ -23,6 +24,40 @@ export interface SupervisorRound {
|
|
|
23
24
|
base?: string;
|
|
24
25
|
actionable: number;
|
|
25
26
|
reviewMustFixTrend?: SupervisorDecision['reviewMustFixTrend'];
|
|
27
|
+
signatures?: Record<string, string>;
|
|
28
|
+
oscillationRepairTaskIds?: string[];
|
|
29
|
+
/** Feature of each `oscillationRepairTaskIds` entry (same index) — reruns that mint a new taskId per round keep the goal. */
|
|
30
|
+
oscillationRepairFeatures?: string[];
|
|
31
|
+
/** Authored repair goal texts of that round, by taskId. */
|
|
32
|
+
oscillationRepairGoals?: Record<string, string>;
|
|
33
|
+
/** Tasks whose one main-sync relaunch this round used. */
|
|
34
|
+
mainSyncRelaunchTaskIds?: string[];
|
|
35
|
+
/** Original feature and relaunch goal text of those tasks — a rerun may mint a new taskId, so the piece is also found by goal. */
|
|
36
|
+
mainSyncRelaunchFeatures?: string[];
|
|
37
|
+
/**
|
|
38
|
+
* Tasks of this round that ended `status=failed` without a PR. Omitted when there are none — and on older
|
|
39
|
+
* history, which never measured it, so the no-PR streak guard reads it as «not measured» and stays off.
|
|
40
|
+
*/
|
|
41
|
+
noPrTaskIds?: string[];
|
|
42
|
+
/**
|
|
43
|
+
* Piece key (normalized feature — {@link noPrStreakKey}) of each `noPrTaskIds` entry, same index. A rework round mints a
|
|
44
|
+
* new taskId for the same piece (run-27b03878: task:1ded008a8aeb → task:f54a6e6fca25 → task:fade5a6931a4), so the no-PR
|
|
45
|
+
* streak pairs rounds by this key. Omitted on older history — the guard then pairs by taskId as before.
|
|
46
|
+
*/
|
|
47
|
+
noPrFeatureKeys?: string[];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Failed without a PR — a result that carries either a PR number or a PR URL has one (fixtures and older producers set only one). */
|
|
51
|
+
function failedWithoutPr(result: SupervisorJobResult): boolean {
|
|
52
|
+
return result.status === 'failed' && result.prNumber === undefined && !result.prUrl;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* «Same piece» key for the no-PR streak guard: the feature text with whitespace collapsed, lower-cased and trailing
|
|
57
|
+
* punctuation dropped. Empty when the result carries no feature — the caller then falls back to the taskId.
|
|
58
|
+
*/
|
|
59
|
+
export function noPrStreakKey(feature: unknown): string {
|
|
60
|
+
return typeof feature === 'string' ? resumeKey(feature).replace(/[\s.,;:!?。…·]+$/u, '') : '';
|
|
26
61
|
}
|
|
27
62
|
|
|
28
63
|
export const SUPERVISOR_STOP_REASONS = [
|
|
@@ -39,6 +74,7 @@ export const SUPERVISOR_STOP_REASONS = [
|
|
|
39
74
|
'step-timeout',
|
|
40
75
|
'decomposable-no-progress',
|
|
41
76
|
'review-unobserved',
|
|
77
|
+
'review-oscillating',
|
|
42
78
|
'deliverable-unobserved',
|
|
43
79
|
'deliverable-merged',
|
|
44
80
|
] as const satisfies readonly SupervisorStopReason[];
|
|
@@ -69,12 +105,18 @@ export interface SupervisorDecision {
|
|
|
69
105
|
reworkable: string[];
|
|
70
106
|
decomposable: string[];
|
|
71
107
|
repairable: string[];
|
|
108
|
+
/** Pieces whose main sync is blocked for the first time — relaunched on the latest main instead of waiting for a human. */
|
|
109
|
+
relaunchOnMain: string[];
|
|
110
|
+
/** Relaunch goal by taskId for the `relaunchOnMain` pieces that kept a branch; the rerun receives these as `repairGoals`. */
|
|
111
|
+
relaunchGoals?: Record<string, string>;
|
|
72
112
|
needsHuman: string[];
|
|
73
113
|
classifications: FailureClassification[];
|
|
74
114
|
deliverableObservation: 'not-attempted' | 'failed' | 'observed';
|
|
75
115
|
deliverableUnmeasured: boolean;
|
|
76
116
|
deliverableMergeCompleteness: 'unmeasured' | 'complete' | 'incomplete';
|
|
77
|
-
reviewMustFixTrend: '
|
|
117
|
+
reviewMustFixTrend: ReviewRework['trend'];
|
|
118
|
+
oscillation?: { taskIds: string[]; helper: 'review-oscillation'; signature: string; repairGoals?: Record<string, string>; heldTaskIds?: string[] };
|
|
119
|
+
pendingDecision?: 'attempt-care-escalation';
|
|
78
120
|
}
|
|
79
121
|
|
|
80
122
|
export interface SupervisorLimits {
|
|
@@ -127,7 +169,19 @@ function awaitingHumanStopWhy(classifications: readonly FailureClassification[])
|
|
|
127
169
|
}
|
|
128
170
|
|
|
129
171
|
function countActionable(t: ReturnType<typeof triageRun>): number {
|
|
130
|
-
return t.rerunnable.length + t.reworkable.length + t.decomposable.length + t.repairable.length;
|
|
172
|
+
return t.rerunnable.length + t.reworkable.length + t.decomposable.length + t.repairable.length + t.relaunchOnMain.length;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** The goal a main-sync relaunch runs: the same goal text under one head line naming the preserved branch. */
|
|
176
|
+
export function mainSyncRelaunchGoal(feature: string, branch: string): string {
|
|
177
|
+
return `참고 가지: ${branch} — 앞 런 구현. 최신 main 위에서 같은 의도를 다시 구현하되 이 가지의 diff 를 참고\n${feature}`;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** A piece gets one main-sync relaunch: spent when an earlier round recorded its task or its goal (original or relaunch text). */
|
|
181
|
+
function mainSyncRelaunchSpent(history: readonly SupervisorRound[]): (result: SelfDevJobResult) => boolean {
|
|
182
|
+
const taskIds = new Set(history.flatMap((entry) => entry.mainSyncRelaunchTaskIds ?? []));
|
|
183
|
+
const features = new Set(history.flatMap((entry) => entry.mainSyncRelaunchFeatures ?? []).map(resumeKey));
|
|
184
|
+
return (result) => taskIds.has(result.taskId) || features.has(resumeKey(result.feature));
|
|
131
185
|
}
|
|
132
186
|
|
|
133
187
|
type GoalPlanRevisionObservation = SelfDevJobResult['goalPlanRevision'];
|
|
@@ -172,6 +226,13 @@ export type SupervisorJobResult = SelfDevJobResult & {
|
|
|
172
226
|
next?: SupervisorNext;
|
|
173
227
|
};
|
|
174
228
|
|
|
229
|
+
export function aggregateReviewTrend(results: readonly SelfDevJobResult[]): ReviewRework['trend'] | undefined {
|
|
230
|
+
const trends = results.flatMap((result) => result.rework ? [result.rework.trend] : []);
|
|
231
|
+
if (!trends.length) return undefined;
|
|
232
|
+
const severity: readonly ReviewRework['trend'][] = ['unmeasured', 'improving', 'stable', 'worsening', 'oscillating'];
|
|
233
|
+
return severity[Math.max(...trends.map((trend) => severity.indexOf(trend)))];
|
|
234
|
+
}
|
|
235
|
+
|
|
175
236
|
export function decideNextRun(input: {
|
|
176
237
|
results: readonly SupervisorJobResult[];
|
|
177
238
|
history?: readonly SupervisorRound[];
|
|
@@ -181,7 +242,9 @@ export function decideNextRun(input: {
|
|
|
181
242
|
reviewed?: boolean;
|
|
182
243
|
reviewReason?: string;
|
|
183
244
|
deliverableMerge?: { readonly expected: number; readonly merged: number };
|
|
184
|
-
reviewMustFixTrend?: '
|
|
245
|
+
reviewMustFixTrend?: ReviewRework['trend'];
|
|
246
|
+
/** True: the rerun consumes the authored goal. False: it cannot, so oscillation stops for a human. Undefined: pure decision. */
|
|
247
|
+
repairGoalExecution?: boolean;
|
|
185
248
|
}): SupervisorDecision {
|
|
186
249
|
const results = [...input.results];
|
|
187
250
|
const history = [...(input.history ?? [])];
|
|
@@ -198,7 +261,16 @@ export function decideNextRun(input: {
|
|
|
198
261
|
const handedOffIds = new Set(handedOff.map((result) => result.taskId));
|
|
199
262
|
const deployFindings = input.deployFindings === undefined ? undefined
|
|
200
263
|
: new Map([...input.deployFindings].filter(([taskId]) => !handedOffIds.has(taskId)));
|
|
201
|
-
const t = triageRun(activeResults, deployFindings, observation === 'failed');
|
|
264
|
+
const t = triageRun(activeResults, deployFindings, observation === 'failed', undefined, mainSyncRelaunchSpent(history));
|
|
265
|
+
const relaunchGoals: Record<string, string> = Object.fromEntries(activeResults.flatMap((result) =>
|
|
266
|
+
t.relaunchOnMain.includes(result.taskId) && result.branch
|
|
267
|
+
? [[result.taskId, mainSyncRelaunchGoal(result.feature, result.branch)]] : []));
|
|
268
|
+
const noteMainSyncRelaunch = (): void => {
|
|
269
|
+
for (const taskId of t.relaunchOnMain) {
|
|
270
|
+
const branch = activeResults.find((result) => result.taskId === taskId)?.branch ?? null;
|
|
271
|
+
try { debug.log('self-dev.supervisor', 'merge-conflict-relaunch', { taskId, branch, attempt: 1 }); } catch { /* fail-open */ }
|
|
272
|
+
}
|
|
273
|
+
};
|
|
202
274
|
const round = history.length;
|
|
203
275
|
const landed = countLanded(results);
|
|
204
276
|
const baseCompleted = countBaseCompleted(results);
|
|
@@ -230,6 +302,8 @@ export function decideNextRun(input: {
|
|
|
230
302
|
reworkable: t.reworkable,
|
|
231
303
|
decomposable: t.decomposable,
|
|
232
304
|
repairable: t.repairable,
|
|
305
|
+
relaunchOnMain: t.relaunchOnMain,
|
|
306
|
+
...(Object.keys(relaunchGoals).length > 0 ? { relaunchGoals } : {}),
|
|
233
307
|
needsHuman: t.needsHuman,
|
|
234
308
|
classifications: t.classifications,
|
|
235
309
|
};
|
|
@@ -244,8 +318,10 @@ export function decideNextRun(input: {
|
|
|
244
318
|
};
|
|
245
319
|
}
|
|
246
320
|
|
|
247
|
-
|
|
248
|
-
|
|
321
|
+
// A first main-sync block is relaunched before it is judged harvestable; the spent ones stop for a human as before.
|
|
322
|
+
const harvestable = results.filter((result) => result.harvestable === true && !!result.branch
|
|
323
|
+
&& !t.relaunchOnMain.includes(result.taskId));
|
|
324
|
+
if (harvestable.length > 0 && t.relaunchOnMain.length === 0) {
|
|
249
325
|
return {
|
|
250
326
|
...base,
|
|
251
327
|
action: 'stop',
|
|
@@ -308,6 +384,7 @@ export function decideNextRun(input: {
|
|
|
308
384
|
&& t.reworkable.length === 0
|
|
309
385
|
&& t.decomposable.length === 0
|
|
310
386
|
&& t.repairable.length === 0
|
|
387
|
+
&& t.relaunchOnMain.length === 0
|
|
311
388
|
) {
|
|
312
389
|
return {
|
|
313
390
|
...base,
|
|
@@ -335,7 +412,7 @@ export function decideNextRun(input: {
|
|
|
335
412
|
}
|
|
336
413
|
|
|
337
414
|
// Only stop when every candidate for the next round is blocked by observed quota exhaustion.
|
|
338
|
-
const retryIds = [...new Set([...t.rerunnable, ...t.reworkable, ...t.decomposable, ...t.repairable])];
|
|
415
|
+
const retryIds = [...new Set([...t.rerunnable, ...t.reworkable, ...t.decomposable, ...t.repairable, ...t.relaunchOnMain])];
|
|
339
416
|
if (retryIds.length > 0 && retryIds.every((taskId) => results.some((result) =>
|
|
340
417
|
result.taskId === taskId && result.providerErrors?.category === 'quota'))) {
|
|
341
418
|
const failures = results.filter((result) => retryIds.includes(result.taskId));
|
|
@@ -375,7 +452,7 @@ export function decideNextRun(input: {
|
|
|
375
452
|
}
|
|
376
453
|
// 🩸 2026-09-24 🅕: 결말을 가른 것은 공급자 오류 수가 아니라 «리뷰가 시간 안에 판정을 냈나»였다(n=3 · step-timeout 0·1·2
|
|
377
454
|
// 가 결말과 같은 순서). 제자리의 원인이 단계 시간 초과면 «골을 의심하라» 대신 그 이름을 댄다.
|
|
378
|
-
const stalledRetryIds = [...new Set([...t.rerunnable, ...t.reworkable, ...t.decomposable, ...t.repairable])];
|
|
455
|
+
const stalledRetryIds = [...new Set([...t.rerunnable, ...t.reworkable, ...t.decomposable, ...t.repairable, ...t.relaunchOnMain])];
|
|
379
456
|
const timedOut = results.filter((result) => stalledRetryIds.includes(result.taskId) && result.stage === 'timed-out');
|
|
380
457
|
if (stalledRetryIds.length > 0 && timedOut.length === stalledRetryIds.length) {
|
|
381
458
|
const providerNote = timedOut.some((result) => result.providerErrors)
|
|
@@ -397,6 +474,95 @@ export function decideNextRun(input: {
|
|
|
397
474
|
}
|
|
398
475
|
}
|
|
399
476
|
|
|
477
|
+
// AUT-NO-PROGRESS-RETRY-LOOP — 같은 후보가 PR 없이 두 라운드 연속 실패하면 세 번째 Pod 를 띄우지 않는다
|
|
478
|
+
// (부검 run-1166bcd1 · run-1bde4815 · run-427bd632 · run-46a02f42). 직전 라운드가 noPrTaskIds 를 안 쟀으면 서지 않는다.
|
|
479
|
+
// 호출자가 stallRounds 를 기본보다 늘렸으면(제자리 인내를 늘림) 서지 않는다 — 0.2.24 컷 회귀(orchestrate-cli.test 라운드 상한 둘).
|
|
480
|
+
// NO-PR-STREAK-FEATURE-KEY — 짝은 taskId 가 아니라 «같은 조각»(noPrFeatureKeys)으로 맞춘다: rework 가 라운드마다 taskId 를
|
|
481
|
+
// 새로 만들어 taskId 짝은 운영에서 한 번도 안 섰다(run-27b03878). 키를 안 잰 옛 원장·feature 없는 결과는 taskId 로(fail-open).
|
|
482
|
+
const previousNoPr = history.at(-1)?.noPrTaskIds;
|
|
483
|
+
const previousNoPrKeys = history.at(-1)?.noPrFeatureKeys;
|
|
484
|
+
if (previousNoPr !== undefined && retryIds.length > 0 && stallRounds <= DEFAULT_STALL_ROUNDS) {
|
|
485
|
+
const failedNoPr = (taskId: string) => activeResults.find((result) => result.taskId === taskId && failedWithoutPr(result));
|
|
486
|
+
const keyOf = (taskId: string): string => noPrStreakKey(activeResults.find((result) => result.taskId === taskId)?.feature);
|
|
487
|
+
const pairedBy = (taskId: string): 'feature-key' | 'task-id' =>
|
|
488
|
+
previousNoPrKeys !== undefined && keyOf(taskId) !== '' ? 'feature-key' : 'task-id';
|
|
489
|
+
const sameAsPrevious = (taskId: string): boolean => pairedBy(taskId) === 'feature-key'
|
|
490
|
+
? previousNoPrKeys!.includes(keyOf(taskId))
|
|
491
|
+
: previousNoPr.includes(taskId);
|
|
492
|
+
const streak = retryIds.every((taskId) => sameAsPrevious(taskId) && failedNoPr(taskId) !== undefined);
|
|
493
|
+
if (streak && !madeProgress(history.at(-1), thisRound)) {
|
|
494
|
+
const errors = retryIds.flatMap((taskId) => {
|
|
495
|
+
const message = failedNoPr(taskId)?.error?.message;
|
|
496
|
+
return message ? [message.slice(0, 200)] : [];
|
|
497
|
+
});
|
|
498
|
+
try { debug.log('self-dev.supervisor', 'no-pr-streak-stop', {
|
|
499
|
+
taskIds: retryIds, featureKeys: retryIds.map(keyOf), pairedBy: [...new Set(retryIds.map(pairedBy))], round, errors,
|
|
500
|
+
}); } catch { /* fail-open */ }
|
|
501
|
+
return {
|
|
502
|
+
...base,
|
|
503
|
+
action: 'stop',
|
|
504
|
+
stopReason: 'no-progress',
|
|
505
|
+
why: ['PR 없이 2라운드 연속 실패 — 같은 골 재시도 대신 골·불변식 개정 또는 hold', ...errors].join(' · '),
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
const preceding = history.at(-1);
|
|
511
|
+
const oscillating = activeResults.filter((result) => retryIds.includes(result.taskId) && result.rework
|
|
512
|
+
&& (result.rework.trend === 'oscillating'
|
|
513
|
+
|| !!result.rework.signature && preceding?.signatures?.[result.taskId] === result.rework.signature));
|
|
514
|
+
if (oscillating.length > 0) {
|
|
515
|
+
// Repaired = same taskId, explicit lineage (`oscillationRepairOf`), or a feature that IS an authored repair goal
|
|
516
|
+
// text (orchestrate runs it as the piece's feature) — never a mere shared original feature.
|
|
517
|
+
const isRepaired = (result: SupervisorJobResult): boolean => history.some((entry) =>
|
|
518
|
+
(entry.oscillationRepairTaskIds ?? []).some((id, index) => id === result.taskId || id === result.oscillationRepairOf
|
|
519
|
+
|| (entry.oscillationRepairFeatures?.[index] !== undefined && entry.oscillationRepairFeatures[index] === result.feature
|
|
520
|
+
&& Object.values(entry.oscillationRepairGoals ?? {}).includes(result.feature))));
|
|
521
|
+
// Per task: a task that already got its one oscillation repair is held for a human; a fresh one may get it.
|
|
522
|
+
const fresh = oscillating.filter((result) => !isRepaired(result));
|
|
523
|
+
const held = [...new Set(oscillating.filter(isRepaired).map((result) => result.taskId))];
|
|
524
|
+
const repairGoals: Record<string, string> = Object.fromEntries(fresh.flatMap((result) => {
|
|
525
|
+
const goal = result.prNumber && result.reviewMustFix?.length
|
|
526
|
+
? authorRepairGoal({ pr: result.prNumber, category: 'review-oscillation', originalRequest: result.feature,
|
|
527
|
+
mustFix: result.reviewMustFix }) : null;
|
|
528
|
+
return goal ? [[result.taskId, goal]] : [];
|
|
529
|
+
}));
|
|
530
|
+
// A caller that declares it cannot run the authored goal (false), or one that can but has no goal for every fresh
|
|
531
|
+
// oscillating task, would turn add-repair-task into a same-strategy relaunch — stop for a human instead.
|
|
532
|
+
// Undefined is the pure decision (caller unknown): it names the first repair as the goal contract asks.
|
|
533
|
+
const cannotRepair = fresh.length > 0 && (input.repairGoalExecution === false
|
|
534
|
+
|| (input.repairGoalExecution === true && fresh.some((result) => !repairGoals[result.taskId])));
|
|
535
|
+
const action = fresh.length === 0 || cannotRepair ? 'stop' : 'add-repair-task';
|
|
536
|
+
const taskIds = action === 'stop'
|
|
537
|
+
? [...new Set(oscillating.map((result) => result.taskId))]
|
|
538
|
+
: [...new Set(fresh.map((result) => result.taskId))];
|
|
539
|
+
const signatureOf = (results: readonly SupervisorJobResult[]): string => results.map((result) => result.rework!.signature).join(' · ') || '(서명 없음)';
|
|
540
|
+
const signature = oscillating.filter((result) => taskIds.includes(result.taskId)).map((result) => result.rework!.signature).join(' · ');
|
|
541
|
+
const withoutHeld = (ids: readonly string[]): string[] => ids.filter((id) => !held.includes(id));
|
|
542
|
+
try { debug.log('self-dev.supervisor', 'oscillation-seen', { taskIds, signature, trend: reviewMustFixTrend, action, ...(held.length ? { held } : {}) }); } catch { /* fail-open */ }
|
|
543
|
+
if (action === 'add-repair-task') noteMainSyncRelaunch();
|
|
544
|
+
return {
|
|
545
|
+
...base,
|
|
546
|
+
...(action === 'add-repair-task' && held.length > 0 ? {
|
|
547
|
+
rerunnable: withoutHeld(base.rerunnable), reworkable: withoutHeld(base.reworkable),
|
|
548
|
+
decomposable: withoutHeld(base.decomposable), repairable: withoutHeld(base.repairable),
|
|
549
|
+
needsHuman: [...new Set([...base.needsHuman, ...held])],
|
|
550
|
+
} : {}),
|
|
551
|
+
action,
|
|
552
|
+
...(action === 'stop' ? { stopReason: 'review-oscillating' as const } : {}),
|
|
553
|
+
oscillation: { taskIds, helper: 'review-oscillation', signature, ...(Object.keys(repairGoals).length ? { repairGoals } : {}),
|
|
554
|
+
...(action === 'add-repair-task' && held.length ? { heldTaskIds: held } : {}) },
|
|
555
|
+
pendingDecision: 'attempt-care-escalation',
|
|
556
|
+
why: fresh.length === 0
|
|
557
|
+
? `리뷰 진동 반복 — ${signatureOf(oscillating)} · 사람 결정 필요(같은 전략 재발사 금지)`
|
|
558
|
+
: cannotRepair
|
|
559
|
+
? `리뷰 진동 — ${signatureOf(oscillating)} · ${input.repairGoalExecution === false ? '이 감독 경로가 수리 골 실행을 선언하지 않았다(미선언 또는 불가)' : '수리 원문/PR 관측 불가'} · 사람 결정 필요(같은 전략 재발사 금지)`
|
|
560
|
+
: `리뷰 진동 — ${signatureOf(fresh)} · review-oscillation 수리 조각을 한 번 붙인다${input.repairGoalExecution === true ? '' : '(실행 배선 미선언 — 결정 칸만)'}${held.length ? ` · 이미 수리한 조각 ${held.join(', ')} 은 사람 결정 대기` : ''}`,
|
|
561
|
+
};
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
noteMainSyncRelaunch();
|
|
565
|
+
|
|
400
566
|
if (t.repairable.length > 0) {
|
|
401
567
|
return {
|
|
402
568
|
...base,
|
|
@@ -408,7 +574,7 @@ export function decideNextRun(input: {
|
|
|
408
574
|
return {
|
|
409
575
|
...base,
|
|
410
576
|
action: 'relaunch',
|
|
411
|
-
why: `다시 건다 — 그대로 재실행 ${t.rerunnable.length} · 재작업 ${t.reworkable.length} · 분해 ${t.decomposable.length} · 수리 ${t.repairable.length} · 라운드 ${round + 1}/${maxRounds}`,
|
|
577
|
+
why: `다시 건다 — 그대로 재실행 ${t.rerunnable.length} · 재작업 ${t.reworkable.length} · 분해 ${t.decomposable.length} · 수리 ${t.repairable.length}${t.relaunchOnMain.length > 0 ? ` · main 위 재발사 ${t.relaunchOnMain.length}` : ''} · 라운드 ${round + 1}/${maxRounds}`,
|
|
412
578
|
};
|
|
413
579
|
}
|
|
414
580
|
|
|
@@ -416,22 +582,47 @@ export function appendRound(
|
|
|
416
582
|
history: readonly SupervisorRound[],
|
|
417
583
|
results: readonly SupervisorJobResult[],
|
|
418
584
|
reviewMustFixTrend?: SupervisorDecision['reviewMustFixTrend'],
|
|
585
|
+
decision?: SupervisorDecision,
|
|
419
586
|
): SupervisorRound[] {
|
|
420
|
-
const t = triageRun(results.filter((result) => result.salvage !== 'launched'));
|
|
587
|
+
const t = triageRun(results.filter((result) => result.salvage !== 'launched'), undefined, false, undefined, mainSyncRelaunchSpent(history));
|
|
421
588
|
const baseCompleted = countBaseCompleted(results);
|
|
422
589
|
const base = roundBase(results);
|
|
590
|
+
const noPrResults = results.filter(failedWithoutPr);
|
|
591
|
+
const noPrTaskIds = noPrResults.map((result) => result.taskId);
|
|
592
|
+
const noPrFeatureKeys = noPrResults.map((result) => noPrStreakKey(result.feature));
|
|
423
593
|
return [...history, {
|
|
424
594
|
round: history.length,
|
|
425
595
|
landed: countLanded(results),
|
|
426
596
|
...(baseCompleted > 0 || base !== undefined ? { baseCompleted, ...(base === undefined ? {} : { base }) } : {}),
|
|
427
597
|
actionable: countActionable(t),
|
|
428
598
|
...(reviewMustFixTrend === undefined ? {} : { reviewMustFixTrend }),
|
|
599
|
+
...(results.some((result) => result.rework?.signature)
|
|
600
|
+
? { signatures: Object.fromEntries(results.filter((result) => result.rework?.signature).map((result) => [result.taskId, result.rework!.signature])) } : {}),
|
|
601
|
+
...(decision && decision.action !== 'stop' && decision.relaunchOnMain.length > 0 ? {
|
|
602
|
+
mainSyncRelaunchTaskIds: decision.relaunchOnMain,
|
|
603
|
+
mainSyncRelaunchFeatures: decision.relaunchOnMain.flatMap((id) => [
|
|
604
|
+
results.find((result) => result.taskId === id)?.feature,
|
|
605
|
+
decision.relaunchGoals?.[id],
|
|
606
|
+
].filter((feature): feature is string => feature !== undefined)),
|
|
607
|
+
} : {}),
|
|
608
|
+
...(decision?.action === 'add-repair-task' && decision.oscillation ? (() => {
|
|
609
|
+
// Each repaired task is recorded under its original goal feature and, when a rerun runs the authored goal as
|
|
610
|
+
// the piece's new feature (orchestrate), under that repair text too — so the repair's own oscillation stops.
|
|
611
|
+
const pairs = decision.oscillation.taskIds.flatMap((id) => {
|
|
612
|
+
const feature = results.find((result) => result.taskId === id)?.feature ?? '';
|
|
613
|
+
const repairGoal = decision.oscillation!.repairGoals?.[id];
|
|
614
|
+
return repairGoal === undefined ? [[id, feature]] : [[id, feature], [id, repairGoal]];
|
|
615
|
+
});
|
|
616
|
+
return { oscillationRepairTaskIds: pairs.map(([id]) => id!), oscillationRepairFeatures: pairs.map(([, feature]) => feature!),
|
|
617
|
+
...(decision.oscillation.repairGoals ? { oscillationRepairGoals: decision.oscillation.repairGoals } : {}) };
|
|
618
|
+
})() : {}),
|
|
619
|
+
...(noPrTaskIds.length > 0 ? { noPrTaskIds, noPrFeatureKeys } : {}),
|
|
429
620
|
}];
|
|
430
621
|
}
|
|
431
622
|
|
|
432
623
|
export interface SuperviseRunOptions {
|
|
433
624
|
initial: readonly SupervisorJobResult[];
|
|
434
|
-
rerun: (previous: readonly SupervisorJobResult[], invocation: { relaunch: true }) => Promise<readonly SupervisorJobResult[]>;
|
|
625
|
+
rerun: (previous: readonly SupervisorJobResult[], invocation: { relaunch: true; repairGoals?: Record<string, string> }) => Promise<readonly SupervisorJobResult[]>;
|
|
435
626
|
limits?: SupervisorLimits;
|
|
436
627
|
enrich?: (results: readonly SupervisorJobResult[]) => readonly SupervisorJobResult[];
|
|
437
628
|
onDecision?: (decision: SupervisorDecision) => void;
|
|
@@ -443,6 +634,8 @@ export interface SuperviseRunOptions {
|
|
|
443
634
|
runStore?: { runId?: string; operatorDir?: string; dir?: string; isolatedDir?: string };
|
|
444
635
|
observe?: (event: string, data: Record<string, unknown>) => void;
|
|
445
636
|
sweepPendingMerges?: typeof sweepFrozenMerges;
|
|
637
|
+
/** True only when rerun consumes `invocation.repairGoals`; omitted or false → a review oscillation stops for a human. */
|
|
638
|
+
repairGoalExecution?: boolean;
|
|
446
639
|
/**
|
|
447
640
|
* TASK-AGENT-SHADOW — 멈춤이 확정되면 판단부를 그림자로 부른다(기본 `recordTaskAgentShadowMove`).
|
|
448
641
|
* `false` 면 끈다. 던져도 런의 결말은 바뀌지 않는다(fail-soft).
|
|
@@ -512,6 +705,9 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
512
705
|
const decision = decideNextRun({
|
|
513
706
|
results,
|
|
514
707
|
history,
|
|
708
|
+
// Undeclared = cannot run the repair goal: an add-repair-task would otherwise be a same-strategy relaunch.
|
|
709
|
+
repairGoalExecution: opts.repairGoalExecution === true,
|
|
710
|
+
...(aggregateReviewTrend(results) ? { reviewMustFixTrend: aggregateReviewTrend(results) } : {}),
|
|
515
711
|
...(opts.limits ? { limits: opts.limits } : {}),
|
|
516
712
|
...(observed.deployFindings ? { deployFindings: observed.deployFindings } : {}),
|
|
517
713
|
deliverableObservation: observed.state,
|
|
@@ -616,8 +812,15 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
616
812
|
return results;
|
|
617
813
|
}
|
|
618
814
|
|
|
619
|
-
history = appendRound(history, results, decision.reviewMustFixTrend);
|
|
620
|
-
|
|
815
|
+
history = appendRound(history, results, decision.reviewMustFixTrend, decision);
|
|
816
|
+
// Tasks that already had their one oscillation repair are held for a human — they are not handed to the rerun,
|
|
817
|
+
// but their results stay in the round so the human hand-off (and the final review-oscillating stop) keeps them.
|
|
818
|
+
const held = decision.oscillation?.heldTaskIds ?? [];
|
|
819
|
+
const heldResults = results.filter((result) => held.includes(result.taskId));
|
|
820
|
+
const repairGoals = { ...decision.relaunchGoals, ...decision.oscillation?.repairGoals };
|
|
821
|
+
const rerunResults = await opts.rerun(held.length ? results.filter((result) => !held.includes(result.taskId)) : results,
|
|
822
|
+
{ relaunch: true, ...(Object.keys(repairGoals).length > 0 ? { repairGoals } : {}) });
|
|
823
|
+
results = [...rerunResults, ...heldResults.filter((heldResult) => !rerunResults.some((result) => result.taskId === heldResult.taskId))];
|
|
621
824
|
|
|
622
825
|
try {
|
|
623
826
|
opts.onRound?.(results);
|
|
@@ -63,6 +63,12 @@ export interface SelfDevGoal {
|
|
|
63
63
|
hotPaths?: string[];
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
+
export type ReviewRework = {
|
|
67
|
+
trend: 'unmeasured' | 'improving' | 'stable' | 'worsening' | 'oscillating';
|
|
68
|
+
signature: string;
|
|
69
|
+
rounds: number;
|
|
70
|
+
};
|
|
71
|
+
|
|
66
72
|
export interface SelfDevJobResult {
|
|
67
73
|
taskId: string;
|
|
68
74
|
feature: string;
|
|
@@ -115,6 +121,12 @@ export interface SelfDevJobResult {
|
|
|
115
121
|
/** Self review verdict bound to the PR head observed by the child; absent if either observation is missing. */
|
|
116
122
|
/** TA-LAND-MUSTFIX-ZERO — `mustFixCount` is the review's must-fix list length; absent = unknown (the land gate fails closed). */
|
|
117
123
|
selfReview?: { verdict: 'pass' | 'fail'; head: string; mustFixCount?: number };
|
|
124
|
+
/** Measured child review history; absence means not observed, not a negative oscillation result. */
|
|
125
|
+
rework?: ReviewRework;
|
|
126
|
+
/** taskId whose review-oscillation repair produced this result (explicit lineage across a new taskId). */
|
|
127
|
+
oscillationRepairOf?: string;
|
|
128
|
+
/** Verbatim final reviewer must-fix items for a bounded helper repair. */
|
|
129
|
+
reviewMustFix?: string[];
|
|
118
130
|
/** Whether the child review actually ran; omitted preserves legacy producers. */
|
|
119
131
|
reviewed?: boolean;
|
|
120
132
|
/** Why the child did not run review; omitted preserves legacy review-unobserved handling. */
|
|
@@ -172,6 +184,7 @@ export type SupervisorStopReason =
|
|
|
172
184
|
| 'step-timeout'
|
|
173
185
|
| 'decomposable-no-progress'
|
|
174
186
|
| 'review-unobserved'
|
|
187
|
+
| 'review-oscillating'
|
|
175
188
|
| 'deliverable-unobserved'
|
|
176
189
|
| 'deliverable-merged';
|
|
177
190
|
|
|
@@ -18,6 +18,7 @@ export const SUPERVISOR_VERDICT_EDGES = {
|
|
|
18
18
|
'step-timeout': { meaning: 'step budget exhausted', next: 'human-gate' },
|
|
19
19
|
'decomposable-no-progress': { meaning: 'stalled with a decomposition proposal', next: 'scope-decompose' },
|
|
20
20
|
'review-unobserved': { meaning: 'review was not observed', next: 'self-review' },
|
|
21
|
+
'review-oscillating': { meaning: 'review oscillation needs a human decision (its one repair is spent or cannot run here)', next: 'human-gate' },
|
|
21
22
|
'deliverable-unobserved': { meaning: 'deliverable was not observed', next: 'self-review' },
|
|
22
23
|
'deliverable-merged': { meaning: 'deliverable is merged', next: 'harvest' },
|
|
23
24
|
} as const satisfies Record<SupervisorStopReason, SupervisorVerdictEdge>;
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
// 회전·사용량 저장소·선호 해석은 기존 함수를 부른다. 여기선 다시 만들지 않는다.
|
|
3
3
|
|
|
4
4
|
import type { RotationCandidate } from '../oauth/codex-account-rotation.js';
|
|
5
|
-
import { inspectCodexRotation } from '../oauth/codex-account-store.js';
|
|
6
|
-
import { codexPolicyAllowsCredits } from '../oauth/codex-quota-policy.js';
|
|
5
|
+
import { DEFAULT_CODEX_CREDIT_RESERVE, inspectCodexRotation } from '../oauth/codex-account-store.js';
|
|
6
|
+
import { codexPolicyAllowsCredits, codexPolicyAllowsFallback } from '../oauth/codex-quota-policy.js';
|
|
7
7
|
import { getUsageStore } from '../budget/usage-store.js';
|
|
8
8
|
import type { UsageSnapshot } from '../budget/types.js';
|
|
9
9
|
import { debug } from '../debug/log.js';
|
|
@@ -35,7 +35,7 @@ export interface BudgetCodexCandidate {
|
|
|
35
35
|
|
|
36
36
|
export interface DecideBudgetInput {
|
|
37
37
|
readonly preference: {
|
|
38
|
-
readonly chain: readonly { readonly provider: string; readonly model?: string }[];
|
|
38
|
+
readonly chain: readonly { readonly provider: string; readonly model?: string; readonly codexCredits?: true }[];
|
|
39
39
|
readonly budgetGate: { readonly onShortfall: BudgetGateOnShortfall };
|
|
40
40
|
};
|
|
41
41
|
readonly codexCandidates: readonly BudgetCodexCandidate[];
|
|
@@ -44,6 +44,8 @@ export interface DecideBudgetInput {
|
|
|
44
44
|
readonly maxUsedPercent: BudgetGateMaxUsedPercent;
|
|
45
45
|
/** codex 한도 정책이 credits 인가(`codexPolicyAllowsCredits` · 회전·Pod 배분과 같은 해석). 없으면 false. */
|
|
46
46
|
readonly codexCreditsAllowed?: boolean;
|
|
47
|
+
/** SUBSCRIPTION-EXHAUST-REROUTE — `llm.codexCreditReserve`. 잔액이 이 값 «초과»인 계정만 크레딧 후보다. 없으면 종전(> 0). */
|
|
48
|
+
readonly codexCreditReserve?: number;
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
export interface BudgetDecision {
|
|
@@ -59,6 +61,13 @@ export interface BudgetInputs {
|
|
|
59
61
|
readonly grokUsedPercent: number | undefined;
|
|
60
62
|
readonly maxUsedPercent: BudgetGateMaxUsedPercent;
|
|
61
63
|
readonly codexCreditsAllowed?: boolean;
|
|
64
|
+
readonly codexCreditReserve?: number;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** `llm.codexCreditReserve` from the same config the preference was read from — invalid or absent = default. */
|
|
68
|
+
function budgetCreditReserve(config: ChildLlmPreferenceInput): number {
|
|
69
|
+
const raw = (config as { llm?: { codexCreditReserve?: unknown } }).llm?.codexCreditReserve;
|
|
70
|
+
return typeof raw === 'number' && Number.isFinite(raw) && raw >= 0 ? raw : DEFAULT_CODEX_CREDIT_RESERVE;
|
|
62
71
|
}
|
|
63
72
|
|
|
64
73
|
const WEEKLY_WINDOW_MINUTES = 7 * 24 * 60;
|
|
@@ -109,11 +118,15 @@ function codexCandidateUsable(candidate: BudgetCodexCandidate, cap: number | und
|
|
|
109
118
|
|
|
110
119
|
/** BUDGET-GATE(10-05) — 정책이 credits 면 구독 % 가 차도 크레딧 잔액이 «확인된» 계정으로 계속 간다(Pod 배분과 같은 결론).
|
|
111
120
|
* 잔액을 모르면 쓰지 않는다 — 크레딧은 돈이라 fail-closed. 잔액이 가장 큰 계정 하나를 돌려준다. */
|
|
112
|
-
function codexCreditCandidate(input: DecideBudgetInput): BudgetCodexCandidate | undefined {
|
|
113
|
-
|
|
121
|
+
function codexCreditCandidate(input: DecideBudgetInput, creditsStep = false): BudgetCodexCandidate | undefined {
|
|
122
|
+
// `codex-credits` 칸은 «체인이 거기까지 왔을 때»만 크레딧을 연다 — 정책(첫 칸)의 크레딧 금지와 별개다.
|
|
123
|
+
if (input.codexCreditsAllowed !== true && !creditsStep) return undefined;
|
|
124
|
+
// The credits step (new spend path) defaults to the reserve when none was passed — money, fail-closed; the policy path keeps > 0.
|
|
125
|
+
const floor = typeof input.codexCreditReserve === 'number' && Number.isFinite(input.codexCreditReserve) && input.codexCreditReserve >= 0
|
|
126
|
+
? input.codexCreditReserve : creditsStep && input.codexCreditsAllowed !== true ? DEFAULT_CODEX_CREDIT_RESERVE : 0;
|
|
114
127
|
return input.codexCandidates
|
|
115
128
|
.filter((candidate) => candidate.hasCredits !== false
|
|
116
|
-
&& typeof candidate.creditBalance === 'number' && Number.isFinite(candidate.creditBalance) && candidate.creditBalance >
|
|
129
|
+
&& typeof candidate.creditBalance === 'number' && Number.isFinite(candidate.creditBalance) && candidate.creditBalance > floor)
|
|
117
130
|
.sort((a, b) => (b.creditBalance! - a.creditBalance!) || (a.name < b.name ? -1 : a.name > b.name ? 1 : 0))[0];
|
|
118
131
|
}
|
|
119
132
|
|
|
@@ -121,7 +134,19 @@ function slotUsable(
|
|
|
121
134
|
provider: string,
|
|
122
135
|
input: DecideBudgetInput,
|
|
123
136
|
allowUnmeasured = false,
|
|
137
|
+
codexCreditsSlot = false,
|
|
124
138
|
): { usable: boolean; reason: string; unmeasured?: boolean } {
|
|
139
|
+
if (provider === CODEX_PROVIDER && codexCreditsSlot) {
|
|
140
|
+
// CODEX-CREDITS-STEP — 잔액이 «확인된» 계정만(모르면 못 쓴다 · 돈이라 fail-closed). 미측정 통과도 «없다».
|
|
141
|
+
const credit = codexCreditCandidate(input, true);
|
|
142
|
+
if (!credit) {
|
|
143
|
+
// 칸에 «닿았지만» 잔액 확인된 계정이 없다 — 실패한 도달도 남긴다.
|
|
144
|
+
try { debug.log('budget.gate', 'codex-credits-step', { outcome: 'skipped', why: 'codex-credits-unavailable' }); } catch { /* observation is fail-soft */ }
|
|
145
|
+
}
|
|
146
|
+
return credit
|
|
147
|
+
? { usable: true, reason: `codex-credits: ${credit.name} 크레딧 잔액 ${credit.creditBalance} (체인 마지막 칸 · 과금)` }
|
|
148
|
+
: { usable: false, reason: 'codex-credits: 잔액이 확인된 계정 없음' };
|
|
149
|
+
}
|
|
125
150
|
if (provider === CODEX_PROVIDER) {
|
|
126
151
|
const cap = capFor(input.maxUsedPercent, CODEX_PROVIDER);
|
|
127
152
|
const measuredUsable = input.codexCandidates.some((candidate) => codexCandidateUsable(candidate, cap));
|
|
@@ -139,16 +164,19 @@ function slotUsable(
|
|
|
139
164
|
}
|
|
140
165
|
if (provider === GROK_PROVIDER) {
|
|
141
166
|
const configured = capFor(input.maxUsedPercent, GROK_PROVIDER);
|
|
142
|
-
// 발사 관문은
|
|
143
|
-
// «못 쟀다»(undefined)는
|
|
167
|
+
// 발사 관문은 잰 주간 사용률에만 80% 상한을 적용한다.
|
|
168
|
+
// «못 쟀다»(undefined)는 allowUnmeasured 일 때 통과하고 unmeasured 를 남긴다(codex 와 같은 꼴).
|
|
169
|
+
// decideBudget 은 설정 상한을 그대로 쓰고 모름을 통과로 보지 않는다.
|
|
144
170
|
const cap = allowUnmeasured ? LAUNCH_GROK_USED_PERCENT_CAP : configured;
|
|
145
171
|
const known = typeof input.grokUsedPercent === 'number' && Number.isFinite(input.grokUsedPercent);
|
|
146
|
-
const
|
|
172
|
+
const measuredUsable = cap === undefined
|
|
147
173
|
? known
|
|
148
174
|
: known && (input.grokUsedPercent as number) < cap;
|
|
175
|
+
const unmeasured = allowUnmeasured && !known;
|
|
149
176
|
return {
|
|
150
|
-
usable,
|
|
177
|
+
usable: measuredUsable || unmeasured,
|
|
151
178
|
reason: formatGrokReason(input.grokUsedPercent, cap),
|
|
179
|
+
...(unmeasured ? { unmeasured: true } : {}),
|
|
152
180
|
};
|
|
153
181
|
}
|
|
154
182
|
return { usable: false, reason: `${provider}: 예산 판정 없음` };
|
|
@@ -176,13 +204,19 @@ function decideBudgetWithPolicy(input: DecideBudgetInput, allowUnmeasured: boole
|
|
|
176
204
|
let firstUnusable = false;
|
|
177
205
|
for (let index = 0; index < input.preference.chain.length; index++) {
|
|
178
206
|
const slot = input.preference.chain[index]!;
|
|
179
|
-
const judged = slotUsable(slot.provider, input, allowUnmeasured);
|
|
207
|
+
const judged = slotUsable(slot.provider, input, allowUnmeasured, slot.codexCredits === true);
|
|
180
208
|
reasons.push(judged.reason);
|
|
181
209
|
if (!judged.usable) {
|
|
182
210
|
if (index === 0) firstUnusable = true;
|
|
183
211
|
continue;
|
|
184
212
|
}
|
|
185
213
|
const action: BudgetAction = index === 0 || !firstUnusable ? 'proceed' : 'next-provider';
|
|
214
|
+
if (slot.codexCredits === true) {
|
|
215
|
+
try {
|
|
216
|
+
// 체인이 «마지막 칸»(유료)에 닿을 때마다 한 줄 — 앞 칸을 왜 못 썼나는 reasons 가 말한다(비밀 없음).
|
|
217
|
+
debug.log('budget.gate', 'codex-credits-step', { outcome: 'credits', action, reasons, launch: allowUnmeasured }, { level: 'warn' });
|
|
218
|
+
} catch { /* observation is fail-soft */ }
|
|
219
|
+
}
|
|
186
220
|
return {
|
|
187
221
|
decision: {
|
|
188
222
|
action,
|
|
@@ -230,8 +264,12 @@ export interface ReadBudgetInputsDeps {
|
|
|
230
264
|
/** 설정·codex 회전·grok 스냅숏을 읽어 판정 입력을 만든다. 판정 자체는 하지 않는다. */
|
|
231
265
|
export function readBudgetInputs(deps: ReadBudgetInputsDeps = {}): BudgetInputs {
|
|
232
266
|
const config = deps.config ?? deps.loadConfig?.() ?? loadLiveConfig();
|
|
233
|
-
const
|
|
267
|
+
const resolved = resolveChildLlmPreference(config);
|
|
234
268
|
const rotation = (deps.inspectCodex ?? inspectCodexRotation)();
|
|
269
|
+
// 정책 within-quota(한도 안에서만)는 크레딧을 «절대» 안 쓴다 — `codex-credits` 칸도 뺀다(회전·폴백 판정과 같은 해석).
|
|
270
|
+
const preference = rotation.policy && !codexPolicyAllowsFallback(rotation.policy.policy)
|
|
271
|
+
? { ...resolved, chain: resolved.chain.filter((slot) => slot.codexCredits !== true) }
|
|
272
|
+
: resolved;
|
|
235
273
|
const snapshot = deps.grokSnapshot
|
|
236
274
|
? deps.grokSnapshot()
|
|
237
275
|
: getUsageStore().getSnapshot('grok');
|
|
@@ -242,7 +280,9 @@ export function readBudgetInputs(deps: ReadBudgetInputsDeps = {}): BudgetInputs
|
|
|
242
280
|
grokUsedPercent: grokWeeklyUsedPercent(snapshot),
|
|
243
281
|
maxUsedPercent,
|
|
244
282
|
// 회전·Pod 배분과 같은 해석(`resolveCodexQuotaPolicy` → `codexPolicyAllowsCredits`)을 읽는다 — 다시 짓지 않는다.
|
|
245
|
-
...(rotation.policy && codexPolicyAllowsCredits(rotation.policy.policy) ? { codexCreditsAllowed: true
|
|
283
|
+
...(rotation.policy && codexPolicyAllowsCredits(rotation.policy.policy) ? { codexCreditsAllowed: true, codexCreditReserve: budgetCreditReserve(config) }
|
|
284
|
+
// CODEX-CREDITS-STEP — the `codex-credits` slot keeps the same reserve (a credit spend below it is the case the reserve exists for).
|
|
285
|
+
: preference.chain.some((slot) => slot.codexCredits === true) ? { codexCreditReserve: budgetCreditReserve(config) } : {}),
|
|
246
286
|
};
|
|
247
287
|
}
|
|
248
288
|
|