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
|
@@ -388,6 +388,131 @@ export const nativeToolCatalog: NativeToolCatalogEntry[] = [
|
|
|
388
388
|
alwaysLoad: false,
|
|
389
389
|
shouldDefer: true,
|
|
390
390
|
},
|
|
391
|
+
// ── Ops-ledger native tools (우편 msg · 판 release checklist) ──────────────
|
|
392
|
+
// OP TUI turns drove msg list/post/ack and release checklist
|
|
393
|
+
// list/move/set/add through `eln` RunShell calls — 1.3–2s of CLI
|
|
394
|
+
// startup each, 30+ spawns per turn, shell stdout amplifying screen
|
|
395
|
+
// defects. These eight tools reuse the SAME durable services
|
|
396
|
+
// in-process (msg-store SQLite ledger · release-loop checklist
|
|
397
|
+
// ledger), preserving the structured results, the seat/OP permission
|
|
398
|
+
// boundaries (ELANOUS_TRACK actor routing, seatMove rules, the HQ
|
|
399
|
+
// lease fence) and the claim-history audit. Every call is a local
|
|
400
|
+
// ledger read/write — no process spawn, no network, no running-runs
|
|
401
|
+
// sweep — so a TUI OP turn needs zero RunShell round-trips (RunShell
|
|
402
|
+
// steers these exact CLI shapes to the native tools; see
|
|
403
|
+
// src/skills/tools/shell.ts). Dispatchers: src/skills/tools/ops-ledger.ts.
|
|
404
|
+
{
|
|
405
|
+
id: 'msg_list',
|
|
406
|
+
kind: 'other',
|
|
407
|
+
aliases: ['MsgList', 'msg_list'],
|
|
408
|
+
displayName: 'MsgList',
|
|
409
|
+
description: 'List durable seat-addressed messages for one recipient WITHOUT acknowledging them. Same SQLite ledger as `elanous msg list`, in-process — no CLI startup. Reading never advances the acknowledgement cursor; `after` pages beyond it.',
|
|
410
|
+
promptSummary: '`MsgList(to, after?, limit?)` (durable seat mailbox listing · read never acks · in-process)',
|
|
411
|
+
host: ['skill', 'tui'],
|
|
412
|
+
safety: ['read-only'],
|
|
413
|
+
supportsParallel: true,
|
|
414
|
+
defaultEnabled: true,
|
|
415
|
+
intentScope: 'ops-fleet',
|
|
416
|
+
cleanerFitThanShell: true,
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
id: 'msg_post',
|
|
420
|
+
kind: 'other',
|
|
421
|
+
aliases: ['MsgPost', 'msg_post'],
|
|
422
|
+
displayName: 'MsgPost',
|
|
423
|
+
description: 'Post a durable seat-addressed message. Same SQLite ledger as `elanous msg post`, in-process — no CLI startup. ALL may receive but never send; `kind` tags the message; `replyTo` points a reply at a question message ID.',
|
|
424
|
+
promptSummary: '`MsgPost(from, to, body, kind?, replyTo?)` (post durable seat message · in-process)',
|
|
425
|
+
host: ['skill', 'tui'],
|
|
426
|
+
safety: ['mutating'],
|
|
427
|
+
supportsParallel: false,
|
|
428
|
+
defaultEnabled: true,
|
|
429
|
+
intentScope: 'ops-fleet',
|
|
430
|
+
cleanerFitThanShell: true,
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
id: 'msg_ack',
|
|
434
|
+
kind: 'other',
|
|
435
|
+
aliases: ['MsgAck', 'msg_ack'],
|
|
436
|
+
displayName: 'MsgAck',
|
|
437
|
+
description: 'Acknowledge durable messages for one recipient through an ID, advancing their cursor so later MsgList calls start after them. Same SQLite ledger as `elanous msg ack`, in-process.',
|
|
438
|
+
promptSummary: '`MsgAck(to, id)` (advance a seat’s ack cursor through id · in-process)',
|
|
439
|
+
host: ['skill', 'tui'],
|
|
440
|
+
safety: ['mutating'],
|
|
441
|
+
supportsParallel: false,
|
|
442
|
+
defaultEnabled: true,
|
|
443
|
+
intentScope: 'ops-fleet',
|
|
444
|
+
cleanerFitThanShell: true,
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
id: 'checklist_list',
|
|
448
|
+
kind: 'other',
|
|
449
|
+
aliases: ['ChecklistList', 'checklist_list'],
|
|
450
|
+
displayName: 'ChecklistList',
|
|
451
|
+
description: 'List the release-checklist cells for one version with per-status summary, blocked cells, per-owner counts and screen-parity warnings. Same ledger as `elanous release checklist list --json`, in-process. Read-only.',
|
|
452
|
+
promptSummary: '`ChecklistList(version?, owner?)` (판 checklist snapshot + summary + parity · in-process)',
|
|
453
|
+
host: ['skill', 'tui'],
|
|
454
|
+
safety: ['read-only'],
|
|
455
|
+
supportsParallel: true,
|
|
456
|
+
defaultEnabled: true,
|
|
457
|
+
intentScope: 'ops-fleet',
|
|
458
|
+
cleanerFitThanShell: true,
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
id: 'checklist_add',
|
|
462
|
+
kind: 'other',
|
|
463
|
+
aliases: ['ChecklistAdd', 'checklist_add'],
|
|
464
|
+
displayName: 'ChecklistAdd',
|
|
465
|
+
description: 'Add one cell to a release checklist (owner · priority · deadlineVersion · predecessors · refs; kind/dispatchKind/CEO load/accelerator afterwards via ChecklistEdit). Same ledger, HQ lease fence and claim-history audit as `elanous release checklist add`, in-process.',
|
|
466
|
+
promptSummary: '`ChecklistAdd(id, title, version?, owner?, kind?, …)` (add a release checklist cell · in-process)',
|
|
467
|
+
host: ['skill', 'tui'],
|
|
468
|
+
safety: ['mutating'],
|
|
469
|
+
supportsParallel: false,
|
|
470
|
+
defaultEnabled: true,
|
|
471
|
+
intentScope: 'ops-fleet',
|
|
472
|
+
cleanerFitThanShell: true,
|
|
473
|
+
},
|
|
474
|
+
{
|
|
475
|
+
id: 'checklist_set',
|
|
476
|
+
kind: 'other',
|
|
477
|
+
aliases: ['ChecklistSet', 'checklist_set'],
|
|
478
|
+
displayName: 'ChecklistSet',
|
|
479
|
+
description: 'Set one release-checklist cell’s status and/or evidence line (⊕ additive refs). Same ledger, HQ lease fence, actor audit and screen-parity warning as `elanous release checklist set`, in-process. Other metadata goes through ChecklistEdit.',
|
|
480
|
+
promptSummary: '`ChecklistSet(id, version?, status?, evidence?, refs?)` (cell status/evidence · seat-audited · in-process)',
|
|
481
|
+
host: ['skill', 'tui'],
|
|
482
|
+
safety: ['mutating'],
|
|
483
|
+
supportsParallel: false,
|
|
484
|
+
defaultEnabled: true,
|
|
485
|
+
intentScope: 'ops-fleet',
|
|
486
|
+
cleanerFitThanShell: true,
|
|
487
|
+
},
|
|
488
|
+
{
|
|
489
|
+
id: 'checklist_edit',
|
|
490
|
+
kind: 'other',
|
|
491
|
+
aliases: ['ChecklistEdit', 'checklist_edit'],
|
|
492
|
+
displayName: 'ChecklistEdit',
|
|
493
|
+
description: 'Change exactly one metadata field of a release-checklist cell (owner · priority · disposition · kind · dispatchKind · deadlineVersion · predecessors · ceoMinutes · ceoDate · accelerator) — one field per call so a model that fills every property cannot clobber the rest. Same ledger, HQ lease fence and actor audit as `elanous release checklist set`, in-process.',
|
|
494
|
+
promptSummary: '`ChecklistEdit(id, field, value, version?)` (one cell metadata field · seat-audited · in-process)',
|
|
495
|
+
host: ['skill', 'tui'],
|
|
496
|
+
safety: ['mutating'],
|
|
497
|
+
supportsParallel: false,
|
|
498
|
+
defaultEnabled: true,
|
|
499
|
+
intentScope: 'ops-fleet',
|
|
500
|
+
cleanerFitThanShell: true,
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
id: 'checklist_move',
|
|
504
|
+
kind: 'other',
|
|
505
|
+
aliases: ['ChecklistMove', 'checklist_move'],
|
|
506
|
+
displayName: 'ChecklistMove',
|
|
507
|
+
description: 'Move one checklist cell to another release version in a single transaction. Permission routing preserved: a seat moves only its own cell into the next version (capacity-checked), OP moves unrestricted, no ELANOUS_TRACK runs unchecked as anonymous. Same ledger and history audit as `elanous release checklist move`, in-process.',
|
|
508
|
+
promptSummary: '`ChecklistMove(id, from, to, reason)` (move a cell across versions · seat/OP rules preserved · in-process)',
|
|
509
|
+
host: ['skill', 'tui'],
|
|
510
|
+
safety: ['mutating'],
|
|
511
|
+
supportsParallel: false,
|
|
512
|
+
defaultEnabled: true,
|
|
513
|
+
intentScope: 'ops-fleet',
|
|
514
|
+
cleanerFitThanShell: true,
|
|
515
|
+
},
|
|
391
516
|
// Input-policy tools — Phase 6 of the unified-input plan.
|
|
392
517
|
// SetInputMode is mutating but side-effect is tiny (context tag +
|
|
393
518
|
// onEnter/onExit). GetInputPolicy is read-only. SetInputBinding is
|
|
@@ -176,6 +176,7 @@ import { dispatchPersonaRoute } from './personas.js';
|
|
|
176
176
|
import { handleMe, operatorSignal } from './operator.js';
|
|
177
177
|
import { handleGraphRunRoute } from '../../graph-runner/graph-run-api.js';
|
|
178
178
|
import { handleOpsApi } from './ops-api.js';
|
|
179
|
+
import { handleProjectAutopsy } from './project-autopsy.js';
|
|
179
180
|
import { handleRoleJudge } from './role-judge.js';
|
|
180
181
|
import { handleAudioStt } from './audio-stt.js';
|
|
181
182
|
import { handleLlmModels } from './llm-models.js';
|
|
@@ -1499,6 +1500,10 @@ export async function routeRequest(
|
|
|
1499
1500
|
if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
|
|
1500
1501
|
return method === 'GET' ? handleProjectsGet() : handleProjectsPost(req);
|
|
1501
1502
|
}
|
|
1503
|
+
if (pathname.startsWith('/v1/projects/') && pathname.endsWith('/autopsy') && method === 'GET') {
|
|
1504
|
+
if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
|
|
1505
|
+
return handleProjectAutopsy(req, pathname.slice('/v1/projects/'.length, pathname.length - '/autopsy'.length));
|
|
1506
|
+
}
|
|
1502
1507
|
|
|
1503
1508
|
// Polling must remain outside the non-GET dispatch below.
|
|
1504
1509
|
if (method === 'GET' && pathname.startsWith(`${SKILL_EXEC_PATH}/`) && !pathname.slice(SKILL_EXEC_PATH.length + 1).includes('/')) {
|
package/src/nexus/api/ops-api.ts
CHANGED
|
@@ -131,6 +131,8 @@ export function releaseNodeFacts(output: unknown): ReleaseNodeFacts {
|
|
|
131
131
|
}
|
|
132
132
|
export interface ReleaseRunView {
|
|
133
133
|
runId: string; status: string; startedAt: string; version: string | null; path: string[]; nodes: ReleaseRunNodeView[];
|
|
134
|
+
/** Explicit project ownership. The release ledger does not currently populate this field. */
|
|
135
|
+
projectId?: string;
|
|
134
136
|
/** GATE-LIVE-OBS — 지금 gate 노드에 있는 런에만 싣는다(발행 원장 `gate-logs/cut/shards.json`). 파일이 없으면 생략. */
|
|
135
137
|
gateShards?: GateShardsFile & { summary: GateShardsSummary };
|
|
136
138
|
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { jsonResponse } from './json-response.js';
|
|
2
|
+
import { readReleaseRuns, type ReleaseRunView } from './ops-api.js';
|
|
3
|
+
import { listPendingApprovals, type PendingApprovalSummary } from './workflow-approvals.js';
|
|
4
|
+
import { getProject, type Project } from '../../project/project-store.js';
|
|
5
|
+
import { classifyMergeFailure, type MergeFailureKind } from '../../self-implement/regate-detail.js';
|
|
6
|
+
|
|
7
|
+
/** One failed node of a release run explicitly assigned to the project. */
|
|
8
|
+
export interface ProjectAutopsyFailure {
|
|
9
|
+
runId: string;
|
|
10
|
+
nodeId: string;
|
|
11
|
+
summary: string;
|
|
12
|
+
kind: MergeFailureKind;
|
|
13
|
+
status: string;
|
|
14
|
+
startedAt?: string;
|
|
15
|
+
endedAt?: string;
|
|
16
|
+
verdict?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Failure-kind rollup across the project's failed rows (desc by count, kind asc). */
|
|
20
|
+
export interface ProjectAutopsyCause {
|
|
21
|
+
kind: MergeFailureKind;
|
|
22
|
+
count: number;
|
|
23
|
+
runs: string[];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** A project's autopsy: failed rows + causes + pending proposals, read-only over the existing ledgers. */
|
|
27
|
+
export interface ProjectAutopsyReport {
|
|
28
|
+
project: { id: string; name: string; primaryFolder?: string };
|
|
29
|
+
attribution: { status: 'measured' | 'partial' | 'unavailable'; reason?: 'ledger-project-id-missing' };
|
|
30
|
+
coverage: { failuresTruncated: boolean; proposalsTruncated: boolean; causeCounts: 'returned-failures' };
|
|
31
|
+
failures: ProjectAutopsyFailure[];
|
|
32
|
+
causes: ProjectAutopsyCause[];
|
|
33
|
+
proposals: PendingApprovalSummary[];
|
|
34
|
+
pendingApprovals: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface ProjectAutopsyDeps {
|
|
38
|
+
getProject?: (id: string) => Project | null;
|
|
39
|
+
readRuns?: (version: string | null) => ReleaseRunView[] | 'unavailable';
|
|
40
|
+
listApprovals?: () => PendingApprovalSummary[];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const FAILURE_LIMIT = 50;
|
|
44
|
+
const PROPOSAL_LIMIT = 20;
|
|
45
|
+
const PROJECT_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
46
|
+
|
|
47
|
+
const defaultReadRuns = (version: string | null): ReleaseRunView[] | 'unavailable' =>
|
|
48
|
+
readReleaseRuns(version, undefined, { facts: true });
|
|
49
|
+
|
|
50
|
+
function projectViewOf(project: Project): ProjectAutopsyReport['project'] {
|
|
51
|
+
return {
|
|
52
|
+
id: project.id,
|
|
53
|
+
name: project.name,
|
|
54
|
+
...(project.primaryFolder !== undefined ? { primaryFolder: project.primaryFolder } : {}),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** GET /v1/projects/:id/autopsy — 실패·원인·제안 rows for one project, fail-soft per the ops-route pattern. */
|
|
59
|
+
export function handleProjectAutopsy(req: Request, rawId: string, deps: ProjectAutopsyDeps = {}): Response {
|
|
60
|
+
if (req.method !== 'GET') return jsonResponse({ error: 'method-not-allowed' }, 405);
|
|
61
|
+
let projectId: string;
|
|
62
|
+
try {
|
|
63
|
+
projectId = decodeURIComponent(rawId);
|
|
64
|
+
} catch {
|
|
65
|
+
return jsonResponse({ error: 'bad_request', reason: 'invalid project id' }, 400);
|
|
66
|
+
}
|
|
67
|
+
if (!PROJECT_ID.test(projectId)) return jsonResponse({ error: 'bad_request', reason: 'invalid project id' }, 400);
|
|
68
|
+
const project = (deps.getProject ?? getProject)(projectId);
|
|
69
|
+
if (!project) return jsonResponse({ error: 'not-found' }, 404);
|
|
70
|
+
const pending = deps.listApprovals ? deps.listApprovals() : listPendingApprovals();
|
|
71
|
+
const runs = (deps.readRuns ?? defaultReadRuns)(null);
|
|
72
|
+
if (runs === 'unavailable') return jsonResponse({ error: 'runs-unavailable' }, 500);
|
|
73
|
+
if (!runs.some((run) => Boolean(run.projectId))) {
|
|
74
|
+
return jsonResponse({ project: projectViewOf(project),
|
|
75
|
+
attribution: { status: 'unavailable', reason: 'ledger-project-id-missing' },
|
|
76
|
+
coverage: { failuresTruncated: false, proposalsTruncated: false, causeCounts: 'returned-failures' },
|
|
77
|
+
failures: [], causes: [], proposals: [], pendingApprovals: 0 });
|
|
78
|
+
}
|
|
79
|
+
const unattributed = runs.some((run) => !run.projectId) || pending.some((approval) => !approval.projectId);
|
|
80
|
+
const attributed = runs.some((run) => Boolean(run.projectId)) || pending.some((approval) => Boolean(approval.projectId));
|
|
81
|
+
const attribution: ProjectAutopsyReport['attribution'] = unattributed || !attributed
|
|
82
|
+
? { status: attributed ? 'partial' : 'unavailable', reason: 'ledger-project-id-missing' }
|
|
83
|
+
: { status: 'measured' };
|
|
84
|
+
const failures: ProjectAutopsyFailure[] = [];
|
|
85
|
+
for (const run of runs) {
|
|
86
|
+
if (run.projectId !== project.id) continue;
|
|
87
|
+
for (const node of run.nodes) {
|
|
88
|
+
if (node.ok !== false) continue;
|
|
89
|
+
failures.push({
|
|
90
|
+
runId: run.runId,
|
|
91
|
+
nodeId: node.nodeId,
|
|
92
|
+
summary: node.summary,
|
|
93
|
+
kind: classifyMergeFailure(node.summary),
|
|
94
|
+
status: run.status,
|
|
95
|
+
...(node.startedAt !== undefined ? { startedAt: node.startedAt } : {}),
|
|
96
|
+
...(node.endedAt !== undefined ? { endedAt: node.endedAt } : {}),
|
|
97
|
+
...(node.facts?.verdict !== undefined ? { verdict: node.facts.verdict } : {}),
|
|
98
|
+
});
|
|
99
|
+
if (failures.length > FAILURE_LIMIT) break;
|
|
100
|
+
}
|
|
101
|
+
if (failures.length > FAILURE_LIMIT) break;
|
|
102
|
+
}
|
|
103
|
+
const failuresTruncated = failures.length > FAILURE_LIMIT;
|
|
104
|
+
if (failuresTruncated) failures.length = FAILURE_LIMIT;
|
|
105
|
+
const counts = new Map<MergeFailureKind, { count: number; runs: Set<string> }>();
|
|
106
|
+
for (const failure of failures) {
|
|
107
|
+
const entry = counts.get(failure.kind) ?? { count: 0, runs: new Set<string>() };
|
|
108
|
+
entry.count += 1;
|
|
109
|
+
entry.runs.add(failure.runId);
|
|
110
|
+
counts.set(failure.kind, entry);
|
|
111
|
+
}
|
|
112
|
+
const causes: ProjectAutopsyCause[] = [...counts.entries()]
|
|
113
|
+
.map(([kind, entry]) => ({ kind, count: entry.count, runs: [...entry.runs].sort() }))
|
|
114
|
+
.sort((a, b) => b.count - a.count || (a.kind < b.kind ? -1 : 1));
|
|
115
|
+
const projectApprovals = pending.filter((summary) => summary.projectId === project.id);
|
|
116
|
+
const proposals = projectApprovals.slice(0, PROPOSAL_LIMIT);
|
|
117
|
+
return jsonResponse({
|
|
118
|
+
project: projectViewOf(project),
|
|
119
|
+
attribution,
|
|
120
|
+
coverage: { failuresTruncated, proposalsTruncated: projectApprovals.length > PROPOSAL_LIMIT,
|
|
121
|
+
causeCounts: 'returned-failures' },
|
|
122
|
+
failures,
|
|
123
|
+
causes,
|
|
124
|
+
proposals,
|
|
125
|
+
pendingApprovals: projectApprovals.length,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
@@ -74,6 +74,7 @@ export interface TerminalSummary {
|
|
|
74
74
|
cmd: string;
|
|
75
75
|
workdir?: string;
|
|
76
76
|
nickname?: string;
|
|
77
|
+
purpose?: string;
|
|
77
78
|
treeName: string;
|
|
78
79
|
worktreeName: string;
|
|
79
80
|
parentPtyId: string;
|
|
@@ -278,6 +279,7 @@ function summarize(
|
|
|
278
279
|
cmd: handle.cmd,
|
|
279
280
|
...(handle.workdir ? { workdir: handle.workdir } : {}),
|
|
280
281
|
...(manifest?.nickname ? { nickname: manifest.nickname } : {}),
|
|
282
|
+
...(manifest?.purpose ? { purpose: manifest.purpose } : {}),
|
|
281
283
|
...names,
|
|
282
284
|
parentPtyId: manifest?.parentPtyId ?? '',
|
|
283
285
|
parentPid: manifest?.parentPid ?? 0,
|
|
@@ -322,6 +324,7 @@ function summarizeManifest(
|
|
|
322
324
|
id: row.id, cmd: row.cmd,
|
|
323
325
|
...(row.workdir ? { workdir: row.workdir } : {}),
|
|
324
326
|
...(row.nickname ? { nickname: row.nickname } : {}),
|
|
327
|
+
...(row.purpose ? { purpose: row.purpose } : {}),
|
|
325
328
|
...terminalTreeNames(row.workdir),
|
|
326
329
|
parentPtyId: row.parentPtyId, parentPid: row.parentPid, parentKind: row.parentKind, runId: row.runId,
|
|
327
330
|
...(row.chainOrigin === undefined ? {} : { chainOrigin: row.chainOrigin }),
|
|
@@ -21,6 +21,8 @@ export interface PendingApprovalSummary {
|
|
|
21
21
|
runId: string;
|
|
22
22
|
message: string;
|
|
23
23
|
requestedAt: number;
|
|
24
|
+
/** Explicit project ownership. The approval registry does not currently populate this field. */
|
|
25
|
+
projectId?: string;
|
|
24
26
|
}
|
|
25
27
|
|
|
26
28
|
interface PendingApprovalEntry extends PendingApprovalSummary {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { WizardIO } from '../../onboarding.js';
|
|
2
2
|
import type { SetupCheckResult } from '../setup-status.js';
|
|
3
3
|
import type { TailscaleProbe } from './tailscale-probe.js';
|
|
4
|
+
import { createManagementStarterContract } from '../../persona/presets.js';
|
|
4
5
|
|
|
5
6
|
export interface FirstBootWizardDeps {
|
|
6
7
|
io: WizardIO;
|
|
@@ -18,14 +19,32 @@ export interface FirstBootWizardDeps {
|
|
|
18
19
|
pwaBuilt?: boolean;
|
|
19
20
|
/** Tailscale probe 결과 (alive 시 magicDNS / IP 도 banner 에 노출). */
|
|
20
21
|
tailscale?: TailscaleProbe;
|
|
22
|
+
/** 0.2.29 PERSONA-STARTER — «경영» 스타터 계약을 쓸 persona 저장소 경로.
|
|
23
|
+
* 생략하면 기본 상태 저장소(resolveStatePersonaDir) — 운영 첫 실행 경로. */
|
|
24
|
+
starterContractDir?: string;
|
|
21
25
|
}
|
|
22
26
|
|
|
23
27
|
export type FirstBootStep = 'llm' | 'tailscale';
|
|
24
28
|
|
|
29
|
+
/** 0.2.29 PERSONA-STARTER — 직업 질문에서 «경영»을 골랐을 때 만들어진 스타터 계약 한 장. */
|
|
30
|
+
export interface StarterContractSummary {
|
|
31
|
+
personaId: string;
|
|
32
|
+
displayName: string;
|
|
33
|
+
path: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
25
36
|
export type FirstBootResult =
|
|
26
|
-
| { action: 'completed'; stepsRun: FirstBootStep[] }
|
|
37
|
+
| { action: 'completed'; stepsRun: FirstBootStep[]; starterContract?: StarterContractSummary }
|
|
27
38
|
| { action: 'skipped'; reason: 'no-tty' | 'all-set-up' };
|
|
28
39
|
|
|
40
|
+
/** 직업 질문 답의 정규화 — «1»·«경영»·«management» 는 경영,
|
|
41
|
+
* 나머지(빈 답 포함)는 일반(현재 첫 실행 동작 유지). */
|
|
42
|
+
export function normalizeOccupationChoice(input: string): 'management' | 'general' {
|
|
43
|
+
const v = input.trim().toLowerCase();
|
|
44
|
+
if (v === '1' || v === '경영' || v === 'management') return 'management';
|
|
45
|
+
return 'general';
|
|
46
|
+
}
|
|
47
|
+
|
|
29
48
|
function isTty(force?: boolean): boolean {
|
|
30
49
|
if (force === true) return true;
|
|
31
50
|
if (force === false) return false;
|
|
@@ -89,6 +108,39 @@ function printPwaSetupBanner(deps: FirstBootWizardDeps): void {
|
|
|
89
108
|
deps.io.print('');
|
|
90
109
|
}
|
|
91
110
|
|
|
111
|
+
/** 0.2.29 PERSONA-STARTER — 직업 질문. «경영»이면 경영 스타터 계약 한 장을
|
|
112
|
+
* 만들고, 일반이면 계약 없이 현재 흐름 그대로. 계약 생성이 실패해도
|
|
113
|
+
* wizard 결과는 completed 로 유지한다(fail-soft). */
|
|
114
|
+
async function askOccupationAndCreateStarter(
|
|
115
|
+
deps: FirstBootWizardDeps,
|
|
116
|
+
out: { log: (s: string) => void; error: (s: string) => void },
|
|
117
|
+
): Promise<StarterContractSummary | undefined> {
|
|
118
|
+
const io = deps.io;
|
|
119
|
+
if (io.nonInteractive) return undefined;
|
|
120
|
+
io.print('');
|
|
121
|
+
io.print(' 어떤 일을 하세요? 고르면 스타터 계약 한 장을 만듭니다.');
|
|
122
|
+
io.print(' 1) 경영 — 방향·판단·운영을 함께 세우는 경영 스타터');
|
|
123
|
+
io.print(' 2) 일반 — 지금처럼 계속 (스타터 계약 없이)');
|
|
124
|
+
let answer: string;
|
|
125
|
+
try {
|
|
126
|
+
answer = await io.ask(' 선택 (1/2 · Enter=일반): ');
|
|
127
|
+
} catch (err) {
|
|
128
|
+
out.error(`first-boot wizard: occupation question failed: ${(err as Error).message}`);
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
if (normalizeOccupationChoice(answer) !== 'management') return undefined;
|
|
132
|
+
try {
|
|
133
|
+
const written = createManagementStarterContract(
|
|
134
|
+
deps.starterContractDir ? { dir: deps.starterContractDir } : {},
|
|
135
|
+
);
|
|
136
|
+
io.print(` ✓ 경영 스타터 계약이 만들어졌습니다: ${written.path}`);
|
|
137
|
+
return { personaId: written.personaId, displayName: written.displayName, path: written.path };
|
|
138
|
+
} catch (err) {
|
|
139
|
+
out.error(`first-boot wizard: starter contract failed: ${(err as Error).message}`);
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
92
144
|
export async function runFirstBootWizard(
|
|
93
145
|
deps: FirstBootWizardDeps,
|
|
94
146
|
): Promise<FirstBootResult> {
|
|
@@ -127,5 +179,7 @@ export async function runFirstBootWizard(
|
|
|
127
179
|
}
|
|
128
180
|
}
|
|
129
181
|
|
|
130
|
-
|
|
182
|
+
const starterContract = await askOccupationAndCreateStarter(deps, out);
|
|
183
|
+
|
|
184
|
+
return { action: 'completed', stepsRun, ...(starterContract ? { starterContract } : {}) };
|
|
131
185
|
}
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
import { authStorePath, defaultCodexHome, isUnderTestRunner, listProviders, loadTokens, saveTokens } from './store.js';
|
|
18
18
|
import { readFreshAvailabilityState, quotaSignalDir, readQuotaSignal, readQuotaSignalCredits, readQuotaSignalUsedPercent, readQuotaSignalObservedAt, readQuotaSignalObservedAtRaw } from '../budget/codex-reset-credit-state.js';
|
|
19
19
|
import { creditPaceStatus } from '../budget/codex-credit-pace.js';
|
|
20
|
+
import { noteCodexBillingDecision, type CodexCreditSpendReason } from './codex-billing-route.js';
|
|
20
21
|
import { loadLlmPolicy } from '../policy/llm-policy.js';
|
|
21
22
|
import { getUserConfig } from '../user-config.js';
|
|
22
23
|
import {
|
|
@@ -204,6 +205,8 @@ interface RunPin {
|
|
|
204
205
|
readonly resolution: CodexAccountResolution;
|
|
205
206
|
/** ⛔ 핀이 «갇혔는지»를 싸게 재려면 그 계정의 홈이 필요하다. 모르면 재지 못하므로 그대로 둔다. */
|
|
206
207
|
readonly home: string | undefined;
|
|
208
|
+
/** 핀을 박은 판정이 크레딧 소진이었나 — 핀으로 돌려줄 때도 과금 경로를 같이 남긴다. */
|
|
209
|
+
readonly creditReason?: CodexCreditSpendReason;
|
|
207
210
|
}
|
|
208
211
|
const pinnedByRun = new Map<string, RunPin>();
|
|
209
212
|
/** ⛔ 상한 — 장수 프로세스에서 runId 수만큼 «영구히» 자라면 안 된다(리뷰 should-fix).
|
|
@@ -213,6 +216,8 @@ const PIN_MAX = 256;
|
|
|
213
216
|
/** ⛔ 테스트 심 — 고정을 푼다. 프로덕션에서는 부르지 않는다. */
|
|
214
217
|
export function _resetCodexRotationPinForTesting(): void {
|
|
215
218
|
pinnedByRun.clear();
|
|
219
|
+
// 판정이 남긴 과금 경로도 같이 푼다 — 안 풀면 다음 시험 파일의 codex usage 가 credit 으로 읽힌다.
|
|
220
|
+
noteCodexBillingDecision(undefined);
|
|
216
221
|
}
|
|
217
222
|
|
|
218
223
|
/** ⛔⭐⭐ 후보 조립은 «한 자»여야 한다 — 실행 경로와 조회(dry-run)가 다른 자를 쓰면
|
|
@@ -728,7 +733,7 @@ export function resolveCodexAccountForRun(
|
|
|
728
733
|
const explicit = Boolean(env.ELANOUS_CODEX_ACCOUNT?.trim());
|
|
729
734
|
// ⛔⭐ 사람이 «명시»했으면 고정보다 «먼저» 이긴다(결정 ③) — 고정을 읽지도 쓰지도 않는다.
|
|
730
735
|
// 고정이 앞서면, 앞선 호출이 만든 회전 결과가 「명시한 계정」을 덮는다.
|
|
731
|
-
if (explicit) { observeRotation({ reason: 'explicit' }, current.name); return current; }
|
|
736
|
+
if (explicit) { observeRotation({ reason: 'explicit' }, current.name); noteCodexBillingDecision(undefined); return current; }
|
|
732
737
|
// ⛔⭐⭐⭐ 설정 판정이 «핀보다 먼저»다(리뷰 must-fix).
|
|
733
738
|
// 핀을 먼저 보면, 같은 런에서 이미 회전·핀된 뒤 설정이 false 로 바뀌어도
|
|
734
739
|
// ***계속 회전 계정을 돌려준다*** — 「config false 로만 꺼진다」가 핀 경유로 깨진다.
|
|
@@ -736,6 +741,7 @@ export function resolveCodexAccountForRun(
|
|
|
736
741
|
const enabled = rotationConfig.enabled;
|
|
737
742
|
if (!enabled) {
|
|
738
743
|
observeRotation({ reason: 'disabled', disabledProvenance: rotationConfig.state }, current.name);
|
|
744
|
+
noteCodexBillingDecision(undefined);
|
|
739
745
|
return current;
|
|
740
746
|
}
|
|
741
747
|
// ⛔⭐⭐⭐ 고정은 «런 신원이 있을 때만» 한다.
|
|
@@ -763,7 +769,7 @@ export function resolveCodexAccountForRun(
|
|
|
763
769
|
// 🔑 전환은 «소진당 한 번»으로 갇히고, 그 뒤 다시 핀이 박힌다.
|
|
764
770
|
const pinnedHome = pinned.home;
|
|
765
771
|
const exhausted = pinnedHome !== undefined && pinnedAccountExhausted(pinnedHome, pinned.resolution.name);
|
|
766
|
-
if (!exhausted) return pinned.resolution;
|
|
772
|
+
if (!exhausted) { noteCodexBillingDecision(pinned.creditReason); return pinned.resolution; }
|
|
767
773
|
pinnedByRun.delete(runKey);
|
|
768
774
|
debug.log('oauth.codex-account', 'pin-released',
|
|
769
775
|
{ account: pinned.resolution.name, why: 'threshold-reached' }, { level: 'warn' });
|
|
@@ -806,6 +812,8 @@ export function resolveCodexAccountForRun(
|
|
|
806
812
|
// CREDIT-SPEND-ORDER(10-12) — «다른 계정의 선불 크레딧으로 옮김»(`rotated` ⊕ creditEntry)도 크레딧 진입이다.
|
|
807
813
|
const creditSpendReason = decision.reason === 'credits-allowed' || decision.reason === 'credit-pace' ? decision.reason
|
|
808
814
|
: decision.reason === 'rotated' && decision.creditEntry ? 'credits-rotated' as const : undefined;
|
|
815
|
+
// CREDIT-BILLING-LABEL(10-14) — 이 판정으로 나가는 호출의 `llm.usage` 가 `billing='credit'` 이 되게 남긴다.
|
|
816
|
+
noteCodexBillingDecision(creditSpendReason);
|
|
809
817
|
if (creditSpendReason && !deps.counterPath && isUnderTestRunner(process.env)) {
|
|
810
818
|
// 시험 러너 가드(autoConsume 의 test-runtime-guard 와 같은 관용구) — 카운터를 주입 안 한 시험이 실제 카운터·송신기에 닿지 않는다.
|
|
811
819
|
debug.log('oauth.codex-account', 'credit-spend-alert-skipped', { account: decision.to?.name ?? current.name, reason: 'test-runtime-guard' });
|
|
@@ -833,7 +841,11 @@ export function resolveCodexAccountForRun(
|
|
|
833
841
|
const oldest = pinnedByRun.keys().next().value;
|
|
834
842
|
if (oldest !== undefined) pinnedByRun.delete(oldest);
|
|
835
843
|
}
|
|
836
|
-
pinnedByRun.set(runKey, {
|
|
844
|
+
pinnedByRun.set(runKey, {
|
|
845
|
+
resolution: resolved,
|
|
846
|
+
home: effectiveCodexHome(resolved, loadTokens(resolved.storeKey, path), env).home,
|
|
847
|
+
...(creditSpendReason ? { creditReason: creditSpendReason } : {}),
|
|
848
|
+
});
|
|
837
849
|
}
|
|
838
850
|
return resolved;
|
|
839
851
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codex 호출의 «과금 경로» 기억 — 회전 판정이 크레딧 소진을 정했으면 그 호출의 `llm.usage` 가 `billing='credit'` 이다.
|
|
3
|
+
*
|
|
4
|
+
* 🩸 10-14 운영 실측: 세 계정이 주간 100% 라 회전이 `credits-allowed` 로 default 계정 크레딧을 쓰는데,
|
|
5
|
+
* 같은 턴의 `llm.usage` 는 `billing=subscription` · `cost.kind=included($0)` 였다 — 원장·토큰 경보가 크레딧 지출을 $0 로 봤다.
|
|
6
|
+
* 자격 종류(oauth)만으로 과금 경로를 정하면 «구독 한도를 넘어 크레딧으로 나간 호출»을 구분 못 한다.
|
|
7
|
+
*
|
|
8
|
+
* 경로: `loadFreshCodexAuthState` → `resolveCodexAccountForRun`(요청마다 · 판정·핀) → 여기 기록
|
|
9
|
+
* → 응답 끝 `logAgentTurnUsage` → `billingRouteForProvider('openai-codex')` 가 여기를 읽는다.
|
|
10
|
+
* ⚠️ 프로세스 단위 «마지막 판정»이다 — 같은 프로세스에서 다른 런이 동시에 다른 판정을 내리면 섞일 수 있다
|
|
11
|
+
* (판정은 같은 스토어·설정을 읽으므로 보통 같은 답이다).
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export type CodexCreditSpendReason = 'credits-allowed' | 'credit-pace' | 'credits-rotated';
|
|
15
|
+
|
|
16
|
+
let lastCreditReason: CodexCreditSpendReason | undefined;
|
|
17
|
+
|
|
18
|
+
/** 계정 해석이 끝날 때마다 부른다 — 크레딧 소진이 아니면 `undefined` 로 지운다(앞 판정이 남지 않게). */
|
|
19
|
+
export function noteCodexBillingDecision(reason: CodexCreditSpendReason | undefined): void {
|
|
20
|
+
lastCreditReason = reason;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** 마지막 codex 계정 해석이 크레딧 소진이었으면 그 이유. */
|
|
24
|
+
export function codexCreditSpendReason(): CodexCreditSpendReason | undefined {
|
|
25
|
+
return lastCreditReason;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** ⛔ 테스트 심 — 프로덕션에서는 부르지 않는다. */
|
|
29
|
+
export function _resetCodexBillingDecisionForTesting(): void {
|
|
30
|
+
lastCreditReason = undefined;
|
|
31
|
+
}
|
|
@@ -10,7 +10,8 @@ import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
|
10
10
|
import type { Checklist, ChecklistItem } from '../release-loop/checklist.js';
|
|
11
11
|
import type { ReleaseSchedule } from '../release-loop/release-schedule.js';
|
|
12
12
|
import type { ResourceView } from '../control-plane/ledger.js';
|
|
13
|
-
import type
|
|
13
|
+
import { cardPrNumber, type TaskCard } from '../task-agent/task-hand.js';
|
|
14
|
+
import { measureLandingThroughput, type LandingThroughput } from '../task-agent/cover.js';
|
|
14
15
|
import {
|
|
15
16
|
okCell, unmeasured, type Cell, type CapacityInfo, type ChecklistCounts, type LaunchableInfo, type LoopRow, type MachineRow,
|
|
16
17
|
type OverviewSnapshot, type OwnerTaskRow, type ParentsInfo, type PodMemberRow, type ReleaseRunInfo, type ScheduleInfo,
|
|
@@ -269,6 +270,22 @@ export async function collectOverview(opts: CollectOptions, injected: CollectDep
|
|
|
269
270
|
const byOwner: Cell<Record<string, OwnerTaskRow>> = cards instanceof Error
|
|
270
271
|
? unmeasured('task-agent ledger', errText(cards))
|
|
271
272
|
: okCell(ownerRows(cards, kstMidnight, opts.owner), `task-agent ledger(오늘 KST · owner=seat 키)`, iso(now));
|
|
273
|
+
const launchedCards = cards instanceof Error ? [] : cards.filter((card) => card.createdAt >= kstMidnight && card.status === 'launched');
|
|
274
|
+
const throughput = cards instanceof Error
|
|
275
|
+
? unmeasured<LandingThroughput>('task-agent ledger', errText(cards))
|
|
276
|
+
: okCell(measureLandingThroughput({
|
|
277
|
+
launched: launchedCards.length,
|
|
278
|
+
cardPrs: launchedCards.filter((card) => cardPrNumber(card) !== undefined).length,
|
|
279
|
+
taskAgentActions: launchedCards.flatMap((card) => (card.landAttempts ?? [])
|
|
280
|
+
.filter((attempt) => attempt.at >= kstMidnight)
|
|
281
|
+
.map((attempt) => ({
|
|
282
|
+
kind: 'land' as const,
|
|
283
|
+
result: attempt.ok === true ? 'done' : attempt.ok === false ? 'failed' : 'pending',
|
|
284
|
+
reason: attempt.reason ?? attempt.detail,
|
|
285
|
+
}))),
|
|
286
|
+
allLands: null,
|
|
287
|
+
pendingLandingAgeSeconds: null,
|
|
288
|
+
}), 'task-agent ledger(오늘 KST · landAttempts)', iso(now));
|
|
272
289
|
const done = unmeasured<number>('task-agent ledger', '착지 판정은 PR 조회가 필요 — owner 모델(OVW-OWNER)·card-evidence 연결 전');
|
|
273
290
|
|
|
274
291
|
// 발사 가능 — 열린 판(앞으로의 컷) 전부.
|
|
@@ -334,7 +351,7 @@ export async function collectOverview(opts: CollectOptions, injected: CollectDep
|
|
|
334
351
|
beat: okCell({ lastAt: b.lastAt, ageSeconds: b.ageSeconds, alive: b.alive }, `${SEAT_ERA_SOURCE} dispatcher-${b.seat}.pid`, b.lastAt) });
|
|
335
352
|
}
|
|
336
353
|
|
|
337
|
-
return { generatedAt: iso(now), instanceRoot: root, since: opts.sinceLabel, release, tasks, machines, landings, loops };
|
|
354
|
+
return { generatedAt: iso(now), instanceRoot: root, since: opts.sinceLabel, release, tasks, machines, landings, throughput, loops };
|
|
338
355
|
}
|
|
339
356
|
|
|
340
357
|
export function parseSince(raw: string | undefined): { ms: number; label: string } {
|