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
|
@@ -452,6 +452,237 @@ export function loadRunGraphVariant(runId: string, dir = runLedgerDir()): RunGra
|
|
|
452
452
|
return { variantId: record.variant_id, reason: record.reason };
|
|
453
453
|
}
|
|
454
454
|
|
|
455
|
+
/**
|
|
456
|
+
* Axes compared between what a run asked for and what it actually ran with:
|
|
457
|
+
* the child LLM request (`childModel`/`childProvider`), `zaiCodingPlan.overage`,
|
|
458
|
+
* the Pod pool and the parent host.
|
|
459
|
+
*/
|
|
460
|
+
export type RunRequestEffectiveAxis = 'childModel' | 'childProvider' | 'overagePolicy' | 'podPool' | 'parentHost';
|
|
461
|
+
|
|
462
|
+
/** Ledger event carrying one requested-vs-effective comparison row set. */
|
|
463
|
+
export const RUN_REQUEST_VS_EFFECTIVE_EVENT = 'run-request-vs-effective';
|
|
464
|
+
|
|
465
|
+
const RUN_REQUEST_EFFECTIVE_AXES: readonly RunRequestEffectiveAxis[] = [
|
|
466
|
+
'childModel',
|
|
467
|
+
'childProvider',
|
|
468
|
+
'overagePolicy',
|
|
469
|
+
'podPool',
|
|
470
|
+
'parentHost',
|
|
471
|
+
];
|
|
472
|
+
|
|
473
|
+
/** Values of the compared axes. Requested and effective sides share this shape so a row can name both. */
|
|
474
|
+
export interface RunRequestEffectiveValues {
|
|
475
|
+
childModel?: string;
|
|
476
|
+
childProvider?: string;
|
|
477
|
+
overagePolicy?: string;
|
|
478
|
+
podPool?: string;
|
|
479
|
+
parentHost?: string;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/** One axis whose requested value differs from the effective value observed while the run executed. */
|
|
483
|
+
export interface RunRequestEffectiveMismatch {
|
|
484
|
+
axis: RunRequestEffectiveAxis;
|
|
485
|
+
requested: string;
|
|
486
|
+
effective: string;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
export interface RunRequestEffectiveComparison {
|
|
490
|
+
requested: RunRequestEffectiveValues;
|
|
491
|
+
effective: RunRequestEffectiveValues;
|
|
492
|
+
mismatches: RunRequestEffectiveMismatch[];
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
function isPlainRecord(value: unknown): value is Record<string, unknown> {
|
|
496
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
function readRunRequestEffectiveValues(value: unknown): RunRequestEffectiveValues {
|
|
500
|
+
if (!isPlainRecord(value)) return {};
|
|
501
|
+
const values: RunRequestEffectiveValues = {};
|
|
502
|
+
for (const axis of RUN_REQUEST_EFFECTIVE_AXES) {
|
|
503
|
+
const raw = value[axis];
|
|
504
|
+
if (typeof raw === 'string' && raw.trim()) values[axis] = raw.trim();
|
|
505
|
+
}
|
|
506
|
+
return values;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
function nonEmptyString(value: unknown): string | undefined {
|
|
510
|
+
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/** Compare both sides axis by axis; an axis observed on one side only is not a mismatch. */
|
|
514
|
+
export function compareRunRequestEffective(
|
|
515
|
+
requested: RunRequestEffectiveValues,
|
|
516
|
+
effective: RunRequestEffectiveValues,
|
|
517
|
+
): RunRequestEffectiveMismatch[] {
|
|
518
|
+
const mismatches: RunRequestEffectiveMismatch[] = [];
|
|
519
|
+
for (const axis of RUN_REQUEST_EFFECTIVE_AXES) {
|
|
520
|
+
const requestedValue = requested[axis];
|
|
521
|
+
const effectiveValue = effective[axis];
|
|
522
|
+
if (requestedValue === undefined || effectiveValue === undefined || requestedValue === effectiveValue) continue;
|
|
523
|
+
mismatches.push({ axis, requested: requestedValue, effective: effectiveValue });
|
|
524
|
+
}
|
|
525
|
+
return mismatches;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Read the two sides out of one observer event. The canonical contract is an explicit
|
|
530
|
+
* `data.requested` / `data.effective` object. The real orchestrator records the
|
|
531
|
+
* requested child at run-origin and the selected execution provider at start.
|
|
532
|
+
*/
|
|
533
|
+
function runRequestEffectiveSidesOf(entry: RunLedgerEntry): RunRequestEffectiveComparison {
|
|
534
|
+
const data = isPlainRecord(entry.data) ? entry.data : {};
|
|
535
|
+
const requested = readRunRequestEffectiveValues(data.requested);
|
|
536
|
+
const effective = readRunRequestEffectiveValues(data.effective);
|
|
537
|
+
|
|
538
|
+
if (entry.event === 'run-origin') {
|
|
539
|
+
requested.childProvider ??= nonEmptyString(data.childProvider);
|
|
540
|
+
requested.childModel ??= nonEmptyString(data.childModel);
|
|
541
|
+
}
|
|
542
|
+
if (entry.event === 'start') {
|
|
543
|
+
effective.childProvider ??= nonEmptyString(data.provider);
|
|
544
|
+
effective.childModel ??= nonEmptyString(data.model);
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
const childLlm = data.childLlm;
|
|
548
|
+
if (isPlainRecord(childLlm)) {
|
|
549
|
+
const provider = nonEmptyString(childLlm.provider);
|
|
550
|
+
if (provider !== undefined && requested.childProvider === undefined) requested.childProvider = provider;
|
|
551
|
+
const model = nonEmptyString(childLlm.model);
|
|
552
|
+
if (model !== undefined && requested.childModel === undefined) requested.childModel = model;
|
|
553
|
+
}
|
|
554
|
+
const zaiCodingPlan = data.zaiCodingPlan;
|
|
555
|
+
if (isPlainRecord(zaiCodingPlan)) {
|
|
556
|
+
const overage = nonEmptyString(zaiCodingPlan.overage);
|
|
557
|
+
if (overage !== undefined && requested.overagePolicy === undefined) requested.overagePolicy = overage;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
for (const key of ['childStart', 'llmConsumeStart'] as const) {
|
|
561
|
+
const start = data[key];
|
|
562
|
+
if (!isPlainRecord(start)) continue;
|
|
563
|
+
const provider = nonEmptyString(start.provider);
|
|
564
|
+
if (provider !== undefined && effective.childProvider === undefined) effective.childProvider = provider;
|
|
565
|
+
const model = nonEmptyString(start.model);
|
|
566
|
+
if (model !== undefined && effective.childModel === undefined) effective.childModel = model;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
return { requested, effective, mismatches: compareRunRequestEffective(requested, effective) };
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
/**
|
|
573
|
+
* Merge every non-comparison event of a run into one comparison. The request side keeps the
|
|
574
|
+
* first recorded value (run-origin) and the effective side keeps the last observed one
|
|
575
|
+
* (child start, first llm consume-start, actual Pod pool).
|
|
576
|
+
*/
|
|
577
|
+
export function runRequestEffectiveFromLedger(ledger: readonly RunLedgerEntry[]): RunRequestEffectiveComparison {
|
|
578
|
+
const requested: RunRequestEffectiveValues = {};
|
|
579
|
+
const effective: RunRequestEffectiveValues = {};
|
|
580
|
+
for (const entry of ledger) {
|
|
581
|
+
if (entry.event === RUN_REQUEST_VS_EFFECTIVE_EVENT) continue;
|
|
582
|
+
const sides = runRequestEffectiveSidesOf(entry);
|
|
583
|
+
for (const axis of RUN_REQUEST_EFFECTIVE_AXES) {
|
|
584
|
+
const requestedValue = sides.requested[axis];
|
|
585
|
+
if (requestedValue !== undefined && requested[axis] === undefined) requested[axis] = requestedValue;
|
|
586
|
+
const effectiveValue = sides.effective[axis];
|
|
587
|
+
if (effectiveValue !== undefined && effective[axis] === undefined) effective[axis] = effectiveValue;
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
return { requested, effective, mismatches: compareRunRequestEffective(requested, effective) };
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
/** Mismatch rows this run already wrote, de-duplicated across repeated comparisons. */
|
|
594
|
+
export function recordedRunRequestEffectiveMismatches(
|
|
595
|
+
ledger: readonly RunLedgerEntry[],
|
|
596
|
+
): RunRequestEffectiveMismatch[] {
|
|
597
|
+
const seen = new Set<string>();
|
|
598
|
+
const rows: RunRequestEffectiveMismatch[] = [];
|
|
599
|
+
for (const entry of ledger) {
|
|
600
|
+
if (entry.event !== RUN_REQUEST_VS_EFFECTIVE_EVENT) continue;
|
|
601
|
+
const recorded = isPlainRecord(entry.data) ? entry.data.mismatches : undefined;
|
|
602
|
+
if (!Array.isArray(recorded)) continue;
|
|
603
|
+
for (const row of recorded) {
|
|
604
|
+
if (!isPlainRecord(row)) continue;
|
|
605
|
+
const axis = row.axis;
|
|
606
|
+
if (typeof axis !== 'string' || !RUN_REQUEST_EFFECTIVE_AXES.includes(axis as RunRequestEffectiveAxis)) continue;
|
|
607
|
+
const requested = nonEmptyString(row.requested);
|
|
608
|
+
const effective = nonEmptyString(row.effective);
|
|
609
|
+
if (requested === undefined || effective === undefined) continue;
|
|
610
|
+
const key = `${axis}\u0000${requested}\u0000${effective}`;
|
|
611
|
+
if (seen.has(key)) continue;
|
|
612
|
+
seen.add(key);
|
|
613
|
+
rows.push({ axis: axis as RunRequestEffectiveAxis, requested, effective });
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
return rows;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
export interface RunRequestVsEffectiveRecordOptions {
|
|
620
|
+
/** Ledger directory; default = `runLedgerDir()`. */
|
|
621
|
+
dir?: string;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
/**
|
|
625
|
+
* Write one `run-request-vs-effective` row under the run's own ledger file, inheriting the
|
|
626
|
+
* run's goalId and shard identity so the run stays a single mission on the timeline.
|
|
627
|
+
*/
|
|
628
|
+
export function recordRunRequestVsEffective(
|
|
629
|
+
runId: string,
|
|
630
|
+
requested: RunRequestEffectiveValues,
|
|
631
|
+
effective: RunRequestEffectiveValues,
|
|
632
|
+
options: RunRequestVsEffectiveRecordOptions = {},
|
|
633
|
+
): RunRequestEffectiveComparison {
|
|
634
|
+
const dir = options.dir ?? runLedgerDir();
|
|
635
|
+
const ledger = loadRunLedger(runId, dir) ?? [];
|
|
636
|
+
const start = ledger.find((entry) => entry.event === 'start' && typeof entry.timestamp === 'string');
|
|
637
|
+
const goalOwner = ledger.find((entry) => nonEmptyString(entry.goalId) !== undefined);
|
|
638
|
+
const comparison: RunRequestEffectiveComparison = {
|
|
639
|
+
requested,
|
|
640
|
+
effective,
|
|
641
|
+
mismatches: compareRunRequestEffective(requested, effective),
|
|
642
|
+
};
|
|
643
|
+
appendRunLedgerEntry({
|
|
644
|
+
timestamp: new Date().toISOString(),
|
|
645
|
+
runId,
|
|
646
|
+
event: RUN_REQUEST_VS_EFFECTIVE_EVENT,
|
|
647
|
+
data: { requested: comparison.requested, effective: comparison.effective, mismatches: comparison.mismatches },
|
|
648
|
+
...(goalOwner?.goalId === undefined ? {} : { goalId: goalOwner.goalId }),
|
|
649
|
+
...(start?.orchestrationId === undefined ? {} : { orchestrationId: start.orchestrationId }),
|
|
650
|
+
...(start?.shardId === undefined ? {} : { shardId: start.shardId }),
|
|
651
|
+
...(start?.pieceIndex === undefined ? {} : { pieceIndex: start.pieceIndex }),
|
|
652
|
+
...(start?.pieceTotal === undefined ? {} : { pieceTotal: start.pieceTotal }),
|
|
653
|
+
}, dir);
|
|
654
|
+
return comparison;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
function sameRunRequestEffectiveMismatches(
|
|
658
|
+
left: readonly RunRequestEffectiveMismatch[],
|
|
659
|
+
right: readonly RunRequestEffectiveMismatch[],
|
|
660
|
+
): boolean {
|
|
661
|
+
if (left.length !== right.length) return false;
|
|
662
|
+
const keys = new Set(right.map((row) => `${row.axis}\u0000${row.requested}\u0000${row.effective}`));
|
|
663
|
+
return left.every((row) => keys.has(`${row.axis}\u0000${row.requested}\u0000${row.effective}`));
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/**
|
|
667
|
+
* Production hook: after any observer event lands, compare the run's requested and effective
|
|
668
|
+
* sides and write the mismatch rows when they differ. Idempotent — a run whose rows already
|
|
669
|
+
* match its current comparison writes nothing. Recording only; no alerting and no repair.
|
|
670
|
+
*/
|
|
671
|
+
function recordRunRequestVsEffectiveFromLedger(runId: string, dir: string, appended: RunLedgerEntry): void {
|
|
672
|
+
// Keep unrelated observer writes O(1); only events carrying one side can
|
|
673
|
+
// change the comparison. In particular, a long run must not reread its
|
|
674
|
+
// complete ledger after every progress event.
|
|
675
|
+
if (!['run-origin', 'start', 'child-start', 'llm-consume-start'].includes(appended.event)
|
|
676
|
+
&& !isPlainRecord(appended.data?.requested) && !isPlainRecord(appended.data?.effective)) return;
|
|
677
|
+
if (appended.event === RUN_REQUEST_VS_EFFECTIVE_EVENT) return;
|
|
678
|
+
const ledger = loadRunLedger(runId, dir);
|
|
679
|
+
if (!ledger?.length) return;
|
|
680
|
+
const comparison = runRequestEffectiveFromLedger(ledger);
|
|
681
|
+
if (comparison.mismatches.length === 0) return;
|
|
682
|
+
if (sameRunRequestEffectiveMismatches(recordedRunRequestEffectiveMismatches(ledger), comparison.mismatches)) return;
|
|
683
|
+
recordRunRequestVsEffective(runId, comparison.requested, comparison.effective, { dir });
|
|
684
|
+
}
|
|
685
|
+
|
|
455
686
|
/** Append one observer event. Callers own fail-soft handling. */
|
|
456
687
|
export function appendRunLedgerEntry(entry: RunLedgerEntry, dir = runLedgerDir()): void {
|
|
457
688
|
if (refuseProductionLedgerWriteInTest(dir, 'run-ledger')) return;
|
|
@@ -465,6 +696,11 @@ export function appendRunLedgerEntry(entry: RunLedgerEntry, dir = runLedgerDir()
|
|
|
465
696
|
const line = `${JSON.stringify(row)}\n`;
|
|
466
697
|
if (!restoreArchivedRunLedger(dir, entry.runId, line)) appendFileSync(live, line, 'utf8');
|
|
467
698
|
});
|
|
699
|
+
try {
|
|
700
|
+
recordRunRequestVsEffectiveFromLedger(entry.runId, dir, entry);
|
|
701
|
+
} catch {
|
|
702
|
+
// The comparison is observation: it must never fail a producer write that already landed.
|
|
703
|
+
}
|
|
468
704
|
}
|
|
469
705
|
|
|
470
706
|
/** Caller decision inside `appendRunLedgerEntryChecked`: either `append` exactly one entry, or skip with `result`. */
|
|
@@ -483,7 +719,9 @@ export interface RunLedgerCheckedAppendOutcome<T> {
|
|
|
483
719
|
* Thrown (typed, with the stable `runId-mismatch` reason) when a checked-append
|
|
484
720
|
* decision returns an entry whose `runId` differs from the locked `runId`. Callers
|
|
485
721
|
* classify identity violations from `error.reason === 'runId-mismatch'` instead of
|
|
486
|
-
* parsing message substrings.
|
|
722
|
+
* parsing message substrings. `RunLedgerEntryRunIdMismatchError` below is the same
|
|
723
|
+
* identity violation observed on already-written ledger bytes, so one `instanceof`
|
|
724
|
+
* covers both producers.
|
|
487
725
|
*/
|
|
488
726
|
export class RunLedgerCheckedAppendRunIdMismatchError extends Error {
|
|
489
727
|
readonly reason = 'runId-mismatch' as const;
|
|
@@ -495,6 +733,21 @@ export class RunLedgerCheckedAppendRunIdMismatchError extends Error {
|
|
|
495
733
|
}
|
|
496
734
|
}
|
|
497
735
|
|
|
736
|
+
/**
|
|
737
|
+
* Thrown (typed, same `runId-mismatch` reason) when a stored ledger *row* declares a
|
|
738
|
+
* `runId` other than the one being loaded. The message prefixes the stable reason and keeps
|
|
739
|
+
* the parser's existing wording, so message-based classifiers (`goal-archive`, the
|
|
740
|
+
* doctor-compare caller's own regression test) keep recognizing it, while
|
|
741
|
+
* `decisionRunId`/`lockedRunId` travel as typed fields so no caller has to re-parse it.
|
|
742
|
+
*/
|
|
743
|
+
export class RunLedgerEntryRunIdMismatchError extends RunLedgerCheckedAppendRunIdMismatchError {
|
|
744
|
+
constructor(decisionRunId: string, lockedRunId: string, readonly lineNumber: number) {
|
|
745
|
+
super(decisionRunId, lockedRunId);
|
|
746
|
+
this.name = 'RunLedgerEntryRunIdMismatchError';
|
|
747
|
+
this.message = `runId-mismatch: invalid run ledger entry at line ${lineNumber}: runId does not match ${lockedRunId}`;
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
|
|
498
751
|
/**
|
|
499
752
|
* Atomically decide-and-append under a single per-run lock: the caller-supplied
|
|
500
753
|
* decision runs on the loaded ledger inside `withRunLedgerLock`, and at most one
|
|
@@ -660,7 +913,7 @@ function parseRunLedgerEntry(line: string, lineNumber: number, expectedRunId: st
|
|
|
660
913
|
throw new Error(`invalid run ledger entry at line ${lineNumber}: expected optional timestamp, goalId, shard identity, runId, event, and object data`);
|
|
661
914
|
}
|
|
662
915
|
if (entry.runId !== expectedRunId) {
|
|
663
|
-
throw new
|
|
916
|
+
throw new RunLedgerEntryRunIdMismatchError(entry.runId, expectedRunId, lineNumber);
|
|
664
917
|
}
|
|
665
918
|
return entry as RunLedgerEntry;
|
|
666
919
|
}
|
|
@@ -836,6 +1089,13 @@ export interface RunLedgerTimelineEntry {
|
|
|
836
1089
|
pieceTotal?: number;
|
|
837
1090
|
/** Producer-recorded `graph.unit` visits of this run, with terminal unmatched enters reported as orphans. */
|
|
838
1091
|
unitVisits?: GraphUnitVisitClassification;
|
|
1092
|
+
/** Requested vs effective values this run recorded; present only when the two sides differ. */
|
|
1093
|
+
requestVsEffective?: {
|
|
1094
|
+
requested: RunRequestEffectiveValues;
|
|
1095
|
+
effective: RunRequestEffectiveValues;
|
|
1096
|
+
};
|
|
1097
|
+
/** Mismatch rows (axis · requested · effective) for this run; absent when requested equals effective. */
|
|
1098
|
+
mismatches?: RunRequestEffectiveMismatch[];
|
|
839
1099
|
}
|
|
840
1100
|
|
|
841
1101
|
export interface RunLedgerTimelineQueryOptions {
|
|
@@ -844,6 +1104,20 @@ export interface RunLedgerTimelineQueryOptions {
|
|
|
844
1104
|
list?: (path: string) => string[];
|
|
845
1105
|
}
|
|
846
1106
|
|
|
1107
|
+
/**
|
|
1108
|
+
* Timeline projection of the requested-vs-effective rows. Recorded rows win over a derived
|
|
1109
|
+
* comparison so the timeline shows what the run actually wrote; equal sides project nothing.
|
|
1110
|
+
*/
|
|
1111
|
+
function runRequestEffectiveTimelineFields(
|
|
1112
|
+
ledger: readonly RunLedgerEntry[],
|
|
1113
|
+
): Pick<RunLedgerTimelineEntry, 'mismatches' | 'requestVsEffective'> {
|
|
1114
|
+
const recorded = recordedRunRequestEffectiveMismatches(ledger);
|
|
1115
|
+
const derived = runRequestEffectiveFromLedger(ledger);
|
|
1116
|
+
const mismatches = recorded.length > 0 ? recorded : derived.mismatches;
|
|
1117
|
+
if (mismatches.length === 0) return {};
|
|
1118
|
+
return { mismatches, requestVsEffective: { requested: derived.requested, effective: derived.effective } };
|
|
1119
|
+
}
|
|
1120
|
+
|
|
847
1121
|
/**
|
|
848
1122
|
* Read runs whose sole recorded goalId equals the historian missionId.
|
|
849
1123
|
* goalId is chosen because the producer already persists it on each observer event, while orchestrationId only groups shards.
|
|
@@ -878,6 +1152,7 @@ export function queryRunLedgerTimeline(missionId: string, options: RunLedgerTime
|
|
|
878
1152
|
...(execution.pieceIndex === undefined ? {} : { pieceIndex: execution.pieceIndex }),
|
|
879
1153
|
...(execution.pieceTotal === undefined ? {} : { pieceTotal: execution.pieceTotal }),
|
|
880
1154
|
unitVisits: classifyGraphUnitVisits(ledger),
|
|
1155
|
+
...runRequestEffectiveTimelineFields(ledger),
|
|
881
1156
|
});
|
|
882
1157
|
} catch {
|
|
883
1158
|
// A corrupt or concurrently replaced ledger must not leak a partial run into another mission timeline.
|
|
@@ -896,15 +1171,24 @@ export interface GraphAdaptReport {
|
|
|
896
1171
|
nonAdapted: { landed: number; denominator: number; rate: number | null };
|
|
897
1172
|
excludedCount: number;
|
|
898
1173
|
exclusionReasons: Record<string, number>;
|
|
1174
|
+
unmeasuredCount: number;
|
|
1175
|
+
unmeasuredReasons: Record<string, number>;
|
|
1176
|
+
window: { since: string | null; until: string | null };
|
|
899
1177
|
}
|
|
900
1178
|
|
|
901
1179
|
/** Measure only producer-observed traversals and variant applications; never activate adaptation. */
|
|
902
|
-
export function queryGraphAdaptReport(goalId: string, stateDir = elanousStateRoot()): GraphAdaptReport {
|
|
1180
|
+
export function queryGraphAdaptReport(goalId: string, stateDir = elanousStateRoot(), window: { since?: string; until?: string } = {}): GraphAdaptReport {
|
|
903
1181
|
const dir = runLedgerDir(stateDir);
|
|
904
1182
|
const signatures = new Set<string>();
|
|
905
1183
|
const counts = { adapted: { landed: 0, denominator: 0 }, nonAdapted: { landed: 0, denominator: 0 } };
|
|
906
1184
|
const exclusionReasons: Record<string, number> = {};
|
|
1185
|
+
const unmeasuredReasons: Record<string, number> = {};
|
|
907
1186
|
const exclude = (reason: string): void => { exclusionReasons[reason] = (exclusionReasons[reason] ?? 0) + 1; };
|
|
1187
|
+
const unmeasured = (reason: string): void => { unmeasuredReasons[reason] = (unmeasuredReasons[reason] ?? 0) + 1; };
|
|
1188
|
+
const since = window.since === undefined ? null : Date.parse(window.since);
|
|
1189
|
+
const until = window.until === undefined ? null : Date.parse(window.until);
|
|
1190
|
+
if ((since !== null && !Number.isFinite(since)) || (until !== null && !Number.isFinite(until)) ||
|
|
1191
|
+
(since !== null && until !== null && since > until)) throw new Error('invalid adaptation measurement window');
|
|
908
1192
|
let unitCallCount = 0;
|
|
909
1193
|
let adaptationCount = 0;
|
|
910
1194
|
let fileNames: string[];
|
|
@@ -923,6 +1207,15 @@ export function queryGraphAdaptReport(goalId: string, stateDir = elanousStateRoo
|
|
|
923
1207
|
const goalIds = new Set(ledger.map(entry => entry.goalId).filter((id): id is string => typeof id === 'string' && id.length > 0));
|
|
924
1208
|
if (goalIds.size === 1 && !goalIds.has(goalId)) continue;
|
|
925
1209
|
if (goalIds.size !== 1) { exclude('goal-id-missing-or-conflicting'); continue; }
|
|
1210
|
+
const start = ledger.find(entry => entry.event === 'start');
|
|
1211
|
+
const startedAt = start && typeof start.timestamp === 'string' ? Date.parse(start.timestamp) : NaN;
|
|
1212
|
+
if (!Number.isFinite(startedAt)) { unmeasured('start-time-missing-or-invalid'); continue; }
|
|
1213
|
+
if ((since !== null && startedAt < since) || (until !== null && startedAt >= until)) { exclude('outside-start-window'); continue; }
|
|
1214
|
+
const lastStatus = [...ledger].reverse().find(entry => entry.event === 'run-status');
|
|
1215
|
+
if (lastStatus && !['completed', 'failed', 'cancelled'].includes(String(lastStatus.data.runStatus))) {
|
|
1216
|
+
exclude('in-flight'); continue;
|
|
1217
|
+
}
|
|
1218
|
+
if (!lastStatus && !ledger.some(entry => entry.event === 'merged')) { exclude('in-flight'); continue; }
|
|
926
1219
|
const traversals = ledger.filter(entry => entry.event === 'pipeline-traversal-shadow');
|
|
927
1220
|
const paths = traversals.map(entry => entry.data.observedNodes);
|
|
928
1221
|
if (paths.length === 0 || paths.some(path => !Array.isArray(path) || path.length === 0 || !path.every(node => typeof node === 'string' && node.length > 0))) {
|
|
@@ -931,12 +1224,13 @@ export function queryGraphAdaptReport(goalId: string, stateDir = elanousStateRoo
|
|
|
931
1224
|
let graphRun: unknown;
|
|
932
1225
|
try { graphRun = JSON.parse(readFileSync(join(stateDir, 'graph-runs', 'self-implement', `${runId}.json`), 'utf8')); }
|
|
933
1226
|
catch (error) {
|
|
934
|
-
|
|
1227
|
+
unmeasured((error as NodeJS.ErrnoException).code === 'ENOENT' ? 'graph-run-missing' : 'graph-run-unreadable');
|
|
1228
|
+
continue;
|
|
935
1229
|
}
|
|
936
1230
|
const recorded = graphRun && typeof graphRun === 'object' && !Array.isArray(graphRun) ? graphRun as Record<string, unknown> : null;
|
|
937
|
-
if (recorded
|
|
938
|
-
(recorded.unitCalls !== undefined && !Array.isArray(recorded.unitCalls)))
|
|
939
|
-
|
|
1231
|
+
if (!recorded || recorded.runId !== runId || recorded.graphId !== 'self-implement' ||
|
|
1232
|
+
(recorded.unitCalls !== undefined && !Array.isArray(recorded.unitCalls))) {
|
|
1233
|
+
unmeasured('graph-run-invalid'); continue;
|
|
940
1234
|
}
|
|
941
1235
|
const merge = [...ledger].reverse().find(entry => entry.event === 'merged');
|
|
942
1236
|
if (merge && typeof merge.data.merged !== 'boolean') { exclude('landing-invalid'); continue; }
|
|
@@ -952,7 +1246,9 @@ export function queryGraphAdaptReport(goalId: string, stateDir = elanousStateRoo
|
|
|
952
1246
|
return { goalId, runCount: counts.adapted.denominator + counts.nonAdapted.denominator,
|
|
953
1247
|
uniquePathSignatures: signatures.size, unitCallCount, adaptationCount,
|
|
954
1248
|
adapted: rate(counts.adapted), nonAdapted: rate(counts.nonAdapted),
|
|
955
|
-
excludedCount: Object.values(exclusionReasons).reduce((total, count) => total + count, 0), exclusionReasons
|
|
1249
|
+
excludedCount: Object.values(exclusionReasons).reduce((total, count) => total + count, 0), exclusionReasons,
|
|
1250
|
+
unmeasuredCount: Object.values(unmeasuredReasons).reduce((total, count) => total + count, 0), unmeasuredReasons,
|
|
1251
|
+
window: { since: window.since ?? null, until: window.until ?? null } };
|
|
956
1252
|
}
|
|
957
1253
|
|
|
958
1254
|
export interface GoalSourceDistributionQuery {
|
|
@@ -40,6 +40,15 @@ export interface RunStopRecord {
|
|
|
40
40
|
export const RUN_STOP_EVENT = 'stop';
|
|
41
41
|
export const RUN_STOP_CAUSE_MAX = 120;
|
|
42
42
|
|
|
43
|
+
type RunStopListener = (entry: RunLedgerEntry) => void;
|
|
44
|
+
const runStopListeners = new Set<RunStopListener>();
|
|
45
|
+
|
|
46
|
+
/** Subscribe to live terminal run-stop facts. The durable ledger remains the source of truth. */
|
|
47
|
+
export function onRunStop(listener: RunStopListener): () => void {
|
|
48
|
+
runStopListeners.add(listener);
|
|
49
|
+
return () => { runStopListeners.delete(listener); };
|
|
50
|
+
}
|
|
51
|
+
|
|
43
52
|
export interface RunStopInput {
|
|
44
53
|
runId: string;
|
|
45
54
|
goalId?: string;
|
|
@@ -121,6 +130,9 @@ export function recordRunStop(input: RunStopInput, write: RunLedgerWriter = appe
|
|
|
121
130
|
write(entry);
|
|
122
131
|
if (recordedThisProcess.size >= RECORDED_MAX) recordedThisProcess.clear();
|
|
123
132
|
recordedThisProcess.add(input.runId);
|
|
133
|
+
for (const listener of runStopListeners) {
|
|
134
|
+
try { listener(entry); } catch { /* wake consumers cannot change run outcome */ }
|
|
135
|
+
}
|
|
124
136
|
try {
|
|
125
137
|
debug.log('self-implement.run-stop', 'recorded', { runId: input.runId, site: input.site ?? null, ...record, requestedClass: input.class ?? null });
|
|
126
138
|
} catch { /* observation is fail-soft */ }
|
|
@@ -23,7 +23,6 @@ import { createArtifactStore } from '../artifact/index.js';
|
|
|
23
23
|
import { tmpdir } from 'node:os';
|
|
24
24
|
import { isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
25
25
|
import { promisify } from 'node:util';
|
|
26
|
-
import { forkSessionById, HARNESS_SESSION_ORIGIN, isHarnessSessionOrigin } from '../session/index.js';
|
|
27
26
|
import { configuredWorktreeRoot, getUserConfig, resolveActiveProvider, resolveRoleLlm } from '../user-config.js';
|
|
28
27
|
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
29
28
|
import { addHarnessQueue } from '../harness/harness-queue.js';
|
|
@@ -1305,7 +1304,9 @@ type SameCellRebindDecision =
|
|
|
1305
1304
|
type SameCellRebindExtra = { boundPr?: number; detail?: string };
|
|
1306
1305
|
|
|
1307
1306
|
/** 같은 칸 새 draft 뒤 카드 재결속 — 사유를 다섯 갈래로 나눠 남기고, 카드 저장소가 없는 실행은 던지지 않고
|
|
1308
|
-
* deferred 로 돌려준다(Pod 자식은 본부 카드 저장소가 없다 · 부모 pr-terminal 결속은 #29948 이 맡는다).
|
|
1307
|
+
* deferred 로 돌려준다(Pod 자식은 본부 카드 저장소가 없다 · 부모 pr-terminal 결속은 #29948 이 맡는다).
|
|
1308
|
+
* 카드 저장소가 있는 호스트에서 card-missing·card-id-absent 는 조용한 성공이 아니라
|
|
1309
|
+
* debug.log('self-implement.same-cell','rebind-missing-on-host',{reason}) 경고로 분리한다(#30021 r4 shouldFix). */
|
|
1309
1310
|
function rebindSameCellCardToPr(input: {
|
|
1310
1311
|
taskCardId: string | undefined;
|
|
1311
1312
|
storePath: string;
|
|
@@ -1329,8 +1330,14 @@ function rebindSameCellCardToPr(input: {
|
|
|
1329
1330
|
debug.log('self-implement.pr', 'same-cell-card-rebind-failed', { ...base, ...extra, reason }, { level: 'warn' });
|
|
1330
1331
|
throw new Error(`same-cell 새 draft ${input.url} 개설됨; 카드 재결속 실패(${reasonText}) — 새 PR 수확 필요`);
|
|
1331
1332
|
};
|
|
1332
|
-
|
|
1333
|
-
|
|
1333
|
+
const hostStore = existsSync(input.storePath);
|
|
1334
|
+
/** 호스트(카드 저장소 있음)인데 결속 대상이 없으면 deferred 로 조용히 지나가지 않고 경고 이벤트로 분리한다. */
|
|
1335
|
+
const missingOnHost = (reason: SameCellCardRebindReason): SameCellCardRebindObservation => {
|
|
1336
|
+
debug.log('self-implement.same-cell', 'rebind-missing-on-host', { ...base, reason }, { level: 'warn' });
|
|
1337
|
+
return deferred(reason);
|
|
1338
|
+
};
|
|
1339
|
+
if (!input.taskCardId) return hostStore ? missingOnHost('card-id-absent') : deferred('card-id-absent');
|
|
1340
|
+
if (!hostStore) return deferred('card-store-absent');
|
|
1334
1341
|
let decision: SameCellRebindDecision | undefined;
|
|
1335
1342
|
let updated: ReturnType<typeof updateTaskCard>;
|
|
1336
1343
|
try {
|
|
@@ -1372,7 +1379,7 @@ function rebindSameCellCardToPr(input: {
|
|
|
1372
1379
|
case 'manual-ref':
|
|
1373
1380
|
return failed('manual-ref');
|
|
1374
1381
|
case 'card-missing':
|
|
1375
|
-
return
|
|
1382
|
+
return missingOnHost('card-missing');
|
|
1376
1383
|
case 'already-rebound':
|
|
1377
1384
|
observe('already-rebound');
|
|
1378
1385
|
return { outcome: 'already-rebound', reason: 'already-rebound', cardId, oldPr: input.oldPr, newPr: input.newPr };
|
|
@@ -1674,6 +1681,7 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1674
1681
|
},
|
|
1675
1682
|
|
|
1676
1683
|
forkSession: async (parentSessionId) => {
|
|
1684
|
+
const { forkSessionById, HARNESS_SESSION_ORIGIN, isHarnessSessionOrigin } = await import('../session/index.js');
|
|
1677
1685
|
const forked = forkSessionById(parentSessionId, { origin: HARNESS_SESSION_ORIGIN });
|
|
1678
1686
|
if (!forked) throw new Error(`self-implement fork: source session not found — ${parentSessionId}`);
|
|
1679
1687
|
if (!isHarnessSessionOrigin(forked.meta.origin)) {
|
|
@@ -1738,7 +1746,11 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1738
1746
|
}
|
|
1739
1747
|
// P1 — 대상 repo: 명시 repoRoot(외부 개발) 우선, 없으면 데몬 cwd 의 repo(=elanous 자신·현행).
|
|
1740
1748
|
const repoRoot = o.repoRoot ?? resolveMainRepoRoot(process.cwd()) ?? process.cwd();
|
|
1741
|
-
|
|
1749
|
+
// Keep the optional Pod-only implementation out of the TUI's static module graph.
|
|
1750
|
+
const inPlaceCandidate = process.env.ELANOUS_POD_INPLACE_WORKTREE === '1'
|
|
1751
|
+
? (await import('./pod-inplace-worktree.js')).tryCreatePodInplaceWorktree({ repoRoot, cwd: process.cwd(), branch, ...(base ? { base } : {}), runId, ...(goalFile ? { goalFile } : {}), env: process.env })
|
|
1752
|
+
: null;
|
|
1753
|
+
const r = inPlaceCandidate ?? createWorktree({
|
|
1742
1754
|
repoRoot,
|
|
1743
1755
|
branch,
|
|
1744
1756
|
worktreeRoot: configuredWorktreeRoot(),
|
|
@@ -1748,6 +1760,7 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1748
1760
|
...(base ? { base } : {}),
|
|
1749
1761
|
...(runId ? { currentOwner: `dev:${runId}` } : {}),
|
|
1750
1762
|
});
|
|
1763
|
+
const inPlace = 'inPlace' in r && r.inPlace === true;
|
|
1751
1764
|
if (r.resolvedBase) baselineRefs.set(r.path, r.resolvedBase);
|
|
1752
1765
|
const benchId = benchIdFromBase(base);
|
|
1753
1766
|
if (benchId) benchWorktrees.set(r.path, benchId);
|
|
@@ -1775,6 +1788,7 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1775
1788
|
baseIsIntegration: baseIsIntegration(r.path, r.resolvedBase),
|
|
1776
1789
|
baseFreshness: r.baseFreshness,
|
|
1777
1790
|
...(r.reused ? { reused: true } : {}),
|
|
1791
|
+
...(inPlace ? { inPlace: true } : {}),
|
|
1778
1792
|
...provenance,
|
|
1779
1793
|
};
|
|
1780
1794
|
const goalMetadata: HarnessWorktreeGoalMetadata = {
|
|
@@ -1795,6 +1809,8 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1795
1809
|
const provenanceError = error instanceof Error ? error.message : String(error);
|
|
1796
1810
|
// Manual creation rolls back on a metadata failure; self-implement retains its workspace and continues.
|
|
1797
1811
|
debug.log('self-implement', 'worktree-provenance-failed', { path: r.path, ...(provenance ?? {}), reason: provenanceError }, { level: 'warn' });
|
|
1812
|
+
// This source tree is also the Pod's recovery anchor. Never continue in-place without an owner marker.
|
|
1813
|
+
if (inPlace) throw new Error(`pod in-place provenance unavailable: ${provenanceError}`);
|
|
1798
1814
|
return {
|
|
1799
1815
|
path: r.path,
|
|
1800
1816
|
branch: r.branch,
|
|
@@ -1804,6 +1820,7 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1804
1820
|
baseIsIntegration: baseIsIntegration(r.path, r.resolvedBase),
|
|
1805
1821
|
baseFreshness: r.baseFreshness,
|
|
1806
1822
|
...(r.reused ? { reused: true } : {}),
|
|
1823
|
+
...(inPlace ? { inPlace: true } : {}),
|
|
1807
1824
|
provenanceError,
|
|
1808
1825
|
};
|
|
1809
1826
|
}
|
|
@@ -2219,7 +2236,10 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
2219
2236
|
};
|
|
2220
2237
|
if (failedTest) {
|
|
2221
2238
|
const worktreeLog = failedTest.output ?? '';
|
|
2222
|
-
|
|
2239
|
+
// A supplied gate runner can report a virtual checkout, just like gate-cli's injected runner.
|
|
2240
|
+
const currentFileExists = o.runIntegrityGate ? undefined : (file: string) => existsSync(resolve(cwd, file));
|
|
2241
|
+
const worktreeFailures = extractGateTestFailures(worktreeLog, currentFileExists);
|
|
2242
|
+
const failedFiles = [...new Set(worktreeFailures
|
|
2223
2243
|
.flatMap((failure) => failure.file ? [failure.file] : []))];
|
|
2224
2244
|
// 워크트리와 같은 묶음으로 베이스라인을 돌려 파일 간 간섭을 재현한다. 스코프가 없으면 실패 파일로 폴백.
|
|
2225
2245
|
const testArgs = gateOpts.testArgs;
|
|
@@ -2229,14 +2249,14 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
2229
2249
|
const baseline = (o.runGateBaseline ?? runGateBaseline)(cwd, baselineFiles, baselineRefs.get(cwd));
|
|
2230
2250
|
const rerun = (o.rerunBunTimeoutFailures ?? rerunBunTimeoutFailures)(
|
|
2231
2251
|
cwd,
|
|
2232
|
-
|
|
2252
|
+
worktreeFailures,
|
|
2233
2253
|
undefined,
|
|
2234
2254
|
baseline.status === 'unknown' ? undefined : (baseline.output ?? ''),
|
|
2235
2255
|
baseline.missingAtBase ?? [],
|
|
2236
2256
|
);
|
|
2237
2257
|
const rerunObservations = rerun instanceof Map ? rerun : rerun.observations;
|
|
2238
2258
|
const rerunNotRun = rerun instanceof Map ? 0 : rerun.rerunNotRun;
|
|
2239
|
-
const report = buildGateBaselineReport(worktreeLog, baseline, rerunObservations, rerunNotRun);
|
|
2259
|
+
const report = buildGateBaselineReport(worktreeLog, baseline, rerunObservations, rerunNotRun, currentFileExists);
|
|
2240
2260
|
baselineReport = report;
|
|
2241
2261
|
baselineFailures = report.failures;
|
|
2242
2262
|
const unknownReason = baseline.unknownReason;
|
|
@@ -2598,19 +2618,24 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
2598
2618
|
// ⛔ writer 가 넘긴 command 를 믿지 않는다 — **로그에서 직접** 뽑아 문서와 대조한다(리뷰 must-fix).
|
|
2599
2619
|
"const cm = testLine.match(/^\\[test\\]\\s+PASS\\s+(.+?)\\s*(?:—|$)/); if (!cm) process.exit(1);",
|
|
2600
2620
|
"const cmdFromLog = cm[1].trim();",
|
|
2601
|
-
"if (
|
|
2621
|
+
"if (body('## 불변식').indexOf(cmdFromLog) < 0) process.exit(1);",
|
|
2602
2622
|
// 문서가 baseline 문면도 담고 있어야 한다 — 근거가 문서 안에서 재검증 가능해야 한다.
|
|
2603
2623
|
// ⛔ 부분 문자열이 아니라 **로그의 baseline 줄 전체**와 대조한다 — `preexisting=9` 같은
|
|
2604
2624
|
// 불일치가 통과하면 근거가 근거가 아니다(리뷰 must-fix).
|
|
2605
2625
|
"const bl = log.split('\\n').find((l) => l.indexOf('[gate-baseline]') === 0);",
|
|
2606
2626
|
"if (bl) { if (!/^\\[gate-baseline\\] introduced=0, preexisting=0, unknown=0, precondition-unmet=0(?:,|$)/.test(bl)) process.exit(1); if (e.baselineLine !== bl.trim()) process.exit(1); if (sections.some((p) => p.indexOf(bl.trim()) < 0)) process.exit(1); }",
|
|
2607
2627
|
"else { if (e.baselineLine !== undefined) process.exit(1); if (sections.some((p) => p.indexOf('baseline not run (test PASS)') < 0)) process.exit(1); }",
|
|
2608
|
-
// ② 조건 줄의 명령을 **그 필드에서**
|
|
2628
|
+
// ② 조건 줄의 저작 명령을 **그 필드에서** 파싱하고, 해당 명령의 별도 실행 결과가
|
|
2629
|
+
// 정확히 일치하며 0으로 끝났는지 확인한다. 게이트 측정 명령은 독립된 증거다.
|
|
2609
2630
|
"const condLine = body('## 불변식').split('\\n').find((l) => l.indexOf('조건 —') >= 0); if (!condLine) process.exit(1);",
|
|
2631
|
+
// 불변식에는 writer가 측정한 명령 전문을 기록하므로, 원문 gate 명령이 해당 필드에도 있어야 한다.
|
|
2610
2632
|
"if (condLine.indexOf(cmdFromLog) < 0) process.exit(1);",
|
|
2633
|
+
"const signalLine = body('## 판정 신호').split('\\n').find((l) => l.indexOf('- Condition:') >= 0);",
|
|
2634
|
+
"const authoredCommand = signalLine?.match(/- Condition:\\s*(.+?)\\s*$/)?.[1]?.trim().replace(/^`([^`]+)`(?=\\s|를|$)/, '$1').replace(/\\s*를\\s*실행한다[.。]?$/, '').replace(/[.。]$/, '').trim();",
|
|
2635
|
+
"if (authoredCommand) { const s = e.authoredSignal; if (!s || s.command !== authoredCommand || s.exitCode !== 0) process.exit(1); const rendered = body('## 판정 신호'); if (!rendered.includes('exit 0') || !rendered.includes(s.command)) process.exit(1); const raw = (s.stdout + '\\n' + s.stderr).trim().slice(-1200) || '(출력 없음)'; if (!rendered.includes(raw.replace(/\\r?\\n/g, ' ⏎ '))) process.exit(1); }",
|
|
2611
2636
|
// ⭐ 핵심 — 문서의 관측값이 로그의 값과 다르면 거부한다.
|
|
2612
2637
|
"if (String(e.observedFail) !== String(failFromLog)) process.exit(1);",
|
|
2613
|
-
"if (body('## 판정 신호').indexOf('fail ' + failFromLog) < 0) process.exit(1);",
|
|
2638
|
+
"if (!e.authoredSignal && body('## 판정 신호').indexOf('fail ' + failFromLog) < 0) process.exit(1);",
|
|
2614
2639
|
// ⛔ 불변식 쪽 관측값도 대조한다 — 한쪽만 보면 다른 쪽에 거짓 수치가 들어간다(리뷰 must-fix).
|
|
2615
2640
|
"if (body('## 불변식').indexOf('관측됨 — fail ' + failFromLog) < 0) process.exit(1);",
|
|
2616
2641
|
// 문서 어디에도 로그와 **다른** fail 수치가 있으면 안 된다(정규식은 런타임에 만든다).
|
|
@@ -2623,8 +2648,9 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
2623
2648
|
// 그 안에 게이트 로그가 통째로 들어 있어 `$(...)`·백틱이 **셸에서 실행**될 수 있었다(리뷰 must-fix).
|
|
2624
2649
|
// ⇒ 파일로 넘기고 검사기가 읽는다. 명령 문자열에는 **고정 리터럴만** 남는다.
|
|
2625
2650
|
writeFileSync(join(root, 'evidence.json'), JSON.stringify(evidence));
|
|
2651
|
+
writeFileSync(join(root, 'checker.cjs'), checker);
|
|
2626
2652
|
const rule = withIndependentChecker({ kind: 'and', rules: [] }, {
|
|
2627
|
-
command:
|
|
2653
|
+
command: 'bun checker.cjs',
|
|
2628
2654
|
timeoutMs: 5_000,
|
|
2629
2655
|
});
|
|
2630
2656
|
const outcome = await evaluateTermination(rule, { vault: {} as never, budget: {} as never, goalRoot: root });
|