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
package/src/llm.ts
CHANGED
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
} from './config.js';
|
|
22
22
|
import { debug, redactSecrets, redactSecretText } from './debug/log.js';
|
|
23
23
|
import { llmUsageCostFields } from './budget/llm-cost.js';
|
|
24
|
+
import { accumulateByokUsage } from './llm/openrouter-byok-cost.js';
|
|
24
25
|
import { ToolCallTiming } from './chat/tool-call-timing.js';
|
|
25
26
|
import {
|
|
26
27
|
dispatchWithParallelSafety,
|
|
@@ -41,6 +42,9 @@ import {
|
|
|
41
42
|
} from './session-runtime/retry-policy.js';
|
|
42
43
|
import { fetchApiWithRetry, OverloadFailoverError, type FetchApiWithRetryOpts } from './session-runtime/retry-api.js';
|
|
43
44
|
import { BedrockProvider, isBedrockCompatibleModel, makeBedrockProvider } from './llm/bedrock-provider.js';
|
|
45
|
+
import { OPEN_WEIGHT_TOOL_DISCIPLINE } from './llm/open-weight-discipline.js';
|
|
46
|
+
import { makeZaiCodingPlanProvider, zaiCodingPlanAvailable } from './llm/zai-coding-plan.js';
|
|
47
|
+
import { isOpenRouterDeepSeekWireModel, nonEmptyReasoningDetails, openRouterDeepSeekCatalogEffort, openRouterDeepSeekEffort, openRouterDeepSeekRequestExtras, openRouterNeedsKimiToolSchema } from './llm/openrouter-deepseek.js';
|
|
44
48
|
import { resolveModelAlias } from './intelligence-map/model-alias.js';
|
|
45
49
|
import { BUILTIN_CATALOG, reasoningEffortCeiling as reasoningEffortCeilingOf } from './intelligence-map/model-catalog.js';
|
|
46
50
|
import { inferProviderFromModel as registryInferProviderFromModel } from './registry/normalize.js';
|
|
@@ -94,7 +98,8 @@ export interface ProviderToolMeta { thoughtSignature?: string; reasoningDetails?
|
|
|
94
98
|
export interface ToolArgsInvalid { chars: number; finishReason: string | null }
|
|
95
99
|
|
|
96
100
|
export type ContentBlock =
|
|
97
|
-
|
|
101
|
+
/** `providerMeta` — OR-DEEPSEEK-TUNE: OpenRouter deepseek/* 의 «도구 없는» assistant 턴 추론(reasoning_details) 운반. 다른 경로는 안 싣는다. */
|
|
102
|
+
| { type: 'text'; text: string; providerMeta?: ProviderToolMeta }
|
|
98
103
|
| { type: 'image'; mediaType: string; base64: string }
|
|
99
104
|
| { type: 'audio'; mediaType: string; base64: string }
|
|
100
105
|
| { type: 'video'; mediaType: string; base64: string }
|
|
@@ -318,7 +323,9 @@ export type LLMStreamEvent =
|
|
|
318
323
|
source?: string;
|
|
319
324
|
revisedPrompt?: string;
|
|
320
325
|
}
|
|
321
|
-
| { type: 'usage'; usage: import('./prompt-cache/types.js').LLMUsage }
|
|
326
|
+
| { type: 'usage'; usage: import('./prompt-cache/types.js').LLMUsage }
|
|
327
|
+
/** OR-DEEPSEEK-TUNE — 도구 호출이 없는 턴의 OpenRouter `reasoning_details`(스트림 끝에 한 번). deepseek/* 에서만 나온다. */
|
|
328
|
+
| { type: 'reasoning_details'; details: Array<Record<string, unknown>> };
|
|
322
329
|
|
|
323
330
|
/** Tool-calling forcing (opencode parity · 2026-07-09). `'auto'` (default) lets
|
|
324
331
|
* the model decide; `'required'` forces at least one tool call; `'none'` blocks
|
|
@@ -338,6 +345,8 @@ export interface LLMOpts {
|
|
|
338
345
|
onUsage?(usage: LLMUsage): void;
|
|
339
346
|
/** Optional model role attached to this request's usage observation. */
|
|
340
347
|
usageRole?: ModelRole;
|
|
348
|
+
/** Optional streamLLM usage-ledger site override (defaults to "stream-llm"). */
|
|
349
|
+
usageSite?: string;
|
|
341
350
|
/**
|
|
342
351
|
* ⭐⭐⭐ `B3`(2026-08-19 · 대표 지시 ②) — ***턴 «안»으로 들어오는 사용자 발화의 배수구.***
|
|
343
352
|
*
|
|
@@ -473,6 +482,8 @@ export interface ToOpenAIMessagesOpts {
|
|
|
473
482
|
acceptUserMessageImages?: boolean;
|
|
474
483
|
/** OpenRouter 전용 — 도구 호출이 든 어시스턴트 메시지에 `reasoning_details` 를 되돌린다. 다른 제공자엔 안 싣는다(모르는 칸 400 방지). */
|
|
475
484
|
echoReasoningDetails?: boolean;
|
|
485
|
+
/** OR-DEEPSEEK-TUNE — deepseek/* 만: 도구 없는 assistant 턴에도 되돌리고, 빈 조각은 걷는다(`src/llm/openrouter-deepseek.ts`). */
|
|
486
|
+
deepSeekReplay?: boolean;
|
|
476
487
|
}
|
|
477
488
|
|
|
478
489
|
/**
|
|
@@ -561,9 +572,10 @@ function toOpenAIMessages(
|
|
|
561
572
|
.filter((b): b is Extract<ContentBlock, { type: 'text' }> => b.type === 'text')
|
|
562
573
|
.map(b => b.text)
|
|
563
574
|
.join('');
|
|
564
|
-
const
|
|
575
|
+
const foundDetails = opts.echoReasoningDetails
|
|
565
576
|
? toolUses.find((t) => t.providerMeta?.reasoningDetails?.length)?.providerMeta?.reasoningDetails
|
|
566
577
|
: undefined;
|
|
578
|
+
const reasoningDetails = opts.deepSeekReplay ? nonEmptyReasoningDetails(foundDetails) : foundDetails;
|
|
567
579
|
return [{
|
|
568
580
|
role: m.role,
|
|
569
581
|
content: textContent || null,
|
|
@@ -589,8 +601,12 @@ function toOpenAIMessages(
|
|
|
589
601
|
// Composer Q3=B is the primary handler; this is the wire-side
|
|
590
602
|
// defensive fallback for non-vision OpenAI / Grok / local routes.
|
|
591
603
|
const acceptUserImages = opts.acceptUserMessageImages ?? true;
|
|
604
|
+
const textTurnDetails = opts.deepSeekReplay && m.role === 'assistant'
|
|
605
|
+
? nonEmptyReasoningDetails(blocks.find((b): b is Extract<ContentBlock, { type: 'text' }> => b.type === 'text' && !!b.providerMeta?.reasoningDetails?.length)?.providerMeta?.reasoningDetails)
|
|
606
|
+
: undefined;
|
|
592
607
|
return [{
|
|
593
608
|
role: m.role,
|
|
609
|
+
...(textTurnDetails ? { reasoning_details: textTurnDetails } : {}),
|
|
594
610
|
content: blocks.map(block => {
|
|
595
611
|
if (block.type === 'text') return { type: 'text', text: block.text };
|
|
596
612
|
if (block.type === 'image') {
|
|
@@ -1126,7 +1142,7 @@ export async function* parseOpenAISSELines(
|
|
|
1126
1142
|
/** OR-TOOLARGS-REPAIR (2026-10-10) — `flagInvalidToolArgs` 가 참이면(OpenRouter 경로) 인자 JSON 파싱 실패를
|
|
1127
1143
|
* `{}` 로 «조용히» 바꾸지 않고 `argsInvalid` 표지를 단다(도구 루프가 실행을 막는다) ⊕ 관측을 남긴다.
|
|
1128
1144
|
* ⛔ 생략·거짓이면 종전과 바이트 동일(다른 공급자 무변경). */
|
|
1129
|
-
parseOpts: { flagInvalidToolArgs?: boolean } = {},
|
|
1145
|
+
parseOpts: { flagInvalidToolArgs?: boolean; emitTrailingReasoningDetails?: boolean } = {},
|
|
1130
1146
|
): AsyncGenerator<LLMStreamEvent, void, unknown> {
|
|
1131
1147
|
const flagInvalidToolArgs = parseOpts.flagInvalidToolArgs === true;
|
|
1132
1148
|
const { parseOpenAIUsage } = await import('./prompt-cache/openai.js');
|
|
@@ -1352,6 +1368,11 @@ export async function* parseOpenAISSELines(
|
|
|
1352
1368
|
yield { type: 'reasoning', kind: 'inline_delta', delta: tail.reasoningDelta };
|
|
1353
1369
|
}
|
|
1354
1370
|
yield* emitHarmonyTools(tail.toolCalls);
|
|
1371
|
+
// OR-DEEPSEEK-TUNE — 도구 호출에 실리지 못한 추론(텍스트만 낸 턴)을 끝에 한 번 낸다. deepseek/* 만 켠다.
|
|
1372
|
+
if (parseOpts.emitTrailingReasoningDetails) {
|
|
1373
|
+
const details = takeReasoningDetails();
|
|
1374
|
+
if (details) yield { type: 'reasoning_details', details };
|
|
1375
|
+
}
|
|
1355
1376
|
}
|
|
1356
1377
|
|
|
1357
1378
|
/** Pick a stable provider name for `fetchApiWithRetry` telemetry from
|
|
@@ -1430,7 +1451,8 @@ async function* streamOpenAIEvents(
|
|
|
1430
1451
|
try {
|
|
1431
1452
|
// OR-TOOLARGS-REPAIR — 깨진 도구 인자 표지는 OpenRouter 엔드포인트에서만 켠다(다른 공급자 무변경).
|
|
1432
1453
|
const flagInvalidToolArgs = inferOpenAIProviderName(url) === 'openrouter';
|
|
1433
|
-
|
|
1454
|
+
const emitTrailingReasoningDetails = flagInvalidToolArgs && typeof body?.model === 'string' && isOpenRouterDeepSeekWireModel(body.model);
|
|
1455
|
+
for await (const ev of parseOpenAISSELines(sseLineStream(response.body!), flagInvalidToolArgs ? { flagInvalidToolArgs, ...(emitTrailingReasoningDetails ? { emitTrailingReasoningDetails } : {}) } : {})) {
|
|
1434
1456
|
if (ev.type === 'text') textChars += ev.delta.length;
|
|
1435
1457
|
else if (ev.type === 'tool_call') toolCalls++;
|
|
1436
1458
|
yield ev;
|
|
@@ -4294,6 +4316,26 @@ function finalizeStreamingProviderModel(provider: LLMProvider, model: string): {
|
|
|
4294
4316
|
return { provider: finalizedProvider, model: finalized.model };
|
|
4295
4317
|
}
|
|
4296
4318
|
|
|
4319
|
+
/** ZAI-POD-CHILD(10-11 실측 · si-task-aaf5d691e4ed) — 레지스트리는 `glm-` 접두를 local 로 본다.
|
|
4320
|
+
* 활성 provider 가 `glm`(`ELANOUS_LLM_PROVIDER=glm` 포함)일 때 모델 이름으로 provider 를 고르는 길
|
|
4321
|
+
* (gate 진단·리뷰 `getProvider(model)`)이 local 로 떨어져 «Local LLM unavailable» 로 죽었다.
|
|
4322
|
+
* ⇒ 그때만 설정 경로(`getProviderForConfig`)를 탄다 — 키가 있으면 Z.ai 공급자, 없으면 OpenRouter 안내 오류.
|
|
4323
|
+
* 활성 provider 가 glm 이 아니면 undefined(종전 그대로). */
|
|
4324
|
+
function activeGlmProviderForModel(model: string): LLMProvider | undefined {
|
|
4325
|
+
if (!model.trim().toLowerCase().startsWith('glm-')) return undefined;
|
|
4326
|
+
let cfg: UserConfig;
|
|
4327
|
+
try {
|
|
4328
|
+
const { getUserConfig } = require('./user-config.js') as typeof import('./user-config.js');
|
|
4329
|
+
cfg = getUserConfig();
|
|
4330
|
+
} catch (e) {
|
|
4331
|
+
debug.log('llm.router', 'getProvider.glm-config-unreadable', { requestedModel: model, error: e instanceof Error ? e.message : String(e) }, { level: 'warn' });
|
|
4332
|
+
return undefined;
|
|
4333
|
+
}
|
|
4334
|
+
if (cfg.llm.provider !== 'glm') return undefined;
|
|
4335
|
+
debug.log('llm.router', 'getProvider.glm-active', { requestedModel: model }, { level: 'info' });
|
|
4336
|
+
return getProviderForConfig(cfg, model);
|
|
4337
|
+
}
|
|
4338
|
+
|
|
4297
4339
|
/**
|
|
4298
4340
|
* Pick a provider based on the model name. If model is undefined, use first
|
|
4299
4341
|
* available provider (preferring DEFAULT_PROVIDER env var if set).
|
|
@@ -4305,6 +4347,8 @@ export function getProvider(model?: string): LLMProvider {
|
|
|
4305
4347
|
// ids (e.g. `claude-opus-4-7`) so prefix matching works. Existing
|
|
4306
4348
|
// full ids pass through unchanged.
|
|
4307
4349
|
const resolved = resolveModelAlias(model) ?? model;
|
|
4350
|
+
const glmDirect = activeGlmProviderForModel(resolved);
|
|
4351
|
+
if (glmDirect) return glmDirect;
|
|
4308
4352
|
// Preserve the historical Chat Completions route for gpt-* model-only
|
|
4309
4353
|
// requests, including future ids that the current catalog does not list.
|
|
4310
4354
|
if (resolved.toLowerCase().startsWith('gpt-')) return PROVIDERS.openai!;
|
|
@@ -4443,6 +4487,7 @@ export function buildMessagesWithContext(
|
|
|
4443
4487
|
// Re-export converters so tests/adapters can assert wire-format correctness.
|
|
4444
4488
|
export { toOpenAIMessage, toOpenAIMessages, toAnthropicMessage, systemToAnthropicString };
|
|
4445
4489
|
export { usesAdaptiveThinking, mapReasoningLevelToAnthropicThinking, mapReasoningLevelToAnthropicEffort, sseLineStream, retryOptsFor }; // src/llm/bedrock-provider.ts
|
|
4490
|
+
export { makeOpenAICompatProvider, makeOpenRouterProvider }; // src/llm/zai-coding-plan.ts
|
|
4446
4491
|
|
|
4447
4492
|
/**
|
|
4448
4493
|
* Best-effort classification of whether a model accepts image inputs.
|
|
@@ -4502,7 +4547,7 @@ export function isLikelyVisionModel(model: string | undefined): boolean {
|
|
|
4502
4547
|
// ⭐ OPENROUTER-OPTIMIZE G9 — `reportedCostUsd`(OpenRouter `usage.cost`)도 싣는다. 빠지면 `stream-llm` 행이
|
|
4503
4548
|
// 실청구액을 잃고 카탈로그 추정(대개 `cost.kind=unknown`)으로 떨어진다(리뷰·저작 행 실측).
|
|
4504
4549
|
// 합산은 토큰 칸과 같은 규약이다 — OpenAI 호환 스트림은 `usage` 를 마지막 청크에 «한 번» 싣는다(누적 반복 보고 아님).
|
|
4505
|
-
type ObservedUsage = Pick<LLMUsage, 'inputTokens' | 'outputTokens' | 'cacheReadInputTokens' | 'cacheCreationInputTokens' | 'reportedCostUsd'>;
|
|
4550
|
+
type ObservedUsage = Pick<LLMUsage, 'inputTokens' | 'outputTokens' | 'cacheReadInputTokens' | 'cacheCreationInputTokens' | 'reportedCostUsd' | 'byok' | 'upstreamCostUsd'>;
|
|
4506
4551
|
|
|
4507
4552
|
type ProviderTextResult =
|
|
4508
4553
|
| { ok: true; full: string; usage: ObservedUsage | 'unmeasured' }
|
|
@@ -4513,7 +4558,7 @@ function accumulateUsage(usage: ObservedUsage | undefined, received: LLMUsage):
|
|
|
4513
4558
|
for (const field of ['inputTokens', 'outputTokens', 'cacheReadInputTokens', 'cacheCreationInputTokens', 'reportedCostUsd'] as const) {
|
|
4514
4559
|
if (received[field] !== undefined) total[field] = (total[field] ?? 0) + received[field];
|
|
4515
4560
|
}
|
|
4516
|
-
return total;
|
|
4561
|
+
return accumulateByokUsage(total, received); // OR-BYOK-COST
|
|
4517
4562
|
}
|
|
4518
4563
|
|
|
4519
4564
|
async function consumeProviderText(
|
|
@@ -4637,7 +4682,7 @@ export async function streamLLM(
|
|
|
4637
4682
|
if (consumed.ok) {
|
|
4638
4683
|
if (consumed.usage !== 'unmeasured') {
|
|
4639
4684
|
try {
|
|
4640
|
-
logAgentTurnUsage(activeModel, consumed.usage, { providerName: activeProvider.name, site: 'stream-llm', role: opts.usageRole });
|
|
4685
|
+
logAgentTurnUsage(activeModel, consumed.usage, { providerName: activeProvider.name, site: opts.usageSite ?? 'stream-llm', role: opts.usageRole });
|
|
4641
4686
|
} catch { /* best-effort observation */ }
|
|
4642
4687
|
}
|
|
4643
4688
|
debug.log('llm', 'outcome', { provider: activeProvider.name, status: 'ok', kind: 'streamLLM', durationMs: Date.now() - started });
|
|
@@ -5121,14 +5166,9 @@ const LOCAL_TOOL_DISCIPLINE = [
|
|
|
5121
5166
|
'- 범위 읽기만으로 판단할 수 없을 때에만 전체 읽기를 선택하고, 읽은 뒤에는 다음 행동을 계속 결정하라.',
|
|
5122
5167
|
].join('\n');
|
|
5123
5168
|
|
|
5124
|
-
|
|
5125
|
-
|
|
5126
|
-
|
|
5127
|
-
'- 도구로 할 수 있는 일은 이번 응답에서 바로 도구를 호출하라. "먼저 읽겠다" 또는 "확인하겠다" 같은 계획만 말하고 응답을 끝내지 마라.',
|
|
5128
|
-
'- 작업을 시작하는 첫 응답에는 도구 호출이 하나 이상 있어야 한다.',
|
|
5129
|
-
'- 도구 호출 인자는 해당 도구의 스키마에 맞는 JSON 으로 내라.',
|
|
5130
|
-
'- 충분한 근거가 모이면 도구 호출 없이 최종 답을 평문으로 써서 끝내라.',
|
|
5131
|
-
].join('\n');
|
|
5169
|
+
// ⭐ 2026-10-11 GLM-PROMPT-TUNE: 상수 정의는 `src/llm/open-weight-discipline.ts` 로 옮겼다(llm.ts 동결 RFC #25983).
|
|
5170
|
+
// llm.ts 는 이 재수출만 남긴다 — 기존 임포트 경로(`./llm.js`)를 그대로 지킨다.
|
|
5171
|
+
export { OPEN_WEIGHT_TOOL_DISCIPLINE };
|
|
5132
5172
|
|
|
5133
5173
|
/** 모델군 → 그 군에 주입할 툴 규율(없으면 `null`). **능력 술어 판** — 2026-08-14.
|
|
5134
5174
|
*
|
|
@@ -8214,11 +8254,16 @@ export async function streamLLMWithTools(
|
|
|
8214
8254
|
},
|
|
8215
8255
|
};
|
|
8216
8256
|
}
|
|
8257
|
+
// OR-DEEPSEEK-TUNE — 마지막 턴의 «도구 없는» 추론(deepseek/* 만 채워진다). 매 턴 시작에 비운다.
|
|
8258
|
+
let turnReasoningDetails: Array<Record<string, unknown>> | undefined;
|
|
8217
8259
|
const emitTurnComplete = (finalAssistantText?: string): void => {
|
|
8218
8260
|
if (finalAssistantText && finalAssistantText.length > 0) {
|
|
8219
8261
|
history.push({
|
|
8220
8262
|
role: 'assistant',
|
|
8221
|
-
content: [{
|
|
8263
|
+
content: [{
|
|
8264
|
+
type: 'text', text: finalAssistantText,
|
|
8265
|
+
...(turnReasoningDetails ? { providerMeta: { reasoningDetails: turnReasoningDetails } } : {}),
|
|
8266
|
+
}],
|
|
8222
8267
|
});
|
|
8223
8268
|
}
|
|
8224
8269
|
handlers.onTurnComplete?.(history.slice(initialHistoryLen));
|
|
@@ -8427,6 +8472,7 @@ export async function streamLLMWithTools(
|
|
|
8427
8472
|
}
|
|
8428
8473
|
}
|
|
8429
8474
|
let turnText = '';
|
|
8475
|
+
turnReasoningDetails = undefined;
|
|
8430
8476
|
const pendingCalls: Array<{
|
|
8431
8477
|
id: string;
|
|
8432
8478
|
name: string;
|
|
@@ -8642,6 +8688,8 @@ export async function streamLLMWithTools(
|
|
|
8642
8688
|
turnText += ev.delta;
|
|
8643
8689
|
fullText += ev.delta;
|
|
8644
8690
|
handlers.onText(ev.delta, fullText);
|
|
8691
|
+
} else if (ev.type === 'reasoning_details') {
|
|
8692
|
+
turnReasoningDetails = ev.details;
|
|
8645
8693
|
} else if (ev.type === 'tool_call') {
|
|
8646
8694
|
pendingCalls.push({
|
|
8647
8695
|
id: ev.id,
|
|
@@ -10938,7 +10986,8 @@ function makeOpenAICompatProvider(
|
|
|
10938
10986
|
throw new Error(`${name} unavailable: configure apiKey via \`elanous setup\``);
|
|
10939
10987
|
}
|
|
10940
10988
|
const activeModel = opts.model || model;
|
|
10941
|
-
const tools = toOpenAITools(opts.tools, name === 'openrouter' && openRouterWireModel(activeModel)
|
|
10989
|
+
const tools = toOpenAITools(opts.tools, name === 'openrouter' && openRouterNeedsKimiToolSchema(openRouterWireModel(activeModel)));
|
|
10990
|
+
const deepSeek = name === 'openrouter' && isOpenRouterDeepSeekWireModel(openRouterWireModel(activeModel));
|
|
10942
10991
|
// OR-TOOLCHOICE-PASS (2026-10-10) — OpenRouter 경로만 호출자 toolChoice 를 싣는다.
|
|
10943
10992
|
// ⛔ grok/openai 호환 경로는 손대지 않는다(무회귀). toolChoice 가 없거나 tools 가 없으면 키 자체를 안 싣는다.
|
|
10944
10993
|
const toolChoice = name === 'openrouter' && tools
|
|
@@ -10967,7 +11016,11 @@ function makeOpenAICompatProvider(
|
|
|
10967
11016
|
acceptToolImagesViaFollowup: followup,
|
|
10968
11017
|
acceptUserMessageImages: followup,
|
|
10969
11018
|
...(name === 'openrouter' ? { echoReasoningDetails: true } : {}),
|
|
11019
|
+
...(deepSeek ? { deepSeekReplay: true } : {}),
|
|
10970
11020
|
}));
|
|
11021
|
+
// OR-DEEPSEEK-TUNE — deepseek/* 만: 설정 기본값의 상류 고정(명시 라우팅이 없을 때) ⊕ 관측 `deepseek-replay`.
|
|
11022
|
+
const deepSeekProvider = deepSeek ? openRouterDeepSeekRequestExtras(openRouterWireModel(activeModel), wireMessages,
|
|
11023
|
+
(wire.extraBody as { provider?: unknown } | undefined)?.provider, cfg.openrouter?.providerPreferences, cfg.openrouter?.upstreamPins) : {};
|
|
10971
11024
|
// OR-ANTHROPIC-CACHE (2026-10-10) — OpenRouter 뒤 anthropic/* · moonshotai/* 만 cache_control 중단점을 싣는다.
|
|
10972
11025
|
// ⛔ 다른 OpenRouter 모델과 grok/openai/local 호환 경로는 이 분기를 안 탄다 — 본문 바이트 동일(무회귀).
|
|
10973
11026
|
const cacheFamily = name === 'openrouter' ? openRouterPromptCacheFamily(openRouterWireModel(activeModel)) : null;
|
|
@@ -11013,6 +11066,7 @@ function makeOpenAICompatProvider(
|
|
|
11013
11066
|
...(tools ? { tools } : {}),
|
|
11014
11067
|
...(toolChoice !== undefined ? { tool_choice: toolChoice } : {}),
|
|
11015
11068
|
...(wire.extraBody ?? {}),
|
|
11069
|
+
...deepSeekProvider,
|
|
11016
11070
|
// OpenRouter alone resolves per-call effort against the configured level and catalog default.
|
|
11017
11071
|
...(name === 'openrouter'
|
|
11018
11072
|
? openRouterReasoningField(activeModel, opts.reasoningEffort, cfg.reasoningLevel)
|
|
@@ -11112,7 +11166,7 @@ const OPENROUTER_REASONING_EFFORT: Record<string, 'low' | 'medium' | 'high'> = {
|
|
|
11112
11166
|
};
|
|
11113
11167
|
function openRouterReasoningField(
|
|
11114
11168
|
model: string, requested: string | undefined, configured: UCLLMConfig['reasoningLevel'],
|
|
11115
|
-
): { reasoning?: { effort: 'low' | 'medium' | 'high' }; verbosity?: 'low' | 'medium' | 'high' } {
|
|
11169
|
+
): { reasoning?: { effort: 'low' | 'medium' | 'high' | 'xhigh' }; verbosity?: 'low' | 'medium' | 'high' } {
|
|
11116
11170
|
const wireModel = openRouterWireModel(model);
|
|
11117
11171
|
// The catalog's model-specific open-weight verdict, not a vendor/slug prefix,
|
|
11118
11172
|
// gates the default: an unregistered release may be closed-weight.
|
|
@@ -11121,13 +11175,18 @@ function openRouterReasoningField(
|
|
|
11121
11175
|
(entry) => entry.id === slug && entry.openWeight === true,
|
|
11122
11176
|
);
|
|
11123
11177
|
const configEffort = configured === 'off' ? undefined : configured;
|
|
11124
|
-
|
|
11125
|
-
const
|
|
11126
|
-
const
|
|
11127
|
-
|
|
11178
|
+
// OR-DEEPSEEK-TUNE — deepseek/* 의 기본은 카탈로그 손 레코드(YAML `reasoning`) · 없으면 아래 기존 폴백.
|
|
11179
|
+
const catalogEffort = requested === undefined && configured === undefined ? openRouterDeepSeekCatalogEffort(model) : undefined;
|
|
11180
|
+
const source = requested !== undefined ? 'call' : configured !== undefined ? 'config' : catalogEffort ? 'catalog' : openWeight ? 'default' : 'none';
|
|
11181
|
+
const effort = requested ?? (configured !== undefined ? configEffort : catalogEffort ?? (openWeight ? 'medium' : undefined));
|
|
11182
|
+
// OR-DEEPSEEK-TUNE — DeepSeek V4 는 자기 표(xhigh·max→xhigh · off→칸 없음 · src/llm/openrouter-deepseek.ts).
|
|
11183
|
+
const deepSeekEffort = openRouterDeepSeekEffort(wireModel, effort);
|
|
11184
|
+
const sent = deepSeekEffort !== undefined ? (deepSeekEffort ?? undefined)
|
|
11185
|
+
: effort !== undefined && Object.hasOwn(OPENROUTER_REASONING_EFFORT, effort)
|
|
11186
|
+
? OPENROUTER_REASONING_EFFORT[effort] : undefined;
|
|
11128
11187
|
const field = sent ? (wireModel.startsWith('anthropic/') ? 'verbosity' : 'reasoning') : 'none';
|
|
11129
11188
|
debug.log('llm.openrouter', 'reasoning', { model, requested: requested ?? null, sent: sent ?? null, source, field });
|
|
11130
|
-
return field === 'verbosity' ? { verbosity: sent }
|
|
11189
|
+
return field === 'verbosity' ? { verbosity: sent as 'low' | 'medium' | 'high' }
|
|
11131
11190
|
: field === 'reasoning' ? { reasoning: { effort: sent! } } : {};
|
|
11132
11191
|
}
|
|
11133
11192
|
|
|
@@ -11532,8 +11591,16 @@ export function getProviderForConfig(
|
|
|
11532
11591
|
model?: string,
|
|
11533
11592
|
): LLMProvider {
|
|
11534
11593
|
const { provider } = userConfig.llm;
|
|
11594
|
+
// CLAUDE-IMPL-LANE(10-11) — `claude-acp` 는 LLM provider 가 아니라 구독 ACP 구현 실행기 선택이다.
|
|
11595
|
+
// 여기서 풀리면 모델 이름(claude-…)이 anthropic(API 키 provider)으로 넘어가 «구독» 런이 API 로 과금된다 → 거부.
|
|
11596
|
+
// 구현은 implement seam 의 claude-acp 갈래(src/self-implement/claude-acp-implement.ts)만 쓴다.
|
|
11597
|
+
if ((provider as string) === 'claude-acp') {
|
|
11598
|
+
throw new Error('claude-acp 는 LLM provider 가 아니다 — 구독 ACP 구현 레인 전용(src/self-implement/claude-acp-implement.ts) · API provider 로 풀지 않는다');
|
|
11599
|
+
}
|
|
11535
11600
|
// ⛔ 2026-09-23 — `kimi`·`qwen`·`glm` 은 union·사다리에 있지만 «직결» 배선이 없다(사다리 `wip`).
|
|
11536
11601
|
// 종전엔 `unknown provider: kimi` 로 «아무것도» 안 말하고 죽었다. 이제 실제로 도는 길이 있다(`openrouter`).
|
|
11602
|
+
// ZAI-CODING-PLAN-PROVIDER(대표 10-11) — `ZAI_API_KEY` 가 있을 때만 glm 직결. 없으면 아래 안내 그대로(src/llm/zai-coding-plan.ts).
|
|
11603
|
+
if (provider === 'glm' && zaiCodingPlanAvailable()) return makeZaiCodingPlanProvider({ ...userConfig.llm, model: model || userConfig.llm.model });
|
|
11537
11604
|
const direct = OPENROUTER_ROUTE_FOR_WIP_PROVIDER[provider as keyof typeof OPENROUTER_ROUTE_FOR_WIP_PROVIDER];
|
|
11538
11605
|
if (direct) {
|
|
11539
11606
|
throw new Error(
|
package/src/loops/checker.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { appendFileSync, existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { join, dirname } from 'node:path';
|
|
3
|
-
import { randomUUID } from 'node:crypto';
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join, dirname, resolve } from 'node:path';
|
|
3
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
4
4
|
import { Database } from 'bun:sqlite';
|
|
5
5
|
import { debug } from '../debug/log.js';
|
|
6
6
|
import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
7
7
|
import * as registry from './registry.js';
|
|
8
8
|
import { cronMatches } from '../domains/cron-match.js';
|
|
9
9
|
import { resolveTimeZone } from '../time/format.js';
|
|
10
|
+
import type { ScheduleRow } from '../domains/schedule-registry.js';
|
|
10
11
|
import type { LoopEntry, LoopRun } from './registry.js';
|
|
11
12
|
|
|
12
13
|
type LoopState = 'off' | 'unregistered' | 'failing' | 'late' | 'unknown' | 'alive';
|
|
@@ -23,6 +24,15 @@ export interface CheckEntry {
|
|
|
23
24
|
lastRunAt?: string;
|
|
24
25
|
lastStatus?: string;
|
|
25
26
|
recentStatuses?: string[];
|
|
27
|
+
/** Inventory sighting of the scheduled registration (schedule-registry `last_seen`, refreshed on each inventory — not the first sighting); never represented as an execution. */
|
|
28
|
+
observedSince?: string;
|
|
29
|
+
/** Optional launcher evidence; absent values are not inferred from a missing heartbeat. */
|
|
30
|
+
health?: 'healthy' | 'degraded';
|
|
31
|
+
endsAt?: string;
|
|
32
|
+
installedVersion?: string;
|
|
33
|
+
expectedVersion?: string;
|
|
34
|
+
/** Registry graph path, supplied only by graph inventory. */
|
|
35
|
+
file?: string;
|
|
26
36
|
enabled: boolean;
|
|
27
37
|
registered: boolean;
|
|
28
38
|
}
|
|
@@ -59,6 +69,110 @@ export function checkLoops(entries: CheckEntry[], now: Date, opts: { failureStat
|
|
|
59
69
|
});
|
|
60
70
|
}
|
|
61
71
|
|
|
72
|
+
export type ScheduleFinding = { id: string; owner?: string; kind: 'late' | 'failing' | 'degraded' | 'end-expired' | 'version-mismatch'; reason: string; lastRunAt?: string };
|
|
73
|
+
|
|
74
|
+
/** Additional scheduler evidence is evaluated only when supplied; the six-state CLI contract stays intact. */
|
|
75
|
+
export function scheduleFindings(results: CheckResult[], now: Date): ScheduleFinding[] {
|
|
76
|
+
const findings: ScheduleFinding[] = [];
|
|
77
|
+
for (const row of results) {
|
|
78
|
+
if (!row.enabled || !row.registered) continue;
|
|
79
|
+
const common = { id: row.id, ...(row.owner ? { owner: row.owner } : {}),
|
|
80
|
+
...(row.lastRunAt ? { lastRunAt: row.lastRunAt } : {}) };
|
|
81
|
+
if (row.state === 'late' || row.state === 'failing') findings.push({ ...common, kind: row.state, reason: row.reason });
|
|
82
|
+
else if (row.state === 'unknown' && !row.lastRunAt && row.observedSince && row.dueAt &&
|
|
83
|
+
Number.isFinite(Date.parse(row.observedSince)) && Number.isFinite(Date.parse(row.dueAt)) &&
|
|
84
|
+
Date.parse(row.observedSince) < Date.parse(row.dueAt))
|
|
85
|
+
findings.push({ ...common, kind: 'late', reason: `no run since observed registration ${row.observedSince}` });
|
|
86
|
+
if (row.health === 'degraded') findings.push({ ...common, kind: 'degraded', reason: 'launcher degraded' });
|
|
87
|
+
if (row.endsAt && Number.isFinite(Date.parse(row.endsAt)) && Date.parse(row.endsAt) <= now.getTime())
|
|
88
|
+
findings.push({ ...common, kind: 'end-expired', reason: `launcher ended at ${row.endsAt}` });
|
|
89
|
+
if (row.installedVersion && row.expectedVersion && row.installedVersion !== row.expectedVersion)
|
|
90
|
+
findings.push({ ...common, kind: 'version-mismatch', reason: `installed ${row.installedVersion}; expected ${row.expectedVersion}` });
|
|
91
|
+
}
|
|
92
|
+
return findings;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function daemonScheduleEntries(rows: readonly ScheduleRow[], now: Date): CheckEntry[] {
|
|
96
|
+
return rows.filter(row => row.enabled && row.cron && (row.run_via === 'elanous' || row.run_via === 'trigger'))
|
|
97
|
+
.map(row => ({ id: row.id, owner: 'OP', enabled: true, registered: true, dueAt: dueBefore(row.cron!, now) ?? undefined,
|
|
98
|
+
...(row.last_seen ? { observedSince: row.last_seen } : {}),
|
|
99
|
+
...(row.last_run ? { lastRunAt: row.last_run } : {}),
|
|
100
|
+
...(row.last_status ? { lastStatus: row.last_status, recentStatuses: [row.last_status] } : {}),
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function versionEvidence(entries: CheckEntry[], repoRoot: string, stateRoot: string): CheckEntry[] {
|
|
105
|
+
return entries.map(entry => {
|
|
106
|
+
if (!entry.file || !/^[\w./-]+\.ya?ml$/.test(entry.file) || entry.file.split('/').includes('..')) return entry;
|
|
107
|
+
const graphPath = resolve(repoRoot, entry.file);
|
|
108
|
+
if (!graphPath.startsWith(resolve(repoRoot) + '/')) return entry;
|
|
109
|
+
const runsPath = join(stateRoot, 'graph-runs', entry.id);
|
|
110
|
+
try {
|
|
111
|
+
if (!existsSync(graphPath) || !existsSync(runsPath)) return entry;
|
|
112
|
+
const latest = readdirSync(runsPath).filter(name => name.endsWith('.json') && !name.endsWith('.decision.json'))
|
|
113
|
+
.sort((a, b) => statSync(join(runsPath, b)).mtimeMs - statSync(join(runsPath, a)).mtimeMs)[0];
|
|
114
|
+
if (!latest) return entry;
|
|
115
|
+
const run = JSON.parse(readFileSync(join(runsPath, latest), 'utf8')) as { graphId?: string; variant?: unknown; graphSnapshot?: { graphSha?: string } };
|
|
116
|
+
if (run.graphId !== entry.id || run.variant || !run.graphSnapshot?.graphSha) return entry;
|
|
117
|
+
const installedVersion = run.graphSnapshot.graphSha;
|
|
118
|
+
const current = createHash('sha256').update(readFileSync(graphPath)).digest('hex');
|
|
119
|
+
return { ...entry, installedVersion, expectedVersion: current };
|
|
120
|
+
} catch (error) {
|
|
121
|
+
debug.log('loop.checker', 'version-unavailable', { id: entry.id, reason: String(error) });
|
|
122
|
+
return entry;
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function launcherEvidence(entries: CheckEntry[], root: string): CheckEntry[] {
|
|
128
|
+
const path = join(root, 'msg', 'messages.db');
|
|
129
|
+
if (!existsSync(path)) return entries;
|
|
130
|
+
try {
|
|
131
|
+
const db = new Database(path, { readonly: true });
|
|
132
|
+
try {
|
|
133
|
+
if (!db.query("SELECT 1 FROM sqlite_master WHERE type='table' AND name='loop_signals'").get()) return entries;
|
|
134
|
+
const signals = db.query('SELECT loop_id, health, ends_at FROM loop_signals').all() as Array<{
|
|
135
|
+
loop_id: string; health: string; ends_at: string | null;
|
|
136
|
+
}>;
|
|
137
|
+
const byId = new Map(signals.map(signal => [signal.loop_id, signal]));
|
|
138
|
+
return entries.map(entry => {
|
|
139
|
+
const signal = byId.get(entry.id);
|
|
140
|
+
return signal ? { ...entry, ...(signal.health === 'degraded' ? { health: 'degraded' as const } : {}),
|
|
141
|
+
...(signal.ends_at ? { endsAt: signal.ends_at } : {}) } : entry;
|
|
142
|
+
});
|
|
143
|
+
} finally { db.close(); }
|
|
144
|
+
} catch (error) {
|
|
145
|
+
debug.log('loop.checker', 'launcher-evidence-unavailable', { reason: String(error) });
|
|
146
|
+
return entries;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Extend only an observed healthy launcher that is still heartbeating. The CAS prevents replacing a renewed lease.
|
|
151
|
+
export function extendHealthyLauncher(root: string, finding: ScheduleFinding, now: Date): boolean {
|
|
152
|
+
if (finding.kind !== 'end-expired' || !Number.isFinite(now.getTime())) return false;
|
|
153
|
+
const path = join(root, 'msg', 'messages.db');
|
|
154
|
+
if (!existsSync(path)) return false;
|
|
155
|
+
const db = new Database(path);
|
|
156
|
+
try {
|
|
157
|
+
db.exec('PRAGMA busy_timeout = 10000');
|
|
158
|
+
db.exec('BEGIN IMMEDIATE');
|
|
159
|
+
try {
|
|
160
|
+
const row = db.query('SELECT at, health, ends_at FROM loop_signals WHERE loop_id=?')
|
|
161
|
+
.get(finding.id) as { at: string; health: string; ends_at: string | null } | null;
|
|
162
|
+
const age = row ? now.getTime() - Date.parse(row.at) : NaN;
|
|
163
|
+
if (!row || row.health !== 'healthy' || !Number.isFinite(age) || age < 0 || age > 15 * 60_000 ||
|
|
164
|
+
!row.ends_at || !Number.isFinite(Date.parse(row.ends_at)) || Date.parse(row.ends_at) > now.getTime()) {
|
|
165
|
+
db.exec('COMMIT');
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
const result = db.query('UPDATE loop_signals SET ends_at=? WHERE loop_id=? AND at=? AND health=? AND ends_at=?')
|
|
169
|
+
.run(new Date(now.getTime() + 15 * 60_000).toISOString(), finding.id, row.at, row.health, row.ends_at);
|
|
170
|
+
db.exec('COMMIT');
|
|
171
|
+
return result.changes === 1;
|
|
172
|
+
} catch (error) { db.exec('ROLLBACK'); throw error; }
|
|
173
|
+
} finally { db.close(); }
|
|
174
|
+
}
|
|
175
|
+
|
|
62
176
|
export function countLoopStates(results: CheckResult[]): LoopCounts {
|
|
63
177
|
const counts: LoopCounts = { alive: 0, late: 0, failing: 0, off: 0, unregistered: 0, unknown: 0 };
|
|
64
178
|
for (const result of results) counts[result.state]++;
|
|
@@ -118,8 +232,14 @@ export interface CheckerDeps {
|
|
|
118
232
|
}
|
|
119
233
|
|
|
120
234
|
/** Appends only new daily keys to the seat request journal; never rewrites existing lines. */
|
|
121
|
-
export function notifyOwners(results: CheckResult[], deps: CheckerDeps = {}): number {
|
|
122
|
-
const eligible =
|
|
235
|
+
export function notifyOwners(results: CheckResult[], deps: CheckerDeps = {}, findings: ScheduleFinding[] = [], escalation = false): number {
|
|
236
|
+
const eligible = [
|
|
237
|
+
...results.filter(result => result.owner && (result.state === 'late' || result.state === 'failing'))
|
|
238
|
+
.map(result => ({ ...result, alertState: result.state })),
|
|
239
|
+
...findings.filter(result => result.owner && (result.kind !== 'late' && result.kind !== 'failing' ||
|
|
240
|
+
!results.some(row => row.id === result.id && row.state === result.kind)))
|
|
241
|
+
.map(result => ({ ...result, alertState: result.kind })),
|
|
242
|
+
].filter(result => escalation ? result.owner !== 'OP' : true);
|
|
123
243
|
if (!eligible.length) return 0;
|
|
124
244
|
const now = deps.now ?? new Date();
|
|
125
245
|
const path = join(deps.root ?? effectiveInstanceRoot(), 'seat-requests', 'requests.jsonl');
|
|
@@ -132,19 +252,38 @@ export function notifyOwners(results: CheckResult[], deps: CheckerDeps = {}): nu
|
|
|
132
252
|
lock.exec('BEGIN EXCLUSIVE');
|
|
133
253
|
try {
|
|
134
254
|
const existing = new Set<string>();
|
|
255
|
+
const ownerRequests = new Map<string, { queuedAt?: string; status?: string }>();
|
|
135
256
|
if (existsSync(path)) {
|
|
136
257
|
for (const line of readFileSync(path, 'utf8').split('\n')) {
|
|
137
258
|
if (line.trim()) {
|
|
138
|
-
const row = JSON.parse(line) as { key?: string };
|
|
139
|
-
if (row.key)
|
|
259
|
+
const row = JSON.parse(line) as { key?: string; queuedAt?: string; status?: string };
|
|
260
|
+
if (row.key) {
|
|
261
|
+
existing.add(row.key);
|
|
262
|
+
ownerRequests.set(row.key, row);
|
|
263
|
+
}
|
|
140
264
|
}
|
|
141
265
|
}
|
|
142
266
|
}
|
|
143
267
|
let added = 0;
|
|
144
268
|
for (const result of eligible) {
|
|
145
|
-
const
|
|
269
|
+
const ownerKey = `loopcheck:${result.id}:${now.toISOString().slice(0, 10)}:${result.alertState}`;
|
|
270
|
+
let requestKey = ownerKey;
|
|
271
|
+
if (escalation) {
|
|
272
|
+
const yesterday = new Date(now.getTime() - 24 * 3600_000).toISOString().slice(0, 10);
|
|
273
|
+
const priorKey = `loopcheck:${result.id}:${yesterday}:${result.alertState}`;
|
|
274
|
+
const prior = ownerRequests.get(priorKey);
|
|
275
|
+
if (prior?.status === 'queued' && prior.queuedAt &&
|
|
276
|
+
now.getTime() - Date.parse(prior.queuedAt) >= 30 * 60_000 && !existing.has(`${priorKey}:op`))
|
|
277
|
+
requestKey = priorKey;
|
|
278
|
+
}
|
|
279
|
+
const key = escalation ? `${requestKey}:op` : ownerKey;
|
|
146
280
|
if (existing.has(key)) continue;
|
|
147
|
-
|
|
281
|
+
if (escalation) {
|
|
282
|
+
const request = ownerRequests.get(requestKey);
|
|
283
|
+
if (!request || request.status !== 'queued' || !request.queuedAt ||
|
|
284
|
+
now.getTime() - Date.parse(request.queuedAt) < 30 * 60_000) continue;
|
|
285
|
+
}
|
|
286
|
+
const row = { key, receiptId: key, seat: escalation ? 'OP' : result.owner, text: `${result.id} ${result.alertState} — 마지막 ${result.lastRunAt ?? '없음'} · ${result.reason}`,
|
|
148
287
|
status: 'queued', queuedAt: now.toISOString(), source: 'loop-checker' };
|
|
149
288
|
appendFileSync(path, JSON.stringify(row) + '\n');
|
|
150
289
|
existing.add(key);
|
|
@@ -10,11 +10,15 @@ import {
|
|
|
10
10
|
type LlmMergeOutcome, type MergeGitSeam,
|
|
11
11
|
} from '../../autopilot/build/llm-conflict-merge.js';
|
|
12
12
|
|
|
13
|
-
type ResyncVerdict = 'saved' | 'merge-ok-tests-failed' | 'merge-ok-no-tests' | 'unresolved' | 'guard-tripped' | 'error';
|
|
13
|
+
type ResyncVerdict = 'saved' | 'merge-ok-tests-failed' | 'merge-ok-no-tests' | 'unresolved' | 'guard-tripped' | 'push-rejected' | 'error';
|
|
14
|
+
export type ResyncShadowMode = 'shadow' | 'live';
|
|
14
15
|
interface ResyncShadowEntry {
|
|
15
16
|
at: string;
|
|
16
17
|
pr: number;
|
|
17
18
|
head: string;
|
|
19
|
+
mode: ResyncShadowMode;
|
|
20
|
+
pushed: boolean;
|
|
21
|
+
labelRemoved: boolean;
|
|
18
22
|
verdict: ResyncVerdict;
|
|
19
23
|
status: LlmMergeOutcome['status'] | 'error';
|
|
20
24
|
resolvedFiles: string[];
|
|
@@ -28,6 +32,7 @@ export interface ResyncShadowDeps {
|
|
|
28
32
|
repoRoot?: string;
|
|
29
33
|
instanceRoot?: string;
|
|
30
34
|
runGh?: (args: string[]) => string;
|
|
35
|
+
runGit?: (args: string[]) => void;
|
|
31
36
|
resolve?: (file: string, conflicted: string) => Promise<string>;
|
|
32
37
|
gitSeam?: MergeGitSeam;
|
|
33
38
|
runTests?: (cwd: string, files: string[]) => { ok: boolean; failedTests?: string[]; noTests?: boolean };
|
|
@@ -134,9 +139,10 @@ function defaultRunTests(cwd: string, files: string[]): { ok: boolean; failedTes
|
|
|
134
139
|
return failedTests.length ? { ok: false, failedTests } : { ok: true };
|
|
135
140
|
}
|
|
136
141
|
|
|
137
|
-
/** Re-merge open conflicts only in disposable detached worktrees;
|
|
138
|
-
export async function runResyncShadow(max = 3, deps: ResyncShadowDeps = {}): Promise<ResyncShadowSummary> {
|
|
142
|
+
/** Re-merge open conflicts only in disposable detached worktrees; shadow mode never writes to remotes. */
|
|
143
|
+
export async function runResyncShadow(max = 3, deps: ResyncShadowDeps = {}, mode: ResyncShadowMode = 'shadow'): Promise<ResyncShadowSummary> {
|
|
139
144
|
if (!Number.isSafeInteger(max) || max < 0) throw new Error('--max must be a nonnegative integer');
|
|
145
|
+
if (mode !== 'shadow' && mode !== 'live') throw new Error('mode must be shadow or live');
|
|
140
146
|
const repoRoot = deps.repoRoot ?? resolve(import.meta.dir, '../../..');
|
|
141
147
|
const gh = deps.runGh ?? ((args: string[]) => command('gh', args, repoRoot));
|
|
142
148
|
const observed: unknown = JSON.parse(gh(['pr', 'list', '--state', 'open', '--json', 'number,headRefName,mergeable,isDraft,labels', '--limit', '1000']));
|
|
@@ -146,6 +152,7 @@ export async function runResyncShadow(max = 3, deps: ResyncShadowDeps = {}): Pro
|
|
|
146
152
|
throw new Error('incomplete or invalid PR observation');
|
|
147
153
|
const candidates = (observed as OpenPr[]).filter(pr => pr.headRefName.startsWith('self-impl/')
|
|
148
154
|
&& pr.mergeable === 'CONFLICTING'
|
|
155
|
+
&& (mode === 'shadow' || pr.labels.some(label => label.name === 'elanous:needs-rebase'))
|
|
149
156
|
&& !pr.labels.some(label => label.name === 'elanous:stalled' || label.name === 'elanous:superseded'))
|
|
150
157
|
.sort((a, b) => a.number - b.number).slice(0, max);
|
|
151
158
|
const ledger = join(deps.instanceRoot ?? effectiveInstanceRoot(), 'orchestrator', 'resync-shadow.jsonl');
|
|
@@ -154,6 +161,7 @@ export async function runResyncShadow(max = 3, deps: ResyncShadowDeps = {}): Pro
|
|
|
154
161
|
for (const pr of candidates) {
|
|
155
162
|
const entry: ResyncShadowEntry = {
|
|
156
163
|
at: (deps.now?.() ?? new Date()).toISOString(), pr: pr.number, head: pr.headRefName,
|
|
164
|
+
mode, pushed: false, labelRemoved: false,
|
|
157
165
|
verdict: 'error', status: 'error', resolvedFiles: [], testFiles: [],
|
|
158
166
|
};
|
|
159
167
|
let tmp: string | undefined;
|
|
@@ -179,6 +187,21 @@ export async function runResyncShadow(max = 3, deps: ResyncShadowDeps = {}): Pro
|
|
|
179
187
|
if (!test.ok) entry.failedTests = test.failedTests?.length ? test.failedTests : ['test runner failed'];
|
|
180
188
|
}
|
|
181
189
|
} else entry.verdict = outcome.status === 'conflict-unresolved' || outcome.status === 'up-to-date' ? 'unresolved' : 'error';
|
|
190
|
+
if (mode === 'live' && entry.verdict === 'saved') {
|
|
191
|
+
try {
|
|
192
|
+
(deps.runGit ?? (args => { command('git', args, tmp!); }))(
|
|
193
|
+
['push', 'origin', `HEAD:refs/heads/${pr.headRefName}`]);
|
|
194
|
+
entry.pushed = true;
|
|
195
|
+
gh(['pr', 'edit', String(pr.number), '--remove-label', 'elanous:needs-rebase']);
|
|
196
|
+
entry.labelRemoved = true;
|
|
197
|
+
} catch (error) {
|
|
198
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
199
|
+
// push 가 이미 됐으면 원격은 살았다 — verdict 는 saved 로 두고 라벨 실패만 남긴다(다음 회차가 같은 PR 을 다시 고를 수 있다).
|
|
200
|
+
// push 실패는 거부 문구(rejected · non-fast-forward)일 때만 push-rejected · 인증·네트워크·시간초과는 error.
|
|
201
|
+
if (!entry.pushed) entry.verdict = /rejected|non-fast-forward|fetch first/i.test(message) ? 'push-rejected' : 'error';
|
|
202
|
+
entry.failedTests = [message];
|
|
203
|
+
}
|
|
204
|
+
}
|
|
182
205
|
} catch (error) {
|
|
183
206
|
entry.verdict = 'error';
|
|
184
207
|
entry.failedTests = [error instanceof Error ? error.message : String(error)];
|
|
@@ -199,6 +222,9 @@ export async function runResyncShadow(max = 3, deps: ResyncShadowDeps = {}): Pro
|
|
|
199
222
|
mkdirSync(dirname(ledger), { recursive: true });
|
|
200
223
|
appendFileSync(ledger, `${JSON.stringify(entry)}\n`);
|
|
201
224
|
debug.log('loop.orchestrator', 'resync-shadow', { pr: entry.pr, verdict: entry.verdict, status: entry.status });
|
|
225
|
+
if (mode === 'live') debug.log('loop.orchestrator', 'resync-live', {
|
|
226
|
+
pr: entry.pr, verdict: entry.verdict, pushed: entry.pushed, labelRemoved: entry.labelRemoved,
|
|
227
|
+
});
|
|
202
228
|
if (entry.verdict !== 'error') tried++;
|
|
203
229
|
if (entry.verdict === 'saved') saved++;
|
|
204
230
|
}
|
|
@@ -211,13 +237,14 @@ if (import.meta.main) {
|
|
|
211
237
|
try {
|
|
212
238
|
const args = process.argv.slice(2);
|
|
213
239
|
if (args.includes('--help')) {
|
|
214
|
-
console.log('Usage: bun src/loops/orchestrator/resync-shadow.ts [--max N] [--json]');
|
|
240
|
+
console.log('Usage: bun src/loops/orchestrator/resync-shadow.ts [--max N] [--live] [--json]');
|
|
215
241
|
} else {
|
|
216
242
|
const index = args.indexOf('--max');
|
|
217
|
-
if (args.some((arg, i) => arg !== '--json' && arg !== '--max' && (index < 0 || i !== index + 1))
|
|
218
|
-
|| (index >= 0 && (index === args.length - 1 || args.lastIndexOf('--max') !== index))) throw new Error('usage: resync-shadow.ts [--max N] [--json]');
|
|
243
|
+
if (args.some((arg, i) => arg !== '--json' && arg !== '--live' && arg !== '--max' && (index < 0 || i !== index + 1))
|
|
244
|
+
|| (index >= 0 && (index === args.length - 1 || args.lastIndexOf('--max') !== index))) throw new Error('usage: resync-shadow.ts [--max N] [--live] [--json]');
|
|
219
245
|
const max = index < 0 ? 3 : Number(args[index + 1]);
|
|
220
|
-
const
|
|
246
|
+
const mode: ResyncShadowMode = args.includes('--live') ? 'live' : 'shadow';
|
|
247
|
+
const summary = await runResyncShadow(max, {}, mode);
|
|
221
248
|
console.log(process.argv.includes('--json') ? JSON.stringify(summary) : `resync-shadow candidates=${summary.candidates} tried=${summary.tried} saved=${summary.saved} savedRatio=${summary.savedRatio === null ? 'n/a' : `${(summary.savedRatio * 100).toFixed(1)}%`}`);
|
|
222
249
|
}
|
|
223
250
|
} catch (error) {
|
|
@@ -59,12 +59,12 @@ export const FEATURE_MATURITY = {
|
|
|
59
59
|
},
|
|
60
60
|
// Canonical CLI command names only; aliases inherit their command's grade.
|
|
61
61
|
cliRoot: {
|
|
62
|
-
preview: 'beta', pty: 'beta', pr: 'beta', repo: 'beta', role: 'beta', machine: 'beta', 'agent-env': 'beta',
|
|
63
|
-
where: 'stable', shadow: 'beta', llm: 'beta', storage: 'beta', leader: 'beta',
|
|
62
|
+
preview: 'beta', pty: 'beta', pr: 'beta', repo: 'beta', role: 'beta', machine: 'beta', image: 'beta', 'agent-env': 'beta',
|
|
63
|
+
where: 'stable', bench: 'beta', shadow: 'beta', llm: 'beta', storage: 'beta', leader: 'beta',
|
|
64
64
|
pod: 'beta', browser: 'beta', questions: 'beta', usage: 'stable', live: 'beta',
|
|
65
65
|
research: 'beta', release: 'beta', know: 'beta', freeze: 'beta', flow: 'beta', seat: 'beta', hq: 'beta', steward: 'beta', coord: 'beta', context: 'beta', 'model-watch': 'beta', doctor: 'stable',
|
|
66
66
|
control: 'beta', resources: 'beta', hooks: 'beta', setup: 'stable', start: 'stable',
|
|
67
|
-
grounding: 'beta', graph: 'beta', loop: 'stable', card: 'stable', 'launch-head': 'beta',
|
|
67
|
+
grounding: 'beta', graph: 'beta', loop: 'stable', resource: 'beta', card: 'stable', 'launch-head': 'beta',
|
|
68
68
|
a2a: 'beta', plugin: 'stable', make: 'beta', skills: 'beta', connect: 'beta', import: 'beta',
|
|
69
69
|
persona: 'beta', team: 'beta', 'team-set': 'beta', market: 'beta', directive: 'stable', connector: 'beta', storyboard: 'beta',
|
|
70
70
|
python: 'beta', 'self-update': 'stable', 'measure-fabric-arc-ab': 'beta', mcp: 'beta',
|