elanous 0.2.38 → 0.2.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → HjeK7zONHfR7op1hKXp4k}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{7954.4f7a8832663ee979.js → 1060.014f1f01a17aec26.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8911.bf5e712acb25fb6c.js → 1281.d81877e35b9068f4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2104.70e086d5174a4736.js → 1350.59f40e39e02d91b1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +286 -0
- package/apps/pwa/out/_next/static/chunks/1537-6bb97b5214928ea9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +149 -0
- package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +90 -0
- package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +104 -0
- package/apps/pwa/out/_next/static/chunks/2047.8f23e210995d4548.js +2 -0
- package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1632.7d87f998e714bede.js → 2066.a77257c8c350770a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8019.21ca554a821dad01.js → 2177.df8547f9d7215c4e.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3528.e4b8ab70d339f965.js → 2226.2cf61ec781827219.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6493.27ad77de7aac7966.js → 2499.02fbfd18126c10c0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7628.6b16863ac3972333.js → 2522.f2766b76d22c8bdf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3086.fb14b60ce98b53d3.js → 2566.beaffc3a5e1fcd2e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9299.24e2a7d9b6d1f91b.js → 261.0d471e8aded799f3.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +27 -0
- package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2774-719820e3f5b2a3eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2829-734fe8bf2eee7347.js +1 -0
- package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7524.ce973525d30b3d52.js → 3330.7443183b7e6fdbdf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3124-561f7f037943cde2.js → 3746-f80a78f220bf37b5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +24 -0
- package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +77 -0
- package/apps/pwa/out/_next/static/chunks/{bb6987f9.3647e1a23b0e3217.js → 3b355b3d.6f73c98bf6f9c749.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +36 -0
- package/apps/pwa/out/_next/static/chunks/{8994d93e.33ba491f95345fc2.js → 409c787b.e48c5bec8ec10456.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5041-5aada92ca215ffdd.js → 413-24c8284bda08241d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +287 -0
- package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4351.0f37a6db2b34d50b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5638.107314dc479e2f37.js → 470.51a72a2348306455.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8487.291666583bebe640.js → 4769.9fd582071301f382.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8509.3a54d4e61893d7cb.js → 483.725e4a61be922788.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9fe1b809.738da85c8b17e3fb.js → 4864a2ca.1c1c280a7772c5e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +74 -0
- package/apps/pwa/out/_next/static/chunks/{8879.ac06755bcf3e44a1.js → 5383.bdfa5d886e39a826.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6142.913b44e260a3f925.js → 5436.fdf6fa8ae3e9588d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +8 -0
- package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +62 -0
- package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +94 -0
- package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7161-8f22db3ec5ed005e.js → 6051-0ae955eedb10adb9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3291.f6c1005387d514bd.js → 6257.c0037b8949239f5e.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5203.51e5d8b5f1dcfe53.js → 6749.0744ce6eb08d40e9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1938.0e6c60ee91c4d7f5.js → 6908.06008c67f6380ea9.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{de8b930d.d94c0f42acf807fc.js → 6cc1d1d6.9a98dd4622f1afc6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7219-15bdd9a80661af8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +93 -0
- package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7611.85f045bf232053ac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8099.1cccf31c1baa7e1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1026-44010f405704050c.js → 8272-025653884f9645d2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5307.d7328020227880c2.js → 8357.1aaa713b052a78b1.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4199-f7c6eb40cd0322f8.js → 8639-92c11d069792429e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8d173e38.18a2f7b4e1848bdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +41 -0
- package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9175.2de5209a5ce6f68a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9184.45afbf44fec87574.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{eaad0cba.771200940c529df7.js → 9189505a.980427ac048c8c60.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +79 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-866aac5ff226a7f3.js → page-ba957ff875a026a0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-4edb8df90f4537ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-83d27757e2b8060a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-fca2e59a81744d9e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-139d722de1dcd6c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-ccde99f07aaf71f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b7478fef.5917716286213fcc.js → b84cad00.594027ebe0531fe2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b7459770.6539b11860eb8a9c.js → ca3702f8.2913182e73889fa2.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{3f0de3de-2340c532c00395db.js → d5d3cefc-373c4eb722ed848b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{89d6c04f-6b8ab341748e468a.js → d8de0de2-dd0f4ac8e5ab1832.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{framework-4b12a946f352cee2.js → framework-002b472a66935d31.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/graphs/demo/persona-marketer/fixtures/marketer-scenario.yaml +10 -0
- package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
- package/graphs/demo/persona-marketer/recipes.yaml +19 -0
- package/graphs/video/explainer-line.yaml +4 -1
- package/package.json +1 -1
- package/scripts/dead-code/report.ts +169 -0
- package/scripts/lib/morning-report-options.ts +3 -4
- package/scripts/lib/tui-regress-evidence.ts +56 -0
- package/scripts/morning-report.ts +5 -1
- package/scripts/public-export.ts +15 -7
- package/scripts/release-loop/export-check-node.ts +21 -3
- package/scripts/release-loop/gate-node.ts +379 -48
- package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
- package/scripts/release-loop/gate-shard-receipts.ts +89 -0
- package/scripts/release-loop/gate-wall.ts +5 -5
- package/scripts/release-loop/preflight.ts +6 -2
- package/scripts/release-loop/resume-release.ts +20 -5
- package/scripts/release-loop/resume.ts +48 -0
- package/scripts/release-loop/version-node.ts +7 -2
- package/scripts/release-story/draft.ts +1 -1
- package/scripts/research-bench/README.md +53 -0
- package/scripts/research-bench/questions.json +66 -0
- package/scripts/research-bench/rubric.md +33 -0
- package/scripts/research-bench/run.ts +523 -0
- package/scripts/tui-regress.ts +85 -10
- package/src/acp/core-turn-bridge.ts +8 -0
- package/src/agent/autonomous-tools.ts +10 -3
- package/src/agent/monad-agent-turn.ts +4 -1
- package/src/agent/registry.ts +26 -2
- package/src/agent/shared-app-tools.ts +1 -1
- package/src/agent/surface-ux/build.ts +12 -3
- package/src/agent/surface-ux/types.ts +1 -1
- package/src/agent/task-notification.ts +75 -6
- package/src/agent/types.ts +3 -0
- package/src/agent-mission/driver.ts +29 -3
- package/src/agent-mission/mission-cli.ts +2 -1
- package/src/agent-substrate/review-context-pack.ts +365 -0
- package/src/agent-substrate/self-review-cli.ts +226 -17
- package/src/ask-user-question/index.ts +6 -0
- package/src/ask-user-question/inline-resolver.ts +49 -0
- package/src/auto-research/question-ladder-contract.ts +22 -3
- package/src/auto-research/research-turn.ts +350 -17
- package/src/autopilot/agent-loop.ts +1 -1
- package/src/autopilot/pty-control-loop.ts +8 -1
- package/src/boot/daemon-tools/index.ts +4 -3
- package/src/boot/daemon-tools/self-implement.ts +270 -2
- package/src/boot/daemon-tools/types.ts +2 -0
- package/src/budget/llm-cost.ts +44 -5
- package/src/budget/unified-usage.ts +17 -1
- package/src/capture/tui-self-report.ts +14 -0
- package/src/chat/index.ts +33 -7
- package/src/cli/agent-cli.ts +43 -8
- package/src/cli/intake-cli.ts +22 -1
- package/src/cli/lesson-cli.ts +19 -3
- package/src/cli/log-event-names.ts +1 -0
- package/src/cli/pod-cli.ts +17 -2
- package/src/cli/pty-takeover-cli.ts +67 -7
- package/src/cli/release-cli.ts +52 -6
- package/src/cli/repo-cli.ts +2 -1
- package/src/cli/tasks-cli.ts +36 -9
- package/src/control-plane/ledger.ts +21 -4
- package/src/core-turn/run-core-turn.ts +44 -3
- package/src/core-turn/run-goal-loop.ts +152 -8
- package/src/core-turn/types.ts +9 -0
- package/src/dashboard/chat/acp-chat.ts +2 -2
- package/src/dashboard/classic-sigquit.ts +16 -0
- package/src/dashboard/index.ts +321 -27
- package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
- package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
- package/src/dashboard/input/external-input-host.ts +2 -0
- package/src/dashboard/sidetab-runtime.ts +228 -0
- package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -8
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
- package/src/dashboard/term-slash-runtime.ts +16 -18
- package/src/dashboard/turn-preamble.ts +2 -0
- package/src/domains/knowledge.ts +1 -1
- package/src/esc-abort-gate.ts +33 -1
- package/src/execution-loop/launch-gate.ts +206 -1
- package/src/graph-runner/graph-cli.ts +6 -4
- package/src/graph-runner/runner.ts +31 -9
- package/src/graph-wizard/generate.ts +16 -7
- package/src/graph-wizard/mission-compose.ts +201 -0
- package/src/grok/agent-search.ts +8 -2
- package/src/grok/credential.ts +5 -0
- package/src/grounding/ref-index.ts +11 -0
- package/src/grounding/ref-vector.ts +61 -0
- package/src/grounding/sources-cli.ts +2 -2
- package/src/grounding/sources.ts +15 -1
- package/src/harness/harness-cli-command.ts +38 -9
- package/src/harness/harness-pod-dispatch.ts +7 -1
- package/src/index.ts +18 -4
- package/src/input/external-input-queue.ts +10 -0
- package/src/intake-plane/collect-telegram-saved.ts +36 -1
- package/src/intake-plane/intake-to-tasks.ts +246 -3
- package/src/lessons/friction-ledger.ts +154 -0
- package/src/live-supply/collector.ts +149 -0
- package/src/live-supply/probes.ts +52 -0
- package/src/live-supply/snapshot.ts +40 -0
- package/src/llm.ts +431 -76
- package/src/loops/orchestrator/tick.ts +8 -0
- package/src/nexus/api/harness-api.ts +2 -1
- package/src/pty/snapshot.py +132 -0
- package/src/pty-shell/pty-control-ipc.ts +29 -2
- package/src/pty-shell/pty-manifest.ts +59 -3
- package/src/pty-shell/registry.ts +2 -0
- package/src/pty-shell/tui-run-state.ts +80 -3
- package/src/release-loop/gate-host-reservation.ts +13 -4
- package/src/release-loop/gate-shard-ledger.ts +68 -0
- package/src/release-loop/merged-pr-checklist.ts +25 -2
- package/src/release-loop/rehearsal-shard-plan.ts +6 -1
- package/src/release-loop/rehearsal.ts +27 -0
- package/src/research/edge-decision.ts +124 -15
- package/src/research/gap-followup.ts +249 -0
- package/src/research/lenses/counter-evidence.ts +100 -0
- package/src/research/lenses/working-backwards.ts +89 -0
- package/src/research/plugin-discovery.ts +242 -0
- package/src/research-bridge/invoke.ts +4 -2
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +34 -106
- package/src/self-dev/dev-cli.ts +2 -0
- package/src/self-dev/dev-pipeline.ts +8 -4
- package/src/self-dev/graph-journey-route.ts +10 -2
- package/src/self-dev/launch-preflight-text.ts +2 -2
- package/src/self-dev/launch-preflight.ts +38 -7
- package/src/self-dev/orchestrate-cli.ts +1 -0
- package/src/self-dev/run-supervisor.ts +19 -0
- package/src/self-implement/device-first.ts +8 -2
- package/src/self-implement/doctor-visit.ts +76 -58
- package/src/self-implement/gate-artifacts.ts +3 -0
- package/src/self-implement/gate-baseline.ts +75 -4
- package/src/self-implement/gate-cli.ts +317 -9
- package/src/self-implement/gate-receipt-registry.ts +180 -0
- package/src/self-implement/gate-remote.ts +145 -22
- package/src/self-implement/goal-author-clarification.ts +178 -24
- package/src/self-implement/goal-author-decompose.ts +24 -15
- package/src/self-implement/goal-author.ts +9 -5
- package/src/self-implement/host-regate.ts +120 -45
- package/src/self-implement/impl-findings-feedback.ts +188 -0
- package/src/self-implement/knowhow-pack.ts +189 -10
- package/src/self-implement/off-diff-evidence.ts +124 -0
- package/src/self-implement/orchestrator.ts +85 -7
- package/src/self-implement/run-ledger.ts +46 -8
- package/src/self-implement/run-stop.ts +12 -0
- package/src/self-implement/seams.ts +6 -3
- package/src/self-implement/self-implement-cli.ts +4 -2
- package/src/session/chat.ts +89 -15
- package/src/session-runtime/provider-circuit.ts +140 -0
- package/src/shell-runner/file-engine.ts +1 -0
- package/src/shell-runner/types.ts +4 -0
- package/src/sidetab-core/model.ts +176 -0
- package/src/skills/tools/schedule-wakeup.ts +23 -1
- package/src/skills/tools/shell.ts +51 -5
- package/src/steward/directive-audit.ts +354 -0
- package/src/surface/child-process.ts +31 -0
- package/src/surface/tui-stderr-owner.ts +48 -0
- package/src/task-agent/cover.ts +30 -12
- package/src/task-agent/judge.ts +56 -0
- package/src/task-agent/postland-card.ts +35 -2
- package/src/task-agent/rejudge-on-head.ts +46 -2
- package/src/task-agent/repair-cycle.ts +1 -1
- package/src/task-agent/task-hand.ts +129 -24
- package/src/task-agent/tier-split.ts +105 -21
- package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
- package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +27 -2
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
- package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +186 -33
- package/src/tool-runtime/skill-exec-runtime.ts +95 -5
- package/src/tui/entry.ts +15 -2
- package/src/tui/inline-choice.ts +188 -0
- package/src/tui/sidetab/list.ts +2 -176
- package/src/tui/slash/term.ts +12 -1
- package/src/tui-client/dashboard-session.ts +7 -1
- package/src/user-config.ts +34 -4
- package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
- package/src/ux-sim/fake-land-queue.ts +88 -0
- package/src/ux-sim/gate-shard-host-reroute.ts +82 -0
- package/src/ux-sim/goal-interim-trace.ts +24 -0
- package/src/ux-sim/next-tui-seat-scenarios.ts +8 -13
- package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/recipes/explainer.ts +54 -2
- package/src/web-search/grok.ts +32 -6
- package/src/web-search/index.ts +8 -7
- package/src/workflow-runtime/node-catalog.ts +53 -4
- package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +0 -93
- package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +0 -104
- package/apps/pwa/out/_next/static/chunks/2415.738b777642a02233.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +0 -24
- package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +0 -1
- package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +0 -287
- package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +0 -94
- package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +0 -32
- package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +0 -90
- package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +0 -79
- package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +0 -286
- package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +0 -1
- package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +0 -8
- package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +0 -62
- package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7488.966b116789f3d41a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +0 -77
- package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +0 -1
- package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +0 -149
- package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +0 -24
- package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +0 -2
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +0 -1
- /package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → HjeK7zONHfR7op1hKXp4k}/_ssgManifest.js +0 -0
|
@@ -40,6 +40,15 @@ export interface RunStopRecord {
|
|
|
40
40
|
export const RUN_STOP_EVENT = 'stop';
|
|
41
41
|
export const RUN_STOP_CAUSE_MAX = 120;
|
|
42
42
|
|
|
43
|
+
type RunStopListener = (entry: RunLedgerEntry) => void;
|
|
44
|
+
const runStopListeners = new Set<RunStopListener>();
|
|
45
|
+
|
|
46
|
+
/** Subscribe to live terminal run-stop facts. The durable ledger remains the source of truth. */
|
|
47
|
+
export function onRunStop(listener: RunStopListener): () => void {
|
|
48
|
+
runStopListeners.add(listener);
|
|
49
|
+
return () => { runStopListeners.delete(listener); };
|
|
50
|
+
}
|
|
51
|
+
|
|
43
52
|
export interface RunStopInput {
|
|
44
53
|
runId: string;
|
|
45
54
|
goalId?: string;
|
|
@@ -121,6 +130,9 @@ export function recordRunStop(input: RunStopInput, write: RunLedgerWriter = appe
|
|
|
121
130
|
write(entry);
|
|
122
131
|
if (recordedThisProcess.size >= RECORDED_MAX) recordedThisProcess.clear();
|
|
123
132
|
recordedThisProcess.add(input.runId);
|
|
133
|
+
for (const listener of runStopListeners) {
|
|
134
|
+
try { listener(entry); } catch { /* wake consumers cannot change run outcome */ }
|
|
135
|
+
}
|
|
124
136
|
try {
|
|
125
137
|
debug.log('self-implement.run-stop', 'recorded', { runId: input.runId, site: input.site ?? null, ...record, requestedClass: input.class ?? null });
|
|
126
138
|
} catch { /* observation is fail-soft */ }
|
|
@@ -2236,7 +2236,10 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
2236
2236
|
};
|
|
2237
2237
|
if (failedTest) {
|
|
2238
2238
|
const worktreeLog = failedTest.output ?? '';
|
|
2239
|
-
|
|
2239
|
+
// A supplied gate runner can report a virtual checkout, just like gate-cli's injected runner.
|
|
2240
|
+
const currentFileExists = o.runIntegrityGate ? undefined : (file: string) => existsSync(resolve(cwd, file));
|
|
2241
|
+
const worktreeFailures = extractGateTestFailures(worktreeLog, currentFileExists);
|
|
2242
|
+
const failedFiles = [...new Set(worktreeFailures
|
|
2240
2243
|
.flatMap((failure) => failure.file ? [failure.file] : []))];
|
|
2241
2244
|
// 워크트리와 같은 묶음으로 베이스라인을 돌려 파일 간 간섭을 재현한다. 스코프가 없으면 실패 파일로 폴백.
|
|
2242
2245
|
const testArgs = gateOpts.testArgs;
|
|
@@ -2246,14 +2249,14 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
2246
2249
|
const baseline = (o.runGateBaseline ?? runGateBaseline)(cwd, baselineFiles, baselineRefs.get(cwd));
|
|
2247
2250
|
const rerun = (o.rerunBunTimeoutFailures ?? rerunBunTimeoutFailures)(
|
|
2248
2251
|
cwd,
|
|
2249
|
-
|
|
2252
|
+
worktreeFailures,
|
|
2250
2253
|
undefined,
|
|
2251
2254
|
baseline.status === 'unknown' ? undefined : (baseline.output ?? ''),
|
|
2252
2255
|
baseline.missingAtBase ?? [],
|
|
2253
2256
|
);
|
|
2254
2257
|
const rerunObservations = rerun instanceof Map ? rerun : rerun.observations;
|
|
2255
2258
|
const rerunNotRun = rerun instanceof Map ? 0 : rerun.rerunNotRun;
|
|
2256
|
-
const report = buildGateBaselineReport(worktreeLog, baseline, rerunObservations, rerunNotRun);
|
|
2259
|
+
const report = buildGateBaselineReport(worktreeLog, baseline, rerunObservations, rerunNotRun, currentFileExists);
|
|
2257
2260
|
baselineReport = report;
|
|
2258
2261
|
baselineFailures = report.failures;
|
|
2259
2262
|
const unknownReason = baseline.unknownReason;
|
|
@@ -23,6 +23,8 @@ import { readDecomposeProposals } from '../self-dev/decompose-proposal.js';
|
|
|
23
23
|
|
|
24
24
|
/** self implement CLI 옵션(commander) — `--no-draft` 는 draft:false 로, `--max-wait` 는 문자열로 도착. */
|
|
25
25
|
export interface SelfImplementCliOpts {
|
|
26
|
+
/** Managed tool dispatch cancellation signal, forwarded through the pipeline to the active implementation child. */
|
|
27
|
+
signal?: AbortSignal;
|
|
26
28
|
base?: string;
|
|
27
29
|
draft?: boolean;
|
|
28
30
|
openPr?: boolean;
|
|
@@ -228,8 +230,8 @@ export async function runSelfImplementCliCommand(
|
|
|
228
230
|
entry: opts.entry ?? 'external-verbatim', // CLI = 외부 창구(외부가 프롬프트 엔지니어 → verbatim 존중)
|
|
229
231
|
});
|
|
230
232
|
spec.entrance = opts.naturalLanguageDispatch ? 'nl-self-implement' : 'cli-self-implement';
|
|
231
|
-
const pipelineDeps = opts.approver || opts.progress
|
|
232
|
-
? { ...deps.pipelineDeps, ...(opts.approver ? { approver: opts.approver } : {}), ...(opts.progress ? { progress: opts.progress } : {}) }
|
|
233
|
+
const pipelineDeps = opts.approver || opts.progress || opts.signal
|
|
234
|
+
? { ...deps.pipelineDeps, ...(opts.approver ? { approver: opts.approver } : {}), ...(opts.progress ? { progress: opts.progress } : {}), ...(opts.signal ? { signal: opts.signal } : {}) }
|
|
233
235
|
: deps.pipelineDeps;
|
|
234
236
|
const exec = deps.executeReroute ?? executeSelfImplementReroute;
|
|
235
237
|
let { result, exitCode } = await exec(spec, pipelineDeps ? { pipelineDeps } : undefined);
|
package/src/session/chat.ts
CHANGED
|
@@ -285,7 +285,8 @@ const childContextComposedSessions = new Set<string>();
|
|
|
285
285
|
export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
|
|
286
286
|
const loaded = loadSession(opts.sessionId);
|
|
287
287
|
if (!loaded) throw new Error(`session not found: ${opts.sessionId}`);
|
|
288
|
-
const { meta
|
|
288
|
+
const { meta } = loaded;
|
|
289
|
+
let messages = loaded.messages;
|
|
289
290
|
|
|
290
291
|
// Memory injection: build the block once per turn, folded into the
|
|
291
292
|
// system prompt. Never fails loud — if the store isn't set up, we
|
|
@@ -368,6 +369,19 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
|
|
|
368
369
|
};
|
|
369
370
|
appendMessage(opts.sessionId, userMsg);
|
|
370
371
|
|
|
372
|
+
const explicitTier = opts.llmOpts?.model ? undefined : explicitTurnTier(opts.userConfig, opts.sessionId);
|
|
373
|
+
const llmOpts = explicitTier ? {
|
|
374
|
+
...(opts.llmOpts ?? {}), model: explicitTier.model,
|
|
375
|
+
...(explicitTier.reasoningEffort && !opts.llmOpts?.reasoningEffort ? { reasoningEffort: explicitTier.reasoningEffort } : {}),
|
|
376
|
+
} : opts.llmOpts;
|
|
377
|
+
if (explicitTier) {
|
|
378
|
+
debug.log('llm.tier', 'turn-tier-applied', {
|
|
379
|
+
sessionId: opts.sessionId, tier: explicitTier.tier, source: explicitTier.source, model: explicitTier.model,
|
|
380
|
+
reasoningEffort: llmOpts?.reasoningEffort ?? null,
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
const provider = opts.provider ?? getProviderForConfig(opts.userConfig, llmOpts?.model);
|
|
384
|
+
|
|
371
385
|
// 2) Assemble, trim, call. When images are attached for THIS turn,
|
|
372
386
|
// swap the string content of the latest user message for
|
|
373
387
|
// ContentBlock[] so the provider adapter sends them multimodally.
|
|
@@ -386,18 +400,67 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
|
|
|
386
400
|
return trimToBudget(wire, opts.maxTokens ?? DEFAULT_TOKEN_BUDGET);
|
|
387
401
|
};
|
|
388
402
|
|
|
389
|
-
|
|
390
|
-
const
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
403
|
+
let measuredProviderRequests = 0;
|
|
404
|
+
const requestSizeGuard: NonNullable<LLMOpts['requestSizeGuard']> | undefined =
|
|
405
|
+
meta.source === 'tui' && provider.name === 'openai-codex'
|
|
406
|
+
? {
|
|
407
|
+
maxChars: 400_000,
|
|
408
|
+
compactMessages: async (currentMessages) => {
|
|
409
|
+
// The first request has only the persisted transcript plus this
|
|
410
|
+
// user turn, so use the shared session compactor and rebuild from
|
|
411
|
+
// the rewritten history. Later tool rounds compact their live
|
|
412
|
+
// message list so no just-produced tool context is lost.
|
|
413
|
+
if (measuredProviderRequests === 0) {
|
|
414
|
+
const { compactSessionHistory } = await import('./compact-session.js');
|
|
415
|
+
const result = await compactSessionHistory(opts.sessionId, {
|
|
416
|
+
config: opts.userConfig.chat.autoCompact,
|
|
417
|
+
force: true,
|
|
418
|
+
modelId: llmOpts?.model ?? provider.defaultModel,
|
|
419
|
+
});
|
|
420
|
+
if (result.fired) {
|
|
421
|
+
const refreshed = loadSession(opts.sessionId);
|
|
422
|
+
if (refreshed) {
|
|
423
|
+
// The persisted compacted session includes this turn's
|
|
424
|
+
// user message. Drop that final persisted row here, then
|
|
425
|
+
// assembleTurnMessages re-adds the canonical userMsg and
|
|
426
|
+
// any image blocks from opts.userImages exactly once.
|
|
427
|
+
messages = refreshed.messages.slice(0, -1);
|
|
428
|
+
const rebuilt = assembleTurnMessages(effectiveSystemPrompt).kept;
|
|
429
|
+
return { messages: rebuilt, reason: `session-${result.reason}` };
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
const { runCompactPipeline } = await import('../compact/pipeline.js');
|
|
435
|
+
const { getDefaultCompactProvider } = await import('../compact/provider.js');
|
|
436
|
+
const compacted = await runCompactPipeline(currentMessages, {
|
|
437
|
+
sessionId: opts.sessionId,
|
|
438
|
+
provider: getDefaultCompactProvider(),
|
|
439
|
+
activeModelId: llmOpts?.model ?? provider.defaultModel,
|
|
440
|
+
policy: {
|
|
441
|
+
preserveLastN: opts.userConfig.chat.autoCompact.preserveLastN,
|
|
442
|
+
archiveEnabled: opts.userConfig.chat.compact.archiveEnabled,
|
|
443
|
+
},
|
|
444
|
+
});
|
|
445
|
+
const diagnostics = compacted.diagnostics;
|
|
446
|
+
const changed = diagnostics.layer1ResponsesTrimmed > 0
|
|
447
|
+
|| diagnostics.layer2MicrocompactCleared > 0
|
|
448
|
+
|| diagnostics.layer3SummaryApplied === 1
|
|
449
|
+
|| diagnostics.layer5FallbackTruncated === 1;
|
|
450
|
+
return changed
|
|
451
|
+
? { messages: compacted.messages, reason: 'live-request-compact' }
|
|
452
|
+
: null;
|
|
453
|
+
},
|
|
454
|
+
onMeasured: (measurement) => {
|
|
455
|
+
measuredProviderRequests += 1;
|
|
456
|
+
opts.onStatusLine?.(
|
|
457
|
+
`ctx ${measurement.requestChars.toLocaleString()} chars / ${measurement.maxChars.toLocaleString()}`
|
|
458
|
+
+ (measurement.compacted ? ` · compact ${measurement.reason}` : ''),
|
|
459
|
+
);
|
|
460
|
+
},
|
|
461
|
+
}
|
|
462
|
+
: undefined;
|
|
463
|
+
|
|
401
464
|
let kept: LLMMessage[] = [];
|
|
402
465
|
let dropped = 0;
|
|
403
466
|
let used = 0;
|
|
@@ -432,6 +495,9 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
|
|
|
432
495
|
effectiveSystemPrompt = terminal.systemPromptParts.join('\n\n');
|
|
433
496
|
}
|
|
434
497
|
const turnLlmOpts = terminal ? terminal.llmOpts : llmOpts;
|
|
498
|
+
const guardedTurnLlmOpts = requestSizeGuard
|
|
499
|
+
? { ...(turnLlmOpts ?? {}), requestSizeGuard: turnLlmOpts?.requestSizeGuard ?? requestSizeGuard }
|
|
500
|
+
: turnLlmOpts;
|
|
435
501
|
({ kept, dropped, used } = assembleTurnMessages(effectiveSystemPrompt));
|
|
436
502
|
// Durable tool telemetry (추적성) — pair each call's args (onToolCall) with its
|
|
437
503
|
// result (onToolResult) and persist a role:'tool' message so later "어떤 도구
|
|
@@ -471,6 +537,8 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
|
|
|
471
537
|
userText: opts.userText,
|
|
472
538
|
messages: kept,
|
|
473
539
|
tools: turnTools,
|
|
540
|
+
...(guardedTurnLlmOpts?.requestSizeGuard
|
|
541
|
+
? { requestSizeGuard: guardedTurnLlmOpts.requestSizeGuard } : {}),
|
|
474
542
|
dispatchTool: async (name, args, ctx) => dispatchTool(name, args, ctx),
|
|
475
543
|
signal: opts.signal ?? new AbortController().signal,
|
|
476
544
|
callbacks: {
|
|
@@ -491,6 +559,8 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
|
|
|
491
559
|
},
|
|
492
560
|
...(turnLlmOpts?.model ? { modelOverride: turnLlmOpts.model } : {}),
|
|
493
561
|
...(turnLlmOpts?.budgetGrant ? { budgetGrant: turnLlmOpts.budgetGrant } : {}),
|
|
562
|
+
...(guardedTurnLlmOpts?.requestSizeGuard
|
|
563
|
+
? { requestSizeGuard: guardedTurnLlmOpts.requestSizeGuard } : {}),
|
|
494
564
|
};
|
|
495
565
|
const maxIterations = opts.goalLoopMaxIterations ?? goalLoopCfg?.maxIterations;
|
|
496
566
|
const gl = await runGoalLoop(coreCtx, maxIterations !== undefined ? { maxIterations } : {});
|
|
@@ -513,7 +583,7 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
|
|
|
513
583
|
},
|
|
514
584
|
},
|
|
515
585
|
{
|
|
516
|
-
...(
|
|
586
|
+
...(guardedTurnLlmOpts ?? {}),
|
|
517
587
|
tools: turnTools,
|
|
518
588
|
provider,
|
|
519
589
|
// ★ /cancel 범용화(대표 2026-07-12) — per-turn abort signal 을 tool 루프·llm 호출에 전파.
|
|
@@ -527,7 +597,11 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
|
|
|
527
597
|
}
|
|
528
598
|
} else {
|
|
529
599
|
({ kept, dropped, used } = assembleTurnMessages(effectiveSystemPrompt));
|
|
530
|
-
const plainOpts =
|
|
600
|
+
const plainOpts = {
|
|
601
|
+
...(llmOpts ?? {}),
|
|
602
|
+
...(requestSizeGuard ? { requestSizeGuard: llmOpts?.requestSizeGuard ?? requestSizeGuard } : {}),
|
|
603
|
+
...(opts.signal ? { signal: opts.signal } : {}),
|
|
604
|
+
};
|
|
531
605
|
const stream = provider.streamChat
|
|
532
606
|
? provider.streamChat(kept, plainOpts)
|
|
533
607
|
: wrapTextOnly(provider.chat(kept, plainOpts));
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ⚡ SURVIVAL-PROVIDER-CIRCUIT — 공급자별 회로 차단기 (S2)
|
|
3
|
+
* 정본: 내부 문서 `RFC-tui-never-stop-survival-ladder-2026-10-27` §3 S2 · §6 B
|
|
4
|
+
*
|
|
5
|
+
* 턴 «안»의 공급자 전환(src/llm.ts decideProviderFallback → provider-fallback)은
|
|
6
|
+
* 이미 있지만, 턴이 끝나면 «방금 누가 고장 났나»를 잊는다. 다음 턴은 다시
|
|
7
|
+
* 1순위부터 열어 매번 무응답 대기를 먼저 치른다. 이 모듈은 프로세스 안에
|
|
8
|
+
* 공급자별 회로 상태를 남겨 턴을 넘어 건강을 기억한다.
|
|
9
|
+
*
|
|
10
|
+
* ⭐ 사람 의도가 이긴다(src/oauth/fallback-chain.ts 규율 ②) — 회로는 어디까지나
|
|
11
|
+
* 폴백 판정 보조다. opts.provider 로 명시·고정된 턴은 회로를 보지 않는다.
|
|
12
|
+
*
|
|
13
|
+
* 상태기계:
|
|
14
|
+
* closed —(10분 창 안 «전환 사유» 연속 2회 실패)→ open (냉각 5분)
|
|
15
|
+
* open —(냉각 경과)→ half-open
|
|
16
|
+
* half-open —(다음 시도 1회)→ 성공: closed / 실패: open (냉각 2배, 상한 30분)
|
|
17
|
+
*
|
|
18
|
+
* 전환 사유 범주는 `isProviderFallbackEligible` 이 참인 범주
|
|
19
|
+
* (network-transient · rate-limit · overloaded · malformed) ⊕
|
|
20
|
+
* `StreamIdleTimeoutError`(stream-idle-timeout) · `OverloadFailoverError`
|
|
21
|
+
* (overload-failover) 로 한정한다. 그 외 범주(context-window · safety-blocked
|
|
22
|
+
* 등 사용자 탓)는 회로에 기록하지 않는다 — 사용자가 문면을 고치기 전까지
|
|
23
|
+
* 다른 공급자로 도망갈 이유가 없다.
|
|
24
|
+
*/
|
|
25
|
+
import { debug } from '../debug/log.js';
|
|
26
|
+
import { isProviderFallbackEligible, type RetryCategory } from './retry-policy.js';
|
|
27
|
+
|
|
28
|
+
export type ProviderCircuitState = 'closed' | 'open' | 'half-open';
|
|
29
|
+
|
|
30
|
+
/** 회로 실패로 세는 «전환 사유» 범주에 추가로 들어가는 두 에러의 범주명. */
|
|
31
|
+
export const CIRCUIT_EXTRA_CATEGORIES = ['stream-idle-timeout', 'overload-failover'] as const;
|
|
32
|
+
|
|
33
|
+
/** 10분 창 — 같은 공급자의 «전환 사유» 실패 2회가 이 창 안에 있어야 열린다. */
|
|
34
|
+
export const CIRCUIT_FAILURE_WINDOW_MS = 10 * 60_000;
|
|
35
|
+
/** 첫 냉각 5분 — 다시 열릴 때마다 2배. */
|
|
36
|
+
export const CIRCUIT_COOLDOWN_BASE_MS = 5 * 60_000;
|
|
37
|
+
export const CIRCUIT_COOLDOWN_MAX_MS = 30 * 60_000;
|
|
38
|
+
export const CIRCUIT_FAILURE_THRESHOLD = 2;
|
|
39
|
+
|
|
40
|
+
interface CircuitEntry {
|
|
41
|
+
/** «전환 사유» 실패 시각(에포크 ms) — 10분 창 밖은 다듬는다. */
|
|
42
|
+
eligibleFailures: number[];
|
|
43
|
+
state: 'closed' | 'open';
|
|
44
|
+
cooldownMs: number;
|
|
45
|
+
openedAt: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** 프로세스 안 상태 — 턴을 넘어 살아 있어야 하니 모듈 스코프에 둔다. */
|
|
49
|
+
const circuits = new Map<string, CircuitEntry>();
|
|
50
|
+
|
|
51
|
+
/** 실패 범주가 회로 실패(«전환 사유»)로 세는가 — 순수 판정. */
|
|
52
|
+
export function isCircuitFailureCategory(category: string): boolean {
|
|
53
|
+
if ((CIRCUIT_EXTRA_CATEGORIES as readonly string[]).includes(category)) return true;
|
|
54
|
+
return isProviderFallbackEligible(
|
|
55
|
+
new Error(`circuit:${category}`),
|
|
56
|
+
category as RetryCategory,
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function entry(name: string): CircuitEntry {
|
|
61
|
+
let entry = circuits.get(name);
|
|
62
|
+
if (!entry) {
|
|
63
|
+
entry = { eligibleFailures: [], state: 'closed', cooldownMs: CIRCUIT_COOLDOWN_BASE_MS, openedAt: 0 };
|
|
64
|
+
circuits.set(name, entry);
|
|
65
|
+
}
|
|
66
|
+
return entry;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function logState(
|
|
70
|
+
event: 'circuit-open' | 'circuit-half-open' | 'circuit-closed',
|
|
71
|
+
provider: string,
|
|
72
|
+
failures: number,
|
|
73
|
+
cooldownMs: number,
|
|
74
|
+
): void {
|
|
75
|
+
debug.log('tui.survival', event, { provider, failures, cooldownMs });
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** 회로 차단기에 실패를 기록한다. «전환 사유» 범주만 세며, half-open 시험
|
|
79
|
+
* 실패는 냉각을 2배(상한 30분)로 갈아 open 을 다시 연다. */
|
|
80
|
+
export function recordProviderFailure(name: string, category: string, now: number): void {
|
|
81
|
+
if (!isCircuitFailureCategory(category)) return;
|
|
82
|
+
const e = entry(name);
|
|
83
|
+
if (e.state === 'open' && now >= e.openedAt + e.cooldownMs) {
|
|
84
|
+
// half-open 시험 실패 — 다시 열리고 냉각은 2배(상한 30분).
|
|
85
|
+
e.cooldownMs = Math.min(e.cooldownMs * 2, CIRCUIT_COOLDOWN_MAX_MS);
|
|
86
|
+
e.openedAt = now;
|
|
87
|
+
e.eligibleFailures.push(now);
|
|
88
|
+
logState('circuit-open', name, e.eligibleFailures.length, e.cooldownMs);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
e.eligibleFailures = e.eligibleFailures.filter((t) => now - t <= CIRCUIT_FAILURE_WINDOW_MS);
|
|
92
|
+
e.eligibleFailures.push(now);
|
|
93
|
+
if (e.state === 'closed' && e.eligibleFailures.length >= CIRCUIT_FAILURE_THRESHOLD) {
|
|
94
|
+
e.state = 'open';
|
|
95
|
+
e.openedAt = now;
|
|
96
|
+
e.cooldownMs = CIRCUIT_COOLDOWN_BASE_MS;
|
|
97
|
+
logState('circuit-open', name, e.eligibleFailures.length, e.cooldownMs);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** 성공 — half-open 이면 closed 로 회복하고, closed 의 실패 이력 창을 정리한다. */
|
|
102
|
+
export function recordProviderSuccess(name: string, now: number): void {
|
|
103
|
+
const e = circuits.get(name);
|
|
104
|
+
if (!e) return;
|
|
105
|
+
if (e.state === 'open' && now >= e.openedAt + e.cooldownMs) {
|
|
106
|
+
e.state = 'closed';
|
|
107
|
+
e.cooldownMs = CIRCUIT_COOLDOWN_BASE_MS;
|
|
108
|
+
e.eligibleFailures = [];
|
|
109
|
+
logState('circuit-closed', name, 0, e.cooldownMs);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (e.eligibleFailures.length > 0) e.eligibleFailures = [];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** 현재 회로 상태 — 주입 시계로만 판정한다. */
|
|
116
|
+
export function circuitState(name: string, now: number): ProviderCircuitState {
|
|
117
|
+
const e = circuits.get(name);
|
|
118
|
+
if (!e || e.state === 'closed') return 'closed';
|
|
119
|
+
return now < e.openedAt + e.cooldownMs ? 'open' : 'half-open';
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** 턴의 첫 공급자 후보 — 체인 순서 그대로 첫 `closed`, 없으면 첫 `half-open`,
|
|
123
|
+
* 모두 `open` 이면 `undefined`(호출부가 원래 1순위로 열며 `circuit-all-open` 을 남긴다). */
|
|
124
|
+
export function pickInitialProvider(
|
|
125
|
+
chainNames: readonly string[],
|
|
126
|
+
now: number,
|
|
127
|
+
): string | undefined {
|
|
128
|
+
let firstHalfOpen: string | undefined;
|
|
129
|
+
for (const name of chainNames) {
|
|
130
|
+
const state = circuitState(name, now);
|
|
131
|
+
if (state === 'closed') return name;
|
|
132
|
+
if (state === 'half-open' && firstHalfOpen === undefined) firstHalfOpen = name;
|
|
133
|
+
}
|
|
134
|
+
return firstHalfOpen;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** 테스트 전용 — 프로세스 안 회로 상태를 리셋한다. */
|
|
138
|
+
export function resetProviderCircuitForTest(): void {
|
|
139
|
+
circuits.clear();
|
|
140
|
+
}
|
|
@@ -368,6 +368,7 @@ function buildResult(
|
|
|
368
368
|
const aggCapped = capString(agg, meta.maxOutputBytes);
|
|
369
369
|
const r: ShellResult = {
|
|
370
370
|
...(meta.exitCode !== undefined ? { exitCode: meta.exitCode } : {}),
|
|
371
|
+
...(meta.spawnError !== undefined ? { failureReason: meta.spawnError } : {}),
|
|
371
372
|
stdout: stdout.toStream(meta.maxOutputBytes),
|
|
372
373
|
stderr: stderr.toStream(meta.maxOutputBytes),
|
|
373
374
|
aggregated: aggCapped,
|
|
@@ -213,6 +213,10 @@ export interface StreamOutput {
|
|
|
213
213
|
|
|
214
214
|
export interface ShellResult {
|
|
215
215
|
exitCode?: number;
|
|
216
|
+
/** Failure detail captured at the execution boundary (for example,
|
|
217
|
+
* the original spawn error). Kept separate from outcome so callers
|
|
218
|
+
* can explain why no process exit status exists. */
|
|
219
|
+
failureReason?: string;
|
|
216
220
|
stdout: StreamOutput;
|
|
217
221
|
stderr: StreamOutput;
|
|
218
222
|
/** Merged (interleaved) stream in spawn order. For File engine
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { resolveInstanceName } from '../instance-identity.js';
|
|
2
|
+
import { listPtyManifestRows, type PtyManifestRow } from '../pty-shell/pty-manifest.js';
|
|
3
|
+
import { describePtyRunState } from '../pty-shell/tui-run-state.js';
|
|
4
|
+
|
|
5
|
+
const graphemes = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
|
|
6
|
+
|
|
7
|
+
export type SidetabBadge = 'busy' | 'idle' | 'stale' | 'unknown' | 'exited';
|
|
8
|
+
|
|
9
|
+
export interface SidetabRow {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly label: string;
|
|
12
|
+
readonly kind: string;
|
|
13
|
+
readonly badge: SidetabBadge;
|
|
14
|
+
readonly sessionId?: string;
|
|
15
|
+
readonly ptyId?: string;
|
|
16
|
+
readonly nestDepth?: number;
|
|
17
|
+
readonly ownerPid?: number;
|
|
18
|
+
readonly currentProcess?: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface SidetabState {
|
|
22
|
+
readonly open: boolean;
|
|
23
|
+
readonly selected: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface SidetabScope {
|
|
27
|
+
readonly all?: boolean;
|
|
28
|
+
readonly currentPtyId?: string;
|
|
29
|
+
readonly currentPid?: number;
|
|
30
|
+
/** Current classic chat session; classic shell rows carry it in their purpose tag. */
|
|
31
|
+
readonly currentSessionId?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export type SidetabKey = 'toggle' | 'up' | 'down' | 'other';
|
|
35
|
+
|
|
36
|
+
export function createSidetabState(): SidetabState {
|
|
37
|
+
return { open: false, selected: 0 };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function sidetabWidthForTerminal(columns: number): number {
|
|
41
|
+
return columns < 34 ? 0 : Math.min(28, Math.max(12, Math.floor(columns / 3)));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function sidetabRowIndexAtTerminalRow(rowCount: number, selected: number, panelHeight: number, terminalRow: number): number | null {
|
|
45
|
+
const rowCapacity = Math.max(0, Math.floor(panelHeight) - 3);
|
|
46
|
+
const visibleCount = Math.min(rowCount, rowCapacity);
|
|
47
|
+
const offset = terminalRow - 3;
|
|
48
|
+
if (visibleCount === 0 || offset < 0 || offset >= visibleCount) return null;
|
|
49
|
+
const start = rowCount <= visibleCount
|
|
50
|
+
? 0
|
|
51
|
+
: Math.max(0, Math.min(selected - visibleCount + 1, rowCount - visibleCount));
|
|
52
|
+
return start + offset;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function applySidetabKey(state: SidetabState, key: SidetabKey, rowCount: number): SidetabState {
|
|
56
|
+
if (key === 'toggle') return { ...state, open: !state.open, selected: Math.min(state.selected, Math.max(0, rowCount - 1)) };
|
|
57
|
+
if (!state.open || rowCount === 0 || (key !== 'up' && key !== 'down')) return state;
|
|
58
|
+
const delta = key === 'up' ? -1 : 1;
|
|
59
|
+
return { ...state, selected: (state.selected + delta + rowCount) % rowCount };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function sidetabRowsFromManifest(
|
|
63
|
+
rows: readonly PtyManifestRow[],
|
|
64
|
+
instance: string,
|
|
65
|
+
runState: (row: PtyManifestRow) => { turn: string; stale: boolean | null } = describePtyRunState,
|
|
66
|
+
scope?: SidetabScope,
|
|
67
|
+
): SidetabRow[] {
|
|
68
|
+
const currentPid = scope?.currentPid ?? process.pid;
|
|
69
|
+
const currentSessionId = scope?.currentSessionId;
|
|
70
|
+
const eligible = rows.filter((row) => row.instance === instance && (
|
|
71
|
+
(row.kind === 'tui' && Boolean(row.sessionId))
|
|
72
|
+
|| Boolean(row.parentPtyId)
|
|
73
|
+
|| row.purpose?.startsWith('next-tui-sidetab:')
|
|
74
|
+
|| (row.kind === 'shell'
|
|
75
|
+
&& currentSessionId !== undefined
|
|
76
|
+
&& row.parentPid === currentPid
|
|
77
|
+
&& row.purpose?.includes(`:session:${currentSessionId}:terminal:`))
|
|
78
|
+
));
|
|
79
|
+
let scoped = eligible;
|
|
80
|
+
if (scope) {
|
|
81
|
+
const parent = eligible.find((row) => row.kind === 'tui'
|
|
82
|
+
&& (row.id === (scope.currentPtyId ?? `tui:${currentPid}`) || row.ownerPid === currentPid));
|
|
83
|
+
if (!scope.all) {
|
|
84
|
+
const includedIds = new Set<string>(parent ? [parent.id] : []);
|
|
85
|
+
const includedPids = new Set<number>(parent ? [parent.ownerPid, parent.ptyPid, currentPid] : [currentPid]);
|
|
86
|
+
let changed = true;
|
|
87
|
+
while (changed) {
|
|
88
|
+
changed = false;
|
|
89
|
+
for (const row of eligible) {
|
|
90
|
+
if (row.kind === 'tui' || includedIds.has(row.id)) continue;
|
|
91
|
+
if ((row.parentPtyId && includedIds.has(row.parentPtyId)) || (row.parentPid > 0 && includedPids.has(row.parentPid))) {
|
|
92
|
+
includedIds.add(row.id);
|
|
93
|
+
if (row.ownerPid > 0) includedPids.add(row.ownerPid);
|
|
94
|
+
if (row.ptyPid > 0) includedPids.add(row.ptyPid);
|
|
95
|
+
changed = true;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
scoped = eligible.filter((row) => includedIds.has(row.id));
|
|
100
|
+
}
|
|
101
|
+
if (!scope.all) scoped = scoped.filter((row) => row.alive);
|
|
102
|
+
}
|
|
103
|
+
return scoped
|
|
104
|
+
.map((row) => {
|
|
105
|
+
const badge: SidetabBadge = !row.alive
|
|
106
|
+
? 'exited'
|
|
107
|
+
: (() => {
|
|
108
|
+
const state = runState(row);
|
|
109
|
+
return state.stale === true ? 'stale' : state.turn === 'busy' ? 'busy' : state.turn === 'idle' ? 'idle' : 'unknown';
|
|
110
|
+
})();
|
|
111
|
+
const sessionId = row.purpose?.startsWith('next-tui-sidetab:') ? row.purpose.slice('next-tui-sidetab:'.length) : undefined;
|
|
112
|
+
const classicTerminalSessionId = currentSessionId !== undefined && row.kind === 'shell'
|
|
113
|
+
? row.purpose?.split(`:session:${currentSessionId}:terminal:`)[1]
|
|
114
|
+
: undefined;
|
|
115
|
+
return {
|
|
116
|
+
id: row.id,
|
|
117
|
+
label: `${' '.repeat(Math.min(2, row.nestDepth ?? 0))}${row.nickname || row.purpose || row.cmd || row.kind}`,
|
|
118
|
+
...(row.sessionId ? { sessionId: row.sessionId } : {}),
|
|
119
|
+
kind: row.kind,
|
|
120
|
+
badge,
|
|
121
|
+
ptyId: row.id,
|
|
122
|
+
nestDepth: row.nestDepth,
|
|
123
|
+
ownerPid: row.ownerPid,
|
|
124
|
+
currentProcess: row.kind === 'tui' && row.ownerPid === process.pid,
|
|
125
|
+
...(sessionId ? { sessionId } : classicTerminalSessionId ? { sessionId: classicTerminalSessionId } : {}),
|
|
126
|
+
};
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function loadSidetabRows(all = false, currentSessionId?: string): SidetabRow[] {
|
|
131
|
+
return sidetabRowsFromManifest(listPtyManifestRows(), resolveInstanceName(), describePtyRunState, {
|
|
132
|
+
all,
|
|
133
|
+
...(currentSessionId ? { currentSessionId } : {}),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function formatSidetabLines(
|
|
138
|
+
rows: readonly SidetabRow[],
|
|
139
|
+
selected: number,
|
|
140
|
+
width: number,
|
|
141
|
+
height = Number.POSITIVE_INFINITY,
|
|
142
|
+
mode: 'list' | 'new' = 'list',
|
|
143
|
+
): string[] {
|
|
144
|
+
const fit = (value: string): string => {
|
|
145
|
+
const segments = [...graphemes.segment(value)].map(({ segment }) => segment);
|
|
146
|
+
const truncated = Bun.stringWidth(value) > width;
|
|
147
|
+
const limit = truncated ? Math.max(0, width - 1) : width;
|
|
148
|
+
let result = '';
|
|
149
|
+
let used = 0;
|
|
150
|
+
for (const segment of segments) {
|
|
151
|
+
const cells = Bun.stringWidth(segment);
|
|
152
|
+
if (used + cells > limit) break;
|
|
153
|
+
result += segment;
|
|
154
|
+
used += cells;
|
|
155
|
+
}
|
|
156
|
+
if (truncated && width > 0) { result += '…'; used++; }
|
|
157
|
+
return result + ' '.repeat(Math.max(0, width - used));
|
|
158
|
+
};
|
|
159
|
+
const lines = mode === 'new'
|
|
160
|
+
? [fit(' 새 PTY'), fit(' s shell · e elanous'), fit(' c codex · l claude · Esc')]
|
|
161
|
+
: [fit(' 세션 · PTY'), fit(' ↑↓ 전환 · 클릭 선택')];
|
|
162
|
+
const rowCapacity = Math.max(0, Math.floor(height) - lines.length - (mode === 'list' ? 1 : 0));
|
|
163
|
+
const visibleCount = Math.min(rows.length || 1, rowCapacity);
|
|
164
|
+
const start = rows.length <= visibleCount
|
|
165
|
+
? 0
|
|
166
|
+
: Math.max(0, Math.min(selected - visibleCount + 1, rows.length - visibleCount));
|
|
167
|
+
if (mode === 'list' && rows.length === 0 && visibleCount > 0) lines.push(fit(' 항목 없음'));
|
|
168
|
+
for (let offset = 0; offset < visibleCount && rows.length > 0; offset++) {
|
|
169
|
+
const index = start + offset;
|
|
170
|
+
const row = rows[index]!;
|
|
171
|
+
const marker = index === selected ? '›' : ' ';
|
|
172
|
+
lines.push(fit(` ${marker} ${row.badge} ${row.label}`));
|
|
173
|
+
}
|
|
174
|
+
if (mode === 'list' && lines.length < Math.floor(height)) lines.push(fit(' + new · /side new'));
|
|
175
|
+
return lines;
|
|
176
|
+
}
|
|
@@ -449,8 +449,30 @@ export function createDashboardWakeupScheduler(
|
|
|
449
449
|
gate: Pick<InternalTurnGate, 'startTurnIfIdle' | 'isInternalTurnActive' | 'lastTurnId'>,
|
|
450
450
|
deps: Omit<WakeupSchedulerDeps, 'startTurnIfIdle' | 'isTurnActive'> = {},
|
|
451
451
|
): WakeupScheduler {
|
|
452
|
+
// The N03 real-TUI scenario must cover a scheduled wake while a turn is busy,
|
|
453
|
+
// then the one-minute retry after it settles. Keep the logical clock exact,
|
|
454
|
+
// but let that isolated fake-LLM fixture advance timer deadlines quickly.
|
|
455
|
+
// Both opt-ins are required; ordinary TUI sessions always use wall-clock time.
|
|
456
|
+
const acceleratedTestClock = process.env.ELANOUS_TEST_FAKE_LLM === '1'
|
|
457
|
+
&& process.env.ELANOUS_TEST_FAST_WAKEUP_CLOCK === '1';
|
|
458
|
+
let testNow = Date.now();
|
|
459
|
+
let testTimerCount = 0;
|
|
460
|
+
const schedulerDeps: Omit<WakeupSchedulerDeps, 'startTurnIfIdle' | 'isTurnActive'> = acceleratedTestClock
|
|
461
|
+
? {
|
|
462
|
+
...deps,
|
|
463
|
+
now: () => testNow,
|
|
464
|
+
setTimer: (callback, logicalDelayMs) => {
|
|
465
|
+
const realDelayMs = testTimerCount++ === 0 ? 3_000 : 8_000;
|
|
466
|
+
return setTimeout(() => {
|
|
467
|
+
testNow += logicalDelayMs;
|
|
468
|
+
callback();
|
|
469
|
+
}, realDelayMs);
|
|
470
|
+
},
|
|
471
|
+
clearTimer: (timer) => clearTimeout(timer as ReturnType<typeof setTimeout>),
|
|
472
|
+
}
|
|
473
|
+
: deps;
|
|
452
474
|
return createWakeupScheduler({
|
|
453
|
-
...
|
|
475
|
+
...schedulerDeps,
|
|
454
476
|
startTurnIfIdle: (text, opts) => gate.startTurnIfIdle(text, opts),
|
|
455
477
|
isTurnActive: (turnId) => gate.isInternalTurnActive() && gate.lastTurnId() === turnId,
|
|
456
478
|
// 한 턴 호출 상한의 턴 경계 = H2 가 아는 마지막 턴 id(사람 제출마다 human-N · 내부 턴마다 auto-N).
|