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
package/src/tui/slash/resume.ts
CHANGED
|
@@ -3,30 +3,10 @@
|
|
|
3
3
|
// n8n restart «/resume» started an investigation instead of showing the sessions to pick from.
|
|
4
4
|
import { debug } from '../../debug/log.js';
|
|
5
5
|
import { listSessions, resolveSessionId, setActiveSessionId, type SessionMeta } from '../../session/index.js';
|
|
6
|
+
import { RESUME_BUSY_STATUS, RESUME_LIST_LIMIT } from './resume-command.js';
|
|
6
7
|
import { idPrefixCell, sessionIdPrefixes, sessionListTime } from '../../session/id-prefix.js';
|
|
7
|
-
|
|
8
|
-
export
|
|
9
|
-
/** Rows shown by `/resume` · `/session list`. */
|
|
10
|
-
export const RESUME_LIST_LIMIT = 12;
|
|
11
|
-
|
|
12
|
-
export type ResumeCommand =
|
|
13
|
-
| { readonly kind: 'list' }
|
|
14
|
-
| { readonly kind: 'load'; readonly prefix: string };
|
|
15
|
-
|
|
16
|
-
/** `/resume` · `/session` · `/session list|ls` → list; `/resume <id>` · `/session load|resume <id>` → load. */
|
|
17
|
-
export function parseResumeCommand(text: string): ResumeCommand | null {
|
|
18
|
-
const [cmd, sub, arg, ...rest] = text.trim().split(/\s+/);
|
|
19
|
-
if (rest.length > 0) return null;
|
|
20
|
-
if (cmd === '/resume') {
|
|
21
|
-
if (arg !== undefined) return null;
|
|
22
|
-
return sub === undefined ? { kind: 'list' } : { kind: 'load', prefix: sub };
|
|
23
|
-
}
|
|
24
|
-
if (cmd === '/session' || cmd === '/sessions') {
|
|
25
|
-
if (sub === undefined || ((sub === 'list' || sub === 'ls') && arg === undefined)) return { kind: 'list' };
|
|
26
|
-
if ((sub === 'load' || sub === 'resume') && arg !== undefined) return { kind: 'load', prefix: arg };
|
|
27
|
-
}
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
8
|
+
export { RESUME_BUSY_STATUS, RESUME_LIST_LIMIT, parseResumeCommand } from './resume-command.js';
|
|
9
|
+
export type { ResumeCommand } from './resume-command.js';
|
|
30
10
|
|
|
31
11
|
/** Recent conversations, newest first — the rows `/resume` shows (empty scratch sessions hidden, the active one kept). */
|
|
32
12
|
export function resumeCandidates(activeId: string | null, limit = RESUME_LIST_LIMIT): SessionMeta[] {
|
|
@@ -48,8 +48,9 @@ export async function handleNextTuiTermSlash(args: string[], context: NextTuiTer
|
|
|
48
48
|
' /term list List terminal sessions.',
|
|
49
49
|
' /term status Show live/exited session counts.',
|
|
50
50
|
' /term matrix Show terminal transport and liveness.',
|
|
51
|
+
' /side Open the Next TUI session/PTY sidetab.',
|
|
51
52
|
' Unknown cwd or exit codes are shown as unknown.',
|
|
52
|
-
'
|
|
53
|
+
' Next TUI mutations use explicit /side new and /side kill commands.',
|
|
53
54
|
);
|
|
54
55
|
} else if (command === 'status') {
|
|
55
56
|
const sessions = await context.sessions.list();
|
package/src/tui/slash/term.ts
CHANGED
|
@@ -176,7 +176,10 @@ type TermSubHandler = (sub: string, args: string[], ctx: TermSlashContext, local
|
|
|
176
176
|
|
|
177
177
|
async function termHelp(sub: string, args: string[], ctx: TermSlashContext, locals: TermSlashLocals): Promise<void> {
|
|
178
178
|
const { slashRuntime } = locals;
|
|
179
|
-
|
|
179
|
+
const lines = (args[1] ?? '').toLowerCase() === 'experimental'
|
|
180
|
+
? slashRuntime.experimentalHelpLines()
|
|
181
|
+
: slashRuntime.helpLines();
|
|
182
|
+
for (const line of lines) ctx.chatLines.push(line);
|
|
180
183
|
ctx.setChatScrollOffset(-1);
|
|
181
184
|
return;
|
|
182
185
|
}
|
|
@@ -850,6 +853,14 @@ export async function handleTermSlash(args: string[], ctx: TermSlashContext): Pr
|
|
|
850
853
|
// dispatchTerminalModalObserve. Behavior preserved verbatim from
|
|
851
854
|
// the inline case.
|
|
852
855
|
const sub = (args[0] ?? '').toLowerCase();
|
|
856
|
+
const destination = (args[2] ?? '').trim().toLowerCase();
|
|
857
|
+
if (sub === 'vw-bar' || sub === 'vwbar' || sub === 'vw-sync' || sub === 'vwsync'
|
|
858
|
+
|| (sub === 'move' && (destination === 'vw' || destination === 'window'))) {
|
|
859
|
+
const command = sub === 'move' ? 'move <id> vw' : sub === 'vwbar' ? 'vw-bar' : sub === 'vwsync' ? 'vw-sync' : sub;
|
|
860
|
+
ctx.chatLines.push(ctx.warning(` /term ${command} is retired; it no longer changes terminal state.`));
|
|
861
|
+
ctx.setChatScrollOffset(-1);
|
|
862
|
+
return;
|
|
863
|
+
}
|
|
853
864
|
const slashRuntime = ctx.termSlash.slashRuntime;
|
|
854
865
|
const sessionRegistry = ctx.termSlash.sessionRegistry;
|
|
855
866
|
const terminalMatrix = ctx.termSlash.terminalMatrix;
|
|
@@ -133,6 +133,8 @@ export interface DashboardSendRequest {
|
|
|
133
133
|
/** TUI-TURN-NARRATION — `agent_thought_chunk` ⊕ `_meta.reasoning: true`(추론 요약 문단).
|
|
134
134
|
* 전에는 usage 봉투가 아니면 버려서 화면에 0줄이었다(결함 #87). */
|
|
135
135
|
onThought?(text: string): void;
|
|
136
|
+
/** Transient runtime status (`_meta.status: true`), kept separate from model reasoning. */
|
|
137
|
+
onStatus?(text: string): void;
|
|
136
138
|
}
|
|
137
139
|
|
|
138
140
|
export interface DashboardSendResult {
|
|
@@ -553,7 +555,7 @@ function buildSendInterceptor(req: DashboardSendRequest): SessionUpdateIntercept
|
|
|
553
555
|
rawInput?: unknown;
|
|
554
556
|
rawOutput?: unknown;
|
|
555
557
|
status?: string;
|
|
556
|
-
_meta?: { reasoning?: unknown };
|
|
558
|
+
_meta?: { reasoning?: unknown; status?: unknown };
|
|
557
559
|
};
|
|
558
560
|
};
|
|
559
561
|
const inner = n.update;
|
|
@@ -588,6 +590,10 @@ function buildSendInterceptor(req: DashboardSendRequest): SessionUpdateIntercept
|
|
|
588
590
|
case 'agent_thought_chunk': {
|
|
589
591
|
if (inner.content?.type !== 'text') return;
|
|
590
592
|
const text = inner.content.text ?? '';
|
|
593
|
+
if (inner._meta?.status === true) {
|
|
594
|
+
req.onStatus?.(text);
|
|
595
|
+
return;
|
|
596
|
+
}
|
|
591
597
|
if (inner._meta?.reasoning === true) {
|
|
592
598
|
req.onThought?.(text);
|
|
593
599
|
return;
|
|
@@ -2,8 +2,14 @@
|
|
|
2
2
|
import type { NextTuiCompactDeps, NextTuiCompactOutcome } from '../tui/slash/compact.js';
|
|
3
3
|
import { NEXT_TUI_WAKEUP_IPC_ENV, answerWakeupCall, isWakeupCallMessage, nextTuiWakeupTool } from './next-wakeup.js';
|
|
4
4
|
import { isNextTuiSelfHealthSnapshot, type NextTuiSelfHealthSnapshot } from '../tui/chat/self-health-status.js';
|
|
5
|
+
import { answerNextSidetabCall, isNextSidetabCall, type NextSidetabHandler } from '../tui/sidetab/nl-tool.js';
|
|
5
6
|
|
|
6
7
|
const STATUS_PREFIX = 'ELANOUS_TUI_BG_STATUS\t';
|
|
8
|
+
let nextSidetabHandler: NextSidetabHandler | null = null;
|
|
9
|
+
|
|
10
|
+
export function setNextSidetabHandler(handler: NextSidetabHandler | null): void {
|
|
11
|
+
nextSidetabHandler = handler;
|
|
12
|
+
}
|
|
7
13
|
|
|
8
14
|
interface TurnResult {
|
|
9
15
|
event?: string | null;
|
|
@@ -18,6 +24,7 @@ interface TurnResult {
|
|
|
18
24
|
interface WaitingTurn {
|
|
19
25
|
turnId: string;
|
|
20
26
|
onDelta?: (text: string) => void;
|
|
27
|
+
onStatus?: (text: string) => void;
|
|
21
28
|
resolve: (result: TurnResult) => void;
|
|
22
29
|
reject: (error: Error) => void;
|
|
23
30
|
}
|
|
@@ -37,6 +44,7 @@ class LocalChatSession {
|
|
|
37
44
|
// TUI-NEXT-QUEUE-AND-WAKE: the child's ScheduleWakeup asks this process over Bun IPC — the scheduler
|
|
38
45
|
// lives here because the child dies on Esc and /new. No tool registered → no IPC, env unchanged.
|
|
39
46
|
const wakeupTool = nextTuiWakeupTool();
|
|
47
|
+
const sidetabHandler = nextSidetabHandler;
|
|
40
48
|
this.child = Bun.spawn({
|
|
41
49
|
cmd: [process.execPath, cli, 'repl', '--session', sessionId, '--json', '--stdin-jsonl'],
|
|
42
50
|
stdin: 'pipe', stdout: 'pipe', stderr: 'pipe',
|
|
@@ -44,13 +52,19 @@ class LocalChatSession {
|
|
|
44
52
|
...process.env, ELANOUS_NEXT_TUI_BG_STATUS: '1', ELANOUS_NEXT_TUI_STREAM: '1',
|
|
45
53
|
ELANOUS_NEXT_TUI_SELF_HEALTH: '1',
|
|
46
54
|
...(wakeupTool ? { [NEXT_TUI_WAKEUP_IPC_ENV]: '1' } : {}),
|
|
55
|
+
ELANOUS_NEXT_TUI_SIDETAB_IPC: sidetabHandler ? '1' : '0',
|
|
47
56
|
},
|
|
48
|
-
...(wakeupTool ? {
|
|
57
|
+
...(wakeupTool || sidetabHandler ? {
|
|
49
58
|
ipc: (message: unknown, child: { send(message: unknown): unknown }) => {
|
|
50
|
-
if (
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
59
|
+
if (wakeupTool && isWakeupCallMessage(message)) {
|
|
60
|
+
void answerWakeupCall(wakeupTool, message).then((reply) => {
|
|
61
|
+
try { child.send(reply); } catch { /* the child exited mid-call; its dispatch times out */ }
|
|
62
|
+
});
|
|
63
|
+
} else if (sidetabHandler && isNextSidetabCall(message)) {
|
|
64
|
+
void answerNextSidetabCall(sidetabHandler, message).then((reply) => {
|
|
65
|
+
try { child.send(reply); } catch { /* the child exited mid-call; its dispatch times out */ }
|
|
66
|
+
});
|
|
67
|
+
}
|
|
54
68
|
},
|
|
55
69
|
} : {}),
|
|
56
70
|
});
|
|
@@ -86,6 +100,12 @@ class LocalChatSession {
|
|
|
86
100
|
}
|
|
87
101
|
return;
|
|
88
102
|
}
|
|
103
|
+
if (result.event === 'status') {
|
|
104
|
+
if (result.turnId === waiting.turnId && typeof result.text === 'string') {
|
|
105
|
+
try { waiting.onStatus?.(result.text); } catch { /* renderer cannot break the turn */ }
|
|
106
|
+
}
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
89
109
|
// Future side-channel events cannot complete a turn. Legacy final
|
|
90
110
|
// frames have no event; typed final frames use event=result.
|
|
91
111
|
if ('event' in result && result.event !== 'result') return;
|
|
@@ -155,12 +175,12 @@ class LocalChatSession {
|
|
|
155
175
|
}
|
|
156
176
|
}
|
|
157
177
|
|
|
158
|
-
async turn(prompt: string, writePrompt?: (payload: string) => Promise<void>, onDelta?: (text: string) => void, attachments: readonly string[] = []): Promise<TurnResult> {
|
|
178
|
+
async turn(prompt: string, writePrompt?: (payload: string) => Promise<void>, onDelta?: (text: string) => void, attachments: readonly string[] = [], onStatus?: (text: string) => void): Promise<TurnResult> {
|
|
159
179
|
if (this.closed) throw new Error('REPL child exited');
|
|
160
180
|
if (this.waiting) throw new Error('REPL turn already running');
|
|
161
181
|
const turnId = `tui-${++this.turnCount}`;
|
|
162
182
|
const payload = JSON.stringify({ prompt, id: turnId, ...(attachments.length ? { attachments } : {}) }) + '\n';
|
|
163
|
-
const response = new Promise<TurnResult>((resolve, reject) => { this.waiting = { turnId, onDelta, resolve, reject }; });
|
|
183
|
+
const response = new Promise<TurnResult>((resolve, reject) => { this.waiting = { turnId, onDelta, onStatus, resolve, reject }; });
|
|
164
184
|
try {
|
|
165
185
|
if (writePrompt) await writePrompt(payload);
|
|
166
186
|
else await this.writeInput(payload);
|
|
@@ -238,6 +258,7 @@ export async function runLocalChatTurn(
|
|
|
238
258
|
onDelta?: (text: string) => void,
|
|
239
259
|
compact: LocalChatTurnCompact = {},
|
|
240
260
|
attachments: readonly string[] = [],
|
|
261
|
+
onStatus?: (line: string) => void,
|
|
241
262
|
): Promise<void> {
|
|
242
263
|
if (signal.aborted) throw new Error('응답을 취소했습니다');
|
|
243
264
|
if (!cli) throw new Error('elanous CLI entry is unavailable');
|
|
@@ -259,7 +280,7 @@ export async function runLocalChatTurn(
|
|
|
259
280
|
try {
|
|
260
281
|
result = await session.turn(text, writePrompt, (delta) => {
|
|
261
282
|
if (!signal.aborted) onDelta?.(delta);
|
|
262
|
-
}, attachments);
|
|
283
|
+
}, attachments, (line) => { if (!signal.aborted) onStatus?.(line); });
|
|
263
284
|
} catch (error) {
|
|
264
285
|
if (signal.aborted) throw new Error('응답을 취소했습니다');
|
|
265
286
|
await closeLocalChatSession(sessionId);
|
package/src/user-config.ts
CHANGED
|
@@ -187,6 +187,8 @@ export interface LLMConfig {
|
|
|
187
187
|
apiKey?: string;
|
|
188
188
|
model?: string;
|
|
189
189
|
baseUrl?: string;
|
|
190
|
+
/** Override the text stream idle watchdog in milliseconds. Omitted keeps provider/family defaults. */
|
|
191
|
+
streamIdleTimeoutMs?: number;
|
|
190
192
|
/** OpenRouter 설정 한 곳(두 골이 같은 키를 쓴다):
|
|
191
193
|
* - `providerPreferences` — 상류 라우팅 선호; 도구 가능 기본값(require_parameters·allow_fallbacks)을 얕게 덮는다(OR-LLM-ROUTING-1).
|
|
192
194
|
* - `fallbackModel` — 유료 OpenRouter 폴백 모델; 체인에 openrouter 를 명시하고 모델·키를 모두 줄 때만 선택된다(OR-FALLBACK-TIER-1).
|
|
@@ -864,7 +866,7 @@ function normalizeReportChannel(raw: unknown): TelegramReportChannel | undefined
|
|
|
864
866
|
export interface TelegramTestChannel {
|
|
865
867
|
botToken: string;
|
|
866
868
|
allowedUsers?: number[];
|
|
867
|
-
/** 무인 주입(scripts/telegram-inject.ts·#24)의 대상 봇 username(예: `@
|
|
869
|
+
/** 무인 주입(scripts/telegram-inject.ts·#24)의 대상 봇 username(예: `@test_helper_bot`). 봇이 여럿일
|
|
868
870
|
* 때 어느 봇(테스트 채널용)에 objective 를 주입할지 명시. env `TELEGRAM_TEST_BOT`/`--to` 로도 지정 가능. */
|
|
869
871
|
botUsername?: string;
|
|
870
872
|
}
|
|
@@ -901,7 +903,7 @@ export interface TelegramChannel {
|
|
|
901
903
|
chatId: number;
|
|
902
904
|
interactive: boolean;
|
|
903
905
|
roles: string[];
|
|
904
|
-
/** 봇 username(예: `
|
|
906
|
+
/** 봇 username(예: `primary_bot`). 무인 유틸(scripts/telegram-inject.ts)이
|
|
905
907
|
* role/name 으로 대상 봇을 config 한 곳에서 찾도록 하는 조회용 필드. 선택. */
|
|
906
908
|
botUsername?: string;
|
|
907
909
|
}
|
|
@@ -1986,6 +1988,8 @@ function parseTasteConfig(raw: unknown): TasteConfig | undefined {
|
|
|
1986
1988
|
*/
|
|
1987
1989
|
export interface WebSearchConfig {
|
|
1988
1990
|
tavily?: { enabled?: boolean };
|
|
1991
|
+
grokApi?: { enabled?: boolean };
|
|
1992
|
+
firecrawl?: { enabled?: boolean };
|
|
1989
1993
|
}
|
|
1990
1994
|
|
|
1991
1995
|
/** OpenDesign 데몬 접속. url 이 없으면 시안 생성은 꺼진 것이다. tokenFile 은 토큰 «경로»만 담는다. */
|
|
@@ -2032,6 +2036,13 @@ function parseWebSearchConfig(raw: unknown): WebSearchConfig | undefined {
|
|
|
2032
2036
|
const t = r.tavily as Record<string, unknown>;
|
|
2033
2037
|
if (typeof t.enabled === 'boolean') out.tavily = { enabled: t.enabled };
|
|
2034
2038
|
}
|
|
2039
|
+
for (const key of ['grokApi', 'firecrawl'] as const) {
|
|
2040
|
+
const section = r[key];
|
|
2041
|
+
if (section && typeof section === 'object' && !Array.isArray(section)) {
|
|
2042
|
+
const enabled = (section as Record<string, unknown>).enabled;
|
|
2043
|
+
if (typeof enabled === 'boolean') out[key] = { enabled };
|
|
2044
|
+
}
|
|
2045
|
+
}
|
|
2035
2046
|
return Object.keys(out).length > 0 ? out : undefined;
|
|
2036
2047
|
}
|
|
2037
2048
|
|
|
@@ -2041,6 +2052,11 @@ export function isTavilySearchEnabled(cfg: Pick<UserConfig, 'webSearch'> = getUs
|
|
|
2041
2052
|
return cfg.webSearch?.tavily?.enabled === true;
|
|
2042
2053
|
}
|
|
2043
2054
|
|
|
2055
|
+
/** An API key being present does not authorize metered web search. */
|
|
2056
|
+
export function isPaidWebSearchEnabled(provider: 'grokApi' | 'firecrawl', cfg: Pick<UserConfig, 'webSearch'> = getUserConfig()): boolean {
|
|
2057
|
+
return cfg.webSearch?.[provider]?.enabled === true;
|
|
2058
|
+
}
|
|
2059
|
+
|
|
2044
2060
|
function parseSessionFabricConfig(raw: unknown): SessionFabricConfig | undefined {
|
|
2045
2061
|
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
|
|
2046
2062
|
const r = raw as Record<string, unknown>;
|
|
@@ -3901,6 +3917,8 @@ function parseProjectsConfig(raw: unknown): Record<string, ProjectConfig> | unde
|
|
|
3901
3917
|
}
|
|
3902
3918
|
|
|
3903
3919
|
export interface UserConfig {
|
|
3920
|
+
/** Next TUI options. `unattended` makes confirmation/clarification paths non-blocking. */
|
|
3921
|
+
tui?: { sidetab?: 'off' | 'collapsed' | 'open'; unattended?: boolean };
|
|
3904
3922
|
projects?: Record<string, ProjectConfig>;
|
|
3905
3923
|
/** Default personal topic watch; absent = enabled when user sources exist. */
|
|
3906
3924
|
watch?: { enabled?: boolean };
|
|
@@ -3935,7 +3953,7 @@ export interface UserConfig {
|
|
|
3935
3953
|
loops?: { owners?: Record<string, EventSeat>; defaultOwner?: EventSeat; orchestrator?: OrchestratorLoopConfig; steward?: { mode?: StewardLoopMode; linearTeam?: string; roles?: Record<string, { maxConcurrent?: number }>; budget?: number; tracks?: Record<string, string>; alertAfterFailures?: number; launch?: 'off' | 'shadow' | 'live'; maxParallel?: number; podPool?: string }; seat?: SeatLoopConfig; persona?: PersonaLoopConfig };
|
|
3936
3954
|
/** 🔐 Pod 의 Grok API 키 과금은 명시 opt-in 만. 생략·잘못된 값은 false.
|
|
3937
3955
|
* budgetGate 와 같은 `harness` 객체다 — 중복 선언이면 뒤 타입이 앞을 지운다. */
|
|
3938
|
-
harness?: { edgeRail?: { canaryOkRuns?: number; failureMultiplier?: number; minSamples?: number }; /** Goal authoring grade; absent or invalid config resolves to full. */ authorGrade?: 'full' | 'lite'; revertGuard?: { depth: number }; pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; exposeGate?: 'warn' | 'strict'; difficultyPlacement?: boolean; defaultRepo?: string; /** Optional GitHub repository name (owner/repo), distinct from the local defaultRepo path. */ repo?: string; /** `auto` = SUBSTRATE-ROUTE: routeAutoSubstrate 가 pod/local 을 고른다(신호가 없으면 pod). */ substrate?: 'local' | 'pod' | 'auto'; podPool?: string; /** IMAGE-ONE-SOURCE: Pod 발사가 당길 기준 이미지 커밋(hex 12~40 · 레지스트리 태그 = 앞 12자리). 없으면 종전대로 HEAD 비교·굽기. */ imageCommit?: string; worktreeAddTimeoutSec?: number; queue?: { seatCap?: Partial<Record<'OP' | 'TC' | 'MK' | 'UX', number>>; /** Direct `harness say|ask` goes through the seat queue first (ONEDOOR-2). Absent = env ELANOUS_HARNESS_QUEUE_DIRECT_SAY, else off. */ directSay?: boolean; /** SEAT-CAP-STALE: a run whose last ledger progress is older than this stops holding its seat. Absent = env ELANOUS_HARNESS_QUEUE_STALE_RUN_MINUTES, else 30. */ staleRunMinutes?: number; /** Seat-less runs count in one bucket with this cap instead of every seat. Absent = env ELANOUS_HARNESS_QUEUE_UNKNOWN_SEAT_CAP, else 2. */ unknownSeatCap?: number; /** QUEUE-BURST: most launches one scheduled tick may make (30 s apart, each within seat cap and Pod pool headroom). Absent or invalid = 5; 1 = one launch per tick. */ burstMax?: number }; /** `harness say` 문장을 Pod 안에서 저작부터 돌릴지. 생략·false = 끔(호스트가 저작). */ authorOnPod?: boolean; /** SIBLING-RESYNC-ON-MERGE: most open sibling PR file inventories fetched per merge. Absent or invalid = 40. */ siblingResync?: { maxFetch?: number }; /** Stopped-PR repair goals: shadow records only (default); live enqueues them. */ helper?: { repair?: 'shadow' | 'live'; /** Live launches allowed per UTC day. Absent or invalid means 3. */ repairPerDay?: number };
|
|
3956
|
+
harness?: { /** KNOWHOW-PACK-TO-SUPERVISORS: child goal injection is legacy opt-in; omitted = off. */ knowhowChildInjection?: boolean; edgeRail?: { canaryOkRuns?: number; failureMultiplier?: number; minSamples?: number }; /** Goal authoring grade; absent or invalid config resolves to full. */ authorGrade?: 'full' | 'lite'; revertGuard?: { depth: number }; pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; exposeGate?: 'warn' | 'strict'; difficultyPlacement?: boolean; defaultRepo?: string; /** Optional GitHub repository name (owner/repo), distinct from the local defaultRepo path. */ repo?: string; /** `auto` = SUBSTRATE-ROUTE: routeAutoSubstrate 가 pod/local 을 고른다(신호가 없으면 pod). */ substrate?: 'local' | 'pod' | 'auto'; podPool?: string; /** IMAGE-ONE-SOURCE: Pod 발사가 당길 기준 이미지 커밋(hex 12~40 · 레지스트리 태그 = 앞 12자리). 없으면 종전대로 HEAD 비교·굽기. */ imageCommit?: string; worktreeAddTimeoutSec?: number; queue?: { seatCap?: Partial<Record<'OP' | 'TC' | 'MK' | 'UX', number>>; /** Direct `harness say|ask` goes through the seat queue first (ONEDOOR-2). Absent = env ELANOUS_HARNESS_QUEUE_DIRECT_SAY, else off. */ directSay?: boolean; /** SEAT-CAP-STALE: a run whose last ledger progress is older than this stops holding its seat. Absent = env ELANOUS_HARNESS_QUEUE_STALE_RUN_MINUTES, else 30. */ staleRunMinutes?: number; /** Seat-less runs count in one bucket with this cap instead of every seat. Absent = env ELANOUS_HARNESS_QUEUE_UNKNOWN_SEAT_CAP, else 2. */ unknownSeatCap?: number; /** QUEUE-BURST: most launches one scheduled tick may make (30 s apart, each within seat cap and Pod pool headroom). Absent or invalid = 5; 1 = one launch per tick. */ burstMax?: number }; /** `harness say` 문장을 Pod 안에서 저작부터 돌릴지. 생략·false = 끔(호스트가 저작). */ authorOnPod?: boolean; /** SIBLING-RESYNC-ON-MERGE: most open sibling PR file inventories fetched per merge. Absent or invalid = 40. */ siblingResync?: { maxFetch?: number }; /** Stopped-PR repair goals: shadow records only (default); live enqueues them. */ helper?: { repair?: 'shadow' | 'live'; /** Live launches allowed per UTC day. Absent or invalid means 3. */ repairPerDay?: number };
|
|
3939
3957
|
/** Nested elanous launches. Only depth 0 may set `allow`. Absent or any other value refuses. A depth >= 1 `--nested-elanous allow` is ignored. */
|
|
3940
3958
|
nestedElanous?: 'allow' | 'refuse';
|
|
3941
3959
|
/** Maximum nested elanous depth; safe positive integer, default 2. */
|
|
@@ -4392,6 +4410,7 @@ function parseRoleLlmConfig(raw: unknown): RoleLlmConfig | undefined {
|
|
|
4392
4410
|
|
|
4393
4411
|
function defaultConfig(): UserConfig {
|
|
4394
4412
|
return {
|
|
4413
|
+
tui: { sidetab: 'collapsed' },
|
|
4395
4414
|
cli: { helpRole: 'owner' },
|
|
4396
4415
|
coo: { linearProject: '외부 행정·큰 일 (COO)' },
|
|
4397
4416
|
decisions: { linearProjection: { enabled: false }, requireCrossCheck: false,
|
|
@@ -5128,9 +5147,14 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5128
5147
|
|
|
5129
5148
|
const nexus = rawObj.nexus && typeof rawObj.nexus === 'object' && !Array.isArray(rawObj.nexus)
|
|
5130
5149
|
? rawObj.nexus as Record<string, unknown> : {};
|
|
5150
|
+
const tuiRaw = rawObj.tui && typeof rawObj.tui === 'object' && !Array.isArray(rawObj.tui) ? rawObj.tui as Record<string, unknown> : {};
|
|
5131
5151
|
const gateRemoteConfig = parseGateRemoteConfig(rawObj.gateRemote);
|
|
5132
5152
|
const projects = parseProjectsConfig(rawObj.projects);
|
|
5133
5153
|
return {
|
|
5154
|
+
tui: {
|
|
5155
|
+
sidetab: tuiRaw.sidetab === 'off' || tuiRaw.sidetab === 'open' ? tuiRaw.sidetab : 'collapsed',
|
|
5156
|
+
...(typeof tuiRaw.unattended === 'boolean' ? { unattended: tuiRaw.unattended } : {}),
|
|
5157
|
+
},
|
|
5134
5158
|
...(projects ? { projects } : {}),
|
|
5135
5159
|
...(rawObj.starter && typeof rawObj.starter === 'object' && !Array.isArray(rawObj.starter)
|
|
5136
5160
|
&& Array.isArray((rawObj.starter as Record<string, unknown>).topics)
|
|
@@ -5300,6 +5324,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5300
5324
|
};
|
|
5301
5325
|
})(),
|
|
5302
5326
|
model: resolveRuntimeLlmModel(baseProvider, selectedProvider, str(llm.model), escalationProvider || undefined),
|
|
5327
|
+
streamIdleTimeoutMs: positiveFiniteNumber(llm.streamIdleTimeoutMs),
|
|
5303
5328
|
openrouter: (() => {
|
|
5304
5329
|
const router = llm.openrouter;
|
|
5305
5330
|
if (!router || typeof router !== 'object' || Array.isArray(router)) return undefined;
|
|
@@ -6222,6 +6247,15 @@ export function getUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
6222
6247
|
return cache;
|
|
6223
6248
|
}
|
|
6224
6249
|
|
|
6250
|
+
/** Resolve the explicit TUI unattended switch: saved user config wins over the seat-launch env override. */
|
|
6251
|
+
export function resolveTuiUnattended(
|
|
6252
|
+
config: UserConfig = getUserConfig(),
|
|
6253
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
6254
|
+
): boolean {
|
|
6255
|
+
if (typeof config.tui?.unattended === 'boolean') return config.tui.unattended;
|
|
6256
|
+
return env.ELANOUS_TUI_UNATTENDED === '1';
|
|
6257
|
+
}
|
|
6258
|
+
|
|
6225
6259
|
// Read at call time, not registration time, so reload/reset and on-disk edits keep their semantics.
|
|
6226
6260
|
// Stored timezone is kept in raw by buildUserConfig; do not change getUserConfig's returned shape.
|
|
6227
6261
|
setConfigTimeZoneSource(() => {
|
|
@@ -6487,6 +6521,8 @@ export function saveUserConfig(
|
|
|
6487
6521
|
},
|
|
6488
6522
|
};
|
|
6489
6523
|
const rawRest = { ...(cfg.raw ?? {}) };
|
|
6524
|
+
const rawTui = rawRest.tui && typeof rawRest.tui === 'object' && !Array.isArray(rawRest.tui)
|
|
6525
|
+
? rawRest.tui as Record<string, unknown> : {};
|
|
6490
6526
|
// projects: raw entries are kept verbatim — an invalid entry loaded from disk is preserved, not blocked (its error
|
|
6491
6527
|
// surfaces in resolveRubricAxes) — and typed axes handed to save are validated (invalid ones refuse the save).
|
|
6492
6528
|
const rawProjectsValue = rawRest.projects;
|
|
@@ -6616,6 +6652,7 @@ export function saveUserConfig(
|
|
|
6616
6652
|
apiKey: cfg.llm.apiKey,
|
|
6617
6653
|
model: cfg.llm.model,
|
|
6618
6654
|
baseUrl: cfg.llm.baseUrl,
|
|
6655
|
+
streamIdleTimeoutMs: cfg.llm.streamIdleTimeoutMs,
|
|
6619
6656
|
// Persist the rotation exactly as held in memory — each entry
|
|
6620
6657
|
// stripped of its own undefined fields so the on-disk JSON
|
|
6621
6658
|
// stays minimal. Omit the key entirely when no rotation is
|
|
@@ -6769,6 +6806,8 @@ export function saveUserConfig(
|
|
|
6769
6806
|
debug: cfg.debug,
|
|
6770
6807
|
logs: cfg.logs,
|
|
6771
6808
|
shell: cfg.shell,
|
|
6809
|
+
// Preserve newer/unknown TUI settings while the typed config only knows sidetab.
|
|
6810
|
+
tui: { ...rawTui, ...cfg.tui },
|
|
6772
6811
|
errorReports: cfg.errorReports ? stripUndef({ ...cfg.errorReports }) : undefined,
|
|
6773
6812
|
chat: stripUndef({
|
|
6774
6813
|
fastPath: cfg.chat.fastPath,
|
|
@@ -480,19 +480,13 @@ export async function runClassicTuiScenario(spec: ClassicTuiScenarioSpec): Promi
|
|
|
480
480
|
env[TEST_FAKE_LLM_RESPONSE_ENV] = reply;
|
|
481
481
|
const banner = '↻ 자동 재개(goal-continue)';
|
|
482
482
|
const replies = (s: string) => s.split(reply).length - 1;
|
|
483
|
-
let settledAt = 0;
|
|
484
483
|
const steps: SeatPtyStep[] = [
|
|
485
484
|
{ label: 'human turn', text: '영상 만들어줘', until: (s) => replies(s) >= 1 },
|
|
486
485
|
{
|
|
487
486
|
label: 'continued',
|
|
488
|
-
until: (s) =>
|
|
489
|
-
const ok = s.includes(banner) && replies(s) === 2 && turnDone(s.slice(s.lastIndexOf(banner)));
|
|
490
|
-
if (ok && settledAt === 0) settledAt = Date.now();
|
|
491
|
-
return ok;
|
|
492
|
-
},
|
|
487
|
+
until: (s) => s.includes(banner) && replies(s) === 2 && turnDone(s.slice(s.lastIndexOf(banner))),
|
|
493
488
|
timeoutMs: 60_000,
|
|
494
489
|
},
|
|
495
|
-
{ label: 'no loop', until: (s) => settledAt > 0 && Date.now() >= settledAt + 25_000 && replies(s) === 2, timeoutMs: 40_000 },
|
|
496
490
|
];
|
|
497
491
|
const run = await mockSeatPtySequence({ ...base, env, steps });
|
|
498
492
|
const last = run.frames.at(-1)?.screen ?? '';
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/** In-process LAND-QUEUE simulator. Scheduling and verdict logic use the production train functions;
|
|
2
|
+
* only git's merge-tree/commit-tree and the remote gate are replaced. */
|
|
3
|
+
import { integrateTrain, runTrain, type TrainCandidate, type TrainGit, type TrainVerdict } from '../self-implement/merge-train.js';
|
|
4
|
+
|
|
5
|
+
export type FakeLandQueueItem = TrainCandidate & { files: string[] };
|
|
6
|
+
export type FakeLandQueueInput = {
|
|
7
|
+
readonly queue: readonly FakeLandQueueItem[];
|
|
8
|
+
readonly load: number;
|
|
9
|
+
readonly previousSlots?: 2 | 3;
|
|
10
|
+
readonly cutWindowOpen?: boolean;
|
|
11
|
+
readonly expedite?: number;
|
|
12
|
+
readonly eject?: readonly number[];
|
|
13
|
+
readonly conflicting?: readonly number[];
|
|
14
|
+
readonly gates?: readonly ('pass' | 'fail' | 'unmeasured')[];
|
|
15
|
+
};
|
|
16
|
+
export type FakeLandQueueResult = {
|
|
17
|
+
readonly slots: 2 | 3;
|
|
18
|
+
readonly departed: readonly (readonly number[])[];
|
|
19
|
+
readonly waiting: readonly number[];
|
|
20
|
+
readonly ejected: readonly number[];
|
|
21
|
+
readonly stoppedAtCut: boolean;
|
|
22
|
+
readonly verdicts: readonly TrainVerdict[];
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/** Hysteresis prevents slot oscillation: below 60% expand; at/above 80% contract. */
|
|
26
|
+
export function fakeLandSlots(load: number, previous: 2 | 3 = 2): 2 | 3 {
|
|
27
|
+
if (!Number.isFinite(load) || load < 0 || load > 100) throw new Error('load must be between 0 and 100');
|
|
28
|
+
if (load < 60) return 3;
|
|
29
|
+
if (load >= 80) return 2;
|
|
30
|
+
return previous;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function syntheticGit(conflicting: ReadonlySet<number>, prByHead: ReadonlyMap<string, number>): TrainGit {
|
|
34
|
+
let commit = 0;
|
|
35
|
+
const sha = (n: number) => n.toString(16).padStart(40, '0');
|
|
36
|
+
return (args) => {
|
|
37
|
+
const command = args.find((arg) => arg === 'merge-tree' || arg === 'commit-tree');
|
|
38
|
+
if (command === 'merge-tree') {
|
|
39
|
+
const pr = prByHead.get(args.at(-1) ?? '');
|
|
40
|
+
return pr !== undefined && conflicting.has(pr)
|
|
41
|
+
? { status: 1, stdout: `${sha(900 + (pr ?? 0))}\0src/conflict.ts\0\0`, stderr: '' }
|
|
42
|
+
: { status: 0, stdout: `${sha(900 + (pr ?? 0))}\0`, stderr: '' };
|
|
43
|
+
}
|
|
44
|
+
if (command === 'commit-tree') return { status: 0, stdout: sha(++commit), stderr: '' };
|
|
45
|
+
return { status: 2, stdout: '', stderr: `unsupported fake git command: ${args[0]}` };
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** One dry-run tick. Cut-window closure and ejection never call the train; no ref is updated. */
|
|
50
|
+
export async function simulateFakeLandQueue(input: FakeLandQueueInput): Promise<FakeLandQueueResult> {
|
|
51
|
+
const ejected = new Set(input.eject ?? []);
|
|
52
|
+
const queue = input.queue.filter((item) => !ejected.has(item.number)).map((item) => ({ ...item, files: [...item.files] }));
|
|
53
|
+
if (input.expedite !== undefined) {
|
|
54
|
+
const at = queue.findIndex((item) => item.number === input.expedite);
|
|
55
|
+
if (at >= 0) queue.unshift(...queue.splice(at, 1));
|
|
56
|
+
}
|
|
57
|
+
const slots = fakeLandSlots(input.load, input.previousSlots);
|
|
58
|
+
if (input.cutWindowOpen === false) return {
|
|
59
|
+
slots, departed: [], waiting: queue.map((item) => item.number), ejected: [...ejected], stoppedAtCut: true, verdicts: [],
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const departed: number[][] = [];
|
|
63
|
+
const waiting: number[] = [];
|
|
64
|
+
const verdicts: TrainVerdict[] = [];
|
|
65
|
+
const gates = [...(input.gates ?? [])];
|
|
66
|
+
const git = syntheticGit(new Set(input.conflicting ?? []), new Map(queue.map((item) => [item.head, item.number])));
|
|
67
|
+
while (queue.length) {
|
|
68
|
+
const batch: FakeLandQueueItem[] = [];
|
|
69
|
+
const occupied = new Set<string>();
|
|
70
|
+
for (let i = 0; i < queue.length && batch.length < slots;) {
|
|
71
|
+
const candidate = queue[i]!;
|
|
72
|
+
if (candidate.files.some((file) => occupied.has(file))) { waiting.push(candidate.number); queue.splice(i, 1); continue; }
|
|
73
|
+
batch.push(candidate); queue.splice(i, 1); candidate.files.forEach((file) => occupied.add(file));
|
|
74
|
+
}
|
|
75
|
+
if (!batch.length) break;
|
|
76
|
+
departed.push(batch.map((item) => item.number));
|
|
77
|
+
const train = await runTrain(batch, {
|
|
78
|
+
integrate: (candidates) => {
|
|
79
|
+
const integrated = integrateTrain('/fake-land-queue', '1'.repeat(40), candidates, git);
|
|
80
|
+
return integrated;
|
|
81
|
+
},
|
|
82
|
+
gate: async () => gates.shift() ?? 'pass',
|
|
83
|
+
observe: () => {},
|
|
84
|
+
});
|
|
85
|
+
verdicts.push(...train.verdicts);
|
|
86
|
+
}
|
|
87
|
+
return { slots, departed, waiting: [...waiting, ...queue.map((item) => item.number)], ejected: [...ejected], stoppedAtCut: false, verdicts };
|
|
88
|
+
}
|
package/src/ux-sim/fake-llm.ts
CHANGED
|
@@ -47,18 +47,19 @@ export function resetTestFakeLlmScript(): void {
|
|
|
47
47
|
* («결함이 계속되는 세션에서도 사람 턴은 답을 받는다» 무대 · 칸 수를 호출 수에 맞춰 세지 않게). */
|
|
48
48
|
export const TEST_FAKE_LLM_SCRIPT_SKIP_WHEN_ENV = 'ELANOUS_TEST_FAKE_LLM_SCRIPT_SKIP_WHEN';
|
|
49
49
|
|
|
50
|
-
/** 다음 호출의 스크립트 칸을 소비한다. 400 칸이면
|
|
51
|
-
function consumeScriptStep(messages: LLMMessage[]):
|
|
50
|
+
/** 다음 호출의 스크립트 칸을 소비한다. 400 칸이면 던지고 `stall:<text>` 는 스트림에서 첫 조각 뒤 멈춘다. */
|
|
51
|
+
function consumeScriptStep(messages: LLMMessage[]): string | undefined {
|
|
52
52
|
const raw = process.env[TEST_FAKE_LLM_SCRIPT_ENV];
|
|
53
|
-
if (!raw) return;
|
|
53
|
+
if (!raw) return undefined;
|
|
54
54
|
const skipWhen = process.env[TEST_FAKE_LLM_SCRIPT_SKIP_WHEN_ENV];
|
|
55
|
-
if (skipWhen && (lastHumanText(messages) ?? '').includes(skipWhen)) return;
|
|
55
|
+
if (skipWhen && (lastHumanText(messages) ?? '').includes(skipWhen)) return undefined;
|
|
56
56
|
if (raw !== scriptCursorFor) { scriptCursorFor = raw; scriptCursor = 0; }
|
|
57
57
|
const steps = raw.split(',').map((step) => step.trim()).filter(Boolean);
|
|
58
58
|
const step = steps[scriptCursor];
|
|
59
59
|
scriptCursor += 1;
|
|
60
60
|
if (step === '400') throw new Error(TEST_FAKE_LLM_400_MESSAGE);
|
|
61
61
|
if (step === '400codex') throw new Error(TEST_FAKE_LLM_CODEX_400_MESSAGE);
|
|
62
|
+
return step;
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
/** TUI-SEAT-MEMORY-RECALL — 요청 기록(격리 무대 전용). 경로를 주면 호출마다 받은 메시지(role·문자열 content)를
|
|
@@ -130,8 +131,13 @@ export const testFakeLlmProvider: LLMProvider = {
|
|
|
130
131
|
},
|
|
131
132
|
async *streamChat(messages: LLMMessage[], _opts?: LLMOpts): AsyncGenerator<LLMStreamEvent, void, unknown> {
|
|
132
133
|
captureRequest(messages);
|
|
133
|
-
consumeScriptStep(messages);
|
|
134
|
+
const step = consumeScriptStep(messages);
|
|
134
135
|
await scriptedDelay(messages);
|
|
136
|
+
if (step?.startsWith('stall:')) {
|
|
137
|
+
yield { type: 'text', delta: step.slice('stall:'.length) };
|
|
138
|
+
await new Promise<void>(() => {});
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
135
141
|
const call = scriptedToolCall(messages);
|
|
136
142
|
if (call) { yield call; return; }
|
|
137
143
|
yield { type: 'text', delta: testFakeLlmResponse(messages) };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/** S1 device for a release gate's shard dispatch. It replaces host execution, not planning or reduction. */
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import {
|
|
4
|
+
planGateShardDispatch,
|
|
5
|
+
reduceGateShardReceipts,
|
|
6
|
+
type GateShardAction,
|
|
7
|
+
type GateShardDispatchInput,
|
|
8
|
+
type GateShardReceipt,
|
|
9
|
+
type GateShardReduction,
|
|
10
|
+
} from '../../scripts/release-loop/gate-shard-dispatch.js';
|
|
11
|
+
|
|
12
|
+
export interface FakeGateShardHostResult {
|
|
13
|
+
shardId: string;
|
|
14
|
+
host: string;
|
|
15
|
+
status: 'complete' | 'unmeasured';
|
|
16
|
+
failureIds: string[];
|
|
17
|
+
errorIds: string[];
|
|
18
|
+
envKey?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface GateShardRerouteScenario {
|
|
22
|
+
input: GateShardDispatchInput;
|
|
23
|
+
/** A result is supplied only for an expected host call. An omitted result remains unmeasured. */
|
|
24
|
+
hostResults: readonly FakeGateShardHostResult[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface FakeGateShardHostCall {
|
|
28
|
+
shardId: string;
|
|
29
|
+
host: string;
|
|
30
|
+
files: string[];
|
|
31
|
+
head40: string;
|
|
32
|
+
base40: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface GateShardRerouteObservation {
|
|
36
|
+
actions: GateShardAction[];
|
|
37
|
+
hostCalls: FakeGateShardHostCall[];
|
|
38
|
+
/** One selected receipt per reused or executed shard; no predecessor fills a failed remeasurement. */
|
|
39
|
+
receipts: GateShardReceipt[];
|
|
40
|
+
reduction: GateShardReduction;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Stage inputs without making dispatch decisions; the production planner receives them unchanged. */
|
|
44
|
+
export function gateShardRerouteScenario(
|
|
45
|
+
input: GateShardDispatchInput,
|
|
46
|
+
hostResults: readonly FakeGateShardHostResult[],
|
|
47
|
+
): GateShardRerouteScenario {
|
|
48
|
+
return { input, hostResults };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Inject deterministic fake host results into the production planner and reducer. This never starts a gate,
|
|
53
|
+
* Pod, SSH command, or host sweep. The fake evidence digest is a scenario marker, not an artifact verification;
|
|
54
|
+
* the caller of the production planner still owns verification before reuse.
|
|
55
|
+
*/
|
|
56
|
+
export function simGateShardHostReroute(scenario: GateShardRerouteScenario): GateShardRerouteObservation {
|
|
57
|
+
const actions = planGateShardDispatch(scenario.input);
|
|
58
|
+
const hostCalls: FakeGateShardHostCall[] = [];
|
|
59
|
+
const receipts: GateShardReceipt[] = [];
|
|
60
|
+
for (const action of actions) {
|
|
61
|
+
if (action.kind === 'reuse') {
|
|
62
|
+
receipts.push(action.receipt);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (action.kind === 'unmeasured') continue;
|
|
66
|
+
hostCalls.push({ shardId: action.shardId, host: action.host, files: [...action.files],
|
|
67
|
+
head40: scenario.input.head40, base40: scenario.input.base40 });
|
|
68
|
+
const result = scenario.hostResults.find((row) => row.shardId === action.shardId && row.host === action.host);
|
|
69
|
+
if (!result) continue;
|
|
70
|
+
const evidence = JSON.stringify({ head40: scenario.input.head40, base40: scenario.input.base40,
|
|
71
|
+
shardId: action.shardId, host: action.host, files: action.files, result });
|
|
72
|
+
receipts.push({ id: action.shardId, files: [...action.files], head40: scenario.input.head40, base40: scenario.input.base40,
|
|
73
|
+
host: action.host, envKey: result.envKey ?? `sim:${action.host}`, status: result.status,
|
|
74
|
+
failureIds: [...result.failureIds], errorIds: [...result.errorIds],
|
|
75
|
+
evidencePath: `sim/${action.shardId}-${action.host}.json`,
|
|
76
|
+
evidenceSha256: createHash('sha256').update(evidence).digest('hex'),
|
|
77
|
+
measuredAt: '2026-10-27T00:00:00.000Z', attempt: (action.replacing?.attempt ?? 0) + 1 });
|
|
78
|
+
}
|
|
79
|
+
const reduction = reduceGateShardReceipts({ head40: scenario.input.head40, base40: scenario.input.base40,
|
|
80
|
+
shards: scenario.input.shards, receipts });
|
|
81
|
+
return { actions, hostCalls, receipts, reduction };
|
|
82
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** One injected input trace shared by classic and next goal-interim renderer evidence. */
|
|
2
|
+
export const GOAL_INTERIM_USER_INPUT = '영상 만들어줘';
|
|
3
|
+
export const GOAL_INTERIM_NOT_DONE_REPLY = '[fake-llm] {step}단계 렌더를 진행했습니다.\n남은 작업 {step}단계: 완료 영상 경로는 아직 보고할 수 없습니다 — 아직 못 했습니다.';
|
|
4
|
+
export const GOAL_INTERIM_TOOL_CALL = JSON.stringify({ when: GOAL_INTERIM_USER_INPUT, name: 'ScheduleWakeup', args: { delaySeconds: 3600, reason: '렌더 점검' } });
|
|
5
|
+
|
|
6
|
+
export const GOAL_INTERIM_RENDER_TRACE = {
|
|
7
|
+
userInput: GOAL_INTERIM_USER_INPUT,
|
|
8
|
+
interimReplies: [1, 2].map((step) => GOAL_INTERIM_NOT_DONE_REPLY.replaceAll('{step}', String(step))),
|
|
9
|
+
finalReply: '완료 영상: /tmp/final.mp4',
|
|
10
|
+
toolCalls: ['ScheduleWakeup', 'ScheduleWakeup progress', 'ScheduleWakeup progress'],
|
|
11
|
+
} as const;
|
|
12
|
+
|
|
13
|
+
export function goalInterimRenderMessages(ts: string) {
|
|
14
|
+
const trace = GOAL_INTERIM_RENDER_TRACE;
|
|
15
|
+
return [
|
|
16
|
+
{ role: 'user' as const, content: trace.userInput, ts },
|
|
17
|
+
{ role: 'tool' as const, content: '', toolName: trace.toolCalls[0], toolResult: '예약됨', ts },
|
|
18
|
+
{ role: 'tool' as const, content: '', toolName: trace.toolCalls[1], toolResult: '진행', ts },
|
|
19
|
+
{ role: 'assistant' as const, goalInterim: true, content: trace.interimReplies[0], ts },
|
|
20
|
+
{ role: 'tool' as const, content: '', toolName: trace.toolCalls[2], toolResult: '진행', ts },
|
|
21
|
+
{ role: 'assistant' as const, goalInterim: true, content: trace.interimReplies[1], ts },
|
|
22
|
+
{ role: 'assistant' as const, content: trace.finalReply, ts },
|
|
23
|
+
];
|
|
24
|
+
}
|