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/hq/seats.ts
CHANGED
|
@@ -278,6 +278,18 @@ export function hqInit(options: { root?: string; home?: string } = {}): { root:
|
|
|
278
278
|
return { root, created, cron };
|
|
279
279
|
}
|
|
280
280
|
|
|
281
|
+
// A skipped refresh leaves the seat looking idle to every other surface: one observation line carries the
|
|
282
|
+
// reason and how far the kept HEAD trails the fetched origin/main. Observation never changes the verdict
|
|
283
|
+
// (same rule as judgeLandedTip).
|
|
284
|
+
function observeRefreshSkipped(path: string, role: HqSeatRole, reason: 'dirty' | 'unlanded-head', head?: string): void {
|
|
285
|
+
try {
|
|
286
|
+
const tip = head ?? git(path, 'rev-parse', 'HEAD');
|
|
287
|
+
const behind = runGitCommand(path, ['rev-list', '--count', 'HEAD..refs/remotes/origin/main'], { encoding: 'utf8' });
|
|
288
|
+
const count = behind.status === 0 && /^\d+$/.test(behind.stdout.trim()) ? Number(behind.stdout.trim()) : null;
|
|
289
|
+
debug.log('hq.seat', 'refresh-skipped', { role, path, reason, head: tip, behind: count });
|
|
290
|
+
} catch { /* observation must not change the verdict */ }
|
|
291
|
+
}
|
|
292
|
+
|
|
281
293
|
export function hqSeat(value: string, options: { root?: string; refresh?: boolean } = {}): { path: string; outcome: 'created' | 'unchanged' | 'refreshed' | 'dirty' } {
|
|
282
294
|
const role = roleOf(value);
|
|
283
295
|
const root = resolve(options.root ?? hqRoot());
|
|
@@ -301,16 +313,18 @@ export function hqSeat(value: string, options: { root?: string; refresh?: boolea
|
|
|
301
313
|
const onBranch = runGitCommand(path, ['symbolic-ref', '--quiet', '--short', 'HEAD'], { encoding: 'utf8' });
|
|
302
314
|
if (onBranch.status === 0) throw new Error(`not a seat: ${path} is on branch ${onBranch.stdout.trim()}; refusing to touch it`);
|
|
303
315
|
// A dirty seat must be byte-for-byte untouched, including its detached HEAD.
|
|
304
|
-
|
|
316
|
+
// The cron line fetches the mirror before refreshing, so `behind` counts against the fetched origin/main.
|
|
317
|
+
if (options.refresh && !clean(path)) { observeRefreshSkipped(path, role, 'dirty'); return { path, outcome: 'dirty' }; }
|
|
305
318
|
if (!options.refresh) return { path, outcome: 'unchanged' };
|
|
306
319
|
git(repo, 'fetch', 'origin');
|
|
307
320
|
// Concurrent refreshes of one seat (cron and a person) serialize on the house lock; each re-checks first.
|
|
308
321
|
return withLedgerLock(root, () => {
|
|
309
322
|
assertRegisteredWorktree(repo, path);
|
|
310
323
|
if (runGitCommand(path, ['symbolic-ref', '--quiet', 'HEAD'], { encoding: 'utf8' }).status === 0) throw new Error(`not a seat: ${path} is on a branch; refusing to touch it`);
|
|
311
|
-
if (!clean(path)) return { path, outcome: 'dirty' as const };
|
|
324
|
+
if (!clean(path)) { observeRefreshSkipped(path, role, 'dirty'); return { path, outcome: 'dirty' as const }; }
|
|
312
325
|
// Commits made on the detached seat are not on origin/main; moving HEAD would orphan them. Treat as dirty.
|
|
313
|
-
|
|
326
|
+
const head = git(path, 'rev-parse', 'HEAD');
|
|
327
|
+
if (!mergedIntoMain(repo, head)) { observeRefreshSkipped(path, role, 'unlanded-head', head); return { path, outcome: 'dirty' as const }; }
|
|
314
328
|
git(path, 'checkout', '--detach', 'refs/remotes/origin/main');
|
|
315
329
|
return { path, outcome: 'refreshed' as const };
|
|
316
330
|
});
|
package/src/index.ts
CHANGED
|
@@ -72,6 +72,7 @@ import { registerPodCommands } from './cli/pod-cli.js';
|
|
|
72
72
|
import { registerBrowserAnnotateCommand } from './cli/browser-annotate-cli.js';
|
|
73
73
|
import { registerPendingQuestionsCommand } from './cli/pending-questions-cli.js';
|
|
74
74
|
import { registerUsageCommand } from './cli/usage-cli.js';
|
|
75
|
+
import { registerUsageDailyCommand } from './cli/usage-daily-cli.js';
|
|
75
76
|
import { registerLiveCommands } from './cli/live-cli.js';
|
|
76
77
|
import { registerResearchCommand } from './cli/research-cli.js';
|
|
77
78
|
import { registerReleaseCommands } from './cli/release-cli.js';
|
|
@@ -915,6 +916,7 @@ registerPodCommands(program);
|
|
|
915
916
|
registerBrowserAnnotateCommand(program);
|
|
916
917
|
registerPendingQuestionsCommand(program);
|
|
917
918
|
registerUsageCommand(program);
|
|
919
|
+
registerUsageDailyCommand(program);
|
|
918
920
|
// main() → program.parseAsync() → live detail action; --test was applied before dispatch.
|
|
919
921
|
registerLiveCommands(program);
|
|
920
922
|
registerResearchCommand(program);
|
|
@@ -1473,6 +1475,8 @@ program
|
|
|
1473
1475
|
'--test',
|
|
1474
1476
|
'격리 테스트 인스턴스로 실행 — cwd 의 git 트리(worktree 포함)에서 `<트리>/.elanous-test` 를 루트로 잡고 state·config 두 축을 함께 격리한다. config 사본이 없으면 자동 물질화. `--test=<dir>` 로 루트 직접 지정 가능(값 문법은 `=` 형태 하나 — 모호함 없음). ELANOUS_STATE_DIR/--config-dir 을 손으로 줄 필요가 없다.',
|
|
1475
1477
|
)
|
|
1478
|
+
// Documentation-only — `readDashboardNameFlag` 가 Commander «전»에 argv 에서 걷어낸다.
|
|
1479
|
+
.option('--name <name>', '대시보드 TUI 의 PTY 행(tui:<pid>)에 별명을 달고 뜬다 — `elanous pty list` 에 보이고 `pty snapshot <name>` 으로 부른다. 뜬 뒤 바꾸려면 `elanous pty rename <ref> <name>`.')
|
|
1476
1480
|
.option('--help-all', '시스템 명령을 제외한 모든 최상위 명령 표시');
|
|
1477
1481
|
program.addHelpText('after', acpServerHelpText());
|
|
1478
1482
|
|
|
@@ -2396,18 +2400,20 @@ harnessCmd
|
|
|
2396
2400
|
.description('하니스 disposable worktree + 브랜치 정리(기본 접두는 만드는 쪽 상수에서 온다). ⚠️ 열린 PR 은 항상 보존. 기본 dry-run(계획만·--yes 로 실제 제거).')
|
|
2397
2401
|
.option('--abandoned', 'PR 이력 없는 것(escalated/방치) 제거 [기본]')
|
|
2398
2402
|
.option('--merged', 'PR 머지된 것 제거')
|
|
2403
|
+
.option('--include-unowned-merged-clean', '미소유 merged-clean worktree 회수 허용(merged 모드 전용)')
|
|
2399
2404
|
.option('--all', '열린 PR 외 전부 제거')
|
|
2400
2405
|
.option('--force', '열린 PR 브랜치도 제거(위험)')
|
|
2401
2406
|
.option('--yes', '실제 제거(생략 시 dry-run)')
|
|
2402
2407
|
.option('--prefix <p>', `브랜치 prefix(기본 ${WORKTREE_BRANCH_PREFIX_HELP})`)
|
|
2403
2408
|
.option('--repo <repo>', 'gh repo(기본 origin 추론)')
|
|
2404
2409
|
.option('--json', '구조화 출력')
|
|
2405
|
-
.action(async (opts: { abandoned?: boolean; merged?: boolean; all?: boolean; force?: boolean; yes?: boolean; prefix?: string; repo?: string; json?: boolean }) => {
|
|
2410
|
+
.action(async (opts: { abandoned?: boolean; merged?: boolean; all?: boolean; force?: boolean; includeUnownedMergedClean?: boolean; yes?: boolean; prefix?: string; repo?: string; json?: boolean }) => {
|
|
2406
2411
|
const { execHarnessClean } = await import('./harness/harness-clean.js');
|
|
2407
2412
|
const mode = opts.all ? 'all' : opts.merged ? 'merged' : 'abandoned';
|
|
2408
2413
|
const res = execHarnessClean({
|
|
2409
2414
|
mode, dryRun: !opts.yes,
|
|
2410
2415
|
...(opts.force ? { force: true } : {}),
|
|
2416
|
+
...(opts.includeUnownedMergedClean ? { includeUnownedMergedClean: true } : {}),
|
|
2411
2417
|
...(opts.prefix ? { branchPrefix: opts.prefix } : {}),
|
|
2412
2418
|
...(opts.repo ? { repo: opts.repo } : {}),
|
|
2413
2419
|
});
|
|
@@ -3354,6 +3360,19 @@ coordCmd.command('events')
|
|
|
3354
3360
|
});
|
|
3355
3361
|
|
|
3356
3362
|
const selfCmd = program.command('self').description('Self-awareness memory — 외부 도구(Claude Code/Codex)가 구현/변경 이력을 elanous 기억에 주입·회상');
|
|
3363
|
+
selfCmd.command('repair-commit-export <pr> <base-head> <child-output> <repo> <outbox>')
|
|
3364
|
+
.description('Pod commit-only repair artifact exporter (installed CLI)')
|
|
3365
|
+
.action(async (pr: string, baseHead: string, outputPath: string, repo: string, outbox: string) => {
|
|
3366
|
+
const { readFileSync } = await import('node:fs');
|
|
3367
|
+
const { writePodRepairCommit } = await import('./task-orchestrator/surfaces/pod-repair-commit.js');
|
|
3368
|
+
try {
|
|
3369
|
+
const result = writePodRepairCommit({ pr: Number(pr), baseHead, runId: process.env.ELANOUS_PARENT_RUN_ID ?? '', output: readFileSync(outputPath, 'utf8'), repo, outbox });
|
|
3370
|
+
console.log(`ELANOUS_POD_REPAIR_COMMIT ${result.pr} ${result.baseHead} ${result.commit}`);
|
|
3371
|
+
} catch (error) {
|
|
3372
|
+
console.error(`ELANOUS_POD_REPAIR_FAILED ${error instanceof Error ? error.message : String(error)}`);
|
|
3373
|
+
process.exitCode = 1;
|
|
3374
|
+
}
|
|
3375
|
+
});
|
|
3357
3376
|
{ const { registerSelfUtterancesCommand } = await import('./cli/self-utterances-cli.js'); registerSelfUtterancesCommand(selfCmd); }
|
|
3358
3377
|
|
|
3359
3378
|
// M12 Claude Code 의존도 계기판 — `elanous self dependence [--since] [--until] [--json]`(읽기만).
|
|
@@ -4380,6 +4399,7 @@ selfCmd
|
|
|
4380
4399
|
.option('--base <branch>', 'PR base 브랜치(생략 시 provider 기본)')
|
|
4381
4400
|
.option('--no-draft', 'non-draft PR (기본 draft)')
|
|
4382
4401
|
.option('--open-pr', 'gate 통과 후 push + draft PR open (기본: PR 안 열고 worktree 보존·fail-closed). 이 플래그가 HITL 명시 승인.')
|
|
4402
|
+
.addOption(new Option('--no-open-pr', '수리 실행: PR 개설 없이 worktree-only로 종료').default(undefined))
|
|
4383
4403
|
.option('--auto-merge', '★ 내부 리뷰가 clean(실제 리뷰 완료·verdict≠fail)이면 자동 병합(squash). must-fix 있으면 무시(hold·rework). outward-facing(main 병합)이라 명시 opt-in. 미지정=리뷰 후 HITL/draft.')
|
|
4384
4404
|
.option('--merge-by-host', 'Pod 자식: 병합 직전 merge-ready 로 끝내 호스트가 재게이트한 뒤 병합')
|
|
4385
4405
|
.option('--child-llm-provider <id>', '구현 자식 LLM provider(--child-llm-model 과 함께 · Pod 의 grok 폴백이 쓴다)')
|
|
@@ -4565,6 +4585,13 @@ const selfOrchestrateCmd = selfCmd
|
|
|
4565
4585
|
ui.error(refused.message);
|
|
4566
4586
|
process.exit(refused.exitCode);
|
|
4567
4587
|
}
|
|
4588
|
+
const repairRequested = (opts as { repairCommitOnly?: string }).repairCommitOnly;
|
|
4589
|
+
if (repairRequested !== undefined && ((opts as { substrate?: string }).substrate !== 'pod'
|
|
4590
|
+
|| !/^pr:[1-9]\d*$/.test((opts as { podSource?: string }).podSource ?? '')
|
|
4591
|
+
|| !/^[0-9a-f]{40}$/.test(repairRequested) || opts.openPr || opts.autoMerge)) {
|
|
4592
|
+
ui.error('--repair-commit-only: --substrate pod, --pod-source pr:N, 40-hex expected head, PR/자동 병합 없음이 필요합니다');
|
|
4593
|
+
process.exit(2);
|
|
4594
|
+
}
|
|
4568
4595
|
// 위치 인자는 종전처럼 분리하고 파일 입력은 파일당 한 골이다.
|
|
4569
4596
|
let inputGoals: ReturnType<typeof readSelfOrchestrateGoals>;
|
|
4570
4597
|
try { inputGoals = readSelfOrchestrateGoals(parts, opts.goalFile); }
|
|
@@ -5014,6 +5041,10 @@ const selfOrchestrateCmd = selfCmd
|
|
|
5014
5041
|
}
|
|
5015
5042
|
const passEnv = podProvider === 'grok' ? requestedPassEnv.filter((key) => !grokKeyNames.includes(key)) : podProvider === 'openrouter' ? [...new Set([...requestedPassEnv, 'OPENROUTER_API_KEY'])] : podProvider === 'anthropic' ? [...new Set([...requestedPassEnv, 'ANTHROPIC_API_KEY'])] : requestedPassEnv;
|
|
5016
5043
|
const podSourceSpec = (opts as { podSource?: string }).podSource;
|
|
5044
|
+
const repairBaseHead = (opts as { repairCommitOnly?: string }).repairCommitOnly;
|
|
5045
|
+
if (repairBaseHead && (!/^pr:[1-9]\d*$/.test(podSourceSpec ?? '') || !/^[0-9a-f]{40}$/.test(repairBaseHead) || opts.autoMerge || opts.openPr || goalTexts.length !== 1)) {
|
|
5046
|
+
ui.error('--repair-commit-only: --pod-source pr:N, 40-hex expected head, 골 1개, PR/자동 병합 없음이 필요합니다'); process.exit(2);
|
|
5047
|
+
}
|
|
5017
5048
|
let podSource: import('./task-orchestrator/surfaces/pod-source-receive.js').PodSource | undefined;
|
|
5018
5049
|
if (podSourceSpec) {
|
|
5019
5050
|
const { parsePodSourceSpec, resolvePodSource } = await import('./task-orchestrator/surfaces/pod-source-spec.js');
|
|
@@ -5036,7 +5067,7 @@ const selfOrchestrateCmd = selfCmd
|
|
|
5036
5067
|
if (childFlags.childLlmProvider?.trim()) debug.log('self-implement.pod', 'child-provider-named', { provider: childFlags.childLlmProvider.trim(), model: childFlags.childLlmModel ?? null, podProvider });
|
|
5037
5068
|
// BEDROCK-POD-PROVIDER-DROP — provider·account 는 한 곳(podLaunchProviderOptions)에서 — 손 나열이 bedrock 을 떨궈 codex(team)로 돌았다(10-11).
|
|
5038
5069
|
const podProviderOptions = (await import('./task-orchestrator/surfaces/pod-child-providers.js')).podLaunchProviderOptions(podProvider, { explicitPodAccount, grokApiKeyOptIn });
|
|
5039
|
-
const podBase = { hostSupervised: opts.supervise === true, ...podChildLlm, ...(remoteOnlyPool ? { imageCommit: image.imageCommit } : {}), ...podProviderOptions, ...(accountBroker ? { accountBroker, rotationAccounts } : {}), passEnv, ...(pool ? { pool } : {}), ...((opts as { podSkillEnv?: boolean }).podSkillEnv ? { skillEnv: true } : {}), ...(podSource ? { source: podSource } : {}) };
|
|
5070
|
+
const podBase = { hostSupervised: opts.supervise === true, ...podChildLlm, ...(remoteOnlyPool ? { imageCommit: image.imageCommit } : {}), ...podProviderOptions, ...(accountBroker ? { accountBroker, rotationAccounts } : {}), passEnv, ...(pool ? { pool } : {}), ...((opts as { podSkillEnv?: boolean }).podSkillEnv ? { skillEnv: true } : {}), ...(podSource ? { source: podSource } : {}), ...(repairBaseHead && podSource?.kind === 'pr' ? { repairCommitOnly: { pr: podSource.number, baseHead: repairBaseHead } } : {}) };
|
|
5040
5071
|
if (benchArms) {
|
|
5041
5072
|
const { benchPodSpawn } = await import('./task-orchestrator/surfaces/self-implement-pod.js');
|
|
5042
5073
|
podSpawn = benchPodSpawn(benchArms, podBase);
|
|
@@ -5146,7 +5177,8 @@ selfOrchestrateCmd
|
|
|
5146
5177
|
.addOption(new Option('--no-supervise', '⛔ 런 슈퍼바이저를 «끈다»(대표 2026-08-22 ***기본 ON***) — 켜져 있으면 런이 끝나면 실패를 «트리아지»해서 다시 걸 것이 있으면 «스스로» 재개한다(골루프처럼 끝까지). 정지 사유는 converged|needs-human|max-rounds|no-progress 로 각각 «다른 값»으로 말한다. 관측=elanous logs --category self-dev.supervisor').hideHelp())
|
|
5147
5178
|
.addOption(new Option('--supervise-rounds <n>', '슈퍼바이저 재개 라운드 상한 (기본 3 · 끄려면 --no-supervise)').hideHelp())
|
|
5148
5179
|
.addOption(new Option('--json', '구조화 출력 [{taskId, feature, status, stage?, prUrl?, merged?, error?}]').hideHelp())
|
|
5149
|
-
.addOption(new Option('--pod-source <spec>', 'pod: 원천 — commit:<40자 sha> | pr:<정수> | worktree:<경로> | files:<경로>[,<경로>…] · 없으면 기본 clone').hideHelp())
|
|
5180
|
+
.addOption(new Option('--pod-source <spec>', 'pod: 원천 — commit:<40자 sha> | pr:<정수> | worktree:<경로> | files:<경로>[,<경로>…] · 없으면 기본 clone').hideHelp())
|
|
5181
|
+
.addOption(new Option('--repair-commit-only <expected-head>', 'pod: 기존 PR head에서 재작업하고 PR 생성 없이 커밋 bundle을 돌려준다').hideHelp());
|
|
5150
5182
|
|
|
5151
5183
|
function formatRelativeAge(updatedAt: number, now = Date.now()): string {
|
|
5152
5184
|
const seconds = Math.floor(Math.max(0, now - updatedAt) / 1000);
|
|
@@ -5649,7 +5681,8 @@ selfCmd
|
|
|
5649
5681
|
.option('--context <path>', '리뷰어가 함께 판단할 레포 상대 파일 경로(반복 가능)', (value: string, previous: string[] = []) => [...previous, value])
|
|
5650
5682
|
.option('--context-text <text>', '리뷰어가 함께 판단할 텍스트(반복 가능)', (value: string, previous: string[] = []) => [...previous, value])
|
|
5651
5683
|
.option('--json', '구조화 출력 {pr, verdict, mustFix, shouldFix, reviewed}')
|
|
5652
|
-
.
|
|
5684
|
+
.option('--save <name>', '리뷰 결과를 상태 디렉터리의 review-results/<name>-<PR>-<head12>.json에 저장')
|
|
5685
|
+
.action(async (prParts: string[], opts: { intent?: string; model?: string; acp?: boolean; acpModel?: string; acpBackend?: string; acpTimeout?: string; context?: string[]; contextText?: string[]; json?: boolean; save?: string }) => {
|
|
5653
5686
|
const prArgs = prParts.flatMap((p) => String(p).split(/[,\s]+/).filter(Boolean)); // 번호/#번호/URL·콤마목록.
|
|
5654
5687
|
if (!prArgs.length) { ui.error('PR 필요: elanous self review <번호|URL> [..]'); process.exit(2); }
|
|
5655
5688
|
// ⭐ 본문은 seam(`runSelfReviewCliCommand`)에 있다 — 이 액션은 **의존 배선만** 한다.
|
|
@@ -7723,7 +7756,7 @@ configCmd
|
|
|
7723
7756
|
.action(async (path: string | undefined, opts: { reveal?: boolean }) => {
|
|
7724
7757
|
const { resolveCurrentInstance } = await import('./instance/current.js');
|
|
7725
7758
|
const instance = resolveCurrentInstance();
|
|
7726
|
-
if (instance.kind === 'test' && instance.layer === 'tree-derived') {
|
|
7759
|
+
if (instance.kind === 'test' && String(instance.layer) === 'tree-derived') {
|
|
7727
7760
|
console.error('⚠️ test 우주의 config를 읽습니다 — 운영 값은 --config-dir ~/.elanous');
|
|
7728
7761
|
}
|
|
7729
7762
|
const cfg = getUserConfig() as unknown as Record<string, unknown>;
|
|
@@ -11579,6 +11612,15 @@ async function main(): Promise<void> {
|
|
|
11579
11612
|
// ⇒ 이제 규칙이 «문법»뿐이라(북마크 스토어를 안 본다) 인자도 없다.
|
|
11580
11613
|
rawArgs = stripRemoteFlags(rawArgs);
|
|
11581
11614
|
|
|
11615
|
+
// `elanous --name <name>` — 대시보드 TUI 의 자기 PTY 행(`tui:<pid>`) 별명. 루트 실행 플래그라
|
|
11616
|
+
// Commander «전»에 걷어낸다(하위 명령이 앞이면 손대지 않는다 — dashboard-name-flag.ts 머리말).
|
|
11617
|
+
const dashboardName = (await import('./cli/dashboard-name-flag.js')).readDashboardNameFlag(rawArgs);
|
|
11618
|
+
if (dashboardName.error) {
|
|
11619
|
+
console.error(dashboardName.error);
|
|
11620
|
+
process.exit(1);
|
|
11621
|
+
}
|
|
11622
|
+
rawArgs = dashboardName.args;
|
|
11623
|
+
|
|
11582
11624
|
// M2.4 — remote-daemon path. `ELANOUS_REMOTE=mbp.tailnet:31415` (or
|
|
11583
11625
|
// a full ws:// URL) makes the dashboard attach to a remote daemon
|
|
11584
11626
|
// instead of booting an in-process ACP pair. Token + no-auth
|
|
@@ -11755,7 +11797,7 @@ async function main(): Promise<void> {
|
|
|
11755
11797
|
// dashboard the user is actually looking at. Off unless this boots
|
|
11756
11798
|
// (no producer in headless/daemon paths). fail-soft·비블로킹.
|
|
11757
11799
|
bootTimer.begin();
|
|
11758
|
-
try { (await import('./capture/tui-self-report.js')).startTuiSelfReport(); } catch { /* fail-soft */ }
|
|
11800
|
+
try { (await import('./capture/tui-self-report.js')).startTuiSelfReport(dashboardName.name ? { nickname: dashboardName.name } : {}); } catch { /* fail-soft */ }
|
|
11759
11801
|
bootTimer.phase('self-report');
|
|
11760
11802
|
|
|
11761
11803
|
// Dashboard handles sync inline — only returns on quit
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
// ── 외부 주입 입력의 별도 대기열 (TUI OP 도그푸드 결함 #6 · 2026-10-14) ──────────────
|
|
2
|
+
//
|
|
3
|
+
// S: 바깥 프로세스가 `elanous pty text <tui:pid> "<글>" --enter` 로 넣은 입력은 TUI 제어 대상의
|
|
4
|
+
// `write()` → `injectKey` 로 «키보드와 같은» 키 큐에 들어간다.
|
|
5
|
+
// C: 그래서 사용자가 치던 composer 버퍼·턴 중 typeahead 버퍼에 글자가 «이어 붙는다»
|
|
6
|
+
// (10-14 13:37 실측: 사용자가 치던 줄 끝에 외부 지시가 붙어 한 메시지로 나갔다).
|
|
7
|
+
// A: 제어 대상의 `write()` 가 키 주입 «전»에 이 라우터를 먼저 묻는다.
|
|
8
|
+
// - 글 한 줄(제어 문자 없음 · 끝 CR 하나 허용)이 아니면 → 종전대로 키 주입(`pty key`·메뉴 몰기 무변경)
|
|
9
|
+
// - composer 가 안 떠 있음(턴 밖 패널·모달 모드) → 종전대로 키 주입(드라이버 회귀 방지)
|
|
10
|
+
// - Enter 가 붙은 글: 턴 중 · 사용자 버퍼에 글자가 있음 · 앞선 외부 항목이 대기 중 → «별도 항목»으로 대기열,
|
|
11
|
+
// composer 가 비어 있으면 출처(`terminal`/`pty`)를 단 «별도 제출»로 즉시 보냄
|
|
12
|
+
// - Enter 없는 글: 빈 composer 면 종전대로 채우고, 바쁘면(턴 중·버퍼에 글자) «거부»한다 —
|
|
13
|
+
// 나중에 사용자 composer 에 채우면 다시 섞이므로 대기시키지 않는다(IPC 가 실패로 정산 → rc≠0).
|
|
14
|
+
// 대기열은 «턴이 끝나고 composer 가 비었을 때» 한 건씩 나간다 — 사용자 버퍼는 건드리지 않는다.
|
|
15
|
+
//
|
|
16
|
+
// ⚠️ herdr/tmux 처럼 «터미널 자체»에 쓰는 길은 키보드와 구별할 수 없다 — 이 라우터는
|
|
17
|
+
// elanous 제어 IPC(`pty text`) 경로만 가른다.
|
|
18
|
+
|
|
19
|
+
import { debug } from '../debug/log.js';
|
|
20
|
+
import type { InputSourceRef } from './input-source-kind.js';
|
|
21
|
+
|
|
22
|
+
export interface ExternalInputItem {
|
|
23
|
+
readonly text: string;
|
|
24
|
+
readonly at: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface ExternalInputHost {
|
|
28
|
+
/** 턴(스트리밍)이 도는 중인가. */
|
|
29
|
+
isTurnActive(): boolean;
|
|
30
|
+
/** 살아 있는 composer 의 현재 버퍼. composer 가 안 떠 있으면 undefined. */
|
|
31
|
+
composerText(): string | undefined;
|
|
32
|
+
/** 아직 소비되지 않은 키가 키 큐에 있나 — 있으면 composer 가 비어 보여도 사용자 키가 오는 중이다. */
|
|
33
|
+
hasPendingKeys(): boolean;
|
|
34
|
+
/** 별도 메시지로 제출한다. 못 보냈으면 false(항목은 대기열에 남는다). */
|
|
35
|
+
submit(text: string, source: InputSourceRef): boolean;
|
|
36
|
+
/** 대기열이 바뀌었다 — 화면 표지를 다시 그린다. */
|
|
37
|
+
onQueueChange?(pending: readonly ExternalInputItem[], event: 'queued' | 'delivered'): void;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type ExternalInputRoute = 'passthrough' | 'submitted' | 'queued';
|
|
41
|
+
export type ExternalInputDecision = 'passthrough' | 'submit-now' | 'queue' | 'reject';
|
|
42
|
+
|
|
43
|
+
const EXTERNAL_INPUT_SOURCE: InputSourceRef = { kind: 'terminal', provider: 'pty' };
|
|
44
|
+
export const EXTERNAL_INPUT_QUEUE_LIMIT = 50;
|
|
45
|
+
const PUMP_MS = 250;
|
|
46
|
+
/** 머리 항목이 turn-active 때문에 이만큼 못 나가면 한 번만 경고한다. 자동 해제는 하지 않는다. */
|
|
47
|
+
export const STALE_TURN_SUSPECTED_MS = 10 * 60 * 1000;
|
|
48
|
+
|
|
49
|
+
/** 글 한 줄인가 — 제어 문자 없음 · 끝 CR 하나만 허용. 아니면 null(키 주입 경로). */
|
|
50
|
+
export function parseExternalTextLine(chars: string): { text: string; submit: boolean } | null {
|
|
51
|
+
const submit = chars.endsWith('\r');
|
|
52
|
+
const text = submit ? chars.slice(0, -1) : chars;
|
|
53
|
+
// ⚠️ 공백만 있는 글도 «글»이다 — trim 하면 대기열을 우회해 사용자 초안에 붙는다.
|
|
54
|
+
if (!text) return null;
|
|
55
|
+
// eslint-disable-next-line no-control-regex
|
|
56
|
+
if (/[\x00-\x1f\x7f]/.test(text)) return null;
|
|
57
|
+
return { text, submit };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** 라우팅 판정(순수). */
|
|
61
|
+
export function decideExternalInputRoute(input: {
|
|
62
|
+
line: { text: string; submit: boolean } | null;
|
|
63
|
+
hostRegistered: boolean;
|
|
64
|
+
pendingCount: number;
|
|
65
|
+
turnActive: boolean;
|
|
66
|
+
composerText: string | undefined;
|
|
67
|
+
pendingKeys?: boolean;
|
|
68
|
+
}): { decision: ExternalInputDecision; reason: string } {
|
|
69
|
+
if (!input.line) return { decision: 'passthrough', reason: 'not-text-line' };
|
|
70
|
+
if (!input.hostRegistered) return { decision: 'passthrough', reason: 'no-host' };
|
|
71
|
+
// 턴 밖에서 composer 가 안 떠 있으면(패널·모달) 그 화면을 모는 키 입력이다 — 종전 경로.
|
|
72
|
+
if (!input.turnActive && input.composerText === undefined) return { decision: 'passthrough', reason: 'composer-not-live' };
|
|
73
|
+
const busyReason = input.turnActive ? 'turn-active'
|
|
74
|
+
// ⚠️ 공백만 있는 초안도 사용자 버퍼다 — trim 하지 않는다.
|
|
75
|
+
: input.composerText !== '' ? 'user-buffer-nonempty'
|
|
76
|
+
// composer 가 비어 보여도 키 큐에 사용자 키가 남아 있으면 그 키가 먼저다.
|
|
77
|
+
: input.pendingKeys ? 'user-keys-pending'
|
|
78
|
+
// FIFO — 앞선 외부 항목을 뒤 항목이 앞지르지 않는다.
|
|
79
|
+
: input.pendingCount > 0 ? 'queue-nonempty'
|
|
80
|
+
: null;
|
|
81
|
+
if (!input.line.submit) {
|
|
82
|
+
return busyReason ? { decision: 'reject', reason: `${busyReason}-no-enter` } : { decision: 'passthrough', reason: 'idle-empty-no-enter' };
|
|
83
|
+
}
|
|
84
|
+
return busyReason ? { decision: 'queue', reason: busyReason } : { decision: 'submit-now', reason: 'idle-empty' };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** 대기열 머리를 지금 내보내도 되나(순수) — 턴 밖 ⊕ composer 가 떠 있고 비어 있음. */
|
|
88
|
+
function canDeliverExternalInput(turnActive: boolean, composerText: string | undefined, pendingKeys: boolean): boolean {
|
|
89
|
+
return !turnActive && composerText === '' && !pendingKeys;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** «외부 입력 N건 대기» 표지 문면. 비면 null. */
|
|
93
|
+
export function renderExternalInputQueueNotice(pending: readonly ExternalInputItem[]): string | null {
|
|
94
|
+
if (pending.length === 0) return null;
|
|
95
|
+
const head = pending[0]!.text;
|
|
96
|
+
const shown = [...head].length > 40 ? `${[...head].slice(0, 40).join('')}…` : head;
|
|
97
|
+
return `⤵ 외부 입력 ${pending.length}건 대기 · "${shown}" · 턴이 끝나고 입력창이 비면 별도 메시지로 전송`;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export interface ExternalInputQueueDeps {
|
|
101
|
+
now?: () => number;
|
|
102
|
+
/** 펌프 스케줄러 — 정지 함수를 돌려준다. 시험이 손으로 돌린다. */
|
|
103
|
+
schedule?: (tick: () => void, ms: number) => () => void;
|
|
104
|
+
log?: (event: string, data: Record<string, unknown>) => void;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function createExternalInputQueue(deps: ExternalInputQueueDeps = {}) {
|
|
108
|
+
const now = deps.now ?? Date.now;
|
|
109
|
+
const log = deps.log ?? ((event, data) => debug.log('tui.external-input', event, data));
|
|
110
|
+
const schedule = deps.schedule ?? ((tick, ms) => {
|
|
111
|
+
const t = setInterval(tick, ms);
|
|
112
|
+
(t as { unref?: () => void }).unref?.();
|
|
113
|
+
return () => clearInterval(t);
|
|
114
|
+
});
|
|
115
|
+
let host: ExternalInputHost | null = null;
|
|
116
|
+
let pending: ExternalInputItem[] = [];
|
|
117
|
+
let stopPump: (() => void) | null = null;
|
|
118
|
+
// 경고는 머리 항목 «하나»에 한 번 — 머리가 실제로 바뀔 때만 다시 경고할 수 있다(제출 실패로 남은 같은 머리는 유지).
|
|
119
|
+
let staleTurnWarnedHead: ExternalInputItem | null = null;
|
|
120
|
+
|
|
121
|
+
const notify = (event: 'queued' | 'delivered'): void => {
|
|
122
|
+
try { host?.onQueueChange?.(pending, event); } catch { /* fail-soft — 표지 실패가 입력을 막지 않는다 */ }
|
|
123
|
+
};
|
|
124
|
+
const ensurePump = (): void => {
|
|
125
|
+
if (pending.length > 0 && !stopPump) stopPump = schedule(pump, PUMP_MS);
|
|
126
|
+
if (pending.length === 0 && stopPump) { stopPump(); stopPump = null; }
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
/** 대기열 머리 한 건을 내보낸다(조건이 맞을 때만). 내보냈으면 true. */
|
|
130
|
+
function pump(): boolean {
|
|
131
|
+
const h = host;
|
|
132
|
+
const head = pending[0];
|
|
133
|
+
if (!h || !head) { ensurePump(); return false; }
|
|
134
|
+
let turnActive: boolean; let composer: string | undefined; let pendingKeys: boolean;
|
|
135
|
+
try { turnActive = h.isTurnActive(); composer = h.composerText(); pendingKeys = h.hasPendingKeys(); } catch { return false; }
|
|
136
|
+
if (!canDeliverExternalInput(turnActive, composer, pendingKeys)) {
|
|
137
|
+
if (turnActive && staleTurnWarnedHead !== head) {
|
|
138
|
+
const waitedMs = now() - head.at;
|
|
139
|
+
if (waitedMs >= STALE_TURN_SUSPECTED_MS) {
|
|
140
|
+
staleTurnWarnedHead = head;
|
|
141
|
+
log('stale-turn-suspected', { waitedMs, pending: pending.length });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
let ok = false;
|
|
147
|
+
try { ok = h.submit(head.text, EXTERNAL_INPUT_SOURCE); } catch { ok = false; }
|
|
148
|
+
if (!ok) { log('deliver-failed', { length: head.text.length, pending: pending.length }); return false; }
|
|
149
|
+
pending = pending.slice(1);
|
|
150
|
+
log('delivered', { length: head.text.length, waitedMs: now() - head.at, pending: pending.length });
|
|
151
|
+
notify('delivered');
|
|
152
|
+
ensurePump();
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return {
|
|
157
|
+
register(next: ExternalInputHost): () => void {
|
|
158
|
+
host = next;
|
|
159
|
+
log('host-registered', { pending: pending.length });
|
|
160
|
+
ensurePump();
|
|
161
|
+
return () => {
|
|
162
|
+
if (host !== next) return;
|
|
163
|
+
host = null;
|
|
164
|
+
log('host-unregistered', { pending: pending.length });
|
|
165
|
+
};
|
|
166
|
+
},
|
|
167
|
+
/** 제어 대상 `write()` 가 키 주입 «전»에 부른다. 'passthrough' 면 호출측이 종전대로 키를 넣는다. */
|
|
168
|
+
route(chars: string): ExternalInputRoute {
|
|
169
|
+
// `pty key`(input-key)는 «키»다 — 공백·`j` 처럼 출력 가능한 키도 종전대로 넣는다.
|
|
170
|
+
if (keyCommandDepth > 0) return 'passthrough';
|
|
171
|
+
const line = parseExternalTextLine(chars);
|
|
172
|
+
let turnActive = false; let composer: string | undefined; let pendingKeys = false;
|
|
173
|
+
if (host && line) {
|
|
174
|
+
try { turnActive = host.isTurnActive(); composer = host.composerText(); pendingKeys = host.hasPendingKeys(); }
|
|
175
|
+
catch { return 'passthrough'; }
|
|
176
|
+
}
|
|
177
|
+
const { decision, reason } = decideExternalInputRoute({
|
|
178
|
+
line, hostRegistered: host !== null, pendingCount: pending.length, turnActive, composerText: composer, pendingKeys,
|
|
179
|
+
});
|
|
180
|
+
const base = { reason, length: chars.length, submit: line?.submit ?? false, turnActive, pendingKeys, userBufferLength: composer?.length ?? null };
|
|
181
|
+
if (decision === 'passthrough') {
|
|
182
|
+
log('route', { ...base, route: 'passthrough', pending: pending.length });
|
|
183
|
+
return 'passthrough';
|
|
184
|
+
}
|
|
185
|
+
if (decision === 'reject') {
|
|
186
|
+
log('route', { ...base, route: 'rejected', pending: pending.length });
|
|
187
|
+
throw new Error('tui-busy-text-without-enter');
|
|
188
|
+
}
|
|
189
|
+
if (decision === 'submit-now' && line && host) {
|
|
190
|
+
let ok = false;
|
|
191
|
+
try { ok = host.submit(line.text, EXTERNAL_INPUT_SOURCE); } catch { ok = false; }
|
|
192
|
+
if (ok) { log('route', { ...base, route: 'submitted', pending: pending.length }); return 'submitted'; }
|
|
193
|
+
}
|
|
194
|
+
if (pending.length >= EXTERNAL_INPUT_QUEUE_LIMIT) {
|
|
195
|
+
log('queue-full', { ...base, pending: pending.length });
|
|
196
|
+
throw new Error('tui-external-input-queue-full');
|
|
197
|
+
}
|
|
198
|
+
pending = [...pending, { text: line!.text, at: now() }];
|
|
199
|
+
log('route', { ...base, route: 'queued', pending: pending.length });
|
|
200
|
+
notify('queued');
|
|
201
|
+
ensurePump();
|
|
202
|
+
return 'queued';
|
|
203
|
+
},
|
|
204
|
+
pump,
|
|
205
|
+
pending: (): readonly ExternalInputItem[] => pending,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
let keyCommandDepth = 0;
|
|
210
|
+
/** 제어 IPC 의 `input-key` 가 이 안에서 쓴다 — 라우터는 그 쓰기를 글이 아니라 키로 보고 그대로 통과시킨다. */
|
|
211
|
+
export function withExternalKeyCommand<T>(fn: () => T): T {
|
|
212
|
+
keyCommandDepth++;
|
|
213
|
+
try { return fn(); } finally { keyCommandDepth--; }
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const shared = createExternalInputQueue();
|
|
217
|
+
|
|
218
|
+
export function registerExternalInputHost(host: ExternalInputHost): () => void { return shared.register(host); }
|
|
219
|
+
export function routeExternalInput(chars: string): ExternalInputRoute { return shared.route(chars); }
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { debug } from '../debug/log.js';
|
|
2
|
+
import type { ModelCatalog, ModelEntry } from './types.js';
|
|
3
|
+
|
|
4
|
+
const NUMERIC_COLUMNS = [
|
|
5
|
+
'ctx', 'in$/1M', 'out$/1M', 'cacheRead$/1M', 'est_run$',
|
|
6
|
+
'AA_intel', 'AA_coding', 'AA_agentic', 'SWE_verified', 'SWE_pro',
|
|
7
|
+
'TerminalBench', 'LiveCodeBench', 'tool_use',
|
|
8
|
+
] as const;
|
|
9
|
+
|
|
10
|
+
export type BenchNumericColumn = typeof NUMERIC_COLUMNS[number];
|
|
11
|
+
export type BenchScore = 'AA_coding' | 'AA_agentic' | 'SWE_verified' | 'TerminalBench';
|
|
12
|
+
|
|
13
|
+
export type BenchRow = {
|
|
14
|
+
id: string;
|
|
15
|
+
provider: string;
|
|
16
|
+
sources: string;
|
|
17
|
+
notes: string;
|
|
18
|
+
raw: Record<string, string>;
|
|
19
|
+
} & Record<BenchNumericColumn, number | null>;
|
|
20
|
+
|
|
21
|
+
export type ComparedBenchRow<T extends BenchRow = BenchRow> = T & {
|
|
22
|
+
value: number | null;
|
|
23
|
+
status: 'scored' | '미확인';
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const UNKNOWN = new Set(['', '미확인', '미표기', '-']);
|
|
27
|
+
const NUMBER = /[-+]?(?:\d+(?:,\d{3})*(?:\.\d+)?|\.\d+)(?:[eE][-+]?\d+)?/g;
|
|
28
|
+
|
|
29
|
+
function parseNumber(raw: string): number | null {
|
|
30
|
+
const trimmed = raw.trim();
|
|
31
|
+
if (UNKNOWN.has(trimmed)) return null;
|
|
32
|
+
// A label may contain a version number ("AA TB4.0 33.3"); the final
|
|
33
|
+
// number is the measured value. Keep the full cell separately in raw.
|
|
34
|
+
const matches = [...trimmed.matchAll(NUMBER)];
|
|
35
|
+
const last = matches.at(-1)?.[0];
|
|
36
|
+
if (!last) return null;
|
|
37
|
+
const parsed = Number(last.replaceAll(',', ''));
|
|
38
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Parse a caller-supplied, offline TSV. Column positions come only from the header. */
|
|
42
|
+
export function parseBenchScoresTsv(text: string): BenchRow[] {
|
|
43
|
+
const lines = text.replace(/^\uFEFF/, '').split(/\r?\n/);
|
|
44
|
+
const headers = (lines.shift() ?? '').split('\t').map((name) => name.trim());
|
|
45
|
+
if (!headers.includes('id')) throw new Error('bench scores TSV missing id header');
|
|
46
|
+
const rows: BenchRow[] = [];
|
|
47
|
+
let unknownCells = 0;
|
|
48
|
+
for (const line of lines) {
|
|
49
|
+
if (!line.trim()) continue;
|
|
50
|
+
const cells = line.split('\t');
|
|
51
|
+
const raw: Record<string, string> = {};
|
|
52
|
+
headers.forEach((header, index) => { raw[header] = cells[index] ?? ''; });
|
|
53
|
+
const numbers = {} as Record<BenchNumericColumn, number | null>;
|
|
54
|
+
for (const column of NUMERIC_COLUMNS) {
|
|
55
|
+
numbers[column] = parseNumber(raw[column] ?? '');
|
|
56
|
+
if (numbers[column] === null) unknownCells++;
|
|
57
|
+
}
|
|
58
|
+
rows.push({ id: raw.id?.trim() ?? '', provider: raw.provider ?? '',
|
|
59
|
+
sources: raw.sources ?? '', notes: raw.notes ?? '', raw, ...numbers });
|
|
60
|
+
}
|
|
61
|
+
debug.log('intelligence.bench-scores', 'parsed', { rows, unknownCells });
|
|
62
|
+
return rows;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** An OpenRouter vendor/model id matches a catalog id only under its vendor.
|
|
66
|
+
* The builtin DeepSeek entries are `other`/`deepseek` but have the explicit
|
|
67
|
+
* OpenRouter route `deepseek/<id>` in their notes. */
|
|
68
|
+
function catalogIds(model: ModelEntry): string[] {
|
|
69
|
+
const ids = [model.id];
|
|
70
|
+
const vendor = model.provider === 'openai-codex' ? 'openai'
|
|
71
|
+
: model.provider === 'gemini' ? 'google'
|
|
72
|
+
: model.provider === 'grok' ? 'x-ai'
|
|
73
|
+
: model.provider === 'kimi' ? 'moonshotai'
|
|
74
|
+
: model.provider === 'glm' ? 'z-ai'
|
|
75
|
+
: model.provider === 'other' && model.family === 'deepseek' && model.notes?.includes(`OpenRouter deepseek/${model.id}`) ? 'deepseek'
|
|
76
|
+
: model.provider;
|
|
77
|
+
if (!model.local) ids.push(`${vendor}/${model.id}`, `openrouter/${vendor}/${model.id}`);
|
|
78
|
+
return ids;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function joinWithCatalog<T extends BenchRow>(rows: readonly T[], catalog: ModelCatalog): (T & { inCatalog: boolean })[] {
|
|
82
|
+
const ids = new Set(catalog.models.flatMap(catalogIds));
|
|
83
|
+
return rows.map((row) => ({ ...row, inCatalog: ids.has(row.id) }));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Sort by score per estimated run dollar. Missing scores always come last;
|
|
87
|
+
* a known score without a usable denominator has an unknown value. */
|
|
88
|
+
export function compareRows<T extends BenchRow>(rows: readonly T[], opts: { score: BenchScore }): ComparedBenchRow<T>[] {
|
|
89
|
+
return rows.map((row) => {
|
|
90
|
+
const score = row[opts.score];
|
|
91
|
+
return { ...row,
|
|
92
|
+
value: score !== null && row.est_run$ !== null && row.est_run$ > 0
|
|
93
|
+
? score / row.est_run$ : null,
|
|
94
|
+
status: score === null ? '미확인' as const : 'scored' as const,
|
|
95
|
+
};
|
|
96
|
+
}).sort((a, b) => {
|
|
97
|
+
if (a.status !== b.status) return a.status === '미확인' ? 1 : -1;
|
|
98
|
+
if (a.value === null) return b.value === null ? 0 : 1;
|
|
99
|
+
if (b.value === null) return -1;
|
|
100
|
+
return b.value - a.value;
|
|
101
|
+
});
|
|
102
|
+
}
|
|
@@ -58,6 +58,13 @@ export interface InteractiveTerminalModalSpec {
|
|
|
58
58
|
/** Ghostty-compatible terminfo name. Defaults via PreviewTerminal
|
|
59
59
|
* to xterm-256color. */
|
|
60
60
|
termName?: string;
|
|
61
|
+
/** Register this popup in the shared PTY inventory. */
|
|
62
|
+
useRegistry?: boolean;
|
|
63
|
+
registryKind?: string;
|
|
64
|
+
registryNickname?: string;
|
|
65
|
+
registryOrigin?: { originRoot: string; controller?: string };
|
|
66
|
+
registryPurpose?: string;
|
|
67
|
+
registrySeat?: string;
|
|
61
68
|
/** Override bounds. Default: 85% of termCols/termRows, centered. */
|
|
62
69
|
bounds?: ModalBounds;
|
|
63
70
|
/** MT1 — named size preset (mutually exclusive with `bounds`; when
|
|
@@ -206,6 +213,12 @@ export function createInteractiveTerminalModal(
|
|
|
206
213
|
shellArgs: spec.shellArgs,
|
|
207
214
|
env: spec.env,
|
|
208
215
|
termName: spec.termName,
|
|
216
|
+
useRegistry: spec.useRegistry,
|
|
217
|
+
registryKind: spec.registryKind,
|
|
218
|
+
registryNickname: spec.registryNickname,
|
|
219
|
+
registryOrigin: spec.registryOrigin,
|
|
220
|
+
registryPurpose: spec.registryPurpose,
|
|
221
|
+
registrySeat: spec.registrySeat,
|
|
209
222
|
onUpdate: () => {
|
|
210
223
|
// First output → leave the placeholder state. Stops the
|
|
211
224
|
// spinner timer + flushes a render so the real PTY frame
|
|
@@ -46,6 +46,31 @@ export function currentRouteDecision(surface: string): RouteDecision | null {
|
|
|
46
46
|
return lastBySurface.get(surface) ?? null;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
/** A `/model` choice scoped to this process's surface (TUI-MODEL-SESSION-SCOPE · 10-14).
|
|
50
|
+
* It reaches the turn as `explicitModel`, so it wins over the Codex tier policy —
|
|
51
|
+
* a config-only `llm.model` change is ignored by that policy (10-14 OPT: `/model luna`
|
|
52
|
+
* wrote config, every turn still ran sol). Not persisted; `/model … --global` writes config. */
|
|
53
|
+
export interface SessionModelPin {
|
|
54
|
+
provider: LLMProviderName;
|
|
55
|
+
model: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const pinBySurface = new Map<string, SessionModelPin>();
|
|
59
|
+
|
|
60
|
+
export function setSessionModelPin(surface: string, pin: SessionModelPin | null): void {
|
|
61
|
+
if (pin) pinBySurface.set(surface, pin);
|
|
62
|
+
else pinBySurface.delete(surface);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** The surface's pinned model, or null when none — or when the active provider
|
|
66
|
+
* has since changed (a pin only makes sense on the provider it was chosen for). */
|
|
67
|
+
export function sessionModelPin(surface: string, activeProvider?: LLMProviderName): SessionModelPin | null {
|
|
68
|
+
const pin = pinBySurface.get(surface);
|
|
69
|
+
if (!pin) return null;
|
|
70
|
+
if (activeProvider !== undefined && pin.provider !== activeProvider) return null;
|
|
71
|
+
return pin;
|
|
72
|
+
}
|
|
73
|
+
|
|
49
74
|
export interface ResolveRouteDecisionInput {
|
|
50
75
|
provider: LLMProviderName;
|
|
51
76
|
configuredModel?: string;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// TUI-STREAM-RETRY — 끊긴 스트림을 다시 걸 때 «이미 화면에 흘린 텍스트»를 두 번 보이지 않게 하는 관문.
|
|
2
|
+
//
|
|
3
|
+
// ⛔ 화면 쪽에는 «커밋하지 않고 지우는» 신호가 없다. TUI plain 경로는 `onText('', …)` 를 chunk 만 받아
|
|
4
|
+
// `('', '')` 로 바꾸고, `turn-stream-formatter` 는 그것을 «clear-and-commit»(지난 글을 영구 보존)으로 읽는다.
|
|
5
|
+
// ⇒ 되감기를 화면에 «알리는» 대신, 재시도 본문이 이미 보인 글과 겹치는 동안은 «안 내보내고»,
|
|
6
|
+
// 넘어서는 순간 그 뒷부분만 이어 붙인다. 이력(turnText)은 늘 재시도 본문이 정본이다.
|
|
7
|
+
// ⚠️ 재시도 본문이 이미 보인 글과 «갈라지면» 지울 길이 없으니 커밋 경계(`onText('', '')`)를 한 번 내고
|
|
8
|
+
// 새 본문을 처음부터 흘린다 — 옛 조각은 지난 서술로 남는다(관측: `llm.retry stream-retry-display-diverged`).
|
|
9
|
+
|
|
10
|
+
export type RetryDisplayStep =
|
|
11
|
+
| { kind: 'emit'; delta: string }
|
|
12
|
+
| { kind: 'hold' }
|
|
13
|
+
| { kind: 'diverged'; text: string };
|
|
14
|
+
|
|
15
|
+
export interface RetryDisplayGate {
|
|
16
|
+
/** 끊김 뒤 재시도 직전에 부른다 — 지금 화면에 보이는 이 턴의 글을 «확인 대기»로 둔다. */
|
|
17
|
+
arm(): void;
|
|
18
|
+
/** 텍스트 델타가 turnText 에 붙은 «뒤» 부른다. 무엇을 화면에 낼지 돌려준다. */
|
|
19
|
+
onText(delta: string, turnText: string): RetryDisplayStep;
|
|
20
|
+
/** 스트림이 끝났을 때 — 확인 대기 중인데 재시도 본문이 보인 글과 다르면 갈라짐으로 낸다. */
|
|
21
|
+
settle(turnText: string): RetryDisplayStep;
|
|
22
|
+
/** 확인 대기 중인 글자 수(관측용). */
|
|
23
|
+
heldChars(): number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function createRetryDisplayGate(): RetryDisplayGate {
|
|
27
|
+
let visible = '';
|
|
28
|
+
let replaying = false;
|
|
29
|
+
return {
|
|
30
|
+
arm() {
|
|
31
|
+
replaying = visible.length > 0;
|
|
32
|
+
},
|
|
33
|
+
onText(delta, turnText) {
|
|
34
|
+
if (!replaying) {
|
|
35
|
+
visible += delta;
|
|
36
|
+
return { kind: 'emit', delta };
|
|
37
|
+
}
|
|
38
|
+
if (visible.startsWith(turnText)) return { kind: 'hold' };
|
|
39
|
+
replaying = false;
|
|
40
|
+
if (turnText.startsWith(visible)) {
|
|
41
|
+
const rest = turnText.slice(visible.length);
|
|
42
|
+
visible = turnText;
|
|
43
|
+
return { kind: 'emit', delta: rest };
|
|
44
|
+
}
|
|
45
|
+
visible = turnText;
|
|
46
|
+
return { kind: 'diverged', text: turnText };
|
|
47
|
+
},
|
|
48
|
+
settle(turnText) {
|
|
49
|
+
if (!replaying) return { kind: 'hold' };
|
|
50
|
+
replaying = false;
|
|
51
|
+
if (visible === turnText) return { kind: 'hold' };
|
|
52
|
+
visible = turnText;
|
|
53
|
+
return { kind: 'diverged', text: turnText };
|
|
54
|
+
},
|
|
55
|
+
heldChars() {
|
|
56
|
+
return replaying ? visible.length : 0;
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|