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,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HOST-REGATE-REASON-LOST (2nd · 2026-10-12): a host-regate failure must say «why» on the ledger.
|
|
3
|
+
*
|
|
4
|
+
* The first repair (#26215) put `hostRegateFailure` on the pr-terminal row but kept only the first 300 characters,
|
|
5
|
+
* and the gate's own `run()` cut every git/gh error to its first 300 characters as well. A git merge lists one
|
|
6
|
+
* `CONFLICT` line per file and gh puts the GraphQL reason at the end, so a head cut loses exactly the cause
|
|
7
|
+
* (run-caaf045f · PR #26472: the autopsy could not tell a conflict from a gate failure).
|
|
8
|
+
*
|
|
9
|
+
* The detail is bounded (ledger rows are append-only and replayed) but keeps both ends.
|
|
10
|
+
*/
|
|
11
|
+
export const HOST_REGATE_DETAIL_MAX = 4096;
|
|
12
|
+
|
|
13
|
+
/** Keep `text` within `max` characters, preserving its head (an eighth) and its tail (the rest). */
|
|
14
|
+
export function clipRegateDetail(text: string, max = HOST_REGATE_DETAIL_MAX): string {
|
|
15
|
+
if (text.length <= max) return text;
|
|
16
|
+
const marker = ` …[${text.length - max} chars elided]… `;
|
|
17
|
+
const head = Math.floor(max / 8);
|
|
18
|
+
const tail = Math.max(0, max - head - marker.length);
|
|
19
|
+
return text.slice(0, head) + marker + text.slice(text.length - tail);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Files named by `git merge` CONFLICT lines (`CONFLICT (content): Merge conflict in <path>` and the rename/delete forms). */
|
|
23
|
+
export function parseConflictFiles(text: string): string[] {
|
|
24
|
+
const files = new Set<string>();
|
|
25
|
+
for (const raw of text.split('\n')) {
|
|
26
|
+
const line = /^CONFLICT \(([^)]*)\): (.*)$/.exec(raw);
|
|
27
|
+
if (!line) continue;
|
|
28
|
+
const rest = line[2]!;
|
|
29
|
+
const inPath = /Merge conflict in (.+)$/.exec(rest);
|
|
30
|
+
// modify/delete · rename/delete · file/directory name the path first; other free text is not a path.
|
|
31
|
+
const path = inPath ? inPath[1] : /^(?:modify\/delete|rename\/delete)$/.test(line[1]!)
|
|
32
|
+
? /^(.+?) (?:deleted|renamed) in /.exec(rest)?.[1]
|
|
33
|
+
: undefined;
|
|
34
|
+
if (path) files.add(path);
|
|
35
|
+
}
|
|
36
|
+
return [...files].sort();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type MergeFailureKind = 'base-modified' | 'head-moved' | 'conflict' | 'branch-policy' | 'other';
|
|
40
|
+
|
|
41
|
+
/** Classify a `gh pr merge` failure so a reader can tell a race from a conflict from a policy block without the raw text. */
|
|
42
|
+
export function classifyMergeFailure(detail: string, expectedHead?: string, actualHead?: string | null): MergeFailureKind {
|
|
43
|
+
if (/base branch was modified/i.test(detail)) return 'base-modified';
|
|
44
|
+
if (/head branch was modified/i.test(detail)) return 'head-moved';
|
|
45
|
+
if (expectedHead && actualHead && expectedHead !== actualHead) return 'head-moved';
|
|
46
|
+
if (/required status|review is required|protected branch|branch policy|not authorized|merge queue/i.test(detail)) return 'branch-policy';
|
|
47
|
+
if (/\bconflicts?\b/i.test(detail) && !/\bno conflicts?\b/i.test(detail)) return 'conflict';
|
|
48
|
+
return 'other';
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** One host-regate failure. The optional facts are filled for the pr-head, merge-conflict and merge steps. */
|
|
52
|
+
export interface HostRegateFailure {
|
|
53
|
+
step: string;
|
|
54
|
+
detail: string;
|
|
55
|
+
expectedHead?: string;
|
|
56
|
+
actualHead?: string | null;
|
|
57
|
+
conflictFiles?: string[];
|
|
58
|
+
/** Number omitted from conflictFiles when the ledger's 200-path bound is reached. */
|
|
59
|
+
conflictFilesOmitted?: number;
|
|
60
|
+
mergeFailureKind?: MergeFailureKind;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** The optional facts of a failure, copied only when well-formed (ledger rows come back from disk). */
|
|
64
|
+
export function regateFailureFacts(failure: unknown): Omit<HostRegateFailure, 'step' | 'detail'> {
|
|
65
|
+
if (!failure || typeof failure !== 'object') return {};
|
|
66
|
+
const f = failure as Record<string, unknown>;
|
|
67
|
+
const sha = (value: unknown): value is string => typeof value === 'string' && /^[0-9a-f]{40}$/i.test(value);
|
|
68
|
+
const kinds: readonly MergeFailureKind[] = ['base-modified', 'head-moved', 'conflict', 'branch-policy', 'other'];
|
|
69
|
+
const conflictFiles = Array.isArray(f.conflictFiles) ? f.conflictFiles.filter((p): p is string => typeof p === 'string') : undefined;
|
|
70
|
+
const priorOmitted = Number.isSafeInteger(f.conflictFilesOmitted) && (f.conflictFilesOmitted as number) > 0 ? f.conflictFilesOmitted as number : 0;
|
|
71
|
+
const conflictFilesOmitted = Math.max(0, (conflictFiles?.length ?? 0) - 200) + priorOmitted;
|
|
72
|
+
return {
|
|
73
|
+
...(sha(f.expectedHead) ? { expectedHead: f.expectedHead } : {}),
|
|
74
|
+
...(sha(f.actualHead) || f.actualHead === null ? { actualHead: f.actualHead as string | null } : {}),
|
|
75
|
+
...(conflictFiles ? { conflictFiles: conflictFiles.slice(0, 200) } : {}),
|
|
76
|
+
...(conflictFilesOmitted > 0 ? { conflictFilesOmitted } : {}),
|
|
77
|
+
...(typeof f.mergeFailureKind === 'string' && kinds.includes(f.mergeFailureKind as MergeFailureKind) ? { mergeFailureKind: f.mergeFailureKind as MergeFailureKind } : {}),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// REVIEW-ACP-POD ②-b — Pod 안 리뷰를 «호스트 리뷰로 미룸».
|
|
2
|
+
//
|
|
3
|
+
// S ②-a(#26457)로 호스트가 Pod merge-ready PR 을 Claude ACP 로 리뷰한다. 그런데 Pod 안 하니스 리뷰는 그대로 api 로 돌아
|
|
4
|
+
// 켜면 리뷰가 «둘»(돈 두 번)이다.
|
|
5
|
+
// C 오케스트레이터는 «실제 리뷰»(`reviewed=true`)가 있어야 merge-ready 를 낸다 — 그냥 끄면 `no-real-review` 로 멎는다.
|
|
6
|
+
// Q Pod 안 리뷰를 어떻게 «정직하게» 비우나?
|
|
7
|
+
// A 발사 호스트가 ACP 리뷰를 맡을 때만 자식 env 에 표지를 싣는다. 자식은 api 리뷰를 부르지 않고
|
|
8
|
+
// `reviewed=false` ⊕ `failureReason=deferred-to-host` 를 낸다(⛔ verdict 를 clean 으로 꾸미지 않는다).
|
|
9
|
+
// 오케스트레이터는 «호스트 병합(mergeByHost)» 런에서만 그 상태를 merge-ready 로 받고 `mergeReason` 에 적어 호스트로 돌려보낸다.
|
|
10
|
+
// 호스트는 그 표지를 보면 ACP 리뷰를 «반드시» 하고, 못 하면(refused) 병합하지 않는다(fail-closed).
|
|
11
|
+
|
|
12
|
+
/** 발사 호스트 → Pod 자식: 「리뷰는 호스트가 Claude ACP 로 한다 — Pod 안 api 리뷰를 부르지 마라」. 값 `1` 만 켠다. */
|
|
13
|
+
export const REVIEW_DEFERRED_TO_HOST_ENV = 'ELANOUS_REVIEW_DEFERRED_TO_HOST';
|
|
14
|
+
/** 미룬 리뷰의 `failureReason`(`reviewed=false` 의 «왜»). */
|
|
15
|
+
export const REVIEW_DEFERRED_TO_HOST_FAILURE = 'deferred-to-host';
|
|
16
|
+
/** 자식 merge-ready 결과의 `mergeReason` — 호스트가 이 값으로 «Pod 리뷰 없음»을 안다. */
|
|
17
|
+
export const REVIEW_DEFERRED_TO_HOST_MERGE_REASON = 'review-deferred-to-host';
|
|
18
|
+
|
|
19
|
+
export function reviewDeferredToHostFromEnv(env: Readonly<Record<string, string | undefined>>): boolean {
|
|
20
|
+
return env[REVIEW_DEFERRED_TO_HOST_ENV]?.trim() === '1';
|
|
21
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { executeClassifyNode } from '../workflow-runtime/nodes/classify.js';
|
|
2
|
+
import { buildPremiseCard, type PremiseReviewCard, type PremiseReviewInput } from './premise-review.js';
|
|
2
3
|
import { SUPERVISION_REWORK_SOURCES, type SupervisionReworkSource } from './supervision-vocabulary.js';
|
|
3
4
|
import type { ClassifyNode, JudgmentContext, JudgmentResult, NodeExecContext, WorkflowDefinition, WorkflowDeps } from '../workflow-runtime/types.js';
|
|
4
5
|
|
|
@@ -22,6 +23,8 @@ interface ObservedValue {
|
|
|
22
23
|
interface ReworkBudgetEvidence {
|
|
23
24
|
observations: Record<'goal' | 'outcome' | 'history' | 'kind', ObservedValue>;
|
|
24
25
|
modelReasoning: string;
|
|
26
|
+
/** UNCONVERGEABLE 직전에 세운 premise-review 카드(FLEX-RFC §A-③). 카드를 안 만든 판정에는 키가 없다. */
|
|
27
|
+
premiseReview?: PremiseReviewCard | undefined;
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
type EvidencedJudgmentResult = JudgmentResult & { evidence: ReworkBudgetEvidence };
|
|
@@ -108,7 +111,13 @@ export function reworkBudgetEvidenceForObservation(readEvidence: () => unknown):
|
|
|
108
111
|
}
|
|
109
112
|
}
|
|
110
113
|
|
|
111
|
-
|
|
114
|
+
/** `createReworkBudgetJudgment` 의 선택 인자 — 주지 않으면 카드 없이 지금 동작 그대로. */
|
|
115
|
+
export interface ReworkBudgetJudgmentOpts {
|
|
116
|
+
/** UNCONVERGEABLE 판정 직전에 세울 premise-review 카드의 입력(값 객체). */
|
|
117
|
+
premiseInput?: PremiseReviewInput | undefined;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function createReworkBudgetJudgment(callLLM: WorkflowDeps['callLLM'], opts: ReworkBudgetJudgmentOpts = {}) {
|
|
112
121
|
let latestEvidence: ReworkBudgetEvidence | undefined;
|
|
113
122
|
const provider = async (contractId: string, ctx: JudgmentContext): Promise<JudgmentResult> => {
|
|
114
123
|
if (contractId !== REWORK_BUDGET_JUDGMENT) {
|
|
@@ -145,6 +154,7 @@ export function createReworkBudgetJudgment(callLLM: WorkflowDeps['callLLM']) {
|
|
|
145
154
|
toolPolicy: {},
|
|
146
155
|
};
|
|
147
156
|
let modelReasoning = '';
|
|
157
|
+
let premiseReview: PremiseReviewCard | undefined;
|
|
148
158
|
const result = await executeClassifyNode(node, execContext, {
|
|
149
159
|
callLLM: async (args) => {
|
|
150
160
|
modelReasoning = await callLLM(args);
|
|
@@ -152,7 +162,11 @@ export function createReworkBudgetJudgment(callLLM: WorkflowDeps['callLLM']) {
|
|
|
152
162
|
},
|
|
153
163
|
runBash: async () => ({ stdout: '', stderr: '', exitCode: 0 }),
|
|
154
164
|
});
|
|
155
|
-
const evidence = (): ReworkBudgetEvidence => ({
|
|
165
|
+
const evidence = (): ReworkBudgetEvidence => ({
|
|
166
|
+
observations,
|
|
167
|
+
modelReasoning,
|
|
168
|
+
...(premiseReview === undefined ? {} : { premiseReview }),
|
|
169
|
+
});
|
|
156
170
|
const evidenced = (judgment: JudgmentResult): EvidencedJudgmentResult => {
|
|
157
171
|
const resultWithEvidence = withEvidence(judgment, evidence());
|
|
158
172
|
latestEvidence = resultWithEvidence.evidence;
|
|
@@ -172,7 +186,13 @@ export function createReworkBudgetJudgment(callLLM: WorkflowDeps['callLLM']) {
|
|
|
172
186
|
+ ` expected one of EXTEND|SUFFICIENT|UNCONVERGEABLE`,
|
|
173
187
|
});
|
|
174
188
|
}
|
|
175
|
-
|
|
189
|
+
const verdict = mapReworkBudgetVerdict(picked, kind);
|
|
190
|
+
// FLEX-RFC §A-③ — UNCONVERGEABLE 을 «내기 전에» 전제를 되짚는다. 카드는 기존 증거 관측에 실려
|
|
191
|
+
// 원장('rework-budget' 사건)으로 나간다 — 사건 형식은 그대로, 카드는 증거 안의 추가 칸이다.
|
|
192
|
+
if (picked === 'UNCONVERGEABLE' && opts.premiseInput !== undefined) {
|
|
193
|
+
premiseReview = buildPremiseCard(opts.premiseInput);
|
|
194
|
+
}
|
|
195
|
+
return evidenced({ ok: true, output: picked, verdict });
|
|
176
196
|
};
|
|
177
197
|
return Object.assign(provider, { evidenceForObservation: () => latestEvidence });
|
|
178
198
|
}
|
|
@@ -566,7 +566,7 @@ export function queryRunningRuns(options: { includeTest?: boolean; runIds?: read
|
|
|
566
566
|
}
|
|
567
567
|
}
|
|
568
568
|
|
|
569
|
-
function isPartialRunningRuns(result: RunningRunsResult): boolean {
|
|
569
|
+
export function isPartialRunningRuns(result: RunningRunsResult): boolean {
|
|
570
570
|
return (result.count !== undefined && typeof result.count !== 'number' && result.count.count === null)
|
|
571
571
|
|| result.completeness === 'partial' || hasUnreadableLedgerObservation(result.ledger) || (result.unreadable?.length ?? 0) > 0;
|
|
572
572
|
}
|
|
@@ -624,7 +624,7 @@ function formatElapsed(ms: number): string {
|
|
|
624
624
|
export function renderRunProgressTable(result: RunningRunsResult, nowMs: number = Date.now()): string {
|
|
625
625
|
const partial = isPartialRunningRuns(result);
|
|
626
626
|
const header = partial
|
|
627
|
-
? `부분 관측 — 최소 ${runningRunsLowerBound(result)} (읽지 못한 원장: ${runningRunsUnreadable(result).map((item) => `${item.dir}:${item.reason}`).join(',') || '
|
|
627
|
+
? `부분 관측 — 최소 ${runningRunsLowerBound(result)} (읽지 못한 원장: ${runningRunsUnreadable(result).map((item) => `${item.dir}:${item.reason}`).join(',') || '목록 미관측'})`
|
|
628
628
|
: `도는 런 ${result.counts.running + result.counts['probable-running']} (확인 ${result.counts.running} · 추정 ${result.counts['probable-running']})`;
|
|
629
629
|
const rows = buildRunProgressRows(result, nowMs).map((row) => {
|
|
630
630
|
const phaseUnreadable = row.phaseObservation === 'unreadable' || row.phaseObservation === 'partially-unreadable';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// SCOPE-HELD-DELIVER (0.2.25) — which out-of-scope edits sit right next to a declared target.
|
|
2
|
+
// 10-11~12: 34 scope-held runs auto-answered «Stay in scope» after 30 unanswered minutes and threw away finished work;
|
|
3
|
+
// the outside files were a declared file's same-folder neighbours (its other tests, a sibling helper, the folder's
|
|
4
|
+
// plugin.json). Those are adjacent: the run goes on to its gate instead of parking on a question nobody answers.
|
|
5
|
+
|
|
6
|
+
const normalize = (path: string): string => path.replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/+$/, '');
|
|
7
|
+
const dirOf = (path: string): string => { const at = path.lastIndexOf('/'); return at < 0 ? '' : path.slice(0, at); };
|
|
8
|
+
|
|
9
|
+
/** Split out-of-scope files into those adjacent to a declared target and the rest. A file is adjacent when it sits in
|
|
10
|
+
* the same folder as a declared file. A declared folder adds nothing (its contents are already in scope), and a
|
|
11
|
+
* declared repo-root file adds nothing (the root holds the whole repo's config). */
|
|
12
|
+
export function classifyOutOfScope(outsideFiles: readonly string[], declaredPaths: readonly string[]): { adjacent: string[]; other: string[] } {
|
|
13
|
+
const folders = new Set<string>();
|
|
14
|
+
for (const declared of declaredPaths.map(normalize)) {
|
|
15
|
+
const dir = dirOf(declared);
|
|
16
|
+
// A path with an extension names a file; without one it names a folder.
|
|
17
|
+
if (dir && /\.[A-Za-z0-9]+$/.test(declared.slice(dir.length + 1))) folders.add(dir);
|
|
18
|
+
}
|
|
19
|
+
const adjacent: string[] = [];
|
|
20
|
+
const other: string[] = [];
|
|
21
|
+
for (const file of outsideFiles) (folders.has(dirOf(normalize(file))) ? adjacent : other).push(file);
|
|
22
|
+
return { adjacent, other };
|
|
23
|
+
}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
import { fileURLToPath } from 'node:url';
|
|
16
16
|
import { judgePredictionAccuracy, mustFixTrendFromHistory, renderJudgeOwnSignals, renderJudgePredictionAccuracy } from './judge-prediction-accuracy.js';
|
|
17
17
|
import { isElanousRuntimeArtifactPath } from './gate-scope.js';
|
|
18
|
+
import { buildPrConclusionCard, firstParagraphOf, prConclusionCardHeader } from '../context-card/index.js';
|
|
18
19
|
import { spawn, spawnSync, execFile } from 'node:child_process';
|
|
19
20
|
import { randomUUID, timingSafeEqual } from 'node:crypto';
|
|
20
21
|
import { existsSync, lstatSync, mkdtempSync, readFileSync, realpathSync, rmSync, statSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
@@ -71,6 +72,7 @@ import { ghAutomationEnv, makePrManager, type PrManager } from '../autopilot/pr-
|
|
|
71
72
|
import { defaultSpawnGh, lookupOpenDraftPrs } from '../cli/logs-abandoned-draft-prs.js';
|
|
72
73
|
import { loadRunLedger, runLedgerDir } from './run-ledger.js';
|
|
73
74
|
import { readdirSync } from 'node:fs';
|
|
75
|
+
import { REVIEW_DEFERRED_TO_HOST_FAILURE } from './review-deferred-to-host.js';
|
|
74
76
|
import { budgetReviewerContext, reviewDiffBudgetObservation, reviewPullRequest, renderReview, type ReviewerContextItem } from '../agent-substrate/pr-reviewer.js';
|
|
75
77
|
import { buildReviewIntent, type ReviewIntentInput } from '../agent-substrate/review-intent.js';
|
|
76
78
|
import { OFF_DIFF_EVIDENCE_PROMPT, requiredEvidenceFromGoal, renderRequiredEvidencePrompt, tailWithOmissionMarker } from './off-diff-evidence.js';
|
|
@@ -849,16 +851,34 @@ export function changedFileTypecheck(
|
|
|
849
851
|
}
|
|
850
852
|
}
|
|
851
853
|
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
854
|
+
export interface PrBodyConclusionInput {
|
|
855
|
+
/** 결론줄 «포인터:» 에 붙일 원본 위치(원문 전문을 가리키는 참조). */
|
|
856
|
+
readonly pointers?: readonly string[];
|
|
857
|
+
/** 원문 본문을 읽지 못한 경우 — «결론: 확인 불가» 로 떨어진다. */
|
|
858
|
+
readonly unreadable?: boolean;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
/** RFC context-diet §3a — PR 본문 첫 단락을 «결론: <한 줄> · 포인터: <원본>» 결론줄로 앞세우고
|
|
862
|
+
* 원문 본문은 결론줄 아래 그대로 둔다(지우지 않는다). 결론이 없으면 «결론: 없음(원문에 결론 없음)». */
|
|
863
|
+
export function buildPrBody(cwd: string, body: string, conclusion?: PrBodyConclusionInput): string {
|
|
864
|
+
const card = buildPrConclusionCard({
|
|
865
|
+
id: 'pr-body-conclusion',
|
|
866
|
+
firstParagraph: firstParagraphOf(body),
|
|
867
|
+
...(conclusion?.unreadable ? { unreadable: true } : {}),
|
|
868
|
+
pointers: [...(conclusion?.pointers ?? [])],
|
|
869
|
+
source: 'pr-body',
|
|
870
|
+
updatedAt: new Date().toISOString(),
|
|
871
|
+
});
|
|
872
|
+
const header = prConclusionCardHeader(card);
|
|
856
873
|
const templatePath = join(cwd, '.github', 'pull_request_template.md');
|
|
857
|
-
|
|
858
|
-
const
|
|
859
|
-
return template ? `${template}\n\n${
|
|
874
|
+
const template = existsSync(templatePath) ? readFileSync(templatePath, 'utf8').trim() : '';
|
|
875
|
+
const withConclusion = `${header}\n\n${body}`;
|
|
876
|
+
return template ? `${template}\n\n${withConclusion}` : withConclusion;
|
|
860
877
|
}
|
|
861
878
|
|
|
879
|
+
/** 헤드리스 elanous 가 이 feature 를 구현하도록 주입하는 프롬프트. goal-loop 계약 + 검증된 클린-빌드
|
|
880
|
+
* 앵커(측정→운영·[[REPORT-gemma-goalloop-lever-2026-07-20]])를 명시. 앵커가 gemma 를 99 로 끌어올렸고
|
|
881
|
+
* 강한 모델엔 무해 — self-run 어느 provider 든 동일 규율. */
|
|
862
882
|
export function featurePrompt(feature: string, cwd?: string, reviewerContext?: readonly ReviewerContextItem[]): string {
|
|
863
883
|
const worktreeNotice = cwd?.trim()
|
|
864
884
|
? `작업 디렉토리는 \`${cwd}\`다. 이 트리 안에서만 편집하고, 경로가 필요하면 추측하지 말고 이 경로를 기준으로 삼아라.`
|
|
@@ -1063,6 +1083,9 @@ export interface DefaultSeamsOptions {
|
|
|
1063
1083
|
* ⛔ llmReview 시그니처는 그대로(prompt-in/text-out · 도구 채널 없음).
|
|
1064
1084
|
*/
|
|
1065
1085
|
reviewerCanSelfRead?: boolean;
|
|
1086
|
+
/** REVIEW-ACP-POD ②-b — 참이면 reviewDiff 가 리뷰어를 부르지 않고 `reviewed=false` ⊕ `failureReason=deferred-to-host` 를 낸다
|
|
1087
|
+
* (발사 호스트가 Claude ACP 로 리뷰한다). 기본 거짓 = 종전. */
|
|
1088
|
+
reviewDeferredToHost?: boolean;
|
|
1066
1089
|
/** CLI가 적재한 리뷰어 컨텍스트. 비어 있으면 기존 ReviewInput 형태를 유지한다. */
|
|
1067
1090
|
reviewerContext?: ReviewerContextItem[];
|
|
1068
1091
|
/** 기존 LLM HITL relay builder의 테스트 seam. 생성 실패 시 기본 dispatch를 그대로 유지한다. */
|
|
@@ -2587,6 +2610,18 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
2587
2610
|
...(o.reviewerCanSelfRead !== undefined ? { canSelfRead: o.reviewerCanSelfRead } : {}),
|
|
2588
2611
|
};
|
|
2589
2612
|
}
|
|
2613
|
+
if (o.reviewDeferredToHost) {
|
|
2614
|
+
// REVIEW-ACP-POD ②-b — 리뷰어 호출 0. ⛔ 통과로 꾸미지 않는다(reviewed=false) — 판정은 호스트 ACP 리뷰가 맡는다.
|
|
2615
|
+
debug.log('self-implement', 'review.done', {
|
|
2616
|
+
verdict: 'warn', reviewed: false, reason: REVIEW_DEFERRED_TO_HOST_FAILURE,
|
|
2617
|
+
...(ctx?.round !== undefined ? { round: ctx.round } : {}),
|
|
2618
|
+
});
|
|
2619
|
+
try { emitDecision(reviewDecision({ runId: ctx?.runId, verdict: 'warn', reviewed: false, reason: REVIEW_DEFERRED_TO_HOST_FAILURE })); } catch { /* observation must not change the review result */ }
|
|
2620
|
+
return {
|
|
2621
|
+
verdict: 'warn' as const, mustFix: [], shouldFix: [], summary: '(리뷰를 호스트 Claude ACP 리뷰로 미뤘다)', reviewed: false,
|
|
2622
|
+
failureReason: REVIEW_DEFERRED_TO_HOST_FAILURE, deferredToHost: true as const,
|
|
2623
|
+
};
|
|
2624
|
+
}
|
|
2590
2625
|
const intentInput = toReviewIntentInput(ctx);
|
|
2591
2626
|
const phaseIntent = intentInput ? buildReviewIntent(intentInput) : 'self-implement 변경 리뷰';
|
|
2592
2627
|
const evidenceNote = [
|
|
@@ -456,11 +456,36 @@ function parseGoals(req: SelfImplementRuntimeRequest): string[] | undefined {
|
|
|
456
456
|
return goals;
|
|
457
457
|
}
|
|
458
458
|
|
|
459
|
-
|
|
459
|
+
interface SelfImplementGoalResult {
|
|
460
|
+
goal: string;
|
|
461
|
+
status: SelfDevJobResult['status'];
|
|
462
|
+
runId?: string;
|
|
463
|
+
stage?: string;
|
|
464
|
+
reason?: string;
|
|
465
|
+
parentPrNumber?: number;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
function observedGoalResults(results: readonly SelfDevJobResult[]): SelfImplementGoalResult[] {
|
|
469
|
+
return results.map((result, index) => ({
|
|
470
|
+
goal: result.feature || `골 ${index + 1}`,
|
|
471
|
+
status: result.status,
|
|
472
|
+
...(result.runId ? { runId: result.runId } : {}),
|
|
473
|
+
...(result.stage ? { stage: result.stage } : {}),
|
|
474
|
+
...(result.error?.message || result.stopReason || result.blockReason
|
|
475
|
+
? { reason: result.error?.message || result.stopReason || (result.blockReason === 'parent-unlanded'
|
|
476
|
+
? result.parentPrNumber ? `선행 PR #${result.parentPrNumber} 미착지` : '선행 골 미착지'
|
|
477
|
+
: result.blockReason) }
|
|
478
|
+
: {}),
|
|
479
|
+
...(result.parentPrNumber ? { parentPrNumber: result.parentPrNumber } : {}),
|
|
480
|
+
}));
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
function formatOrchestrationResults(results: readonly SelfDevJobResult[], goals: readonly SelfImplementGoalResult[]): string {
|
|
460
484
|
const done = results.filter(result => result.status === 'done').length;
|
|
461
485
|
const merged = results.filter(result => result.merged).length;
|
|
462
486
|
const failed = results.filter(result => result.status === 'failed').length;
|
|
463
|
-
|
|
487
|
+
const summary = `[self-implement] parallel ${results.length} goal · done ${done}${merged ? ` (병합 ${merged})` : ''}${failed ? ` · 실패 ${failed}` : ''}`;
|
|
488
|
+
return [summary, ...goals.map(goal => `- ${goal.goal}: ${goal.status} · 런 ${goal.runId ?? '미관측'}${goal.stage ? ` · 단계 ${goal.stage}` : ''}${goal.reason ? ` · 이유 ${goal.reason}` : ''}`)].join('\n');
|
|
464
489
|
}
|
|
465
490
|
|
|
466
491
|
export function resolveDocumentReferences(paths: readonly string[], repositoryRoot = process.cwd()): DocumentReferenceStatus[] {
|
|
@@ -476,7 +501,15 @@ function documentReferenceStatusLines(references: readonly DocumentReferenceStat
|
|
|
476
501
|
|
|
477
502
|
function formatResult(feature: string, r: SelfImplementResult, references: readonly DocumentReferenceStatus[] = []): string {
|
|
478
503
|
const head = `[self-implement] ${r.stage}`;
|
|
479
|
-
const
|
|
504
|
+
const next = r.runId ? `eln self run ${r.runId}` : r.ok ? 'eln self running-runs' : '실패 이유를 확인한 뒤 다시 요청';
|
|
505
|
+
const lines: string[] = [
|
|
506
|
+
r.ok
|
|
507
|
+
? r.runId
|
|
508
|
+
? `하니스가 맡았습니다 · 런 ${r.runId} · 노드 ${r.node || '미관측'} · 다음 조회: ${next} · 이 턴에서 파일을 직접 편집하지 마세요`
|
|
509
|
+
: `하니스 응답을 받았지만 런 식별자는 아직 미관측입니다 · 진행 중 런 조회: ${next} · 일치하는 런이 없으면 요청을 다시 보내세요 · 이 턴에서 파일을 직접 편집하지 마세요`
|
|
510
|
+
: `하니스가 발사되지 않았거나 실패했습니다: ${r.detail ?? r.stage} · 다음: ${next} · 이 턴에서 파일을 직접 편집하지 마세요`,
|
|
511
|
+
head, ...documentReferenceStatusLines(references),
|
|
512
|
+
];
|
|
480
513
|
if (r.branch) lines.push(`branch: ${r.branch}`);
|
|
481
514
|
if (r.worktreePath) lines.push(`worktree: ${r.worktreePath}`);
|
|
482
515
|
if (r.stage === 'pr-opened' && r.prUrl) {
|
|
@@ -494,6 +527,12 @@ function formatResult(feature: string, r: SelfImplementResult, references: reado
|
|
|
494
527
|
export interface SelfImplementRunResult {
|
|
495
528
|
output: string;
|
|
496
529
|
ok: boolean;
|
|
530
|
+
kind: 'launched' | 'observed-only' | 'failed' | 'pending';
|
|
531
|
+
next?: string;
|
|
532
|
+
reason?: string;
|
|
533
|
+
missing?: string[];
|
|
534
|
+
/** 병렬 골마다 실제로 관측된 종료 상태·식별자·이유. */
|
|
535
|
+
goalResults?: SelfImplementGoalResult[];
|
|
497
536
|
// ⛔ 관측 전용 반환에는 **단계가 없다** — 아무 노드도 돌지 않았다. 없는 것을 있는 값으로 적으면
|
|
498
537
|
// «안 돌았다» 와 «어느 단계에서 끝났다» 가 같은 값이 된다(부재와 미지를 같은 값으로 적지 않는다).
|
|
499
538
|
stage?: SelfImplementResult['stage'];
|
|
@@ -506,8 +545,10 @@ export interface SelfImplementRunResult {
|
|
|
506
545
|
observed?: true;
|
|
507
546
|
/** 명시적 Fabric 분해의 상태·기존 3결말·미산출 사유. */
|
|
508
547
|
fabricDecomposition?: FabricDecompositionOutcome;
|
|
509
|
-
/**
|
|
548
|
+
/** 실제 런 결과에서 확인한 식별자. 선할당된 비동기 ID는 반환하지 않는다. */
|
|
510
549
|
runId?: string;
|
|
550
|
+
/** 비동기 요청 조회용 상관 ID. 발사된 런의 증거가 아니다. */
|
|
551
|
+
requestId?: string;
|
|
511
552
|
/** 호출이 블로킹인지 비블로킹인지. 기본 경로에는 없어 기존 반환 모양을 보존한다. */
|
|
512
553
|
invocationMode?: 'blocking' | 'non-blocking';
|
|
513
554
|
}
|
|
@@ -516,6 +557,7 @@ export const selfImplementRuntime: ToolRuntime<SelfImplementRuntimeRequest, Self
|
|
|
516
557
|
id: 'self_implement',
|
|
517
558
|
spec: buildSelfImplementSpec(),
|
|
518
559
|
async run(req, ctx: ToolRuntimeContext): Promise<SelfImplementRunResult> {
|
|
560
|
+
try {
|
|
519
561
|
const hasFeature = req.feature !== undefined;
|
|
520
562
|
const hasGoals = req.goals !== undefined;
|
|
521
563
|
if (hasFeature === hasGoals) {
|
|
@@ -604,7 +646,7 @@ export const selfImplementRuntime: ToolRuntime<SelfImplementRuntimeRequest, Self
|
|
|
604
646
|
if (observeOnly.enabled) {
|
|
605
647
|
const requestSummary = feature ?? goals!.join(' · ');
|
|
606
648
|
debug.log('self-implement', 'runtime.observed', { surface: ctx.surface, ...(feature ? { feature: feature.slice(0, 120) } : { goals: goals!.length }), observeOnly: observeOnly.enabled, observeOnlySource: observeOnly.source });
|
|
607
|
-
return { output:
|
|
649
|
+
return { output: `관측 전용이라 런을 발사하지 않았습니다 · 코드도 안 바꿨습니다 · 이 결과를 구현 실패로 읽고 직접 Write/Edit 하지 마세요. 실제 발사를 원하면 관측 전용 모드를 끈 뒤 다시 요청하세요: ${requestSummary.slice(0, 120)}${documentReferenceStatusLines(documentReferences).length ? `\n${documentReferenceStatusLines(documentReferences).join('\n')}` : ''}`, ok: true, kind: 'observed-only', observed: true, missing: ['runId', 'node'], next: '관측 전용 모드를 끈 뒤 다시 요청' };
|
|
608
650
|
}
|
|
609
651
|
|
|
610
652
|
const allocatedRunId = nonBlocking ? mintRunId() : undefined;
|
|
@@ -637,9 +679,14 @@ export const selfImplementRuntime: ToolRuntime<SelfImplementRuntimeRequest, Self
|
|
|
637
679
|
fabricDecomposition = fabricDecompositionOutcome(fabricResult);
|
|
638
680
|
observeFabricDecomposition(fabricDecomposition, ctx.surface, fabricResult.status === 'decomposed' ? fabricResult.goals.length : undefined);
|
|
639
681
|
if (fabricResult.status !== 'decomposed') {
|
|
682
|
+
const observedOnly = fabricDecomposition.outcome !== 'llm-failed';
|
|
640
683
|
return {
|
|
641
|
-
output: formatFabricDecompositionOutcome(fabricDecomposition)
|
|
642
|
-
ok:
|
|
684
|
+
output: `${formatFabricDecompositionOutcome(fabricDecomposition)}${observedOnly ? '\n관측 전용이라 런을 발사하지 않았습니다 · 코드도 안 바꿨습니다 · 이 결과를 구현 실패로 읽고 직접 Write/Edit 하지 마세요.' : '\n이 턴에서 파일을 직접 편집하지 마세요.'}`,
|
|
685
|
+
ok: observedOnly,
|
|
686
|
+
kind: observedOnly ? 'observed-only' : 'failed',
|
|
687
|
+
next: observedOnly ? '분해 결과를 확인하고 구현 골을 다시 요청' : '분해 실패 이유를 확인한 뒤 다시 요청',
|
|
688
|
+
missing: ['runId', 'node'],
|
|
689
|
+
...(observedOnly ? { observed: true as const } : { reason: formatFabricDecompositionOutcome(fabricDecomposition) }),
|
|
643
690
|
fabricDecomposition,
|
|
644
691
|
};
|
|
645
692
|
}
|
|
@@ -674,10 +721,40 @@ export const selfImplementRuntime: ToolRuntime<SelfImplementRuntimeRequest, Self
|
|
|
674
721
|
...(forwardedSupervise === undefined ? {} : { supervise: forwardedSupervise }),
|
|
675
722
|
...(deliverable === undefined ? {} : { deliverable }),
|
|
676
723
|
});
|
|
677
|
-
const
|
|
724
|
+
const goalResults = observedGoalResults(results);
|
|
725
|
+
const failedGoals = goalResults.filter(result => result.status === 'failed' || result.status === 'cancelled');
|
|
726
|
+
const blockedGoals = goalResults.filter(result => result.status === 'blocked');
|
|
727
|
+
const allRunsIdentified = goalResults.length > 0 && goalResults.every(result => result.runId);
|
|
728
|
+
const kind = goalResults.length === 0 || failedGoals.length > 0 || blockedGoals.length > 0 ? 'failed' : allRunsIdentified ? 'launched' : 'pending';
|
|
729
|
+
const parentBlockedPrNumbers = [...new Set(results.flatMap(result => result.status === 'blocked' && result.blockReason === 'parent-unlanded' && result.parentPrNumber ? [result.parentPrNumber] : []))];
|
|
730
|
+
const parentBlockedWithoutPr = results.some(result => result.status === 'blocked' && result.blockReason === 'parent-unlanded' && !result.parentPrNumber && !result.runId);
|
|
731
|
+
const otherFailureWithoutId = results.some(result => !result.runId && ['failed', 'cancelled', 'blocked'].includes(result.status) && result.blockReason !== 'parent-unlanded');
|
|
732
|
+
const runQueries = [...new Set(goalResults.flatMap(result => result.runId ? [`eln self run ${result.runId}`] : []))];
|
|
733
|
+
const availableQueries = [
|
|
734
|
+
...parentBlockedPrNumbers.map(pr => `eln gh pr view ${pr}`),
|
|
735
|
+
...runQueries,
|
|
736
|
+
];
|
|
737
|
+
const pendingWithoutId = goalResults.some(result => !result.runId && !['failed', 'cancelled', 'blocked'].includes(result.status));
|
|
738
|
+
const next = [
|
|
739
|
+
...availableQueries,
|
|
740
|
+
...(pendingWithoutId ? ['eln self running-runs', '일치하는 런이 없으면 ID 미확정 골을 다시 요청'] : []),
|
|
741
|
+
...(parentBlockedPrNumbers.length ? ['선행 PR 착지 뒤 차단된 골을 재실행하세요'] : []),
|
|
742
|
+
...(parentBlockedWithoutPr ? ['선행 골 상태를 확인한 뒤 해당 골을 재실행하세요'] : []),
|
|
743
|
+
...(otherFailureWithoutId ? ['실패·차단 이유를 확인한 뒤 해당 골을 다시 요청'] : []),
|
|
744
|
+
].join('\n') || '골 결과가 0건이라 상태를 확인한 뒤 다시 요청';
|
|
745
|
+
const reason = goalResults.length === 0
|
|
746
|
+
? '골 결과가 0건이라 상태 미관측'
|
|
747
|
+
: [...failedGoals, ...blockedGoals].map(result => `${result.goal}: ${result.reason ?? '이유 미관측'}`).join('; ');
|
|
678
748
|
return {
|
|
679
|
-
output: formatOrchestrationResults(results)
|
|
680
|
-
|
|
749
|
+
output: formatOrchestrationResults(results, goalResults)
|
|
750
|
+
+ (kind === 'failed' ? `\n실패/차단: ${reason} · 다음: ${next}` : `\n다음 조회: ${next}`)
|
|
751
|
+
+ '\n이 턴에서 파일을 직접 편집하지 마세요',
|
|
752
|
+
ok: kind !== 'failed',
|
|
753
|
+
kind,
|
|
754
|
+
next,
|
|
755
|
+
missing: [ ...(goalResults.length === 0 || goalResults.some(result => !result.runId) ? ['runId'] : []), 'node' ],
|
|
756
|
+
goalResults,
|
|
757
|
+
...(kind === 'failed' ? { reason } : {}),
|
|
681
758
|
...(fabricDecomposition ? { fabricDecomposition } : {}),
|
|
682
759
|
};
|
|
683
760
|
}
|
|
@@ -751,12 +828,12 @@ export const selfImplementRuntime: ToolRuntime<SelfImplementRuntimeRequest, Self
|
|
|
751
828
|
...(runId ? { runId } : {}),
|
|
752
829
|
}, { pipelineDeps });
|
|
753
830
|
if (!outcome.ok) {
|
|
754
|
-
return { output: withGoalAuthorFailure(
|
|
831
|
+
return { output: withGoalAuthorFailure(`하니스가 발사되지 않았거나 실패했습니다: ${outcome.message} · 다음: 실패 이유를 확인한 뒤 다시 요청하세요 · 이 턴에서 파일을 직접 편집하지 마세요`), ok: false, kind: 'failed', reason: outcome.message, next: '실패 이유를 확인한 뒤 다시 요청', missing: ['runId', 'node'] };
|
|
755
832
|
}
|
|
756
833
|
if (outcome.kind !== 'self') {
|
|
757
834
|
return {
|
|
758
|
-
output: withGoalAuthorFailure('
|
|
759
|
-
ok: true,
|
|
835
|
+
output: withGoalAuthorFailure('관측 전용이라 런을 발사하지 않았습니다 · 코드도 안 바꿨습니다 · 이 결과를 구현 실패로 읽고 직접 Write/Edit 하지 마세요'),
|
|
836
|
+
ok: true, kind: 'observed-only', observed: true, missing: ['runId', 'node'], next: '관측 전용 모드를 끈 뒤 다시 요청',
|
|
760
837
|
};
|
|
761
838
|
}
|
|
762
839
|
|
|
@@ -764,6 +841,11 @@ export const selfImplementRuntime: ToolRuntime<SelfImplementRuntimeRequest, Self
|
|
|
764
841
|
return {
|
|
765
842
|
output: withGoalAuthorFailure(formatResult(feature, result, documentReferences)),
|
|
766
843
|
ok: result.ok,
|
|
844
|
+
kind: result.ok ? (result.runId ? 'launched' : 'pending') : 'failed',
|
|
845
|
+
next: result.runId ? `eln self run ${result.runId}` : result.ok ? 'eln self running-runs' : '실패 이유를 확인한 뒤 다시 요청',
|
|
846
|
+
missing: [...(result.runId ? [] : ['runId']), ...(result.node ? [] : ['node'])],
|
|
847
|
+
...(!result.ok ? { reason: result.detail ?? result.stage } : {}),
|
|
848
|
+
runId: result.runId,
|
|
767
849
|
stage: result.stage,
|
|
768
850
|
node: result.node,
|
|
769
851
|
...(result.prUrl ? { prUrl: result.prUrl } : {}),
|
|
@@ -775,28 +857,51 @@ export const selfImplementRuntime: ToolRuntime<SelfImplementRuntimeRequest, Self
|
|
|
775
857
|
|
|
776
858
|
if (nonBlocking) {
|
|
777
859
|
const runId = allocatedRunId ?? mintRunId();
|
|
860
|
+
const requestId = runId;
|
|
861
|
+
const lookup = `eln logs --category self-implement --event runtime.non-blocking-completed,runtime.non-blocking-failed --grep ${requestId} --since 3h --all --include-test`;
|
|
778
862
|
void drive(runId).then(
|
|
779
863
|
(result) => {
|
|
780
|
-
debug.log('self-implement', 'runtime.non-blocking-completed', {
|
|
781
|
-
|
|
864
|
+
debug.log('self-implement', result.kind === 'failed' ? 'runtime.non-blocking-failed' : 'runtime.non-blocking-completed', {
|
|
865
|
+
requestId,
|
|
866
|
+
kind: result.kind,
|
|
867
|
+
...(result.runId ? { runId: result.runId } : {}),
|
|
868
|
+
...(result.reason ? { reason: result.reason } : {}),
|
|
869
|
+
next: result.next ?? '요청 결과를 확인한 뒤 다시 요청',
|
|
782
870
|
ok: result.ok,
|
|
783
871
|
...(result.stage === undefined ? {} : { stage: result.stage }),
|
|
784
|
-
});
|
|
872
|
+
}, result.kind === 'failed' ? { level: 'warn' } : undefined);
|
|
785
873
|
},
|
|
786
874
|
(error) => {
|
|
875
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
787
876
|
debug.log('self-implement', 'runtime.non-blocking-failed', {
|
|
788
|
-
|
|
789
|
-
|
|
877
|
+
requestId,
|
|
878
|
+
kind: 'failed',
|
|
879
|
+
reason,
|
|
880
|
+
next: '요청과 실패 이유를 확인한 뒤 다시 요청',
|
|
790
881
|
}, { level: 'warn' });
|
|
791
882
|
},
|
|
792
883
|
);
|
|
793
884
|
return {
|
|
794
885
|
ok: true,
|
|
795
|
-
|
|
886
|
+
kind: 'pending',
|
|
796
887
|
invocationMode: 'non-blocking',
|
|
797
|
-
|
|
888
|
+
requestId,
|
|
889
|
+
next: lookup,
|
|
890
|
+
missing: ['runId', 'node'],
|
|
891
|
+
output: `하니스 요청을 접수했습니다 · 런과 노드는 아직 미관측 · 요청 ID ${requestId}(발사 증거 아님) · 다음 조회: ${lookup} · 이 턴에서 파일을 직접 편집하지 마세요\n[self-implement] non-blocking pending`,
|
|
892
|
+
};
|
|
893
|
+
}
|
|
894
|
+
return await drive();
|
|
895
|
+
} catch (error) {
|
|
896
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
897
|
+
return {
|
|
898
|
+
ok: false,
|
|
899
|
+
kind: 'failed',
|
|
900
|
+
reason,
|
|
901
|
+
next: '요청과 실패 이유를 확인한 뒤 다시 요청',
|
|
902
|
+
missing: ['runId', 'node'],
|
|
903
|
+
output: `SelfImplement 실패: ${reason} · 다음: 요청과 실패 이유를 확인한 뒤 다시 요청 · 이 턴에서 파일을 직접 편집하지 마세요`,
|
|
798
904
|
};
|
|
799
905
|
}
|
|
800
|
-
return drive();
|
|
801
906
|
},
|
|
802
907
|
};
|
package/src/session/index.ts
CHANGED
|
@@ -142,10 +142,20 @@ function migrateLegacySessions(): void {
|
|
|
142
142
|
}
|
|
143
143
|
|
|
144
144
|
function stateRoot(): string {
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
145
|
+
const universe = process.env.ELANOUS_STATE_DIR?.trim();
|
|
146
|
+
const root = universe
|
|
147
|
+
? join(universe, 'elanous')
|
|
148
|
+
: join(
|
|
149
|
+
process.env.XDG_STATE_HOME && process.env.XDG_STATE_HOME.trim()
|
|
150
|
+
? process.env.XDG_STATE_HOME
|
|
151
|
+
: join(homedir(), '.local', 'state'),
|
|
152
|
+
'elanous',
|
|
153
|
+
);
|
|
154
|
+
try {
|
|
155
|
+
const { debug } = require('../debug/log.js') as typeof import('../debug/log.js');
|
|
156
|
+
debug.log('session.active', 'pointer-root', { root, universe });
|
|
157
|
+
} catch { /* 관측 실패가 포인터 경로 결정을 막지 않는다 */ }
|
|
158
|
+
return root;
|
|
149
159
|
}
|
|
150
160
|
|
|
151
161
|
function indexPath(root: string = sessionRoot()): string { return join(root, 'index.json'); }
|