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
package/src/task-agent/cover.ts
CHANGED
|
@@ -8,7 +8,7 @@ export interface CoverRow {
|
|
|
8
8
|
byTaskAgent: number | null;
|
|
9
9
|
/** Total work by all seats; null when no independent denominator is available. */
|
|
10
10
|
total: number | null;
|
|
11
|
-
/** TASK-AGENT events observed for this verb
|
|
11
|
+
/** TASK-AGENT action events observed for this verb; null if unreadable. */
|
|
12
12
|
observedActions: number | null;
|
|
13
13
|
ratio: number | null;
|
|
14
14
|
state: 'measured' | 'no-denominator' | 'unreadable';
|
|
@@ -23,6 +23,8 @@ export interface CoverRow {
|
|
|
23
23
|
/** null means the source could not be read; [] means it was read and had no matching events. */
|
|
24
24
|
export interface TaskAgentCoverInput {
|
|
25
25
|
taskAgentActions: readonly { kind: NextActionKind; result: string; reason?: string; taskId?: string }[] | null;
|
|
26
|
+
/** Actual land executor outcomes; omitted or null means the source was not read. */
|
|
27
|
+
liveLandMoves?: readonly { card: string; executed: boolean; ok: boolean }[] | null;
|
|
26
28
|
allLands: readonly { step: string; ok: boolean }[] | null;
|
|
27
29
|
/** Card-ledger denominator for review·retry·green. undefined = not requested; null = ledger unreadable; [] = no cards. */
|
|
28
30
|
taskCards?: readonly { id: string }[] | null;
|
|
@@ -32,10 +34,26 @@ export interface TaskAgentCoverInput {
|
|
|
32
34
|
/** null means the pending-landing age source could not be read; [] means no pending landings. */
|
|
33
35
|
pendingLandingAgeSeconds?: readonly number[] | null;
|
|
34
36
|
/** A source reached the query safety limit; its aggregate is not known to be complete. */
|
|
35
|
-
truncated?: { taskAgentActions: boolean; allLands: boolean; goalAsks?: boolean; goalRuns?: boolean };
|
|
37
|
+
truncated?: { taskAgentActions: boolean; allLands: boolean; liveLandMoves?: boolean; goalAsks?: boolean; goalRuns?: boolean; implementCardRuns?: boolean; implementRunMerges?: boolean };
|
|
36
38
|
/** Completed authoring provenance and terminal goal records. undefined = not wired; null = unreadable. */
|
|
37
39
|
goalAsks?: readonly { authorRunId: string; goalId: string }[] | null;
|
|
38
40
|
goalRuns?: readonly { goalId: string; outcome: string; stage?: string }[] | null;
|
|
41
|
+
/** 구현 출처 — TA 카드의 런 결합. undefined = 이 동사의 출처 배선이 없다(no-source); null = 카드 원장을 못 읽었다; [] = 읽고 카드 없음. */
|
|
42
|
+
implementCardRuns?: readonly ImplementCardRunBinding[] | null;
|
|
43
|
+
/** 구현 출처 — 런 원장의 merged 사건. undefined = 배선 없음; null = 런 원장을 못 읽음. */
|
|
44
|
+
implementRunMerges?: ReadonlyMap<string, ImplementRunMergeEvent> | null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** 구현 동사의 카드 결합 — runId·runChildId 는 그 카드가 발사한 런이다. */
|
|
48
|
+
export interface ImplementCardRunBinding {
|
|
49
|
+
cardId: string;
|
|
50
|
+
runId?: string | null;
|
|
51
|
+
runChildId?: string | null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** 구현 동사의 원장 merged 사건 — merged=true 만 완료 구현으로 센다. */
|
|
55
|
+
export interface ImplementRunMergeEvent {
|
|
56
|
+
merged: boolean;
|
|
39
57
|
}
|
|
40
58
|
|
|
41
59
|
export type LandingFailureReason = 'load' | 'oom' | 'time-limit' | 'conflict' | 'review' | 'other';
|
|
@@ -52,6 +70,24 @@ export interface LandingThroughput {
|
|
|
52
70
|
|
|
53
71
|
const FAILURE_REASONS: readonly LandingFailureReason[] = ['load', 'oom', 'time-limit', 'conflict', 'review', 'other'];
|
|
54
72
|
|
|
73
|
+
function successfulLandCount(input: TaskAgentCoverInput): number | null {
|
|
74
|
+
if (input.taskAgentActions === null || input.truncated?.taskAgentActions
|
|
75
|
+
|| input.liveLandMoves == null || input.truncated?.liveLandMoves) return null;
|
|
76
|
+
const cards = new Set<string>();
|
|
77
|
+
for (const action of input.taskAgentActions) {
|
|
78
|
+
if (action.kind !== 'land' || action.result !== 'done') continue;
|
|
79
|
+
// Without a card identity an action may duplicate a live-move; its count is unknown.
|
|
80
|
+
if (!action.taskId) return null;
|
|
81
|
+
cards.add(action.taskId);
|
|
82
|
+
}
|
|
83
|
+
for (const move of input.liveLandMoves) {
|
|
84
|
+
if (!move.executed || !move.ok) continue;
|
|
85
|
+
if (!move.card) return null;
|
|
86
|
+
cards.add(move.card);
|
|
87
|
+
}
|
|
88
|
+
return cards.size;
|
|
89
|
+
}
|
|
90
|
+
|
|
55
91
|
function landingFailureReason(action: { kind: NextActionKind; reason?: string }): LandingFailureReason {
|
|
56
92
|
const reason = action.reason ?? '';
|
|
57
93
|
if (/\boom\b|out[- ]of[- ]memory|oomkilled|메모리.{0,12}(초과|부족|킬)/i.test(reason)) return 'oom';
|
|
@@ -65,9 +101,7 @@ function landingFailureReason(action: { kind: NextActionKind; reason?: string })
|
|
|
65
101
|
/** Daily funnel, failure-reason distribution, and oldest pending-landing age. */
|
|
66
102
|
export function measureLandingThroughput(input: TaskAgentCoverInput): LandingThroughput {
|
|
67
103
|
const actionsReadable = input.taskAgentActions !== null && input.truncated?.taskAgentActions !== true;
|
|
68
|
-
const taskAgentLandings = actionsReadable
|
|
69
|
-
? input.taskAgentActions!.filter((action) => action.kind === 'land' && action.result === 'done').length
|
|
70
|
-
: null;
|
|
104
|
+
const taskAgentLandings = actionsReadable ? successfulLandCount(input) : null;
|
|
71
105
|
const failureReasons = actionsReadable
|
|
72
106
|
? Object.fromEntries(FAILURE_REASONS.map((reason) => [reason, 0])) as Record<LandingFailureReason, number>
|
|
73
107
|
: null;
|
|
@@ -112,7 +146,8 @@ export function measureTaskAgentCover(input: TaskAgentCoverInput): CoverRow[] {
|
|
|
112
146
|
const rows = verbs.map((verb): CoverRow => {
|
|
113
147
|
const actions = input.taskAgentActions?.filter((action) => action.kind === verb);
|
|
114
148
|
const actionsUnreadable = actions === undefined || input.truncated?.taskAgentActions === true;
|
|
115
|
-
const byTaskAgent =
|
|
149
|
+
const byTaskAgent = verb === 'land' ? successfulLandCount(input)
|
|
150
|
+
: actionsUnreadable ? null : actions.filter((action) => action.result === 'done').length;
|
|
116
151
|
const observedActions = actionsUnreadable ? null : actions.length;
|
|
117
152
|
const liveActions = actionsUnreadable ? null : actions.filter((action) => action.result !== 'shadow').length;
|
|
118
153
|
const shadowActions = actionsUnreadable ? null : actions.filter((action) => action.result === 'shadow').length;
|
|
@@ -137,7 +172,7 @@ export function measureTaskAgentCover(input: TaskAgentCoverInput): CoverRow[] {
|
|
|
137
172
|
};
|
|
138
173
|
const total = input.allLands === null || input.truncated?.allLands
|
|
139
174
|
? null : input.allLands.filter((land) => land.step === 'merge' && land.ok === true).length;
|
|
140
|
-
const state =
|
|
175
|
+
const state = byTaskAgent === null || total === null ? 'unreadable'
|
|
141
176
|
: total === 0 ? 'no-denominator' : 'measured';
|
|
142
177
|
const ratio = state === 'measured' && byTaskAgent !== null && total !== null ? byTaskAgent / total : null;
|
|
143
178
|
return { verb, byTaskAgent, total, observedActions, ratio, state, ...counts,
|
|
@@ -167,20 +202,20 @@ export type SevenVerbName = '리뷰' | '착지' | '수리' | '검증' | '저작'
|
|
|
167
202
|
/** no-source 는 출처 배선이 없는 동사 · unreadable 은 해당 동사의 원천을 완전히 못 읽은 것이다. */
|
|
168
203
|
export type SevenVerbState = 'live' | 'shadow-only' | 'none' | 'no-source' | 'unreadable';
|
|
169
204
|
|
|
170
|
-
/** 7동사 출처 표의 한 칸 — source 는 그 동사를 관측하는
|
|
205
|
+
/** 7동사 출처 표의 한 칸 — source 는 그 동사를 관측하는 원천, null 이면 출처가 아직 없다. */
|
|
171
206
|
export interface SevenVerbSource {
|
|
172
207
|
verb: SevenVerbName;
|
|
173
|
-
source: Exclude<NextActionKind, 'decision' | 'deliver'> | 'goal-ask+goal-run' | null;
|
|
208
|
+
source: Exclude<NextActionKind, 'decision' | 'deliver'> | 'goal-ask+goal-run' | 'card-run+merged' | null;
|
|
174
209
|
}
|
|
175
210
|
|
|
176
|
-
/** TA-THEME-VERBS-LIVE — 저작은 완료 골 조인;
|
|
211
|
+
/** TA-THEME-VERBS-LIVE — 저작은 완료 골 조인; 구현은 카드 런 결합 ⊕ 원장 merged 조인; 정리는 아직 출처가 없다. */
|
|
177
212
|
export const SEVEN_VERB_SOURCES: readonly SevenVerbSource[] = [
|
|
178
213
|
{ verb: '리뷰', source: 'review' },
|
|
179
214
|
{ verb: '착지', source: 'land' },
|
|
180
215
|
{ verb: '수리', source: 'retry' },
|
|
181
216
|
{ verb: '검증', source: 'green' },
|
|
182
217
|
{ verb: '저작', source: 'goal-ask+goal-run' },
|
|
183
|
-
{ verb: '구현', source:
|
|
218
|
+
{ verb: '구현', source: 'card-run+merged' },
|
|
184
219
|
{ verb: '정리', source: null },
|
|
185
220
|
];
|
|
186
221
|
|
|
@@ -200,12 +235,37 @@ export interface SevenVerbLive {
|
|
|
200
235
|
measuredVerbs: number;
|
|
201
236
|
}
|
|
202
237
|
|
|
203
|
-
/** 행동 동사는 창 안의 done, 저작은 완료한 저작 원장과 착지 골의 조인. 각 출처의 null·절단은 해당 동사만 unreadable. */
|
|
238
|
+
/** 행동 동사는 창 안의 done, 저작은 완료한 저작 원장과 착지 골의 조인, 구현은 카드 런 결합과 원장 merged 사건의 조인. 각 출처의 null·절단은 해당 동사만 unreadable. */
|
|
204
239
|
export function measureSevenVerbLive(input: TaskAgentCoverInput): SevenVerbLive {
|
|
205
240
|
const unreadable = input.taskAgentActions === null || input.truncated?.taskAgentActions === true;
|
|
206
241
|
const verbs = SEVEN_VERB_SOURCES.map(({ verb, source }): SevenVerbLiveRow => {
|
|
242
|
+
if (source === 'card-run+merged') {
|
|
243
|
+
// ⛔ 배선이 없으면 출처가 «있는» 동사로 거짓 측정을 하지 않는다 — no-source 로 그대로 둔다.
|
|
244
|
+
if (input.implementCardRuns === undefined && input.implementRunMerges === undefined) {
|
|
245
|
+
return { verb, source: null, liveDone: null, shadow: null, state: 'no-source' };
|
|
246
|
+
}
|
|
247
|
+
if (input.implementCardRuns == null || input.implementRunMerges == null
|
|
248
|
+
|| input.truncated?.implementCardRuns === true || input.truncated?.implementRunMerges === true) {
|
|
249
|
+
return { verb, source, liveDone: null, shadow: null, state: 'unreadable' };
|
|
250
|
+
}
|
|
251
|
+
const merges = input.implementRunMerges;
|
|
252
|
+
const cards = new Set<string>();
|
|
253
|
+
for (const binding of input.implementCardRuns) {
|
|
254
|
+
// 카드 신원 없이는 중복 없는 분자를 낼 수 없다 — 그 원장은 못 읽은 것으로 한다.
|
|
255
|
+
if (!binding.cardId) return { verb, source, liveDone: null, shadow: null, state: 'unreadable' };
|
|
256
|
+
const bound = [binding.runId, binding.runChildId];
|
|
257
|
+
if (bound.some((runId) => typeof runId === 'string' && runId && merges.get(runId)?.merged === true)) {
|
|
258
|
+
cards.add(binding.cardId);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const liveDone = cards.size;
|
|
262
|
+
return { verb, source, liveDone, shadow: 0, state: liveDone >= 1 ? 'live' : 'none' };
|
|
263
|
+
}
|
|
207
264
|
if (source === null) return { verb, source: null, liveDone: null, shadow: null, state: 'no-source' };
|
|
208
|
-
if (source !== 'goal-ask+goal-run' && unreadable
|
|
265
|
+
if (source !== 'goal-ask+goal-run' && (unreadable || (source === 'land'
|
|
266
|
+
&& (input.liveLandMoves == null || input.truncated?.liveLandMoves)))) {
|
|
267
|
+
return { verb, source, liveDone: null, shadow: null, state: 'unreadable' };
|
|
268
|
+
}
|
|
209
269
|
if (source === 'goal-ask+goal-run') {
|
|
210
270
|
if (input.goalAsks == null || input.goalRuns == null || input.truncated?.goalAsks || input.truncated?.goalRuns) {
|
|
211
271
|
return { verb, source, liveDone: null, shadow: null, state: 'unreadable' };
|
|
@@ -216,14 +276,15 @@ export function measureSevenVerbLive(input: TaskAgentCoverInput): SevenVerbLive
|
|
|
216
276
|
return { verb, source, liveDone, shadow: 0, state: liveDone > 0 ? 'live' : 'none' };
|
|
217
277
|
}
|
|
218
278
|
const actions = input.taskAgentActions!.filter((action) => action.kind === source);
|
|
219
|
-
const liveDone = actions.filter((action) => action.result === 'done').length;
|
|
279
|
+
const liveDone = source === 'land' ? successfulLandCount(input) : actions.filter((action) => action.result === 'done').length;
|
|
280
|
+
if (liveDone === null) return { verb, source, liveDone: null, shadow: null, state: 'unreadable' };
|
|
220
281
|
const shadow = actions.filter((action) => action.result === 'shadow').length;
|
|
221
282
|
return { verb, source, liveDone, shadow, state: liveDone >= 1 ? 'live' : shadow >= 1 ? 'shadow-only' : 'none' };
|
|
222
283
|
});
|
|
223
284
|
return {
|
|
224
285
|
verbs,
|
|
225
286
|
liveVerbs: verbs.some((row) => row.state === 'unreadable' && row.source !== null) ? null : verbs.filter((row) => row.state === 'live').length,
|
|
226
|
-
measuredVerbs:
|
|
287
|
+
measuredVerbs: verbs.filter((row) => row.source !== null).length,
|
|
227
288
|
};
|
|
228
289
|
}
|
|
229
290
|
|
|
@@ -232,9 +293,15 @@ export function formatSevenVerbLive(measurement: SevenVerbLive): string {
|
|
|
232
293
|
const total = SEVEN_VERB_SOURCES.length;
|
|
233
294
|
if (measurement.liveVerbs === null) {
|
|
234
295
|
const actionUnreadable = measurement.verbs.some((row) => row.source === 'review' && row.state === 'unreadable');
|
|
296
|
+
const landUnreadable = measurement.verbs.some((row) => row.source === 'land' && row.state === 'unreadable');
|
|
235
297
|
const authorUnreadable = measurement.verbs.some((row) => row.source === 'goal-ask+goal-run' && row.state === 'unreadable');
|
|
236
|
-
const
|
|
237
|
-
|
|
298
|
+
const implementUnreadable = measurement.verbs.some((row) => row.source === 'card-run+merged' && row.state === 'unreadable');
|
|
299
|
+
const failures = [
|
|
300
|
+
actionUnreadable ? '행동' : landUnreadable ? '착지' : null,
|
|
301
|
+
authorUnreadable ? '저작·골' : null,
|
|
302
|
+
implementUnreadable ? '구현 카드·런' : null,
|
|
303
|
+
].filter((part): part is string => part !== null);
|
|
304
|
+
const reason = `${failures.join('·') || '저작·골'} 원장 null·절단`;
|
|
238
305
|
const noSource = measurement.verbs.filter((row) => row.state === 'no-source').map((row) => row.verb).join('·');
|
|
239
306
|
return `${total}동사 live -/${total} · 못 잼(${reason})${noSource ? ` · 출처 없음 ${noSource}` : ''}`;
|
|
240
307
|
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { defaultMsgStorePath, openMsgStore } from '../msg/msg-store.js';
|
|
2
|
+
import type { RunLedgerEntry } from '../self-implement/run-ledger.js';
|
|
3
|
+
import type { CardRunSnapshot, CardRunEvidence } from './card-evidence.js';
|
|
4
|
+
import { remoteParentAlive, type SshRunner } from './parent-host.js';
|
|
5
|
+
import type { TaskCard } from './task-hand.js';
|
|
6
|
+
|
|
7
|
+
const STOP_LINE = /\[supervisor\] 정지\((needs-human|no-progress)\)\s*[—-]\s*(.*)/u;
|
|
8
|
+
|
|
9
|
+
/** A remote parent's terminal stop is usable only after every referenced child ledger was read. */
|
|
10
|
+
export function remoteFailureReason(card: TaskCard, snapshot: CardRunSnapshot, evidence: CardRunEvidence, ssh?: SshRunner): string | undefined {
|
|
11
|
+
if (!card.parentHost || !card.runId || !snapshot.host || snapshot.readErrors?.length || card.pr || evidence.pr) return undefined;
|
|
12
|
+
const launchRows = snapshot.host.filter((row) => row.event === 'pod-child-run');
|
|
13
|
+
const childRefs = launchRows.map((row) => row.data?.childRunId);
|
|
14
|
+
// An unreadable or malformed child reference is unknown evidence, never "no children".
|
|
15
|
+
if (childRefs.some((id) => typeof id !== 'string' || !/^run-[A-Za-z0-9_-]{4,64}$/.test(id) || id === card.runId)) return undefined;
|
|
16
|
+
const children = childRefs as string[];
|
|
17
|
+
if (children.some((id) => !snapshot.children[id])) return undefined;
|
|
18
|
+
// The parent can stop while a child still runs. That child may publish a PR or salvage
|
|
19
|
+
// branch later, so every launched child must have a terminal last status first.
|
|
20
|
+
if (children.some((id) => {
|
|
21
|
+
const lastStatus = [...(snapshot.children[id] ?? [])].reverse().find((row) => row.event === 'run-status');
|
|
22
|
+
return !lastStatus || !['completed', 'failed', 'cancelled'].includes(String(lastStatus.data?.runStatus));
|
|
23
|
+
})) return undefined;
|
|
24
|
+
const rows: RunLedgerEntry[] = [...snapshot.host, ...children.flatMap((id) => snapshot.children[id] ?? [])];
|
|
25
|
+
if (rows.some((row) => row.event === 'pr-opened' || row.event === 'salvaged'
|
|
26
|
+
|| (typeof row.data.harvestBranch === 'string' && row.data.harvestBranch.trim())
|
|
27
|
+
|| (typeof row.data.salvageBranch === 'string' && row.data.salvageBranch.trim()))) return undefined;
|
|
28
|
+
const parentRows = snapshot.host.filter((row) => row.runId === card.runId);
|
|
29
|
+
const stopIndex = parentRows.map((row) => row.event).lastIndexOf('stop');
|
|
30
|
+
const stop = parentRows[stopIndex];
|
|
31
|
+
if (!stop) return undefined;
|
|
32
|
+
// A running status before stop is superseded by the supervisor's terminal stop.
|
|
33
|
+
// A fresh execution event after stop makes that stop stale for the current parent.
|
|
34
|
+
if (parentRows.slice(stopIndex + 1).some((row) => row.event === 'start' || row.event === 'pod-child-run'
|
|
35
|
+
|| (row.event === 'run-status' && !['completed', 'failed', 'cancelled'].includes(String(row.data?.runStatus))))) return undefined;
|
|
36
|
+
const tail = Array.isArray(stop?.data.tail) ? stop.data.tail : [];
|
|
37
|
+
const lines = tail.filter((line): line is string => typeof line === 'string');
|
|
38
|
+
// A parent or terminal child stop can carry a PR or salvage branch only in raw text.
|
|
39
|
+
// Any nonempty branch token is harvest evidence, regardless of its naming prefix.
|
|
40
|
+
const stopText = rows.filter((row) => row.event === 'stop')
|
|
41
|
+
.flatMap((row) => [row.data.cause, ...(Array.isArray(row.data.tail) ? row.data.tail : [])])
|
|
42
|
+
.filter((value): value is string => typeof value === 'string').join('\n');
|
|
43
|
+
if (/https:\/\/github\.com\/[^\s]+\/pull\/\d+|ELANOUS_POD_SALVAGE(?:\s*=\s*|\s+)\S+|수확할 브랜치:\s*\S+/.test(stopText)) return undefined;
|
|
44
|
+
const matched = [...lines].reverse().map((line) => STOP_LINE.exec(line.replace(/\x1b\[[0-9;]*m/g, ''))).find((match) => match !== null);
|
|
45
|
+
if (!matched || remoteParentAlive({ ...card.parentHost, runId: card.runId }, ssh) !== 'dead') return undefined;
|
|
46
|
+
const raw = matched[2]?.replace(/[\r\n]+/g, ' ').trim();
|
|
47
|
+
if (!raw) return undefined;
|
|
48
|
+
return `${matched[1]} — ${raw}`;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** SQLite provenance makes repeated refreshes insert precisely one message for this card/run/seat. */
|
|
52
|
+
export function notifyRemoteFailure(card: TaskCard, reason: string, messageStorePath = defaultMsgStorePath()): void {
|
|
53
|
+
if (!card.seat || !card.runId || !card.parentHost) return;
|
|
54
|
+
const log = card.parentHost.log ?? `${card.parentHost.configDir ?? '$HOME/.elanous'}/remote-parents/${card.runId}.log`;
|
|
55
|
+
const store = openMsgStore(messageStorePath);
|
|
56
|
+
try {
|
|
57
|
+
store.appendWithProvenance({ from: 'TC', to: card.seat, kind: 'incident',
|
|
58
|
+
body: `TA 카드 ${card.id} · 원격 부모 ${card.parentHost.host} 종결 · 사유: ${reason}\n원격 로그: ${log}` },
|
|
59
|
+
`ta-failure:${card.id}-${card.runId}:${card.seat}`);
|
|
60
|
+
} finally { store.close(); }
|
|
61
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GREEN-FROM-LEDGER, first slice: decide from a bound card or an explicit
|
|
3
|
+
* checklist evidence line. This module never writes a checklist or card.
|
|
4
|
+
*/
|
|
5
|
+
import type { ChecklistItem } from '../release-loop/checklist.js';
|
|
6
|
+
import { debug } from '../debug/log.js';
|
|
7
|
+
import { cardPrNumber, type TaskCard } from './task-hand.js';
|
|
8
|
+
|
|
9
|
+
export type GreenSweepVerdict = 'green' | 'record-only' | 'skip';
|
|
10
|
+
export interface GreenSweepCandidate {
|
|
11
|
+
cell: string;
|
|
12
|
+
pr: number;
|
|
13
|
+
source: 'card' | 'evidence';
|
|
14
|
+
card?: TaskCard;
|
|
15
|
+
ambiguousAcrossCards?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface GreenSweepPr {
|
|
18
|
+
number: number;
|
|
19
|
+
state: string;
|
|
20
|
+
mergeSha?: string;
|
|
21
|
+
url?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface GreenSweepDecision {
|
|
24
|
+
cell: string;
|
|
25
|
+
pr: number;
|
|
26
|
+
mergeSha: string | null;
|
|
27
|
+
source: GreenSweepCandidate['source'];
|
|
28
|
+
verdict: GreenSweepVerdict;
|
|
29
|
+
reason: string;
|
|
30
|
+
evidence: string;
|
|
31
|
+
existingEvidence: string;
|
|
32
|
+
/** Preview only; a later live operation may persist this complete value. */
|
|
33
|
+
plannedEvidence: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** PR-body mentions are intentionally absent from this parser. */
|
|
37
|
+
export function explicitEvidencePrs(evidence: string | undefined): number[] {
|
|
38
|
+
const numbers = new Set<number>();
|
|
39
|
+
for (const line of (evidence ?? '').split(/\r?\n/)) {
|
|
40
|
+
// A previous refusal is diagnostic text, never new landing evidence.
|
|
41
|
+
if (/^GREEN-FROM-LEDGER:/i.test(line) && !/· green ·/.test(line)) continue;
|
|
42
|
+
// A negated landing claim cannot establish this cell's PR ownership.
|
|
43
|
+
if (/미착지|미병합|예정|계획|아님|않음|안\s*함|보류|대기|실패|불가|아직|미완료|누락|못\s*함|(?:착지|병합)\s*전|\b(?:not\s+(?:yet\s+)?(?:merged|landed)|unmerged|pending|planned)\b/i.test(line)) continue;
|
|
44
|
+
// A PR number only counts when this cell's own evidence calls it landed.
|
|
45
|
+
for (const match of line.matchAll(/(?:착지|병합|merged|landed)\s*(?:PR\s*)?#(\d+)\b|(?:PR\s*)?#(\d+)\s*(?:착지|병합|merged|landed)(?=$|[^A-Za-z가-힣])/gi)) {
|
|
46
|
+
const number = Number(match[1] ?? match[2]);
|
|
47
|
+
if (Number.isSafeInteger(number) && number > 0) numbers.add(number);
|
|
48
|
+
}
|
|
49
|
+
for (const match of line.matchAll(/https?:\/\/github\.com\/[^/\s]+\/[^/\s]+\/pull\/(\d+)\b\s*(?:착지|병합|merged|landed)|(?:착지|병합|merged|landed)\s*https?:\/\/github\.com\/[^/\s]+\/[^/\s]+\/pull\/(\d+)\b/gi)) {
|
|
50
|
+
const number = Number(match[1] ?? match[2]);
|
|
51
|
+
if (Number.isSafeInteger(number) && number > 0) numbers.add(number);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return [...numbers];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function greenSweepCandidates(item: ChecklistItem, version: string, cards: readonly TaskCard[]): GreenSweepCandidate[] {
|
|
58
|
+
if (item.status !== 'yellow' && item.status !== 'red') return [];
|
|
59
|
+
const candidates = new Map<number, GreenSweepCandidate>();
|
|
60
|
+
for (const number of explicitEvidencePrs(item.evidence)) candidates.set(number, { cell: item.id, pr: number, source: 'evidence' });
|
|
61
|
+
for (const card of cards) {
|
|
62
|
+
if (card.checklistId !== item.id || (card.checklistVersion && card.checklistVersion !== version)
|
|
63
|
+
|| (card.completion ?? 'code-pr') !== 'code-pr') continue;
|
|
64
|
+
const pr = cardPrNumber(card);
|
|
65
|
+
if (!pr) continue;
|
|
66
|
+
// Multiple cards claiming one PR are ambiguous, even if one has a complete marker.
|
|
67
|
+
if (candidates.get(pr)?.source === 'card') candidates.set(pr, { cell: item.id, pr, source: 'card' });
|
|
68
|
+
else candidates.set(pr, { cell: item.id, pr, source: 'card', card });
|
|
69
|
+
}
|
|
70
|
+
return [...candidates.values()].map((candidate) => ({ ...candidate,
|
|
71
|
+
ambiguousAcrossCards: cards.filter((card) => cardPrNumber(card) === candidate.pr).length > 1,
|
|
72
|
+
})).sort((a, b) => a.pr - b.pr);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function ambiguousGreenSweepPrs(items: readonly ChecklistItem[], version: string, cards: readonly TaskCard[]): Set<number> {
|
|
76
|
+
const claims = new Map<number, Set<string>>();
|
|
77
|
+
for (const item of items) {
|
|
78
|
+
const numbers = new Set(explicitEvidencePrs(item.evidence));
|
|
79
|
+
for (const card of cards) {
|
|
80
|
+
if (card.checklistId === item.id && (!card.checklistVersion || card.checklistVersion === version)
|
|
81
|
+
&& (card.completion ?? 'code-pr') === 'code-pr') {
|
|
82
|
+
const pr = cardPrNumber(card);
|
|
83
|
+
if (pr) numbers.add(pr);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
for (const pr of numbers) {
|
|
87
|
+
const cells = claims.get(pr) ?? new Set<string>();
|
|
88
|
+
cells.add(item.id);
|
|
89
|
+
claims.set(pr, cells);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return new Set([...claims].filter(([, cells]) => cells.size > 1).map(([pr]) => pr));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function appendGreenSweepEvidence(existing: string | undefined, line: string): string {
|
|
96
|
+
const before = existing ?? '';
|
|
97
|
+
if (before.split(/\r?\n/).includes(line)) return before;
|
|
98
|
+
return `${before}${before && !before.endsWith('\n') ? '\n' : ''}${line}`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** A merge establishes ownership of a PR, not completion of a whole cell. */
|
|
102
|
+
export function decideGreenSweep(input: {
|
|
103
|
+
item: ChecklistItem;
|
|
104
|
+
candidate: GreenSweepCandidate;
|
|
105
|
+
candidateCount: number;
|
|
106
|
+
pr: GreenSweepPr | null;
|
|
107
|
+
ancestor: boolean | null;
|
|
108
|
+
hold: boolean | null;
|
|
109
|
+
repositoryMatches?: boolean | null;
|
|
110
|
+
ambiguousAcrossCells?: boolean;
|
|
111
|
+
}): GreenSweepDecision {
|
|
112
|
+
const { item, candidate, pr } = input;
|
|
113
|
+
const mergeSha = pr?.mergeSha && /^[a-f0-9]{40}$/i.test(pr.mergeSha) ? pr.mergeSha : null;
|
|
114
|
+
const result = (verdict: GreenSweepVerdict, reason: string): GreenSweepDecision => {
|
|
115
|
+
const evidence = `GREEN-FROM-LEDGER: PR #${candidate.pr}${mergeSha ? ` merged ${mergeSha}` : ''} · ${verdict} · ${reason}`;
|
|
116
|
+
return { cell: item.id, pr: candidate.pr, mergeSha, source: candidate.source, verdict, reason,
|
|
117
|
+
evidence, existingEvidence: item.evidence ?? '', plannedEvidence: appendGreenSweepEvidence(item.evidence, evidence) };
|
|
118
|
+
};
|
|
119
|
+
if (item.status !== 'yellow' && item.status !== 'red') return result('skip', 'cell-not-yellow');
|
|
120
|
+
if (item.status === 'red') return result('skip', 'red-cell-requires-owner');
|
|
121
|
+
if (!pr || pr.number !== candidate.pr) return result('skip', 'pr-unreadable');
|
|
122
|
+
if (input.repositoryMatches === false) return result('skip', 'repository-mismatch');
|
|
123
|
+
if (input.repositoryMatches !== true) return result('record-only', 'repository-unreadable');
|
|
124
|
+
if (pr.state !== 'MERGED') return result('skip', `pr-${pr.state.toLowerCase()}`);
|
|
125
|
+
if (!mergeSha) return result('skip', 'merge-sha-unreadable');
|
|
126
|
+
if (input.ancestor === null) return result('record-only', 'origin-main-ref-unverified');
|
|
127
|
+
if (!input.ancestor) return result('skip', 'merge-sha-not-on-origin-main');
|
|
128
|
+
const explicitUrls = [...(item.evidence ?? '').matchAll(/https?:\/\/github\.com\/[^/\s]+\/[^/\s]+\/pull\/\d+\b/gi)]
|
|
129
|
+
.map((match) => match[0]);
|
|
130
|
+
if (explicitUrls.some((url) => /\/pull\/(\d+)\b/.exec(url)?.[1] === String(candidate.pr)
|
|
131
|
+
&& url.replace(/\/+$/, '').toLowerCase() !== (pr.url ?? '').replace(/\/+$/, '').toLowerCase()))
|
|
132
|
+
return result('skip', 'evidence-pr-url-mismatch');
|
|
133
|
+
if (/보류|중단|정지|\bhold\b/i.test(`${item.title}\n${item.evidence ?? ''}`))
|
|
134
|
+
return result('skip', 'cell-stop-evidence');
|
|
135
|
+
if (input.hold === null) return result('record-only', 'hold-state-unreadable');
|
|
136
|
+
if (input.hold) return result('skip', 'traffic-hold');
|
|
137
|
+
if (input.candidateCount !== 1) return result('record-only', 'multiple-piece-prs');
|
|
138
|
+
if (input.ambiguousAcrossCells) return result('record-only', 'ambiguous-pr-across-cells');
|
|
139
|
+
if (candidate.ambiguousAcrossCards) return result('record-only', 'ambiguous-pr-across-cards');
|
|
140
|
+
if (/남은|나머지|후속|조각|분할|미착지|미병합|예정|계획|(?:착지|병합)\s*(?:실패|불가|아직|미완료|누락|못\s*함)|PR\s*#\d+\s*누락|추가\s*(?:작업|실물|검증|배선|조각|PR|필요)|(?:착지|실물|판정|검증|승인|운영)\s*대기|대기\s*(?:중|필요)|[1-9]차|(?:작업|검증|확인|운영|수리|배선)\s*필요|(?:일부|부분)(?:\s*범위(?:만)?)?\s*완료|잔여|미충족|미달|미완료|대체\s*후보/i.test(`${item.title}\n${item.evidence ?? ''}`))
|
|
141
|
+
return result('record-only', 'remaining-or-multiple-piece-evidence');
|
|
142
|
+
const verdictLines = [...(item.evidence ?? '').matchAll(/(?:^|\n)\s*(?:판정|결론|상태)\s*:\s*([^\n]+)/gi)];
|
|
143
|
+
if (verdictLines.some((match) => !/^(?:green|완료|충족)(?:$|[\s·,.;])/i.test(match[1] ?? '')))
|
|
144
|
+
return result('record-only', 'conflicting-cell-verdict-evidence');
|
|
145
|
+
if (candidate.source === 'evidence') {
|
|
146
|
+
const fullCellProof = /(?:^|\n)\s*(?:판정|결론|상태)\s*:\s*(?:green|완료|충족)(?:$|[\s·,.;])/i;
|
|
147
|
+
return fullCellProof.test(item.evidence ?? '')
|
|
148
|
+
? result('green', 'explicit-cell-completion-evidence')
|
|
149
|
+
: result('record-only', 'cell-completion-not-explicit');
|
|
150
|
+
}
|
|
151
|
+
const card = candidate.card;
|
|
152
|
+
if (!card) return result('record-only', 'ambiguous-card-binding');
|
|
153
|
+
if (!card.checklistVersion) return result('record-only', 'card-version-unbound');
|
|
154
|
+
if (card.status !== 'done') return result('record-only', 'card-not-done');
|
|
155
|
+
if (card.postLand && (card.postLand.outcome !== 'complete' || card.postLand.remaining.length > 0))
|
|
156
|
+
return result('record-only', 'card-post-land-incomplete');
|
|
157
|
+
if (card.history.some((event) => event.event === 'closed-by-hand'))
|
|
158
|
+
return result('record-only', 'card-stop-evidence');
|
|
159
|
+
if (typeof card.pr === 'object' && pr.url && card.pr.url
|
|
160
|
+
&& card.pr.url.replace(/\/+$/, '') !== pr.url.replace(/\/+$/, ''))
|
|
161
|
+
return result('record-only', 'card-pr-url-mismatch');
|
|
162
|
+
if (card.prTerminal?.state === 'CLOSED') return result('record-only', 'card-terminal-conflict');
|
|
163
|
+
return result('green', card.postLand?.outcome === 'complete' ? 'bound-card-complete' : 'bound-card-merged');
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** Every candidate emits one structured decision, including refusals. */
|
|
167
|
+
export function observeGreenSweep(decision: GreenSweepDecision, log: typeof debug.log = debug.log.bind(debug)): void {
|
|
168
|
+
log('task-agent.green-sweep', decision.verdict,
|
|
169
|
+
{ cell: decision.cell, pr: decision.pr, mergeSha: decision.mergeSha, reason: decision.reason });
|
|
170
|
+
}
|
|
@@ -24,7 +24,7 @@ const defaultGit: GitRun = (cwd, args) => {
|
|
|
24
24
|
|
|
25
25
|
export interface LandWorktreeInput { card: string; pr: number; head: string; branch: string | undefined; repoCwd: string; statePath: string }
|
|
26
26
|
export type LandWorktreeRemoval = { removed: boolean; reason?: string; /** 이 호출이 만든 가지를 지웠나 — 만든 가지가 없으면 null. */ branchRemoved?: boolean | null };
|
|
27
|
-
export interface LandWorktree { cwd: string; cleanup: () => LandWorktreeRemoval }
|
|
27
|
+
export interface LandWorktree { cwd: string; cleanup: () => LandWorktreeRemoval; /** false means an existing owner's tree is borrowed, never removed. */ created?: boolean }
|
|
28
28
|
|
|
29
29
|
export interface LandWorktreeDeps {
|
|
30
30
|
git?: GitRun;
|
|
@@ -46,6 +46,14 @@ export function localHead(cwd: string, git: GitRun = defaultGit): string | null
|
|
|
46
46
|
} catch { return null; }
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
/** cwd 의 현재 가지 — detached·조회 실패는 null. */
|
|
50
|
+
export function localBranch(cwd: string, git: GitRun = defaultGit): string | null {
|
|
51
|
+
try {
|
|
52
|
+
const r = git(cwd, ['branch', '--show-current']);
|
|
53
|
+
return r.status === 0 && r.stdout.trim() ? r.stdout.trim() : null;
|
|
54
|
+
} catch { return null; }
|
|
55
|
+
}
|
|
56
|
+
|
|
49
57
|
async function defaultProvideDeps(worktree: string, sourceRoot: string): Promise<void> {
|
|
50
58
|
const { spawnSync } = await import('node:child_process');
|
|
51
59
|
const { provideCheckoutDependencies } = await import('../self-implement/host-regate.js');
|
|
@@ -71,6 +79,24 @@ function registered(git: GitRun, repoCwd: string, path: string): boolean | null
|
|
|
71
79
|
return list.stdout.split('\n').some((line) => line.startsWith('worktree ') && real(line.slice('worktree '.length).trim()) === want);
|
|
72
80
|
}
|
|
73
81
|
|
|
82
|
+
/** A registered checkout of the exact PR branch. An unreadable/malformed registry is never treated as vacant. */
|
|
83
|
+
function branchOwner(git: GitRun, repoCwd: string, branch: string): { path: string | null; reason?: string } {
|
|
84
|
+
let list: ReturnType<GitRun>;
|
|
85
|
+
try { list = git(repoCwd, ['worktree', 'list', '--porcelain']); }
|
|
86
|
+
catch { return { path: null, reason: 'git worktree registry unreadable (owner unknown)' }; }
|
|
87
|
+
if (list.status !== 0 || !list.stdout.trim()) return { path: null, reason: 'git worktree registry unreadable (owner unknown)' };
|
|
88
|
+
const entries = list.stdout.trim().split(/\n\s*\n/);
|
|
89
|
+
const owners: string[] = [];
|
|
90
|
+
for (const entry of entries) {
|
|
91
|
+
const lines = entry.split('\n');
|
|
92
|
+
const pathLine = lines.find(line => line.startsWith('worktree '));
|
|
93
|
+
if (!pathLine?.slice(9).trim()) return { path: null, reason: 'git worktree registry malformed (owner unknown)' };
|
|
94
|
+
if (lines.some(line => line === `branch refs/heads/${branch}`)) owners.push(pathLine.slice(9).trim());
|
|
95
|
+
}
|
|
96
|
+
if (owners.length > 1) return { path: null, reason: `PR branch ${branch} has multiple registered owners (owner unknown)` };
|
|
97
|
+
return { path: owners[0] ?? null };
|
|
98
|
+
}
|
|
99
|
+
|
|
74
100
|
/** 이 저장소의 git 공통 디렉터리(실경로) — 못 읽으면 null. */
|
|
75
101
|
function commonDir(git: GitRun, repoCwd: string): string | null {
|
|
76
102
|
const r = git(repoCwd, ['rev-parse', '--path-format=absolute', '--git-common-dir']);
|
|
@@ -110,7 +136,7 @@ function removeWorktree(git: GitRun, repoCwd: string, path: string): { removed:
|
|
|
110
136
|
}
|
|
111
137
|
|
|
112
138
|
/** `created` — 트리를 만들었었나(모르면 null) · `removed` — 만들었다면 걷었나(만든 적 없거나 모르면 null). */
|
|
113
|
-
export type LandWorktreeFailure = { reason: string; created: boolean | null; removed: boolean | null };
|
|
139
|
+
export type LandWorktreeFailure = { reason: string; created: boolean | null; removed: boolean | null; kind?: 'worktree-conflict'; ownerPath?: string };
|
|
114
140
|
|
|
115
141
|
/** PR 머리 트리를 만든다 — 못 만들면 이유 ⊕ 만들었다 걷었는지(관측용). 던지지 않는다. */
|
|
116
142
|
export async function createLandWorktree(input: LandWorktreeInput, deps: LandWorktreeDeps = {}): Promise<LandWorktree | LandWorktreeFailure> {
|
|
@@ -119,10 +145,15 @@ export async function createLandWorktree(input: LandWorktreeInput, deps: LandWor
|
|
|
119
145
|
const head = input.head.toLowerCase();
|
|
120
146
|
const branch = input.branch;
|
|
121
147
|
const fail = (reason: string, created: boolean | null = false, removed: boolean | null = null): LandWorktreeFailure => ({ reason, created, removed });
|
|
148
|
+
const conflict = (reason: string, ownerPath?: string): LandWorktreeFailure => ({ reason: `worktree-conflict: ${reason}`, created: false, removed: null, kind: 'worktree-conflict', ...(ownerPath ? { ownerPath } : {}) });
|
|
122
149
|
if (!branch) return fail('PR head branch name unknown');
|
|
123
150
|
if (!/^[0-9a-f]{40}$/.test(head)) return fail('PR head is not a full sha');
|
|
124
151
|
// 지난 시도가 남긴 같은 자리는 먼저 걷는다(같은 PR·머리 · 재사용하지 않는다 — 상태를 모르는 트리에서 착지하지 않게).
|
|
125
|
-
|
|
152
|
+
let atLandPath: boolean | null;
|
|
153
|
+
try { atLandPath = registered(git, input.repoCwd, path); }
|
|
154
|
+
catch { atLandPath = null; }
|
|
155
|
+
if (atLandPath === null) return conflict('git worktree list unreadable (owner unknown)');
|
|
156
|
+
if (existsSync(path) || atLandPath) {
|
|
126
157
|
const stale = removeWorktree(git, input.repoCwd, path);
|
|
127
158
|
if (!stale.removed) return fail(`stale land worktree could not be removed: ${stale.reason}`);
|
|
128
159
|
}
|
|
@@ -135,9 +166,25 @@ export async function createLandWorktree(input: LandWorktreeInput, deps: LandWor
|
|
|
135
166
|
return r.status === 0 ? r.stdout.trim().toLowerCase() : null;
|
|
136
167
|
};
|
|
137
168
|
const existingHead = branchHead();
|
|
138
|
-
if (existingHead && existingHead !== head) return fail(`local branch ${branch} exists at ${existingHead.slice(0, 12)} (not the PR head) — not overwriting it`);
|
|
139
169
|
const mine = commonDir(git, input.repoCwd);
|
|
140
170
|
if (!mine) return fail('git common directory unreadable');
|
|
171
|
+
const owner = branchOwner(git, input.repoCwd, branch);
|
|
172
|
+
if (owner.reason) return conflict(owner.reason);
|
|
173
|
+
if (owner.path) {
|
|
174
|
+
const path = owner.path;
|
|
175
|
+
// The registry is only a lead: validate the checkout itself immediately before handing it to pr land.
|
|
176
|
+
try {
|
|
177
|
+
if (commonDir(git, path) !== mine) return conflict(`owner ${path} repository identity unreadable or different`, path);
|
|
178
|
+
const current = git(path, ['branch', '--show-current']);
|
|
179
|
+
if (current.status !== 0 || current.stdout.trim() !== branch) return conflict(`owner ${path} branch is ${current.stdout.trim() || 'unknown'} (expected ${branch})`, path);
|
|
180
|
+
const actualHead = localHead(path, git);
|
|
181
|
+
if (actualHead?.toLowerCase() !== head) return conflict(`owner ${path} HEAD ${actualHead?.slice(0, 12) ?? 'unknown'} ≠ reviewed ${head.slice(0, 12)}`, path);
|
|
182
|
+
const status = git(path, ['status', '--porcelain']);
|
|
183
|
+
if (status.status !== 0 || status.stdout.trim()) return conflict(`owner ${path} is ${status.status !== 0 ? 'status unreadable' : `dirty: ${status.stdout.trim().split('\n').slice(0, 3).join(' · ').slice(0, 160)}`}`, path);
|
|
184
|
+
} catch { return conflict(`owner ${path} verification failed`, path); }
|
|
185
|
+
return { cwd: path, created: false, cleanup: () => ({ removed: false, reason: `borrowed owner ${path} — left untouched` }) };
|
|
186
|
+
}
|
|
187
|
+
if (existingHead && existingHead !== head) return fail(`local branch ${branch} exists at ${existingHead.slice(0, 12)} (not the PR head) — not overwriting it`);
|
|
141
188
|
try {
|
|
142
189
|
mkdirSync(dirname(path), { recursive: true });
|
|
143
190
|
// 표지를 먼저 — 등록 전에 죽어도 다음 시도가 «우리 잔여»임을 확인하고 걷을 수 있게.
|
|
@@ -192,7 +239,7 @@ export async function createLandWorktree(input: LandWorktreeInput, deps: LandWor
|
|
|
192
239
|
} catch (error) {
|
|
193
240
|
return abort(`land worktree check threw: ${(error instanceof Error ? error.message : String(error)).slice(-200)}`);
|
|
194
241
|
}
|
|
195
|
-
return { cwd: path, cleanup };
|
|
242
|
+
return { cwd: path, cleanup, created: true };
|
|
196
243
|
}
|
|
197
244
|
|
|
198
245
|
export function observeLandWorktree(data: { card: string; pr: number; head: string; created: boolean | null; removed: boolean | null; branchRemoved?: boolean | null; reason: string },
|
|
@@ -50,6 +50,7 @@ export function liveMoveEffect(input: Pick<LiveMoveHistoryInput, 'executorResult
|
|
|
50
50
|
const result = input.result;
|
|
51
51
|
if (!result) return LIVE_MOVE_EFFECT_UNKNOWN;
|
|
52
52
|
if (!result.executed) return 'none — not executed';
|
|
53
|
+
if (result.kind === 'decision-card') return result.ok ? 'decision card raised' : 'raise failed';
|
|
53
54
|
if (result.kind === 'review' && result.ok) return result.resultPath ? LIVE_REVIEW_EFFECT_PENDING : LIVE_REVIEW_EFFECT_REQUESTED;
|
|
54
55
|
if (result.kind === 'land' && result.ok) return 'land reported ok by the executor (merge state not re-checked here) · merge sha not reported';
|
|
55
56
|
if (result.kind === 'propose-green' && result.ok) return `green proposed · checklist ${checklistId ?? '-'} (checklist untouched)`;
|