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/dashboard/index.ts
CHANGED
|
@@ -965,6 +965,7 @@ import {
|
|
|
965
965
|
enterSessionControlMode,
|
|
966
966
|
exitSessionControlMode,
|
|
967
967
|
isSessionControlActive,
|
|
968
|
+
routeDevHarnessSubmitIntent,
|
|
968
969
|
parseSessionControlSlash,
|
|
969
970
|
parseSessionSurfaceSlash,
|
|
970
971
|
resolveSessionInputModeFromChatMode,
|
|
@@ -1023,7 +1024,7 @@ import { expandPromptReferences } from '../prompt/references.js';
|
|
|
1023
1024
|
import { spawnCodingAgent, CodingAgentBinaryMissing } from '../terminal/coding-agent.js';
|
|
1024
1025
|
import type { TerminalSession } from '../terminal/session-registry.js';
|
|
1025
1026
|
import { createSessionPickerModal } from '../session/picker-modal.js';
|
|
1026
|
-
import { listSessions as listChatSessionsForResume } from '../session/index.js';
|
|
1027
|
+
import { listSessions as listChatSessionsForResume, adoptSession as adoptChatSession, setActiveSessionId as markActiveChatSession } from '../session/index.js';
|
|
1027
1028
|
// TUI 부활 S-b — 타임트래블 포크 엔진 (codex ForkSnapshot 동형 · 2026-07-09
|
|
1028
1029
|
// 이식 후 호출처 0 이던 방치 자산 회수). 순수 히스토리 절단 로직만 소비;
|
|
1029
1030
|
// 영속은 세션 스토어(forkSessionFromHistory)가 담당한다.
|
|
@@ -1179,6 +1180,20 @@ import { buildDebugCallStack } from '../debug/call-stack.js';
|
|
|
1179
1180
|
import { buildAstGrepHostTool } from '../skills/tools/ast-grep.js';
|
|
1180
1181
|
import { buildLspHostTool } from '../skills/tools/lsp/index.js';
|
|
1181
1182
|
import { PluginHost } from '../plugins/core/host.js';
|
|
1183
|
+
|
|
1184
|
+
/** Register the same L2 host tools used by the live TUI before each turn's catalog is assembled. */
|
|
1185
|
+
export function registerDashboardCoreHostTools(host: Pick<PluginHost, 'registerHostTool'>): void {
|
|
1186
|
+
const coreMod = require('../domains/core-tools.js') as typeof import('../domains/core-tools.js');
|
|
1187
|
+
const core = coreMod.buildCoreTools();
|
|
1188
|
+
for (const spec of core.specs) {
|
|
1189
|
+
host.registerHostTool({
|
|
1190
|
+
name: spec.name,
|
|
1191
|
+
description: spec.description,
|
|
1192
|
+
parameters: spec.parameters,
|
|
1193
|
+
handler: async (args) => core.dispatch(spec.name, args as Record<string, unknown>),
|
|
1194
|
+
});
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1182
1197
|
import { registerDashboardPaneHostTools } from './panes/host-tools.js';
|
|
1183
1198
|
import { DEFAULT_THEME_TOKENS, mergeThemeTokens, resolveThemeTokens, type ThemeTokenInput, type ThemeTokens } from '../theme/tokens.js';
|
|
1184
1199
|
import { resolveActiveTheme, setActivePresetInConfig } from './render/theme-resolver.js';
|
|
@@ -1407,6 +1422,8 @@ const isPluginBusy = (host: { active(): { plugin: { isBusy?: (s: any) => boolean
|
|
|
1407
1422
|
// ── Main dashboard ──
|
|
1408
1423
|
|
|
1409
1424
|
export interface ShowDashboardOptions {
|
|
1425
|
+
/** Internal startup timing signal for the first successfully flushed dashboard frame. */
|
|
1426
|
+
onFirstFrameRendered?: () => void;
|
|
1410
1427
|
/** Force debug sinks on at launch (file + mirror). Equivalent to
|
|
1411
1428
|
* typing `/debug on` immediately after startup. Paired with
|
|
1412
1429
|
* chatOnly=true by the `elanous --debug` CLI flag so every traced
|
|
@@ -1501,6 +1518,16 @@ export function buildDashboardTurnTypeaheadPromptZone(input: TurnTypeaheadPrompt
|
|
|
1501
1518
|
};
|
|
1502
1519
|
}
|
|
1503
1520
|
|
|
1521
|
+
/** The chat-main submit branch calls this before any model dispatch. Keeping
|
|
1522
|
+
* the decision here lets the dashboard test execute the same entry point. */
|
|
1523
|
+
export function resolveDashboardHarnessSubmitIntent(
|
|
1524
|
+
text: string,
|
|
1525
|
+
options: Parameters<typeof resolveDashboardChatMainSubmitIntent>[1],
|
|
1526
|
+
resolveIntent: typeof resolveDashboardChatMainSubmitIntent = resolveDashboardChatMainSubmitIntent,
|
|
1527
|
+
) {
|
|
1528
|
+
return routeDevHarnessSubmitIntent(resolveIntent(text, options));
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1504
1531
|
/** 프롬프트 zone 에 관측만 덧입힌다 — 렌더 산출은 `inner` 가 소유한다.
|
|
1505
1532
|
*
|
|
1506
1533
|
* ⭐ **왜 뽑았나**(무인 리뷰 must-fix · 2026-08-01): 종전엔 이 래퍼가 `zones.push({...})` 안에
|
|
@@ -1567,6 +1594,7 @@ export interface DashboardFrameInput {
|
|
|
1567
1594
|
promptCaret: CursorState | null;
|
|
1568
1595
|
suppressPromptArea: boolean;
|
|
1569
1596
|
onEssentialFrameCursorDecision?: (observation: EssentialFrameCursorObservation) => void;
|
|
1597
|
+
onFrameWriteComplete?: (error?: Error | null) => void;
|
|
1570
1598
|
}
|
|
1571
1599
|
|
|
1572
1600
|
export interface EssentialFrameCursorObservation {
|
|
@@ -1612,6 +1640,7 @@ export function renderDashboardFrame(
|
|
|
1612
1640
|
overlay: input.overlay,
|
|
1613
1641
|
force: input.force,
|
|
1614
1642
|
cursor: paintCursor(essentialDecision.cursor ?? input.coordinatorCursor ?? null),
|
|
1643
|
+
onWriteComplete: input.onFrameWriteComplete,
|
|
1615
1644
|
});
|
|
1616
1645
|
input.onEssentialFrameCursorDecision?.({
|
|
1617
1646
|
caret: essentialDecision.cursor,
|
|
@@ -1901,6 +1930,7 @@ export function renderDashboardFirstScreenBand(input: {
|
|
|
1901
1930
|
}
|
|
1902
1931
|
|
|
1903
1932
|
export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<DashboardAction> {
|
|
1933
|
+
let firstDashboardFrameRendered = false;
|
|
1904
1934
|
await awaitGlobalPersonaLoad().catch(() => {});
|
|
1905
1935
|
const dashboardQuitConfirmationState = createQuitConfirmationState();
|
|
1906
1936
|
const signalQuitConfirmationState = createQuitConfirmationState();
|
|
@@ -1910,7 +1940,11 @@ export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<Da
|
|
|
1910
1940
|
closeTui();
|
|
1911
1941
|
};
|
|
1912
1942
|
const exitDashboardTui = (): void => {
|
|
1913
|
-
closeDashboardForExit({
|
|
1943
|
+
closeDashboardForExit({
|
|
1944
|
+
closeTui: closeDashboardTui,
|
|
1945
|
+
confirmationState: dashboardQuitConfirmationState,
|
|
1946
|
+
getSessionId: (): string | undefined => acpSessionIdRef.current ?? undefined,
|
|
1947
|
+
});
|
|
1914
1948
|
};
|
|
1915
1949
|
// ⭐⭐⭐ `N1` — 신호 경로(`SIGINT`/`SIGTERM`)와 저수준 `Ctrl+C` 도 같은 종료를 타게 «등록»한다.
|
|
1916
1950
|
// ⛔ 종전엔 그 둘만 세션 안내를 «못 받았다»(일곱 경로 중 다섯만 받았다).
|
|
@@ -1920,6 +1954,7 @@ export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<Da
|
|
|
1920
1954
|
closeTui: () => { /* 신호 경로: cleanup() 이 이미 복원했다 */ },
|
|
1921
1955
|
confirmationState: signalQuitConfirmationState,
|
|
1922
1956
|
forceQuit: true,
|
|
1957
|
+
getSessionId: (): string | undefined => acpSessionIdRef.current ?? undefined,
|
|
1923
1958
|
});
|
|
1924
1959
|
});
|
|
1925
1960
|
// E3 (§7.4 TS baseline reduction · 2026-05-17) — forward declarations
|
|
@@ -3342,6 +3377,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3342
3377
|
// ⛔ `attachedSessionId`(대화 세션)와 «다른 축»이다 — 루프는 ACP 세션으로 스코프를 연다.
|
|
3343
3378
|
// ⚠️ 세션은 이 함수 «뒤»에서 만들어지므로 참조로 둔다(호출 시점엔 채워져 있다).
|
|
3344
3379
|
const acpSessionIdRef: { current: string | null } = { current: null };
|
|
3380
|
+
const adoptedAcpSessionIds = new Set<string>();
|
|
3381
|
+
let activeAcpSessionId: string | null = null;
|
|
3345
3382
|
const activeSessionIdForTypeahead = (): string | null => acpSessionIdRef.current;
|
|
3346
3383
|
const paintTurnTypeaheadEcho = (): void => {
|
|
3347
3384
|
const { rows: tr, cols: tc } = termSize();
|
|
@@ -10014,16 +10051,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
10014
10051
|
// family(전 surface 기본) — 이로써 TUI 에서도 "P2 왜 실패?" 를 엘라누스가 툴로 상황판단한다.
|
|
10015
10052
|
// fail-soft: 코어 도구 로드 실패가 대시보드 부팅을 막지 않는다.
|
|
10016
10053
|
try {
|
|
10017
|
-
|
|
10018
|
-
const core = coreMod.buildCoreTools();
|
|
10019
|
-
for (const spec of core.specs) {
|
|
10020
|
-
pluginHost.registerHostTool({
|
|
10021
|
-
name: spec.name,
|
|
10022
|
-
description: spec.description,
|
|
10023
|
-
parameters: spec.parameters,
|
|
10024
|
-
handler: async (args) => core.dispatch(spec.name, args as Record<string, unknown>),
|
|
10025
|
-
});
|
|
10026
|
-
}
|
|
10054
|
+
registerDashboardCoreHostTools(pluginHost);
|
|
10027
10055
|
} catch { /* fail-soft */ }
|
|
10028
10056
|
// LSP (Phase L3 of 내부 문서 `ROADMAP-lsp-integration`) — structural /
|
|
10029
10057
|
// symbol-level source queries via typescript-language-server. Pool
|
|
@@ -11530,6 +11558,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
11530
11558
|
// ⭐ Single flush: resolve the prompt caret after overlays.
|
|
11531
11559
|
const frameCursorDecision = display.cursorDecision();
|
|
11532
11560
|
renderDashboardFrame(baseLines, composeDashboardFrameWithCoordinatorModal(display, {
|
|
11561
|
+
onFrameWriteComplete: firstDashboardFrameRendered ? undefined : (error) => {
|
|
11562
|
+
if (error || firstDashboardFrameRendered) return;
|
|
11563
|
+
firstDashboardFrameRendered = true;
|
|
11564
|
+
try { opts.onFirstFrameRendered?.(); } catch { /* timing must not break dashboard */ }
|
|
11565
|
+
},
|
|
11533
11566
|
overlay: modalFrame,
|
|
11534
11567
|
force: forceFromCoordinator || modalKey !== lastModalKey,
|
|
11535
11568
|
cursorOwner: frameCursorDecision.owner,
|
|
@@ -17422,7 +17455,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
17422
17455
|
// resource_link blocks so dropped screenshots and PDFs flow
|
|
17423
17456
|
// naturally to the agent. debug.log gates the snapshot so
|
|
17424
17457
|
// off-state stays zero-cost.
|
|
17425
|
-
const submitIntent =
|
|
17458
|
+
const submitIntent = resolveDashboardHarnessSubmitIntent(input.text, {
|
|
17426
17459
|
stickyBackend: dashboardAcpChat.getSticky(),
|
|
17427
17460
|
source: input.externalSubmitSource,
|
|
17428
17461
|
});
|
|
@@ -17443,7 +17476,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
17443
17476
|
}
|
|
17444
17477
|
if (submitIntent.kind === 'submit-turn' && submitIntent.route === 'sticky-acp') {
|
|
17445
17478
|
await runDashboardChatMainSubmitIntent({
|
|
17446
|
-
submit: createDashboardChatMainTurnSubmit(
|
|
17479
|
+
submit: createDashboardChatMainTurnSubmit({
|
|
17480
|
+
...submitIntent,
|
|
17481
|
+
sessionId: submitIntent.sessionId ?? dashboardAcpSession.currentSessionId,
|
|
17482
|
+
}),
|
|
17447
17483
|
beforeExecute: (submit) => {
|
|
17448
17484
|
maybeEmitDashboardSubmitQuickPass({
|
|
17449
17485
|
submit,
|
|
@@ -19186,16 +19222,19 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
19186
19222
|
do {
|
|
19187
19223
|
const turnText = goalLoopUserText ?? tok.text;
|
|
19188
19224
|
await runDashboardChatMainSubmitIntent({
|
|
19189
|
-
submit: createDashboardChatMainTurnSubmit(
|
|
19190
|
-
submitIntent.kind === 'submit-turn' && submitIntent.route === 'plain' && goalLoopUserText === null
|
|
19191
|
-
|
|
19192
|
-
|
|
19193
|
-
|
|
19194
|
-
|
|
19195
|
-
|
|
19196
|
-
|
|
19197
|
-
|
|
19198
|
-
|
|
19225
|
+
submit: createDashboardChatMainTurnSubmit({
|
|
19226
|
+
...(submitIntent.kind === 'submit-turn' && submitIntent.route === 'plain' && goalLoopUserText === null
|
|
19227
|
+
? submitIntent
|
|
19228
|
+
: {
|
|
19229
|
+
kind: 'submit-turn' as const,
|
|
19230
|
+
source: { kind: 'keyboard' as const, surface: 'dashboard-chat-main' },
|
|
19231
|
+
text: turnText,
|
|
19232
|
+
route: 'plain' as const,
|
|
19233
|
+
}),
|
|
19234
|
+
sessionId: submitIntent.kind === 'submit-turn'
|
|
19235
|
+
? submitIntent.sessionId ?? dashboardAcpSession.currentSessionId
|
|
19236
|
+
: dashboardAcpSession.currentSessionId,
|
|
19237
|
+
}),
|
|
19199
19238
|
beforeExecute: (submit) => {
|
|
19200
19239
|
maybeEmitDashboardSubmitQuickPass({
|
|
19201
19240
|
submit,
|
|
@@ -19246,6 +19285,29 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
19246
19285
|
}
|
|
19247
19286
|
} while (goalLoopUserText !== null);
|
|
19248
19287
|
|
|
19288
|
+
// SESSION-RESUME-ISOLATED: 완료된 턴의 ACP 세션을 원장에 등록하고 active 로 지정한다.
|
|
19289
|
+
// 서버의 완료-채택(persistCompletedTuiAcpTurn)은 origin_session 메타가 실렸을 때만
|
|
19290
|
+
// 도는데, 격리 우주 첫 턴에는 origin 세션이 없어 메타가 안 실린다 — 여기가 그 갭을 닫는다.
|
|
19291
|
+
const completedAcpSessionId = dashboardAcpSession.currentSessionId;
|
|
19292
|
+
if (completedAcpSessionId) {
|
|
19293
|
+
acpSessionIdRef.current = completedAcpSessionId;
|
|
19294
|
+
// 원격 데몬 세션의 원장은 데몬이 소유한다. 로컬 등록은 세션마다 한 번만 한다.
|
|
19295
|
+
if (!daemonAttached && activeAcpSessionId !== completedAcpSessionId) {
|
|
19296
|
+
try {
|
|
19297
|
+
if (!adoptedAcpSessionIds.has(completedAcpSessionId)) {
|
|
19298
|
+
adoptChatSession(completedAcpSessionId, { source: 'tui', transport: 'acp' });
|
|
19299
|
+
adoptedAcpSessionIds.add(completedAcpSessionId);
|
|
19300
|
+
}
|
|
19301
|
+
markActiveChatSession(completedAcpSessionId);
|
|
19302
|
+
activeAcpSessionId = completedAcpSessionId;
|
|
19303
|
+
} catch (error) {
|
|
19304
|
+
// 등록 실패가 대화 흐름을 끊지 않되, 다음 턴 재시도 전 원인을 남긴다.
|
|
19305
|
+
debug.log('session.adopt', 'failed', { sessionId: completedAcpSessionId, error: String(error) });
|
|
19306
|
+
pushDebugLine(C.warning(`session adopt failed: ${String(error)}`));
|
|
19307
|
+
}
|
|
19308
|
+
}
|
|
19309
|
+
}
|
|
19310
|
+
|
|
19249
19311
|
continue; // stay in input mode after chat
|
|
19250
19312
|
} // end while (input mode loop)
|
|
19251
19313
|
// Disarm the prompt-repaint hook: textInput's drawAll
|
|
@@ -191,10 +191,15 @@ export async function runDashboardChatMainPlainTurn(
|
|
|
191
191
|
// 「사다리가 안 걸린 것」과 「걸렸는데 키가 딴 데로 간 것」을 ***원리상 못 갈랐다***.
|
|
192
192
|
// ⭐ 이 한 줄이 그 둘을 가른다 — 이 이벤트가 «있는데» typeahead 가 0이면 후자다.
|
|
193
193
|
// ⛔ 행동을 바꾸지 않는다(관측만). 처방은 `RFC-tui-mid-turn-input-queue-2026-08-19` §2 Q1.
|
|
194
|
+
const startedAtDate = new Date(deps.turnStartedAt);
|
|
195
|
+
const turnStartedAtIso = Number.isFinite(startedAtDate.getTime())
|
|
196
|
+
? startedAtDate.toISOString()
|
|
197
|
+
: undefined;
|
|
194
198
|
try {
|
|
195
199
|
deps.debugLog?.('chat-main.plain-turn', 'streaming-keys-attached', {
|
|
196
200
|
userTextBytes: Buffer.byteLength(userText ?? '', 'utf8'),
|
|
197
201
|
turnStartedAt: deps.turnStartedAt,
|
|
202
|
+
turnStartedAtIso,
|
|
198
203
|
});
|
|
199
204
|
} catch { /* fail-soft — 관측이 턴을 막지 않는다 */ }
|
|
200
205
|
let stage = 'streaming-keys-attached';
|
|
@@ -291,11 +296,32 @@ export async function runDashboardChatMainPlainTurn(
|
|
|
291
296
|
});
|
|
292
297
|
|
|
293
298
|
if (finishIfAborted()) return;
|
|
299
|
+
// TUI-FIRST-TURN-STALL — 09:48 표본에서 llm.stream consume-start 뒤
|
|
300
|
+
// first-token 이벤트가 0건이어서 「첫 토큰까지의 구간」을 잴 표면이 없었다.
|
|
301
|
+
// turnStartedAt 를 재사용해 첫 비어 있지 않은 text chunk 에 정확히 한 번
|
|
302
|
+
// chat.turn/first-token 을 남긴다. 도구 호출이 먼저 흘러도 text 가 도착해야
|
|
303
|
+
// 기록되므로 request→first-token 구간은 그대로 측정된다. ISO 시각 좌표는
|
|
304
|
+
// pty record 및 TUI-BOOT-TIME(src/index.ts) 부팅 계측과의 대응용이다.
|
|
305
|
+
let firstTokenLogged = false;
|
|
306
|
+
const logFirstToken = (chunk: string): void => {
|
|
307
|
+
if (firstTokenLogged || !chunk || abortCtrl.signal.aborted) return;
|
|
308
|
+
firstTokenLogged = true;
|
|
309
|
+
const firstTokenAt = Date.now();
|
|
310
|
+
try {
|
|
311
|
+
deps.debugLog?.('chat.turn', 'first-token', {
|
|
312
|
+
ms: firstTokenAt - deps.turnStartedAt,
|
|
313
|
+
turnStartedAt: deps.turnStartedAt,
|
|
314
|
+
turnStartedAtIso,
|
|
315
|
+
firstTokenAtIso: new Date(firstTokenAt).toISOString(),
|
|
316
|
+
});
|
|
317
|
+
} catch { /* fail-soft — 관측이 턴을 막지 않는다 */ }
|
|
318
|
+
};
|
|
294
319
|
const streamResult = await runDashboardPlainTurnStream({
|
|
295
320
|
userText,
|
|
296
321
|
abortCtrl,
|
|
297
322
|
acpSession: deps.acpSession,
|
|
298
323
|
onText: (chunk, accumulated) => {
|
|
324
|
+
logFirstToken(chunk);
|
|
299
325
|
turnStreamRuntime.onText(chunk, accumulated);
|
|
300
326
|
},
|
|
301
327
|
onToolCall: (call) => {
|
|
@@ -387,12 +387,13 @@ import {
|
|
|
387
387
|
import { resolveLocalEndpoints, runLocalLLMCompat } from '../../local-llm-test.js';
|
|
388
388
|
import { getShellRegistry } from '../../shell-runner/registry.js';
|
|
389
389
|
import { renderHandleStatusChip, type HandleStatus } from '../../status/chip.js';
|
|
390
|
-
import { decideAttach } from '../../shell-runner/attach-routing.js';
|
|
391
390
|
import type { DashboardTermSlashRuntime } from '../term-slash-runtime.js';
|
|
392
391
|
import { resolveTerminalMoveDestination } from '../../terminal-matrix/mobility.js';
|
|
393
392
|
import { loadPersistedSessions } from '../../terminal/session-persistence.js';
|
|
394
393
|
import { dispatchTerminalModalObserve } from '../../skills/tools/terminal-modal.js';
|
|
395
394
|
import { SlashCommandRegistry } from './registry.js';
|
|
395
|
+
import { registerShellSlash } from './shell-slash.js';
|
|
396
|
+
export { registerShellSlash } from './shell-slash.js';
|
|
396
397
|
import { cronSecondDueAt, filterLoopRows, formatLoopsTable, localLoopRows, type LoopsTableRow } from './loops-table.js';
|
|
397
398
|
import { loopCronVerdict } from '../../loops/verdict.js';
|
|
398
399
|
import { checklistBoardSlash } from '../../release-loop/checklist-board.js';
|
|
@@ -2489,6 +2490,12 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2489
2490
|
});
|
|
2490
2491
|
if (result.kind === 'launch') {
|
|
2491
2492
|
ctx.chatLines.push(ctx.accent(` ✅ 전제 검사 통과 — 골: ${result.goalFile}`));
|
|
2493
|
+
const { resolveObserveOnlyDecision } = await import('../../self-implement/observe-only.js');
|
|
2494
|
+
if (resolveObserveOnlyDecision().enabled) {
|
|
2495
|
+
ctx.chatLines.push(ctx.muted(' 관측 전용이라 런을 발사하지 않았습니다 · 코드도 안 바꿨습니다'));
|
|
2496
|
+
ctx.chatLines.push(ctx.muted(' 조회: elanous logs --category self-implement --since 10m'));
|
|
2497
|
+
return;
|
|
2498
|
+
}
|
|
2492
2499
|
// ⭐ 런을 «띄운다» — detached 라 이 TUI 를 닫아도 런은 산다.
|
|
2493
2500
|
// ⛔ spawn 을 여기서 새로 쓰지 않는다 — `launchDevGoalFileDetached` «한 자리»가 인자·env 를 갖는다.
|
|
2494
2501
|
// ⛔ 그리고 「띄웠다」와 「끝났다」는 다른 값이다 — 이 표면은 «띄운 것»까지만 말한다.
|
|
@@ -3715,143 +3722,8 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
3715
3722
|
ctx.setChatScrollOffset(-1);
|
|
3716
3723
|
});
|
|
3717
3724
|
|
|
3718
|
-
|
|
3719
|
-
|
|
3720
|
-
// ShellRegistry singleton (set up in the boot block in
|
|
3721
|
-
// dashboard/index.ts). Kill uses prefix matching on id so users
|
|
3722
|
-
// don't have to type the full slug; attach routes a vw-mode handle
|
|
3723
|
-
// into the foreground via VW switch.
|
|
3724
|
-
//
|
|
3725
|
-
// getShellRegistry + renderHandleStatusChip + decideAttach hoisted
|
|
3726
|
-
// from dynamic to static imports here. Host-local helpers
|
|
3727
|
-
// (shellSlashRuntime + openShellRollupPopup + virtualWindows ops)
|
|
3728
|
-
// come via ctx.shellSlash.
|
|
3729
|
-
const sub = (args[0] ?? '').toLowerCase();
|
|
3730
|
-
const reg = getShellRegistry();
|
|
3731
|
-
if (!sub || sub === 'help') {
|
|
3732
|
-
for (const line of ctx.shellSlash.slashRuntime.helpLines()) ctx.chatLines.push(line);
|
|
3733
|
-
ctx.setChatScrollOffset(-1);
|
|
3734
|
-
return;
|
|
3735
|
-
}
|
|
3736
|
-
const resolveHandle = (needle: string) => {
|
|
3737
|
-
const want = needle.toLowerCase();
|
|
3738
|
-
if (!want) return null;
|
|
3739
|
-
const exact = reg.get(needle);
|
|
3740
|
-
if (exact) return exact;
|
|
3741
|
-
const all = reg.list();
|
|
3742
|
-
const matches = all.filter(h => h.id.toLowerCase().startsWith(want));
|
|
3743
|
-
if (matches.length === 1) return matches[0]!;
|
|
3744
|
-
return matches.length > 1 ? { ambiguous: matches } as const : null;
|
|
3745
|
-
};
|
|
3746
|
-
if (sub === 'rollup') {
|
|
3747
|
-
// N2 — same popup as the 🐚 pill click, openable from
|
|
3748
|
-
// keyboard-only sessions (SSH / nested tmux).
|
|
3749
|
-
await ctx.shellSlash.openRollupPopup();
|
|
3750
|
-
return;
|
|
3751
|
-
}
|
|
3752
|
-
if (sub === 'list') {
|
|
3753
|
-
// N3 — `/shell list all` bypasses the 30s settled TTL so users
|
|
3754
|
-
// can audit everything. Default stays live-only.
|
|
3755
|
-
const showSettled = (args[1] ?? '').toLowerCase() === 'all';
|
|
3756
|
-
const all = reg.list(showSettled ? { includeSettled: true } : undefined);
|
|
3757
|
-
ctx.chatLines.push('');
|
|
3758
|
-
if (all.length === 0) {
|
|
3759
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.emptyListLine(showSettled));
|
|
3760
|
-
ctx.setChatScrollOffset(-1);
|
|
3761
|
-
return;
|
|
3762
|
-
}
|
|
3763
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.listHeaderLine(all.length, showSettled));
|
|
3764
|
-
for (const h of all) {
|
|
3765
|
-
const chip = renderHandleStatusChip(h.status);
|
|
3766
|
-
const label = reg.getVwLabel(h.id);
|
|
3767
|
-
const idTail = h.id.length > 10 ? `…${h.id.slice(-8)}` : h.id;
|
|
3768
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.listEntryLine({
|
|
3769
|
-
idTail,
|
|
3770
|
-
chip,
|
|
3771
|
-
mode: h.mode,
|
|
3772
|
-
label,
|
|
3773
|
-
}));
|
|
3774
|
-
}
|
|
3775
|
-
ctx.setChatScrollOffset(-1);
|
|
3776
|
-
return;
|
|
3777
|
-
}
|
|
3778
|
-
if (sub === 'kill') {
|
|
3779
|
-
const needle = args[1] ?? '';
|
|
3780
|
-
if (!needle) {
|
|
3781
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.killUsageLine());
|
|
3782
|
-
ctx.setChatScrollOffset(-1);
|
|
3783
|
-
return;
|
|
3784
|
-
}
|
|
3785
|
-
const res = resolveHandle(needle);
|
|
3786
|
-
if (!res) {
|
|
3787
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.noHandleMatchesLine(needle));
|
|
3788
|
-
} else if ('ambiguous' in res) {
|
|
3789
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousHeaderLine(needle));
|
|
3790
|
-
for (const h of res.ambiguous) {
|
|
3791
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousEntryLine({ id: h.id }));
|
|
3792
|
-
}
|
|
3793
|
-
} else {
|
|
3794
|
-
try {
|
|
3795
|
-
res.kill();
|
|
3796
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.killedLine(res.id));
|
|
3797
|
-
} catch (err) {
|
|
3798
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.killFailedLine(
|
|
3799
|
-
err instanceof Error ? err.message : String(err),
|
|
3800
|
-
));
|
|
3801
|
-
}
|
|
3802
|
-
}
|
|
3803
|
-
ctx.setChatScrollOffset(-1);
|
|
3804
|
-
return;
|
|
3805
|
-
}
|
|
3806
|
-
if (sub === 'attach') {
|
|
3807
|
-
const needle = args[1] ?? '';
|
|
3808
|
-
if (!needle) {
|
|
3809
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.attachUsageLine());
|
|
3810
|
-
ctx.setChatScrollOffset(-1);
|
|
3811
|
-
return;
|
|
3812
|
-
}
|
|
3813
|
-
const res = resolveHandle(needle);
|
|
3814
|
-
if (!res) {
|
|
3815
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.noHandleMatchesLine(needle));
|
|
3816
|
-
ctx.setChatScrollOffset(-1);
|
|
3817
|
-
return;
|
|
3818
|
-
}
|
|
3819
|
-
if ('ambiguous' in res) {
|
|
3820
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousHeaderLine(needle));
|
|
3821
|
-
for (const h of res.ambiguous) {
|
|
3822
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousEntryLine({ id: h.id }));
|
|
3823
|
-
}
|
|
3824
|
-
ctx.setChatScrollOffset(-1);
|
|
3825
|
-
return;
|
|
3826
|
-
}
|
|
3827
|
-
// SRF-2 — attach routing by mode, delegated to the pure
|
|
3828
|
-
// decision fn in shell-runner/attach-routing.ts.
|
|
3829
|
-
const outcome = decideAttach(res, {
|
|
3830
|
-
getVwLabel: (id) => reg.getVwLabel(id),
|
|
3831
|
-
resolveVwIdByLabel: (label) => ctx.shellSlash.resolveVwIdByLabel(label),
|
|
3832
|
-
});
|
|
3833
|
-
if (outcome.kind === 'switch-vw') {
|
|
3834
|
-
ctx.shellSlash.virtualWindowsSwitchTo(outcome.windowId);
|
|
3835
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.attachedLine(
|
|
3836
|
-
outcome.windowId,
|
|
3837
|
-
outcome.label,
|
|
3838
|
-
outcome.mode,
|
|
3839
|
-
));
|
|
3840
|
-
} else if (outcome.kind === 'bg') {
|
|
3841
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.bgAttachWarningLine(outcome.status));
|
|
3842
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.bgAttachHintLine());
|
|
3843
|
-
} else if (outcome.kind === 'no-window') {
|
|
3844
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.noWindowAttachWarningLine(outcome.reason));
|
|
3845
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.noWindowAttachHintLine());
|
|
3846
|
-
} else {
|
|
3847
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.genericAttachWarningLine(outcome.reason));
|
|
3848
|
-
}
|
|
3849
|
-
ctx.setChatScrollOffset(-1);
|
|
3850
|
-
return;
|
|
3851
|
-
}
|
|
3852
|
-
ctx.chatLines.push(ctx.shellSlash.slashRuntime.unknownSubcommandLine(sub));
|
|
3853
|
-
ctx.setChatScrollOffset(-1);
|
|
3854
|
-
});
|
|
3725
|
+
|
|
3726
|
+
registerShellSlash(registry);
|
|
3855
3727
|
|
|
3856
3728
|
// ── B-3.b ─────────────────────────────────────────────────────────
|
|
3857
3729
|
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import type { DashboardSlashContext, DashboardSlashReturn } from './dashboard-handlers.js';
|
|
2
|
+
import { getShellRegistry } from '../../shell-runner/registry.js';
|
|
3
|
+
import { renderHandleStatusChip } from '../../status/chip.js';
|
|
4
|
+
import { decideAttach } from '../../shell-runner/attach-routing.js';
|
|
5
|
+
import type { SlashCommandRegistry } from './registry.js';
|
|
6
|
+
|
|
7
|
+
export function registerShellSlash(registry: SlashCommandRegistry<DashboardSlashContext, DashboardSlashReturn>): void {
|
|
8
|
+
registry.register(['shell', 'sh'], async (args, ctx) => {
|
|
9
|
+
// SP-C — /shell list|kill|attach family. Talks to the
|
|
10
|
+
// ShellRegistry singleton (set up in the boot block in
|
|
11
|
+
// dashboard/index.ts). Kill uses prefix matching on id so users
|
|
12
|
+
// don't have to type the full slug; attach routes a vw-mode handle
|
|
13
|
+
// into the foreground via VW switch.
|
|
14
|
+
//
|
|
15
|
+
// getShellRegistry + renderHandleStatusChip + decideAttach hoisted
|
|
16
|
+
// from dynamic to static imports here. Host-local helpers
|
|
17
|
+
// (shellSlashRuntime + openShellRollupPopup + virtualWindows ops)
|
|
18
|
+
// come via ctx.shellSlash.
|
|
19
|
+
const sub = (args[0] ?? '').toLowerCase();
|
|
20
|
+
const reg = getShellRegistry();
|
|
21
|
+
if (!sub || sub === 'help') {
|
|
22
|
+
for (const line of ctx.shellSlash.slashRuntime.helpLines()) ctx.chatLines.push(line);
|
|
23
|
+
ctx.setChatScrollOffset(-1);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const resolveHandle = (needle: string) => {
|
|
27
|
+
const want = needle.toLowerCase();
|
|
28
|
+
if (!want) return null;
|
|
29
|
+
const exact = reg.get(needle);
|
|
30
|
+
if (exact) return exact;
|
|
31
|
+
const all = reg.list();
|
|
32
|
+
const matches = all.filter(h => h.id.toLowerCase().startsWith(want));
|
|
33
|
+
if (matches.length === 1) return matches[0]!;
|
|
34
|
+
return matches.length > 1 ? { ambiguous: matches } as const : null;
|
|
35
|
+
};
|
|
36
|
+
if (sub === 'rollup') {
|
|
37
|
+
// N2 — same popup as the 🐚 pill click, openable from
|
|
38
|
+
// keyboard-only sessions (SSH / nested tmux).
|
|
39
|
+
await ctx.shellSlash.openRollupPopup();
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (sub === 'list') {
|
|
43
|
+
// N3 — `/shell list all` bypasses the 30s settled TTL so users
|
|
44
|
+
// can audit everything. Default stays live-only.
|
|
45
|
+
const showSettled = (args[1] ?? '').toLowerCase() === 'all';
|
|
46
|
+
const all = reg.list(showSettled ? { includeSettled: true } : undefined);
|
|
47
|
+
ctx.chatLines.push('');
|
|
48
|
+
if (all.length === 0) {
|
|
49
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.emptyListLine(showSettled));
|
|
50
|
+
ctx.setChatScrollOffset(-1);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.listHeaderLine(all.length, showSettled));
|
|
54
|
+
for (const h of all) {
|
|
55
|
+
const chip = renderHandleStatusChip(h.status);
|
|
56
|
+
const label = reg.getVwLabel(h.id);
|
|
57
|
+
const idTail = h.id.length > 10 ? `…${h.id.slice(-8)}` : h.id;
|
|
58
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.listEntryLine({
|
|
59
|
+
idTail,
|
|
60
|
+
chip,
|
|
61
|
+
mode: h.mode,
|
|
62
|
+
label,
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
ctx.setChatScrollOffset(-1);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (sub === 'kill') {
|
|
69
|
+
const needle = args[1] ?? '';
|
|
70
|
+
if (!needle) {
|
|
71
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.killUsageLine());
|
|
72
|
+
ctx.setChatScrollOffset(-1);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const res = resolveHandle(needle);
|
|
76
|
+
if (!res) {
|
|
77
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.noHandleMatchesLine(needle));
|
|
78
|
+
} else if ('ambiguous' in res) {
|
|
79
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousHeaderLine(needle));
|
|
80
|
+
for (const h of res.ambiguous) {
|
|
81
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousEntryLine({ id: h.id }));
|
|
82
|
+
}
|
|
83
|
+
} else {
|
|
84
|
+
try {
|
|
85
|
+
res.kill();
|
|
86
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.killedLine(res.id));
|
|
87
|
+
} catch (err) {
|
|
88
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.killFailedLine(
|
|
89
|
+
err instanceof Error ? err.message : String(err),
|
|
90
|
+
));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
ctx.setChatScrollOffset(-1);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (sub === 'attach') {
|
|
97
|
+
const needle = args[1] ?? '';
|
|
98
|
+
if (!needle) {
|
|
99
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.attachUsageLine());
|
|
100
|
+
ctx.setChatScrollOffset(-1);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const res = resolveHandle(needle);
|
|
104
|
+
if (!res) {
|
|
105
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.noHandleMatchesLine(needle));
|
|
106
|
+
ctx.setChatScrollOffset(-1);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if ('ambiguous' in res) {
|
|
110
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousHeaderLine(needle));
|
|
111
|
+
for (const h of res.ambiguous) {
|
|
112
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.ambiguousEntryLine({ id: h.id }));
|
|
113
|
+
}
|
|
114
|
+
ctx.setChatScrollOffset(-1);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// SRF-2 — attach routing by mode, delegated to the pure
|
|
118
|
+
// decision fn in shell-runner/attach-routing.ts.
|
|
119
|
+
const outcome = decideAttach(res, {
|
|
120
|
+
getVwLabel: (id) => reg.getVwLabel(id),
|
|
121
|
+
resolveVwIdByLabel: (label) => ctx.shellSlash.resolveVwIdByLabel(label),
|
|
122
|
+
});
|
|
123
|
+
if (outcome.kind === 'switch-vw') {
|
|
124
|
+
ctx.shellSlash.virtualWindowsSwitchTo(outcome.windowId);
|
|
125
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.attachedLine(
|
|
126
|
+
outcome.windowId,
|
|
127
|
+
outcome.label,
|
|
128
|
+
outcome.mode,
|
|
129
|
+
));
|
|
130
|
+
} else if (outcome.kind === 'bg') {
|
|
131
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.bgAttachWarningLine(outcome.status));
|
|
132
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.bgAttachHintLine());
|
|
133
|
+
} else if (outcome.kind === 'no-window') {
|
|
134
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.noWindowAttachWarningLine(outcome.reason));
|
|
135
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.noWindowAttachHintLine());
|
|
136
|
+
} else {
|
|
137
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.genericAttachWarningLine(outcome.reason));
|
|
138
|
+
}
|
|
139
|
+
ctx.setChatScrollOffset(-1);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
ctx.chatLines.push(ctx.shellSlash.slashRuntime.unknownSubcommandLine(sub));
|
|
143
|
+
ctx.setChatScrollOffset(-1);
|
|
144
|
+
});
|
|
145
|
+
}
|
package/src/debug/log-diet.ts
CHANGED
|
@@ -23,6 +23,13 @@ export const LOG_DIET_KEYS: Readonly<Record<string, 'repeat' | 'consecutive'>> =
|
|
|
23
23
|
// read it back from logs and count rows (`admissionCounts`) — it is a judgment-path event.
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
+
/** LOG-DIET-2 — per-key fold windows (ms). "State echo" keys whose value rarely changes fold on a
|
|
27
|
+
* longer window than the default 60s, so a slow-rotation emitter (one row per question per tick)
|
|
28
|
+
* stays folded instead of re-admitting every window. Keys not listed here keep the guard default. */
|
|
29
|
+
export const LOG_DIET_KEY_WINDOW_MS: Readonly<Record<string, number>> = {
|
|
30
|
+
'hitl.card-bridge/skipped': 30 * 60_000,
|
|
31
|
+
};
|
|
32
|
+
|
|
26
33
|
export interface LogDietSummary {
|
|
27
34
|
category: string;
|
|
28
35
|
event: string;
|
|
@@ -44,6 +51,8 @@ interface Stream {
|
|
|
44
51
|
sessionId?: string;
|
|
45
52
|
value: string;
|
|
46
53
|
lastEmittedAt: number;
|
|
54
|
+
/** Fold window pinned at stream creation: `keyWindowMs[key] ?? windowMs`. */
|
|
55
|
+
windowMs: number;
|
|
47
56
|
count: number;
|
|
48
57
|
firstSuppressedAt?: string;
|
|
49
58
|
lastSuppressedAt?: string;
|
|
@@ -66,6 +75,7 @@ function stableValue(value: unknown): string {
|
|
|
66
75
|
|
|
67
76
|
export class LogDietGuard {
|
|
68
77
|
private readonly windowMs: number;
|
|
78
|
+
private readonly keyWindowMs: Readonly<Record<string, number>>;
|
|
69
79
|
private readonly now: () => number;
|
|
70
80
|
private readonly keys: Readonly<Record<string, Policy>>;
|
|
71
81
|
private readonly maxStreams: number;
|
|
@@ -76,8 +86,9 @@ export class LogDietGuard {
|
|
|
76
86
|
private lastSummaryReleaseAt = Number.NEGATIVE_INFINITY;
|
|
77
87
|
private pendingStreams = 0;
|
|
78
88
|
|
|
79
|
-
constructor(opts: { windowMs?: number; now?: () => number; keys?: Readonly<Record<string, Policy>>; maxStreams?: number; summaryMinIntervalMs?: number; summaryMaxPending?: number } = {}) {
|
|
89
|
+
constructor(opts: { windowMs?: number; keyWindowMs?: Readonly<Record<string, number>>; now?: () => number; keys?: Readonly<Record<string, Policy>>; maxStreams?: number; summaryMinIntervalMs?: number; summaryMaxPending?: number } = {}) {
|
|
80
90
|
this.windowMs = opts.windowMs ?? LOG_DIET_WINDOW_MS;
|
|
91
|
+
this.keyWindowMs = opts.keyWindowMs ?? LOG_DIET_KEY_WINDOW_MS;
|
|
81
92
|
this.now = opts.now ?? Date.now;
|
|
82
93
|
this.keys = opts.keys ?? LOG_DIET_KEYS;
|
|
83
94
|
this.maxStreams = Math.max(1, opts.maxStreams ?? 2000);
|
|
@@ -92,7 +103,7 @@ export class LogDietGuard {
|
|
|
92
103
|
category: stream.category,
|
|
93
104
|
event: stream.event,
|
|
94
105
|
count: stream.count,
|
|
95
|
-
windowMs:
|
|
106
|
+
windowMs: stream.windowMs,
|
|
96
107
|
firstSuppressedAt: stream.firstSuppressedAt!,
|
|
97
108
|
lastSuppressedAt: stream.lastSuppressedAt!,
|
|
98
109
|
...(stream.runId !== undefined ? { runId: stream.runId } : {}),
|
|
@@ -121,12 +132,13 @@ export class LogDietGuard {
|
|
|
121
132
|
? [rec.category, rec.event, value]
|
|
122
133
|
: [rec.category, rec.event, sessionId, runId]);
|
|
123
134
|
const time = this.now();
|
|
135
|
+
const windowMs = this.keyWindowMs[`${rec.category}/${rec.event}`] ?? this.windowMs;
|
|
124
136
|
const summaries: LogDietSummary[] = [];
|
|
125
137
|
const stream = this.streams.get(key);
|
|
126
138
|
if (stream) {
|
|
127
139
|
this.streams.delete(key); // Evict the least recently observed flow.
|
|
128
140
|
this.streams.set(key, stream);
|
|
129
|
-
if ((policy === 'repeat' || stream.value === value) && time - stream.lastEmittedAt <
|
|
141
|
+
if ((policy === 'repeat' || stream.value === value) && time - stream.lastEmittedAt < stream.windowMs) {
|
|
130
142
|
if (stream.count === 0) this.pendingStreams++;
|
|
131
143
|
stream.count++;
|
|
132
144
|
const at = new Date(time).toISOString();
|
|
@@ -154,7 +166,7 @@ export class LogDietGuard {
|
|
|
154
166
|
this.streams.set(key, { category: rec.category, event: rec.event,
|
|
155
167
|
...(typeof runId === 'string' ? { runId } : {}),
|
|
156
168
|
...(sessionId !== undefined ? { sessionId } : {}),
|
|
157
|
-
value, lastEmittedAt: time, count: 0 });
|
|
169
|
+
value, lastEmittedAt: time, windowMs, count: 0 });
|
|
158
170
|
return { pass: true, summaries };
|
|
159
171
|
}
|
|
160
172
|
|