elanous 0.2.24 → 0.2.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/chunks/1027.a0f04663d24c2779.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +1 -0
- package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +36 -0
- package/apps/pwa/out/_next/static/chunks/1146.80d15ea7c6e6ee95.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1157.f08bf2b70915e176.js +148 -0
- package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1454-37fd16f479f5554a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8532.a86e99acf9b761cb.js → 1516.83dd2c1b86b4e507.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{89849432.9eaa2f4c9c010965.js → 16e57f67.3ea19e893461e611.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1505.5826671109111e75.js → 1743.563d3168e95825ef.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2528.3868070ef1be69f9.js +24 -0
- package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2697.76ca2ac3efef6f3b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +32 -0
- package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2846.d6a433b8663819a5.js +309 -0
- package/apps/pwa/out/_next/static/chunks/3143.257997a5f1ed79df.js +34 -0
- package/apps/pwa/out/_next/static/chunks/{5967-c0a80f8ffe5d4050.js → 3259-86f3be56e43eaf6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3309.364573ceedbdfd5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +287 -0
- package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5578.ac963634373b28c6.js → 4084.15ecaf4240bd9e77.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8438.ee7f0df3b3f6fcb4.js → 4204.a409ab6250c0f6a8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +8 -0
- package/apps/pwa/out/_next/static/chunks/4565-67e4c620597965c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7905.b230b9d06cb4ad5d.js → 4593.10f5b9bd702d4a6c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +104 -0
- package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{8569.b853a8daa8f31d12.js → 5081.a240b63fad28663a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2528.0af5c0e1fad88df6.js → 5408.377c8c543635b81f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9502-32c5dc22e8f120f5.js → 5492-e05e26a033ba80d2.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/5785-ea8d2c633b6688e3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/599-a914cc0468f56143.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +23 -0
- package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5974.360f8441eb0ac1ec.js → 6196.34d6b229079e9e28.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +77 -0
- package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +64 -0
- package/apps/pwa/out/_next/static/chunks/{ce383d63.d2ede338788ed18e.js → 65ebff95.081daeff622d238e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +2 -0
- package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{83cfc5c8.349535543c1548b6.js → 6def8a8e.c81f9ca41028eccf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2721.bc9a8f36bd85c07a.js → 7483.ba01c6c209b81bba.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{6702.ebbd165d5e4a4a14.js → 7752.5cbdd0b433c54af9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8925-2abfb48af477fb7f.js → 8085-1e5fce59500a2cc2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +226 -0
- package/apps/pwa/out/_next/static/chunks/{b4e12462-5fab4a813a63dadd.js → 83a80514-b897b64df43ce108.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +93 -0
- package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{8264.00e434fbd02e9311.js → 8578.dff22d988cc2b106.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +115 -0
- package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +41 -0
- package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +74 -0
- package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +94 -0
- package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7518.49161e8f5814abdb.js → 9311.24c8f5ea793253dd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9976.8f28864317639fe6.js → 94.4cfed21c0b781a06.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/949.1e7d45ccb71580aa.js +90 -0
- package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{0e3acd34.d42b2ef87fdf4234.js → 973cbf1b.3bbcf2b41548eca7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6571-926ddf024a6ad5df.js → 9917-9e26abc5f7772735.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9938.b23e4d4dfa0114cd.js +79 -0
- package/apps/pwa/out/_next/static/chunks/{740.90b31555290236a9.js → 9974.e77b4ff4884557b3.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{4c5e95ce.83e9b16add6fcd8c.js → ab4d57c2.e90bc2cb31949045.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-9360b1285b2a346e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f08f6529d09ffae1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-f000d54d258f9ef6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-24282bf9f90031a5.js → page-b12149c51f7d04b1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-22f674e7e4c2c9d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8888733e40cea6d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-9717ec6964b92276.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-44eaad486bc98a45.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-97fa6cf3d34c7eb9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-305cd294e754906e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-dea4b795741126fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-35e05d7450461a67.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-45889e7070d11126.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-16a2e893f83ae4d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-b2638013c0bf7dfd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-56888bc744e08dac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-c44f93a41167536f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-952c6ceec6d9de38.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-6d0202af568f4c63.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-1b810474507f3702.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-74366ae2693a7d95.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-4fb6fc34e20c07b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-e9502921f4f01b1f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-b6169ea2f09cf287.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-6a14333d1b1b3967.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-8c91a9a66c9ec90a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-1d809a87139dd024.js → page-4e634c5b98fd4e93.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ed3070d637850548.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/{page-b92caddb5c715f30.js → page-b9cc8a10bc6078b4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/page-3d3fc73dd187ed52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-128458c8d86fbb5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-9c04dac0831c2bbb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-cf0c2b0183991d09.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-04de9ca6d52a3893.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-62527677bbc2fdc4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-9a2e09c4a311764c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-bfeb35d69e8b24bb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-89cb33bced824e4a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-b008aff96be56654.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-814394dcbae789b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-6a87325c87f09dd2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-6445ac4cbb8dd869.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-852170303c6cd755.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-087ceeb975ef272b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-97c7361cc2a19319.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-20162174b77f96cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-8c6901833f897496.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-05a4b2c9b91034aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{53746282.1be36038d1abd949.js → e117f801.e92bf10242653497.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/e87d89b9.2e71c0ae475d28a1.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{0673cc54.8e2ef1c23e49e190.js → f4dfbfc0.a69fb12f854882aa.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +1 -0
- package/apps/pwa/out/_next/static/{Q-7iofoxOEv1WX18S35of → dRS6lEhSRRBr1abbzp7fJ}/_buildManifest.js +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/graphs/release/release-loop.yaml +5 -5
- package/graphs/steward/recipes.yaml +4 -0
- package/graphs/steward/steward.yaml +10 -1
- package/package.json +1 -1
- package/scripts/bench-report.ts +46 -1
- package/scripts/ci-typecheck-changed.ts +7 -5
- package/scripts/release-loop/auto-approve-node.ts +6 -0
- package/scripts/release-loop/gate-closure.ts +286 -0
- package/scripts/release-loop/gate-node.ts +73 -13
- package/scripts/release-loop/gate-partial.ts +34 -6
- package/scripts/release-loop/ops-upgrade-node.ts +63 -42
- package/scripts/release-loop/publish-node.ts +6 -0
- package/scripts/release-loop/resume-release.ts +37 -10
- package/scripts/release-loop/resume.ts +69 -4
- package/scripts/tsc-baseline-cache.ts +28 -3
- package/scripts/usage-rollup.ts +27 -13
- package/scripts/ux-sim.ts +30 -1
- package/skills/youtube-master/scripts/main.ts +4 -1
- package/skills/youtube-master/src/obsidian.ts +9 -0
- package/src/agent-substrate/acp-implementer.ts +14 -7
- package/src/agent-substrate/pr-reviewer.ts +30 -10
- package/src/agent-substrate/self-review-cli.ts +126 -10
- package/src/budget/cost-tier-advisor.ts +91 -0
- package/src/budget/shadow-arms.ts +77 -0
- package/src/budget/types.ts +5 -3
- package/src/budget/unified-usage.ts +172 -8
- package/src/cli/doctor-cli.ts +21 -0
- package/src/cli/friendly-errors.ts +113 -0
- package/src/cli/intake-cli.ts +3 -1
- package/src/cli/memory-cli.ts +182 -0
- package/src/cli/model-watch-cli.ts +4 -1
- package/src/cli/pr-land-pod-shadow.ts +54 -0
- package/src/cli/release-cli.ts +9 -7
- package/src/cli/release-run-if-ready.ts +11 -0
- package/src/cli/resource-cli.ts +48 -0
- package/src/cli/retro-cli.ts +12 -3
- package/src/cli/seat-requests-cli.ts +25 -0
- package/src/cli/tasks-cli.ts +31 -7
- package/src/cli/usage-cli.ts +3 -1
- package/src/compact/verify-probe.ts +23 -3
- package/src/context-card/index.ts +50 -0
- package/src/control/control-status.ts +30 -1
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +4 -138
- package/src/dashboard/slash-runtime/shell-slash.ts +145 -0
- package/src/debug/log-diet.ts +16 -4
- package/src/domains/morning-essential.ts +18 -3
- package/src/domains/release-tool.ts +4 -0
- package/src/execution-loop/launch-gate.ts +158 -2
- package/src/fleet/host-doctor.ts +375 -0
- package/src/goals/judge.ts +20 -6
- package/src/graph-runner/runner.ts +9 -5
- package/src/graph-wizard/archetypes.ts +14 -8
- package/src/graph-wizard/generate.ts +77 -1
- package/src/grok.ts +13 -7
- package/src/harness/harness-cli-command.ts +56 -47
- package/src/harness/harness-stop.ts +82 -12
- package/src/index.ts +17 -175
- package/src/intake-plane/collect-github.ts +7 -2
- package/src/intake-plane/lens.ts +46 -4
- package/src/intake-plane/requirement-funnel.ts +53 -1
- package/src/intelligence-map/catalog-feed.ts +119 -0
- package/src/intelligence-map/model-watch-intake.ts +40 -0
- package/src/intelligence-map/model-watch-mission.ts +14 -1
- package/src/llm/open-weight-discipline.ts +21 -0
- package/src/llm.ts +4 -8
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/nexus/api/http-server.ts +22 -0
- package/src/oauth/codex-account-rotation.ts +4 -1
- package/src/oauth/codex-account-store.ts +20 -7
- package/src/oauth/codex-quota-policy.ts +33 -4
- package/src/preview/terminal.ts +15 -5
- package/src/project/project-store.ts +20 -0
- package/src/release-loop/auto-start.ts +7 -5
- package/src/release-loop/checklist.ts +11 -1
- package/src/release-loop/gate-shards.ts +4 -0
- package/src/release-loop/light-rc.ts +84 -13
- package/src/release-loop/merged-pr-checklist.ts +35 -5
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/seat-loop/duty-ledger.ts +64 -0
- package/src/self-dev/decompose.ts +37 -3
- package/src/self-dev/dev-pipeline.ts +32 -7
- package/src/self-dev/draft-residue.ts +16 -6
- package/src/self-dev/draft-sweep.ts +52 -4
- package/src/self-dev/fabric-decompose-adapter.ts +9 -2
- package/src/self-dev/run-supervisor.ts +37 -7
- package/src/self-implement/gate-cli.ts +29 -10
- package/src/self-implement/gate-remote.ts +4 -1
- package/src/self-implement/goal-author.ts +12 -2
- package/src/self-implement/goal-new-paths.ts +42 -0
- package/src/self-implement/host-regate.ts +124 -30
- package/src/self-implement/importer-test-index.ts +3 -1
- package/src/self-implement/l8-merge-queue.ts +80 -2
- package/src/self-implement/merge-train.ts +19 -0
- package/src/self-implement/off-diff-evidence.ts +40 -1
- package/src/self-implement/orchestrator.ts +88 -19
- package/src/self-implement/premise-review.ts +159 -0
- package/src/self-implement/regate-detail.ts +79 -0
- package/src/self-implement/review-deferred-to-host.ts +21 -0
- package/src/self-implement/rework-budget-judgment.ts +23 -3
- package/src/self-implement/running-runs.ts +2 -2
- package/src/self-implement/scope-adjacency.ts +23 -0
- package/src/self-implement/seams.ts +42 -7
- package/src/skills/tools/agent.ts +16 -1
- package/src/skills/tools/persistent-grounding.ts +11 -1
- package/src/skills/tools/shell.ts +33 -1
- package/src/steward/rejudge-tick.ts +142 -0
- package/src/task-agent/board.ts +92 -3
- package/src/task-agent/card-evidence.ts +88 -1
- package/src/task-agent/cover.ts +65 -0
- package/src/task-agent/parent-host.ts +27 -3
- package/src/task-agent/rejudge-on-head.ts +151 -7
- package/src/task-agent/review-result-capture.ts +3 -1
- package/src/task-agent/shadow.ts +12 -0
- package/src/task-agent/task-hand.ts +4 -1
- package/src/task-orchestrator/surfaces/pod-command-job.ts +14 -0
- package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +122 -0
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +23 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +53 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +235 -28
- package/src/user-config.ts +18 -4
- package/src/ux-sim/fault-cred-expiry.ts +100 -0
- package/src/ux-sim/fault-pod-death.ts +74 -0
- package/src/ux-sim/fault-pool-cap.ts +81 -0
- package/src/version/packed-revision.json +1 -1
- package/src/webclone/qa-table.ts +22 -0
- package/apps/pwa/out/_next/static/chunks/0a09e062-34f747a17d8d8c2e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1168.a0fb3d9db76c00bd.js +0 -77
- package/apps/pwa/out/_next/static/chunks/1325-dc3f3c21eb181cb4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1357.a843c41d2cd7ec31.js +0 -34
- package/apps/pwa/out/_next/static/chunks/1430.53f49882b17607c2.js +0 -24
- package/apps/pwa/out/_next/static/chunks/1459-be6509b3419d8a9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/153.0a4e3cd516930491.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1572.7bc291352e241a45.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1593-d07ad068c120dfb0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1608.b7c900baa56cab32.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1615-4d8156febaac4b35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1646.e03f0fbc26bc72f6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1669-da843ed73aa301f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/176.13ba0659e3e96fd4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1990.9c60f495ef33c070.js +0 -36
- package/apps/pwa/out/_next/static/chunks/2042e469.f86158dd5c1e51a1.js +0 -122
- package/apps/pwa/out/_next/static/chunks/2543-28ec6aeb80a5e1e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2561.43c99d6ee914ee6a.js +0 -62
- package/apps/pwa/out/_next/static/chunks/2638.b39ab2f674caa1a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/272-0eed0fb0aab716b6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2778.67e0c1d484189ccf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2841.10ff309f6a3168af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2886-9639f97d523d752a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2978.57fb87ce21cc5a85.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3664.15f968c39d15bd28.js +0 -149
- package/apps/pwa/out/_next/static/chunks/3786-935eb3fcde90e496.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3813.df4a01ae89c6f63f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3961-aaae04ed1d32622f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3992.f79c70480e8c4077.js +0 -309
- package/apps/pwa/out/_next/static/chunks/40-413e8641de9ed1e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4054-521f11a503daed64.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4315.e7356f34c7d8ec79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4489-bf629de6f04f7681.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4540.557733cc88c6a82b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/462.0275b4338c5b6337.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4658-7ed9266098a787e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4945-0f4046cfc3228ea3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5105-18b4165c5d3a86b0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5205-6992210fe31f45f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5287-72898b126d722457.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5313.1697309c532b9856.js +0 -2
- package/apps/pwa/out/_next/static/chunks/5474.991b90688c3cb321.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5544-871146192d095594.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5935.d5e8ca3e096772e8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6006.84e8b418a7a0db97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6013-1267ba7454d6764b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6038-1e0f7ee1086da4cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/617.709dd0019fe99796.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6261.fb9bf94947094636.js +0 -74
- package/apps/pwa/out/_next/static/chunks/6411.1966866fae31ffa9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6481-b829d99aa8d158f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6541.2b7daa043100d0fa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6597.2d7a6d77ab485b27.js +0 -64
- package/apps/pwa/out/_next/static/chunks/67.5dd2dc543c2fa3de.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6777-312496b0d774719b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/681.0116f7036cfb4e8d.js +0 -32
- package/apps/pwa/out/_next/static/chunks/6871.30b2bf23b3126e36.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6882.737d366d54e29d83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7035.54c2c535164b1c9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7086-8bfa7e8f796a03d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7126.5e5599f251726b67.js +0 -93
- package/apps/pwa/out/_next/static/chunks/7203-47ff0740a293e284.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7268.017f49dafb5f0ff3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7355.5d65a87e9567ae08.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7392.4018c2a62177f296.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7471.3a3d1be50559cfb8.js +0 -148
- package/apps/pwa/out/_next/static/chunks/7500.73489a345cef2201.js +0 -226
- package/apps/pwa/out/_next/static/chunks/7565.c2f72a15c1ed0396.js +0 -27
- package/apps/pwa/out/_next/static/chunks/7651.6d1c984d3d8587a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7713.7ab863ed59b2d661.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7793.d7cd2026767ddd54.js +0 -115
- package/apps/pwa/out/_next/static/chunks/7837.c7c267e5dceadb11.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7891.09266382daf70d1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7990-cbf6a01bcbdcb7e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8119-819c549e0c197786.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8186-74ea19a3700d04a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8267-e7b3262b735ae106.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8386.86518e55b75f7cf5.js +0 -8
- package/apps/pwa/out/_next/static/chunks/8437.ba6eeeb29590042f.js +0 -23
- package/apps/pwa/out/_next/static/chunks/8469-1500be57e582296f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8483-7164cecdaf178ca6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8722-4c940f02c496ad36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/887-41d0dcf5af48c628.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9039.da86361496797522.js +0 -90
- package/apps/pwa/out/_next/static/chunks/905.d5745a25884754d4.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9089-d909f3d4478b0628.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9096.dc5c7a267f83790c.js +0 -41
- package/apps/pwa/out/_next/static/chunks/93.a567257b6bdb7fe4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9320.419acb9665b46597.js +0 -287
- package/apps/pwa/out/_next/static/chunks/9356.b8ceda6634612ff8.js +0 -79
- package/apps/pwa/out/_next/static/chunks/94.e9e1043b35cd3eed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9400-7498ea90b2e6ee8f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9930-58644af9c813d6e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9932.367cf4725fedd6e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9935.1628b904cdc8ce0e.js +0 -104
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-a2aa8709d193ee0d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-3b9fc39362473ae7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f2b62c19ca68fef8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-d7602d489edf5f37.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-8b7c5ab6b5bc8d64.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-4eb84d454f8c3415.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-b2e494bdad57fcb5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-c0ab229673a8b0eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-3e2b45f3c36dbac4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c22aa511b28743ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-26345242e4049f55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-bf88c0f558d8ef54.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-52fec523e5b5d3ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-67723dfdcde92b31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-a2aa8709d193ee0d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-22725e2570f1126b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-1891335950d68b70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-3267af1ebdc73cf5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-c314b75c11234998.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-9f9c85415f61782b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-c1d4276059085587.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-833aab587f26ad4c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8526c17ae38e6a50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-f998637a8402115c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-b7bb53828b17b335.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-1b1850de0257e46d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6f23159fedb41f67.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-da9e570234d481fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-8ce3a38e210b810a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-57ffeeb6019440fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-abbb417bf514630b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-2c2b3f29cec1efa4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-9369279f72fc7b51.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-64861f14039499c3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ddc4c93efd8ab94b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-a2aa8709d193ee0d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-901a1391b81053bc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-68d9bbaac9841a58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-b5c0c996f329371e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-89881ccbcf728978.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-0e87a803b3d7165e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-58d4e5cb30ef4871.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-02ce4c3b5f39e4d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-e620d1bb8eadcec2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-acf868c64d77f950.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-54fa605fa6dba457.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-bc79f0833533fa84.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-d5c4398eea03d8f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/cd39fa05.fac4545f42a3ef70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-b2763b10dc6b3836.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-27893e93b0ec193d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-f280047194e1daf8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-e90eff2d0b70564c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-70f2d654b3435d34.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-4794f053bd5e4230.js +0 -1
- /package/apps/pwa/out/_next/static/{Q-7iofoxOEv1WX18S35of → dRS6lEhSRRBr1abbzp7fJ}/_ssgManifest.js +0 -0
package/src/grok.ts
CHANGED
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
import type { GrokAnalysis, DiffResult, EnvDelta } from './types.js';
|
|
15
15
|
import * as ui from './ui.js';
|
|
16
16
|
import { getUserConfig } from './user-config.js';
|
|
17
|
-
import { getProviderForConfig, anyProviderAvailable,
|
|
17
|
+
import { getProviderForConfig, anyProviderAvailable, logAgentTurnUsage, type LLMMessage } from './llm.js';
|
|
18
|
+
import type { LLMUsage } from './prompt-cache/types.js';
|
|
18
19
|
|
|
19
20
|
/** True when any provider (env OR user-config, including Codex OAuth)
|
|
20
21
|
* can answer. Thin wrapper around llm.anyProviderAvailable() kept
|
|
@@ -34,19 +35,24 @@ async function callAnalyzer(prompt: string, systemPrompt?: string): Promise<stri
|
|
|
34
35
|
if (systemPrompt) messages.push({ role: 'system', content: systemPrompt });
|
|
35
36
|
messages.push({ role: 'user', content: prompt });
|
|
36
37
|
|
|
37
|
-
const
|
|
38
|
-
? provider.streamChat(messages, { temperature: 0.1, maxTokens: 1024 })
|
|
39
|
-
: null;
|
|
38
|
+
const llmOpts = { temperature: 0.1, maxTokens: 1024 };
|
|
40
39
|
let text = '';
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
let usage: LLMUsage = {};
|
|
41
|
+
if (provider.streamChat) {
|
|
42
|
+
for await (const ev of provider.streamChat(messages, llmOpts)) {
|
|
43
|
+
if (ev.type === 'text' && ev.delta) text += ev.delta;
|
|
44
|
+
else if (ev.type === 'usage') usage = { ...usage, ...ev.usage };
|
|
45
|
+
}
|
|
43
46
|
} else {
|
|
44
47
|
// Fallback to text-only chat (shouldn't happen — every provider
|
|
45
48
|
// ships streamChat now).
|
|
46
|
-
for await (const chunk of provider.chat(messages,
|
|
49
|
+
for await (const chunk of provider.chat(messages, llmOpts)) {
|
|
47
50
|
text += chunk;
|
|
48
51
|
}
|
|
49
52
|
}
|
|
53
|
+
try {
|
|
54
|
+
logAgentTurnUsage(provider.defaultModel, usage, { providerName: provider.name, site: 'grok.direct' });
|
|
55
|
+
} catch { /* best-effort observation */ }
|
|
50
56
|
return text;
|
|
51
57
|
}
|
|
52
58
|
|
|
@@ -19,11 +19,12 @@ import { Command, Option } from 'commander';
|
|
|
19
19
|
import { runGitCommand } from '../git-fs/runner.js';
|
|
20
20
|
import { GOAL_TYPES, lintGoalFile, parseGoalId, parseGoalType, resolveGoalAuthorGrade, tracedPathReferences, type GoalAuthorGrade, type GoalAuthorGradeSelection, type GoalType } from '../self-implement/goal-author.js';
|
|
21
21
|
import { templateForGoalType } from '../self-implement/graph-templates.js';
|
|
22
|
-
import { listRunLedgers, loadFederatedRunLedger, loadRunLedger, queryRunScreenKey, runLedgerDir, type RunLedgerMatch } from '../self-implement/run-ledger.js';
|
|
22
|
+
import { appendRunLedgerEntry, listRunLedgers, loadFederatedRunLedger, loadRunLedger, queryRunScreenKey, runLedgerDir, type RunLedgerEntry, type RunLedgerMatch, type RunLedgerWriter } from '../self-implement/run-ledger.js';
|
|
23
|
+
import { classifyPodExit, type PodExitClass } from '../task-orchestrator/surfaces/pod-failure-reason.js';
|
|
23
24
|
import { classifyPodExitStop, recordRunStop, runStopRecorded, RUN_STOP_EVENT } from '../self-implement/run-stop.js';
|
|
24
25
|
import { ensureOpenRouterChildModelLive, resolveChildLlmEffort, resolveImplementationChildModel } from '../self-dev/dev-cli.js';
|
|
25
26
|
import { resolveHarnessTarget } from '../self-implement/harness-target-options.js';
|
|
26
|
-
import { buildRunProgressRows, queryRunningRuns, renderRunProgressTable } from '../self-implement/running-runs.js';
|
|
27
|
+
import { buildRunProgressRows, isPartialRunningRuns, queryRunningRuns, renderRunProgressTable } from '../self-implement/running-runs.js';
|
|
27
28
|
import { DevPipelineError } from '../self-dev/dev-pipeline.js';
|
|
28
29
|
import { collectDraftMetrics, collectOverlapMetrics, DRAFT_SWEEP_CONCURRENCY, mapBounded, resolveDraftSweepCloseCap, runDraftSweep, sweepFailureReason, type DraftSweepAdapters, type DraftSweepResult, type OverlapMetricAdapters, type SweepDraft, type SweepMergedPr, type SweepReviewGate } from '../self-dev/draft-sweep.js';
|
|
29
30
|
import { readAskPreflightRowsSince, readSalvagedRowsSince } from '../self-dev/ask-launch-io.js';
|
|
@@ -34,11 +35,10 @@ import { debug } from '../debug/log.js';
|
|
|
34
35
|
import { installHarnessSalvageCommand, installHarnessSalvageRetentionCommand } from './harness-salvage-cli.js';
|
|
35
36
|
import { decideNestedElanousLaunch, readNestedElanousDepth } from './nested-elanous-policy.js';
|
|
36
37
|
import { dispatchTask, type DispatchTaskInput, type DispatchTaskDeps } from '../execution-loop/dispatch-task.js';
|
|
37
|
-
import { launchRequestId, preLaunchGate, type PreLaunchGateDeps } from '../execution-loop/launch-gate.js';
|
|
38
|
+
import { harnessLaunchBudgetDecision, launchRequestId, preLaunchGate, resolveLaunchBudget, type PreLaunchGateDeps } from '../execution-loop/launch-gate.js';
|
|
38
39
|
import { PR_LABELS } from '../github/pr-labels.js';
|
|
39
40
|
import { ghAutomationEnv } from '../autopilot/pr-manager.js';
|
|
40
|
-
import {
|
|
41
|
-
import { DEFAULT_FALLBACK_CHAIN } from '../oauth/fallback-chain.js';
|
|
41
|
+
import { decideBudget, readBudgetInputsLive, type BudgetDecision, type BudgetInputs } from '../self-implement/budget-gate.js';
|
|
42
42
|
import { installDeliverableVerifyCliCommand, type InstallDeliverableVerifyCliDeps } from './deliverable-verify-cli.js';
|
|
43
43
|
import { getUserConfig } from '../user-config.js';
|
|
44
44
|
import type { SiblingResyncAdapters, SiblingResyncResult, SiblingRunTarget } from '../self-implement/sibling-resync.js';
|
|
@@ -701,7 +701,7 @@ async function onPod(opts: unknown, entrance: 'cli-harness-ask' | 'cli-harness-s
|
|
|
701
701
|
const classified = classifyHarnessPodExit({ status }, output, { ...(runId ? { runId } : {}) });
|
|
702
702
|
recordClassifiedHarnessPodExit(runId ?? harnessPodRunId(output), classified.reason, status,
|
|
703
703
|
{ entrance, seat: o.seat, output });
|
|
704
|
-
recordHarnessPodStop(runId ?? harnessPodRunId(output), status, classified);
|
|
704
|
+
recordHarnessPodStop(runId ?? harnessPodRunId(output), status, classified, output);
|
|
705
705
|
for (const line of classified.lines) console.error(line);
|
|
706
706
|
process.exitCode = status;
|
|
707
707
|
}
|
|
@@ -716,25 +716,62 @@ export function recordHarnessPodStop(
|
|
|
716
716
|
runId: string | undefined,
|
|
717
717
|
status: number,
|
|
718
718
|
classified: { reason: string; lines: string[] },
|
|
719
|
-
|
|
719
|
+
output?: string,
|
|
720
|
+
deps: { loadLedger?: typeof loadRunLedger; record?: typeof recordRunStop; write?: RunLedgerWriter } = {},
|
|
720
721
|
): boolean {
|
|
721
722
|
if (!runId) return false;
|
|
722
723
|
try {
|
|
723
724
|
if (runStopRecorded(runId)) return false;
|
|
724
725
|
if ((deps.loadLedger ?? loadRunLedger)(runId)?.some((entry) => entry.event === RUN_STOP_EVENT)) return false;
|
|
726
|
+
const nextMove = classified.reason === 'no-launch' ? 'Check Pod launch gate and pool, then relaunch'
|
|
727
|
+
: 'Inspect Pod exit classification and harvest the branch before relaunch';
|
|
728
|
+
const evidenceRef = `logs:harness.pod/exit-classified:${runId}`;
|
|
729
|
+
// AUT-POD-EXIT-UNCLASSIFIED ⓑ — only an unclassified exit reads the child output; classified reasons stay byte-identical.
|
|
730
|
+
const detail = classified.reason === 'unknown' ? podExitDetail(runId, status, output) : undefined;
|
|
731
|
+
if (detail) {
|
|
732
|
+
const write = deps.write ?? ((entry: RunLedgerEntry) => appendRunLedgerEntry(entry));
|
|
733
|
+
(deps.record ?? recordRunStop)({
|
|
734
|
+
runId, site: 'pod-exit', class: classifyPodExitStop(classified.reason),
|
|
735
|
+
cause: `Pod exit ${status}: ${detail.podExitClass}${detail.lead ? ` — ${detail.lead}` : ''}`,
|
|
736
|
+
evidenceRef, nextMove,
|
|
737
|
+
}, (entry) => write({ ...entry, data: { ...entry.data, podExitClass: detail.podExitClass, tail: detail.tail } }));
|
|
738
|
+
return true;
|
|
739
|
+
}
|
|
725
740
|
// The classified line is our own one-line verdict («Pod 안 자식이 실패했다 — OOMKilled»), not the raw output tail.
|
|
726
741
|
const verdict = classified.lines[0]?.split(' — ').slice(1).join(' — ').trim();
|
|
727
742
|
(deps.record ?? recordRunStop)({
|
|
728
743
|
runId, site: 'pod-exit', class: classifyPodExitStop(classified.reason),
|
|
729
744
|
cause: `Pod exit ${status}: ${classified.reason}${verdict ? ` — ${verdict}` : ''}`,
|
|
730
|
-
evidenceRef
|
|
731
|
-
|
|
732
|
-
: 'Inspect Pod exit classification and harvest the branch before relaunch',
|
|
733
|
-
});
|
|
745
|
+
evidenceRef, nextMove,
|
|
746
|
+
}, ...(deps.write ? [deps.write] : []));
|
|
734
747
|
return true;
|
|
735
748
|
} catch { return false; /* ledger observation cannot change Pod output or exit */ }
|
|
736
749
|
}
|
|
737
750
|
|
|
751
|
+
const POD_EXIT_TAIL_LINES = 5;
|
|
752
|
+
const POD_EXIT_TAIL_LINE_CHARS = 240;
|
|
753
|
+
const POD_EXIT_CAUSE_LEAD_CHARS = 160;
|
|
754
|
+
|
|
755
|
+
/**
|
|
756
|
+
* The closed Pod exit class ⊕ the last meaningful output lines for an exit the host could not classify.
|
|
757
|
+
* Empty output is no evidence at all — `unknown` with an empty tail, never a guess. Fail-soft: a throw reads as `unknown`.
|
|
758
|
+
*/
|
|
759
|
+
function podExitDetail(runId: string, status: number, output: string | undefined): { podExitClass: PodExitClass; tail: string[]; lead: string } {
|
|
760
|
+
let podExitClass: PodExitClass = 'unknown';
|
|
761
|
+
let tail: string[] = [];
|
|
762
|
+
if (output?.trim()) {
|
|
763
|
+
try {
|
|
764
|
+
const exit = classifyPodExit({ logs: output, containerExitCode: status });
|
|
765
|
+
podExitClass = exit.class;
|
|
766
|
+
tail = exit.tail.slice(-POD_EXIT_TAIL_LINES).map((line) => Array.from(line).slice(0, POD_EXIT_TAIL_LINE_CHARS).join(''));
|
|
767
|
+
} catch { podExitClass = 'unknown'; tail = []; }
|
|
768
|
+
}
|
|
769
|
+
// The last meaningful line is where the child died (`Error: ENOSPC …`) — earlier tail lines are context.
|
|
770
|
+
const lead = Array.from(tail.at(-1) ?? '').slice(0, POD_EXIT_CAUSE_LEAD_CHARS).join('');
|
|
771
|
+
try { debug.log('harness.pod', 'exit-classified-detail', { runId, podExitClass, tailLines: tail.length }); } catch { /* observation is fail-soft */ }
|
|
772
|
+
return { podExitClass, tail, lead };
|
|
773
|
+
}
|
|
774
|
+
|
|
738
775
|
/**
|
|
739
776
|
* POD-ANTHROPIC-PROVIDER ⓓ — 발사 관문과 Pod 가 «한 목록»(`POD_CHILD_PROVIDERS`)을 본다.
|
|
740
777
|
* 🩸 10-10: 관문은 anthropic 을 «예산 판정 밖» 으로 통과시켰고 Pod 단계가 rc=2 로 죽었다(관문·Pod 목록 엇갈림).
|
|
@@ -754,39 +791,7 @@ function refusePodChildProviderBeforeLaunch(resolved: ResolvedHarnessSubstrate,
|
|
|
754
791
|
return true;
|
|
755
792
|
}
|
|
756
793
|
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
/**
|
|
760
|
-
* L6 발사 관문의 예산 입력 보정 — 발사 우주의 config 에 체인이 없으면(작업 트리 = 시험 우주) 막지 않고
|
|
761
|
-
* 코드 기본 체인으로 판단한다. `--child-llm-provider` 를 명시했으면 그것이 체인이다(예산 판정 밖 provider 는 통과).
|
|
762
|
-
*/
|
|
763
|
-
export function harnessLaunchBudgetDecision(
|
|
764
|
-
inputs: BudgetInputs,
|
|
765
|
-
opts: { readonly childLlmProvider?: string; readonly childLlmModel?: string } = {},
|
|
766
|
-
): { readonly decision: BudgetDecision; readonly warning?: string; readonly unmeasuredProvider?: string } {
|
|
767
|
-
const explicit = opts.childLlmProvider?.trim();
|
|
768
|
-
const judged = (selected: BudgetInputs) => {
|
|
769
|
-
const { decision, unmeasuredProvider } = decideLaunchBudget(selected);
|
|
770
|
-
return { decision, ...(unmeasuredProvider ? { unmeasuredProvider, warning: `budget: ${unmeasuredProvider} usage unmeasured — launching` } : {}) };
|
|
771
|
-
};
|
|
772
|
-
if (explicit) {
|
|
773
|
-
if (explicit !== CODEX_PROVIDER && explicit !== GROK_PROVIDER) {
|
|
774
|
-
return {
|
|
775
|
-
decision: { action: 'proceed', provider: explicit, ...(opts.childLlmModel ? { model: opts.childLlmModel } : {}), reasons: [`${explicit}: 명시 provider — 예산 판정 밖`] },
|
|
776
|
-
warning: `budget: ${explicit} is outside the budget gate — launched as requested`,
|
|
777
|
-
};
|
|
778
|
-
}
|
|
779
|
-
const chain = [{ provider: explicit, ...(opts.childLlmModel ? { model: opts.childLlmModel } : {}) }];
|
|
780
|
-
return judged({ ...inputs, preference: { ...inputs.preference, chain } });
|
|
781
|
-
}
|
|
782
|
-
if (inputs.preference.chain.length > 0) return judged(inputs);
|
|
783
|
-
const chain = DEFAULT_FALLBACK_CHAIN.map((step) => ({ provider: LAUNCH_BUDGET_PROVIDER[step] ?? step }));
|
|
784
|
-
const result = judged({ ...inputs, preference: { ...inputs.preference, chain } });
|
|
785
|
-
return {
|
|
786
|
-
...result,
|
|
787
|
-
warning: `budget: no chain in this universe's config — judged with the code default ${DEFAULT_FALLBACK_CHAIN.join(',')}${result.warning ? ` · ${result.warning}` : ''}`,
|
|
788
|
-
};
|
|
789
|
-
}
|
|
794
|
+
export { harnessLaunchBudgetDecision } from '../execution-loop/launch-gate.js';
|
|
790
795
|
|
|
791
796
|
async function readHarnessLaunchBudget(
|
|
792
797
|
opts: { readonly childLlmProvider?: string; readonly childLlmModel?: string } = {},
|
|
@@ -1036,8 +1041,12 @@ async function dispatchHarnessAskSay(
|
|
|
1036
1041
|
}
|
|
1037
1042
|
enterJourneyNode('launch-gate', journey);
|
|
1038
1043
|
const decision = await withJourneyNode('launch-gate', journey, async () => {
|
|
1039
|
-
const budget
|
|
1040
|
-
|
|
1044
|
+
const { budget, budgetSource, snapshotAgeSec } = await resolveLaunchBudget({
|
|
1045
|
+
provider: opts.childLlmProvider,
|
|
1046
|
+
measureLocal: gate.readBudget ?? (() => readHarnessLaunchBudget(opts)),
|
|
1047
|
+
env: gate.readBudget ? { ELANOUS_SUBSTRATE: 'local' } : process.env, // an injected budget reader is a host measurement, whatever substrate runs the test
|
|
1048
|
+
});
|
|
1049
|
+
return preLaunchGate({ goalId, budget, budgetSource, ...(snapshotAgeSec !== undefined ? { snapshotAgeSec } : {}), forceLaunch: opts.forceGate === true }, gate);
|
|
1041
1050
|
});
|
|
1042
1051
|
exitJourneyNode('launch-gate', { ...journey, outcome: decision.action === 'proceed' ? 'pass' : 'refuse', data: { action: decision.action } });
|
|
1043
1052
|
if (decision.action !== 'proceed') {
|
|
@@ -3195,7 +3204,7 @@ export function installHarnessCliCommand(program: Command, deps: HarnessCliComma
|
|
|
3195
3204
|
const nowMs = (deps.progress?.nowMs ?? Date.now)();
|
|
3196
3205
|
if (opts.json) {
|
|
3197
3206
|
console.log(JSON.stringify(buildRunProgressRows(result, nowMs)));
|
|
3198
|
-
if (result
|
|
3207
|
+
if (isPartialRunningRuns(result)) console.error(renderRunProgressTable(result, nowMs).split('\n')[0]);
|
|
3199
3208
|
} else console.log(renderRunProgressTable(result, nowMs));
|
|
3200
3209
|
} catch (error) {
|
|
3201
3210
|
console.error(humanErrorLine(error));
|
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
// 🩸 2026-09-27: 멈추려면 사람이 PID 둘(harness ask 부모 · self orchestrate 자식)과 Job 이름을 손으로 찾아야 했고,
|
|
4
4
|
// 그 사이 떠 있던 조각이 main 에 병합됐다(#21048). 부모를 죽이면 자식이 PPID 1 고아로 2h36m 더 돌았다(🅞 보고).
|
|
5
5
|
// B 조각(#21171)이 오케스트레이터에 `self-dev-runs/<runId>/pid.json` ⊕ SIGTERM 정리(새 잡 멈춤 · 자기 Job 삭제 · cancelled)를 넣었다.
|
|
6
|
-
// 이 파일은 그 기록과 런 원장·프로세스 표를 읽고, 시작 시각이 확인된 후보에만 신호를 보내며,
|
|
6
|
+
// 이 파일은 그 기록과 런 원장·프로세스 표를 읽고, 시작 시각이 확인된 후보에만 신호를 보내며, 라벨 일치 Pod Job 을 지운다.
|
|
7
7
|
//
|
|
8
8
|
// ⛔ 불변식: 기록된 시작 시각과 실제 프로세스 시작 시각이 다르면 신호를 보내지 않는다(PID 재사용 방지).
|
|
9
|
-
// ⛔ 불변식: `elanous.run=<runId>` 라벨이
|
|
9
|
+
// ⛔ 불변식: 라벨이 붙은 Job 만 지운다 — `elanous.run=<runId>` · 그 라벨이 0 이면 `elanous.child-run=<runId>` 폴백(자식 런 id 로 쳤을 때).
|
|
10
|
+
// 지우는 것은 라벨 일치 Job 뿐이다: 이름 추측 없음 · Pod 직접 삭제 없음 · namespace 기본값(elanous-test) 불변.
|
|
11
|
+
// (HARNESS-STOP-POD-LABEL 2026-10-11) 문맥마다 삭제 결과를 넷으로 가르고 관측 `harness.stop` `job-delete`(context·outcome·matchedBy) 로 남긴다.
|
|
10
12
|
// ⛔ 불변식: 짧은 runId 의 후보가 둘 이상이면 프로세스 신호·Job 삭제 전에 중단한다.
|
|
11
13
|
|
|
12
14
|
import { existsSync, readdirSync, readFileSync, readlinkSync } from 'node:fs';
|
|
@@ -151,6 +153,19 @@ export interface HarnessStopDeps {
|
|
|
151
153
|
graceMs: number;
|
|
152
154
|
}
|
|
153
155
|
|
|
156
|
+
export type HarnessStopJobMatchedBy = 'elanous.run' | 'elanous.child-run';
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* 문맥 하나의 Pod Job 삭제 결과(HARNESS-STOP-POD-LABEL) — «0개 지움» 의 종류를 가른다.
|
|
160
|
+
* deleted N — 라벨 일치 Job N 개 삭제 · none — 두 라벨 다 Job 0(진짜 없음 · Pod 생성 전 등)
|
|
161
|
+
* unreachable — kubectl 실패(그 0 을 진짜 0 으로 믿을 수 없다) · pods-only — Job 0 인데 같은 라벨 Pod 잔존
|
|
162
|
+
*/
|
|
163
|
+
export type HarnessStopJobDelete =
|
|
164
|
+
| { context: string; outcome: 'deleted'; matchedBy: HarnessStopJobMatchedBy; deleted: number }
|
|
165
|
+
| { context: string; outcome: 'none'; matchedBy: null; deleted: 0 }
|
|
166
|
+
| { context: string; outcome: 'unreachable'; matchedBy: null; deleted: 0; error: string }
|
|
167
|
+
| { context: string; outcome: 'pods-only'; matchedBy: null; deleted: 0; podsRemaining: number };
|
|
168
|
+
|
|
154
169
|
export interface HarnessStopResult {
|
|
155
170
|
runId: string;
|
|
156
171
|
givenRunId?: string;
|
|
@@ -161,6 +176,8 @@ export interface HarnessStopResult {
|
|
|
161
176
|
pidRecordFound: boolean;
|
|
162
177
|
dryRun: boolean;
|
|
163
178
|
jobsDeleted: number;
|
|
179
|
+
/** 문맥별 Job 삭제 분류 — 출력 한 줄과 `--json` 의 근원. */
|
|
180
|
+
jobDeletes: HarnessStopJobDelete[];
|
|
164
181
|
contexts: string[];
|
|
165
182
|
}
|
|
166
183
|
|
|
@@ -231,6 +248,56 @@ export function defaultHarnessStopDeps(overrides: Partial<HarnessStopDeps> = {},
|
|
|
231
248
|
};
|
|
232
249
|
}
|
|
233
250
|
|
|
251
|
+
/** Pod Job 라벨 — `elanous.run` = 부모(오케스트레이터) 런 id · `elanous.child-run` = 자식 런 id(self-implement-pod podRunLabels). */
|
|
252
|
+
const POD_JOB_LABELS = ['elanous.run', 'elanous.child-run'] as const;
|
|
253
|
+
|
|
254
|
+
/** `kubectl get -o name` 출력에서 `<prefix>` 로 시작하는 줄 수를 센다. */
|
|
255
|
+
function countOutputLines(stdout: string, prefix: string): number {
|
|
256
|
+
return stdout.split('\n').filter((line) => line.startsWith(prefix)).length;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* `kubectl delete job -o name` 출력에서 삭제된 Job 줄 수를 센다.
|
|
261
|
+
* `-o name` 출력은 `job.batch/<name>` 한 줄씩이지만, 일부 kubectl 버전·설정에서는
|
|
262
|
+
* `job.batch "<name>" deleted` 꼴도 나타난다(#26194). 두 꼴을 모두 센다.
|
|
263
|
+
*/
|
|
264
|
+
function countDeletedJobLines(stdout: string): number {
|
|
265
|
+
return stdout.split('\n').filter((line) => /^job\.batch(?:\/|\s+")/.test(line.trim())).length;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/** 문맥 하나의 Pod Job 삭제 — 결과를 넷(deleted·none·unreachable·pods-only)으로 가르고 문맥마다 관측 `harness.stop` `job-delete` 를 남긴다. */
|
|
269
|
+
function deleteRunPodJobs(deps: HarnessStopDeps, runId: string, context: string): HarnessStopJobDelete {
|
|
270
|
+
const unreachable = (stderr: string): HarnessStopJobDelete => {
|
|
271
|
+
const error = stderr.slice(0, 200);
|
|
272
|
+
debug.log('harness.stop', 'job-delete', { runId, context, outcome: 'unreachable', matchedBy: null, error }, { level: 'warn' });
|
|
273
|
+
return { context, outcome: 'unreachable', matchedBy: null, deleted: 0, error };
|
|
274
|
+
};
|
|
275
|
+
// ① `elanous.run=<runId>` — 0 이면 `elanous.child-run=<runId>` 로 한 번 더 고른다(자식 런 id 로 쳤을 때). 지우는 것은 라벨 일치 Job 뿐이다.
|
|
276
|
+
for (const label of POD_JOB_LABELS) {
|
|
277
|
+
// `-o name` → «job.batch/<name>» 한 줄씩. 맨 출력은 «job.batch "<name>" deleted» 라 «job.batch/» 로만 세면
|
|
278
|
+
// 지워도 늘 0 이었다(10-11 · 여섯 번 «0개 지움» 뒤 Pod Terminating). 두 꼴을 다 센다(#26194).
|
|
279
|
+
const r = deps.kubectl(['--context', context, '-n', deps.namespace, 'delete', 'job', '-l', `${label}=${runId}`, '--wait=false', '-o', 'name']);
|
|
280
|
+
if (r.status !== 0) return unreachable(r.stderr);
|
|
281
|
+
const deleted = countDeletedJobLines(r.stdout);
|
|
282
|
+
if (deleted > 0) {
|
|
283
|
+
debug.log('harness.stop', 'job-delete', { runId, context, outcome: 'deleted', matchedBy: label, deleted });
|
|
284
|
+
return { context, outcome: 'deleted', matchedBy: label, deleted };
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// ② 두 라벨 다 Job 0 — 같은 라벨 Pod(`get pods -l <라벨>=<runId>`)로 none 과 pods-only 를 가른다. Pod 는 직접 지우지 않는다.
|
|
288
|
+
for (const label of POD_JOB_LABELS) {
|
|
289
|
+
const p = deps.kubectl(['--context', context, '-n', deps.namespace, 'get', 'pods', '-l', `${label}=${runId}`, '-o', 'name']);
|
|
290
|
+
if (p.status !== 0) return unreachable(p.stderr);
|
|
291
|
+
const podsRemaining = countOutputLines(p.stdout, 'pod/');
|
|
292
|
+
if (podsRemaining > 0) {
|
|
293
|
+
debug.log('harness.stop', 'job-delete', { runId, context, outcome: 'pods-only', matchedBy: null, podsRemaining });
|
|
294
|
+
return { context, outcome: 'pods-only', matchedBy: null, deleted: 0, podsRemaining };
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
debug.log('harness.stop', 'job-delete', { runId, context, outcome: 'none', matchedBy: null });
|
|
298
|
+
return { context, outcome: 'none', matchedBy: null, deleted: 0 };
|
|
299
|
+
}
|
|
300
|
+
|
|
234
301
|
export async function stopHarnessRun(runId: string, deps: HarnessStopDeps, contexts?: readonly string[], dryRun = false): Promise<HarnessStopResult> {
|
|
235
302
|
if (!RUN_ID.test(runId)) throw new Error(`invalid run id: ${runId}`);
|
|
236
303
|
const given = runId;
|
|
@@ -297,15 +364,9 @@ export async function stopHarnessRun(runId: string, deps: HarnessStopDeps, conte
|
|
|
297
364
|
}
|
|
298
365
|
// ── ⓑ Pod Job (라벨로만) ───────────────────────────────────
|
|
299
366
|
const targets = dryRun ? [] : contexts && contexts.length > 0 ? [...contexts] : deps.kubeContexts();
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
// 지워도 늘 0 이었다(10-11 · 여섯 번 «0개 지움» 뒤 Pod Terminating). 두 꼴을 다 센다.
|
|
304
|
-
const r = deps.kubectl(['--context', context, '-n', deps.namespace, 'delete', 'job', '-l', `elanous.run=${runId}`, '--wait=false', '-o', 'name']);
|
|
305
|
-
if (r.status === 0) jobsDeleted += r.stdout.split('\n').filter((line) => /^job\.batch(?:\/|\s+")/.test(line.trim())).length;
|
|
306
|
-
else debug.log('harness.stop', 'job-delete-failed', { runId, context, error: r.stderr.slice(0, 200) }, { level: 'warn' });
|
|
307
|
-
}
|
|
308
|
-
const result: HarnessStopResult = { runId, ...(given !== runId ? { givenRunId: given } : {}), process: processState, ...(record ? { pid: record.pid } : {}), candidates, scanned: scan.status === 'ok', pidRecordFound: record !== null, dryRun, jobsDeleted, contexts: targets };
|
|
367
|
+
const jobDeletes = targets.map((context) => deleteRunPodJobs(deps, runId, context));
|
|
368
|
+
const jobsDeleted = jobDeletes.reduce((sum, job) => sum + job.deleted, 0);
|
|
369
|
+
const result: HarnessStopResult = { runId, ...(given !== runId ? { givenRunId: given } : {}), process: processState, ...(record ? { pid: record.pid } : {}), candidates, scanned: scan.status === 'ok', pidRecordFound: record !== null, dryRun, jobsDeleted, jobDeletes, contexts: targets };
|
|
309
370
|
debug.log('harness.stop', 'stopped', { runId, process: processState, jobsDeleted, contexts: targets.length });
|
|
310
371
|
return result;
|
|
311
372
|
}
|
|
@@ -326,6 +387,15 @@ export function formatHarnessStop(r: HarnessStopResult): string {
|
|
|
326
387
|
...r.candidates.map(({ pid, startedAt, via }) => ` 후보: pid ${pid} · 시작 ${new Date(startedAt).toISOString()} · ${via}`),
|
|
327
388
|
r.dryRun
|
|
328
389
|
? ` Pod Job: dry-run(조회·삭제하지 않음 · 라벨 elanous.run=${r.runId})`
|
|
329
|
-
: ` Pod Job: ${r.jobsDeleted}개 지움 (문맥 ${r.contexts.length}개 · 라벨 elanous.run=${r.runId})`,
|
|
390
|
+
: ` Pod Job: ${r.jobsDeleted}개 지움 (문맥 ${r.contexts.length}개 · 라벨 elanous.run=${r.runId} · child-run 폴백)`,
|
|
391
|
+
...r.jobDeletes.map(formatHarnessStopJobDelete),
|
|
330
392
|
].join('\n');
|
|
331
393
|
}
|
|
394
|
+
|
|
395
|
+
/** 문맥 하나의 Pod Job 결과 줄 — none·unreachable·pods-only 는 서로 다른 문면으로 갈라 읽힌다. */
|
|
396
|
+
function formatHarnessStopJobDelete(job: HarnessStopJobDelete): string {
|
|
397
|
+
if (job.outcome === 'deleted') return ` ${job.context}: ${job.deleted}개 지움 (라벨 ${job.matchedBy})`;
|
|
398
|
+
if (job.outcome === 'pods-only') return ` ${job.context}: Job 0 · 같은 라벨 Pod ${job.podsRemaining} 남음 (Pod 는 직접 지우지 않는다)`;
|
|
399
|
+
if (job.outcome === 'unreachable') return ` ${job.context}: 못 닿음 (kubectl 실패: ${job.error})`;
|
|
400
|
+
return ` ${job.context}: 없음 (라벨 맞는 Job 0)`;
|
|
401
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { LOGS_SINCE_OPTION, registerLogsCommands } from './cli/logs-cli.js';
|
|
|
9
9
|
import { registerDocsCommands } from './cli/docs-cli.js';
|
|
10
10
|
import { registerBenchCommands } from './cli/bench-cli.js';
|
|
11
11
|
import { registerRetroCommands } from './cli/retro-cli.js';
|
|
12
|
+
import { registerMemoryCommands } from './cli/memory-cli.js';
|
|
12
13
|
import { registerA2ACommands } from './cli/a2a-cli.js';
|
|
13
14
|
import { registerPluginCommands } from './cli/plugin-cli.js';
|
|
14
15
|
import { registerMakeCommand } from './cli/make-cli.js';
|
|
@@ -93,6 +94,7 @@ import { registerStartCommand } from './cli/start-cli.js';
|
|
|
93
94
|
import { registerGroundingSourcesCli } from './grounding/sources-cli.js';
|
|
94
95
|
import { registerGraphCommands } from './graph-runner/graph-cli.js';
|
|
95
96
|
import { registerLoopCommands } from './loops/loop-cli.js';
|
|
97
|
+
import { registerResourceCommands } from './cli/resource-cli.js';
|
|
96
98
|
import { registerHqMovePlanCommand } from './hq/hq.js';
|
|
97
99
|
import { registerCardCommand } from './task-cards/card-cli.js';
|
|
98
100
|
import { registerLaunchHeadCommands } from './launch-head/launch-head-cli.js';
|
|
@@ -121,6 +123,8 @@ import { runGitCommand } from './git-fs/runner.js';
|
|
|
121
123
|
import { debug, redactSecretText, redactSecrets } from './debug/log.js';
|
|
122
124
|
import { installHarnessCliCommand, type HarnessAskSayChildLlmOptions, type HarnessAskSayOptions, type HarnessPlanOptions } from './harness/harness-cli-command.js';
|
|
123
125
|
import { CliUserError, formatCliUserError, isCliUserError } from './cli/cli-user-error.js';
|
|
126
|
+
import { classifyFriendlyError, formatFriendlyError } from './cli/friendly-errors.js';
|
|
127
|
+
import { detectLocale } from './expression/locale.js';
|
|
124
128
|
import { dispatchSolveMission } from './skills/tools/solve-mission.js';
|
|
125
129
|
import { performBrowserAction, type BrowserActionDeps, type BrowserActionResult } from './harness/browser-act.js';
|
|
126
130
|
import { decideTypeAction, type TypeActionDecision, type TypeTarget } from './harness/browser-act-type.js';
|
|
@@ -201,11 +205,6 @@ import {
|
|
|
201
205
|
} from './cli/mission-config.js';
|
|
202
206
|
import { DEFAULT_THEME_TOKENS, resolveThemeTokens } from './theme/tokens.js';
|
|
203
207
|
import { conatusPath } from './domains/conatus-data-dir.js';
|
|
204
|
-
import {
|
|
205
|
-
saveMemory, loadMemory, listMemories, deleteMemory, searchMemories,
|
|
206
|
-
readIndex, memoryRoot, memoryIndexPath,
|
|
207
|
-
type MemoryType,
|
|
208
|
-
} from './memory.js';
|
|
209
208
|
|
|
210
209
|
/** 원본 전용 봇랩 도구 — 공개본엔 없다(release/public-export.yaml · scripts/botlab/**). */
|
|
211
210
|
const BOTLAB_STATE_PATHS_MODULE: string = '../scripts/botlab/botlab-state-paths.js';
|
|
@@ -1268,6 +1267,7 @@ registerStartCommand(program);
|
|
|
1268
1267
|
registerGroundingSourcesCli(program);
|
|
1269
1268
|
registerGraphCommands(program);
|
|
1270
1269
|
registerLoopCommands(program);
|
|
1270
|
+
registerResourceCommands(program);
|
|
1271
1271
|
// RFC 실행·착지 루프 §3 — 태스크 컨텍스트 카드(`elanous card list|show` · ⛔ `task`/`tasks` 는 TOX 몫).
|
|
1272
1272
|
registerCardCommand(program);
|
|
1273
1273
|
registerLaunchHeadCommands(program);
|
|
@@ -1935,174 +1935,7 @@ registerAutopilotCommands(program);
|
|
|
1935
1935
|
registerRetroCommands(program);
|
|
1936
1936
|
|
|
1937
1937
|
// ── memory ──
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
memCmd
|
|
1941
|
-
.command('list [type]')
|
|
1942
|
-
.description('List memories (optionally filtered by type)')
|
|
1943
|
-
.option('-n, --limit <n>', 'Max entries to show', '30')
|
|
1944
|
-
.action((type?: string, opts?: { limit: string }) => {
|
|
1945
|
-
const t = type as MemoryType | undefined;
|
|
1946
|
-
const entries = listMemories({ type: t, limit: parseInt(opts?.limit ?? '30', 10) });
|
|
1947
|
-
if (entries.length === 0) {
|
|
1948
|
-
ui.info('No memories yet. Add one with `elanous memory add <type> "<name>" "<description>"`.');
|
|
1949
|
-
return;
|
|
1950
|
-
}
|
|
1951
|
-
ui.header(`memories (${entries.length})`);
|
|
1952
|
-
for (const e of entries) {
|
|
1953
|
-
console.log(` ${e.id.slice(0, 8)} [${e.type.padEnd(9)}] ${e.name}`);
|
|
1954
|
-
if (e.description) console.log(` ${e.description.slice(0, 100)}`);
|
|
1955
|
-
}
|
|
1956
|
-
});
|
|
1957
|
-
|
|
1958
|
-
memCmd
|
|
1959
|
-
.command('add <type> <name> [description...]')
|
|
1960
|
-
.description('Create a memory (type: user|feedback|project|reference). Body piped via stdin if available.')
|
|
1961
|
-
.action(async (type: string, name: string, descParts: string[]) => {
|
|
1962
|
-
if (!['user', 'feedback', 'project', 'reference'].includes(type)) {
|
|
1963
|
-
ui.error(`invalid type "${type}". Use: user | feedback | project | reference`);
|
|
1964
|
-
process.exit(1);
|
|
1965
|
-
}
|
|
1966
|
-
const description = (descParts || []).join(' ');
|
|
1967
|
-
// Read body from stdin if piped; otherwise use description as body too.
|
|
1968
|
-
let body = description;
|
|
1969
|
-
const pipedBody = await readPipedStdin(); // ★ OBS-T3 — 비-TTY 는 파이프를 뜻하지 않는다(소켓이면 EOF 가 안 온다)
|
|
1970
|
-
if (pipedBody) body = pipedBody;
|
|
1971
|
-
const e = saveMemory({ type: type as MemoryType, name, description, body });
|
|
1972
|
-
ui.info(`saved ${e.id.slice(0, 8)} [${e.type}] "${e.name}"`);
|
|
1973
|
-
});
|
|
1974
|
-
|
|
1975
|
-
// 3번째 recall 레버(2026-07-19) — pin(항상주입) / priority(매칭 시 순위 부스트).
|
|
1976
|
-
memCmd
|
|
1977
|
-
.command('pin <idPrefix>')
|
|
1978
|
-
.description('Pin a memory so it is ALWAYS injected (bypass keyword gate). Optionally set priority.')
|
|
1979
|
-
.option('-p, --priority <n>', 'priority boost (higher = ranked/kept first)', '5')
|
|
1980
|
-
.action((prefix: string, opts: { priority: string }) => {
|
|
1981
|
-
const e = loadMemory(prefix);
|
|
1982
|
-
if (!e) { ui.error(`no memory matching "${prefix}"`); process.exit(1); }
|
|
1983
|
-
saveMemory({ type: e.type, name: e.name, description: e.description, body: e.body, id: e.id, pinned: true, priority: parseInt(opts.priority, 10) || 0 });
|
|
1984
|
-
ui.info(`📌 pinned ${e.id.slice(0, 8)} "${e.name}" (priority ${opts.priority})`);
|
|
1985
|
-
});
|
|
1986
|
-
|
|
1987
|
-
memCmd
|
|
1988
|
-
.command('unpin <idPrefix>')
|
|
1989
|
-
.description('Un-pin a memory (back to keyword-gated recall).')
|
|
1990
|
-
.action((prefix: string) => {
|
|
1991
|
-
const e = loadMemory(prefix);
|
|
1992
|
-
if (!e) { ui.error(`no memory matching "${prefix}"`); process.exit(1); }
|
|
1993
|
-
saveMemory({ type: e.type, name: e.name, description: e.description, body: e.body, id: e.id, pinned: false, priority: e.priority });
|
|
1994
|
-
ui.info(`unpinned ${e.id.slice(0, 8)} "${e.name}"`);
|
|
1995
|
-
});
|
|
1996
|
-
|
|
1997
|
-
memCmd
|
|
1998
|
-
.command('priority <idPrefix> <n>')
|
|
1999
|
-
.description('Set a memory\'s injection priority boost (0 = default). Added to match score.')
|
|
2000
|
-
.action((prefix: string, n: string) => {
|
|
2001
|
-
const e = loadMemory(prefix);
|
|
2002
|
-
if (!e) { ui.error(`no memory matching "${prefix}"`); process.exit(1); }
|
|
2003
|
-
saveMemory({ type: e.type, name: e.name, description: e.description, body: e.body, id: e.id, priority: parseInt(n, 10) || 0, pinned: e.pinned });
|
|
2004
|
-
ui.info(`priority ${e.id.slice(0, 8)} "${e.name}" → ${parseInt(n, 10) || 0}`);
|
|
2005
|
-
});
|
|
2006
|
-
|
|
2007
|
-
// 통합 관리 뷰(2026-07-19) — 2 시스템(큐레이션 파일메모리 + 에피소드 self-log)을 한 화면에.
|
|
2008
|
-
memCmd
|
|
2009
|
-
.command('status')
|
|
2010
|
-
.description('Unified memory overview — ① curated file-memory + ② self-log (surface_events)')
|
|
2011
|
-
.action(async () => {
|
|
2012
|
-
const { memoryRoot } = await import('./memory.js');
|
|
2013
|
-
const mems = listMemories();
|
|
2014
|
-
const byType: Record<string, number> = {};
|
|
2015
|
-
let pinned = 0;
|
|
2016
|
-
for (const e of mems) { byType[e.type] = (byType[e.type] ?? 0) + 1; if (e.pinned) pinned += 1; }
|
|
2017
|
-
ui.header('memory (unified)');
|
|
2018
|
-
console.log(`① 큐레이션 파일메모리: ${mems.length}건 [${Object.entries(byType).map(([k, v]) => `${k}:${v}`).join(' ') || '-'}] 📌pinned ${pinned}`);
|
|
2019
|
-
console.log(` ${memoryRoot()} (LLM-judge/luna recall · MEMORY.md 항상주입)`);
|
|
2020
|
-
try {
|
|
2021
|
-
const { surfaceEventsDbPath, openSurfaceEventsDb } = await import('./domains/surface-events.js');
|
|
2022
|
-
const path = surfaceEventsDbPath();
|
|
2023
|
-
// 항상 open — legacy conatus/ → memory/ 자가치유 마이그레이션이 여기서 실행된다(존재 체크 먼저
|
|
2024
|
-
// 하면 신 경로 부재로 마이그레이션이 스킵됨). 없으면 빈 store 생성(무해).
|
|
2025
|
-
const db = openSurfaceEventsDb(path);
|
|
2026
|
-
const n = (db.prepare('SELECT count(*) c FROM events').get() as { c: number }).c;
|
|
2027
|
-
const recent = (db.prepare('SELECT ts FROM events ORDER BY ts DESC LIMIT 1').get() as { ts: string } | undefined)?.ts;
|
|
2028
|
-
db.close();
|
|
2029
|
-
console.log(`② 에피소드 self-log: ${n.toLocaleString()} events (최근 ${recent?.slice(0, 16) ?? '-'})`);
|
|
2030
|
-
console.log(` ${path} (FTS5 bm25+recency+myelin rerank · ambient 회상)`);
|
|
2031
|
-
} catch (e) { console.log(`② self-log 조회 실패: ${(e as Error).message}`); }
|
|
2032
|
-
try {
|
|
2033
|
-
const { openKnowledgeDb, knowledgeDbPath } = await import('./domains/knowledge.js');
|
|
2034
|
-
const kdb = openKnowledgeDb(); // 기본 경로 → legacy conatus/ 자가치유 이전
|
|
2035
|
-
const kn = (kdb.prepare('SELECT count(*) c FROM docs').get() as { c: number }).c;
|
|
2036
|
-
const dom = (kdb.prepare("SELECT domain, count(*) c FROM docs GROUP BY domain ORDER BY c DESC LIMIT 3").all() as Array<{ domain: string | null; c: number }>);
|
|
2037
|
-
kdb.close();
|
|
2038
|
-
console.log(`③ 시맨틱 knowledge: ${kn.toLocaleString()} docs [${dom.map(d => `${d.domain ?? 'null'}:${d.c}`).join(' ')}]`);
|
|
2039
|
-
console.log(` ${knowledgeDbPath()} (임베딩 벡터+BM25 하이브리드 · 의미 회상)`);
|
|
2040
|
-
} catch (e) { console.log(`③ knowledge 조회 실패: ${(e as Error).message}`); }
|
|
2041
|
-
});
|
|
2042
|
-
|
|
2043
|
-
memCmd
|
|
2044
|
-
.command('show <idPrefix>')
|
|
2045
|
-
.description('Print full memory body')
|
|
2046
|
-
.action((prefix: string) => {
|
|
2047
|
-
const entries = listMemories();
|
|
2048
|
-
const hit = entries.find(e => e.id.startsWith(prefix));
|
|
2049
|
-
if (!hit) { ui.error(`no memory matching "${prefix}"`); process.exit(1); }
|
|
2050
|
-
const full = loadMemory(hit.id)!;
|
|
2051
|
-
ui.header(`${full.type}: ${full.name}`);
|
|
2052
|
-
console.log(` id ${full.id}`);
|
|
2053
|
-
console.log(` created ${full.createdAt}`);
|
|
2054
|
-
console.log(` updated ${full.updatedAt}`);
|
|
2055
|
-
console.log(` description ${full.description}`);
|
|
2056
|
-
console.log('');
|
|
2057
|
-
console.log(full.body);
|
|
2058
|
-
});
|
|
2059
|
-
|
|
2060
|
-
memCmd
|
|
2061
|
-
.command('search <query...>')
|
|
2062
|
-
.description('Keyword search across all memories')
|
|
2063
|
-
.option('--type <t>', 'Filter by type')
|
|
2064
|
-
.option('-n, --limit <n>', 'Max results', '10')
|
|
2065
|
-
.action((parts: string[], opts) => {
|
|
2066
|
-
const hits = searchMemories(parts.join(' '), {
|
|
2067
|
-
type: opts.type as MemoryType | undefined,
|
|
2068
|
-
limit: parseInt(opts.limit, 10),
|
|
2069
|
-
});
|
|
2070
|
-
if (hits.length === 0) { ui.info('No matches.'); return; }
|
|
2071
|
-
ui.header(`matches (${hits.length})`);
|
|
2072
|
-
for (const h of hits) {
|
|
2073
|
-
console.log(` ${h.entry.id.slice(0, 8)} score ${h.score} [${h.entry.type}] ${h.entry.name}`);
|
|
2074
|
-
if (h.entry.description) console.log(` ${h.entry.description.slice(0, 100)}`);
|
|
2075
|
-
}
|
|
2076
|
-
});
|
|
2077
|
-
|
|
2078
|
-
memCmd
|
|
2079
|
-
.command('delete <idPrefix>')
|
|
2080
|
-
.description('Delete a memory')
|
|
2081
|
-
.action((prefix: string) => {
|
|
2082
|
-
const entries = listMemories();
|
|
2083
|
-
const hit = entries.find(e => e.id.startsWith(prefix));
|
|
2084
|
-
if (!hit) { ui.error(`no memory matching "${prefix}"`); process.exit(1); }
|
|
2085
|
-
deleteMemory(hit.id);
|
|
2086
|
-
ui.info(`deleted ${hit.id.slice(0, 8)}`);
|
|
2087
|
-
});
|
|
2088
|
-
|
|
2089
|
-
memCmd
|
|
2090
|
-
.command('index')
|
|
2091
|
-
.description('Print MEMORY.md index verbatim')
|
|
2092
|
-
.action(() => {
|
|
2093
|
-
const idx = readIndex();
|
|
2094
|
-
if (!idx) { ui.info('empty (no memories yet)'); return; }
|
|
2095
|
-
console.log(idx);
|
|
2096
|
-
});
|
|
2097
|
-
|
|
2098
|
-
memCmd
|
|
2099
|
-
.command('where')
|
|
2100
|
-
.description('Show the memory storage path')
|
|
2101
|
-
.action(() => {
|
|
2102
|
-
console.log(`memory dir ${memoryRoot()}`);
|
|
2103
|
-
console.log(`index file ${memoryIndexPath()}`);
|
|
2104
|
-
});
|
|
2105
|
-
|
|
1938
|
+
registerMemoryCommands(program);
|
|
2106
1939
|
// ── self (self-awareness memory — 외부 도구가 elanous 구현 이력을 주입/회상) ──
|
|
2107
1940
|
// ── decide (Jev · System One — ⛔ 텍스트를 «생성하지 않는다». 확률이 붙은 판정만 받는다) ──
|
|
2108
1941
|
program
|
|
@@ -5865,6 +5698,8 @@ selfCmd
|
|
|
5865
5698
|
return (prompt: string) =>
|
|
5866
5699
|
streamLLM([{ role: 'user', content: prompt }], () => {}, {
|
|
5867
5700
|
model,
|
|
5701
|
+
// ⛔ 어댑터 기본 2048 은 리뷰 응답을 자른다(VERDICT/MUST-FIX 줄이 잘리면 reviewed=false 로 접힌다).
|
|
5702
|
+
maxTokens: 16_000,
|
|
5868
5703
|
...(o?.pinProvider ? { provider: getProvider(model) } : {}),
|
|
5869
5704
|
...(o?.onResolved ? { onResolvedProvider: o.onResolved } : {}),
|
|
5870
5705
|
...(effort ? { reasoningEffort: effort } : {}),
|
|
@@ -5878,7 +5713,7 @@ selfCmd
|
|
|
5878
5713
|
return async (prompt: string, images?: readonly ReviewImage[]) => {
|
|
5879
5714
|
if (!made) {
|
|
5880
5715
|
const { makeLazyAcpReviewLLM } = await import('./agent-substrate/acp-reviewer.js');
|
|
5881
|
-
made = makeLazyAcpReviewLLM({ cwd: process.cwd(), backend: o.backend, model: o.model, timeoutMs: o.timeoutMs });
|
|
5716
|
+
made = makeLazyAcpReviewLLM({ cwd: o.cwd ?? process.cwd(), backend: o.backend, model: o.model, timeoutMs: o.timeoutMs });
|
|
5882
5717
|
}
|
|
5883
5718
|
return made(prompt, images);
|
|
5884
5719
|
};
|
|
@@ -5894,7 +5729,7 @@ selfCmd
|
|
|
5894
5729
|
// handshakeTimeoutMs left to the adapter default (min(timeoutMs, 60s)) — the harness lane passes none either.
|
|
5895
5730
|
return {
|
|
5896
5731
|
backend: 'claude',
|
|
5897
|
-
llm: makeRoleAcpReviewLLM({ cwd: process.cwd(), backend: 'claude', backendSpec: spawn.backendSpec, env: spawn.env, timeoutMs: o.timeoutMs }),
|
|
5732
|
+
llm: makeRoleAcpReviewLLM({ cwd: o.cwd ?? process.cwd(), backend: 'claude', backendSpec: spawn.backendSpec, env: spawn.env, timeoutMs: o.timeoutMs }),
|
|
5898
5733
|
};
|
|
5899
5734
|
},
|
|
5900
5735
|
// SUBSCRIPTION-EXHAUST-REROUTE — role reviewer unavailable ⇒ GLM on OpenRouter (the review policy's first
|
|
@@ -11941,6 +11776,13 @@ export function runCli(): void {
|
|
|
11941
11776
|
console.error(formatCliUserError(err));
|
|
11942
11777
|
process.exit(1);
|
|
11943
11778
|
}
|
|
11779
|
+
const friendlyCode = classifyFriendlyError(err);
|
|
11780
|
+
if (friendlyCode) {
|
|
11781
|
+
const locale = detectLocale();
|
|
11782
|
+
console.error(formatFriendlyError(friendlyCode, locale));
|
|
11783
|
+
debug.log('cli.friendly-error', 'shown', { code: friendlyCode, locale });
|
|
11784
|
+
process.exit(1);
|
|
11785
|
+
}
|
|
11944
11786
|
// ER1 — a real crash is reported once (consented · scrubbed · never blocks more than the send timeout).
|
|
11945
11787
|
try {
|
|
11946
11788
|
const { reportError } = await import('./error-report/report.js');
|
|
@@ -29,6 +29,9 @@ export const DEFAULT_GITHUB_STAR_DAYS = 30;
|
|
|
29
29
|
*/
|
|
30
30
|
export const DEFAULT_GITHUB_STAR_PER_QUERY = 20;
|
|
31
31
|
|
|
32
|
+
/** 하루당 별 증가 상위 이 개수 행만 README 를 싣고 `surge.score` 를 받는다. */
|
|
33
|
+
const GITHUB_SURGE_TOP = 3;
|
|
34
|
+
|
|
32
35
|
export interface GithubStarRepo {
|
|
33
36
|
fullName: string;
|
|
34
37
|
url: string;
|
|
@@ -223,7 +226,7 @@ export async function collectGithubStars(
|
|
|
223
226
|
}).sort((a, b) => (b.starsPerDay ?? -Infinity) - (a.starsPerDay ?? -Infinity) || b.stars - a.stars);
|
|
224
227
|
const readmes = new Map<string, string>();
|
|
225
228
|
if (!opts.dryRun) {
|
|
226
|
-
for (const row of repos.slice(0,
|
|
229
|
+
for (const row of repos.slice(0, GITHUB_SURGE_TOP)) {
|
|
227
230
|
try {
|
|
228
231
|
readmes.set(row.repo, `README:\n${(await (opts.fetchReadme ?? ghApiFetchReadme)(row.repo)).slice(0, 1_500)}`);
|
|
229
232
|
} catch {
|
|
@@ -231,7 +234,7 @@ export async function collectGithubStars(
|
|
|
231
234
|
}
|
|
232
235
|
}
|
|
233
236
|
}
|
|
234
|
-
const raws: RawIntakeItem[] = repos.map((row) => ({
|
|
237
|
+
const raws: RawIntakeItem[] = repos.map((row, rank) => ({
|
|
235
238
|
url: row.url,
|
|
236
239
|
title: row.title,
|
|
237
240
|
// 모든 행 첫 줄에 라이선스: SPDX · 확인된 부재는 «없음» · 응답이 알려 주지 않으면 «미상»(없음으로 읽지 않는다).
|
|
@@ -240,6 +243,8 @@ export async function collectGithubStars(
|
|
|
240
243
|
stars: row.stars,
|
|
241
244
|
...(row.starsDelta !== undefined ? { starsDelta: row.starsDelta } : {}),
|
|
242
245
|
...(row.starsPerDay !== undefined ? { starsPerDay: row.starsPerDay } : {}),
|
|
246
|
+
// 급등 상위 3 행(README 를 싣는 그 셋)만 1위 3 · 2위 2 · 3위 1 — pickAbsorbQueue 가 `.score` 로 앞세운다.
|
|
247
|
+
...(rank < GITHUB_SURGE_TOP ? { 'surge.score': GITHUB_SURGE_TOP - rank } : {}),
|
|
243
248
|
},
|
|
244
249
|
}));
|
|
245
250
|
const result: CollectGithubResult = {
|