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
|
@@ -3,12 +3,16 @@
|
|
|
3
3
|
// Codex: enumerate known account names, fetch each via the existing
|
|
4
4
|
// ProviderFetcher with CODEX_HOME on the child env only.
|
|
5
5
|
// Grok: this wiring has no multi-account list — 0 or 1 current-credential row.
|
|
6
|
-
// Claude
|
|
6
|
+
// Claude Code (2026-10-11 CLAUDE-USAGE-WINDOW): subscription row — 5-hour window
|
|
7
|
+
// (credits axis) + 7-day window (subscription axis), from the OAuth usage endpoint.
|
|
8
|
+
// Gemini is intentionally out of this landing.
|
|
7
9
|
|
|
8
10
|
import { createCodexFetcher, type CodexFetcherOpts } from './fetchers/codex.js';
|
|
11
|
+
import { createClaudeFetcher, resolveClaudeAccessToken } from './fetchers/claude.js';
|
|
9
12
|
import {
|
|
10
13
|
fetchGrokUsage,
|
|
11
14
|
GROK_SUBSCRIPTION_AXIS,
|
|
15
|
+
grokUsageToSubscriptionAxis,
|
|
12
16
|
grokUsageToCreditAxis,
|
|
13
17
|
type GrokUsageResult,
|
|
14
18
|
} from '../grok/usage.js';
|
|
@@ -19,10 +23,16 @@ import { loadTokens } from '../oauth/store.js';
|
|
|
19
23
|
import { envLiteral } from '../platform/env-literal.js';
|
|
20
24
|
import { describeResetCreditExpiry } from './codex-reset-credit-state.js';
|
|
21
25
|
import { visibleWidth } from '../tui.js';
|
|
26
|
+
import { debug } from '../debug/log.js';
|
|
22
27
|
import { listCodexResetCredits, type CodexResetCreditsResult } from './codex-reset-credits.js';
|
|
28
|
+
import {
|
|
29
|
+
buildZaiUsageView, fetchZaiQuota, getZaiApiKey, readZaiLedger,
|
|
30
|
+
type ZaiLedgerRecord, type ZaiQuotaResult, type ZaiUsageView,
|
|
31
|
+
} from '../llm/zai-coding-plan.js';
|
|
23
32
|
import type {
|
|
24
33
|
AccountUsageRow,
|
|
25
34
|
CreditAxis,
|
|
35
|
+
RateWindow,
|
|
26
36
|
ResetCreditExpiryAxis,
|
|
27
37
|
SubscriptionAxis,
|
|
28
38
|
UnifiedUsageReport,
|
|
@@ -50,24 +60,247 @@ export interface UnifiedUsageDeps {
|
|
|
50
60
|
/** 결정 2026-09-23 — OpenRouter 선불 크레딧 조회 seam. 없으면 실키로 `/api/v1/credits`. */
|
|
51
61
|
readonly openRouterKey?: () => string | undefined;
|
|
52
62
|
readonly fetchOpenRouterImpl?: typeof fetch;
|
|
63
|
+
/** ZAI-CODING-PLAN-PROVIDER seam — 키 «있음» 판정(값은 안 쓴다) · 공식 조회 · 원장. */
|
|
64
|
+
readonly zaiKey?: () => string | undefined;
|
|
65
|
+
readonly fetchZaiQuota?: () => Promise<ZaiQuotaResult>;
|
|
66
|
+
readonly readZaiLedger?: () => ZaiLedgerRecord[];
|
|
67
|
+
/** Claude Code OAuth 토큰 해석 심 — 없으면 조회를 안 탄다(토큰 없음 = 행 없음). */
|
|
68
|
+
readonly resolveClaudeToken?: () => string | null;
|
|
69
|
+
/** Claude 사용량 조회 심 — `createClaudeFetcher().fetch()` 모양. */
|
|
70
|
+
readonly fetchClaude?: () => Promise<UsageSnapshot>;
|
|
71
|
+
/** 캐시 «아래»의 원 조회 심 — 주면 15분/5분 캐시를 거친다(`fetchClaude` 는 캐시를 우회한다). */
|
|
72
|
+
readonly fetchClaudeUncached?: () => Promise<UsageSnapshot>;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** 공급자별 실패 격리(2026-10-11) — collector 가 «try 밖에서» 던지면 그 공급자만 한 error 행으로 바꾼다.
|
|
76
|
+
* ⛔ 종전 `Promise.all` 은 한 공급자의 예외(예: 키 조회 seam throw)가 usage «전체» 를 죽였다.
|
|
77
|
+
* `allSettled` 로 바꾸고 rejected 는 여기서 한 행으로 접는다 — 다른 공급자 행은 그대로 산다. */
|
|
78
|
+
type ZaiOutcome = { rows: AccountUsageRow[]; view: ZaiUsageView };
|
|
79
|
+
|
|
80
|
+
function isolateProviderRows(
|
|
81
|
+
provider: AccountUsageRow['provider'],
|
|
82
|
+
settled: PromiseSettledResult<AccountUsageRow[] | ZaiOutcome | null>,
|
|
83
|
+
): { rows: AccountUsageRow[]; zai: ZaiOutcome | null } {
|
|
84
|
+
if (settled.status === 'fulfilled') {
|
|
85
|
+
const value = settled.value;
|
|
86
|
+
if (value === null) return { rows: [], zai: null };
|
|
87
|
+
if (Array.isArray(value)) return { rows: value, zai: null };
|
|
88
|
+
return { rows: value.rows, zai: value };
|
|
89
|
+
}
|
|
90
|
+
const detail = settled.reason instanceof Error ? settled.reason.message : String(settled.reason);
|
|
91
|
+
debug.log('usage', 'provider-failed', { provider, detail });
|
|
92
|
+
return {
|
|
93
|
+
rows: [{
|
|
94
|
+
provider,
|
|
95
|
+
accountName: 'default',
|
|
96
|
+
accountCount: 1,
|
|
97
|
+
soleAccount: true,
|
|
98
|
+
credits: { status: 'error', detail },
|
|
99
|
+
subscription: { status: 'unavailable', reason: 'query-does-not-supply' },
|
|
100
|
+
resetCredits: { status: 'unavailable', detail },
|
|
101
|
+
}],
|
|
102
|
+
zai: null,
|
|
103
|
+
};
|
|
53
104
|
}
|
|
54
105
|
|
|
55
106
|
export async function collectUnifiedUsage(deps: UnifiedUsageDeps = {}): Promise<UnifiedUsageReport> {
|
|
56
|
-
const [
|
|
107
|
+
const [codexSettled, claudeSettled, grokSettled, openRouterSettled, zaiSettled] = await Promise.allSettled([
|
|
57
108
|
collectCodexRows(deps),
|
|
109
|
+
collectClaudeRows(deps),
|
|
58
110
|
collectGrokRows(deps),
|
|
59
111
|
collectOpenRouterRows(deps),
|
|
112
|
+
collectZaiRows(deps),
|
|
60
113
|
]);
|
|
114
|
+
const codex = isolateProviderRows('codex', codexSettled);
|
|
115
|
+
const claude = isolateProviderRows('claude', claudeSettled);
|
|
116
|
+
const grok = isolateProviderRows('grok', grokSettled);
|
|
117
|
+
const openRouter = isolateProviderRows('openrouter', openRouterSettled);
|
|
118
|
+
const zai = isolateProviderRows('zai', zaiSettled);
|
|
119
|
+
const zaiRows = zai.zai?.rows ?? zai.rows;
|
|
61
120
|
return {
|
|
62
|
-
rows: [...
|
|
121
|
+
rows: [...codex.rows, ...claude.rows, ...grok.rows, ...openRouter.rows, ...zaiRows],
|
|
63
122
|
accountCounts: {
|
|
64
|
-
codex:
|
|
65
|
-
grok:
|
|
66
|
-
openrouter:
|
|
123
|
+
codex: codex.rows.length,
|
|
124
|
+
grok: grok.rows.length,
|
|
125
|
+
openrouter: openRouter.rows.length,
|
|
126
|
+
// ⛔ claude 도 토큰이 없으면(행 0) 칸을 안 싣는다 — 종전 JSON·문면과 바이트 동일(0행 ≠ 0% 사용).
|
|
127
|
+
...(claude.rows.length > 0 ? { claude: claude.rows.length } : {}),
|
|
128
|
+
// ⛔ 키가 없으면 칸 자체를 안 싣는다 — 종전 JSON·문면과 바이트 동일.
|
|
129
|
+
// 종전과 같게: 조회가 성공했으면(창이 비어도) zai 1 · 실패해 error 행만 남았어도 1(실패 행도 센다).
|
|
130
|
+
...(zai.zai || zai.rows.length > 0 ? { zai: 1 } : {}),
|
|
67
131
|
},
|
|
132
|
+
...(zai.zai ? { zaiCodingPlan: zai.zai.view } : {}),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** 실 OAuth usage 엔드포인트는 5~10분 간격에도 429 를 낸다(fetchers/claude.ts 머리말 · 기본 주기 15분).
|
|
137
|
+
* nexus `/api/usage` 는 30초 캐시로 이 조립을 부르므로, 기본 조회 경로(심 없음)는 성공 스냅숏을 15분 재사용한다. */
|
|
138
|
+
const CLAUDE_USAGE_CACHE_MS = 15 * 60_000;
|
|
139
|
+
/** 실패(429 등)도 5분 재사용한다 — 429 가 이어지는 동안 30초마다 다시 치지 않게. */
|
|
140
|
+
const CLAUDE_USAGE_FAILURE_CACHE_MS = 5 * 60_000;
|
|
141
|
+
type ClaudeUsageCacheEntry = { readonly at: number; readonly token: string } & (
|
|
142
|
+
| { readonly ok: true; readonly snap: UsageSnapshot }
|
|
143
|
+
| { readonly ok: false; readonly error: unknown });
|
|
144
|
+
let claudeUsageCache: ClaudeUsageCacheEntry | null = null;
|
|
145
|
+
|
|
146
|
+
/** 시험 전용 — 모듈 캐시를 비운다. */
|
|
147
|
+
export function resetClaudeUsageCacheForTest(): void {
|
|
148
|
+
claudeUsageCache = null;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async function fetchClaudeCached(token: string, nowMs: number, fetchRaw: () => Promise<UsageSnapshot>): Promise<UsageSnapshot> {
|
|
152
|
+
const c = claudeUsageCache;
|
|
153
|
+
// 캐시 키 = 토큰 — 토큰이 바뀌면(재로그인·계정 교체) 옛 계정 값을 새 행으로 보이지 않는다.
|
|
154
|
+
if (c && c.token === token && nowMs - c.at < (c.ok ? CLAUDE_USAGE_CACHE_MS : CLAUDE_USAGE_FAILURE_CACHE_MS)) {
|
|
155
|
+
if (c.ok) return c.snap;
|
|
156
|
+
throw c.error;
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
const snap = await fetchRaw();
|
|
160
|
+
claudeUsageCache = { at: nowMs, token, ok: true, snap };
|
|
161
|
+
return snap;
|
|
162
|
+
} catch (error) {
|
|
163
|
+
claudeUsageCache = { at: nowMs, token, ok: false, error };
|
|
164
|
+
throw error;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** Claude Code 구독 행 — 5시간 창(credits 축) ⊕ 7일 창(subscription 축).
|
|
169
|
+
* ⛔ 토큰이 없으면 행을 «안» 만든다(0행 ≠ 0% 사용) — openrouter·zai 키와 같은 접기. */
|
|
170
|
+
async function collectClaudeRows(deps: UnifiedUsageDeps): Promise<AccountUsageRow[]> {
|
|
171
|
+
// ⛔ 시험 런타임은 심이 없으면 «토큰 없음»으로 본다 — 실제 자격 파일을 읽으면
|
|
172
|
+
// 심을 모르는 옛 시험이 실제 네트워크를 치게 된다(openrouter·zai 키와 같은 이유).
|
|
173
|
+
const resolveToken = deps.resolveClaudeToken
|
|
174
|
+
?? (process.env.NODE_ENV === 'test' ? () => null : resolveClaudeAccessToken);
|
|
175
|
+
let token: string | null;
|
|
176
|
+
try {
|
|
177
|
+
token = resolveToken();
|
|
178
|
+
} catch (err) {
|
|
179
|
+
// 자격 파일이 깨진 경우를 «토큰 없음»과 가를 수 있게 관측만 남긴다(행은 안 만든다).
|
|
180
|
+
debug.log('usage', 'claude-token-resolve-failed', { detail: err instanceof Error ? err.message : String(err) });
|
|
181
|
+
token = null;
|
|
182
|
+
}
|
|
183
|
+
if (!token) return [];
|
|
184
|
+
const base = {
|
|
185
|
+
provider: 'claude' as const,
|
|
186
|
+
accountName: 'default',
|
|
187
|
+
accountCount: 1,
|
|
188
|
+
soleAccount: true,
|
|
189
|
+
resetCredits: { status: 'not-applicable' } as const,
|
|
190
|
+
};
|
|
191
|
+
const tokenKey = token;
|
|
192
|
+
const fetchClaude = deps.fetchClaude ?? (() => fetchClaudeCached(
|
|
193
|
+
tokenKey, (deps.now ?? Date.now)(), deps.fetchClaudeUncached ?? (() => createClaudeFetcher().fetch())));
|
|
194
|
+
try {
|
|
195
|
+
const snap = await fetchClaude();
|
|
196
|
+
const fiveHour = snap.windows.find((w) => w.model === undefined && w.kind === 'session');
|
|
197
|
+
const weekly = snap.windows.find((w) => w.model === undefined && w.kind === 'weekly');
|
|
198
|
+
return [{ ...base, credits: claudeCreditsFromWindow(fiveHour), subscription: claudeSubscriptionFromWindow(weekly) }];
|
|
199
|
+
} catch (err) {
|
|
200
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
201
|
+
debug.log('usage', 'claude-fetch-failed', { detail });
|
|
202
|
+
return [{
|
|
203
|
+
...base,
|
|
204
|
+
credits: { status: 'error', detail },
|
|
205
|
+
subscription: { status: 'unavailable', reason: 'query-does-not-supply' },
|
|
206
|
+
}];
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function claudeCreditsFromWindow(window: RateWindow | undefined): CreditAxis {
|
|
211
|
+
const periodEnd = window && isValidEpochMs(window.resetsAt) ? new Date(window.resetsAt) : null;
|
|
212
|
+
const periodStartEpoch = periodEnd !== null && window !== undefined && isPositiveFinite(window.windowMinutes)
|
|
213
|
+
? periodEnd.getTime() - window.windowMinutes * 60_000
|
|
214
|
+
: null;
|
|
215
|
+
const periodStart = periodStartEpoch !== null && isValidDateMs(periodStartEpoch) ? new Date(periodStartEpoch) : null;
|
|
216
|
+
return {
|
|
217
|
+
status: 'ok',
|
|
218
|
+
usedPercent: window ? window.used : null,
|
|
219
|
+
periodType: window?.kind ?? null,
|
|
220
|
+
periodStart: periodStart?.toISOString() ?? null,
|
|
221
|
+
periodEnd: periodEnd?.toISOString() ?? null,
|
|
222
|
+
monthlyLimit: null,
|
|
223
|
+
used: window ? window.used : null,
|
|
224
|
+
onDemandCap: null,
|
|
225
|
+
onDemandUsed: null,
|
|
226
|
+
prepaidBalance: null,
|
|
227
|
+
balance: null,
|
|
228
|
+
hasCredits: null,
|
|
229
|
+
unlimited: null,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function claudeSubscriptionFromWindow(window: RateWindow | undefined): SubscriptionAxis {
|
|
234
|
+
if (!window) return { status: 'unavailable', reason: 'query-does-not-supply' };
|
|
235
|
+
return {
|
|
236
|
+
status: 'available',
|
|
237
|
+
remainingPercent: window.remainingPercent,
|
|
238
|
+
resetsAt: window.resetsAt,
|
|
239
|
+
windowKind: window.kind,
|
|
68
240
|
};
|
|
69
241
|
}
|
|
70
242
|
|
|
243
|
+
/** ZAI-CODING-PLAN-PROVIDER — GLM Coding Plan 의 5h·주 창 ⊕ 잔액(extra usage) 사용.
|
|
244
|
+
* ⓒ 공식 조회(`/api/monitor/usage/quota/limit`)가 되면 그 값 · 안 되면 ⓐ 우리 적산 ⊕ ⓑ 429 리셋 시각으로 «추정».
|
|
245
|
+
* ⛔ 키가 없으면 행을 «안» 만든다. ⛔ 시험 런타임은 seam 이 없으면 «키 없음»(키 캐시는 파일이라 스크럽을 통과한다). */
|
|
246
|
+
async function collectZaiRows(deps: UnifiedUsageDeps): Promise<{ rows: AccountUsageRow[]; view: ZaiUsageView } | null> {
|
|
247
|
+
// ⛔ 시험 런타임(NODE_ENV=test)은 seam 이 없으면 «env 의 ZAI_API_KEY 만» 본다 — 키 캐시 «파일»은 env 스크럽을 통과해
|
|
248
|
+
// seam 을 모르는 옛 usage 시험이 실제 Z.ai 를 치게 되기 때문이다. env 로 키를 주면 test 에서도 행이 선다.
|
|
249
|
+
const key = (deps.zaiKey ?? (process.env.NODE_ENV === 'test' ? () => process.env.ZAI_API_KEY?.trim() || undefined : () => getZaiApiKey()))();
|
|
250
|
+
if (!key) return null;
|
|
251
|
+
const nowMs = (deps.now ?? Date.now)();
|
|
252
|
+
// ⛔ 조회가 «던져도» usage 전체를 죽이지 않는다 — 실패는 결과값으로 바꿔 추정 표로 간다.
|
|
253
|
+
const quota: ZaiQuotaResult = await (deps.fetchZaiQuota ?? (() => fetchZaiQuota()))()
|
|
254
|
+
.catch((error: unknown) => ({ status: 'error' as const, detail: error instanceof Error ? error.message : String(error) }));
|
|
255
|
+
const view = buildZaiUsageView(quota, (deps.readZaiLedger ?? (() => readZaiLedger()))(), nowMs);
|
|
256
|
+
const base = { provider: 'zai' as const, accountCount: 1, soleAccount: true, resetCredits: { status: 'not-applicable' } as const };
|
|
257
|
+
const sourceLabel = { official: '공식', next_flush_time: 'next_flush_time', estimated: '추정' } as const;
|
|
258
|
+
const rows: AccountUsageRow[] = view.windows.map((w) => {
|
|
259
|
+
const windowMs = w.window === '5h' ? 5 * 3_600_000 : 7 * 86_400_000;
|
|
260
|
+
const usedPercent = w.limit > 0 ? Math.round((w.used / w.limit) * 1000) / 10 : null;
|
|
261
|
+
const end = w.resetAt !== null && isValidEpochMs(w.resetAt) ? new Date(w.resetAt) : null;
|
|
262
|
+
const kind: WindowKind = w.window === '5h' ? 'session' : 'weekly';
|
|
263
|
+
return {
|
|
264
|
+
...base,
|
|
265
|
+
accountName: w.window === '5h' ? 'plan-5h' : 'plan-week',
|
|
266
|
+
credits: {
|
|
267
|
+
status: 'ok',
|
|
268
|
+
usedPercent,
|
|
269
|
+
periodType: kind,
|
|
270
|
+
periodStart: end ? new Date(end.getTime() - windowMs).toISOString() : null,
|
|
271
|
+
periodEnd: end?.toISOString() ?? null,
|
|
272
|
+
monthlyLimit: null,
|
|
273
|
+
used: w.used,
|
|
274
|
+
onDemandCap: null,
|
|
275
|
+
onDemandUsed: null,
|
|
276
|
+
prepaidBalance: null,
|
|
277
|
+
balance: null,
|
|
278
|
+
hasCredits: null,
|
|
279
|
+
unlimited: false,
|
|
280
|
+
},
|
|
281
|
+
// 리셋 시각을 모르면 «available» 로 NaN 을 흘리지 않는다.
|
|
282
|
+
subscription: usedPercent === null || !end
|
|
283
|
+
? { status: 'unavailable', reason: 'query-does-not-supply' }
|
|
284
|
+
: { status: 'available', remainingPercent: Math.round((100 - usedPercent) * 10) / 10, resetsAt: end.getTime(), windowKind: kind },
|
|
285
|
+
// ⓐ 우리 적산을 공식 값 옆에 같이 둔다 — 공식은 정수 크레딧으로 내려 작은 호출이 0 으로 보인다(10-11 실측).
|
|
286
|
+
note: `${w.used}/${w.limit} 크레딧 · 출처=${sourceLabel[w.source]}${w.resetAt === null ? ' · 리셋 시각 모름' : ''}`
|
|
287
|
+
+ (w.source === 'official' ? ` · elanous 적산 ${w.window === '5h' ? view.local.fiveHour.used : view.local.weekly.used}` : ''),
|
|
288
|
+
};
|
|
289
|
+
});
|
|
290
|
+
rows.push({
|
|
291
|
+
...base,
|
|
292
|
+
accountName: 'extra-usage',
|
|
293
|
+
credits: {
|
|
294
|
+
status: 'ok', usedPercent: null, periodType: 'extra-usage', periodStart: null, periodEnd: null,
|
|
295
|
+
monthlyLimit: null, used: view.balanceCredits, onDemandCap: null, onDemandUsed: null,
|
|
296
|
+
prepaidBalance: null, balance: null, hasCredits: null, unlimited: false,
|
|
297
|
+
},
|
|
298
|
+
subscription: { status: 'unavailable', reason: 'not-a-subscription' },
|
|
299
|
+
note: `잔액 사용 ${view.balanceCredits} 크레딧(추정 · 최근 7일)${view.lastLimit ? ` · 마지막 한도 코드 ${view.lastLimit.code}` : ''}`,
|
|
300
|
+
});
|
|
301
|
+
return { rows, view };
|
|
302
|
+
}
|
|
303
|
+
|
|
71
304
|
async function collectCodexRows(deps: UnifiedUsageDeps): Promise<AccountUsageRow[]> {
|
|
72
305
|
const listed = (deps.listCodexAccounts ?? listCodexAccountsInStore)();
|
|
73
306
|
const accounts = listed;
|
|
@@ -138,7 +371,11 @@ async function collectGrokRows(deps: UnifiedUsageDeps): Promise<AccountUsageRow[
|
|
|
138
371
|
resetCredits: { status: 'not-applicable' } as const,
|
|
139
372
|
};
|
|
140
373
|
if (result.status === 'ok') {
|
|
141
|
-
return [{
|
|
374
|
+
return [{
|
|
375
|
+
...base,
|
|
376
|
+
subscription: grokUsageToSubscriptionAxis(result.usage),
|
|
377
|
+
credits: grokUsageToCreditAxis(result.usage),
|
|
378
|
+
}];
|
|
142
379
|
}
|
|
143
380
|
if (result.status === 'no-subscription') {
|
|
144
381
|
return [{ ...base, credits: { status: 'no-subscription' } }];
|
|
@@ -284,7 +521,7 @@ export function formatUsageCompact(report: UnifiedUsageReport, options: { width:
|
|
|
284
521
|
const reset = subscription.status === 'available' ? subscription.resetsAt
|
|
285
522
|
: credits.status === 'ok' && credits.periodEnd ? Date.parse(credits.periodEnd) : Number.NaN;
|
|
286
523
|
const periodLabel = period ? `${formatCompactPeriod(period)} ` : '';
|
|
287
|
-
const when = period === 'prepaid-usd' ? '' : !isValidEpochMs(reset)
|
|
524
|
+
const when = period === 'prepaid-usd' || period === 'extra-usage' ? '' : !isValidEpochMs(reset)
|
|
288
525
|
? ` · ${periodLabel}시각 모름`
|
|
289
526
|
: reset <= options.nowMs
|
|
290
527
|
? ` · ${periodLabel}재조회 필요`
|
|
@@ -351,6 +588,13 @@ export function formatUnifiedUsage(report: UnifiedUsageReport): string {
|
|
|
351
588
|
const count = report.accountCounts[provider];
|
|
352
589
|
lines.push(` ${provider} accounts=${count}${count === 1 ? ' (하나뿐)' : count === 0 ? ' (없음)' : ''}`);
|
|
353
590
|
}
|
|
591
|
+
// ⛔ claude 토큰이 없으면 줄을 안 낸다 — 종전 문면과 바이트 동일.
|
|
592
|
+
if (report.accountCounts.claude !== undefined) {
|
|
593
|
+
const count = report.accountCounts.claude;
|
|
594
|
+
lines.push(` claude accounts=${count}${count === 1 ? ' (하나뿐)' : ''} (Claude Code 구독 · 5시간 창 ⊕ 7일 창)`);
|
|
595
|
+
}
|
|
596
|
+
// ⛔ 키가 없으면 줄을 안 낸다 — 종전 문면과 바이트 동일.
|
|
597
|
+
if (report.accountCounts.zai !== undefined) lines.push(` zai accounts=${report.accountCounts.zai} (GLM Coding Plan)`);
|
|
354
598
|
lines.push(' provider account accounts credits.usedPercent credits.window window-resets-in reset-credit-expiry subscription');
|
|
355
599
|
for (const row of report.rows) {
|
|
356
600
|
lines.push(formatRow(row));
|
|
@@ -364,7 +608,7 @@ function formatRow(row: AccountUsageRow): string {
|
|
|
364
608
|
const resetsIn = formatWindowResetsIn(row.credits);
|
|
365
609
|
const resetCredits = formatResetCreditExpiryCell(row.resetCredits);
|
|
366
610
|
const subscription = formatSubscriptionCell(row.subscription);
|
|
367
|
-
return ` ${row.provider.padEnd(10)} ${row.accountName.padEnd(11)} ${String(row.accountCount).padEnd(8)} ${credits.padEnd(20)} ${window.padEnd(26)} ${resetsIn.padEnd(22)} ${resetCredits.padEnd(36)} ${subscription}`;
|
|
611
|
+
return ` ${row.provider.padEnd(10)} ${row.accountName.padEnd(11)} ${String(row.accountCount).padEnd(8)} ${credits.padEnd(20)} ${window.padEnd(26)} ${resetsIn.padEnd(22)} ${resetCredits.padEnd(36)} ${subscription}${row.note ? ` — ${row.note}` : ''}`;
|
|
368
612
|
}
|
|
369
613
|
|
|
370
614
|
function formatResetCreditExpiryCell(expiry: ResetCreditExpiryAxis): string {
|
|
@@ -381,6 +625,7 @@ function formatResetCreditExpiryCell(expiry: ResetCreditExpiryAxis): string {
|
|
|
381
625
|
|
|
382
626
|
function formatCreditsCell(credits: CreditAxis): string {
|
|
383
627
|
if (credits.status !== 'ok') return credits.status;
|
|
628
|
+
if (credits.periodType === 'extra-usage') return `${credits.used ?? 0} cr`;
|
|
384
629
|
if (credits.usedPercent === null) return 'unknown';
|
|
385
630
|
// 선불 달러 — 퍼센트만으로는 «얼마 남았나»를 못 읽는다.
|
|
386
631
|
if (credits.periodType === 'prepaid-usd' && credits.balance !== null) return `${credits.usedPercent}% ($${credits.balance} left)`;
|
|
@@ -390,6 +635,7 @@ function formatCreditsCell(credits: CreditAxis): string {
|
|
|
390
635
|
function formatCreditsWindow(credits: CreditAxis): string {
|
|
391
636
|
if (credits.status !== 'ok') return '—';
|
|
392
637
|
if (credits.periodType === 'prepaid-usd') return 'prepaid (창 없음)';
|
|
638
|
+
if (credits.periodType === 'extra-usage') return 'extra-usage (잔액)';
|
|
393
639
|
const type = credits.periodType ?? '—';
|
|
394
640
|
if (credits.periodStart && credits.periodEnd) {
|
|
395
641
|
return `${type} ${credits.periodStart.slice(0, 10)}~${credits.periodEnd.slice(0, 10)}`;
|
|
@@ -407,7 +653,7 @@ function formatCreditsWindow(credits: CreditAxis): string {
|
|
|
407
653
|
*/
|
|
408
654
|
export function formatWindowResetsIn(credits: CreditAxis, nowMs: number = Date.now()): string {
|
|
409
655
|
if (credits.status !== 'ok') return '—';
|
|
410
|
-
if (credits.periodType === 'prepaid-usd') return 'n/a (리셋 없음)';
|
|
656
|
+
if (credits.periodType === 'prepaid-usd' || credits.periodType === 'extra-usage') return 'n/a (리셋 없음)';
|
|
411
657
|
const end = credits.periodEnd ? Date.parse(credits.periodEnd) : Number.NaN;
|
|
412
658
|
if (!Number.isFinite(end)) return 'unknown';
|
|
413
659
|
const remainMs = end - nowMs;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** BENCH-ISOLATED-ARMS ④ — `elanous bench ls <id>`: 벤치 원장(`<config dir>/bench/<id>.jsonl`)을 읽는 한 자리. */
|
|
2
|
+
import type { Command } from 'commander';
|
|
3
|
+
import { benchLedgerPath, parseBenchSpec, readBenchLedger, renderBenchLs } from '../bench/bench.js';
|
|
4
|
+
import { getElanousConfigDir } from '../elanous-config-dir.js';
|
|
5
|
+
|
|
6
|
+
export interface BenchCliDeps {
|
|
7
|
+
readonly configDir?: () => string;
|
|
8
|
+
readonly write?: (line: string) => void;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function registerBenchCommands(program: Command, deps: BenchCliDeps = {}): Command {
|
|
12
|
+
const bench = program.command('bench').description('벤치 팔(같은 골 · 모델만 다른 발사) 원장 — harness ask/say --bench 가 쓴다');
|
|
13
|
+
bench.command('ls <id>')
|
|
14
|
+
.description('벤치 원장 줄(bench id · base sha · 이미지 pin · 자식 모델 · 라운드)을 읽는다')
|
|
15
|
+
.option('--json', 'JSON 배열로')
|
|
16
|
+
.action((id: string, opts: { json?: boolean }) => {
|
|
17
|
+
const write = deps.write ?? ((line: string) => console.log(line));
|
|
18
|
+
let benchId: string;
|
|
19
|
+
try { benchId = parseBenchSpec(id).id; }
|
|
20
|
+
catch (error) {
|
|
21
|
+
console.error(`❌ ${error instanceof Error ? error.message : String(error)}`);
|
|
22
|
+
process.exitCode = 2;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const configDir = (deps.configDir ?? getElanousConfigDir)();
|
|
26
|
+
const rows = readBenchLedger(benchId, configDir);
|
|
27
|
+
if (opts.json) write(JSON.stringify(rows));
|
|
28
|
+
else {
|
|
29
|
+
write(renderBenchLs(benchId, rows));
|
|
30
|
+
if (rows.length === 0) write(`원장 경로: ${benchLedgerPath(benchId, configDir)}`);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
return bench;
|
|
34
|
+
}
|
package/src/cli/doctor-cli.ts
CHANGED
|
@@ -40,6 +40,7 @@ import type { LlmInventory } from '../llm/local-manager/types.js';
|
|
|
40
40
|
import { buildDoctorBundle } from './doctor-bundle.js';
|
|
41
41
|
import { uploadDoctorBundle } from './doctor-bundle-upload.js';
|
|
42
42
|
import { checkNodeModules, formatNodeModulesCheck, nodeModulesTrees } from './doctor-node-modules.js';
|
|
43
|
+
import { formatHostDoctorLines, runHostDoctor, type HostDoctorExpected, type HostDoctorRemote } from '../fleet/host-doctor.js';
|
|
43
44
|
|
|
44
45
|
function defaultCheckPythonEnv(): { status: 'ok' | 'fixable' | 'manual'; evidence: string; remedy?: string } {
|
|
45
46
|
const c = checkPythonEnv(false);
|
|
@@ -198,6 +199,10 @@ export interface DoctorCliDeps extends DoctorOptions, Pick<DoctorFixDeps, 'home'
|
|
|
198
199
|
/** Inject the upload transport and consent for isolated CLI tests. */
|
|
199
200
|
uploadFetch?: typeof globalThis.fetch;
|
|
200
201
|
confirmBundleUpload?: (message: string) => Promise<boolean>;
|
|
202
|
+
/** `doctor host` 원격 실행(시험 seam) — 기본 = ssh BatchMode · `local` 이면 이 기계. */
|
|
203
|
+
hostDoctorRemote?: HostDoctorRemote;
|
|
204
|
+
/** `doctor host` 가 대조할 HQ 실측값(설치 판 · 이미지 핀) — 없으면 해당 점검은 unmeasured. */
|
|
205
|
+
hostDoctorExpected?: HostDoctorExpected;
|
|
201
206
|
}
|
|
202
207
|
|
|
203
208
|
const repositoryRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../..');
|
|
@@ -1240,6 +1245,22 @@ export function registerDoctorCommand(program: Command, deps: DoctorCliDeps = {}
|
|
|
1240
1245
|
out.log(json ? JSON.stringify(opts.all ? checks : checks[0], null, 2) : checks.map(formatNodeModulesCheck).join('\n'));
|
|
1241
1246
|
if (checks.some((check) => check.status !== 'ok')) setExitCode(1);
|
|
1242
1247
|
});
|
|
1248
|
+
doctor.command('host')
|
|
1249
|
+
.description('Check whether a fleet host stands ready for its role (read-only · setup-status shape)')
|
|
1250
|
+
.argument('<host>', "ssh name, or 'local' for this machine")
|
|
1251
|
+
.option('--role <role>', 'host role: worker or hq', 'worker')
|
|
1252
|
+
.option('--json', 'structured output')
|
|
1253
|
+
.action((host: string, opts: { role: string; json?: boolean }, command: Command) => {
|
|
1254
|
+
if (opts.role !== 'worker' && opts.role !== 'hq') {
|
|
1255
|
+
err.error('--role must be worker or hq');
|
|
1256
|
+
setExitCode(1);
|
|
1257
|
+
return;
|
|
1258
|
+
}
|
|
1259
|
+
const json = opts.json === true || command.parent?.opts().json === true;
|
|
1260
|
+
const report = runHostDoctor({ host, role: opts.role, remote: deps.hostDoctorRemote, expected: deps.hostDoctorExpected });
|
|
1261
|
+
out.log(json ? JSON.stringify(report, null, 2) : formatHostDoctorLines(report).join('\n'));
|
|
1262
|
+
if (!report.ok) setExitCode(1);
|
|
1263
|
+
});
|
|
1243
1264
|
doctor
|
|
1244
1265
|
.option('--credentials', 'show per-credential details in human-readable output')
|
|
1245
1266
|
.option('--bundle', 'write a redacted diagnostics archive for support')
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { detectLocale, type Locale } from '../expression/locale.js';
|
|
2
|
+
import { classifyError } from '../session-runtime/retry-policy.js';
|
|
3
|
+
|
|
4
|
+
export type FriendlyErrorCode =
|
|
5
|
+
| 'credential-missing'
|
|
6
|
+
| 'provider-unknown'
|
|
7
|
+
| 'model-unavailable'
|
|
8
|
+
| 'network'
|
|
9
|
+
| 'quota'
|
|
10
|
+
| 'context-too-long'
|
|
11
|
+
| 'config-broken'
|
|
12
|
+
| 'daemon-down'
|
|
13
|
+
| 'permission'
|
|
14
|
+
| 'unknown-command';
|
|
15
|
+
|
|
16
|
+
export interface FriendlyMessage {
|
|
17
|
+
what: string;
|
|
18
|
+
why: string;
|
|
19
|
+
next: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type FriendlyLanguage = 'ko' | 'en';
|
|
23
|
+
|
|
24
|
+
export const FRIENDLY_ERRORS: Readonly<Record<FriendlyErrorCode, Readonly<Record<FriendlyLanguage, FriendlyMessage>>>> = {
|
|
25
|
+
'credential-missing': {
|
|
26
|
+
ko: { what: '모델에 접속할 자격이 없습니다', why: '이 provider 에 로그인하지 않았거나 키가 없습니다', next: 'elanous login' },
|
|
27
|
+
en: { what: 'No credentials for this model provider', why: 'You have not signed in or set a key', next: 'elanous login' },
|
|
28
|
+
},
|
|
29
|
+
'provider-unknown': {
|
|
30
|
+
ko: { what: '설정된 provider 를 모릅니다', why: 'llm.provider 값이 지원 목록에 없습니다', next: 'elanous config get llm.provider' },
|
|
31
|
+
en: { what: 'Unknown model provider', why: 'llm.provider is not a supported name', next: 'elanous config get llm.provider' },
|
|
32
|
+
},
|
|
33
|
+
'model-unavailable': {
|
|
34
|
+
ko: { what: '이 모델을 쓸 수 없습니다', why: 'provider 와 모델이 맞지 않거나 모델이 없습니다', next: 'elanous config get llm.model' },
|
|
35
|
+
en: { what: 'This model is not available', why: 'The provider and model do not match, or the model does not exist', next: 'elanous config get llm.model' },
|
|
36
|
+
},
|
|
37
|
+
network: {
|
|
38
|
+
ko: { what: '서버에 연결하지 못했습니다', why: '네트워크가 끊겼거나 서버가 응답하지 않습니다', next: 'elanous doctor' },
|
|
39
|
+
en: { what: 'Could not reach the server', why: 'The network is down or the server did not answer', next: 'elanous doctor' },
|
|
40
|
+
},
|
|
41
|
+
quota: {
|
|
42
|
+
ko: { what: '사용 한도에 걸렸습니다', why: '이 계정의 할당량을 다 썼거나 요청이 너무 잦습니다', next: 'elanous usage' },
|
|
43
|
+
en: { what: 'Usage limit reached', why: 'The account quota is used up or requests are too frequent', next: 'elanous usage' },
|
|
44
|
+
},
|
|
45
|
+
'context-too-long': {
|
|
46
|
+
ko: { what: '입력이 너무 깁니다', why: '모델이 한 번에 읽는 양을 넘었습니다', next: 'elanous ask "<더 짧은 질문>"' },
|
|
47
|
+
en: { what: 'The input is too long', why: 'It exceeds what the model reads at once', next: 'elanous ask "<shorter question>"' },
|
|
48
|
+
},
|
|
49
|
+
'config-broken': {
|
|
50
|
+
ko: { what: '설정 파일을 읽지 못했습니다', why: 'config 파일의 JSON 이 깨졌습니다', next: 'elanous doctor --fix' },
|
|
51
|
+
en: { what: 'Could not read the config file', why: 'The config JSON is malformed', next: 'elanous doctor --fix' },
|
|
52
|
+
},
|
|
53
|
+
'daemon-down': {
|
|
54
|
+
ko: { what: '엘라누스 데몬이 떠 있지 않습니다', why: '백그라운드 서비스가 꺼져 있습니다', next: 'elanous nexus' },
|
|
55
|
+
en: { what: 'The elanous daemon is not running', why: 'The background service is stopped', next: 'elanous nexus' },
|
|
56
|
+
},
|
|
57
|
+
permission: {
|
|
58
|
+
ko: { what: '파일에 접근할 권한이 없습니다', why: '이 사용자로 그 경로를 읽거나 쓸 수 없습니다', next: 'elanous doctor' },
|
|
59
|
+
en: { what: 'Permission denied', why: 'This user cannot read or write that path', next: 'elanous doctor' },
|
|
60
|
+
},
|
|
61
|
+
'unknown-command': {
|
|
62
|
+
ko: { what: '모르는 명령입니다', why: '명령 이름이 틀렸거나 이 판에 없습니다', next: 'elanous --help' },
|
|
63
|
+
en: { what: 'Unknown command', why: 'The name is misspelled or not in this version', next: 'elanous --help' },
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
function messageOf(err: unknown): string {
|
|
68
|
+
if (err instanceof Error) return err.message;
|
|
69
|
+
return typeof err === 'string' ? err : '';
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function errnoOf(err: unknown): string {
|
|
73
|
+
if (err && typeof err === 'object') {
|
|
74
|
+
const code = (err as { code?: unknown }).code;
|
|
75
|
+
if (typeof code === 'string') return code;
|
|
76
|
+
}
|
|
77
|
+
return '';
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Maps a thrown value to a friendly-error code by its wording and by the
|
|
81
|
+
* retry-policy category. Returns null when nothing matches. */
|
|
82
|
+
export function classifyFriendlyError(err: unknown): FriendlyErrorCode | null {
|
|
83
|
+
const msg = messageOf(err);
|
|
84
|
+
const errno = errnoOf(err);
|
|
85
|
+
|
|
86
|
+
if (/provider-model compatibility/i.test(msg)) return 'model-unavailable';
|
|
87
|
+
if (/\bunknown provider:/i.test(msg)) return 'provider-unknown';
|
|
88
|
+
if (/\bunavailable:\s+(set|run|configure)\b/i.test(msg)) return 'credential-missing';
|
|
89
|
+
if (/the elanous daemon is not running/i.test(msg)) return 'daemon-down';
|
|
90
|
+
if (/unknown command '/i.test(msg)) return 'unknown-command';
|
|
91
|
+
if (/input exceeds the \d+-token context budget/i.test(msg)) return 'context-too-long';
|
|
92
|
+
if (
|
|
93
|
+
/Unexpected token .*JSON|JSON Parse error|is not valid JSON|JSON at position/i.test(msg) ||
|
|
94
|
+
(err instanceof Error && err.name === 'SyntaxError' && /json/i.test(msg))
|
|
95
|
+
) return 'config-broken';
|
|
96
|
+
if (errno === 'EACCES' || errno === 'EPERM' || /\b(EACCES|EPERM)\b/.test(msg)) return 'permission';
|
|
97
|
+
|
|
98
|
+
switch (classifyError(err)) {
|
|
99
|
+
case 'network-transient': return 'network';
|
|
100
|
+
case 'quota-exceeded':
|
|
101
|
+
case 'rate-limit': return 'quota';
|
|
102
|
+
case 'context-window-exceeded': return 'context-too-long';
|
|
103
|
+
case 'provider-unavailable': return 'credential-missing';
|
|
104
|
+
default: return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Renders one language only (ko, otherwise en). The last line is the one command to run. */
|
|
109
|
+
export function formatFriendlyError(code: FriendlyErrorCode, locale: Locale = detectLocale()): string {
|
|
110
|
+
const language: FriendlyLanguage = locale === 'ko' ? 'ko' : 'en';
|
|
111
|
+
const { what, why, next } = FRIENDLY_ERRORS[code][language];
|
|
112
|
+
return `❌ ${what}\n ↳ ${why}\n ${next}`;
|
|
113
|
+
}
|
package/src/cli/guardian-cli.ts
CHANGED
|
@@ -27,7 +27,32 @@ export function registerGuardianCommands(program: Command): void {
|
|
|
27
27
|
const cfg = getUserConfig();
|
|
28
28
|
// Live activation (and crontab retirement) is a separate operational change.
|
|
29
29
|
if (cfg.guardian?.mode === 'live') throw new Error('guardian live activation is outside GUARD-ONE-a');
|
|
30
|
-
|
|
30
|
+
// The shadow observation is for the tick's entry time, however long the GC's evidence collection takes.
|
|
31
|
+
const tickAt = new Date();
|
|
32
|
+
// Local orphan GC is separate from the guardian's shadow-only schedule execution.
|
|
33
|
+
const orphanGc = cfg.guardian?.orphanGc ?? 'shadow';
|
|
34
|
+
try {
|
|
35
|
+
// off never loads the collector, so no ps snapshot is taken.
|
|
36
|
+
if (orphanGc !== 'off') {
|
|
37
|
+
// Loading the collector is inside the guard too: a GC that cannot even load only observes.
|
|
38
|
+
const { runMachineHeartbeat } = await import('../ops/machine-heartbeat.js');
|
|
39
|
+
await runMachineHeartbeat(plan.jobs.filter((job): job is typeof job & { command: string; cron: string } =>
|
|
40
|
+
job.source === 'crontab' && job.run_via === 'crontab' && !!job.enabled
|
|
41
|
+
&& typeof job.command === 'string' && typeof job.cron === 'string')
|
|
42
|
+
.map(job => ({ command: job.command, cron: job.cron })), { timeZone: plan.timeZone, mode: orphanGc });
|
|
43
|
+
} else {
|
|
44
|
+
// Still one decision line per tick, so «switched off» is distinguishable from «tick never ran».
|
|
45
|
+
const { debug } = await import('../debug/log.js');
|
|
46
|
+
debug.log('ops.orphan-cli', 'decision', { mode: 'off', candidates: 0, collected: 0, alreadyEvidenced: 0, killed: 0 });
|
|
47
|
+
}
|
|
48
|
+
} catch (error) {
|
|
49
|
+
// The logger import is inside the guard as well: if it is the failing module, the shadow tick still runs.
|
|
50
|
+
try {
|
|
51
|
+
const { debug } = await import('../debug/log.js');
|
|
52
|
+
debug.log('ops.orphan-cli', 'observation-failed', { error: String(error) });
|
|
53
|
+
} catch { /* guardian shadow still runs */ }
|
|
54
|
+
}
|
|
55
|
+
const result = await guardianTick(tickAt, plan, { config: cfg });
|
|
31
56
|
await writeStdoutJson(JSON.stringify(result, null, 2) + '\n');
|
|
32
57
|
} finally { db.close(); }
|
|
33
58
|
});
|