elanous 0.2.24 → 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-24282bf9f90031a5.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-dea4b795741126fd.js +1 -0
- 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-1d809a87139dd024.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-b92caddb5c715f30.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/{Q-7iofoxOEv1WX18S35of → dRS6lEhSRRBr1abbzp7fJ}/_buildManifest.js +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- 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/bench-report.ts +46 -1
- package/scripts/ci-typecheck-changed.ts +7 -5
- package/scripts/release-loop/auto-approve-node.ts +6 -0
- package/scripts/release-loop/gate-closure.ts +286 -0
- package/scripts/release-loop/gate-node.ts +73 -13
- 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 +37 -10
- package/scripts/release-loop/resume.ts +69 -4
- package/scripts/tsc-baseline-cache.ts +28 -3
- package/scripts/usage-rollup.ts +27 -13
- 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-substrate/acp-implementer.ts +14 -7
- package/src/agent-substrate/pr-reviewer.ts +30 -10
- package/src/agent-substrate/self-review-cli.ts +126 -10
- package/src/budget/cost-tier-advisor.ts +91 -0
- package/src/budget/shadow-arms.ts +77 -0
- package/src/budget/types.ts +5 -3
- package/src/budget/unified-usage.ts +172 -8
- package/src/cli/doctor-cli.ts +21 -0
- package/src/cli/friendly-errors.ts +113 -0
- package/src/cli/intake-cli.ts +3 -1
- package/src/cli/memory-cli.ts +182 -0
- package/src/cli/model-watch-cli.ts +4 -1
- package/src/cli/pr-land-pod-shadow.ts +54 -0
- package/src/cli/release-cli.ts +9 -7
- 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/seat-requests-cli.ts +25 -0
- package/src/cli/tasks-cli.ts +31 -7
- package/src/cli/usage-cli.ts +3 -1
- 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/dashboard/slash-runtime/dashboard-handlers.ts +4 -138
- package/src/dashboard/slash-runtime/shell-slash.ts +145 -0
- package/src/debug/log-diet.ts +16 -4
- package/src/domains/morning-essential.ts +18 -3
- package/src/domains/release-tool.ts +4 -0
- package/src/execution-loop/launch-gate.ts +158 -2
- package/src/fleet/host-doctor.ts +375 -0
- package/src/goals/judge.ts +20 -6
- package/src/graph-runner/runner.ts +9 -5
- package/src/graph-wizard/archetypes.ts +14 -8
- package/src/graph-wizard/generate.ts +77 -1
- package/src/grok.ts +13 -7
- package/src/harness/harness-cli-command.ts +56 -47
- package/src/harness/harness-stop.ts +82 -12
- package/src/index.ts +17 -175
- package/src/intake-plane/collect-github.ts +7 -2
- package/src/intake-plane/lens.ts +46 -4
- package/src/intake-plane/requirement-funnel.ts +53 -1
- package/src/intelligence-map/catalog-feed.ts +119 -0
- package/src/intelligence-map/model-watch-intake.ts +40 -0
- package/src/intelligence-map/model-watch-mission.ts +14 -1
- package/src/llm/open-weight-discipline.ts +21 -0
- package/src/llm.ts +4 -8
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/nexus/api/http-server.ts +22 -0
- package/src/oauth/codex-account-rotation.ts +4 -1
- package/src/oauth/codex-account-store.ts +20 -7
- package/src/oauth/codex-quota-policy.ts +33 -4
- package/src/preview/terminal.ts +15 -5
- package/src/project/project-store.ts +20 -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/rehearsal.ts +1 -1
- package/src/seat-loop/duty-ledger.ts +64 -0
- package/src/self-dev/decompose.ts +37 -3
- package/src/self-dev/dev-pipeline.ts +32 -7
- package/src/self-dev/draft-residue.ts +16 -6
- package/src/self-dev/draft-sweep.ts +52 -4
- package/src/self-dev/fabric-decompose-adapter.ts +9 -2
- package/src/self-dev/run-supervisor.ts +37 -7
- package/src/self-implement/gate-cli.ts +29 -10
- package/src/self-implement/gate-remote.ts +4 -1
- package/src/self-implement/goal-author.ts +12 -2
- package/src/self-implement/goal-new-paths.ts +42 -0
- 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 +88 -19
- 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 +2 -2
- package/src/self-implement/scope-adjacency.ts +23 -0
- package/src/self-implement/seams.ts +42 -7
- 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/rejudge-tick.ts +142 -0
- package/src/task-agent/board.ts +92 -3
- package/src/task-agent/card-evidence.ts +88 -1
- package/src/task-agent/cover.ts +65 -0
- package/src/task-agent/parent-host.ts +27 -3
- package/src/task-agent/rejudge-on-head.ts +151 -7
- package/src/task-agent/review-result-capture.ts +3 -1
- package/src/task-agent/shadow.ts +12 -0
- package/src/task-agent/task-hand.ts +4 -1
- package/src/task-orchestrator/surfaces/pod-command-job.ts +14 -0
- package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +122 -0
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +23 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +53 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +235 -28
- package/src/user-config.ts +18 -4
- 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/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-0eed0fb0aab716b6.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-aaae04ed1d32622f.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-3b9fc39362473ae7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f2b62c19ca68fef8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-d7602d489edf5f37.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-8b7c5ab6b5bc8d64.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-4eb84d454f8c3415.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-b2e494bdad57fcb5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-c0ab229673a8b0eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-3e2b45f3c36dbac4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c22aa511b28743ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-26345242e4049f55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-bf88c0f558d8ef54.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-52fec523e5b5d3ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-67723dfdcde92b31.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-22725e2570f1126b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-1891335950d68b70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-3267af1ebdc73cf5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-c314b75c11234998.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-9f9c85415f61782b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-c1d4276059085587.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-833aab587f26ad4c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8526c17ae38e6a50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-f998637a8402115c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-b7bb53828b17b335.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-1b1850de0257e46d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6f23159fedb41f67.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-da9e570234d481fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-8ce3a38e210b810a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-57ffeeb6019440fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-abbb417bf514630b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-2c2b3f29cec1efa4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-9369279f72fc7b51.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-64861f14039499c3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ddc4c93efd8ab94b.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-901a1391b81053bc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-68d9bbaac9841a58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-b5c0c996f329371e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-89881ccbcf728978.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-0e87a803b3d7165e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-58d4e5cb30ef4871.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-02ce4c3b5f39e4d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-e620d1bb8eadcec2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-acf868c64d77f950.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-54fa605fa6dba457.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-bc79f0833533fa84.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-d5c4398eea03d8f3.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/{Q-7iofoxOEv1WX18S35of → dRS6lEhSRRBr1abbzp7fJ}/_ssgManifest.js +0 -0
package/scripts/ux-sim.ts
CHANGED
|
@@ -13,6 +13,9 @@
|
|
|
13
13
|
// bun scripts/ux-sim.ts --computer-use normal --from-run <runId> --save-trajectory <name> # 이름으로 저장
|
|
14
14
|
// bun scripts/ux-sim.ts --computer-use normal --trajectory <name> # 저장한 궤적을 재생
|
|
15
15
|
// bun scripts/ux-sim.ts --list-trajectories # 저장한 궤적과 출처 목록
|
|
16
|
+
// bun scripts/ux-sim.ts --fault cred-expiry # 결함 주입: grok 구독 만료 임박 × 갱신 결과 → 디스패처·발사 판정
|
|
17
|
+
// bun scripts/ux-sim.ts --fault pod-death # 결함 주입: PARTIAL 줄을 남긴 Pod 가 SIGTERM 으로 지워짐 → 호스트 재방출 판정
|
|
18
|
+
// bun scripts/ux-sim.ts --fault pool-cap # 결함 주입: --pod-pool 에 :N 이 빠진 풀 → 승인 판정(limitedBy)
|
|
16
19
|
//
|
|
17
20
|
// ⛔ 이 CLI 는 «실제 위젯 render()» 를 부른다 — 흉내 렌더러가 아니다.
|
|
18
21
|
import { simRenderLogFrame } from '../src/ux-sim/render-frame.js';
|
|
@@ -33,7 +36,7 @@ const argv = process.argv.slice(2);
|
|
|
33
36
|
// ⛔ 그래서 「알려진 플래그」를 «한 곳»에 두고, 그 밖의 `--` 인자는 거부한다.
|
|
34
37
|
const KNOWN_FLAGS = new Set([
|
|
35
38
|
'--list', '--list-trajectories', '--computer-use', '--trajectory', '--from-run',
|
|
36
|
-
'--save-trajectory', '--esc', '--queue', '--width', '--height', '--draft',
|
|
39
|
+
'--save-trajectory', '--esc', '--queue', '--width', '--height', '--draft', '--fault',
|
|
37
40
|
]);
|
|
38
41
|
{
|
|
39
42
|
const unknown = argv.filter((a) => a.startsWith('--') && !KNOWN_FLAGS.has(a.split('=')[0]));
|
|
@@ -46,6 +49,32 @@ const KNOWN_FLAGS = new Set([
|
|
|
46
49
|
}
|
|
47
50
|
if (argv.includes('--list')) { console.log([...PHASES, 'computer-use: normal | capture-stalls | capture-fails | target-missing'].join('\n')); process.exit(0); }
|
|
48
51
|
|
|
52
|
+
{
|
|
53
|
+
// `--fault=<이름>` 꼴도 받는다 — KNOWN_FLAGS 는 등호 꼴을 통과시키므로 여기서 놓치면 조용히 기본 국면으로 빠진다.
|
|
54
|
+
const eq = argv.find((a) => a.startsWith('--fault='));
|
|
55
|
+
if (eq) argv.splice(argv.indexOf(eq), 1, '--fault', eq.slice('--fault='.length));
|
|
56
|
+
}
|
|
57
|
+
if (argv.includes('--fault')) {
|
|
58
|
+
const fault = argv[argv.indexOf('--fault') + 1];
|
|
59
|
+
if (fault === 'cred-expiry') {
|
|
60
|
+
const { credExpirySweep, renderCredExpiry } = await import('../src/ux-sim/fault-cred-expiry.js');
|
|
61
|
+
console.log(renderCredExpiry(credExpirySweep()).join('\n'));
|
|
62
|
+
process.exit(0);
|
|
63
|
+
}
|
|
64
|
+
if (fault === 'pod-death') {
|
|
65
|
+
const { simPodDeath, renderPodDeath } = await import('../src/ux-sim/fault-pod-death.js');
|
|
66
|
+
console.log(renderPodDeath(simPodDeath()).join('\n'));
|
|
67
|
+
process.exit(0);
|
|
68
|
+
}
|
|
69
|
+
if (fault === 'pool-cap') {
|
|
70
|
+
const { poolCapSweep, renderPoolCap } = await import('../src/ux-sim/fault-pool-cap.js');
|
|
71
|
+
console.log(renderPoolCap(poolCapSweep()).join('\n'));
|
|
72
|
+
process.exit(0);
|
|
73
|
+
}
|
|
74
|
+
console.error(`⛔ 모르는 결함이다: ${fault ?? '(없음)'} — 아는 것: cred-expiry · pod-death · pool-cap`);
|
|
75
|
+
process.exit(2);
|
|
76
|
+
}
|
|
77
|
+
|
|
49
78
|
if (argv.includes('--list-trajectories')) {
|
|
50
79
|
const { listSavedBrowserActionTrajectories } = await import('../src/harness/browser-trajectory.js');
|
|
51
80
|
const saved = listSavedBrowserActionTrajectories();
|
|
@@ -10,7 +10,7 @@ import { fetchSupadataTranscript, judgeTranscriptSufficiency } from '../src/tran
|
|
|
10
10
|
import { downloadAudio, splitAudio } from '../src/audio.js';
|
|
11
11
|
import { transcribeChunks } from '../src/stt.js';
|
|
12
12
|
import { summarize, parseMetaFromSummary } from '../src/summarize.js';
|
|
13
|
-
import { getSaveDir, saveMarkdown, prepareRunDir, persistArtifacts } from '../src/obsidian.js';
|
|
13
|
+
import { getSaveDir, saveMarkdown, prepareRunDir, persistArtifacts, saveSkipNotice } from '../src/obsidian.js';
|
|
14
14
|
import { classifyDomain, stagingEnabled, stagingSubdir } from '../src/domain-staging.js';
|
|
15
15
|
import { buildStudyNote } from '../src/study-note.js';
|
|
16
16
|
import { decideRoute } from '../src/router.js';
|
|
@@ -203,6 +203,7 @@ async function main() {
|
|
|
203
203
|
});
|
|
204
204
|
console.log(` 저장 완료: ${savedPath}`);
|
|
205
205
|
}
|
|
206
|
+
const skipNotice = savedPath === null ? saveSkipNotice(route.target, saveDir) : null;
|
|
206
207
|
|
|
207
208
|
if (flags.print) {
|
|
208
209
|
console.log('\n---BEGIN_YOUTUBE_MASTER_MARKDOWN---\n');
|
|
@@ -211,6 +212,8 @@ async function main() {
|
|
|
211
212
|
}
|
|
212
213
|
|
|
213
214
|
outputSignals(route);
|
|
215
|
+
|
|
216
|
+
if (skipNotice) console.log(skipNotice);
|
|
214
217
|
}
|
|
215
218
|
|
|
216
219
|
// ── Transcript acquisition (auto-fallback) ──
|
|
@@ -21,6 +21,15 @@ export function getStudyNoteSaveDir(): string | null {
|
|
|
21
21
|
return join(vaultRoot, ...sub.split('/'));
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
const SAVE_SKIP_NOTICE =
|
|
25
|
+
'저장 안 됨 · OBSIDIAN_VAULT_ROOT 가 없다 · 고칠 한 줄: export OBSIDIAN_VAULT_ROOT=<vault 경로>';
|
|
26
|
+
|
|
27
|
+
/** target 이 obsidian 인데 saveDir 이 없으면 세 칸 안내, 아니면 null. */
|
|
28
|
+
export function saveSkipNotice(target: string, saveDir: string | null): string | null {
|
|
29
|
+
if (target === 'obsidian' && saveDir == null) return SAVE_SKIP_NOTICE;
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
|
|
24
33
|
/* ── Artifact persistence (Cloud STT path) ── */
|
|
25
34
|
|
|
26
35
|
export async function prepareRunDir(saveDir: string, meta: VideoMeta, videoId: string): Promise<string> {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// ── ACP Claude Code 를 «구현» 실행기로 (CLAUDE-IMPL-LANE · `--child-llm-provider claude-acp`) ──
|
|
2
2
|
//
|
|
3
3
|
// acp-reviewer.ts 의 짝이다. 리뷰어는 read-only 라 읽기 툴만 허가하지만, 구현 실행기는 런 워크트리 안에서
|
|
4
|
-
// 쓰기·실행을 허가해야 한다.
|
|
4
|
+
// 쓰기·실행을 허가해야 한다. 대표 대표 결정(10-12): ACP 세션 권한 모드는 호스트 설정(auto)을 그대로 두고
|
|
5
|
+
// 바꾸지 않으며, approver 가 불려도 «워크트리 밖 경로 쓰기»를 거부하지 않고 허가하되 insideWorktree 로 관측한다.
|
|
5
6
|
// 자식은 claude 구독 ACP 어댑터(`claude-agent-acp`)이며 env 는 subscriptionReviewerSpawn 의 과금 스크럽
|
|
6
7
|
// (ANTHROPIC_API_KEY 등 제거)을 그대로 쓴다 — 지우지 않으면 구독이 아니라 API 로 과금된다.
|
|
7
8
|
import { isAbsolute, relative, resolve } from 'node:path';
|
|
@@ -23,6 +24,8 @@ export interface ImplementerPermissionRequest {
|
|
|
23
24
|
export interface ImplementerPermissionDecision {
|
|
24
25
|
tool: string;
|
|
25
26
|
path: string | null;
|
|
27
|
+
/** 판정에 쓴 경로가 워크트리 안인가 — 경로가 없으면 null. 밖이어도 허가한다(대표 10-12); 이 칸이 그 관측이다. */
|
|
28
|
+
insideWorktree: boolean | null;
|
|
26
29
|
decision: 'allow' | 'deny';
|
|
27
30
|
}
|
|
28
31
|
|
|
@@ -37,18 +40,20 @@ function insideWorktree(worktree: string, target: string): boolean {
|
|
|
37
40
|
return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));
|
|
38
41
|
}
|
|
39
42
|
|
|
40
|
-
/** 허가 판정(순수 함수). 쓰기 계열(edit·delete·move)은
|
|
41
|
-
*
|
|
43
|
+
/** 허가 판정(순수 함수). 쓰기 계열(edit·delete·move)은 경로가 있으면 워크트리 안팎을 가리지 않고 허가한다
|
|
44
|
+
* (대표 10-12 — 밖 쓰기 거부를 걷었다 · insideWorktree 로 관측만 한다). 실행(execute)·읽기 계열은 허가,
|
|
45
|
+
* 그 외(모르는 kind)는 경로가 있을 때만 허가 — 경로 없는 쓰기·모르는 요청은 여전히 거부. */
|
|
42
46
|
export function decideImplementerPermission(req: ImplementerPermissionRequest, worktree: string): ImplementerPermissionDecision {
|
|
43
47
|
const paths = requestedPaths(req.rawInput);
|
|
44
48
|
const outside = paths.find((p) => !insideWorktree(worktree, p));
|
|
45
49
|
const tool = req.title.slice(0, 80);
|
|
46
50
|
const shown = outside ?? paths[0] ?? null;
|
|
47
|
-
const
|
|
48
|
-
|
|
51
|
+
const inside = paths.length === 0 ? null : outside === undefined;
|
|
52
|
+
const verdict = (allow: boolean): ImplementerPermissionDecision => ({ tool, path: shown, insideWorktree: inside, decision: allow ? 'allow' : 'deny' });
|
|
53
|
+
if (req.kind && WRITE_TOOL_KINDS.has(req.kind)) return verdict(paths.length > 0);
|
|
49
54
|
if (req.kind === 'execute') return verdict(true);
|
|
50
55
|
if (isReadOnlyReviewTool(req.kind, req.title)) return verdict(true);
|
|
51
|
-
return verdict(paths.length > 0
|
|
56
|
+
return verdict(paths.length > 0);
|
|
52
57
|
}
|
|
53
58
|
|
|
54
59
|
export interface AcpImplementerOpts {
|
|
@@ -96,7 +101,9 @@ export function makeAcpImplementer(opts: AcpImplementerOpts): (prompt: string) =
|
|
|
96
101
|
permissionApprover: async (req) => {
|
|
97
102
|
const verdict = decideImplementerPermission(req, opts.worktree);
|
|
98
103
|
if (verdict.decision === 'allow') allowed++; else denied++;
|
|
99
|
-
debug.log(OBS, 'permission', {
|
|
104
|
+
debug.log(OBS, 'permission', {
|
|
105
|
+
tool: verdict.tool, path: verdict.path, insideWorktree: verdict.insideWorktree, allowed: verdict.decision === 'allow',
|
|
106
|
+
});
|
|
100
107
|
return verdict.decision === 'allow';
|
|
101
108
|
},
|
|
102
109
|
};
|
|
@@ -683,8 +683,9 @@ function isLongNoFindingBracket(text: string): boolean {
|
|
|
683
683
|
return NO_FINDING_HEAD.test(remark) && !LONG_REMARK_DISSENT.test(remark);
|
|
684
684
|
}
|
|
685
685
|
/** must-fix 항목이 «지적 없음» 표지인가 — must-fix 를 세는 자리는 전부 `parseReviewResult` 를 거친다
|
|
686
|
-
* (`self review --json` 의 `mustFix` → TA `parseReviewResultOutput` → `pr land --overlap-evidence` 의 `review-must-fix-N`).
|
|
687
|
-
|
|
686
|
+
* (`self review --json` 의 `mustFix` → TA `parseReviewResultOutput` → `pr land --overlap-evidence` 의 `review-must-fix-N`).
|
|
687
|
+
* ⭐ export — `parseReviewResultOutput` 가 «같은» 판정으로 저장된 결과의 표지 줄을 다시 접는다(PR-LAND-MUSTFIX-NONE · 복제 금지). */
|
|
688
|
+
export function isNoneSentinelFinding(finding: string): boolean {
|
|
688
689
|
const text = finding.trim();
|
|
689
690
|
if (BARE_SENTINEL.test(text)) return true;
|
|
690
691
|
const bracketed = BRACKETED_SENTINEL.exec(text);
|
|
@@ -765,6 +766,25 @@ function reviewedResultFromRaw(raw: string, runId: string | undefined, pass?: {
|
|
|
765
766
|
return { verdict: 'pass', mustFix: [], shouldFix: [], reviewed: false, failureReason: NO_VERDICT_LINE_REASON };
|
|
766
767
|
}
|
|
767
768
|
|
|
769
|
+
/** REVIEW-PROMPT-SIZE — llmReview 호출 하나(단일·청크 패스)마다 프롬프트·응답 크기를 남긴다.
|
|
770
|
+
* 관측이 리뷰를 막지 않는다(다른 review.* 관측과 같은 계약). */
|
|
771
|
+
function logReviewPromptSize(
|
|
772
|
+
prompt: string,
|
|
773
|
+
response: string,
|
|
774
|
+
pass: { pass: number; chunked: boolean },
|
|
775
|
+
runId: string | undefined,
|
|
776
|
+
): void {
|
|
777
|
+
try {
|
|
778
|
+
debug.log('review.prompt-size', 'call', {
|
|
779
|
+
pass: pass.pass,
|
|
780
|
+
promptChars: prompt.length,
|
|
781
|
+
responseChars: response.length,
|
|
782
|
+
chunked: pass.chunked,
|
|
783
|
+
...(runId !== undefined ? { runId } : {}),
|
|
784
|
+
});
|
|
785
|
+
} catch { /* Observation must not prevent the review. */ }
|
|
786
|
+
}
|
|
787
|
+
|
|
768
788
|
function failureReasonText(error: unknown): string {
|
|
769
789
|
if (error instanceof Error) return safeLogText(error.message, 400);
|
|
770
790
|
if (typeof error === 'string') return safeLogText(error, 400);
|
|
@@ -916,10 +936,11 @@ export async function reviewPullRequest(
|
|
|
916
936
|
+ ' 「여기 안 보인다」를 결함으로 판정하지 마십시오.',
|
|
917
937
|
].filter(Boolean).join('\n'),
|
|
918
938
|
};
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
939
|
+
const passPrompt = buildReviewPrompt(passInput, passBudget, '', passContext[index]?.budget);
|
|
940
|
+
const passImages = reviewImages.length > 0 && index === 0 ? reviewImages : undefined;
|
|
941
|
+
const passRaw = await llmReview(passPrompt, passImages);
|
|
942
|
+
logReviewPromptSize(passPrompt, passRaw, { pass: index + 1, chunked: true }, input.reviewContext?.runId);
|
|
943
|
+
passResults.push(reviewedResultFromRaw(passRaw, input.reviewContext?.runId, { index, of: plan.passes.length }));
|
|
923
944
|
}
|
|
924
945
|
return {
|
|
925
946
|
...foldReviewResults(passResults),
|
|
@@ -943,10 +964,9 @@ export async function reviewPullRequest(
|
|
|
943
964
|
} : {}),
|
|
944
965
|
};
|
|
945
966
|
}
|
|
946
|
-
const
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
);
|
|
967
|
+
const prompt = buildReviewPrompt(input, diffBudget, referencedContext.text, singleContextBudget);
|
|
968
|
+
const raw = await llmReview(prompt, reviewImages.length > 0 ? reviewImages : undefined);
|
|
969
|
+
logReviewPromptSize(prompt, raw, { pass: 1, chunked: false }, input.reviewContext?.runId);
|
|
950
970
|
return {
|
|
951
971
|
...reviewedResultFromRaw(raw, input.reviewContext?.runId),
|
|
952
972
|
diffBudget: {
|
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
//
|
|
15
15
|
// index.ts 의 액션은 옵션 파싱과 실제 의존 배선만 남는다(얇은 껍데기).
|
|
16
16
|
|
|
17
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
18
|
+
import { tmpdir } from 'node:os';
|
|
19
|
+
import { join } from 'node:path';
|
|
17
20
|
import { tierModel } from '../llm/model-defaults.js';
|
|
18
21
|
import { buildReviewObservation, safeLogText } from './review-observation.js';
|
|
19
22
|
import { DEFAULT_REVIEW_BACKEND } from './acp-reviewer.js';
|
|
@@ -75,13 +78,13 @@ export interface SelfReviewCliDeps {
|
|
|
75
78
|
*
|
|
76
79
|
* ⚠️ API 백엔드(`makeApiLlm`)는 이 인자를 안 받는다 — ACP 경로만 이미지를 나른다.
|
|
77
80
|
*/
|
|
78
|
-
makeAcpLlm(o: { backend: string; model?: string; timeoutMs: number }): (prompt: string, images?: readonly ReviewImage[]) => Promise<string>;
|
|
81
|
+
makeAcpLlm(o: { backend: string; model?: string; timeoutMs: number; cwd?: string }): (prompt: string, images?: readonly ReviewImage[]) => Promise<string>;
|
|
79
82
|
/**
|
|
80
83
|
* Reviewer ACP lane selected by `roleLlm.reviewer` (no explicit flag). Returns the LLM when the
|
|
81
84
|
* subscription is usable, or a reason code when it is not — the caller then reviews on the API
|
|
82
85
|
* exactly as before. Absent seam = the lane is unavailable (`role-reviewer-seam-missing`).
|
|
83
86
|
*/
|
|
84
|
-
makeRoleReviewerLlm?(spec: SubscriptionReviewerSpec, o: { timeoutMs: number }):
|
|
87
|
+
makeRoleReviewerLlm?(spec: SubscriptionReviewerSpec, o: { timeoutMs: number; cwd?: string }):
|
|
85
88
|
| { llm: (prompt: string, images?: readonly ReviewImage[]) => Promise<string>; backend: string }
|
|
86
89
|
| { reason: string };
|
|
87
90
|
/**
|
|
@@ -1164,6 +1167,65 @@ export function renderReviewerContextStatus(loaded: LoadedReviewerContext, decom
|
|
|
1164
1167
|
return `Reviewer context: ${loaded.items.length} loaded, ${loaded.failed.length} not loaded.${source}${truncation}${decompositionStatus}${labels ? `\n${labels}` : ''}${failures ? `\n${failures}` : ''}`;
|
|
1165
1168
|
}
|
|
1166
1169
|
|
|
1170
|
+
/**
|
|
1171
|
+
* 머지된 PR 의 사후 리뷰 격리 — 리뷰어 cwd 가 main 최신이면 그 뒤 수리를 인용한다.
|
|
1172
|
+
* `merged` 는 그 PR 의 머지 커밋, `open` 은 종전(cwd 불변), `unpinnable` 은 MERGED 인데 머지 커밋을 못 구한 경우다.
|
|
1173
|
+
*/
|
|
1174
|
+
type PrMergeState =
|
|
1175
|
+
| { kind: 'open' }
|
|
1176
|
+
| { kind: 'merged'; commit: string }
|
|
1177
|
+
| { kind: 'unpinnable'; reason: 'merge-commit-unknown' };
|
|
1178
|
+
|
|
1179
|
+
function readPrMergeState(pr: string, deps: SelfReviewCliDeps): PrMergeState {
|
|
1180
|
+
const view = deps.gh(['pr', 'view', pr, '--json', 'state,mergeCommit'], 15_000);
|
|
1181
|
+
if (view.status !== 0) return { kind: 'open' };
|
|
1182
|
+
try {
|
|
1183
|
+
const parsed = JSON.parse(view.stdout) as { state?: unknown; mergeCommit?: { oid?: unknown } | null };
|
|
1184
|
+
if (parsed?.state !== 'MERGED') return { kind: 'open' };
|
|
1185
|
+
const oid = parsed.mergeCommit?.oid;
|
|
1186
|
+
return typeof oid === 'string' && COMMIT_OID.test(oid)
|
|
1187
|
+
? { kind: 'merged', commit: oid }
|
|
1188
|
+
: { kind: 'unpinnable', reason: 'merge-commit-unknown' };
|
|
1189
|
+
} catch {
|
|
1190
|
+
return { kind: 'open' };
|
|
1191
|
+
}
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
interface ReviewWorktree {
|
|
1195
|
+
cwd: string;
|
|
1196
|
+
commit: string;
|
|
1197
|
+
/** 멱등 — 두 번 불러도 안전하다. */
|
|
1198
|
+
remove(): void;
|
|
1199
|
+
}
|
|
1200
|
+
|
|
1201
|
+
type ReviewWorktreeResult = ReviewWorktree | { reason: 'no-git-seam' | 'worktree-add-failed' };
|
|
1202
|
+
|
|
1203
|
+
function createDetachedReviewWorktree(commit: string, deps: SelfReviewCliDeps): ReviewWorktreeResult {
|
|
1204
|
+
const git = deps.git;
|
|
1205
|
+
if (!git) return { reason: 'no-git-seam' };
|
|
1206
|
+
const parent = mkdtempSync(join(tmpdir(), 'elanous-review-pin-'));
|
|
1207
|
+
const cwd = join(parent, 'wt');
|
|
1208
|
+
const add = () => git(['worktree', 'add', '--detach', cwd, commit], 120_000);
|
|
1209
|
+
let added = add();
|
|
1210
|
+
if (added.status !== 0) {
|
|
1211
|
+
git(['fetch', 'origin', commit], 120_000);
|
|
1212
|
+
added = add();
|
|
1213
|
+
}
|
|
1214
|
+
let removed = false;
|
|
1215
|
+
const remove = (): void => {
|
|
1216
|
+
if (removed) return;
|
|
1217
|
+
removed = true;
|
|
1218
|
+
git(['worktree', 'remove', '--force', cwd], 60_000);
|
|
1219
|
+
rmSync(parent, { recursive: true, force: true });
|
|
1220
|
+
// ⛔ `git worktree prune` 은 부르지 않는다 — 저장소 «전체»의 stale 메타데이터를 지워 남의 worktree 까지 건드린다.
|
|
1221
|
+
};
|
|
1222
|
+
if (added.status !== 0) {
|
|
1223
|
+
remove();
|
|
1224
|
+
return { reason: 'worktree-add-failed' };
|
|
1225
|
+
}
|
|
1226
|
+
return { cwd, commit, remove };
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1167
1229
|
/** `elanous self review <pr...>` 본문. read-only — 머지하지 않는다. */
|
|
1168
1230
|
/**
|
|
1169
1231
|
* `self review --json` stdout 한 줄 — 결과가 하나면 객체, 여럿이면 배열. index.ts 액션이 이것을 그대로 쓴다.
|
|
@@ -1177,6 +1239,20 @@ export async function runSelfReviewCliCommand(
|
|
|
1177
1239
|
prArgs: string[],
|
|
1178
1240
|
opts: SelfReviewCliOpts,
|
|
1179
1241
|
deps: SelfReviewCliDeps,
|
|
1242
|
+
): Promise<SelfReviewCliOutcome> {
|
|
1243
|
+
const pins: ReviewWorktree[] = [];
|
|
1244
|
+
try {
|
|
1245
|
+
return await runSelfReviewCliCommandPinned(prArgs, opts, deps, pins);
|
|
1246
|
+
} finally {
|
|
1247
|
+
for (const pin of pins) pin.remove();
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
async function runSelfReviewCliCommandPinned(
|
|
1252
|
+
prArgs: string[],
|
|
1253
|
+
opts: SelfReviewCliOpts,
|
|
1254
|
+
deps: SelfReviewCliDeps,
|
|
1255
|
+
pins: ReviewWorktree[],
|
|
1180
1256
|
): Promise<SelfReviewCliOutcome> {
|
|
1181
1257
|
// 관측 sink는 모든 종료 경로보다 먼저 등록해 거부도 운영 로그에 남긴다.
|
|
1182
1258
|
await deps.registerSink('self-review');
|
|
@@ -1272,6 +1348,7 @@ export async function runSelfReviewCliCommand(
|
|
|
1272
1348
|
// ⛔ `relation-unknown` 도 경고한다(위 주석 · 리뷰가 두 라운드 반복 지적) — 그 밖 unavailable 은 조용하다.
|
|
1273
1349
|
// ⭐ 경고 여부 판정은 `localHeadWarningDetails` 한 곳에 있다(호출부에서 같은 함수를 두 번 부르지 않는다).
|
|
1274
1350
|
const mismatchWarning = localHeadWarningDetails(localHeadComparison);
|
|
1351
|
+
const mergeState = readPrMergeState(pr, deps);
|
|
1275
1352
|
const view = deps.gh(['pr', 'view', pr, '--json', 'title,body'], 15_000);
|
|
1276
1353
|
let prView: { title?: string; body?: string } | undefined;
|
|
1277
1354
|
if (view.status === 0) {
|
|
@@ -1399,6 +1476,36 @@ export async function runSelfReviewCliCommand(
|
|
|
1399
1476
|
else deps.print(`\n━━ PR ${pr} (${primaryModel}) ━━\n${renderStaleRefusal(diffRead)}\n${reviewerContextStatus}`);
|
|
1400
1477
|
continue;
|
|
1401
1478
|
}
|
|
1479
|
+
// ⭐ 머지된 PR 만 머지 커밋 detached worktree 에서 리뷰한다 — main 최신이 아니라 그 PR 이 머지된 시점의 코드를 본다.
|
|
1480
|
+
// 열린 PR 은 종전 그대로(cwd = process.cwd() · 리뷰어 심이 cwd 를 받지 않는다).
|
|
1481
|
+
let reviewPin: ReviewWorktree | undefined;
|
|
1482
|
+
let reviewCwdPinFallbackReason: string | undefined;
|
|
1483
|
+
// cwd 를 받는 레인(ACP · role 리뷰어)일 때만 worktree 를 뜬다 — API 리뷰어는 cwd 를 안 받으므로 떠도 그 위에서 돌지 않는다.
|
|
1484
|
+
const pinLane = useAcp || Boolean(roleReviewer && opts.roleReviewer && deps.makeRoleReviewerLlm);
|
|
1485
|
+
let rolePinned = false;
|
|
1486
|
+
if (!pinLane) {
|
|
1487
|
+
// 비-ACP 레인 — 격리하지 않는다(종전 그대로 · reviewCwdCommit 없음).
|
|
1488
|
+
} else if (mergeState.kind === 'merged') {
|
|
1489
|
+
const made = createDetachedReviewWorktree(mergeState.commit, deps);
|
|
1490
|
+
if ('cwd' in made) {
|
|
1491
|
+
reviewPin = made;
|
|
1492
|
+
pins.push(made);
|
|
1493
|
+
} else reviewCwdPinFallbackReason = made.reason;
|
|
1494
|
+
} else if (mergeState.kind === 'unpinnable') reviewCwdPinFallbackReason = mergeState.reason;
|
|
1495
|
+
const reviewCwd = reviewPin?.cwd;
|
|
1496
|
+
const prAcpReviewLLM = reviewCwd && useAcp
|
|
1497
|
+
? deps.makeAcpLlm({ backend: acpBackend, ...(acpModel ? { model: acpModel } : {}), timeoutMs: acpTimeoutSec * 1000, cwd: reviewCwd })
|
|
1498
|
+
: acpReviewLLM;
|
|
1499
|
+
let prRoleReviewer = roleReviewer;
|
|
1500
|
+
if (reviewCwd && roleReviewer && opts.roleReviewer && deps.makeRoleReviewerLlm) {
|
|
1501
|
+
try {
|
|
1502
|
+
const pinned = deps.makeRoleReviewerLlm(opts.roleReviewer, { timeoutMs: acpTimeoutSec * 1000, cwd: reviewCwd });
|
|
1503
|
+
if ('llm' in pinned) { prRoleReviewer = { llm: pinned.llm, model: `acp:${pinned.backend}` }; rolePinned = true; }
|
|
1504
|
+
else reviewCwdPinFallbackReason = 'role-reviewer-cwd-unavailable';
|
|
1505
|
+
} catch {
|
|
1506
|
+
reviewCwdPinFallbackReason = 'role-reviewer-cwd-unavailable';
|
|
1507
|
+
}
|
|
1508
|
+
}
|
|
1402
1509
|
const startedAt = deps.now();
|
|
1403
1510
|
// Role-config lane builds the API reviewer only when it falls back (`made().api` stays 0 on ACP success).
|
|
1404
1511
|
const responded: { provider?: string; model?: string } = {};
|
|
@@ -1406,7 +1513,7 @@ export async function runSelfReviewCliCommand(
|
|
|
1406
1513
|
pinProvider: Boolean(opts.model?.trim()),
|
|
1407
1514
|
onResolved: (provider, respondedModel) => { responded.provider = provider; responded.model = respondedModel; },
|
|
1408
1515
|
});
|
|
1409
|
-
const llmReview =
|
|
1516
|
+
const llmReview = prRoleReviewer ? undefined : (prAcpReviewLLM ?? makeApi());
|
|
1410
1517
|
// ⛔ evidenceNote 는 **별도 채널**이다 — phaseIntent 에 섞으면 의도 채널이 오염된다(실측: 그렇게
|
|
1411
1518
|
// 했다가 intent 배선 테스트 3개가 즉시 깨졌다).
|
|
1412
1519
|
// ⛔ 사람 `--intent`(phaseIntent) 와 골 acceptance 는 다른 인자 — 충돌하지 않고, 충돌해도 intent 가 이긴다.
|
|
@@ -1426,10 +1533,10 @@ export async function runSelfReviewCliCommand(
|
|
|
1426
1533
|
let roleReview: ReviewResult | undefined;
|
|
1427
1534
|
let roleReviewerFallbackReason = roleReviewerUnavailableReason;
|
|
1428
1535
|
let roleReviewMs: number | undefined;
|
|
1429
|
-
if (
|
|
1536
|
+
if (prRoleReviewer) {
|
|
1430
1537
|
const roleStartedAt = deps.now();
|
|
1431
1538
|
try {
|
|
1432
|
-
const attempt = await deps.reviewPullRequest(reviewInput,
|
|
1539
|
+
const attempt = await deps.reviewPullRequest(reviewInput, prRoleReviewer.llm);
|
|
1433
1540
|
if (attempt.reviewed === true) roleReview = attempt;
|
|
1434
1541
|
// Code, not the reviewer's raw failure text (same rule as the throw path above).
|
|
1435
1542
|
else roleReviewerFallbackReason = 'acp-review-not-completed';
|
|
@@ -1445,8 +1552,8 @@ export async function runSelfReviewCliCommand(
|
|
|
1445
1552
|
}, { level: 'warn' });
|
|
1446
1553
|
}
|
|
1447
1554
|
}
|
|
1448
|
-
let review = roleReview ?? await deps.reviewPullRequest(reviewInput, llmReview ??
|
|
1449
|
-
let selectedModel = roleReview &&
|
|
1555
|
+
let review = roleReview ?? await deps.reviewPullRequest(reviewInput, llmReview ?? prAcpReviewLLM ?? makeApi());
|
|
1556
|
+
let selectedModel = roleReview && prRoleReviewer ? prRoleReviewer.model : model;
|
|
1450
1557
|
let reviewRoute: 'api' | 'acp' | 'acp-fallback' = useAcp || roleReview ? 'acp' : 'api';
|
|
1451
1558
|
let fallbackAttempted = false;
|
|
1452
1559
|
let fallbackBackend: string | undefined;
|
|
@@ -1466,7 +1573,7 @@ export async function runSelfReviewCliCommand(
|
|
|
1466
1573
|
try {
|
|
1467
1574
|
const fallbackReview = await deps.reviewPullRequest(
|
|
1468
1575
|
reviewInput,
|
|
1469
|
-
deps.makeAcpLlm({ backend, timeoutMs: acpTimeoutSec * 1000 }),
|
|
1576
|
+
deps.makeAcpLlm({ backend, timeoutMs: acpTimeoutSec * 1000, ...(reviewCwd ? { cwd: reviewCwd } : {}) }),
|
|
1470
1577
|
);
|
|
1471
1578
|
if (fallbackReview.reviewed === true) {
|
|
1472
1579
|
review = fallbackReview;
|
|
@@ -1482,6 +1589,14 @@ export async function runSelfReviewCliCommand(
|
|
|
1482
1589
|
}
|
|
1483
1590
|
}
|
|
1484
1591
|
}
|
|
1592
|
+
reviewPin?.remove();
|
|
1593
|
+
// reviewCwdCommit 은 «최종 판정을 낸 LLM 이 실제로 그 cwd 를 받았을 때만» 싣는다(role 실패 → API 폴백이면 안 싣는다).
|
|
1594
|
+
const reviewedOnPin = Boolean(reviewPin) && (roleReview ? rolePinned : reviewRoute === 'acp-fallback' ? true : reviewRoute === 'acp' && useAcp);
|
|
1595
|
+
if (reviewPin && !reviewedOnPin) reviewCwdPinFallbackReason ??= 'final-reviewer-not-pinned';
|
|
1596
|
+
const reviewCwdOutput = {
|
|
1597
|
+
...(reviewPin && reviewedOnPin ? { reviewCwdCommit: reviewPin.commit } : {}),
|
|
1598
|
+
...(reviewCwdPinFallbackReason ? { reviewCwdPinFallbackReason } : {}),
|
|
1599
|
+
};
|
|
1485
1600
|
if (!fallbackAttempted) {
|
|
1486
1601
|
fallbackNotAttemptedReason = useAcp ? 'explicit-acp' : 'primary-review-succeeded';
|
|
1487
1602
|
}
|
|
@@ -1522,20 +1637,21 @@ export async function runSelfReviewCliCommand(
|
|
|
1522
1637
|
goalLoaded: goalAcceptance.goalLoaded,
|
|
1523
1638
|
acceptanceChars: goalAcceptance.acceptanceChars,
|
|
1524
1639
|
...reviewerSelection,
|
|
1640
|
+
...reviewCwdOutput,
|
|
1525
1641
|
},
|
|
1526
1642
|
{ level: review.reviewed === false ? 'warn' : 'info' });
|
|
1527
1643
|
// --acp 는 대표가 명시 요청한 리뷰 — fail-soft(reviewed=false)면 조용히 pass 하지 말고 표면화(관측=acp-review).
|
|
1528
1644
|
if (useAcp && review.reviewed === false) {
|
|
1529
1645
|
const err = 'ACP 리뷰 실행 실패(reviewed=false) — 관측: elanous logs --category acp-review';
|
|
1530
1646
|
const contextOutput = reviewerContextOutput(reviewerContext, decompositionContext);
|
|
1531
|
-
if (opts.json) results.push({ pr, error: err, ...review, verdict: null, ...reviewProvenance, ...respondedOutput, ...reviewerSelection, ...provenance, ...contextOutput });
|
|
1647
|
+
if (opts.json) results.push({ pr, error: err, ...review, verdict: null, ...reviewProvenance, ...respondedOutput, ...reviewerSelection, ...reviewCwdOutput, ...provenance, ...contextOutput });
|
|
1532
1648
|
else deps.error(`PR ${pr}: ${err}\n${renderProvenance(diffRead)}\n${reviewerContextStatus}`);
|
|
1533
1649
|
failed += 1;
|
|
1534
1650
|
continue;
|
|
1535
1651
|
}
|
|
1536
1652
|
const contextOutput = reviewerContextOutput(reviewerContext, decompositionContext);
|
|
1537
1653
|
const jsonReview = review.reviewed === true ? review : { ...review, verdict: null };
|
|
1538
|
-
if (opts.json) results.push({ pr, model: selectedModel, ...jsonReview, ...reviewProvenance, ...respondedOutput, ...reviewerSelection, ...provenance, ...contextOutput, evidence: evidence.evidence, prDiffFiles: evidence.prDiffFiles, ...(evidence.authoredFiles !== undefined ? { authoredFiles: evidence.authoredFiles } : {}) });
|
|
1654
|
+
if (opts.json) results.push({ pr, model: selectedModel, ...jsonReview, ...reviewProvenance, ...respondedOutput, ...reviewerSelection, ...reviewCwdOutput, ...provenance, ...contextOutput, evidence: evidence.evidence, prDiffFiles: evidence.prDiffFiles, ...(evidence.authoredFiles !== undefined ? { authoredFiles: evidence.authoredFiles } : {}) });
|
|
1539
1655
|
else deps.print(`\n━━ PR ${pr} (${selectedModel}) ━━\n${renderProvenance(diffRead)}\n${evidenceLine}\n${reviewerContextStatus}\n${deps.renderReview(review)}`);
|
|
1540
1656
|
// REVIEW-ERROR-RC — 기본(API)·role 경로가 1차·폴백 모두 실패해 reviewed≠true 로 끝나도 «못 리뷰한 PR» 이다(verdict:null).
|
|
1541
1657
|
if (review.reviewed !== true) failed += 1;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// Cost-tier advisor — when forecast says warn/throttle, suggest one step down
|
|
2
|
+
// (premium → balanced → economy). Tier table values are estimates until
|
|
3
|
+
// MODEL-BENCH replaces them.
|
|
4
|
+
|
|
5
|
+
import { debug } from '../debug/log.js';
|
|
6
|
+
import type { ForecastResult } from './forecaster.js';
|
|
7
|
+
|
|
8
|
+
export type CostTier = 'premium' | 'balanced' | 'economy';
|
|
9
|
+
|
|
10
|
+
export const COST_TIERS: Record<CostTier, {
|
|
11
|
+
label: string;
|
|
12
|
+
stages: { authoring: string; implement: string; review: string; judge: string };
|
|
13
|
+
usdPerTaskEstimate: number;
|
|
14
|
+
qualityRisk: string;
|
|
15
|
+
source: 'estimate';
|
|
16
|
+
}> = {
|
|
17
|
+
premium: {
|
|
18
|
+
label: '프리미엄',
|
|
19
|
+
stages: {
|
|
20
|
+
authoring: 'claude-opus-4-7',
|
|
21
|
+
implement: 'gpt-6-astra',
|
|
22
|
+
review: 'claude-opus-4-7',
|
|
23
|
+
judge: 'grok-4.7',
|
|
24
|
+
},
|
|
25
|
+
usdPerTaskEstimate: 1.2,
|
|
26
|
+
qualityRisk: '낮음 — 최고 품질 유지',
|
|
27
|
+
source: 'estimate',
|
|
28
|
+
},
|
|
29
|
+
balanced: {
|
|
30
|
+
label: '균형',
|
|
31
|
+
stages: {
|
|
32
|
+
authoring: 'claude-sonnet-4-6',
|
|
33
|
+
implement: 'gpt-5.6-terra',
|
|
34
|
+
review: 'claude-sonnet-4-6',
|
|
35
|
+
judge: 'grok-4.6',
|
|
36
|
+
},
|
|
37
|
+
usdPerTaskEstimate: 0.45,
|
|
38
|
+
qualityRisk: '중간 — 대부분 작업에 충분',
|
|
39
|
+
source: 'estimate',
|
|
40
|
+
},
|
|
41
|
+
economy: {
|
|
42
|
+
label: '절약',
|
|
43
|
+
stages: {
|
|
44
|
+
authoring: 'claude-haiku-4-5',
|
|
45
|
+
implement: 'gpt-6-luna',
|
|
46
|
+
review: 'gemini-2.5-flash',
|
|
47
|
+
judge: 'gemini-3.5-flash-lite',
|
|
48
|
+
},
|
|
49
|
+
usdPerTaskEstimate: 0.12,
|
|
50
|
+
qualityRisk: '높음 — 단순·반복 작업에 적합',
|
|
51
|
+
source: 'estimate',
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const DOWN_ONE: Record<CostTier, CostTier | null> = {
|
|
56
|
+
premium: 'balanced',
|
|
57
|
+
balanced: 'economy',
|
|
58
|
+
economy: null,
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export function adviseCostTier(input: {
|
|
62
|
+
current: CostTier;
|
|
63
|
+
forecast: Pick<ForecastResult, 'recommendation' | 'usedPercent' | 'atCurrentPaceReachesLimitAt'>;
|
|
64
|
+
}): {
|
|
65
|
+
from: CostTier;
|
|
66
|
+
to: CostTier;
|
|
67
|
+
savingPercent: number;
|
|
68
|
+
qualityRisk: string;
|
|
69
|
+
reason: string;
|
|
70
|
+
} | null {
|
|
71
|
+
const { current, forecast } = input;
|
|
72
|
+
if (forecast.recommendation === 'safe') return null;
|
|
73
|
+
|
|
74
|
+
const to = DOWN_ONE[current];
|
|
75
|
+
if (!to) return null;
|
|
76
|
+
|
|
77
|
+
const fromTier = COST_TIERS[current];
|
|
78
|
+
const toTier = COST_TIERS[to];
|
|
79
|
+
const savingPercent = Math.round((1 - toTier.usdPerTaskEstimate / fromTier.usdPerTaskEstimate) * 100);
|
|
80
|
+
const reason = `예산 사용 ${forecast.usedPercent}% · 예측 ${forecast.recommendation} → ${toTier.label}로 내리면 약 ${savingPercent}% 절감`;
|
|
81
|
+
|
|
82
|
+
debug.log('budget.cost-tier', 'advised', { from: current, to, savingPercent });
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
from: current,
|
|
86
|
+
to,
|
|
87
|
+
savingPercent,
|
|
88
|
+
qualityRisk: toTier.qualityRisk,
|
|
89
|
+
reason,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// Shadow-arm launch plan — estimate which candidate models fit today's
|
|
2
|
+
// shadow budget. Plans only: no live LLM calls.
|
|
3
|
+
|
|
4
|
+
import { debug } from '../debug/log.js';
|
|
5
|
+
import { estimateLlmCost } from './llm-cost.js';
|
|
6
|
+
|
|
7
|
+
export type ShadowStage = 'authoring' | 'implement' | 'review' | 'judge';
|
|
8
|
+
|
|
9
|
+
export type ShadowDifficulty = 'small' | 'medium' | 'umbrella' | 'rework';
|
|
10
|
+
|
|
11
|
+
export interface PlanShadowArmsInput {
|
|
12
|
+
stage: ShadowStage;
|
|
13
|
+
difficulty: ShadowDifficulty;
|
|
14
|
+
inputTokens: number;
|
|
15
|
+
expectedOutputTokens: number;
|
|
16
|
+
candidates: string[];
|
|
17
|
+
spentTodayUsd: number;
|
|
18
|
+
dailyCapUsd: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface ShadowArmFire {
|
|
22
|
+
model: string;
|
|
23
|
+
estUsd: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface ShadowArmSkipped {
|
|
27
|
+
model: string;
|
|
28
|
+
reason: 'over-daily-cap' | 'unknown-price';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface ShadowArmsPlan {
|
|
32
|
+
fire: ShadowArmFire[];
|
|
33
|
+
skipped: ShadowArmSkipped[];
|
|
34
|
+
remainingUsd: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function planShadowArms(input: PlanShadowArmsInput): ShadowArmsPlan {
|
|
38
|
+
const fire: ShadowArmFire[] = [];
|
|
39
|
+
const skipped: ShadowArmSkipped[] = [];
|
|
40
|
+
let remainingUsd = input.dailyCapUsd - input.spentTodayUsd;
|
|
41
|
+
let overDailyCap = false;
|
|
42
|
+
|
|
43
|
+
for (const model of input.candidates) {
|
|
44
|
+
// Once the cap is crossed, every later arm is over-daily-cap — even one
|
|
45
|
+
// whose price is unknown (the cap decision comes first).
|
|
46
|
+
if (overDailyCap) {
|
|
47
|
+
skipped.push({ model, reason: 'over-daily-cap' });
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const estimate = estimateLlmCost({
|
|
51
|
+
model,
|
|
52
|
+
inputTokens: input.inputTokens,
|
|
53
|
+
outputTokens: input.expectedOutputTokens,
|
|
54
|
+
});
|
|
55
|
+
if (estimate.kind !== 'known') {
|
|
56
|
+
skipped.push({ model, reason: 'unknown-price' });
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (estimate.usd > remainingUsd) {
|
|
60
|
+
skipped.push({ model, reason: 'over-daily-cap' });
|
|
61
|
+
overDailyCap = true;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
fire.push({ model, estUsd: estimate.usd });
|
|
65
|
+
remainingUsd -= estimate.usd;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
debug.log('budget.shadow-arms', 'planned', {
|
|
69
|
+
stage: input.stage,
|
|
70
|
+
difficulty: input.difficulty,
|
|
71
|
+
fire: fire.length,
|
|
72
|
+
skipped: skipped.length,
|
|
73
|
+
remainingUsd,
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
return { fire, skipped, remainingUsd };
|
|
77
|
+
}
|
package/src/budget/types.ts
CHANGED
|
@@ -158,8 +158,9 @@ export type ResetCreditExpiryAxis =
|
|
|
158
158
|
| { readonly status: 'expired'; readonly expiresAt: string; readonly hasUnknownExpiry: boolean };
|
|
159
159
|
|
|
160
160
|
export interface AccountUsageRow {
|
|
161
|
-
/** `zai` = GLM Coding Plan(ZAI-CODING-PLAN-PROVIDER) — `ZAI_API_KEY` 가 있을 때만 행이 생긴다.
|
|
162
|
-
|
|
161
|
+
/** `zai` = GLM Coding Plan(ZAI-CODING-PLAN-PROVIDER) — `ZAI_API_KEY` 가 있을 때만 행이 생긴다.
|
|
162
|
+
* `claude` = Claude Code 구독(CLAUDE-USAGE-WINDOW) — OAuth 토큰이 있을 때만 행이 생긴다. */
|
|
163
|
+
readonly provider: 'codex' | 'claude' | 'grok' | 'openrouter' | 'zai';
|
|
163
164
|
readonly accountName: string;
|
|
164
165
|
readonly accountCount: number;
|
|
165
166
|
readonly soleAccount: boolean;
|
|
@@ -173,7 +174,8 @@ export interface AccountUsageRow {
|
|
|
173
174
|
export interface UnifiedUsageReport {
|
|
174
175
|
readonly rows: readonly AccountUsageRow[];
|
|
175
176
|
/** `zai` 는 키가 있을 때만 실린다(없으면 종전 JSON 과 같다). */
|
|
176
|
-
|
|
177
|
+
/** `claude` 도 토큰이 있을 때만 실린다(없으면 종전 JSON 과 같다). */
|
|
178
|
+
readonly accountCounts: Readonly<Record<'codex' | 'grok' | 'openrouter', number>> & { readonly claude?: number; readonly zai?: number };
|
|
177
179
|
/** GLM Coding Plan 상세(창 · 우리 적산 · 잔액 사용 · 마지막 한도 코드) — 키가 있을 때만. */
|
|
178
180
|
readonly zaiCodingPlan?: import('../llm/zai-coding-plan.js').ZaiUsageView;
|
|
179
181
|
}
|