elanous 0.2.38 → 0.2.40
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/{RrjXTwz-urRAbChP1bX02 → HjeK7zONHfR7op1hKXp4k}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{7954.4f7a8832663ee979.js → 1060.014f1f01a17aec26.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8911.bf5e712acb25fb6c.js → 1281.d81877e35b9068f4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2104.70e086d5174a4736.js → 1350.59f40e39e02d91b1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +286 -0
- package/apps/pwa/out/_next/static/chunks/1537-6bb97b5214928ea9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +149 -0
- package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +90 -0
- package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +104 -0
- package/apps/pwa/out/_next/static/chunks/2047.8f23e210995d4548.js +2 -0
- package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1632.7d87f998e714bede.js → 2066.a77257c8c350770a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8019.21ca554a821dad01.js → 2177.df8547f9d7215c4e.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3528.e4b8ab70d339f965.js → 2226.2cf61ec781827219.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6493.27ad77de7aac7966.js → 2499.02fbfd18126c10c0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7628.6b16863ac3972333.js → 2522.f2766b76d22c8bdf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3086.fb14b60ce98b53d3.js → 2566.beaffc3a5e1fcd2e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9299.24e2a7d9b6d1f91b.js → 261.0d471e8aded799f3.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +27 -0
- package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2774-719820e3f5b2a3eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2829-734fe8bf2eee7347.js +1 -0
- package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7524.ce973525d30b3d52.js → 3330.7443183b7e6fdbdf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3124-561f7f037943cde2.js → 3746-f80a78f220bf37b5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +24 -0
- package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +77 -0
- package/apps/pwa/out/_next/static/chunks/{bb6987f9.3647e1a23b0e3217.js → 3b355b3d.6f73c98bf6f9c749.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +36 -0
- package/apps/pwa/out/_next/static/chunks/{8994d93e.33ba491f95345fc2.js → 409c787b.e48c5bec8ec10456.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5041-5aada92ca215ffdd.js → 413-24c8284bda08241d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +287 -0
- package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4351.0f37a6db2b34d50b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5638.107314dc479e2f37.js → 470.51a72a2348306455.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8487.291666583bebe640.js → 4769.9fd582071301f382.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8509.3a54d4e61893d7cb.js → 483.725e4a61be922788.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9fe1b809.738da85c8b17e3fb.js → 4864a2ca.1c1c280a7772c5e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +74 -0
- package/apps/pwa/out/_next/static/chunks/{8879.ac06755bcf3e44a1.js → 5383.bdfa5d886e39a826.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6142.913b44e260a3f925.js → 5436.fdf6fa8ae3e9588d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +8 -0
- package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +62 -0
- package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +94 -0
- package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7161-8f22db3ec5ed005e.js → 6051-0ae955eedb10adb9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3291.f6c1005387d514bd.js → 6257.c0037b8949239f5e.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5203.51e5d8b5f1dcfe53.js → 6749.0744ce6eb08d40e9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1938.0e6c60ee91c4d7f5.js → 6908.06008c67f6380ea9.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{de8b930d.d94c0f42acf807fc.js → 6cc1d1d6.9a98dd4622f1afc6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7219-15bdd9a80661af8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +93 -0
- package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7611.85f045bf232053ac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8099.1cccf31c1baa7e1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1026-44010f405704050c.js → 8272-025653884f9645d2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5307.d7328020227880c2.js → 8357.1aaa713b052a78b1.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4199-f7c6eb40cd0322f8.js → 8639-92c11d069792429e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8d173e38.18a2f7b4e1848bdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +41 -0
- package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9175.2de5209a5ce6f68a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9184.45afbf44fec87574.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{eaad0cba.771200940c529df7.js → 9189505a.980427ac048c8c60.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +79 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-866aac5ff226a7f3.js → page-ba957ff875a026a0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-4edb8df90f4537ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-83d27757e2b8060a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-fca2e59a81744d9e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-139d722de1dcd6c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-ccde99f07aaf71f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b7478fef.5917716286213fcc.js → b84cad00.594027ebe0531fe2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b7459770.6539b11860eb8a9c.js → ca3702f8.2913182e73889fa2.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{3f0de3de-2340c532c00395db.js → d5d3cefc-373c4eb722ed848b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{89d6c04f-6b8ab341748e468a.js → d8de0de2-dd0f4ac8e5ab1832.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{framework-4b12a946f352cee2.js → framework-002b472a66935d31.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.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/demo/persona-marketer/fixtures/marketer-scenario.yaml +10 -0
- package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
- package/graphs/demo/persona-marketer/recipes.yaml +19 -0
- package/graphs/video/explainer-line.yaml +4 -1
- package/package.json +1 -1
- package/scripts/dead-code/report.ts +169 -0
- package/scripts/lib/morning-report-options.ts +3 -4
- package/scripts/lib/tui-regress-evidence.ts +56 -0
- package/scripts/morning-report.ts +5 -1
- package/scripts/public-export.ts +15 -7
- package/scripts/release-loop/export-check-node.ts +21 -3
- package/scripts/release-loop/gate-node.ts +379 -48
- package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
- package/scripts/release-loop/gate-shard-receipts.ts +89 -0
- package/scripts/release-loop/gate-wall.ts +5 -5
- package/scripts/release-loop/preflight.ts +6 -2
- package/scripts/release-loop/resume-release.ts +20 -5
- package/scripts/release-loop/resume.ts +48 -0
- package/scripts/release-loop/version-node.ts +7 -2
- package/scripts/release-story/draft.ts +1 -1
- package/scripts/research-bench/README.md +53 -0
- package/scripts/research-bench/questions.json +66 -0
- package/scripts/research-bench/rubric.md +33 -0
- package/scripts/research-bench/run.ts +523 -0
- package/scripts/tui-regress.ts +85 -10
- package/src/acp/core-turn-bridge.ts +8 -0
- package/src/agent/autonomous-tools.ts +10 -3
- package/src/agent/monad-agent-turn.ts +4 -1
- package/src/agent/registry.ts +26 -2
- package/src/agent/shared-app-tools.ts +1 -1
- package/src/agent/surface-ux/build.ts +12 -3
- package/src/agent/surface-ux/types.ts +1 -1
- package/src/agent/task-notification.ts +75 -6
- package/src/agent/types.ts +3 -0
- package/src/agent-mission/driver.ts +29 -3
- package/src/agent-mission/mission-cli.ts +2 -1
- package/src/agent-substrate/review-context-pack.ts +365 -0
- package/src/agent-substrate/self-review-cli.ts +226 -17
- package/src/ask-user-question/index.ts +6 -0
- package/src/ask-user-question/inline-resolver.ts +49 -0
- package/src/auto-research/question-ladder-contract.ts +22 -3
- package/src/auto-research/research-turn.ts +350 -17
- package/src/autopilot/agent-loop.ts +1 -1
- package/src/autopilot/pty-control-loop.ts +8 -1
- package/src/boot/daemon-tools/index.ts +4 -3
- package/src/boot/daemon-tools/self-implement.ts +270 -2
- package/src/boot/daemon-tools/types.ts +2 -0
- package/src/budget/llm-cost.ts +44 -5
- package/src/budget/unified-usage.ts +17 -1
- package/src/capture/tui-self-report.ts +14 -0
- package/src/chat/index.ts +33 -7
- package/src/cli/agent-cli.ts +43 -8
- package/src/cli/intake-cli.ts +22 -1
- package/src/cli/lesson-cli.ts +19 -3
- package/src/cli/log-event-names.ts +1 -0
- package/src/cli/pod-cli.ts +17 -2
- package/src/cli/pty-takeover-cli.ts +67 -7
- package/src/cli/release-cli.ts +52 -6
- package/src/cli/repo-cli.ts +2 -1
- package/src/cli/tasks-cli.ts +36 -9
- package/src/control-plane/ledger.ts +21 -4
- package/src/core-turn/run-core-turn.ts +44 -3
- package/src/core-turn/run-goal-loop.ts +152 -8
- package/src/core-turn/types.ts +9 -0
- package/src/dashboard/chat/acp-chat.ts +2 -2
- package/src/dashboard/classic-sigquit.ts +16 -0
- package/src/dashboard/index.ts +321 -27
- package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
- package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
- package/src/dashboard/input/external-input-host.ts +2 -0
- package/src/dashboard/sidetab-runtime.ts +228 -0
- package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -8
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
- package/src/dashboard/term-slash-runtime.ts +16 -18
- package/src/dashboard/turn-preamble.ts +2 -0
- package/src/domains/knowledge.ts +1 -1
- package/src/esc-abort-gate.ts +33 -1
- package/src/execution-loop/launch-gate.ts +206 -1
- package/src/graph-runner/graph-cli.ts +6 -4
- package/src/graph-runner/runner.ts +31 -9
- package/src/graph-wizard/generate.ts +16 -7
- package/src/graph-wizard/mission-compose.ts +201 -0
- package/src/grok/agent-search.ts +8 -2
- package/src/grok/credential.ts +5 -0
- package/src/grounding/ref-index.ts +11 -0
- package/src/grounding/ref-vector.ts +61 -0
- package/src/grounding/sources-cli.ts +2 -2
- package/src/grounding/sources.ts +15 -1
- package/src/harness/harness-cli-command.ts +38 -9
- package/src/harness/harness-pod-dispatch.ts +7 -1
- package/src/index.ts +18 -4
- package/src/input/external-input-queue.ts +10 -0
- package/src/intake-plane/collect-telegram-saved.ts +36 -1
- package/src/intake-plane/intake-to-tasks.ts +246 -3
- package/src/lessons/friction-ledger.ts +154 -0
- package/src/live-supply/collector.ts +149 -0
- package/src/live-supply/probes.ts +52 -0
- package/src/live-supply/snapshot.ts +40 -0
- package/src/llm.ts +431 -76
- package/src/loops/orchestrator/tick.ts +8 -0
- package/src/nexus/api/harness-api.ts +2 -1
- package/src/pty/snapshot.py +132 -0
- package/src/pty-shell/pty-control-ipc.ts +29 -2
- package/src/pty-shell/pty-manifest.ts +59 -3
- package/src/pty-shell/registry.ts +2 -0
- package/src/pty-shell/tui-run-state.ts +80 -3
- package/src/release-loop/gate-host-reservation.ts +13 -4
- package/src/release-loop/gate-shard-ledger.ts +68 -0
- package/src/release-loop/merged-pr-checklist.ts +25 -2
- package/src/release-loop/rehearsal-shard-plan.ts +6 -1
- package/src/release-loop/rehearsal.ts +27 -0
- package/src/research/edge-decision.ts +124 -15
- package/src/research/gap-followup.ts +249 -0
- package/src/research/lenses/counter-evidence.ts +100 -0
- package/src/research/lenses/working-backwards.ts +89 -0
- package/src/research/plugin-discovery.ts +242 -0
- package/src/research-bridge/invoke.ts +4 -2
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +34 -106
- package/src/self-dev/dev-cli.ts +2 -0
- package/src/self-dev/dev-pipeline.ts +8 -4
- package/src/self-dev/graph-journey-route.ts +10 -2
- package/src/self-dev/launch-preflight-text.ts +2 -2
- package/src/self-dev/launch-preflight.ts +38 -7
- package/src/self-dev/orchestrate-cli.ts +1 -0
- package/src/self-dev/run-supervisor.ts +19 -0
- package/src/self-implement/device-first.ts +8 -2
- package/src/self-implement/doctor-visit.ts +76 -58
- package/src/self-implement/gate-artifacts.ts +3 -0
- package/src/self-implement/gate-baseline.ts +75 -4
- package/src/self-implement/gate-cli.ts +317 -9
- package/src/self-implement/gate-receipt-registry.ts +180 -0
- package/src/self-implement/gate-remote.ts +145 -22
- package/src/self-implement/goal-author-clarification.ts +178 -24
- package/src/self-implement/goal-author-decompose.ts +24 -15
- package/src/self-implement/goal-author.ts +9 -5
- package/src/self-implement/host-regate.ts +120 -45
- package/src/self-implement/impl-findings-feedback.ts +188 -0
- package/src/self-implement/knowhow-pack.ts +189 -10
- package/src/self-implement/off-diff-evidence.ts +124 -0
- package/src/self-implement/orchestrator.ts +85 -7
- package/src/self-implement/run-ledger.ts +46 -8
- package/src/self-implement/run-stop.ts +12 -0
- package/src/self-implement/seams.ts +6 -3
- package/src/self-implement/self-implement-cli.ts +4 -2
- package/src/session/chat.ts +89 -15
- package/src/session-runtime/provider-circuit.ts +140 -0
- package/src/shell-runner/file-engine.ts +1 -0
- package/src/shell-runner/types.ts +4 -0
- package/src/sidetab-core/model.ts +176 -0
- package/src/skills/tools/schedule-wakeup.ts +23 -1
- package/src/skills/tools/shell.ts +51 -5
- package/src/steward/directive-audit.ts +354 -0
- package/src/surface/child-process.ts +31 -0
- package/src/surface/tui-stderr-owner.ts +48 -0
- package/src/task-agent/cover.ts +30 -12
- package/src/task-agent/judge.ts +56 -0
- package/src/task-agent/postland-card.ts +35 -2
- package/src/task-agent/rejudge-on-head.ts +46 -2
- package/src/task-agent/repair-cycle.ts +1 -1
- package/src/task-agent/task-hand.ts +129 -24
- package/src/task-agent/tier-split.ts +105 -21
- package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
- package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +27 -2
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
- package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +186 -33
- package/src/tool-runtime/skill-exec-runtime.ts +95 -5
- package/src/tui/entry.ts +15 -2
- package/src/tui/inline-choice.ts +188 -0
- package/src/tui/sidetab/list.ts +2 -176
- package/src/tui/slash/term.ts +12 -1
- package/src/tui-client/dashboard-session.ts +7 -1
- package/src/user-config.ts +34 -4
- package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
- package/src/ux-sim/fake-land-queue.ts +88 -0
- package/src/ux-sim/gate-shard-host-reroute.ts +82 -0
- package/src/ux-sim/goal-interim-trace.ts +24 -0
- package/src/ux-sim/next-tui-seat-scenarios.ts +8 -13
- package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/recipes/explainer.ts +54 -2
- package/src/web-search/grok.ts +32 -6
- package/src/web-search/index.ts +8 -7
- package/src/workflow-runtime/node-catalog.ts +53 -4
- package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +0 -93
- package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +0 -104
- package/apps/pwa/out/_next/static/chunks/2415.738b777642a02233.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +0 -24
- package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +0 -1
- package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +0 -287
- package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +0 -94
- package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +0 -32
- package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +0 -90
- package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +0 -79
- package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +0 -286
- package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +0 -1
- package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +0 -8
- package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +0 -62
- package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7488.966b116789f3d41a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +0 -77
- package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +0 -1
- package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +0 -149
- package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +0 -24
- package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +0 -2
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +0 -1
- /package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → HjeK7zONHfR7op1hKXp4k}/_ssgManifest.js +0 -0
package/src/cli/agent-cli.ts
CHANGED
|
@@ -68,6 +68,25 @@ export function setCliAgentDispatchForTesting(dispatch: CliAgentDispatch | undef
|
|
|
68
68
|
cliAgentDispatchForTesting = dispatch;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
/** A completed standalone agent turn must not wait forever for a tool's leftover handle. */
|
|
72
|
+
function armAgentCliExitSafetyNet(): void {
|
|
73
|
+
const timer = setTimeout(() => {
|
|
74
|
+
try {
|
|
75
|
+
const runtime = process as typeof process & {
|
|
76
|
+
_getActiveHandles?: () => Array<{ constructor?: { name?: string } }>;
|
|
77
|
+
_getActiveRequests?: () => Array<{ constructor?: { name?: string } }>;
|
|
78
|
+
};
|
|
79
|
+
const handleTypes = runtime._getActiveHandles?.().map(h => h.constructor?.name ?? 'unknown') ?? [];
|
|
80
|
+
const requestTypes = runtime._getActiveRequests?.().map(r => r.constructor?.name ?? 'unknown') ?? [];
|
|
81
|
+
debug.log('agent.cli.exit', 'grace-expired', { handleTypes, requestTypes }, { level: 'warn' });
|
|
82
|
+
debug.flush();
|
|
83
|
+
} finally {
|
|
84
|
+
process.exit(0);
|
|
85
|
+
}
|
|
86
|
+
}, 1_000);
|
|
87
|
+
timer.unref();
|
|
88
|
+
}
|
|
89
|
+
|
|
71
90
|
export function registerAgentCommands(program: Command): void {
|
|
72
91
|
const agentCommand = program
|
|
73
92
|
.command('agent')
|
|
@@ -128,6 +147,10 @@ export function registerAgentCommands(program: Command): void {
|
|
|
128
147
|
// commander stores --no-tools as `tools: false`, plain absence as undefined → default true here.
|
|
129
148
|
enableTools: opts.tools !== false,
|
|
130
149
|
});
|
|
150
|
+
// runChatTurnCli has already flushed its JSON reply. Let clean turns exit
|
|
151
|
+
// naturally; a referenced child/socket/timer left by a tool gets one second
|
|
152
|
+
// before we log the surviving handles and end this standalone process.
|
|
153
|
+
armAgentCliExitSafetyNet();
|
|
131
154
|
});
|
|
132
155
|
|
|
133
156
|
// ── agent dispatch — RFC #7333 `A1` (트리거) ──
|
|
@@ -413,7 +436,7 @@ tierCmd
|
|
|
413
436
|
* ui.info trailer and instead emits exactly ONE JSON line on stdout
|
|
414
437
|
* at end-of-turn:
|
|
415
438
|
* {sessionId, provider, model, reply, finalReply, transcript, logPath,
|
|
416
|
-
* budget, durationMs, ts}
|
|
439
|
+
* budget, durationMs, ts, incomplete}
|
|
417
440
|
* Stable shape so LLMs can self-spawn `elanous chat` for follow-ups
|
|
418
441
|
* without parsing human-readable terminal output. */
|
|
419
442
|
export async function runChatTurnCli(opts: {
|
|
@@ -484,7 +507,7 @@ export async function runChatTurnCli(opts: {
|
|
|
484
507
|
dbg.setAmbientSessionId?.(session.id);
|
|
485
508
|
} catch { /* debug module unavailable — fine */ }
|
|
486
509
|
const replyChunks: string[] = [];
|
|
487
|
-
// Tool calls delimit assistant messages.
|
|
510
|
+
// Tool calls delimit assistant messages. Only text after the last tool call can be the final reply.
|
|
488
511
|
let segmentChunks: string[] = [];
|
|
489
512
|
let lastSegment = '';
|
|
490
513
|
let finalMessage = '';
|
|
@@ -507,14 +530,17 @@ export async function runChatTurnCli(opts: {
|
|
|
507
530
|
let tools: ReturnType<typeof buildCliAgentTools> | undefined;
|
|
508
531
|
let dispatchTool: ((name: string, args: Record<string, unknown>) => Promise<unknown>) | undefined;
|
|
509
532
|
let enabledToolNames: string[] | undefined;
|
|
533
|
+
const toolAbort = new AbortController();
|
|
534
|
+
const abortToolsOnSigint = (): void => toolAbort.abort();
|
|
510
535
|
if (opts.enableTools) {
|
|
511
536
|
const built = buildCliAgentTools(opts.cfg, harnessSpace ? {
|
|
512
537
|
sessionId: session.id,
|
|
513
538
|
emitFeedback: emitHarnessFeedbackProgress,
|
|
514
539
|
} : undefined); // ★ cfg 전달 → financeEnabled 시 finance 팩 노출(서피스 게이팅 정리)
|
|
515
540
|
tools = built;
|
|
516
|
-
dispatchTool = built.dispatch;
|
|
541
|
+
dispatchTool = (name, args) => built.dispatch(name, args, { signal: toolAbort.signal });
|
|
517
542
|
enabledToolNames = built.specs.map(s => s.name);
|
|
543
|
+
process.once('SIGINT', abortToolsOnSigint);
|
|
518
544
|
}
|
|
519
545
|
// Wire the universal preamble (project anchor + project tree +
|
|
520
546
|
// family addendum + session-specific guidance) into every CLI system
|
|
@@ -604,6 +630,8 @@ export async function runChatTurnCli(opts: {
|
|
|
604
630
|
process.exit(2);
|
|
605
631
|
}
|
|
606
632
|
throw err;
|
|
633
|
+
} finally {
|
|
634
|
+
if (opts.enableTools) process.removeListener('SIGINT', abortToolsOnSigint);
|
|
607
635
|
}
|
|
608
636
|
if (!sawToolCall && replyChunks.length === 0 && result.text) {
|
|
609
637
|
replyChunks.push(result.text);
|
|
@@ -611,6 +639,7 @@ export async function runChatTurnCli(opts: {
|
|
|
611
639
|
if (!opts.json && !opts.enableTools) process.stdout.write(result.text);
|
|
612
640
|
}
|
|
613
641
|
closeSegment();
|
|
642
|
+
const incomplete = sawToolCall && finalMessage.length === 0;
|
|
614
643
|
if (opts.json) {
|
|
615
644
|
let logPath: string | null = null;
|
|
616
645
|
try {
|
|
@@ -624,17 +653,23 @@ export async function runChatTurnCli(opts: {
|
|
|
624
653
|
model: result.model ?? null,
|
|
625
654
|
reply: finalMessage,
|
|
626
655
|
transcript: replyChunks.join(''),
|
|
627
|
-
finalReply: lastSegment,
|
|
656
|
+
finalReply: sawToolCall ? finalMessage : lastSegment,
|
|
657
|
+
incomplete,
|
|
628
658
|
budget: sessionBudget(session.id),
|
|
629
659
|
durationMs: Date.now() - startedAt,
|
|
630
660
|
logPath,
|
|
631
661
|
ts: new Date().toISOString(),
|
|
632
662
|
};
|
|
633
663
|
await writeStdoutJson(JSON.stringify(out) + '\n');
|
|
664
|
+
if (incomplete) process.exitCode = 1;
|
|
634
665
|
return;
|
|
635
666
|
}
|
|
636
667
|
if (opts.enableTools) process.stdout.write(`${finalMessage}\n`);
|
|
637
668
|
else process.stdout.write('\n');
|
|
669
|
+
if (incomplete) {
|
|
670
|
+
console.error('Turn ended without a final assistant reply.');
|
|
671
|
+
process.exitCode = 1;
|
|
672
|
+
}
|
|
638
673
|
ui.info(`[session ${session.id.slice(0, 8)} ${result.provider}${result.model ? '/' + result.model : ''} ${sessionBudget(session.id)}]`);
|
|
639
674
|
}
|
|
640
675
|
|
|
@@ -655,7 +690,7 @@ export function buildCliAgentTools(
|
|
|
655
690
|
trustedWorkingDirectory?: string,
|
|
656
691
|
): {
|
|
657
692
|
specs: import('../llm.js').LLMToolSpec[];
|
|
658
|
-
dispatch: (name: string, args: Record<string, unknown
|
|
693
|
+
dispatch: (name: string, args: Record<string, unknown>, context?: { signal?: AbortSignal }) => Promise<unknown>;
|
|
659
694
|
workingDirectory: string;
|
|
660
695
|
} {
|
|
661
696
|
// An explicitly assigned child cwd is stable for its isolated lifetime. An
|
|
@@ -706,7 +741,7 @@ export function buildCliAgentTools(
|
|
|
706
741
|
// 게이트. [[project_skill_native_duplication_surface_gating]].
|
|
707
742
|
const shared = (require('../agent/shared-app-tools.js') as typeof import('../agent/shared-app-tools.js')).buildSharedAppTools(cfg);
|
|
708
743
|
for (const s of shared.specs) specs.push(s);
|
|
709
|
-
for (const name of shared.names) dispatchByName.set(name, async (args) => shared.dispatch(name, args));
|
|
744
|
+
for (const name of shared.names) dispatchByName.set(name, async (args, signal) => shared.dispatch(name, args, { surface: 'tui', signal }));
|
|
710
745
|
// Installed knowledge is queryable in CLI chat as well as the dashboard runtime.
|
|
711
746
|
// No installed packs => preserve the existing CLI tool list and avoid creating a KGS database.
|
|
712
747
|
const { kgsDefaultDbPath } = require('../knowledge/kgs/sqlite-store.js') as typeof import('../knowledge/kgs/sqlite-store.js');
|
|
@@ -751,10 +786,10 @@ export function buildCliAgentTools(
|
|
|
751
786
|
const dispatchSessionRuntimeTool = sr.dispatchSessionRuntimeTool;
|
|
752
787
|
const createPlanner = sr.createSearchPlannerState;
|
|
753
788
|
const plannerState = createPlanner({ maxAutoNarrowCandidates: 2 });
|
|
754
|
-
const dispatch = async (name: string, args: Record<string, unknown
|
|
789
|
+
const dispatch = async (name: string, args: Record<string, unknown>, context?: { signal?: AbortSignal }): Promise<unknown> => {
|
|
755
790
|
try {
|
|
756
791
|
const direct = dispatchByName.get(name);
|
|
757
|
-
if (direct) return await direct(args);
|
|
792
|
+
if (direct) return await direct(args, context?.signal);
|
|
758
793
|
// ⭐ BACKLOG L1b (2026-09-25) — ToolSearch 는 지연 도구가 있으면 «자동으로 광고»되는데 이 CLI 디스패처만
|
|
759
794
|
// 라우팅이 없어 `plugin tool unavailable in CLI: ToolSearch` 로 죽었다(daemon·monad-agent-turn 은 라우팅한다).
|
|
760
795
|
// ⇒ 같은 공용 라우터로 이 CLI 의 도구 풀에서 찾는다.
|
package/src/cli/intake-cli.ts
CHANGED
|
@@ -5,7 +5,7 @@ import type { Command } from 'commander';
|
|
|
5
5
|
import { getElanousConfigDir } from '../elanous-config-dir.js';
|
|
6
6
|
import { readNexusRuntime } from '../nexus/runtime.js';
|
|
7
7
|
import { resolveRoleLlm } from '../user-config.js';
|
|
8
|
-
import { runIntakeToTasks, type IntakeTaskInput, type IntakeTaskRequest, type IntakeToTasksResult } from '../intake-plane/intake-to-tasks.js';
|
|
8
|
+
import { approveChannelPublish, runIntakeToTasks, type IntakeTaskInput, type IntakeTaskRequest, type IntakeToTasksResult } from '../intake-plane/intake-to-tasks.js';
|
|
9
9
|
import { writeStdoutJson } from './stdout-json.js';
|
|
10
10
|
import { writeStdoutFully } from './stdout-flush.js';
|
|
11
11
|
import { runGitCommand } from '../git-fs/runner.js';
|
|
@@ -37,6 +37,8 @@ export interface IntakeCliDeps extends IntakeCandidatesCliDeps {
|
|
|
37
37
|
root?: string;
|
|
38
38
|
/** 텔레그램 «저장된 메시지» 연결 (기본 gramjsFetchSaved) — 시험은 가짜 fetch 를 넣는다. */
|
|
39
39
|
connectSaved?: () => Promise<{ fetch: FetchSavedMessages; close: () => Promise<void> }>;
|
|
40
|
+
/** 수집 연결 실패를 CLI 사용자에게 보고한다. */
|
|
41
|
+
error?: (message: string) => void;
|
|
40
42
|
}
|
|
41
43
|
|
|
42
44
|
/** `--limit` 원 문자열 → 0 이상의 정수. 숫자만(`/^\d+$/`) 받고 나머지('' · 공백 · 음수 · 소수)는 거부한다. */
|
|
@@ -535,6 +537,24 @@ export function registerIntakeCommands(program: Command, candidateDeps: IntakeCl
|
|
|
535
537
|
if (result.failed > 0) process.exitCode = 1;
|
|
536
538
|
});
|
|
537
539
|
|
|
540
|
+
intakeCmd
|
|
541
|
+
.command('approve-channel-post <id>')
|
|
542
|
+
.description('보호 범주의 채널 게시 초안을 사람 승인한다 (외부 게시 커넥터는 호출하지 않는다)')
|
|
543
|
+
.requiredOption('--by <approver>', '승인자: MK | 대표')
|
|
544
|
+
.option('--json', '구조화 출력')
|
|
545
|
+
.action(async (id: string, opts: { by: string; json?: boolean }) => {
|
|
546
|
+
const { effectiveInstanceRoot } = await import('../instance/resolve.js');
|
|
547
|
+
const approved = approveChannelPublish(candidateDeps.root ?? effectiveInstanceRoot(), id, opts.by);
|
|
548
|
+
if (!approved) {
|
|
549
|
+
console.error(`대기 중인 보호 초안을 찾지 못했거나 승인자(${opts.by})가 MK·대표가 아니다: ${id}`);
|
|
550
|
+
process.exitCode = 1;
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
const result = { id, status: approved.status, approvedBy: approved.approvedBy, category: approved.category };
|
|
554
|
+
if (opts.json) await writeStdoutFully(JSON.stringify(result) + '\n');
|
|
555
|
+
else console.log(`${id} → ${approved.status} · 승인자 ${approved.approvedBy} · 외부 게시 미실행`);
|
|
556
|
+
});
|
|
557
|
+
|
|
538
558
|
intakeCmd
|
|
539
559
|
.command('collect-telegram-saved')
|
|
540
560
|
.description('텔레그램 «저장된 메시지»를 읽기만 해 흡수 원장에 넣는다 (커서 이후만 · 호스트 전용 · 개인 메모는 user-private)')
|
|
@@ -546,6 +566,7 @@ export function registerIntakeCommands(program: Command, candidateDeps: IntakeCl
|
|
|
546
566
|
...(candidateDeps.root ? { root: candidateDeps.root } : {}),
|
|
547
567
|
...(candidateDeps.connectSaved ? { connect: candidateDeps.connectSaved } : {}),
|
|
548
568
|
...(candidateDeps.write ? { write: candidateDeps.write } : {}),
|
|
569
|
+
...(candidateDeps.error ? { error: candidateDeps.error } : {}),
|
|
549
570
|
});
|
|
550
571
|
});
|
|
551
572
|
|
package/src/cli/lesson-cli.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { Command } from 'commander';
|
|
|
2
2
|
import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
3
3
|
import { dirname, resolve } from 'node:path';
|
|
4
4
|
import { debug } from '../debug/log.js';
|
|
5
|
+
import { FrictionInputError, FrictionLedger, frictionActor, type FrictionRecordInput } from '../lessons/friction-ledger.js';
|
|
5
6
|
import { importLessons, scanLessonDocs } from '../lessons/lesson-import.js';
|
|
6
7
|
import { LessonInputError, LessonLedger, type LessonLedgerOptions, type LessonRow, type LessonDetail } from '../lessons/lesson-ledger.js';
|
|
7
8
|
|
|
@@ -47,6 +48,18 @@ function validAuthoringLessonClass(value: string): boolean {
|
|
|
47
48
|
export function registerLessonCommands(program: Command, options: LessonLedgerOptions = {}, out: Pick<Console, 'log'> = console): void {
|
|
48
49
|
const root = program.command('lesson').description('사고 · 원인 · 처방 · 재발 교훈 원장');
|
|
49
50
|
const ledger = () => new LessonLedger(options);
|
|
51
|
+
// 손 걸음 원장은 그림자 기록이다: 비밀 꼴 note 는 빼고 남기며, 어떤 경우에도 lesson 명령을 실패시키지 않는다.
|
|
52
|
+
const recordFriction = (input: FrictionRecordInput): void => {
|
|
53
|
+
const friction = new FrictionLedger(options);
|
|
54
|
+
const attempts = input.note ? [input, { ...input, note: '' }] : [input];
|
|
55
|
+
for (const attempt of attempts) {
|
|
56
|
+
try { friction.record(attempt); return; }
|
|
57
|
+
catch (error) {
|
|
58
|
+
debug.log('lessons.friction', 'skipped', { kind: attempt.kind, signature: attempt.signature,
|
|
59
|
+
reason: error instanceof FrictionInputError ? error.message : String(error) });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
50
63
|
const emit = (value: unknown, json: boolean | undefined, text: string) => out.log(json ? JSON.stringify(value) : text);
|
|
51
64
|
root.command('import').description('INCIDENT·FINDING 문서 교훈 미리 보기 (기본값); --apply 로 적재')
|
|
52
65
|
.option('--apply', '원장에 적재').option('--json', 'JSON 출력').option('--by <name>', '기록자 (기본 AI_AGENT)')
|
|
@@ -128,11 +141,12 @@ export function registerLessonCommands(program: Command, options: LessonLedgerOp
|
|
|
128
141
|
return;
|
|
129
142
|
}
|
|
130
143
|
const required = ['incident', 'cause', 'remedy', 'owner', 'source'] as const;
|
|
144
|
+
const lessonId = id ?? '';
|
|
131
145
|
const missing: string[] = required.filter((key) => typeof o[key] !== 'string' || !(o[key] as string).trim());
|
|
132
|
-
if (!
|
|
146
|
+
if (!lessonId.trim()) missing.unshift('id');
|
|
133
147
|
if (missing.length) throw new LessonInputError(`required: ${missing.map(key => key === 'id' ? 'id' : `--${key}`).join(', ')}`);
|
|
134
148
|
const by = actor(typeof o.by === 'string' ? o.by : undefined);
|
|
135
|
-
const row = ledger().add({ id, incident: o.incident as string, cause: o.cause as string, remedy: o.remedy as string,
|
|
149
|
+
const row = ledger().add({ id: lessonId, incident: o.incident as string, cause: o.cause as string, remedy: o.remedy as string,
|
|
136
150
|
owner: o.owner as string, source: o.source as string, by,
|
|
137
151
|
...(o.enforcedBy !== undefined ? { enforcedBy: o.enforcedBy as string } : {}),
|
|
138
152
|
...(o.disproof !== undefined ? { disproof: o.disproof as string } : {}) });
|
|
@@ -140,7 +154,9 @@ export function registerLessonCommands(program: Command, options: LessonLedgerOp
|
|
|
140
154
|
}));
|
|
141
155
|
root.command('recur <id>').requiredOption('--source <path>').option('--note <text>').option('--by <name>')
|
|
142
156
|
.action(handle('recur', (id: string, o: { source: string; note?: string; by?: string }) => {
|
|
143
|
-
const
|
|
157
|
+
const by = actor(o.by);
|
|
158
|
+
const row = ledger().recur(id, { source: o.source, note: o.note ?? '', by });
|
|
159
|
+
recordFriction({ actor: frictionActor(by), kind: 'hand-step', signature: row.incident ?? `lesson ${row.id}`, note: o.note ?? '', ref: o.source });
|
|
144
160
|
emit(row, false, format(row));
|
|
145
161
|
}));
|
|
146
162
|
root.command('enforce <id>').requiredOption('--enforced-by <paths>').option('--by <name>')
|
package/src/cli/pod-cli.ts
CHANGED
|
@@ -14,7 +14,7 @@ import { getUserConfig } from '../user-config.js';
|
|
|
14
14
|
import { listCodexAccountsInStore } from '../oauth/codex-account-store.js';
|
|
15
15
|
import { parsePodPool, resolvePodPoolSpec, podPoolHostLease, type PoolKubectl } from '../task-orchestrator/surfaces/pod-pool.js';
|
|
16
16
|
import { leaseKubectl, measurePoolLease, probePoolDns, probePoolGitHub, recommendConcurrency, type PoolLeaseMeasure, type PoolDnsProbe, type ExternalGitHubProbe } from '../task-orchestrator/surfaces/pod-lease.js';
|
|
17
|
-
import { POD_COMMAND_DEADLINE_SECONDS, runPodCommand, type PodCommandResult, type RunPodCommandOptions } from '../task-orchestrator/surfaces/pod-command-job.js';
|
|
17
|
+
import { POD_COMMAND_DEADLINE_SECONDS, parseCpuRightsizeRequest, runPodCommand, type PodCommandResult, type PodCpuRightsizeRequest, type RunPodCommandOptions } from '../task-orchestrator/surfaces/pod-command-job.js';
|
|
18
18
|
import { hostLeaseCounts, leaseHasPendingPod } from '../pod-lease/host-lease.js';
|
|
19
19
|
|
|
20
20
|
export interface PodCliIo {
|
|
@@ -220,7 +220,8 @@ export function registerPodCommands(program: Command, deps: PodCliDeps = {}): vo
|
|
|
220
220
|
.allowUnknownOption(true)
|
|
221
221
|
.allowExcessArguments(true)
|
|
222
222
|
.option('--lite', '네트워크 스킬(omni-crawl·omni-digest)만 쓰는 명령 — 작은 이미지 ⊕ 2Gi 한도(POD7 · clone 불가)')
|
|
223
|
-
.
|
|
223
|
+
.option('--cpu-rightsize <json>', 'POD-CPU-REQUEST-RIGHTSIZE-2-FU: 공존 재측정 요청(JSON 파일 경로 또는 인라인 JSON) — { condition?, samples[], priorLaunches[] }. 선행 조건·측정이 모자라면 발사하지 않는다')
|
|
224
|
+
.action(async (opts: { pool?: string; skill?: string; llm?: string; clone?: boolean; deadline?: string; lite?: boolean; cpuRightsize?: string }, command: Command) => {
|
|
224
225
|
const argv = process.argv.slice(2);
|
|
225
226
|
const sep = argv.indexOf('--');
|
|
226
227
|
const fromArgv = sep >= 0 ? argv.slice(sep + 1) : [];
|
|
@@ -244,6 +245,19 @@ export function registerPodCommands(program: Command, deps: PodCliDeps = {}): vo
|
|
|
244
245
|
return;
|
|
245
246
|
}
|
|
246
247
|
}
|
|
248
|
+
// POD-CPU-REQUEST-RIGHTSIZE-2-FU — the OP-facing measurement launch reads its request from JSON (file path or inline).
|
|
249
|
+
let cpuRightsize: PodCpuRightsizeRequest | undefined;
|
|
250
|
+
if (opts.cpuRightsize !== undefined) {
|
|
251
|
+
try {
|
|
252
|
+
const source = opts.cpuRightsize.trim();
|
|
253
|
+
const text = source.startsWith('{') ? source : readFileSync(source, 'utf8');
|
|
254
|
+
cpuRightsize = parseCpuRightsizeRequest(JSON.parse(text), '--cpu-rightsize');
|
|
255
|
+
} catch (err) {
|
|
256
|
+
io.error(`pod run: --cpu-rightsize — ${err instanceof Error ? err.message : String(err)}`);
|
|
257
|
+
io.exit(2);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
247
261
|
const skills = (opts.skill ?? '').split(',').map((s) => s.trim()).filter(Boolean);
|
|
248
262
|
const cloneWarning = podCloneWithoutInstallWarning(commandArgs, opts.clone);
|
|
249
263
|
if (cloneWarning !== null) {
|
|
@@ -268,6 +282,7 @@ export function registerPodCommands(program: Command, deps: PodCliDeps = {}): vo
|
|
|
268
282
|
...(opts.llm === 'grok' ? { llm: 'grok' as const } : {}),
|
|
269
283
|
...(opts.clone ? { clone: true } : {}),
|
|
270
284
|
...(opts.lite ? { lite: true } : {}),
|
|
285
|
+
...(cpuRightsize ? { cpuRightsize } : {}),
|
|
271
286
|
...(deadlineSeconds !== undefined ? { deadlineSeconds } : {}),
|
|
272
287
|
});
|
|
273
288
|
if (result.image) io.error(`[pod] image ${result.image} · job ${result.job}`);
|
|
@@ -5,7 +5,7 @@ import { dirname, join, resolve } from 'node:path';
|
|
|
5
5
|
import { runGitCommand } from '../git-fs/runner.js';
|
|
6
6
|
import { debug } from '../debug/log.js';
|
|
7
7
|
import { getPty, listPty, renamePty, requestPtyTakeover, startPty, type StartOpts } from '../pty-shell/registry.js';
|
|
8
|
-
import { describePtyRunState, describeTurnCell, formatTurnCell, ptyTurnViewOfRow, readCheckoutHead, readCurrentInstallRecord, shortSha, UNKNOWN_TURN_CELL, type InstalledRecord, type PtyRunStateView, type PtyTurnCell } from '../pty-shell/tui-run-state.js';
|
|
8
|
+
import { describePtyRunState, describeTurnCell, formatTurnCell, judgeTurnProgress, ptyTurnViewOfRow, readCheckoutHead, readCurrentInstallRecord, shortSha, UNKNOWN_TURN_CELL, type InstalledRecord, type PtyRunStateView, type PtyTurnCell, type TurnProgressJudgment } from '../pty-shell/tui-run-state.js';
|
|
9
9
|
import { getPtyManifest, isProcessAlive, listPtyManifest, listPtyManifestRows, listPtyManifestRowsAt, ptyManifestDbPath, readPtyManifestFrame, reapDeadPtyManifest, reapDeadPtyManifestAt, reapStalePtyManifest, removePtyManifest, PTY_MANIFEST_CLOSED_TTL_MS, PTY_MANIFEST_STALE_MS, type PtyManifestExternalReapResult, type PtyManifestRow } from '../pty-shell/pty-manifest.js';
|
|
10
10
|
import { readPtyEventsAfter, readPtyEventsAfterAt, type PtyEventLogReadResult, type PtyEventRow } from '../pty-shell/pty-event-log.js';
|
|
11
11
|
import { resolvePtyRef, type PtyRefItem } from '../pty-shell/pty-ref.js';
|
|
@@ -13,7 +13,7 @@ import { parsePtyWriteActor, resolveRemoteControlActor, resolveTakeover, type Pt
|
|
|
13
13
|
import { registerPtyAttachDriveCommand } from './pty-drive-cli.js';
|
|
14
14
|
import { resolveNexusPwa, type NexusPwaResolution } from './nexus-show.js';
|
|
15
15
|
import { formatPtyWebAddress, ptyWebAddress, type PtyWebAddress } from './pty-web-address.js';
|
|
16
|
-
import { getHarnessRunId, normalizeRunIdSource, type RunIdSource } from '../harness/harness-space.js';
|
|
16
|
+
import { ensureRunId, getHarnessRunId, normalizeRunIdSource, type RunIdSource } from '../harness/harness-space.js';
|
|
17
17
|
import { inspectControlInbox, type ControlInboxSnapshot } from '../harness/control-inbox.js';
|
|
18
18
|
import { requestRemotePtyControl, type PtyControlAction, type PtyControlPayload, type PtyControlRequestOptions, type PtyControlResult } from '../pty-shell/pty-control-ipc.js';
|
|
19
19
|
import { resolvePtySpecialKey, type PtyKeyEncoding } from '../pty-shell/pty-special-keys.js';
|
|
@@ -1467,6 +1467,10 @@ interface PtyListJsonRow extends PtyWebAddress {
|
|
|
1467
1467
|
readonly ageMs?: number;
|
|
1468
1468
|
/** ⭐ H10 — TUI 가 스스로 적은 턴(화면 추정 아님) ⊕ 그 상태 경과 초. 턴 기록 없는 행·원격 행은 `state:'unknown'`. */
|
|
1469
1469
|
readonly turn: PtyTurnCell;
|
|
1470
|
+
/** ⭐ SURVIVAL-PROGRESS-CLOCK — 마지막 진전 시각(epoch ms). 기록 없는 행·옛 판은 칸을 비운다. */
|
|
1471
|
+
readonly progressAt?: number;
|
|
1472
|
+
/** ⭐ SURVIVAL-PROGRESS-CLOCK — 진전 판정(progressing·slow·stalled·abort-ignored·unknown). */
|
|
1473
|
+
readonly progress: TurnProgressJudgment;
|
|
1470
1474
|
/** ⭐ H10 — 기동 판(실행판 sha) ⊕ 낡음. 판 기록 없는 행·판독 실패는 null. */
|
|
1471
1475
|
readonly build: { readonly version: string; readonly sha: string; readonly source: string; readonly stale: boolean | null; readonly staleReason: string } | null;
|
|
1472
1476
|
}
|
|
@@ -1534,10 +1538,15 @@ function ptyListJsonRow(row: PtyManifestRow, instance: string, sourceRoot: PtyMa
|
|
|
1534
1538
|
|
|
1535
1539
|
/** `pty list --json` 의 턴·판 칸 — ⛔ 키는 «언제나» 싣는다(값으로만 갈린다 · 모르면 unknown/null).
|
|
1536
1540
|
* ⭐ 턴은 행의 자기보고 값만 읽는다 — 판 판독(설치본·git)이 실패해도 기록된 턴은 버리지 않는다. */
|
|
1537
|
-
function ptyListRunFields(row: PtyManifestRow, deps: PtyTakeoverCommandDeps, observedAt: number, installed: () => InstalledRecord): Pick<PtyListJsonRow, 'turn' | 'build'> {
|
|
1541
|
+
function ptyListRunFields(row: PtyManifestRow, deps: PtyTakeoverCommandDeps, observedAt: number, installed: () => InstalledRecord): Pick<PtyListJsonRow, 'turn' | 'progressAt' | 'progress' | 'build'> {
|
|
1538
1542
|
const turn = describeTurnCell(ptyTurnViewOfRow(row), observedAt);
|
|
1543
|
+
// SURVIVAL-PROGRESS-CLOCK — 진전 판정을 같은 관측 시각으로 잡고 전환을 관측한다.
|
|
1544
|
+
const progress = judgeTurnProgress({
|
|
1545
|
+
turn: turn.state, turnAt: turn.at ?? undefined, progressAt: row.progressAt, abortRequestedAt: row.abortRequestedAt, now: observedAt,
|
|
1546
|
+
});
|
|
1547
|
+
noteTurnProgressSurvival(row.id, progress, { turnAt: turn.at ?? undefined, progressAt: row.progressAt, now: observedAt });
|
|
1539
1548
|
try {
|
|
1540
|
-
if (!row.build) return { turn, build: null };
|
|
1549
|
+
if (!row.build) return { turn, ...(row.progressAt !== undefined ? { progressAt: row.progressAt } : {}), progress, build: null };
|
|
1541
1550
|
// 판독 예외 계약: 판 sha 는 기록값이라 그대로 두고 낡음만 «모른다»(stale=null · unknown) ⊕ `list-build-read-failed` 관측.
|
|
1542
1551
|
// 그 밖의 뜻밖 예외는 판을 null 로(아래 catch) — 어느 쪽이든 기록된 턴은 버리지 않는다.
|
|
1543
1552
|
const run = describePtyRunState(row, {
|
|
@@ -1549,10 +1558,11 @@ function ptyListRunFields(row: PtyManifestRow, deps: PtyTakeoverCommandDeps, obs
|
|
|
1549
1558
|
}
|
|
1550
1559
|
},
|
|
1551
1560
|
});
|
|
1552
|
-
|
|
1561
|
+
const progressFields = { ...(row.progressAt !== undefined ? { progressAt: row.progressAt } : {}), progress };
|
|
1562
|
+
return { turn, ...progressFields, build: run.build ? { version: run.build.version, sha: run.build.sha, source: run.build.source, stale: run.stale, staleReason: run.staleReason } : null };
|
|
1553
1563
|
} catch (error) {
|
|
1554
1564
|
deps.log('list-build-read-failed', { ptyId: row.id, source: 'describe', error: error instanceof Error ? error.message : String(error) });
|
|
1555
|
-
return { turn, build: null };
|
|
1565
|
+
return { turn, ...(row.progressAt !== undefined ? { progressAt: row.progressAt } : {}), progress, build: null };
|
|
1556
1566
|
}
|
|
1557
1567
|
}
|
|
1558
1568
|
|
|
@@ -1848,8 +1858,9 @@ function remotePtyListJsonRow(row: RemoteTerminalListItem): PtyListJsonRow {
|
|
|
1848
1858
|
runTerminationSource: 'unknown',
|
|
1849
1859
|
runStoreIo: 'not-checked',
|
|
1850
1860
|
ownerRunUsage: 'unknown',
|
|
1851
|
-
// 원격 응답은
|
|
1861
|
+
// 원격 응답은 턴·판·진전을 안 싣는다 — «모른다»로(로컬과 같은 키).
|
|
1852
1862
|
turn: UNKNOWN_TURN_CELL,
|
|
1863
|
+
progress: 'unknown',
|
|
1853
1864
|
build: null,
|
|
1854
1865
|
};
|
|
1855
1866
|
}
|
|
@@ -2167,12 +2178,16 @@ export async function runPtyState(ref: string, deps: PtyTakeoverCommandDeps = li
|
|
|
2167
2178
|
function formatPtyStateResult(id: string, screen: { state: FrameState; label?: string | null }, run: PtyRunStateView, at: number, json: boolean, deps: PtyTakeoverCommandDeps, screenUnavailable?: string): PtyTakeoverCommandResult {
|
|
2168
2179
|
const reconciled = reconcileFrameStateWithTurn(screen.state, run.turn);
|
|
2169
2180
|
if (reconciled.overridden) deps.log('state-reconciled', { ptyId: id, turn: run.turn, screenState: reconciled.screenState, label: screen.label ?? null, state: reconciled.state });
|
|
2181
|
+
// SURVIVAL-PROGRESS-CLOCK — 진전·정체·Esc 무시 판정을 turnAt 옆에 싣고 전환을 관측한다.
|
|
2182
|
+
const progress = judgeTurnProgress({ turn: run.turn, turnAt: run.turnAt, progressAt: run.progressAt, abortRequestedAt: run.abortRequestedAt, now: at });
|
|
2183
|
+
noteTurnProgressSurvival(id, progress, { turnAt: run.turnAt, progressAt: run.progressAt, now: at });
|
|
2170
2184
|
const guess = reconciled.screenState !== reconciled.state && !screenUnavailable ? ` guess=${reconciled.screenState}` : '';
|
|
2171
2185
|
return { exitCode: 0, message: json
|
|
2172
2186
|
? JSON.stringify({
|
|
2173
2187
|
id, state: reconciled.state, stateSource: reconciled.source, screenState: reconciled.screenState, label: screen.label, at,
|
|
2174
2188
|
...(screenUnavailable ? { screenUnavailable } : {}),
|
|
2175
2189
|
turn: run.turn, ...(run.turnAt !== undefined ? { turnAt: run.turnAt } : {}),
|
|
2190
|
+
...(run.progressAt !== undefined ? { progressAt: run.progressAt } : {}), progress,
|
|
2176
2191
|
build: run.build ? { version: run.build.version, sha: run.build.sha, source: run.build.source } : null,
|
|
2177
2192
|
installed: run.installed, stale: run.stale, staleReason: run.staleReason,
|
|
2178
2193
|
})
|
|
@@ -2193,6 +2208,29 @@ function formatRunBuild(run: PtyRunStateView): string {
|
|
|
2193
2208
|
return run.build ? `${run.build.version}@${shortSha(run.build.sha)}(${run.build.source})` : 'unknown';
|
|
2194
2209
|
}
|
|
2195
2210
|
|
|
2211
|
+
// ── SURVIVAL-PROGRESS-CLOCK — «마지막 진전 시각» 판정을 state/list 에 싣고 전환을 한 번만 관측한다 ──
|
|
2212
|
+
const SURVIVAL_EVENT_OF: Record<'stalled' | 'abort-ignored' | 'slow', 'stall-detected' | 'abort-ignored' | 'slow-turn'> = {
|
|
2213
|
+
stalled: 'stall-detected',
|
|
2214
|
+
'abort-ignored': 'abort-ignored',
|
|
2215
|
+
slow: 'slow-turn',
|
|
2216
|
+
};
|
|
2217
|
+
const lastSurvivalJudgmentByPtyId = new Map<string, TurnProgressJudgment>();
|
|
2218
|
+
|
|
2219
|
+
/** 판정이 stalled·abort-ignored·slow 로 «바뀔 때» `tui.survival` 관측을 전환마다 한 번만 남긴다(같은 값이면 조용히). */
|
|
2220
|
+
function noteTurnProgressSurvival(ptyId: string, judgment: TurnProgressJudgment, fields: { turnAt?: number; progressAt?: number; now: number }): void {
|
|
2221
|
+
if (lastSurvivalJudgmentByPtyId.get(ptyId) === judgment) return;
|
|
2222
|
+
lastSurvivalJudgmentByPtyId.set(ptyId, judgment);
|
|
2223
|
+
const event = SURVIVAL_EVENT_OF[judgment as keyof typeof SURVIVAL_EVENT_OF];
|
|
2224
|
+
if (!event) return;
|
|
2225
|
+
const since = fields.progressAt ?? fields.turnAt;
|
|
2226
|
+
debug.log('tui.survival', event, {
|
|
2227
|
+
ptyId,
|
|
2228
|
+
turnAt: fields.turnAt ?? null,
|
|
2229
|
+
progressAt: fields.progressAt ?? null,
|
|
2230
|
+
elapsedMs: since !== undefined ? Math.max(0, fields.now - since) : null,
|
|
2231
|
+
});
|
|
2232
|
+
}
|
|
2233
|
+
|
|
2196
2234
|
/** `pty list` 한 칸 — 판을 적는 행(TUI)만. `run=<sha>` · 낡았으면 `,stale` · 옛 행 추정은 `run=?,stale`. */
|
|
2197
2235
|
function formatListRunColumn(row: PtyManifestRow | undefined, deps: PtyTakeoverCommandDeps, installed: () => InstalledRecord): string {
|
|
2198
2236
|
// 설치본 판독기가 없는 구성(시험 deps)은 이 칸을 안 낸다 — 기계마다 다른 값이 목록에 새지 않게.
|
|
@@ -2294,6 +2332,20 @@ export async function runPtyRename(ref: string, name: string, deps: PtyTakeoverC
|
|
|
2294
2332
|
const renamed = (deps.renameLocal ?? renamePty)(id, nickname);
|
|
2295
2333
|
return mapResult('rename', id, renamed ? { status: 'success' } : { status: 'unknown-pty' }, deps, observed);
|
|
2296
2334
|
}
|
|
2335
|
+
/** `pty stop-turn` cancels the TUI's active turn through its owner; it never terminates the PTY process. */
|
|
2336
|
+
export async function runPtyStopTurn(ref: string, actor: PtyWriteActor, actorIdentity: string, reason: string, deps: PtyTakeoverCommandDeps = liveDeps): Promise<PtyTakeoverCommandResult> {
|
|
2337
|
+
const identity = actorIdentity.trim();
|
|
2338
|
+
const why = reason.trim();
|
|
2339
|
+
if (!identity) return { exitCode: 2, message: 'pty stop-turn: --actor-id must not be empty' };
|
|
2340
|
+
if (!why) return { exitCode: 2, message: 'pty stop-turn: --reason must not be empty' };
|
|
2341
|
+
const refResult = resolveId(ref, 'stop-turn', deps); if (typeof refResult !== 'string') return refResult;
|
|
2342
|
+
const id = refResult;
|
|
2343
|
+
// A standalone CLI may not inherit a TUI run id. Mint one for this caller; inherited identity is retained so the
|
|
2344
|
+
// owner still rejects a request from the same run as the target turn.
|
|
2345
|
+
ensureRunId();
|
|
2346
|
+
const request = { force: true as const, actorIdentity: identity, reason: why };
|
|
2347
|
+
return mapResult('stop-turn', id, await deps.requestRemote(id, 'stop-turn', request, { actor }), deps, { ...request, actor });
|
|
2348
|
+
}
|
|
2297
2349
|
export function registerPtyTakeoverCommands(program: Command, deps: PtyTakeoverCommandDeps = liveDeps, toolInstallDeps: ToolInstallDeps = {}): void {
|
|
2298
2350
|
const pty = program.command('pty').description(
|
|
2299
2351
|
// ⭐ `<ref>` = id · nickname · unique prefix — **ref 를 받는 하위명령**이 resolvePtyRef 로 해석한다(`list` 는 인자 없음).
|
|
@@ -2369,6 +2421,14 @@ export function registerPtyTakeoverCommands(program: Command, deps: PtyTakeoverC
|
|
|
2369
2421
|
pty.command('takeover <ref>').description('Request human write ownership through the PTY arbiter').action((id: string) => run(() => runPtyTakeover(id, deps)));
|
|
2370
2422
|
registerPtyAttachDriveCommand(pty, run);
|
|
2371
2423
|
pty.command('release <ref>').description('Return human-owned PTY control to its prior mode').action((id: string) => run(() => runPtyRelease(id, deps)));
|
|
2424
|
+
pty.command('stop-turn <ref>').requiredOption('--force', 'cancel the active turn and its child work without terminating the PTY')
|
|
2425
|
+
.requiredOption('--actor <who>', 'actor type: human or agent').requiredOption('--actor-id <identity>', 'named requesting actor, such as OP or CEO')
|
|
2426
|
+
.requiredOption('--reason <reason>', 'why this turn must be force-stopped').description('Force-stop an active TUI turn').action((id: string, opts: { actor: string; actorId: string; reason: string }) => {
|
|
2427
|
+
const actor = parsePtyWriteActor(opts.actor);
|
|
2428
|
+
return run(() => actor
|
|
2429
|
+
? runPtyStopTurn(id, actor, opts.actorId, opts.reason, deps)
|
|
2430
|
+
: Promise.resolve({ exitCode: 2, message: `pty stop-turn: --actor must be 'human' or 'agent' (got ${opts.actor})` }));
|
|
2431
|
+
});
|
|
2372
2432
|
pty.command('state <ref>').option('--json', 'emit the classified frame state as JSON')
|
|
2373
2433
|
.description('Classify the current PTY screen state').action((id: string, opts: { json?: boolean }) => run(() => runPtyState(id, deps, opts.json === true)));
|
|
2374
2434
|
pty.command('wait <ref>').requiredOption('--until <state>', 'wait until idle, working, blocked, waiting, or done')
|
package/src/cli/release-cli.ts
CHANGED
|
@@ -56,6 +56,7 @@ import { defaultReleaseGraphRunsRoot, formatPublishProposal, measurePublishWindo
|
|
|
56
56
|
import { autoStartScheduledRelease, type AutoStartDeferral } from '../release-loop/auto-start.js';
|
|
57
57
|
import { runRehearsalTick, type RehearsalDeps } from '../release-loop/rehearsal.js';
|
|
58
58
|
import { landingFreezeMessage, LandingFrozenError, readLandingFreeze } from '../release-loop/landing-freeze.js';
|
|
59
|
+
import { gateShardLedgerPath, latestGateShardLedger, readGateShardLedger } from '../release-loop/gate-shard-ledger.js';
|
|
59
60
|
import { formatLightRc, runLightRc, type LightRcDeps } from '../release-loop/light-rc.js';
|
|
60
61
|
import { applyWatchList, formatGateHistory, gateHistory, ghMergedPrs } from '../../scripts/release-loop/gate-history.js';
|
|
61
62
|
import { registerRfcCommands } from './rfc-cli.js';
|
|
@@ -609,6 +610,19 @@ function compareReleaseVersions(a: string, b: string): number {
|
|
|
609
610
|
export function registerReleaseCommands(program: Command, releaseRunDeps: UnattendedReleaseDeps = {}, landedDeps: LandedButYellowDeps = {}, hqDeps: HqDeps = {}, lightRcDeps: LightRcDeps = {}, rehearsalDeps: RehearsalDeps = {}, resumeDeps: RecoverReleaseDeps = {}, checklistEvidenceReader?: ChecklistEvidenceReader): void {
|
|
610
611
|
registerRfcCommands(program);
|
|
611
612
|
const release = program.command('release').description('공개 배포 한 판 — prepare(로컬) → publish(--yes) → verify (docs/manual/MANUAL-versioning-and-release-2026-09-25.md)');
|
|
613
|
+
release.command('gate-shards').description('실행 중에도 읽는 게이트 조각 원장(시도·귀속·증거)')
|
|
614
|
+
.requiredOption('--version <v>', '조회할 판').option('--all', '과거 전이와 재시도까지 조회').option('--json', '결과 JSON')
|
|
615
|
+
.action((o: { version: string; all?: boolean; json?: boolean }) => {
|
|
616
|
+
const path = gateShardLedgerPath(o.version, releaseRunDeps.ledgerRoot ?? releaseLedgerRoot());
|
|
617
|
+
const ledger = readGateShardLedger(path);
|
|
618
|
+
if (!ledger) throw new CliUserError(`게이트 조각 원장 없음: ${o.version}`, '게이트가 시작되면 다시 조회하세요.');
|
|
619
|
+
const rows = o.all ? ledger.rows : latestGateShardLedger(ledger.rows);
|
|
620
|
+
if (o.json) console.log(JSON.stringify({ version: o.version, path, malformed: ledger.malformed, rows }));
|
|
621
|
+
else {
|
|
622
|
+
console.log(`${o.version} 조각 ${rows.length} · 읽지 못한 행 ${ledger.malformed} · ${path}`);
|
|
623
|
+
for (const row of rows) console.log(`${row.phase}/${row.shardId} ${row.state} ${row.host ?? '?'} rc=${row.rc ?? '?'} ${row.ran ?? '?'}시험 · 실패 ${row.failureIds?.length ?? '?'} · 귀속 ${row.attribution} · ${row.files.length}파일${row.stopReason ? ` · ${row.stopReason}` : ''}`);
|
|
624
|
+
}
|
|
625
|
+
});
|
|
612
626
|
const schedule = release.command('schedule').description('판별 컷·착지 마감 조회·갱신');
|
|
613
627
|
const scheduleLedgerRoot = () => releaseRunDeps.ledgerRoot ?? releaseLedgerRoot();
|
|
614
628
|
const ledgerFenceDeps = (): HqDeps => getElanousConfigDirOverride() && !hqDeps.store && !getUserConfig().hq?.arbiter
|
|
@@ -1298,10 +1312,13 @@ export function registerReleaseCommands(program: Command, releaseRunDeps: Unatte
|
|
|
1298
1312
|
.option('--gate-executor <pod|host>', '다시 도는 gate 의 실행기 전환(--from gate 이전만) — 런 입력에 기록 · 면제 아님')
|
|
1299
1313
|
.option('--gate-host <ssh-host>', '--gate-executor host 의 SSH 호스트(기본 저장된 런 입력 gateRemote)')
|
|
1300
1314
|
.option('--gate-pod-pool <pool>', '다시 도는 gate 의 Pod 풀을 전환(--from gate 이전만) — 런 입력에 기록')
|
|
1315
|
+
.option('--reroute-shard <pod-N|auto>', '같은 컷의 조각 한 개를 새로 측정하고 나머지 완전 영수증은 승계(--from gate)')
|
|
1316
|
+
.option('--shard-host <pool-context>', '재지정 조각의 호스트 수동 지정(생략 시 가용 능력 기반 배치)')
|
|
1317
|
+
.option('--shard-os <darwin|linux>', '재지정 pod-N 조각에 필요한 OS 능력')
|
|
1301
1318
|
.option('--command-root <path>', '노드 명령을 실행할 컷 tip checkout(생략 시 현재 폴더)')
|
|
1302
1319
|
.option('--dry-run', '재개 preflight만 수행하고 런·상태 원장·시도 횟수는 변경하지 않는다')
|
|
1303
1320
|
.option('--json', '결과 한 줄 JSON(stdout)')
|
|
1304
|
-
.action(async (o: { run: string; from: string; partial?: boolean; waive?: string; reason?: string; acceptedRegressions?: string; gateExecutor?: string; gateHost?: string; gatePodPool?: string; commandRoot?: string; dryRun?: boolean; json?: boolean }) => {
|
|
1321
|
+
.action(async (o: { run: string; from: string; partial?: boolean; waive?: string; reason?: string; acceptedRegressions?: string; gateExecutor?: string; gateHost?: string; gatePodPool?: string; rerouteShard?: string; shardHost?: string; shardOs?: string; commandRoot?: string; dryRun?: boolean; json?: boolean }) => {
|
|
1305
1322
|
await jsonAction(o.json, async (log) => {
|
|
1306
1323
|
let acceptedRegressions: AcceptedRegression[] | undefined;
|
|
1307
1324
|
if (o.acceptedRegressions !== undefined) {
|
|
@@ -1312,13 +1329,18 @@ export function registerReleaseCommands(program: Command, releaseRunDeps: Unatte
|
|
|
1312
1329
|
throw new Error('acceptedRegressions must be an array of {id, note}');
|
|
1313
1330
|
}
|
|
1314
1331
|
}
|
|
1332
|
+
if (o.shardOs !== undefined && o.shardOs !== 'darwin' && o.shardOs !== 'linux') throw new Error('--shard-os must be darwin or linux');
|
|
1333
|
+
const shardOs = o.shardOs as 'darwin' | 'linux' | undefined;
|
|
1315
1334
|
const resumeOptions = { runId: o.run, from: o.from, partial: o.partial, commandRoot: o.commandRoot,
|
|
1316
1335
|
...(o.waive === undefined ? {} : { waive: o.waive }),
|
|
1317
1336
|
...(o.reason === undefined ? {} : { reason: o.reason }),
|
|
1318
1337
|
...(o.acceptedRegressions === undefined ? {} : { acceptedRegressions }),
|
|
1319
1338
|
...(o.gateExecutor === undefined ? {} : { gateExecutor: o.gateExecutor }),
|
|
1320
1339
|
...(o.gateHost === undefined ? {} : { gateHost: o.gateHost }),
|
|
1321
|
-
...(o.gatePodPool === undefined ? {} : { gatePodPool: o.gatePodPool })
|
|
1340
|
+
...(o.gatePodPool === undefined ? {} : { gatePodPool: o.gatePodPool }),
|
|
1341
|
+
...(o.rerouteShard === undefined ? {} : { rerouteShard: o.rerouteShard }),
|
|
1342
|
+
...(o.shardHost === undefined ? {} : { shardHost: o.shardHost }),
|
|
1343
|
+
...(shardOs === undefined ? {} : { shardOs }) };
|
|
1322
1344
|
if (o.dryRun) {
|
|
1323
1345
|
const plan = await planResumeReleaseRun(resumeOptions, { onSource: log });
|
|
1324
1346
|
const gate = plan.gatePlan.mode === 'not-run' ? 'gate 실행 없음'
|
|
@@ -1427,12 +1449,36 @@ export function registerReleaseCommands(program: Command, releaseRunDeps: Unatte
|
|
|
1427
1449
|
return { recovery: 'planned', ...plan };
|
|
1428
1450
|
}
|
|
1429
1451
|
if (!mayWriteLedger('release rehearsal recovery', false, ledgerRoot)) throw new Error('release rehearsal recovery: ledger write denied');
|
|
1430
|
-
const
|
|
1431
|
-
|
|
1432
|
-
|
|
1452
|
+
const schedules = listSchedules(ledgerRoot);
|
|
1453
|
+
if (schedules.length === 0) {
|
|
1454
|
+
const resumed = await resumeReleaseRun(resumeOptions, resumeDeps);
|
|
1455
|
+
log(`· 리허설 복구 완료 · run ${o.recoveryRun} · ${resumed.state.status} · gate에서 재개`);
|
|
1456
|
+
return { recovery: 'resumed', runId: o.recoveryRun, status: resumed.state.status, ...resumed };
|
|
1457
|
+
}
|
|
1433
1458
|
}
|
|
1434
1459
|
if (o.apply && !mayWriteLedger('release rehearsal tick', false, ledgerRoot)) throw new Error('release rehearsal tick: ledger write denied');
|
|
1435
|
-
const result = await runRehearsalTick({ apply: o.apply, checkout: o.checkout, shards: o.shards === undefined ? undefined : Number(o.shards), remote: o.remote, ledgerRoot },
|
|
1460
|
+
const result = await runRehearsalTick({ apply: o.apply, checkout: o.checkout, shards: o.shards === undefined ? undefined : Number(o.shards), remote: o.remote, recoveryRun: o.recoveryRun, ledgerRoot }, {
|
|
1461
|
+
...rehearsalDeps,
|
|
1462
|
+
resumeGate: rehearsalDeps.resumeGate ?? (async (runId, checkout) => {
|
|
1463
|
+
const resumed = await resumeReleaseRun({ runId, from: 'gate', commandRoot: checkout }, resumeDeps);
|
|
1464
|
+
const gate = resumed.state.nodes.find((node) => node.nodeId === 'gate');
|
|
1465
|
+
if (typeof gate?.output !== 'string') throw new Error('release resume --from gate produced no gate output');
|
|
1466
|
+
const outputLine = gate.output.split(/\r?\n/).filter((line) => line.trim().startsWith('{')).at(-1);
|
|
1467
|
+
if (!outputLine) throw new Error('release resume --from gate produced no JSON output');
|
|
1468
|
+
let parsed: Record<string, unknown>;
|
|
1469
|
+
try { parsed = JSON.parse(outputLine) as Record<string, unknown>; }
|
|
1470
|
+
catch { throw new Error('release resume --from gate produced invalid gate JSON'); }
|
|
1471
|
+
const startedAt = Date.parse(gate?.startedAt ?? '');
|
|
1472
|
+
const endedAt = Date.parse(gate?.endedAt ?? '');
|
|
1473
|
+
const summary = parsed.partialSummary as { files?: unknown } | undefined;
|
|
1474
|
+
if (!Number.isSafeInteger(summary?.files) || Number(summary!.files) < 0) throw new Error('release resume --from gate omitted measured partialSummary.files');
|
|
1475
|
+
if (!Number.isFinite(startedAt) || !Number.isFinite(endedAt) || endedAt < startedAt) throw new Error('release resume --from gate omitted valid gate timestamps');
|
|
1476
|
+
return { files: Number(summary!.files),
|
|
1477
|
+
durationMs: endedAt - startedAt,
|
|
1478
|
+
poolOverwriteApplied: (resumed.state.inputOverrides ?? []).some((item) => item.kind === 'gate-pod-pool'),
|
|
1479
|
+
ok: resumed.state.status === 'done' && parsed.outcome === 'ok' };
|
|
1480
|
+
}),
|
|
1481
|
+
});
|
|
1436
1482
|
log(`· 리허설 ${result.status}${'version' in result ? ` ${result.version}` : ''}${result.status === 'due' ? ` · 실행 ${result.run ?? '-'} · 건너뜀 ${result.supersede.join(', ') || '-'}` : ''}`);
|
|
1437
1483
|
for (const stamp of result.stamps ?? []) {
|
|
1438
1484
|
if (stamp.outcome === 'unmeasured' && !stamp.result && stamp.shardPlan && (stamp.shardPlan.testFiles === 0 || stamp.shardPlan.gatePlanShards === null))
|
package/src/cli/repo-cli.ts
CHANGED
|
@@ -6,6 +6,7 @@ import type { Command } from 'commander';
|
|
|
6
6
|
|
|
7
7
|
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
8
8
|
import { debug } from '../debug/log.js';
|
|
9
|
+
import { spawnWithOwnedStderr } from '../surface/child-process.js';
|
|
9
10
|
import { applyDesignDirection } from '../design/apply-direction.js';
|
|
10
11
|
import { createCustomSystemFromPalette, createCustomSystemFromUrl, unreadTokenCount } from '../design/custom-system-create.js';
|
|
11
12
|
import { libraryDir } from '../design/design-library.js';
|
|
@@ -731,7 +732,7 @@ export function registerRepoCommands(program: Command, overrides: RepoCliDeps =
|
|
|
731
732
|
// ⭐ stderr 는 «흘려 보낸다» — 채점기가 쪽마다 진행을 거기 적는다.
|
|
732
733
|
// 🩸 2026-09-14 7판 terra: 전 쪽 채점이 5분 넘게 «말없이» 돌자 감독자가 「진행 없음」으로 판정해 재작업을 걸었다.
|
|
733
734
|
// ⛔ 게다가 'pipe' 로 받고 «안 읽으면» 버퍼가 차는 순간 자식이 멈춘다.
|
|
734
|
-
const proc =
|
|
735
|
+
const proc = spawnWithOwnedStderr(['bun', join(scripts, script), ...args], { stdout: 'pipe' });
|
|
735
736
|
const out = await new Response(proc.stdout).text();
|
|
736
737
|
await proc.exited;
|
|
737
738
|
return { code: proc.exitCode ?? 1, out };
|