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
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
3
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { spawn } from 'node:child_process';
|
|
5
|
+
import { dirname, isAbsolute, relative, resolve } from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { estimateLlmCost } from '../../src/budget/llm-cost.js';
|
|
8
|
+
|
|
9
|
+
export interface ResearchQuestion {
|
|
10
|
+
id: string;
|
|
11
|
+
domain: 'finance' | 'technology' | 'market';
|
|
12
|
+
bloom: string[];
|
|
13
|
+
requiresHigherOrder: boolean;
|
|
14
|
+
prompt: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface HarnessAdapter {
|
|
18
|
+
command: string;
|
|
19
|
+
args: string[];
|
|
20
|
+
cwd?: string;
|
|
21
|
+
model: string;
|
|
22
|
+
toolPolicyId: string;
|
|
23
|
+
maxTurns: number;
|
|
24
|
+
timeoutMs: number;
|
|
25
|
+
usageSource: 'elanous-logs' | 'claude-stream-json';
|
|
26
|
+
usageCommand?: string;
|
|
27
|
+
usageArgs?: string[];
|
|
28
|
+
usageTimeoutMs?: number;
|
|
29
|
+
officialPricing?: { inputPerM: number; outputPerM: number; cacheReadPerM: number; cacheWritePerM: number; sourceUrl: string };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface AdapterConfig {
|
|
33
|
+
version: 2;
|
|
34
|
+
baselineProbe: { command: string; args: string[] };
|
|
35
|
+
cells: Record<string, { description: string; elanous: HarnessAdapter; claudeCode?: HarnessAdapter }>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const ROOT = dirname(fileURLToPath(import.meta.url));
|
|
39
|
+
const QUESTIONS_PATH = resolve(ROOT, 'questions.json');
|
|
40
|
+
const CELL_DESIGNS = [
|
|
41
|
+
{ id: 'A0', group: 'control', bloomCeiling: 0, layout: 'baseline', claudeCode: true },
|
|
42
|
+
{ id: 'A1', group: 'bloom-ablation', bloomCeiling: 3, layout: 'baseline', claudeCode: true },
|
|
43
|
+
{ id: 'A2', group: 'bloom-ablation', bloomCeiling: 5, layout: 'baseline', claudeCode: true },
|
|
44
|
+
{ id: 'A3', group: 'bloom-ablation', bloomCeiling: 6, layout: 'baseline', claudeCode: true },
|
|
45
|
+
{ id: 'B', group: 'product', bloomCeiling: 0, layout: 'product-default', claudeCode: true },
|
|
46
|
+
{ id: 'P1', group: 'layout-ablation', bloomCeiling: 6, layout: 'linear-1-to-6', claudeCode: false },
|
|
47
|
+
{ id: 'P5', group: 'layout-ablation', bloomCeiling: 6, layout: 'p5-front6-parallel-bottom-loop-4-5', claudeCode: false },
|
|
48
|
+
{ id: 'P5-no-front6', group: 'layout-ablation', bloomCeiling: 6, layout: 'p5-without-front6', claudeCode: false },
|
|
49
|
+
] as const;
|
|
50
|
+
const PLACEHOLDERS = ['{prompt}', '{questionId}', '{runId}', '{cellId}', '{bloomCeiling}', '{layout}'] as const;
|
|
51
|
+
const API_STOP_USD = 160;
|
|
52
|
+
const PRICE_SOURCES = ['https://platform.claude.com/docs/en/build-with-claude/prompt-caching', 'https://www.anthropic.com/claude/opus'];
|
|
53
|
+
const BLOOM_STAGE_INSTRUCTIONS: Record<number, string> = {
|
|
54
|
+
3: 'Structure the work explicitly through Bloom stages 1–3: state relevant facts, explain the governing concepts, and apply them to the evidence.',
|
|
55
|
+
5: 'Structure the work explicitly through Bloom stages 1–5: state relevant facts, explain concepts, apply evidence, decompose causes/gaps/contradictions, then evaluate source strength and strongest counterevidence.',
|
|
56
|
+
6: 'Structure the work explicitly through Bloom stages 1–6: state facts, explain concepts, apply evidence, analyze causes/gaps/contradictions, evaluate source strength and counterevidence, then synthesize a conditional scenario/output.',
|
|
57
|
+
};
|
|
58
|
+
const LAYOUT_INSTRUCTIONS: Record<string, string> = {
|
|
59
|
+
'linear-1-to-6': 'Follow one linear sequence exactly once: stages 1→2→3→4→5→6. Do not parallelize or loop back.',
|
|
60
|
+
'p5-front6-parallel-bottom-loop-4-5': 'First reverse-design the target answer with stage 6 (define answer shape only, no speculative findings). Then establish stage 2 axes; gather stages 1 and 3 in parallel for each axis; run a central stage 4/5 loop that adds or deepens only evidence-backed gaps and records why it stops; finally synthesize with stage 6 from evaluated evidence only.',
|
|
61
|
+
'p5-without-front6': 'Establish stage 2 axes; gather stages 1 and 3 in parallel for each axis; run a central stage 4/5 loop that adds or deepens only evidence-backed gaps and records why it stops; finally synthesize with stage 6 from evaluated evidence only. Do not reverse-design the output before research.',
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export function validateQuestions(value: unknown): ResearchQuestion[] {
|
|
65
|
+
if (!Array.isArray(value) || value.length !== 10) throw new Error('questions.json must contain exactly 10 questions');
|
|
66
|
+
const questions = value as ResearchQuestion[];
|
|
67
|
+
const ids = new Set<string>();
|
|
68
|
+
const domains = new Set<string>();
|
|
69
|
+
const blooms = new Set<string>();
|
|
70
|
+
for (const q of questions) {
|
|
71
|
+
if (!q || typeof q.id !== 'string' || !q.id.trim() || ids.has(q.id)) throw new Error('question ids must be non-empty and unique');
|
|
72
|
+
if (!['finance', 'technology', 'market'].includes(q.domain)) throw new Error(`unsupported domain: ${q.domain}`);
|
|
73
|
+
if (!Array.isArray(q.bloom) || !q.bloom.length || typeof q.prompt !== 'string' || !q.prompt.trim()) throw new Error(`invalid question: ${q.id}`);
|
|
74
|
+
ids.add(q.id); domains.add(q.domain); q.bloom.forEach(stage => blooms.add(stage));
|
|
75
|
+
}
|
|
76
|
+
if (domains.size !== 3) throw new Error('questions must cover finance, technology, and market');
|
|
77
|
+
for (const stage of ['remember', 'understand', 'apply', 'analyze', 'evaluate', 'create']) {
|
|
78
|
+
if (!blooms.has(stage)) throw new Error(`questions omit Bloom stage: ${stage}`);
|
|
79
|
+
}
|
|
80
|
+
if (questions.filter(q => q.requiresHigherOrder && q.bloom.some(stage => stage === 'analyze' || stage === 'evaluate')).length < 4) throw new Error('at least four questions must require Bloom analyze/evaluate');
|
|
81
|
+
return questions;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function validateConfig(config: AdapterConfig, totalCapUsd?: number): void {
|
|
85
|
+
if (config.version !== 2 || (totalCapUsd !== undefined && (!Number.isFinite(totalCapUsd) || totalCapUsd <= 0))) throw new Error('config version 2 and positive total cost cap are required');
|
|
86
|
+
if (!config.baselineProbe?.command || !Array.isArray(config.baselineProbe.args)) throw new Error('config requires a baseline version probe');
|
|
87
|
+
const requiredCells = CELL_DESIGNS.map(cell => cell.id);
|
|
88
|
+
for (const cellId of requiredCells) {
|
|
89
|
+
const cell = config.cells?.[cellId];
|
|
90
|
+
if (!cell?.elanous || !cell.elanous.command) throw new Error(`${cellId}: Elanous adapter is required`);
|
|
91
|
+
if (CELL_DESIGNS.find(item => item.id === cellId)!.claudeCode && (!cell.claudeCode || !cell.claudeCode.command)) throw new Error(`${cellId}: Claude Code adapter is required`);
|
|
92
|
+
for (const [name, adapter] of [['elanous', cell.elanous], ...(cell.claudeCode ? [['claudeCode', cell.claudeCode] as const] : [])] as const) {
|
|
93
|
+
if (!Array.isArray(adapter.args) || !adapter.args.some(arg => arg.includes('{prompt}'))) throw new Error(`${name} args must include the prompt placeholder`);
|
|
94
|
+
if (!Number.isInteger(adapter.maxTurns) || adapter.maxTurns < 1) throw new Error(`${name} requires positive maxTurns`);
|
|
95
|
+
if (!Number.isInteger(adapter.timeoutMs) || adapter.timeoutMs < 1000) throw new Error(`${name} timeoutMs must be at least 1000`);
|
|
96
|
+
if (name === 'elanous' && (adapter.usageSource !== 'elanous-logs' || !adapter.usageCommand || !adapter.usageArgs?.some(arg => arg.includes('{sessionId}')) || !adapter.args.some(arg => arg.startsWith('ELANOUS_STATE_DIR=')))) throw new Error('Elanous adapters must pass an isolated ELANOUS_STATE_DIR and read per-session llm-usage logs');
|
|
97
|
+
if (name === 'claudeCode' && adapter.usageSource !== 'claude-stream-json') throw new Error('Claude Code adapters must emit stream-json usage events');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
for (const cellId of ['A0', 'A1', 'A2', 'A3'] as const) {
|
|
101
|
+
const cell = config.cells[cellId]; const a = cell.elanous; const b = cell.claudeCode!;
|
|
102
|
+
if (a.model !== b.model || a.toolPolicyId !== b.toolPolicyId || a.maxTurns !== b.maxTurns || a.timeoutMs !== b.timeoutMs || JSON.stringify(a.officialPricing) !== JSON.stringify(b.officialPricing)) throw new Error(`${cellId}: controlled arm requires matching model, tool, turn, timeout, and pricing conditions`);
|
|
103
|
+
if (cellId !== 'A0') {
|
|
104
|
+
const baseline = config.cells.A0.elanous;
|
|
105
|
+
if (a.model !== baseline.model || a.toolPolicyId !== baseline.toolPolicyId || a.maxTurns !== baseline.maxTurns || a.timeoutMs !== baseline.timeoutMs || JSON.stringify(a.officialPricing) !== JSON.stringify(baseline.officialPricing) || JSON.stringify(b.officialPricing) !== JSON.stringify(config.cells.A0.claudeCode!.officialPricing)) throw new Error(`${cellId}: Bloom ablation must match A0 model/tool/turn/timeout/pricing`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (totalCapUsd !== undefined && (!Number.isFinite(totalCapUsd) || totalCapUsd < API_STOP_USD || totalCapUsd > 200)) throw new Error('approved API spend cap must be between $160 stop threshold and $200 maximum');
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function makeRunPlan(questions: ResearchQuestion[], config: AdapterConfig, runId: string, pilot = false, smokePairs = 0) {
|
|
112
|
+
const selected = smokePairs > 0
|
|
113
|
+
? (['finance', 'technology', 'market'] as const).slice(0, smokePairs).map(domain => questions.find(question => question.domain === domain)!).filter(Boolean)
|
|
114
|
+
: pilot
|
|
115
|
+
? (['finance', 'technology', 'market'] as const).map(domain => questions.find(question => question.domain === domain)!).filter(Boolean)
|
|
116
|
+
: questions;
|
|
117
|
+
const designs = smokePairs > 0 ? CELL_DESIGNS.filter(design => design.id === 'A0') : CELL_DESIGNS;
|
|
118
|
+
return {
|
|
119
|
+
runId,
|
|
120
|
+
questionCount: selected.length,
|
|
121
|
+
...(smokePairs > 0 ? { smokePairs: selected.length } : {}),
|
|
122
|
+
calls: selected.flatMap((question, questionIndex) => designs.flatMap((design, cellIndex) => {
|
|
123
|
+
const harnesses = design.claudeCode
|
|
124
|
+
? ((questionIndex + cellIndex) % 2 === 0 ? ['elanous', 'claudeCode'] as const : ['claudeCode', 'elanous'] as const)
|
|
125
|
+
: ['elanous'] as const;
|
|
126
|
+
return harnesses.map(harness => ({ questionId: question.id, domain: question.domain, cell: design.id, group: design.group, bloomCeiling: design.bloomCeiling, layout: design.layout, harness }));
|
|
127
|
+
})),
|
|
128
|
+
apiCalls: selected.length * designs.length,
|
|
129
|
+
phase: smokePairs > 0 ? 'execution-validation-smoke' : pilot ? 'pilot' : 'full',
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export function buildPrompt(question: ResearchQuestion, call: { cell: string; bloomCeiling: number; layout: string }, date: string): string {
|
|
134
|
+
const bloomDirective = call.bloomCeiling > 0 ? `\n\n${BLOOM_STAGE_INSTRUCTIONS[call.bloomCeiling] ?? BLOOM_STAGE_INSTRUCTIONS[6]}` : '';
|
|
135
|
+
const layoutDirective = LAYOUT_INSTRUCTIONS[call.layout] ? `\n\nExperimental procedure: ${LAYOUT_INSTRUCTIONS[call.layout]}` : '';
|
|
136
|
+
return `Date: ${date}. Research with web sources and cite original URLs for material claims. Mark unknowns instead of guessing. Do not create or edit files. Keep within eight tool turns.\n\n${question.prompt}${bloomDirective}${layoutDirective}`;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function interpolate(args: string[], values: Record<(typeof PLACEHOLDERS)[number], string>): string[] {
|
|
140
|
+
return args.map(arg => PLACEHOLDERS.reduce((result, marker) => result.replaceAll(marker, values[marker]), arg));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function execute(command: string, args: string[], timeoutMs: number, cwd?: string): Promise<{ stdout: string; stderr: string; code: number | null; durationMs: number; timedOut: boolean }> {
|
|
144
|
+
return new Promise((resolvePromise, reject) => {
|
|
145
|
+
const startedAt = Date.now();
|
|
146
|
+
const envNames = new Set(['ELANOUS_STATE_DIR', 'ELANOUS_LLM_PROVIDER', 'ELANOUS_LLM_MODEL', 'ELANOUS_ESCALATE_PROVIDER', 'ELANOUS_ESCALATE_MODEL']);
|
|
147
|
+
const envAssignments = Object.fromEntries(args.flatMap(arg => {
|
|
148
|
+
const match = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/.exec(arg);
|
|
149
|
+
return match && envNames.has(match[1]!) ? [[match[1]!, match[2]!]] : [];
|
|
150
|
+
}));
|
|
151
|
+
const launchArgs = command.split('/').at(-1) === 'env' ? args : args.filter(arg => !/^(ELANOUS_STATE_DIR|ELANOUS_LLM_PROVIDER|ELANOUS_LLM_MODEL|ELANOUS_ESCALATE_PROVIDER|ELANOUS_ESCALATE_MODEL)=/.test(arg));
|
|
152
|
+
const child = spawn(command, launchArgs, { shell: false, ...(cwd ? { cwd } : {}), env: { ...process.env, ...envAssignments }, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
153
|
+
let stdout = '';
|
|
154
|
+
let stderr = '';
|
|
155
|
+
let timedOut = false;
|
|
156
|
+
let killTimer: ReturnType<typeof setTimeout> | undefined;
|
|
157
|
+
const timer = setTimeout(() => {
|
|
158
|
+
timedOut = true;
|
|
159
|
+
child.kill('SIGTERM');
|
|
160
|
+
killTimer = setTimeout(() => child.kill('SIGKILL'), 5_000);
|
|
161
|
+
}, timeoutMs);
|
|
162
|
+
child.stdout.setEncoding('utf8');
|
|
163
|
+
child.stdout.on('data', (part: string) => { stdout += part; if (stdout.length > 8_000_000) { child.kill('SIGTERM'); reject(new Error('adapter stdout exceeded 8 MB')); } });
|
|
164
|
+
child.stderr.setEncoding('utf8');
|
|
165
|
+
child.stderr.on('data', (part: string) => { stderr += part; if (stderr.length > 1_000_000) stderr = stderr.slice(-1_000_000); });
|
|
166
|
+
child.on('error', error => { clearTimeout(timer); if (killTimer) clearTimeout(killTimer); reject(error); });
|
|
167
|
+
child.on('close', code => { clearTimeout(timer); if (killTimer) clearTimeout(killTimer); resolvePromise({ stdout, stderr, code, durationMs: Date.now() - startedAt, timedOut }); });
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
async function latestSessionId(args: string[], startedAt: string): Promise<string | undefined> {
|
|
172
|
+
const stateRoot = args.find(arg => arg.startsWith('ELANOUS_STATE_DIR='))?.slice('ELANOUS_STATE_DIR='.length);
|
|
173
|
+
if (!stateRoot) return undefined;
|
|
174
|
+
try {
|
|
175
|
+
const sessions = JSON.parse(await readFile(resolve(stateRoot, 'sessions/index.json'), 'utf8')) as Array<{ id?: string; createdAt?: string }>;
|
|
176
|
+
return sessions.filter(session => typeof session.id === 'string' && typeof session.createdAt === 'string' && Date.parse(session.createdAt) >= Date.parse(startedAt))
|
|
177
|
+
.sort((left, right) => Date.parse(right.createdAt!) - Date.parse(left.createdAt!))[0]?.id;
|
|
178
|
+
} catch { return undefined; }
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
async function recoveredSessionAnswer(args: string[], sessionId: string): Promise<string | undefined> {
|
|
182
|
+
const stateRoot = args.find(arg => arg.startsWith('ELANOUS_STATE_DIR='))?.slice('ELANOUS_STATE_DIR='.length);
|
|
183
|
+
if (!stateRoot) return undefined;
|
|
184
|
+
try {
|
|
185
|
+
const lines = (await readFile(resolve(stateRoot, 'sessions', `${sessionId}.jsonl`), 'utf8')).split(/\r?\n/).filter(Boolean);
|
|
186
|
+
const assistantRows = lines.flatMap(line => {
|
|
187
|
+
try { const row = JSON.parse(line); return row.role === 'assistant' && typeof row.content === 'string' ? [row] : []; } catch { return []; }
|
|
188
|
+
});
|
|
189
|
+
return assistantRows.at(-1)?.content;
|
|
190
|
+
} catch { return undefined; }
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function sha256(value: string): string { return createHash('sha256').update(value).digest('hex'); }
|
|
194
|
+
|
|
195
|
+
function parseJsonLines(value: string): Record<string, any>[] {
|
|
196
|
+
return value.split(/\r?\n/).flatMap(line => { try { const row = JSON.parse(line); return row && typeof row === 'object' ? [row] : []; } catch { return []; } });
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export function usageCostUsd(usage: { model: string; inputTokens: number; outputTokens: number; cacheReadInputTokens?: number; cacheCreationInputTokens?: number }, officialPricing?: HarnessAdapter['officialPricing']): number {
|
|
200
|
+
if (officialPricing) return (usage.inputTokens * officialPricing.inputPerM + usage.outputTokens * officialPricing.outputPerM + (usage.cacheReadInputTokens ?? 0) * officialPricing.cacheReadPerM + (usage.cacheCreationInputTokens ?? 0) * officialPricing.cacheWritePerM) / 1_000_000;
|
|
201
|
+
const estimate = estimateLlmCost(usage);
|
|
202
|
+
if (estimate.kind === 'unknown' || estimate.kind === 'partial') throw new Error(`no complete catalog price for model ${usage.model}`);
|
|
203
|
+
return estimate.usd;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export async function verifyConfiguredBaseline(config: AdapterConfig, baselineSha: string): Promise<string> {
|
|
207
|
+
const probe = await execute(config.baselineProbe.command, config.baselineProbe.args, 20_000);
|
|
208
|
+
if (probe.timedOut || probe.code !== 0) throw new Error(`baseline version probe failed: ${probe.stderr.slice(-1200) || `exit ${probe.code}`}`);
|
|
209
|
+
const version = probe.stdout.trim();
|
|
210
|
+
if (!version.split(/\s+/).includes(baselineSha)) throw new Error(`baseline version probe did not report ${baselineSha}: ${version || '(empty)'}`);
|
|
211
|
+
return version;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export function validateCliArgs(argv: string[]): void {
|
|
215
|
+
const booleanFlags = new Set(['--dry-run', '--live', '--pilot', '--full', '--no-cost-cap']);
|
|
216
|
+
const valueFlags = new Set(['--config', '--max-total-cost-usd', '--out', '--approval-ref', '--baseline-sha', '--smoke-pairs', '--resume']);
|
|
217
|
+
for (let i = 0; i < argv.length; i++) {
|
|
218
|
+
const flag = argv[i];
|
|
219
|
+
if (booleanFlags.has(flag)) continue;
|
|
220
|
+
if (!valueFlags.has(flag)) throw new Error(`unknown argument: ${flag}`);
|
|
221
|
+
if (!argv[i + 1] || argv[i + 1].startsWith('--')) throw new Error(`${flag} requires a value`);
|
|
222
|
+
i++;
|
|
223
|
+
}
|
|
224
|
+
if (argv.includes('--pilot') && argv.includes('--full')) throw new Error('--pilot and --full are mutually exclusive');
|
|
225
|
+
if ((argv.includes('--pilot') || argv.includes('--full')) && argv.includes('--smoke-pairs')) throw new Error('--smoke-pairs conflicts with --pilot/--full');
|
|
226
|
+
if (argv.includes('--no-cost-cap') && argv.includes('--max-total-cost-usd')) throw new Error('--no-cost-cap conflicts with --max-total-cost-usd');
|
|
227
|
+
if (argv.includes('--no-cost-cap') && !argv.includes('--live')) throw new Error('--no-cost-cap requires --live');
|
|
228
|
+
if (argv.includes('--no-cost-cap') && !argv.includes('--approval-ref')) throw new Error('--no-cost-cap requires --approval-ref (for example OP#42096)');
|
|
229
|
+
if (argv.includes('--approval-ref') && !argv.includes('--no-cost-cap')) throw new Error('--approval-ref requires --no-cost-cap');
|
|
230
|
+
if (argv.includes('--resume') && !argv.includes('--live')) throw new Error('--resume requires --live');
|
|
231
|
+
if (argv.includes('--live') && !argv.includes('--no-cost-cap') && !argv.includes('--max-total-cost-usd')) throw new Error('--live requires --max-total-cost-usd or --no-cost-cap');
|
|
232
|
+
if (argv.includes('--live') && !argv.includes('--pilot') && !argv.includes('--full') && !argv.includes('--smoke-pairs')) throw new Error('--live requires exactly one of --pilot, --full, or --smoke-pairs');
|
|
233
|
+
if (argv.includes('--live') && argv.includes('--smoke-pairs')) {
|
|
234
|
+
const value = Number(argv[argv.indexOf('--smoke-pairs') + 1]);
|
|
235
|
+
if (!Number.isInteger(value) || value < 1 || value > 3) throw new Error('--smoke-pairs must be an integer from 1 to 3');
|
|
236
|
+
}
|
|
237
|
+
if (argv.includes('--live') && !/^[0-9a-f]{40}$/i.test(argv[argv.indexOf('--baseline-sha') + 1] ?? '')) throw new Error('--live requires --baseline-sha with a full 40-character commit SHA');
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export function completedCallKeys(records: Array<Record<string, unknown>>): Set<string> {
|
|
241
|
+
return new Set(records.map(record => `${record.questionId}:${record.cell}:${record.harness}`));
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export function claudeAuthSummary(stdout: string): Record<string, unknown> {
|
|
245
|
+
try {
|
|
246
|
+
const status = JSON.parse(stdout) as Record<string, unknown>;
|
|
247
|
+
return Object.fromEntries(['loggedIn', 'authMethod', 'subscriptionType', 'hasApiKey']
|
|
248
|
+
.filter(key => typeof status[key] === 'boolean' || typeof status[key] === 'string')
|
|
249
|
+
.map(key => [key, status[key]]));
|
|
250
|
+
} catch {
|
|
251
|
+
return { parseError: 'claude auth status returned non-JSON output' };
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export function buildResumeEvent(records: Array<Record<string, unknown>>, ledger: TimeoutLedger, at = new Date().toISOString()): Record<string, unknown> {
|
|
256
|
+
return {
|
|
257
|
+
at,
|
|
258
|
+
savedCallCount: records.length,
|
|
259
|
+
savedFailureCount: records.filter(record => Number(record.exitCode) !== 0 || Boolean(record.error)).length,
|
|
260
|
+
apiSpendUsd: ledger.cumulativeApiSpendUsd,
|
|
261
|
+
accountingIncomplete: Boolean(ledger.accountingIncomplete),
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export function nextClaudeExitOneCount(previousCount: number, exitCode: unknown): number {
|
|
266
|
+
return Number(exitCode) === 1 ? previousCount + 1 : 0;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export function shouldSkipCallAfterClaudeFailures(harness: string, cellId: string, skippedCells: ReadonlySet<string>): boolean {
|
|
270
|
+
return harness === 'claudeCode' && skippedCells.has(cellId);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
async function claudeFailureDiagnostics(command: string): Promise<Record<string, unknown>> {
|
|
274
|
+
const [version, auth] = await Promise.all([
|
|
275
|
+
execute(command, ['--version'], 10_000),
|
|
276
|
+
execute(command, ['auth', 'status', '--json'], 10_000),
|
|
277
|
+
]);
|
|
278
|
+
return {
|
|
279
|
+
sampledAt: new Date().toISOString(),
|
|
280
|
+
version: version.code === 0 ? version.stdout.trim().slice(0, 200) : `unavailable (exit ${version.code ?? 'null'})`,
|
|
281
|
+
auth: auth.code === 0 ? claudeAuthSummary(auth.stdout) : { unavailable: `exit ${auth.code ?? 'null'}` },
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
async function collectUsage(adapter: HarnessAdapter, stdout: string, fallbackSessionId?: string): Promise<{ usage: Array<Record<string, unknown>>; apiSpendUsd: number; sessionId?: string }> {
|
|
286
|
+
if (adapter.usageSource === 'claude-stream-json') {
|
|
287
|
+
const events = parseJsonLines(stdout);
|
|
288
|
+
const usage = events.flatMap(event => {
|
|
289
|
+
const raw = event.message?.usage ?? event.usage;
|
|
290
|
+
if (!raw) return [];
|
|
291
|
+
const reportedModel = event.message?.model ?? event.model;
|
|
292
|
+
const model = typeof reportedModel === 'string' ? reportedModel : 'unknown';
|
|
293
|
+
const inputTokens = raw.input_tokens ?? raw.inputTokens;
|
|
294
|
+
const outputTokens = raw.output_tokens ?? raw.outputTokens;
|
|
295
|
+
if (typeof inputTokens !== 'number' || typeof outputTokens !== 'number') return [];
|
|
296
|
+
const tokens = { model, inputTokens, outputTokens, cacheReadInputTokens: raw.cache_read_input_tokens ?? raw.cacheReadInputTokens ?? 0, cacheCreationInputTokens: raw.cache_creation_input_tokens ?? raw.cacheCreationInputTokens ?? 0 };
|
|
297
|
+
let apiEquivalentUsd: number | undefined;
|
|
298
|
+
try { apiEquivalentUsd = usageCostUsd(tokens, model === adapter.model ? adapter.officialPricing : undefined); } catch { /* retain the token record; mark its price unknown */ }
|
|
299
|
+
return [{ ...tokens, apiSpendUsd: 0, apiEquivalentUsd, billing: 'subscription' }];
|
|
300
|
+
});
|
|
301
|
+
if (!usage.length) throw new Error('Claude stream-json contained no token usage; refusing to advance the spend ledger');
|
|
302
|
+
return { usage, apiSpendUsd: 0 };
|
|
303
|
+
}
|
|
304
|
+
const response = parseJsonLines(stdout).find(row => typeof row.sessionId === 'string');
|
|
305
|
+
const sessionId = response?.sessionId ?? fallbackSessionId;
|
|
306
|
+
if (!sessionId) throw new Error('Elanous JSON response and isolated session index did not include sessionId');
|
|
307
|
+
const usageArgs = (adapter.usageArgs ?? []).map(arg => arg.replaceAll('{sessionId}', sessionId));
|
|
308
|
+
const result = await execute(adapter.usageCommand!, usageArgs, adapter.usageTimeoutMs ?? Math.min(adapter.timeoutMs, 30_000), adapter.cwd);
|
|
309
|
+
if (result.timedOut) throw new Error(`Elanous usage log query timed out after ${adapter.timeoutMs}ms`);
|
|
310
|
+
if (result.code !== 0) throw new Error(`Elanous usage log query exited ${result.code}: ${result.stderr.slice(-1200)}`);
|
|
311
|
+
const rows = parseJsonLines(result.stdout).filter(row => row.session_id === sessionId && row.event === 'llm-usage');
|
|
312
|
+
const usage = rows.map(row => {
|
|
313
|
+
const data = row.data ?? {}; const cost = data.cost ?? {};
|
|
314
|
+
if (typeof data.inputTokens !== 'number' || typeof data.outputTokens !== 'number') throw new Error('Elanous usage event omitted token counts');
|
|
315
|
+
const billing = data.billing ?? 'unknown';
|
|
316
|
+
const tokens = { model: data.model, inputTokens: data.inputTokens, outputTokens: data.outputTokens, cacheReadInputTokens: data.cacheReadInputTokens ?? 0, cacheCreationInputTokens: data.cacheCreationInputTokens ?? 0 };
|
|
317
|
+
let officialModelCost: number | undefined;
|
|
318
|
+
try { officialModelCost = usageCostUsd(tokens, data.model === adapter.model ? adapter.officialPricing : undefined); } catch { /* fall back to the provider's recorded model-catalog estimate below */ }
|
|
319
|
+
const knownCatalogCost = ['known', 'actual', 'included'].includes(cost.kind) && typeof cost.usd === 'number';
|
|
320
|
+
if (billing === 'api' && officialModelCost === undefined && !knownCatalogCost) throw new Error(`unknown API price for ${data.model}; refusing to advance the spend ledger`);
|
|
321
|
+
const apiSpendUsd = billing === 'api' ? (officialModelCost ?? cost.usd) : 0;
|
|
322
|
+
if (billing === 'unknown') throw new Error(`unknown billing route for ${data.model}; refusing to advance the spend ledger`);
|
|
323
|
+
return { ...tokens, apiSpendUsd, billing, apiEquivalentUsd: officialModelCost ?? cost.apiEquivalentUsd ?? (knownCatalogCost ? cost.usd : undefined), priceSource: adapter.officialPricing?.sourceUrl ?? cost.source ?? (knownCatalogCost ? 'model-catalog' : undefined) };
|
|
324
|
+
});
|
|
325
|
+
if (!usage.length) throw new Error('Elanous session had no llm-usage events; refusing to advance the spend ledger');
|
|
326
|
+
return { usage, apiSpendUsd: usage.reduce((sum, row) => sum + Number(row.apiSpendUsd ?? 0), 0), sessionId };
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
interface TimeoutLedger {
|
|
330
|
+
runId: string;
|
|
331
|
+
maxApiSpendUsd: number | null;
|
|
332
|
+
stopBeforeNextPairAtUsd: number | null;
|
|
333
|
+
cumulativeApiSpendUsd: number;
|
|
334
|
+
accountingIncomplete?: boolean;
|
|
335
|
+
records: unknown[];
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
export async function processTimedOutInvocation(input: {
|
|
339
|
+
adapter: HarnessAdapter;
|
|
340
|
+
args: string[];
|
|
341
|
+
call: object;
|
|
342
|
+
prompt: string;
|
|
343
|
+
startedAt: string;
|
|
344
|
+
result: Awaited<ReturnType<typeof execute>>;
|
|
345
|
+
outDir: string;
|
|
346
|
+
records: Record<string, unknown>[];
|
|
347
|
+
ledger: TimeoutLedger;
|
|
348
|
+
}): Promise<{ stop: boolean }> {
|
|
349
|
+
const { adapter, args, call, prompt, startedAt, result, outDir, records, ledger } = input;
|
|
350
|
+
const sessionId = adapter.usageSource === 'elanous-logs' ? await latestSessionId(args, startedAt) : undefined;
|
|
351
|
+
const recoveredAnswer = sessionId ? await recoveredSessionAnswer(args, sessionId) : undefined;
|
|
352
|
+
let usage: Awaited<ReturnType<typeof collectUsage>> | undefined;
|
|
353
|
+
let usageError: string | undefined;
|
|
354
|
+
try { usage = await collectUsage(adapter, result.stdout, sessionId); }
|
|
355
|
+
catch (error) { usageError = error instanceof Error ? error.message : String(error); }
|
|
356
|
+
if (usage) ledger.cumulativeApiSpendUsd += usage.apiSpendUsd;
|
|
357
|
+
const finishedAt = new Date().toISOString();
|
|
358
|
+
const record = {
|
|
359
|
+
...call,
|
|
360
|
+
startedAt,
|
|
361
|
+
finishedAt,
|
|
362
|
+
elapsedMs: result.durationMs,
|
|
363
|
+
exitCode: result.code,
|
|
364
|
+
timedOut: true,
|
|
365
|
+
error: `adapter timed out after ${adapter.timeoutMs}ms`,
|
|
366
|
+
...(usageError ? { usageError } : {}),
|
|
367
|
+
model: adapter.model,
|
|
368
|
+
promptSha256: sha256(prompt),
|
|
369
|
+
...(usage ? { usage: usage.usage, apiSpendUsd: usage.apiSpendUsd, sessionId: usage.sessionId } : sessionId ? { sessionId } : {}),
|
|
370
|
+
stdout: result.stdout,
|
|
371
|
+
...(recoveredAnswer ? { recoveredAnswer, recoveredAnswerSource: 'isolated-session-final-assistant-message' } : {}),
|
|
372
|
+
stderr: result.stderr.slice(-1200),
|
|
373
|
+
};
|
|
374
|
+
records.push(record);
|
|
375
|
+
ledger.records.push({
|
|
376
|
+
...call,
|
|
377
|
+
finishedAt,
|
|
378
|
+
elapsedMs: result.durationMs,
|
|
379
|
+
timeout: true,
|
|
380
|
+
...(usage ? { usage: usage.usage, apiSpendUsd: usage.apiSpendUsd } : { usageError }),
|
|
381
|
+
sessionId,
|
|
382
|
+
cumulativeApiSpendUsd: ledger.cumulativeApiSpendUsd,
|
|
383
|
+
});
|
|
384
|
+
if (usageError) ledger.accountingIncomplete = true;
|
|
385
|
+
await writeFile(resolve(outDir, `${ledger.runId}.results.json`), JSON.stringify(records, null, 2));
|
|
386
|
+
await writeFile(resolve(outDir, `${ledger.runId}.ledger.json`), JSON.stringify(ledger, null, 2));
|
|
387
|
+
return { stop: Boolean(usageError) };
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
async function main(argv: string[]): Promise<void> {
|
|
391
|
+
const dryRun = argv.includes('--dry-run');
|
|
392
|
+
const live = argv.includes('--live');
|
|
393
|
+
const pilot = argv.includes('--pilot');
|
|
394
|
+
const smokePairs = Number(argv.includes('--smoke-pairs') ? argv[argv.indexOf('--smoke-pairs') + 1] : 0);
|
|
395
|
+
const noCostCap = argv.includes('--no-cost-cap');
|
|
396
|
+
validateCliArgs(argv);
|
|
397
|
+
if (dryRun === live) {
|
|
398
|
+
throw new Error('usage: run.ts --dry-run | --live (--pilot|--full|--smoke-pairs <count>) --baseline-sha <sha> --config <json> (--max-total-cost-usd <usd>|--no-cost-cap --approval-ref <OP#id>) --out <seat-state/OP/evidence/path>');
|
|
399
|
+
}
|
|
400
|
+
const questions = validateQuestions(JSON.parse(await readFile(QUESTIONS_PATH, 'utf8')));
|
|
401
|
+
if (dryRun) {
|
|
402
|
+
process.stdout.write(`${JSON.stringify({ mode: 'dry-run', providerCalls: 0, questions: questions.map(({ id, domain, bloom, requiresHigherOrder }) => ({ id, domain, bloom, requiresHigherOrder })), cells: CELL_DESIGNS, smokePairCalls: 6, pilotCalls: 39, fullCalls: 130, elanousApiCallsPilot: 24, elanousApiCallsFull: 80, maxApiSpendUsd: 200, stopBeforeNextPairAtUsd: API_STOP_USD, controlArmConditionsRequired: ['same model', 'same tool policy', 'same turns', 'same timeout'], priceSources: PRICE_SOURCES, layoutCells: 'Elanous only; same Opus model' }, null, 2)}\n`);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
const getArg = (flag: string): string | undefined => { const i = argv.indexOf(flag); return i >= 0 ? argv[i + 1] : undefined; };
|
|
406
|
+
const configPath = getArg('--config'); const outDirArg = getArg('--out'); const cap = noCostCap ? undefined : Number(getArg('--max-total-cost-usd')); const approvalRef = getArg('--approval-ref'); const baselineSha = getArg('--baseline-sha')!;
|
|
407
|
+
if (!configPath || !outDirArg) throw new Error('--config and --out are required for live mode');
|
|
408
|
+
const outDir = resolve(outDirArg);
|
|
409
|
+
const evidenceRoot = resolve(process.env.HOME ?? '', 'elanous-hq/seat-state/OP/evidence');
|
|
410
|
+
const outRelative = relative(evidenceRoot, outDir);
|
|
411
|
+
if (!outRelative || outRelative.startsWith('..') || isAbsolute(outRelative)) throw new Error('--out must be under seat-state/OP/evidence');
|
|
412
|
+
const config = JSON.parse(await readFile(resolve(configPath), 'utf8')) as AdapterConfig;
|
|
413
|
+
validateConfig(config, cap);
|
|
414
|
+
const resumeId = getArg('--resume');
|
|
415
|
+
const runId = resumeId ?? randomUUID();
|
|
416
|
+
if (smokePairs > 3) throw new Error('--smoke-pairs must be an integer from 1 to 3');
|
|
417
|
+
const baselineVersion = await verifyConfiguredBaseline(config, baselineSha);
|
|
418
|
+
const plan = makeRunPlan(questions, config, runId, pilot, smokePairs);
|
|
419
|
+
await mkdir(outDir, { recursive: true });
|
|
420
|
+
const maxApiSpendUsd = cap ?? null;
|
|
421
|
+
const stopBeforeNextPairAtUsd = noCostCap ? null : API_STOP_USD;
|
|
422
|
+
const manifestPath = resolve(outDir, `${runId}.manifest.json`);
|
|
423
|
+
const resultsPath = resolve(outDir, `${runId}.results.json`);
|
|
424
|
+
const ledgerPath = resolve(outDir, `${runId}.ledger.json`);
|
|
425
|
+
const manifest = { ...plan, baselineSha, baselineVersion, maxApiSpendUsd, stopBeforeNextPairAtUsd, ...(approvalRef ? { uncappedApprovalRef: approvalRef } : {}), priceSources: PRICE_SOURCES, questionHashes: Object.fromEntries(questions.map(q => [q.id, sha256(q.prompt)])) };
|
|
426
|
+
if (resumeId) {
|
|
427
|
+
const priorManifest = JSON.parse(await readFile(manifestPath, 'utf8')) as typeof manifest & { runId: string; resumeEvents?: Record<string, unknown>[] };
|
|
428
|
+
if (priorManifest.runId !== resumeId || priorManifest.baselineSha !== baselineSha || JSON.stringify(priorManifest.calls) !== JSON.stringify(plan.calls)) throw new Error('--resume manifest does not match this baseline and call plan');
|
|
429
|
+
const resumeEvents = [...(priorManifest.resumeEvents ?? []), buildResumeEvent(JSON.parse(await readFile(resultsPath, 'utf8')), JSON.parse(await readFile(ledgerPath, 'utf8')) as TimeoutLedger)];
|
|
430
|
+
await writeFile(manifestPath, JSON.stringify({ ...priorManifest, resumeEvents }, null, 2));
|
|
431
|
+
} else {
|
|
432
|
+
await writeFile(manifestPath, JSON.stringify({ ...manifest, startedAt: new Date().toISOString() }, null, 2));
|
|
433
|
+
}
|
|
434
|
+
const records: Record<string, unknown>[] = resumeId ? JSON.parse(await readFile(resultsPath, 'utf8')) : [];
|
|
435
|
+
const ledger: TimeoutLedger = resumeId ? JSON.parse(await readFile(ledgerPath, 'utf8')) : { runId, maxApiSpendUsd, stopBeforeNextPairAtUsd, cumulativeApiSpendUsd: 0, records: [] };
|
|
436
|
+
if (ledger.runId !== runId) throw new Error('--resume ledger run id mismatch');
|
|
437
|
+
for (const record of records) {
|
|
438
|
+
if (record.harness === 'claudeCode' && Number(record.exitCode) !== 0 && !String(record.stderr ?? '').trim() && !record.claudeDiagnostics) {
|
|
439
|
+
record.claudeDiagnostics = await claudeFailureDiagnostics(config.cells[String(record.cell)]!.claudeCode!.command);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
if (resumeId) await writeFile(resultsPath, JSON.stringify(records, null, 2));
|
|
443
|
+
const completedCalls = completedCallKeys(records);
|
|
444
|
+
const claudeExitOneCounts = new Map<string, number>();
|
|
445
|
+
const skippedCells = new Set<string>();
|
|
446
|
+
const teamclaudeStatuses = new Map<string, string>();
|
|
447
|
+
for (const record of records) {
|
|
448
|
+
const cell = String(record.cell ?? '');
|
|
449
|
+
if (typeof record.teamclaudeStatus === 'string') teamclaudeStatuses.set(cell, record.teamclaudeStatus);
|
|
450
|
+
if (record.harness === 'claudeCode') {
|
|
451
|
+
const next = nextClaudeExitOneCount(claudeExitOneCounts.get(cell) ?? 0, record.exitCode);
|
|
452
|
+
claudeExitOneCounts.set(cell, next);
|
|
453
|
+
if (next >= 3) skippedCells.add(cell);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
let activePair = '';
|
|
457
|
+
let stoppedAtThreshold = false;
|
|
458
|
+
for (const call of plan.calls) {
|
|
459
|
+
if (completedCalls.has(`${call.questionId}:${call.cell}:${call.harness}`)) continue;
|
|
460
|
+
if (shouldSkipCallAfterClaudeFailures(call.harness, call.cell, skippedCells)) {
|
|
461
|
+
if (!teamclaudeStatuses.has(call.cell)) {
|
|
462
|
+
const status = await execute('teamclaude', ['status'], 10_000, config.cells[call.cell].claudeCode?.cwd);
|
|
463
|
+
teamclaudeStatuses.set(call.cell, (status.stdout || status.stderr).trim().split('\n').slice(0, 1).join(' ').slice(0, 500) || `teamclaude status exited ${status.code}`);
|
|
464
|
+
}
|
|
465
|
+
const row = { ...call, finishedAt: new Date().toISOString(), exitCode: null, skipped: true, error: 'configuration skipped after three Claude Code exit 1 failures', teamclaudeStatus: teamclaudeStatuses.get(call.cell) };
|
|
466
|
+
records.push(row);
|
|
467
|
+
completedCalls.add(`${call.questionId}:${call.cell}:${call.harness}`);
|
|
468
|
+
await writeFile(resultsPath, JSON.stringify(records, null, 2));
|
|
469
|
+
continue;
|
|
470
|
+
}
|
|
471
|
+
const pairKey = `${call.questionId}:${call.cell}`;
|
|
472
|
+
if (!noCostCap && activePair && pairKey !== activePair && ledger.cumulativeApiSpendUsd >= API_STOP_USD) { stoppedAtThreshold = true; break; }
|
|
473
|
+
activePair = pairKey;
|
|
474
|
+
const q = questions.find(item => item.id === call.questionId)!;
|
|
475
|
+
const adapter = config.cells[call.cell][call.harness]!;
|
|
476
|
+
const prompt = buildPrompt(q, call, new Date().toISOString().slice(0, 10));
|
|
477
|
+
const args = interpolate(adapter.args, { '{prompt}': prompt, '{questionId}': q.id, '{runId}': runId, '{cellId}': call.cell, '{bloomCeiling}': String(call.bloomCeiling), '{layout}': call.layout });
|
|
478
|
+
const startedAt = new Date().toISOString();
|
|
479
|
+
let rawResult: Awaited<ReturnType<typeof execute>> | undefined;
|
|
480
|
+
try {
|
|
481
|
+
const result = await execute(adapter.command, args, adapter.timeoutMs, adapter.cwd);
|
|
482
|
+
rawResult = result;
|
|
483
|
+
if (result.timedOut) {
|
|
484
|
+
const outcome = await processTimedOutInvocation({ adapter, args, call, prompt, startedAt, result, outDir, records, ledger });
|
|
485
|
+
if (outcome.stop) break;
|
|
486
|
+
continue;
|
|
487
|
+
}
|
|
488
|
+
if (result.code !== 0) throw new Error(`${call.harness} exited ${result.code}: ${result.stderr.slice(-1200)}`);
|
|
489
|
+
const usage = await collectUsage(adapter, result.stdout);
|
|
490
|
+
ledger.cumulativeApiSpendUsd += usage.apiSpendUsd;
|
|
491
|
+
const record = { ...call, startedAt, finishedAt: new Date().toISOString(), elapsedMs: result.durationMs, exitCode: result.code, model: adapter.model, promptSha256: sha256(prompt), usage: usage.usage, apiSpendUsd: usage.apiSpendUsd, sessionId: usage.sessionId, stdout: result.stdout };
|
|
492
|
+
records.push(record);
|
|
493
|
+
ledger.records.push({ ...call, finishedAt: record.finishedAt, elapsedMs: result.durationMs, usage: usage.usage, apiSpendUsd: usage.apiSpendUsd, cumulativeApiSpendUsd: ledger.cumulativeApiSpendUsd });
|
|
494
|
+
await writeFile(resultsPath, JSON.stringify(records, null, 2));
|
|
495
|
+
await writeFile(ledgerPath, JSON.stringify(ledger, null, 2));
|
|
496
|
+
} catch (error) {
|
|
497
|
+
const record: Record<string, unknown> = { ...call, startedAt, finishedAt: new Date().toISOString(), exitCode: rawResult?.code, error: error instanceof Error ? error.message : String(error), stdout: rawResult?.stdout, stderr: rawResult?.stderr?.slice(-1200) };
|
|
498
|
+
if (call.harness === 'claudeCode' && !String(record.stderr ?? '').trim()) record.claudeDiagnostics = await claudeFailureDiagnostics(adapter.command);
|
|
499
|
+
records.push(record);
|
|
500
|
+
ledger.records.push({ ...call, finishedAt: new Date().toISOString(), exitCode: rawResult?.code, failed: true, accounting: adapter.usageSource === 'claude-stream-json' ? 'subscription-billed; no API spend' : 'unknown' });
|
|
501
|
+
if (call.harness === 'claudeCode') {
|
|
502
|
+
const next = nextClaudeExitOneCount(claudeExitOneCounts.get(call.cell) ?? 0, rawResult?.code);
|
|
503
|
+
claudeExitOneCounts.set(call.cell, next);
|
|
504
|
+
if (next >= 3) {
|
|
505
|
+
skippedCells.add(call.cell);
|
|
506
|
+
const status = await execute('teamclaude', ['status'], 10_000, adapter.cwd);
|
|
507
|
+
record.teamclaudeStatus = (status.stdout || status.stderr).trim().split('\n').slice(0, 1).join(' ').slice(0, 500) || `teamclaude status exited ${status.code}`;
|
|
508
|
+
teamclaudeStatuses.set(call.cell, String(record.teamclaudeStatus));
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
if (adapter.usageSource !== 'claude-stream-json') ledger.accountingIncomplete = true;
|
|
512
|
+
await writeFile(resultsPath, JSON.stringify(records, null, 2));
|
|
513
|
+
await writeFile(ledgerPath, JSON.stringify(ledger, null, 2));
|
|
514
|
+
completedCalls.add(`${call.questionId}:${call.cell}:${call.harness}`);
|
|
515
|
+
continue;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
process.stdout.write(`${JSON.stringify({ runId, completedCalls: records.length, cumulativeApiSpendUsd: ledger.cumulativeApiSpendUsd, accountingIncomplete: Boolean(ledger.accountingIncomplete), ...(ledger.accountingIncomplete ? { stopReason: 'usage-accounting-incomplete' } : {}), stoppedAt80Percent: stoppedAtThreshold, output: outDir })}\n`);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
if (import.meta.main) {
|
|
522
|
+
main(process.argv.slice(2)).catch(error => { console.error(`research-bench: ${error instanceof Error ? error.message : String(error)}`); process.exitCode = 1; });
|
|
523
|
+
}
|