elanous 0.2.24 → 0.2.27
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/{Q-7iofoxOEv1WX18S35of → Ev2jivDMTSoEc-5rIXdcy}/_buildManifest.js +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-a9c338f5bb556f42.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-a1ce306364f08da9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-07110da72c45e68f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-d2d76d4a7eae91bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-30007380f2e2a3c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-e5a9302c105725a3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-b93c04b5311c97ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-718a49e86bf25f9c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-20662900d6b4b455.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-f707a509515ac50c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-6a16a48d1aa6e91f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/{page-26345242e4049f55.js → page-fcb06e305f515527.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-6acf5ec4e6c6d1af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-39f82acf619cca23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-7c2c8f81b185f9c0.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-ae7aff07e32676bb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-482c60c1bc540d0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-7cb996c1aa08b6f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-623e08fe4477d606.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-db460cd8aecb8490.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-ff27902d0b11ef4f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-8397a5c6ca569bf4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1917ea87ea71ab6b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-25a302273b054fd7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-670510eda8b9443f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-d73c3f1e00d93986.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-65caacf54389081e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-4bb7556e2e97a750.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-77e04b4f8762c666.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/{page-b92caddb5c715f30.js → page-15c0a4095baddfba.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/page-4eb96fc7241c2456.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-63e272a4cd3b6634.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-0d64ff212dc55d03.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-7f096248993fc2d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-e47fc72049149a38.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-f7d808e31e005895.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-5c2b24b5496dad73.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-76cdb531668b5191.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-e2b63345bba1a11f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-d376e0c83edc041a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d6db55fe2c04d128.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-87b88f551f421d8b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-dab163b338e3b966.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-08019efef111ed2e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-0260ffc7eda50db1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-980ce6fe36ad95eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-99c4e6c7345a9156.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-0ab42e0f05823013.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-ad9220422d20ba33.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/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 +88 -7
- package/scripts/coord-msg-bridge.ts +209 -0
- package/scripts/coord-post.sh +40 -7
- package/scripts/coord-requests-bridge.ts +10 -5
- package/scripts/expose-rubric-suggest.ts +1 -1
- package/scripts/measure-tsc-affected-roots.ts +10 -1
- package/scripts/release-loop/auto-approve-node.ts +6 -0
- package/scripts/release-loop/export-check-node.ts +8 -5
- 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/node-verdict.ts +7 -2
- 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/task-notification.ts +30 -1
- package/src/agent-substrate/acp-implementer.ts +14 -7
- package/src/agent-substrate/pr-reviewer.ts +30 -10
- package/src/agent-substrate/review-observation.ts +9 -2
- package/src/agent-substrate/self-review-cli.ts +154 -16
- package/src/boot/daemon-tools/self-implement.ts +72 -4
- package/src/budget/cost-tier-advisor.ts +91 -0
- package/src/budget/llm-cost.ts +5 -1
- 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/control-cli.ts +29 -0
- package/src/cli/doctor-cli.ts +106 -3
- 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/msg-cli.ts +15 -5
- package/src/cli/pr-cli.ts +53 -0
- package/src/cli/pr-land-overlap-evidence.ts +18 -10
- package/src/cli/pr-land-pod-shadow.ts +54 -0
- package/src/cli/release-cli.ts +41 -12
- 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-cli.ts +121 -0
- package/src/cli/seat-requests-cli.ts +25 -0
- package/src/cli/self-utterances-cli.ts +140 -0
- package/src/cli/tasks-cli.ts +168 -14
- package/src/cli/usage-cli.ts +3 -1
- package/src/compact/verify-probe.ts +23 -3
- package/src/context-card/cell.ts +40 -0
- package/src/context-card/index.ts +50 -0
- package/src/control/control-status.ts +30 -1
- package/src/dashboard/boot-timing.ts +35 -0
- package/src/dashboard/index.ts +86 -24
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +26 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +10 -138
- package/src/dashboard/slash-runtime/shell-slash.ts +145 -0
- package/src/debug/log-diet.ts +16 -4
- package/src/debug/log.ts +1 -1
- package/src/domains/morning-essential.ts +18 -3
- package/src/domains/release-tool.ts +29 -8
- package/src/domains/surface-events.ts +16 -0
- package/src/elanous-config-dir.ts +2 -2
- package/src/execution-loop/launch-gate.ts +158 -2
- package/src/fleet/host-doctor.ts +446 -0
- package/src/goals/judge.ts +20 -6
- package/src/graph-runner/runner.ts +12 -6
- 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 +102 -51
- package/src/harness/harness-stop.ts +93 -19
- package/src/index.ts +52 -179
- package/src/instance/current.ts +2 -6
- package/src/instance/resolve.ts +5 -6
- 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/openai-sampling-fields.ts +89 -0
- package/src/llm/runtime-model-family.ts +61 -0
- package/src/llm/zai-coding-plan.ts +27 -1
- package/src/llm.ts +17 -97
- package/src/machines/machine-ledger.ts +31 -3
- package/src/maturity/cli-maturity.ts +13 -3
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/msg/msg-store.ts +69 -7
- 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/ops/overview-collect.ts +3 -2
- package/src/ops/overview-owner.ts +29 -0
- package/src/plugin-hooks/shell-hook.ts +17 -2
- package/src/plugin-missions/evaluator-runner.ts +18 -2
- package/src/plugins/install/plugin-install.ts +11 -1
- package/src/preview/terminal.ts +15 -5
- package/src/project/project-store.ts +20 -0
- package/src/prompt-enhance/enhance.ts +11 -0
- package/src/release-loop/auto-start.ts +7 -5
- package/src/release-loop/checklist.ts +52 -5
- package/src/release-loop/feature-store.ts +10 -9
- 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/seat-loop/seat-loop.ts +5 -1
- 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 +75 -18
- package/src/self-dev/fabric-decompose-adapter.ts +9 -2
- package/src/self-dev/orchestrate.ts +6 -2
- package/src/self-dev/run-supervisor.ts +72 -8
- 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 +15 -29
- package/src/self-implement/goal-command-execution.ts +26 -0
- 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 +90 -20
- package/src/self-implement/premise-review.ts +159 -0
- package/src/self-implement/pwa-import-graph.ts +194 -7
- 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/self-implement/self-implement-runtime.ts +126 -21
- package/src/session/index.ts +14 -4
- package/src/session-runtime/index.ts +55 -11
- 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 +85 -1
- package/src/task-agent/live-moves.ts +14 -6
- package/src/task-agent/parent-host.ts +27 -3
- package/src/task-agent/rejudge-on-head.ts +370 -29
- package/src/task-agent/review-result-capture.ts +67 -2
- package/src/task-agent/shadow.ts +148 -21
- package/src/task-agent/task-hand.ts +22 -3
- 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 +236 -28
- package/src/tool-runtime/tool-search-runtime.ts +25 -0
- package/src/tui.ts +20 -1
- package/src/user-config.ts +21 -63
- 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/botlab/page-24282bf9f90031a5.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/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/release/page-1d809a87139dd024.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 → Ev2jivDMTSoEc-5rIXdcy}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { debug } from '../debug/log.js';
|
|
4
|
+
|
|
5
|
+
export const DUTY_STATUSES = ['standing', 'done', 'missed'] as const;
|
|
6
|
+
export type DutyStatus = (typeof DUTY_STATUSES)[number];
|
|
7
|
+
|
|
8
|
+
export type DutyRow = {
|
|
9
|
+
at: string;
|
|
10
|
+
seat: string;
|
|
11
|
+
duty: string;
|
|
12
|
+
source: string;
|
|
13
|
+
status: DutyStatus;
|
|
14
|
+
ref?: string;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type DutyInput = Omit<DutyRow, 'at' | 'status'> & { at?: string; status?: DutyStatus };
|
|
18
|
+
|
|
19
|
+
const DUTY_KEYS: ReadonlySet<string> = new Set(['at', 'seat', 'duty', 'source', 'status', 'ref']);
|
|
20
|
+
const SEAT_PATTERN = /^(?:MK|UX|TC|OP|role:\S+)$/;
|
|
21
|
+
|
|
22
|
+
const dutyLedgerPath = (root: string): string => join(root, 'seat-duties', 'duties.jsonl');
|
|
23
|
+
|
|
24
|
+
function nonEmpty(row: Record<string, unknown>, key: string): string {
|
|
25
|
+
const value = row[key];
|
|
26
|
+
if (typeof value !== 'string' || !value.trim()) throw new Error(`duty ${key} must be a non-empty string`);
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function validate(input: Record<string, unknown>, now: () => Date): DutyRow {
|
|
31
|
+
for (const key of Object.keys(input)) {
|
|
32
|
+
if (!DUTY_KEYS.has(key)) throw new Error(`unknown duty key: ${key}`);
|
|
33
|
+
}
|
|
34
|
+
const seat = nonEmpty(input, 'seat');
|
|
35
|
+
if (!SEAT_PATTERN.test(seat)) throw new Error(`invalid duty seat: ${seat} (use MK|UX|TC|OP|role:<name>)`);
|
|
36
|
+
const status = input.status === undefined ? 'standing' : input.status;
|
|
37
|
+
if (!DUTY_STATUSES.includes(status as DutyStatus)) throw new Error(`invalid duty status: ${String(status)}`);
|
|
38
|
+
const at = input.at === undefined ? now().toISOString() : nonEmpty(input, 'at');
|
|
39
|
+
if (Number.isNaN(Date.parse(at))) throw new Error(`invalid duty at: ${at}`);
|
|
40
|
+
const row: DutyRow = { at, seat, duty: nonEmpty(input, 'duty'), source: nonEmpty(input, 'source'), status: status as DutyStatus };
|
|
41
|
+
if (input.ref !== undefined) row.ref = nonEmpty(input, 'ref');
|
|
42
|
+
return row;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Appends one validated row; a rejected row never reaches the file. */
|
|
46
|
+
export function appendDuty(root: string, input: DutyInput, now: () => Date = () => new Date()): DutyRow {
|
|
47
|
+
const row = validate(input as Record<string, unknown>, now);
|
|
48
|
+
const path = dutyLedgerPath(root);
|
|
49
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
50
|
+
appendFileSync(path, `${JSON.stringify(row)}\n`);
|
|
51
|
+
try { debug.log('seat-loop.duty', 'appended', { seat: row.seat, duty: row.duty }); } catch { /* observation cannot change a write */ }
|
|
52
|
+
return row;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function listDuties(root: string, filters: { seat?: string } = {}): DutyRow[] {
|
|
56
|
+
const path = dutyLedgerPath(root);
|
|
57
|
+
if (!existsSync(path)) return [];
|
|
58
|
+
const rows = readFileSync(path, 'utf8').split('\n').filter((line) => line.trim())
|
|
59
|
+
.map((line) => JSON.parse(line) as DutyRow)
|
|
60
|
+
.filter((row) => filters.seat === undefined || row.seat === filters.seat);
|
|
61
|
+
return rows.map((row, index) => ({ row, index }))
|
|
62
|
+
.sort((a, b) => Date.parse(a.row.at) - Date.parse(b.row.at) || a.index - b.index)
|
|
63
|
+
.map(({ row }) => row);
|
|
64
|
+
}
|
|
@@ -85,7 +85,7 @@ export type SeatDeps = {
|
|
|
85
85
|
/** Release schedules (version · cutAt) — a version is open while its cut is still ahead. Default reads the release ledger; unreadable ⇒ no checklist candidates (fail closed). */
|
|
86
86
|
schedules?: () => Array<{ version: string; cutAt: string; landBy?: string | null }>;
|
|
87
87
|
/** Checklist items of one version — default reads the release ledger DB (checklist.json is only a legacy import source since REL5b). */
|
|
88
|
-
checklistItems?: (version: string) => Array<{ id: string; title: string; status: string; owner?: string | null; disposition?: string; evidence?: string }>;
|
|
88
|
+
checklistItems?: (version: string) => Array<{ id: string; title: string; status: string; owner?: string | null; disposition?: string; evidence?: string; dispatchKind?: string }>;
|
|
89
89
|
/** Optional injected traffic/handoff snapshots; defaults read the OP files. */
|
|
90
90
|
trafficSignal?: TrafficSignalRead;
|
|
91
91
|
handedCells?: ReadonlySet<string>;
|
|
@@ -588,6 +588,10 @@ export async function gatherSeatInputs(seat: string, deps: SeatDeps = {}, ledger
|
|
|
588
588
|
}
|
|
589
589
|
for (const item of items) {
|
|
590
590
|
if (item.owner === seat && (item.status === 'yellow' || item.status === 'red')) {
|
|
591
|
+
if (item.dispatchKind && item.dispatchKind !== 'code') {
|
|
592
|
+
debug.log('seat.loop', 'skip-non-code-cell', { id: item.id, version, dispatchKind: item.dispatchKind });
|
|
593
|
+
continue;
|
|
594
|
+
}
|
|
591
595
|
if (signal?.hold?.includes(item.id)) {
|
|
592
596
|
debug.log('seat.loop', 'skip-signal-cell', { id: item.id, why: 'hold' });
|
|
593
597
|
continue;
|
|
@@ -14,8 +14,12 @@
|
|
|
14
14
|
*
|
|
15
15
|
* Cf. PLAN-parallel-self-dev-orchestrator-2026-07-21 §6 (S2).
|
|
16
16
|
*/
|
|
17
|
-
import { tierModel } from '../llm/model-defaults.js';
|
|
18
17
|
import { debug } from '../debug/log.js';
|
|
18
|
+
import {
|
|
19
|
+
resolveRoleModel,
|
|
20
|
+
type ModelResolutionSource,
|
|
21
|
+
type UserConfig,
|
|
22
|
+
} from '../user-config.js';
|
|
19
23
|
import {
|
|
20
24
|
gradePhaseCompletability,
|
|
21
25
|
type CompletabilitySizeSignals,
|
|
@@ -598,9 +602,39 @@ export async function decomposeSelfDevGoal(
|
|
|
598
602
|
return finalizeDecomposition(feature, goals, decomposition, opts, parsedGoals.length > 0 ? arcHint : undefined, parsedGoals.length - foldedGoals.length);
|
|
599
603
|
}
|
|
600
604
|
|
|
605
|
+
/** Where the decompose model came from — `'explicit'` is the caller's `model` argument layer. */
|
|
606
|
+
export type DecomposeModelSource = 'explicit' | ModelResolutionSource;
|
|
607
|
+
|
|
608
|
+
export interface DecomposeModelResolution {
|
|
609
|
+
model: string;
|
|
610
|
+
source: DecomposeModelSource;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
export interface DecomposeModelDeps {
|
|
614
|
+
/** Config handed to the planning-role default; omitted uses the user config. */
|
|
615
|
+
config?: UserConfig;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
/**
|
|
619
|
+
* ROLE-RELAY-SPLIT — the decompose model selector (pure).
|
|
620
|
+
*
|
|
621
|
+
* An explicit `model` argument wins; the default is the existing planning-role
|
|
622
|
+
* resolver `resolveRoleModel('planning')` (env `ELANOUS_SKILL_PLAN_MODEL` ·
|
|
623
|
+
* `roleLlm.planning` · tier `best` — the same tier the old default used), NOT
|
|
624
|
+
* the review env `ELANOUS_PR_REVIEW_MODEL`: changing the review model must
|
|
625
|
+
* not drag the decompose model along.
|
|
626
|
+
*/
|
|
627
|
+
export function decomposeModel(explicit?: string, deps: DecomposeModelDeps = {}): DecomposeModelResolution {
|
|
628
|
+
const pinned = explicit?.trim();
|
|
629
|
+
if (pinned) return { model: pinned, source: 'explicit' };
|
|
630
|
+
const resolved = resolveRoleModel('planning', deps.config);
|
|
631
|
+
return { model: resolved.model, source: resolved.source };
|
|
632
|
+
}
|
|
633
|
+
|
|
601
634
|
/** Default LLM seam — lazy `streamLLM` wire (kept out of the test path). */
|
|
602
635
|
async function defaultDecomposeLlm(model?: string): Promise<SelfDevDecomposeLlm> {
|
|
603
636
|
const { streamLLM } = await import('../llm.js');
|
|
604
|
-
const
|
|
605
|
-
|
|
637
|
+
const { model: resolved, source } = decomposeModel(model);
|
|
638
|
+
debug.log('self-dev.decompose', 'model', { model: resolved, source });
|
|
639
|
+
return (prompt: string) => streamLLM([{ role: 'user', content: prompt }], () => {}, { model: resolved, reasoningEffort: 'low' });
|
|
606
640
|
}
|
|
@@ -26,6 +26,7 @@ import { createRepositoryReferencedFileReader, type ReferencedFileReader } from
|
|
|
26
26
|
import { parseGoalDocumentClarifications } from '../self-implement/goal-author-clarification.js';
|
|
27
27
|
import { requiredEvidenceFromGoal } from '../self-implement/off-diff-evidence.js';
|
|
28
28
|
import { debug } from '../debug/log.js';
|
|
29
|
+
import { REVIEW_DEFERRED_TO_HOST_ENV, reviewDeferredToHostFromEnv } from '../self-implement/review-deferred-to-host.js';
|
|
29
30
|
import { releasePathHold, releasePathHoldComment, RELEASE_PATH_LABEL } from './release-path-guard.js';
|
|
30
31
|
import { runGitCommand } from '../git-fs/runner.js';
|
|
31
32
|
import type { GitRunResult } from '../git-fs/retry.js';
|
|
@@ -41,7 +42,7 @@ import type { IngestionEntry } from '../agent-substrate/execution/ingestion-poli
|
|
|
41
42
|
import type { ReviewerContextItem } from '../agent-substrate/pr-reviewer.js';
|
|
42
43
|
import { resolveRunIdentity, type RunIdSource } from '../harness/harness-space.js';
|
|
43
44
|
import { addSelfDevRunParticipant, processBirthId, saveSelfDevRun } from './run-store.js';
|
|
44
|
-
import { getUserConfig, resolveRoleLlm } from '../user-config.js';
|
|
45
|
+
import { getUserConfig, resolveRoleLlm, type RoleLlmSource } from '../user-config.js';
|
|
45
46
|
import { reviewReasoningEffort } from '../model-tier/review-effort.js';
|
|
46
47
|
import { getProvider, inferProviderFromModel } from '../llm.js';
|
|
47
48
|
import { buildReviewProviderAttempts, defaultReviewFallbackModel, runReviewWithFallback, reviewFallbackModelsFromConfig, runSubscriptionReviewer, type SubscriptionReviewerDeps } from './review-provider-fallback.js';
|
|
@@ -1051,16 +1052,29 @@ export function unmannedToolReviewerRateFromConfig(
|
|
|
1051
1052
|
return DEFAULT_UNMANNED_TOOL_REVIEWER_RATE;
|
|
1052
1053
|
}
|
|
1053
1054
|
|
|
1054
|
-
function observeUnmannedToolReviewerSelection(selection: UnmannedToolReviewerSelection): void {
|
|
1055
|
+
function observeUnmannedToolReviewerSelection(selection: UnmannedToolReviewerSelection, skipped?: { reason: 'role-pinned'; roleSource: RoleLlmSource }): void {
|
|
1055
1056
|
try {
|
|
1056
1057
|
debug.log('self-dev.reviewer', 'tool-reviewer.select', {
|
|
1057
1058
|
picked: selection.picked,
|
|
1058
1059
|
rate: selection.rate,
|
|
1059
1060
|
sample: selection.sample,
|
|
1061
|
+
...(skipped ? { skipped: skipped.reason, roleSource: skipped.roleSource } : {}),
|
|
1060
1062
|
});
|
|
1061
1063
|
} catch { /* fail-soft */ }
|
|
1062
1064
|
}
|
|
1063
1065
|
|
|
1066
|
+
/**
|
|
1067
|
+
* TOOL-REVIEWER-ROLE-PIN — a review role pinned for THIS launch (`--role-llm review=…` flag, or the Pod's
|
|
1068
|
+
* `ELANOUS_ROLE_LLM_REVIEW` env pin) is a declaration that every review in the run uses that model; the
|
|
1069
|
+
* unmanned tool-reviewer lottery must not swap it out (10-10 OR probe #25906: the draw picked the ACP
|
|
1070
|
+
* reviewer and skipped the glm-5.3 pin, so bench arms got different reviewers). `environment` also covers the
|
|
1071
|
+
* older `ELANOUS_PR_REVIEW_MODEL` env model pin. Config `roleLlm.review` is a standing default, not a per-launch
|
|
1072
|
+
* pin — it keeps the lottery.
|
|
1073
|
+
*/
|
|
1074
|
+
export function reviewRolePinnedForLaunch(source: RoleLlmSource): boolean {
|
|
1075
|
+
return source === 'flag' || source === 'environment';
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1064
1078
|
async function defaultMakeUnmannedToolReviewLLM(): Promise<UnmannedToolReviewLLM> {
|
|
1065
1079
|
const { makeLazyAcpReviewLLM } = await import('../agent-substrate/acp-reviewer.js');
|
|
1066
1080
|
return makeLazyAcpReviewLLM({ cwd: process.cwd() });
|
|
@@ -1085,6 +1099,8 @@ export async function buildDefaultSelfImplementSeams(
|
|
|
1085
1099
|
makeToolReviewLLM?: () => UnmannedToolReviewLLM | Promise<UnmannedToolReviewLLM>;
|
|
1086
1100
|
subscriptionReviewerDeps?: SubscriptionReviewerDeps;
|
|
1087
1101
|
makeSubscriptionReviewLLM?: (spawn: ReturnType<typeof import('./review-provider-fallback.js').subscriptionReviewerSpawn>) => (prompt: string) => Promise<string>;
|
|
1102
|
+
/** REVIEW-ACP-POD ②-b 시험 주입 — 기본은 env `ELANOUS_REVIEW_DEFERRED_TO_HOST=1`(발사 호스트가 싣는다). */
|
|
1103
|
+
reviewDeferredToHost?: boolean;
|
|
1088
1104
|
} = {},
|
|
1089
1105
|
): Promise<SelfImplementSeams> {
|
|
1090
1106
|
const { defaultSeams } = await import('../self-implement/seams.js');
|
|
@@ -1139,11 +1155,14 @@ export async function buildDefaultSelfImplementSeams(
|
|
|
1139
1155
|
let reviewerCanSelfRead: boolean | undefined;
|
|
1140
1156
|
if (reviewerIsDefaultApiCall) {
|
|
1141
1157
|
const rate = parseUnmannedToolReviewerRate(deps.toolReviewerRate) ?? unmannedToolReviewerRateFromConfig();
|
|
1142
|
-
const
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1158
|
+
const rolePinned = reviewRolePinnedForLaunch(reviewRole.source);
|
|
1159
|
+
const sample = rolePinned
|
|
1160
|
+
? 1
|
|
1161
|
+
: typeof deps.toolReviewerSample === 'number' && Number.isFinite(deps.toolReviewerSample)
|
|
1162
|
+
? deps.toolReviewerSample
|
|
1163
|
+
: (deps.toolReviewerRoll ?? Math.random)();
|
|
1164
|
+
const selection = rolePinned ? { picked: false, rate, sample } : selectUnmannedToolReviewer(rate, sample);
|
|
1165
|
+
observeUnmannedToolReviewerSelection(selection, rolePinned ? { reason: 'role-pinned', roleSource: reviewRole.source } : undefined);
|
|
1147
1166
|
if (selection.picked) {
|
|
1148
1167
|
llmReview = await (deps.makeToolReviewLLM ?? defaultMakeUnmannedToolReviewLLM)();
|
|
1149
1168
|
reviewerCanSelfRead = true;
|
|
@@ -1164,6 +1183,11 @@ export async function buildDefaultSelfImplementSeams(
|
|
|
1164
1183
|
reviewerCanSelfRead = undefined;
|
|
1165
1184
|
}
|
|
1166
1185
|
}
|
|
1186
|
+
// REVIEW-ACP-POD ②-b — 발사 호스트가 Claude ACP 로 리뷰할 때만 실린다. 리뷰 심이 api 리뷰어를 부르지 않는다(판정은 호스트).
|
|
1187
|
+
const reviewDeferredToHost = deps.reviewDeferredToHost ?? reviewDeferredToHostFromEnv(process.env);
|
|
1188
|
+
if (reviewDeferredToHost) {
|
|
1189
|
+
try { debug.log('self-dev.review-fallback', 'review-deferred-to-host', { env: REVIEW_DEFERRED_TO_HOST_ENV, source: deps.reviewDeferredToHost !== undefined ? 'option' : 'env' }); } catch { /* fail-soft */ }
|
|
1190
|
+
}
|
|
1167
1191
|
const opensPr = plan.completion !== 'worktree-only';
|
|
1168
1192
|
const target = plan.target === undefined ? undefined : revalidateHarnessTarget(plan.target);
|
|
1169
1193
|
if (target?.status === 'outside-home') {
|
|
@@ -1181,6 +1205,7 @@ export async function buildDefaultSelfImplementSeams(
|
|
|
1181
1205
|
...(plan.self?.activityGraceSec !== undefined ? { implementActivityGraceSec: plan.self.activityGraceSec } : {}),
|
|
1182
1206
|
llmReview,
|
|
1183
1207
|
...(subscriptionReviewLLM ? { subscriptionReviewLLM } : {}),
|
|
1208
|
+
...(reviewDeferredToHost ? { reviewDeferredToHost: true } : {}),
|
|
1184
1209
|
...(reviewerCanSelfRead !== undefined ? { reviewerCanSelfRead } : {}),
|
|
1185
1210
|
...(deps.reviewScopeDiff ? { reviewScopeDiff: deps.reviewScopeDiff } : {}),
|
|
1186
1211
|
onProgress: ({ stage, message }) => {
|
|
@@ -7,16 +7,19 @@ import { debug } from '../debug/log.js';
|
|
|
7
7
|
import { PR_LABELS } from '../github/pr-labels.js';
|
|
8
8
|
import { appendRunLedgerEntry, listRunLedgers, loadRunLedger, runLedgerDir, type RunLedgerEntry } from '../self-implement/run-ledger.js';
|
|
9
9
|
import { queryRunningRuns } from '../self-implement/running-runs.js';
|
|
10
|
+
import { clipRegateDetail, regateFailureFacts, type HostRegateFailure } from '../self-implement/regate-detail.js';
|
|
10
11
|
import { DRAFT_SWEEP_CLOSE_CAP } from './draft-sweep.js';
|
|
11
12
|
import { PROTECTED_LABELS, sameVerifiedGoal, type DraftTriagePr } from './draft-triage-rules.js';
|
|
12
13
|
|
|
13
|
-
export type PodTerminalClass = 'landed' | 'merge-ready-not-merged' | 'failed-with-pr' | 'failed-no-pr' | 'failed-pr-unobserved';
|
|
14
|
+
export type PodTerminalClass = 'landed' | 'merge-ready-not-merged' | 'failed-with-pr' | 'failed-no-pr' | 'failed-pr-unobserved' | 'timed-out-harvestable';
|
|
14
15
|
export interface PrTerminalRecord {
|
|
15
16
|
childRunId: string;
|
|
16
17
|
prNumber: number | null;
|
|
17
18
|
prUrl: string | null;
|
|
18
19
|
repository: string | null;
|
|
19
20
|
headSha: string | null;
|
|
21
|
+
/** Copied from disposition.branch when present; null when the child did not name a branch. */
|
|
22
|
+
branch?: string | null;
|
|
20
23
|
terminalClass: PodTerminalClass;
|
|
21
24
|
stage: string | null;
|
|
22
25
|
owner: string;
|
|
@@ -24,13 +27,16 @@ export interface PrTerminalRecord {
|
|
|
24
27
|
card: string | null;
|
|
25
28
|
at: string;
|
|
26
29
|
/** Which host-regate gate failed and why — null for every other terminal. */
|
|
27
|
-
|
|
30
|
+
/** HOST-REGATE-REASON-LOST: detail keeps a bounded head ⊕ tail (4KB); pr-head · merge steps add the expected/actual
|
|
31
|
+
* head, merge-conflict adds the conflicted files, merge adds the failure kind (race · moved head · conflict · policy). */
|
|
32
|
+
hostRegateFailure: (HostRegateFailure & { os: string }) | null;
|
|
28
33
|
}
|
|
29
34
|
export interface PodTerminalInput {
|
|
30
35
|
childRunId: string;
|
|
31
36
|
state: 'complete' | 'failed' | 'aborted';
|
|
32
37
|
disposition?: { prNumber?: number | null; prUrl?: string | null; checkedHeadCommit?: string | null; stage?: string; merged?: boolean; ok?: boolean;
|
|
33
|
-
|
|
38
|
+
branch?: string | null;
|
|
39
|
+
hostRegate?: { passed: boolean; failures: HostRegateFailure[]; os: string } | null } | null;
|
|
34
40
|
env?: Readonly<Record<string, string | undefined>>;
|
|
35
41
|
prBody?: string;
|
|
36
42
|
goalText?: string;
|
|
@@ -47,6 +53,7 @@ export function classifyPodTerminal(input: PodTerminalInput): PrTerminalRecord {
|
|
|
47
53
|
const prUrl = typeof d?.prUrl === 'string' ? d.prUrl : null;
|
|
48
54
|
const match = prUrl && /^https:\/\/github\.com\/([\w.-]+)\/([\w.-]+)\/pull\/(\d+)\/?$/.exec(prUrl);
|
|
49
55
|
const repository = match && Number(match[3]) === prNumber ? `${match[1]}/${match[2]}` : null;
|
|
56
|
+
const branch = typeof d?.branch === 'string' && d.branch.trim() ? d.branch.trim() : null;
|
|
50
57
|
const card = cardOf(input.prBody) ?? cardOf(input.goalText);
|
|
51
58
|
const seat = input.env?.ELANOUS_HARNESS_SEAT;
|
|
52
59
|
const ownerSource = seat === 'OP' || seat === 'TC' || seat === 'MK' || seat === 'UX' ? 'seat' : card ? 'card' : 'unknown';
|
|
@@ -55,14 +62,16 @@ export function classifyPodTerminal(input: PodTerminalInput): PrTerminalRecord {
|
|
|
55
62
|
const hostRegateFailure = d?.stage === 'host-regate-failed' && hostRegate?.passed === false
|
|
56
63
|
? { step: typeof firstFailure?.step === 'string' && firstFailure.step ? firstFailure.step : 'unknown',
|
|
57
64
|
detail: typeof firstFailure?.detail === 'string' && firstFailure.detail
|
|
58
|
-
? firstFailure.detail.split(/\s+/).filter(Boolean).join(' ')
|
|
65
|
+
? clipRegateDetail(firstFailure.detail.split(/\s+/).filter(Boolean).join(' '))
|
|
59
66
|
: 'failures empty',
|
|
67
|
+
...regateFailureFacts(firstFailure),
|
|
60
68
|
os: hostRegate.os }
|
|
61
69
|
: null;
|
|
62
70
|
return {
|
|
63
|
-
childRunId: input.childRunId, prNumber, prUrl, repository,
|
|
71
|
+
childRunId: input.childRunId, prNumber, prUrl, repository, branch,
|
|
64
72
|
headSha: typeof d?.checkedHeadCommit === 'string' && /^[a-f0-9]{40}$/i.test(d.checkedHeadCommit) ? d.checkedHeadCommit : null,
|
|
65
73
|
terminalClass: !d ? 'failed-pr-unobserved' : d.merged === true ? 'landed'
|
|
74
|
+
: prNumber === null && d.stage === 'timed-out' && branch ? 'timed-out-harvestable'
|
|
66
75
|
: prNumber === null ? 'failed-no-pr'
|
|
67
76
|
: input.state === 'complete' && d.ok !== false ? 'merge-ready-not-merged' : 'failed-with-pr',
|
|
68
77
|
stage: d?.stage ?? null, hostRegateFailure,
|
|
@@ -282,7 +291,7 @@ export async function replayPodTerminals(options: DraftResidueReplayOptions = {}
|
|
|
282
291
|
for (const terminal of terminals) {
|
|
283
292
|
const record = terminal.data as unknown as PrTerminalRecord;
|
|
284
293
|
if (typeof record.childRunId !== 'string' || typeof record.owner !== 'string'
|
|
285
|
-
|
|
294
|
+
|| !['landed', 'merge-ready-not-merged', 'failed-with-pr', 'failed-no-pr', 'failed-pr-unobserved', 'timed-out-harvestable'].includes(record.terminalClass)
|
|
286
295
|
|| (record.prNumber !== null && (!Number.isSafeInteger(record.prNumber) || record.prNumber <= 0))
|
|
287
296
|
|| (record.repository !== null && (typeof record.repository !== 'string' || !/^[\w.-]+\/[\w.-]+$/.test(record.repository)))) {
|
|
288
297
|
throw new Error(`Invalid terminal record: ${ledgerRunId}`);
|
|
@@ -338,6 +347,7 @@ export async function applyPodTerminal(record: PrTerminalRecord, ctx: DraftResid
|
|
|
338
347
|
adapters.appendLedger({ runId: ctx.ledgerRunId, event: 'pr-terminal', data: { ...record } }, ctx.ledgerDir);
|
|
339
348
|
log('terminal-recorded');
|
|
340
349
|
}
|
|
350
|
+
// AUT-TIMEOUT-NO-HARVEST 첫 조각은 «분류만» — 그 branch 로 PR 을 여는 효과는 다음 조각(원격 가지 존재·기존 PR 확인 관문과 함께).
|
|
341
351
|
if (record.terminalClass === 'failed-no-pr' || record.terminalClass === 'failed-pr-unobserved' || record.prNumber === null) {
|
|
342
352
|
acknowledge('complete', 0);
|
|
343
353
|
return skipped(record.terminalClass);
|
|
@@ -33,7 +33,7 @@ export interface DraftSweepAdapters {
|
|
|
33
33
|
/** Undefined means liveness could not be established. */
|
|
34
34
|
listLiveBranches(repository: string): Promise<ReadonlySet<string> | undefined>;
|
|
35
35
|
setLabels(repository: string, number: number, change: { add: string; remove: readonly string[] }): Promise<void>;
|
|
36
|
-
closeDraft(repository: string, number: number
|
|
36
|
+
closeDraft(repository: string, number: number): Promise<void>;
|
|
37
37
|
/** Resolve the latest claim comment owner; a failed lookup must not authorize a close. */
|
|
38
38
|
getClaimOwner?(repository: string, number: number): Promise<string | undefined>;
|
|
39
39
|
/** Current owner, accounting for a later claim release; only draft metrics need this distinction. */
|
|
@@ -121,9 +121,25 @@ export interface DraftSweepResult {
|
|
|
121
121
|
* harvestable (review PASS and gate pass), and blocked (must-fix remains).
|
|
122
122
|
*/
|
|
123
123
|
daily?: DraftSweepDaily;
|
|
124
|
+
/**
|
|
125
|
+
* Same-lineage rule outcomes this tick (DRAFT-SWEEP-LINEAGE-HARVESTABLE): closes it decided (harvestable among them)
|
|
126
|
+
* and every candidate it let fall through to the older rules, by reason.
|
|
127
|
+
*/
|
|
128
|
+
lineage?: DraftSweepLineageCounts;
|
|
124
129
|
error?: string;
|
|
125
130
|
}
|
|
126
131
|
|
|
132
|
+
export interface DraftSweepLineageCounts {
|
|
133
|
+
closed: number;
|
|
134
|
+
harvestableClosed: number;
|
|
135
|
+
fallThrough: Record<string, number>;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** A review counts as passed only on an observed PASS with no must-fix left. */
|
|
139
|
+
function reviewPassed(posture: SweepReviewGate | undefined): boolean {
|
|
140
|
+
return posture?.review === 'pass' && posture.mustFix !== true;
|
|
141
|
+
}
|
|
142
|
+
|
|
127
143
|
/** Daily old-draft census. `date` is the sweep clock's UTC calendar day. */
|
|
128
144
|
export interface DraftSweepDaily {
|
|
129
145
|
readonly date: string;
|
|
@@ -462,6 +478,23 @@ const label = (action: 'mark-stalled' | 'close', name?: string): string => {
|
|
|
462
478
|
const runningLabel = label('mark-stalled');
|
|
463
479
|
const stalledLabel = label('close', 'stalled');
|
|
464
480
|
const supersededLabel = label('close', 'superseded');
|
|
481
|
+
|
|
482
|
+
/** Keep repository labels bounded; the complete reason and PR number live in the closed event. */
|
|
483
|
+
export function sweptReasonLabel(reason: string): string {
|
|
484
|
+
const kinds = ['superseded-by', 'duplicate-of-open', 'claim-expired', 'stale-unobserved',
|
|
485
|
+
'harvest-expired', 'stale-ended-run'] as const;
|
|
486
|
+
const kind = kinds.find((name) => reason === name || reason.startsWith(`${name} `)) ?? 'other';
|
|
487
|
+
return `elanous:swept:${kind}`;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
async function closeSweptDraft(adapters: Pick<DraftSweepAdapters, 'setLabels' | 'closeDraft'>,
|
|
491
|
+
repository: string, number: number, reason: string, onLabelApplied?: () => void): Promise<void> {
|
|
492
|
+
await adapters.setLabels(repository, number, { add: sweptReasonLabel(reason), remove: [] });
|
|
493
|
+
onLabelApplied?.();
|
|
494
|
+
await adapters.closeDraft(repository, number);
|
|
495
|
+
try { debug.log('self-dev.draft-sweep', 'closed', { pr: number, reason }); } catch { /* fail-soft */ }
|
|
496
|
+
}
|
|
497
|
+
|
|
465
498
|
const approvalLabel = PR_LABELS.find((entry) => entry.axis === 'state' && entry.sweep.action === 'none')?.name;
|
|
466
499
|
const keepLabel = PR_LABELS.find((entry) => entry.sweep.action === 'exclude')?.name;
|
|
467
500
|
const benchLabel = PR_LABELS.find((entry) => entry.name === 'elanous:bench')!.name;
|
|
@@ -556,8 +589,7 @@ export async function supersedeDraftsOnMerge(input: {
|
|
|
556
589
|
try {
|
|
557
590
|
// Label first: a failed label write must never strand a closed, unlabelled PR outside open-draft sweeps.
|
|
558
591
|
if (!draft.labels.includes(supersededLabel)) await adapters.setLabels(repository, draft.number, { add: supersededLabel, remove });
|
|
559
|
-
await adapters
|
|
560
|
-
`Draft sweep: superseded-by #${merged.number} (https://github.com/${repository}/pull/${merged.number}). Branch preserved.`);
|
|
592
|
+
await closeSweptDraft(adapters, repository, draft.number, decision.reason);
|
|
561
593
|
closed.push(draft.number);
|
|
562
594
|
} catch (failure) {
|
|
563
595
|
kept.push(draft.number);
|
|
@@ -769,6 +801,13 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
769
801
|
let unobserved = 0;
|
|
770
802
|
let claimed = 0;
|
|
771
803
|
let claimExpired = 0;
|
|
804
|
+
const lineageCounts: DraftSweepLineageCounts = { closed: 0, harvestableClosed: 0, fallThrough: {} };
|
|
805
|
+
result.lineage = lineageCounts;
|
|
806
|
+
// Review posture for the harvestable lineage check, reusing the census lookups (one lookup per PR per tick).
|
|
807
|
+
const postureFor = async (pr: SweepDraft): Promise<SweepReviewGate | undefined> => {
|
|
808
|
+
if (!reviewGate.has(pr.number)) reviewGate.set(pr.number, await adapters.getReviewGate!(pr, repository));
|
|
809
|
+
return reviewGate.get(pr.number);
|
|
810
|
+
};
|
|
772
811
|
for (const listedDraft of drafts) {
|
|
773
812
|
const draft = { ...listedDraft, labels: [...listedDraft.labels], latestFileChanges: latestFileChanges.get(listedDraft.number) };
|
|
774
813
|
let releasedThisTick = false;
|
|
@@ -882,7 +921,10 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
882
921
|
? (now.getTime() - Date.parse(draft.updatedAt)) / 3_600_000 : NaN;
|
|
883
922
|
// A newer open draft of the same goal lineage (a rerun, e.g. a forced requeue) supersedes this one even when
|
|
884
923
|
// its running claim is fresh or its run is still live. Holds, merged twins and the title-based duplicate rule keep their priority.
|
|
885
|
-
|
|
924
|
+
// DRAFT-SWEEP-LINEAGE-HARVESTABLE (10-12): a harvestable draft is no longer skipped — the skip left 70+ harvestable
|
|
925
|
+
// reruns open until the 24h idle expiry. It is still protected when its own review passed and the newer one's did not.
|
|
926
|
+
const harvestable = draft.labels.includes(harvestableLabel);
|
|
927
|
+
const lineageNewer = contradiction ? undefined : newerLineageDraft(draft, drafts);
|
|
886
928
|
if (lineageNewer) {
|
|
887
929
|
const base = decideDraft({ draft, runStatus, mergedTwins: merged, openDrafts: drafts, liveBranches,
|
|
888
930
|
finalRunResult, ageHours: runStatus ? ageHours : idleHours });
|
|
@@ -895,9 +937,24 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
895
937
|
// Every lineage outcome that does not close falls through to the existing rules (preservation contract):
|
|
896
938
|
// a duplicate this rule cannot settle is decided exactly as it was before this rule existed.
|
|
897
939
|
const fallThrough = (why: string) => {
|
|
898
|
-
|
|
940
|
+
lineageCounts.fallThrough[why] = (lineageCounts.fallThrough[why] ?? 0) + 1;
|
|
941
|
+
try { debug.log('self-dev.draft-sweep', 'lineage-fall-through', { number: draft.number, newer: lineageNewer.number, lineageKey, why, harvestable }); } catch { /* fail-soft */ }
|
|
899
942
|
};
|
|
900
|
-
|
|
943
|
+
// A harvestable draft yields only to a newer draft at least as complete: an observed review PASS on the old one
|
|
944
|
+
// is kept unless the newer one passed review too. Unobservable review posture keeps the old draft (fail-closed).
|
|
945
|
+
let harvestProtection: string | undefined;
|
|
946
|
+
if (harvestable) {
|
|
947
|
+
if (!adapters.getReviewGate) harvestProtection = 'lineage-harvestable-review-unobserved';
|
|
948
|
+
else {
|
|
949
|
+
try {
|
|
950
|
+
const [oldPosture, newPosture] = [await postureFor(draft), await postureFor(lineageNewer)];
|
|
951
|
+
if (oldPosture === undefined) harvestProtection = 'lineage-harvestable-review-unobserved';
|
|
952
|
+
else if (reviewPassed(oldPosture) && !reviewPassed(newPosture)) harvestProtection = 'lineage-harvestable-review-pass-protected';
|
|
953
|
+
} catch { harvestProtection = 'lineage-harvestable-review-unobserved'; }
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
if (harvestProtection) fallThrough(harvestProtection);
|
|
957
|
+
else if (runLive && !adapters.supersedeRun) fallThrough('lineage-duplicate-run-live');
|
|
901
958
|
// Safety (OP 10-11): a live run is stopped only when the newer run of the same lineage is itself live —
|
|
902
959
|
// never trade a running attempt for one that already ended or was never observed running.
|
|
903
960
|
else if (runLive && !live(statuses.get(lineageNewer.number), lineageNewer.branch)) fallThrough('lineage-newer-run-not-live');
|
|
@@ -921,6 +978,8 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
921
978
|
else {
|
|
922
979
|
// A close is counted against the cap only once it is decided here; a failed write gives the slot back.
|
|
923
980
|
closes += 1;
|
|
981
|
+
lineageCounts.closed += 1;
|
|
982
|
+
if (harvestable) lineageCounts.harvestableClosed += 1;
|
|
924
983
|
const entry: DraftSweepEntry = { number: draft.number, action: 'close', reason, statusLabel: supersededLabel, applied: false };
|
|
925
984
|
record(entry);
|
|
926
985
|
if (!apply) continue;
|
|
@@ -932,12 +991,15 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
932
991
|
});
|
|
933
992
|
labelsChanged = true;
|
|
934
993
|
}
|
|
935
|
-
await adapters
|
|
936
|
-
`Draft sweep: ${reason} (https://github.com/${repository}/pull/${lineageNewer.number}). Branch preserved.`);
|
|
994
|
+
await closeSweptDraft(adapters, repository, draft.number, reason, () => { labelsChanged = true; });
|
|
937
995
|
entry.applied = true;
|
|
938
996
|
} catch (error) {
|
|
939
997
|
if (labelsChanged) entry.partialApplied = true;
|
|
940
|
-
else
|
|
998
|
+
else {
|
|
999
|
+
closes -= 1;
|
|
1000
|
+
lineageCounts.closed -= 1;
|
|
1001
|
+
if (harvestable) lineageCounts.harvestableClosed -= 1;
|
|
1002
|
+
}
|
|
941
1003
|
entry.error = String(error);
|
|
942
1004
|
}
|
|
943
1005
|
continue;
|
|
@@ -988,11 +1050,10 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
988
1050
|
if (!apply || action !== 'close') continue;
|
|
989
1051
|
let labelsChanged = false;
|
|
990
1052
|
try {
|
|
991
|
-
|
|
1053
|
+
await adapters.getClaimOwner?.(repository, draft.number);
|
|
992
1054
|
await adapters.setLabels(repository, draft.number, { add: stalledLabel, remove: [runningLabel] });
|
|
993
1055
|
labelsChanged = true;
|
|
994
|
-
await adapters
|
|
995
|
-
`Draft sweep: 처리 중 표식이 ${CLAIM_IDLE_HOURS}시간 갱신 없음 — ${runStatus === 'self-implement.result final' ? 'self-implement.result final · 남은 워크트리는 live 아님' : '런·워크트리 없음'} · 주인 ${owner}. Closed as stalled. Branch preserved; reopen to restore.`);
|
|
1056
|
+
await closeSweptDraft(adapters, repository, draft.number, entry.reason, () => { labelsChanged = true; });
|
|
996
1057
|
entry.applied = true;
|
|
997
1058
|
} catch (error) {
|
|
998
1059
|
if (labelsChanged) entry.partialApplied = true;
|
|
@@ -1038,12 +1099,7 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
1038
1099
|
labelsChanged = true;
|
|
1039
1100
|
}
|
|
1040
1101
|
if (action === 'close') {
|
|
1041
|
-
await adapters
|
|
1042
|
-
? `Draft sweep: run unobserved — no run record reachable here, no host worktree for this branch, idle ≥${STALLED_DRAFT_HOURS}h. Closed as stalled. Branch preserved; reopen to restore.`
|
|
1043
|
-
: decision.reason === 'harvest-expired'
|
|
1044
|
-
? `Draft sweep: harvest-expired — 종단이 수확 대상으로 표시한 뒤 ${STALLED_DRAFT_HOURS}h 동안 수확 없음. Branch preserved; reopen to restore.`
|
|
1045
|
-
: `Draft sweep: ${decision.reason}${decision.reason.startsWith('superseded-by #')
|
|
1046
|
-
? ` (https://github.com/${repository}/pull/${decision.reason.slice('superseded-by #'.length).match(/^\d+/)![0]})` : ''}. Branch preserved.`);
|
|
1102
|
+
await closeSweptDraft(adapters, repository, draft.number, reason, () => { labelsChanged = true; });
|
|
1047
1103
|
}
|
|
1048
1104
|
entry.applied = labelsChanged || action === 'close';
|
|
1049
1105
|
} catch (error) {
|
|
@@ -1052,6 +1108,7 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
1052
1108
|
}
|
|
1053
1109
|
}
|
|
1054
1110
|
timing('decide', drafts.length);
|
|
1111
|
+
try { debug.log('self-dev.draft-sweep', 'lineage-summary', { ...lineageCounts, apply }); } catch { /* fail-soft */ }
|
|
1055
1112
|
try { debug.log('self-dev.draft-sweep', 'timing', { phase: 'total', ms: Date.now() - started, count: drafts.length, closed: closes, closeCap, closeCapSource }); } catch { /* fail-soft */ }
|
|
1056
1113
|
result.unobserved = unobserved;
|
|
1057
1114
|
// `closed` stays «closed by this sweep»; replay closes only consume the shared cap (alreadyClosed).
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { tierModel } from '../llm/model-defaults.js';
|
|
2
1
|
import { statSync } from 'node:fs';
|
|
3
2
|
import { resolve, sep } from 'node:path';
|
|
4
3
|
import {
|
|
@@ -9,6 +8,7 @@ import {
|
|
|
9
8
|
} from '../autopilot/mission-rfc-author.js';
|
|
10
9
|
import {
|
|
11
10
|
DEFAULT_MAX_TASKS,
|
|
11
|
+
decomposeModel,
|
|
12
12
|
decomposeSelfDevGoal,
|
|
13
13
|
type SelfDevDecomposeLlm,
|
|
14
14
|
type SelfDevDecomposeOptions,
|
|
@@ -70,9 +70,16 @@ export type FabricDecomposeRequestResult =
|
|
|
70
70
|
| { status: 'grounding-failed'; message: string; cause: unknown }
|
|
71
71
|
| { status: 'grounding-empty'; message: string; grounding: GoalAuthoringGroundingResult };
|
|
72
72
|
|
|
73
|
+
/**
|
|
74
|
+
* Default fabric resolve seam — lazy `streamLLM` wire. The model comes from the
|
|
75
|
+
* shared planning-role selector `decomposeModel` (src/self-dev/decompose.ts),
|
|
76
|
+
* so the review env `ELANOUS_PR_REVIEW_MODEL` cannot retarget fabric
|
|
77
|
+
* decomposition (ROLE-RELAY-SPLIT).
|
|
78
|
+
*/
|
|
73
79
|
async function defaultFabricResolve(prompt: string): Promise<string> {
|
|
74
80
|
const { streamLLM } = await import('../llm.js');
|
|
75
|
-
const model
|
|
81
|
+
const { model, source } = decomposeModel();
|
|
82
|
+
debug.log('self-dev.decompose', 'model', { model, source });
|
|
76
83
|
return streamLLM([{ role: 'user', content: prompt }], () => {}, { model, reasoningEffort: 'low' });
|
|
77
84
|
}
|
|
78
85
|
|
|
@@ -23,6 +23,7 @@ import { parentUnlandedProgressLine } from './run-supervisor.js';
|
|
|
23
23
|
import { mkdirSync, openSync, writeFileSync, closeSync, renameSync, unlinkSync } from 'node:fs';
|
|
24
24
|
import { join, resolve } from 'node:path';
|
|
25
25
|
import { goalPathFromArgv, launchRegistryDir, removeLaunchBinding, writeLaunchBinding } from '../harness/launch-registry.js';
|
|
26
|
+
import { psProcessStartMs } from '../harness/harness-stop.js';
|
|
26
27
|
import { adoptRunCard } from '../task-agent/run-adopt.js';
|
|
27
28
|
import { availableParallelism, cpus } from 'node:os';
|
|
28
29
|
import { selfDevRunsDir } from './run-store.js';
|
|
@@ -912,12 +913,15 @@ async function deleteLabelledJobs(runId: string, selectedTargets: readonly { con
|
|
|
912
913
|
* take minutes before that, and a stop in that window found «no process» (10-01 · three runs). */
|
|
913
914
|
export function writeRunPidRecord(runId: string, runsDir: string = selfDevRunsDir(), registryDir: string | null = launchRegistryDir()): string {
|
|
914
915
|
const pidPath = join(runsDir, runId, 'pid.json');
|
|
916
|
+
// The observer reads `ps -o lstart=`, whose precision is one second. Record that same
|
|
917
|
+
// process birth value when available so a launch near a second boundary still matches.
|
|
918
|
+
const startedAt = psProcessStartMs(process.pid) ?? Date.now() - Math.floor(process.uptime() * 1000);
|
|
915
919
|
mkdirSync(join(runsDir, runId), { recursive: true });
|
|
916
920
|
const temporary = `${pidPath}.${process.pid}.${randomUUID()}.tmp`;
|
|
917
921
|
const fd = openSync(temporary, 'wx', 0o600);
|
|
918
922
|
try {
|
|
919
923
|
try {
|
|
920
|
-
writeFileSync(fd, JSON.stringify({ pid: process.pid, startedAt
|
|
924
|
+
writeFileSync(fd, JSON.stringify({ pid: process.pid, startedAt, argv0: process.argv0 }));
|
|
921
925
|
} finally { closeSync(fd); }
|
|
922
926
|
renameSync(temporary, pidPath);
|
|
923
927
|
} catch (error) { unlinkSync(temporary); throw error; }
|
|
@@ -925,7 +929,7 @@ export function writeRunPidRecord(runId: string, runsDir: string = selfDevRunsDi
|
|
|
925
929
|
if (registryDir !== null) {
|
|
926
930
|
const cwd = process.cwd();
|
|
927
931
|
const goalPath = goalPathFromArgv(process.argv, cwd);
|
|
928
|
-
writeLaunchBinding(runId, { pid: process.pid, startedAt
|
|
932
|
+
writeLaunchBinding(runId, { pid: process.pid, startedAt, argv0: process.argv0,
|
|
929
933
|
cwd, ...(goalPath ? { goalPath } : {}), runsDir: resolve(runsDir),
|
|
930
934
|
...(process.env.ELANOUS_POD_NAME ? { podName: process.env.ELANOUS_POD_NAME } : {}),
|
|
931
935
|
...(process.env.ELANOUS_TASK_CARD_ID ? { taskCardId: process.env.ELANOUS_TASK_CARD_ID } : {}) }, registryDir);
|