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
|
@@ -18,6 +18,7 @@ import type { ModelFamily } from '../models/prompts.js';
|
|
|
18
18
|
import { debug } from '../debug/log.js';
|
|
19
19
|
import type { NativeToolCatalogEntry } from '../native-tool-catalog.js';
|
|
20
20
|
import { buildUniversalPreamble } from '../prompt-library/universal-preamble.js';
|
|
21
|
+
import { buildSeatBootSystemMessages, type SeatBootDeps } from './seat-boot-preamble.js';
|
|
21
22
|
import { buildPlanModeSystemMessages } from '../plan-mode/system-prompt.js';
|
|
22
23
|
import { buildImplDisciplineSystemMessages } from '../impl-discipline/index.js';
|
|
23
24
|
import { buildConcisenessSystemMessages } from '../prompt-library/chat-conciseness.js';
|
|
@@ -29,7 +30,8 @@ import {
|
|
|
29
30
|
import { buildExecutionAskSystemMessages } from '../ask-user-question/index.js';
|
|
30
31
|
import { buildApprovalPolicySystemMessages } from '../code-edit/index.js';
|
|
31
32
|
import { buildSandboxEscalationSystemMessages } from '../shell-primitive/index.js';
|
|
32
|
-
import { elanousSelfAccessPrompt,
|
|
33
|
+
import { elanousSelfAccessPrompt, investigationRecallAmbient } from '../agent/self-ambient.js';
|
|
34
|
+
import { sessionMemoryLayer, sessionSelfAmbientParts } from './turn-session-layers.js';
|
|
33
35
|
import { localRefGroundingAmbient } from '../agent/ref-grounding.js';
|
|
34
36
|
import {
|
|
35
37
|
globalTaskNotificationQueue,
|
|
@@ -66,9 +68,14 @@ export interface DashboardTurnPreambleContext {
|
|
|
66
68
|
* one-liner directives (e.g. AskUserQuestion → use for tool-deny
|
|
67
69
|
* clarification). Pass `tools.map(t => t.name)` from the caller. */
|
|
68
70
|
enabledTools?: readonly string[];
|
|
71
|
+
/** 🪪 L1 자리 부트 카드를 싣나(`seat-boot-preamble.ts`). 대화형 TUI 호출부만 켠다 — 기본 꺼짐이라
|
|
72
|
+
* 다른 호출부·시험은 셸의 `COORD_ID` 에 따라 출력이 갈리지 않는다. */
|
|
73
|
+
seatBoot?: boolean | SeatBootDeps;
|
|
69
74
|
/** Explicit controller provenance for tests and embedded callers. When
|
|
70
75
|
* omitted, the controller environment is used. */
|
|
71
76
|
controlEnv?: { controller?: string; channels?: string };
|
|
77
|
+
/** File-memory layer seam: a store root and env for scope resolution (tests), or false to omit it. */
|
|
78
|
+
memory?: { root?: string; env?: NodeJS.ProcessEnv } | false;
|
|
72
79
|
}
|
|
73
80
|
|
|
74
81
|
export function buildControllerSystemMessage(controller: string, channels?: string): LLMMessage {
|
|
@@ -91,10 +98,22 @@ export function buildDashboardTurnPreamble(
|
|
|
91
98
|
...(ctx.modelFamily !== undefined ? { modelFamily: ctx.modelFamily } : {}),
|
|
92
99
|
...(ctx.enabledTools !== undefined ? { enabledTools: ctx.enabledTools } : {}),
|
|
93
100
|
});
|
|
101
|
+
// 🪪 L1 — 자리 부트 카드(세션마다 한 번 만든 스냅샷). 정체성(앵커) 바로 뒤. 자리가 아니면 [].
|
|
102
|
+
const seatBootSystemMsgs = ctx.seatBoot
|
|
103
|
+
? buildSeatBootSystemMessages(
|
|
104
|
+
{ cwd: ctx.cwd, ...(ctx.sessionId !== undefined ? { sessionId: ctx.sessionId } : {}) },
|
|
105
|
+
ctx.seatBoot === true ? {} : ctx.seatBoot,
|
|
106
|
+
)
|
|
107
|
+
: [];
|
|
94
108
|
const planModeSystemMsgs = buildPlanModeSystemMessages();
|
|
95
109
|
const askSystemMsgs = buildExecutionAskSystemMessages() as LLMMessage[];
|
|
96
110
|
const approvalSystemMsgs = buildApprovalPolicySystemMessages() as LLMMessage[];
|
|
97
111
|
const sandboxSystemMsgs = buildSandboxEscalationSystemMessages() as LLMMessage[];
|
|
112
|
+
// Session-scoped (built once, rebuilt on change) — see turn-session-layers.ts.
|
|
113
|
+
const sessionKey = ctx.sessionId ?? 'tui';
|
|
114
|
+
const memorySystemMsgs = ctx.memory === false
|
|
115
|
+
? []
|
|
116
|
+
: sessionMemoryLayer({ sessionKey, cwd: ctx.cwd, ...(ctx.memory ?? {}) });
|
|
98
117
|
const gitSnapshotSystemMsgs = buildSessionRuntimeSystemMessages({
|
|
99
118
|
cwd: ctx.cwd,
|
|
100
119
|
});
|
|
@@ -137,7 +156,12 @@ export function buildDashboardTurnPreamble(
|
|
|
137
156
|
// 성립한다. fail-soft: ambient 조회 실패가 턴을 막지 않는다.
|
|
138
157
|
let selfOpsSystemMsgs: LLMMessage[] = [];
|
|
139
158
|
try {
|
|
140
|
-
selfOpsSystemMsgs = [
|
|
159
|
+
selfOpsSystemMsgs = [
|
|
160
|
+
elanousSelfAccessPrompt(ctx.sessionId),
|
|
161
|
+
...sessionSelfAmbientParts(sessionKey),
|
|
162
|
+
investigationRecallAmbient(ctx.userText),
|
|
163
|
+
localRefGroundingAmbient(ctx.userText),
|
|
164
|
+
]
|
|
141
165
|
.filter(Boolean)
|
|
142
166
|
.map((content): LLMMessage => ({ role: 'system', content }));
|
|
143
167
|
} catch { /* fail-soft */ }
|
|
@@ -150,10 +174,12 @@ export function buildDashboardTurnPreamble(
|
|
|
150
174
|
: [];
|
|
151
175
|
const preamble = [
|
|
152
176
|
...universalPreamble,
|
|
177
|
+
...seatBootSystemMsgs,
|
|
153
178
|
...planModeSystemMsgs,
|
|
154
179
|
...askSystemMsgs,
|
|
155
180
|
...approvalSystemMsgs,
|
|
156
181
|
...sandboxSystemMsgs,
|
|
182
|
+
...memorySystemMsgs,
|
|
157
183
|
...gitSnapshotSystemMsgs,
|
|
158
184
|
...surfaceSystemMsgs,
|
|
159
185
|
...selfOpsSystemMsgs,
|
|
@@ -190,10 +216,12 @@ export function buildDashboardTurnPreamble(
|
|
|
190
216
|
rich: ctx.rich === true,
|
|
191
217
|
builderCounts: {
|
|
192
218
|
universal: universalPreamble.length,
|
|
219
|
+
seatBoot: seatBootSystemMsgs.length,
|
|
193
220
|
planMode: planModeSystemMsgs.length,
|
|
194
221
|
ask: askSystemMsgs.length,
|
|
195
222
|
approval: approvalSystemMsgs.length,
|
|
196
223
|
sandbox: sandboxSystemMsgs.length,
|
|
224
|
+
memory: memorySystemMsgs.length,
|
|
197
225
|
gitSnapshot: gitSnapshotSystemMsgs.length,
|
|
198
226
|
surface: surfaceSystemMsgs.length,
|
|
199
227
|
selfOps: selfOpsSystemMsgs.length,
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// TUI-SEAT-MEMORY-SCOPE (RFC-tui-self-awareness L2 ①③) — the TUI turn preamble's session layers.
|
|
2
|
+
//
|
|
3
|
+
// ① File memory: until now only chat.ts (telegram · discord · repl · a2a) injected buildMemoryInjection;
|
|
4
|
+
// the TUI preamble had no memory layer at all. Here it does, scoped to global ⊕ this seat/project:
|
|
5
|
+
// a context card tagged with another seat (or another project) is left out — index line included.
|
|
6
|
+
// ③ Injection cadence: the preamble is rebuilt every turn, but these layers are not. They are built once
|
|
7
|
+
// per session and rebuilt only when their source changed (file signature for memory, a short TTL
|
|
8
|
+
// plus content hash for self ambient). Unchanged layers come back byte-identical, which keeps the
|
|
9
|
+
// provider's prompt-cache prefix and skips the per-turn store reads.
|
|
10
|
+
//
|
|
11
|
+
// Both layers are fail-soft: an error drops the layer (observed), it never blocks the turn.
|
|
12
|
+
|
|
13
|
+
import { createHash } from 'node:crypto';
|
|
14
|
+
import { readdirSync, statSync } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import type { LLMMessage } from '../llm.js';
|
|
17
|
+
import { debug } from '../debug/log.js';
|
|
18
|
+
import { buildMemoryInjection, memoryRoot, type MemoryEntry } from '../memory.js';
|
|
19
|
+
import { elanousSelfAmbientParts } from '../agent/self-ambient.js';
|
|
20
|
+
|
|
21
|
+
/** Token budget for the TUI memory layer — the same default chat.ts gives buildMemoryInjection. */
|
|
22
|
+
export const TUI_MEMORY_BUDGET_TOKENS = 1500;
|
|
23
|
+
/** How long cached self ambient is trusted before the stores are read again. */
|
|
24
|
+
export const SELF_AMBIENT_TTL_MS = 60_000;
|
|
25
|
+
/** Sessions remembered per cache; the least recently used one is dropped beyond this. */
|
|
26
|
+
export const SESSION_LAYER_CACHE_MAX = 32;
|
|
27
|
+
|
|
28
|
+
export interface MemoryScope {
|
|
29
|
+
seat?: string;
|
|
30
|
+
project?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** This session's seat: `/seats/<seat>` in the cwd first, then COORD_ID. Project comes only from
|
|
34
|
+
* ELANOUS_PROJECT — a path guess would silently drop cards whose project string does not match it. */
|
|
35
|
+
export function resolveMemoryScope(cwd: string, env: NodeJS.ProcessEnv = process.env): MemoryScope {
|
|
36
|
+
const fromCwd = /(?:^|\/)seats\/([^/]+)/.exec(cwd)?.[1]?.trim();
|
|
37
|
+
const seat = fromCwd || env.COORD_ID?.trim() || undefined;
|
|
38
|
+
const project = env.ELANOUS_PROJECT?.trim() || undefined;
|
|
39
|
+
return { ...(seat ? { seat } : {}), ...(project ? { project } : {}) };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const same = (a: string, b: string): boolean => a.trim().toLowerCase() === b.trim().toLowerCase();
|
|
43
|
+
|
|
44
|
+
/** Global memories (no context card, or a card with an empty seat) stay. A card tagged with a seat
|
|
45
|
+
* stays only for that seat; a card tagged with a project is dropped only when the scope names another one. */
|
|
46
|
+
export function memoryInScope(entry: MemoryEntry, scope: MemoryScope): boolean {
|
|
47
|
+
const card = entry.contextCard;
|
|
48
|
+
if (!card) return true;
|
|
49
|
+
if (card.seat.trim() && !(scope.seat && same(card.seat, scope.seat))) return false;
|
|
50
|
+
if (card.project.trim() && scope.project && !same(card.project, scope.project)) return false;
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** This seat's own cards are injected in full, like pinned memories. */
|
|
55
|
+
export function isSeatCard(entry: MemoryEntry, scope: MemoryScope): boolean {
|
|
56
|
+
const seat = entry.contextCard?.seat.trim();
|
|
57
|
+
return Boolean(seat && scope.seat && same(seat, scope.seat));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Cheap change signal for the file store: names, sizes and mtimes of its markdown files. */
|
|
61
|
+
export function memoryStoreSignature(root: string): string {
|
|
62
|
+
let names: string[];
|
|
63
|
+
try { names = readdirSync(root).filter(name => name.endsWith('.md')).sort(); }
|
|
64
|
+
catch { return 'missing'; }
|
|
65
|
+
const hash = createHash('sha256');
|
|
66
|
+
for (const name of names) {
|
|
67
|
+
try {
|
|
68
|
+
const st = statSync(join(root, name));
|
|
69
|
+
hash.update(`${name}\0${st.size}\0${st.mtimeMs}\n`);
|
|
70
|
+
} catch { hash.update(`${name}\0gone\n`); }
|
|
71
|
+
}
|
|
72
|
+
return hash.digest('hex').slice(0, 16);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const contentHash = (text: string): string => createHash('sha256').update(text).digest('hex').slice(0, 16);
|
|
76
|
+
|
|
77
|
+
interface MemoryCacheEntry { key: string; messages: LLMMessage[]; hash: string }
|
|
78
|
+
interface AmbientCacheEntry { parts: string[]; hash: string; at: number }
|
|
79
|
+
|
|
80
|
+
const memoryCache = new Map<string, MemoryCacheEntry>();
|
|
81
|
+
const ambientCache = new Map<string, AmbientCacheEntry>();
|
|
82
|
+
|
|
83
|
+
/** Map insertion order doubles as recency: re-insert on use, drop the oldest beyond the cap. */
|
|
84
|
+
function remember<V>(cache: Map<string, V>, key: string, value: V): void {
|
|
85
|
+
cache.delete(key);
|
|
86
|
+
cache.set(key, value);
|
|
87
|
+
while (cache.size > SESSION_LAYER_CACHE_MAX) cache.delete(cache.keys().next().value as string);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Test seam — forget every session's cached layers. */
|
|
91
|
+
export function resetTurnSessionLayers(): void {
|
|
92
|
+
memoryCache.clear();
|
|
93
|
+
ambientCache.clear();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface SessionMemoryLayerOpts {
|
|
97
|
+
sessionKey: string;
|
|
98
|
+
cwd: string;
|
|
99
|
+
root?: string;
|
|
100
|
+
env?: NodeJS.ProcessEnv;
|
|
101
|
+
maxTokens?: number;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** The file-memory system message for this session. Rebuilt only when the store or the scope changed. */
|
|
105
|
+
export function sessionMemoryLayer(opts: SessionMemoryLayerOpts): LLMMessage[] {
|
|
106
|
+
try {
|
|
107
|
+
const root = opts.root ?? memoryRoot();
|
|
108
|
+
const scope = resolveMemoryScope(opts.cwd, opts.env);
|
|
109
|
+
const maxTokens = opts.maxTokens ?? TUI_MEMORY_BUDGET_TOKENS;
|
|
110
|
+
const key = JSON.stringify([root, scope.seat ?? '', scope.project ?? '', maxTokens, memoryStoreSignature(root)]);
|
|
111
|
+
const cached = memoryCache.get(opts.sessionKey);
|
|
112
|
+
if (cached && cached.key === key) {
|
|
113
|
+
remember(memoryCache, opts.sessionKey, cached);
|
|
114
|
+
debug.log('chat.memory-layer', 'reused', { session: opts.sessionKey, seat: scope.seat ?? null, hash: cached.hash });
|
|
115
|
+
return cached.messages;
|
|
116
|
+
}
|
|
117
|
+
// Empty user text on purpose: keyword hits would change with every prompt and break the cached prefix.
|
|
118
|
+
// Per-prompt recall is the memory_recall tool's job (it is on every TUI route).
|
|
119
|
+
const inj = buildMemoryInjection('', {
|
|
120
|
+
maxTokens,
|
|
121
|
+
filter: entry => memoryInScope(entry, scope),
|
|
122
|
+
alwaysInject: entry => isSeatCard(entry, scope),
|
|
123
|
+
}, root);
|
|
124
|
+
const messages: LLMMessage[] = inj.block ? [{ role: 'system', content: inj.block }] : [];
|
|
125
|
+
const hash = contentHash(inj.block);
|
|
126
|
+
debug.log('chat.memory-layer', cached ? 'changed' : 'built', {
|
|
127
|
+
session: opts.sessionKey, seat: scope.seat ?? null, project: scope.project ?? null,
|
|
128
|
+
injected: inj.injectedIds.length, tokens: inj.tokens, hash,
|
|
129
|
+
...(cached ? { previousHash: cached.hash, sameContent: cached.hash === hash } : {}),
|
|
130
|
+
});
|
|
131
|
+
// Same content (e.g. an unrelated file touched) keeps the previous array — byte-identical prefix.
|
|
132
|
+
const kept = cached && cached.hash === hash ? cached.messages : messages;
|
|
133
|
+
remember(memoryCache, opts.sessionKey, { key, hash, messages: kept });
|
|
134
|
+
return kept;
|
|
135
|
+
} catch (error) {
|
|
136
|
+
// The layer is dropped for this turn and rebuilt on the next one.
|
|
137
|
+
memoryCache.delete(opts.sessionKey);
|
|
138
|
+
debug.log('chat.memory-layer', 'failed', { session: opts.sessionKey, error: String(error) });
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export interface SessionSelfAmbientOpts {
|
|
144
|
+
now?: number;
|
|
145
|
+
ttlMs?: number;
|
|
146
|
+
build?: () => string[];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** The task-independent self ambient (recent changes · autonomy · ops health · mission incident),
|
|
150
|
+
* read at most once per TTL per session. The task-dependent investigation recall stays per turn. */
|
|
151
|
+
export function sessionSelfAmbientParts(sessionKey: string, opts: SessionSelfAmbientOpts = {}): string[] {
|
|
152
|
+
const now = opts.now ?? Date.now();
|
|
153
|
+
const ttl = opts.ttlMs ?? SELF_AMBIENT_TTL_MS;
|
|
154
|
+
const cached = ambientCache.get(sessionKey);
|
|
155
|
+
if (cached && now - cached.at < ttl) {
|
|
156
|
+
remember(ambientCache, sessionKey, cached);
|
|
157
|
+
return cached.parts;
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
const parts = (opts.build ?? (() => elanousSelfAmbientParts()))();
|
|
161
|
+
const hash = contentHash(parts.join('\0'));
|
|
162
|
+
if (cached && cached.hash === hash) {
|
|
163
|
+
remember(ambientCache, sessionKey, { ...cached, at: now });
|
|
164
|
+
debug.log('chat.self-ambient', 'unchanged', { session: sessionKey, hash });
|
|
165
|
+
return cached.parts;
|
|
166
|
+
}
|
|
167
|
+
remember(ambientCache, sessionKey, { parts, hash, at: now });
|
|
168
|
+
debug.log('chat.self-ambient', cached ? 'changed' : 'built', { session: sessionKey, parts: parts.length, hash });
|
|
169
|
+
return parts;
|
|
170
|
+
} catch (error) {
|
|
171
|
+
// Fail-soft means the layer is left out, not replayed stale; the next turn reads again.
|
|
172
|
+
ambientCache.delete(sessionKey);
|
|
173
|
+
debug.log('chat.self-ambient', 'failed', { session: sessionKey, error: String(error) });
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -166,6 +166,12 @@ export interface TurnStreamFormatter {
|
|
|
166
166
|
export function createTurnStreamFormatter(
|
|
167
167
|
deps: TurnStreamFormatterDeps,
|
|
168
168
|
): TurnStreamFormatter {
|
|
169
|
+
const groupingKind = (name: string, args: Record<string, unknown>): string | undefined => {
|
|
170
|
+
const kind = toolOperationKind(name, args);
|
|
171
|
+
return deps.foldMode === 'kind-unit' || (deps.foldMode === 'task-unit' && kind === 'RunShell')
|
|
172
|
+
? kind
|
|
173
|
+
: undefined;
|
|
174
|
+
};
|
|
169
175
|
// Per-tool-round 누적기. cross-turn 에서 이전 round 의 텍스트를
|
|
170
176
|
// 가져오지 않음. clear-and-commit (onText('', '')) 또는 tool call
|
|
171
177
|
// 발생 시 reset.
|
|
@@ -278,8 +284,8 @@ export function createTurnStreamFormatter(
|
|
|
278
284
|
callId: call.id,
|
|
279
285
|
lines: rendered,
|
|
280
286
|
args: call.args,
|
|
281
|
-
...(
|
|
282
|
-
? { operationKind:
|
|
287
|
+
...(groupingKind(call.name, call.args)
|
|
288
|
+
? { operationKind: groupingKind(call.name, call.args) }
|
|
283
289
|
: {}),
|
|
284
290
|
});
|
|
285
291
|
closeRound();
|
|
@@ -293,8 +299,8 @@ export function createTurnStreamFormatter(
|
|
|
293
299
|
callId: call.id,
|
|
294
300
|
lines: [deps.muted(`${deps.brainIcon} tool: ${call.name} — running`)],
|
|
295
301
|
args: call.args,
|
|
296
|
-
...(
|
|
297
|
-
? { operationKind:
|
|
302
|
+
...(groupingKind(call.name, call.args)
|
|
303
|
+
? { operationKind: groupingKind(call.name, call.args) }
|
|
298
304
|
: {}),
|
|
299
305
|
});
|
|
300
306
|
debug.log('dashboard.chat.generic-tool', 'formatter.genericCall', { toolName: call.name });
|
|
@@ -331,8 +337,10 @@ export function createTurnStreamFormatter(
|
|
|
331
337
|
callId: call.id,
|
|
332
338
|
collapsedLines: variants.collapsed,
|
|
333
339
|
expandedLines: variants.expanded,
|
|
334
|
-
...(
|
|
335
|
-
? { operationKind:
|
|
340
|
+
...(groupingKind(call.name, args)
|
|
341
|
+
? { operationKind: deps.foldMode === 'task-unit'
|
|
342
|
+
? 'RunShell'
|
|
343
|
+
: ('operationKind' in variants ? variants.operationKind : undefined) ?? toolOperationKind(call.name, args) }
|
|
336
344
|
: {}),
|
|
337
345
|
});
|
|
338
346
|
toolArgsByCallId.delete(call.id);
|
|
@@ -99,6 +99,13 @@ export function createTurnStreamPresentationApplier(
|
|
|
99
99
|
switch (event.type) {
|
|
100
100
|
case 'assistant.replaceBlock': {
|
|
101
101
|
const beforeLen = deps.chatLines.length;
|
|
102
|
+
if (assistantStart > deps.chatLines.length) {
|
|
103
|
+
debug.log('dashboard.chat.stream', 'presentation.assistant-start-clamped', {
|
|
104
|
+
assistantStart,
|
|
105
|
+
chatLinesLen: deps.chatLines.length,
|
|
106
|
+
});
|
|
107
|
+
assistantStart = deps.chatLines.length;
|
|
108
|
+
}
|
|
102
109
|
deps.chatLines.length = assistantStart;
|
|
103
110
|
deps.chatLines.push(...event.lines);
|
|
104
111
|
logEvent('assistant.replaceBlock', {
|
|
@@ -158,6 +165,7 @@ export function createTurnStreamPresentationApplier(
|
|
|
158
165
|
event.expandedLines,
|
|
159
166
|
event.operationKind ? { operationKind: event.operationKind } : undefined,
|
|
160
167
|
);
|
|
168
|
+
assistantStart = Math.min(assistantStart, deps.chatLines.length);
|
|
161
169
|
deps.renderedToolRuntime.deleteArgs(event.callId);
|
|
162
170
|
logEvent('tool.replaceBlock', {
|
|
163
171
|
callId: event.callId,
|
|
@@ -21,7 +21,7 @@ export const RELEASE_STATUS_SPEC: LLMToolSpec = {
|
|
|
21
21
|
+ 'topic=cell: id 칸 하나의 상태·근거와 살핀 판.\n'
|
|
22
22
|
+ 'topic=schedule: 발행 이후 판의 컷·착지·발행·동결 일정.\n'
|
|
23
23
|
+ 'topic=ops: 도는 런·발행·늦은 스케줄·자리·열린 결정의 출처 있는 개관.\n'
|
|
24
|
-
+ 'topic 과 action 을 동시에 쓰면
|
|
24
|
+
+ 'topic 과 action 을 동시에 쓰면 오류를 돌려받는다 — 둘 중 하나만 보낸다. topic 은 읽을 대상, action 은 단독 조회의 짧은 요약.\n'
|
|
25
25
|
+ 'topic=features 에서는 owner·status 로 칸을 필터링할 수 있다.\n'
|
|
26
26
|
+ '발행·버전·피처·체크리스트·칸·컷·일정·운영 상태 질문은 Grep·ListDir·파일 검색보다 이 도구를 먼저 부른다 — 그 답은 파일이 아니라 원장에 있다.',
|
|
27
27
|
parameters: { type: 'object', properties: {
|
|
@@ -125,10 +125,9 @@ function cellView(item: ChecklistItem) {
|
|
|
125
125
|
export function dispatchReleaseStatus(args: Record<string, unknown>, deps: ReleaseToolDeps = {}): { text: string; structured: Record<string, unknown> } {
|
|
126
126
|
const topic = args.topic === undefined ? 'status' : args.topic;
|
|
127
127
|
if (typeof topic !== 'string' || !['status', 'features', 'cell', 'schedule', 'ops'].includes(topic)) throw new Error('topic 은 status, features, cell, schedule, ops 중 하나');
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
: { ...result, text: `action=${String(ignoredAction)} 은 무시됨 — topic 과 같이 못 쓴다\n${result.text}` };
|
|
128
|
+
if (args.topic !== undefined && args.action !== undefined) {
|
|
129
|
+
throw new Error('topic 과 action 을 동시에 쓸 수 없습니다 — 둘 중 하나만: topic=features 는 피처 목록 · action 은 짧은 요약');
|
|
130
|
+
}
|
|
132
131
|
const requested = args.version;
|
|
133
132
|
if (topic === 'features') {
|
|
134
133
|
for (const key of ['owner', 'status'] as const) {
|
|
@@ -149,10 +148,10 @@ export function dispatchReleaseStatus(args: Record<string, unknown>, deps: Relea
|
|
|
149
148
|
const kinds: ContextFact['kind'][] = ['run', 'release', 'schedule-late', 'seat', 'decision'];
|
|
150
149
|
const facts = answer.facts.filter(fact => kinds.includes(fact.kind));
|
|
151
150
|
debug.log('release.tool', 'status', { action: 'status', topic, version: requested ?? null });
|
|
152
|
-
return
|
|
151
|
+
return { text: facts.length ? facts.map(fact => JSON.stringify(fact)).join('\n') : '운영 개관: 관측된 사실 없음', structured: { facts } };
|
|
153
152
|
}
|
|
154
153
|
const dev = checklistDevVersion(deps.devVersion?.() ?? devVersion());
|
|
155
|
-
if (
|
|
154
|
+
if (args.action !== undefined) {
|
|
156
155
|
const action = args.action;
|
|
157
156
|
if (typeof action !== 'string' || !['schedule', 'blocked', 'landed'].includes(action)) {
|
|
158
157
|
throw new Error('action 은 schedule, blocked, landed 중 하나여야 합니다');
|
|
@@ -225,7 +224,7 @@ export function dispatchReleaseStatus(args: Record<string, unknown>, deps: Relea
|
|
|
225
224
|
publishAt: row.publishAt ?? null, freezeFrom: row.freezeFrom ?? null, freezeUntil: row.freezeUntil ?? null })) } };
|
|
226
225
|
}
|
|
227
226
|
debug.log('release.tool', 'status', { action: 'status', topic, version: requested ?? dev });
|
|
228
|
-
return
|
|
227
|
+
return result;
|
|
229
228
|
}
|
|
230
229
|
const version = requested ? null : dev;
|
|
231
230
|
const versions = requested ? [requested as string] : [version!, nextVersion(version!)];
|
|
@@ -270,7 +269,7 @@ export function dispatchReleaseStatus(args: Record<string, unknown>, deps: Relea
|
|
|
270
269
|
: published.state === 'unreadable' ? `발행 판 ${published.version} · 발행 기록 못 읽음` : '발행 판 모름';
|
|
271
270
|
const structured = { releases: entries, latestRun: latest, published };
|
|
272
271
|
debug.log('release.tool', 'status', { action: 'status', topic, version: versions.join(',') });
|
|
273
|
-
return
|
|
272
|
+
return { text: `${lines.join('\n\n')}\n${cards.map(formatElanousCard).join('\n')}\n${publishedLine}`, structured };
|
|
274
273
|
}
|
|
275
274
|
|
|
276
275
|
function requiredString(args: Record<string, unknown>, key: string): string {
|
|
@@ -146,7 +146,10 @@ export function recordInboundTurn(
|
|
|
146
146
|
): string | null {
|
|
147
147
|
const q = (opts.userText ?? '').trim();
|
|
148
148
|
if (!q) return null;
|
|
149
|
-
|
|
149
|
+
// Test runners must never fall through to the user's production memory DB.
|
|
150
|
+
const testRunner = process.env.NODE_ENV === 'test' || process.env.BUN_TEST !== undefined;
|
|
151
|
+
const isolatedTestPath = process.env.ELANOUS_STATE_DIR?.trim() ? surfaceEventsDbPath() : ':memory:';
|
|
152
|
+
const db = opts.db ?? openSurfaceEventsDb(testRunner ? isolatedTestPath : surfaceEventsDbPath());
|
|
150
153
|
const ownDb = !opts.db;
|
|
151
154
|
try {
|
|
152
155
|
const a = (opts.responseText ?? '').trim();
|
|
@@ -50,8 +50,13 @@ export function startWatchDefaultScheduler(opts: WatchDefaultSchedulerOpts = {})
|
|
|
50
50
|
running = true;
|
|
51
51
|
try {
|
|
52
52
|
const active = enabled() && listSources({ seat: 'user' }, root).length > 0;
|
|
53
|
-
const
|
|
54
|
-
|
|
53
|
+
const parts = new Intl.DateTimeFormat('en-CA', {
|
|
54
|
+
timeZone, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hourCycle: 'h23',
|
|
55
|
+
}).formatToParts(now());
|
|
56
|
+
const part = (type: string) => parts.find((entry) => entry.type === type)?.value ?? '';
|
|
57
|
+
const day = `${part('year')}-${part('month')}-${part('day')}`;
|
|
58
|
+
const clock = `${part('hour')}:${part('minute')}`;
|
|
59
|
+
const inventoryKey = `${day}:${active}`;
|
|
55
60
|
if (lastInventory !== inventoryKey) {
|
|
56
61
|
// The registry row is a view; a registry failure must not skip the real collect/brief of this minute.
|
|
57
62
|
try {
|
|
@@ -62,14 +67,8 @@ export function startWatchDefaultScheduler(opts: WatchDefaultSchedulerOpts = {})
|
|
|
62
67
|
}
|
|
63
68
|
lastFailure = undefined;
|
|
64
69
|
if (!active) return;
|
|
65
|
-
const parts = new Intl.DateTimeFormat('en-CA', {
|
|
66
|
-
timeZone, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hourCycle: 'h23',
|
|
67
|
-
}).formatToParts(now());
|
|
68
|
-
const part = (type: string) => parts.find((entry) => entry.type === type)?.value ?? '';
|
|
69
|
-
const day = `${part('year')}-${part('month')}-${part('day')}`;
|
|
70
|
-
const clock = `${part('hour')}:${part('minute')}`;
|
|
71
70
|
for (const [job, at, fire] of [['watch-collect', '07:00', collect], ['watch-brief', '08:30', brief]] as const) {
|
|
72
|
-
if (clock
|
|
71
|
+
if (clock < at || lastRun.get(job) === day) continue;
|
|
73
72
|
try {
|
|
74
73
|
const outcome = await fire();
|
|
75
74
|
if (job === 'watch-brief' && (!outcome || (outcome as { sent?: boolean }).sent !== true)) continue;
|
package/src/fold-stack.ts
CHANGED
|
@@ -70,6 +70,9 @@ export interface StaticFoldTarget {
|
|
|
70
70
|
groupKey?: string;
|
|
71
71
|
/** Fold mode shared with fold-applied. FoldStack does not invent this. */
|
|
72
72
|
mode?: string;
|
|
73
|
+
/** Offset (from lineStart) of the click that expanded this target —
|
|
74
|
+
* clicking the same row again collapses it (#16 two-way click). */
|
|
75
|
+
expandedAtOffset?: number;
|
|
73
76
|
}
|
|
74
77
|
|
|
75
78
|
export type FoldTarget = LiveFoldTarget | StaticFoldTarget;
|
|
@@ -178,6 +181,7 @@ export class FoldStack {
|
|
|
178
181
|
|
|
179
182
|
this.opts.chatLines.splice(t.lineStart, oldLen, ...newLines);
|
|
180
183
|
t.expanded = nextExpanded;
|
|
184
|
+
t.expandedAtOffset = undefined;
|
|
181
185
|
t.lineEnd = t.lineStart + newLines.length;
|
|
182
186
|
|
|
183
187
|
// Any OTHER static target whose lineStart is ≥ the toggled
|
|
@@ -224,6 +228,7 @@ export class FoldStack {
|
|
|
224
228
|
const lineStart = t.lineStart;
|
|
225
229
|
const lineEnd = t.lineEnd;
|
|
226
230
|
const toggled = this.toggleTarget(t);
|
|
231
|
+
if (toggled) t.expandedAtOffset = t.expanded ? lineIndex - lineStart : undefined;
|
|
227
232
|
if (toggled) {
|
|
228
233
|
debug.log('log.fold', t.expanded ? 'fold-expanded' : 'fold-recollapsed', {
|
|
229
234
|
mode: t.mode ?? null,
|
|
@@ -259,6 +264,16 @@ export class FoldStack {
|
|
|
259
264
|
return t != null && t.expanded && t.lineStart === lineIndex;
|
|
260
265
|
}
|
|
261
266
|
|
|
267
|
+
/** Fact for callers: may a click on `lineIndex` collapse its expanded
|
|
268
|
+
* target? True on the first line, the last line, and the row whose
|
|
269
|
+
* click expanded it — the rest of the body stays a reading area. */
|
|
270
|
+
isExpandedCollapseLine(lineIndex: number): boolean {
|
|
271
|
+
const t = this.findLatestStaticContaining(lineIndex);
|
|
272
|
+
if (t == null || !t.expanded) return false;
|
|
273
|
+
const offset = lineIndex - t.lineStart;
|
|
274
|
+
return offset === 0 || lineIndex === t.lineEnd - 1 || offset === t.expandedAtOffset;
|
|
275
|
+
}
|
|
276
|
+
|
|
262
277
|
/** Toggle every static target on the stack in the same direction.
|
|
263
278
|
* If ≥ half are already expanded we collapse all; otherwise we
|
|
264
279
|
* expand all. Returns the number of targets that actually changed
|
|
@@ -273,7 +288,14 @@ export class FoldStack {
|
|
|
273
288
|
const statics = this.targets.filter((t): t is StaticFoldTarget => t.kind === 'static');
|
|
274
289
|
if (statics.length === 0) return 0;
|
|
275
290
|
const expandedCount = statics.filter(t => t.expanded).length;
|
|
276
|
-
|
|
291
|
+
return this.setAll(expandedCount * 2 < statics.length); // <50% → expand all
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/** Put every static target in one explicit state (`/log unfold all` ·
|
|
295
|
+
* `/log fold all`). Returns how many targets changed; live targets are
|
|
296
|
+
* skipped exactly as in toggleAll. */
|
|
297
|
+
setAll(targetExpanded: boolean): number {
|
|
298
|
+
const statics = this.targets.filter((t): t is StaticFoldTarget => t.kind === 'static');
|
|
277
299
|
// Sort by lineStart ascending; toggling from the top of chatLines
|
|
278
300
|
// down means later targets shift consistently as we go. Skip
|
|
279
301
|
// targets already in the desired state.
|
|
@@ -287,6 +309,7 @@ export class FoldStack {
|
|
|
287
309
|
const delta = newLines.length - oldLen;
|
|
288
310
|
this.opts.chatLines.splice(t.lineStart, oldLen, ...newLines);
|
|
289
311
|
t.expanded = targetExpanded;
|
|
312
|
+
t.expandedAtOffset = undefined;
|
|
290
313
|
t.lineEnd = t.lineStart + newLines.length;
|
|
291
314
|
if (delta !== 0) {
|
|
292
315
|
for (const other of this.targets) {
|
package/src/git-fs/dirty.ts
CHANGED
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
// kernel has to stat every tracked file vs its index entry.
|
|
6
6
|
//
|
|
7
7
|
// Throttle is enforced by the caller (the index.ts cache). This
|
|
8
|
-
// module just does one probe
|
|
9
|
-
//
|
|
8
|
+
// module just does one probe and is intentionally side-effect free.
|
|
9
|
+
// The sync probes serve one-shot callers; the TUI's periodic refresh
|
|
10
|
+
// uses the async twins so `git status` never blocks its event loop.
|
|
10
11
|
|
|
11
|
-
import { spawnSync } from 'node:child_process';
|
|
12
|
+
import { execFile, spawnSync } from 'node:child_process';
|
|
12
13
|
import type { DirtyCount, AheadBehind } from './types.js';
|
|
13
14
|
import { CLEAN_DIRTY } from './types.js';
|
|
14
15
|
|
|
@@ -26,6 +27,23 @@ export function probeDirty(cwd: string, timeoutMs = 5_000): DirtyCount {
|
|
|
26
27
|
return parsePorcelain(res.stdout);
|
|
27
28
|
}
|
|
28
29
|
|
|
30
|
+
/** Run git without blocking the caller's event loop; null on failure. */
|
|
31
|
+
function execGit(cwd: string, args: string[], timeoutMs: number, maxBuffer: number): Promise<string | null> {
|
|
32
|
+
return new Promise((resolveOut) => {
|
|
33
|
+
try {
|
|
34
|
+
execFile('git', args, { cwd, encoding: 'utf8', timeout: timeoutMs, maxBuffer }, (error, stdout) => {
|
|
35
|
+
resolveOut(error ? null : String(stdout ?? ''));
|
|
36
|
+
});
|
|
37
|
+
} catch { resolveOut(null); }
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Async twin of `probeDirty`. */
|
|
42
|
+
export async function probeDirtyAsync(cwd: string, timeoutMs = 5_000): Promise<DirtyCount> {
|
|
43
|
+
const out = await execGit(cwd, ['status', '--porcelain'], timeoutMs, 2 * 1024 * 1024);
|
|
44
|
+
return out === null ? CLEAN_DIRTY : parsePorcelain(out);
|
|
45
|
+
}
|
|
46
|
+
|
|
29
47
|
/** Parse porcelain v1 output. Format per line:
|
|
30
48
|
*
|
|
31
49
|
* XY <path> — regular change
|
|
@@ -66,7 +84,17 @@ export function probeAheadBehind(cwd: string, timeoutMs = 5_000): AheadBehind |
|
|
|
66
84
|
{ cwd, encoding: 'utf8', timeout: timeoutMs, maxBuffer: 64 * 1024 },
|
|
67
85
|
);
|
|
68
86
|
if (res.status !== 0 || res.error) return null;
|
|
69
|
-
|
|
87
|
+
return parseAheadBehind(res.stdout);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Async twin of `probeAheadBehind`. */
|
|
91
|
+
export async function probeAheadBehindAsync(cwd: string, timeoutMs = 5_000): Promise<AheadBehind | null> {
|
|
92
|
+
const out = await execGit(cwd, ['rev-list', '--left-right', '--count', '@{u}...HEAD'], timeoutMs, 64 * 1024);
|
|
93
|
+
return out === null ? null : parseAheadBehind(out);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function parseAheadBehind(out: string): AheadBehind | null {
|
|
97
|
+
const parts = out.trim().split(/\s+/);
|
|
70
98
|
if (parts.length < 2) return null;
|
|
71
99
|
const behind = Number.parseInt(parts[0]!, 10);
|
|
72
100
|
const ahead = Number.parseInt(parts[1]!, 10);
|
package/src/git-fs/index.ts
CHANGED
|
@@ -13,7 +13,7 @@ import { spawnSync } from 'node:child_process';
|
|
|
13
13
|
import { findGitDir, type LocatedGit } from './locate.js';
|
|
14
14
|
import { readGitHead } from './read-head.js';
|
|
15
15
|
import { GitFileWatcher } from './watcher.js';
|
|
16
|
-
import { probeDirty, probeAheadBehind } from './dirty.js';
|
|
16
|
+
import { probeDirty, probeAheadBehind, probeDirtyAsync, probeAheadBehindAsync } from './dirty.js';
|
|
17
17
|
import { debug } from '../debug/log.js';
|
|
18
18
|
import type {
|
|
19
19
|
GitHeadInfo,
|
|
@@ -170,6 +170,47 @@ export function refreshDirty(
|
|
|
170
170
|
};
|
|
171
171
|
}
|
|
172
172
|
|
|
173
|
+
const dirtyInFlight = new Map<CacheEntry, Promise<GitStatusView>>();
|
|
174
|
+
|
|
175
|
+
function viewOf(entry: CacheEntry): GitStatusView {
|
|
176
|
+
return { head: entry.head, dirty: entry.dirty, aheadBehind: entry.aheadBehind, lastDirtyProbeAt: entry.lastDirtyProbeAt };
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** Non-blocking twin of `refreshDirty` for the TUI: the probes run as
|
|
180
|
+
* async subprocesses so a slow `git status` (large worktree, loaded
|
|
181
|
+
* host) never stalls key input. Same throttle; concurrent calls share
|
|
182
|
+
* one probe, except that `force` (a known write just happened) never
|
|
183
|
+
* reuses a probe that started before it. */
|
|
184
|
+
export function refreshDirtyAsync(
|
|
185
|
+
cwd: string,
|
|
186
|
+
opts: { minIntervalMs?: number; force?: boolean } = {},
|
|
187
|
+
): Promise<GitStatusView> {
|
|
188
|
+
let entry: CacheEntry | null;
|
|
189
|
+
try { entry = ensureEntry(cwd); } catch (error) { return Promise.reject(error); }
|
|
190
|
+
if (!entry) return Promise.resolve({ head: null, dirty: null, aheadBehind: null, lastDirtyProbeAt: 0 });
|
|
191
|
+
// An in-flight probe (possibly a forced, post-write one) is newer than the last stored view.
|
|
192
|
+
const running = dirtyInFlight.get(entry);
|
|
193
|
+
if (running && !opts.force) return running;
|
|
194
|
+
const min = opts.minIntervalMs ?? 2_000;
|
|
195
|
+
if (!opts.force && entry.lastDirtyProbeAt > 0 && Date.now() - entry.lastDirtyProbeAt < min) {
|
|
196
|
+
return Promise.resolve(viewOf(entry));
|
|
197
|
+
}
|
|
198
|
+
const target = entry;
|
|
199
|
+
const root = target.located.root;
|
|
200
|
+
const start = (): Promise<GitStatusView> => Promise.all([probeDirtyAsync(root), probeAheadBehindAsync(root)])
|
|
201
|
+
.then(([dirty, aheadBehind]) => {
|
|
202
|
+
target.dirty = dirty;
|
|
203
|
+
target.aheadBehind = aheadBehind;
|
|
204
|
+
target.lastDirtyProbeAt = Date.now();
|
|
205
|
+
return viewOf(target);
|
|
206
|
+
});
|
|
207
|
+
// A forced probe queues behind the running one so it reads the post-write tree.
|
|
208
|
+
const probe = (running ? running.then(start, start) : start())
|
|
209
|
+
.finally(() => { if (dirtyInFlight.get(target) === probe) dirtyInFlight.delete(target); });
|
|
210
|
+
dirtyInFlight.set(target, probe);
|
|
211
|
+
return probe;
|
|
212
|
+
}
|
|
213
|
+
|
|
173
214
|
/** Claude Code-style git snapshot for LLM system context.
|
|
174
215
|
* This is intentionally a point-in-time summary: good enough for
|
|
175
216
|
* baseline repo awareness, but callers should still use tools for
|
|
@@ -256,4 +297,5 @@ export function __resetGitFsCache(): void {
|
|
|
256
297
|
for (const [, entry] of cache) entry.watcher.dispose();
|
|
257
298
|
cache.clear();
|
|
258
299
|
clearGitSnapshotCache();
|
|
300
|
+
dirtyInFlight.clear();
|
|
259
301
|
}
|
|
@@ -53,6 +53,7 @@ const RELEASE_NODE_COMMANDS: Readonly<Record<string, { recipe: string; command?:
|
|
|
53
53
|
'release-story': { recipe: 'cmd:release-story', command: 'bun scripts/release-story/draft.ts --graph' },
|
|
54
54
|
'ops-upgrade': { recipe: 'cmd:ops-upgrade', command: 'bun scripts/release-loop/ops-upgrade-node.ts' },
|
|
55
55
|
'version-dev-bump': { recipe: 'cmd:version-dev-bump', command: 'bun scripts/release-loop/version-node.ts dev-bump --json' },
|
|
56
|
+
'version-dev-bump-after-failure': { recipe: 'cmd:version-dev-bump', command: 'bun scripts/release-loop/version-node.ts dev-bump --json' },
|
|
56
57
|
done: { recipe: 'none' },
|
|
57
58
|
failed: { recipe: 'none' },
|
|
58
59
|
};
|