elanous 0.2.28 → 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/{y1ltt7oCZxVpC6zVPhZ2O → 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-fa46d4588e8442c2.js → page-a5635eba0d73b84e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ad9181d84285e4ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/{page-66ad46ed0279feb9.js → page-86feb08080261a2f.js} +1 -1
- 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-646b50f63b6fe732.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-6f131b51193a36f9.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-9eb56166774eb256.js +1 -0
- 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/release/release-loop.yaml +6 -2
- package/package.json +1 -1
- package/plugins/agent-team/agents/research.md +1 -0
- package/scripts/ci-typecheck-changed.ts +3 -2
- package/scripts/coord-channel-watch.sh +26 -6
- package/scripts/coord-role-pack.ts +143 -0
- package/scripts/lib/morning-report-options.ts +41 -0
- package/scripts/pr-land-extra-remote-gates.ts +49 -0
- 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 +310 -46
- package/scripts/release-loop/gate-triage-node.ts +190 -0
- package/scripts/release-loop/spawn-lane.ts +68 -0
- package/scripts/release-loop/tui-node-checks.ts +23 -0
- package/scripts/release-loop/version-node.ts +62 -4
- package/scripts/test-deterministic.ts +41 -12
- package/scripts/usage-rollup.ts +11 -3
- 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-substrate/pr-reviewer.ts +29 -21
- 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/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/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 +45 -2
- package/src/cli/pr-cli.ts +382 -105
- package/src/cli/pr-land-heavy-remote.ts +233 -0
- package/src/cli/pr-land-overlap-evidence.ts +104 -5
- package/src/cli/pty-takeover-cli.ts +125 -16
- package/src/cli/release-cli.ts +44 -2
- package/src/cli/remote-resolve.ts +2 -1
- package/src/cli/seat-cli.ts +26 -16
- package/src/cli/tasks-cli.ts +8 -2
- package/src/cli/usage-cli.ts +146 -12
- 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/goal-loop-thinking.ts +16 -0
- package/src/dashboard/hitl-boot.ts +9 -4
- package/src/dashboard/index.ts +228 -387
- 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/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/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/graph-runner/runner.ts +1 -0
- package/src/harness/harness-gc.ts +32 -5
- package/src/index.ts +14 -1
- package/src/input/external-input-queue.ts +219 -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 +60 -3
- package/src/loops/orchestrator/tick.ts +24 -4
- package/src/loops/registry.ts +42 -4
- package/src/memory.ts +20 -5
- 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/persona/presets.ts +44 -0
- package/src/plugins/maker/wizard-generate.ts +6 -4
- 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/light-rc.ts +28 -3
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/render.ts +5 -1
- package/src/seat-loop/seat-report.ts +42 -2
- 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 +11 -2
- package/src/self-implement/goal-author-decompose.ts +80 -16
- package/src/self-implement/goal-author.ts +114 -72
- package/src/self-implement/goal-authoring-grounding.ts +1 -1
- package/src/self-implement/goal-file-name.ts +65 -0
- package/src/self-implement/ground-goal.ts +2 -1
- package/src/self-implement/host-regate.ts +14 -0
- package/src/self-implement/review-mustfix-class.ts +115 -0
- 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/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 +47 -7
- package/src/skills/tools/shell.ts +117 -1
- package/src/status/bar.ts +32 -2
- package/src/status/status-provider-info.ts +58 -0
- package/src/task-agent/rejudge-on-head.ts +4 -1
- package/src/task-agent/remote-rejudge-bind.ts +34 -5
- package/src/task-agent/repair-cycle.ts +13 -0
- 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/self-implement-pod.ts +107 -33
- 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 +54 -6
- package/src/ux-sim/fake-llm.ts +29 -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-29d1d773d5996a49.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-56f2c0a5cc4a7295.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-5ab1e47978577c5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-24453f6a302816b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-6c131d30bb1cf871.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-dc0772b11861af51.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-5159dc8752c6cd29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-c5a2478861c08b87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-f722a9dec084e08b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-256ffd365d32e100.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e0de78ae7b99f01c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-cfbdc44b708d9801.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-4c741eb760f2f77c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-e9ba98f5f1440a21.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-dafc901bb1b72b5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-2f6f303fa114ec24.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-1634081c5272006c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-ced0bcfc6542b3fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-bb1f05cd51c38944.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-db069b48a59c8c00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-f736324afa2117c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-435f5e2faf02bc01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-497e0eedf20e7890.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-a8d28fdf995e16ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-8966452228753c5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fd5d18656cb432b6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-5663779cb1a37609.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-66a67eb19ebd976b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-3b492aa78cf3c4a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c71267e7681da982.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-a21d1e1797172692.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-cb249e81ed339318.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-781cfc5114e097da.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-478157214db6a023.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-86141f12cf090b7f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-7256c73bb1c36751.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-5c738ca7adef3de5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-0138c8091ec17224.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-cc2f24f16d85e735.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-979d318a534e92da.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-182d394f7e6e096b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-21050928a697ed7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-44b9d807005a9030.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-601fb77340e63c9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-75d3fb5d47af0edf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-11bf9e5725a72c22.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/{y1ltt7oCZxVpC6zVPhZ2O → cIpv5nU9AycwYWZI9H589}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { debug } from '../../src/debug/log.js';
|
|
4
|
+
import { registerStandaloneLogSink } from '../../src/domains/standalone-log-sink.js';
|
|
5
|
+
import type { GateResult } from './gate-node.js';
|
|
6
|
+
import { emitNodeResult, readGraphContext, type GraphContext } from './node-verdict.js';
|
|
7
|
+
|
|
8
|
+
/** A shadow recommendation. No value here is a release waiver or a graph edge. */
|
|
9
|
+
export type GateTriageClass = 'unmeasured' | 'load' | 'env' | 'regression' | 'clean' | 'exhausted';
|
|
10
|
+
|
|
11
|
+
export interface GateTriageEvidence {
|
|
12
|
+
/** Observed from the Pod/host during this gate; a timeout alone is not proof of load. */
|
|
13
|
+
highLoad?: boolean;
|
|
14
|
+
/** Count of the suspected failure IDs reproduced in an isolated run. */
|
|
15
|
+
isolatedReproductions?: number;
|
|
16
|
+
/** Exact introduced IDs that actually received an isolated recheck. */
|
|
17
|
+
isolatedCheckedFailureIds?: string[];
|
|
18
|
+
/** Timeout shard files that completed an isolated recheck. */
|
|
19
|
+
isolatedPassedFiles?: string[];
|
|
20
|
+
/** Exact test IDs independently attributed to the Pod environment. */
|
|
21
|
+
environmentFailureIds?: string[];
|
|
22
|
+
/** The last two actual decisions, including their measured identities. */
|
|
23
|
+
priorDecisions?: Array<{ classification: GateTriageClass; commit: string; failureIds: string[] }>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface GateTriageShadow {
|
|
27
|
+
classification: GateTriageClass;
|
|
28
|
+
reason: string;
|
|
29
|
+
commit: string;
|
|
30
|
+
introduced: string[];
|
|
31
|
+
stalledFiles: string[];
|
|
32
|
+
failureIds: string[];
|
|
33
|
+
evidence: {
|
|
34
|
+
highLoad: boolean | null;
|
|
35
|
+
isolatedReproductions: number | null;
|
|
36
|
+
isolatedCheckedFailureIds: string[] | null;
|
|
37
|
+
isolatedPassedFiles: string[] | null;
|
|
38
|
+
environmentFailureIds: string[] | null;
|
|
39
|
+
loadFlaky: string[] | null;
|
|
40
|
+
stalledEnv: Array<{ file: string; local: string }>;
|
|
41
|
+
};
|
|
42
|
+
/** Shadow always goes to the existing failure exit. */
|
|
43
|
+
outcome: 'fail';
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function timeoutShape(gate: GateResult): boolean {
|
|
47
|
+
return gate.stalledShards?.some((shard) => shard.reason === 'timeout' || shard.reason === 'no-output') === true
|
|
48
|
+
|| (gate.loadFlaky?.length ?? 0) > 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function classifyGateShadow(gate: GateResult, evidence: GateTriageEvidence = {}): GateTriageShadow {
|
|
52
|
+
const stalledFiles = [...new Set((gate.stalledShards ?? []).flatMap((shard) => shard.files))].sort();
|
|
53
|
+
const failureIds = [...new Set([...gate.introduced, ...stalledFiles, ...gate.stalledEnv.map((item) => item.file)])].sort();
|
|
54
|
+
let classification: GateTriageClass;
|
|
55
|
+
let reason: string;
|
|
56
|
+
|
|
57
|
+
const unmeasured = gate.stalledShards?.some((shard) => shard.reason !== 'timeout' && shard.reason !== 'no-output') === true;
|
|
58
|
+
const loadExplainsIntroduced = gate.introduced.every((id) => gate.loadFlaky?.includes(id) === true
|
|
59
|
+
&& evidence.isolatedCheckedFailureIds?.includes(id) === true);
|
|
60
|
+
const loadExplainsStalled = stalledFiles.every((file) => evidence.isolatedPassedFiles?.includes(file) === true);
|
|
61
|
+
const noUnexplainedEnvironmentFailure = gate.stalledEnv.length === 0;
|
|
62
|
+
const envFiles = new Set(gate.stalledEnv.filter((item) => item.local === 'passed').map((item) => item.file));
|
|
63
|
+
const envExplainsIntroduced = gate.introduced.every((id) => envFiles.has(id.split(' > ', 1)[0]!)
|
|
64
|
+
&& evidence.environmentFailureIds?.includes(id) === true);
|
|
65
|
+
const envExplainsStalled = stalledFiles.every((file) => envFiles.has(file));
|
|
66
|
+
const allEnvironmentChecksPassed = gate.stalledEnv.length > 0 && gate.stalledEnv.every((item) => item.local === 'passed');
|
|
67
|
+
if (unmeasured) {
|
|
68
|
+
classification = 'unmeasured';
|
|
69
|
+
reason = 'gate has unfinished or unattributed shard files';
|
|
70
|
+
} else if ((gate.introduced.length > 0 || stalledFiles.length > 0)
|
|
71
|
+
&& timeoutShape(gate) && loadExplainsIntroduced && loadExplainsStalled && noUnexplainedEnvironmentFailure
|
|
72
|
+
&& evidence.highLoad === true && evidence.isolatedReproductions === 0) {
|
|
73
|
+
classification = 'load';
|
|
74
|
+
reason = 'timeout shape under observed load did not reproduce in isolation';
|
|
75
|
+
} else if (gate.outcome !== 'ok' && allEnvironmentChecksPassed && envExplainsIntroduced && envExplainsStalled) {
|
|
76
|
+
classification = 'env';
|
|
77
|
+
reason = 'Pod environment failure passed outside the Pod';
|
|
78
|
+
} else if (stalledFiles.length || (gate.outcome === 'error' && gate.introduced.length === 0)) {
|
|
79
|
+
classification = 'unmeasured';
|
|
80
|
+
reason = stalledFiles.length ? 'timeout-shaped files remain unmeasured' : 'gate errored without a measured regression';
|
|
81
|
+
} else if (gate.introduced.length > 0 || gate.outcome === 'regression') {
|
|
82
|
+
classification = 'regression';
|
|
83
|
+
reason = 'gate measured an introduced regression';
|
|
84
|
+
} else if (gate.outcome === 'ok') {
|
|
85
|
+
classification = 'clean';
|
|
86
|
+
reason = 'gate passed';
|
|
87
|
+
} else {
|
|
88
|
+
classification = 'unmeasured';
|
|
89
|
+
reason = 'gate failure has no measured regression identity';
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const repeated = failureIds.length > 0 && evidence.priorDecisions?.slice(-2).length === 2
|
|
93
|
+
&& evidence.priorDecisions.slice(-2).every((prior) => prior.classification === classification
|
|
94
|
+
&& prior.commit === gate.commit
|
|
95
|
+
&& JSON.stringify([...prior.failureIds].sort()) === JSON.stringify(failureIds));
|
|
96
|
+
if (classification !== 'clean' && repeated) {
|
|
97
|
+
classification = 'exhausted';
|
|
98
|
+
reason = 'the same class and failure identities already recurred twice';
|
|
99
|
+
}
|
|
100
|
+
return { classification, reason, commit: gate.commit, introduced: [...gate.introduced], stalledFiles, failureIds,
|
|
101
|
+
evidence: { highLoad: evidence.highLoad ?? null, isolatedReproductions: evidence.isolatedReproductions ?? null,
|
|
102
|
+
isolatedCheckedFailureIds: evidence.isolatedCheckedFailureIds ? [...evidence.isolatedCheckedFailureIds] : null,
|
|
103
|
+
isolatedPassedFiles: evidence.isolatedPassedFiles ? [...evidence.isolatedPassedFiles] : null,
|
|
104
|
+
environmentFailureIds: evidence.environmentFailureIds ? [...evidence.environmentFailureIds] : null,
|
|
105
|
+
loadFlaky: gate.loadFlaky ? [...gate.loadFlaky] : null,
|
|
106
|
+
stalledEnv: gate.stalledEnv.map((item) => ({ file: item.file, local: item.local })) },
|
|
107
|
+
outcome: 'fail' };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Read only the completed gate output. The graph wiring is a separate change after M3. */
|
|
111
|
+
export function gateTriageShadowFromContext(context: GraphContext, evidence?: GateTriageEvidence): GateTriageShadow {
|
|
112
|
+
const value = context.outputs.gate;
|
|
113
|
+
if (!value || typeof value.commit !== 'string' || !Array.isArray(value.introduced)
|
|
114
|
+
|| !value.introduced.every((item) => typeof item === 'string')
|
|
115
|
+
|| !Array.isArray(value.stalledEnv)
|
|
116
|
+
|| !value.stalledEnv.every((item) => item && typeof item === 'object' && typeof item.file === 'string'
|
|
117
|
+
&& ['passed', 'failed', 'timeout'].includes(String(item.local)))
|
|
118
|
+
|| (value.stalledShards !== undefined && (!Array.isArray(value.stalledShards)
|
|
119
|
+
|| !value.stalledShards.every((item) => item && typeof item === 'object' && Array.isArray(item.files)
|
|
120
|
+
&& item.files.every((file: unknown) => typeof file === 'string') && typeof item.reason === 'string')))
|
|
121
|
+
|| (value.loadFlaky !== undefined && (!Array.isArray(value.loadFlaky)
|
|
122
|
+
|| !value.loadFlaky.every((item) => typeof item === 'string')))
|
|
123
|
+
|| !['ok', 'regression', 'error'].includes(String(value.outcome))) {
|
|
124
|
+
throw new Error('gate output is missing or malformed');
|
|
125
|
+
}
|
|
126
|
+
const input = context.input.gateTriageEvidence;
|
|
127
|
+
const supplied = input && typeof input === 'object' && !Array.isArray(input) ? input as Record<string, unknown> : {};
|
|
128
|
+
const observed: GateTriageEvidence = evidence ?? {
|
|
129
|
+
...(supplied.highLoad === true ? { highLoad: true } : {}),
|
|
130
|
+
...(Number.isSafeInteger(supplied.isolatedReproductions) && Number(supplied.isolatedReproductions) >= 0
|
|
131
|
+
? { isolatedReproductions: Number(supplied.isolatedReproductions) } : {}),
|
|
132
|
+
...(Array.isArray(supplied.isolatedCheckedFailureIds) && supplied.isolatedCheckedFailureIds.every((id) => typeof id === 'string')
|
|
133
|
+
? { isolatedCheckedFailureIds: supplied.isolatedCheckedFailureIds as string[] } : {}),
|
|
134
|
+
...(Array.isArray(supplied.isolatedPassedFiles) && supplied.isolatedPassedFiles.every((file) => typeof file === 'string')
|
|
135
|
+
? { isolatedPassedFiles: supplied.isolatedPassedFiles as string[] } : {}),
|
|
136
|
+
...(Array.isArray(supplied.environmentFailureIds) && supplied.environmentFailureIds.every((id) => typeof id === 'string')
|
|
137
|
+
? { environmentFailureIds: supplied.environmentFailureIds as string[] } : {}),
|
|
138
|
+
...(Array.isArray(supplied.priorDecisions) && supplied.priorDecisions.every((item) => item && typeof item === 'object'
|
|
139
|
+
&& typeof item.classification === 'string' && typeof item.commit === 'string' && Array.isArray(item.failureIds)
|
|
140
|
+
&& item.failureIds.every((id: unknown) => typeof id === 'string'))
|
|
141
|
+
? { priorDecisions: supplied.priorDecisions as GateTriageEvidence['priorDecisions'] } : {}),
|
|
142
|
+
};
|
|
143
|
+
return classifyGateShadow(value as unknown as GateResult, observed);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export function logGateTriageShadow(result: GateTriageShadow, version: string): void {
|
|
147
|
+
debug.log('graph.ground', 'gate-triage-shadow', { version, ...result });
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** A saved verdict has fewer fields than the live gate output. Keep the absent evidence absent. */
|
|
151
|
+
export function gateTriageShadowFromSavedVerdict(value: unknown): { version: string; result: GateTriageShadow } {
|
|
152
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('invalid saved gate verdict');
|
|
153
|
+
const saved = value as Record<string, unknown>;
|
|
154
|
+
if (typeof saved.version !== 'string' || typeof saved.commit !== 'string'
|
|
155
|
+
|| !['ok', 'regression', 'error'].includes(String(saved.outcome))
|
|
156
|
+
|| !Array.isArray(saved.introduced) || !saved.introduced.every((id) => typeof id === 'string')
|
|
157
|
+
|| (saved.loadFlaky !== undefined && (!Array.isArray(saved.loadFlaky)
|
|
158
|
+
|| !saved.loadFlaky.every((id) => typeof id === 'string')))) throw new Error('invalid saved gate verdict');
|
|
159
|
+
const gate: GateResult = { outcome: saved.outcome as GateResult['outcome'], commit: saved.commit,
|
|
160
|
+
introduced: saved.introduced, preexisting: 0, fixed: null, knownEnv: 0, knownEnvCleared: [],
|
|
161
|
+
stalledEnv: (saved.stalledEnv ?? []) as GateResult['stalledEnv'], rcNonzeroNoFailures: [], durationMs: 0,
|
|
162
|
+
...(saved.stalledShards !== undefined ? { stalledShards: saved.stalledShards as GateResult['stalledShards'] } : {}),
|
|
163
|
+
...(saved.loadFlaky !== undefined ? { loadFlaky: saved.loadFlaky as string[] } : {}) };
|
|
164
|
+
const context: GraphContext = { input: { version: saved.version, previousVersion: '0.0.0' },
|
|
165
|
+
outputs: { gate: gate as unknown as Record<string, unknown> } };
|
|
166
|
+
return { version: saved.version, result: gateTriageShadowFromContext(context) };
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (import.meta.main) {
|
|
170
|
+
await registerStandaloneLogSink('release-loop');
|
|
171
|
+
try {
|
|
172
|
+
const savedPath = process.argv[2] === '--gate-verdict' ? process.argv[3] : undefined;
|
|
173
|
+
if (process.argv[2] && !savedPath) throw new Error('usage: gate-triage-node.ts [--gate-verdict <path>]');
|
|
174
|
+
const { version, result } = savedPath
|
|
175
|
+
? gateTriageShadowFromSavedVerdict(JSON.parse(readFileSync(savedPath, 'utf8')))
|
|
176
|
+
: (() => { const context = readGraphContext(); return { version: context.input.version,
|
|
177
|
+
result: gateTriageShadowFromContext(context) }; })();
|
|
178
|
+
logGateTriageShadow(result, version);
|
|
179
|
+
emitNodeResult({ ...result, verdict: 'fail', summary: `gate-triage shadow: ${result.classification} — ${result.reason}` });
|
|
180
|
+
} catch (error) {
|
|
181
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
182
|
+
const result: GateTriageShadow = { outcome: 'fail', classification: 'unmeasured', reason,
|
|
183
|
+
commit: 'unknown', introduced: [], stalledFiles: [], failureIds: [],
|
|
184
|
+
evidence: { highLoad: null, isolatedReproductions: null, isolatedCheckedFailureIds: null,
|
|
185
|
+
isolatedPassedFiles: null, environmentFailureIds: null, loadFlaky: null, stalledEnv: [] } };
|
|
186
|
+
logGateTriageShadow(result, 'unknown');
|
|
187
|
+
emitNodeResult({ ...result, verdict: 'fail', summary: `gate-triage shadow: ${reason}` });
|
|
188
|
+
}
|
|
189
|
+
process.exitCode = 1;
|
|
190
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { planShards } from './shard-plan';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Gate tests that exercise a real process or PTY. Keep them in their own Pod
|
|
5
|
+
* shards so an external CLI/terminal stall cannot consume an ordinary shard's
|
|
6
|
+
* deadline. These are file paths at the cut commit, not test title patterns.
|
|
7
|
+
*
|
|
8
|
+
* 0.2.29 (2026-10-15): these files from the failed gate attempts launch a
|
|
9
|
+
* real child. Add a file only after checking its test body, not merely because
|
|
10
|
+
* its name mentions a process.
|
|
11
|
+
*/
|
|
12
|
+
export const GATE_SPAWN_LANE_FILES = [
|
|
13
|
+
'scripts/lib/tui-runshell-group-e2e.test.ts',
|
|
14
|
+
'scripts/lib/tui-streaming-e2e.test.ts',
|
|
15
|
+
'src/agent-mission/doc-guided-install.test.ts',
|
|
16
|
+
'src/dashboard/first-screen-band-wiring.test.ts',
|
|
17
|
+
'src/git-fs/spawn-discipline.test.ts',
|
|
18
|
+
'src/self-implement/run-ledger.test.ts',
|
|
19
|
+
'src/video-pipeline/recipes/reframe.test.ts',
|
|
20
|
+
'test/ch5730-watch-delivery.test.ts',
|
|
21
|
+
'test/cli-dev-command.test.ts',
|
|
22
|
+
'test/preview-terminal.test.ts',
|
|
23
|
+
] as const;
|
|
24
|
+
|
|
25
|
+
const SPAWN_FILES = new Set<string>(GATE_SPAWN_LANE_FILES);
|
|
26
|
+
|
|
27
|
+
export const GATE_SPAWN_LANE_SHARDS = 3;
|
|
28
|
+
|
|
29
|
+
export function isGateSpawnLaneFile(file: string): boolean {
|
|
30
|
+
return SPAWN_FILES.has(file);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Every assigned test file is returned exactly once, including a partial gate. */
|
|
34
|
+
export function partitionGateSpawnLane(files: readonly string[]): { regular: string[]; spawn: string[] } {
|
|
35
|
+
const regular: string[] = [];
|
|
36
|
+
const spawn: string[] = [];
|
|
37
|
+
const seen = new Set<string>();
|
|
38
|
+
for (const file of files) {
|
|
39
|
+
if (seen.has(file)) throw new Error(`duplicate gate test file: ${file}`);
|
|
40
|
+
seen.add(file);
|
|
41
|
+
(isGateSpawnLaneFile(file) ? spawn : regular).push(file);
|
|
42
|
+
}
|
|
43
|
+
return { regular, spawn };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Reserve at most three of the configured shards for real process tests.
|
|
47
|
+
* Keeping those files out of ordinary shards preserves coverage and leaves
|
|
48
|
+
* the total shard count unchanged when enough regular files exist. */
|
|
49
|
+
export function planGateSpawnSeparatedShards(files: readonly string[], durations: Map<string, number>, shardCount: number): {
|
|
50
|
+
shards: Array<{ files: string[]; plannedSeconds: number }>;
|
|
51
|
+
spawnFiles: string[];
|
|
52
|
+
spawnShardCount: number;
|
|
53
|
+
} {
|
|
54
|
+
const { regular, spawn } = partitionGateSpawnLane(files);
|
|
55
|
+
if (regular.length && spawn.length && shardCount < 2) {
|
|
56
|
+
throw new Error('gate spawn lane needs at least two shards when regular and spawn tests coexist');
|
|
57
|
+
}
|
|
58
|
+
const spawnShardCount = Math.min(GATE_SPAWN_LANE_SHARDS, spawn.length, shardCount - (regular.length ? 1 : 0));
|
|
59
|
+
const regularCount = regular.length ? shardCount - spawnShardCount : 0;
|
|
60
|
+
return {
|
|
61
|
+
shards: [
|
|
62
|
+
...(regular.length ? planShards(regular, durations, regularCount) : []),
|
|
63
|
+
...(spawn.length ? planShards(spawn, durations, spawnShardCount) : []),
|
|
64
|
+
],
|
|
65
|
+
spawnFiles: spawn,
|
|
66
|
+
spawnShardCount,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
@@ -27,6 +27,29 @@ export function tuiChecks(s: TuiScreens, readyLimitMs = 60_000): TuiCheck[] {
|
|
|
27
27
|
];
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
export interface ExecutedTuiCheck { outcome: 'ok' | 'fail' | 'unmeasured'; detail: string }
|
|
31
|
+
|
|
32
|
+
/** Run the screen-based TUI node, not `--help`: the subprocess boots a PTY, captures first/help/Esc screens and judges them. */
|
|
33
|
+
export async function executeTuiNodeCheck(commit: string, repo: string,
|
|
34
|
+
command: (cmd: string, args: string[], cwd: string, limitMs?: number) => Promise<{ rc: number; output: string }>): Promise<ExecutedTuiCheck> {
|
|
35
|
+
const run = await command('bun', ['scripts/release-loop/tui-sim-node.ts', '--commit', commit, '--json'], repo, 300_000);
|
|
36
|
+
const line = run.output.split(/\r?\n/).find((text) => text.trim().startsWith('{'));
|
|
37
|
+
let value: Record<string, unknown>;
|
|
38
|
+
try { value = JSON.parse(line ?? '') as Record<string, unknown>; }
|
|
39
|
+
catch { return { outcome: 'unmeasured', detail: `TUI screen result missing (rc=${run.rc})` }; }
|
|
40
|
+
if (run.rc === 0 && reusableTui(withTuiOutcome(run.rc, value), commit))
|
|
41
|
+
return { outcome: 'ok', detail: `TUI screens: ${value.verdict} · 6 checks` };
|
|
42
|
+
const ids = ['boot', 'prompt', 'status-bar', 'help-opens', 'help-closes', 'no-error-text'];
|
|
43
|
+
const measuredFailure = run.rc === 1 && value.commit === commit && value.verdict === 'fail' && value.attempts === 2
|
|
44
|
+
&& Array.isArray(value.checks) && value.checks.length === ids.length
|
|
45
|
+
&& value.checks.every((check: unknown, i: number) => !!check && typeof check === 'object'
|
|
46
|
+
&& (check as TuiCheck).id === ids[i] && typeof (check as TuiCheck).pass === 'boolean'
|
|
47
|
+
&& typeof (check as TuiCheck).detail === 'string')
|
|
48
|
+
&& value.checks.some((check: TuiCheck) => !check.pass);
|
|
49
|
+
const failed = measuredFailure ? (value.checks as TuiCheck[]).filter((check) => !check.pass).map((check) => check.id) : [];
|
|
50
|
+
return { outcome: measuredFailure ? 'fail' : 'unmeasured', detail: `TUI screens: ${failed.join(', ') || String(value.verdict)} (rc=${run.rc})` };
|
|
51
|
+
}
|
|
52
|
+
|
|
30
53
|
export function tuiVerdict(checks: readonly TuiCheck[]): 'pass' | 'fail' {
|
|
31
54
|
return checks.every((c) => c.pass) ? 'pass' : 'fail';
|
|
32
55
|
}
|
|
@@ -20,6 +20,41 @@ export function nextDevVersion(version: string): string {
|
|
|
20
20
|
return `${match[1]}.${match[2]}.${BigInt(match[3]!) + 1n}-dev.0`;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
/** Is main carrying the published release immediately before this cut (patch, minor, or major boundary)? */
|
|
24
|
+
function previousPublishedLine(version: string, current: string): string | null {
|
|
25
|
+
const target = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.exec(baseVersion(version));
|
|
26
|
+
const carried = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-dev\.(0|[1-9]\d*))?$/.exec(current);
|
|
27
|
+
if (!target || !carried) return null;
|
|
28
|
+
const [major, minor, patch] = [BigInt(target[1]!), BigInt(target[2]!), BigInt(target[3]!)];
|
|
29
|
+
const [priorMajor, priorMinor, priorPatch] = [BigInt(carried[1]!), BigInt(carried[2]!), BigInt(carried[3]!)];
|
|
30
|
+
const nextPatch = priorMajor === major && priorMinor === minor && priorPatch + 1n === patch;
|
|
31
|
+
const nextMinor = priorMajor === major && priorMinor + 1n === minor && patch === 0n;
|
|
32
|
+
const nextMajor = priorMajor + 1n === major && minor === 0n && patch === 0n;
|
|
33
|
+
return nextPatch || nextMinor || nextMajor ? `${priorMajor}.${priorMinor}.${priorPatch}` : null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function compareVersionParts(left: readonly bigint[], right: readonly bigint[]): number {
|
|
37
|
+
for (let index = 0; index < 3; index++) {
|
|
38
|
+
if (left[index] !== right[index]) return left[index]! < right[index]! ? -1 : 1;
|
|
39
|
+
}
|
|
40
|
+
return 0;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** At a minor/major boundary, the carried line must be the latest published stable tag before the cut. */
|
|
44
|
+
function latestPublishedStableBefore(repo: string, version: string): string | null {
|
|
45
|
+
const target = baseVersion(version).split('.').map(BigInt);
|
|
46
|
+
let latest: { version: string; parts: bigint[] } | null = null;
|
|
47
|
+
const tags = git(repo, 'ls-remote', '--tags', '--refs', 'origin', 'refs/tags/v*');
|
|
48
|
+
for (const line of tags.split('\n')) {
|
|
49
|
+
const match = /\brefs\/tags\/v((?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*))$/.exec(line);
|
|
50
|
+
if (!match) continue;
|
|
51
|
+
const parts = match[1]!.split('.').map(BigInt);
|
|
52
|
+
if (compareVersionParts(parts, target) >= 0) continue;
|
|
53
|
+
if (!latest || compareVersionParts(parts, latest.parts) > 0) latest = { version: match[1]!, parts };
|
|
54
|
+
}
|
|
55
|
+
return latest?.version ?? null;
|
|
56
|
+
}
|
|
57
|
+
|
|
23
58
|
function run(command: string, args: string[], cwd: string): string {
|
|
24
59
|
const result = spawnSync(command, args, { cwd, encoding: 'utf8', maxBuffer: 16 * 1024 * 1024 });
|
|
25
60
|
if (result.status !== 0 || result.error) {
|
|
@@ -120,13 +155,32 @@ function currentFreeze(): LandingFreeze | null {
|
|
|
120
155
|
return readLandingFreeze(prod) ?? (root === prod ? null : readLandingFreeze(root));
|
|
121
156
|
}
|
|
122
157
|
|
|
158
|
+
/**
|
|
159
|
+
* RELEASE-DEVBUMP-ALWAYS (대표 10-14 07:0x): main still carries the previous line (<previous> or <previous>-dev.N)
|
|
160
|
+
* while that release is already published (tag v<previous> advertised) — its post-publish dev bump was
|
|
161
|
+
* stranded by an earlier failed run. Land the stranded dev bump (to <version>-dev.0) so this release cuts
|
|
162
|
+
* from its own -dev line. Returns false without touching anything when the carried version is not the
|
|
163
|
+
* immediately previous line or that line is not published yet.
|
|
164
|
+
*/
|
|
165
|
+
function strandedDevBumpHealed(repo: string, version: string, current: string, deps: BranchCutDeps): boolean {
|
|
166
|
+
const previous = previousPublishedLine(version, current);
|
|
167
|
+
if (previous === null) return false;
|
|
168
|
+
const tag = git(repo, 'ls-remote', '--tags', 'origin', `refs/tags/v${previous}`);
|
|
169
|
+
if (!tag.trim()) return false;
|
|
170
|
+
const devBump = `${baseVersion(version)}-dev.0`;
|
|
171
|
+
if (devBump !== nextDevVersion(previous) && latestPublishedStableBefore(repo, version) !== previous) return false;
|
|
172
|
+
landing(repo, 'dev-bump', previous, undefined, undefined, deps.forceFreeze === true, true, devBump);
|
|
173
|
+
debug.log('release-loop.version-dev-bump', 'self-healed', { version, mainVersion: current, devBump, published: previous });
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
|
|
123
177
|
/**
|
|
124
178
|
* RELEASE-BRANCH (대표 10-06 20:0x «0.2.18부터 브랜치 방식»): the release commit lives on `release/<v>`, never on main.
|
|
125
179
|
* An existing branch is reused as is (a resumed run, or a branch a repair appended to) — its tip is the release commit.
|
|
126
180
|
* Otherwise the branch is cut from origin/main and the version bump is committed on it; main keeps its -dev.N version
|
|
127
181
|
* until the post-publish dev bump.
|
|
128
182
|
*/
|
|
129
|
-
export function cutReleaseBranchForRun(repo: string, version: string, deps: BranchCutDeps = {}): Output {
|
|
183
|
+
export function cutReleaseBranchForRun(repo: string, version: string, deps: BranchCutDeps = {}, selfHealed = false): Output {
|
|
130
184
|
if (!isReleaseVersion(version)) throw new Error(`invalid release version: ${version}`);
|
|
131
185
|
// The run does not need a freeze, but one that is on is the emergency stop: neither a new nor a reused cut passes it.
|
|
132
186
|
const frozen = (deps.freeze ?? currentFreeze)();
|
|
@@ -160,7 +214,11 @@ export function cutReleaseBranchForRun(repo: string, version: string, deps: Bran
|
|
|
160
214
|
const current = versionAt(repo, base);
|
|
161
215
|
const stable = baseVersion(version);
|
|
162
216
|
const devOfStable = new RegExp(`^${stable.replaceAll('.', '\\.')}-dev\\.(0|[1-9][0-9]*)$`);
|
|
163
|
-
if (current !== version && !devOfStable.test(current))
|
|
217
|
+
if (current !== version && !devOfStable.test(current)) {
|
|
218
|
+
// RELEASE-DEVBUMP-ALWAYS: self-heal once — a stranded previous dev bump never strands this release's cut too.
|
|
219
|
+
if (!selfHealed && strandedDevBumpHealed(repo, version, current, deps)) return cutReleaseBranchForRun(repo, version, deps, true);
|
|
220
|
+
throw new Error(`origin/main version ${current} is not ${stable}-dev.N (release ${version})`);
|
|
221
|
+
}
|
|
164
222
|
const temp = mkdtempSync(join(tmpdir(), 'release-branch-cut-'));
|
|
165
223
|
const worktree = join(temp, 'tree');
|
|
166
224
|
let added = false;
|
|
@@ -189,14 +247,14 @@ export function cutReleaseBranchForRun(repo: string, version: string, deps: Bran
|
|
|
189
247
|
}
|
|
190
248
|
}
|
|
191
249
|
|
|
192
|
-
function landing(repo: string, kind: Kind, releaseVersion: string, cut?: string, cutCommit?: string, forceFreeze = false, branchCut = false): Output {
|
|
250
|
+
function landing(repo: string, kind: Kind, releaseVersion: string, cut?: string, cutCommit?: string, forceFreeze = false, branchCut = false, devTarget?: string): Output {
|
|
193
251
|
if (kind === 'release' && branchCut && cutCommit === undefined) return cutReleaseBranchForRun(repo, releaseVersion, { forceFreeze });
|
|
194
252
|
if (kind === 'dev-bump' && prereleaseKind(releaseVersion) !== null) {
|
|
195
253
|
// A prerelease (rehearsal) never moves main: the next stable release still owns this -dev line.
|
|
196
254
|
debug.log('release-loop.version-dev-bump', 'skipped', { version: releaseVersion, reason: 'prerelease' });
|
|
197
255
|
return { outcome: 'ok', kind, version: releaseVersion, commit: null, pr: null, skipped: 'prerelease' };
|
|
198
256
|
}
|
|
199
|
-
const target = kind === 'release' ? releaseVersion : nextDevVersion(releaseVersion);
|
|
257
|
+
const target = kind === 'release' ? releaseVersion : devTarget ?? nextDevVersion(releaseVersion);
|
|
200
258
|
// With the release on its branch, main still carries <v>-dev.N when the dev bump runs.
|
|
201
259
|
const source = kind === 'release' ? `${releaseVersion}-dev.N` : branchCut ? `${releaseVersion}-dev.N` : releaseVersion;
|
|
202
260
|
fetchMain(repo);
|
|
@@ -539,9 +539,12 @@ function hasModuleMockCall(source: string, file: string): boolean {
|
|
|
539
539
|
/** Parse every Bun-discovered test: text search misses valid calls with a
|
|
540
540
|
* comment between `mock` and `.module`. An extra solo file costs time, while a
|
|
541
541
|
* missed call can contaminate every later file in the Bun process. */
|
|
542
|
-
export function deriveMockModuleTestFiles(
|
|
542
|
+
export function deriveMockModuleTestFiles(
|
|
543
|
+
deps: { spawnSync?: typeof Bun.spawnSync; cwd?: string; files?: string[] } = {},
|
|
544
|
+
): string[] {
|
|
543
545
|
const cwd = deps.cwd ?? process.cwd();
|
|
544
|
-
|
|
546
|
+
// `files` narrows the parse to a caller-selected subset of discovered tests.
|
|
547
|
+
const files = deps.files ?? deriveTestFiles({ spawnSync: deps.spawnSync, cwd });
|
|
545
548
|
const mocks: string[] = [];
|
|
546
549
|
// A bounded program keeps the public syntax check below 600 MB on the
|
|
547
550
|
// current repository, rather than retaining all 5,836 ASTs at once.
|
|
@@ -723,12 +726,10 @@ function replaceBulkSelectors(argv: string[], replacement: (selector: string) =>
|
|
|
723
726
|
return result;
|
|
724
727
|
}
|
|
725
728
|
|
|
726
|
-
/**
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
const { selectors: pathArgs, soloArgs } = partitionBunTestArguments(argv);
|
|
731
|
-
const explicitPaths = pathArgs.length > 0;
|
|
729
|
+
/** How a positional selector picks discovered test files: a directory selects
|
|
730
|
+
* the files under it, an exact discovered path selects itself, and anything
|
|
731
|
+
* else is Bun's substring filter. */
|
|
732
|
+
function testSelectorMatcher(allTestFiles: string[], testCwd: string) {
|
|
732
733
|
const directory = (selector: string): string | undefined => {
|
|
733
734
|
const path = resolve(testCwd, selector);
|
|
734
735
|
try { return statSync(path).isDirectory() ? path : undefined; } catch { return undefined; }
|
|
@@ -746,6 +747,25 @@ export function planDeterministicTestCommands(
|
|
|
746
747
|
? resolve(testCwd, file) === resolve(testCwd, selector)
|
|
747
748
|
: file.includes(selector.replace(/^\.\//, ''));
|
|
748
749
|
};
|
|
750
|
+
return { directory, insideDirectory, isExact, matchesSelector };
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
/** Discovered test files that a path-selected run can reach. With explicit
|
|
754
|
+
* paths the planner only isolates mock files inside this set, so parsing the
|
|
755
|
+
* rest of the repository (≈20 s per gate shard under load) cannot change it. */
|
|
756
|
+
export function selectedTestFiles(argv: string[], allTestFiles: string[], testCwd: string): string[] {
|
|
757
|
+
const { selectors } = partitionBunTestArguments(argv);
|
|
758
|
+
const { matchesSelector } = testSelectorMatcher(allTestFiles, testCwd);
|
|
759
|
+
return allTestFiles.filter((file) => selectors.some((selector) => matchesSelector(file, selector)));
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
/** Return one bulk command and one command per selected global module mock. */
|
|
763
|
+
export function planDeterministicTestCommands(
|
|
764
|
+
argv: string[], cdpPatterns: string[], mockFiles: string[], allTestFiles: string[] = [], testCwd = process.cwd(),
|
|
765
|
+
): string[][] {
|
|
766
|
+
const { selectors: pathArgs, soloArgs } = partitionBunTestArguments(argv);
|
|
767
|
+
const explicitPaths = pathArgs.length > 0;
|
|
768
|
+
const { directory, insideDirectory, isExact, matchesSelector } = testSelectorMatcher(allTestFiles, testCwd);
|
|
749
769
|
const callerIgnoreGlobs = bunTestOptionValues(argv, '--path-ignore-patterns').map((pattern) => new Bun.Glob(pattern));
|
|
750
770
|
const selectedMocks = mockFiles.filter((file) => !cdpPatterns.includes(file)
|
|
751
771
|
&& !callerIgnoreGlobs.some((glob) => glob.match(file) || glob.match(resolve(testCwd, file)))
|
|
@@ -872,10 +892,19 @@ export async function runDeterministicTests(deps: DeterministicRunnerDeps = {}):
|
|
|
872
892
|
const testCwd = effectiveTestCwd(argv, cwd);
|
|
873
893
|
const cdpPatterns = explicitPaths ? [] : (deps.deriveCdpPatterns ?? (() => deriveCdpTestPatterns({ cwd: testCwd })))();
|
|
874
894
|
const explicitFiles = classifyExplicitTestFiles(argv, testCwd);
|
|
875
|
-
|
|
876
|
-
const
|
|
877
|
-
|
|
878
|
-
|
|
895
|
+
let discovered: string[] | undefined;
|
|
896
|
+
const discoverTestFiles = (): string[] => discovered ??=
|
|
897
|
+
[...new Set([...(deps.deriveTestFiles ?? (() => deriveTestFiles({ cwd: testCwd })))(), ...explicitFiles.files])];
|
|
898
|
+
// With explicit paths, parse only the files the selectors reach; files that
|
|
899
|
+
// classifyExplicitTestFiles already parsed are not parsed twice.
|
|
900
|
+
const scanMocks = (): string[] => {
|
|
901
|
+
if (!explicitPaths) return deriveMockModuleTestFiles({ cwd: testCwd });
|
|
902
|
+
const classified = new Set(explicitFiles.files);
|
|
903
|
+
const files = selectedTestFiles(argv, discoverTestFiles(), testCwd).filter((file) => !classified.has(file));
|
|
904
|
+
return files.length === 0 ? [] : deriveMockModuleTestFiles({ cwd: testCwd, files });
|
|
905
|
+
};
|
|
906
|
+
const mockFiles = [...new Set([...(deps.deriveMockModuleFiles ?? scanMocks)(), ...explicitFiles.mockFiles])];
|
|
907
|
+
const allTestFiles = (explicitPaths || fullBail) && mockFiles.length > 0 ? discoverTestFiles() : [];
|
|
879
908
|
let commands = planDeterministicTestCommands(argv, cdpPatterns, mockFiles, allTestFiles, testCwd);
|
|
880
909
|
const optionTokens = bunTestOptionTokens(argv);
|
|
881
910
|
// Bun writes these outputs to one caller-selected file. Separate children
|
package/scripts/usage-rollup.ts
CHANGED
|
@@ -10,10 +10,14 @@
|
|
|
10
10
|
import { spawnSync } from 'node:child_process';
|
|
11
11
|
|
|
12
12
|
export interface UsageRow { site: string; provider: string; model: string; calls: number; inputTokens: number; outputTokens: number; cacheReadInputTokens: number; cacheCreationInputTokens: number; cacheCreationUnmeasuredCalls: number; usdKnown: number; unknownCostCalls: number; includedCalls: number; apiEquivalentUsd: number;
|
|
13
|
+
/** Preserve only metadata observed on the source usage row. */
|
|
14
|
+
role?: string; stage?: string; account?: string;
|
|
13
15
|
/** OR-BYOK-COST — BYOK 호출 수 ⊕ 그중 상류 청구액 합(알려진 것만) ⊕ 상류를 모르는 호출 수. BYOK 를 본 행에만 있다(종전 행 바이트 불변). */
|
|
14
16
|
byokCalls?: number; byokUpstreamUsd?: number; byokUpstreamUnknownCalls?: number }
|
|
15
17
|
|
|
16
|
-
type UsageData = { site?: string; provider?: string; billingProvider?: string; model?: string; inputTokens?: number; outputTokens?: number; cacheReadInputTokens?: number; cacheCreationInputTokens?: number; cost?: { kind?: string; usd?: number }; podRollupKey?: string; partial?: boolean; partialSeq?: number; partialAt?: string };
|
|
18
|
+
type UsageData = { site?: string; provider?: string; billingProvider?: string; model?: string; role?: unknown; stage?: unknown; account?: unknown; inputTokens?: number; outputTokens?: number; cacheReadInputTokens?: number; cacheCreationInputTokens?: number; cost?: { kind?: string; usd?: number }; podRollupKey?: string; partial?: boolean; partialSeq?: number; partialAt?: string };
|
|
19
|
+
|
|
20
|
+
const observedTag = (value: unknown): string | undefined => typeof value === 'string' && value.trim() ? value : undefined;
|
|
17
21
|
|
|
18
22
|
/** 재방출 행 dedup 에 필요한 칸만 — 호스트 소비처(bench-report · `elanous usage`)도 같은 규칙을 쓴다. */
|
|
19
23
|
export type PodRollupKeyed = { podRollupKey?: unknown; partial?: unknown; partialSeq?: unknown; partialAt?: unknown };
|
|
@@ -68,8 +72,12 @@ export function rollup(lines: readonly string[]): { rows: UsageRow[]; truncated:
|
|
|
68
72
|
const entries = dedupePodRollupRows(parsed);
|
|
69
73
|
for (const d of entries) {
|
|
70
74
|
const provider = d.billingProvider ?? d.provider ?? '?'; // ⭐ 과금 주체 우선(B10)
|
|
71
|
-
const
|
|
72
|
-
|
|
75
|
+
const role = observedTag(d.role), stage = observedTag(d.stage), account = observedTag(d.account);
|
|
76
|
+
// A site/model bucket can contain different roles or accounts. Keeping those
|
|
77
|
+
// dimensions separate is required before the host can report who used a model.
|
|
78
|
+
const key = JSON.stringify([d.site ?? '?', provider, d.model ?? '?', role ?? null, stage ?? null, account ?? null]);
|
|
79
|
+
const row = by.get(key) ?? { site: d.site ?? '?', provider, model: d.model ?? '?', calls: 0, inputTokens: 0, outputTokens: 0, cacheReadInputTokens: 0, cacheCreationInputTokens: 0, cacheCreationUnmeasuredCalls: 0, usdKnown: 0, unknownCostCalls: 0, includedCalls: 0, apiEquivalentUsd: 0,
|
|
80
|
+
...(role !== undefined ? { role } : {}), ...(stage !== undefined ? { stage } : {}), ...(account !== undefined ? { account } : {}) };
|
|
73
81
|
row.calls++;
|
|
74
82
|
row.inputTokens += Number(d.inputTokens ?? 0);
|
|
75
83
|
row.outputTokens += Number(d.outputTokens ?? 0);
|