elanous 0.2.27 → 0.2.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{Ev2jivDMTSoEc-5rIXdcy → cIpv5nU9AycwYWZI9H589}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{ab4d57c2.e90bc2cb31949045.js → 058a98ba.7eb28d5e6dc03565.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4565-67e4c620597965c8.js → 1015-9cba22a5a4554797.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1084-4e66af7376a18db7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1106.3a6410b7b0c70ad4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1127.32fc642f70423506.js +8 -0
- package/apps/pwa/out/_next/static/chunks/{1516.83dd2c1b86b4e507.js → 1142.65d002789ab3af7d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1189-d9b8e1995a831fae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1224.6da98c7ad0eb7dd8.js +34 -0
- package/apps/pwa/out/_next/static/chunks/1370.4e3e2558f111fd5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1514-b7da377fdc4eb17a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1516.dfaceff3fd2d0e0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1577.3c24c32584e10d70.js +286 -0
- package/apps/pwa/out/_next/static/chunks/161.130a569855c4d68c.js +24 -0
- package/apps/pwa/out/_next/static/chunks/1782-59db1b5aa06df38a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1743.563d3168e95825ef.js → 1852.7f7b53991fcb99ef.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1864.16da9556e78a9236.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1b6f6b2a.aff090122be3726e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2341.e8a9135e5b910dd5.js +36 -0
- package/apps/pwa/out/_next/static/chunks/257.10afdbe3520f2fc2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2658.87550e692dc493f6.js +64 -0
- package/apps/pwa/out/_next/static/chunks/2673.85e2f02efae7a85f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2766-bee623b37472ed63.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2794.6d836872b0bf43e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2806.eb57ced1a528ed39.js +1 -0
- package/apps/pwa/out/_next/static/chunks/283.7a121c4910e6dad7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{65ebff95.081daeff622d238e.js → 285adb1a.5654e605dddf86d2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2870.1dc29aa5fc01f09f.js +115 -0
- package/apps/pwa/out/_next/static/chunks/293.fd38e77ce5d48103.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2993-5952a1cd3fd5d441.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3160-95c96f4d2a21dd26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/32-a523427c5bd5ed00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3280.af38002a6424a905.js +90 -0
- package/apps/pwa/out/_next/static/chunks/328bb3ab-6628a1114fe3fb3b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3292-5ddffdb2f517b44f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9917-9e26abc5f7772735.js → 3396-97b97928c49190c9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6196.34d6b229079e9e28.js → 3403.7199205e65124486.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3523.d3231daaf7aba993.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3763.577de3181e1e6ea0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4138-cc56b0938ef72783.js +1 -0
- package/apps/pwa/out/_next/static/chunks/419.736c0d6f426249a7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4255-8350c43d307a8875.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6def8a8e.c81f9ca41028eccf.js → 425cfc4d.fb91158e3971c39f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4352.a4954693499c2714.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4421-f2dcbc6fd80ec013.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4513-51b94aeee37c9905.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{16e57f67.3ea19e893461e611.js → 46bd8bea.2f4b4099172fcdb7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5081.a240b63fad28663a.js → 4759.1f76713aefb87db5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4928-c3b72f99aa588699.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4986-f9fc0283fb325219.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5014.671a7b9f69c2b7b1.js +94 -0
- package/apps/pwa/out/_next/static/chunks/5137.d398e24710b3feb6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5298.0bea74885cabe754.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5315.74c53a39739b11c4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5317-8b1df8d02105cd07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5358-33051f41a2b239af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5388.a2ec02501f714ad5.js +62 -0
- package/apps/pwa/out/_next/static/chunks/5395.e6ac948a2d15058d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5409-f282bf533c151849.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5466.d0f4aba9d52acfa8.js +27 -0
- package/apps/pwa/out/_next/static/chunks/5564.3d28b353470fe305.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{9974.e77b4ff4884557b3.js → 5591.a35e7a217734a8b9.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/569.b0cbfb4dee4a167a.js +93 -0
- package/apps/pwa/out/_next/static/chunks/5835-72465b73a8bb8d74.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5941.045d6093139e1f7a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5492-e05e26a033ba80d2.js → 6013-2f769370d8b4c2c6.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6228.47cabb83564dfe54.js +24 -0
- package/apps/pwa/out/_next/static/chunks/6457-8d1993002a87d0fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6513.ef54cfae52351982.js +2 -0
- package/apps/pwa/out/_next/static/chunks/{5408.377c8c543635b81f.js → 6534.1ab00f370db7b105.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6582.13d245bf87df69f1.js +148 -0
- package/apps/pwa/out/_next/static/chunks/6655.c33f6acc2c61bb89.js +149 -0
- package/apps/pwa/out/_next/static/chunks/6731-9d7195af289c8d4c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6733.0be05b1db9279fc5.js +79 -0
- package/apps/pwa/out/_next/static/chunks/6742-90937146253a8b9e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8578.dff22d988cc2b106.js → 6767.1fcfc9b8be83975f.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/6776.06ff1e3b464cc607.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9311.24c8f5ea793253dd.js → 6853.cc5174a9dee59593.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/687-816858f77a396a4e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6888.72c7b8cfb02a7e61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6993.c17c828ac3ef3253.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7076.9f27ef666b0cefdd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7113.1403c5d451804e8c.js +287 -0
- package/apps/pwa/out/_next/static/chunks/7169.9dd603c726c2cd7c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7247-e3ec21f761f86710.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7261-a47b72f96f5199df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7335-5cda81ac90310077.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7356-c2e4af090546e2d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{94.4cfed21c0b781a06.js → 7375.050ea0d72968e49f.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/738-59518742078fda71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7385.a7375f10db73243a.js +77 -0
- package/apps/pwa/out/_next/static/chunks/7445.cf1cf2fe109bcd96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7505.a2057432ab6ef99a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7515.31f45fac1f9c70cb.js +74 -0
- package/apps/pwa/out/_next/static/chunks/7658-d4ce8c72a9548a91.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7725-4f83d5541fbdb81b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8107-0b1ae46bc5bcb788.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8132.bfea2f016ce8d992.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8332.6f0f49df772e163b.js +23 -0
- package/apps/pwa/out/_next/static/chunks/{7483.ba01c6c209b81bba.js → 8398.73a19b39715eda04.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2846.d6a433b8663819a5.js → 8471.8d2a8c74f09c36ff.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/8672.e299832bc7d18ee2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8735.f1ef798a5f260f6f.js +226 -0
- package/apps/pwa/out/_next/static/chunks/{5785-ea8d2c633b6688e3.js → 8767-2f6a634f5abeaa01.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8774-88f67f7d8d53d299.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8782.252e5a405d86e4ed.js +32 -0
- package/apps/pwa/out/_next/static/chunks/8795.32573a185af18c7b.js +41 -0
- package/apps/pwa/out/_next/static/chunks/909-9ed7aa0dba804316.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9100.22b0301256827007.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9140-dde77575570bc71e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4593.10f5b9bd702d4a6c.js → 9143.ff14585db1d275ff.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9292-a7ad9a01c7044b93.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9517.00627dc51b02821c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9725.dcbb585652d8e9c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9761.a3ebf5c389c24ddc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4204.a409ab6250c0f6a8.js → 9907.49be0fcadaf214b5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9972.834d2b2b7d48f1ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9995-1a90486f5ae01546.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{973cbf1b.3bbcf2b41548eca7.js → a435ad95.577add051b4facb2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-83372d8b5863ebf7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d69256d7613c140a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-352c5e9ba3f9b858.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-69f1d725524201a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-a5635eba0d73b84e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ad9181d84285e4ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-86feb08080261a2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-ffa15987e4756d03.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-11a3ab44ac327cc1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-6309b11c4264d24d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-8800472079612e87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-d387bf3f2301882a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-048f88d8c8658da6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6c14f9739b7f6880.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-2834f44f64e98d74.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-83372d8b5863ebf7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-a13df6f88e824887.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-8a4397248754cf2b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-daf0bd329360a336.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-f7ef1c28764cb476.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-61e74f28b9353dac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/{page-ff27902d0b11ef4f.js → page-8aaa6dedc4c10dfb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-294602ba649be829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-5fa5f41ed3fce323.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-25a302273b054fd7.js → page-33bf667a5fb297bf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-5ae3cbd6e5dba515.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-eb867d16ad6fdede.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1ab789fa68682f7e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6fd41b5b6ff13a71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fb3d5f7642c99fba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-70f705b2b5ed42ca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-c9c93b358a7667b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1563c556b81c96ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ce89c20c45b3a673.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-423ae63d786f4ee9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-591a5378a4c4447c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-a250496b19a5824b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-c36a9277febc5911.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-83372d8b5863ebf7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-29900ed0011b2c83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-a5de57edc6d7f942.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-16bdd4c9f40498df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-75e946e6e71cc6d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-87b88f551f421d8b.js → page-9eb56166774eb256.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-1c5f9ef35dbb22c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-657ff9985e508498.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-22dc72499da68fb2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9f92737b8766009a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-094ad334e40f8169.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-8bcd379852ff6287.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-6b04413f280cd344.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{f4dfbfc0.a69fb12f854882aa.js → bc324b7c.02a09dd93f6a399b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/de70ab42-d28d47437208d458.js +1 -0
- package/apps/pwa/out/_next/static/chunks/f800c5e3.46dbd7f2af8c3fce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/f8bc19ad.47579f6d684b0760.js +122 -0
- package/apps/pwa/out/_next/static/chunks/framework-ca9ac4609fb9fed8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-0dd08d32d15a030f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-f0399d33955c4e01.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-d42caca6f8ac2211.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-42e713c13aa41ca8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-8fbf8f61a377aa16.js +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/graphs/implement-loop.yaml +38 -1
- package/graphs/release/release-loop.yaml +6 -2
- package/graphs/steward/recipes.yaml +6 -0
- package/graphs/steward/release-day.yaml +23 -0
- package/graphs/steward/steward.yaml +9 -1
- package/graphs/work/code-pr.yaml +23 -0
- package/package.json +1 -1
- package/plugins/agent-team/agents/research.md +1 -0
- package/scripts/browser-observe-cycle.ts +76 -2
- package/scripts/ci-typecheck-changed.ts +53 -19
- package/scripts/coord-channel-watch.sh +26 -6
- package/scripts/coord-role-pack.ts +143 -0
- package/scripts/detect-test-interference.ts +31 -1
- package/scripts/lib/morning-report-options.ts +41 -0
- package/scripts/pr-land-extra-remote-gates.ts +49 -0
- package/scripts/release-loop/docs-node.ts +51 -22
- package/scripts/release-loop/gate-batch-safe.ts +23 -0
- package/scripts/release-loop/gate-history.ts +422 -0
- package/scripts/release-loop/gate-node.ts +336 -39
- package/scripts/release-loop/gate-triage-node.ts +190 -0
- package/scripts/release-loop/node-verdict.ts +3 -1
- package/scripts/release-loop/publish-node.ts +3 -0
- package/scripts/release-loop/spawn-lane.ts +68 -0
- package/scripts/release-loop/tui-node-checks.ts +28 -2
- package/scripts/release-loop/version-node.ts +62 -4
- package/scripts/skills/public-check.ts +5 -2
- package/scripts/test-deterministic.ts +549 -37
- package/scripts/usage-rollup.ts +11 -3
- package/scripts/ux-sim.ts +7 -1
- package/scripts/verify-kpack6-live.ts +230 -0
- package/src/acp/codex-plugins.ts +17 -0
- package/src/acp/core-turn-bridge.ts +98 -22
- package/src/acp/elanous-extensions.ts +2 -0
- package/src/acp/server.ts +2 -0
- package/src/agent/ref-grounding.ts +18 -0
- package/src/agent/task-notification.ts +2 -1
- package/src/agent-mission/in-agent-plugin.ts +8 -3
- package/src/agent-substrate/pr-reviewer.ts +29 -21
- package/src/agent-substrate/self-review-cli.ts +34 -10
- package/src/briefing/brief-items.ts +151 -35
- package/src/budget/llm-cost.ts +25 -2
- package/src/budget/pty-usage-reemit.ts +7 -0
- package/src/budget/run-usage-rollup.ts +9 -0
- package/src/budget/usage-daily-store.ts +98 -0
- package/src/budget/usage-outcomes.ts +32 -0
- package/src/capture/tui-self-report.ts +22 -4
- package/src/chat/index.ts +31 -10
- package/src/chat/pickers/modal-runtime.ts +1 -0
- package/src/chat/pickers/modals.ts +3 -1
- package/src/chat/turn-typeahead.ts +123 -16
- package/src/claims/claims-ledger.ts +23 -0
- package/src/claims/claims-render.ts +22 -2
- package/src/cli/brief-cli.ts +131 -10
- package/src/cli/claims-cli.ts +24 -4
- package/src/cli/dashboard-name-flag.ts +48 -0
- package/src/cli/doctor-cli.ts +80 -0
- package/src/cli/log-event-names.ts +12 -0
- package/src/cli/msg-cli.ts +210 -11
- package/src/cli/plugin-cli.ts +11 -3
- package/src/cli/pr-cli.ts +443 -104
- package/src/cli/pr-land-heavy-remote.ts +233 -0
- package/src/cli/pr-land-overlap-evidence.ts +104 -5
- package/src/cli/pr-land-refusal.ts +20 -0
- package/src/cli/pty-takeover-cli.ts +125 -16
- package/src/cli/release-cli.ts +46 -2
- package/src/cli/remote-resolve.ts +2 -1
- package/src/cli/rfc-cli.ts +24 -0
- package/src/cli/seat-cli.ts +26 -16
- package/src/cli/tailscale-serve.ts +5 -8
- package/src/cli/tasks-cli.ts +400 -27
- package/src/cli/usage-cli.ts +155 -16
- package/src/cli/usage-daily-cli.ts +84 -0
- package/src/context-bus/context-now.ts +82 -5
- package/src/core-turn/auth-rejected-notice.ts +41 -0
- package/src/core-turn/run-core-turn.ts +13 -2
- package/src/core-turn/run-goal-loop.ts +17 -1
- package/src/core-turn/short-question.ts +45 -12
- package/src/core-turn/types.ts +7 -0
- package/src/dashboard/acp-active-model.ts +40 -0
- package/src/dashboard/auto-compact-runtime.ts +2 -0
- package/src/dashboard/boot-banner.ts +80 -0
- package/src/dashboard/dashboard-status-lines.ts +11 -0
- package/src/dashboard/detail-viewer-runtime.ts +15 -2
- package/src/dashboard/event-loop-stall-monitor.ts +4 -0
- package/src/dashboard/first-screen-band.ts +63 -13
- package/src/dashboard/goal-loop-thinking.ts +16 -0
- package/src/dashboard/hitl-boot.ts +9 -4
- package/src/dashboard/index.ts +235 -389
- package/src/dashboard/input/chat-main-entry-runtime.ts +2 -0
- package/src/dashboard/input/chat-main-log-actions.ts +4 -0
- package/src/dashboard/input/chat-main-log-command.ts +12 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +172 -3
- package/src/dashboard/input/chat-main-session.ts +6 -2
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/chat-main-turn.ts +2 -1
- package/src/dashboard/input/compact-prepass-recovery.ts +97 -0
- package/src/dashboard/input/dashboard-chord-actions.ts +10 -1
- package/src/dashboard/input/dashboard-chord-runtime.ts +2 -0
- package/src/dashboard/input/external-input-host.ts +45 -0
- package/src/dashboard/input/log-fold-binding.ts +18 -0
- package/src/dashboard/input/mouse-wiring.ts +17 -4
- package/src/dashboard/input/turn-steer-bridge.ts +94 -0
- package/src/dashboard/log-click-runtime.ts +5 -3
- package/src/dashboard/running-build-status.ts +74 -0
- package/src/dashboard/seat-boot-preamble.ts +113 -0
- package/src/dashboard/seat-local-instructions.ts +305 -0
- package/src/dashboard/skill-detection-runtime.ts +24 -4
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +100 -28
- package/src/dashboard/slash-runtime/model-choices.ts +35 -0
- package/src/dashboard/term-slash-runtime.ts +15 -0
- package/src/dashboard/turn-preamble.ts +30 -2
- package/src/dashboard/turn-session-layers.ts +176 -0
- package/src/dashboard/turn-stream-formatter.ts +14 -6
- package/src/dashboard/turn-stream-presentation-applier.ts +8 -0
- package/src/domains/morning-report.ts +3 -1
- package/src/domains/release-tool.ts +8 -9
- package/src/domains/surface-events.ts +4 -1
- package/src/domains/watch-default-scheduler.ts +8 -9
- package/src/fold-stack.ts +24 -1
- package/src/git-fs/dirty.ts +32 -4
- package/src/git-fs/index.ts +43 -1
- package/src/github/pr-labels.ts +10 -4
- package/src/graph-runner/runner.ts +102 -14
- package/src/harness/harness-clean.ts +21 -3
- package/src/harness/harness-cli-command.ts +22 -6
- package/src/harness/harness-gc.ts +32 -5
- package/src/harness/harness-pod-dispatch.ts +11 -4
- package/src/hq/seats.ts +17 -3
- package/src/index.ts +48 -6
- package/src/input/external-input-queue.ts +219 -0
- package/src/intelligence-map/model-bench-scores.ts +102 -0
- package/src/interactive-terminal-modal.ts +13 -0
- package/src/llm/route-decision.ts +25 -0
- package/src/llm-stream-retry-display.ts +59 -0
- package/src/llm.ts +253 -55
- package/src/log-entry.ts +3 -3
- package/src/log-pane/search.ts +29 -4
- package/src/loops/agent-reply.ts +256 -0
- package/src/loops/budget.ts +37 -7
- package/src/loops/loop-cli.ts +3 -2
- package/src/loops/msg-address.ts +57 -0
- package/src/loops/msg-wake.ts +282 -0
- package/src/loops/orchestrator/inbox.ts +130 -0
- package/src/loops/orchestrator/resync-shadow.ts +100 -12
- package/src/loops/orchestrator/tick.ts +94 -3
- package/src/loops/registry.ts +42 -4
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/memory.ts +20 -5
- package/src/msg/msg-sse-server.ts +141 -0
- package/src/msg/msg-store.ts +84 -14
- package/src/native-tool-catalog.ts +125 -0
- package/src/nexus/api/http-server.ts +5 -0
- package/src/nexus/api/ops-api.ts +2 -0
- package/src/nexus/api/project-autopsy.ts +127 -0
- package/src/nexus/api/terminals.ts +3 -0
- package/src/nexus/api/workflow-approvals.ts +2 -0
- package/src/nexus/onboarding/first-boot-wizard.ts +56 -2
- package/src/oauth/codex-account-store.ts +15 -3
- package/src/oauth/codex-billing-route.ts +31 -0
- package/src/ops/overview-collect.ts +19 -2
- package/src/panes/log-pane.ts +67 -8
- package/src/patents/ledger.ts +128 -0
- package/src/persona/presets.ts +44 -0
- package/src/plugins/install/market-fetch.ts +32 -1
- package/src/plugins/maker/wizard-generate.ts +6 -4
- package/src/pod-lease/admission.ts +116 -41
- package/src/preview/terminal.ts +14 -1
- package/src/prompt-cache/types.ts +2 -0
- package/src/prompt-enhance/enhance.ts +24 -8
- package/src/prompt-library/universal-preamble.ts +273 -56
- package/src/pty-shell/pty-control-ipc.ts +4 -1
- package/src/pty-shell/pty-manifest.ts +77 -5
- package/src/pty-shell/registry.ts +19 -2
- package/src/pty-shell/tui-run-state.ts +253 -0
- package/src/release-loop/checklist.ts +11 -0
- package/src/release-loop/light-rc.ts +28 -3
- package/src/release-loop/merged-pr-checklist.ts +24 -5
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/release-loop/rubric.ts +70 -0
- package/src/render.ts +5 -1
- package/src/rfc-registry/registry.ts +88 -0
- package/src/seat-dispatch/seat-request-ledger.ts +4 -0
- package/src/seat-loop/knowhow-lint.ts +233 -0
- package/src/seat-loop/seat-pack.ts +16 -4
- package/src/seat-loop/seat-report.ts +42 -2
- package/src/seat-loop/traffic-signal.ts +7 -0
- package/src/self-dev/ask-launch-flow.ts +48 -8
- package/src/self-dev/ask-path-candidates.ts +69 -14
- package/src/self-dev/decompose-proposal.ts +43 -1
- package/src/self-dev/graph-journey-nodes.ts +2 -0
- package/src/self-dev/launch-preflight-text.ts +5 -1
- package/src/self-dev/launch-preflight.ts +143 -10
- package/src/self-dev/run-supervisor.ts +71 -5
- package/src/self-dev/shard-aggregate.ts +2 -0
- package/src/self-dev/shard-run.ts +23 -2
- package/src/self-health/signatures.ts +132 -0
- package/src/self-implement/doctor-visit.ts +118 -0
- package/src/self-implement/gate-cli.ts +17 -4
- package/src/self-implement/goal-author-decompose.ts +80 -16
- package/src/self-implement/goal-author.ts +116 -73
- package/src/self-implement/goal-authoring-grounding.ts +1 -1
- package/src/self-implement/goal-file-name.ts +65 -0
- package/src/self-implement/goal-new-paths.ts +4 -5
- package/src/self-implement/graph-authority.ts +17 -3
- package/src/self-implement/graph-yaml.ts +15 -7
- package/src/self-implement/ground-goal.ts +2 -1
- package/src/self-implement/headless-elanous-driver.ts +16 -1
- package/src/self-implement/host-regate.ts +58 -9
- package/src/self-implement/orchestrator.ts +3 -10
- package/src/self-implement/review-mustfix-class.ts +115 -0
- package/src/self-implement/rework-policy.ts +80 -2
- package/src/self-implement/run-ledger.ts +111 -7
- package/src/self-implement/running-runs.ts +10 -6
- package/src/self-implement/self-implement-runtime.ts +32 -0
- package/src/self-implement/speed-claims.ts +145 -6
- package/src/session/pending-input.ts +62 -11
- package/src/session-runtime/index.ts +7 -1
- package/src/skills/tools/ops-ledger.ts +707 -0
- package/src/skills/tools/persistent-grounding.ts +103 -8
- package/src/skills/tools/shell.ts +196 -2
- package/src/status/bar.ts +32 -2
- package/src/status/status-provider-info.ts +58 -0
- package/src/steward/rejudge-tick.ts +12 -1
- package/src/steward/release-day.ts +158 -0
- package/src/steward/resync-tick.ts +123 -0
- package/src/task-agent/actions.ts +1 -0
- package/src/task-agent/adopt-pr.ts +140 -0
- package/src/task-agent/board.ts +11 -1
- package/src/task-agent/card-evidence.ts +37 -5
- package/src/task-agent/cover.ts +84 -17
- package/src/task-agent/failure-notify.ts +61 -0
- package/src/task-agent/green-sweep.ts +170 -0
- package/src/task-agent/land-worktree.ts +52 -5
- package/src/task-agent/live-move-history.ts +1 -0
- package/src/task-agent/live-moves.ts +43 -12
- package/src/task-agent/parent-host.ts +1 -1
- package/src/task-agent/postland-card.ts +139 -0
- package/src/task-agent/rejudge-on-head.ts +109 -7
- package/src/task-agent/remote-rejudge-bind.ts +91 -0
- package/src/task-agent/repair-branch-cas.ts +182 -0
- package/src/task-agent/repair-cycle.ts +288 -0
- package/src/task-agent/repair-next-move.ts +31 -0
- package/src/task-agent/repair-review.ts +24 -0
- package/src/task-agent/repair-worker.ts +87 -0
- package/src/task-agent/review-result-capture.ts +2 -1
- package/src/task-agent/shadow.ts +13 -7
- package/src/task-agent/task-hand.ts +115 -6
- package/src/task-orchestrator/surfaces/kubectl-transient-retry.ts +51 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +63 -7
- package/src/task-orchestrator/surfaces/pod-install-slots.ts +6 -11
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +76 -0
- package/src/task-orchestrator/surfaces/pod-repair-commit.ts +96 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +175 -43
- package/src/telegram.ts +30 -1
- package/src/terminal/session-registry.ts +6 -0
- package/src/thinking-line.ts +12 -3
- package/src/tool-runtime/index.ts +4 -0
- package/src/tool-runtime/ops-ledger-runtimes.ts +84 -0
- package/src/tool-runtime/ref-consult-runtime.ts +17 -2
- package/src/tool-runtime/run-shell-runtime.ts +4 -1
- package/src/tool-runtime/self-cognition-runtimes.ts +5 -1
- package/src/tui.ts +5 -0
- package/src/user-config.ts +62 -7
- package/src/ux-sim/fake-llm.ts +29 -0
- package/src/ux-sim/fault-sqlite-busy.ts +50 -0
- package/src/ux-sim/in-process-cli.ts +175 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1027.a0f04663d24c2779.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +0 -1
- package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +0 -36
- package/apps/pwa/out/_next/static/chunks/1146.80d15ea7c6e6ee95.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1157.f08bf2b70915e176.js +0 -148
- package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1454-a9c338f5bb556f42.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2528.3868070ef1be69f9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2697.76ca2ac3efef6f3b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +0 -32
- package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3143.257997a5f1ed79df.js +0 -34
- package/apps/pwa/out/_next/static/chunks/3259-86f3be56e43eaf6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3309.364573ceedbdfd5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +0 -287
- package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4084.15ecaf4240bd9e77.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +0 -8
- package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +0 -149
- package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +0 -1
- package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/599-a914cc0468f56143.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +0 -23
- package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +0 -77
- package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +0 -64
- package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +0 -62
- package/apps/pwa/out/_next/static/chunks/7752.5cbdd0b433c54af9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8085-1e5fce59500a2cc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +0 -226
- package/apps/pwa/out/_next/static/chunks/83a80514-b897b64df43ce108.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +0 -93
- package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +0 -115
- package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +0 -74
- package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/949.1e7d45ccb71580aa.js +0 -90
- package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9938.b23e4d4dfa0114cd.js +0 -79
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-a1ce306364f08da9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-07110da72c45e68f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-d2d76d4a7eae91bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-30007380f2e2a3c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-e5a9302c105725a3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-b93c04b5311c97ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-718a49e86bf25f9c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-20662900d6b4b455.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-f707a509515ac50c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-6a16a48d1aa6e91f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-fcb06e305f515527.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-6acf5ec4e6c6d1af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-39f82acf619cca23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-7c2c8f81b185f9c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ae7aff07e32676bb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-482c60c1bc540d0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-7cb996c1aa08b6f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-623e08fe4477d606.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-db460cd8aecb8490.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-8397a5c6ca569bf4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1917ea87ea71ab6b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-670510eda8b9443f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-d73c3f1e00d93986.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-65caacf54389081e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-4bb7556e2e97a750.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-77e04b4f8762c666.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-15c0a4095baddfba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-4eb96fc7241c2456.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-63e272a4cd3b6634.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-0d64ff212dc55d03.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-7f096248993fc2d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-e47fc72049149a38.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-f7d808e31e005895.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-5c2b24b5496dad73.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-76cdb531668b5191.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-e2b63345bba1a11f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-d376e0c83edc041a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d6db55fe2c04d128.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-dab163b338e3b966.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-08019efef111ed2e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-0260ffc7eda50db1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-980ce6fe36ad95eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-99c4e6c7345a9156.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-0ab42e0f05823013.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-ad9220422d20ba33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +0 -1
- package/apps/pwa/out/_next/static/chunks/e117f801.e92bf10242653497.js +0 -1
- package/apps/pwa/out/_next/static/chunks/e87d89b9.2e71c0ae475d28a1.js +0 -122
- package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +0 -1
- package/src/dashboard/bench-slash-runtime.ts +0 -40
- package/src/dashboard/input/search-modal-router.ts +0 -9
- package/src/dashboard/modals/pane-key-router.ts +0 -27
- package/src/dashboard/view-slash-runtime.ts +0 -48
- /package/apps/pwa/out/_next/static/{Ev2jivDMTSoEc-5rIXdcy → cIpv5nU9AycwYWZI9H589}/_ssgManifest.js +0 -0
package/src/telegram.ts
CHANGED
|
@@ -79,6 +79,8 @@ import { handleTelegramFieldNote } from './field-note/telegram.js';
|
|
|
79
79
|
import type { TranscriptionEngine, FieldAudio } from './field-note/transcribe.js';
|
|
80
80
|
import { maybeHandleCardPhoto, type CardPhotoDeps } from './telegram-card-followup.js';
|
|
81
81
|
import { attachTelegramProjectButtons } from './telegram-project-command.js';
|
|
82
|
+
import { BriefItemsLedger } from './briefing/brief-items.js';
|
|
83
|
+
import { recordBriefTelegramUpdate } from './cli/brief-cli.js';
|
|
82
84
|
import { attachTelegramFabricPlan } from './telegram-fabric-plan.js';
|
|
83
85
|
import { contextNow as readContextNow, type ContextNowDeps } from './context-bus/context-now.js';
|
|
84
86
|
import { renderContextFirstOpening } from './context-bus/context-now-surfaces.js';
|
|
@@ -123,6 +125,7 @@ export interface TgIncoming {
|
|
|
123
125
|
botId?: string;
|
|
124
126
|
/** 답장 대상 메시지의 텍스트(force_reply 정정 가로채기용). parseUpdate 가 채운다. */
|
|
125
127
|
replyToText?: string;
|
|
128
|
+
replyToMessageId?: number;
|
|
126
129
|
/** 앨범(media group) id — `#현장` 캡션은 앨범의 첫 항목에만 붙으므로 나머지를 같은 행사로 묶는 데 쓴다. */
|
|
127
130
|
mediaGroupId?: string;
|
|
128
131
|
/** 영상 — `#현장` 저장 전용. `attachments` 에 넣지 않는다(LLM 경로의 동작을 안 바꾸려고). */
|
|
@@ -239,6 +242,8 @@ export interface TelegramBotOpts {
|
|
|
239
242
|
/** 시험 seam — `/v1/context/now` 와 같은 `contextNow` 읽기. 던지면 «맥락 못 읽음». */
|
|
240
243
|
readContextNow?: typeof readContextNow;
|
|
241
244
|
contextNowDeps?: ContextNowDeps;
|
|
245
|
+
/** Optional test-isolated briefing ledger for inbound feedback. */
|
|
246
|
+
briefLedger?: BriefItemsLedger;
|
|
242
247
|
/** Keeps last-utterance times across a daemon restart so a restart does not re-send the context-first opening. */
|
|
243
248
|
contextFirstStore?: ContextFirstStore;
|
|
244
249
|
}
|
|
@@ -301,6 +306,7 @@ export class TelegramBot {
|
|
|
301
306
|
readonly botId: string;
|
|
302
307
|
private readonly allowedUsers: Set<number>;
|
|
303
308
|
private readonly onMessage: TelegramBotOpts['onMessage'];
|
|
309
|
+
private readonly briefLedger: BriefItemsLedger | undefined;
|
|
304
310
|
private readonly fetchImpl: typeof fetch;
|
|
305
311
|
private readonly errorBackoffMs: number;
|
|
306
312
|
private readonly pollTimeoutSec: number;
|
|
@@ -381,6 +387,7 @@ export class TelegramBot {
|
|
|
381
387
|
this.botId = opts.token.split(':')[0] || opts.token;
|
|
382
388
|
this.allowedUsers = new Set(opts.allowedUsers);
|
|
383
389
|
this.onMessage = opts.onMessage;
|
|
390
|
+
this.briefLedger = opts.briefLedger ?? (opts.nowImpl === undefined && opts.fetchImpl === undefined ? new BriefItemsLedger() : undefined);
|
|
384
391
|
this.homeChannel = opts.homeChannel;
|
|
385
392
|
this.fetchImpl = opts.fetchImpl ?? fetch;
|
|
386
393
|
this.errorBackoffMs = opts.errorBackoffMs ?? DEFAULT_ERROR_BACKOFF;
|
|
@@ -1229,7 +1236,7 @@ export class TelegramBot {
|
|
|
1229
1236
|
while (this.running) {
|
|
1230
1237
|
try {
|
|
1231
1238
|
await deliverSeatAnswers(this.seatWorkDeps.askDeps!);
|
|
1232
|
-
const wantCallbackQuery = this.callbackHandlers.size > 0;
|
|
1239
|
+
const wantCallbackQuery = this.callbackHandlers.size > 0 || this.briefLedger !== undefined;
|
|
1233
1240
|
const wantReaction = this.reactionHandlers.size > 0;
|
|
1234
1241
|
// allowed_updates 는 명시한 것만 받으므로 등록된 핸들러 종류만 추가(비파괴 — 핸들러
|
|
1235
1242
|
// 없으면 종전 ['message']/['message','callback_query'] 그대로).
|
|
@@ -1274,6 +1281,19 @@ export class TelegramBot {
|
|
|
1274
1281
|
messageId: cq.message?.message_id,
|
|
1275
1282
|
data: cq.data ?? '',
|
|
1276
1283
|
};
|
|
1284
|
+
if (this.briefLedger && payload.chatId !== undefined && payload.messageId !== undefined && /^brief-item:[1-9]\d*:(?:read|button|ignore)$/.test(payload.data)) {
|
|
1285
|
+
try {
|
|
1286
|
+
const recorded = recordBriefTelegramUpdate(this.briefLedger, {
|
|
1287
|
+
botId: this.botId, chatId: payload.chatId, messageId: payload.messageId,
|
|
1288
|
+
updateId: String(u.update_id), callbackData: payload.data,
|
|
1289
|
+
});
|
|
1290
|
+
await this.answerCallbackQuery(payload.id, { text: recorded ? '브리핑 반응 기록됨' : '브리핑 항목을 찾을 수 없습니다' });
|
|
1291
|
+
} catch (err) {
|
|
1292
|
+
this.log(`brief feedback failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1293
|
+
try { await this.answerCallbackQuery(payload.id, { text: '브리핑 반응 기록 실패' }); } catch { /* polling continues */ }
|
|
1294
|
+
}
|
|
1295
|
+
continue;
|
|
1296
|
+
}
|
|
1277
1297
|
for (const h of this.callbackHandlers) {
|
|
1278
1298
|
try { await h(payload); } catch (err) {
|
|
1279
1299
|
this.log(`callback handler error: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -1315,6 +1335,14 @@ export class TelegramBot {
|
|
|
1315
1335
|
await this.refuseMessage(incoming);
|
|
1316
1336
|
continue;
|
|
1317
1337
|
}
|
|
1338
|
+
if (this.briefLedger && incoming.replyToMessageId && incoming.text.trim() && !incoming.text.trim().startsWith('/')) {
|
|
1339
|
+
try {
|
|
1340
|
+
recordBriefTelegramUpdate(this.briefLedger, {
|
|
1341
|
+
botId: this.botId, chatId: incoming.chatId, messageId: incoming.replyToMessageId,
|
|
1342
|
+
updateId: String(incoming.updateId), text: incoming.text,
|
|
1343
|
+
});
|
|
1344
|
+
} catch (err) { this.log(`brief feedback failed: ${err instanceof Error ? err.message : String(err)}`); }
|
|
1345
|
+
}
|
|
1318
1346
|
// HITL "Other" free-text: consume inline (before the turn
|
|
1319
1347
|
// chain) so it isn't queued behind the turn awaiting it.
|
|
1320
1348
|
if (this.tryConsumeTextCapture(incoming)) continue;
|
|
@@ -2494,6 +2522,7 @@ export function parseUpdate(u: RawUpdate): TgIncoming | null {
|
|
|
2494
2522
|
isGroup: !isDm,
|
|
2495
2523
|
attachments,
|
|
2496
2524
|
...(m.reply_to_message?.text ? { replyToText: m.reply_to_message.text } : {}),
|
|
2525
|
+
...(m.reply_to_message?.message_id ? { replyToMessageId: m.reply_to_message.message_id } : {}),
|
|
2497
2526
|
...(m.media_group_id ? { mediaGroupId: m.media_group_id } : {}),
|
|
2498
2527
|
...(video ? { video } : {}),
|
|
2499
2528
|
};
|
|
@@ -158,6 +158,12 @@ export class TerminalSessionRegistry {
|
|
|
158
158
|
shellArgs: spec.shellArgs,
|
|
159
159
|
env: spec.env,
|
|
160
160
|
termName: spec.termName,
|
|
161
|
+
useRegistry: spec.useRegistry,
|
|
162
|
+
registryKind: spec.registryKind,
|
|
163
|
+
registryNickname: spec.registryNickname,
|
|
164
|
+
registryOrigin: spec.registryOrigin,
|
|
165
|
+
registryPurpose: spec.registryPurpose,
|
|
166
|
+
registrySeat: spec.registrySeat,
|
|
161
167
|
bounds: spec.bounds,
|
|
162
168
|
sizePreset: spec.sizePreset,
|
|
163
169
|
onExit: (code) => {
|
package/src/thinking-line.ts
CHANGED
|
@@ -295,10 +295,19 @@ export function startPinnedThinking(opts: StartPinnedThinkingOpts): ThinkingHand
|
|
|
295
295
|
const interval = opts.intervalMs ?? INTERVAL_MS;
|
|
296
296
|
const timer = interval > 0 ? setInterval(tick, interval) : null;
|
|
297
297
|
|
|
298
|
+
// ⛔ stop() 뒤엔 칠하지 않는다 — 멈춘 손잡이에 늦게 온 update/updateMetrics(다음 반복이 같은 손잡이를
|
|
299
|
+
// 재사용하거나 턴 마감 뒤 도착한 이벤트)가 «✢ Thinking…» 프레임을 footer 에 다시 써서, 타이머 없는
|
|
300
|
+
// 멈춘 표시로 남았다(TUI 결함 #5 · 10-14 13:43 오류 뒤 «Thinking…» 정지).
|
|
301
|
+
const repaint = (): void => {
|
|
302
|
+
if (stopped) return;
|
|
303
|
+
paint();
|
|
304
|
+
opts.onFrame();
|
|
305
|
+
};
|
|
306
|
+
|
|
298
307
|
return {
|
|
299
|
-
update: (m) => { message = m; messageFactory = null;
|
|
300
|
-
updateAnimated: (fn) => { messageFactory = fn;
|
|
301
|
-
updateMetrics: (m) => { metrics = { ...metrics, ...m };
|
|
308
|
+
update: (m) => { message = m; messageFactory = null; repaint(); },
|
|
309
|
+
updateAnimated: (fn) => { messageFactory = fn; repaint(); },
|
|
310
|
+
updateMetrics: (m) => { metrics = { ...metrics, ...m }; repaint(); },
|
|
302
311
|
reflow: () => { if (!stopped) paint(); opts.onFrame(); },
|
|
303
312
|
stop: (stopOpts) => {
|
|
304
313
|
if (stopped) return;
|
|
@@ -32,6 +32,7 @@ import { agentReplyRuntime } from './agent-reply-runtime.js';
|
|
|
32
32
|
import { agentStopRuntime } from './agent-stop-runtime.js';
|
|
33
33
|
import { ALL_TEAM_TOOL_RUNTIMES } from './team-tool-runtimes.js';
|
|
34
34
|
import { ALL_OPS_FLEET_RUNTIMES } from './ops-fleet-runtimes.js';
|
|
35
|
+
import { ALL_OPS_LEDGER_RUNTIMES } from './ops-ledger-runtimes.js';
|
|
35
36
|
import { ALL_AUTO_RESEARCH_RUNTIMES } from './auto-research-runtimes.js';
|
|
36
37
|
import { ALL_INTELLIGENCE_MAP_RUNTIMES } from './intelligence-map-runtimes.js';
|
|
37
38
|
import { ALL_CFT_ANDON_RUNTIMES } from './cft-andon-runtimes.js';
|
|
@@ -115,6 +116,9 @@ export function registerAllDefaultToolRuntimes(): void {
|
|
|
115
116
|
registerToolRuntime(agentStopRuntime);
|
|
116
117
|
for (const rt of ALL_TEAM_TOOL_RUNTIMES) registerToolRuntime(rt);
|
|
117
118
|
for (const rt of ALL_OPS_FLEET_RUNTIMES) registerToolRuntime(rt);
|
|
119
|
+
// Ops-ledger (우편 msg · 판 release checklist) — in-process ledger tools so
|
|
120
|
+
// TUI OP turns stop paying 1.3–2s of `eln` CLI startup per msg/checklist op.
|
|
121
|
+
for (const rt of ALL_OPS_LEDGER_RUNTIMES) registerToolRuntime(rt);
|
|
118
122
|
for (const rt of ALL_AUTO_RESEARCH_RUNTIMES) registerToolRuntime(rt);
|
|
119
123
|
for (const rt of ALL_INTELLIGENCE_MAP_RUNTIMES) registerToolRuntime(rt);
|
|
120
124
|
for (const rt of ALL_CFT_ANDON_RUNTIMES) registerToolRuntime(rt);
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// ── Ops-ledger tool runtimes (우편 msg · 판 release checklist) ──
|
|
2
|
+
//
|
|
3
|
+
// Registers the eight in-process ledger tools with the tool-runtime
|
|
4
|
+
// layer so every surface (skill-runner, TUI) can call them by name:
|
|
5
|
+
// MsgList / MsgPost / MsgAck and ChecklistList / ChecklistAdd /
|
|
6
|
+
// ChecklistSet / ChecklistEdit / ChecklistMove. Dispatchers live in
|
|
7
|
+
// src/skills/tools/ops-ledger.ts; this file is a thin adapter — the
|
|
8
|
+
// same pattern as team-tool-runtimes.ts. Every call goes through
|
|
9
|
+
// `observeLedgerCall` — one `ops-ledger` `call` line with the tool, the
|
|
10
|
+
// elapsed ms, ok, the seat actor and ids (never bodies or evidence).
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
buildMsgListTool, dispatchMsgList,
|
|
14
|
+
buildMsgPostTool, dispatchMsgPost,
|
|
15
|
+
buildMsgAckTool, dispatchMsgAck,
|
|
16
|
+
buildChecklistListTool, dispatchChecklistList,
|
|
17
|
+
buildChecklistAddTool, dispatchChecklistAdd,
|
|
18
|
+
buildChecklistSetTool, dispatchChecklistSet,
|
|
19
|
+
buildChecklistMoveTool, dispatchChecklistMove,
|
|
20
|
+
buildChecklistEditTool, dispatchChecklistEdit,
|
|
21
|
+
type ChecklistAddResult, type ChecklistEditResult, type ChecklistListResult, type ChecklistMoveResult,
|
|
22
|
+
type ChecklistSetResult, type MsgAckResult, type MsgListResult, type MsgPostResult,
|
|
23
|
+
observeLedgerCall,
|
|
24
|
+
} from '../skills/tools/ops-ledger.js';
|
|
25
|
+
import type { ToolRuntime } from './types.js';
|
|
26
|
+
|
|
27
|
+
export const msgListRuntime: ToolRuntime<Record<string, unknown>, MsgListResult> = {
|
|
28
|
+
id: 'msg_list',
|
|
29
|
+
spec: buildMsgListTool(),
|
|
30
|
+
async run(req) { return observeLedgerCall('MsgList', req, () => dispatchMsgList(req), (a, r) => ({ to: a.to, ...(r ? { count: r.count, after: r.after } : {}) })); },
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const msgPostRuntime: ToolRuntime<Record<string, unknown>, MsgPostResult> = {
|
|
34
|
+
id: 'msg_post',
|
|
35
|
+
spec: buildMsgPostTool(),
|
|
36
|
+
async run(req) { return observeLedgerCall('MsgPost', req, () => dispatchMsgPost(req), (a, r) => ({ from: a.from, to: a.to, ...(r ? { id: r.message.id } : {}) })); },
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const msgAckRuntime: ToolRuntime<Record<string, unknown>, MsgAckResult> = {
|
|
40
|
+
id: 'msg_ack',
|
|
41
|
+
spec: buildMsgAckTool(),
|
|
42
|
+
async run(req) { return observeLedgerCall('MsgAck', req, () => dispatchMsgAck(req), (a, r) => ({ to: a.to, id: a.id, ...(r ? { cursor: r.cursor } : {}) })); },
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const checklistListRuntime: ToolRuntime<Record<string, unknown>, ChecklistListResult> = {
|
|
46
|
+
id: 'checklist_list',
|
|
47
|
+
spec: buildChecklistListTool(),
|
|
48
|
+
async run(req) { return observeLedgerCall('ChecklistList', req, () => dispatchChecklistList(req), (a, r) => ({ version: r?.version ?? a.version, ...(r ? { items: r.items.length, history: r.history.length } : {}) })); },
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export const checklistAddRuntime: ToolRuntime<Record<string, unknown>, ChecklistAddResult> = {
|
|
52
|
+
id: 'checklist_add',
|
|
53
|
+
spec: buildChecklistAddTool(),
|
|
54
|
+
async run(req) { return observeLedgerCall('ChecklistAdd', req, () => dispatchChecklistAdd(req), (a, r) => ({ id: a.id, version: r?.version ?? a.version })); },
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export const checklistSetRuntime: ToolRuntime<Record<string, unknown>, ChecklistSetResult> = {
|
|
58
|
+
id: 'checklist_set',
|
|
59
|
+
spec: buildChecklistSetTool(),
|
|
60
|
+
async run(req) { return observeLedgerCall('ChecklistSet', req, () => dispatchChecklistSet(req), (a, r) => ({ id: a.id, version: r?.version ?? a.version, ...(a.status === undefined ? {} : { status: a.status }) })); },
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export const checklistEditRuntime: ToolRuntime<Record<string, unknown>, ChecklistEditResult> = {
|
|
64
|
+
id: 'checklist_edit',
|
|
65
|
+
spec: buildChecklistEditTool(),
|
|
66
|
+
async run(req) { return observeLedgerCall('ChecklistEdit', req, () => dispatchChecklistEdit(req), (a, r) => ({ id: a.id, version: r?.version ?? a.version, field: a.field })); },
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export const checklistMoveRuntime: ToolRuntime<Record<string, unknown>, ChecklistMoveResult> = {
|
|
70
|
+
id: 'checklist_move',
|
|
71
|
+
spec: buildChecklistMoveTool(),
|
|
72
|
+
async run(req) { return observeLedgerCall('ChecklistMove', req, () => dispatchChecklistMove(req), (a) => ({ id: a.id, from: a.from, to: a.to })); },
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export const ALL_OPS_LEDGER_RUNTIMES: ToolRuntime<any, any>[] = [
|
|
76
|
+
msgListRuntime,
|
|
77
|
+
msgPostRuntime,
|
|
78
|
+
msgAckRuntime,
|
|
79
|
+
checklistListRuntime,
|
|
80
|
+
checklistAddRuntime,
|
|
81
|
+
checklistSetRuntime,
|
|
82
|
+
checklistEditRuntime,
|
|
83
|
+
checklistMoveRuntime,
|
|
84
|
+
];
|
|
@@ -23,7 +23,7 @@ import { join } from 'node:path';
|
|
|
23
23
|
import { homedir } from 'node:os';
|
|
24
24
|
import type { LLMToolSpec } from '../llm.js';
|
|
25
25
|
import type { ToolRuntime, ToolRuntimeContext } from './types.js';
|
|
26
|
-
import { DEFAULT_REFERENCE_ROOTS } from '../agent/ref-grounding.js'; // ★ F3 — 로컬 canonical ref 루트
|
|
26
|
+
import { DEFAULT_REFERENCE_ROOTS, denyNonPublicReference } from '../agent/ref-grounding.js'; // ★ F3 — 로컬 canonical ref 루트
|
|
27
27
|
import { debug } from '../debug/log.js';
|
|
28
28
|
|
|
29
29
|
const CACHE_ROOT_DEFAULT = join(homedir(), '.cache', 'elanous-refs');
|
|
@@ -123,6 +123,17 @@ export function dispatchRefConsult(
|
|
|
123
123
|
): RefConsultResult {
|
|
124
124
|
const host = args.host ?? 'github.com';
|
|
125
125
|
const cacheRoot = args.cacheRoot ?? CACHE_ROOT_DEFAULT;
|
|
126
|
+
// 대표 2026-10-14 — 비공개 소스(Claude Code 사본)는 캐시·로컬 ref 어느 쪽이든 조회하지 않는다.
|
|
127
|
+
// owner·repo 는 단일 경로 성분이어야 한다 — `<사본 이름>/.` 같은 값이 join() 정규화로 이름 판정을 우회하지 못하게.
|
|
128
|
+
for (const [field, value] of [['owner', args.owner], ['repo', args.repo]] as const) {
|
|
129
|
+
if (!/^[A-Za-z0-9._-]+$/.test(value) || value === '.' || value === '..') {
|
|
130
|
+
throw new Error(`RefConsult: ${field} must be a single path segment (got ${JSON.stringify(value)})`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// 판정은 `repo` 칸만 — 공개 저장소 owner 이름이 우연히 같아도 막지 않는다(로컬 중첩 경로는 아래에서 따로 거른다).
|
|
134
|
+
if (denyNonPublicReference(args.repo)) {
|
|
135
|
+
throw new Error(`RefConsult: ${args.owner}/${args.repo} is a non-public source and is not consulted. Use public documentation instead.`);
|
|
136
|
+
}
|
|
126
137
|
// ★ F3(2026-07-22) — repo 경로 해석을 fallback 체인으로: ①에이전트 scratch 캐시(SyncRepo 산출·있으면 우선)
|
|
127
138
|
// → ②로컬 canonical ref(~/source/ref/<repo>·flat bare-name·재클론 없이 90 repo 즉시 grep) → ③둘 다 없으면
|
|
128
139
|
// throw. 종전엔 캐시만 봐서 캐시 미존재 시 canonical ref 가 놀아도 "SyncRepo 먼저" 로 죽던 단절을 연결.
|
|
@@ -133,7 +144,11 @@ export function dispatchRefConsult(
|
|
|
133
144
|
if (!existsSync(join(cachePath, '.git'))) {
|
|
134
145
|
const roots = args.referenceRoots ?? DEFAULT_REFERENCE_ROOTS;
|
|
135
146
|
const localHit = roots
|
|
136
|
-
.flatMap((root) => [
|
|
147
|
+
.flatMap((root) => [
|
|
148
|
+
join(root, args.repo),
|
|
149
|
+
// 로컬 ref 의 <owner>/<repo> 중첩은 owner 디렉터리가 비공개 사본이면 그 아래로 내려가지 않는다.
|
|
150
|
+
...(denyNonPublicReference(args.owner) ? [] : [join(root, args.owner, args.repo)]),
|
|
151
|
+
])
|
|
137
152
|
.find((p) => existsSync(join(p, '.git')));
|
|
138
153
|
if (localHit) { repoPath = localHit; source = 'local-ref'; }
|
|
139
154
|
else {
|
|
@@ -31,6 +31,9 @@ export const runShellRuntime: ToolRuntime<Record<string, unknown>, RunShellDispa
|
|
|
31
31
|
ctx.surface === 'dashboard' && req.sandbox === undefined
|
|
32
32
|
? { ...req, sandbox: 'auto' }
|
|
33
33
|
: req;
|
|
34
|
-
return dispatchRunShell(effectiveReq, {
|
|
34
|
+
return dispatchRunShell(effectiveReq, {
|
|
35
|
+
signal: ctx.signal,
|
|
36
|
+
availableToolNames: ctx.agentHostTools?.map(tool => tool.name),
|
|
37
|
+
});
|
|
35
38
|
},
|
|
36
39
|
};
|
|
@@ -195,7 +195,11 @@ export const SELF_COGNITION_RUNTIMES: readonly ToolRuntime[] = SELF_COGNITION_TO
|
|
|
195
195
|
return coreSpec(name);
|
|
196
196
|
},
|
|
197
197
|
run: async (args, ctx) => name === 'context_now'
|
|
198
|
-
? (
|
|
198
|
+
? (() => {
|
|
199
|
+
const options = { ...(typeof args.topic === 'string' ? { topic: args.topic } : {}) };
|
|
200
|
+
return import('../context-bus/context-now.js').then(now => ctx.surface === 'tui'
|
|
201
|
+
? now.contextNowInWorker(options) : now.contextNow(options));
|
|
202
|
+
})()
|
|
199
203
|
: name === 'memory_recall' || name === 'self_recall'
|
|
200
204
|
? runRecall(name, args, ctx)
|
|
201
205
|
: toToolRunResult(await coreTools().buildCoreTools().dispatch(name, args)),
|
package/src/tui.ts
CHANGED
|
@@ -965,6 +965,11 @@ export function injectKey(key: Key): boolean {
|
|
|
965
965
|
return true;
|
|
966
966
|
}
|
|
967
967
|
|
|
968
|
+
/** 아직 readKey 가 소비하지 않은 키 수 — 외부 입력 대기열이 «사용자 키보다 앞서» 끼어들지 않게 본다. */
|
|
969
|
+
export function pendingKeyCount(): number {
|
|
970
|
+
return _keyQueue.length;
|
|
971
|
+
}
|
|
972
|
+
|
|
968
973
|
export function termSize(): { rows: number; cols: number } {
|
|
969
974
|
return { rows: process.stdout.rows || 24, cols: process.stdout.columns || 80 };
|
|
970
975
|
}
|
package/src/user-config.ts
CHANGED
|
@@ -1190,6 +1190,8 @@ export interface SelfImplementToolConfig {
|
|
|
1190
1190
|
* Overload failover (OVERLOAD-FAILOVER) may move an unpinned codex child to
|
|
1191
1191
|
* grok. A pinned codex provider is never moved. */
|
|
1192
1192
|
childLlm?: ChildLlmPreferenceConfig;
|
|
1193
|
+
/** Explicit same-provider child escalation map. Absent preserves the existing model ladder. */
|
|
1194
|
+
escalateChild?: Readonly<Record<string, string>>;
|
|
1193
1195
|
/** SUBSCRIPTION-EXHAUST-REROUTE (0.2.24) — `--child-llm-*` 없이 뜬 Pod 구현 자식의 기본 모델.
|
|
1194
1196
|
* `{ provider, model? }` · `'off'`(종전 codex 기본). 없으면 `openrouter/z-ai/glm-5.3`. 원값 — `resolvePodChildDefault` 가 검사한다. */
|
|
1195
1197
|
podChildDefault?: unknown;
|
|
@@ -1657,6 +1659,10 @@ export interface DashboardConfig {
|
|
|
1657
1659
|
* Defaults off so optional pane/window controls do not occupy keys
|
|
1658
1660
|
* required by essential input, reading, and escape controls. */
|
|
1659
1661
|
enableSupplementalGlobalKeys: boolean;
|
|
1662
|
+
/** First-screen boot banner. Absent = `minimal`: only failures and first-run
|
|
1663
|
+
* guidance reach the transcript; healthy daemon/PWA/hitl-port rows move to
|
|
1664
|
+
* `/status`. `full` restores the historical band. */
|
|
1665
|
+
bootBanner?: 'minimal' | 'full';
|
|
1660
1666
|
}
|
|
1661
1667
|
|
|
1662
1668
|
export interface DashboardPromptBankConfig {
|
|
@@ -2737,6 +2743,11 @@ function parseToolsConfig(raw: unknown): ToolsConfig {
|
|
|
2737
2743
|
? selfImplRaw.autoheal as Record<string, unknown> : undefined;
|
|
2738
2744
|
// ⛔ 모르는 값은 좁은 쪽(shadow) — 오타가 live 를 켜면 안 된다.
|
|
2739
2745
|
const autoheal = autohealRaw ? { mode: autohealRaw.mode === 'live' ? 'live' as const : 'shadow' as const } : undefined;
|
|
2746
|
+
const escalateChildRaw = selfImplRaw.escalateChild;
|
|
2747
|
+
const escalateChild = escalateChildRaw && typeof escalateChildRaw === 'object' && !Array.isArray(escalateChildRaw)
|
|
2748
|
+
? Object.fromEntries(Object.entries(escalateChildRaw).filter(([from, to]) => from.trim() && typeof to === 'string' && to.trim())
|
|
2749
|
+
.map(([from, to]) => [from.trim(), (to as string).trim()])) as Record<string, string>
|
|
2750
|
+
: undefined;
|
|
2740
2751
|
// ⭐ 관측(리뷰 should-fix) — 오타/비-boolean 은 기본값(ON)으로 수렴하는데, 그게 조용하면
|
|
2741
2752
|
// "껐다고 믿었는데 자동 개설되는" 운영 사고가 된다. 값이 **있는데 boolean 이 아닐 때만**
|
|
2742
2753
|
// 경고한다(부재는 정상). 로거 대신 stderr — 이 파일의 기존 경고와 동형(부트 시점·의존 0).
|
|
@@ -2772,7 +2783,7 @@ function parseToolsConfig(raw: unknown): ToolsConfig {
|
|
|
2772
2783
|
runDevHarness,
|
|
2773
2784
|
selfOrchestrate,
|
|
2774
2785
|
nativeStructure,
|
|
2775
|
-
selfImplement: { worktreeRoot, childInstanceMode, prApprovalDelivery, observeOnly, goalRecordInDoc, goalAuthorPersistentGrounding, fabricDecompose, fabricDecomposeAutoPathThreshold, autoOpenPr, draftOnStop, salvageRetention, autoStop, autoAssist, screenStallTermination, reworkBudget, decompositionShadow, clarificationEscalation, ...(childLlm ? { childLlm } : {}), ...(selfImplRaw.podChildDefault !== undefined ? { podChildDefault: selfImplRaw.podChildDefault } : {}), ...(runTtlHours !== undefined ? { runTtlHours } : {}), ...(draftSweepCloseCap !== undefined ? { draftSweepCloseCap } : {}), ...(runTtl ? { runTtl } : {}), ...(autoheal ? { autoheal } : {}) },
|
|
2786
|
+
selfImplement: { worktreeRoot, childInstanceMode, prApprovalDelivery, observeOnly, goalRecordInDoc, goalAuthorPersistentGrounding, fabricDecompose, fabricDecomposeAutoPathThreshold, autoOpenPr, draftOnStop, salvageRetention, autoStop, autoAssist, screenStallTermination, reworkBudget, decompositionShadow, clarificationEscalation, ...(childLlm ? { childLlm } : {}), ...(escalateChild && Object.keys(escalateChild).length ? { escalateChild } : {}), ...(selfImplRaw.podChildDefault !== undefined ? { podChildDefault: selfImplRaw.podChildDefault } : {}), ...(runTtlHours !== undefined ? { runTtlHours } : {}), ...(draftSweepCloseCap !== undefined ? { draftSweepCloseCap } : {}), ...(runTtl ? { runTtl } : {}), ...(autoheal ? { autoheal } : {}) },
|
|
2776
2787
|
};
|
|
2777
2788
|
}
|
|
2778
2789
|
|
|
@@ -3330,7 +3341,8 @@ export interface AutoReviewConfig {
|
|
|
3330
3341
|
};
|
|
3331
3342
|
}
|
|
3332
3343
|
|
|
3333
|
-
export type ModelRole = 'implement' | 'review' | 'research' | 'planning' | 'audit' | 'classify' | 'graph-grow';
|
|
3344
|
+
export type ModelRole = 'implement' | 'review' | 'research' | 'planning' | 'audit' | 'classify' | 'graph-grow' | 'coordinator' | 'guardian';
|
|
3345
|
+
export type AgentModelRole = 'coordinator' | 'guardian';
|
|
3334
3346
|
|
|
3335
3347
|
export interface RoleModelConfig {
|
|
3336
3348
|
implement?: string;
|
|
@@ -3340,6 +3352,8 @@ export interface RoleModelConfig {
|
|
|
3340
3352
|
audit?: string;
|
|
3341
3353
|
classify?: string;
|
|
3342
3354
|
'graph-grow'?: string;
|
|
3355
|
+
coordinator?: string;
|
|
3356
|
+
guardian?: string;
|
|
3343
3357
|
}
|
|
3344
3358
|
|
|
3345
3359
|
/** Sparse provider-agnostic model tier preferences by execution role. */
|
|
@@ -3422,6 +3436,10 @@ export const ROLE_MODEL_DEFAULTS: Record<ModelRole, { environment: string; tier:
|
|
|
3422
3436
|
audit: { environment: 'ELANOUS_MEMORY_JUDGE_MODEL', tier: 'better' },
|
|
3423
3437
|
classify: { environment: 'ELANOUS_ACTION_CLASSIFIER_MODEL', tier: 'budget' },
|
|
3424
3438
|
'graph-grow': { environment: 'ELANOUS_GRAPH_GROW_MODEL', tier: 'better' },
|
|
3439
|
+
// 이 티어는 provider 만 명시했을 때 쓰인다. 에이전트 기동은
|
|
3440
|
+
// resolveConfiguredAgentRoleLlm 이 명시 설정을 먼저 요구한다.
|
|
3441
|
+
coordinator: { environment: 'ELANOUS_COORDINATOR_MODEL', tier: 'balanced' },
|
|
3442
|
+
guardian: { environment: 'ELANOUS_GUARDIAN_MODEL', tier: 'balanced' },
|
|
3425
3443
|
};
|
|
3426
3444
|
|
|
3427
3445
|
/** Resolve `auto` through the same runtime provider selector that dispatches LLM calls.
|
|
@@ -3576,6 +3594,24 @@ export function resolveRoleLlm(role: ModelRole, opts: RoleLlmResolveOptions = {}
|
|
|
3576
3594
|
return baseline;
|
|
3577
3595
|
}
|
|
3578
3596
|
|
|
3597
|
+
/** 조율자·수호자는 사용자 선택이 없으면 기동하지 않는다.
|
|
3598
|
+
* 일반 역할의 기본 모델 사다리와 구분해, 발사 인자·env pin·roleLlm 설정 중
|
|
3599
|
+
* 실제 모델 선택(provider/tier/model)이 있을 때만 해석한다. effort 단독은 선택이 아니다. */
|
|
3600
|
+
export function resolveConfiguredAgentRoleLlm(
|
|
3601
|
+
role: AgentModelRole,
|
|
3602
|
+
opts: RoleLlmResolveOptions = {},
|
|
3603
|
+
): RoleLlmResolution | undefined {
|
|
3604
|
+
const config = opts.config ?? getUserConfig();
|
|
3605
|
+
const hasSelection = (spec: RoleLlmSpec | undefined): boolean =>
|
|
3606
|
+
Boolean(spec?.provider || spec?.tier || spec?.model?.trim());
|
|
3607
|
+
const configured = [
|
|
3608
|
+
(opts.overrides ?? launchRoleLlmOverrides)?.[role],
|
|
3609
|
+
roleLlmEnvPin(role, opts.env ?? process.env),
|
|
3610
|
+
config.roleLlm?.[role],
|
|
3611
|
+
].some(hasSelection);
|
|
3612
|
+
return configured ? resolveRoleLlm(role, { ...opts, config }) : undefined;
|
|
3613
|
+
}
|
|
3614
|
+
|
|
3579
3615
|
/** POD-ROLE-LLM — 역할 고정을 «프로세스 env» 로 받는 칸. `ELANOUS_ROLE_LLM_<ROLE>` = RoleLlmSpec JSON
|
|
3580
3616
|
* (예 `{"provider":"openai-codex","tier":"best","model":"gpt-6-sol"}`).
|
|
3581
3617
|
* ⭐ 왜 env 인가: `--role-llm` 은 부모 프로세스 메모리 값이고 Pod 안엔 운영 config 가 없다 —
|
|
@@ -3833,9 +3869,9 @@ export interface UserConfig {
|
|
|
3833
3869
|
/** GUARD-ONE-a: omitted means shadow. `live` is parsed for the later cutover, but `elanous guardian tick`
|
|
3834
3870
|
* refuses it until a human-confirmed operational change (GUARD-ONE-a ships shadow only). */
|
|
3835
3871
|
guardian?: { mode?: 'shadow' | 'live'; /** Orphan CLI GC on the guardian tick: off = no ps collection, shadow (default) = evidence only, on = evidence then SIGTERM. */ orphanGc?: 'off' | 'shadow' | 'on' };
|
|
3836
|
-
/**
|
|
3837
|
-
*
|
|
3838
|
-
taskAgent?: { liveMoves?: string[]; /** TA-REJUDGE-PERIODIC — steward tick runs `tasks rejudge --all` every N minutes (absent/0 = off). */ rejudgeEveryMinutes?: number; /** 1-minute load average above which that tick is skipped (default 60). */ rejudgeMaxLoad?: number; parentHost?: { host?: string; cwd?: string; elanous?: string; configDir?: string; podPool?: string; approvalCapacity?: number } | Array<{ host?: string; cwd?: string; elanous?: string; configDir?: string; podPool?: string; approvalCapacity?: number }> };
|
|
3872
|
+
/** Task-agent live move allow-list (`src/task-agent/live-moves.ts` validates its vocabulary).
|
|
3873
|
+
* Absent = env ELANOUS_TASK_AGENT_LIVE_MOVES, else none (pure shadow). */
|
|
3874
|
+
taskAgent?: { liveMoves?: string[]; /** TA-REJUDGE-PERIODIC — steward tick runs `tasks rejudge --all` every N minutes (absent/0 = off). */ rejudgeEveryMinutes?: number; /** 1-minute load average above which that tick is skipped (default 60). */ rejudgeMaxLoad?: number; /** TA-REPAIR-TICK-CAP — new repair launches per `tasks rejudge --all` (default 3, 0 = none). */ repairMaxPerTick?: number; parentHost?: { host?: string; cwd?: string; elanous?: string; configDir?: string; podPool?: string; approvalCapacity?: number } | Array<{ host?: string; cwd?: string; elanous?: string; configDir?: string; podPool?: string; approvalCapacity?: number }> };
|
|
3839
3875
|
events?: EventsConfig;
|
|
3840
3876
|
/** GATE-REMOTE — see GateRemoteConfig. Absent = defaults (auto on · node-b · load 20 · cap 2). */
|
|
3841
3877
|
gateRemote?: GateRemoteConfig;
|
|
@@ -4039,7 +4075,7 @@ export function parseRoleLlmEntry(raw: unknown): { ok: true; spec: RoleLlmSpec }
|
|
|
4039
4075
|
return { ok: true, spec };
|
|
4040
4076
|
}
|
|
4041
4077
|
|
|
4042
|
-
export const MODEL_ROLES: readonly ModelRole[] = ['implement', 'review', 'research', 'planning', 'audit', 'classify', 'graph-grow'];
|
|
4078
|
+
export const MODEL_ROLES: readonly ModelRole[] = ['implement', 'review', 'research', 'planning', 'audit', 'classify', 'graph-grow', 'coordinator', 'guardian'];
|
|
4043
4079
|
|
|
4044
4080
|
export function isModelRole(v: unknown): v is ModelRole {
|
|
4045
4081
|
return typeof v === 'string' && (MODEL_ROLES as readonly string[]).includes(v);
|
|
@@ -4147,13 +4183,18 @@ function parseTaskAgentConfig(raw: unknown): UserConfig['taskAgent'] {
|
|
|
4147
4183
|
}
|
|
4148
4184
|
const parentHost = parseTaskAgentParentHost((raw as Record<string, unknown>).parentHost);
|
|
4149
4185
|
// TA-REJUDGE-PERIODIC — 음이 아닌 유한수만 산다(0 = 끔). 그 밖은 경고하고 버린다(= 끔 · 기본 부하 상한).
|
|
4150
|
-
const rejudge: { rejudgeEveryMinutes?: number; rejudgeMaxLoad?: number } = {};
|
|
4186
|
+
const rejudge: { rejudgeEveryMinutes?: number; rejudgeMaxLoad?: number; repairMaxPerTick?: number } = {};
|
|
4151
4187
|
for (const key of ['rejudgeEveryMinutes', 'rejudgeMaxLoad'] as const) {
|
|
4152
4188
|
const value = (raw as Record<string, unknown>)[key];
|
|
4153
4189
|
if (value === undefined) continue;
|
|
4154
4190
|
if (typeof value === 'number' && Number.isFinite(value) && value >= 0) rejudge[key] = value;
|
|
4155
4191
|
else warnUserConfigDrop(`taskAgent.${key}`, `음이 아닌 수가 아니다(${JSON.stringify(value)}) — 버림`);
|
|
4156
4192
|
}
|
|
4193
|
+
const repairMaxPerTick = (raw as Record<string, unknown>).repairMaxPerTick;
|
|
4194
|
+
if (repairMaxPerTick !== undefined) {
|
|
4195
|
+
if (Number.isSafeInteger(repairMaxPerTick) && (repairMaxPerTick as number) >= 0) rejudge.repairMaxPerTick = repairMaxPerTick as number;
|
|
4196
|
+
else warnUserConfigDrop('taskAgent.repairMaxPerTick', `음이 아닌 정수가 아니다(${JSON.stringify(repairMaxPerTick)}) — 기본 3`);
|
|
4197
|
+
}
|
|
4157
4198
|
const extras = { ...rejudge, ...(parentHost ? { parentHost } : {}) };
|
|
4158
4199
|
const liveMoves = (raw as Record<string, unknown>).liveMoves;
|
|
4159
4200
|
if (liveMoves === undefined) return Object.keys(extras).length ? extras : undefined;
|
|
@@ -4254,6 +4295,10 @@ function parseRoleLlmConfig(raw: unknown): RoleLlmConfig | undefined {
|
|
|
4254
4295
|
if (effort === 'low' || effort === 'medium' || effort === 'high') spec.effort = effort;
|
|
4255
4296
|
else warnUserConfigDrop(`roleLlm.${role}.effort`, `low|medium|high 가 아니다(${JSON.stringify(effort)}) — 버림`);
|
|
4256
4297
|
}
|
|
4298
|
+
if ((role === 'coordinator' || role === 'guardian') && !spec.provider && !spec.tier && !spec.model) {
|
|
4299
|
+
dropped.push({ role, reason: 'provider·tier·model 중 하나는 있어야 한다 (effort 단독은 기동 설정이 아니다)' });
|
|
4300
|
+
continue;
|
|
4301
|
+
}
|
|
4257
4302
|
if (Object.keys(spec).length > 0) parsed[role] = spec;
|
|
4258
4303
|
} else {
|
|
4259
4304
|
const entry = parseRoleLlmEntry(rawEntry);
|
|
@@ -4268,6 +4313,11 @@ function parseRoleLlmConfig(raw: unknown): RoleLlmConfig | undefined {
|
|
|
4268
4313
|
// 사용자는 「왜 내 설정이 안 먹지」를 영영 못 푼다(CLI 는 이름을 대며 거부하는데 여기만 조용했다).
|
|
4269
4314
|
// ⇒ 버린 것을 «이름과 이유»로 남긴다. 로딩 자체는 계속한다.
|
|
4270
4315
|
if (dropped.length > 0) {
|
|
4316
|
+
for (const { role, reason } of dropped) {
|
|
4317
|
+
if (role === 'coordinator' || role === 'guardian') {
|
|
4318
|
+
warnUserConfigDrop(`roleLlm.${role}`, `${reason} — 버림; 명시 모델 없이는 에이전트 기동 거부`);
|
|
4319
|
+
}
|
|
4320
|
+
}
|
|
4271
4321
|
try {
|
|
4272
4322
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
4273
4323
|
const { debug } = require('./debug/log.js') as typeof import('./debug/log.js');
|
|
@@ -5715,6 +5765,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5715
5765
|
? dash.foldMode
|
|
5716
5766
|
: 'task-unit',
|
|
5717
5767
|
benchmark: dash.benchmark === true ? true : undefined,
|
|
5768
|
+
bootBanner: dash.bootBanner === 'minimal' || dash.bootBanner === 'full' ? dash.bootBanner : undefined,
|
|
5718
5769
|
enableVirtualWindowSwitchKeys: dash.enableVirtualWindowSwitchKeys === true,
|
|
5719
5770
|
enableSupplementalGlobalKeys: dash.enableSupplementalGlobalKeys === true,
|
|
5720
5771
|
promptBank: {
|
|
@@ -6528,6 +6579,9 @@ export function saveUserConfig(
|
|
|
6528
6579
|
answerPriority: cfg.llm.answerPriority,
|
|
6529
6580
|
maxTurns: cfg.llm.maxTurns,
|
|
6530
6581
|
missionRouting: cfg.llm.missionRouting,
|
|
6582
|
+
// ⛔ 로드(parseLlmRoutePolicy)만 있고 저장이 없으면 `config set llm.routePolicy` 가 «조용히» 떨어진다
|
|
6583
|
+
// (10-14 OP 실측 — set 뒤 get 이 undefined · TUI-MODEL-SESSION-SCOPE ①).
|
|
6584
|
+
routePolicy: cfg.llm.routePolicy,
|
|
6531
6585
|
}),
|
|
6532
6586
|
skills: stripUndef({
|
|
6533
6587
|
activeSet: cfg.skills.activeSet,
|
|
@@ -6691,6 +6745,7 @@ export function saveUserConfig(
|
|
|
6691
6745
|
promptBank: cfg.dashboard.promptBank,
|
|
6692
6746
|
foldMode: cfg.dashboard.foldMode,
|
|
6693
6747
|
benchmark: cfg.dashboard.benchmark,
|
|
6748
|
+
bootBanner: cfg.dashboard.bootBanner,
|
|
6694
6749
|
enableVirtualWindowSwitchKeys: cfg.dashboard.enableVirtualWindowSwitchKeys,
|
|
6695
6750
|
enableSupplementalGlobalKeys: cfg.dashboard.enableSupplementalGlobalKeys,
|
|
6696
6751
|
}),
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic, network-free LLM for gate tests without provider credentials.
|
|
3
|
+
* The opt-in is deliberately explicit; production never selects this provider.
|
|
4
|
+
*/
|
|
5
|
+
import type { LLMMessage, LLMOpts, LLMProvider, LLMStreamEvent } from '../llm.js';
|
|
6
|
+
|
|
7
|
+
export const TEST_FAKE_LLM_ENV = 'ELANOUS_TEST_FAKE_LLM';
|
|
8
|
+
export const TEST_FAKE_LLM_RESPONSE_ENV = 'ELANOUS_TEST_FAKE_LLM_RESPONSE';
|
|
9
|
+
|
|
10
|
+
export function testFakeLlmEnabled(): boolean {
|
|
11
|
+
return process.env[TEST_FAKE_LLM_ENV] === '1';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function testFakeLlmResponse(): string {
|
|
15
|
+
return process.env[TEST_FAKE_LLM_RESPONSE_ENV] ?? '[test-fake-llm] OK';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Shares the real LLMProvider contract; only the external model call is replaced. */
|
|
19
|
+
export const testFakeLlmProvider: LLMProvider = {
|
|
20
|
+
name: 'test-fake-llm',
|
|
21
|
+
defaultModel: 'test-fake-llm',
|
|
22
|
+
available: testFakeLlmEnabled,
|
|
23
|
+
async *chat(_messages: LLMMessage[], _opts?: LLMOpts): AsyncGenerator<string, void, unknown> {
|
|
24
|
+
yield testFakeLlmResponse();
|
|
25
|
+
},
|
|
26
|
+
async *streamChat(_messages: LLMMessage[], _opts?: LLMOpts): AsyncGenerator<LLMStreamEvent, void, unknown> {
|
|
27
|
+
yield { type: 'text', delta: testFakeLlmResponse() };
|
|
28
|
+
},
|
|
29
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// SQLite의 실제 write lock 아래에서 LogStore.insertBatch의 busy 버퍼와 복구를 관측한다.
|
|
2
|
+
import { Database } from 'bun:sqlite';
|
|
3
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { LogStore } from '../mss/logging/log-store.js';
|
|
7
|
+
|
|
8
|
+
export interface SqliteBusyObservation {
|
|
9
|
+
readonly busy: boolean;
|
|
10
|
+
readonly beforeRelease: number;
|
|
11
|
+
readonly afterRelease: number;
|
|
12
|
+
readonly events: string[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function simSqliteBusy(): SqliteBusyObservation {
|
|
16
|
+
const dir = mkdtempSync(join(tmpdir(), 'ux-sim-sqlite-busy-'));
|
|
17
|
+
const path = join(dir, 'logs.db');
|
|
18
|
+
let store: LogStore | undefined;
|
|
19
|
+
let locker: Database | undefined;
|
|
20
|
+
try {
|
|
21
|
+
store = new LogStore(path, { instance: 'ux-sim' });
|
|
22
|
+
locker = new Database(path);
|
|
23
|
+
locker.run('BEGIN IMMEDIATE');
|
|
24
|
+
const rec = (event: string) => ({ rec: { ts: new Date().toISOString(), category: 'ux-sim.sqlite', event }, surface: 'ux-sim' });
|
|
25
|
+
let busy = false;
|
|
26
|
+
try { store.insertBatch([rec('locked')]); }
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (!/SQLITE_BUSY|database is locked/i.test(String(error))) throw error;
|
|
29
|
+
busy = true;
|
|
30
|
+
}
|
|
31
|
+
const beforeRelease = store.count();
|
|
32
|
+
locker.run('ROLLBACK');
|
|
33
|
+
store.insertBatch([rec('recovered')]);
|
|
34
|
+
const events = store.query({ exactCategories: ['ux-sim.sqlite'] }).map((row) => row.event);
|
|
35
|
+
return { busy, beforeRelease, afterRelease: store.count(), events };
|
|
36
|
+
} finally {
|
|
37
|
+
try { locker?.run('ROLLBACK'); } catch { /* transaction already ended */ }
|
|
38
|
+
locker?.close();
|
|
39
|
+
store?.close();
|
|
40
|
+
rmSync(dir, { recursive: true, force: true });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function renderSqliteBusy(result: SqliteBusyObservation): string[] {
|
|
45
|
+
return [
|
|
46
|
+
'sqlite-busy · 실제 SQLite write lock → LogStore.insertBatch 재시도',
|
|
47
|
+
` SQLite busy=${result.busy} · 잠금 중 행=${result.beforeRelease} · 해제 후 행=${result.afterRelease}`,
|
|
48
|
+
` 복구된 이벤트=${result.events.join(', ')}`,
|
|
49
|
+
];
|
|
50
|
+
}
|