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
package/src/tui/entry.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { createInlineEditorState, type InlineEditorState } from '../input-core/i
|
|
|
7
7
|
import { isNewSessionCommand, nextTuiTitle, requestNewTuiSession } from './slash/new-session.js';
|
|
8
8
|
import { COMPACT_BUSY_STATUS, COMPACT_NO_SESSION_STATUS, isCompactCommand } from './slash/compact-command.js';
|
|
9
9
|
import { RESUME_BUSY_STATUS, parseResumeCommand } from './slash/resume-command.js';
|
|
10
|
-
import { reportTuiTurn } from '../pty-shell/tui-run-state.js';
|
|
10
|
+
import { reportTuiProgress, reportTuiTurn } from '../pty-shell/tui-run-state.js';
|
|
11
11
|
import { createPasteFold } from '../chat/paste-fold.js';
|
|
12
12
|
import { createTurnTypeaheadState, dequeueTurnTypeaheadHandoff, drainTurnTypeaheadOnce, restoreTurnTypeaheadSubmission } from '../chat/turn-typeahead.js';
|
|
13
13
|
import { debug } from '../debug/log.js';
|
|
@@ -100,7 +100,8 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
100
100
|
let sidetabRemoteFrame: string | null = null;
|
|
101
101
|
let sidetabRows: import('./sidetab/list.js').SidetabRow[] = [];
|
|
102
102
|
let sidetabApi: typeof import('./sidetab/list.js') | null = null;
|
|
103
|
-
|
|
103
|
+
// ⚠️ `as` 단언은 «null 로 좁혀지는» 흐름 분석을 푸는 것 — 값은 클로저(ensureSidetabAttachments) 안에서만 바뀐다.
|
|
104
|
+
let sidetabAttachments: import('./sidetab/attach.js').SidetabAttachmentController | null = null as import('./sidetab/attach.js').SidetabAttachmentController | null;
|
|
104
105
|
let pendingSidetabSwitch: string | null = null;
|
|
105
106
|
let sidetabRefreshTimer: ReturnType<typeof setInterval> | null = null;
|
|
106
107
|
let paintingCoordinatorFrame = false;
|
|
@@ -479,6 +480,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
479
480
|
};
|
|
480
481
|
|
|
481
482
|
let restoreCliStderrSink: (() => void) | null = null;
|
|
483
|
+
let restoreTuiStderrOwner: (() => void) | null = null;
|
|
482
484
|
|
|
483
485
|
const refreshAtPicker = async (): Promise<void> => {
|
|
484
486
|
const query = editor.text.slice(0, editor.cursor).match(/(?:^|\s)@([\p{L}\p{N}_./~\\-]*)$/u);
|
|
@@ -550,6 +552,8 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
550
552
|
// herdr pane 이면 턴 시작·끝을 working → idle 로 신고한다(`eln herdr prompt --wait` 가 이것을 기다린다).
|
|
551
553
|
// 녹음기는 startTuiSelfReport 가 이미 열었다 — 없으면 아무것도 안 한다.
|
|
552
554
|
reportTuiTurn('busy');
|
|
555
|
+
// 턴 시작도 진전이다(SURVIVAL-PROGRESS-CLOCK) — 마지막 진전 시각의 0초를 잡는다.
|
|
556
|
+
reportTuiProgress();
|
|
553
557
|
// An internal turn says where it came from (classic «↻ 자동 재개(<origin>): <이유>») instead of looking typed.
|
|
554
558
|
// TUI-GOAL-INTERIM-QUIET — the log draws a recognized internal input in place («↻ 자동 재개(<origin>)»), so the
|
|
555
559
|
// notice list would only repeat it under the last reply; the status line still names it while the turn runs.
|
|
@@ -570,6 +574,8 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
570
574
|
observeSession(turnSessionId, onLocalChatBackgroundStatus, onLocalChatSelfHealthStatus);
|
|
571
575
|
let firstResponseSeen = false;
|
|
572
576
|
return runLocalChatTurn(turnSessionId, turnText, abort.signal, undefined, undefined, (delta) => {
|
|
577
|
+
// 스트림 텍스트 = 진전 신호 — 마지막 진전 시각을 올린다(녹음기 없으면 아무 일도 안 한다).
|
|
578
|
+
reportTuiProgress();
|
|
573
579
|
// 첫 응답 경계: 첫 스트림 델타에서 턴 시작 트레이스를 닫는다(endedBy=stream-open).
|
|
574
580
|
if (!firstResponseSeen) {
|
|
575
581
|
firstResponseSeen = true;
|
|
@@ -659,6 +665,11 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
659
665
|
}, 1_000);
|
|
660
666
|
}
|
|
661
667
|
initTui();
|
|
668
|
+
const { installTuiStderrOwner } = await import('../surface/tui-stderr-owner.js');
|
|
669
|
+
restoreTuiStderrOwner = installTuiStderrOwner((line) => {
|
|
670
|
+
pushNotice(`[stderr] ${line}`);
|
|
671
|
+
render();
|
|
672
|
+
});
|
|
662
673
|
restoreCliStderrSink = setCliStderrSink(({ source, exitCode, raw }) => {
|
|
663
674
|
// Keep the exact bytes in the normal debug log while rendering only failures through the
|
|
664
675
|
// TUI-owned notice area. Writing the CLI stream to process.stderr would overwrite the prompt.
|
|
@@ -1358,6 +1369,8 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
1358
1369
|
sidetabAttachments?.close();
|
|
1359
1370
|
restoreCliStderrSink?.();
|
|
1360
1371
|
restoreCliStderrSink = null;
|
|
1372
|
+
restoreTuiStderrOwner?.();
|
|
1373
|
+
restoreTuiStderrOwner = null;
|
|
1361
1374
|
if (residueTimer !== null) clearTimeout(residueTimer);
|
|
1362
1375
|
loopCommand?.dispose();
|
|
1363
1376
|
missionWatchesClosed = true;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { debug } from '../debug/log.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Non-modal, chat-input choice prompt. The caller renders `lines` in the chat
|
|
5
|
+
* transcript and forwards submitted input to `handleInput`; this keeps the
|
|
6
|
+
* normal input row visible and allows external PTY text injection to answer.
|
|
7
|
+
*/
|
|
8
|
+
export interface InlineChoiceOption {
|
|
9
|
+
readonly value: string;
|
|
10
|
+
readonly label: string;
|
|
11
|
+
readonly description?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface InlineChoiceSpec {
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly question: string;
|
|
17
|
+
readonly options: readonly InlineChoiceOption[];
|
|
18
|
+
readonly multiSelect?: boolean;
|
|
19
|
+
readonly includeOther?: boolean;
|
|
20
|
+
/** Omit for an interactive prompt with no deadline. */
|
|
21
|
+
readonly timeoutMs?: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type InlineChoiceResult =
|
|
25
|
+
| { readonly selected: readonly string[]; readonly otherText?: string }
|
|
26
|
+
| { readonly selected: readonly []; readonly cancelled: true; readonly reason: 'cancelled' | 'timeout' };
|
|
27
|
+
|
|
28
|
+
export type InlineChoiceEvent =
|
|
29
|
+
| { readonly id: string; readonly outcome: 'answered'; readonly selectedCount: number; readonly elapsedMs: number }
|
|
30
|
+
| { readonly id: string; readonly outcome: 'cancelled' | 'timeout'; readonly elapsedMs: number };
|
|
31
|
+
|
|
32
|
+
export interface InlineChoiceDeps {
|
|
33
|
+
readonly appendLines: (lines: readonly string[]) => void;
|
|
34
|
+
readonly observe?: (event: InlineChoiceEvent) => void;
|
|
35
|
+
readonly now?: () => number;
|
|
36
|
+
readonly schedule?: (callback: () => void, delayMs: number) => ReturnType<typeof setTimeout>;
|
|
37
|
+
readonly cancelSchedule?: (timer: ReturnType<typeof setTimeout>) => void;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface InlineChoiceHandle {
|
|
41
|
+
readonly promise: Promise<InlineChoiceResult>;
|
|
42
|
+
/** Returns true only when this input was consumed by the prompt. */
|
|
43
|
+
handleInput(input: string): boolean;
|
|
44
|
+
cancel(): void;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface InlineChoiceBrokerDeps extends InlineChoiceDeps {}
|
|
48
|
+
|
|
49
|
+
/** One prompt slot shared by clarification and confirmation requests in a TUI turn. */
|
|
50
|
+
export class InlineChoiceBroker {
|
|
51
|
+
private active: InlineChoiceHandle | null = null;
|
|
52
|
+
private activeIdValue: string | null = null;
|
|
53
|
+
|
|
54
|
+
constructor(private readonly deps: InlineChoiceBrokerDeps) {}
|
|
55
|
+
|
|
56
|
+
get activeId(): string | null { return this.activeIdValue; }
|
|
57
|
+
|
|
58
|
+
ask(spec: InlineChoiceSpec): Promise<InlineChoiceResult> {
|
|
59
|
+
if (this.active) throw new Error('another inline choice is already active');
|
|
60
|
+
const handle = createInlineChoice(spec, this.deps);
|
|
61
|
+
this.active = handle;
|
|
62
|
+
this.activeIdValue = spec.id;
|
|
63
|
+
void handle.promise.finally(() => {
|
|
64
|
+
if (this.active !== handle) return;
|
|
65
|
+
this.active = null;
|
|
66
|
+
this.activeIdValue = null;
|
|
67
|
+
});
|
|
68
|
+
return handle.promise;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Feed submitted text (including numeric replies injected through a PTY) to the active prompt. */
|
|
72
|
+
handleInput(input: string): boolean {
|
|
73
|
+
return this.active?.handleInput(input) ?? false;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
cancel(): void { this.active?.cancel(); }
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Cancel the prompt owned by a turn when that turn's streaming UI tears down. */
|
|
80
|
+
export function createInlineChoiceTurnEndCleanup(broker: InlineChoiceBroker): () => void {
|
|
81
|
+
return () => broker.cancel();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function formatInlineChoiceLines(spec: InlineChoiceSpec): string[] {
|
|
85
|
+
const lines = ['', ` ${spec.question}`];
|
|
86
|
+
spec.options.forEach((option, index) => {
|
|
87
|
+
lines.push(` ${index + 1}. ${option.label}${option.description ? ` — ${option.description}` : ''}`);
|
|
88
|
+
});
|
|
89
|
+
if (spec.includeOther !== false) lines.push(` ${spec.options.length + 1}. Other`);
|
|
90
|
+
lines.push(spec.multiSelect ? ' 여러 선택은 번호를 쉼표로 입력하세요. 취소: cancel' : ' 번호 또는 Other 답을 입력하세요. 취소: cancel');
|
|
91
|
+
return lines;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Start one inline prompt. A timed-out prompt resolves as cancelled, never as a guessed answer. */
|
|
95
|
+
export function createInlineChoice(
|
|
96
|
+
spec: InlineChoiceSpec,
|
|
97
|
+
deps: InlineChoiceDeps,
|
|
98
|
+
): InlineChoiceHandle {
|
|
99
|
+
if (!spec.id.trim() || !spec.question.trim() || spec.options.length === 0) {
|
|
100
|
+
throw new Error('inline choice requires an id, question, and at least one option');
|
|
101
|
+
}
|
|
102
|
+
const now = deps.now ?? Date.now;
|
|
103
|
+
const observe = deps.observe ?? ((event: InlineChoiceEvent) => {
|
|
104
|
+
debug.log('tui.inline-choice', 'settled', event);
|
|
105
|
+
});
|
|
106
|
+
const schedule = deps.schedule ?? ((callback, delayMs) => setTimeout(callback, delayMs));
|
|
107
|
+
const cancelSchedule = deps.cancelSchedule ?? clearTimeout;
|
|
108
|
+
const startedAt = now();
|
|
109
|
+
let settled = false;
|
|
110
|
+
let awaitingOtherText = false;
|
|
111
|
+
let timer: ReturnType<typeof setTimeout> | null = null;
|
|
112
|
+
let resolvePromise!: (result: InlineChoiceResult) => void;
|
|
113
|
+
const promise = new Promise<InlineChoiceResult>((resolve) => { resolvePromise = resolve; });
|
|
114
|
+
|
|
115
|
+
const finish = (result: InlineChoiceResult, outcome: InlineChoiceEvent['outcome']): void => {
|
|
116
|
+
if (settled) return;
|
|
117
|
+
settled = true;
|
|
118
|
+
if (timer !== null) cancelSchedule(timer);
|
|
119
|
+
timer = null;
|
|
120
|
+
const elapsedMs = Math.max(0, now() - startedAt);
|
|
121
|
+
try {
|
|
122
|
+
if (outcome === 'answered') {
|
|
123
|
+
const hasOtherText = 'otherText' in result && Boolean(result.otherText);
|
|
124
|
+
observe({ id: spec.id, outcome, selectedCount: result.selected.length + (hasOtherText ? 1 : 0), elapsedMs });
|
|
125
|
+
} else {
|
|
126
|
+
observe({ id: spec.id, outcome, elapsedMs });
|
|
127
|
+
}
|
|
128
|
+
} catch { /* logging must never strand an interactive turn */ }
|
|
129
|
+
resolvePromise(result);
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
deps.appendLines(formatInlineChoiceLines(spec));
|
|
133
|
+
if (typeof spec.timeoutMs === 'number' && Number.isFinite(spec.timeoutMs) && spec.timeoutMs > 0) {
|
|
134
|
+
timer = schedule(() => finish({ selected: [], cancelled: true, reason: 'timeout' }, 'timeout'), spec.timeoutMs);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
promise,
|
|
139
|
+
handleInput(input) {
|
|
140
|
+
if (settled) return false;
|
|
141
|
+
const value = input.trim();
|
|
142
|
+
if (!value) return true;
|
|
143
|
+
if (awaitingOtherText) {
|
|
144
|
+
finish({ selected: [], otherText: value }, 'answered');
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
if (/^(?:cancel|esc|escape)$/i.test(value)) {
|
|
148
|
+
finish({ selected: [], cancelled: true, reason: 'cancelled' }, 'cancelled');
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const selectedIndexes = value.split(',').map((part) => part.trim());
|
|
153
|
+
const numeric = selectedIndexes.every((part) => /^\d+$/.test(part));
|
|
154
|
+
if (numeric) {
|
|
155
|
+
const indexes = selectedIndexes.map(Number);
|
|
156
|
+
const otherIndex = spec.options.length + 1;
|
|
157
|
+
if (indexes.some((index) => index < 1 || index > otherIndex)
|
|
158
|
+
|| (!spec.multiSelect && indexes.length !== 1)) {
|
|
159
|
+
deps.appendLines([' 선택한 번호를 확인해 다시 입력하세요.']);
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
if (indexes.includes(otherIndex)) {
|
|
163
|
+
if (indexes.length !== 1 || spec.includeOther === false) {
|
|
164
|
+
deps.appendLines([' Other는 단독으로 선택해야 합니다.']);
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
awaitingOtherText = true;
|
|
168
|
+
deps.appendLines([' 기타 답을 입력하세요.']);
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
const selected = [...new Set(indexes)].map((index) => spec.options[index - 1]!.value);
|
|
172
|
+
finish({ selected }, 'answered');
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (spec.includeOther !== false) {
|
|
177
|
+
finish({ selected: [], otherText: value }, 'answered');
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
deps.appendLines([' 번호로 답하세요.']);
|
|
181
|
+
return true;
|
|
182
|
+
},
|
|
183
|
+
cancel() {
|
|
184
|
+
finish({ selected: [], cancelled: true, reason: 'cancelled' }, 'cancelled');
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
package/src/tui/sidetab/list.ts
CHANGED
|
@@ -1,176 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
}
|
|
1
|
+
/** Compatibility entry point for existing Next TUI callers. Shared behavior lives in sidetab-core. */
|
|
2
|
+
export * from '../../sidetab-core/model.js';
|
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;
|
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).
|
|
@@ -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,8 +3917,8 @@ function parseProjectsConfig(raw: unknown): Record<string, ProjectConfig> | unde
|
|
|
3901
3917
|
}
|
|
3902
3918
|
|
|
3903
3919
|
export interface UserConfig {
|
|
3904
|
-
/** Next TUI
|
|
3905
|
-
tui?: { sidetab?: 'off' | 'collapsed' | 'open' };
|
|
3920
|
+
/** Next TUI options. `unattended` makes confirmation/clarification paths non-blocking. */
|
|
3921
|
+
tui?: { sidetab?: 'off' | 'collapsed' | 'open'; unattended?: boolean };
|
|
3906
3922
|
projects?: Record<string, ProjectConfig>;
|
|
3907
3923
|
/** Default personal topic watch; absent = enabled when user sources exist. */
|
|
3908
3924
|
watch?: { enabled?: boolean };
|
|
@@ -3937,7 +3953,7 @@ export interface UserConfig {
|
|
|
3937
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 };
|
|
3938
3954
|
/** 🔐 Pod 의 Grok API 키 과금은 명시 opt-in 만. 생략·잘못된 값은 false.
|
|
3939
3955
|
* budgetGate 와 같은 `harness` 객체다 — 중복 선언이면 뒤 타입이 앞을 지운다. */
|
|
3940
|
-
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 };
|
|
3941
3957
|
/** Nested elanous launches. Only depth 0 may set `allow`. Absent or any other value refuses. A depth >= 1 `--nested-elanous allow` is ignored. */
|
|
3942
3958
|
nestedElanous?: 'allow' | 'refuse';
|
|
3943
3959
|
/** Maximum nested elanous depth; safe positive integer, default 2. */
|
|
@@ -5135,7 +5151,10 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5135
5151
|
const gateRemoteConfig = parseGateRemoteConfig(rawObj.gateRemote);
|
|
5136
5152
|
const projects = parseProjectsConfig(rawObj.projects);
|
|
5137
5153
|
return {
|
|
5138
|
-
tui: {
|
|
5154
|
+
tui: {
|
|
5155
|
+
sidetab: tuiRaw.sidetab === 'off' || tuiRaw.sidetab === 'open' ? tuiRaw.sidetab : 'collapsed',
|
|
5156
|
+
...(typeof tuiRaw.unattended === 'boolean' ? { unattended: tuiRaw.unattended } : {}),
|
|
5157
|
+
},
|
|
5139
5158
|
...(projects ? { projects } : {}),
|
|
5140
5159
|
...(rawObj.starter && typeof rawObj.starter === 'object' && !Array.isArray(rawObj.starter)
|
|
5141
5160
|
&& Array.isArray((rawObj.starter as Record<string, unknown>).topics)
|
|
@@ -5305,6 +5324,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5305
5324
|
};
|
|
5306
5325
|
})(),
|
|
5307
5326
|
model: resolveRuntimeLlmModel(baseProvider, selectedProvider, str(llm.model), escalationProvider || undefined),
|
|
5327
|
+
streamIdleTimeoutMs: positiveFiniteNumber(llm.streamIdleTimeoutMs),
|
|
5308
5328
|
openrouter: (() => {
|
|
5309
5329
|
const router = llm.openrouter;
|
|
5310
5330
|
if (!router || typeof router !== 'object' || Array.isArray(router)) return undefined;
|
|
@@ -6227,6 +6247,15 @@ export function getUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
6227
6247
|
return cache;
|
|
6228
6248
|
}
|
|
6229
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
|
+
|
|
6230
6259
|
// Read at call time, not registration time, so reload/reset and on-disk edits keep their semantics.
|
|
6231
6260
|
// Stored timezone is kept in raw by buildUserConfig; do not change getUserConfig's returned shape.
|
|
6232
6261
|
setConfigTimeZoneSource(() => {
|
|
@@ -6623,6 +6652,7 @@ export function saveUserConfig(
|
|
|
6623
6652
|
apiKey: cfg.llm.apiKey,
|
|
6624
6653
|
model: cfg.llm.model,
|
|
6625
6654
|
baseUrl: cfg.llm.baseUrl,
|
|
6655
|
+
streamIdleTimeoutMs: cfg.llm.streamIdleTimeoutMs,
|
|
6626
6656
|
// Persist the rotation exactly as held in memory — each entry
|
|
6627
6657
|
// stripped of its own undefined fields so the on-disk JSON
|
|
6628
6658
|
// stays minimal. Omit the key entirely when no rotation is
|
|
@@ -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 ?? '';
|