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
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
3
|
+
import { existsSync, mkdirSync, realpathSync, statSync } from 'node:fs';
|
|
4
|
+
import { buildCliAgentTools } from '../cli/agent-cli.js';
|
|
5
|
+
import { debug, redactSecrets, redactSecretText } from '../debug/log.js';
|
|
6
|
+
import type { LLMProvider, LLMToolSpec } from '../llm.js';
|
|
7
|
+
import type { Message, MsgStore } from '../msg/msg-store.js';
|
|
8
|
+
import { canonicalSeatId } from '../msg/msg-store.js';
|
|
9
|
+
import { ensureCliSession, runTurn } from '../session/chat.js';
|
|
10
|
+
import { getUserConfig, type RoleLlmSpec } from '../user-config.js';
|
|
11
|
+
import { Database } from 'bun:sqlite';
|
|
12
|
+
|
|
13
|
+
export type AgentReplyAddress = 'COORDINATOR' | 'GUARDIAN';
|
|
14
|
+
export interface AgentReplyRequest { id: number; from: string; body: string; kind?: string }
|
|
15
|
+
export interface AgentReplyInput {
|
|
16
|
+
address: AgentReplyAddress;
|
|
17
|
+
request: AgentReplyRequest;
|
|
18
|
+
role: RoleLlmSpec;
|
|
19
|
+
pack: string;
|
|
20
|
+
store: MsgStore;
|
|
21
|
+
/** The selected instance root for read-only observations, when available. */
|
|
22
|
+
observationRoot?: string;
|
|
23
|
+
/** Test seam: a fake provider still traverses the real runTurn tool loop. */
|
|
24
|
+
provider?: LLMProvider;
|
|
25
|
+
/** A turn seam; the production path uses the CLI agent's runTurn engine. */
|
|
26
|
+
runAgent?: (input: AgentReplyInput) => Promise<string | undefined>;
|
|
27
|
+
}
|
|
28
|
+
export interface AgentReplyResult { replyId: number | null; posted: boolean }
|
|
29
|
+
|
|
30
|
+
/** MK owns the pack generator. Resolve it only when the configured body starts. */
|
|
31
|
+
export function loadAgentRolePack(role: 'coordinator' | 'guardian'): string {
|
|
32
|
+
const modulePath = resolve(import.meta.dir, '../../scripts/coord-role-pack.ts');
|
|
33
|
+
const module = require(modulePath) as { buildCoordRolePack?: (role: 'coordinator' | 'guardian') => string };
|
|
34
|
+
const pack = module.buildCoordRolePack?.(role);
|
|
35
|
+
if (!pack?.trim()) throw new Error(`${role} role pack unavailable`);
|
|
36
|
+
return pack;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function inside(root: string, path: string): boolean {
|
|
40
|
+
const rel = relative(root, path);
|
|
41
|
+
return rel === '' || (rel !== '..' && !rel.startsWith(`..${sep}`) && !isAbsolute(rel));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function existingPath(path: string): string {
|
|
45
|
+
try { return realpathSync(path); }
|
|
46
|
+
catch { return join(realpathSync(dirname(path)), path.slice(dirname(path).length + 1)); }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function repoRoot(start: string): string | null {
|
|
50
|
+
let current = realpathSync(start);
|
|
51
|
+
while (true) {
|
|
52
|
+
if (existsSync(join(current, '.git'))) return current;
|
|
53
|
+
const parent = dirname(current);
|
|
54
|
+
if (parent === current) return null;
|
|
55
|
+
current = parent;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function safeReadPath(path: unknown, cwd: string, roots: readonly string[], notesRoot: string): boolean {
|
|
60
|
+
if (typeof path !== 'string') return false;
|
|
61
|
+
// Credential stems also block their file forms: secrets.json, credentials.json, tokens.txt.
|
|
62
|
+
const forbidden = /(?:^|\/)(?:\.[^/]+|auth[^/]*|(?:credentials?|secrets?|tokens?|passwords?)(?:\.[^/]+)?)(?:\/|$)|\.(?:pem|key)$/i;
|
|
63
|
+
const target = resolve(cwd, path);
|
|
64
|
+
try {
|
|
65
|
+
const canonical = existingPath(target);
|
|
66
|
+
const seatState = join(homedir(), 'elanous-hq', 'seat-state');
|
|
67
|
+
if (inside(seatState, canonical) && !inside(notesRoot, canonical)) return false;
|
|
68
|
+
return roots.some(root => inside(root, canonical)) && !forbidden.test(target) && !forbidden.test(canonical);
|
|
69
|
+
}
|
|
70
|
+
catch { return false; }
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function safeNotePath(path: unknown, cwd: string, notesRoot: string): boolean {
|
|
74
|
+
if (typeof path !== 'string') return false;
|
|
75
|
+
try { return inside(notesRoot, existingPath(resolve(cwd, path))); }
|
|
76
|
+
catch { return false; }
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const FILE_READ_TOOLS = new Set(['Read', 'Grep', 'ListDir']);
|
|
80
|
+
const FILE_WRITE_TOOLS = new Set(['Edit', 'Write']);
|
|
81
|
+
|
|
82
|
+
const THREAD_LIMIT = 50;
|
|
83
|
+
const THREAD_DEPTH = 20;
|
|
84
|
+
|
|
85
|
+
function observedMessage(message: Message) {
|
|
86
|
+
return { id: message.id, from: message.from, to: message.to, kind: message.kind ?? 'unknown',
|
|
87
|
+
body: redactSecretText(message.body), replyTo: message.replyTo ?? null };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** A thread is scoped to messages this address sent, received, or saw as a broadcast. */
|
|
91
|
+
function observeThread(address: AgentReplyAddress, store: MsgStore, messageId: unknown) {
|
|
92
|
+
if (typeof messageId !== 'number' || !Number.isSafeInteger(messageId) || messageId < 1) throw new Error('invalid message id');
|
|
93
|
+
const visible = (m: Message) => m.from === address || m.to === address || m.to === 'ALL';
|
|
94
|
+
const requested = store.getMessage(messageId);
|
|
95
|
+
if (!requested || !visible(requested)) throw new Error('message outside this address');
|
|
96
|
+
// The requested message and its ancestor path always come first, so the limit cannot drop them.
|
|
97
|
+
const path: Message[] = [requested];
|
|
98
|
+
for (let depth = 0; path.at(-1)!.replyTo !== undefined && depth < THREAD_DEPTH; depth++) {
|
|
99
|
+
const parent = store.getMessage(path.at(-1)!.replyTo!);
|
|
100
|
+
if (!parent || !visible(parent)) break;
|
|
101
|
+
path.push(parent);
|
|
102
|
+
}
|
|
103
|
+
const root = path.at(-1)!;
|
|
104
|
+
const seen = new Set(path.map(m => m.id));
|
|
105
|
+
const thread = [...path];
|
|
106
|
+
// Replies are bounded by the same depth below the root as ancestors above it.
|
|
107
|
+
let level: Message[] = [root];
|
|
108
|
+
for (let depth = 0; depth < THREAD_DEPTH && level.length > 0 && thread.length < THREAD_LIMIT; depth++) {
|
|
109
|
+
const next: Message[] = [];
|
|
110
|
+
for (const parent of level) {
|
|
111
|
+
for (const reply of store.listReplies(parent.id, THREAD_LIMIT)) {
|
|
112
|
+
if (!visible(reply)) continue;
|
|
113
|
+
if (seen.has(reply.id)) { next.push(reply); continue; }
|
|
114
|
+
if (thread.length >= THREAD_LIMIT) break;
|
|
115
|
+
seen.add(reply.id);
|
|
116
|
+
thread.push(reply);
|
|
117
|
+
next.push(reply);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
level = next;
|
|
121
|
+
}
|
|
122
|
+
return redactSecrets(thread.sort((a, b) => a.id - b.id).map(observedMessage));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async function observeL0(address: AgentReplyAddress, args: Record<string, unknown>, store?: MsgStore, root?: string): Promise<unknown> {
|
|
126
|
+
const surface = args.surface;
|
|
127
|
+
if (surface === 'messages') {
|
|
128
|
+
if (!store) throw new Error('selected message store unavailable');
|
|
129
|
+
const recipient = args.recipient === undefined ? address : canonicalSeatId(String(args.recipient));
|
|
130
|
+
if (recipient === 'ALL') throw new Error('ALL is not a recipient');
|
|
131
|
+
// `after` re-reads already acknowledged mail; the default stays the unread cursor.
|
|
132
|
+
const after = args.after === undefined ? store.getCursor(recipient) : args.after;
|
|
133
|
+
if (typeof after !== 'number' || !Number.isSafeInteger(after) || after < 0) throw new Error('invalid after cursor');
|
|
134
|
+
return redactSecrets(store.listByRecipient(recipient, after, 20).map(observedMessage));
|
|
135
|
+
}
|
|
136
|
+
if (surface === 'thread') {
|
|
137
|
+
if (!store) throw new Error('selected message store unavailable');
|
|
138
|
+
return observeThread(address, store, args.messageId);
|
|
139
|
+
}
|
|
140
|
+
if (surface === 'checklist') {
|
|
141
|
+
if (!root) throw new Error('selected checklist root unavailable');
|
|
142
|
+
const version = args.version;
|
|
143
|
+
if (typeof version !== 'string' || !/^\d+\.\d+\.\d+$/.test(version)) throw new Error('invalid checklist version');
|
|
144
|
+
const path = join(root, 'release', 'features.sqlite');
|
|
145
|
+
if (!existsSync(path)) return { version, unavailable: 'checklist ledger missing' };
|
|
146
|
+
const db = new Database(path, { readonly: true, strict: true });
|
|
147
|
+
try {
|
|
148
|
+
return redactSecrets(db.query('SELECT feature_id AS id, status, evidence FROM assignments WHERE version = ? LIMIT 100')
|
|
149
|
+
.all(version));
|
|
150
|
+
} finally { db.close(); }
|
|
151
|
+
}
|
|
152
|
+
throw new Error('unknown observation surface');
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** The advertised tools and the dispatcher both enforce L0; prompts are not the boundary. */
|
|
156
|
+
export function buildL0AgentTools(address: AgentReplyAddress, cwd: string = process.cwd(),
|
|
157
|
+
observation?: { store: MsgStore; root?: string }) {
|
|
158
|
+
const cfg = getUserConfig();
|
|
159
|
+
const base = buildCliAgentTools(cfg, undefined, cwd);
|
|
160
|
+
const notesRoot = join(homedir(), 'elanous-hq', 'seat-state', address);
|
|
161
|
+
const readRoots = [repoRoot(cwd), realpathSync(resolve(import.meta.dir, '../..')), existsSync(notesRoot) ? realpathSync(notesRoot) : null]
|
|
162
|
+
.filter((root): root is string => root !== null);
|
|
163
|
+
const specs: LLMToolSpec[] = base.specs.filter(s => FILE_READ_TOOLS.has(s.name) || FILE_WRITE_TOOLS.has(s.name));
|
|
164
|
+
specs.push({ name: 'Observe', description: 'Read-only selected-instance messages, one message thread, or release checklist. messages: unread by default, `after` re-reads acknowledged mail. thread: `messageId` returns its thread scoped to this address. No shell or writes.',
|
|
165
|
+
parameters: { type: 'object', properties: {
|
|
166
|
+
surface: { type: 'string', enum: ['messages', 'thread', 'checklist'] },
|
|
167
|
+
recipient: { type: 'string' }, version: { type: 'string' },
|
|
168
|
+
after: { type: 'integer', minimum: 0 }, messageId: { type: 'integer', minimum: 1 },
|
|
169
|
+
}, required: ['surface'], additionalProperties: false } });
|
|
170
|
+
const deny = (name: string, reason: string) => {
|
|
171
|
+
debug.log('coord.agent', 'l0-denied', { address, tool: name, reason });
|
|
172
|
+
return { error: `L0 denied: ${reason}` };
|
|
173
|
+
};
|
|
174
|
+
const dispatch = async (name: string, args: Record<string, unknown>) => {
|
|
175
|
+
if (name === 'Observe') {
|
|
176
|
+
try { return await observeL0(address, args, observation?.store, observation?.root); }
|
|
177
|
+
catch { return deny(name, 'invalid or unavailable read-only observation'); }
|
|
178
|
+
}
|
|
179
|
+
if (FILE_READ_TOOLS.has(name)) {
|
|
180
|
+
if (name === 'Read' && args.path !== undefined) return deny(name, 'unexpected path field');
|
|
181
|
+
if (name !== 'Read' && args.file_path !== undefined) return deny(name, 'unexpected file_path field');
|
|
182
|
+
const path = name === 'Read' ? args.file_path : args.path;
|
|
183
|
+
if (!safeReadPath(path, cwd, readRoots, notesRoot)) return deny(name, 'outside approved read roots or credential path');
|
|
184
|
+
// A directory-wide Grep can traverse hidden credentials below an otherwise safe root.
|
|
185
|
+
if (name === 'Grep') {
|
|
186
|
+
try { if (!statSync(resolve(cwd, String(args.path))).isFile()) return deny(name, 'grep needs one explicit file'); }
|
|
187
|
+
catch { return deny(name, 'grep needs one explicit file'); }
|
|
188
|
+
}
|
|
189
|
+
return redactSecrets(await base.dispatch(name, args));
|
|
190
|
+
}
|
|
191
|
+
if (FILE_WRITE_TOOLS.has(name)) {
|
|
192
|
+
if (!safeNotePath(args.file_path, cwd, notesRoot)) return deny(name, 'outside role notes');
|
|
193
|
+
return redactSecrets(await base.dispatch(name, args));
|
|
194
|
+
}
|
|
195
|
+
return deny(name, 'tool is outside L0 allowlist');
|
|
196
|
+
};
|
|
197
|
+
return { specs, dispatch };
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
async function runRestrictedAgent(input: AgentReplyInput): Promise<string | undefined> {
|
|
201
|
+
const cfg = getUserConfig();
|
|
202
|
+
const model = input.role.model?.trim();
|
|
203
|
+
const provider = input.role.provider;
|
|
204
|
+
if (!model || !provider) throw new Error(`${input.address} role LLM needs resolved provider and model`);
|
|
205
|
+
if (!input.pack.trim()) throw new Error(`${input.address} role pack is empty`);
|
|
206
|
+
mkdirSync(join(homedir(), 'elanous-hq', 'seat-state', input.address), { recursive: true, mode: 0o700 });
|
|
207
|
+
const configured = { ...cfg, llm: { ...cfg.llm, provider, model,
|
|
208
|
+
goalLoop: { ...cfg.llm.goalLoop, enabled: false } } };
|
|
209
|
+
const session = ensureCliSession(configured, undefined, { title: `${input.address} inbox #${input.request.id}` });
|
|
210
|
+
const tools = buildL0AgentTools(input.address, process.cwd(), { store: input.store, root: input.observationRoot });
|
|
211
|
+
const result = await runTurn({
|
|
212
|
+
userConfig: configured, sessionId: session.id,
|
|
213
|
+
userText: `Message #${input.request.id} from ${input.request.from} (kind: ${input.request.kind ?? 'unknown'}):\n${redactSecretText(input.request.body)}\n\nReply with one concise proposal and evidence.`,
|
|
214
|
+
systemPrompt: `${input.pack}\n\nL0: only read tools and writing your own role notes are available. The wrapper posts one reply with replyTo automatically. Do not include credentials or attempt a traffic/checklist/landing action.`,
|
|
215
|
+
tools: tools.specs, dispatchTool: tools.dispatch,
|
|
216
|
+
llmOpts: { model, ...(input.role.effort ? { reasoningEffort: input.role.effort } : {}) },
|
|
217
|
+
...(input.provider ? { provider: input.provider } : {}),
|
|
218
|
+
skipMemoryInjection: true,
|
|
219
|
+
});
|
|
220
|
+
return result.text.trim() || undefined;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function existingReply(store: MsgStore, address: AgentReplyAddress, request: AgentReplyRequest): number | null {
|
|
224
|
+
const linked = store.db.query(`SELECT id FROM msg_messages WHERE sender = ? AND recipient = ? AND reply_to = ? AND kind = 'reply' ORDER BY id LIMIT 1`)
|
|
225
|
+
.get(address, request.from, request.id) as { id: number } | null;
|
|
226
|
+
return linked?.id ?? null;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/** Generate at most once per accepted request; the durable reply link wins every retry. */
|
|
230
|
+
export async function replyWithAgent(input: AgentReplyInput): Promise<AgentReplyResult> {
|
|
231
|
+
const { store, address, request } = input;
|
|
232
|
+
const durable = store.getMessage(request.id);
|
|
233
|
+
if (!durable || durable.to !== address || durable.from !== request.from || durable.body !== request.body) {
|
|
234
|
+
throw new Error('agent reply request does not match the durable message');
|
|
235
|
+
}
|
|
236
|
+
const prior = existingReply(store, address, request);
|
|
237
|
+
if (prior !== null) return { replyId: prior, posted: false };
|
|
238
|
+
const generated = await (input.runAgent ?? runRestrictedAgent)(input);
|
|
239
|
+
if (!generated?.trim()) return { replyId: null, posted: false };
|
|
240
|
+
let safe: string;
|
|
241
|
+
try { safe = redactSecretText(generated.trim()); }
|
|
242
|
+
catch (error) {
|
|
243
|
+
debug.log('coord.agent', 'redaction-failed', { address, requestId: request.id });
|
|
244
|
+
throw new Error('agent reply redaction failed', { cause: error });
|
|
245
|
+
}
|
|
246
|
+
if (!safe.trim()) throw new Error('agent reply redaction failed');
|
|
247
|
+
return store.db.transaction(() => {
|
|
248
|
+
const linked = existingReply(store, address, request);
|
|
249
|
+
if (linked !== null) return { replyId: linked, posted: false };
|
|
250
|
+
const message = store.post({ from: address, to: request.from, body: safe, kind: 'reply', replyTo: request.id });
|
|
251
|
+
debug.log('coord.agent', 'decision', { address, requestId: request.id, replyId: message.id,
|
|
252
|
+
model: input.role.model ?? null, provider: input.role.provider ?? null,
|
|
253
|
+
decision: redactSecretText(safe.slice(0, 300)) });
|
|
254
|
+
return { replyId: message.id, posted: true };
|
|
255
|
+
}).immediate();
|
|
256
|
+
}
|
package/src/loops/budget.ts
CHANGED
|
@@ -7,16 +7,21 @@ const RESOURCE_SEATS: readonly OrchestratorSeat[] = ['OP', 'TC', 'MK', 'UX'];
|
|
|
7
7
|
type WorkCell = Pick<ChecklistItem, 'owner' | 'status'>;
|
|
8
8
|
|
|
9
9
|
/** Allocate whole base slots by remaining work; this calculation does not decide launches. */
|
|
10
|
-
export function calculateSeatBaseShares({ totalSlots, currentRound, nextRound, seatCaps }: {
|
|
10
|
+
export function calculateSeatBaseShares({ totalSlots, currentRound, nextRound, seatCaps, minShare = 0 }: {
|
|
11
11
|
totalSlots: number;
|
|
12
12
|
currentRound: readonly WorkCell[];
|
|
13
13
|
nextRound: readonly WorkCell[];
|
|
14
14
|
seatCaps: Readonly<Record<OrchestratorSeat, number>>;
|
|
15
|
+
/** CAP-DYN seat minimum: seats holding yellow work receive min(minShare, cap) before the weighted split. Default 0 keeps the weighted-only split. */
|
|
16
|
+
minShare?: number;
|
|
15
17
|
}): Record<OrchestratorSeat, number> {
|
|
16
18
|
if (!Number.isSafeInteger(totalSlots) || totalSlots < 0 ||
|
|
17
19
|
RESOURCE_SEATS.some(seat => !Number.isSafeInteger(seatCaps[seat]) || seatCaps[seat] < 0)) {
|
|
18
20
|
throw new RangeError('totalSlots and seatCaps must be nonnegative safe integers');
|
|
19
21
|
}
|
|
22
|
+
if (!Number.isSafeInteger(minShare) || minShare < 0) {
|
|
23
|
+
throw new RangeError('minShare must be a nonnegative safe integer');
|
|
24
|
+
}
|
|
20
25
|
const shares: Record<OrchestratorSeat, number> = { OP: 0, TC: 0, MK: 0, UX: 0 };
|
|
21
26
|
const weights: Record<OrchestratorSeat, number> = { OP: 0, TC: 0, MK: 0, UX: 0 };
|
|
22
27
|
for (const [cells, weight] of [[currentRound, 2], [nextRound, 1]] as const) {
|
|
@@ -28,23 +33,48 @@ export function calculateSeatBaseShares({ totalSlots, currentRound, nextRound, s
|
|
|
28
33
|
}
|
|
29
34
|
|
|
30
35
|
let available = Math.min(totalSlots, RESOURCE_SEATS.reduce((sum, seat) => sum + seatCaps[seat], 0));
|
|
31
|
-
|
|
36
|
+
if (minShare > 0) {
|
|
37
|
+
// Seat minimum: only seats with at least one yellow cell qualify, capped by their own cap.
|
|
38
|
+
const floors = RESOURCE_SEATS
|
|
39
|
+
.filter(seat => weights[seat] > 0)
|
|
40
|
+
.map(seat => ({ seat, floor: Math.min(minShare, seatCaps[seat]) }))
|
|
41
|
+
.filter(entry => entry.floor > 0);
|
|
42
|
+
const floorTotal = floors.reduce((sum, entry) => sum + entry.floor, 0);
|
|
43
|
+
if (floorTotal > available) {
|
|
44
|
+
// The minimums alone exceed the pool: largest-weight seats keep theirs, the rest get zero.
|
|
45
|
+
floors.sort((a, b) => weights[b.seat] - weights[a.seat]);
|
|
46
|
+
for (const { seat, floor } of floors) {
|
|
47
|
+
const grant = Math.min(floor, available);
|
|
48
|
+
shares[seat] = grant;
|
|
49
|
+
available -= grant;
|
|
50
|
+
if (available === 0) break;
|
|
51
|
+
}
|
|
52
|
+
return shares;
|
|
53
|
+
}
|
|
54
|
+
for (const { seat, floor } of floors) {
|
|
55
|
+
shares[seat] = floor;
|
|
56
|
+
available -= floor;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const room = (seat: OrchestratorSeat): number => seatCaps[seat] - shares[seat];
|
|
60
|
+
let eligible = RESOURCE_SEATS.filter(seat => weights[seat] > 0 && room(seat) > 0);
|
|
32
61
|
while (available > 0 && eligible.length > 0) {
|
|
33
62
|
const totalWeight = eligible.reduce((sum, seat) => sum + weights[seat], 0);
|
|
34
63
|
const ideal = (seat: OrchestratorSeat) => available * weights[seat] / totalWeight;
|
|
35
|
-
const capped = eligible.filter(seat => ideal(seat) >=
|
|
64
|
+
const capped = eligible.filter(seat => ideal(seat) >= room(seat));
|
|
36
65
|
if (capped.length > 0) {
|
|
37
66
|
for (const seat of capped) {
|
|
38
|
-
|
|
39
|
-
|
|
67
|
+
const fill = room(seat);
|
|
68
|
+
shares[seat] += fill;
|
|
69
|
+
available -= fill;
|
|
40
70
|
}
|
|
41
71
|
eligible = eligible.filter(seat => !capped.includes(seat));
|
|
42
72
|
continue;
|
|
43
73
|
}
|
|
44
74
|
const remainders = eligible.map(seat => ({ seat, exact: ideal(seat) }));
|
|
45
75
|
for (const { seat, exact } of remainders) {
|
|
46
|
-
shares[seat]
|
|
47
|
-
available -=
|
|
76
|
+
shares[seat] += Math.floor(exact);
|
|
77
|
+
available -= Math.floor(exact);
|
|
48
78
|
}
|
|
49
79
|
remainders.sort((a, b) => (b.exact - Math.floor(b.exact)) - (a.exact - Math.floor(a.exact)));
|
|
50
80
|
for (const { seat } of remainders) {
|
package/src/loops/loop-cli.ts
CHANGED
|
@@ -19,12 +19,13 @@ function handle(action: () => Promise<void> | void): Promise<void> {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
function allLoopTable(entries: AllLoopEntry[]): void {
|
|
22
|
-
console.log('id\t층\t주인 자리\t모드\t기대 주기\t호스트\t울타리 역할\t관측 카테고리\t마지막
|
|
22
|
+
console.log('id\t층\t주인 자리\t모드\t기대 주기\t호스트\t울타리 역할\t관측 카테고리\t마지막 실행\t메시지 주소\t답글 몸\t깨움\t깨움 출처\t안 읽은 글');
|
|
23
23
|
for (const entry of entries) {
|
|
24
24
|
const interval = entry.expectEveryMinutes === undefined ? '모름'
|
|
25
25
|
: entry.cronIrregular ? `불규칙 · 최대 ${entry.expectEveryMinutes}분` : `${entry.expectEveryMinutes}분`;
|
|
26
26
|
console.log([entry.id, entry.kind, entry.owner ?? '모름', entry.mode ?? '모름', interval,
|
|
27
|
-
entry.host ?? '모름', entry.fenceRole ?? '모름', entry.observationCategory ?? '모름', entry.lastRunAt ?? '모름'
|
|
27
|
+
entry.host ?? '모름', entry.fenceRole ?? '모름', entry.observationCategory ?? '모름', entry.lastRunAt ?? '모름',
|
|
28
|
+
entry.msgAddress ?? '—', entry.replyBody ?? 'none', entry.wake ?? 'none', entry.wakeSource === 'unresolved' ? '모름' : entry.wakeSource ?? '—', entry.unreadCount ?? '모름'].join('\t'));
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** Current single-root aliases. Address issuance and `loop:` aliases belong to a later slice. */
|
|
2
|
+
// `wake` = how a post reaches a body that is not already listening. The coordinator ticks on cron
|
|
3
|
+
// (08·12·18) until its SSE reply body is switched on; the guardian has no reply body to wake.
|
|
4
|
+
export const LOOP_MESSAGE_ROUTES = {
|
|
5
|
+
orchestrator: { msgAddress: 'COORDINATOR', replyBody: 'rules', wake: 'cron' },
|
|
6
|
+
guardian: { msgAddress: 'GUARDIAN', replyBody: 'none', wake: 'none' },
|
|
7
|
+
} as const;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Seat addresses share the table. A seat has no fixed `wake`: `wakeFrom: 'host'` says the path is
|
|
11
|
+
* resolved on this host from the seat folder or a pty named after the seat (`resolveWake` in msg-wake.ts).
|
|
12
|
+
*/
|
|
13
|
+
export const SEAT_MESSAGE_ROUTES = {
|
|
14
|
+
OP: { msgAddress: 'OP', replyBody: 'agent', wakeFrom: 'host' },
|
|
15
|
+
TC: { msgAddress: 'TC', replyBody: 'agent', wakeFrom: 'host' },
|
|
16
|
+
MK: { msgAddress: 'MK', replyBody: 'agent', wakeFrom: 'host' },
|
|
17
|
+
UX: { msgAddress: 'UX', replyBody: 'agent', wakeFrom: 'host' },
|
|
18
|
+
OPC: { msgAddress: 'OPC', replyBody: 'agent', wakeFrom: 'host' },
|
|
19
|
+
OPT: { msgAddress: 'OPT', replyBody: 'agent', wakeFrom: 'host' },
|
|
20
|
+
} as const;
|
|
21
|
+
|
|
22
|
+
export type LoopReplyBody = 'none' | 'rules' | 'agent';
|
|
23
|
+
export type MessageWake = 'sse' | 'pty-inject' | 'herdr' | 'cron' | 'none';
|
|
24
|
+
|
|
25
|
+
export function loopMessageRoute(id: string): { msgAddress: string | null; replyBody: LoopReplyBody; wake: MessageWake } {
|
|
26
|
+
return Object.hasOwn(LOOP_MESSAGE_ROUTES, id)
|
|
27
|
+
? LOOP_MESSAGE_ROUTES[id as keyof typeof LOOP_MESSAGE_ROUTES]
|
|
28
|
+
: { msgAddress: null, replyBody: 'none', wake: 'none' };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** The declared table row for one canonical address — a loop body or a seat — or null when unlisted. */
|
|
32
|
+
export function messageRouteFor(address: string): { msgAddress: string; replyBody: LoopReplyBody; wake?: MessageWake; wakeFrom?: 'host' } | null {
|
|
33
|
+
const name = address.trim().toUpperCase();
|
|
34
|
+
const loop = Object.values(LOOP_MESSAGE_ROUTES).find(route => route.msgAddress === name);
|
|
35
|
+
if (loop) return loop;
|
|
36
|
+
return Object.hasOwn(SEAT_MESSAGE_ROUTES, name) ? SEAT_MESSAGE_ROUTES[name as keyof typeof SEAT_MESSAGE_ROUTES] : null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** A notice is advisory; durable posting to these valid names still succeeds. */
|
|
40
|
+
export function noReplyBodyNotice(address: string): string | null {
|
|
41
|
+
const name = address.trim().toUpperCase();
|
|
42
|
+
return name === LOOP_MESSAGE_ROUTES.guardian.msgAddress || name === 'ORCHESTRATOR' || name === 'STEWARD'
|
|
43
|
+
? '이 주소는 읽는 몸이 없다 — 지금은 OP'
|
|
44
|
+
: null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** `loop:` is not yet a message address, so the normal address validator still rejects it. */
|
|
48
|
+
export function unsupportedLoopAddressNotice(address: string): string | null {
|
|
49
|
+
if (!/^loop:/i.test(address.trim())) return null;
|
|
50
|
+
const id = address.trim().slice(5).toLowerCase();
|
|
51
|
+
const route = loopMessageRoute(id);
|
|
52
|
+
return route.msgAddress && route.replyBody !== 'none'
|
|
53
|
+
? `${address.trim()} 는 아직 주소가 아니다 — 지금 읽는 주소는 ${route.msgAddress} (eln loop list --json 의 msgAddress)`
|
|
54
|
+
: route.msgAddress
|
|
55
|
+
? `${address.trim()} 는 아직 주소가 아니다 — ${route.msgAddress}은 읽는 몸이 없다 — 지금은 OP (eln loop list --json 의 replyBody)`
|
|
56
|
+
: `${address.trim()} 는 아직 주소가 아니다 — 읽는 몸이 없다. 지금은 OP (eln loop list --json 의 msgAddress)`;
|
|
57
|
+
}
|