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
package/src/index.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { LOGS_SINCE_OPTION, registerLogsCommands } from './cli/logs-cli.js';
|
|
|
9
9
|
import { registerDocsCommands } from './cli/docs-cli.js';
|
|
10
10
|
import { registerBenchCommands } from './cli/bench-cli.js';
|
|
11
11
|
import { registerRetroCommands } from './cli/retro-cli.js';
|
|
12
|
+
import { registerMemoryCommands } from './cli/memory-cli.js';
|
|
12
13
|
import { registerA2ACommands } from './cli/a2a-cli.js';
|
|
13
14
|
import { registerPluginCommands } from './cli/plugin-cli.js';
|
|
14
15
|
import { registerMakeCommand } from './cli/make-cli.js';
|
|
@@ -37,6 +38,7 @@ import { DEV_PIPELINE_SINK_SURFACE } from './self-implement/self-cli-sink-surfac
|
|
|
37
38
|
import { registerPrivateLedgerCommands } from './cli/private-ledger-commands.js';
|
|
38
39
|
import { registerKnowCommand } from './cli/know-cli.js';
|
|
39
40
|
import { registerSeatRequestsCommands } from './cli/seat-requests-cli.js';
|
|
41
|
+
import { registerSeatBootCommands } from './cli/seat-cli.js';
|
|
40
42
|
import { applyTestStateDirFlagFromArgv } from './cli/test-state-dir-flag.js';
|
|
41
43
|
import { applyTestFlagFromArgv, observeTestFlagOwnership, uncoveredTestFlagPaths, staleTestFlagPaths } from './cli/test-flag.js';
|
|
42
44
|
import { registerPtyTakeoverCommands } from './cli/pty-takeover-cli.js';
|
|
@@ -93,6 +95,7 @@ import { registerStartCommand } from './cli/start-cli.js';
|
|
|
93
95
|
import { registerGroundingSourcesCli } from './grounding/sources-cli.js';
|
|
94
96
|
import { registerGraphCommands } from './graph-runner/graph-cli.js';
|
|
95
97
|
import { registerLoopCommands } from './loops/loop-cli.js';
|
|
98
|
+
import { registerResourceCommands } from './cli/resource-cli.js';
|
|
96
99
|
import { registerHqMovePlanCommand } from './hq/hq.js';
|
|
97
100
|
import { registerCardCommand } from './task-cards/card-cli.js';
|
|
98
101
|
import { registerLaunchHeadCommands } from './launch-head/launch-head-cli.js';
|
|
@@ -121,6 +124,8 @@ import { runGitCommand } from './git-fs/runner.js';
|
|
|
121
124
|
import { debug, redactSecretText, redactSecrets } from './debug/log.js';
|
|
122
125
|
import { installHarnessCliCommand, type HarnessAskSayChildLlmOptions, type HarnessAskSayOptions, type HarnessPlanOptions } from './harness/harness-cli-command.js';
|
|
123
126
|
import { CliUserError, formatCliUserError, isCliUserError } from './cli/cli-user-error.js';
|
|
127
|
+
import { classifyFriendlyError, formatFriendlyError } from './cli/friendly-errors.js';
|
|
128
|
+
import { detectLocale } from './expression/locale.js';
|
|
124
129
|
import { dispatchSolveMission } from './skills/tools/solve-mission.js';
|
|
125
130
|
import { performBrowserAction, type BrowserActionDeps, type BrowserActionResult } from './harness/browser-act.js';
|
|
126
131
|
import { decideTypeAction, type TypeActionDecision, type TypeTarget } from './harness/browser-act-type.js';
|
|
@@ -201,11 +206,6 @@ import {
|
|
|
201
206
|
} from './cli/mission-config.js';
|
|
202
207
|
import { DEFAULT_THEME_TOKENS, resolveThemeTokens } from './theme/tokens.js';
|
|
203
208
|
import { conatusPath } from './domains/conatus-data-dir.js';
|
|
204
|
-
import {
|
|
205
|
-
saveMemory, loadMemory, listMemories, deleteMemory, searchMemories,
|
|
206
|
-
readIndex, memoryRoot, memoryIndexPath,
|
|
207
|
-
type MemoryType,
|
|
208
|
-
} from './memory.js';
|
|
209
209
|
|
|
210
210
|
/** 원본 전용 봇랩 도구 — 공개본엔 없다(release/public-export.yaml · scripts/botlab/**). */
|
|
211
211
|
const BOTLAB_STATE_PATHS_MODULE: string = '../scripts/botlab/botlab-state-paths.js';
|
|
@@ -1119,6 +1119,7 @@ hqCmd.command('fence').description('이 호스트가 임대를 쥐었을 때만
|
|
|
1119
1119
|
process.exitCode = hqFenceRun(opts.role as 'cron', command);
|
|
1120
1120
|
});
|
|
1121
1121
|
const seatCmd = program.command('seat').description('분배된 자리의 하루 루프와 보고');
|
|
1122
|
+
registerSeatBootCommands(seatCmd);
|
|
1122
1123
|
registerSeatRequestsCommands(seatCmd);
|
|
1123
1124
|
seatCmd.command('asks').description('최근 CTO 되묻기 왕복과 10분 판정')
|
|
1124
1125
|
.option('--since <duration>', '조회 창 (예: 24h)', '24h')
|
|
@@ -1268,6 +1269,7 @@ registerStartCommand(program);
|
|
|
1268
1269
|
registerGroundingSourcesCli(program);
|
|
1269
1270
|
registerGraphCommands(program);
|
|
1270
1271
|
registerLoopCommands(program);
|
|
1272
|
+
registerResourceCommands(program);
|
|
1271
1273
|
// RFC 실행·착지 루프 §3 — 태스크 컨텍스트 카드(`elanous card list|show` · ⛔ `task`/`tasks` 는 TOX 몫).
|
|
1272
1274
|
registerCardCommand(program);
|
|
1273
1275
|
registerLaunchHeadCommands(program);
|
|
@@ -1935,174 +1937,7 @@ registerAutopilotCommands(program);
|
|
|
1935
1937
|
registerRetroCommands(program);
|
|
1936
1938
|
|
|
1937
1939
|
// ── memory ──
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
memCmd
|
|
1941
|
-
.command('list [type]')
|
|
1942
|
-
.description('List memories (optionally filtered by type)')
|
|
1943
|
-
.option('-n, --limit <n>', 'Max entries to show', '30')
|
|
1944
|
-
.action((type?: string, opts?: { limit: string }) => {
|
|
1945
|
-
const t = type as MemoryType | undefined;
|
|
1946
|
-
const entries = listMemories({ type: t, limit: parseInt(opts?.limit ?? '30', 10) });
|
|
1947
|
-
if (entries.length === 0) {
|
|
1948
|
-
ui.info('No memories yet. Add one with `elanous memory add <type> "<name>" "<description>"`.');
|
|
1949
|
-
return;
|
|
1950
|
-
}
|
|
1951
|
-
ui.header(`memories (${entries.length})`);
|
|
1952
|
-
for (const e of entries) {
|
|
1953
|
-
console.log(` ${e.id.slice(0, 8)} [${e.type.padEnd(9)}] ${e.name}`);
|
|
1954
|
-
if (e.description) console.log(` ${e.description.slice(0, 100)}`);
|
|
1955
|
-
}
|
|
1956
|
-
});
|
|
1957
|
-
|
|
1958
|
-
memCmd
|
|
1959
|
-
.command('add <type> <name> [description...]')
|
|
1960
|
-
.description('Create a memory (type: user|feedback|project|reference). Body piped via stdin if available.')
|
|
1961
|
-
.action(async (type: string, name: string, descParts: string[]) => {
|
|
1962
|
-
if (!['user', 'feedback', 'project', 'reference'].includes(type)) {
|
|
1963
|
-
ui.error(`invalid type "${type}". Use: user | feedback | project | reference`);
|
|
1964
|
-
process.exit(1);
|
|
1965
|
-
}
|
|
1966
|
-
const description = (descParts || []).join(' ');
|
|
1967
|
-
// Read body from stdin if piped; otherwise use description as body too.
|
|
1968
|
-
let body = description;
|
|
1969
|
-
const pipedBody = await readPipedStdin(); // ★ OBS-T3 — 비-TTY 는 파이프를 뜻하지 않는다(소켓이면 EOF 가 안 온다)
|
|
1970
|
-
if (pipedBody) body = pipedBody;
|
|
1971
|
-
const e = saveMemory({ type: type as MemoryType, name, description, body });
|
|
1972
|
-
ui.info(`saved ${e.id.slice(0, 8)} [${e.type}] "${e.name}"`);
|
|
1973
|
-
});
|
|
1974
|
-
|
|
1975
|
-
// 3번째 recall 레버(2026-07-19) — pin(항상주입) / priority(매칭 시 순위 부스트).
|
|
1976
|
-
memCmd
|
|
1977
|
-
.command('pin <idPrefix>')
|
|
1978
|
-
.description('Pin a memory so it is ALWAYS injected (bypass keyword gate). Optionally set priority.')
|
|
1979
|
-
.option('-p, --priority <n>', 'priority boost (higher = ranked/kept first)', '5')
|
|
1980
|
-
.action((prefix: string, opts: { priority: string }) => {
|
|
1981
|
-
const e = loadMemory(prefix);
|
|
1982
|
-
if (!e) { ui.error(`no memory matching "${prefix}"`); process.exit(1); }
|
|
1983
|
-
saveMemory({ type: e.type, name: e.name, description: e.description, body: e.body, id: e.id, pinned: true, priority: parseInt(opts.priority, 10) || 0 });
|
|
1984
|
-
ui.info(`📌 pinned ${e.id.slice(0, 8)} "${e.name}" (priority ${opts.priority})`);
|
|
1985
|
-
});
|
|
1986
|
-
|
|
1987
|
-
memCmd
|
|
1988
|
-
.command('unpin <idPrefix>')
|
|
1989
|
-
.description('Un-pin a memory (back to keyword-gated recall).')
|
|
1990
|
-
.action((prefix: string) => {
|
|
1991
|
-
const e = loadMemory(prefix);
|
|
1992
|
-
if (!e) { ui.error(`no memory matching "${prefix}"`); process.exit(1); }
|
|
1993
|
-
saveMemory({ type: e.type, name: e.name, description: e.description, body: e.body, id: e.id, pinned: false, priority: e.priority });
|
|
1994
|
-
ui.info(`unpinned ${e.id.slice(0, 8)} "${e.name}"`);
|
|
1995
|
-
});
|
|
1996
|
-
|
|
1997
|
-
memCmd
|
|
1998
|
-
.command('priority <idPrefix> <n>')
|
|
1999
|
-
.description('Set a memory\'s injection priority boost (0 = default). Added to match score.')
|
|
2000
|
-
.action((prefix: string, n: string) => {
|
|
2001
|
-
const e = loadMemory(prefix);
|
|
2002
|
-
if (!e) { ui.error(`no memory matching "${prefix}"`); process.exit(1); }
|
|
2003
|
-
saveMemory({ type: e.type, name: e.name, description: e.description, body: e.body, id: e.id, priority: parseInt(n, 10) || 0, pinned: e.pinned });
|
|
2004
|
-
ui.info(`priority ${e.id.slice(0, 8)} "${e.name}" → ${parseInt(n, 10) || 0}`);
|
|
2005
|
-
});
|
|
2006
|
-
|
|
2007
|
-
// 통합 관리 뷰(2026-07-19) — 2 시스템(큐레이션 파일메모리 + 에피소드 self-log)을 한 화면에.
|
|
2008
|
-
memCmd
|
|
2009
|
-
.command('status')
|
|
2010
|
-
.description('Unified memory overview — ① curated file-memory + ② self-log (surface_events)')
|
|
2011
|
-
.action(async () => {
|
|
2012
|
-
const { memoryRoot } = await import('./memory.js');
|
|
2013
|
-
const mems = listMemories();
|
|
2014
|
-
const byType: Record<string, number> = {};
|
|
2015
|
-
let pinned = 0;
|
|
2016
|
-
for (const e of mems) { byType[e.type] = (byType[e.type] ?? 0) + 1; if (e.pinned) pinned += 1; }
|
|
2017
|
-
ui.header('memory (unified)');
|
|
2018
|
-
console.log(`① 큐레이션 파일메모리: ${mems.length}건 [${Object.entries(byType).map(([k, v]) => `${k}:${v}`).join(' ') || '-'}] 📌pinned ${pinned}`);
|
|
2019
|
-
console.log(` ${memoryRoot()} (LLM-judge/luna recall · MEMORY.md 항상주입)`);
|
|
2020
|
-
try {
|
|
2021
|
-
const { surfaceEventsDbPath, openSurfaceEventsDb } = await import('./domains/surface-events.js');
|
|
2022
|
-
const path = surfaceEventsDbPath();
|
|
2023
|
-
// 항상 open — legacy conatus/ → memory/ 자가치유 마이그레이션이 여기서 실행된다(존재 체크 먼저
|
|
2024
|
-
// 하면 신 경로 부재로 마이그레이션이 스킵됨). 없으면 빈 store 생성(무해).
|
|
2025
|
-
const db = openSurfaceEventsDb(path);
|
|
2026
|
-
const n = (db.prepare('SELECT count(*) c FROM events').get() as { c: number }).c;
|
|
2027
|
-
const recent = (db.prepare('SELECT ts FROM events ORDER BY ts DESC LIMIT 1').get() as { ts: string } | undefined)?.ts;
|
|
2028
|
-
db.close();
|
|
2029
|
-
console.log(`② 에피소드 self-log: ${n.toLocaleString()} events (최근 ${recent?.slice(0, 16) ?? '-'})`);
|
|
2030
|
-
console.log(` ${path} (FTS5 bm25+recency+myelin rerank · ambient 회상)`);
|
|
2031
|
-
} catch (e) { console.log(`② self-log 조회 실패: ${(e as Error).message}`); }
|
|
2032
|
-
try {
|
|
2033
|
-
const { openKnowledgeDb, knowledgeDbPath } = await import('./domains/knowledge.js');
|
|
2034
|
-
const kdb = openKnowledgeDb(); // 기본 경로 → legacy conatus/ 자가치유 이전
|
|
2035
|
-
const kn = (kdb.prepare('SELECT count(*) c FROM docs').get() as { c: number }).c;
|
|
2036
|
-
const dom = (kdb.prepare("SELECT domain, count(*) c FROM docs GROUP BY domain ORDER BY c DESC LIMIT 3").all() as Array<{ domain: string | null; c: number }>);
|
|
2037
|
-
kdb.close();
|
|
2038
|
-
console.log(`③ 시맨틱 knowledge: ${kn.toLocaleString()} docs [${dom.map(d => `${d.domain ?? 'null'}:${d.c}`).join(' ')}]`);
|
|
2039
|
-
console.log(` ${knowledgeDbPath()} (임베딩 벡터+BM25 하이브리드 · 의미 회상)`);
|
|
2040
|
-
} catch (e) { console.log(`③ knowledge 조회 실패: ${(e as Error).message}`); }
|
|
2041
|
-
});
|
|
2042
|
-
|
|
2043
|
-
memCmd
|
|
2044
|
-
.command('show <idPrefix>')
|
|
2045
|
-
.description('Print full memory body')
|
|
2046
|
-
.action((prefix: string) => {
|
|
2047
|
-
const entries = listMemories();
|
|
2048
|
-
const hit = entries.find(e => e.id.startsWith(prefix));
|
|
2049
|
-
if (!hit) { ui.error(`no memory matching "${prefix}"`); process.exit(1); }
|
|
2050
|
-
const full = loadMemory(hit.id)!;
|
|
2051
|
-
ui.header(`${full.type}: ${full.name}`);
|
|
2052
|
-
console.log(` id ${full.id}`);
|
|
2053
|
-
console.log(` created ${full.createdAt}`);
|
|
2054
|
-
console.log(` updated ${full.updatedAt}`);
|
|
2055
|
-
console.log(` description ${full.description}`);
|
|
2056
|
-
console.log('');
|
|
2057
|
-
console.log(full.body);
|
|
2058
|
-
});
|
|
2059
|
-
|
|
2060
|
-
memCmd
|
|
2061
|
-
.command('search <query...>')
|
|
2062
|
-
.description('Keyword search across all memories')
|
|
2063
|
-
.option('--type <t>', 'Filter by type')
|
|
2064
|
-
.option('-n, --limit <n>', 'Max results', '10')
|
|
2065
|
-
.action((parts: string[], opts) => {
|
|
2066
|
-
const hits = searchMemories(parts.join(' '), {
|
|
2067
|
-
type: opts.type as MemoryType | undefined,
|
|
2068
|
-
limit: parseInt(opts.limit, 10),
|
|
2069
|
-
});
|
|
2070
|
-
if (hits.length === 0) { ui.info('No matches.'); return; }
|
|
2071
|
-
ui.header(`matches (${hits.length})`);
|
|
2072
|
-
for (const h of hits) {
|
|
2073
|
-
console.log(` ${h.entry.id.slice(0, 8)} score ${h.score} [${h.entry.type}] ${h.entry.name}`);
|
|
2074
|
-
if (h.entry.description) console.log(` ${h.entry.description.slice(0, 100)}`);
|
|
2075
|
-
}
|
|
2076
|
-
});
|
|
2077
|
-
|
|
2078
|
-
memCmd
|
|
2079
|
-
.command('delete <idPrefix>')
|
|
2080
|
-
.description('Delete a memory')
|
|
2081
|
-
.action((prefix: string) => {
|
|
2082
|
-
const entries = listMemories();
|
|
2083
|
-
const hit = entries.find(e => e.id.startsWith(prefix));
|
|
2084
|
-
if (!hit) { ui.error(`no memory matching "${prefix}"`); process.exit(1); }
|
|
2085
|
-
deleteMemory(hit.id);
|
|
2086
|
-
ui.info(`deleted ${hit.id.slice(0, 8)}`);
|
|
2087
|
-
});
|
|
2088
|
-
|
|
2089
|
-
memCmd
|
|
2090
|
-
.command('index')
|
|
2091
|
-
.description('Print MEMORY.md index verbatim')
|
|
2092
|
-
.action(() => {
|
|
2093
|
-
const idx = readIndex();
|
|
2094
|
-
if (!idx) { ui.info('empty (no memories yet)'); return; }
|
|
2095
|
-
console.log(idx);
|
|
2096
|
-
});
|
|
2097
|
-
|
|
2098
|
-
memCmd
|
|
2099
|
-
.command('where')
|
|
2100
|
-
.description('Show the memory storage path')
|
|
2101
|
-
.action(() => {
|
|
2102
|
-
console.log(`memory dir ${memoryRoot()}`);
|
|
2103
|
-
console.log(`index file ${memoryIndexPath()}`);
|
|
2104
|
-
});
|
|
2105
|
-
|
|
1940
|
+
registerMemoryCommands(program);
|
|
2106
1941
|
// ── self (self-awareness memory — 외부 도구가 elanous 구현 이력을 주입/회상) ──
|
|
2107
1942
|
// ── decide (Jev · System One — ⛔ 텍스트를 «생성하지 않는다». 확률이 붙은 판정만 받는다) ──
|
|
2108
1943
|
program
|
|
@@ -3519,6 +3354,7 @@ coordCmd.command('events')
|
|
|
3519
3354
|
});
|
|
3520
3355
|
|
|
3521
3356
|
const selfCmd = program.command('self').description('Self-awareness memory — 외부 도구(Claude Code/Codex)가 구현/변경 이력을 elanous 기억에 주입·회상');
|
|
3357
|
+
{ const { registerSelfUtterancesCommand } = await import('./cli/self-utterances-cli.js'); registerSelfUtterancesCommand(selfCmd); }
|
|
3522
3358
|
|
|
3523
3359
|
// M12 Claude Code 의존도 계기판 — `elanous self dependence [--since] [--until] [--json]`(읽기만).
|
|
3524
3360
|
{ const { registerDependenceCommand } = await import('./cli/dependence-gauge.js'); registerDependenceCommand(selfCmd); }
|
|
@@ -5865,6 +5701,8 @@ selfCmd
|
|
|
5865
5701
|
return (prompt: string) =>
|
|
5866
5702
|
streamLLM([{ role: 'user', content: prompt }], () => {}, {
|
|
5867
5703
|
model,
|
|
5704
|
+
// ⛔ 어댑터 기본 2048 은 리뷰 응답을 자른다(VERDICT/MUST-FIX 줄이 잘리면 reviewed=false 로 접힌다).
|
|
5705
|
+
maxTokens: 16_000,
|
|
5868
5706
|
...(o?.pinProvider ? { provider: getProvider(model) } : {}),
|
|
5869
5707
|
...(o?.onResolved ? { onResolvedProvider: o.onResolved } : {}),
|
|
5870
5708
|
...(effort ? { reasoningEffort: effort } : {}),
|
|
@@ -5878,7 +5716,7 @@ selfCmd
|
|
|
5878
5716
|
return async (prompt: string, images?: readonly ReviewImage[]) => {
|
|
5879
5717
|
if (!made) {
|
|
5880
5718
|
const { makeLazyAcpReviewLLM } = await import('./agent-substrate/acp-reviewer.js');
|
|
5881
|
-
made = makeLazyAcpReviewLLM({ cwd: process.cwd(), backend: o.backend, model: o.model, timeoutMs: o.timeoutMs });
|
|
5719
|
+
made = makeLazyAcpReviewLLM({ cwd: o.cwd ?? process.cwd(), backend: o.backend, model: o.model, timeoutMs: o.timeoutMs });
|
|
5882
5720
|
}
|
|
5883
5721
|
return made(prompt, images);
|
|
5884
5722
|
};
|
|
@@ -5894,7 +5732,7 @@ selfCmd
|
|
|
5894
5732
|
// handshakeTimeoutMs left to the adapter default (min(timeoutMs, 60s)) — the harness lane passes none either.
|
|
5895
5733
|
return {
|
|
5896
5734
|
backend: 'claude',
|
|
5897
|
-
llm: makeRoleAcpReviewLLM({ cwd: process.cwd(), backend: 'claude', backendSpec: spawn.backendSpec, env: spawn.env, timeoutMs: o.timeoutMs }),
|
|
5735
|
+
llm: makeRoleAcpReviewLLM({ cwd: o.cwd ?? process.cwd(), backend: 'claude', backendSpec: spawn.backendSpec, env: spawn.env, timeoutMs: o.timeoutMs }),
|
|
5898
5736
|
};
|
|
5899
5737
|
},
|
|
5900
5738
|
// SUBSCRIPTION-EXHAUST-REROUTE — role reviewer unavailable ⇒ GLM on OpenRouter (the review policy's first
|
|
@@ -5909,6 +5747,19 @@ selfCmd
|
|
|
5909
5747
|
envModel: () => process.env.ELANOUS_PR_REVIEW_MODEL,
|
|
5910
5748
|
});
|
|
5911
5749
|
if (opts.json) await writeStdoutJson(selfReviewJsonLine(results));
|
|
5750
|
+
// Detached TA review: stdout is now complete in its result file. Resume only the bound card.
|
|
5751
|
+
try {
|
|
5752
|
+
const { rejudgeCompletedTaskReview, TA_REVIEW_COMPLETION_CARD_ENV, TA_REVIEW_COMPLETION_STATE_ENV, TA_REVIEW_COMPLETION_RESULT_ENV } = await import('./task-agent/review-result-capture.js');
|
|
5753
|
+
const completionEnv: Record<string, string | undefined> = {};
|
|
5754
|
+
for (const key of [TA_REVIEW_COMPLETION_CARD_ENV, TA_REVIEW_COMPLETION_STATE_ENV, TA_REVIEW_COMPLETION_RESULT_ENV]) {
|
|
5755
|
+
const value = process.env[key];
|
|
5756
|
+
if (value) completionEnv[key] = value;
|
|
5757
|
+
delete process.env[key];
|
|
5758
|
+
}
|
|
5759
|
+
await rejudgeCompletedTaskReview(completionEnv);
|
|
5760
|
+
} catch (error) {
|
|
5761
|
+
try { debug.log('task-agent', 'review-completion-rejudge-failed', { reason: String(error).slice(-300) }, { level: 'warn' }); } catch { /* fail-soft */ }
|
|
5762
|
+
}
|
|
5912
5763
|
if (failed >= 1) process.exitCode = 1;
|
|
5913
5764
|
});
|
|
5914
5765
|
|
|
@@ -5987,22 +5838,25 @@ selfCmd
|
|
|
5987
5838
|
.description('외부 도구 발화를 elanous 기억에 주입 — origin/git/branch/cwd/시간 태그(회상이 "누가 언제 어디서" 구분). text=--text 또는 stdin')
|
|
5988
5839
|
.option('-s, --text <text>', '발화 원문(생략 시 stdin)')
|
|
5989
5840
|
.option('--source <origin>', 'claude-code|codex|gemini|…', 'claude-code')
|
|
5841
|
+
.option('--origin <origin>', '발화 주체: human|agent (기본 agent)')
|
|
5990
5842
|
.option('--session <id>', '세션 id')
|
|
5991
5843
|
.option('--git-hash <hash>', '발화 시점 git HEAD(short)')
|
|
5992
5844
|
.option('--branch <name>', 'git 브랜치')
|
|
5993
5845
|
.option('--cwd <dir>', '작업 디렉토리')
|
|
5994
5846
|
.option('--ts <iso>', 'ISO 시간(기본 now)')
|
|
5995
5847
|
.option('-i, --importance <n>', '0-10 현저성', '5')
|
|
5996
|
-
.action(async (opts: { text?: string; source: string; session?: string; gitHash?: string; branch?: string; cwd?: string; ts?: string; importance: string }) => {
|
|
5848
|
+
.action(async (opts: { text?: string; source: string; origin?: string; session?: string; gitHash?: string; branch?: string; cwd?: string; ts?: string; importance: string }) => {
|
|
5849
|
+
if (opts.origin !== undefined && opts.origin !== 'human' && opts.origin !== 'agent') { ui.error('utterance: --origin must be human or agent'); process.exitCode = 1; return; }
|
|
5997
5850
|
let text = opts.text;
|
|
5998
5851
|
if (!text) text = await readPipedStdin(); // ★ OBS-T3
|
|
5999
5852
|
if (!text || !text.trim()) { ui.error('utterance: --text 또는 stdin 필요'); process.exit(1); }
|
|
6000
5853
|
// 독립 CLI 프로세스 — 데몬 StoreSink 를 상속 안 하므로 logs.db 싱크를 붙여야
|
|
6001
5854
|
// injectUtterance 의 `debug.log('memory.utterance','ingress')` 가 logs.db 에 닿음(제1원칙 관측).
|
|
6002
|
-
const {
|
|
6003
|
-
const r =
|
|
5855
|
+
const { recordSelfUtterance } = await import('./cli/self-utterances-cli.js');
|
|
5856
|
+
const r = recordSelfUtterance({
|
|
6004
5857
|
text: text.trim(),
|
|
6005
5858
|
origin: opts.source,
|
|
5859
|
+
utteranceOrigin: opts.origin === 'human' ? 'human' : 'agent',
|
|
6006
5860
|
...(opts.session ? { sessionId: opts.session } : {}),
|
|
6007
5861
|
...(opts.gitHash ? { gitHash: opts.gitHash } : {}),
|
|
6008
5862
|
...(opts.branch ? { branch: opts.branch } : {}),
|
|
@@ -11887,7 +11741,10 @@ async function main(): Promise<void> {
|
|
|
11887
11741
|
// 한다. 인터랙티브 TUI 는 데몬 sink 를 상속 안 하므로 안 붙이면 debug.log 가 no-op
|
|
11888
11742
|
// (제1원칙 관측 갭 · tui-sim 드라이브에서 agent.source 0건으로 실측 2026-07-19).
|
|
11889
11743
|
// PR#4622(self utterance CLI)·session-cli 미러. fail-open·비블로킹.
|
|
11744
|
+
const bootTimer = (await import('./dashboard/boot-timing.js')).createBootTimer();
|
|
11745
|
+
bootTimer.begin();
|
|
11890
11746
|
try { await (await import('./domains/standalone-log-sink.js')).registerStandaloneLogSink('tui'); } catch { /* fail-open */ }
|
|
11747
|
+
bootTimer.phase('log-sink');
|
|
11891
11748
|
// P3(대표 2026-07-26) — footgun 관측을 logs.db 에 도달시킨다. 초반(arg 파싱 前) warnProdSpawnFootgun 은
|
|
11892
11749
|
// StoreSink 등록 前이라 debug.log 가 logs.db 미도달이었다(순서 갭). sink 등록 직후 관측만 재발행(stderr 중복 X).
|
|
11893
11750
|
try { (await import('./instance-root-coherence.js')).warnProdSpawnFootgun({ emit: 'log' }); } catch { /* fail-open */ }
|
|
@@ -11897,7 +11754,9 @@ async function main(): Promise<void> {
|
|
|
11897
11754
|
// so `elanous self screen` / `/v1/terminals` / (P2) PWA can see the
|
|
11898
11755
|
// dashboard the user is actually looking at. Off unless this boots
|
|
11899
11756
|
// (no producer in headless/daemon paths). fail-soft·비블로킹.
|
|
11757
|
+
bootTimer.begin();
|
|
11900
11758
|
try { (await import('./capture/tui-self-report.js')).startTuiSelfReport(); } catch { /* fail-soft */ }
|
|
11759
|
+
bootTimer.phase('self-report');
|
|
11901
11760
|
|
|
11902
11761
|
// Dashboard handles sync inline — only returns on quit
|
|
11903
11762
|
// ⛔ stdin 이 TTY 가 아니면 «뜨지 않는다» — 뜨면 readKey 가 엔터를 지어내 초당 수백 프레임을
|
|
@@ -11910,7 +11769,14 @@ async function main(): Promise<void> {
|
|
|
11910
11769
|
return;
|
|
11911
11770
|
}
|
|
11912
11771
|
}
|
|
11913
|
-
|
|
11772
|
+
bootTimer.begin();
|
|
11773
|
+
await showDashboard({
|
|
11774
|
+
...dashboardOpts,
|
|
11775
|
+
onFirstFrameRendered: () => {
|
|
11776
|
+
bootTimer.phase('show-dashboard');
|
|
11777
|
+
bootTimer.done();
|
|
11778
|
+
},
|
|
11779
|
+
});
|
|
11914
11780
|
closeTui();
|
|
11915
11781
|
// Force exit: the dashboard starts background timers (clipboard
|
|
11916
11782
|
// poller, shimmer/blink animations) that keep the Bun event loop
|
|
@@ -11941,6 +11807,13 @@ export function runCli(): void {
|
|
|
11941
11807
|
console.error(formatCliUserError(err));
|
|
11942
11808
|
process.exit(1);
|
|
11943
11809
|
}
|
|
11810
|
+
const friendlyCode = classifyFriendlyError(err);
|
|
11811
|
+
if (friendlyCode) {
|
|
11812
|
+
const locale = detectLocale();
|
|
11813
|
+
console.error(formatFriendlyError(friendlyCode, locale));
|
|
11814
|
+
debug.log('cli.friendly-error', 'shown', { code: friendlyCode, locale });
|
|
11815
|
+
process.exit(1);
|
|
11816
|
+
}
|
|
11944
11817
|
// ER1 — a real crash is reported once (consented · scrubbed · never blocks more than the send timeout).
|
|
11945
11818
|
try {
|
|
11946
11819
|
const { reportError } = await import('./error-report/report.js');
|
package/src/instance/current.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { join } from 'node:path';
|
|
2
1
|
import { debug } from '../debug/log.js';
|
|
3
2
|
import { getElanousConfigDirOverride } from '../elanous-config-dir.js';
|
|
4
3
|
import { getTestStateRoot } from '../nexus/paths.js';
|
|
5
|
-
import {
|
|
6
|
-
import { isInstalledCopyScript
|
|
4
|
+
import { getAppliedGlobalTestRoot } from '../cli/test-flag.js';
|
|
5
|
+
import { isInstalledCopyScript } from './leader.js';
|
|
7
6
|
import { prodInstanceRoot, resolveInstance, type InstanceResolution } from './resolve.js';
|
|
8
7
|
|
|
9
8
|
interface ResolveCurrentInstanceDeps {
|
|
@@ -16,15 +15,12 @@ interface ResolveCurrentInstanceDeps {
|
|
|
16
15
|
|
|
17
16
|
/** 현재 프로세스의 4층 판정 입력을 모아 순수 리졸버에 전달한다. */
|
|
18
17
|
export function resolveCurrentInstance(deps: ResolveCurrentInstanceDeps = {}): InstanceResolution {
|
|
19
|
-
const cwd = (deps.cwd ?? (() => process.cwd()))();
|
|
20
18
|
const explicitFlagRoot = (deps.explicitFlagRoot ?? (() =>
|
|
21
19
|
getAppliedGlobalTestRoot() ?? getTestStateRoot() ?? getElanousConfigDirOverride()))();
|
|
22
|
-
const treeRoot = (process.argv[1] ? treeFromScriptPath(process.argv[1]) : null) ?? findTreeRoot(cwd);
|
|
23
20
|
const resolution = resolveInstance({
|
|
24
21
|
explicitFlagRoot,
|
|
25
22
|
stampedStateDir: (deps.stampedStateDir ?? (() => process.env.ELANOUS_STATE_DIR))(),
|
|
26
23
|
installedCopy: isInstalledCopyScript(),
|
|
27
|
-
treeTestRoot: treeRoot ? join(treeRoot, '.elanous-test') : null,
|
|
28
24
|
prodRoot: prodInstanceRoot(),
|
|
29
25
|
});
|
|
30
26
|
debug.log('instance.current', 'resolved', { layer: resolution.layer, kind: resolution.kind });
|
package/src/instance/resolve.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
// 인스턴스 우주: 명시 루트 → 부모 스탬프 →
|
|
1
|
+
// 인스턴스 우주: 명시 루트 → 부모 스탬프 → 운영 집. 트리 위치는 우주를 고르지 않는다.
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import { join, resolve } from 'node:path';
|
|
4
4
|
|
|
5
5
|
export type InstanceKind = 'prod' | 'test';
|
|
6
|
-
export type ResolutionLayer = 'explicit-flag' | 'parent-stamp' | 'installed' | '
|
|
6
|
+
export type ResolutionLayer = 'explicit-flag' | 'parent-stamp' | 'installed' | 'default';
|
|
7
7
|
|
|
8
8
|
export interface InstanceResolution {
|
|
9
9
|
kind: InstanceKind;
|
|
@@ -50,10 +50,9 @@ export function resolveInstance(deps: ResolveDeps = {}): InstanceResolution {
|
|
|
50
50
|
}
|
|
51
51
|
const installed = deps.installedCopy ?? isInstalledExecution();
|
|
52
52
|
if (installed) return { kind: 'prod', root: prodRoot, layer: 'installed', why: '설치본으로 실행' };
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
return { kind: 'test', root: normRoot(join(process.cwd(), '.elanous-test')), layer: 'default', why: '소스 트리 밖 실행(격리)' };
|
|
53
|
+
// Explicit --test selects a test root before this resolver runs. A checkout,
|
|
54
|
+
// worktree, or arbitrary cwd alone never changes the operating house.
|
|
55
|
+
return { kind: 'prod', root: prodRoot, layer: 'default', why: '명시 시험 우주가 없는 운영 집' };
|
|
57
56
|
}
|
|
58
57
|
|
|
59
58
|
/** 부모가 도장으로 물려준 우주와 자식이 실제로 쓰는 우주가 다른가. 비어 있는 쪽은 비교하지 않는다. */
|
|
@@ -29,6 +29,9 @@ export const DEFAULT_GITHUB_STAR_DAYS = 30;
|
|
|
29
29
|
*/
|
|
30
30
|
export const DEFAULT_GITHUB_STAR_PER_QUERY = 20;
|
|
31
31
|
|
|
32
|
+
/** 하루당 별 증가 상위 이 개수 행만 README 를 싣고 `surge.score` 를 받는다. */
|
|
33
|
+
const GITHUB_SURGE_TOP = 3;
|
|
34
|
+
|
|
32
35
|
export interface GithubStarRepo {
|
|
33
36
|
fullName: string;
|
|
34
37
|
url: string;
|
|
@@ -223,7 +226,7 @@ export async function collectGithubStars(
|
|
|
223
226
|
}).sort((a, b) => (b.starsPerDay ?? -Infinity) - (a.starsPerDay ?? -Infinity) || b.stars - a.stars);
|
|
224
227
|
const readmes = new Map<string, string>();
|
|
225
228
|
if (!opts.dryRun) {
|
|
226
|
-
for (const row of repos.slice(0,
|
|
229
|
+
for (const row of repos.slice(0, GITHUB_SURGE_TOP)) {
|
|
227
230
|
try {
|
|
228
231
|
readmes.set(row.repo, `README:\n${(await (opts.fetchReadme ?? ghApiFetchReadme)(row.repo)).slice(0, 1_500)}`);
|
|
229
232
|
} catch {
|
|
@@ -231,7 +234,7 @@ export async function collectGithubStars(
|
|
|
231
234
|
}
|
|
232
235
|
}
|
|
233
236
|
}
|
|
234
|
-
const raws: RawIntakeItem[] = repos.map((row) => ({
|
|
237
|
+
const raws: RawIntakeItem[] = repos.map((row, rank) => ({
|
|
235
238
|
url: row.url,
|
|
236
239
|
title: row.title,
|
|
237
240
|
// 모든 행 첫 줄에 라이선스: SPDX · 확인된 부재는 «없음» · 응답이 알려 주지 않으면 «미상»(없음으로 읽지 않는다).
|
|
@@ -240,6 +243,8 @@ export async function collectGithubStars(
|
|
|
240
243
|
stars: row.stars,
|
|
241
244
|
...(row.starsDelta !== undefined ? { starsDelta: row.starsDelta } : {}),
|
|
242
245
|
...(row.starsPerDay !== undefined ? { starsPerDay: row.starsPerDay } : {}),
|
|
246
|
+
// 급등 상위 3 행(README 를 싣는 그 셋)만 1위 3 · 2위 2 · 3위 1 — pickAbsorbQueue 가 `.score` 로 앞세운다.
|
|
247
|
+
...(rank < GITHUB_SURGE_TOP ? { 'surge.score': GITHUB_SURGE_TOP - rank } : {}),
|
|
243
248
|
},
|
|
244
249
|
}));
|
|
245
250
|
const result: CollectGithubResult = {
|
package/src/intake-plane/lens.ts
CHANGED
|
@@ -43,8 +43,13 @@ export interface AnnotateIntakeLensResult {
|
|
|
43
43
|
capped: boolean;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
/** 렌즈가 판정하는 갈래 — 하루 상한을 갈래별로 번갈아 나눈다(한 갈래가 많아도 다른 갈래가 0 이 되지 않게). */
|
|
47
|
+
export type LensLane = 'outbox' | 'github' | 'x';
|
|
48
|
+
export const LENS_LANES: readonly LensLane[] = ['outbox', 'github', 'x'];
|
|
49
|
+
|
|
46
50
|
interface GroupedItem {
|
|
47
51
|
id: string;
|
|
52
|
+
lane?: LensLane;
|
|
48
53
|
facts: { fact: string; current: string }[];
|
|
49
54
|
url?: string;
|
|
50
55
|
}
|
|
@@ -88,7 +93,7 @@ function groupOutbox(root: string, day: string): GroupedItem[] {
|
|
|
88
93
|
if (!id || !fact) continue;
|
|
89
94
|
let group = groups.get(id);
|
|
90
95
|
if (!group) {
|
|
91
|
-
group = { id, facts: [] };
|
|
96
|
+
group = { id, lane: 'outbox', facts: [] };
|
|
92
97
|
groups.set(id, group);
|
|
93
98
|
order.push(id);
|
|
94
99
|
}
|
|
@@ -113,12 +118,39 @@ function ledgerLensItems(root: string, day: string, existing: ReadonlySet<string
|
|
|
113
118
|
.map((fact) => ({ fact, current: '' }));
|
|
114
119
|
if (!facts.length) continue;
|
|
115
120
|
seen.add(item.id);
|
|
116
|
-
items.push({ id: item.id, facts, url: item.url });
|
|
121
|
+
items.push({ id: item.id, lane: source, facts, url: item.url });
|
|
117
122
|
}
|
|
118
123
|
}
|
|
119
124
|
return items;
|
|
120
125
|
}
|
|
121
126
|
|
|
127
|
+
/**
|
|
128
|
+
* 남은 몫(remaining)을 갈래별로 번갈아 채운다 — 매 칸마다 «이미 판정된 수 ⊕ 이번에 고른 수»가 가장 적은 갈래에서
|
|
129
|
+
* 하나를 꺼낸다(동점이면 LENS_LANES 순서). 비거나 다 쓴 갈래의 몫은 남은 갈래로 넘어간다. 총량은 remaining 을 넘지 않는다.
|
|
130
|
+
*/
|
|
131
|
+
export function fairLensBatch<T extends { id: string; lane?: LensLane }>(
|
|
132
|
+
pending: readonly T[],
|
|
133
|
+
doneByLane: Readonly<Partial<Record<LensLane, number>>>,
|
|
134
|
+
remaining: number,
|
|
135
|
+
): T[] {
|
|
136
|
+
const queues = new Map<LensLane, T[]>(LENS_LANES.map((lane) => [lane, []]));
|
|
137
|
+
for (const item of pending) queues.get(item.lane ?? 'outbox')!.push(item);
|
|
138
|
+
const used = new Map<LensLane, number>(LENS_LANES.map((lane) => [lane, doneByLane[lane] ?? 0]));
|
|
139
|
+
const picked = new Set<string>();
|
|
140
|
+
for (let n = 0; n < remaining; n++) {
|
|
141
|
+
let best: LensLane | undefined;
|
|
142
|
+
for (const lane of LENS_LANES) {
|
|
143
|
+
if (!queues.get(lane)!.length) continue;
|
|
144
|
+
if (best === undefined || used.get(lane)! < used.get(best)!) best = lane;
|
|
145
|
+
}
|
|
146
|
+
if (best === undefined) break;
|
|
147
|
+
picked.add(queues.get(best)!.shift()!.id);
|
|
148
|
+
used.set(best, used.get(best)! + 1);
|
|
149
|
+
}
|
|
150
|
+
// 원래 순서를 지킨다(흡수 → GitHub → X).
|
|
151
|
+
return pending.filter((item) => picked.has(item.id));
|
|
152
|
+
}
|
|
153
|
+
|
|
122
154
|
function judgedIds(file: string): Set<string> {
|
|
123
155
|
return new Set(readJsonl(file).flatMap((row) => typeof row.id === 'string' && row.id ? [row.id] : []));
|
|
124
156
|
}
|
|
@@ -171,10 +203,20 @@ export async function annotateIntakeLens(
|
|
|
171
203
|
const pending = items.filter((item) => !done.has(item.id));
|
|
172
204
|
const remaining = Math.max(0, LENS_DAILY_CAP - done.size);
|
|
173
205
|
const capped = pending.length > remaining;
|
|
174
|
-
const
|
|
206
|
+
const doneByLane: Partial<Record<LensLane, number>> = {};
|
|
207
|
+
for (const item of items) {
|
|
208
|
+
if (!done.has(item.id)) continue;
|
|
209
|
+
const lane = item.lane ?? 'outbox';
|
|
210
|
+
doneByLane[lane] = (doneByLane[lane] ?? 0) + 1;
|
|
211
|
+
}
|
|
212
|
+
const batch = capped ? fairLensBatch(pending, doneByLane, remaining) : pending;
|
|
175
213
|
if (capped) {
|
|
176
|
-
const
|
|
214
|
+
const chosen = new Set(batch.map((item) => item.id));
|
|
215
|
+
const skippedIds = pending.filter((item) => !chosen.has(item.id)).map((item) => item.id);
|
|
216
|
+
const byLane = (list: readonly GroupedItem[]) => Object.fromEntries(LENS_LANES.map((lane) =>
|
|
217
|
+
[lane, list.filter((item) => (item.lane ?? 'outbox') === lane).length]));
|
|
177
218
|
log('capped', { day, total: pending.length, judged: batch.length, skippedIds,
|
|
219
|
+
pendingByLane: byLane(pending), judgedByLane: byLane(batch), doneByLane,
|
|
178
220
|
...(skippedIds.length ? { marker: `외 ${skippedIds.length}건 · 원장 \`elanous intake items\`` } : {}) });
|
|
179
221
|
}
|
|
180
222
|
const judgeOne = deps.judge ?? ((input: LensJudgeInput) => defaultJudge(input));
|
|
@@ -12,6 +12,7 @@ import { getUserConfig } from '../user-config.js';
|
|
|
12
12
|
import { dateKey } from '../time/format.js';
|
|
13
13
|
import { cardIndexPath, CardStore, type TaskCard } from '../task-cards/card-store.js';
|
|
14
14
|
import { loadIntakeLedger, type IntakeItem } from './items.js';
|
|
15
|
+
import { RequirementLedger } from '../requirements/requirement-ledger.js';
|
|
15
16
|
import { parseRubric, rubricGrade, rubricScore } from '../release-loop/rubric.js';
|
|
16
17
|
|
|
17
18
|
export type RequirementSource = 'directive' | 'intake' | 'grounding' | 'coordination' | 'linear';
|
|
@@ -67,6 +68,8 @@ export interface FunnelOptions {
|
|
|
67
68
|
allowedLicenses?: readonly string[];
|
|
68
69
|
placement?: PlacementDeps;
|
|
69
70
|
adopt?: (candidate: RequirementCandidate, version: string, cellId: string, evidence: string) => void;
|
|
71
|
+
/** REQ-INTAKE-ALL (0.2.25) piece 1: REQ-LEDGER side-record — every candidate captured once (idempotent on candidate id); adopted decisions fold to `placed`. */
|
|
72
|
+
ledger?: RequirementLedger;
|
|
70
73
|
}
|
|
71
74
|
|
|
72
75
|
/** How many of the last 24 hours' unlinked directives the single P0 brief line names (the full backlog is one count). */
|
|
@@ -170,6 +173,15 @@ export function runRequirementFunnel(options: FunnelOptions): RequirementFunnelR
|
|
|
170
173
|
cellId, version: placement.version, rubric });
|
|
171
174
|
if (!isDirective) used++;
|
|
172
175
|
}
|
|
176
|
+
// REQ-INTAKE-ALL (0.2.25) piece 1: record every funnel candidate into the REQ-LEDGER side-ledger
|
|
177
|
+
// (idempotent on candidate id). The ledger is a side-record — a capture failure must not change the
|
|
178
|
+
// funnel result or any other command's default behavior (preservation contract).
|
|
179
|
+
if (options.ledger) {
|
|
180
|
+
try { captureFunnelCandidates(decisions, options.ledger); }
|
|
181
|
+
catch (error) {
|
|
182
|
+
debug.log('intake.requirement-funnel', 'ledger-capture-failed', { error: error instanceof Error ? error.message : String(error) });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
173
185
|
const unlinkedDirectives = [...directiveCandidates(options.historicalDirectives ?? []).filter(candidate =>
|
|
174
186
|
candidate.text && Number.isFinite(Date.parse(candidate.receivedAt)) && Date.parse(candidate.receivedAt) <= now.getTime()
|
|
175
187
|
&& !linkFor(candidate, cells) && !arrivals.some(arrival => arrival.id === candidate.id)),
|
|
@@ -202,7 +214,46 @@ export function runRequirementFunnel(options: FunnelOptions): RequirementFunnelR
|
|
|
202
214
|
return { counts, candidates: groups.size, decisions, unlinkedDirectives, briefItems };
|
|
203
215
|
}
|
|
204
216
|
|
|
205
|
-
/**
|
|
217
|
+
/**
|
|
218
|
+
* REQ-INTAKE-ALL (0.2.25) piece 1 — record the funnel's five entrances (directive · intake · grounding ·
|
|
219
|
+
* coordination · linear) into the REQ-LEDGER. Each decision captures one row per candidate (its `sources`
|
|
220
|
+
* members) with status `captured`, kind fixed to `fr`, source {kind, at: receivedAt}, statement = one-line
|
|
221
|
+
* text and tags = [priority] (the funnel's own P1 default when the candidate carries none). Idempotent on
|
|
222
|
+
* candidate id — re-running adds no rows. Adopted decisions fold their rows to `placed`. Per source with
|
|
223
|
+
* fresh rows it emits debug.log('requirements.intake', 'captured', {source, count}). Ledger validation
|
|
224
|
+
* (secret-shape rejection, allowlist) stays REQ-LEDGER's share; kind classification (REQ-KINDS) is a later
|
|
225
|
+
* piece — kind is fixed to `fr` here.
|
|
226
|
+
*/
|
|
227
|
+
export function captureFunnelCandidates(candidates: readonly RequirementDecision[], ledger: RequirementLedger): void {
|
|
228
|
+
const statuses = new Map(ledger.list().map(row => [row.id, row.status] as const));
|
|
229
|
+
const fresh = new Map<RequirementSource, number>();
|
|
230
|
+
for (const decision of candidates) {
|
|
231
|
+
for (const candidate of decision.sources) {
|
|
232
|
+
if (statuses.has(candidate.id)) continue;
|
|
233
|
+
// One bad candidate (secret-shaped text · unparseable time) must not stop the rest of the capture.
|
|
234
|
+
try {
|
|
235
|
+
const at = new Date(candidate.receivedAt).toISOString(); // ledger takes UTC `…Z` only; sources may carry offsets
|
|
236
|
+
ledger.capture({ id: candidate.id, statement: oneLine(candidate.text), kind: 'fr',
|
|
237
|
+
source: { kind: candidate.source, at }, tags: [candidate.priority ?? 'P1'] });
|
|
238
|
+
} catch (error) {
|
|
239
|
+
debug.log('intake.requirement-funnel', 'ledger-capture-failed', { id: candidate.id, source: candidate.source,
|
|
240
|
+
error: error instanceof Error ? error.message : String(error) });
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
statuses.set(candidate.id, 'captured');
|
|
244
|
+
fresh.set(candidate.source, (fresh.get(candidate.source) ?? 0) + 1);
|
|
245
|
+
}
|
|
246
|
+
if (decision.status !== 'adopted') continue;
|
|
247
|
+
for (const candidate of decision.sources) {
|
|
248
|
+
if (statuses.get(candidate.id) !== 'captured') continue;
|
|
249
|
+
ledger.place(candidate.id);
|
|
250
|
+
statuses.set(candidate.id, 'placed');
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
for (const [source, count] of fresh) debug.log('requirements.intake', 'captured', { source, count });
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/** Existing ledgers only; no source collector or sender is started here. Side effect: captures every candidate into this universe's REQ-LEDGER (REQ-INTAKE-ALL). */
|
|
206
257
|
export function readRequirementFunnel(options: { stateDir?: string; now?: Date; mode?: 'shadow' | 'live'; dailyCap?: number;
|
|
207
258
|
allowedLicenses?: readonly string[]; grounding?: readonly IncomingRequirement[]; coordination?: readonly IncomingRequirement[];
|
|
208
259
|
linear?: readonly IncomingRequirement[]; placement?: PlacementDeps } = {}): RequirementFunnelResult {
|
|
@@ -276,6 +327,7 @@ export function readRequirementFunnel(options: { stateDir?: string; now?: Date;
|
|
|
276
327
|
grounding: today(options.grounding ?? fromQueue('outbox/grounding.jsonl')),
|
|
277
328
|
coordination: today(options.coordination ?? cardRequests.coordination), linear: today(options.linear ?? cardRequests.linear) }, historicalDirectives, cells, now, mode,
|
|
278
329
|
dailyCap, adoptedToday: todayCount, allowedLicenses, placement: { ...options.placement, schedules },
|
|
330
|
+
ledger: new RequirementLedger({ stateDir }),
|
|
279
331
|
adopt: (candidate, version, cellId, evidence) => {
|
|
280
332
|
placeCell({ id: cellId, title: candidate.text, owner: candidate.owner ?? 'OP', priority: candidate.priority ?? 'P1',
|
|
281
333
|
predecessors: [], ...(candidate.deadlineVersion ? { deadlineVersion: candidate.deadlineVersion } : {}) }, { ...options.placement, now, schedules });
|