elanous 0.2.37 → 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/{8kITumG9GAZ1LwT9POrAR → HjeK7zONHfR7op1hKXp4k}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{1746.3563617ea64023a3.js → 1060.014f1f01a17aec26.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9151.a2c51e93f9156dae.js → 1281.d81877e35b9068f4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1350.59f40e39e02d91b1.js +1 -0
- 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/{3578.4e9f9948a9a6f2f4.js → 2047.8f23e210995d4548.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7424.c0fe2a595d4232b5.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/{4931.95cc6dbd230774ca.js → 2177.df8547f9d7215c4e.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6680.6a693c28aae4cd19.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/2499.02fbfd18126c10c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6252.240578f10952e091.js → 2522.f2766b76d22c8bdf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1262.a89bb27a5b2f844e.js → 2566.beaffc3a5e1fcd2e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/261.0d471e8aded799f3.js +226 -0
- 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/{2318-450e75d07605b8fe.js → 2774-719820e3f5b2a3eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4725-34bed25720cc326b.js → 2829-734fe8bf2eee7347.js} +1 -1
- 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/3330.7443183b7e6fdbdf.js +1 -0
- 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/3746-f80a78f220bf37b5.js +1 -0
- 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/{4337e36d.f42c3b391b3d8f20.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/{58edce7d.f1b0c72acf13b123.js → 409c787b.e48c5bec8ec10456.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +1 -0
- 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/{5046.7fd5cbd859299448.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/{2375.bf364c85dbb6f085.js → 4769.9fd582071301f382.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{de8446d3.31b73eb239fecd7b.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/{4383.18e5c54db3a22c88.js → 5383.bdfa5d886e39a826.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5436.fdf6fa8ae3e9588d.js +64 -0
- 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/{6745-5a63492933959dd9.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/{2283.edd9627b7bdfb546.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/{6819.be5c9c4d67f22922.js → 6749.0744ce6eb08d40e9.js} +16 -16
- 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/6908.06008c67f6380ea9.js +148 -0
- 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/6cc1d1d6.9a98dd4622f1afc6.js +1 -0
- 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/{2002-a43a3f380df873ec.js → 8272-025653884f9645d2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7867.e8725745ddd1d940.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/8639-92c11d069792429e.js +1 -0
- 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/{4313.76f232c304a15bde.js → 9175.2de5209a5ce6f68a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9184.45afbf44fec87574.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8c58d09b.e8724a299658d86f.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-ba957ff875a026a0.js +1 -0
- 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-3337c6a1328c2674.js → page-4edb8df90f4537ce.js} +1 -1
- 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-1e5da297557d2354.js → page-fca2e59a81744d9e.js} +1 -1
- 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-ac2c1e6169cfce57.js → page-139d722de1dcd6c1.js} +1 -1
- 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-c1c80e345fa9d6f5.js → page-ccde99f07aaf71f7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{d9815f84.4918f682a45a8502.js → b84cad00.594027ebe0531fe2.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{709a918c.4fd3b4e2a32cb4e3.js → ca3702f8.2913182e73889fa2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5f6af561-f90b7a67f4f75d13.js → d8de0de2-dd0f4ac8e5ab1832.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +1 -0
- 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/release/recipes.yaml +9 -0
- package/graphs/release/release-loop.yaml +26 -18
- package/graphs/video/explainer-line.yaml +4 -1
- package/package.json +1 -1
- package/scripts/ask-op-inbox-once.ts +17 -0
- package/scripts/brand/check.ts +13 -4
- package/scripts/dead-code/report.ts +169 -0
- package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
- package/scripts/gate-0226-failure-census.ts +39 -0
- package/scripts/intake-collect-telegram-saved-stage.ts +48 -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/provision-export-redactions.ts +15 -0
- package/scripts/public-copy-lint.ts +122 -0
- package/scripts/public-export.ts +77 -2
- package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
- package/scripts/ratchets/train-side-invariants.sh +7 -1
- package/scripts/release-loop/cut-branch.ts +61 -12
- package/scripts/release-loop/export-check-node.ts +21 -3
- package/scripts/release-loop/gate-node.ts +527 -60
- package/scripts/release-loop/gate-partial.ts +82 -3
- package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
- package/scripts/release-loop/gate-radius-live.ts +4 -2
- 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-cap.ts +2 -1
- package/scripts/release-loop/resume-release.ts +317 -13
- package/scripts/release-loop/resume.ts +61 -5
- package/scripts/release-loop/traffic-node.ts +12 -4
- package/scripts/release-loop/traffic-transition.ts +53 -13
- package/scripts/release-loop/version-node.ts +35 -5
- 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/scripts/ux-sim.ts +1 -1
- package/scripts/video-pipeline.ts +2 -2
- package/src/acp/core-turn-bridge.ts +14 -1
- 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/run-context.ts +1 -1
- 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 +78 -7
- 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/review-observation.ts +10 -0
- package/src/agent-substrate/self-review-cli.ts +419 -42
- 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 +156 -0
- package/src/auto-research/research-turn.ts +467 -0
- package/src/autopilot/agent-loop.ts +1 -1
- package/src/autopilot/discovery/doc-lint.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/bots/screen-probe.ts +1 -1
- package/src/budget/llm-cost.ts +44 -5
- package/src/budget/unified-usage.ts +17 -1
- package/src/capture/tui-self-report.ts +24 -2
- package/src/chat/index.ts +34 -7
- package/src/chat/tool-render/dispatch.ts +8 -1
- package/src/cli/agent-cli.ts +43 -8
- package/src/cli/guardian-cli.ts +3 -1
- package/src/cli/intake-cli.ts +70 -13
- package/src/cli/lesson-cli.ts +86 -10
- package/src/cli/log-event-names.ts +1 -0
- package/src/cli/pod-cli.ts +17 -2
- package/src/cli/pr-land-overlap-evidence.ts +38 -5
- package/src/cli/pr-land-refusal.ts +1 -1
- package/src/cli/pty-takeover-cli.ts +125 -12
- package/src/cli/release-checklist-read-cli.ts +5 -2
- package/src/cli/release-cli.ts +99 -15
- package/src/cli/repo-cli.ts +2 -1
- package/src/cli/review-carry.ts +77 -0
- package/src/cli/self-update.ts +1 -1
- package/src/cli/tasks-card-show.ts +31 -1
- package/src/cli/tasks-cli.ts +98 -32
- package/src/cli/tasks-read-cli.ts +13 -5
- package/src/context-bus/context-now.ts +86 -2
- package/src/control-plane/ledger.ts +21 -4
- package/src/core-turn/run-core-turn.ts +51 -3
- package/src/core-turn/run-goal-loop.ts +152 -8
- package/src/core-turn/types.ts +12 -0
- package/src/dashboard/chat/acp-chat.ts +2 -2
- package/src/dashboard/classic-sigquit.ts +16 -0
- package/src/dashboard/index.ts +339 -44
- 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/input/terminal-modal-router.ts +8 -159
- package/src/dashboard/side-basic-runtime.ts +61 -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 +22 -8
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
- package/src/dashboard/term-slash-runtime.ts +18 -18
- package/src/dashboard/turn-preamble.ts +30 -4
- package/src/domains/guardian-tick.ts +9 -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/git-fs/watcher.ts +27 -22
- package/src/git-fs/worktree.ts +19 -3
- package/src/graph-runner/graph-cli.ts +6 -4
- package/src/graph-runner/graph-grow.ts +37 -9
- package/src/graph-runner/runner.ts +48 -11
- 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 +112 -36
- 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/hq/fence-wrapper.ts +1 -1
- package/src/hq/transfer.ts +1 -1
- package/src/index.ts +60 -16
- package/src/input/external-input-queue.ts +10 -0
- package/src/intake-plane/collect-telegram-saved.ts +90 -6
- package/src/intake-plane/intake-to-tasks.ts +246 -3
- package/src/interactive-terminal-modal.ts +3 -0
- package/src/keybindings.ts +17 -22
- 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/provider-credentials.ts +1 -1
- package/src/llm-tool-schema.ts +20 -0
- package/src/llm.ts +486 -61
- package/src/loops/orchestrator/inbox-once.ts +28 -0
- package/src/loops/orchestrator/inbox.ts +130 -1
- package/src/loops/orchestrator/tick.ts +14 -3
- package/src/maturity/feature-maturity.ts +1 -0
- package/src/nexus/api/channel-ask-op.ts +96 -0
- package/src/nexus/api/discord-trigger-bot.ts +28 -1
- package/src/nexus/api/harness-api.ts +2 -1
- package/src/nexus/api/telegram-trigger-bot.ts +24 -0
- package/src/nexus/api/terminals.ts +28 -6
- package/src/patents/ledger.ts +18 -1
- package/src/preview/terminal.ts +4 -2
- package/src/prompt-cache/anthropic.ts +2 -0
- package/src/prompt-enhance/enhance.ts +5 -0
- package/src/pty/snapshot.py +132 -0
- package/src/pty-shell/pty-control-ipc.ts +29 -2
- package/src/pty-shell/pty-manifest.ts +75 -5
- 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/gate-shards.ts +61 -0
- package/src/release-loop/light-rc.ts +7 -4
- 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 +28 -1
- package/src/repl/index.ts +10 -0
- package/src/research/axis-fanout.ts +133 -0
- package/src/research/edge-decision.ts +197 -0
- 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/output-router.ts +127 -0
- package/src/research/plugin-discovery.ts +242 -0
- package/src/research-bridge/format.ts +16 -1
- package/src/research-bridge/index.ts +1 -0
- package/src/research-bridge/invoke.ts +45 -7
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +34 -106
- package/src/self-dev/decompose.ts +45 -9
- package/src/self-dev/dev-cli.ts +2 -0
- package/src/self-dev/dev-pipeline.ts +8 -4
- package/src/self-dev/draft-residue.ts +221 -2
- package/src/self-dev/draft-sweep.ts +29 -16
- 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/orchestrate.ts +1 -0
- package/src/self-dev/run-supervisor.ts +41 -7
- package/src/self-dev/shard-run.ts +260 -3
- package/src/self-implement/comment-only-source.ts +54 -0
- package/src/self-implement/device-first.ts +8 -2
- package/src/self-implement/doctor-visit.ts +100 -57
- package/src/self-implement/gate-artifacts.ts +5 -2
- package/src/self-implement/gate-baseline.ts +119 -13
- package/src/self-implement/gate-cli.ts +466 -93
- package/src/self-implement/gate-failure-signature.ts +44 -0
- package/src/self-implement/gate-receipt-registry.ts +180 -0
- package/src/self-implement/gate-remote.ts +147 -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 +82 -7
- package/src/self-implement/goal-doc/section.ts +22 -0
- package/src/self-implement/goal-supervisor-fill.ts +38 -4
- 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 +301 -9
- package/src/self-implement/l8-merge-queue.ts +198 -32
- package/src/self-implement/off-diff-evidence.ts +147 -0
- package/src/self-implement/orchestrator.ts +137 -16
- package/src/self-implement/pod-inplace-worktree.ts +82 -0
- package/src/self-implement/pod-warm-pool-profile.ts +2 -2
- package/src/self-implement/premise-review.ts +7 -5
- package/src/self-implement/run-ledger.ts +304 -8
- package/src/self-implement/run-stop.ts +12 -0
- package/src/self-implement/seams.ts +39 -13
- package/src/self-implement/self-implement-cli.ts +30 -4
- package/src/session/channel-ask-op-envelope.ts +36 -0
- package/src/session/channel-op-reply-route.ts +200 -0
- package/src/session/chat.ts +92 -15
- package/src/session/index.ts +2 -0
- package/src/session-runtime/index.ts +9 -22
- 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/runner.ts +7 -3
- package/src/skills/tools/dev-harness.ts +2 -2
- package/src/skills/tools/schedule-wakeup.ts +24 -7
- package/src/skills/tools/shell.ts +51 -5
- package/src/status/bar.ts +3 -3
- package/src/steward/directive-audit.ts +354 -0
- package/src/storage/file-lock.ts +17 -4
- package/src/surface/child-process.ts +31 -0
- package/src/surface/tui-stderr-owner.ts +48 -0
- package/src/task-agent/adopt-pr.ts +63 -2
- package/src/task-agent/cover.ts +30 -12
- package/src/task-agent/evidence-command-normalize.ts +42 -0
- package/src/task-agent/export-redactions-provision.ts +43 -0
- package/src/task-agent/judge.ts +56 -0
- package/src/task-agent/parent-host.ts +59 -12
- 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 +68 -9
- package/src/task-agent/repair-worker.ts +37 -1
- package/src/task-agent/task-hand.ts +226 -33
- package/src/task-agent/tier-split.ts +142 -24
- 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 +57 -5
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
- package/src/task-orchestrator/surfaces/pod-pool.ts +27 -4
- 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 +310 -79
- package/src/task-orchestrator/surfaces/self-implement.ts +33 -2
- package/src/terminal/session-registry.ts +1 -0
- package/src/terminal/terminal-modal-router.ts +156 -0
- package/src/tool-hints/gate.ts +6 -4
- package/src/tool-hints/signals.ts +33 -1
- package/src/tool-runtime/skill-exec-runtime.ts +95 -5
- package/src/tui/chat/background-job-status.ts +8 -2
- package/src/tui/entry.ts +483 -32
- package/src/tui/inline-choice.ts +188 -0
- package/src/tui/sidetab/attach.ts +304 -0
- package/src/tui/sidetab/list.ts +2 -0
- package/src/tui/sidetab/nl-tool.ts +136 -0
- package/src/tui/slash/resume-command.ts +23 -0
- package/src/tui/slash/resume.ts +3 -23
- package/src/tui/slash/term-next.ts +2 -1
- package/src/tui/slash/term.ts +12 -1
- package/src/tui-client/dashboard-session.ts +7 -1
- package/src/tui-client/local-chat-turn.ts +29 -8
- package/src/user-config.ts +42 -3
- 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/fake-llm.ts +11 -5
- 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 +61 -14
- 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/1041-5841aae848fb6403.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1224.2ceca6c180d5130b.js +0 -62
- package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +0 -32
- package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2479-fe7e188bd9402d14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +0 -148
- package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +0 -27
- package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3199.6a1a9b0e6cd01dc6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4036.d54e55e1ebf5acdc.js +0 -90
- package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +0 -226
- package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +0 -287
- package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +0 -24
- package/apps/pwa/out/_next/static/chunks/4937-28d437999b77c9dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +0 -104
- package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +0 -1
- package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5952.294fc574a8625184.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +0 -74
- package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +0 -149
- package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +0 -41
- package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +0 -1
- package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/757-4fbaf50942b8c424.js +0 -1
- package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7c5ed21f-f286708e57cf88f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +0 -8
- package/apps/pwa/out/_next/static/chunks/8080-40d781e7704d3671.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +0 -77
- package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +0 -1
- package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +0 -286
- package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +0 -79
- package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +0 -1
- package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +0 -94
- package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +0 -1
- package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +0 -64
- package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-5c112c6d7c33656e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-88a1edbff62eaf1d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-b9af2ac1c4737ce8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-fb9e639c107f5f72.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +0 -1
- package/scripts/migrate-monad-to-elanous.ts +0 -195
- package/scripts/rebrand-elanous.ts +0 -242
- /package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → HjeK7zONHfR7op1hKXp4k}/_ssgManifest.js +0 -0
|
@@ -9,6 +9,7 @@ export { SUPERVISOR_STOP_REASONS } from './run-types.js';
|
|
|
9
9
|
import { recordSelfDevRunSupervisorStop, selfDevRunsDir } from './run-store.js';
|
|
10
10
|
import { debug } from '../debug/log.js';
|
|
11
11
|
import { sweepFrozenMerges } from '../self-implement/frozen-merges.js';
|
|
12
|
+
import { selectKnowhowPack } from '../self-implement/knowhow-pack.js';
|
|
12
13
|
import { routeSupervisorVerdict } from './supervisor-verdict-edges.js';
|
|
13
14
|
import type { TaskAgentShadowInput } from '../task-agent/shadow.js';
|
|
14
15
|
import { cardPrNumber, taskAgentStatePath } from '../task-agent/task-hand.js';
|
|
@@ -101,6 +102,10 @@ export interface SupervisorDecision {
|
|
|
101
102
|
action: 'relaunch' | 'add-repair-task' | 'stop';
|
|
102
103
|
stopReason?: SupervisorStopReason;
|
|
103
104
|
why: string;
|
|
105
|
+
/** Repository lessons pulled at this decision, never appended to a child's goal. */
|
|
106
|
+
knowhowPackSliceIds?: string[];
|
|
107
|
+
/** Bounded reference for the supervisor handoff. It is evidence, not an executable child instruction. */
|
|
108
|
+
knowhowPackReference?: string;
|
|
104
109
|
round: number;
|
|
105
110
|
rerunnable: string[];
|
|
106
111
|
reworkable: string[];
|
|
@@ -374,6 +379,21 @@ export function decideNextRun(input: {
|
|
|
374
379
|
const deployFindings = input.deployFindings === undefined ? undefined
|
|
375
380
|
: new Map([...input.deployFindings].filter(([taskId]) => !handedOffIds.has(taskId)));
|
|
376
381
|
const t = triageRun(activeResults, deployFindings, observation === 'failed', undefined, mainSyncRelaunchSpent(history));
|
|
382
|
+
const revisionUnobserved = activeResults.filter((result) => result.harvestable === true && !!result.branch
|
|
383
|
+
&& result.goalPlanRevision?.status !== 'read');
|
|
384
|
+
const revisionUnobservedIds = new Set(revisionUnobserved.map((result) => result.taskId));
|
|
385
|
+
for (const classification of t.classifications) {
|
|
386
|
+
if (classification.kind !== 'main-sync-blocked' || classification.action !== 'relaunch-on-main'
|
|
387
|
+
|| !revisionUnobservedIds.has(classification.taskId)) continue;
|
|
388
|
+
// Keep history's «already spent» predicate separate from this independent safety block.
|
|
389
|
+
classification.action = 'needs-human';
|
|
390
|
+
t.relaunchOnMain = t.relaunchOnMain.filter((taskId) => taskId !== classification.taskId);
|
|
391
|
+
if (!t.needsHuman.includes(classification.taskId)) t.needsHuman.push(classification.taskId);
|
|
392
|
+
}
|
|
393
|
+
t.actionable = countActionable(t) > 0;
|
|
394
|
+
const revisionHoldNote = revisionUnobserved.length > 0
|
|
395
|
+
? ` · 골 개정 관측 미확인 — 같은 골 재발사 보류(${revisionUnobserved.map((result) => result.taskId).join(', ')})`
|
|
396
|
+
: '';
|
|
377
397
|
const relaunchGoals: Record<string, string> = Object.fromEntries(activeResults.flatMap((result) =>
|
|
378
398
|
t.relaunchOnMain.includes(result.taskId) && result.branch
|
|
379
399
|
? [[result.taskId, mainSyncRelaunchGoal(result.feature, result.branch)]] : []));
|
|
@@ -438,7 +458,7 @@ export function decideNextRun(input: {
|
|
|
438
458
|
...base,
|
|
439
459
|
action: 'stop',
|
|
440
460
|
stopReason: 'harvestable-awaiting-human',
|
|
441
|
-
why: withGoalPlanRevisionObservation(`구현 완료 · 수확 대기 — ${harvestable.map((result) => result.branch).join(' · ')}`)
|
|
461
|
+
why: `${withGoalPlanRevisionObservation(`구현 완료 · 수확 대기 — ${harvestable.map((result) => result.branch).join(' · ')}`)}${revisionHoldNote}`,
|
|
442
462
|
};
|
|
443
463
|
}
|
|
444
464
|
|
|
@@ -604,7 +624,7 @@ export function decideNextRun(input: {
|
|
|
604
624
|
...base,
|
|
605
625
|
action: 'stop',
|
|
606
626
|
stopReason: 'no-progress',
|
|
607
|
-
why: withNoProgressGoalPlanRevisionObservation(`${stallRounds}라운드 연속 제자리 — base=${completionBase ?? 'main'} 기준 완료 ${baseCompleted} · 착지 ${landed} · 남은 조각도 안 줄었다(${actionable}). 골·불변식을 의심할 자리`)
|
|
627
|
+
why: `${withNoProgressGoalPlanRevisionObservation(`${stallRounds}라운드 연속 제자리 — base=${completionBase ?? 'main'} 기준 완료 ${baseCompleted} · 착지 ${landed} · 남은 조각도 안 줄었다(${actionable}). 골·불변식을 의심할 자리`)}${revisionHoldNote}`,
|
|
608
628
|
};
|
|
609
629
|
}
|
|
610
630
|
}
|
|
@@ -733,10 +753,10 @@ export function decideNextRun(input: {
|
|
|
733
753
|
...(action === 'add-repair-task' && held.length ? { heldTaskIds: held } : {}) },
|
|
734
754
|
pendingDecision: 'attempt-care-escalation',
|
|
735
755
|
why: fresh.length === 0
|
|
736
|
-
? `리뷰 진동 반복 — ${signatureOf(oscillating)} · 사람 결정 필요(같은 전략 재발사 금지)${heldReasonSuffix}`
|
|
756
|
+
? `리뷰 진동 반복 — ${signatureOf(oscillating)} · 사람 결정 필요(같은 전략 재발사 금지)${heldReasonSuffix}${revisionHoldNote}`
|
|
737
757
|
: cannotRepair
|
|
738
|
-
? `리뷰 진동 — ${signatureOf(oscillating)} · ${input.repairGoalExecution === false ? '이 감독 경로가 수리 골 실행을 선언하지 않았다(미선언 또는 불가)' : '수리 원문/PR 관측 불가'} · 사람 결정 필요(같은 전략 재발사 금지)${heldReasonSuffix}`
|
|
739
|
-
: `리뷰 진동 — ${signatureOf(fresh)} · review-oscillation 수리 조각을 한 번 붙인다${input.repairGoalExecution === true ? '' : '(실행 배선 미선언 — 결정 칸만)'}${repairedHeld.length ? ` · 이미 수리한 조각 ${repairedHeld.join(', ')} 은 사람 결정 대기` : ''}${classHeld.length ? ` · 분류로 보류한 조각 ${classHeld.join(', ')}` : ''}${heldReasonSuffix}`,
|
|
758
|
+
? `리뷰 진동 — ${signatureOf(oscillating)} · ${input.repairGoalExecution === false ? '이 감독 경로가 수리 골 실행을 선언하지 않았다(미선언 또는 불가)' : '수리 원문/PR 관측 불가'} · 사람 결정 필요(같은 전략 재발사 금지)${heldReasonSuffix}${revisionHoldNote}`
|
|
759
|
+
: `리뷰 진동 — ${signatureOf(fresh)} · review-oscillation 수리 조각을 한 번 붙인다${input.repairGoalExecution === true ? '' : '(실행 배선 미선언 — 결정 칸만)'}${repairedHeld.length ? ` · 이미 수리한 조각 ${repairedHeld.join(', ')} 은 사람 결정 대기` : ''}${classHeld.length ? ` · 분류로 보류한 조각 ${classHeld.join(', ')}` : ''}${heldReasonSuffix}${revisionHoldNote}`,
|
|
740
760
|
};
|
|
741
761
|
}
|
|
742
762
|
|
|
@@ -746,14 +766,14 @@ export function decideNextRun(input: {
|
|
|
746
766
|
return {
|
|
747
767
|
...base,
|
|
748
768
|
action: 'add-repair-task',
|
|
749
|
-
why: `수리 조각을 붙인다 — 수리 ${t.repairable.length} · 그대로 재실행 ${t.rerunnable.length} · 재작업 ${t.reworkable.length} · 분해 ${t.decomposable.length} · 라운드 ${round + 1}/${maxRounds}`,
|
|
769
|
+
why: `수리 조각을 붙인다 — 수리 ${t.repairable.length} · 그대로 재실행 ${t.rerunnable.length} · 재작업 ${t.reworkable.length} · 분해 ${t.decomposable.length} · 라운드 ${round + 1}/${maxRounds}${revisionHoldNote}`,
|
|
750
770
|
};
|
|
751
771
|
}
|
|
752
772
|
|
|
753
773
|
return {
|
|
754
774
|
...base,
|
|
755
775
|
action: 'relaunch',
|
|
756
|
-
why: `다시 건다 — 그대로 재실행 ${t.rerunnable.length} · 재작업 ${t.reworkable.length} · 분해 ${t.decomposable.length} · 수리 ${t.repairable.length}${t.relaunchOnMain.length > 0 ? ` · main 위 재발사 ${t.relaunchOnMain.length}` : ''} · 라운드 ${round + 1}/${maxRounds}`,
|
|
776
|
+
why: `다시 건다 — 그대로 재실행 ${t.rerunnable.length} · 재작업 ${t.reworkable.length} · 분해 ${t.decomposable.length} · 수리 ${t.repairable.length}${t.relaunchOnMain.length > 0 ? ` · main 위 재발사 ${t.relaunchOnMain.length}` : ''} · 라운드 ${round + 1}/${maxRounds}${revisionHoldNote}`,
|
|
757
777
|
};
|
|
758
778
|
}
|
|
759
779
|
|
|
@@ -1012,6 +1032,8 @@ export function patternMineSignaturesFromDecision(decision: SupervisorDecision):
|
|
|
1012
1032
|
|
|
1013
1033
|
export interface SuperviseRunOptions {
|
|
1014
1034
|
initial: readonly SupervisorJobResult[];
|
|
1035
|
+
/** Stable repository source for decision-time knowhow; falls back to a result worktree if omitted. */
|
|
1036
|
+
knowhowRepo?: string;
|
|
1015
1037
|
rerun: (previous: readonly SupervisorJobResult[], invocation: { relaunch: true; repairGoals?: Record<string, string> }) => Promise<readonly SupervisorJobResult[]>;
|
|
1016
1038
|
limits?: SupervisorLimits;
|
|
1017
1039
|
enrich?: (results: readonly SupervisorJobResult[]) => readonly SupervisorJobResult[];
|
|
@@ -1132,6 +1154,18 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
1132
1154
|
} : {}),
|
|
1133
1155
|
});
|
|
1134
1156
|
|
|
1157
|
+
// The supervisor consumes knowhow when it judges a failed piece. Keep the child prompt untouched.
|
|
1158
|
+
const failedPiece = results.find((result) => result.status === 'failed' && result.feature.trim());
|
|
1159
|
+
if (failedPiece) {
|
|
1160
|
+
const repo = opts.knowhowRepo ?? failedPiece.worktreePath;
|
|
1161
|
+
if (repo) {
|
|
1162
|
+
const pulled = selectKnowhowPack(repo, failedPiece.feature);
|
|
1163
|
+
try { opts.observe?.('knowhow-pack-decision', { taskId: failedPiece.taskId, ids: pulled.ids, reason: pulled.reason, action: decision.action }); } catch { /* fail-soft */ }
|
|
1164
|
+
if (pulled.ids.length) decision = { ...decision, knowhowPackSliceIds: pulled.ids, knowhowPackReference: pulled.text,
|
|
1165
|
+
why: `${decision.why} · 판단 참고 노하우 ${pulled.ids.join(',')}` };
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1135
1169
|
const runId = opts.runStore?.runId ?? results.find((result) => result.runId?.trim())?.runId ?? null;
|
|
1136
1170
|
|
|
1137
1171
|
let decomposePromotion: DecomposePromotionObservation = decision.decomposable.length === 0
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, statfsSync, statSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { availableParallelism, freemem, tmpdir } from 'node:os';
|
|
2
|
+
import { availableParallelism, freemem, loadavg, tmpdir, totalmem } from 'node:os';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { debug, redactSecretText } from '../debug/log.js';
|
|
5
5
|
import { prepareDeterministicChildEnvironment } from '../../scripts/lib/deterministic-env.js';
|
|
6
6
|
import { withGateTestEnv } from '../../scripts/lib/gate-test-env.js';
|
|
7
|
-
import { withBaselineWorktree } from '../self-implement/gate-baseline.js';
|
|
7
|
+
import { withBaselineWorktree, withBaselineWorktreeAsync } from '../self-implement/gate-baseline.js';
|
|
8
8
|
import { aggregateGateTestShards, type GateShardAttempt, type GateShardAggregate } from './shard-aggregate.js';
|
|
9
9
|
import { GateShardCapacityError, planFixedGateTestShards, planSelfGateSpawnSeparatedShards, type GateTestShard } from './shard-plan.js';
|
|
10
10
|
import { isGateSpawnLaneFile } from './spawn-lane-files.js';
|
|
@@ -27,6 +27,15 @@ export interface ShardRunResult {
|
|
|
27
27
|
unmeasuredByShard?: Record<string, string>;
|
|
28
28
|
/** git stderr tail (redacted · ≤2KB · one line) when the baseline worktree could not be added. */
|
|
29
29
|
baselineStderrTail?: string;
|
|
30
|
+
/** Effective live pool width and its host-load/memory decision, for gate artifacts and diagnosis. */
|
|
31
|
+
concurrency?: number;
|
|
32
|
+
concurrencyReason?: string;
|
|
33
|
+
/** Wall time spent in singleton RSS samples and current+baseline bundles, respectively. */
|
|
34
|
+
measurementMs?: number;
|
|
35
|
+
bundleMs?: number;
|
|
36
|
+
/** Sum of process wall times across bundles (overlaps under concurrency). */
|
|
37
|
+
currentProcessMs?: number;
|
|
38
|
+
baselineProcessMs?: number;
|
|
30
39
|
}
|
|
31
40
|
|
|
32
41
|
/** What a failed shard process leaves behind so «test failure vs runner error» can be told apart after the fact. */
|
|
@@ -50,9 +59,11 @@ export interface ShardRunMode {
|
|
|
50
59
|
/** OP FU — sorted round-robin into `count` shards, zero pre-measurement runs. Default off: the measured planner. */
|
|
51
60
|
fixedDistribution?: boolean;
|
|
52
61
|
/** Measured on the executing host; override only for deterministic planning tests. */
|
|
53
|
-
hostResources?: { cores: number; freeMemoryGiB: number; freeTmpGiB: number };
|
|
62
|
+
hostResources?: { cores: number; freeMemoryGiB: number; freeTmpGiB: number; load1?: number };
|
|
54
63
|
/** Observation after each bundle's first current+baseline attempt; never controls retries or verdict. */
|
|
55
64
|
onShardComplete?: (progress: ShardRunProgress) => void;
|
|
65
|
+
/** Maximum concurrently active shard bundles. The default is three, bounded to one through four. */
|
|
66
|
+
concurrency?: number;
|
|
56
67
|
}
|
|
57
68
|
|
|
58
69
|
export interface ShardRunProgress {
|
|
@@ -73,14 +84,37 @@ function hostResources(): ShardRunMode['hostResources'] | undefined {
|
|
|
73
84
|
const availableKiB = /^MemAvailable:\s+(\d+)\s+kB/m.exec(readFileSync('/proc/meminfo', 'utf8'))?.[1];
|
|
74
85
|
if (availableKiB) freeMemoryGiB = Number(availableKiB) / (1024 ** 2);
|
|
75
86
|
}
|
|
87
|
+
if (process.platform === 'darwin') {
|
|
88
|
+
// macOS freemem excludes reclaimable cache; node-b reported 5 GiB free of 512 GiB while
|
|
89
|
+
// memory_pressure reported 91% available. A freemem cap would silently serialize the gate.
|
|
90
|
+
const pressure = Bun.spawnSync(['memory_pressure', '-Q'], { stdout: 'pipe', stderr: 'ignore', timeout: 2_000 });
|
|
91
|
+
const percent = /System-wide memory free percentage:\s*(\d+(?:\.\d+)?)%/.exec(Buffer.from(pressure.stdout).toString('utf8'))?.[1];
|
|
92
|
+
if (pressure.exitCode === 0 && percent !== undefined && Number(percent) >= 0 && Number(percent) <= 100) {
|
|
93
|
+
freeMemoryGiB = totalmem() / (1024 ** 3) * Number(percent) / 100;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
76
96
|
return {
|
|
77
97
|
cores: availableParallelism(),
|
|
78
98
|
freeMemoryGiB,
|
|
79
99
|
freeTmpGiB: Number(tmp.bavail) * Number(tmp.bsize) / (1024 ** 3),
|
|
100
|
+
load1: loadavg()[0],
|
|
80
101
|
};
|
|
81
102
|
} catch { return undefined; }
|
|
82
103
|
}
|
|
83
104
|
|
|
105
|
+
/** A conservative snapshot taken before sampling. Explicit 1 preserves the old serial child order. */
|
|
106
|
+
export function resolveShardConcurrency(configured: number | undefined, resources: ShardRunMode['hostResources'], budgetGiB: number): { count: number; reason: string } {
|
|
107
|
+
if (!resources || !Number.isFinite(resources.cores) || resources.cores < 1) return { count: Math.max(1, Math.min(4, configured ?? 3)), reason: configured === undefined ? 'default; host load unavailable' : 'configured; host load unavailable' };
|
|
108
|
+
const loadRatio = Number.isFinite(resources.load1) ? resources.load1! / resources.cores : null;
|
|
109
|
+
const target = configured ?? (loadRatio !== null && loadRatio >= 0.8 ? 2
|
|
110
|
+
: loadRatio !== null && loadRatio <= 0.35 && resources.cores >= 8 ? 4 : 3);
|
|
111
|
+
const cpuCap = Math.max(1, Math.floor(resources.cores));
|
|
112
|
+
const memoryCap = Number.isFinite(resources.freeMemoryGiB) && Number.isFinite(budgetGiB) && budgetGiB > 0
|
|
113
|
+
? Math.max(1, Math.floor(resources.freeMemoryGiB / budgetGiB)) : 4;
|
|
114
|
+
const count = Math.max(1, Math.min(4, target, cpuCap, memoryCap));
|
|
115
|
+
return { count, reason: `${configured === undefined ? 'adaptive' : `configured ${configured}`} · host load/cores ${loadRatio === null ? '?' : loadRatio.toFixed(2)} · free ${resources.freeMemoryGiB.toFixed(1)} GiB · shard budget ${budgetGiB} GiB` };
|
|
116
|
+
}
|
|
117
|
+
|
|
84
118
|
/** One expansion slot needs one CPU, one shard memory budget, and 1 GiB of free tmp space.
|
|
85
119
|
* Explicitly requested shards remain the caller's choice; this only limits automatic growth. */
|
|
86
120
|
export function maxAutomaticShardCount(requested: number, budgetGiB: number, resources: ShardRunMode['hostResources']): number {
|
|
@@ -104,6 +138,7 @@ export type ShardProcess = (cwd: string, files: readonly string[]) => {
|
|
|
104
138
|
/** Present only when the process failed (exit≠0 · signal · no JUnit) — observation only, never part of the verdict. */
|
|
105
139
|
failure?: ShardFailureOutput;
|
|
106
140
|
};
|
|
141
|
+
export type AsyncShardProcess = (cwd: string, files: readonly string[]) => Promise<ReturnType<ShardProcess>>;
|
|
107
142
|
|
|
108
143
|
export const SHARD_FAILURE_TAIL_BYTES = 64 * 1024;
|
|
109
144
|
|
|
@@ -113,6 +148,29 @@ function outputTail(bytes: Uint8Array | undefined): string {
|
|
|
113
148
|
return redactSecretText(Buffer.from(tail).toString('utf8'));
|
|
114
149
|
}
|
|
115
150
|
|
|
151
|
+
/** Drain a child pipe without retaining its entire output. Diagnostics need the opening context and failure tail. */
|
|
152
|
+
async function boundedChildOutput(stream: ReadableStream<Uint8Array>, abort: AbortSignal): Promise<Uint8Array> {
|
|
153
|
+
const reader = stream.getReader();
|
|
154
|
+
const cancel = () => { void reader.cancel('child output drain timed out').catch(() => {}); };
|
|
155
|
+
abort.addEventListener('abort', cancel, { once: true });
|
|
156
|
+
const headLimit = 1024;
|
|
157
|
+
let head = new Uint8Array(0);
|
|
158
|
+
let tail = new Uint8Array(0);
|
|
159
|
+
let total = 0;
|
|
160
|
+
try {
|
|
161
|
+
for (;;) {
|
|
162
|
+
const { done, value } = await reader.read();
|
|
163
|
+
if (done) break;
|
|
164
|
+
total += value.byteLength;
|
|
165
|
+
if (head.byteLength < headLimit) head = Buffer.concat([head, value.subarray(0, headLimit - head.byteLength)]);
|
|
166
|
+
tail = value.byteLength >= SHARD_FAILURE_TAIL_BYTES
|
|
167
|
+
? value.slice(-SHARD_FAILURE_TAIL_BYTES)
|
|
168
|
+
: Buffer.concat([tail, value]).subarray(-SHARD_FAILURE_TAIL_BYTES);
|
|
169
|
+
}
|
|
170
|
+
} finally { abort.removeEventListener('abort', cancel); reader.releaseLock(); }
|
|
171
|
+
return total <= SHARD_FAILURE_TAIL_BYTES ? tail : Buffer.concat([head, tail]);
|
|
172
|
+
}
|
|
173
|
+
|
|
116
174
|
/** `<shardId>.failure.json` per failed shard (shard ids are already `shard-<n>`). Top level = the latest current-side
|
|
117
175
|
* failure (else the latest baseline one); `failures` keeps every failed side/attempt. Returns the written paths. */
|
|
118
176
|
export function writeShardFailureEvidence(dir: string, evidence: readonly ShardFailureEvidence[]): string[] {
|
|
@@ -321,6 +379,146 @@ function runPlannedShards(
|
|
|
321
379
|
};
|
|
322
380
|
}
|
|
323
381
|
|
|
382
|
+
/** Runs planned bundles concurrently while retaining plan order in attempts and aggregate evidence. */
|
|
383
|
+
export async function runShardedGateTestsAsync(
|
|
384
|
+
cwd: string,
|
|
385
|
+
files: readonly string[],
|
|
386
|
+
baseRef: string,
|
|
387
|
+
count = 2,
|
|
388
|
+
run: AsyncShardProcess = runBunShardAsync,
|
|
389
|
+
baselineWorktree: typeof withBaselineWorktreeAsync = withBaselineWorktreeAsync,
|
|
390
|
+
budgetGiB = 8,
|
|
391
|
+
mode: ShardRunMode = {},
|
|
392
|
+
measure: AsyncShardProcess = run,
|
|
393
|
+
): Promise<ShardRunResult> {
|
|
394
|
+
if (mode.concurrency !== undefined && (!Number.isSafeInteger(mode.concurrency) || mode.concurrency < 1 || mode.concurrency > 4)) throw new Error('invalid shard concurrency (expected 1–4)');
|
|
395
|
+
const resources = mode.hostResources ?? hostResources();
|
|
396
|
+
const selectedConcurrency = resolveShardConcurrency(mode.concurrency, resources, budgetGiB);
|
|
397
|
+
const concurrency = selectedConcurrency.count;
|
|
398
|
+
debug.log('self-dev.shard', 'concurrency', { concurrency, reason: selectedConcurrency.reason });
|
|
399
|
+
const measurementStartedAt = performance.now();
|
|
400
|
+
const samples = new Map<string, ReturnType<ShardProcess>>();
|
|
401
|
+
if (!mode.fixedDistribution) {
|
|
402
|
+
const unique = [...new Set(files)];
|
|
403
|
+
let nextSample = 0;
|
|
404
|
+
const sampleWorker = async () => {
|
|
405
|
+
for (;;) {
|
|
406
|
+
const index = nextSample++;
|
|
407
|
+
if (index >= unique.length) return;
|
|
408
|
+
const file = unique[index]!;
|
|
409
|
+
try { samples.set(file, await measure(cwd, [file])); }
|
|
410
|
+
catch (error) {
|
|
411
|
+
debug.log('self-dev.shard', 'rss-measurement-failed', { file, error: redactSecretText(String(error)).slice(0, 500) });
|
|
412
|
+
samples.set(file, { exitCode: null });
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
};
|
|
416
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, unique.length) }, () => sampleWorker()));
|
|
417
|
+
}
|
|
418
|
+
const measurementMs = Math.round(performance.now() - measurementStartedAt);
|
|
419
|
+
// Reuse the established measured/fixed planner and its host-cap fallback. The callback supplies a
|
|
420
|
+
// planning-only aggregate, so this phase never launches a shard or creates a baseline worktree.
|
|
421
|
+
const planningOnlyBaseline = (() => ({ status: 'passed' as const, retryShardIds: [] })) as unknown as typeof withBaselineWorktree;
|
|
422
|
+
const planned = runShardedGateTests(cwd, files, baseRef, count, (_cwd, selected) => samples.get(selected[0]!) ?? { exitCode: null },
|
|
423
|
+
planningOnlyBaseline, budgetGiB, { ...mode, ...(resources ? { hostResources: resources } : {}) });
|
|
424
|
+
if (planned.reason) return { ...planned, concurrency, concurrencyReason: selectedConcurrency.reason, measurementMs, bundleMs: 0 };
|
|
425
|
+
const shards = planned.shards;
|
|
426
|
+
const attempts: GateShardAttempt[] = [];
|
|
427
|
+
const failureEvidence: ShardFailureEvidence[] = [];
|
|
428
|
+
const bundlesStartedAt = performance.now();
|
|
429
|
+
let currentProcessMs = 0;
|
|
430
|
+
let baselineProcessMs = 0;
|
|
431
|
+
const baseline = await baselineWorktree(cwd, baseRef, async (dir) => {
|
|
432
|
+
const treeReadable = (() => { try { return statSync(dir).isDirectory(); } catch { return false; } })();
|
|
433
|
+
// Baseline membership is invariant for both rounds. Cache it before launching children.
|
|
434
|
+
const atBase = new Map(shards.map((shard) => [shard.id,
|
|
435
|
+
treeReadable ? shard.files.filter((file) => !absentAtBaseline(join(dir, file))) : [...shard.files]]));
|
|
436
|
+
const baselinePassCache = new Map<string, ReturnType<ShardProcess>>();
|
|
437
|
+
const totalFiles = new Set(shards.flatMap((shard) => shard.files)).size;
|
|
438
|
+
let completedShards = 0;
|
|
439
|
+
let completedFiles = 0;
|
|
440
|
+
let pending = shards;
|
|
441
|
+
for (let round = 1; round <= 2 && pending.length; round++) {
|
|
442
|
+
const roundAttempts = new Array<GateShardAttempt>(pending.length);
|
|
443
|
+
const roundEvidence = new Array<ShardFailureEvidence[]>(pending.length);
|
|
444
|
+
let next = 0;
|
|
445
|
+
const runSafely = async (location: string, selected: readonly string[]): Promise<ReturnType<ShardProcess>> => {
|
|
446
|
+
try { return await run(location, selected); }
|
|
447
|
+
catch (error) {
|
|
448
|
+
debug.log('self-dev.shard', 'bundle-runner-failed', { location, files: selected,
|
|
449
|
+
error: redactSecretText(String(error)).slice(0, 500) });
|
|
450
|
+
return { exitCode: null };
|
|
451
|
+
}
|
|
452
|
+
};
|
|
453
|
+
const worker = async () => {
|
|
454
|
+
for (;;) {
|
|
455
|
+
const index = next++;
|
|
456
|
+
if (index >= pending.length) return;
|
|
457
|
+
const shard = pending[index]!;
|
|
458
|
+
const baselineFiles = atBase.get(shard.id)!;
|
|
459
|
+
if (baselineFiles.length < shard.files.length) {
|
|
460
|
+
debug.log('self-dev.shard', 'baseline-files-absent', { shardId: shard.id, round,
|
|
461
|
+
absent: shard.files.filter((file) => !baselineFiles.includes(file)) });
|
|
462
|
+
}
|
|
463
|
+
const currentStartedAt = performance.now();
|
|
464
|
+
const current = await runSafely(cwd, shard.files);
|
|
465
|
+
currentProcessMs += performance.now() - currentStartedAt;
|
|
466
|
+
const cached = concurrency > 1 && round > 1 ? baselinePassCache.get(shard.id) : undefined;
|
|
467
|
+
if (cached) debug.log('self-dev.shard', 'baseline-cache-hit', { shardId: shard.id, round });
|
|
468
|
+
const baselineStartedAt = performance.now();
|
|
469
|
+
const base = cached ?? (baselineFiles.length ? await runSafely(dir, baselineFiles) : { exitCode: 0 });
|
|
470
|
+
baselineProcessMs += performance.now() - baselineStartedAt;
|
|
471
|
+
if (concurrency > 1 && baselineFiles.length && base.exitCode === 0 && !base.signal && base.junit) baselinePassCache.set(shard.id, base);
|
|
472
|
+
roundAttempts[index] = {
|
|
473
|
+
shardId: shard.id, attempt: round, currentJUnit: current.junit, baselineJUnit: base.junit,
|
|
474
|
+
currentExitCode: current.exitCode, baselineExitCode: base.exitCode,
|
|
475
|
+
currentSignal: current.signal, baselineSignal: base.signal,
|
|
476
|
+
currentDiagnostic: current.diagnostic, baselineDiagnostic: base.diagnostic,
|
|
477
|
+
baselineFiles, currentRoot: cwd, baselineRoot: dir,
|
|
478
|
+
};
|
|
479
|
+
roundEvidence[index] = [];
|
|
480
|
+
for (const [side, result, selected] of [
|
|
481
|
+
['current', current, shard.files], ['baseline', base, baselineFiles],
|
|
482
|
+
] as const) {
|
|
483
|
+
if (result.failure) roundEvidence[index]!.push({ shardId: shard.id, side, attempt: round,
|
|
484
|
+
files: [...selected], exitCode: result.exitCode, signal: result.signal ?? null, ...result.failure });
|
|
485
|
+
}
|
|
486
|
+
if (round === 1 && mode.onShardComplete) {
|
|
487
|
+
completedShards++;
|
|
488
|
+
completedFiles += shard.files.length;
|
|
489
|
+
try { mode.onShardComplete({ shardId: shard.id, completedShards, totalShards: shards.length,
|
|
490
|
+
completedFiles, totalFiles }); } catch { /* observation only */ }
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
};
|
|
494
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, pending.length) }, () => worker()));
|
|
495
|
+
attempts.push(...roundAttempts);
|
|
496
|
+
for (const evidence of roundEvidence) failureEvidence.push(...evidence);
|
|
497
|
+
const retry = new Set(aggregateGateTestShards(shards, attempts).retryShardIds);
|
|
498
|
+
pending = shards.filter((shard) => retry.has(shard.id));
|
|
499
|
+
}
|
|
500
|
+
return aggregateGateTestShards(shards, attempts);
|
|
501
|
+
});
|
|
502
|
+
const evidence = failureEvidence.length ? { failureEvidence } : {};
|
|
503
|
+
const bundleMs = Math.round(performance.now() - bundlesStartedAt);
|
|
504
|
+
if ('retryShardIds' in baseline) return {
|
|
505
|
+
...planned, aggregate: baseline, attempts, ...evidence, concurrency, concurrencyReason: selectedConcurrency.reason, measurementMs, bundleMs,
|
|
506
|
+
currentProcessMs: Math.round(currentProcessMs), baselineProcessMs: Math.round(baselineProcessMs),
|
|
507
|
+
...(baseline.retryShardIds.length ? { unmeasuredByShard: incompleteShardReasons(baseline.retryShardIds, attempts) } : {}),
|
|
508
|
+
};
|
|
509
|
+
const retryShardIds = shards.map((shard) => shard.id);
|
|
510
|
+
const stderrTail = baseline.gitStderrTail;
|
|
511
|
+
const stderrPart = stderrTail ? ` · git stderr: ${stderrTail}` : '';
|
|
512
|
+
return {
|
|
513
|
+
...planned, aggregate: { status: 'unmeasured', retryShardIds }, attempts, concurrency, concurrencyReason: selectedConcurrency.reason, measurementMs, bundleMs,
|
|
514
|
+
currentProcessMs: Math.round(currentProcessMs), baselineProcessMs: Math.round(baselineProcessMs),
|
|
515
|
+
reason: baseline.log, ...evidence,
|
|
516
|
+
unmeasuredByShard: Object.fromEntries(retryShardIds.map((id) => [id,
|
|
517
|
+
`baseline worktree: ${redactSecretText(baseline.log).replace(/[\r\n\t\x00-\x1f\x7f]+/g, ' ').slice(0, 500)}${stderrPart}`])),
|
|
518
|
+
...(stderrTail ? { baselineStderrTail: stderrTail } : {}),
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
|
|
324
522
|
function incompleteShardReasons(shardIds: readonly string[], attempts: readonly GateShardAttempt[]): Record<string, string> {
|
|
325
523
|
return Object.fromEntries(shardIds.map((id) => {
|
|
326
524
|
const latest = attempts.filter((attempt) => attempt.shardId === id).at(-1);
|
|
@@ -381,6 +579,65 @@ export function runBunShardWithSpawn(cwd: string, files: readonly string[], spaw
|
|
|
381
579
|
}
|
|
382
580
|
}
|
|
383
581
|
|
|
582
|
+
/** Nonblocking child runner; each bundle still owns its own deterministic environment and JUnit path. */
|
|
583
|
+
export async function runBunShardAsync(cwd: string, files: readonly string[], drainTimeoutMs = 5_000): Promise<ReturnType<ShardProcess>> {
|
|
584
|
+
const timeout = selfGateShardTimeoutMs(files);
|
|
585
|
+
const spawnLane = timeout === 120_000;
|
|
586
|
+
const dir = mkdtempSync(join(tmpdir(), 'elanous-shard-junit-'));
|
|
587
|
+
const report = join(dir, 'result.xml');
|
|
588
|
+
const isolated = prepareDeterministicChildEnvironment('elanous-shard-test-env-', { env: withGateTestEnv(process.env) });
|
|
589
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
590
|
+
let drainTimer: ReturnType<typeof setTimeout> | undefined;
|
|
591
|
+
const drainAbort = new AbortController();
|
|
592
|
+
try {
|
|
593
|
+
const args = ['test', ...(spawnLane ? ['--timeout=120000'] : []), '--reporter=junit', `--reporter-outfile=${report}`, ...files];
|
|
594
|
+
const started = performance.now();
|
|
595
|
+
const child = Bun.spawn(['bun', ...args], { cwd, env: isolated.env, stdout: 'pipe', stderr: 'pipe' });
|
|
596
|
+
let timedOut = false;
|
|
597
|
+
let drainTimedOut = false;
|
|
598
|
+
timer = setTimeout(() => { timedOut = true; child.kill('SIGKILL'); }, timeout);
|
|
599
|
+
const stdoutOutput = boundedChildOutput(child.stdout, drainAbort.signal);
|
|
600
|
+
const stderrOutput = boundedChildOutput(child.stderr, drainAbort.signal);
|
|
601
|
+
const exited = child.exited.then((code) => {
|
|
602
|
+
// Pipe draining can continue after process exit; a late timer must not relabel a clean exit as SIGKILL.
|
|
603
|
+
if (timer) clearTimeout(timer);
|
|
604
|
+
timer = undefined;
|
|
605
|
+
drainTimer = setTimeout(() => {
|
|
606
|
+
drainTimedOut = true;
|
|
607
|
+
debug.log('self-dev.shard', 'output-drain-timeout', { cwd, files, drainTimeoutMs });
|
|
608
|
+
drainAbort.abort();
|
|
609
|
+
}, drainTimeoutMs);
|
|
610
|
+
return code;
|
|
611
|
+
});
|
|
612
|
+
const [exitCode, stdoutBuffer, stderrBuffer] = await Promise.all([
|
|
613
|
+
exited,
|
|
614
|
+
stdoutOutput,
|
|
615
|
+
stderrOutput,
|
|
616
|
+
]);
|
|
617
|
+
if (drainTimer) clearTimeout(drainTimer);
|
|
618
|
+
drainTimer = undefined;
|
|
619
|
+
const stdout = stdoutBuffer;
|
|
620
|
+
const stderr = stderrBuffer;
|
|
621
|
+
const durationMs = performance.now() - started;
|
|
622
|
+
const usage = child.resourceUsage();
|
|
623
|
+
const junit = existsSync(report) ? readFileSync(report, 'utf8') : undefined;
|
|
624
|
+
const signal = drainTimedOut ? 'DRAIN_TIMEOUT' : timedOut ? 'SIGKILL' : child.signalCode ? String(child.signalCode) : undefined;
|
|
625
|
+
const failed = exitCode !== 0 || !!signal || junit === undefined;
|
|
626
|
+
return {
|
|
627
|
+
exitCode, signal, junit,
|
|
628
|
+
...(files.length === 1 ? { rssMb: usage ? usage.maxRSS / (1024 * 1024) : undefined, seconds: durationMs / 1000 } : {}),
|
|
629
|
+
...(junit === undefined && (exitCode !== 0 || signal) ? { diagnostic: boundedDiagnostic(stdout, stderr) } : {}),
|
|
630
|
+
...(failed ? { failure: { durationMs: Math.round(durationMs), stdoutTail: outputTail(stdout), stderrTail: outputTail(stderr) } } : {}),
|
|
631
|
+
};
|
|
632
|
+
} finally {
|
|
633
|
+
if (timer) clearTimeout(timer);
|
|
634
|
+
if (drainTimer) clearTimeout(drainTimer);
|
|
635
|
+
drainAbort.abort();
|
|
636
|
+
isolated.cleanup();
|
|
637
|
+
rmSync(dir, { recursive: true, force: true });
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
|
|
384
641
|
/** GATE-REMOTE-SHARD-PLAN — identity of one remote shard. files/introducedFiles are optional: a caller that only relays
|
|
385
642
|
* identity (CLI wiring) passes none, while a planner-produced shard carries its file-level attribution. */
|
|
386
643
|
export interface RemoteShardSpec {
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
|
|
3
|
+
/** Exclude importer expansion only when non-comment bytes and comment boundaries
|
|
4
|
+
* are identical. The TypeScript parser finds comments within JSDoc that a bare
|
|
5
|
+
* scanner can misread because their prose contains backticks. */
|
|
6
|
+
export function isCommentOnlySourceChange(before: string, after: string, path: string): boolean {
|
|
7
|
+
if (before === after || !/\.(?:[cm]?[jt]sx?)$/.test(path)) return false;
|
|
8
|
+
const kind = /\.(?:[cm]?[jt]sx)$/.test(path) ? ts.ScriptKind.TSX
|
|
9
|
+
: /\.(?:[cm]?js)$/.test(path) ? ts.ScriptKind.JS : ts.ScriptKind.TS;
|
|
10
|
+
const collect = (source: string): { masked: string; comments: string[] } | null => {
|
|
11
|
+
const file = ts.createSourceFile(path, source, ts.ScriptTarget.Latest, true, kind);
|
|
12
|
+
if (file.parseDiagnostics.length) return null;
|
|
13
|
+
const ranges = new Map<number, ts.CommentRange>();
|
|
14
|
+
const add = (found: ts.CommentRange[] | undefined) => {
|
|
15
|
+
for (const range of found ?? []) ranges.set(range.pos, range);
|
|
16
|
+
};
|
|
17
|
+
const visit = (node: ts.Node) => {
|
|
18
|
+
add(ts.getLeadingCommentRanges(source, node.getFullStart()));
|
|
19
|
+
add(ts.getTrailingCommentRanges(source, node.getEnd()));
|
|
20
|
+
ts.forEachChild(node, visit);
|
|
21
|
+
};
|
|
22
|
+
visit(file);
|
|
23
|
+
const comments: string[] = [];
|
|
24
|
+
let masked = '';
|
|
25
|
+
let end = 0;
|
|
26
|
+
for (const range of [...ranges.values()].sort((left, right) => left.pos - right.pos)) {
|
|
27
|
+
if (range.pos < end) return null;
|
|
28
|
+
const comment = source.slice(range.pos, range.end);
|
|
29
|
+
comments.push(comment);
|
|
30
|
+
masked += source.slice(end, range.pos) + `\u0000C${range.kind}:${comment.match(/\r\n|\r|\n/g)?.join('') ?? ''}\u0000`;
|
|
31
|
+
end = range.end;
|
|
32
|
+
}
|
|
33
|
+
return { masked: masked + source.slice(end), comments };
|
|
34
|
+
};
|
|
35
|
+
const old = collect(before);
|
|
36
|
+
const current = collect(after);
|
|
37
|
+
if (!old || !current || old.masked !== current.masked || old.comments.length !== current.comments.length) return false;
|
|
38
|
+
const directive = /^(?:\/\/\/|\/\/[#@])|@|(?:eslint|istanbul|coverage|#__PURE__|__NO_SIDE_EFFECTS__)/i;
|
|
39
|
+
// Any unquoted @ may be a TypeScript/JSDoc tag, including newly introduced ones.
|
|
40
|
+
// A backticked example username such as `@example_bot` is prose, not a tag.
|
|
41
|
+
const semanticText = (comment: string) => comment.trim().replace(/`[^`\r\n]*`/g, '');
|
|
42
|
+
let changed = false;
|
|
43
|
+
for (let index = 0; index < old.comments.length; index++) {
|
|
44
|
+
const prior = old.comments[index]!;
|
|
45
|
+
const next = current.comments[index]!;
|
|
46
|
+
if (prior === next) continue;
|
|
47
|
+
changed = true;
|
|
48
|
+
// Ordinary inline block comments and line comments stay in the importer set.
|
|
49
|
+
// This exemption is intentionally limited to JSDoc prose edits.
|
|
50
|
+
if (!prior.startsWith('/**') || !next.startsWith('/**')) return false;
|
|
51
|
+
if (directive.test(semanticText(prior)) || directive.test(semanticText(next))) return false;
|
|
52
|
+
}
|
|
53
|
+
return changed;
|
|
54
|
+
}
|
|
@@ -72,6 +72,12 @@ export function ensureDeviceFirstSteps(goal: string, steps: readonly string[], r
|
|
|
72
72
|
const evidenceCommand = /완료\s*경계\s*증거\s*명령\s*[::]\s*([^\r\n]+)/u.exec(goal)?.[1] ?? '';
|
|
73
73
|
const goalFeatureTest = [evidenceCommand, goal].flatMap((text) => [...text.matchAll(/(?:src|test)\/[\w./-]+\.test\.[cm]?[jt]sx?/gu)]
|
|
74
74
|
.map((match) => match[0])).find((path) => path !== test && !path.startsWith('src/ux-sim/'));
|
|
75
|
+
// ⭐ TDD 를 로직으로(S4) — 문면이 아니라 로직 판정에 필요한 RED→GREEN 기록 필드를 조각 계획에 실어
|
|
76
|
+
// 넘긴다. 오케스트레이터가 [tdd-red]/[tdd-green] 기록의 태그·같은 명령·결과를 판정한다(문면 유지).
|
|
77
|
+
const tddRecordFields = 'TDD 기록 필드: 첫 조각 커밋에 피처 시험을 먼저 쓰고 구현 전 실행 RED 기록을 남긴다'
|
|
78
|
+
+ " — 'EVIDENCE: [tdd-red] <무엇을 확인했나> || <증거 명령>' 다음 줄 'RESULT: <실패 요약 한 줄>'"
|
|
79
|
+
+ " · 구현 뒤 같은 명령의 GREEN 기록을 남긴다 — 'EVIDENCE: [tdd-green] <무엇을 확인했나> || <같은 증거 명령>' 다음 줄 'RESULT: <통과 요약 한 줄>'"
|
|
80
|
+
+ ' · 오케스트레이터가 두 기록의 태그·같은 명령·결과를 로직으로 판정하고 없으면 수리 라운드를 돌린다';
|
|
75
81
|
const completeFeatureStage = (stage: string, index: number): string => {
|
|
76
82
|
const withPredecessor = stage.includes(predecessor) ? stage : `${stage}\n${predecessor}`;
|
|
77
83
|
const declaredGoalTest = index === 0 ? goalFeatureTest : undefined;
|
|
@@ -87,10 +93,10 @@ export function ensureDeviceFirstSteps(goal: string, steps: readonly string[], r
|
|
|
87
93
|
? stageSource.replace(/\.ts$/u, '.test.ts') : undefined;
|
|
88
94
|
const featureTest = declaredGoalTest ?? stageTest
|
|
89
95
|
?? (existingSiblingTest && existsSync(join(root!, existingSiblingTest)) ? existingSiblingTest : undefined);
|
|
90
|
-
if (!featureTest) return `${withoutWrongPlan}\n검증 계획(TDD): 시험 경로 미확정(${stageSource ? `${stageSource}의 시험 확장자 미정` : '조각 대상 경로 없음'}) · 이 조각에서 시험 경로를 먼저 정하고 RED 실패 뒤 같은 명령으로 GREEN을
|
|
96
|
+
if (!featureTest) return `${withoutWrongPlan}\n검증 계획(TDD): 시험 경로 미확정(${stageSource ? `${stageSource}의 시험 확장자 미정` : '조각 대상 경로 없음'}) · 이 조각에서 시험 경로를 먼저 정하고 RED 실패 뒤 같은 명령으로 GREEN을 확인한다. ${tddRecordFields}`;
|
|
91
97
|
const inventory = root === undefined ? '시험 재고 미측정(대상 루트 미상)'
|
|
92
98
|
: existsSync(join(root, featureTest)) ? '기존 시험' : '신규 시험(이 조각에서 먼저 신설)';
|
|
93
|
-
return `${withoutWrongPlan}\n검증 계획(TDD): ${inventory} ${featureTest} · 피처 시험 bun test ${featureTest}를 구현 전에 RED로 확인하고 생산 경로를 구현한 뒤 같은 명령으로 GREEN을
|
|
99
|
+
return `${withoutWrongPlan}\n검증 계획(TDD): ${inventory} ${featureTest} · 피처 시험 bun test ${featureTest}를 구현 전에 RED로 확인하고 생산 경로를 구현한 뒤 같은 명령으로 GREEN을 확인한다. ${tddRecordFields}`;
|
|
94
100
|
};
|
|
95
101
|
const targetPaths = [decision.device, test].filter((path) => root !== undefined && existsSync(join(root, path)));
|
|
96
102
|
const newPaths = [decision.device, test].filter((path) => !targetPaths.includes(path));
|