elanous 0.2.27 → 0.2.29
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/{Ev2jivDMTSoEc-5rIXdcy → cIpv5nU9AycwYWZI9H589}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{ab4d57c2.e90bc2cb31949045.js → 058a98ba.7eb28d5e6dc03565.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4565-67e4c620597965c8.js → 1015-9cba22a5a4554797.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1084-4e66af7376a18db7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1106.3a6410b7b0c70ad4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1127.32fc642f70423506.js +8 -0
- package/apps/pwa/out/_next/static/chunks/{1516.83dd2c1b86b4e507.js → 1142.65d002789ab3af7d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1189-d9b8e1995a831fae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1224.6da98c7ad0eb7dd8.js +34 -0
- package/apps/pwa/out/_next/static/chunks/1370.4e3e2558f111fd5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1514-b7da377fdc4eb17a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1516.dfaceff3fd2d0e0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1577.3c24c32584e10d70.js +286 -0
- package/apps/pwa/out/_next/static/chunks/161.130a569855c4d68c.js +24 -0
- package/apps/pwa/out/_next/static/chunks/1782-59db1b5aa06df38a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1743.563d3168e95825ef.js → 1852.7f7b53991fcb99ef.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1864.16da9556e78a9236.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1b6f6b2a.aff090122be3726e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2341.e8a9135e5b910dd5.js +36 -0
- package/apps/pwa/out/_next/static/chunks/257.10afdbe3520f2fc2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2658.87550e692dc493f6.js +64 -0
- package/apps/pwa/out/_next/static/chunks/2673.85e2f02efae7a85f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2766-bee623b37472ed63.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2794.6d836872b0bf43e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2806.eb57ced1a528ed39.js +1 -0
- package/apps/pwa/out/_next/static/chunks/283.7a121c4910e6dad7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{65ebff95.081daeff622d238e.js → 285adb1a.5654e605dddf86d2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2870.1dc29aa5fc01f09f.js +115 -0
- package/apps/pwa/out/_next/static/chunks/293.fd38e77ce5d48103.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2993-5952a1cd3fd5d441.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3160-95c96f4d2a21dd26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/32-a523427c5bd5ed00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3280.af38002a6424a905.js +90 -0
- package/apps/pwa/out/_next/static/chunks/328bb3ab-6628a1114fe3fb3b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3292-5ddffdb2f517b44f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9917-9e26abc5f7772735.js → 3396-97b97928c49190c9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6196.34d6b229079e9e28.js → 3403.7199205e65124486.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3523.d3231daaf7aba993.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3763.577de3181e1e6ea0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4138-cc56b0938ef72783.js +1 -0
- package/apps/pwa/out/_next/static/chunks/419.736c0d6f426249a7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4255-8350c43d307a8875.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6def8a8e.c81f9ca41028eccf.js → 425cfc4d.fb91158e3971c39f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4352.a4954693499c2714.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4421-f2dcbc6fd80ec013.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4513-51b94aeee37c9905.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{16e57f67.3ea19e893461e611.js → 46bd8bea.2f4b4099172fcdb7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5081.a240b63fad28663a.js → 4759.1f76713aefb87db5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4928-c3b72f99aa588699.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4986-f9fc0283fb325219.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5014.671a7b9f69c2b7b1.js +94 -0
- package/apps/pwa/out/_next/static/chunks/5137.d398e24710b3feb6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5298.0bea74885cabe754.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5315.74c53a39739b11c4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5317-8b1df8d02105cd07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5358-33051f41a2b239af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5388.a2ec02501f714ad5.js +62 -0
- package/apps/pwa/out/_next/static/chunks/5395.e6ac948a2d15058d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5409-f282bf533c151849.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5466.d0f4aba9d52acfa8.js +27 -0
- package/apps/pwa/out/_next/static/chunks/5564.3d28b353470fe305.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{9974.e77b4ff4884557b3.js → 5591.a35e7a217734a8b9.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/569.b0cbfb4dee4a167a.js +93 -0
- package/apps/pwa/out/_next/static/chunks/5835-72465b73a8bb8d74.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5941.045d6093139e1f7a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5492-e05e26a033ba80d2.js → 6013-2f769370d8b4c2c6.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6228.47cabb83564dfe54.js +24 -0
- package/apps/pwa/out/_next/static/chunks/6457-8d1993002a87d0fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6513.ef54cfae52351982.js +2 -0
- package/apps/pwa/out/_next/static/chunks/{5408.377c8c543635b81f.js → 6534.1ab00f370db7b105.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6582.13d245bf87df69f1.js +148 -0
- package/apps/pwa/out/_next/static/chunks/6655.c33f6acc2c61bb89.js +149 -0
- package/apps/pwa/out/_next/static/chunks/6731-9d7195af289c8d4c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6733.0be05b1db9279fc5.js +79 -0
- package/apps/pwa/out/_next/static/chunks/6742-90937146253a8b9e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8578.dff22d988cc2b106.js → 6767.1fcfc9b8be83975f.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/6776.06ff1e3b464cc607.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9311.24c8f5ea793253dd.js → 6853.cc5174a9dee59593.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/687-816858f77a396a4e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6888.72c7b8cfb02a7e61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6993.c17c828ac3ef3253.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7076.9f27ef666b0cefdd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7113.1403c5d451804e8c.js +287 -0
- package/apps/pwa/out/_next/static/chunks/7169.9dd603c726c2cd7c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7247-e3ec21f761f86710.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7261-a47b72f96f5199df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7335-5cda81ac90310077.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7356-c2e4af090546e2d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{94.4cfed21c0b781a06.js → 7375.050ea0d72968e49f.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/738-59518742078fda71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7385.a7375f10db73243a.js +77 -0
- package/apps/pwa/out/_next/static/chunks/7445.cf1cf2fe109bcd96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7505.a2057432ab6ef99a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7515.31f45fac1f9c70cb.js +74 -0
- package/apps/pwa/out/_next/static/chunks/7658-d4ce8c72a9548a91.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7725-4f83d5541fbdb81b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8107-0b1ae46bc5bcb788.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8132.bfea2f016ce8d992.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8332.6f0f49df772e163b.js +23 -0
- package/apps/pwa/out/_next/static/chunks/{7483.ba01c6c209b81bba.js → 8398.73a19b39715eda04.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2846.d6a433b8663819a5.js → 8471.8d2a8c74f09c36ff.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/8672.e299832bc7d18ee2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8735.f1ef798a5f260f6f.js +226 -0
- package/apps/pwa/out/_next/static/chunks/{5785-ea8d2c633b6688e3.js → 8767-2f6a634f5abeaa01.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8774-88f67f7d8d53d299.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8782.252e5a405d86e4ed.js +32 -0
- package/apps/pwa/out/_next/static/chunks/8795.32573a185af18c7b.js +41 -0
- package/apps/pwa/out/_next/static/chunks/909-9ed7aa0dba804316.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9100.22b0301256827007.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9140-dde77575570bc71e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4593.10f5b9bd702d4a6c.js → 9143.ff14585db1d275ff.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9292-a7ad9a01c7044b93.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9517.00627dc51b02821c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9725.dcbb585652d8e9c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9761.a3ebf5c389c24ddc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4204.a409ab6250c0f6a8.js → 9907.49be0fcadaf214b5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9972.834d2b2b7d48f1ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9995-1a90486f5ae01546.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{973cbf1b.3bbcf2b41548eca7.js → a435ad95.577add051b4facb2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-83372d8b5863ebf7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d69256d7613c140a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-352c5e9ba3f9b858.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-69f1d725524201a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-a5635eba0d73b84e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ad9181d84285e4ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-86feb08080261a2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-ffa15987e4756d03.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-11a3ab44ac327cc1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-6309b11c4264d24d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-8800472079612e87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-d387bf3f2301882a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-048f88d8c8658da6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6c14f9739b7f6880.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-2834f44f64e98d74.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-83372d8b5863ebf7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-a13df6f88e824887.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-8a4397248754cf2b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-daf0bd329360a336.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-f7ef1c28764cb476.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-61e74f28b9353dac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/{page-ff27902d0b11ef4f.js → page-8aaa6dedc4c10dfb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-294602ba649be829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-5fa5f41ed3fce323.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-25a302273b054fd7.js → page-33bf667a5fb297bf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-5ae3cbd6e5dba515.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-eb867d16ad6fdede.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1ab789fa68682f7e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6fd41b5b6ff13a71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fb3d5f7642c99fba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-70f705b2b5ed42ca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-c9c93b358a7667b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1563c556b81c96ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ce89c20c45b3a673.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-423ae63d786f4ee9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-591a5378a4c4447c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-a250496b19a5824b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-c36a9277febc5911.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-83372d8b5863ebf7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-29900ed0011b2c83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-a5de57edc6d7f942.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-16bdd4c9f40498df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-75e946e6e71cc6d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-87b88f551f421d8b.js → page-9eb56166774eb256.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-1c5f9ef35dbb22c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-657ff9985e508498.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-22dc72499da68fb2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9f92737b8766009a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-094ad334e40f8169.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-8bcd379852ff6287.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-6b04413f280cd344.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{f4dfbfc0.a69fb12f854882aa.js → bc324b7c.02a09dd93f6a399b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/de70ab42-d28d47437208d458.js +1 -0
- package/apps/pwa/out/_next/static/chunks/f800c5e3.46dbd7f2af8c3fce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/f8bc19ad.47579f6d684b0760.js +122 -0
- package/apps/pwa/out/_next/static/chunks/framework-ca9ac4609fb9fed8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-0dd08d32d15a030f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-f0399d33955c4e01.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-d42caca6f8ac2211.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-42e713c13aa41ca8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-8fbf8f61a377aa16.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/implement-loop.yaml +38 -1
- package/graphs/release/release-loop.yaml +6 -2
- package/graphs/steward/recipes.yaml +6 -0
- package/graphs/steward/release-day.yaml +23 -0
- package/graphs/steward/steward.yaml +9 -1
- package/graphs/work/code-pr.yaml +23 -0
- package/package.json +1 -1
- package/plugins/agent-team/agents/research.md +1 -0
- package/scripts/browser-observe-cycle.ts +76 -2
- package/scripts/ci-typecheck-changed.ts +53 -19
- package/scripts/coord-channel-watch.sh +26 -6
- package/scripts/coord-role-pack.ts +143 -0
- package/scripts/detect-test-interference.ts +31 -1
- package/scripts/lib/morning-report-options.ts +41 -0
- package/scripts/pr-land-extra-remote-gates.ts +49 -0
- package/scripts/release-loop/docs-node.ts +51 -22
- package/scripts/release-loop/gate-batch-safe.ts +23 -0
- package/scripts/release-loop/gate-history.ts +422 -0
- package/scripts/release-loop/gate-node.ts +336 -39
- package/scripts/release-loop/gate-triage-node.ts +190 -0
- package/scripts/release-loop/node-verdict.ts +3 -1
- package/scripts/release-loop/publish-node.ts +3 -0
- package/scripts/release-loop/spawn-lane.ts +68 -0
- package/scripts/release-loop/tui-node-checks.ts +28 -2
- package/scripts/release-loop/version-node.ts +62 -4
- package/scripts/skills/public-check.ts +5 -2
- package/scripts/test-deterministic.ts +549 -37
- package/scripts/usage-rollup.ts +11 -3
- package/scripts/ux-sim.ts +7 -1
- package/scripts/verify-kpack6-live.ts +230 -0
- package/src/acp/codex-plugins.ts +17 -0
- package/src/acp/core-turn-bridge.ts +98 -22
- package/src/acp/elanous-extensions.ts +2 -0
- package/src/acp/server.ts +2 -0
- package/src/agent/ref-grounding.ts +18 -0
- package/src/agent/task-notification.ts +2 -1
- package/src/agent-mission/in-agent-plugin.ts +8 -3
- package/src/agent-substrate/pr-reviewer.ts +29 -21
- package/src/agent-substrate/self-review-cli.ts +34 -10
- package/src/briefing/brief-items.ts +151 -35
- package/src/budget/llm-cost.ts +25 -2
- package/src/budget/pty-usage-reemit.ts +7 -0
- package/src/budget/run-usage-rollup.ts +9 -0
- package/src/budget/usage-daily-store.ts +98 -0
- package/src/budget/usage-outcomes.ts +32 -0
- package/src/capture/tui-self-report.ts +22 -4
- package/src/chat/index.ts +31 -10
- package/src/chat/pickers/modal-runtime.ts +1 -0
- package/src/chat/pickers/modals.ts +3 -1
- package/src/chat/turn-typeahead.ts +123 -16
- package/src/claims/claims-ledger.ts +23 -0
- package/src/claims/claims-render.ts +22 -2
- package/src/cli/brief-cli.ts +131 -10
- package/src/cli/claims-cli.ts +24 -4
- package/src/cli/dashboard-name-flag.ts +48 -0
- package/src/cli/doctor-cli.ts +80 -0
- package/src/cli/log-event-names.ts +12 -0
- package/src/cli/msg-cli.ts +210 -11
- package/src/cli/plugin-cli.ts +11 -3
- package/src/cli/pr-cli.ts +443 -104
- package/src/cli/pr-land-heavy-remote.ts +233 -0
- package/src/cli/pr-land-overlap-evidence.ts +104 -5
- package/src/cli/pr-land-refusal.ts +20 -0
- package/src/cli/pty-takeover-cli.ts +125 -16
- package/src/cli/release-cli.ts +46 -2
- package/src/cli/remote-resolve.ts +2 -1
- package/src/cli/rfc-cli.ts +24 -0
- package/src/cli/seat-cli.ts +26 -16
- package/src/cli/tailscale-serve.ts +5 -8
- package/src/cli/tasks-cli.ts +400 -27
- package/src/cli/usage-cli.ts +155 -16
- package/src/cli/usage-daily-cli.ts +84 -0
- package/src/context-bus/context-now.ts +82 -5
- package/src/core-turn/auth-rejected-notice.ts +41 -0
- package/src/core-turn/run-core-turn.ts +13 -2
- package/src/core-turn/run-goal-loop.ts +17 -1
- package/src/core-turn/short-question.ts +45 -12
- package/src/core-turn/types.ts +7 -0
- package/src/dashboard/acp-active-model.ts +40 -0
- package/src/dashboard/auto-compact-runtime.ts +2 -0
- package/src/dashboard/boot-banner.ts +80 -0
- package/src/dashboard/dashboard-status-lines.ts +11 -0
- package/src/dashboard/detail-viewer-runtime.ts +15 -2
- package/src/dashboard/event-loop-stall-monitor.ts +4 -0
- package/src/dashboard/first-screen-band.ts +63 -13
- package/src/dashboard/goal-loop-thinking.ts +16 -0
- package/src/dashboard/hitl-boot.ts +9 -4
- package/src/dashboard/index.ts +235 -389
- package/src/dashboard/input/chat-main-entry-runtime.ts +2 -0
- package/src/dashboard/input/chat-main-log-actions.ts +4 -0
- package/src/dashboard/input/chat-main-log-command.ts +12 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +172 -3
- package/src/dashboard/input/chat-main-session.ts +6 -2
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/chat-main-turn.ts +2 -1
- package/src/dashboard/input/compact-prepass-recovery.ts +97 -0
- package/src/dashboard/input/dashboard-chord-actions.ts +10 -1
- package/src/dashboard/input/dashboard-chord-runtime.ts +2 -0
- package/src/dashboard/input/external-input-host.ts +45 -0
- package/src/dashboard/input/log-fold-binding.ts +18 -0
- package/src/dashboard/input/mouse-wiring.ts +17 -4
- package/src/dashboard/input/turn-steer-bridge.ts +94 -0
- package/src/dashboard/log-click-runtime.ts +5 -3
- package/src/dashboard/running-build-status.ts +74 -0
- package/src/dashboard/seat-boot-preamble.ts +113 -0
- package/src/dashboard/seat-local-instructions.ts +305 -0
- package/src/dashboard/skill-detection-runtime.ts +24 -4
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +100 -28
- package/src/dashboard/slash-runtime/model-choices.ts +35 -0
- package/src/dashboard/term-slash-runtime.ts +15 -0
- package/src/dashboard/turn-preamble.ts +30 -2
- package/src/dashboard/turn-session-layers.ts +176 -0
- package/src/dashboard/turn-stream-formatter.ts +14 -6
- package/src/dashboard/turn-stream-presentation-applier.ts +8 -0
- package/src/domains/morning-report.ts +3 -1
- package/src/domains/release-tool.ts +8 -9
- package/src/domains/surface-events.ts +4 -1
- package/src/domains/watch-default-scheduler.ts +8 -9
- package/src/fold-stack.ts +24 -1
- package/src/git-fs/dirty.ts +32 -4
- package/src/git-fs/index.ts +43 -1
- package/src/github/pr-labels.ts +10 -4
- package/src/graph-runner/runner.ts +102 -14
- package/src/harness/harness-clean.ts +21 -3
- package/src/harness/harness-cli-command.ts +22 -6
- package/src/harness/harness-gc.ts +32 -5
- package/src/harness/harness-pod-dispatch.ts +11 -4
- package/src/hq/seats.ts +17 -3
- package/src/index.ts +48 -6
- package/src/input/external-input-queue.ts +219 -0
- package/src/intelligence-map/model-bench-scores.ts +102 -0
- package/src/interactive-terminal-modal.ts +13 -0
- package/src/llm/route-decision.ts +25 -0
- package/src/llm-stream-retry-display.ts +59 -0
- package/src/llm.ts +253 -55
- package/src/log-entry.ts +3 -3
- package/src/log-pane/search.ts +29 -4
- package/src/loops/agent-reply.ts +256 -0
- package/src/loops/budget.ts +37 -7
- package/src/loops/loop-cli.ts +3 -2
- package/src/loops/msg-address.ts +57 -0
- package/src/loops/msg-wake.ts +282 -0
- package/src/loops/orchestrator/inbox.ts +130 -0
- package/src/loops/orchestrator/resync-shadow.ts +100 -12
- package/src/loops/orchestrator/tick.ts +94 -3
- package/src/loops/registry.ts +42 -4
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/memory.ts +20 -5
- package/src/msg/msg-sse-server.ts +141 -0
- package/src/msg/msg-store.ts +84 -14
- package/src/native-tool-catalog.ts +125 -0
- package/src/nexus/api/http-server.ts +5 -0
- package/src/nexus/api/ops-api.ts +2 -0
- package/src/nexus/api/project-autopsy.ts +127 -0
- package/src/nexus/api/terminals.ts +3 -0
- package/src/nexus/api/workflow-approvals.ts +2 -0
- package/src/nexus/onboarding/first-boot-wizard.ts +56 -2
- package/src/oauth/codex-account-store.ts +15 -3
- package/src/oauth/codex-billing-route.ts +31 -0
- package/src/ops/overview-collect.ts +19 -2
- package/src/panes/log-pane.ts +67 -8
- package/src/patents/ledger.ts +128 -0
- package/src/persona/presets.ts +44 -0
- package/src/plugins/install/market-fetch.ts +32 -1
- package/src/plugins/maker/wizard-generate.ts +6 -4
- package/src/pod-lease/admission.ts +116 -41
- package/src/preview/terminal.ts +14 -1
- package/src/prompt-cache/types.ts +2 -0
- package/src/prompt-enhance/enhance.ts +24 -8
- package/src/prompt-library/universal-preamble.ts +273 -56
- package/src/pty-shell/pty-control-ipc.ts +4 -1
- package/src/pty-shell/pty-manifest.ts +77 -5
- package/src/pty-shell/registry.ts +19 -2
- package/src/pty-shell/tui-run-state.ts +253 -0
- package/src/release-loop/checklist.ts +11 -0
- package/src/release-loop/light-rc.ts +28 -3
- package/src/release-loop/merged-pr-checklist.ts +24 -5
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/release-loop/rubric.ts +70 -0
- package/src/render.ts +5 -1
- package/src/rfc-registry/registry.ts +88 -0
- package/src/seat-dispatch/seat-request-ledger.ts +4 -0
- package/src/seat-loop/knowhow-lint.ts +233 -0
- package/src/seat-loop/seat-pack.ts +16 -4
- package/src/seat-loop/seat-report.ts +42 -2
- package/src/seat-loop/traffic-signal.ts +7 -0
- package/src/self-dev/ask-launch-flow.ts +48 -8
- package/src/self-dev/ask-path-candidates.ts +69 -14
- package/src/self-dev/decompose-proposal.ts +43 -1
- package/src/self-dev/graph-journey-nodes.ts +2 -0
- package/src/self-dev/launch-preflight-text.ts +5 -1
- package/src/self-dev/launch-preflight.ts +143 -10
- package/src/self-dev/run-supervisor.ts +71 -5
- package/src/self-dev/shard-aggregate.ts +2 -0
- package/src/self-dev/shard-run.ts +23 -2
- package/src/self-health/signatures.ts +132 -0
- package/src/self-implement/doctor-visit.ts +118 -0
- package/src/self-implement/gate-cli.ts +17 -4
- package/src/self-implement/goal-author-decompose.ts +80 -16
- package/src/self-implement/goal-author.ts +116 -73
- package/src/self-implement/goal-authoring-grounding.ts +1 -1
- package/src/self-implement/goal-file-name.ts +65 -0
- package/src/self-implement/goal-new-paths.ts +4 -5
- package/src/self-implement/graph-authority.ts +17 -3
- package/src/self-implement/graph-yaml.ts +15 -7
- package/src/self-implement/ground-goal.ts +2 -1
- package/src/self-implement/headless-elanous-driver.ts +16 -1
- package/src/self-implement/host-regate.ts +58 -9
- package/src/self-implement/orchestrator.ts +3 -10
- package/src/self-implement/review-mustfix-class.ts +115 -0
- package/src/self-implement/rework-policy.ts +80 -2
- package/src/self-implement/run-ledger.ts +111 -7
- package/src/self-implement/running-runs.ts +10 -6
- package/src/self-implement/self-implement-runtime.ts +32 -0
- package/src/self-implement/speed-claims.ts +145 -6
- package/src/session/pending-input.ts +62 -11
- package/src/session-runtime/index.ts +7 -1
- package/src/skills/tools/ops-ledger.ts +707 -0
- package/src/skills/tools/persistent-grounding.ts +103 -8
- package/src/skills/tools/shell.ts +196 -2
- package/src/status/bar.ts +32 -2
- package/src/status/status-provider-info.ts +58 -0
- package/src/steward/rejudge-tick.ts +12 -1
- package/src/steward/release-day.ts +158 -0
- package/src/steward/resync-tick.ts +123 -0
- package/src/task-agent/actions.ts +1 -0
- package/src/task-agent/adopt-pr.ts +140 -0
- package/src/task-agent/board.ts +11 -1
- package/src/task-agent/card-evidence.ts +37 -5
- package/src/task-agent/cover.ts +84 -17
- package/src/task-agent/failure-notify.ts +61 -0
- package/src/task-agent/green-sweep.ts +170 -0
- package/src/task-agent/land-worktree.ts +52 -5
- package/src/task-agent/live-move-history.ts +1 -0
- package/src/task-agent/live-moves.ts +43 -12
- package/src/task-agent/parent-host.ts +1 -1
- package/src/task-agent/postland-card.ts +139 -0
- package/src/task-agent/rejudge-on-head.ts +109 -7
- package/src/task-agent/remote-rejudge-bind.ts +91 -0
- package/src/task-agent/repair-branch-cas.ts +182 -0
- package/src/task-agent/repair-cycle.ts +288 -0
- package/src/task-agent/repair-next-move.ts +31 -0
- package/src/task-agent/repair-review.ts +24 -0
- package/src/task-agent/repair-worker.ts +87 -0
- package/src/task-agent/review-result-capture.ts +2 -1
- package/src/task-agent/shadow.ts +13 -7
- package/src/task-agent/task-hand.ts +115 -6
- package/src/task-orchestrator/surfaces/kubectl-transient-retry.ts +51 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +63 -7
- package/src/task-orchestrator/surfaces/pod-install-slots.ts +6 -11
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +76 -0
- package/src/task-orchestrator/surfaces/pod-repair-commit.ts +96 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +175 -43
- package/src/telegram.ts +30 -1
- package/src/terminal/session-registry.ts +6 -0
- package/src/thinking-line.ts +12 -3
- package/src/tool-runtime/index.ts +4 -0
- package/src/tool-runtime/ops-ledger-runtimes.ts +84 -0
- package/src/tool-runtime/ref-consult-runtime.ts +17 -2
- package/src/tool-runtime/run-shell-runtime.ts +4 -1
- package/src/tool-runtime/self-cognition-runtimes.ts +5 -1
- package/src/tui.ts +5 -0
- package/src/user-config.ts +62 -7
- package/src/ux-sim/fake-llm.ts +29 -0
- package/src/ux-sim/fault-sqlite-busy.ts +50 -0
- package/src/ux-sim/in-process-cli.ts +175 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1027.a0f04663d24c2779.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +0 -1
- package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +0 -36
- package/apps/pwa/out/_next/static/chunks/1146.80d15ea7c6e6ee95.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1157.f08bf2b70915e176.js +0 -148
- package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1454-a9c338f5bb556f42.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2528.3868070ef1be69f9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2697.76ca2ac3efef6f3b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +0 -32
- package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3143.257997a5f1ed79df.js +0 -34
- package/apps/pwa/out/_next/static/chunks/3259-86f3be56e43eaf6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3309.364573ceedbdfd5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +0 -287
- package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4084.15ecaf4240bd9e77.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +0 -8
- package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +0 -149
- package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +0 -1
- package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/599-a914cc0468f56143.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +0 -23
- package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +0 -77
- package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +0 -64
- package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +0 -62
- package/apps/pwa/out/_next/static/chunks/7752.5cbdd0b433c54af9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8085-1e5fce59500a2cc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +0 -226
- package/apps/pwa/out/_next/static/chunks/83a80514-b897b64df43ce108.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +0 -93
- package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +0 -115
- package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +0 -74
- package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/949.1e7d45ccb71580aa.js +0 -90
- package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9938.b23e4d4dfa0114cd.js +0 -79
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-a1ce306364f08da9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-07110da72c45e68f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-d2d76d4a7eae91bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-30007380f2e2a3c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-e5a9302c105725a3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-b93c04b5311c97ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-718a49e86bf25f9c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-20662900d6b4b455.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-f707a509515ac50c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-6a16a48d1aa6e91f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-fcb06e305f515527.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-6acf5ec4e6c6d1af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-39f82acf619cca23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-7c2c8f81b185f9c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ae7aff07e32676bb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-482c60c1bc540d0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-7cb996c1aa08b6f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-623e08fe4477d606.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-db460cd8aecb8490.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-8397a5c6ca569bf4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1917ea87ea71ab6b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-670510eda8b9443f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-d73c3f1e00d93986.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-65caacf54389081e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-4bb7556e2e97a750.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-77e04b4f8762c666.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-15c0a4095baddfba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-4eb96fc7241c2456.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-63e272a4cd3b6634.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-0d64ff212dc55d03.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-7f096248993fc2d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-e47fc72049149a38.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-f7d808e31e005895.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-5c2b24b5496dad73.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-76cdb531668b5191.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-e2b63345bba1a11f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-d376e0c83edc041a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d6db55fe2c04d128.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-dab163b338e3b966.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-08019efef111ed2e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-0260ffc7eda50db1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-980ce6fe36ad95eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-99c4e6c7345a9156.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-0ab42e0f05823013.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-ad9220422d20ba33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +0 -1
- package/apps/pwa/out/_next/static/chunks/e117f801.e92bf10242653497.js +0 -1
- package/apps/pwa/out/_next/static/chunks/e87d89b9.2e71c0ae475d28a1.js +0 -122
- package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +0 -1
- package/src/dashboard/bench-slash-runtime.ts +0 -40
- package/src/dashboard/input/search-modal-router.ts +0 -9
- package/src/dashboard/modals/pane-key-router.ts +0 -27
- package/src/dashboard/view-slash-runtime.ts +0 -48
- /package/apps/pwa/out/_next/static/{Ev2jivDMTSoEc-5rIXdcy → cIpv5nU9AycwYWZI9H589}/_ssgManifest.js +0 -0
|
@@ -652,6 +652,9 @@ export function buildReviewPrompt(
|
|
|
652
652
|
* `none of the tests …`. 표지 낱말로 시작하는 실제 블로커를 지우면 PASS/WARN 리뷰에서 블로커가 사라진다. */
|
|
653
653
|
const NONE_WORD = String.raw`(?:없음|해당\s*없음|n\/a|none|nothing)`;
|
|
654
654
|
const BARE_SENTINEL = new RegExp(String.raw`^${NONE_WORD}\s*[.。]?$`, 'i');
|
|
655
|
+
const DASH_ONLY_SENTINEL = /^[([(【]\s*[-—–]\s*[)\])】]$/;
|
|
656
|
+
// 목록 항목의 바깥 `- `와 별개로, 리뷰어가 괄호 안에도 장식 대시를 둘 수 있다: `- (- 없음 -)`.
|
|
657
|
+
const DASH_WRAPPED_BRACKETED_SENTINEL = new RegExp(String.raw`^[([(【]\s*(?:[-—–]+\s*)?${NONE_WORD}\s*(?:[-—–]+\s*)?[)\])】]$`, 'i');
|
|
655
658
|
const BRACKETED_SENTINEL = new RegExp(String.raw`^[([(【]\s*${NONE_WORD}(?:\s*[—–\-:.,;·]\s*([^)\])】]*))?\s*[)\])】]$`, 'i');
|
|
656
659
|
// ⭐ 설명 «전체»가 「지적 없음」 한 문장일 때만 — 일부만 맞아도 접으면 `(none: no blockers are checked because …)` 같은 지적이 사라진다.
|
|
657
660
|
const NO_FINDING_REMARK = new RegExp([
|
|
@@ -662,41 +665,38 @@ const NO_FINDING_REMARK = new RegExp([
|
|
|
662
665
|
String.raw`^수용\s*기준(?:을|이)?\s*(?:(?:모두|전부)\s*)?충족(?:함|됨|했다|합니다)?[.。]?$`,
|
|
663
666
|
String.raw`^(?:all\s+)?acceptance\s+criteria\s+(?:are\s+)?(?:all\s+)?met\.?$`,
|
|
664
667
|
].join('|'), 'i');
|
|
665
|
-
//
|
|
666
|
-
//
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
String.raw`must-?fix\s*(?:항목)?(?:은|는|이|가)?\s*(?:없(?:음|다|습니다)|0\s*건)`,
|
|
674
|
-
String.raw`(?:no|zero)\s+(?:blocking\s+)?(?:blockers?|must-?fix(?:es)?)(?:\s+found)?`,
|
|
675
|
-
String.raw`(?:(?:블로커|차단)\s*)?(?:수준의?\s*)?(?:결함|블로커)(?:은|는|이|가)?\s*(?:발견되지\s*않(?:음|았(?:다|습니다)?)|없(?:음|다|습니다))`,
|
|
676
|
-
].join('|') + String.raw`)\s*(?:[::—–\-·,;.。(]|$)`, 'i');
|
|
677
|
-
const LONG_REMARK_DISSENT = /하지만|그러나|다만|(?<![가-힣])단(?:,|\s)|미\s*충족|불\s*충족|충족하지|충족되지|\bbut\b|\bhowever\b|\bexcept\b|\balthough\b|\bnot\s+(?:yet\s+)?met\b|\bunmet\b/i;
|
|
678
|
-
/** 괄호 안이 «없음 + 구분자 + 무소견 머리 …» 인가 — 길이 무관(근거 안 괄호도 허용). `isNoneSentinelFinding` 의 갈래. */
|
|
668
|
+
// OP #3173 — 설명은 의미 추정하지 않는다. 실측으로 무소견임을 확인한 문장만 등록한다.
|
|
669
|
+
// 문법 밖 `없음 — 설명`은 실제 결함일 수 있으므로 mustFix에 남긴다.
|
|
670
|
+
const LONG_BRACKETED_SENTINEL = new RegExp(String.raw`^[([(【]\s*(?:[-—–]+\s*)?${NONE_WORD}\s*[—–\-:·]\s*([\s\S]+?)\s*[)\])】]$`, 'i');
|
|
671
|
+
const KNOWN_NO_FINDING_REMARKS = new Set([
|
|
672
|
+
// #27349 저장 JSON의 실제 무소견 문구.
|
|
673
|
+
'문서 전용 변경이고 의도된 산출물이 실제로 존재하며 배선 누락·죽은 코드·Goodhart 해당 없음',
|
|
674
|
+
]);
|
|
675
|
+
/** 괄호 안 `없음` 뒤 설명이 닫힌 무소견 문법에 정확히 들어가는가. */
|
|
679
676
|
function isLongNoFindingBracket(text: string): boolean {
|
|
680
677
|
const m = LONG_BRACKETED_SENTINEL.exec(text.trim());
|
|
681
678
|
if (!m) return false;
|
|
682
679
|
const remark = m[1]!.trim();
|
|
683
|
-
|
|
680
|
+
const bareRemark = remark.replace(/\s*[-—–]+\s*$/, '').trim();
|
|
681
|
+
return NO_FINDING_REMARK.test(bareRemark) || KNOWN_NO_FINDING_REMARKS.has(bareRemark);
|
|
684
682
|
}
|
|
685
683
|
/** must-fix 항목이 «지적 없음» 표지인가 — must-fix 를 세는 자리는 전부 `parseReviewResult` 를 거친다
|
|
686
684
|
* (`self review --json` 의 `mustFix` → TA `parseReviewResultOutput` → `pr land --overlap-evidence` 의 `review-must-fix-N`).
|
|
687
685
|
* ⭐ export — `parseReviewResultOutput` 가 «같은» 판정으로 저장된 결과의 표지 줄을 다시 접는다(PR-LAND-MUSTFIX-NONE · 복제 금지). */
|
|
688
686
|
export function isNoneSentinelFinding(finding: string): boolean {
|
|
689
687
|
const text = finding.trim();
|
|
690
|
-
if (
|
|
691
|
-
const
|
|
688
|
+
if (/^[-—–]+$/.test(text)) return true;
|
|
689
|
+
const markerText = text.replace(/^[—–-]+\s*|\s*[—–-]+$/g, '').trim();
|
|
690
|
+
if (markerText && (BARE_SENTINEL.test(markerText) || DASH_ONLY_SENTINEL.test(markerText) || DASH_WRAPPED_BRACKETED_SENTINEL.test(markerText))) return true;
|
|
691
|
+
const bracketed = BRACKETED_SENTINEL.exec(markerText);
|
|
692
692
|
if (bracketed) {
|
|
693
693
|
const remark = bracketed[1]?.trim();
|
|
694
694
|
if (!remark || NO_FINDING_REMARK.test(remark)) return true;
|
|
695
695
|
}
|
|
696
|
-
return isLongNoFindingBracket(
|
|
696
|
+
return isLongNoFindingBracket(markerText);
|
|
697
697
|
}
|
|
698
698
|
|
|
699
|
-
/** critic 응답 파싱 → ReviewResult.
|
|
699
|
+
/** critic 응답 파싱 → ReviewResult. VERDICT + MUST-FIX/SHOULD-FIX/REQUIREMENTS 섹션 분해.
|
|
700
700
|
* verdict=FAIL 인데 must-fix 미기재면 첫 finding 을 must 로 승격(블로커 근거 보존). */
|
|
701
701
|
/** ⭐ `VERDICT: PASS|WARN|FAIL` 판정 줄 — `parseReviewResult` 와 `reviewedResultFromRaw` 가 «같은» 정규식을 쓴다(존재 판정이 갈리면 안 된다). */
|
|
702
702
|
const VERDICT_LINE = /VERDICT:\s*(PASS|WARN|FAIL)/i;
|
|
@@ -709,6 +709,7 @@ export function parseReviewResult(text: string): ReviewResult {
|
|
|
709
709
|
const shouldFix: string[] = [];
|
|
710
710
|
const requirements: string[] = [];
|
|
711
711
|
let fallbackFinding: string | undefined;
|
|
712
|
+
let droppedNonePlaceholders = 0;
|
|
712
713
|
let section: 'must' | 'should' | 'requirements' | null = null;
|
|
713
714
|
for (const l of lines) {
|
|
714
715
|
if (/^MUST-?FIX/i.test(l)) { section = 'must'; continue; }
|
|
@@ -718,12 +719,19 @@ export function parseReviewResult(text: string): ReviewResult {
|
|
|
718
719
|
if (l.startsWith('- ')) {
|
|
719
720
|
const f = l.slice(2).trim();
|
|
720
721
|
if (!f) continue;
|
|
721
|
-
if (section === 'must') {
|
|
722
|
-
|
|
722
|
+
if (section === 'must') {
|
|
723
|
+
if (isNoneSentinelFinding(f)) droppedNonePlaceholders++;
|
|
724
|
+
else mustFix.push(f);
|
|
725
|
+
} else if (section === 'should') shouldFix.push(f);
|
|
723
726
|
else if (section === 'requirements') requirements.push(f);
|
|
724
727
|
else fallbackFinding ??= f;
|
|
725
728
|
}
|
|
726
729
|
}
|
|
730
|
+
if (droppedNonePlaceholders > 0) {
|
|
731
|
+
try {
|
|
732
|
+
debug.log('review.parse', 'none-placeholder-dropped', { count: droppedNonePlaceholders });
|
|
733
|
+
} catch { /* observation must not change parsed review data */ }
|
|
734
|
+
}
|
|
727
735
|
if (verdict === 'fail' && mustFix.length === 0) {
|
|
728
736
|
const first = shouldFix.shift() ?? fallbackFinding;
|
|
729
737
|
mustFix.push(first ?? 'PR 리뷰 FAIL — 재작업 필요(구체 지적 미파싱).');
|
|
@@ -14,9 +14,10 @@
|
|
|
14
14
|
//
|
|
15
15
|
// index.ts 의 액션은 옵션 파싱과 실제 의존 배선만 남는다(얇은 껍데기).
|
|
16
16
|
|
|
17
|
-
import { mkdtempSync, rmSync } from 'node:fs';
|
|
17
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
18
18
|
import { tmpdir } from 'node:os';
|
|
19
|
-
import { join } from 'node:path';
|
|
19
|
+
import { dirname, join } from 'node:path';
|
|
20
|
+
import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
20
21
|
import { tierModel } from '../llm/model-defaults.js';
|
|
21
22
|
import { buildReviewObservation, safeLogText } from './review-observation.js';
|
|
22
23
|
import { DEFAULT_REVIEW_BACKEND } from './acp-reviewer.js';
|
|
@@ -46,6 +47,8 @@ export interface SelfReviewCliOpts {
|
|
|
46
47
|
contextText?: string[] | undefined;
|
|
47
48
|
contextOrder?: Array<{ kind: 'file' | 'text'; value: string }> | undefined;
|
|
48
49
|
json?: boolean | undefined;
|
|
50
|
+
/** Save completed reviews under the task-agent state's review-results directory. */
|
|
51
|
+
save?: string | undefined;
|
|
49
52
|
}
|
|
50
53
|
|
|
51
54
|
/** 셸/네트워크/로그 경계 — 테스트는 전부 대역으로 채운다. */
|
|
@@ -1276,6 +1279,11 @@ async function runSelfReviewCliCommandPinned(
|
|
|
1276
1279
|
return { results: [], failed: 0 };
|
|
1277
1280
|
}
|
|
1278
1281
|
|
|
1282
|
+
if (opts.save !== undefined && !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(opts.save)) {
|
|
1283
|
+
deps.error('--save 이름은 영문자·숫자로 시작하고 영문자·숫자·점·밑줄·하이픈만 포함해야 합니다.');
|
|
1284
|
+
return { results: [], failed: 1 };
|
|
1285
|
+
}
|
|
1286
|
+
|
|
1279
1287
|
const useAcp = opts.acp === true;
|
|
1280
1288
|
const acpModel = opts.acpModel?.trim() || undefined;
|
|
1281
1289
|
const acpBackendResolution = opts.acpBackend
|
|
@@ -1431,8 +1439,8 @@ async function runSelfReviewCliCommandPinned(
|
|
|
1431
1439
|
{ pr: safeLogText(pr), exit: diff.status, error: safeLogText(diff.stderr || err, 160) },
|
|
1432
1440
|
{ level: 'warn' });
|
|
1433
1441
|
const contextOutput = reviewerContextOutput(reviewerContext, decompositionContext);
|
|
1434
|
-
if (opts.json) results.push({ pr, error: err, ...contextOutput, ...comparisonData, ...(mismatchWarning ?? {}) });
|
|
1435
|
-
|
|
1442
|
+
if (opts.json || opts.save !== undefined) results.push({ pr, error: err, ...contextOutput, ...comparisonData, ...(mismatchWarning ?? {}) });
|
|
1443
|
+
if (!opts.json) deps.error(`PR ${pr}: ${err}\n${reviewerContextStatus}`);
|
|
1436
1444
|
failed += 1;
|
|
1437
1445
|
continue;
|
|
1438
1446
|
}
|
|
@@ -1492,8 +1500,8 @@ async function runSelfReviewCliCommandPinned(
|
|
|
1492
1500
|
pr, model: primaryModel, verdict: null, mustFix: [], shouldFix: [], reviewed: false,
|
|
1493
1501
|
refusal: 'stale-head', ...provenance, ...reviewerSourceObservation(), ...contextOutput,
|
|
1494
1502
|
};
|
|
1495
|
-
if (opts.json) results.push(refused);
|
|
1496
|
-
|
|
1503
|
+
if (opts.json || opts.save !== undefined) results.push(refused);
|
|
1504
|
+
if (!opts.json) deps.print(`\n━━ PR ${pr} (${primaryModel}) ━━\n${renderStaleRefusal(diffRead)}\n${reviewerContextStatus}`);
|
|
1497
1505
|
continue;
|
|
1498
1506
|
}
|
|
1499
1507
|
// ⭐ 머지된 PR 만 머지 커밋 detached worktree 에서 리뷰한다 — main 최신이 아니라 그 PR 이 머지된 시점의 코드를 본다.
|
|
@@ -1666,17 +1674,33 @@ async function runSelfReviewCliCommandPinned(
|
|
|
1666
1674
|
if (useAcp && review.reviewed === false) {
|
|
1667
1675
|
const err = 'ACP 리뷰 실행 실패(reviewed=false) — 관측: elanous logs --category acp-review';
|
|
1668
1676
|
const contextOutput = reviewerContextOutput(reviewerContext, decompositionContext);
|
|
1669
|
-
if (opts.json) results.push({ pr, error: err, ...review, verdict: null, ...reviewProvenance, ...respondedOutput, ...reviewerSelection, ...reviewCwdOutput, ...provenance, ...contextOutput });
|
|
1670
|
-
|
|
1677
|
+
if (opts.json || opts.save !== undefined) results.push({ pr, error: err, ...review, verdict: null, ...reviewProvenance, ...respondedOutput, ...reviewerSelection, ...reviewCwdOutput, ...provenance, ...contextOutput });
|
|
1678
|
+
if (!opts.json) deps.error(`PR ${pr}: ${err}\n${renderProvenance(diffRead)}\n${reviewerContextStatus}`);
|
|
1671
1679
|
failed += 1;
|
|
1672
1680
|
continue;
|
|
1673
1681
|
}
|
|
1674
1682
|
const contextOutput = reviewerContextOutput(reviewerContext, decompositionContext);
|
|
1675
1683
|
const jsonReview = review.reviewed === true ? review : { ...review, verdict: null };
|
|
1676
|
-
if (opts.json) results.push({ pr, model: selectedModel, ...jsonReview, ...reviewProvenance, ...respondedOutput, ...reviewerSelection, ...reviewCwdOutput, ...provenance, ...contextOutput, evidence: evidence.evidence, prDiffFiles: evidence.prDiffFiles, ...(evidence.authoredFiles !== undefined ? { authoredFiles: evidence.authoredFiles } : {}) });
|
|
1677
|
-
|
|
1684
|
+
if (opts.json || opts.save !== undefined) results.push({ pr, model: selectedModel, ...jsonReview, ...reviewProvenance, ...respondedOutput, ...reviewerSelection, ...reviewCwdOutput, ...provenance, ...contextOutput, evidence: evidence.evidence, prDiffFiles: evidence.prDiffFiles, ...(evidence.authoredFiles !== undefined ? { authoredFiles: evidence.authoredFiles } : {}) });
|
|
1685
|
+
if (!opts.json) deps.print(`\n━━ PR ${pr} (${selectedModel}) ━━\n${renderProvenance(diffRead)}\n${evidenceLine}\n${reviewerContextStatus}\n${deps.renderReview(review)}`);
|
|
1678
1686
|
// REVIEW-ERROR-RC — 기본(API)·role 경로가 1차·폴백 모두 실패해 reviewed≠true 로 끝나도 «못 리뷰한 PR» 이다(verdict:null).
|
|
1679
1687
|
if (review.reviewed !== true) failed += 1;
|
|
1688
|
+
if (opts.save !== undefined) {
|
|
1689
|
+
if (review.reviewed !== true || diffRead.headCommitState !== 'known' || diffRead.currentHeadCommitState !== 'known' || diffRead.currentHeadCommit !== diffRead.headCommit || diffRead.headCommit.length !== 40) {
|
|
1690
|
+
deps.error(`PR ${pr}: --save 불가 — 완료된 리뷰와 확인된 40자 PR head가 필요합니다.`);
|
|
1691
|
+
if (review.reviewed === true) failed += 1;
|
|
1692
|
+
} else {
|
|
1693
|
+
const path = join(effectiveInstanceRoot(), 'review-results', `${opts.save}-${pr}-${diffRead.headCommit.slice(0, 12)}.json`);
|
|
1694
|
+
const result = results.at(-1);
|
|
1695
|
+
try {
|
|
1696
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
1697
|
+
writeFileSync(path, selfReviewJsonLine([result]));
|
|
1698
|
+
} catch (error) {
|
|
1699
|
+
failed += 1;
|
|
1700
|
+
deps.error(`PR ${pr}: --save 실패: ${error instanceof Error ? error.message : String(error)}`);
|
|
1701
|
+
}
|
|
1702
|
+
}
|
|
1703
|
+
}
|
|
1680
1704
|
}
|
|
1681
1705
|
return { results, failed };
|
|
1682
1706
|
}
|
|
@@ -49,6 +49,15 @@ export interface AddBriefItem {
|
|
|
49
49
|
dedupeWithinMs?: number;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
export interface BriefTelegramFeedback {
|
|
53
|
+
botId: string;
|
|
54
|
+
chatId: number;
|
|
55
|
+
messageId: number;
|
|
56
|
+
updateId: string;
|
|
57
|
+
reaction: BriefReaction;
|
|
58
|
+
itemId?: number;
|
|
59
|
+
}
|
|
60
|
+
|
|
52
61
|
export interface BriefItemsOptions {
|
|
53
62
|
stateDir?: string;
|
|
54
63
|
now?: () => Date;
|
|
@@ -112,7 +121,11 @@ export function composeBriefMarkdown(items: readonly BriefItem[], slot: BriefSlo
|
|
|
112
121
|
}
|
|
113
122
|
|
|
114
123
|
/** The ids are exactly the rows represented by the composed page, after deduplication. */
|
|
115
|
-
export function composeBriefPage(
|
|
124
|
+
export function composeBriefPage(
|
|
125
|
+
items: readonly BriefItem[], slot: BriefSendSlot, now: Date,
|
|
126
|
+
actions?: BriefWeeklyActions,
|
|
127
|
+
observedKinds?: ReadonlySet<BriefDomain>,
|
|
128
|
+
): { markdown: string; ids: number[] } {
|
|
116
129
|
const today = dateKey(now, { timeZone: KST });
|
|
117
130
|
// A duplicate left out of a delivered page stays unsent in the ledger, but must not reappear on a later page.
|
|
118
131
|
// A new undeliverable observation after a sent page is a new occurrence, not an old duplicate.
|
|
@@ -138,11 +151,22 @@ export function composeBriefPage(items: readonly BriefItem[], slot: BriefSendSlo
|
|
|
138
151
|
for (const item of decisions) lines.push(itemLine(item));
|
|
139
152
|
lines.push('');
|
|
140
153
|
}
|
|
141
|
-
|
|
154
|
+
const domains = [...BRIEF_DOMAINS];
|
|
155
|
+
// Measured action leads. An unobserved kind keeps its normal position; a sent-but-unobserved
|
|
156
|
+
// item is not evidence of being ignored. Keep every domain heading in this first slice.
|
|
157
|
+
if (actions && Object.values(actions.byKind).some(count => count.acted > 0)) {
|
|
158
|
+
domains.sort((a, b) => {
|
|
159
|
+
const x = actions.byKind[a], y = actions.byKind[b];
|
|
160
|
+
const xRate = observedKinds?.has(a) ? x.rate : 0;
|
|
161
|
+
const yRate = observedKinds?.has(b) ? y.rate : 0;
|
|
162
|
+
return yRate - xRate || BRIEF_DOMAINS.indexOf(a) - BRIEF_DOMAINS.indexOf(b);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
for (const domain of domains) {
|
|
142
166
|
const group = unique.filter(item => item.domain === domain && !decisionIds.has(item.id));
|
|
143
167
|
if (group.length === 0) continue;
|
|
144
168
|
lines.push(`## ${domain}`, '');
|
|
145
|
-
for (const item of group
|
|
169
|
+
for (const item of group) lines.push(itemLine(item));
|
|
146
170
|
lines.push('');
|
|
147
171
|
}
|
|
148
172
|
return { markdown: `${lines.join('\n').trimEnd()}\n`, ids: unique.map(item => item.id) };
|
|
@@ -203,12 +227,12 @@ export class BriefItemsLedger {
|
|
|
203
227
|
this.requirementFunnel = options.requirementFunnel ?? ((now) => readRequirementFunnel({ stateDir: options.stateDir, now }));
|
|
204
228
|
}
|
|
205
229
|
|
|
206
|
-
private using<T>(work: (db: Database) => T): T {
|
|
230
|
+
private using<T>(work: (db: Database) => T, busyTimeoutMs = 10000): T {
|
|
207
231
|
mkdirSync(dirname(this.path), { recursive: true });
|
|
208
232
|
const db = new Database(this.path, { create: true, strict: true });
|
|
209
233
|
try {
|
|
210
234
|
chmodSync(this.path, 0o600);
|
|
211
|
-
db.exec(
|
|
235
|
+
db.exec(`PRAGMA busy_timeout = ${busyTimeoutMs}`);
|
|
212
236
|
migrateLegacyItems(db, this.log);
|
|
213
237
|
db.exec(`CREATE TABLE IF NOT EXISTS items (
|
|
214
238
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
@@ -237,7 +261,20 @@ export class BriefItemsLedger {
|
|
|
237
261
|
reacted_at TEXT NOT NULL
|
|
238
262
|
);
|
|
239
263
|
CREATE INDEX IF NOT EXISTS reactions_item_time ON reactions(item_id, reacted_at);
|
|
240
|
-
CREATE INDEX IF NOT EXISTS sends_time ON sends(sent_at)
|
|
264
|
+
CREATE INDEX IF NOT EXISTS sends_time ON sends(sent_at);
|
|
265
|
+
CREATE TABLE IF NOT EXISTS telegram_sends (
|
|
266
|
+
bot_id TEXT NOT NULL,
|
|
267
|
+
chat_id INTEGER NOT NULL,
|
|
268
|
+
message_id INTEGER NOT NULL,
|
|
269
|
+
item_id INTEGER NOT NULL REFERENCES items(id),
|
|
270
|
+
PRIMARY KEY (bot_id, chat_id, message_id, item_id)
|
|
271
|
+
);
|
|
272
|
+
CREATE TABLE IF NOT EXISTS telegram_feedback_events (
|
|
273
|
+
bot_id TEXT NOT NULL,
|
|
274
|
+
chat_id INTEGER NOT NULL,
|
|
275
|
+
update_id TEXT NOT NULL,
|
|
276
|
+
PRIMARY KEY (bot_id, chat_id, update_id)
|
|
277
|
+
);`);
|
|
241
278
|
if (!(db.query("SELECT name FROM pragma_table_info('items')").all() as { name: string }[]).some(column => column.name === 'dedupe_key')) {
|
|
242
279
|
db.exec('ALTER TABLE items ADD COLUMN dedupe_key TEXT');
|
|
243
280
|
}
|
|
@@ -318,34 +355,72 @@ export class BriefItemsLedger {
|
|
|
318
355
|
this.log('briefing.items', 'reaction-recorded', { itemId, reaction });
|
|
319
356
|
}
|
|
320
357
|
|
|
358
|
+
/** Attribute one update to an item in its delivered Telegram message, without rewriting send history. */
|
|
359
|
+
recordTelegramFeedback(event: BriefTelegramFeedback): boolean {
|
|
360
|
+
if (!event.botId || !Number.isSafeInteger(event.chatId) || !Number.isSafeInteger(event.messageId)
|
|
361
|
+
|| event.messageId < 1 || !event.updateId || !(BRIEF_REACTIONS as readonly string[]).includes(event.reaction)) {
|
|
362
|
+
throw new BriefItemsInputError('invalid telegram feedback');
|
|
363
|
+
}
|
|
364
|
+
if (event.itemId !== undefined && (!Number.isSafeInteger(event.itemId) || event.itemId < 1)) {
|
|
365
|
+
throw new BriefItemsInputError('invalid item id');
|
|
366
|
+
}
|
|
367
|
+
const recorded = this.using(db => {
|
|
368
|
+
// Wait for an in-flight brief send before looking up its coordinates. A deferred read
|
|
369
|
+
// could see the pre-send snapshot and discard an early callback as unmatched.
|
|
370
|
+
db.exec('BEGIN IMMEDIATE');
|
|
371
|
+
try {
|
|
372
|
+
const linked = db.query('SELECT item_id FROM telegram_sends WHERE bot_id = ? AND chat_id = ? AND message_id = ? ORDER BY item_id')
|
|
373
|
+
.all(event.botId, event.chatId, event.messageId) as Array<{ item_id: number }>;
|
|
374
|
+
const targets = event.itemId === undefined ? (linked.length === 1 ? linked : []) : linked.filter(row => row.item_id === event.itemId);
|
|
375
|
+
if (targets.length !== 1) { db.exec('COMMIT'); return false; }
|
|
376
|
+
if (!db.query('INSERT OR IGNORE INTO telegram_feedback_events (bot_id, chat_id, update_id) VALUES (?, ?, ?) RETURNING update_id')
|
|
377
|
+
.get(event.botId, event.chatId, event.updateId)) { db.exec('COMMIT'); return false; }
|
|
378
|
+
db.query('INSERT INTO reactions (item_id, reaction, reacted_at) VALUES (?, ?, ?)')
|
|
379
|
+
.run(targets[0]!.item_id, event.reaction, this.now().toISOString());
|
|
380
|
+
db.exec('COMMIT');
|
|
381
|
+
return targets[0]!.item_id;
|
|
382
|
+
} catch (cause) {
|
|
383
|
+
try { db.exec('ROLLBACK'); } catch { /* connection closes next */ }
|
|
384
|
+
throw cause;
|
|
385
|
+
}
|
|
386
|
+
}, 120000);
|
|
387
|
+
if (recorded) this.log('briefing.items', 'reaction-recorded', { itemId: recorded, reaction: event.reaction, source: 'telegram' });
|
|
388
|
+
return recorded !== false;
|
|
389
|
+
}
|
|
390
|
+
|
|
321
391
|
/** KST Monday through now: distinct sent items acted on (button/reply/correction), grouped by domain. */
|
|
322
392
|
weeklyActions(): BriefWeeklyActions {
|
|
323
|
-
|
|
393
|
+
return this.using(db => this.weeklyActionsFromDb(db, this.now()));
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
private weekStart(now: Date): string {
|
|
324
397
|
const today = dateKey(now, { timeZone: KST });
|
|
325
398
|
const day = new Date(`${today}T00:00:00Z`);
|
|
326
399
|
day.setUTCDate(day.getUTCDate() - ((day.getUTCDay() + 6) % 7));
|
|
327
|
-
|
|
400
|
+
return new Date(`${day.toISOString().slice(0, 10)}T00:00:00+09:00`).toISOString();
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
private weeklyActionsFromDb(db: Database, now: Date): BriefWeeklyActions {
|
|
404
|
+
const since = this.weekStart(now);
|
|
328
405
|
const until = now.toISOString();
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
FROM
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
return { acted, total, rate: total === 0 ? 0 : acted / total, byKind };
|
|
348
|
-
});
|
|
406
|
+
const rows = db.query(`SELECT items.domain AS kind,
|
|
407
|
+
COUNT(*) AS total,
|
|
408
|
+
SUM(CASE WHEN EXISTS (
|
|
409
|
+
SELECT 1 FROM reactions r WHERE r.item_id = items.id
|
|
410
|
+
AND r.reaction IN ('버튼', '답장', '정정') AND r.reacted_at >= ? AND r.reacted_at <= ?
|
|
411
|
+
) THEN 1 ELSE 0 END) AS acted
|
|
412
|
+
FROM items WHERE EXISTS (
|
|
413
|
+
SELECT 1 FROM sends s WHERE s.item_id = items.id AND s.sent_at >= ? AND s.sent_at <= ?
|
|
414
|
+
) GROUP BY items.domain`).all(since, until, since, until) as Array<{ kind: BriefDomain; total: number; acted: number }>;
|
|
415
|
+
const byKind = Object.fromEntries(BRIEF_DOMAINS.map(kind => [kind, { acted: 0, total: 0, rate: 0 }])) as Record<BriefDomain, BriefActionCount>;
|
|
416
|
+
let acted = 0;
|
|
417
|
+
let total = 0;
|
|
418
|
+
for (const row of rows) {
|
|
419
|
+
byKind[row.kind] = { acted: row.acted, total: row.total, rate: row.acted / row.total };
|
|
420
|
+
acted += row.acted;
|
|
421
|
+
total += row.total;
|
|
422
|
+
}
|
|
423
|
+
return { acted, total, rate: total === 0 ? 0 : acted / total, byKind };
|
|
349
424
|
}
|
|
350
425
|
|
|
351
426
|
/** Insertion order. Optional domain filter. Item text is the stored original. */
|
|
@@ -388,7 +463,14 @@ export class BriefItemsLedger {
|
|
|
388
463
|
this.log('briefing.items', 'requirement-funnel-failed', { slot, error: error instanceof Error ? error.message : String(error) });
|
|
389
464
|
}
|
|
390
465
|
}
|
|
391
|
-
const
|
|
466
|
+
const since = this.weekStart(now);
|
|
467
|
+
const until = now.toISOString();
|
|
468
|
+
const observedKinds = new Set((db.query(`SELECT DISTINCT i.domain FROM items i
|
|
469
|
+
JOIN reactions r ON r.item_id = i.id
|
|
470
|
+
WHERE r.reacted_at >= ? AND r.reacted_at <= ? AND EXISTS (
|
|
471
|
+
SELECT 1 FROM sends s WHERE s.item_id = i.id AND s.sent_at >= ? AND s.sent_at <= ?
|
|
472
|
+
)`).all(since, until, since, until) as Array<{ domain: BriefDomain }>).map(row => row.domain));
|
|
473
|
+
const composed = composeBriefPage([...items, ...funnelItems], slot, now, this.weeklyActionsFromDb(db, now), observedKinds);
|
|
392
474
|
// Ephemeral funnel lines appear on the page but have no ledger row to mark sent.
|
|
393
475
|
const page = { markdown: composed.markdown, ids: composed.ids.filter(id => id > 0) };
|
|
394
476
|
const candidates = (slot === 'realtime' ? pendingRealtime(items, now) : items.filter(item => item.sent_at === null && beforeSlot(item.created_at, slot, now))).length;
|
|
@@ -403,24 +485,58 @@ export class BriefItemsLedger {
|
|
|
403
485
|
}
|
|
404
486
|
|
|
405
487
|
/** Hold the ledger's SQLite writer lock from selecting unsent rows through delivery and marking.
|
|
406
|
-
* A
|
|
488
|
+
* A delivery that fails before anything was sent rolls back and releases the lock; the next
|
|
489
|
+
* sender can retry. A delivery that fails after some messages already went out commits what
|
|
490
|
+
* the 대표 actually received (sends + telegram_sends) so a retry never re-sends them.
|
|
407
491
|
*/
|
|
408
|
-
withSendLock<T>(slot: string, work: (page: { markdown: string; ids: number[] }, markSent: (ids: readonly number[], slot: BriefSendSlot) => number) => T): T {
|
|
492
|
+
withSendLock<T>(slot: string, work: (page: { markdown: string; ids: number[]; itemLines: ReadonlyMap<string, readonly number[]> }, markSent: (ids: readonly number[], slot: BriefSendSlot, telegram?: { botId: string; chatId: number; messageId: number } | ReadonlyArray<{ botId: string; chatId: number; messageId: number; itemId: number }>) => number) => T): T {
|
|
409
493
|
if (slot !== 'realtime' && !(BRIEF_SLOTS as readonly string[]).includes(slot)) throw new BriefItemsInputError('invalid slot');
|
|
410
494
|
return this.using(db => {
|
|
411
495
|
db.exec('BEGIN IMMEDIATE');
|
|
496
|
+
let marked = false;
|
|
412
497
|
try {
|
|
413
498
|
const page = this.pageFromDb(db, slot as BriefSendSlot);
|
|
414
|
-
const
|
|
415
|
-
|
|
499
|
+
const itemIds = new Set(page.ids);
|
|
500
|
+
const itemLines = new Map<string, number[]>();
|
|
501
|
+
for (const item of this.itemsFromDb(db).filter(item => itemIds.has(item.id))) {
|
|
502
|
+
const line = itemLine(item);
|
|
503
|
+
itemLines.set(line, [...(itemLines.get(line) ?? []), item.id]);
|
|
504
|
+
}
|
|
505
|
+
const result = work({ ...page, itemLines }, (ids, sentSlot, telegram) => {
|
|
506
|
+
const pageIdSet = new Set(page.ids);
|
|
507
|
+
if (sentSlot !== slot || ids.length === 0 || new Set(ids).size !== ids.length
|
|
508
|
+
|| ids.some(id => !pageIdSet.has(id))) {
|
|
416
509
|
throw new BriefItemsInputError('marked ids must match composed page');
|
|
417
510
|
}
|
|
418
|
-
|
|
511
|
+
const coordinates = telegram === undefined ? [] : Array.isArray(telegram)
|
|
512
|
+
? telegram : ids.map(itemId => ({ ...telegram, itemId }));
|
|
513
|
+
if (telegram && (coordinates.some(row => !row.botId || !Number.isSafeInteger(row.chatId)
|
|
514
|
+
|| !Number.isSafeInteger(row.messageId) || row.messageId < 1 || !ids.includes(row.itemId))
|
|
515
|
+
|| new Set(coordinates.map(row => row.itemId)).size !== ids.length)) {
|
|
516
|
+
throw new BriefItemsInputError('invalid telegram send');
|
|
517
|
+
}
|
|
518
|
+
db.exec('SAVEPOINT brief_mark');
|
|
519
|
+
try {
|
|
520
|
+
const count = this.markSentInDb(db, ids, sentSlot);
|
|
521
|
+
if (telegram) {
|
|
522
|
+
const insert = db.query('INSERT OR IGNORE INTO telegram_sends (bot_id, chat_id, message_id, item_id) VALUES (?, ?, ?, ?)');
|
|
523
|
+
for (const row of coordinates) insert.run(row.botId, row.chatId, row.messageId, row.itemId);
|
|
524
|
+
}
|
|
525
|
+
db.exec('RELEASE brief_mark');
|
|
526
|
+
marked = true;
|
|
527
|
+
return count;
|
|
528
|
+
} catch (cause) {
|
|
529
|
+
db.exec('ROLLBACK TO brief_mark');
|
|
530
|
+
db.exec('RELEASE brief_mark');
|
|
531
|
+
throw cause;
|
|
532
|
+
}
|
|
419
533
|
});
|
|
420
534
|
db.exec('COMMIT');
|
|
421
535
|
return result;
|
|
422
536
|
} catch (cause) {
|
|
423
|
-
|
|
537
|
+
// The only writes inside this lock are the marks; committing on failure preserves what
|
|
538
|
+
// the 대표 already received, so a retry sends only the unsent remainder.
|
|
539
|
+
try { db.exec(marked ? 'COMMIT' : 'ROLLBACK'); } catch { /* the connection closes next */ }
|
|
424
540
|
throw cause;
|
|
425
541
|
}
|
|
426
542
|
});
|
package/src/budget/llm-cost.ts
CHANGED
|
@@ -303,7 +303,19 @@ export function estimateLlmCost(
|
|
|
303
303
|
|
|
304
304
|
/** Discriminated cost fields to spread onto an `llm.usage` observation. */
|
|
305
305
|
/** 과금 경로(BACKLOG C6 · hermes `resolve_billing_route`). 구독(OAuth)·local 은 «토큰당 청구가 없다». */
|
|
306
|
-
export type BillingRoute = 'subscription' | 'local' | 'api' | 'unknown';
|
|
306
|
+
export type BillingRoute = 'subscription' | 'local' | 'credit' | 'api' | 'unknown';
|
|
307
|
+
|
|
308
|
+
/** Credit is known only when the quota window is exhausted and credits are present. */
|
|
309
|
+
export function creditRouteFromQuotaSignal(signal: {
|
|
310
|
+
usedPercent?: number | null;
|
|
311
|
+
rateLimitReached?: boolean | null;
|
|
312
|
+
hasCredits?: boolean | null;
|
|
313
|
+
} | null): 'credit' | null {
|
|
314
|
+
if (!signal || signal.hasCredits !== true) return null;
|
|
315
|
+
const exhausted = signal.rateLimitReached === true
|
|
316
|
+
|| (typeof signal.usedPercent === 'number' && Number.isFinite(signal.usedPercent) && signal.usedPercent >= 100);
|
|
317
|
+
return exhausted ? 'credit' : null;
|
|
318
|
+
}
|
|
307
319
|
|
|
308
320
|
/** 구독·local 호출의 비용 — 청구 0 이지만 «API 로 샀다면」 값은 따로 남긴다(환산가 · 모르면 칸이 없다). */
|
|
309
321
|
/** provider 가 보고한 실제 청구액(OpenRouter `usage.cost`) — 카탈로그 추정과 다르면 이것이 맞다. */
|
|
@@ -323,14 +335,25 @@ export interface IncludedLlmCost {
|
|
|
323
335
|
apiEquivalentUsd?: number;
|
|
324
336
|
}
|
|
325
337
|
|
|
338
|
+
export interface CreditLlmCost {
|
|
339
|
+
kind: 'credit';
|
|
340
|
+
model: string;
|
|
341
|
+
usd: null;
|
|
342
|
+
apiEquivalentUsd?: number;
|
|
343
|
+
}
|
|
344
|
+
|
|
326
345
|
export function llmUsageCostFields(
|
|
327
346
|
model: string,
|
|
328
347
|
usage: Omit<LlmCostUsage, 'model'>,
|
|
329
348
|
opts?: EstimateLlmCostOptions,
|
|
330
349
|
billing?: BillingRoute,
|
|
331
|
-
): { cost: LlmCostEstimate | IncludedLlmCost | ActualLlmCost | ByokActualCost | ByokPartialCost } {
|
|
350
|
+
): { cost: LlmCostEstimate | IncludedLlmCost | CreditLlmCost | ActualLlmCost | ByokActualCost | ByokPartialCost } {
|
|
332
351
|
const resolved = opts ?? { configPricing: readLlmConfigPricing() };
|
|
333
352
|
const estimate = estimateLlmCost({ model, ...usage }, resolved);
|
|
353
|
+
// An explicit credit route owns this cost row; API/BYOK amounts belong to other routes.
|
|
354
|
+
if (billing === 'credit') {
|
|
355
|
+
return { cost: { kind: 'credit', model, usd: null, ...(estimate.kind === 'known' || estimate.kind === 'partial' ? { apiEquivalentUsd: estimate.usd } : {}) } };
|
|
356
|
+
}
|
|
334
357
|
// ⛔⭐ 구독을 API 단가로 «known» 이라 적지 않는다 — 09-25 벤치에서 codex 구독 팔이 `$7.81 known` 으로 보였다.
|
|
335
358
|
// ⭐ BACKLOG C7 — provider 가 실어 보낸 «실제 청구액»이 있으면 그것이 비용이다(추정은 곁에 남긴다).
|
|
336
359
|
// OR-BYOK-COST — BYOK 면 «OR 청구 + 상류 청구»가 비용이다(상류를 모르면 partial · 0 으로 가정하지 않는다).
|
|
@@ -12,6 +12,10 @@ export interface PtyUsageReemitOpts {
|
|
|
12
12
|
readonly workdir: string;
|
|
13
13
|
/** Codex session UUID observed from this child PTY; empty when unavailable (emit nothing). */
|
|
14
14
|
readonly sessionId: string;
|
|
15
|
+
/** Caller-observed metadata only. Never infer a Codex account from CODEX_HOME. */
|
|
16
|
+
readonly role?: string;
|
|
17
|
+
readonly stage?: string;
|
|
18
|
+
readonly account?: string;
|
|
15
19
|
/** Child start time: do not attribute older sessions in a shared CODEX_HOME to this child. */
|
|
16
20
|
readonly sinceMs?: number;
|
|
17
21
|
/** Override the dedup ledger location in isolated tests. */
|
|
@@ -40,6 +44,9 @@ export function reemitPtyUsage(opts: PtyUsageReemitOpts): number {
|
|
|
40
44
|
if (Number(insert.run(home, turn.turnId).changes) === 0) continue;
|
|
41
45
|
debug.log('llm.usage', 'llm-usage', {
|
|
42
46
|
runId: opts.runId,
|
|
47
|
+
...(opts.role !== undefined ? { role: opts.role } : {}),
|
|
48
|
+
...(opts.stage !== undefined ? { stage: opts.stage } : {}),
|
|
49
|
+
...(opts.account !== undefined ? { account: opts.account } : {}),
|
|
43
50
|
substrate: 'pty',
|
|
44
51
|
site: 'pty-rollup:codex',
|
|
45
52
|
turnId: turn.turnId,
|
|
@@ -16,6 +16,15 @@ export interface RunUsageInput {
|
|
|
16
16
|
cost?: { kind?: string; usd?: number; apiEquivalentUsd?: number } | null;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
/** A returned Pod raw usage row is covered only by a measured rollup from the same Job. */
|
|
20
|
+
export function excludeCoveredPodRawRows<T extends { origin?: unknown; podJob?: unknown; job?: unknown; site?: unknown; measured?: unknown }>(rows: readonly T[]): T[] {
|
|
21
|
+
const rolledUpJobs = new Set(rows.flatMap((row) =>
|
|
22
|
+
typeof row.job === 'string' && row.job.length > 0
|
|
23
|
+
&& typeof row.site === 'string' && row.site.startsWith('pod-rollup:')
|
|
24
|
+
&& row.site !== 'pod-rollup:missing' && row.measured !== false ? [row.job] : []));
|
|
25
|
+
return rows.filter((row) => row.origin !== 'pod' || typeof row.podJob !== 'string' || !rolledUpJobs.has(row.podJob));
|
|
26
|
+
}
|
|
27
|
+
|
|
19
28
|
export interface RunUsageRow {
|
|
20
29
|
runId: string;
|
|
21
30
|
role?: string;
|