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
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
* Cf. PLAN-parallel-self-dev-orchestrator-2026-07-21.
|
|
20
20
|
*/
|
|
21
21
|
import { lstatSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
22
|
+
import type { ReviewRework } from '../../self-dev/run-types.js';
|
|
22
23
|
import { oldDoorInternalEnv } from '../../self-dev/old-door.js';
|
|
23
24
|
import { selfDevRunsDir } from '../../self-dev/run-store.js';
|
|
24
25
|
import { debug } from '../../debug/log.js';
|
|
@@ -89,6 +90,7 @@ export interface SelfImplementDisposition {
|
|
|
89
90
|
reviewVerdict?: 'pass' | 'warn' | 'fail';
|
|
90
91
|
/** 마지막 리뷰의 must-fix 수(`review.mustFix.length`). 같은 조건. */
|
|
91
92
|
reviewMustFixCount?: number;
|
|
93
|
+
rework?: ReviewRework;
|
|
92
94
|
mustFix?: string[];
|
|
93
95
|
}
|
|
94
96
|
|
|
@@ -463,6 +465,16 @@ export function parseSelfImplementJson(stdout: string): SelfImplementDisposition
|
|
|
463
465
|
const o = JSON.parse(line) as Record<string, unknown>;
|
|
464
466
|
if (typeof o.stage !== 'string' && typeof o.ok !== 'boolean') continue;
|
|
465
467
|
const failureClassification = failureClassificationFromJson(o);
|
|
468
|
+
const rawRework = o.rework && typeof o.rework === 'object' && !Array.isArray(o.rework)
|
|
469
|
+
? o.rework as Record<string, unknown> : undefined;
|
|
470
|
+
const rework = rawRework
|
|
471
|
+
&& typeof rawRework.trend === 'string'
|
|
472
|
+
&& ['unmeasured', 'improving', 'stable', 'worsening', 'oscillating'].includes(rawRework.trend)
|
|
473
|
+
&& typeof rawRework.signature === 'string'
|
|
474
|
+
&& typeof rawRework.rounds === 'number' && Number.isSafeInteger(rawRework.rounds) && rawRework.rounds >= 1
|
|
475
|
+
// A measured trend needs two reviews, a direction change three — a contradictory pair is not an observation.
|
|
476
|
+
&& (rawRework.trend === 'unmeasured' ? rawRework.rounds === 1 : rawRework.rounds >= (rawRework.trend === 'oscillating' ? 3 : 2))
|
|
477
|
+
? { trend: rawRework.trend as ReviewRework['trend'], signature: rawRework.signature, rounds: rawRework.rounds } : undefined;
|
|
466
478
|
const mapped: SelfImplementDisposition = {
|
|
467
479
|
...(typeof o.stage === 'string' ? { stage: o.stage } : {}),
|
|
468
480
|
...(typeof o.ok === 'boolean' ? { ok: o.ok } : {}),
|
|
@@ -499,7 +511,13 @@ export function parseSelfImplementJson(stdout: string): SelfImplementDisposition
|
|
|
499
511
|
? { providerErrors: o.providerErrors as SelfImplementDisposition['providerErrors'] } : {}),
|
|
500
512
|
...(typeof o.runId === 'string' && o.runId.trim() ? { runId: o.runId, childRunId: o.runId } : {}),
|
|
501
513
|
...reviewGateFields(o),
|
|
502
|
-
...(
|
|
514
|
+
...(rework ? { rework } : {}),
|
|
515
|
+
...(Array.isArray(o.mustFix) && o.mustFix.every((item) => typeof item === 'string') ? { mustFix: o.mustFix as string[] }
|
|
516
|
+
: o.review && typeof o.review === 'object' && !Array.isArray(o.review)
|
|
517
|
+
&& (o.review as { reviewed?: unknown }).reviewed === true
|
|
518
|
+
&& Array.isArray((o.review as { mustFix?: unknown }).mustFix)
|
|
519
|
+
&& ((o.review as { mustFix: unknown[] }).mustFix).every((item) => typeof item === 'string')
|
|
520
|
+
? { mustFix: (o.review as { mustFix: string[] }).mustFix } : {}),
|
|
503
521
|
};
|
|
504
522
|
reportUnmappedDispositionFields(o, mapped);
|
|
505
523
|
return mapped;
|
package/src/typecheck-ratchet.ts
CHANGED
|
@@ -12,6 +12,7 @@ export const TYPECHECK_GATE_CONFIG = 'tsconfig.gate.json';
|
|
|
12
12
|
* ⚠️ 호출자가 이미 `--max-old-space-size` 를 줬으면 «그것을» 존중한다(덮지 않는다).
|
|
13
13
|
*/
|
|
14
14
|
export const TSC_HEAP_MB = 20480;
|
|
15
|
+
export const TSC_OOM_RETRY_HEAP_MB = 32768;
|
|
15
16
|
export function tscEnv(base: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {
|
|
16
17
|
const cur = base.NODE_OPTIONS ?? '';
|
|
17
18
|
if (/--max-old-space-size[= ]/.test(cur)) return base;
|
package/src/user-config.ts
CHANGED
|
@@ -180,8 +180,11 @@ export interface LLMConfig {
|
|
|
180
180
|
baseUrl?: string;
|
|
181
181
|
/** OpenRouter 설정 한 곳(두 골이 같은 키를 쓴다):
|
|
182
182
|
* - `providerPreferences` — 상류 라우팅 선호; 도구 가능 기본값(require_parameters·allow_fallbacks)을 얕게 덮는다(OR-LLM-ROUTING-1).
|
|
183
|
-
* - `fallbackModel` — 유료 OpenRouter 폴백 모델; 체인에 openrouter 를 명시하고 모델·키를 모두 줄 때만 선택된다(OR-FALLBACK-TIER-1).
|
|
184
|
-
|
|
183
|
+
* - `fallbackModel` — 유료 OpenRouter 폴백 모델; 체인에 openrouter 를 명시하고 모델·키를 모두 줄 때만 선택된다(OR-FALLBACK-TIER-1).
|
|
184
|
+
* - `upstreamPins` — 모델별 상류 고정 `{ "<wire id>": ["<상류 slug>", …] }`(OR-DEEPSEEK-TUNE · 지금은 deepseek/* 만 읽는다).
|
|
185
|
+
* 기본값 = `src/llm/openrouter-upstream-pins.config.ts` · 모델별로 덮는다 · `[]` = 그 모델 고정 안 함.
|
|
186
|
+
* `providerPreferences` 에 order·only·allow_fallbacks 가 있으면 그쪽이 이긴다. */
|
|
187
|
+
openrouter?: { providerPreferences?: Record<string, unknown>; fallbackModel?: string; upstreamPins?: Record<string, string[]> };
|
|
185
188
|
/** Ordered rotation of providers the user can cycle through with
|
|
186
189
|
* `elanous provider:rotate` / `/provider next`. Each entry is a
|
|
187
190
|
* full (provider, model, apiKey, baseUrl) tuple that gets
|
|
@@ -197,6 +200,9 @@ export interface LLMConfig {
|
|
|
197
200
|
* 이 축은 «같은 provider 안에서 어느 계정의 토큰을 쓸지»를 바꾼다.
|
|
198
201
|
* 리셋 크레딧 자동 소비는 별도 일일 상한으로 제한한다. */
|
|
199
202
|
codexAccountRotation?: boolean;
|
|
203
|
+
/** REVIEW-ACP-POD — Pod merge-ready PR 을 병합 전에 호스트 Claude ACP(구독)로 리뷰한다. `true` 일 때만 켜진다(기본 꺼짐 = 종전).
|
|
204
|
+
* env `ELANOUS_POD_HOST_ACP_REVIEW` 가 이 값보다 앞선다. ACP 를 못 쓰면 종전 길(Pod 리뷰 → 재게이트). */
|
|
205
|
+
podHostAcpReview?: boolean;
|
|
200
206
|
/** ⭐⭐ codex 계정 «알림» — 회전·리셋크레딧 소비를 텔레그램 등 outbound 로 보낼지.
|
|
201
207
|
* ⛔ **기본 ON** — `false` 일 때만 조용해진다.
|
|
202
208
|
* ⛔⭐ 위 `codexAccountRotation` 과 «다른 축»이다(대표 지시 2026-08-17 *"회전을 끄라는 게
|
|
@@ -225,8 +231,16 @@ export interface LLMConfig {
|
|
|
225
231
|
* `within-quota`(한도 안에서만 · 전부 차면 멈춤) · `fallback`(한도 안 ⊕ 폴백 체인 · 기본) · `credits`(크레딧까지).
|
|
226
232
|
* 회전·Pod 배분·폴백·매시 한도 알림이 «이 한 값»을 같이 읽는다. 없으면 옛 `codexCreditsAllowed` 를 읽는다. */
|
|
227
233
|
codexQuotaPolicy?: 'within-quota' | 'fallback' | 'credits';
|
|
234
|
+
/** SUBSCRIPTION-EXHAUST-REROUTE (0.2.24) — codex 선불 크레딧 «예비분». 잔액이 이 값 이하로 «알려지면» 크레딧을 쓰지 않고
|
|
235
|
+
* 회전이 `no-candidate` 를 내 폴백(우선 openrouter)으로 넘긴다. 잔액을 모르면 종전. 없으면 2000(`DEFAULT_CODEX_CREDIT_RESERVE`). */
|
|
236
|
+
codexCreditReserve?: number;
|
|
228
237
|
/** Grok weekly launch usage ceiling (percent); defaults to 80. */
|
|
229
238
|
grokWeeklyCapPct?: number;
|
|
239
|
+
/** 대표 2026-10-11 ZAI-CODING-PLAN-PROVIDER — `glm` 직결(Z.ai 코딩 엔드포인트 · `ZAI_API_KEY` 가 있을 때만 선다).
|
|
240
|
+
* `overage` = 플랜 창이 차면 무엇을 하나(codex `codexQuotaPolicy` 와 같은 축 · `src/llm/zai-coding-plan.ts` 가 canonical):
|
|
241
|
+
* `stop`(멈춤 · 기본) · `balance`(계정 잔액 «extra usage» 로 계속 · 잔액/월 상한이면 OpenRouter) · `openrouter`(바로 OpenRouter).
|
|
242
|
+
* `maxConcurrent` = 프로세스당 동시 호출 상한(기본 3). */
|
|
243
|
+
zaiCodingPlan?: { overage?: 'stop' | 'balance' | 'openrouter'; maxConcurrent?: number };
|
|
230
244
|
/** ⭐⭐ codex 가 «소진된 뒤» 갈 곳을 «순서»로 정한다 (대표 2026-08-13).
|
|
231
245
|
*
|
|
232
246
|
* 값: `['codex-rotate', 'grok']` 등 — 아는 칸은 `FALLBACK_STEPS`, 모르는 이름은 버린다(관측에 남는다).
|
|
@@ -1173,6 +1187,9 @@ export interface SelfImplementToolConfig {
|
|
|
1173
1187
|
* Overload failover (OVERLOAD-FAILOVER) may move an unpinned codex child to
|
|
1174
1188
|
* grok. A pinned codex provider is never moved. */
|
|
1175
1189
|
childLlm?: ChildLlmPreferenceConfig;
|
|
1190
|
+
/** SUBSCRIPTION-EXHAUST-REROUTE (0.2.24) — `--child-llm-*` 없이 뜬 Pod 구현 자식의 기본 모델.
|
|
1191
|
+
* `{ provider, model? }` · `'off'`(종전 codex 기본). 없으면 `openrouter/z-ai/glm-5.3`. 원값 — `resolvePodChildDefault` 가 검사한다. */
|
|
1192
|
+
podChildDefault?: unknown;
|
|
1176
1193
|
/** ⭐ PR-open 사전 승인 (2026-07-26 · 대표 결정 "오토 선호 · 기본 ON").
|
|
1177
1194
|
*
|
|
1178
1195
|
* self-build 가 gate 를 통과하면 **PR 을 자동 개설**한다(기본 `true`).
|
|
@@ -1497,8 +1514,10 @@ export interface ChatCompactConfig {
|
|
|
1497
1514
|
|
|
1498
1515
|
/** ER1 — 액티브 덤퍼(오류 자동 보고). 기본 켬(첫 실행 안내 한 번 · 대표 10-01) · 신원(email/telegramUser)은 따로 «예»일 때만. */
|
|
1499
1516
|
export interface ErrorReportsConfig {
|
|
1500
|
-
/** false = never send. Absent
|
|
1517
|
+
/** false = never send. Absent retains the feature but sending waits for the first-run notice. */
|
|
1501
1518
|
enabled?: boolean;
|
|
1519
|
+
/** Persisted only after the first-run notice was shown to a person. */
|
|
1520
|
+
noticeShown?: boolean;
|
|
1502
1521
|
/** true = also send email / telegramUser below with each report. Default false. */
|
|
1503
1522
|
identity?: boolean;
|
|
1504
1523
|
email?: string;
|
|
@@ -1511,6 +1530,7 @@ export function parseErrorReportsConfig(raw: unknown): ErrorReportsConfig | unde
|
|
|
1511
1530
|
const out: ErrorReportsConfig = {};
|
|
1512
1531
|
if (r.enabled === false || r.enabled === 'false') out.enabled = false;
|
|
1513
1532
|
else if (r.enabled === true || r.enabled === 'true') out.enabled = true;
|
|
1533
|
+
if (r.noticeShown === true) out.noticeShown = true;
|
|
1514
1534
|
if (r.identity === true || r.identity === 'true') out.identity = true;
|
|
1515
1535
|
if (typeof r.email === 'string' && r.email.trim()) out.email = r.email.trim();
|
|
1516
1536
|
if (typeof r.telegramUser === 'string' && r.telegramUser.trim()) out.telegramUser = r.telegramUser.trim();
|
|
@@ -2749,7 +2769,7 @@ function parseToolsConfig(raw: unknown): ToolsConfig {
|
|
|
2749
2769
|
runDevHarness,
|
|
2750
2770
|
selfOrchestrate,
|
|
2751
2771
|
nativeStructure,
|
|
2752
|
-
selfImplement: { worktreeRoot, childInstanceMode, prApprovalDelivery, observeOnly, goalRecordInDoc, goalAuthorPersistentGrounding, fabricDecompose, fabricDecomposeAutoPathThreshold, autoOpenPr, draftOnStop, salvageRetention, autoStop, autoAssist, screenStallTermination, reworkBudget, decompositionShadow, clarificationEscalation, ...(childLlm ? { childLlm } : {}), ...(runTtlHours !== undefined ? { runTtlHours } : {}), ...(draftSweepCloseCap !== undefined ? { draftSweepCloseCap } : {}), ...(runTtl ? { runTtl } : {}), ...(autoheal ? { autoheal } : {}) },
|
|
2772
|
+
selfImplement: { worktreeRoot, childInstanceMode, prApprovalDelivery, observeOnly, goalRecordInDoc, goalAuthorPersistentGrounding, fabricDecompose, fabricDecomposeAutoPathThreshold, autoOpenPr, draftOnStop, salvageRetention, autoStop, autoAssist, screenStallTermination, reworkBudget, decompositionShadow, clarificationEscalation, ...(childLlm ? { childLlm } : {}), ...(selfImplRaw.podChildDefault !== undefined ? { podChildDefault: selfImplRaw.podChildDefault } : {}), ...(runTtlHours !== undefined ? { runTtlHours } : {}), ...(draftSweepCloseCap !== undefined ? { draftSweepCloseCap } : {}), ...(runTtl ? { runTtl } : {}), ...(autoheal ? { autoheal } : {}) },
|
|
2753
2773
|
};
|
|
2754
2774
|
}
|
|
2755
2775
|
|
|
@@ -3809,10 +3829,10 @@ export interface UserConfig {
|
|
|
3809
3829
|
starter?: { topics?: string[] };
|
|
3810
3830
|
/** GUARD-ONE-a: omitted means shadow. `live` is parsed for the later cutover, but `elanous guardian tick`
|
|
3811
3831
|
* refuses it until a human-confirmed operational change (GUARD-ONE-a ships shadow only). */
|
|
3812
|
-
guardian?: { mode?: 'shadow' | 'live' };
|
|
3832
|
+
guardian?: { mode?: 'shadow' | 'live'; /** Orphan CLI GC on the guardian tick: off = no ps collection, shadow (default) = evidence only, on = evidence then SIGTERM. */ orphanGc?: 'off' | 'shadow' | 'on' };
|
|
3813
3833
|
/** TA-JUDGE-LIVE-SAFE: task-agent judge moves executed for real. Only `review` · `propose-green` are honoured
|
|
3814
3834
|
* (`src/task-agent/live-moves.ts` drops anything else with a warning). Absent = env ELANOUS_TASK_AGENT_LIVE_MOVES, else none (pure shadow). */
|
|
3815
|
-
taskAgent?: { liveMoves?: string[]; parentHost?: { host?: string; cwd?: string; elanous?: string; configDir?: string; podPool?: string; approvalCapacity?: number } | Array<{ host?: string; cwd?: string; elanous?: string; configDir?: string; podPool?: string; approvalCapacity?: number }> };
|
|
3835
|
+
taskAgent?: { liveMoves?: string[]; /** TA-REJUDGE-PERIODIC — steward tick runs `tasks rejudge --all` every N minutes (absent/0 = off). */ rejudgeEveryMinutes?: number; /** 1-minute load average above which that tick is skipped (default 60). */ rejudgeMaxLoad?: number; parentHost?: { host?: string; cwd?: string; elanous?: string; configDir?: string; podPool?: string; approvalCapacity?: number } | Array<{ host?: string; cwd?: string; elanous?: string; configDir?: string; podPool?: string; approvalCapacity?: number }> };
|
|
3816
3836
|
events?: EventsConfig;
|
|
3817
3837
|
/** GATE-REMOTE — see GateRemoteConfig. Absent = defaults (auto on · node-b · load 20 · cap 2). */
|
|
3818
3838
|
gateRemote?: GateRemoteConfig;
|
|
@@ -3837,7 +3857,7 @@ export interface UserConfig {
|
|
|
3837
3857
|
loops?: { owners?: Record<string, EventSeat>; defaultOwner?: EventSeat; orchestrator?: OrchestratorLoopConfig; steward?: { mode?: StewardLoopMode; linearTeam?: string; roles?: Record<string, { maxConcurrent?: number }>; budget?: number; tracks?: Record<string, string>; alertAfterFailures?: number; launch?: 'off' | 'shadow' | 'live'; maxParallel?: number; podPool?: string }; seat?: SeatLoopConfig; persona?: PersonaLoopConfig };
|
|
3838
3858
|
/** 🔐 Pod 의 Grok API 키 과금은 명시 opt-in 만. 생략·잘못된 값은 false.
|
|
3839
3859
|
* budgetGate 와 같은 `harness` 객체다 — 중복 선언이면 뒤 타입이 앞을 지운다. */
|
|
3840
|
-
harness?: { edgeRail?: { canaryOkRuns?: number; failureMultiplier?: number; minSamples?: number }; /** Goal authoring grade; absent or invalid config resolves to full. */ authorGrade?: 'full' | 'lite'; revertGuard?: { depth: number }; pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; exposeGate?: 'warn' | 'strict'; difficultyPlacement?: boolean; defaultRepo?: string; /** Optional GitHub repository name (owner/repo), distinct from the local defaultRepo path. */ repo?: string; substrate?: 'local' | 'pod'; podPool?: string; /** IMAGE-ONE-SOURCE: Pod 발사가 당길 기준 이미지 커밋(hex 12~40 · 레지스트리 태그 = 앞 12자리). 없으면 종전대로 HEAD 비교·굽기. */ imageCommit?: string; worktreeAddTimeoutSec?: number; queue?: { seatCap?: Partial<Record<'OP' | 'TC' | 'MK' | 'UX', number>>; /** Direct `harness say|ask` goes through the seat queue first (ONEDOOR-2). Absent = env ELANOUS_HARNESS_QUEUE_DIRECT_SAY, else off. */ directSay?: boolean; /** SEAT-CAP-STALE: a run whose last ledger progress is older than this stops holding its seat. Absent = env ELANOUS_HARNESS_QUEUE_STALE_RUN_MINUTES, else 30. */ staleRunMinutes?: number; /** Seat-less runs count in one bucket with this cap instead of every seat. Absent = env ELANOUS_HARNESS_QUEUE_UNKNOWN_SEAT_CAP, else 2. */ unknownSeatCap?: number; /** QUEUE-BURST: most launches one scheduled tick may make (30 s apart, each within seat cap and Pod pool headroom). Absent or invalid = 5; 1 = one launch per tick. */ burstMax?: number }; /** `harness say` 문장을 Pod 안에서 저작부터 돌릴지. 생략·false = 끔(호스트가 저작). */ authorOnPod?: boolean; /** SIBLING-RESYNC-ON-MERGE: most open sibling PR file inventories fetched per merge. Absent or invalid = 40. */ siblingResync?: { maxFetch?: number }; /** Stopped-PR repair goals: shadow records only (default); live enqueues them. */ helper?: { repair?: 'shadow' | 'live'; /** Live launches allowed per UTC day. Absent or invalid means 3. */ repairPerDay?: number };
|
|
3860
|
+
harness?: { edgeRail?: { canaryOkRuns?: number; failureMultiplier?: number; minSamples?: number }; /** Goal authoring grade; absent or invalid config resolves to full. */ authorGrade?: 'full' | 'lite'; revertGuard?: { depth: number }; pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; exposeGate?: 'warn' | 'strict'; difficultyPlacement?: boolean; defaultRepo?: string; /** Optional GitHub repository name (owner/repo), distinct from the local defaultRepo path. */ repo?: string; /** `auto` = SUBSTRATE-ROUTE: routeAutoSubstrate 가 pod/local 을 고른다(신호가 없으면 pod). */ substrate?: 'local' | 'pod' | 'auto'; podPool?: string; /** IMAGE-ONE-SOURCE: Pod 발사가 당길 기준 이미지 커밋(hex 12~40 · 레지스트리 태그 = 앞 12자리). 없으면 종전대로 HEAD 비교·굽기. */ imageCommit?: string; worktreeAddTimeoutSec?: number; queue?: { seatCap?: Partial<Record<'OP' | 'TC' | 'MK' | 'UX', number>>; /** Direct `harness say|ask` goes through the seat queue first (ONEDOOR-2). Absent = env ELANOUS_HARNESS_QUEUE_DIRECT_SAY, else off. */ directSay?: boolean; /** SEAT-CAP-STALE: a run whose last ledger progress is older than this stops holding its seat. Absent = env ELANOUS_HARNESS_QUEUE_STALE_RUN_MINUTES, else 30. */ staleRunMinutes?: number; /** Seat-less runs count in one bucket with this cap instead of every seat. Absent = env ELANOUS_HARNESS_QUEUE_UNKNOWN_SEAT_CAP, else 2. */ unknownSeatCap?: number; /** QUEUE-BURST: most launches one scheduled tick may make (30 s apart, each within seat cap and Pod pool headroom). Absent or invalid = 5; 1 = one launch per tick. */ burstMax?: number }; /** `harness say` 문장을 Pod 안에서 저작부터 돌릴지. 생략·false = 끔(호스트가 저작). */ authorOnPod?: boolean; /** SIBLING-RESYNC-ON-MERGE: most open sibling PR file inventories fetched per merge. Absent or invalid = 40. */ siblingResync?: { maxFetch?: number }; /** Stopped-PR repair goals: shadow records only (default); live enqueues them. */ helper?: { repair?: 'shadow' | 'live'; /** Live launches allowed per UTC day. Absent or invalid means 3. */ repairPerDay?: number };
|
|
3841
3861
|
/** Nested elanous launches. Only depth 0 may set `allow`. Absent or any other value refuses. A depth >= 1 `--nested-elanous allow` is ignored. */
|
|
3842
3862
|
nestedElanous?: 'allow' | 'refuse';
|
|
3843
3863
|
/** Maximum nested elanous depth; safe positive integer, default 2. */
|
|
@@ -4123,15 +4143,24 @@ function parseTaskAgentConfig(raw: unknown): UserConfig['taskAgent'] {
|
|
|
4123
4143
|
return undefined;
|
|
4124
4144
|
}
|
|
4125
4145
|
const parentHost = parseTaskAgentParentHost((raw as Record<string, unknown>).parentHost);
|
|
4146
|
+
// TA-REJUDGE-PERIODIC — 음이 아닌 유한수만 산다(0 = 끔). 그 밖은 경고하고 버린다(= 끔 · 기본 부하 상한).
|
|
4147
|
+
const rejudge: { rejudgeEveryMinutes?: number; rejudgeMaxLoad?: number } = {};
|
|
4148
|
+
for (const key of ['rejudgeEveryMinutes', 'rejudgeMaxLoad'] as const) {
|
|
4149
|
+
const value = (raw as Record<string, unknown>)[key];
|
|
4150
|
+
if (value === undefined) continue;
|
|
4151
|
+
if (typeof value === 'number' && Number.isFinite(value) && value >= 0) rejudge[key] = value;
|
|
4152
|
+
else warnUserConfigDrop(`taskAgent.${key}`, `음이 아닌 수가 아니다(${JSON.stringify(value)}) — 버림`);
|
|
4153
|
+
}
|
|
4154
|
+
const extras = { ...rejudge, ...(parentHost ? { parentHost } : {}) };
|
|
4126
4155
|
const liveMoves = (raw as Record<string, unknown>).liveMoves;
|
|
4127
|
-
if (liveMoves === undefined) return
|
|
4156
|
+
if (liveMoves === undefined) return Object.keys(extras).length ? extras : undefined;
|
|
4128
4157
|
// 설정이 «있으면» 환경 변수로 내려가지 않는다 — 배열이 아니면 빈 목록(fail-closed), 문자열 밖 항목은 글자로 바꿔 넘겨
|
|
4129
4158
|
// 실행부가 «모르는 항목»으로 경고하고 버리게 한다(유효한 항목은 산다).
|
|
4130
4159
|
if (!Array.isArray(liveMoves)) {
|
|
4131
4160
|
warnUserConfigDrop('taskAgent.liveMoves', '배열이 아니다 — 빈 목록(실행 0)');
|
|
4132
|
-
return { liveMoves: [], ...
|
|
4161
|
+
return { liveMoves: [], ...extras };
|
|
4133
4162
|
}
|
|
4134
|
-
return { liveMoves: liveMoves.map((entry) => typeof entry === 'string' ? entry : JSON.stringify(entry) ?? String(entry)), ...
|
|
4163
|
+
return { liveMoves: liveMoves.map((entry) => typeof entry === 'string' ? entry : JSON.stringify(entry) ?? String(entry)), ...extras };
|
|
4135
4164
|
}
|
|
4136
4165
|
|
|
4137
4166
|
function parseGuardianConfig(raw: unknown): UserConfig['guardian'] {
|
|
@@ -4140,10 +4169,13 @@ function parseGuardianConfig(raw: unknown): UserConfig['guardian'] {
|
|
|
4140
4169
|
warnUserConfigDrop('guardian', '섹션이 객체가 아니다 — 버림');
|
|
4141
4170
|
return undefined;
|
|
4142
4171
|
}
|
|
4143
|
-
const mode =
|
|
4144
|
-
|
|
4145
|
-
if (mode
|
|
4146
|
-
|
|
4172
|
+
const { mode, orphanGc } = raw as Record<string, unknown>;
|
|
4173
|
+
const out: NonNullable<UserConfig['guardian']> = {};
|
|
4174
|
+
if (mode === 'shadow' || mode === 'live') out.mode = mode;
|
|
4175
|
+
else if (mode !== undefined) warnUserConfigDrop('guardian.mode', 'shadow 또는 live 가 아니다 — 버림');
|
|
4176
|
+
if (orphanGc === 'off' || orphanGc === 'shadow' || orphanGc === 'on') out.orphanGc = orphanGc;
|
|
4177
|
+
else if (orphanGc !== undefined) warnUserConfigDrop('guardian.orphanGc', `off|shadow|on 이 아니다(${JSON.stringify(orphanGc)}) — 버리고 shadow 로 진행`);
|
|
4178
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
4147
4179
|
}
|
|
4148
4180
|
|
|
4149
4181
|
/** Parse optional ops fields independently; invalid settings cannot silently select a cron cwd. */
|
|
@@ -5095,7 +5127,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5095
5127
|
...(typeof unknownCap === 'number' && Number.isSafeInteger(unknownCap) && unknownCap >= 0 ? { unknownSeatCap: unknownCap } : {}),
|
|
5096
5128
|
};
|
|
5097
5129
|
})() },
|
|
5098
|
-
...(harness.substrate === 'local' || harness.substrate === 'pod' ? { substrate: harness.substrate } : {}),
|
|
5130
|
+
...(harness.substrate === 'local' || harness.substrate === 'pod' || harness.substrate === 'auto' ? { substrate: harness.substrate } : {}),
|
|
5099
5131
|
...(typeof harness.podPool === 'string' && harness.podPool.trim() ? { podPool: harness.podPool.trim() } : {}),
|
|
5100
5132
|
...(() => {
|
|
5101
5133
|
if (harness.imageCommit === undefined) return {};
|
|
@@ -5198,10 +5230,14 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5198
5230
|
if (!router || typeof router !== 'object' || Array.isArray(router)) return undefined;
|
|
5199
5231
|
const preferences = (router as Record<string, unknown>).providerPreferences;
|
|
5200
5232
|
const fallbackModel = (router as Record<string, unknown>).fallbackModel;
|
|
5233
|
+
const upstreamPins = (router as Record<string, unknown>).upstreamPins;
|
|
5201
5234
|
const out = {
|
|
5202
5235
|
...(preferences && typeof preferences === 'object' && !Array.isArray(preferences)
|
|
5203
5236
|
? { providerPreferences: { ...preferences } as Record<string, unknown> } : {}),
|
|
5204
5237
|
...(typeof fallbackModel === 'string' ? { fallbackModel } : {}),
|
|
5238
|
+
...(upstreamPins && typeof upstreamPins === 'object' && !Array.isArray(upstreamPins)
|
|
5239
|
+
? { upstreamPins: Object.fromEntries(Object.entries(upstreamPins as Record<string, unknown>)
|
|
5240
|
+
.filter((e): e is [string, string[]] => Array.isArray(e[1]) && e[1].every((x) => typeof x === 'string'))) } : {}),
|
|
5205
5241
|
};
|
|
5206
5242
|
return Object.keys(out).length > 0 ? out : undefined;
|
|
5207
5243
|
})(),
|
|
@@ -5216,6 +5252,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5216
5252
|
goalLoop: parseGoalLoop(llm.goalLoop),
|
|
5217
5253
|
memoryJudge: parseMemoryJudge(llm.memoryJudge),
|
|
5218
5254
|
codexInspectExempt: llm.codexInspectExempt === true ? true : undefined,
|
|
5255
|
+
podHostAcpReview: llm.podHostAcpReview === true ? true : undefined,
|
|
5219
5256
|
// ⛔⭐ 「false 만 끈다」 — 미설정·true 는 undefined 로 두어 기본 ON 을 유지한다(대표 결정 ②).
|
|
5220
5257
|
// ⚠️ 이 줄이 «없으면» 타입만 있고 파서가 안 읽어 ***노브가 no-op 이 된다***(실측으로 잡았다).
|
|
5221
5258
|
codexAccountRotation: llm.codexAccountRotation === false ? false : undefined,
|
|
@@ -5235,8 +5272,22 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5235
5272
|
// ⛔ 같은 모양(문자열 배열)이라 아래 fallbackChain 과 «같은 자»를 쓴다.
|
|
5236
5273
|
codexCreditsAllowed: llm.codexCreditsAllowed === true ? true : undefined,
|
|
5237
5274
|
codexQuotaPolicy: isCodexQuotaPolicy(llm.codexQuotaPolicy) ? llm.codexQuotaPolicy : undefined,
|
|
5275
|
+
codexCreditReserve: typeof llm.codexCreditReserve === 'number' && Number.isFinite(llm.codexCreditReserve) && llm.codexCreditReserve >= 0
|
|
5276
|
+
? llm.codexCreditReserve : undefined,
|
|
5238
5277
|
grokWeeklyCapPct: typeof llm.grokWeeklyCapPct === 'number' && Number.isFinite(llm.grokWeeklyCapPct)
|
|
5239
5278
|
&& llm.grokWeeklyCapPct >= 0 && llm.grokWeeklyCapPct <= 100 ? llm.grokWeeklyCapPct : LLM_DEFAULTS.grokWeeklyCapPct,
|
|
5279
|
+
// ⛔ 타입·파서·재노출 «셋»이 다 있어야 노브가 산다(형제 주석의 실측) — 재노출은 saveUserConfig 의 llm 블록.
|
|
5280
|
+
zaiCodingPlan: (() => {
|
|
5281
|
+
const z = llm.zaiCodingPlan;
|
|
5282
|
+
if (!z || typeof z !== 'object' || Array.isArray(z)) return undefined;
|
|
5283
|
+
const overage = (z as Record<string, unknown>).overage;
|
|
5284
|
+
const maxConcurrent = (z as Record<string, unknown>).maxConcurrent;
|
|
5285
|
+
const out = {
|
|
5286
|
+
...(overage === 'stop' || overage === 'balance' || overage === 'openrouter' ? { overage: overage as 'stop' | 'balance' | 'openrouter' } : {}),
|
|
5287
|
+
...(typeof maxConcurrent === 'number' && Number.isSafeInteger(maxConcurrent) && maxConcurrent >= 1 ? { maxConcurrent } : {}),
|
|
5288
|
+
};
|
|
5289
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
5290
|
+
})(),
|
|
5240
5291
|
codexAccountOrder: Array.isArray(llm.codexAccountOrder)
|
|
5241
5292
|
? llm.codexAccountOrder.filter((v: unknown): v is string => typeof v === 'string' && v.length > 0)
|
|
5242
5293
|
: undefined,
|
|
@@ -6512,6 +6563,7 @@ export function saveUserConfig(
|
|
|
6512
6563
|
goalLoop: cfg.llm.goalLoop,
|
|
6513
6564
|
memoryJudge: cfg.llm.memoryJudge,
|
|
6514
6565
|
codexInspectExempt: cfg.llm.codexInspectExempt,
|
|
6566
|
+
podHostAcpReview: cfg.llm.podHostAcpReview,
|
|
6515
6567
|
codexAccountRotation: cfg.llm.codexAccountRotation,
|
|
6516
6568
|
codexAccountAlerts: cfg.llm.codexAccountAlerts,
|
|
6517
6569
|
codexAccountRotationThresholdPercent: cfg.llm.codexAccountRotationThresholdPercent,
|
|
@@ -6520,7 +6572,9 @@ export function saveUserConfig(
|
|
|
6520
6572
|
// ★ 2026-09-28: 타입·파서에만 넣고 이 whitelist 를 빠뜨려 `config set llm.codexCreditsAllowed true` 가 «직렬화 드롭» 됐다(#21375 직후 운영 실측).
|
|
6521
6573
|
codexCreditsAllowed: cfg.llm.codexCreditsAllowed,
|
|
6522
6574
|
codexQuotaPolicy: cfg.llm.codexQuotaPolicy,
|
|
6575
|
+
codexCreditReserve: cfg.llm.codexCreditReserve,
|
|
6523
6576
|
grokWeeklyCapPct: cfg.llm.grokWeeklyCapPct,
|
|
6577
|
+
zaiCodingPlan: cfg.llm.zaiCodingPlan,
|
|
6524
6578
|
fallbackChain: cfg.llm.fallbackChain,
|
|
6525
6579
|
openrouter: cfg.llm.openrouter,
|
|
6526
6580
|
reviewFallbackModels: cfg.llm.reviewFallbackModels,
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// ── 결함 주입 심 — «자격 만료» (grok 구독) ──────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// 🚨 왜 이것이 있나 (SIM-VERIFY-KIT 둘째 심 · 2026-10-12)
|
|
4
|
+
// «만료가 가까운 grok 구독으로 Pod 를 띄움» 은 운영에서 그 시각이 오기를 기다려야 났다
|
|
5
|
+
// (10-12 node-b · 만료 32분 전 발사 → 헛발사 · AUT-GROK-CRED-EXPIRY-NO-LAUNCH #26465).
|
|
6
|
+
// 이 심은 임시 HOME 에 만료 시각만 정한 자격 파일을 두고 «시계»와 «호스트 갱신 결과»만 바꿔 그 순간을 일으킨다.
|
|
7
|
+
//
|
|
8
|
+
// ⛔ 흉내 내지 않는다: 디스패처가 보는 grokLaunchReadiness 와 Pod 발사 계획이 보는 podGrokSubscriptionUsable 을
|
|
9
|
+
// 그대로 부른다. 바꾸는 것은 자격 파일 위치(임시 HOME) · 시계(now) · 갱신 결과(refresh) 뿐이다 — CLI·네트워크 없음.
|
|
10
|
+
|
|
11
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
12
|
+
import { tmpdir } from 'node:os';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import type { GrokRefreshOutcome } from '../grok/credential.js';
|
|
15
|
+
import { POD_GROK_MIN_VALIDITY_MS, grokLaunchReadiness, podGrokSubscriptionUsable, podGrokSkippedLine } from '../task-orchestrator/surfaces/self-implement-pod.js';
|
|
16
|
+
|
|
17
|
+
export interface CredExpiryScenario {
|
|
18
|
+
/** 발사 시각 기준 만료까지 남은 시간(ms) — 음수면 이미 만료. */
|
|
19
|
+
readonly expiresInMs: number;
|
|
20
|
+
/** 호스트 갱신(`grok models`) 결과 — 'refreshed' 면 만료를 extendToMs 만큼 늘린다. */
|
|
21
|
+
readonly refresh: GrokRefreshOutcome | 'threw';
|
|
22
|
+
/** 'refreshed' 일 때 새 만료까지 남은 시간(ms). */
|
|
23
|
+
readonly extendToMs?: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface CredExpiryObservation {
|
|
27
|
+
readonly scenario: CredExpiryScenario;
|
|
28
|
+
/** 디스패처 읽기 전용 판정(갱신 없음). */
|
|
29
|
+
readonly readiness: ReturnType<typeof grokLaunchReadiness>;
|
|
30
|
+
/** 발사 계획 판정(갱신 한 번 시도 뒤). */
|
|
31
|
+
readonly usable: ReturnType<typeof podGrokSubscriptionUsable>;
|
|
32
|
+
/** 발사 화면에 나갈 한 줄(빠졌을 때만). */
|
|
33
|
+
readonly launchLine: string | null;
|
|
34
|
+
/** 판정이 남긴 관측 줄. */
|
|
35
|
+
readonly logs: ReadonlyArray<{ category: string; event: string; data: Record<string, unknown> }>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** 'refreshed' 에서 extendToMs 를 안 주면 쓰는 새 만료까지의 시간(가정값 · 표에 «→12h00m» 으로 보인다). */
|
|
39
|
+
export const DEFAULT_EXTEND_MS = 12 * 3600_000;
|
|
40
|
+
|
|
41
|
+
function writeAuth(home: string, expiresAtMs: number): void {
|
|
42
|
+
mkdirSync(join(home, '.grok'), { recursive: true });
|
|
43
|
+
writeFileSync(join(home, '.grok', 'auth.json'), JSON.stringify({
|
|
44
|
+
'https://auth.x.ai::client': { key: 'sim-access', expires_at: new Date(expiresAtMs).toISOString(), refresh_token: 'sim-refresh' },
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** 한 시나리오를 임시 HOME 에서 돌리고 지운다. */
|
|
49
|
+
export function simCredExpiry(scenario: CredExpiryScenario): CredExpiryObservation {
|
|
50
|
+
const home = mkdtempSync(join(tmpdir(), 'ux-sim-cred-expiry-'));
|
|
51
|
+
try {
|
|
52
|
+
const now = Date.now();
|
|
53
|
+
writeAuth(home, now + scenario.expiresInMs);
|
|
54
|
+
const readiness = grokLaunchReadiness({ home, env: {} as NodeJS.ProcessEnv });
|
|
55
|
+
const logs: Array<{ category: string; event: string; data: Record<string, unknown> }> = [];
|
|
56
|
+
const usable = podGrokSubscriptionUsable({
|
|
57
|
+
home, env: {} as NodeJS.ProcessEnv,
|
|
58
|
+
refresh: () => {
|
|
59
|
+
if (scenario.refresh === 'threw') throw new Error('sim: grok CLI threw');
|
|
60
|
+
if (scenario.refresh === 'refreshed') writeAuth(home, Date.now() + (scenario.extendToMs ?? DEFAULT_EXTEND_MS));
|
|
61
|
+
return scenario.refresh;
|
|
62
|
+
},
|
|
63
|
+
log: (category, event, data) => { logs.push({ category, event, data }); },
|
|
64
|
+
});
|
|
65
|
+
return { scenario, readiness, usable, launchLine: usable.usable ? null : podGrokSkippedLine(usable), logs };
|
|
66
|
+
} finally {
|
|
67
|
+
rmSync(home, { recursive: true, force: true });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** 기본 훑기 — 10-12 node-b 사건(만료 32분 전)을 갱신 결과 넷으로, 그리고 경계(최소 유효 시간 앞뒤)를. */
|
|
72
|
+
export function credExpirySweep(): CredExpiryObservation[] {
|
|
73
|
+
const min = 60_000;
|
|
74
|
+
return [
|
|
75
|
+
simCredExpiry({ expiresInMs: 12 * 3600_000, refresh: 'unchanged' }),
|
|
76
|
+
simCredExpiry({ expiresInMs: POD_GROK_MIN_VALIDITY_MS + 5 * min, refresh: 'unchanged' }),
|
|
77
|
+
simCredExpiry({ expiresInMs: POD_GROK_MIN_VALIDITY_MS - 5 * min, refresh: 'unchanged' }),
|
|
78
|
+
simCredExpiry({ expiresInMs: 32 * min, refresh: 'unchanged' }),
|
|
79
|
+
simCredExpiry({ expiresInMs: 32 * min, refresh: 'refreshed' }),
|
|
80
|
+
simCredExpiry({ expiresInMs: 32 * min, refresh: 'refreshed', extendToMs: 60 * min }),
|
|
81
|
+
simCredExpiry({ expiresInMs: 32 * min, refresh: 'failed' }),
|
|
82
|
+
simCredExpiry({ expiresInMs: 32 * min, refresh: 'threw' }),
|
|
83
|
+
simCredExpiry({ expiresInMs: -10 * min, refresh: 'no-credential' }),
|
|
84
|
+
];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** CLI 한 화면 — 시나리오마다 한 줄. */
|
|
88
|
+
export function renderCredExpiry(rows: readonly CredExpiryObservation[]): string[] {
|
|
89
|
+
const hm = (ms: number) => `${Math.floor(ms / 3600_000)}h${String(Math.floor((ms % 3600_000) / 60_000)).padStart(2, '0')}m`;
|
|
90
|
+
const fmt = (ms: number) => (ms < 0 ? `만료+${hm(-ms)}` : hm(ms));
|
|
91
|
+
return [
|
|
92
|
+
`cred-expiry · grok 구독 · 최소 유효 ${fmt(POD_GROK_MIN_VALIDITY_MS)}`,
|
|
93
|
+
...rows.map((r) => {
|
|
94
|
+
const ready = r.readiness.ready ? 'ready' : `not-ready(${r.readiness.reason})`;
|
|
95
|
+
const use = r.usable.usable ? 'usable' : `dropped(${r.usable.reason})`;
|
|
96
|
+
const ext = r.scenario.refresh === 'refreshed' ? `(→${fmt(r.scenario.extendToMs ?? DEFAULT_EXTEND_MS)})` : '';
|
|
97
|
+
return ` 만료까지 ${fmt(r.scenario.expiresInMs).padStart(9)} · 갱신 ${(r.scenario.refresh + ext).padEnd(18)} → 디스패처 ${ready.padEnd(20)} · 발사 ${use}`;
|
|
98
|
+
}),
|
|
99
|
+
];
|
|
100
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// ── 결함 주입 심 — «Pod 사망» ────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// 🚨 왜 이것이 있나 (SIM-VERIFY-KIT · 2026-10-12)
|
|
4
|
+
// «PARTIAL 줄을 남긴 Pod 가 SIGTERM 으로 사라짐» 은 운영에서 카나리를 쏘고 Pod 를 지워야만 났다
|
|
5
|
+
// (10-12 06:1x TC S3 카나리 run-4c6a70b1 — Pod 안에 PARTIAL 줄이 있었는데 호스트는 결손 줄만 남겼다).
|
|
6
|
+
// 이 심은 그 사건을 «기다리지 않고 일으킨다» — 호스트가 가진 입력(끝 로그 · 도는 동안 본 PARTIAL · 종료 정보)만 준다.
|
|
7
|
+
//
|
|
8
|
+
// ⛔ 흉내 내지 않는다: 호스트 Job 경로가 부르는 «같은» 순수 함수 podUsageReemitPlan 을 그대로 부른다
|
|
9
|
+
// (METER-POD-ROLLUP-GAP-3 · self-implement-pod.ts). kubectl·Pod·네트워크는 없다.
|
|
10
|
+
|
|
11
|
+
import { podUsageReemitPlan, type PodUsageReemitInput, type PodUsageReemitPlan } from '../task-orchestrator/surfaces/self-implement-pod.js';
|
|
12
|
+
|
|
13
|
+
export type PodDeathScenario = PodUsageReemitInput;
|
|
14
|
+
|
|
15
|
+
export interface PodDeathRow {
|
|
16
|
+
readonly category: string;
|
|
17
|
+
readonly event: string;
|
|
18
|
+
readonly data: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface PodDeathObservation {
|
|
22
|
+
/** 어느 줄로 재방출했나(final · partial-log · partial-live · missing · unparsable). */
|
|
23
|
+
readonly source: PodUsageReemitPlan['source'];
|
|
24
|
+
/** 호스트가 남길 관측 줄 전부(순서 그대로). */
|
|
25
|
+
readonly rows: readonly PodDeathRow[];
|
|
26
|
+
/** 사용량 행(llm.usage/llm-usage) 중 PARTIAL 에서 다시 낸 것(partial:true). */
|
|
27
|
+
readonly partialRows: readonly PodDeathRow[];
|
|
28
|
+
/** 결손 행(site=pod-rollup:missing). */
|
|
29
|
+
readonly missingRows: readonly PodDeathRow[];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Pod 안 부분 롤업 표본기가 내는 꼴 그대로의 PARTIAL 줄. */
|
|
33
|
+
export function simPartialLine(seq = 1): string {
|
|
34
|
+
return `ELANOUS_USAGE_ROLLUP_PARTIAL ${JSON.stringify({
|
|
35
|
+
measured: true, partial: true, seq, at: '2026-10-12T00:00:00.000Z', runId: 'run-sim-pod-death', podName: 'si-sim-pod-death',
|
|
36
|
+
rows: [{ site: 'self-implement', provider: 'openrouter', model: 'z-ai/glm-5.3', calls: 3, inputTokens: 1200, outputTokens: 300 }],
|
|
37
|
+
})}`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** «PARTIAL 한 줄을 남기고 SIGTERM 으로 지워진 Pod» 기본 시나리오 — 끝 로그는 비었고, 호스트는 도는 동안 PARTIAL 을 봤다. */
|
|
41
|
+
export function podDeathAfterPartialScenario(overrides: Partial<PodDeathScenario> = {}): PodDeathScenario {
|
|
42
|
+
return {
|
|
43
|
+
job: 'si-sim-pod-death',
|
|
44
|
+
runId: 'run-sim-pod-death',
|
|
45
|
+
logs: '',
|
|
46
|
+
livePartialLine: simPartialLine(),
|
|
47
|
+
exit: { state: 'failed', containerReason: 'Error', containerExitCode: 143 },
|
|
48
|
+
...overrides,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** 시나리오를 호스트 재방출 판정에 넣고 관측을 나눠 돌려준다. */
|
|
53
|
+
export function simPodDeath(scenario: PodDeathScenario = podDeathAfterPartialScenario()): PodDeathObservation {
|
|
54
|
+
const plan = podUsageReemitPlan(scenario);
|
|
55
|
+
const usage = plan.rows.filter((r) => r.category === 'llm.usage' && r.event === 'llm-usage');
|
|
56
|
+
return {
|
|
57
|
+
source: plan.source,
|
|
58
|
+
rows: plan.rows,
|
|
59
|
+
// 결손 행은 partial 꼬리표가 없지만, 꼬리표가 붙어도 «재방출»로 세지 않도록 site 로 한 번 더 뺀다.
|
|
60
|
+
partialRows: usage.filter((r) => r.data.partial === true && r.data.site !== 'pod-rollup:missing'),
|
|
61
|
+
missingRows: usage.filter((r) => r.data.site === 'pod-rollup:missing'),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** CLI 한 화면 — 사람이 읽는 요약. */
|
|
66
|
+
export function renderPodDeath(obs: PodDeathObservation): string[] {
|
|
67
|
+
const missing = obs.missingRows[0]?.data;
|
|
68
|
+
return [
|
|
69
|
+
`pod-death · source=${obs.source} · 관측 줄 ${obs.rows.length}`,
|
|
70
|
+
` PARTIAL 재방출 행: ${obs.partialRows.length}`,
|
|
71
|
+
` 결손 행: ${obs.missingRows.length}${missing ? ` · reason=${String(missing.reason)} · podExitClass=${String(missing.podExitClass ?? '-')}` : ''}`,
|
|
72
|
+
...obs.rows.map((r) => ` ${r.category} ${r.event} ${JSON.stringify(r.data)}`),
|
|
73
|
+
];
|
|
74
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// ── 결함 주입 심 — «풀 상한 없음» (Pod 풀 스펙에 `:N` 이 빠짐) ────────────────
|
|
2
|
+
//
|
|
3
|
+
// 🚨 왜 이것이 있나 (SIM-VERIFY-KIT 셋째 심 · 2026-10-12)
|
|
4
|
+
// `--pod-pool pool-x@host` 처럼 `:N` 을 빼면 «상한 없음»이 아니라 기본 상한 2 다. 그 풀은 Pod 두 개가 돌면
|
|
5
|
+
// 승인 0 으로 멈추는데, 운영에선 프로브를 띄워 40분을 기다려야 보였다(10-10 · POD-POOL-UNCAPPED-SPEC).
|
|
6
|
+
// 이 심은 스펙 문자열과 «멤버마다 지금 도는 Pod 수»만 주고 승인 판정을 바로 낸다.
|
|
7
|
+
//
|
|
8
|
+
// ⛔ 흉내 내지 않는다: 스펙은 진짜 parsePodPool 로 읽고, 승인은 진짜 recommendConcurrency 가 정한다.
|
|
9
|
+
// 클러스터 측정(kubectl)만 «메모리·CPU 넉넉한 노드»로 채운다 — 메모리가 아니라 상한이 판정을 정하게 하려는 것이다.
|
|
10
|
+
|
|
11
|
+
import { recommendConcurrency, type PodLeaseMember, type PoolLeaseRecommendation } from '../task-orchestrator/surfaces/pod-lease.js';
|
|
12
|
+
import { parsePodPool } from '../task-orchestrator/surfaces/pod-pool.js';
|
|
13
|
+
|
|
14
|
+
const GiB = 1024 ** 3;
|
|
15
|
+
|
|
16
|
+
export interface PoolCapScenario {
|
|
17
|
+
/** `--pod-pool` 값 그대로(예: `pool-node-b@node-b` · `pool-node-b@node-b:20,pool-node-c@node-c`). */
|
|
18
|
+
readonly spec: string;
|
|
19
|
+
/** 멤버(컨텍스트)마다 지금 Running 인 하니스 Pod 수 — 멤버마다 «반드시» 준다(빠지면 0 으로 꾸미지 않고 던진다). */
|
|
20
|
+
readonly running: Readonly<Record<string, number>>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface PoolCapObservation {
|
|
24
|
+
readonly scenario: PoolCapScenario;
|
|
25
|
+
readonly members: ReadonlyArray<{ context: string; capacity: number; capacityDefaulted: boolean; running: number }>;
|
|
26
|
+
readonly recommendation: PoolLeaseRecommendation;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** 메모리·CPU 가 넉넉한 노드 한 대 — 승인이 상한(capacity)으로만 갈리게 한다. */
|
|
30
|
+
function roomyMember(context: string, capacity: number, capacityDefaulted: boolean, running: number): PodLeaseMember {
|
|
31
|
+
return {
|
|
32
|
+
context, capacity, ...(capacityDefaulted ? { capacityDefaulted: true } : {}),
|
|
33
|
+
running, pending: 0, pendingJobs: [], unleasedRunning: 0,
|
|
34
|
+
memoryLimitBytes: running * 16 * GiB, allocatableMemoryBytes: 1024 * GiB, allocatableCpuMillicores: 256_000,
|
|
35
|
+
availableMemoryByNodeBytes: [1024 * GiB - running * 16 * GiB], reason: null,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function runningOf(scenario: PoolCapScenario, context: string): number {
|
|
40
|
+
const n = scenario.running[context];
|
|
41
|
+
if (n === undefined || !Number.isSafeInteger(n) || n < 0) {
|
|
42
|
+
throw new Error(`simPoolCap: 멤버 「${context}」 의 Running 수가 없다 — 모르는 점유를 0 으로 꾸미지 않는다`);
|
|
43
|
+
}
|
|
44
|
+
return n;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function simPoolCap(scenario: PoolCapScenario): PoolCapObservation {
|
|
48
|
+
const parsed = parsePodPool(scenario.spec);
|
|
49
|
+
const members = parsed.map((m) => ({
|
|
50
|
+
context: m.context, capacity: m.capacity, capacityDefaulted: (m as { capacityDefaulted?: boolean }).capacityDefaulted === true,
|
|
51
|
+
running: runningOf(scenario, m.context),
|
|
52
|
+
}));
|
|
53
|
+
const recommendation = recommendConcurrency(
|
|
54
|
+
{ members: members.map((m) => roomyMember(m.context, m.capacity, m.capacityDefaulted, m.running)) },
|
|
55
|
+
{ capacity: members.reduce((sum, m) => sum + m.capacity, 0), accounts: -1, perAccount: -1 },
|
|
56
|
+
);
|
|
57
|
+
return { scenario, members, recommendation };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** 기본 훑기 — 상한 뺀 스펙이 Pod 둘에서 막히는 순간과, 상한을 적은 스펙의 대조. */
|
|
61
|
+
export function poolCapSweep(): PoolCapObservation[] {
|
|
62
|
+
return [
|
|
63
|
+
simPoolCap({ spec: 'pool-node-b@node-b', running: { 'pool-node-b': 0 } }),
|
|
64
|
+
simPoolCap({ spec: 'pool-node-b@node-b', running: { 'pool-node-b': 1 } }),
|
|
65
|
+
simPoolCap({ spec: 'pool-node-b@node-b', running: { 'pool-node-b': 2 } }),
|
|
66
|
+
simPoolCap({ spec: 'pool-node-b@node-b:20', running: { 'pool-node-b': 2 } }),
|
|
67
|
+
simPoolCap({ spec: 'pool-node-b@node-b:20', running: { 'pool-node-b': 20 } }),
|
|
68
|
+
simPoolCap({ spec: 'pool-node-b@node-b:20,pool-node-c@node-c', running: { 'pool-node-b': 20, 'pool-node-c': 2 } }),
|
|
69
|
+
simPoolCap({ spec: 'pool-node-b@node-b:20,pool-node-c@node-c', running: { 'pool-node-b': 20, 'pool-node-c': 0 } }),
|
|
70
|
+
];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function renderPoolCap(rows: readonly PoolCapObservation[]): string[] {
|
|
74
|
+
return [
|
|
75
|
+
'pool-cap · `:N` 없는 멤버 = 기본 상한 2(capacityDefaulted)',
|
|
76
|
+
...rows.map((r) => {
|
|
77
|
+
const occ = r.members.map((m) => `${m.context} ${m.running}/${m.capacity}${m.capacityDefaulted ? '(기본)' : ''}`).join(' · ');
|
|
78
|
+
return ` ${r.scenario.spec.padEnd(36)} ${occ.padEnd(40)} → 승인 ${String(r.recommendation.recommended)} · limitedBy=${String(r.recommendation.limitedBy)}`;
|
|
79
|
+
}),
|
|
80
|
+
];
|
|
81
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"commit":"
|
|
1
|
+
{"commit":"8ad1a304501cd81b5c82fb3c934d151bd109f11f"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {
|
|
2
|
+
compareLayoutAcrossViewports,
|
|
3
|
+
renderResponsiveSection,
|
|
4
|
+
type ViewportSample,
|
|
5
|
+
} from './responsive-layout.js';
|
|
6
|
+
|
|
7
|
+
const QA_WIDTHS = [390, 768, 1280] as const;
|
|
8
|
+
|
|
9
|
+
export function siteQaTable(samples: readonly ViewportSample[]): {
|
|
10
|
+
widths: number[];
|
|
11
|
+
lines: string[];
|
|
12
|
+
realDevice: '미확인';
|
|
13
|
+
} {
|
|
14
|
+
const qaSamples = samples.filter((sample) => QA_WIDTHS.some((width) => width === sample.width));
|
|
15
|
+
const report = compareLayoutAcrossViewports(qaSamples);
|
|
16
|
+
const lines = [`폭 ${QA_WIDTHS.join(' · ')}`];
|
|
17
|
+
for (const width of QA_WIDTHS) {
|
|
18
|
+
if (!qaSamples.some((sample) => sample.width === width)) lines.push(`${width} 못 잼`);
|
|
19
|
+
}
|
|
20
|
+
lines.push(...renderResponsiveSection(report), '실기기: 미확인');
|
|
21
|
+
return { widths: [...QA_WIDTHS], lines, realDevice: '미확인' };
|
|
22
|
+
}
|