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/debug/log-diet.ts
CHANGED
|
@@ -2,6 +2,13 @@ import type { DebugEvent } from './log.js';
|
|
|
2
2
|
|
|
3
3
|
export const LOG_DIET_WINDOW_MS = 60_000;
|
|
4
4
|
|
|
5
|
+
/** LOG-DIET-2 — minimum spacing between two `log.diet/suppressed` summary releases.
|
|
6
|
+
* One diet window: a folded stream costs at most one summary row per window instead of one per flush. */
|
|
7
|
+
export const LOG_DIET_SUMMARY_MIN_INTERVAL_MS = LOG_DIET_WINDOW_MS;
|
|
8
|
+
|
|
9
|
+
/** LOG-DIET-2 — pending-stream pressure that releases summaries before the interval elapses. */
|
|
10
|
+
export const LOG_DIET_SUMMARY_MAX_PENDING = 256;
|
|
11
|
+
|
|
5
12
|
export const LOG_DIET_KEYS: Readonly<Record<string, 'repeat' | 'consecutive'>> = {
|
|
6
13
|
'watchdog/activity': 'consecutive',
|
|
7
14
|
'user-config.llm/provider-resolved': 'repeat',
|
|
@@ -9,6 +16,18 @@ export const LOG_DIET_KEYS: Readonly<Record<string, 'repeat' | 'consecutive'>> =
|
|
|
9
16
|
'input.cursor.claim/chat-main': 'repeat',
|
|
10
17
|
'tox.loop/waiting-capacity': 'repeat',
|
|
11
18
|
'tox.loop/tick': 'repeat',
|
|
19
|
+
'llm.credential/provider-key-missing': 'repeat',
|
|
20
|
+
'llm.credential/provider-key-resolved': 'repeat',
|
|
21
|
+
'pty.manifest/output-bytes-flushed': 'repeat',
|
|
22
|
+
// `pod-lease/admit-by-usage` is NOT folded: dispatch backpressure and the TA parent-host admission
|
|
23
|
+
// read it back from logs and count rows (`admissionCounts`) — it is a judgment-path event.
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/** LOG-DIET-2 — per-key fold windows (ms). "State echo" keys whose value rarely changes fold on a
|
|
27
|
+
* longer window than the default 60s, so a slow-rotation emitter (one row per question per tick)
|
|
28
|
+
* stays folded instead of re-admitting every window. Keys not listed here keep the guard default. */
|
|
29
|
+
export const LOG_DIET_KEY_WINDOW_MS: Readonly<Record<string, number>> = {
|
|
30
|
+
'hitl.card-bridge/skipped': 30 * 60_000,
|
|
12
31
|
};
|
|
13
32
|
|
|
14
33
|
export interface LogDietSummary {
|
|
@@ -32,6 +51,8 @@ interface Stream {
|
|
|
32
51
|
sessionId?: string;
|
|
33
52
|
value: string;
|
|
34
53
|
lastEmittedAt: number;
|
|
54
|
+
/** Fold window pinned at stream creation: `keyWindowMs[key] ?? windowMs`. */
|
|
55
|
+
windowMs: number;
|
|
35
56
|
count: number;
|
|
36
57
|
firstSuppressedAt?: string;
|
|
37
58
|
lastSuppressedAt?: string;
|
|
@@ -54,17 +75,25 @@ function stableValue(value: unknown): string {
|
|
|
54
75
|
|
|
55
76
|
export class LogDietGuard {
|
|
56
77
|
private readonly windowMs: number;
|
|
78
|
+
private readonly keyWindowMs: Readonly<Record<string, number>>;
|
|
57
79
|
private readonly now: () => number;
|
|
58
80
|
private readonly keys: Readonly<Record<string, Policy>>;
|
|
59
81
|
private readonly maxStreams: number;
|
|
82
|
+
private readonly summaryMinIntervalMs: number;
|
|
83
|
+
private readonly summaryMaxPending: number;
|
|
60
84
|
private readonly disabled: boolean;
|
|
61
85
|
private readonly streams = new Map<string, Stream>();
|
|
86
|
+
private lastSummaryReleaseAt = Number.NEGATIVE_INFINITY;
|
|
87
|
+
private pendingStreams = 0;
|
|
62
88
|
|
|
63
|
-
constructor(opts: { windowMs?: number; now?: () => number; keys?: Readonly<Record<string, Policy>>; maxStreams?: number } = {}) {
|
|
89
|
+
constructor(opts: { windowMs?: number; keyWindowMs?: Readonly<Record<string, number>>; now?: () => number; keys?: Readonly<Record<string, Policy>>; maxStreams?: number; summaryMinIntervalMs?: number; summaryMaxPending?: number } = {}) {
|
|
64
90
|
this.windowMs = opts.windowMs ?? LOG_DIET_WINDOW_MS;
|
|
91
|
+
this.keyWindowMs = opts.keyWindowMs ?? LOG_DIET_KEY_WINDOW_MS;
|
|
65
92
|
this.now = opts.now ?? Date.now;
|
|
66
93
|
this.keys = opts.keys ?? LOG_DIET_KEYS;
|
|
67
94
|
this.maxStreams = Math.max(1, opts.maxStreams ?? 2000);
|
|
95
|
+
this.summaryMinIntervalMs = Math.max(0, opts.summaryMinIntervalMs ?? LOG_DIET_SUMMARY_MIN_INTERVAL_MS);
|
|
96
|
+
this.summaryMaxPending = Math.max(1, opts.summaryMaxPending ?? LOG_DIET_SUMMARY_MAX_PENDING);
|
|
68
97
|
this.disabled = process.env.ELANOUS_LOG_DIET === 'off';
|
|
69
98
|
}
|
|
70
99
|
|
|
@@ -74,7 +103,7 @@ export class LogDietGuard {
|
|
|
74
103
|
category: stream.category,
|
|
75
104
|
event: stream.event,
|
|
76
105
|
count: stream.count,
|
|
77
|
-
windowMs:
|
|
106
|
+
windowMs: stream.windowMs,
|
|
78
107
|
firstSuppressedAt: stream.firstSuppressedAt!,
|
|
79
108
|
lastSuppressedAt: stream.lastSuppressedAt!,
|
|
80
109
|
...(stream.runId !== undefined ? { runId: stream.runId } : {}),
|
|
@@ -84,8 +113,9 @@ export class LogDietGuard {
|
|
|
84
113
|
|
|
85
114
|
admit(rec: DietRecord): { pass: boolean; summaries: LogDietSummary[] } {
|
|
86
115
|
const policy = this.keys[`${rec.category}/${rec.event}`];
|
|
116
|
+
// LOG-DIET-2 — a registered key folds at warn too; unregistered warn/error/critical alarms never fold.
|
|
87
117
|
if (this.disabled || !policy || rec.category === 'log.diet'
|
|
88
|
-
|| rec.level === '
|
|
118
|
+
|| rec.level === 'error' || rec.level === 'critical') {
|
|
89
119
|
return { pass: true, summaries: [] };
|
|
90
120
|
}
|
|
91
121
|
|
|
@@ -102,12 +132,14 @@ export class LogDietGuard {
|
|
|
102
132
|
? [rec.category, rec.event, value]
|
|
103
133
|
: [rec.category, rec.event, sessionId, runId]);
|
|
104
134
|
const time = this.now();
|
|
135
|
+
const windowMs = this.keyWindowMs[`${rec.category}/${rec.event}`] ?? this.windowMs;
|
|
105
136
|
const summaries: LogDietSummary[] = [];
|
|
106
137
|
const stream = this.streams.get(key);
|
|
107
138
|
if (stream) {
|
|
108
139
|
this.streams.delete(key); // Evict the least recently observed flow.
|
|
109
140
|
this.streams.set(key, stream);
|
|
110
|
-
if ((policy === 'repeat' || stream.value === value) && time - stream.lastEmittedAt <
|
|
141
|
+
if ((policy === 'repeat' || stream.value === value) && time - stream.lastEmittedAt < stream.windowMs) {
|
|
142
|
+
if (stream.count === 0) this.pendingStreams++;
|
|
111
143
|
stream.count++;
|
|
112
144
|
const at = new Date(time).toISOString();
|
|
113
145
|
stream.firstSuppressedAt ??= at;
|
|
@@ -115,7 +147,7 @@ export class LogDietGuard {
|
|
|
115
147
|
return { pass: false, summaries };
|
|
116
148
|
}
|
|
117
149
|
const pending = this.summary(stream);
|
|
118
|
-
if (pending) summaries.push(pending);
|
|
150
|
+
if (pending) { summaries.push(pending); this.pendingStreams--; }
|
|
119
151
|
stream.count = 0;
|
|
120
152
|
stream.firstSuppressedAt = undefined;
|
|
121
153
|
stream.lastSuppressedAt = undefined;
|
|
@@ -128,18 +160,22 @@ export class LogDietGuard {
|
|
|
128
160
|
const oldestKey = this.streams.keys().next().value!;
|
|
129
161
|
const oldest = this.streams.get(oldestKey)!;
|
|
130
162
|
const pending = this.summary(oldest);
|
|
131
|
-
if (pending) summaries.push(pending);
|
|
163
|
+
if (pending) { summaries.push(pending); this.pendingStreams--; }
|
|
132
164
|
this.streams.delete(oldestKey);
|
|
133
165
|
}
|
|
134
166
|
this.streams.set(key, { category: rec.category, event: rec.event,
|
|
135
167
|
...(typeof runId === 'string' ? { runId } : {}),
|
|
136
168
|
...(sessionId !== undefined ? { sessionId } : {}),
|
|
137
|
-
value, lastEmittedAt: time, count: 0 });
|
|
169
|
+
value, lastEmittedAt: time, windowMs, count: 0 });
|
|
138
170
|
return { pass: true, summaries };
|
|
139
171
|
}
|
|
140
172
|
|
|
141
|
-
/** Emit pending counts without reopening the current sample windows.
|
|
142
|
-
|
|
173
|
+
/** Emit pending counts without reopening the current sample windows.
|
|
174
|
+
* LOG-DIET-2 — releases are spaced by `summaryMinIntervalMs` unless forced (drain)
|
|
175
|
+
* or the pending-stream pressure cap is hit. Deferred counts stay accumulated on
|
|
176
|
+
* their streams, so a held-back release never drops a suppressed event. */
|
|
177
|
+
flushPending(force = false): LogDietSummary[] {
|
|
178
|
+
if (!force && !this.summaryReleaseDue()) return [];
|
|
143
179
|
const summaries: LogDietSummary[] = [];
|
|
144
180
|
for (const stream of this.streams.values()) {
|
|
145
181
|
const pending = this.summary(stream);
|
|
@@ -148,11 +184,18 @@ export class LogDietGuard {
|
|
|
148
184
|
stream.firstSuppressedAt = undefined;
|
|
149
185
|
stream.lastSuppressedAt = undefined;
|
|
150
186
|
}
|
|
187
|
+
this.pendingStreams = 0;
|
|
188
|
+
this.lastSummaryReleaseAt = this.now();
|
|
151
189
|
return summaries;
|
|
152
190
|
}
|
|
153
191
|
|
|
192
|
+
private summaryReleaseDue(): boolean {
|
|
193
|
+
if (this.pendingStreams >= this.summaryMaxPending) return true;
|
|
194
|
+
return this.now() - this.lastSummaryReleaseAt >= this.summaryMinIntervalMs;
|
|
195
|
+
}
|
|
196
|
+
|
|
154
197
|
drain(): LogDietSummary[] {
|
|
155
|
-
const summaries = this.flushPending();
|
|
198
|
+
const summaries = this.flushPending(true);
|
|
156
199
|
this.streams.clear();
|
|
157
200
|
return summaries;
|
|
158
201
|
}
|
package/src/debug/log.ts
CHANGED
|
@@ -561,6 +561,24 @@ class DebugLog {
|
|
|
561
561
|
for (const summary of summaries) this.log('log.diet', 'suppressed', summary);
|
|
562
562
|
}
|
|
563
563
|
|
|
564
|
+
/** LOG-DIET-2 — summaries are now spaced by the diet window, so a short-lived process could exit
|
|
565
|
+
* holding folded counts. On the first suppression we arm one exit drain that force-releases them
|
|
566
|
+
* (and flushes the sinks synchronously) so a held-back release never drops a count at shutdown. */
|
|
567
|
+
private _logDietExitArmed = false;
|
|
568
|
+
private armLogDietExitDrain(): void {
|
|
569
|
+
if (this._logDietExitArmed) return;
|
|
570
|
+
this._logDietExitArmed = true;
|
|
571
|
+
const drain = (): void => { try { this.drainLogDietPending(); } catch { /* exit path must not throw */ } };
|
|
572
|
+
process.once('beforeExit', drain);
|
|
573
|
+
process.once('exit', drain);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
/** Force-release every pending diet summary (ignores the summary interval) and flush sinks. */
|
|
577
|
+
drainLogDietPending(): void {
|
|
578
|
+
if (this._logDietGuard) this.emitLogDietSummaries(this._logDietGuard.flushPending(true));
|
|
579
|
+
this.flush();
|
|
580
|
+
}
|
|
581
|
+
|
|
564
582
|
/** Force any buffered events to disk immediately. */
|
|
565
583
|
flush(): void {
|
|
566
584
|
if (this._logDietGuard) this.emitLogDietSummaries(this._logDietGuard.flushPending());
|
|
@@ -615,7 +633,7 @@ class DebugLog {
|
|
|
615
633
|
if (this._logDietGuard) {
|
|
616
634
|
const decision = this._logDietGuard.admit(rec);
|
|
617
635
|
this.emitLogDietSummaries(decision.summaries);
|
|
618
|
-
if (!decision.pass) return;
|
|
636
|
+
if (!decision.pass) { this.armLogDietExitDrain(); return; }
|
|
619
637
|
}
|
|
620
638
|
|
|
621
639
|
// Ring buffer — always populated when at least one sink is live so
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import { getUserConfig } from '../user-config.js';
|
|
9
9
|
import { getProviderForConfig, anyProviderAvailable, textOnly, type LLMMessage } from '../llm.js';
|
|
10
|
+
import { debug } from '../debug/log.js';
|
|
10
11
|
import { marketClock } from './finance.js';
|
|
11
12
|
import { renderSemisEssential } from './kg-semis.js';
|
|
12
13
|
import { feedBySource } from './morning-synthesis.js';
|
|
@@ -116,11 +117,25 @@ const ESSENTIAL_SYSTEM = `너는 Conatus 투자 아침 브리핑의 편집자다
|
|
|
116
117
|
- 매매 지시(사라/팔라/비중 조절) 금지. 관찰과 유의점만. 최종 판단은 verify+HITL.
|
|
117
118
|
- 담백하고 신중한 톤. 이모지 최소.`;
|
|
118
119
|
|
|
120
|
+
/** synthesizeEssentialBrief 모델 자리(A/B 첫 조각) — 미지정이면 지금과 같은 기본 경로. */
|
|
121
|
+
export interface EssentialSynthOpts {
|
|
122
|
+
/** 지정하면 getProviderForConfig(cfg, model) 로 부른다. */
|
|
123
|
+
model?: string;
|
|
124
|
+
/** provider 주입(시험용). 미지정이면 getProviderForConfig. */
|
|
125
|
+
providerFor?: (cfg: ReturnType<typeof getUserConfig>, model?: string) => ReturnType<typeof getProviderForConfig>;
|
|
126
|
+
/** 가용성 주입(시험용). 미지정이면 anyProviderAvailable. */
|
|
127
|
+
available?: () => boolean;
|
|
128
|
+
}
|
|
129
|
+
|
|
119
130
|
/** 상세 markdown 을 입력으로 LLM 시장서사 종합. provider 없거나 실패 시 ''(에센셜은 결정론만). */
|
|
120
|
-
export async function synthesizeEssentialBrief(detailMarkdown: string): Promise<string> {
|
|
121
|
-
|
|
131
|
+
export async function synthesizeEssentialBrief(detailMarkdown: string, opts: EssentialSynthOpts = {}): Promise<string> {
|
|
132
|
+
const { model, providerFor, available } = opts;
|
|
133
|
+
if (!(available ?? anyProviderAvailable)()) return '';
|
|
122
134
|
try {
|
|
123
|
-
const
|
|
135
|
+
const cfg = getUserConfig();
|
|
136
|
+
if (model) debug.log('domains.llm', 'cron-model', { domain: 'morning-essential', model: model ?? null });
|
|
137
|
+
const resolve = providerFor ?? getProviderForConfig;
|
|
138
|
+
const provider = model ? resolve(cfg, model) : resolve(cfg);
|
|
124
139
|
if (!provider.streamChat) return '';
|
|
125
140
|
// 토큰 절약: 상세를 앞부분 위주로 트림(핵심 섹션이 상단).
|
|
126
141
|
const digest = detailMarkdown.slice(0, 6000);
|
|
@@ -9,6 +9,7 @@ import { requestConfirmation, type ConfirmOpts, type ConfirmResult } from '../hi
|
|
|
9
9
|
import { devVersion, checklistDevVersion, listChecklist, summarizeChecklist, type Checklist, type ChecklistItem } from '../release-loop/checklist.js';
|
|
10
10
|
import { add, move, validateVersion } from '../release-loop/feature-store.js';
|
|
11
11
|
import { formatKst, formatSchedule, getSchedule, listSchedules, setSchedule, type ReleaseSchedule } from '../release-loop/release-schedule.js';
|
|
12
|
+
import { mergedPrsLast24h as countMergedPrsLast24h } from '../release-loop/placement.js';
|
|
12
13
|
import { latestGraphRun, type GraphRunState } from '../graph-runner/runner.js';
|
|
13
14
|
import { formatElanousCard, type ElanousCard } from './elanous-card.js';
|
|
14
15
|
|
|
@@ -20,10 +21,12 @@ export const RELEASE_STATUS_SPEC: LLMToolSpec = {
|
|
|
20
21
|
+ 'topic=cell: id 칸 하나의 상태·근거와 살핀 판.\n'
|
|
21
22
|
+ 'topic=schedule: 발행 이후 판의 컷·착지·발행·동결 일정.\n'
|
|
22
23
|
+ 'topic=ops: 도는 런·발행·늦은 스케줄·자리·열린 결정의 출처 있는 개관.\n'
|
|
24
|
+
+ 'topic 과 action 을 동시에 쓰지 않는다 — 둘 중 하나만: topic 은 읽을 대상, action 은 짧은 요약.\n'
|
|
23
25
|
+ '발행·버전·피처·체크리스트·칸·컷·일정·운영 상태 질문은 Grep·ListDir·파일 검색보다 이 도구를 먼저 부른다 — 그 답은 파일이 아니라 원장에 있다.',
|
|
24
26
|
parameters: { type: 'object', properties: {
|
|
25
27
|
version: { type: 'string', description: '조회할 판. 생략하면 개발 판과 다음 판.' },
|
|
26
28
|
topic: { type: 'string', enum: ['status', 'features', 'cell', 'schedule', 'ops'], description: '읽을 대상(기본 status).' },
|
|
29
|
+
action: { type: 'string', enum: ['schedule', 'blocked', 'landed'], description: '짧은 읽기 요약: 다음 컷 일정·막힌 칸·최근 24시간 병합 PR.' },
|
|
27
30
|
id: { type: 'string', description: 'topic=cell 때 찾을 칸 id(필수).' },
|
|
28
31
|
}, required: [] },
|
|
29
32
|
};
|
|
@@ -57,6 +60,7 @@ export interface ReleaseToolDeps {
|
|
|
57
60
|
add?: typeof add;
|
|
58
61
|
move?: typeof move;
|
|
59
62
|
setSchedule?: typeof setSchedule;
|
|
63
|
+
mergedPrsLast24h?: (now?: Date) => number;
|
|
60
64
|
}
|
|
61
65
|
|
|
62
66
|
function nextVersion(version: string): string {
|
|
@@ -118,6 +122,9 @@ function cellView(item: ChecklistItem) {
|
|
|
118
122
|
export function dispatchReleaseStatus(args: Record<string, unknown>, deps: ReleaseToolDeps = {}): { text: string; structured: Record<string, unknown> } {
|
|
119
123
|
const topic = args.topic === undefined ? 'status' : args.topic;
|
|
120
124
|
if (typeof topic !== 'string' || !['status', 'features', 'cell', 'schedule', 'ops'].includes(topic)) throw new Error('topic 은 status, features, cell, schedule, ops 중 하나');
|
|
125
|
+
if (args.topic !== undefined && args.action !== undefined) {
|
|
126
|
+
throw new Error(`topic 과 action 을 동시에 보낼 수 없습니다 — 둘 중 하나만: topic=${topic} 는 읽을 대상, action 은 짧은 요약(schedule·blocked·landed)`);
|
|
127
|
+
}
|
|
121
128
|
const requested = args.version;
|
|
122
129
|
if (requested !== undefined && (typeof requested !== 'string' || !requested.trim())) throw new Error('판 이름이 필요합니다');
|
|
123
130
|
const checklist = deps.checklist ?? listChecklist;
|
|
@@ -129,6 +136,42 @@ export function dispatchReleaseStatus(args: Record<string, unknown>, deps: Relea
|
|
|
129
136
|
return { text: facts.length ? facts.map(fact => JSON.stringify(fact)).join('\n') : '운영 개관: 관측된 사실 없음', structured: { facts } };
|
|
130
137
|
}
|
|
131
138
|
const dev = checklistDevVersion(deps.devVersion?.() ?? devVersion());
|
|
139
|
+
if (args.action !== undefined) {
|
|
140
|
+
const action = args.action;
|
|
141
|
+
if (typeof action !== 'string' || !['schedule', 'blocked', 'landed'].includes(action)) {
|
|
142
|
+
throw new Error('action 은 schedule, blocked, landed 중 하나여야 합니다');
|
|
143
|
+
}
|
|
144
|
+
if (action === 'schedule') {
|
|
145
|
+
const released = checklist(dev).released;
|
|
146
|
+
const schedules = (deps.schedules ?? listSchedules)()
|
|
147
|
+
.filter(row => requested ? row.version === requested : !released || versionOrder(row.version, released) > 0)
|
|
148
|
+
.sort((a, b) => versionOrder(a.version, b.version));
|
|
149
|
+
const text = schedules.length ? `다음 컷 시각:\n${schedules.map(formatSchedule).join('\n')}` : '다음 컷 시각: 일정 없음';
|
|
150
|
+
debug.log('release.tool', 'status', { action, version: requested ?? dev });
|
|
151
|
+
return { text, structured: { schedules: schedules.map(row => ({ version: row.version, cutAt: row.cutAt, landBy: row.landBy,
|
|
152
|
+
publishAt: row.publishAt ?? null, freezeFrom: row.freezeFrom ?? null, freezeUntil: row.freezeUntil ?? null })) } };
|
|
153
|
+
}
|
|
154
|
+
if (action === 'blocked') {
|
|
155
|
+
const versions = requested ? [requested as string] : [dev, nextVersion(dev)];
|
|
156
|
+
const blocked = versions.flatMap(version => {
|
|
157
|
+
validateVersion(version);
|
|
158
|
+
return checklist(version).items
|
|
159
|
+
.filter(item => item.status === 'red' || (item.status === 'yellow' && item.disposition === 'block'))
|
|
160
|
+
.map(item => ({ version, id: item.id, title: firstLine(item.title), status: item.status, disposition: item.disposition ?? null, owner: item.owner ?? null }));
|
|
161
|
+
});
|
|
162
|
+
const text = blocked.length ? `막힌 칸 ${blocked.length}개:\n${blocked.map(item => `${item.version} · ${item.id} ${item.title} · ${item.status === 'red' ? '빨강' : '보류'}${item.owner ? ` · 담당 ${item.owner}` : ''}`).join('\n')}` : '막힌 칸 없음';
|
|
163
|
+
debug.log('release.tool', 'status', { action, version: requested ?? versions.join(',') });
|
|
164
|
+
return { text, structured: { blocked } };
|
|
165
|
+
}
|
|
166
|
+
const now = deps.now ?? new Date();
|
|
167
|
+
const merged = (deps.mergedPrsLast24h ?? countMergedPrsLast24h)(now);
|
|
168
|
+
debug.log('release.tool', 'status', { action, since: new Date(now.getTime() - 86_400_000).toISOString(), until: now.toISOString(), merged });
|
|
169
|
+
return { text: `어제 착지: 최근 24시간 병합 PR ${merged}건`, structured: {
|
|
170
|
+
mergedPrsLast24h: merged,
|
|
171
|
+
since: new Date(now.getTime() - 86_400_000).toISOString(),
|
|
172
|
+
until: now.toISOString(),
|
|
173
|
+
} };
|
|
174
|
+
}
|
|
132
175
|
if (topic === 'features' || topic === 'cell' || topic === 'schedule') {
|
|
133
176
|
let result: { text: string; structured: Record<string, unknown> };
|
|
134
177
|
if (topic === 'features') {
|
|
@@ -31,7 +31,7 @@ export interface ErrorReport {
|
|
|
31
31
|
at: string; consent: true;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
export interface ErrorReportSettings { enabled: boolean; identity: boolean; email?: string; telegramUser?: string }
|
|
34
|
+
export interface ErrorReportSettings { enabled: boolean; identity: boolean; consented?: boolean; email?: string; telegramUser?: string }
|
|
35
35
|
|
|
36
36
|
export interface ErrorReportDeps {
|
|
37
37
|
configDir?: () => string;
|
|
@@ -100,10 +100,18 @@ export function buildErrorReport(input: ErrorReportInput, ctx: { installId: stri
|
|
|
100
100
|
return report;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
+
/** First-run notice: says what is actually sent — identity fields go along only when errorReports.identity is on. */
|
|
104
|
+
export function errorReportNoticeLine(config: { identity?: boolean; email?: string; telegramUser?: string } | undefined): string {
|
|
105
|
+
const fields = [config?.email ? '이메일' : '', config?.telegramUser ? '텔레그램 사용자' : ''].filter(Boolean).join('·');
|
|
106
|
+
// Mirrors buildErrorReport: a field goes along only when identity is on AND the field is set.
|
|
107
|
+
const who = config?.identity === true && fields ? `진단과 함께 설정된 신원(${fields})을` : '익명 진단을';
|
|
108
|
+
return `오류 보고 안내: 오류 발생 시 ${who} 운영팀에 전송합니다. 끄려면 \`elanous config set errorReports.enabled false\`.`;
|
|
109
|
+
}
|
|
110
|
+
|
|
103
111
|
function defaultSettings(): ErrorReportSettings {
|
|
104
112
|
try {
|
|
105
113
|
const er = getUserConfig().errorReports;
|
|
106
|
-
return { enabled: er?.enabled !== false, identity: er?.identity === true, ...(er?.email ? { email: er.email } : {}), ...(er?.telegramUser ? { telegramUser: er.telegramUser } : {}) };
|
|
114
|
+
return { enabled: er?.enabled !== false, consented: er?.noticeShown === true, identity: er?.identity === true, ...(er?.email ? { email: er.email } : {}), ...(er?.telegramUser ? { telegramUser: er.telegramUser } : {}) };
|
|
107
115
|
} catch { return { enabled: false, identity: false }; }
|
|
108
116
|
}
|
|
109
117
|
|
|
@@ -137,10 +145,17 @@ export async function reportError(input: ErrorReportInput, deps: ErrorReportDeps
|
|
|
137
145
|
if (!settings.enabled) return { sent: false, reason: 'disabled' };
|
|
138
146
|
const now = (deps.now ?? Date.now)();
|
|
139
147
|
const key = `${input.code}\u0000${input.message.slice(0, 200)}`;
|
|
148
|
+
const configDir = (deps.configDir ?? getElanousConfigDir)();
|
|
149
|
+
if (settings.consented !== true) {
|
|
150
|
+
const report = buildErrorReport(input, {
|
|
151
|
+
installId: installId(configDir), settings, nexus: { alive: false }, at: new Date(now).toISOString(),
|
|
152
|
+
});
|
|
153
|
+
keepPending(report, configDir, deps);
|
|
154
|
+
return { sent: false, reason: 'awaiting-notice' };
|
|
155
|
+
}
|
|
140
156
|
const previous = lastSent.get(key);
|
|
141
157
|
if (previous !== undefined && now - previous < SAME_ERROR_GAP_MS) return { sent: false, reason: 'recently-sent' };
|
|
142
158
|
lastSent.set(key, now);
|
|
143
|
-
const configDir = (deps.configDir ?? getElanousConfigDir)();
|
|
144
159
|
const report = buildErrorReport(input, {
|
|
145
160
|
installId: installId(configDir), settings, nexus: await (deps.nexusMeta ?? defaultNexusMeta)(), at: new Date(now).toISOString(),
|
|
146
161
|
});
|
|
@@ -186,7 +201,9 @@ function keepPending(report: ErrorReport, configDir: string, deps: ErrorReportDe
|
|
|
186
201
|
export async function retryPendingErrorReport(deps: ErrorReportDeps = {}): Promise<ReportOutcome> {
|
|
187
202
|
try {
|
|
188
203
|
if (!(deps.enabledByEnvironment ?? defaultEnabledByEnvironment)()) return { sent: false, reason: 'environment' };
|
|
189
|
-
|
|
204
|
+
const settings = (deps.settings ?? defaultSettings)();
|
|
205
|
+
if (!settings.enabled) return { sent: false, reason: 'disabled' };
|
|
206
|
+
if (settings.consented !== true) return { sent: false, reason: 'awaiting-notice' };
|
|
190
207
|
const configDir = (deps.configDir ?? getElanousConfigDir)();
|
|
191
208
|
const file = pendingFile(configDir);
|
|
192
209
|
if (!existsSync(file)) return { sent: false, reason: 'none' };
|
|
@@ -4,7 +4,8 @@ import { debug } from '../debug/log.js';
|
|
|
4
4
|
import { extractVerbatimOriginalAsk } from '../self-implement/goal-author.js';
|
|
5
5
|
import { loadRunLedger } from '../self-implement/run-ledger.js';
|
|
6
6
|
import { queryRunningRuns, type QueriedRunningRunsResult } from '../self-implement/running-runs.js';
|
|
7
|
-
import type
|
|
7
|
+
import { CODEX_PROVIDER, GROK_PROVIDER, decideLaunchBudget, type BudgetAction, type BudgetDecision, type BudgetInputs } from '../self-implement/budget-gate.js';
|
|
8
|
+
import { DEFAULT_FALLBACK_CHAIN } from '../oauth/fallback-chain.js';
|
|
8
9
|
|
|
9
10
|
export type ActiveRunsForGoal = readonly string[] | 'unknown';
|
|
10
11
|
|
|
@@ -87,9 +88,164 @@ export function activeRunsForGoal(goalId: string, deps: ActiveRunsForGoalDeps =
|
|
|
87
88
|
}
|
|
88
89
|
}
|
|
89
90
|
|
|
91
|
+
const LAUNCH_BUDGET_PROVIDER: Readonly<Record<string, string>> = { 'codex-rotate': CODEX_PROVIDER, grok: GROK_PROVIDER };
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* L6 발사 관문의 예산 입력 보정 — 발사 우주의 config 에 체인이 없으면(작업 트리 = 시험 우주) 막지 않고
|
|
95
|
+
* 코드 기본 체인으로 판단한다. `--child-llm-provider` 를 명시했으면 그것이 체인이다(예산 판정 밖 provider 는 통과).
|
|
96
|
+
*/
|
|
97
|
+
export function harnessLaunchBudgetDecision(
|
|
98
|
+
inputs: BudgetInputs,
|
|
99
|
+
opts: { readonly childLlmProvider?: string; readonly childLlmModel?: string } = {},
|
|
100
|
+
): { readonly decision: BudgetDecision; readonly warning?: string; readonly unmeasuredProvider?: string } {
|
|
101
|
+
const explicit = opts.childLlmProvider?.trim();
|
|
102
|
+
const judged = (selected: BudgetInputs) => {
|
|
103
|
+
const { decision, unmeasuredProvider } = decideLaunchBudget(selected);
|
|
104
|
+
return { decision, ...(unmeasuredProvider ? { unmeasuredProvider, warning: `budget: ${unmeasuredProvider} usage unmeasured — launching` } : {}) };
|
|
105
|
+
};
|
|
106
|
+
if (explicit) {
|
|
107
|
+
if (explicit !== CODEX_PROVIDER && explicit !== GROK_PROVIDER) {
|
|
108
|
+
return {
|
|
109
|
+
decision: { action: 'proceed', provider: explicit, ...(opts.childLlmModel ? { model: opts.childLlmModel } : {}), reasons: [`${explicit}: 명시 provider — 예산 판정 밖`] },
|
|
110
|
+
warning: `budget: ${explicit} is outside the budget gate — launched as requested`,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
const chain = [{ provider: explicit, ...(opts.childLlmModel ? { model: opts.childLlmModel } : {}) }];
|
|
114
|
+
return judged({ ...inputs, preference: { ...inputs.preference, chain } });
|
|
115
|
+
}
|
|
116
|
+
if (inputs.preference.chain.length > 0) return judged(inputs);
|
|
117
|
+
const chain = DEFAULT_FALLBACK_CHAIN.map((step) => ({ provider: LAUNCH_BUDGET_PROVIDER[step] ?? step }));
|
|
118
|
+
const result = judged({ ...inputs, preference: { ...inputs.preference, chain } });
|
|
119
|
+
return {
|
|
120
|
+
...result,
|
|
121
|
+
warning: `budget: no chain in this universe's config — judged with the code default ${DEFAULT_FALLBACK_CHAIN.join(',')}${result.warning ? ` · ${result.warning}` : ''}`,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** Parent → Pod budget snapshot env. Numbers and names only — never a credential, never free-text reasons. */
|
|
126
|
+
export const BUDGET_SNAPSHOT_ENV = 'ELANOUS_BUDGET_SNAPSHOT';
|
|
127
|
+
export const BUDGET_SNAPSHOT_MAX_AGE_SEC = 15 * 60;
|
|
128
|
+
// Host and Pod clocks may differ slightly even when the Job carries a freshly measured verdict.
|
|
129
|
+
const BUDGET_SNAPSHOT_CLOCK_SKEW_SEC = 30;
|
|
130
|
+
|
|
131
|
+
/** The verdict the host's launch gate reached (chain ⊕ the user's caps) — the Pod follows it instead of judging again. */
|
|
132
|
+
export interface HostBudgetVerdict {
|
|
133
|
+
action: BudgetAction;
|
|
134
|
+
provider?: string;
|
|
135
|
+
model?: string;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export interface BudgetSnapshot {
|
|
139
|
+
/** The provider the host verdict picked, or the one asked for when nothing was picked. */
|
|
140
|
+
provider: string;
|
|
141
|
+
/** Percent of that provider's window still unspent (0–100) — observation only; absent when the host could not measure it. */
|
|
142
|
+
remaining?: number;
|
|
143
|
+
window: string;
|
|
144
|
+
/** Epoch milliseconds on the measuring host. */
|
|
145
|
+
measuredAt: number;
|
|
146
|
+
host: string;
|
|
147
|
+
/** The explicit child provider the host judged for (`--child-llm-provider`). Absent = the host's configured chain. */
|
|
148
|
+
requested?: string;
|
|
149
|
+
/** The host launch-gate verdict. Absent = the host reached none, and the Pod treats the budget as unmeasured. */
|
|
150
|
+
decision?: HostBudgetVerdict;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export type BudgetSource = 'snapshot' | 'local' | 'unmeasured';
|
|
154
|
+
|
|
155
|
+
export interface ResolvedLaunchBudget {
|
|
156
|
+
budget: BudgetDecision | 'unknown';
|
|
157
|
+
budgetSource: BudgetSource;
|
|
158
|
+
snapshotAgeSec?: number;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const BUDGET_ACTIONS: readonly BudgetAction[] = ['proceed', 'next-provider', 'wait-reset', 'stop'];
|
|
162
|
+
|
|
163
|
+
function canonicalBudgetProvider(name: string): string {
|
|
164
|
+
const id = name.trim();
|
|
165
|
+
return id === 'codex' || id === 'codex-rotate' ? 'openai-codex' : id;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function pickVerdict(value: unknown): HostBudgetVerdict | undefined {
|
|
169
|
+
if (!value || typeof value !== 'object') return undefined;
|
|
170
|
+
const { action, provider, model } = value as Record<string, unknown>;
|
|
171
|
+
if (typeof action !== 'string' || !(BUDGET_ACTIONS as readonly string[]).includes(action)) return undefined;
|
|
172
|
+
if (provider !== undefined && (typeof provider !== 'string' || !provider.trim())) return undefined;
|
|
173
|
+
if (model !== undefined && typeof model !== 'string') return undefined;
|
|
174
|
+
return { action: action as BudgetAction, ...(provider ? { provider: canonicalBudgetProvider(provider) } : {}), ...(model ? { model } : {}) };
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function encodeBudgetSnapshot(snapshot: BudgetSnapshot): string {
|
|
178
|
+
const { provider, remaining, window, measuredAt, host, requested, decision } = snapshot;
|
|
179
|
+
const verdict = pickVerdict(decision);
|
|
180
|
+
return JSON.stringify({
|
|
181
|
+
provider: canonicalBudgetProvider(provider),
|
|
182
|
+
...(typeof remaining === 'number' && Number.isFinite(remaining) ? { remaining } : {}),
|
|
183
|
+
window, measuredAt, host,
|
|
184
|
+
...(requested?.trim() ? { requested: canonicalBudgetProvider(requested) } : {}),
|
|
185
|
+
...(verdict ? { decision: verdict } : {}),
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function parseBudgetSnapshot(raw: string | undefined): BudgetSnapshot | undefined {
|
|
190
|
+
if (!raw?.trim()) return undefined;
|
|
191
|
+
try {
|
|
192
|
+
const value = JSON.parse(raw) as Record<string, unknown> | null;
|
|
193
|
+
if (!value || typeof value !== 'object') return undefined;
|
|
194
|
+
const { provider, remaining, window, measuredAt, host, requested, decision } = value;
|
|
195
|
+
if (typeof provider !== 'string' || !provider.trim() || typeof window !== 'string' || typeof host !== 'string') return undefined;
|
|
196
|
+
if (remaining !== undefined && (typeof remaining !== 'number' || !Number.isFinite(remaining) || remaining < 0 || remaining > 100)) return undefined;
|
|
197
|
+
if (typeof measuredAt !== 'number' || !Number.isFinite(measuredAt)) return undefined;
|
|
198
|
+
if (requested !== undefined && (typeof requested !== 'string' || !requested.trim())) return undefined;
|
|
199
|
+
const verdict = decision === undefined ? undefined : pickVerdict(decision);
|
|
200
|
+
if (decision !== undefined && !verdict) return undefined;
|
|
201
|
+
return {
|
|
202
|
+
provider: canonicalBudgetProvider(provider), ...(remaining !== undefined ? { remaining } : {}), window, measuredAt, host,
|
|
203
|
+
...(requested ? { requested: canonicalBudgetProvider(requested) } : {}), ...(verdict ? { decision: verdict } : {}),
|
|
204
|
+
};
|
|
205
|
+
} catch { return undefined; }
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/** The host's verdict as the Pod's decision — never re-judged with one provider or code-constant caps. */
|
|
209
|
+
function decisionFromSnapshot(snapshot: BudgetSnapshot, verdict: HostBudgetVerdict, ageSec: number): BudgetDecision {
|
|
210
|
+
const target = verdict.provider ? ` → ${verdict.provider}` : '';
|
|
211
|
+
const used = snapshot.remaining === undefined ? '' : ` · ${snapshot.provider} ${Math.round((100 - snapshot.remaining) * 100) / 100}% used (${snapshot.window})`;
|
|
212
|
+
return {
|
|
213
|
+
action: verdict.action,
|
|
214
|
+
...(verdict.provider ? { provider: verdict.provider } : {}),
|
|
215
|
+
...(verdict.model ? { model: verdict.model } : {}),
|
|
216
|
+
reasons: [`host ${snapshot.host} verdict ${verdict.action}${target}${used} · ${ageSec}s ago`],
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export interface ResolveLaunchBudgetDeps {
|
|
221
|
+
env?: Readonly<Record<string, string | undefined>> | undefined;
|
|
222
|
+
now?: () => number;
|
|
223
|
+
/** The provider this launch will use, when named explicitly. */
|
|
224
|
+
provider?: string | undefined;
|
|
225
|
+
/** Host-side measurement. Never called inside a Pod. */
|
|
226
|
+
measureLocal: () => Promise<BudgetDecision | 'unknown'>;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/** A Pod has no subscription credential or usage cache, so it follows the parent's verdict ⊕ its age and never measures. */
|
|
230
|
+
export async function resolveLaunchBudget(deps: ResolveLaunchBudgetDeps): Promise<ResolvedLaunchBudget> {
|
|
231
|
+
const env = deps.env ?? process.env;
|
|
232
|
+
if (env.ELANOUS_SUBSTRATE !== 'pod') return { budget: await deps.measureLocal(), budgetSource: 'local' };
|
|
233
|
+
const snapshot = parseBudgetSnapshot(env[BUDGET_SNAPSHOT_ENV]);
|
|
234
|
+
if (!snapshot) return { budget: 'unknown', budgetSource: 'unmeasured' };
|
|
235
|
+
const ageSec = Math.round(((deps.now ?? Date.now)() - snapshot.measuredAt) / 1000);
|
|
236
|
+
const requested = deps.provider?.trim() ? canonicalBudgetProvider(deps.provider) : undefined;
|
|
237
|
+
// The verdict holds only for the question the host answered: the same explicit provider, or both on the configured chain.
|
|
238
|
+
if (!snapshot.decision || ageSec < -BUDGET_SNAPSHOT_CLOCK_SKEW_SEC || ageSec > BUDGET_SNAPSHOT_MAX_AGE_SEC || requested !== snapshot.requested) {
|
|
239
|
+
return { budget: 'unknown', budgetSource: 'unmeasured', snapshotAgeSec: ageSec };
|
|
240
|
+
}
|
|
241
|
+
return { budget: decisionFromSnapshot(snapshot, snapshot.decision, Math.max(0, ageSec)), budgetSource: 'snapshot', snapshotAgeSec: ageSec };
|
|
242
|
+
}
|
|
243
|
+
|
|
90
244
|
export interface PreLaunchGateInput {
|
|
91
245
|
goalId: string;
|
|
92
246
|
budget?: BudgetDecision | 'unknown';
|
|
247
|
+
budgetSource?: BudgetSource;
|
|
248
|
+
snapshotAgeSec?: number;
|
|
93
249
|
forceLaunch?: boolean;
|
|
94
250
|
}
|
|
95
251
|
|
|
@@ -107,7 +263,7 @@ export interface PreLaunchGateDecision {
|
|
|
107
263
|
/** Force bypasses only a duplicate observation, never an exhausted budget. */
|
|
108
264
|
export function preLaunchGate(input: PreLaunchGateInput, deps: PreLaunchGateDeps = {}): PreLaunchGateDecision {
|
|
109
265
|
const decision = decidePreLaunch(input, deps);
|
|
110
|
-
debug.log('execution-loop.launch-gate', 'decision', { goalId: input.goalId, action: decision.action, sameGoalActiveRuns: decision.sameGoalActiveRuns, budget: decision.budget === 'unknown' ? 'unknown' : decision.budget.action, forceLaunch: input.forceLaunch === true, reason: decision.reason });
|
|
266
|
+
debug.log('execution-loop.launch-gate', 'decision', { goalId: input.goalId, action: decision.action, sameGoalActiveRuns: decision.sameGoalActiveRuns, budget: decision.budget === 'unknown' ? 'unknown' : decision.budget.action, forceLaunch: input.forceLaunch === true, reason: decision.reason, ...(input.budgetSource ? { budgetSource: input.budgetSource } : {}), ...(input.snapshotAgeSec !== undefined ? { snapshotAgeSec: input.snapshotAgeSec } : {}) });
|
|
111
267
|
return decision;
|
|
112
268
|
}
|
|
113
269
|
|