elanous 0.2.27 → 0.2.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{Ev2jivDMTSoEc-5rIXdcy → cIpv5nU9AycwYWZI9H589}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{ab4d57c2.e90bc2cb31949045.js → 058a98ba.7eb28d5e6dc03565.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4565-67e4c620597965c8.js → 1015-9cba22a5a4554797.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1084-4e66af7376a18db7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1106.3a6410b7b0c70ad4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1127.32fc642f70423506.js +8 -0
- package/apps/pwa/out/_next/static/chunks/{1516.83dd2c1b86b4e507.js → 1142.65d002789ab3af7d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1189-d9b8e1995a831fae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1224.6da98c7ad0eb7dd8.js +34 -0
- package/apps/pwa/out/_next/static/chunks/1370.4e3e2558f111fd5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1514-b7da377fdc4eb17a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1516.dfaceff3fd2d0e0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1577.3c24c32584e10d70.js +286 -0
- package/apps/pwa/out/_next/static/chunks/161.130a569855c4d68c.js +24 -0
- package/apps/pwa/out/_next/static/chunks/1782-59db1b5aa06df38a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1743.563d3168e95825ef.js → 1852.7f7b53991fcb99ef.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1864.16da9556e78a9236.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1b6f6b2a.aff090122be3726e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2341.e8a9135e5b910dd5.js +36 -0
- package/apps/pwa/out/_next/static/chunks/257.10afdbe3520f2fc2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2658.87550e692dc493f6.js +64 -0
- package/apps/pwa/out/_next/static/chunks/2673.85e2f02efae7a85f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2766-bee623b37472ed63.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2794.6d836872b0bf43e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2806.eb57ced1a528ed39.js +1 -0
- package/apps/pwa/out/_next/static/chunks/283.7a121c4910e6dad7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{65ebff95.081daeff622d238e.js → 285adb1a.5654e605dddf86d2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2870.1dc29aa5fc01f09f.js +115 -0
- package/apps/pwa/out/_next/static/chunks/293.fd38e77ce5d48103.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2993-5952a1cd3fd5d441.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3160-95c96f4d2a21dd26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/32-a523427c5bd5ed00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3280.af38002a6424a905.js +90 -0
- package/apps/pwa/out/_next/static/chunks/328bb3ab-6628a1114fe3fb3b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3292-5ddffdb2f517b44f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9917-9e26abc5f7772735.js → 3396-97b97928c49190c9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6196.34d6b229079e9e28.js → 3403.7199205e65124486.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3523.d3231daaf7aba993.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3763.577de3181e1e6ea0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4138-cc56b0938ef72783.js +1 -0
- package/apps/pwa/out/_next/static/chunks/419.736c0d6f426249a7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4255-8350c43d307a8875.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6def8a8e.c81f9ca41028eccf.js → 425cfc4d.fb91158e3971c39f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4352.a4954693499c2714.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4421-f2dcbc6fd80ec013.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4513-51b94aeee37c9905.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{16e57f67.3ea19e893461e611.js → 46bd8bea.2f4b4099172fcdb7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5081.a240b63fad28663a.js → 4759.1f76713aefb87db5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4928-c3b72f99aa588699.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4986-f9fc0283fb325219.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5014.671a7b9f69c2b7b1.js +94 -0
- package/apps/pwa/out/_next/static/chunks/5137.d398e24710b3feb6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5298.0bea74885cabe754.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5315.74c53a39739b11c4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5317-8b1df8d02105cd07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5358-33051f41a2b239af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5388.a2ec02501f714ad5.js +62 -0
- package/apps/pwa/out/_next/static/chunks/5395.e6ac948a2d15058d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5409-f282bf533c151849.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5466.d0f4aba9d52acfa8.js +27 -0
- package/apps/pwa/out/_next/static/chunks/5564.3d28b353470fe305.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{9974.e77b4ff4884557b3.js → 5591.a35e7a217734a8b9.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/569.b0cbfb4dee4a167a.js +93 -0
- package/apps/pwa/out/_next/static/chunks/5835-72465b73a8bb8d74.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5941.045d6093139e1f7a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5492-e05e26a033ba80d2.js → 6013-2f769370d8b4c2c6.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6228.47cabb83564dfe54.js +24 -0
- package/apps/pwa/out/_next/static/chunks/6457-8d1993002a87d0fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6513.ef54cfae52351982.js +2 -0
- package/apps/pwa/out/_next/static/chunks/{5408.377c8c543635b81f.js → 6534.1ab00f370db7b105.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6582.13d245bf87df69f1.js +148 -0
- package/apps/pwa/out/_next/static/chunks/6655.c33f6acc2c61bb89.js +149 -0
- package/apps/pwa/out/_next/static/chunks/6731-9d7195af289c8d4c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6733.0be05b1db9279fc5.js +79 -0
- package/apps/pwa/out/_next/static/chunks/6742-90937146253a8b9e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8578.dff22d988cc2b106.js → 6767.1fcfc9b8be83975f.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/6776.06ff1e3b464cc607.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9311.24c8f5ea793253dd.js → 6853.cc5174a9dee59593.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/687-816858f77a396a4e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6888.72c7b8cfb02a7e61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6993.c17c828ac3ef3253.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7076.9f27ef666b0cefdd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7113.1403c5d451804e8c.js +287 -0
- package/apps/pwa/out/_next/static/chunks/7169.9dd603c726c2cd7c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7247-e3ec21f761f86710.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7261-a47b72f96f5199df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7335-5cda81ac90310077.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7356-c2e4af090546e2d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{94.4cfed21c0b781a06.js → 7375.050ea0d72968e49f.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/738-59518742078fda71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7385.a7375f10db73243a.js +77 -0
- package/apps/pwa/out/_next/static/chunks/7445.cf1cf2fe109bcd96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7505.a2057432ab6ef99a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7515.31f45fac1f9c70cb.js +74 -0
- package/apps/pwa/out/_next/static/chunks/7658-d4ce8c72a9548a91.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7725-4f83d5541fbdb81b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8107-0b1ae46bc5bcb788.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8132.bfea2f016ce8d992.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8332.6f0f49df772e163b.js +23 -0
- package/apps/pwa/out/_next/static/chunks/{7483.ba01c6c209b81bba.js → 8398.73a19b39715eda04.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2846.d6a433b8663819a5.js → 8471.8d2a8c74f09c36ff.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/8672.e299832bc7d18ee2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8735.f1ef798a5f260f6f.js +226 -0
- package/apps/pwa/out/_next/static/chunks/{5785-ea8d2c633b6688e3.js → 8767-2f6a634f5abeaa01.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8774-88f67f7d8d53d299.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8782.252e5a405d86e4ed.js +32 -0
- package/apps/pwa/out/_next/static/chunks/8795.32573a185af18c7b.js +41 -0
- package/apps/pwa/out/_next/static/chunks/909-9ed7aa0dba804316.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9100.22b0301256827007.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9140-dde77575570bc71e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4593.10f5b9bd702d4a6c.js → 9143.ff14585db1d275ff.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9292-a7ad9a01c7044b93.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9517.00627dc51b02821c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9725.dcbb585652d8e9c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9761.a3ebf5c389c24ddc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4204.a409ab6250c0f6a8.js → 9907.49be0fcadaf214b5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9972.834d2b2b7d48f1ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9995-1a90486f5ae01546.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{973cbf1b.3bbcf2b41548eca7.js → a435ad95.577add051b4facb2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-83372d8b5863ebf7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d69256d7613c140a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-352c5e9ba3f9b858.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-69f1d725524201a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-a5635eba0d73b84e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ad9181d84285e4ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-86feb08080261a2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-ffa15987e4756d03.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-11a3ab44ac327cc1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-6309b11c4264d24d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-8800472079612e87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-d387bf3f2301882a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-048f88d8c8658da6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6c14f9739b7f6880.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-2834f44f64e98d74.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-83372d8b5863ebf7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-a13df6f88e824887.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-8a4397248754cf2b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-daf0bd329360a336.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-f7ef1c28764cb476.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-61e74f28b9353dac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/{page-ff27902d0b11ef4f.js → page-8aaa6dedc4c10dfb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-294602ba649be829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-5fa5f41ed3fce323.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-25a302273b054fd7.js → page-33bf667a5fb297bf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-5ae3cbd6e5dba515.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-eb867d16ad6fdede.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1ab789fa68682f7e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6fd41b5b6ff13a71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fb3d5f7642c99fba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-70f705b2b5ed42ca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-c9c93b358a7667b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1563c556b81c96ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ce89c20c45b3a673.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-423ae63d786f4ee9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-591a5378a4c4447c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-a250496b19a5824b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-c36a9277febc5911.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-83372d8b5863ebf7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-29900ed0011b2c83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-a5de57edc6d7f942.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-16bdd4c9f40498df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-75e946e6e71cc6d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-87b88f551f421d8b.js → page-9eb56166774eb256.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-1c5f9ef35dbb22c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-657ff9985e508498.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-22dc72499da68fb2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9f92737b8766009a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-094ad334e40f8169.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-8bcd379852ff6287.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-6b04413f280cd344.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{f4dfbfc0.a69fb12f854882aa.js → bc324b7c.02a09dd93f6a399b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/de70ab42-d28d47437208d458.js +1 -0
- package/apps/pwa/out/_next/static/chunks/f800c5e3.46dbd7f2af8c3fce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/f8bc19ad.47579f6d684b0760.js +122 -0
- package/apps/pwa/out/_next/static/chunks/framework-ca9ac4609fb9fed8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-0dd08d32d15a030f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-f0399d33955c4e01.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-d42caca6f8ac2211.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-42e713c13aa41ca8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-8fbf8f61a377aa16.js +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/graphs/implement-loop.yaml +38 -1
- package/graphs/release/release-loop.yaml +6 -2
- package/graphs/steward/recipes.yaml +6 -0
- package/graphs/steward/release-day.yaml +23 -0
- package/graphs/steward/steward.yaml +9 -1
- package/graphs/work/code-pr.yaml +23 -0
- package/package.json +1 -1
- package/plugins/agent-team/agents/research.md +1 -0
- package/scripts/browser-observe-cycle.ts +76 -2
- package/scripts/ci-typecheck-changed.ts +53 -19
- package/scripts/coord-channel-watch.sh +26 -6
- package/scripts/coord-role-pack.ts +143 -0
- package/scripts/detect-test-interference.ts +31 -1
- package/scripts/lib/morning-report-options.ts +41 -0
- package/scripts/pr-land-extra-remote-gates.ts +49 -0
- package/scripts/release-loop/docs-node.ts +51 -22
- package/scripts/release-loop/gate-batch-safe.ts +23 -0
- package/scripts/release-loop/gate-history.ts +422 -0
- package/scripts/release-loop/gate-node.ts +336 -39
- package/scripts/release-loop/gate-triage-node.ts +190 -0
- package/scripts/release-loop/node-verdict.ts +3 -1
- package/scripts/release-loop/publish-node.ts +3 -0
- package/scripts/release-loop/spawn-lane.ts +68 -0
- package/scripts/release-loop/tui-node-checks.ts +28 -2
- package/scripts/release-loop/version-node.ts +62 -4
- package/scripts/skills/public-check.ts +5 -2
- package/scripts/test-deterministic.ts +549 -37
- package/scripts/usage-rollup.ts +11 -3
- package/scripts/ux-sim.ts +7 -1
- package/scripts/verify-kpack6-live.ts +230 -0
- package/src/acp/codex-plugins.ts +17 -0
- package/src/acp/core-turn-bridge.ts +98 -22
- package/src/acp/elanous-extensions.ts +2 -0
- package/src/acp/server.ts +2 -0
- package/src/agent/ref-grounding.ts +18 -0
- package/src/agent/task-notification.ts +2 -1
- package/src/agent-mission/in-agent-plugin.ts +8 -3
- package/src/agent-substrate/pr-reviewer.ts +29 -21
- package/src/agent-substrate/self-review-cli.ts +34 -10
- package/src/briefing/brief-items.ts +151 -35
- package/src/budget/llm-cost.ts +25 -2
- package/src/budget/pty-usage-reemit.ts +7 -0
- package/src/budget/run-usage-rollup.ts +9 -0
- package/src/budget/usage-daily-store.ts +98 -0
- package/src/budget/usage-outcomes.ts +32 -0
- package/src/capture/tui-self-report.ts +22 -4
- package/src/chat/index.ts +31 -10
- package/src/chat/pickers/modal-runtime.ts +1 -0
- package/src/chat/pickers/modals.ts +3 -1
- package/src/chat/turn-typeahead.ts +123 -16
- package/src/claims/claims-ledger.ts +23 -0
- package/src/claims/claims-render.ts +22 -2
- package/src/cli/brief-cli.ts +131 -10
- package/src/cli/claims-cli.ts +24 -4
- package/src/cli/dashboard-name-flag.ts +48 -0
- package/src/cli/doctor-cli.ts +80 -0
- package/src/cli/log-event-names.ts +12 -0
- package/src/cli/msg-cli.ts +210 -11
- package/src/cli/plugin-cli.ts +11 -3
- package/src/cli/pr-cli.ts +443 -104
- package/src/cli/pr-land-heavy-remote.ts +233 -0
- package/src/cli/pr-land-overlap-evidence.ts +104 -5
- package/src/cli/pr-land-refusal.ts +20 -0
- package/src/cli/pty-takeover-cli.ts +125 -16
- package/src/cli/release-cli.ts +46 -2
- package/src/cli/remote-resolve.ts +2 -1
- package/src/cli/rfc-cli.ts +24 -0
- package/src/cli/seat-cli.ts +26 -16
- package/src/cli/tailscale-serve.ts +5 -8
- package/src/cli/tasks-cli.ts +400 -27
- package/src/cli/usage-cli.ts +155 -16
- package/src/cli/usage-daily-cli.ts +84 -0
- package/src/context-bus/context-now.ts +82 -5
- package/src/core-turn/auth-rejected-notice.ts +41 -0
- package/src/core-turn/run-core-turn.ts +13 -2
- package/src/core-turn/run-goal-loop.ts +17 -1
- package/src/core-turn/short-question.ts +45 -12
- package/src/core-turn/types.ts +7 -0
- package/src/dashboard/acp-active-model.ts +40 -0
- package/src/dashboard/auto-compact-runtime.ts +2 -0
- package/src/dashboard/boot-banner.ts +80 -0
- package/src/dashboard/dashboard-status-lines.ts +11 -0
- package/src/dashboard/detail-viewer-runtime.ts +15 -2
- package/src/dashboard/event-loop-stall-monitor.ts +4 -0
- package/src/dashboard/first-screen-band.ts +63 -13
- package/src/dashboard/goal-loop-thinking.ts +16 -0
- package/src/dashboard/hitl-boot.ts +9 -4
- package/src/dashboard/index.ts +235 -389
- package/src/dashboard/input/chat-main-entry-runtime.ts +2 -0
- package/src/dashboard/input/chat-main-log-actions.ts +4 -0
- package/src/dashboard/input/chat-main-log-command.ts +12 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +172 -3
- package/src/dashboard/input/chat-main-session.ts +6 -2
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/chat-main-turn.ts +2 -1
- package/src/dashboard/input/compact-prepass-recovery.ts +97 -0
- package/src/dashboard/input/dashboard-chord-actions.ts +10 -1
- package/src/dashboard/input/dashboard-chord-runtime.ts +2 -0
- package/src/dashboard/input/external-input-host.ts +45 -0
- package/src/dashboard/input/log-fold-binding.ts +18 -0
- package/src/dashboard/input/mouse-wiring.ts +17 -4
- package/src/dashboard/input/turn-steer-bridge.ts +94 -0
- package/src/dashboard/log-click-runtime.ts +5 -3
- package/src/dashboard/running-build-status.ts +74 -0
- package/src/dashboard/seat-boot-preamble.ts +113 -0
- package/src/dashboard/seat-local-instructions.ts +305 -0
- package/src/dashboard/skill-detection-runtime.ts +24 -4
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +100 -28
- package/src/dashboard/slash-runtime/model-choices.ts +35 -0
- package/src/dashboard/term-slash-runtime.ts +15 -0
- package/src/dashboard/turn-preamble.ts +30 -2
- package/src/dashboard/turn-session-layers.ts +176 -0
- package/src/dashboard/turn-stream-formatter.ts +14 -6
- package/src/dashboard/turn-stream-presentation-applier.ts +8 -0
- package/src/domains/morning-report.ts +3 -1
- package/src/domains/release-tool.ts +8 -9
- package/src/domains/surface-events.ts +4 -1
- package/src/domains/watch-default-scheduler.ts +8 -9
- package/src/fold-stack.ts +24 -1
- package/src/git-fs/dirty.ts +32 -4
- package/src/git-fs/index.ts +43 -1
- package/src/github/pr-labels.ts +10 -4
- package/src/graph-runner/runner.ts +102 -14
- package/src/harness/harness-clean.ts +21 -3
- package/src/harness/harness-cli-command.ts +22 -6
- package/src/harness/harness-gc.ts +32 -5
- package/src/harness/harness-pod-dispatch.ts +11 -4
- package/src/hq/seats.ts +17 -3
- package/src/index.ts +48 -6
- package/src/input/external-input-queue.ts +219 -0
- package/src/intelligence-map/model-bench-scores.ts +102 -0
- package/src/interactive-terminal-modal.ts +13 -0
- package/src/llm/route-decision.ts +25 -0
- package/src/llm-stream-retry-display.ts +59 -0
- package/src/llm.ts +253 -55
- package/src/log-entry.ts +3 -3
- package/src/log-pane/search.ts +29 -4
- package/src/loops/agent-reply.ts +256 -0
- package/src/loops/budget.ts +37 -7
- package/src/loops/loop-cli.ts +3 -2
- package/src/loops/msg-address.ts +57 -0
- package/src/loops/msg-wake.ts +282 -0
- package/src/loops/orchestrator/inbox.ts +130 -0
- package/src/loops/orchestrator/resync-shadow.ts +100 -12
- package/src/loops/orchestrator/tick.ts +94 -3
- package/src/loops/registry.ts +42 -4
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/memory.ts +20 -5
- package/src/msg/msg-sse-server.ts +141 -0
- package/src/msg/msg-store.ts +84 -14
- package/src/native-tool-catalog.ts +125 -0
- package/src/nexus/api/http-server.ts +5 -0
- package/src/nexus/api/ops-api.ts +2 -0
- package/src/nexus/api/project-autopsy.ts +127 -0
- package/src/nexus/api/terminals.ts +3 -0
- package/src/nexus/api/workflow-approvals.ts +2 -0
- package/src/nexus/onboarding/first-boot-wizard.ts +56 -2
- package/src/oauth/codex-account-store.ts +15 -3
- package/src/oauth/codex-billing-route.ts +31 -0
- package/src/ops/overview-collect.ts +19 -2
- package/src/panes/log-pane.ts +67 -8
- package/src/patents/ledger.ts +128 -0
- package/src/persona/presets.ts +44 -0
- package/src/plugins/install/market-fetch.ts +32 -1
- package/src/plugins/maker/wizard-generate.ts +6 -4
- package/src/pod-lease/admission.ts +116 -41
- package/src/preview/terminal.ts +14 -1
- package/src/prompt-cache/types.ts +2 -0
- package/src/prompt-enhance/enhance.ts +24 -8
- package/src/prompt-library/universal-preamble.ts +273 -56
- package/src/pty-shell/pty-control-ipc.ts +4 -1
- package/src/pty-shell/pty-manifest.ts +77 -5
- package/src/pty-shell/registry.ts +19 -2
- package/src/pty-shell/tui-run-state.ts +253 -0
- package/src/release-loop/checklist.ts +11 -0
- package/src/release-loop/light-rc.ts +28 -3
- package/src/release-loop/merged-pr-checklist.ts +24 -5
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/release-loop/rubric.ts +70 -0
- package/src/render.ts +5 -1
- package/src/rfc-registry/registry.ts +88 -0
- package/src/seat-dispatch/seat-request-ledger.ts +4 -0
- package/src/seat-loop/knowhow-lint.ts +233 -0
- package/src/seat-loop/seat-pack.ts +16 -4
- package/src/seat-loop/seat-report.ts +42 -2
- package/src/seat-loop/traffic-signal.ts +7 -0
- package/src/self-dev/ask-launch-flow.ts +48 -8
- package/src/self-dev/ask-path-candidates.ts +69 -14
- package/src/self-dev/decompose-proposal.ts +43 -1
- package/src/self-dev/graph-journey-nodes.ts +2 -0
- package/src/self-dev/launch-preflight-text.ts +5 -1
- package/src/self-dev/launch-preflight.ts +143 -10
- package/src/self-dev/run-supervisor.ts +71 -5
- package/src/self-dev/shard-aggregate.ts +2 -0
- package/src/self-dev/shard-run.ts +23 -2
- package/src/self-health/signatures.ts +132 -0
- package/src/self-implement/doctor-visit.ts +118 -0
- package/src/self-implement/gate-cli.ts +17 -4
- package/src/self-implement/goal-author-decompose.ts +80 -16
- package/src/self-implement/goal-author.ts +116 -73
- package/src/self-implement/goal-authoring-grounding.ts +1 -1
- package/src/self-implement/goal-file-name.ts +65 -0
- package/src/self-implement/goal-new-paths.ts +4 -5
- package/src/self-implement/graph-authority.ts +17 -3
- package/src/self-implement/graph-yaml.ts +15 -7
- package/src/self-implement/ground-goal.ts +2 -1
- package/src/self-implement/headless-elanous-driver.ts +16 -1
- package/src/self-implement/host-regate.ts +58 -9
- package/src/self-implement/orchestrator.ts +3 -10
- package/src/self-implement/review-mustfix-class.ts +115 -0
- package/src/self-implement/rework-policy.ts +80 -2
- package/src/self-implement/run-ledger.ts +111 -7
- package/src/self-implement/running-runs.ts +10 -6
- package/src/self-implement/self-implement-runtime.ts +32 -0
- package/src/self-implement/speed-claims.ts +145 -6
- package/src/session/pending-input.ts +62 -11
- package/src/session-runtime/index.ts +7 -1
- package/src/skills/tools/ops-ledger.ts +707 -0
- package/src/skills/tools/persistent-grounding.ts +103 -8
- package/src/skills/tools/shell.ts +196 -2
- package/src/status/bar.ts +32 -2
- package/src/status/status-provider-info.ts +58 -0
- package/src/steward/rejudge-tick.ts +12 -1
- package/src/steward/release-day.ts +158 -0
- package/src/steward/resync-tick.ts +123 -0
- package/src/task-agent/actions.ts +1 -0
- package/src/task-agent/adopt-pr.ts +140 -0
- package/src/task-agent/board.ts +11 -1
- package/src/task-agent/card-evidence.ts +37 -5
- package/src/task-agent/cover.ts +84 -17
- package/src/task-agent/failure-notify.ts +61 -0
- package/src/task-agent/green-sweep.ts +170 -0
- package/src/task-agent/land-worktree.ts +52 -5
- package/src/task-agent/live-move-history.ts +1 -0
- package/src/task-agent/live-moves.ts +43 -12
- package/src/task-agent/parent-host.ts +1 -1
- package/src/task-agent/postland-card.ts +139 -0
- package/src/task-agent/rejudge-on-head.ts +109 -7
- package/src/task-agent/remote-rejudge-bind.ts +91 -0
- package/src/task-agent/repair-branch-cas.ts +182 -0
- package/src/task-agent/repair-cycle.ts +288 -0
- package/src/task-agent/repair-next-move.ts +31 -0
- package/src/task-agent/repair-review.ts +24 -0
- package/src/task-agent/repair-worker.ts +87 -0
- package/src/task-agent/review-result-capture.ts +2 -1
- package/src/task-agent/shadow.ts +13 -7
- package/src/task-agent/task-hand.ts +115 -6
- package/src/task-orchestrator/surfaces/kubectl-transient-retry.ts +51 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +63 -7
- package/src/task-orchestrator/surfaces/pod-install-slots.ts +6 -11
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +76 -0
- package/src/task-orchestrator/surfaces/pod-repair-commit.ts +96 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +175 -43
- package/src/telegram.ts +30 -1
- package/src/terminal/session-registry.ts +6 -0
- package/src/thinking-line.ts +12 -3
- package/src/tool-runtime/index.ts +4 -0
- package/src/tool-runtime/ops-ledger-runtimes.ts +84 -0
- package/src/tool-runtime/ref-consult-runtime.ts +17 -2
- package/src/tool-runtime/run-shell-runtime.ts +4 -1
- package/src/tool-runtime/self-cognition-runtimes.ts +5 -1
- package/src/tui.ts +5 -0
- package/src/user-config.ts +62 -7
- package/src/ux-sim/fake-llm.ts +29 -0
- package/src/ux-sim/fault-sqlite-busy.ts +50 -0
- package/src/ux-sim/in-process-cli.ts +175 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1027.a0f04663d24c2779.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +0 -1
- package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +0 -36
- package/apps/pwa/out/_next/static/chunks/1146.80d15ea7c6e6ee95.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1157.f08bf2b70915e176.js +0 -148
- package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1454-a9c338f5bb556f42.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2528.3868070ef1be69f9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2697.76ca2ac3efef6f3b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +0 -32
- package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3143.257997a5f1ed79df.js +0 -34
- package/apps/pwa/out/_next/static/chunks/3259-86f3be56e43eaf6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3309.364573ceedbdfd5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +0 -287
- package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4084.15ecaf4240bd9e77.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +0 -8
- package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +0 -149
- package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +0 -1
- package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/599-a914cc0468f56143.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +0 -23
- package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +0 -77
- package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +0 -64
- package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +0 -62
- package/apps/pwa/out/_next/static/chunks/7752.5cbdd0b433c54af9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8085-1e5fce59500a2cc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +0 -226
- package/apps/pwa/out/_next/static/chunks/83a80514-b897b64df43ce108.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +0 -93
- package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +0 -115
- package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +0 -74
- package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/949.1e7d45ccb71580aa.js +0 -90
- package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9938.b23e4d4dfa0114cd.js +0 -79
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-a1ce306364f08da9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-07110da72c45e68f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-d2d76d4a7eae91bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-30007380f2e2a3c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-e5a9302c105725a3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-b93c04b5311c97ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-718a49e86bf25f9c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-20662900d6b4b455.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-f707a509515ac50c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-6a16a48d1aa6e91f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-fcb06e305f515527.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-6acf5ec4e6c6d1af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-39f82acf619cca23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-7c2c8f81b185f9c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ae7aff07e32676bb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-482c60c1bc540d0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-7cb996c1aa08b6f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-623e08fe4477d606.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-db460cd8aecb8490.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-8397a5c6ca569bf4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1917ea87ea71ab6b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-670510eda8b9443f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-d73c3f1e00d93986.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-65caacf54389081e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-4bb7556e2e97a750.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-77e04b4f8762c666.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-15c0a4095baddfba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-4eb96fc7241c2456.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-63e272a4cd3b6634.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-0d64ff212dc55d03.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-7f096248993fc2d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-e47fc72049149a38.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-f7d808e31e005895.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-5c2b24b5496dad73.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-76cdb531668b5191.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-e2b63345bba1a11f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-d376e0c83edc041a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d6db55fe2c04d128.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-dab163b338e3b966.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-08019efef111ed2e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-0260ffc7eda50db1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-980ce6fe36ad95eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-99c4e6c7345a9156.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-0ab42e0f05823013.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-ad9220422d20ba33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +0 -1
- package/apps/pwa/out/_next/static/chunks/e117f801.e92bf10242653497.js +0 -1
- package/apps/pwa/out/_next/static/chunks/e87d89b9.2e71c0ae475d28a1.js +0 -122
- package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +0 -1
- package/src/dashboard/bench-slash-runtime.ts +0 -40
- package/src/dashboard/input/search-modal-router.ts +0 -9
- package/src/dashboard/modals/pane-key-router.ts +0 -27
- package/src/dashboard/view-slash-runtime.ts +0 -48
- /package/apps/pwa/out/_next/static/{Ev2jivDMTSoEc-5rIXdcy → cIpv5nU9AycwYWZI9H589}/_ssgManifest.js +0 -0
package/src/msg/msg-store.ts
CHANGED
|
@@ -8,6 +8,7 @@ export interface MessageEnvelope {
|
|
|
8
8
|
to: string;
|
|
9
9
|
body: string;
|
|
10
10
|
kind?: string;
|
|
11
|
+
replyTo?: number;
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
export interface Message extends MessageEnvelope {
|
|
@@ -46,8 +47,16 @@ export function validateMessageEnvelope(input: unknown): MessageEnvelope {
|
|
|
46
47
|
if (record.kind !== undefined && (typeof record.kind !== 'string' || !/^[a-z][a-z0-9_-]{0,63}$/.test(record.kind))) {
|
|
47
48
|
throw new Error('invalid message kind');
|
|
48
49
|
}
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
const replyTo = record.replyTo;
|
|
51
|
+
if (replyTo !== undefined && (typeof replyTo !== 'number' || !Number.isSafeInteger(replyTo) || replyTo < 1)) {
|
|
52
|
+
throw new Error('replyTo must be a positive integer message ID');
|
|
53
|
+
}
|
|
54
|
+
if (Object.keys(record).some(key => !['from', 'to', 'body', 'kind', 'replyTo'].includes(key))) throw new Error('unknown message field');
|
|
55
|
+
return {
|
|
56
|
+
from, to, body: record.body,
|
|
57
|
+
...(record.kind === undefined ? {} : { kind: record.kind as string }),
|
|
58
|
+
...(replyTo === undefined ? {} : { replyTo }),
|
|
59
|
+
};
|
|
51
60
|
}
|
|
52
61
|
|
|
53
62
|
function validCursor(cursor: number): number {
|
|
@@ -68,28 +77,45 @@ interface MessageRow {
|
|
|
68
77
|
recipient: string;
|
|
69
78
|
body: string;
|
|
70
79
|
kind: string | null;
|
|
80
|
+
reply_to: number | null;
|
|
71
81
|
created_at: string;
|
|
72
82
|
}
|
|
73
83
|
|
|
74
84
|
function fromRow(row: MessageRow): Message {
|
|
75
85
|
return { id: row.id, from: row.sender, to: row.recipient, body: row.body,
|
|
76
|
-
...(row.kind === null ? {} : { kind: row.kind }),
|
|
86
|
+
...(row.kind === null ? {} : { kind: row.kind }),
|
|
87
|
+
...(row.reply_to == null ? {} : { replyTo: row.reply_to }),
|
|
88
|
+
createdAt: row.created_at };
|
|
77
89
|
}
|
|
78
90
|
|
|
79
91
|
/** SQLite owns both append order and per-recipient acknowledgement progress. */
|
|
80
92
|
export class MsgStore {
|
|
81
93
|
readonly db: Database;
|
|
82
94
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
this.db
|
|
95
|
+
// A read-only SSE connection may outlive another process's in-place migration.
|
|
96
|
+
private get hasReplyTo(): boolean {
|
|
97
|
+
return (this.db.query(`SELECT COUNT(*) AS count FROM pragma_table_info('msg_messages') WHERE name = 'reply_to'`)
|
|
98
|
+
.get() as { count: number }).count > 0;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private readWithSchema<T>(read: (hasReplyTo: boolean) => T): T {
|
|
102
|
+
// The schema projection and rows must share one SQLite snapshot. Otherwise a writer can
|
|
103
|
+
// migrate between them and a reader could advance past a reply with its link erased.
|
|
104
|
+
return this.db.transaction(() => read(this.hasReplyTo)).deferred();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
constructor(path: string = defaultMsgStorePath(), options: { readOnly?: boolean } = {}) {
|
|
108
|
+
if (options.readOnly && (path === ':memory:' || !existsSync(path))) throw new Error('message ledger unavailable for read-only SSE service');
|
|
109
|
+
if (!options.readOnly && path !== ':memory:') mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
110
|
+
this.db = options.readOnly ? new Database(path, { readonly: true }) : new Database(path);
|
|
86
111
|
this.db.exec('PRAGMA busy_timeout = 5000');
|
|
87
|
-
this.db.exec(`CREATE TABLE IF NOT EXISTS msg_messages (
|
|
112
|
+
if (!options.readOnly) this.db.exec(`CREATE TABLE IF NOT EXISTS msg_messages (
|
|
88
113
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
89
114
|
sender TEXT NOT NULL,
|
|
90
115
|
recipient TEXT NOT NULL,
|
|
91
116
|
body TEXT NOT NULL,
|
|
92
117
|
kind TEXT,
|
|
118
|
+
reply_to INTEGER,
|
|
93
119
|
created_at TEXT NOT NULL
|
|
94
120
|
);
|
|
95
121
|
CREATE INDEX IF NOT EXISTS idx_msg_messages_recipient_id ON msg_messages(recipient, id);
|
|
@@ -101,21 +127,28 @@ export class MsgStore {
|
|
|
101
127
|
provenance_key TEXT PRIMARY KEY,
|
|
102
128
|
message_id INTEGER NOT NULL REFERENCES msg_messages(id)
|
|
103
129
|
);`);
|
|
130
|
+
// Serialize the schema check and ALTER across processes opening an old ledger at once.
|
|
131
|
+
if (!options.readOnly) this.db.transaction(() => {
|
|
132
|
+
const replyToColumn = (this.db.query(`SELECT COUNT(*) AS count FROM pragma_table_info('msg_messages') WHERE name = 'reply_to'`)
|
|
133
|
+
.get() as { count: number }).count;
|
|
134
|
+
if (replyToColumn === 0) this.db.exec('ALTER TABLE msg_messages ADD COLUMN reply_to INTEGER');
|
|
135
|
+
this.db.exec('CREATE INDEX IF NOT EXISTS idx_msg_messages_reply_to ON msg_messages(reply_to, id)');
|
|
136
|
+
}).immediate();
|
|
104
137
|
}
|
|
105
138
|
|
|
106
139
|
append(input: MessageEnvelope): Message {
|
|
107
140
|
return this.insertMessage(input);
|
|
108
141
|
}
|
|
109
142
|
|
|
110
|
-
/** Append once for a
|
|
143
|
+
/** Append once for a coordination comment or a task failure incident. */
|
|
111
144
|
appendWithProvenance(input: MessageEnvelope, provenanceKey: string): Message {
|
|
112
|
-
if (typeof provenanceKey !== 'string' || !/^coord:[^:]+:[^:]+$/.test(provenanceKey)) {
|
|
145
|
+
if (typeof provenanceKey !== 'string' || !/^(?:coord|ta-failure):[^:]+:[^:]+$/.test(provenanceKey)) {
|
|
113
146
|
throw new Error('invalid message provenance key');
|
|
114
147
|
}
|
|
115
148
|
const msg = validateMessageEnvelope(input);
|
|
116
149
|
if (provenanceKey.split(':')[2] !== msg.to) throw new Error('provenance recipient does not match message recipient');
|
|
117
150
|
return this.db.transaction(() => {
|
|
118
|
-
const existing = this.db.query(`SELECT m.id, m.sender, m.recipient, m.body, m.kind, m.created_at
|
|
151
|
+
const existing = this.db.query(`SELECT m.id, m.sender, m.recipient, m.body, m.kind, m.reply_to, m.created_at
|
|
119
152
|
FROM msg_provenance p JOIN msg_messages m ON m.id = p.message_id WHERE p.provenance_key = ?`)
|
|
120
153
|
.get(provenanceKey) as MessageRow | null;
|
|
121
154
|
if (existing) return fromRow(existing);
|
|
@@ -128,9 +161,12 @@ export class MsgStore {
|
|
|
128
161
|
|
|
129
162
|
private insertMessage(input: MessageEnvelope): Message {
|
|
130
163
|
const msg = validateMessageEnvelope(input);
|
|
164
|
+
if (msg.replyTo !== undefined && this.db.query('SELECT 1 FROM msg_messages WHERE id = ?').get(msg.replyTo) === null) {
|
|
165
|
+
throw new Error(`reply target not found: #${msg.replyTo}`);
|
|
166
|
+
}
|
|
131
167
|
const createdAt = new Date().toISOString();
|
|
132
|
-
const result = this.db.query(`INSERT INTO msg_messages(sender, recipient, body, kind, created_at)
|
|
133
|
-
VALUES (?, ?, ?, ?, ?)`).run(msg.from, msg.to, msg.body, msg.kind ?? null, createdAt);
|
|
168
|
+
const result = this.db.query(`INSERT INTO msg_messages(sender, recipient, body, kind, reply_to, created_at)
|
|
169
|
+
VALUES (?, ?, ?, ?, ?, ?)`).run(msg.from, msg.to, msg.body, msg.kind ?? null, msg.replyTo ?? null, createdAt);
|
|
134
170
|
return { id: Number(result.lastInsertRowid), ...msg, createdAt };
|
|
135
171
|
}
|
|
136
172
|
|
|
@@ -142,15 +178,48 @@ export class MsgStore {
|
|
|
142
178
|
if (to === 'ALL') throw new Error('ALL is a topic, not a recipient');
|
|
143
179
|
validCursor(after);
|
|
144
180
|
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1000) throw new Error('limit must be between 1 and 1000');
|
|
145
|
-
return (this.db.query(`SELECT id, sender, recipient, body, kind, created_at FROM msg_messages
|
|
181
|
+
return this.readWithSchema(hasReplyTo => (this.db.query(`SELECT id, sender, recipient, body, kind, ${hasReplyTo ? 'reply_to' : 'NULL AS reply_to'}, created_at FROM msg_messages
|
|
146
182
|
WHERE id > ? AND (recipient = ? OR (recipient = 'ALL' AND sender <> ?))
|
|
147
|
-
ORDER BY id ASC LIMIT ?`).all(after, to, to, limit) as MessageRow[]).map(fromRow);
|
|
183
|
+
ORDER BY id ASC LIMIT ?`).all(after, to, to, limit) as MessageRow[]).map(fromRow));
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** One message by durable ID, or null when absent. */
|
|
187
|
+
getMessage(messageId: number): Message | null {
|
|
188
|
+
if (!Number.isSafeInteger(messageId) || messageId < 1) throw new Error('message ID must be a positive integer');
|
|
189
|
+
return this.readWithSchema(hasReplyTo => {
|
|
190
|
+
const row = this.db.query(`SELECT id, sender, recipient, body, kind, ${hasReplyTo ? 'reply_to' : 'NULL AS reply_to'}, created_at FROM msg_messages
|
|
191
|
+
WHERE id = ?`).get(messageId) as MessageRow | null;
|
|
192
|
+
return row === null ? null : fromRow(row);
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/** Replies pointing at the supplied message, ordered by durable insertion ID. */
|
|
197
|
+
listReplies(messageId: number, limit: number = 100, afterId: number = 0): Message[] {
|
|
198
|
+
if (!Number.isSafeInteger(messageId) || messageId < 1) throw new Error('message ID must be a positive integer');
|
|
199
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1000) throw new Error('limit must be between 1 and 1000');
|
|
200
|
+
validCursor(afterId);
|
|
201
|
+
return this.readWithSchema(hasReplyTo => hasReplyTo
|
|
202
|
+
? (this.db.query(`SELECT id, sender, recipient, body, kind, reply_to, created_at FROM msg_messages
|
|
203
|
+
WHERE reply_to = ? AND id > ? ORDER BY id ASC LIMIT ?`).all(messageId, afterId, limit) as MessageRow[]).map(fromRow)
|
|
204
|
+
: []);
|
|
148
205
|
}
|
|
149
206
|
|
|
150
207
|
list(recipient: string, after: number = 0, limit: number = 100): Message[] {
|
|
151
208
|
return this.listByRecipient(recipient, after, limit);
|
|
152
209
|
}
|
|
153
210
|
|
|
211
|
+
/** One ordered scan for every SSE subscriber; recipient filtering happens in the server. */
|
|
212
|
+
listAfter(after: number, limit: number = 1000): Message[] {
|
|
213
|
+
validCursor(after);
|
|
214
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1000) throw new Error('limit must be between 1 and 1000');
|
|
215
|
+
return this.readWithSchema(hasReplyTo => (this.db.query(`SELECT id, sender, recipient, body, kind, ${hasReplyTo ? 'reply_to' : 'NULL AS reply_to'}, created_at FROM msg_messages
|
|
216
|
+
WHERE id > ? ORDER BY id ASC LIMIT ?`).all(after, limit) as MessageRow[]).map(fromRow));
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
latestId(): number {
|
|
220
|
+
return (this.db.query('SELECT COALESCE(MAX(id), 0) AS id FROM msg_messages').get() as { id: number }).id;
|
|
221
|
+
}
|
|
222
|
+
|
|
154
223
|
getCursor(recipient: string): number {
|
|
155
224
|
const to = canonicalSeatId(recipient);
|
|
156
225
|
if (to === 'ALL') throw new Error('ALL is a topic, not a recipient');
|
|
@@ -199,6 +268,7 @@ export class MsgStore {
|
|
|
199
268
|
|
|
200
269
|
export function defaultMsgStorePath(): string { return join(elanousStateRoot(), 'msg', 'messages.db'); }
|
|
201
270
|
export function openMsgStore(path?: string): MsgStore { return new MsgStore(path); }
|
|
271
|
+
export function openMsgStoreReadOnly(path?: string): MsgStore { return new MsgStore(path, { readOnly: true }); }
|
|
202
272
|
|
|
203
273
|
/** Observe one recipient without creating a store or advancing its acknowledgement. */
|
|
204
274
|
export function readUnreadCount(recipient: string, path: string = defaultMsgStorePath()): number | null {
|
|
@@ -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
|
}
|