elanous 0.2.28 → 0.2.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{y1ltt7oCZxVpC6zVPhZ2O → cIpv5nU9AycwYWZI9H589}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{ab4d57c2.e90bc2cb31949045.js → 058a98ba.7eb28d5e6dc03565.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4565-67e4c620597965c8.js → 1015-9cba22a5a4554797.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1084-4e66af7376a18db7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1106.3a6410b7b0c70ad4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1127.32fc642f70423506.js +8 -0
- package/apps/pwa/out/_next/static/chunks/{1516.83dd2c1b86b4e507.js → 1142.65d002789ab3af7d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1189-d9b8e1995a831fae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1224.6da98c7ad0eb7dd8.js +34 -0
- package/apps/pwa/out/_next/static/chunks/1370.4e3e2558f111fd5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1514-b7da377fdc4eb17a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1516.dfaceff3fd2d0e0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1577.3c24c32584e10d70.js +286 -0
- package/apps/pwa/out/_next/static/chunks/161.130a569855c4d68c.js +24 -0
- package/apps/pwa/out/_next/static/chunks/1782-59db1b5aa06df38a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1743.563d3168e95825ef.js → 1852.7f7b53991fcb99ef.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1864.16da9556e78a9236.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1b6f6b2a.aff090122be3726e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2341.e8a9135e5b910dd5.js +36 -0
- package/apps/pwa/out/_next/static/chunks/257.10afdbe3520f2fc2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2658.87550e692dc493f6.js +64 -0
- package/apps/pwa/out/_next/static/chunks/2673.85e2f02efae7a85f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2766-bee623b37472ed63.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2794.6d836872b0bf43e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2806.eb57ced1a528ed39.js +1 -0
- package/apps/pwa/out/_next/static/chunks/283.7a121c4910e6dad7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{65ebff95.081daeff622d238e.js → 285adb1a.5654e605dddf86d2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2870.1dc29aa5fc01f09f.js +115 -0
- package/apps/pwa/out/_next/static/chunks/293.fd38e77ce5d48103.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2993-5952a1cd3fd5d441.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3160-95c96f4d2a21dd26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/32-a523427c5bd5ed00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3280.af38002a6424a905.js +90 -0
- package/apps/pwa/out/_next/static/chunks/328bb3ab-6628a1114fe3fb3b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3292-5ddffdb2f517b44f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9917-9e26abc5f7772735.js → 3396-97b97928c49190c9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6196.34d6b229079e9e28.js → 3403.7199205e65124486.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3523.d3231daaf7aba993.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3763.577de3181e1e6ea0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4138-cc56b0938ef72783.js +1 -0
- package/apps/pwa/out/_next/static/chunks/419.736c0d6f426249a7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4255-8350c43d307a8875.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6def8a8e.c81f9ca41028eccf.js → 425cfc4d.fb91158e3971c39f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4352.a4954693499c2714.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4421-f2dcbc6fd80ec013.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4513-51b94aeee37c9905.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{16e57f67.3ea19e893461e611.js → 46bd8bea.2f4b4099172fcdb7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5081.a240b63fad28663a.js → 4759.1f76713aefb87db5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4928-c3b72f99aa588699.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4986-f9fc0283fb325219.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5014.671a7b9f69c2b7b1.js +94 -0
- package/apps/pwa/out/_next/static/chunks/5137.d398e24710b3feb6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5298.0bea74885cabe754.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5315.74c53a39739b11c4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5317-8b1df8d02105cd07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5358-33051f41a2b239af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5388.a2ec02501f714ad5.js +62 -0
- package/apps/pwa/out/_next/static/chunks/5395.e6ac948a2d15058d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5409-f282bf533c151849.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5466.d0f4aba9d52acfa8.js +27 -0
- package/apps/pwa/out/_next/static/chunks/5564.3d28b353470fe305.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{9974.e77b4ff4884557b3.js → 5591.a35e7a217734a8b9.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/569.b0cbfb4dee4a167a.js +93 -0
- package/apps/pwa/out/_next/static/chunks/5835-72465b73a8bb8d74.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5941.045d6093139e1f7a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5492-e05e26a033ba80d2.js → 6013-2f769370d8b4c2c6.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6228.47cabb83564dfe54.js +24 -0
- package/apps/pwa/out/_next/static/chunks/6457-8d1993002a87d0fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6513.ef54cfae52351982.js +2 -0
- package/apps/pwa/out/_next/static/chunks/{5408.377c8c543635b81f.js → 6534.1ab00f370db7b105.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6582.13d245bf87df69f1.js +148 -0
- package/apps/pwa/out/_next/static/chunks/6655.c33f6acc2c61bb89.js +149 -0
- package/apps/pwa/out/_next/static/chunks/6731-9d7195af289c8d4c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6733.0be05b1db9279fc5.js +79 -0
- package/apps/pwa/out/_next/static/chunks/6742-90937146253a8b9e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8578.dff22d988cc2b106.js → 6767.1fcfc9b8be83975f.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/6776.06ff1e3b464cc607.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9311.24c8f5ea793253dd.js → 6853.cc5174a9dee59593.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/687-816858f77a396a4e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6888.72c7b8cfb02a7e61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6993.c17c828ac3ef3253.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7076.9f27ef666b0cefdd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7113.1403c5d451804e8c.js +287 -0
- package/apps/pwa/out/_next/static/chunks/7169.9dd603c726c2cd7c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7247-e3ec21f761f86710.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7261-a47b72f96f5199df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7335-5cda81ac90310077.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7356-c2e4af090546e2d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{94.4cfed21c0b781a06.js → 7375.050ea0d72968e49f.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/738-59518742078fda71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7385.a7375f10db73243a.js +77 -0
- package/apps/pwa/out/_next/static/chunks/7445.cf1cf2fe109bcd96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7505.a2057432ab6ef99a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7515.31f45fac1f9c70cb.js +74 -0
- package/apps/pwa/out/_next/static/chunks/7658-d4ce8c72a9548a91.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7725-4f83d5541fbdb81b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8107-0b1ae46bc5bcb788.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8132.bfea2f016ce8d992.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8332.6f0f49df772e163b.js +23 -0
- package/apps/pwa/out/_next/static/chunks/{7483.ba01c6c209b81bba.js → 8398.73a19b39715eda04.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2846.d6a433b8663819a5.js → 8471.8d2a8c74f09c36ff.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/8672.e299832bc7d18ee2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8735.f1ef798a5f260f6f.js +226 -0
- package/apps/pwa/out/_next/static/chunks/{5785-ea8d2c633b6688e3.js → 8767-2f6a634f5abeaa01.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8774-88f67f7d8d53d299.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8782.252e5a405d86e4ed.js +32 -0
- package/apps/pwa/out/_next/static/chunks/8795.32573a185af18c7b.js +41 -0
- package/apps/pwa/out/_next/static/chunks/909-9ed7aa0dba804316.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9100.22b0301256827007.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9140-dde77575570bc71e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4593.10f5b9bd702d4a6c.js → 9143.ff14585db1d275ff.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9292-a7ad9a01c7044b93.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9517.00627dc51b02821c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9725.dcbb585652d8e9c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9761.a3ebf5c389c24ddc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4204.a409ab6250c0f6a8.js → 9907.49be0fcadaf214b5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9972.834d2b2b7d48f1ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9995-1a90486f5ae01546.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{973cbf1b.3bbcf2b41548eca7.js → a435ad95.577add051b4facb2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-83372d8b5863ebf7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d69256d7613c140a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-352c5e9ba3f9b858.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-69f1d725524201a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-fa46d4588e8442c2.js → page-a5635eba0d73b84e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ad9181d84285e4ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/{page-66ad46ed0279feb9.js → page-86feb08080261a2f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-ffa15987e4756d03.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-11a3ab44ac327cc1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-6309b11c4264d24d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-8800472079612e87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-d387bf3f2301882a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-048f88d8c8658da6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6c14f9739b7f6880.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-2834f44f64e98d74.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-83372d8b5863ebf7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-a13df6f88e824887.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-8a4397248754cf2b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-daf0bd329360a336.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-f7ef1c28764cb476.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-61e74f28b9353dac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/{page-646b50f63b6fe732.js → page-8aaa6dedc4c10dfb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-294602ba649be829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-5fa5f41ed3fce323.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-6f131b51193a36f9.js → page-33bf667a5fb297bf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-5ae3cbd6e5dba515.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-eb867d16ad6fdede.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1ab789fa68682f7e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6fd41b5b6ff13a71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fb3d5f7642c99fba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-70f705b2b5ed42ca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-c9c93b358a7667b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1563c556b81c96ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ce89c20c45b3a673.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-423ae63d786f4ee9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-591a5378a4c4447c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-a250496b19a5824b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-c36a9277febc5911.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-83372d8b5863ebf7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-29900ed0011b2c83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-a5de57edc6d7f942.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-16bdd4c9f40498df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-75e946e6e71cc6d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-9eb56166774eb256.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-1c5f9ef35dbb22c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-657ff9985e508498.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-22dc72499da68fb2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9f92737b8766009a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-094ad334e40f8169.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-8bcd379852ff6287.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-6b04413f280cd344.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{f4dfbfc0.a69fb12f854882aa.js → bc324b7c.02a09dd93f6a399b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/de70ab42-d28d47437208d458.js +1 -0
- package/apps/pwa/out/_next/static/chunks/f800c5e3.46dbd7f2af8c3fce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/f8bc19ad.47579f6d684b0760.js +122 -0
- package/apps/pwa/out/_next/static/chunks/framework-ca9ac4609fb9fed8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-0dd08d32d15a030f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-f0399d33955c4e01.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-d42caca6f8ac2211.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-42e713c13aa41ca8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-8fbf8f61a377aa16.js +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/graphs/release/release-loop.yaml +6 -2
- package/package.json +1 -1
- package/plugins/agent-team/agents/research.md +1 -0
- package/scripts/ci-typecheck-changed.ts +3 -2
- package/scripts/coord-channel-watch.sh +26 -6
- package/scripts/coord-role-pack.ts +143 -0
- package/scripts/lib/morning-report-options.ts +41 -0
- package/scripts/pr-land-extra-remote-gates.ts +49 -0
- package/scripts/release-loop/gate-batch-safe.ts +23 -0
- package/scripts/release-loop/gate-history.ts +422 -0
- package/scripts/release-loop/gate-node.ts +310 -46
- package/scripts/release-loop/gate-triage-node.ts +190 -0
- package/scripts/release-loop/spawn-lane.ts +68 -0
- package/scripts/release-loop/tui-node-checks.ts +23 -0
- package/scripts/release-loop/version-node.ts +62 -4
- package/scripts/test-deterministic.ts +41 -12
- package/scripts/usage-rollup.ts +11 -3
- package/src/acp/core-turn-bridge.ts +98 -22
- package/src/acp/elanous-extensions.ts +2 -0
- package/src/acp/server.ts +2 -0
- package/src/agent/ref-grounding.ts +18 -0
- package/src/agent-substrate/pr-reviewer.ts +29 -21
- package/src/budget/pty-usage-reemit.ts +7 -0
- package/src/budget/run-usage-rollup.ts +9 -0
- package/src/budget/usage-daily-store.ts +98 -0
- package/src/capture/tui-self-report.ts +22 -4
- package/src/chat/index.ts +31 -10
- package/src/chat/pickers/modal-runtime.ts +1 -0
- package/src/chat/pickers/modals.ts +3 -1
- package/src/chat/turn-typeahead.ts +123 -16
- package/src/cli/dashboard-name-flag.ts +48 -0
- package/src/cli/doctor-cli.ts +80 -0
- package/src/cli/log-event-names.ts +12 -0
- package/src/cli/msg-cli.ts +45 -2
- package/src/cli/pr-cli.ts +382 -105
- package/src/cli/pr-land-heavy-remote.ts +233 -0
- package/src/cli/pr-land-overlap-evidence.ts +104 -5
- package/src/cli/pty-takeover-cli.ts +125 -16
- package/src/cli/release-cli.ts +44 -2
- package/src/cli/remote-resolve.ts +2 -1
- package/src/cli/seat-cli.ts +26 -16
- package/src/cli/tasks-cli.ts +8 -2
- package/src/cli/usage-cli.ts +146 -12
- package/src/cli/usage-daily-cli.ts +84 -0
- package/src/context-bus/context-now.ts +82 -5
- package/src/core-turn/auth-rejected-notice.ts +41 -0
- package/src/core-turn/run-core-turn.ts +13 -2
- package/src/core-turn/run-goal-loop.ts +17 -1
- package/src/core-turn/short-question.ts +45 -12
- package/src/core-turn/types.ts +7 -0
- package/src/dashboard/acp-active-model.ts +40 -0
- package/src/dashboard/auto-compact-runtime.ts +2 -0
- package/src/dashboard/boot-banner.ts +80 -0
- package/src/dashboard/dashboard-status-lines.ts +11 -0
- package/src/dashboard/detail-viewer-runtime.ts +15 -2
- package/src/dashboard/event-loop-stall-monitor.ts +4 -0
- package/src/dashboard/goal-loop-thinking.ts +16 -0
- package/src/dashboard/hitl-boot.ts +9 -4
- package/src/dashboard/index.ts +228 -387
- package/src/dashboard/input/chat-main-entry-runtime.ts +2 -0
- package/src/dashboard/input/chat-main-log-actions.ts +4 -0
- package/src/dashboard/input/chat-main-log-command.ts +12 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +172 -3
- package/src/dashboard/input/chat-main-session.ts +6 -2
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/chat-main-turn.ts +2 -1
- package/src/dashboard/input/compact-prepass-recovery.ts +97 -0
- package/src/dashboard/input/dashboard-chord-actions.ts +10 -1
- package/src/dashboard/input/dashboard-chord-runtime.ts +2 -0
- package/src/dashboard/input/external-input-host.ts +45 -0
- package/src/dashboard/input/log-fold-binding.ts +18 -0
- package/src/dashboard/input/mouse-wiring.ts +17 -4
- package/src/dashboard/input/turn-steer-bridge.ts +94 -0
- package/src/dashboard/log-click-runtime.ts +5 -3
- package/src/dashboard/running-build-status.ts +74 -0
- package/src/dashboard/seat-boot-preamble.ts +113 -0
- package/src/dashboard/seat-local-instructions.ts +305 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +100 -28
- package/src/dashboard/slash-runtime/model-choices.ts +35 -0
- package/src/dashboard/term-slash-runtime.ts +15 -0
- package/src/dashboard/turn-preamble.ts +30 -2
- package/src/dashboard/turn-session-layers.ts +176 -0
- package/src/dashboard/turn-stream-formatter.ts +14 -6
- package/src/dashboard/turn-stream-presentation-applier.ts +8 -0
- package/src/domains/release-tool.ts +8 -9
- package/src/domains/surface-events.ts +4 -1
- package/src/domains/watch-default-scheduler.ts +8 -9
- package/src/fold-stack.ts +24 -1
- package/src/git-fs/dirty.ts +32 -4
- package/src/git-fs/index.ts +43 -1
- package/src/graph-runner/runner.ts +1 -0
- package/src/harness/harness-gc.ts +32 -5
- package/src/index.ts +14 -1
- package/src/input/external-input-queue.ts +219 -0
- package/src/interactive-terminal-modal.ts +13 -0
- package/src/llm/route-decision.ts +25 -0
- package/src/llm-stream-retry-display.ts +59 -0
- package/src/llm.ts +253 -55
- package/src/log-entry.ts +3 -3
- package/src/log-pane/search.ts +29 -4
- package/src/loops/agent-reply.ts +256 -0
- package/src/loops/budget.ts +37 -7
- package/src/loops/loop-cli.ts +3 -2
- package/src/loops/msg-address.ts +57 -0
- package/src/loops/msg-wake.ts +282 -0
- package/src/loops/orchestrator/inbox.ts +60 -3
- package/src/loops/orchestrator/tick.ts +24 -4
- package/src/loops/registry.ts +42 -4
- package/src/memory.ts +20 -5
- package/src/native-tool-catalog.ts +125 -0
- package/src/nexus/api/http-server.ts +5 -0
- package/src/nexus/api/ops-api.ts +2 -0
- package/src/nexus/api/project-autopsy.ts +127 -0
- package/src/nexus/api/terminals.ts +3 -0
- package/src/nexus/api/workflow-approvals.ts +2 -0
- package/src/nexus/onboarding/first-boot-wizard.ts +56 -2
- package/src/oauth/codex-account-store.ts +15 -3
- package/src/oauth/codex-billing-route.ts +31 -0
- package/src/ops/overview-collect.ts +19 -2
- package/src/panes/log-pane.ts +67 -8
- package/src/persona/presets.ts +44 -0
- package/src/plugins/maker/wizard-generate.ts +6 -4
- package/src/preview/terminal.ts +14 -1
- package/src/prompt-cache/types.ts +2 -0
- package/src/prompt-enhance/enhance.ts +24 -8
- package/src/prompt-library/universal-preamble.ts +273 -56
- package/src/pty-shell/pty-control-ipc.ts +4 -1
- package/src/pty-shell/pty-manifest.ts +77 -5
- package/src/pty-shell/registry.ts +19 -2
- package/src/pty-shell/tui-run-state.ts +253 -0
- package/src/release-loop/light-rc.ts +28 -3
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/render.ts +5 -1
- package/src/seat-loop/seat-report.ts +42 -2
- package/src/self-dev/run-supervisor.ts +71 -5
- package/src/self-dev/shard-aggregate.ts +2 -0
- package/src/self-dev/shard-run.ts +23 -2
- package/src/self-health/signatures.ts +132 -0
- package/src/self-implement/doctor-visit.ts +118 -0
- package/src/self-implement/gate-cli.ts +11 -2
- package/src/self-implement/goal-author-decompose.ts +80 -16
- package/src/self-implement/goal-author.ts +114 -72
- package/src/self-implement/goal-authoring-grounding.ts +1 -1
- package/src/self-implement/goal-file-name.ts +65 -0
- package/src/self-implement/ground-goal.ts +2 -1
- package/src/self-implement/host-regate.ts +14 -0
- package/src/self-implement/review-mustfix-class.ts +115 -0
- package/src/self-implement/run-ledger.ts +111 -7
- package/src/self-implement/running-runs.ts +10 -6
- package/src/self-implement/self-implement-runtime.ts +32 -0
- package/src/session/pending-input.ts +62 -11
- package/src/session-runtime/index.ts +7 -1
- package/src/skills/tools/ops-ledger.ts +707 -0
- package/src/skills/tools/persistent-grounding.ts +47 -7
- package/src/skills/tools/shell.ts +117 -1
- package/src/status/bar.ts +32 -2
- package/src/status/status-provider-info.ts +58 -0
- package/src/task-agent/rejudge-on-head.ts +4 -1
- package/src/task-agent/remote-rejudge-bind.ts +34 -5
- package/src/task-agent/repair-cycle.ts +13 -0
- package/src/task-orchestrator/surfaces/kubectl-transient-retry.ts +51 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +63 -7
- package/src/task-orchestrator/surfaces/pod-install-slots.ts +6 -11
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +76 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +107 -33
- package/src/terminal/session-registry.ts +6 -0
- package/src/thinking-line.ts +12 -3
- package/src/tool-runtime/index.ts +4 -0
- package/src/tool-runtime/ops-ledger-runtimes.ts +84 -0
- package/src/tool-runtime/ref-consult-runtime.ts +17 -2
- package/src/tool-runtime/run-shell-runtime.ts +4 -1
- package/src/tool-runtime/self-cognition-runtimes.ts +5 -1
- package/src/tui.ts +5 -0
- package/src/user-config.ts +54 -6
- package/src/ux-sim/fake-llm.ts +29 -0
- package/src/ux-sim/in-process-cli.ts +175 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1027.a0f04663d24c2779.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +0 -1
- package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +0 -36
- package/apps/pwa/out/_next/static/chunks/1146.80d15ea7c6e6ee95.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1157.f08bf2b70915e176.js +0 -148
- package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1454-29d1d773d5996a49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2528.3868070ef1be69f9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2697.76ca2ac3efef6f3b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +0 -32
- package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3143.257997a5f1ed79df.js +0 -34
- package/apps/pwa/out/_next/static/chunks/3259-86f3be56e43eaf6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3309.364573ceedbdfd5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +0 -287
- package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4084.15ecaf4240bd9e77.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +0 -8
- package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +0 -149
- package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +0 -1
- package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/599-56f2c0a5cc4a7295.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +0 -23
- package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +0 -77
- package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +0 -64
- package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +0 -62
- package/apps/pwa/out/_next/static/chunks/7752.5cbdd0b433c54af9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8085-1e5fce59500a2cc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +0 -226
- package/apps/pwa/out/_next/static/chunks/83a80514-b897b64df43ce108.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +0 -93
- package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +0 -115
- package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +0 -74
- package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/949.1e7d45ccb71580aa.js +0 -90
- package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9938.b23e4d4dfa0114cd.js +0 -79
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-5ab1e47978577c5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-24453f6a302816b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-6c131d30bb1cf871.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-dc0772b11861af51.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-5159dc8752c6cd29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-c5a2478861c08b87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-f722a9dec084e08b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-256ffd365d32e100.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e0de78ae7b99f01c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-cfbdc44b708d9801.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-4c741eb760f2f77c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-e9ba98f5f1440a21.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-dafc901bb1b72b5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-2f6f303fa114ec24.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-1634081c5272006c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-ced0bcfc6542b3fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-bb1f05cd51c38944.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-db069b48a59c8c00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-f736324afa2117c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-435f5e2faf02bc01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-497e0eedf20e7890.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-a8d28fdf995e16ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-8966452228753c5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fd5d18656cb432b6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-5663779cb1a37609.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-66a67eb19ebd976b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-3b492aa78cf3c4a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c71267e7681da982.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-a21d1e1797172692.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-cb249e81ed339318.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-781cfc5114e097da.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-478157214db6a023.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-86141f12cf090b7f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-7256c73bb1c36751.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-5c738ca7adef3de5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-0138c8091ec17224.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-cc2f24f16d85e735.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-979d318a534e92da.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-182d394f7e6e096b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-21050928a697ed7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-44b9d807005a9030.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-601fb77340e63c9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-75d3fb5d47af0edf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-11bf9e5725a72c22.js +0 -1
- package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +0 -1
- package/apps/pwa/out/_next/static/chunks/e117f801.e92bf10242653497.js +0 -1
- package/apps/pwa/out/_next/static/chunks/e87d89b9.2e71c0ae475d28a1.js +0 -122
- package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +0 -1
- package/src/dashboard/bench-slash-runtime.ts +0 -40
- package/src/dashboard/input/search-modal-router.ts +0 -9
- package/src/dashboard/modals/pane-key-router.ts +0 -27
- package/src/dashboard/view-slash-runtime.ts +0 -48
- /package/apps/pwa/out/_next/static/{y1ltt7oCZxVpC6zVPhZ2O → cIpv5nU9AycwYWZI9H589}/_ssgManifest.js +0 -0
package/src/dashboard/index.ts
CHANGED
|
@@ -6,10 +6,12 @@
|
|
|
6
6
|
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
7
7
|
import { join } from 'path';
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
|
+
import { createRunningBuildStatus } from './running-build-status.js';
|
|
10
|
+
import { reportTuiTurn } from '../pty-shell/tui-run-state.js';
|
|
9
11
|
import { createStaleInstallCheck, formatStaleInstallNotice, readCurrentInstalledCommit, readDashboardBootCommit, STALE_INSTALL_CHECK_INTERVAL_MS, versionedDashboardInstallDir } from './stale-install-check.js';
|
|
10
12
|
import { spawn, spawnSync } from 'node:child_process';
|
|
11
13
|
import { $ } from 'bun';
|
|
12
|
-
import { LOCAL_SKILLS_DIR,
|
|
14
|
+
import { LOCAL_SKILLS_DIR, DATA_DIR, OBSIDIAN_VAULT } from '../config.js';
|
|
13
15
|
import { dispatchDashboardSessionRuntimeTool } from './session-runtime-dispatch.js';
|
|
14
16
|
import { nextChatScrollOffset } from '../chat/log-scroll-key.js';
|
|
15
17
|
import { suggestProjectForFolder } from '../project/project-store.js';
|
|
@@ -160,8 +162,8 @@ function loadLastSelection(): LastSelection | null {
|
|
|
160
162
|
}
|
|
161
163
|
import { getLocalSkills, executeSync } from '../sync.js';
|
|
162
164
|
import { computeDiff } from '../smart.js';
|
|
163
|
-
import {
|
|
164
|
-
import { C, ICONS, ansi, initTui, closeTui, setExitNotice, readKey, setKeyTracer, render,
|
|
165
|
+
import { summarizeDiff, isAnalyzerAvailable } from '../grok.js';
|
|
166
|
+
import { C, ICONS, ansi, initTui, closeTui, setExitNotice, readKey, setKeyTracer, render, termSize, pad, stripAnsi, hLine, showHelp, invalidateRenderCacheRow, wrapAnsiByWidth, injectKey } from '../tui.js';
|
|
165
167
|
import { paintCursor, type CursorState } from '../display/cursor-state.js';
|
|
166
168
|
import type { CursorDecision } from '../display/cursor-owner.js';
|
|
167
169
|
import type { Key, RenderOptions } from '../tui.js';
|
|
@@ -169,7 +171,6 @@ import {
|
|
|
169
171
|
createTurnTypeaheadState,
|
|
170
172
|
applyTurnTypeaheadKey,
|
|
171
173
|
renderTurnTypeaheadQueueRow,
|
|
172
|
-
drainTurnTypeaheadOnce,
|
|
173
174
|
renderTurnTypeaheadEcho,
|
|
174
175
|
} from '../chat/turn-typeahead.js';
|
|
175
176
|
import { dispatchStreamingTurnTypeaheadSubmission } from './input/streaming-turn-typeahead.js';
|
|
@@ -180,13 +181,11 @@ import type { CoreTurnDispatchTool } from '../core-turn/index.js';
|
|
|
180
181
|
// ACP pair (see `bootDashboardAcpSession`), which internally routes
|
|
181
182
|
// to streamLLMWithTools via runCoreTurn.
|
|
182
183
|
import {
|
|
183
|
-
startSpinner,
|
|
184
184
|
createChatState,
|
|
185
185
|
buildContext,
|
|
186
186
|
formatResponse,
|
|
187
187
|
onEscAbort,
|
|
188
188
|
attachStreamingKeys,
|
|
189
|
-
SLASH_COMMANDS,
|
|
190
189
|
type InputResult,
|
|
191
190
|
type TextInputExternalSubmitRequest,
|
|
192
191
|
} from '../chat/index.js';
|
|
@@ -198,6 +197,7 @@ import {
|
|
|
198
197
|
} from '../chat/hud-segments-wire.js';
|
|
199
198
|
import { PreviewTerminal } from '../preview/terminal.js';
|
|
200
199
|
import { startThinking, startPinnedThinking, type ThinkingHandle } from '../thinking-line.js';
|
|
200
|
+
import { goalLoopIterationThinking } from './goal-loop-thinking.js';
|
|
201
201
|
import { debug, getAmbientSessionId } from '../debug/log.js';
|
|
202
202
|
import { startEventLoopStallMonitor, thinkingVerbFromFooter } from './event-loop-stall-monitor.js';
|
|
203
203
|
import { getPushcutClient } from '../pushcut/client.js';
|
|
@@ -220,11 +220,6 @@ import {
|
|
|
220
220
|
registerAction as inputCoreRegisterAction,
|
|
221
221
|
addDefaultBinding as inputCoreAddDefaultBinding,
|
|
222
222
|
initUserBindings as initInputCoreUserBindings,
|
|
223
|
-
readAuditTail,
|
|
224
|
-
isInputAuditEntry,
|
|
225
|
-
formatAuditEntry,
|
|
226
|
-
parseDuration as parseAuditDuration,
|
|
227
|
-
runRebindCommand,
|
|
228
223
|
type DispatchContext as InputCoreDispatchContext,
|
|
229
224
|
type MouseInputEvent as InputCoreMouseInputEvent,
|
|
230
225
|
type RouteCallbacks as InputCoreRouteCallbacks,
|
|
@@ -255,7 +250,6 @@ import { wireInputModeContextBridge } from '../input-core/mode-context-bridge.js
|
|
|
255
250
|
import { getDashboardContextKeyService } from './context/keys.js';
|
|
256
251
|
import {
|
|
257
252
|
getDashboardContextMenuRegistry,
|
|
258
|
-
handleForPill,
|
|
259
253
|
} from './context-menu/registry.js';
|
|
260
254
|
import { createTransientOverlayHost } from '../display/transient-overlay-host.js';
|
|
261
255
|
import { configureThemeIconsGetter } from '../theme/icons.js';
|
|
@@ -267,7 +261,6 @@ import {
|
|
|
267
261
|
} from '../log-pane/buffer-policy.js';
|
|
268
262
|
import { publishFocusContextKeysFromService } from './context/focus-bridge.js';
|
|
269
263
|
import {
|
|
270
|
-
modalBlocksBackground,
|
|
271
264
|
modalParticipatesInViewMode,
|
|
272
265
|
renderModalStack,
|
|
273
266
|
topBlockingForegroundModalSurface,
|
|
@@ -285,7 +278,6 @@ import {
|
|
|
285
278
|
debugWorkbenchIndexForTarget,
|
|
286
279
|
getDebugCompanionSpec,
|
|
287
280
|
listDebugCompanionKeys,
|
|
288
|
-
resolveDebugCompanionTargets,
|
|
289
281
|
type DebugWorkbenchPane,
|
|
290
282
|
} from '../window/debug-window-consumers.js';
|
|
291
283
|
import {
|
|
@@ -295,7 +287,6 @@ import {
|
|
|
295
287
|
} from '../window/tablet-workspace-policy.js';
|
|
296
288
|
import {
|
|
297
289
|
type PromptFrame,
|
|
298
|
-
bottomFixedRowsForPromptFrame,
|
|
299
290
|
resolvePromptFrame,
|
|
300
291
|
} from '../display/prompt-frame.js';
|
|
301
292
|
import { resolveBottomSlotBounds } from '../display/bottom-slot.js';
|
|
@@ -341,27 +332,8 @@ import { attachDashboardQuickPassConsumers } from './input/control-signal-consum
|
|
|
341
332
|
import { resolveDashboardChatMainSlashCommand } from './input/chat-main-slash-command.js';
|
|
342
333
|
import { TuiChatPersonaSelection, tuiChatPersonaMessages } from './slash-runtime/chat-persona.js';
|
|
343
334
|
import { awaitGlobalPersonaLoad } from '../persona/global-registry.js';
|
|
344
|
-
import { resolveDashboardChatMainCacheCommand } from './input/chat-main-cache-command.js';
|
|
345
|
-
import {
|
|
346
|
-
dashboardDeltaHelpLines,
|
|
347
|
-
resolveDashboardChatMainDeltaCommand,
|
|
348
|
-
} from './input/chat-main-delta-command.js';
|
|
349
|
-
import {
|
|
350
|
-
DASHBOARD_SETUP_STEPS,
|
|
351
|
-
dashboardSetupHelpLines,
|
|
352
|
-
resolveDashboardChatMainSetupCommand,
|
|
353
|
-
} from './input/chat-main-setup-command.js';
|
|
354
335
|
import { createDashboardInlineSetupFlow } from './setup-inline.js';
|
|
355
|
-
import { resolveDashboardChatMainThemeCommand } from './input/chat-main-theme-command.js';
|
|
356
|
-
import { resolveDashboardChatMainLogCommand } from './input/chat-main-log-command.js';
|
|
357
336
|
import { noProviderReply } from './input/no-provider-reply.js';
|
|
358
|
-
import {
|
|
359
|
-
dashboardLogHelpLines,
|
|
360
|
-
resolveDashboardLogFilterAction,
|
|
361
|
-
resolveDashboardLogSearchAction,
|
|
362
|
-
resolveDashboardLogSizeAction,
|
|
363
|
-
resolveDashboardLogTurnAction,
|
|
364
|
-
} from './input/chat-main-log-actions.js';
|
|
365
337
|
import type { LogTurnSeparatorMode } from './log-turn-separator-mode.js';
|
|
366
338
|
import { createDashboardChatMainInteractionOpts } from './input/chat-main-interaction-opts.js';
|
|
367
339
|
import { createDashboardChatMainCompletionOpts } from './input/chat-main-completion-opts.js';
|
|
@@ -379,6 +351,7 @@ import {
|
|
|
379
351
|
matchDashboardChordAction,
|
|
380
352
|
} from './input/dashboard-chord-actions.js';
|
|
381
353
|
import { createDashboardChordRuntime } from './input/dashboard-chord-runtime.js';
|
|
354
|
+
import { registerLogFoldInputBinding } from './input/log-fold-binding.js';
|
|
382
355
|
import { handleDashboardDisplayKeyRoute } from './input/dashboard-display-key-route.js';
|
|
383
356
|
import { routeDashboardPriorityKey } from './input/dashboard-priority-key-route.js';
|
|
384
357
|
import { shouldPassthroughDashboardHostOwnedInputCoreAction } from './input/input-core-host-action.js';
|
|
@@ -425,7 +398,6 @@ import {
|
|
|
425
398
|
} from './voice-host-boot.js';
|
|
426
399
|
import {
|
|
427
400
|
bootDashboardAutoTts,
|
|
428
|
-
handleAutoTtsSlash,
|
|
429
401
|
} from './auto-tts/auto-tts-host-boot.js';
|
|
430
402
|
import {
|
|
431
403
|
bootDashboardVoiceChat,
|
|
@@ -443,7 +415,6 @@ import {
|
|
|
443
415
|
import {
|
|
444
416
|
resolveLegacyForegroundModalFocusPlan,
|
|
445
417
|
resolveLegacyForegroundModalDemotionTransition,
|
|
446
|
-
resolveLegacyForegroundModalFallbackPane,
|
|
447
418
|
} from './input/foreground-modal-focus.js';
|
|
448
419
|
import {
|
|
449
420
|
resolveDashboardInitialWorkingFocus,
|
|
@@ -460,18 +431,10 @@ import { addHint, listHints, removeHint, resetScope } from '../tool-hints/regist
|
|
|
460
431
|
import { resetGateCache } from '../tool-hints/gate.js';
|
|
461
432
|
import { collectSignals, signalsSummary } from '../tool-hints/signals.js';
|
|
462
433
|
import { resetProbes } from '../tool-hints/probe.js';
|
|
463
|
-
import {
|
|
464
|
-
addAllowed,
|
|
465
|
-
hostOf,
|
|
466
|
-
listAllowed,
|
|
467
|
-
rateLimitStatus,
|
|
468
|
-
removeAllowed,
|
|
469
|
-
} from '../tool-hints/api-allowlist.js';
|
|
470
434
|
import type { HintScope } from '../tool-hints/types.js';
|
|
471
|
-
import { listSkillNames, describeSkill } from '../skills/runner.js';
|
|
472
435
|
import { globalAgentRegistry, type AgentToolCallEvent } from '../agent/registry.js';
|
|
473
436
|
import { SELF_IMPLEMENT_TOOL_NAMES } from '../boot/daemon-tools/self-implement-names.js';
|
|
474
|
-
import {
|
|
437
|
+
import { type FoldMode } from '../log-entry.js';
|
|
475
438
|
import { renderToolCallEvent, renderToolResultVariants } from '../chat/tool-render/index.js';
|
|
476
439
|
import { FoldStack } from '../fold-stack.js';
|
|
477
440
|
import { getSkillIndex, reloadSkillIndex, applySkillFilter, skillIndexProblems } from '../skills/index.js';
|
|
@@ -546,7 +509,11 @@ export function formatEscAbortWaitingTargets(targets: readonly string[]): string
|
|
|
546
509
|
export function settleEscAbortPendingLines(lines: string[], fromIndex: number): void {
|
|
547
510
|
let settled = false;
|
|
548
511
|
for (let index = fromIndex; index < lines.length;) {
|
|
549
|
-
const line = lines[index]
|
|
512
|
+
const line = lines[index];
|
|
513
|
+
if (typeof line !== 'string') {
|
|
514
|
+
index += 1;
|
|
515
|
+
continue;
|
|
516
|
+
}
|
|
550
517
|
const isAbortPending = line.startsWith(' ⏳ 중단 요청됨 — ');
|
|
551
518
|
const isAbortRepeat = /^ ⏳ ESC 재시도 \d+회 — /.test(line);
|
|
552
519
|
if (!isAbortPending && !isAbortRepeat) {
|
|
@@ -625,38 +592,33 @@ export function getEscAbortRunningCount(
|
|
|
625
592
|
return Math.max(1, registeredRunning);
|
|
626
593
|
}
|
|
627
594
|
}
|
|
628
|
-
import { resetOnboardingMarker } from '../onboarding.js';
|
|
595
|
+
import { needsOnboarding, resetOnboardingMarker } from '../onboarding.js';
|
|
629
596
|
import {
|
|
630
597
|
getUserConfig, reloadUserConfig, saveUserConfig,
|
|
631
598
|
rotateNextProvider, jumpToRotationEntry, rotationEntryLabel, applyRotationEntry,
|
|
632
|
-
|
|
599
|
+
resolveAcpHopCapFromConfig,
|
|
633
600
|
VOICE_HARDCODED_DEFAULTS,
|
|
634
601
|
} from '../user-config.js';
|
|
635
|
-
import {
|
|
636
|
-
import {
|
|
637
|
-
import
|
|
602
|
+
import { streamLLM, anyProviderAvailable, getProviderForConfig, nextReasoningLevel, reasoningLevelLabel, effectiveReasoningLevel, modelSupportsReasoning, type LLMMessage, type LLMToolSpec } from '../llm.js';
|
|
603
|
+
import { currentRouteDecision, formatRouteDecisionSummary } from '../llm/route-decision.js';
|
|
604
|
+
import { resolveDashboardActiveModel } from './acp-active-model.js';
|
|
638
605
|
import { getModelFamily, getModelTier } from '../models/prompts.js';
|
|
639
606
|
import { buildPromptInjection, getPromptBankStore } from '../prompt-bank/index.js';
|
|
640
|
-
import { getInputHistoryStore
|
|
607
|
+
import { getInputHistoryStore } from '../input-history.js';
|
|
641
608
|
import { inspectActiveProvider } from '../provider-summary.js';
|
|
609
|
+
import { createStatusProviderInfoReader } from '../status/status-provider-info.js';
|
|
642
610
|
import { activeCodexAccountView } from '../oauth/codex-account-store.js';
|
|
643
|
-
import { buildDashboardStatusLines } from './dashboard-status-lines.js';
|
|
644
|
-
import { readSlashContextNow, seatsNowLine } from '../context-bus/context-now-surfaces.js';
|
|
611
|
+
import { buildDashboardStatusLines, readDashboardSeatsNow, type DashboardStatusLinesInput } from './dashboard-status-lines.js';
|
|
645
612
|
import { buildFirstScreenBand, resolveTuiDaemonLink, type TuiDaemonLink } from './first-screen-band.js';
|
|
646
613
|
import { detectLocale } from '../expression/locale.js';
|
|
647
614
|
import { runNexusShow, type NexusShowResult } from '../cli/nexus-show.js';
|
|
648
615
|
import {
|
|
649
|
-
workingDirSegment, sessionCwdSegment, modelSegment, gitSegment,
|
|
650
|
-
ctxBarSegment, costSegment, speedSegment, elapsedSegment, cacheSegment,
|
|
651
|
-
ptyShellCountSegment,
|
|
652
|
-
voiceCostSegment,
|
|
653
616
|
type GitSegmentState,
|
|
654
617
|
} from '../status/bar.js';
|
|
655
618
|
// PR-S1V.5 — voice month-to-date USD pill on the secondary status row.
|
|
656
619
|
// The tracker is process-wide so the same singleton is read here and
|
|
657
620
|
// updated by `voice-input-bridge.transcribe` (TUI path) + daemon REST
|
|
658
621
|
// handler (PWA path).
|
|
659
|
-
import { globalVoiceCostTracker } from '../voice/cost-tracker.js';
|
|
660
622
|
import { createDashboardMouseWiring } from './input/mouse-wiring.js';
|
|
661
623
|
import { createMouseConversationPopupRuntime } from './input/mouse-conversation-popup-runtime.js';
|
|
662
624
|
import { createMouseModalHitRuntime } from './input/mouse-modal-hit-runtime.js';
|
|
@@ -740,7 +702,7 @@ import { createDashboardContextMenuFeedbackRuntime } from './context-menu-feedba
|
|
|
740
702
|
import { createDashboardStatusFeedbackRuntime } from './status-feedback-runtime.js';
|
|
741
703
|
import { createDashboardTransferFeedbackRuntime } from './transfer-feedback-runtime.js';
|
|
742
704
|
import { createDashboardFinderFeedbackRuntime } from './finder-feedback-runtime.js';
|
|
743
|
-
import { createDashboardTermSlashRuntime } from './term-slash-runtime.js';
|
|
705
|
+
import { createDashboardTermSlashRuntime, resolveTuiShellSeat } from './term-slash-runtime.js';
|
|
744
706
|
import { createDashboardShellSlashRuntime } from './shell-slash-runtime.js';
|
|
745
707
|
import { createDashboardRunSkillSlashRuntime } from './run-skill-slash-runtime.js';
|
|
746
708
|
import { createDashboardSkillTriggersSlashRuntime } from './skill-triggers-slash-runtime.js';
|
|
@@ -790,7 +752,6 @@ import { createPfcScreenshotAttacher, type PfcScreenshotAttacher } from '../cond
|
|
|
790
752
|
import { createStatusShellPostureRuntime } from './status-shell-posture-runtime.js';
|
|
791
753
|
import { createTerminalHostFacade } from '../shell-runner/terminal-host-facade.js';
|
|
792
754
|
import {
|
|
793
|
-
buildTerminalMouseIntentEvent,
|
|
794
755
|
interpretTerminalSurfaceIntent,
|
|
795
756
|
} from './terminal-surface-intent.js';
|
|
796
757
|
import {
|
|
@@ -821,15 +782,12 @@ import { bootDashboardApproverRuntimes } from './approver-runtime-boot.js';
|
|
|
821
782
|
import { bootDashboardCaptureSourceProviders } from './capture-source-provider-boot.js';
|
|
822
783
|
import { bootDashboardContextMenuProviders } from './context-menu-provider-boot.js';
|
|
823
784
|
import { bootDashboardContextMenuRegistry } from './context-menu-registry-boot.js';
|
|
824
|
-
import { buildPillMenu } from '../ui/context-menu-registry.js';
|
|
825
|
-
import { createActionPickerRecipe } from '../mouse-action-recipes.js';
|
|
826
|
-
import type { PopupPlacement } from '../ui/chrome/picker-popup-placement.js';
|
|
827
|
-
import { deriveSubmenuPopupRoleTheme } from '../ui/submenu-popup-theme.js';
|
|
828
785
|
import { bootDashboardContextRuntime } from './context-runtime-boot.js';
|
|
829
786
|
import { bootDashboardContextWindowRuntime } from './context-window-runtime-boot.js';
|
|
830
787
|
import { bootDashboardEagerTools } from './eager-tool-boot.js';
|
|
831
788
|
import { bootDashboardEmbodiedTools } from './embodied-tools-boot.js';
|
|
832
789
|
import { bootDashboardHitl } from './hitl-boot.js';
|
|
790
|
+
import { bootBannerStatusLines, normalizeBootBannerMode, renderMinimalBootBand, type BootBannerHeld } from './boot-banner.js';
|
|
833
791
|
import { attachDashboardFilePathToken } from './file-path-attachment.js';
|
|
834
792
|
import { bootDashboardSlashExecutor } from './slash-executor-boot.js';
|
|
835
793
|
import { buildDashboardSlashRegistry, type DashboardSlashContext } from './slash-runtime/index.js';
|
|
@@ -880,14 +838,14 @@ import {
|
|
|
880
838
|
} from '../dashboard-pane-context-menu.js';
|
|
881
839
|
// writeClipboard imported below with other clipboard helpers (line ~185).
|
|
882
840
|
import {
|
|
883
|
-
|
|
841
|
+
paneAtColumn, paneNavLabel,
|
|
884
842
|
type PaneNavHitArea,
|
|
885
843
|
} from './panes/nav.js';
|
|
886
844
|
import { getSessionCwd, setSessionCwd, subscribeSessionCwd, pickSwdTargetFromBrowser } from '../session/working-dir.js';
|
|
887
845
|
import {
|
|
888
846
|
getGitStatusView,
|
|
889
847
|
subscribeGitChanges,
|
|
890
|
-
|
|
848
|
+
refreshDirtyAsync as refreshGitDirtyAsync,
|
|
891
849
|
} from '../git-fs/index.js';
|
|
892
850
|
import { getPty, listPty, requestPtyTakeover } from '../pty-shell/registry.js';
|
|
893
851
|
import { listPtyManifestRowsAt } from '../pty-shell/pty-manifest.js';
|
|
@@ -899,16 +857,13 @@ import { formatPtyCallLine, formatPtyResultLine } from '../pty-activity-log.js';
|
|
|
899
857
|
import { getSessionMetrics } from '../status/metrics.js';
|
|
900
858
|
import {
|
|
901
859
|
createContextRegistry, tokenizeInput, pruneUnreferenced,
|
|
902
|
-
addAttachment as ctxAdd,
|
|
903
860
|
addAttachmentEx as ctxAddEx,
|
|
904
|
-
clearAll as ctxClearAll, clearLarge as ctxClearLarge,
|
|
905
861
|
dropAttachment as ctxDrop, listAttachments as ctxList,
|
|
906
862
|
totalContextBytes as ctxTotalBytes,
|
|
907
|
-
DEFAULT_LARGE_THRESHOLD_BYTES,
|
|
908
863
|
type Attachment,
|
|
909
864
|
} from '../context.js';
|
|
910
865
|
import { loadAllAttachments } from '../extractors.js';
|
|
911
|
-
import { grabClipboardImage, pruneOldPastes, isClipboardSupported, writeClipboard, writeClipboardDetailed
|
|
866
|
+
import { grabClipboardImage, pruneOldPastes, isClipboardSupported, writeClipboard, writeClipboardDetailed } from '../clipboard/index.js';
|
|
912
867
|
import { startClipboardHistory, type ClipboardHistory } from '../clipboard/history.js';
|
|
913
868
|
import { renderImagePreview } from '../image/preview.js';
|
|
914
869
|
import { isKgpTerminal } from '../kgp/capabilities.js';
|
|
@@ -917,23 +872,19 @@ import { _internal as previewRouterInternal } from '../preview/router.js';
|
|
|
917
872
|
import { showPreviewModal } from './modals/preview.js';
|
|
918
873
|
import { terminalModalRouter } from './input/terminal-modal-router.js';
|
|
919
874
|
import {
|
|
920
|
-
computeDashboardViewMode,
|
|
921
875
|
syncDashboardViewModeToContextKeys,
|
|
922
876
|
type DashboardViewModeSignals,
|
|
923
877
|
} from './runtime/view-mode.js';
|
|
924
878
|
import { IDLE_VIEW_MODE, type ViewMode } from '../input-core/view-mode.js';
|
|
925
|
-
import { createInteractiveTerminalModal } from '../interactive-terminal-modal.js';
|
|
926
879
|
import { showToast } from './render/toast.js';
|
|
927
880
|
import {
|
|
928
881
|
browserWidgetInstanceIdForView,
|
|
929
|
-
shortcutFor,
|
|
930
882
|
} from './modals/pane.js';
|
|
931
883
|
import { showTransientTerminalModal, currentTransientTerminalModal } from './modals/transient.js';
|
|
932
|
-
import {
|
|
884
|
+
import { showLivePaneMultiModal, type PaneMultiModalHandle } from './modals/pane-multi.js';
|
|
933
885
|
import {
|
|
934
886
|
resolveCompanionPopupChrome,
|
|
935
887
|
resolveCompanionPopupTitleControls,
|
|
936
|
-
resolveWindowScopedCompanionPopupChrome,
|
|
937
888
|
} from './modals/companion-popup-chrome.js';
|
|
938
889
|
import {
|
|
939
890
|
resolveDebugPaneMultiChrome,
|
|
@@ -951,30 +902,22 @@ import {
|
|
|
951
902
|
BroadcastBus,
|
|
952
903
|
PreviewSlotAdapter,
|
|
953
904
|
getChannelBus,
|
|
954
|
-
type TerminalPlacement,
|
|
955
905
|
} from '../terminal-matrix/index.js';
|
|
956
|
-
import { resolveTerminalMoveDestination } from '../terminal-matrix/mobility.js';
|
|
957
906
|
import { initElementObservability } from '../element-registry/index.js';
|
|
958
907
|
import {
|
|
959
|
-
armSessionQuickControl,
|
|
960
908
|
createSearchPlannerState,
|
|
961
909
|
buildSessionRuntimeToolSpecs,
|
|
962
910
|
buildSessionDashboardStatusLines,
|
|
963
|
-
buildSessionSurfaceStatusLines,
|
|
964
911
|
consumeSessionQuickControl,
|
|
965
912
|
createSessionPostureState,
|
|
966
913
|
enterSessionControlMode,
|
|
967
914
|
exitSessionControlMode,
|
|
968
915
|
isSessionControlActive,
|
|
969
916
|
routeDevHarnessSubmitIntent,
|
|
970
|
-
parseSessionControlSlash,
|
|
971
|
-
parseSessionSurfaceSlash,
|
|
972
917
|
resolveSessionInputModeFromChatMode,
|
|
973
918
|
resolveSessionModeSnapshot,
|
|
974
919
|
resolveSessionSurfaceStatus,
|
|
975
|
-
setSessionPreferredSurface,
|
|
976
920
|
toggleSessionControlMode,
|
|
977
|
-
type SearchPlannerState,
|
|
978
921
|
} from '../session-runtime/index.js';
|
|
979
922
|
import {
|
|
980
923
|
initDashboardApprovers,
|
|
@@ -987,12 +930,13 @@ import {
|
|
|
987
930
|
bootDashboardAcpSession,
|
|
988
931
|
deriveDaemonHttpBase,
|
|
989
932
|
fetchDaemonSessionHistory,
|
|
990
|
-
fetchDaemonSessionList,
|
|
991
933
|
} from './acp-boot.js';
|
|
992
934
|
import { renderReplayPreviewLines } from './replay-preview.js';
|
|
993
935
|
import {
|
|
994
936
|
buildDashboardTurnPreamble,
|
|
995
937
|
} from './turn-preamble.js';
|
|
938
|
+
import { describeSeatBoot, startSeatBootConversation } from './seat-boot-preamble.js';
|
|
939
|
+
import { ensureSeatLocalInstructions, installSeatSessionRecorder } from './seat-local-instructions.js';
|
|
996
940
|
import type { DashboardSession } from '../tui-client/dashboard-session.js';
|
|
997
941
|
import type { SessionTurnProfile } from '../session-runtime/index.js';
|
|
998
942
|
import { createCompanionSurfaceHostRegistry } from './companion-surface-host-registry.js';
|
|
@@ -1021,7 +965,6 @@ import {
|
|
|
1021
965
|
} from '../display/workspace-affinity.js';
|
|
1022
966
|
import { initDashboardHitl, stopDashboardHitl } from './runtime/hitl.js';
|
|
1023
967
|
import { openDashboardShellRollupPopup } from './shell-rollup-popup.js';
|
|
1024
|
-
import { expandPromptReferences } from '../prompt/references.js';
|
|
1025
968
|
import { spawnCodingAgent, CodingAgentBinaryMissing } from '../terminal/coding-agent.js';
|
|
1026
969
|
import type { TerminalSession } from '../terminal/session-registry.js';
|
|
1027
970
|
import { createSessionPickerModal } from '../session/picker-modal.js';
|
|
@@ -1031,15 +974,13 @@ import { listSessions as listChatSessionsForResume, adoptSession as adoptChatSes
|
|
|
1031
974
|
// 영속은 세션 스토어(forkSessionFromHistory)가 담당한다.
|
|
1032
975
|
import { userMessagePositions, truncateBeforeNthUser } from '../acp/session-fork.js';
|
|
1033
976
|
import { resolveEscEscRewind } from '../chat/esc-esc-rewind.js';
|
|
1034
|
-
import { wirePersistence
|
|
977
|
+
import { wirePersistence } from '../terminal/session-persistence.js';
|
|
1035
978
|
import { renderMarkdown as renderMarkdownGlow } from '../markdown-preview.js';
|
|
1036
979
|
import { basename, dirname } from 'path';
|
|
1037
980
|
import { statSync } from 'fs';
|
|
1038
981
|
import {
|
|
1039
|
-
FIGURES,
|
|
1040
|
-
|
|
1041
|
-
sectionHeader, progressIndicator, renderTaskStatus,
|
|
1042
|
-
type StatusColor, type TaskStatus,
|
|
982
|
+
FIGURES, toolHeader, toolResult,
|
|
983
|
+
renderMarkdown, successLine, errorLine, warningLine,
|
|
1043
984
|
} from '../render.js';
|
|
1044
985
|
import type { SyncMode } from '../types.js';
|
|
1045
986
|
import type { ChatMessage } from '../chat/index.js';
|
|
@@ -1047,12 +988,12 @@ import type { PlainTurnSubmit } from '../input/turn-submit.js';
|
|
|
1047
988
|
// U-4.2 · `renderLogPane` no longer called from dashboard directly —
|
|
1048
989
|
// wd-log widget owns log rendering via renderLogViaWidget. Only
|
|
1049
990
|
// `findBlock` still used here (chat-input block navigation).
|
|
1050
|
-
import { findBlock } from '../panes/log-pane.js';
|
|
991
|
+
import { findBlock, logPaneContentHeight, maxLogPaneScroll, visibleSearchRowOffset } from '../panes/log-pane.js';
|
|
1051
992
|
import { createQuitConfirmationState, gracefulQuit, type QuitConfirmationState } from './graceful-quit.js';
|
|
1052
|
-
import {
|
|
993
|
+
import { handoffTurnTypeaheadAtTurnEnd, releaseTurnTypeaheadPending, steerLastTurnTypeaheadSubmission } from './input/turn-steer-bridge.js';
|
|
1053
994
|
import { createAttachmentRowMap } from '../log-pane/attachment-row-map.js';
|
|
1054
995
|
import { createAttachmentPopup, type AttachmentPopupAction } from '../log-pane/attachment-popup.js';
|
|
1055
|
-
import { findLogMatches, type LogSearchResult } from '../log-pane/search.js';
|
|
996
|
+
import { findLogMatches, findVisibleLogMatches, type LogSearchResult } from '../log-pane/search.js';
|
|
1056
997
|
import { createLogSearchModal, type LogSearchModalOpts } from '../log-pane/search-modal.js';
|
|
1057
998
|
// U-4.3 · direct imports of tryAttachmentHitAtBodyRow /
|
|
1058
999
|
// tryHandleLogAreaClick are gone · wd-log.onMouse owns the hit-test.
|
|
@@ -1111,7 +1052,6 @@ import {
|
|
|
1111
1052
|
} from '../skills/tools/dashboard-config.js';
|
|
1112
1053
|
import {
|
|
1113
1054
|
initDashboardWidgetTools,
|
|
1114
|
-
type WidgetInfo,
|
|
1115
1055
|
} from '../skills/tools/dashboard-widget.js';
|
|
1116
1056
|
import { initWidgetInspectorTools } from '../skills/tools/widget-inspector.js';
|
|
1117
1057
|
import {
|
|
@@ -1124,7 +1064,6 @@ import {
|
|
|
1124
1064
|
} from '../agent/spawn-embodied-agent-in-vw.js';
|
|
1125
1065
|
import { findSessionObserver } from '../agent/observer-registry.js';
|
|
1126
1066
|
import {
|
|
1127
|
-
conversationHoverHudLabel,
|
|
1128
1067
|
conversationModalTitle,
|
|
1129
1068
|
conversationModalWidgetId,
|
|
1130
1069
|
findConversationSessionEntry,
|
|
@@ -1170,10 +1109,10 @@ import {
|
|
|
1170
1109
|
import { computeWorkingFocusSync } from '../display/working-focus-sync.js';
|
|
1171
1110
|
import { dispatchPaneClick } from '../display/pane-click-dispatch.js';
|
|
1172
1111
|
import { installResizeListener } from '../display/resize-listener.js';
|
|
1173
|
-
import { isPtyForwardMouseEventType
|
|
1112
|
+
import { isPtyForwardMouseEventType } from '../display/types.js';
|
|
1174
1113
|
import { createDisplayEventBus } from '../display/events.js';
|
|
1175
1114
|
import { agentBatchScratchTitle, renderAgentBatchScratch } from '../display/agent-batch.js';
|
|
1176
|
-
import {
|
|
1115
|
+
import { type ExecutionSurfaceHandle } from '../display/index.js';
|
|
1177
1116
|
import { AgentSurfaceStore, renderAgentDetail, renderAgentRoster, type AgentSurfaceState } from '../display/agent-surface.js';
|
|
1178
1117
|
import { globalAgentFlash } from '../display/agent-flash.js';
|
|
1179
1118
|
import { renderDebugEventDetail, renderDebugEventRows, renderDebugStack, renderPromptInjectionDebug } from '../display/debug-surface.js';
|
|
@@ -1196,9 +1135,9 @@ export function registerDashboardCoreHostTools(host: Pick<PluginHost, 'registerH
|
|
|
1196
1135
|
}
|
|
1197
1136
|
}
|
|
1198
1137
|
import { registerDashboardPaneHostTools } from './panes/host-tools.js';
|
|
1199
|
-
import {
|
|
1200
|
-
import { resolveActiveTheme
|
|
1201
|
-
import { getTheme
|
|
1138
|
+
import { type ThemeTokens } from '../theme/tokens.js';
|
|
1139
|
+
import { resolveActiveTheme } from './render/theme-resolver.js';
|
|
1140
|
+
import { getTheme } from '../themes/index.js';
|
|
1202
1141
|
import type { PaneFocus, PreviewSource, WorkingDirView } from '../workspace-types.js';
|
|
1203
1142
|
import type { DisplayMouseEvent } from '../display/types.js';
|
|
1204
1143
|
import type { Key as TuiKey } from '../tui.js';
|
|
@@ -1215,7 +1154,6 @@ import {
|
|
|
1215
1154
|
readDirEntries,
|
|
1216
1155
|
sortEntries,
|
|
1217
1156
|
splitAtPrefix,
|
|
1218
|
-
dirname as wdDirname,
|
|
1219
1157
|
type WorkingDirState,
|
|
1220
1158
|
type FsEntry,
|
|
1221
1159
|
} from '../working-dir/index.js';
|
|
@@ -1225,8 +1163,6 @@ import {
|
|
|
1225
1163
|
resolveBrowserActionContextFromHit,
|
|
1226
1164
|
} from '../browser-pane/actions.js';
|
|
1227
1165
|
import { resolveBrowserTransferCapability } from '../browser-pane/capabilities.js';
|
|
1228
|
-
import { openBrowserPaneModal } from '../browser-pane/mount.js';
|
|
1229
|
-
import { openPreviewPaneModal } from '../preview-pane/mount.js';
|
|
1230
1166
|
import {
|
|
1231
1167
|
cyclePreviewSourceForView,
|
|
1232
1168
|
formatPreviewSourceLabel,
|
|
@@ -1239,7 +1175,7 @@ import {
|
|
|
1239
1175
|
} from '../preview-pane/model.js';
|
|
1240
1176
|
import { PreviewPaneRegistry } from '../preview-pane/registry.js';
|
|
1241
1177
|
import { FileIndexCache, absolutize } from '../file-index.js';
|
|
1242
|
-
import { firstPaneOfView
|
|
1178
|
+
import { firstPaneOfView } from '../working-dir/focus.js';
|
|
1243
1179
|
import { applyVisibleFocusRepair } from './focus-repair.js';
|
|
1244
1180
|
import {
|
|
1245
1181
|
nextVisiblePaneFocus,
|
|
@@ -1250,11 +1186,7 @@ import {
|
|
|
1250
1186
|
} from '../views/pane-policy.js';
|
|
1251
1187
|
import {
|
|
1252
1188
|
autoTabletModeForViewport,
|
|
1253
|
-
orderDashboardViewsForCompactMode,
|
|
1254
1189
|
effectiveChatOnlyModeForViewport,
|
|
1255
|
-
orderSurfaceCatalogForCompactMode,
|
|
1256
|
-
pruneDashboardViewsForCompactMode,
|
|
1257
|
-
pruneSurfaceCatalogForCompactMode,
|
|
1258
1190
|
productCompactModeForViewport,
|
|
1259
1191
|
} from '../views/product-compact-mode.js';
|
|
1260
1192
|
import { readScopedRenderLogs, resolveRenderSuppressed, readScopedDebugLevel, resolveStartupDebugLevel, hotPathGateOpen } from '../mss/logging/scoped-level.js';
|
|
@@ -1265,7 +1197,6 @@ import {
|
|
|
1265
1197
|
compileDashboardViewLayout,
|
|
1266
1198
|
describeDashboardViewsForPrompt,
|
|
1267
1199
|
findDashboardView,
|
|
1268
|
-
nextDashboardView,
|
|
1269
1200
|
panesForDashboardView,
|
|
1270
1201
|
serializeDashboardViewsConfig,
|
|
1271
1202
|
validateDashboardViewsConfig,
|
|
@@ -1345,6 +1276,8 @@ import {
|
|
|
1345
1276
|
type SpaceLongPressDetector,
|
|
1346
1277
|
} from './input/space-longpress-detector.js';
|
|
1347
1278
|
import { isAllowlistedDictationSurface } from './input/dictation-surface-allowlist.js';
|
|
1279
|
+
import { createDashboardExternalInputHost } from './input/external-input-host.js';
|
|
1280
|
+
import { registerExternalInputHost } from '../input/external-input-queue.js';
|
|
1348
1281
|
// H3 #6 follow-up #3 — background sessions render as a distinct sidebar
|
|
1349
1282
|
// kind with live state badge + tap-to-Join. Dashboard pulls BG records
|
|
1350
1283
|
// through backgroundToStub + maps state via bgStateToSessionStatus,
|
|
@@ -1932,6 +1865,17 @@ export function renderDashboardFirstScreenBand(input: {
|
|
|
1932
1865
|
return Promise.all([linkPending, pwaPending]).then(() => {});
|
|
1933
1866
|
}
|
|
1934
1867
|
|
|
1868
|
+
/** The /status reader used by the live dashboard slash callback. */
|
|
1869
|
+
export function renderDashboardStatusLines(input: Omit<DashboardStatusLinesInput, 'seatsNow'>, now = Date.now()): string[] {
|
|
1870
|
+
let seatsNow: string | null = null;
|
|
1871
|
+
try {
|
|
1872
|
+
seatsNow = readDashboardSeatsNow(now);
|
|
1873
|
+
} catch (error) {
|
|
1874
|
+
debug.log('dashboard.status', 'seats-unreadable', { error: String(error) });
|
|
1875
|
+
}
|
|
1876
|
+
return buildDashboardStatusLines({ ...input, seatsNow });
|
|
1877
|
+
}
|
|
1878
|
+
|
|
1935
1879
|
export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<DashboardAction> {
|
|
1936
1880
|
let firstDashboardFrameRendered = false;
|
|
1937
1881
|
await awaitGlobalPersonaLoad().catch(() => {});
|
|
@@ -2594,9 +2538,17 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
2594
2538
|
};
|
|
2595
2539
|
const clearLogFilter = (): void => {
|
|
2596
2540
|
logFilterQuery = '';
|
|
2541
|
+
if (logSearchQuery) {
|
|
2542
|
+
logSearchResults = findLogMatches(chatLines, logSearchQuery);
|
|
2543
|
+
logSearchCursor = Math.min(logSearchCursor, Math.max(0, logSearchResults.length - 1));
|
|
2544
|
+
}
|
|
2597
2545
|
};
|
|
2598
2546
|
const applyLogFilter = (query: string): void => {
|
|
2599
2547
|
logFilterQuery = query.trim();
|
|
2548
|
+
if (logSearchQuery) {
|
|
2549
|
+
logSearchResults = findVisibleLogMatches(chatLines, logSearchQuery, logFilterQuery);
|
|
2550
|
+
logSearchCursor = Math.min(logSearchCursor, Math.max(0, logSearchResults.length - 1));
|
|
2551
|
+
}
|
|
2600
2552
|
if (debug.enabled) {
|
|
2601
2553
|
debug.log('log-pane.filter.apply', `q="${logFilterQuery}"`, {
|
|
2602
2554
|
active: logFilterQuery.length > 0,
|
|
@@ -2606,7 +2558,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
2606
2558
|
const applyLogSearch = (query: string): void => {
|
|
2607
2559
|
logSearchQuery = query.trim();
|
|
2608
2560
|
logSearchResults = logSearchQuery
|
|
2609
|
-
?
|
|
2561
|
+
? findVisibleLogMatches(chatLines, logSearchQuery, logFilterQuery)
|
|
2610
2562
|
: [];
|
|
2611
2563
|
logSearchCursor = 0;
|
|
2612
2564
|
if (debug.enabled) {
|
|
@@ -2618,13 +2570,18 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
2618
2570
|
/** Center the viewport on a search-result line. Sets chatScrollOffset
|
|
2619
2571
|
* so the match row lands mid-pane when possible; clamps at bounds. */
|
|
2620
2572
|
const scrollToSearchResult = (result: LogSearchResult): void => {
|
|
2573
|
+
// An explicit search may jump to output that arrived while the pane
|
|
2574
|
+
// was frozen. Release that snapshot before computing the row bound.
|
|
2575
|
+
if (logFrozenTailIndex !== null && result.lineIdx >= logFrozenTailIndex) {
|
|
2576
|
+
logFrozenTailIndex = null;
|
|
2577
|
+
}
|
|
2621
2578
|
const { rows: tr } = termSize();
|
|
2622
2579
|
const sH = computeLogH(tr);
|
|
2623
|
-
const bodyH = Math.max(0, sH - 1);
|
|
2624
2580
|
const hasFooter = chatFooterLine.current != null && chatFooterLine.current !== '';
|
|
2625
|
-
const
|
|
2626
|
-
const
|
|
2627
|
-
const
|
|
2581
|
+
const hasQueueRow = hasFooter && !!renderTurnTypeaheadQueueRow(turnTypeaheadRef.state, Math.max(20, termSize().cols - 6));
|
|
2582
|
+
const contentH = logPaneContentHeight(sH, hasFooter, hasQueueRow);
|
|
2583
|
+
const target = Math.max(0, visibleSearchRowOffset(chatLines, result, logFilterQuery) - Math.floor(contentH / 2));
|
|
2584
|
+
const maxScroll = logScrollMax(sH);
|
|
2628
2585
|
chatScrollOffset = target >= maxScroll ? -1 : target;
|
|
2629
2586
|
// Entering a scrolled state may set the freeze — the
|
|
2630
2587
|
// handleLogPaneKey transition only fires for user keystrokes, so
|
|
@@ -3416,6 +3373,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3416
3373
|
// indicator below the scrolling log body. Mutated by startPinnedThinking
|
|
3417
3374
|
// via this ref. `null` = no footer, body uses full log height.
|
|
3418
3375
|
const chatFooterLine: { current: string | null } = { current: null };
|
|
3376
|
+
const logScrollMax = (height: number): number => {
|
|
3377
|
+
const hasFooter = chatFooterLine.current != null && chatFooterLine.current !== '';
|
|
3378
|
+
const hasQueueRow = hasFooter && !!renderTurnTypeaheadQueueRow(turnTypeaheadRef.state, Math.max(20, termSize().cols - 6));
|
|
3379
|
+
return maxLogPaneScroll(chatLines, height, {
|
|
3380
|
+
filterQuery: logFilterQuery,
|
|
3381
|
+
frozenTailIndex: logFrozenTailIndex,
|
|
3382
|
+
hasFooter,
|
|
3383
|
+
hasQueueRow,
|
|
3384
|
+
});
|
|
3385
|
+
};
|
|
3419
3386
|
const disposeEventLoopStallMonitor = startEventLoopStallMonitor({
|
|
3420
3387
|
getContext: () => ({
|
|
3421
3388
|
streamingInFlight,
|
|
@@ -3538,21 +3505,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3538
3505
|
* actual view model instead of drifting toward an old 60/40 guess.
|
|
3539
3506
|
*/
|
|
3540
3507
|
const dashboardState = new DashboardStateStore();
|
|
3541
|
-
const getFallbackPromptFrame = (termRows: number) =>
|
|
3542
|
-
dashboardState.getFallbackPromptFrame(termRows);
|
|
3543
3508
|
const getLayoutPromptFrame = (termRows: number): PromptFrame =>
|
|
3544
3509
|
dashboardState.getLayoutPromptFrame(termRows);
|
|
3545
3510
|
const currentPromptFrame = (termRows = termSize().rows): PromptFrame =>
|
|
3546
3511
|
dashboardState.getCurrentPromptFrame(termRows);
|
|
3547
3512
|
|
|
3548
|
-
/** Rows taken up by everything BELOW the log zone (hud excluded — it
|
|
3549
|
-
* sits between grid and log, and is reserved separately when the
|
|
3550
|
-
* grid is present). Used to compute paneH below and to size the
|
|
3551
|
-
* embedded grid when logEmbedded=true. Must match the number of
|
|
3552
|
-
* rows pushed by zones 'input-divider-upper' through 'dock'. */
|
|
3553
|
-
const bottomFixedRows = (inputHeight: number) =>
|
|
3554
|
-
bottomFixedRowsForPromptFrame(inputHeight);
|
|
3555
|
-
|
|
3556
3513
|
/** Compute paneH (height reserved for the top pane/grid in
|
|
3557
3514
|
* non-chat-only, non-embedded modes) given termRows. Factored out
|
|
3558
3515
|
* so layoutTools.getCurrentLayout can reuse the same math. */
|
|
@@ -3687,6 +3644,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3687
3644
|
// The ACP bridge is created later during dashboard boot. Keep status renders
|
|
3688
3645
|
// safe before then, and bind this reader once the bridge exists.
|
|
3689
3646
|
let activeAcpRuntimeModel = (): string | undefined => undefined;
|
|
3647
|
+
// 상태줄은 provider·model 만 쓴다 — 렌더마다 inspectActiveProvider(자격·authDetail 동기 읽기)를 안 부른다.
|
|
3648
|
+
const readStatusProviderInfo = createStatusProviderInfoReader();
|
|
3649
|
+
const runningBuildStatus = createRunningBuildStatus();
|
|
3690
3650
|
/** Primary pill row — wd · git · provider/model · elapsed.
|
|
3691
3651
|
* MX11b — delegates to mouseWiring.buildStatusLine so pill column
|
|
3692
3652
|
* bounds are captured as a side effect; the return string is
|
|
@@ -3714,7 +3674,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3714
3674
|
return mouseWiring.buildStatusLine({
|
|
3715
3675
|
swd,
|
|
3716
3676
|
gitState,
|
|
3717
|
-
providerInfo:
|
|
3677
|
+
providerInfo: readStatusProviderInfo(activeAcpRuntimeModel()),
|
|
3718
3678
|
contextUsedTokens: metrics.lastContextUsed,
|
|
3719
3679
|
tmuxLabel: tmuxStatusLabel,
|
|
3720
3680
|
sshLabel: sshStatusLabel,
|
|
@@ -3736,44 +3696,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3736
3696
|
// dashboardVoiceChat.onPhaseChange). The status-bar pill is
|
|
3737
3697
|
// intentionally null so we don't render the same state twice.
|
|
3738
3698
|
voiceLabel: null,
|
|
3699
|
+
runningBuild: runningBuildStatus(),
|
|
3739
3700
|
theme,
|
|
3740
3701
|
});
|
|
3741
3702
|
} catch { return ''; }
|
|
3742
3703
|
};
|
|
3743
3704
|
|
|
3744
|
-
/** Secondary metrics row — CTX bar · total cost · t/s · cache hit %.
|
|
3745
|
-
* Reads from the session-metrics singleton populated by runTurn +
|
|
3746
|
-
* dashboard streaming paths, plus the prompt-cache metrics
|
|
3747
|
-
* singleton populated by onUsage. Renders an all-zero row when no
|
|
3748
|
-
* turns have completed yet (matches Claude Code's "0k/N.Nk"
|
|
3749
|
-
* placeholder). */
|
|
3750
|
-
const buildSecondaryStatusLine = (): string => {
|
|
3751
|
-
try {
|
|
3752
|
-
const m = getSessionMetrics();
|
|
3753
|
-
const theme = currentThemeTokens();
|
|
3754
|
-
// Prompt-cache summary is ambient — import synchronously from a
|
|
3755
|
-
// side-effect-free module; no fetch, no state beyond the session
|
|
3756
|
-
// singleton that was already populated by onUsage events.
|
|
3757
|
-
const { getSessionSummary } = require('../prompt-cache/metrics.js') as
|
|
3758
|
-
typeof import('../prompt-cache/metrics.js');
|
|
3759
|
-
const cachePct = getSessionSummary().hitRatePct;
|
|
3760
|
-
// PR-S1V.5 — voice cost month-to-date pill. Reads the
|
|
3761
|
-
// process-wide tracker that voice-input-bridge.transcribe and
|
|
3762
|
-
// the daemon's /v1/voice/transcribe REST handler both write to,
|
|
3763
|
-
// so the pill is the canonical view across surfaces. Empty
|
|
3764
|
-
// string when nothing was spent this month.
|
|
3765
|
-
const voiceMonthly = globalVoiceCostTracker().getMonthSummary().totalUsd;
|
|
3766
|
-
const parts = [
|
|
3767
|
-
ctxBarSegment(m.lastContextUsed, m.lastContextMax, 24),
|
|
3768
|
-
costSegment(m.totalCostUsd, { theme }, m.unpricedTurns),
|
|
3769
|
-
voiceCostSegment(voiceMonthly, { theme }),
|
|
3770
|
-
speedSegment(m.lastTokensPerSec, { theme }),
|
|
3771
|
-
cacheSegment(cachePct, { theme }),
|
|
3772
|
-
];
|
|
3773
|
-
return parts.filter(Boolean).join(' ');
|
|
3774
|
-
} catch { return ''; }
|
|
3775
|
-
};
|
|
3776
|
-
|
|
3777
3705
|
let draw: (opts?: { force?: boolean }) => void = () => {};
|
|
3778
3706
|
let drawNow: (opts?: { force?: boolean }) => void = () => {};
|
|
3779
3707
|
let drawQueued = false;
|
|
@@ -3930,9 +3858,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3930
3858
|
if (debug.enabled) {
|
|
3931
3859
|
debug.log('status.shell-posture.boot', 'ready', statusShellPostureRuntime.current());
|
|
3932
3860
|
}
|
|
3933
|
-
const blankRows = (height: number, width: number): string[] => (
|
|
3934
|
-
Array.from({ length: Math.max(0, height) }, () => ' '.repeat(Math.max(0, width)))
|
|
3935
|
-
);
|
|
3936
3861
|
// IUL Phase M (Bundle 1) → Phase S·a (Bundle 2) → Bundle 3 wiring.
|
|
3937
3862
|
// Wraps the existing afterRender hook with composeIdentityHooks so
|
|
3938
3863
|
// every modal-kind surface mount/dispose gets a stable ModalIdentity
|
|
@@ -4064,9 +3989,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
4064
3989
|
// The 5s poll would eventually catch the change; forcing here
|
|
4065
3990
|
// makes the "*N" suffix tick up within the same frame so the
|
|
4066
3991
|
// user sees feedback for their own action immediately.
|
|
4067
|
-
|
|
4068
|
-
|
|
4069
|
-
|
|
3992
|
+
// TUI-TYPING-LAG — async probe: `git status` must not block key input.
|
|
3993
|
+
void refreshGitDirtyAsync(getSessionCwd(), { force: true })
|
|
3994
|
+
.then(() => { try { draw(); } catch { /* TUI torn down */ } }, () => { /* noop */ });
|
|
4070
3995
|
});
|
|
4071
3996
|
}
|
|
4072
3997
|
// WD2 — session working directory subscription. Status bar pills
|
|
@@ -4098,10 +4023,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
4098
4023
|
// Kick off the first dirty probe in the background so the
|
|
4099
4024
|
// "*N" suffix appears on the first meaningful redraw. Throttle
|
|
4100
4025
|
// handles repeated calls; we just fire-and-forget.
|
|
4101
|
-
|
|
4102
|
-
|
|
4103
|
-
try { draw(); } catch { /* noop */ }
|
|
4104
|
-
} catch { /* noop */ }
|
|
4026
|
+
void refreshGitDirtyAsync(swd, { force: true })
|
|
4027
|
+
.then(() => { try { draw(); } catch { /* noop */ } }, () => { /* noop */ });
|
|
4105
4028
|
};
|
|
4106
4029
|
wireGitForSwd();
|
|
4107
4030
|
|
|
@@ -4130,14 +4053,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
4130
4053
|
const gitDirtyTimer: ReturnType<typeof setInterval> = setInterval(() => {
|
|
4131
4054
|
try {
|
|
4132
4055
|
const before = getGitStatusView(getSessionCwd());
|
|
4133
|
-
|
|
4134
|
-
|
|
4135
|
-
|
|
4136
|
-
|
|
4137
|
-
|
|
4138
|
-
|
|
4139
|
-
|
|
4140
|
-
|
|
4056
|
+
// TUI-TYPING-LAG — the 5s probe ran `git status` synchronously (130ms+, hundreds under load).
|
|
4057
|
+
void refreshGitDirtyAsync(getSessionCwd(), { minIntervalMs: 4_000 }).then((after) => {
|
|
4058
|
+
if (
|
|
4059
|
+
(before.dirty?.total ?? -1) !== (after.dirty?.total ?? -1) ||
|
|
4060
|
+
(before.aheadBehind?.ahead ?? -1) !== (after.aheadBehind?.ahead ?? -1)
|
|
4061
|
+
) {
|
|
4062
|
+
try { draw(); } catch { /* noop */ }
|
|
4063
|
+
}
|
|
4064
|
+
}, () => { /* noop */ });
|
|
4141
4065
|
} catch { /* noop */ }
|
|
4142
4066
|
}, 5_000);
|
|
4143
4067
|
(gitDirtyTimer as unknown as { unref?: () => void }).unref?.();
|
|
@@ -4398,6 +4322,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
4398
4322
|
// requestConfirmation() / HitlConfirm tool reaches the iPhone.
|
|
4399
4323
|
// Fire-and-forget: a listener start failure warns but doesn't
|
|
4400
4324
|
// block dashboard init (HITL degrades to terminal-only / no-op).
|
|
4325
|
+
// #28 — the minimal boot banner holds healthy-boot rows for /status instead of the transcript.
|
|
4326
|
+
const bootBannerMode = normalizeBootBannerMode(getUserConfig().dashboard.bootBanner);
|
|
4327
|
+
const bootBannerHeld: BootBannerHeld = {};
|
|
4401
4328
|
bootDashboardHitl({
|
|
4402
4329
|
enabled: process.env['ELANOUS_HITL_DISABLE'] !== '1',
|
|
4403
4330
|
initDashboardHitl,
|
|
@@ -4407,6 +4334,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
4407
4334
|
try { return getPushcutClient().configured; } catch { return false; }
|
|
4408
4335
|
},
|
|
4409
4336
|
pushWarningLine: (message) => { chatLines.push(C.warning(message)); },
|
|
4337
|
+
holdWarningLine: bootBannerMode === 'minimal' ? (message) => { bootBannerHeld.hitl = message; } : undefined,
|
|
4410
4338
|
draw: () => { draw(); },
|
|
4411
4339
|
registerBeforeExit: (cb) => { process.once('beforeExit', cb); },
|
|
4412
4340
|
warnConsole: (message) => { console.warn(message); },
|
|
@@ -4900,6 +4828,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
4900
4828
|
inputCoreAddDefaultBinding({ matcher: 'ctrl+x s', actionId: 'mode.enter.sync' });
|
|
4901
4829
|
inputCoreAddDefaultBinding({ matcher: 'ctrl+x c', actionId: 'mode.enter.control' });
|
|
4902
4830
|
inputCoreAddDefaultBinding({ matcher: 'ctrl+x g', actionId: 'mode.enter.general' });
|
|
4831
|
+
// #19 — the log-pane `F` bulk fold toggle, shared by the input (`ctrl+x f`) and pane chords.
|
|
4832
|
+
const toggleAllLogFolds = (): void => {
|
|
4833
|
+
const changed = foldStack.toggleAll();
|
|
4834
|
+
debug.log('log.fold', 'toggle-all', { via: 'ctrl+x f', changed });
|
|
4835
|
+
if (changed === 0) pushDebugLine(C.muted('(nothing to fold/unfold)'));
|
|
4836
|
+
chatScrollOffset = -1;
|
|
4837
|
+
draw();
|
|
4838
|
+
};
|
|
4839
|
+
registerLogFoldInputBinding(toggleAllLogFolds);
|
|
4903
4840
|
|
|
4904
4841
|
initTui(true);
|
|
4905
4842
|
|
|
@@ -6246,14 +6183,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6246
6183
|
const active = inspectActiveProvider(cfg);
|
|
6247
6184
|
const reasoningProvider = (['openai-codex', 'openai', 'anthropic', 'gemini', 'grok', 'local', 'openrouter'] as const)
|
|
6248
6185
|
.find(provider => active.provider === provider || active.provider === `auto:${provider}`);
|
|
6249
|
-
|
|
6250
|
-
try {
|
|
6251
|
-
seatsNow = seatsNowLine(readSlashContextNow([]), Date.now());
|
|
6252
|
-
} catch (error) {
|
|
6253
|
-
debug.log('dashboard.status', 'seats-unreadable', { error: String(error) });
|
|
6254
|
-
}
|
|
6255
|
-
return buildDashboardStatusLines({
|
|
6256
|
-
seatsNow,
|
|
6186
|
+
return renderDashboardStatusLines({
|
|
6257
6187
|
provider: active.provider,
|
|
6258
6188
|
model: active.model,
|
|
6259
6189
|
reasoning: reasoningProvider
|
|
@@ -6263,6 +6193,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6263
6193
|
: undefined,
|
|
6264
6194
|
daemonAddress: opts.remote?.url,
|
|
6265
6195
|
daemonConnected: daemonAttached,
|
|
6196
|
+
bootHeld: bootBannerStatusLines(bootBannerHeld),
|
|
6266
6197
|
accountName: active.provider === 'openai-codex' || active.provider === 'auto:openai-codex'
|
|
6267
6198
|
? activeCodexAccountView().name : undefined,
|
|
6268
6199
|
sessionSurfaceLines: buildSessionDashboardStatusLines(resolveSessionSurfaceStatus({ chatModeState })),
|
|
@@ -6337,7 +6268,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6337
6268
|
const { rows: tr } = termSize();
|
|
6338
6269
|
const sH = computeLogH(tr);
|
|
6339
6270
|
const halfSH = Math.max(1, Math.floor(sH / 2));
|
|
6340
|
-
const maxScr =
|
|
6271
|
+
const maxScr = logScrollMax(sH);
|
|
6341
6272
|
// Scroll keys → Scrollable behavior on wd-log. Sync pre/post.
|
|
6342
6273
|
const SCROLL_KEYS = new Set([
|
|
6343
6274
|
'j', 'k', 'down', 'up',
|
|
@@ -6528,6 +6459,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6528
6459
|
const chatLinesStartIndex = chatLines.length;
|
|
6529
6460
|
userScrolledDuringStream = false;
|
|
6530
6461
|
streamingInFlight = true;
|
|
6462
|
+
reportTuiTurn('busy');
|
|
6531
6463
|
const SCROLL_KEYS = new Set(['j', 'k', 'down', 'up', 'pageup', 'pagedown', 'home', 'end', 'g', 'G']);
|
|
6532
6464
|
// T3-B2: ESC abort gate. When the user hits Esc AND sub-agent
|
|
6533
6465
|
// work is running, pop a confirmation modal before tearing down
|
|
@@ -6597,7 +6529,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6597
6529
|
const scrollLogBy = (delta: number): void => {
|
|
6598
6530
|
const { rows: tr } = termSize();
|
|
6599
6531
|
const sH = computeLogH(tr);
|
|
6600
|
-
const maxScr =
|
|
6532
|
+
const maxScr = logScrollMax(sH);
|
|
6601
6533
|
const cur = chatScrollOffset < 0 ? maxScr : chatScrollOffset;
|
|
6602
6534
|
let next = Math.max(0, Math.min(cur + delta, maxScr));
|
|
6603
6535
|
if (delta > 0 && next >= maxScr) next = -1; // re-pin tail
|
|
@@ -6842,22 +6774,22 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6842
6774
|
},
|
|
6843
6775
|
});
|
|
6844
6776
|
if (queuedHistoryEntry) refreshInputHistory();
|
|
6845
|
-
|
|
6846
|
-
|
|
6847
|
-
|
|
6848
|
-
|
|
6849
|
-
for (const text of drained) {
|
|
6777
|
+
// ⭐ 레지스트리 id 로 짝짓는다 — 배수·되꺼내기·턴 종료 승격이 같은 항목을 «한 번만» 보낸다.
|
|
6778
|
+
// ⛔ 슬래시는 안 넣는다(턴 종료 FIFO 로만 실행).
|
|
6779
|
+
steerLastTurnTypeaheadSubmission(turnTypeaheadRef, sid, ({ texts, remaining }) => {
|
|
6780
|
+
for (const text of texts) {
|
|
6850
6781
|
echoSubmittedUserText(text, { live: true });
|
|
6851
6782
|
debug.log('dashboard.turn-typeahead', 'echoed', { path: 'live', length: text.length });
|
|
6852
6783
|
}
|
|
6853
|
-
if (
|
|
6784
|
+
if (texts.length > 0) draw();
|
|
6854
6785
|
debug.log('dashboard.turn-typeahead', 'drained-into-live-turn', {
|
|
6855
|
-
drained:
|
|
6786
|
+
drained: texts.length, remaining,
|
|
6856
6787
|
});
|
|
6857
6788
|
});
|
|
6858
6789
|
}
|
|
6859
6790
|
}
|
|
6860
6791
|
}
|
|
6792
|
+
if (r.releasedPendingIds) releaseTurnTypeaheadPending(r.releasedPendingIds, 'recalled');
|
|
6861
6793
|
if (r.immediateSubmission) {
|
|
6862
6794
|
turnTypeaheadRef.state = await dispatchStreamingTurnTypeaheadSubmission(
|
|
6863
6795
|
turnTypeaheadRef.state,
|
|
@@ -7086,9 +7018,17 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7086
7018
|
return () => {
|
|
7087
7019
|
cleanup();
|
|
7088
7020
|
escGate.dispose();
|
|
7089
|
-
|
|
7090
|
-
|
|
7091
|
-
|
|
7021
|
+
try {
|
|
7022
|
+
if (!stoppedHarnessSpace) settleEscAbortPendingLines(chatLines, chatLinesStartIndex);
|
|
7023
|
+
} catch (err) {
|
|
7024
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
7025
|
+
const stackHead = err instanceof Error ? err.stack?.split('\n')[1]?.trim() : undefined;
|
|
7026
|
+
debug.log('dashboard.turn', 'settle-failed', { message, stackHead });
|
|
7027
|
+
} finally {
|
|
7028
|
+
userScrolledDuringStream = false;
|
|
7029
|
+
streamingInFlight = false;
|
|
7030
|
+
reportTuiTurn('idle');
|
|
7031
|
+
}
|
|
7092
7032
|
};
|
|
7093
7033
|
};
|
|
7094
7034
|
|
|
@@ -7332,9 +7272,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7332
7272
|
?? viewRegistry.views[0]!;
|
|
7333
7273
|
setActiveDashboardView(def);
|
|
7334
7274
|
};
|
|
7335
|
-
const reloadDashboardViews = (): void => {
|
|
7336
|
-
applyDashboardViewsRuntime(getUserConfig().dashboard.views as any);
|
|
7337
|
-
};
|
|
7338
7275
|
const userClosedPanes = new Set<PaneFocus>();
|
|
7339
7276
|
const closedPaneSet = (): ReadonlySet<PaneFocus> => {
|
|
7340
7277
|
const closed = new Set(userClosedPanes);
|
|
@@ -8298,7 +8235,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
8298
8235
|
}
|
|
8299
8236
|
return;
|
|
8300
8237
|
}
|
|
8301
|
-
const maxScr =
|
|
8238
|
+
const maxScr = logScrollMax(logViewport.height);
|
|
8302
8239
|
const delta = m.type === 'scroll-up' ? -3 : 3;
|
|
8303
8240
|
const before = chatScrollOffset;
|
|
8304
8241
|
chatScrollOffset = Math.max(0, Math.min(
|
|
@@ -9367,24 +9304,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
9367
9304
|
limit,
|
|
9368
9305
|
});
|
|
9369
9306
|
};
|
|
9370
|
-
const describePaneStateForPrompt = (): string => {
|
|
9371
|
-
const state = paneStateSnapshot();
|
|
9372
|
-
const rows = state.panes.map(p => {
|
|
9373
|
-
const bits = [
|
|
9374
|
-
p.visible ? 'visible' : 'hidden',
|
|
9375
|
-
p.closed ? 'closed' : '',
|
|
9376
|
-
p.closeable ? 'closeable' : 'primary',
|
|
9377
|
-
p.omittedReason ? `omitted=${p.omittedReason}` : '',
|
|
9378
|
-
].filter(Boolean).join(', ');
|
|
9379
|
-
return `- ${p.pane}: ${bits}`;
|
|
9380
|
-
});
|
|
9381
|
-
return [
|
|
9382
|
-
'## Dashboard Pane State',
|
|
9383
|
-
'',
|
|
9384
|
-
`Active view: ${state.activeViewId} "${state.viewLabel}" (baseView=${state.baseView}, compact=${state.compactLevel}, focus=${state.focused})`,
|
|
9385
|
-
...rows,
|
|
9386
|
-
].join('\n');
|
|
9387
|
-
};
|
|
9388
9307
|
// Surface-unification v2.2 V2.2-5 Part 2 (2026-05-11) — schedulerView
|
|
9389
9308
|
// state · openSchedulerForm · activeSchedulerFormValue /
|
|
9390
9309
|
// setActiveSchedulerFormValue · submitSchedulerForm 모두 폐기.
|
|
@@ -9446,11 +9365,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
9446
9365
|
);
|
|
9447
9366
|
};
|
|
9448
9367
|
|
|
9449
|
-
// Plain row label used as the list widget's identity (selection
|
|
9450
|
-
// matching, cursor display string). Kept ANSI-free so visibleWidth
|
|
9451
|
-
// and the selected-set string lookup work correctly.
|
|
9452
|
-
const fmtEntry = (e: FsEntry): string => e.isDir ? `${e.name}/` : e.name;
|
|
9453
|
-
|
|
9454
9368
|
// Colored variant for the list widget's `items` array — yazi-style
|
|
9455
9369
|
// accent for folders, per-extension fileColor for files. The list
|
|
9456
9370
|
// widget renders these straight through when preserveAnsi is true.
|
|
@@ -9887,92 +9801,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
9887
9801
|
);
|
|
9888
9802
|
};
|
|
9889
9803
|
|
|
9890
|
-
// ── Workspace context builder ──
|
|
9891
|
-
// Emitted once per chat turn (prepended to the user message) so the
|
|
9892
|
-
// LLM knows what widgets are currently on screen and how to write
|
|
9893
|
-
// to them via layout_setWidgetState / layout_addWidget without
|
|
9894
|
-
// having to probe layout_getState first. Kept compact — iteration
|
|
9895
|
-
// order matches visual layout (top-to-bottom, left-to-right).
|
|
9896
|
-
//
|
|
9897
|
-
// Writable surfaces:
|
|
9898
|
-
// wd-scratch — primary canvas for notes / reports. Persists
|
|
9899
|
-
// until the user clears or switches to memo mode.
|
|
9900
|
-
// wd-preview — secondary canvas. Persists until the user
|
|
9901
|
-
// navigates to a different file in the browser
|
|
9902
|
-
// (file nav overwrites, which is by design).
|
|
9903
|
-
//
|
|
9904
|
-
// Reserved (LLM writes rejected with a helpful error):
|
|
9905
|
-
// wd-browser, wd-log — dashboard re-renders these every frame
|
|
9906
|
-
// from its own buffers (file list, chat
|
|
9907
|
-
// transcript). Use layout_addWidget to
|
|
9908
|
-
// spawn a fresh widget the dashboard will
|
|
9909
|
-
// NOT touch.
|
|
9910
|
-
const buildWorkspaceContext = (): string => {
|
|
9911
|
-
try {
|
|
9912
|
-
const pluginLayout = pluginHost.activeLayout();
|
|
9913
|
-
let layoutForCtx: Layout;
|
|
9914
|
-
if (pluginLayout) {
|
|
9915
|
-
layoutForCtx = pluginLayout;
|
|
9916
|
-
} else {
|
|
9917
|
-
const { cols, rows: tr } = termSize();
|
|
9918
|
-
const promptFrame = getLayoutPromptFrame(tr);
|
|
9919
|
-
const topHeight = computePromptFrameGridHeight(tr, promptFrame);
|
|
9920
|
-
layoutForCtx = workingDirLayoutForView(cols - 1, topHeight);
|
|
9921
|
-
}
|
|
9922
|
-
const visibleWidgets: Array<{ id: string; type: string; title?: string }> = [];
|
|
9923
|
-
for (const row of layoutForCtx.rows) {
|
|
9924
|
-
for (const cell of row.cells) {
|
|
9925
|
-
if (!cell.widgetInstanceId) continue;
|
|
9926
|
-
const inst = widgetHost.get(cell.widgetInstanceId);
|
|
9927
|
-
if (!inst) continue;
|
|
9928
|
-
visibleWidgets.push({
|
|
9929
|
-
id: inst.id,
|
|
9930
|
-
type: inst.type,
|
|
9931
|
-
title: inst.character || undefined,
|
|
9932
|
-
});
|
|
9933
|
-
}
|
|
9934
|
-
}
|
|
9935
|
-
if (visibleWidgets.length === 0) return '';
|
|
9936
|
-
const rows = visibleWidgets.map(w => {
|
|
9937
|
-
const tag =
|
|
9938
|
-
w.id === 'wd-scratch' ? ' ← writable canvas; persistent'
|
|
9939
|
-
: w.id === 'wd-preview' ? ' ← writable canvas; overwritten on file-nav'
|
|
9940
|
-
: w.id === 'wd-browser' ? ' ← READ-ONLY (dashboard-managed file list)'
|
|
9941
|
-
: w.id === 'wd-log' ? ' ← READ-ONLY (chat transcript)'
|
|
9942
|
-
: w.id.startsWith('wd-debug-') ? ' ← READ-ONLY (debug event surface; use debug_* tools)'
|
|
9943
|
-
: ' ← persistent (spawned by LLM)';
|
|
9944
|
-
const label = w.title ? ` "${w.title}"` : '';
|
|
9945
|
-
return `- ${w.id} (${w.type})${label}${tag}`;
|
|
9946
|
-
}).join('\n');
|
|
9947
|
-
return [
|
|
9948
|
-
'## Current dashboard workspace',
|
|
9949
|
-
'',
|
|
9950
|
-
'The following widgets are visible right now. You have three host-level tools to mutate the layout:',
|
|
9951
|
-
'- `layout_getState` — refresh view of the grid.',
|
|
9952
|
-
'- `layout_setWidgetState({id, patch})` — merge a patch into a widget\'s state. For markdown widgets patch `{text: "..."}`.',
|
|
9953
|
-
'- `layout_addWidget({type, row, col, character, config})` — spawn a new widget; dashboard will NOT re-render its state.',
|
|
9954
|
-
'',
|
|
9955
|
-
rows,
|
|
9956
|
-
'',
|
|
9957
|
-
'Writing rules:',
|
|
9958
|
-
'- To SHOW the user multi-line output (notes, analyses, lists, reports), write to `wd-scratch` via `layout_setWidgetState({id:"wd-scratch", patch:{text:"<content>"}})`. The dashboard auto-reopens that pane if the user had it closed.',
|
|
9959
|
-
'- For a secondary canvas (e.g. side-by-side comparison), write to `wd-preview` the same way.',
|
|
9960
|
-
'- DO NOT write to `wd-browser` or `wd-log` — the dashboard rejects those patches with an error.',
|
|
9961
|
-
'- DO NOT write to `wd-debug-*`; use `debug_getState`, `debug_getCallStack`, `debug_setLevel`, `debug_openView`, and `debug_selectEvent`.',
|
|
9962
|
-
'- For your own persistent widget (won\'t be overwritten by anything), spawn with `layout_addWidget` and pick your own id.',
|
|
9963
|
-
'',
|
|
9964
|
-
describeDashboardViewsForPrompt(viewRegistry),
|
|
9965
|
-
'',
|
|
9966
|
-
describePaneStateForPrompt(),
|
|
9967
|
-
].join('\n');
|
|
9968
|
-
} catch {
|
|
9969
|
-
// Workspace snapshot is best-effort — a failure here must not
|
|
9970
|
-
// break the chat turn. Return empty so the user message flows
|
|
9971
|
-
// through unchanged.
|
|
9972
|
-
return '';
|
|
9973
|
-
}
|
|
9974
|
-
};
|
|
9975
|
-
|
|
9976
9804
|
// ── LLM layout tools (W5) ──
|
|
9977
9805
|
// Host-level tools that let the chat LLM reshape the dashboard.
|
|
9978
9806
|
// When a plugin is active the tools edit its layout directly; when
|
|
@@ -12811,43 +12639,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
12811
12639
|
onContextMenuMouse: (ev) => ctxMenuWire.onMouse(ev),
|
|
12812
12640
|
});
|
|
12813
12641
|
};
|
|
12814
|
-
const openBrowserOnlyModal = (): void => {
|
|
12815
|
-
const { cols: tc, rows: tr } = termSize();
|
|
12816
|
-
const liveMode = resolveBrowserPreviewModalLiveMode(process.env.ELANOUS_PANE_MODAL_LIVE);
|
|
12817
|
-
void openBrowserPaneModal({
|
|
12818
|
-
browserWidgetInstanceId: browserWidgetInstanceIdForView(workingDir.view),
|
|
12819
|
-
liveMode,
|
|
12820
|
-
browserPaneRegistry,
|
|
12821
|
-
widgetHost,
|
|
12822
|
-
coordinator: display,
|
|
12823
|
-
termCols: tc,
|
|
12824
|
-
termRows: tr,
|
|
12825
|
-
captureSnapshot: () => captureDeferredPane('browser'),
|
|
12826
|
-
theme: currentThemeTokens(),
|
|
12827
|
-
fmtEntryColored,
|
|
12828
|
-
iconForEntry,
|
|
12829
|
-
onSubmit: dispatchSidebarSubmit,
|
|
12830
|
-
onDispose: () => { draw(); },
|
|
12831
|
-
onCancel: () => { draw(); },
|
|
12832
|
-
});
|
|
12833
|
-
};
|
|
12834
|
-
const openPreviewOnlyModal = (): void => {
|
|
12835
|
-
const { cols: tc, rows: tr } = termSize();
|
|
12836
|
-
const liveMode = (process.env.ELANOUS_PANE_MODAL_LIVE ?? 'on').toLowerCase() !== 'off';
|
|
12837
|
-
void openPreviewPaneModal({
|
|
12838
|
-
preview: dockedPreview,
|
|
12839
|
-
previewWidgetInstanceId: 'wd-preview',
|
|
12840
|
-
liveMode,
|
|
12841
|
-
widgetHost,
|
|
12842
|
-
coordinator: display,
|
|
12843
|
-
termCols: tc,
|
|
12844
|
-
termRows: tr,
|
|
12845
|
-
captureSnapshot: () => captureDeferredPane('preview'),
|
|
12846
|
-
theme: currentThemeTokens(),
|
|
12847
|
-
onDispose: () => { draw(); },
|
|
12848
|
-
onCancel: () => { draw(); },
|
|
12849
|
-
});
|
|
12850
|
-
};
|
|
12851
12642
|
registerDashboardGlobalKeys({
|
|
12852
12643
|
enableSupplementalGlobalKeys: getUserConfig().dashboard.enableSupplementalGlobalKeys,
|
|
12853
12644
|
register: (binding) => { display.registerKeyBinding(binding); },
|
|
@@ -13071,6 +12862,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13071
12862
|
repaint: () => void;
|
|
13072
12863
|
insertAtCursor?: (text: string) => void;
|
|
13073
12864
|
submit?: (request?: string | TextInputExternalSubmitRequest) => void;
|
|
12865
|
+
getBufferText?: () => string;
|
|
13074
12866
|
} = { repaint: () => {} };
|
|
13075
12867
|
repaintPromptAfterRender = () => {
|
|
13076
12868
|
if (shouldSuppressDashboardBottomArea()) {
|
|
@@ -13094,6 +12886,13 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13094
12886
|
// safe. Dispose on process exit to keep the listener set clean.
|
|
13095
12887
|
const disposeResizeListener = installResizeListener({ draw: (opts) => draw(opts), promptCtl });
|
|
13096
12888
|
process.on('exit', disposeResizeListener);
|
|
12889
|
+
// 외부 주입(`pty text`)을 사용자 타이핑과 섞지 않고 별도 대기열로 — 결함 #6(10-14).
|
|
12890
|
+
const disposeExternalInputHost = registerExternalInputHost(createDashboardExternalInputHost({
|
|
12891
|
+
isTurnActive: () => streamingInFlight,
|
|
12892
|
+
promptCtl,
|
|
12893
|
+
pushNotice: (line) => { chatLines.push(C.muted(` ${line}`)); chatScrollOffset = -1; draw(); },
|
|
12894
|
+
}));
|
|
12895
|
+
process.on('exit', disposeExternalInputHost);
|
|
13097
12896
|
|
|
13098
12897
|
const publishScratchSurface = (
|
|
13099
12898
|
source: string,
|
|
@@ -13112,6 +12911,13 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13112
12911
|
const detailViewerRuntime = createDashboardDetailViewerRuntime({
|
|
13113
12912
|
setOpen: (open) => { setCompanionPopupOpen('detail', open); },
|
|
13114
12913
|
requestRender: () => { requestDashboardRender('detail'); },
|
|
12914
|
+
// 채팅 단독 화면에선 그리드 투영이 안 돌아 팝업이 «(no preview content)» 였다 — 그리기 전에 싣는다.
|
|
12915
|
+
project: (snapshot) => {
|
|
12916
|
+
const detailWidget = widgetHost.get('wd-detail') as WidgetInstance<Record<string, unknown>> | null;
|
|
12917
|
+
if (detailWidget?.state && typeof detailWidget.state === 'object') {
|
|
12918
|
+
companionWidgetRuntime.projectDetailWidget(detailWidget, snapshot);
|
|
12919
|
+
}
|
|
12920
|
+
},
|
|
13115
12921
|
});
|
|
13116
12922
|
const companionWidgetRuntime = createDashboardCompanionWidgetRuntime();
|
|
13117
12923
|
const clipboardHistoryRuntime = createDashboardClipboardHistoryRuntime();
|
|
@@ -13801,6 +13607,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13801
13607
|
let session: TerminalSession;
|
|
13802
13608
|
try {
|
|
13803
13609
|
if (req.kind === 'shell') {
|
|
13610
|
+
const shellSeat = resolveTuiShellSeat(req.cwd, process.env.COORD_ID);
|
|
13804
13611
|
session = sessionRegistry.spawn(
|
|
13805
13612
|
{
|
|
13806
13613
|
title: 'terminal',
|
|
@@ -13808,6 +13615,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13808
13615
|
command: req.command,
|
|
13809
13616
|
env: req.env,
|
|
13810
13617
|
kind: 'shell',
|
|
13618
|
+
useRegistry: true,
|
|
13619
|
+
registryKind: 'shell',
|
|
13620
|
+
registryNickname: `tui-shell:${req.cwd}`,
|
|
13621
|
+
registryOrigin: { originRoot: 'elanous-internal', controller: 'tui-shell' },
|
|
13622
|
+
registryPurpose: `tui-shell:${shellSeat}`,
|
|
13623
|
+
registrySeat: shellSeat,
|
|
13811
13624
|
onExit: handleExit,
|
|
13812
13625
|
onTitleAction: handleTitleAction,
|
|
13813
13626
|
},
|
|
@@ -13899,8 +13712,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13899
13712
|
openInteractiveTerminalPopup,
|
|
13900
13713
|
});
|
|
13901
13714
|
const TerminalPopup = terminalPopupRuntime;
|
|
13902
|
-
const spawnGlobalTerminalModal = (): void => {
|
|
13903
|
-
|
|
13715
|
+
const spawnGlobalTerminalModal = (command?: string): void => {
|
|
13716
|
+
openInteractiveTerminalPopup({ kind: 'shell', cwd: workingDir.cwd, command });
|
|
13904
13717
|
};
|
|
13905
13718
|
|
|
13906
13719
|
// E3 (2026-05-17) — copyLastAssistantTurnToClipboard /
|
|
@@ -14022,7 +13835,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
14022
13835
|
},
|
|
14023
13836
|
toggleLogZoom: () => { toggleChatOnlyLayout(); },
|
|
14024
13837
|
copyLastBlock: copyLastAssistantTurnToClipboard,
|
|
14025
|
-
spawnTerminalModal: spawnGlobalTerminalModal,
|
|
13838
|
+
spawnTerminalModal: () => spawnGlobalTerminalModal(),
|
|
14026
13839
|
copyLogPane: copyLogPaneToClipboard,
|
|
14027
13840
|
// Ctrl+L — 터미널 클리어 후 전체 강제 리페인트(resize 리스너와 동일 레시피).
|
|
14028
13841
|
// 외부 출력/아티팩트로 더러워진 화면 복구용 · 대화(chatLines)는 보존.
|
|
@@ -14091,6 +13904,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
14091
13904
|
},
|
|
14092
13905
|
onPreviewTerminalExpandChanged: chordFeedbackRuntime.onPreviewTerminalExpandChanged,
|
|
14093
13906
|
onMissingPreviewTerminal: chordFeedbackRuntime.onMissingPreviewTerminal,
|
|
13907
|
+
// #19 — Ctrl+X f from a pane; the input path is the `ctrl+x f` input-core binding.
|
|
13908
|
+
toggleAllFolds: toggleAllLogFolds,
|
|
14094
13909
|
});
|
|
14095
13910
|
|
|
14096
13911
|
// ══════════════════════════════════════════════════════════════
|
|
@@ -15369,6 +15184,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15369
15184
|
// adds turn concurrency must key this by turn (or session+turn) first.
|
|
15370
15185
|
let acpTurnToolSpecs: LLMToolSpec[] = [];
|
|
15371
15186
|
let acpDispatchToolSelf: CoreTurnDispatchTool | null = null;
|
|
15187
|
+
let acpToolDispatchCount = 0;
|
|
15372
15188
|
const trMod = await import('../tool-runtime/index.js');
|
|
15373
15189
|
trMod.registerAllDefaultToolRuntimes();
|
|
15374
15190
|
acpToolRuntime = trMod;
|
|
@@ -15423,6 +15239,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15423
15239
|
modelFamily: getModelFamily(inspectActiveProvider().model),
|
|
15424
15240
|
rich: false,
|
|
15425
15241
|
enabledTools: tools.map(t => t.name),
|
|
15242
|
+
seatBoot: true,
|
|
15426
15243
|
}),
|
|
15427
15244
|
];
|
|
15428
15245
|
},
|
|
@@ -15452,35 +15269,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15452
15269
|
// Codex-first decision as every other surface. The core bridge now
|
|
15453
15270
|
// supplies userText to resolveModel, preserving explicit pins and
|
|
15454
15271
|
// making this the actual model override rather than a display hint.
|
|
15455
|
-
|
|
15456
|
-
|
|
15457
|
-
const decision = resolveRouteDecision({
|
|
15458
|
-
provider: cfg.llm.provider,
|
|
15459
|
-
configuredModel: inspectActiveProvider().model,
|
|
15460
|
-
text: userText,
|
|
15461
|
-
routePolicy: cfg.llm.routePolicy,
|
|
15462
|
-
});
|
|
15463
|
-
// Badge truthfulness(2026-07-19 goal-exec) — resolveRouteDecision 의 codex
|
|
15464
|
-
// tier-policy 브랜치는 curated effort(예: balanced=low)를 찍지만, codex provider 는
|
|
15465
|
-
// 그 값을 wire 로 보내지 않는다: 실제 effort 는 effectiveReasoningLevel(cfg)(config
|
|
15466
|
-
// 주도, reasoningLevel 미설정 시 model-default high). 그대로 두면 완료 뱃지가
|
|
15467
|
-
// "terra(low)" 로 떠 사용자가 모델이 약하게 돈다고 오해한다(실제 high). 실제 wire
|
|
15468
|
-
// effort 로 덮어써 뱃지를 진실하게. decision.effort 는 표시 전용이라 라우팅 무영향.
|
|
15469
|
-
const trueEffort = effectiveReasoningLevel(cfg.llm, decision.provider, decision.model);
|
|
15470
|
-
const badgedDecision = trueEffort && trueEffort !== 'off'
|
|
15471
|
-
? { ...decision, effort: trueEffort }
|
|
15472
|
-
: decision;
|
|
15473
|
-
recordCurrentRouteDecision('dashboard', badgedDecision);
|
|
15474
|
-
if (debug.enabled) debug.log('llm.route-decision', 'dashboard-acp', {
|
|
15475
|
-
provider: decision.provider, model: decision.model, mission: decision.mission, source: decision.source,
|
|
15476
|
-
});
|
|
15477
|
-
return decision.model || null;
|
|
15478
|
-
},
|
|
15272
|
+
// 본체 = acp-active-model.ts(실물 경로를 시험이 그대로 부르도록 뺐다 · TUI-MODEL-SESSION-SCOPE).
|
|
15273
|
+
getActiveModel: ({ userText }) => resolveDashboardActiveModel(userText),
|
|
15479
15274
|
// ⭐ The assignment is deliberate, not a typo: it captures a reference to
|
|
15480
15275
|
// this very dispatcher so `agentDispatchTool` below can route a
|
|
15481
15276
|
// sub-agent's tool calls back through it. A plain named const would need
|
|
15482
15277
|
// the closure hoisted out of this literal; this keeps the diff local.
|
|
15483
15278
|
dispatchTool: acpDispatchToolSelf = async (name, args, ctx) => {
|
|
15279
|
+
// Count at the server-side boundary, before any tool effect and
|
|
15280
|
+
// before the ACP notification can reach the TUI client.
|
|
15281
|
+
acpToolDispatchCount++;
|
|
15484
15282
|
const runtime = acpToolRuntime;
|
|
15485
15283
|
const persist = acpPersistToolOutputPreview;
|
|
15486
15284
|
if (!runtime || !persist) {
|
|
@@ -15702,16 +15500,36 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15702
15500
|
}
|
|
15703
15501
|
subscribeSessionCwd((state) => { pushProjectSuggestion(state.cwd); });
|
|
15704
15502
|
chatScrollOffset = -1;
|
|
15705
|
-
|
|
15503
|
+
const firstScreenBandInput = {
|
|
15706
15504
|
history: chat.history,
|
|
15707
15505
|
lines: chatLines,
|
|
15708
15506
|
width: Math.max(0, termSize().cols - 4),
|
|
15709
15507
|
// The band ships ko/en only; any other detected locale keeps the English rows.
|
|
15710
|
-
locale: detectLocale() === 'ko' ? 'ko' : 'en',
|
|
15508
|
+
locale: detectLocale() === 'ko' ? 'ko' as const : 'en' as const,
|
|
15711
15509
|
draw: () => draw(),
|
|
15712
|
-
observe: (data) => { try { debug.log('dashboard.first-screen-band', 'resolved', data); } catch { /* observation is best-effort */ } },
|
|
15713
|
-
}
|
|
15510
|
+
observe: (data: { daemon: boolean; hasPwa: boolean; hasTailnet: boolean }) => { try { debug.log('dashboard.first-screen-band', 'resolved', data); } catch { /* observation is best-effort */ } },
|
|
15511
|
+
};
|
|
15512
|
+
void (bootBannerMode === 'full'
|
|
15513
|
+
? renderDashboardFirstScreenBand(firstScreenBandInput)
|
|
15514
|
+
: renderMinimalBootBand({
|
|
15515
|
+
...firstScreenBandInput,
|
|
15516
|
+
guidance: needsOnboarding(getUserConfig()),
|
|
15517
|
+
held: bootBannerHeld,
|
|
15518
|
+
show: () => runNexusShow({ format: 'json', out: { log: () => {}, error: () => {} } }),
|
|
15519
|
+
daemonLink: resolveTuiDaemonLink,
|
|
15520
|
+
styleFailure: (line) => C.warning(line),
|
|
15521
|
+
observeHeld: (data) => { try { debug.log('dashboard.first-screen-band', 'held', data); } catch { /* observation is best-effort */ } },
|
|
15522
|
+
}));
|
|
15714
15523
|
|
|
15524
|
+
// 🪪 L1 — 자리 부트(seat-boot-preamble.ts): 자리면 첫 화면에 한 줄.
|
|
15525
|
+
// 🪪 L2-lite(seat-local-instructions.ts): 자리 로컬 지시가 없으면 템플릿 생성(덮어쓰기 0) ⊕ 대화 끝 «지난 세션» 기록.
|
|
15526
|
+
const seatLocal = ensureSeatLocalInstructions(getSessionCwd());
|
|
15527
|
+
if (seatLocal.status === 'created') chatLines.push(C.muted(` 📝 자리 로컬 지시를 만들었다 — ${seatLocal.path} (사람이 고쳐도 된다)`));
|
|
15528
|
+
else if (seatLocal.status === 'exists' && seatLocal.missingPrinciple) chatLines.push(C.muted(` 💡 ${seatLocal.path} 에 제1원칙 절이 없다 — 넣을지 사람이 정한다(덮어쓰지 않음)`));
|
|
15529
|
+
installSeatSessionRecorder({ getCwd: () => getSessionCwd(), getHistory: () => chat.history });
|
|
15530
|
+
const seatBoot = describeSeatBoot(getSessionCwd());
|
|
15531
|
+
if (seatBoot) chatLines.push(C.muted(` 🪪 ${seatBoot.seat} 자리 · 안 읽은 우편 ${seatBoot.unread ?? '미관측'} — 부트 카드를 턴마다 싣는다`));
|
|
15532
|
+
if (dashboardAcpBootResult.mode !== 'resumed' && !opts.resumeSessionId) startSeatBootConversation({ reason: 'boot' });
|
|
15715
15533
|
tuiSeatAskTimer = setInterval(pollTuiSeatAnswers, 10_000);
|
|
15716
15534
|
tuiSeatAskTimer.unref();
|
|
15717
15535
|
pollTuiSeatAnswers();
|
|
@@ -16696,7 +16514,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16696
16514
|
sync.cursors[sync.focus] = Math.max(0, Math.min(sync.cursors[sync.focus]! + delta, sync.lists[sync.focus]!.length - 1));
|
|
16697
16515
|
} else if (mr > logViewport.startRow && mr <= logViewport.endRow) {
|
|
16698
16516
|
// Scroll the log pane
|
|
16699
|
-
const maxScr =
|
|
16517
|
+
const maxScr = logScrollMax(logViewport.height);
|
|
16700
16518
|
chatScrollOffset = Math.max(0, Math.min((chatScrollOffset < 0 ? maxScr : chatScrollOffset) + delta, maxScr));
|
|
16701
16519
|
if (delta > 0 && chatScrollOffset >= maxScr) chatScrollOffset = -1;
|
|
16702
16520
|
}
|
|
@@ -16771,17 +16589,19 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16771
16589
|
// 테스트가 그 순서를 다시 베껴야 하고, 베낀 테스트는 배선 회귀를 못 잡는다.
|
|
16772
16590
|
const interrupted = lastTurnFinalStatus === 'interrupted';
|
|
16773
16591
|
const queuedBeforeDrain = turnTypeaheadRef.state.queuedSubmissions.length;
|
|
16774
|
-
|
|
16592
|
+
// ⭐ 드레인 → 레지스트리 해제 → Enter 주입은 다리 모듈이 한 함수로 한다(시험이 같은 함수를 문다).
|
|
16593
|
+
const drained = handoffTurnTypeaheadAtTurnEnd(turnTypeaheadRef, nextInitial, { interrupted }, () => {
|
|
16594
|
+
injectKey({ name: 'enter', ctrl: false, shift: false });
|
|
16595
|
+
});
|
|
16775
16596
|
lastTurnFinalStatus = undefined;
|
|
16776
|
-
turnTypeaheadRef.state = drained.state;
|
|
16777
16597
|
nextInitial = drained.nextInitial;
|
|
16778
16598
|
const queuedTurnEndText = drained.injectEnter ? drained.nextInitial : undefined;
|
|
16779
16599
|
if (interrupted && queuedBeforeDrain > 0) {
|
|
16780
16600
|
debug.log('dashboard.turn-typeahead', 'restored-after-interrupt', { count: queuedBeforeDrain });
|
|
16781
16601
|
}
|
|
16782
|
-
if (drained.injectEnter) injectKey({ name: 'enter', ctrl: false, shift: false });
|
|
16783
16602
|
draw();
|
|
16784
|
-
const
|
|
16603
|
+
const getInputCols = () => termSize().cols;
|
|
16604
|
+
const inputCols = getInputCols();
|
|
16785
16605
|
// Row is published by draw() via the `input-prompt` zone's
|
|
16786
16606
|
// resolved geometry — no `termRows - N` math here anymore.
|
|
16787
16607
|
// The composer is the single source of truth; if the layout
|
|
@@ -16792,6 +16612,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16792
16612
|
promptFrame: currentPromptFrame(termSize().rows),
|
|
16793
16613
|
getPromptFrame: () => currentPromptFrame(termSize().rows),
|
|
16794
16614
|
inputCols,
|
|
16615
|
+
getInputCols,
|
|
16795
16616
|
surfaceRegistry: getSurfaceRegistry(),
|
|
16796
16617
|
invalidateRenderCacheRow,
|
|
16797
16618
|
buildPromptFrameDividerRows,
|
|
@@ -16805,8 +16626,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16805
16626
|
paintFrameNow: () => drawNow(),
|
|
16806
16627
|
preferHistoryArrowKeys: slashQuickMode,
|
|
16807
16628
|
history: inputHistory,
|
|
16629
|
+
// TUI-INPUT-PLACEHOLDER-OFF — provider 가 있으면 빈 입력창은 비워 둔다(대표 «불필요한 가이드 없애라»).
|
|
16808
16630
|
placeholder: anyProviderAvailable()
|
|
16809
|
-
? '
|
|
16631
|
+
? ''
|
|
16810
16632
|
: '/quit /clear (run `elanous setup` — no LLM provider available)',
|
|
16811
16633
|
debugLog: debug.enabled ? (event, label, payload) => debug.log(event, label, payload) : undefined,
|
|
16812
16634
|
textInputOpts: {
|
|
@@ -17662,7 +17484,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
17662
17484
|
openDetailViewer: (title, lines) => { setDetailViewer(title, lines); },
|
|
17663
17485
|
},
|
|
17664
17486
|
undo: {
|
|
17665
|
-
refreshGitDirty: () => {
|
|
17487
|
+
refreshGitDirty: () => { void refreshGitDirtyAsync(getSessionCwd(), { force: true }).then(() => { try { draw(); } catch { /* noop */ } }, () => { /* noop */ }); },
|
|
17666
17488
|
bold: C.bold,
|
|
17667
17489
|
},
|
|
17668
17490
|
delta: {
|
|
@@ -18048,6 +17870,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18048
17870
|
pushTurnSeparator: () => { pushTurnSeparator(); },
|
|
18049
17871
|
getLogFoldMode: () => logFoldMode,
|
|
18050
17872
|
setLogFoldMode: (mode) => { logFoldMode = mode; },
|
|
17873
|
+
setAllFolds: (expanded) => foldStack.setAll(expanded),
|
|
18051
17874
|
copyEntireLog: async () => { await copyLogBlock(-1, 'all'); },
|
|
18052
17875
|
returnFocusToInput: () => {
|
|
18053
17876
|
const sourceFocus = workingDir.focus;
|
|
@@ -18145,6 +17968,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18145
17968
|
},
|
|
18146
17969
|
termSlash: {
|
|
18147
17970
|
slashRuntime: termSlashRuntime,
|
|
17971
|
+
openNewTerminal: spawnGlobalTerminalModal,
|
|
18148
17972
|
sessionRegistry: sessionRegistry as unknown as DashboardSlashContext['termSlash']['sessionRegistry'],
|
|
18149
17973
|
terminalMatrix: terminalMatrix as unknown as DashboardSlashContext['termSlash']['terminalMatrix'],
|
|
18150
17974
|
vwRegistry: {
|
|
@@ -18950,10 +18774,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18950
18774
|
userConfig: args.userConfig,
|
|
18951
18775
|
rich: false,
|
|
18952
18776
|
enabledTools: tools.map(t => t.name),
|
|
18777
|
+
seatBoot: true,
|
|
18953
18778
|
}),
|
|
18954
18779
|
];
|
|
18955
18780
|
},
|
|
18956
|
-
runAutoCompact: async ({ preamble, chatHistory, userMsg }) => {
|
|
18781
|
+
runAutoCompact: async ({ preamble, chatHistory, userMsg, onPrePassApplied }) => {
|
|
18957
18782
|
const compactMod = await import('../compact/index.js');
|
|
18958
18783
|
const { shouldAutoCompact, compactConversationPartial, compactConversation, runCompactPipeline, setVerifyProbeEnabled } = compactMod;
|
|
18959
18784
|
const { renderCompactBoundary } = await import('../chat/compact-boundary.js');
|
|
@@ -18992,8 +18817,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18992
18817
|
getCompactProvider: () => getDefaultCompactProvider(),
|
|
18993
18818
|
setVerifyProbeEnabled,
|
|
18994
18819
|
sessionId: attachedSessionId ?? undefined,
|
|
18820
|
+
onPrePassApplied,
|
|
18995
18821
|
});
|
|
18996
18822
|
},
|
|
18823
|
+
readToolDispatchCount: () => opts.remote ? null : acpToolDispatchCount,
|
|
18997
18824
|
attachChatStreamingKeys,
|
|
18998
18825
|
createOptionalSpecs: async () => {
|
|
18999
18826
|
const uc = (await import('../user-config.js')).getUserConfig();
|
|
@@ -19117,7 +18944,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
19117
18944
|
recordTurnMetrics: async (fullResponse) => {
|
|
19118
18945
|
await recordDashboardTurnMetrics({
|
|
19119
18946
|
chatHistory: chat.history as ChatMessage[],
|
|
19120
|
-
|
|
18947
|
+
// 실제 턴 모델로 기록한다 — 설정 모델이면 ctx 최대치·단가가 다른 모델 것이 된다.
|
|
18948
|
+
// ACP 서버가 사용량에 실어 보낸 턴 모델 → 없으면 백엔드가 확인한 runtime 모델 → 설정.
|
|
18949
|
+
model: latestTurnUsage?.model ?? inspectActiveProvider(undefined, activeAcpRuntimeModel()).model,
|
|
19121
18950
|
fullResponse,
|
|
19122
18951
|
turnStartedAt,
|
|
19123
18952
|
usage: latestTurnUsage,
|
|
@@ -19180,6 +19009,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
19180
19009
|
},
|
|
19181
19010
|
warningLine: (message) => C.warning(`${ICONS.warning} ${message}`),
|
|
19182
19011
|
pushErrorLine: (message) => { chatLines.push(C.error(`Error: ${message}`)); },
|
|
19012
|
+
pushFailureNotice: (notice, raw) => {
|
|
19013
|
+
chatLines.push(C.warning(notice));
|
|
19014
|
+
detailViewerRuntime.stage('turn error', raw.split(/\r?\n/));
|
|
19015
|
+
},
|
|
19183
19016
|
finalizeTurn: (finalStatus, finalError) => {
|
|
19184
19017
|
lastTurnFinalStatus = finalStatus;
|
|
19185
19018
|
clearEscAbortToolState(escAbortToolState);
|
|
@@ -19224,7 +19057,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
19224
19057
|
}
|
|
19225
19058
|
let goalLoopBudget = 100; // hard safety cap independent of /goal budget
|
|
19226
19059
|
let lastTurnAborted = false;
|
|
19060
|
+
let goalLoopIteration = 0;
|
|
19227
19061
|
do {
|
|
19062
|
+
// 앞 반복의 finalizeTurn 이 손잡이를 멈췄다 — 반복이 «실제로 시작될 때만» 새 표시를 단다(#5).
|
|
19063
|
+
thinking = goalLoopIterationThinking(goalLoopIteration++, thinking, () => startPinnedThinking({
|
|
19064
|
+
target: chatFooterLine,
|
|
19065
|
+
onFrame: () => { pinChatTail(); draw(); },
|
|
19066
|
+
message: 'Thinking',
|
|
19067
|
+
metrics: { startedAt: Date.now(), hint: 'esc 중단' },
|
|
19068
|
+
}));
|
|
19228
19069
|
const turnText = goalLoopUserText ?? tok.text;
|
|
19229
19070
|
await runDashboardChatMainSubmitIntent({
|
|
19230
19071
|
submit: createDashboardChatMainTurnSubmit({
|