elanous 0.2.37 → 0.2.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → HjeK7zONHfR7op1hKXp4k}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{1746.3563617ea64023a3.js → 1060.014f1f01a17aec26.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9151.a2c51e93f9156dae.js → 1281.d81877e35b9068f4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1350.59f40e39e02d91b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +286 -0
- package/apps/pwa/out/_next/static/chunks/1537-6bb97b5214928ea9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +149 -0
- package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +90 -0
- package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{3578.4e9f9948a9a6f2f4.js → 2047.8f23e210995d4548.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7424.c0fe2a595d4232b5.js → 2066.a77257c8c350770a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4931.95cc6dbd230774ca.js → 2177.df8547f9d7215c4e.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6680.6a693c28aae4cd19.js → 2226.2cf61ec781827219.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2499.02fbfd18126c10c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6252.240578f10952e091.js → 2522.f2766b76d22c8bdf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1262.a89bb27a5b2f844e.js → 2566.beaffc3a5e1fcd2e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/261.0d471e8aded799f3.js +226 -0
- package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +27 -0
- package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2318-450e75d07605b8fe.js → 2774-719820e3f5b2a3eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4725-34bed25720cc326b.js → 2829-734fe8bf2eee7347.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3330.7443183b7e6fdbdf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3746-f80a78f220bf37b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +24 -0
- package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +77 -0
- package/apps/pwa/out/_next/static/chunks/{4337e36d.f42c3b391b3d8f20.js → 3b355b3d.6f73c98bf6f9c749.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +36 -0
- package/apps/pwa/out/_next/static/chunks/{58edce7d.f1b0c72acf13b123.js → 409c787b.e48c5bec8ec10456.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +287 -0
- package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4351.0f37a6db2b34d50b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5046.7fd5cbd859299448.js → 470.51a72a2348306455.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2375.bf364c85dbb6f085.js → 4769.9fd582071301f382.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{de8446d3.31b73eb239fecd7b.js → 4864a2ca.1c1c280a7772c5e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +74 -0
- package/apps/pwa/out/_next/static/chunks/{4383.18e5c54db3a22c88.js → 5383.bdfa5d886e39a826.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5436.fdf6fa8ae3e9588d.js +64 -0
- package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +8 -0
- package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +62 -0
- package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +94 -0
- package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6745-5a63492933959dd9.js → 6051-0ae955eedb10adb9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2283.edd9627b7bdfb546.js → 6257.c0037b8949239f5e.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6819.be5c9c4d67f22922.js → 6749.0744ce6eb08d40e9.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6908.06008c67f6380ea9.js +148 -0
- package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6cc1d1d6.9a98dd4622f1afc6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7219-15bdd9a80661af8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +93 -0
- package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7611.85f045bf232053ac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8099.1cccf31c1baa7e1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2002-a43a3f380df873ec.js → 8272-025653884f9645d2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7867.e8725745ddd1d940.js → 8357.1aaa713b052a78b1.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8639-92c11d069792429e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8d173e38.18a2f7b4e1848bdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +41 -0
- package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4313.76f232c304a15bde.js → 9175.2de5209a5ce6f68a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9184.45afbf44fec87574.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8c58d09b.e8724a299658d86f.js → 9189505a.980427ac048c8c60.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +79 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ba957ff875a026a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/{page-3337c6a1328c2674.js → page-4edb8df90f4537ce.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-83d27757e2b8060a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-1e5da297557d2354.js → page-fca2e59a81744d9e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-ac2c1e6169cfce57.js → page-139d722de1dcd6c1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/{page-c1c80e345fa9d6f5.js → page-ccde99f07aaf71f7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{d9815f84.4918f682a45a8502.js → b84cad00.594027ebe0531fe2.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{709a918c.4fd3b4e2a32cb4e3.js → ca3702f8.2913182e73889fa2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5f6af561-f90b7a67f4f75d13.js → d8de0de2-dd0f4ac8e5ab1832.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/graphs/demo/persona-marketer/fixtures/marketer-scenario.yaml +10 -0
- package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
- package/graphs/demo/persona-marketer/recipes.yaml +19 -0
- package/graphs/release/recipes.yaml +9 -0
- package/graphs/release/release-loop.yaml +26 -18
- package/graphs/video/explainer-line.yaml +4 -1
- package/package.json +1 -1
- package/scripts/ask-op-inbox-once.ts +17 -0
- package/scripts/brand/check.ts +13 -4
- package/scripts/dead-code/report.ts +169 -0
- package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
- package/scripts/gate-0226-failure-census.ts +39 -0
- package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
- package/scripts/lib/morning-report-options.ts +3 -4
- package/scripts/lib/tui-regress-evidence.ts +56 -0
- package/scripts/morning-report.ts +5 -1
- package/scripts/provision-export-redactions.ts +15 -0
- package/scripts/public-copy-lint.ts +122 -0
- package/scripts/public-export.ts +77 -2
- package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
- package/scripts/ratchets/train-side-invariants.sh +7 -1
- package/scripts/release-loop/cut-branch.ts +61 -12
- package/scripts/release-loop/export-check-node.ts +21 -3
- package/scripts/release-loop/gate-node.ts +527 -60
- package/scripts/release-loop/gate-partial.ts +82 -3
- package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
- package/scripts/release-loop/gate-radius-live.ts +4 -2
- package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
- package/scripts/release-loop/gate-shard-receipts.ts +89 -0
- package/scripts/release-loop/gate-wall.ts +5 -5
- package/scripts/release-loop/preflight.ts +6 -2
- package/scripts/release-loop/resume-cap.ts +2 -1
- package/scripts/release-loop/resume-release.ts +317 -13
- package/scripts/release-loop/resume.ts +61 -5
- package/scripts/release-loop/traffic-node.ts +12 -4
- package/scripts/release-loop/traffic-transition.ts +53 -13
- package/scripts/release-loop/version-node.ts +35 -5
- package/scripts/release-story/draft.ts +1 -1
- package/scripts/research-bench/README.md +53 -0
- package/scripts/research-bench/questions.json +66 -0
- package/scripts/research-bench/rubric.md +33 -0
- package/scripts/research-bench/run.ts +523 -0
- package/scripts/tui-regress.ts +85 -10
- package/scripts/ux-sim.ts +1 -1
- package/scripts/video-pipeline.ts +2 -2
- package/src/acp/core-turn-bridge.ts +14 -1
- package/src/agent/autonomous-tools.ts +10 -3
- package/src/agent/monad-agent-turn.ts +4 -1
- package/src/agent/registry.ts +26 -2
- package/src/agent/run-context.ts +1 -1
- package/src/agent/shared-app-tools.ts +1 -1
- package/src/agent/surface-ux/build.ts +12 -3
- package/src/agent/surface-ux/types.ts +1 -1
- package/src/agent/task-notification.ts +78 -7
- package/src/agent/types.ts +3 -0
- package/src/agent-mission/driver.ts +29 -3
- package/src/agent-mission/mission-cli.ts +2 -1
- package/src/agent-substrate/review-context-pack.ts +365 -0
- package/src/agent-substrate/review-observation.ts +10 -0
- package/src/agent-substrate/self-review-cli.ts +419 -42
- package/src/ask-user-question/index.ts +6 -0
- package/src/ask-user-question/inline-resolver.ts +49 -0
- package/src/auto-research/question-ladder-contract.ts +156 -0
- package/src/auto-research/research-turn.ts +467 -0
- package/src/autopilot/agent-loop.ts +1 -1
- package/src/autopilot/discovery/doc-lint.ts +1 -1
- package/src/autopilot/pty-control-loop.ts +8 -1
- package/src/boot/daemon-tools/index.ts +4 -3
- package/src/boot/daemon-tools/self-implement.ts +270 -2
- package/src/boot/daemon-tools/types.ts +2 -0
- package/src/bots/screen-probe.ts +1 -1
- package/src/budget/llm-cost.ts +44 -5
- package/src/budget/unified-usage.ts +17 -1
- package/src/capture/tui-self-report.ts +24 -2
- package/src/chat/index.ts +34 -7
- package/src/chat/tool-render/dispatch.ts +8 -1
- package/src/cli/agent-cli.ts +43 -8
- package/src/cli/guardian-cli.ts +3 -1
- package/src/cli/intake-cli.ts +70 -13
- package/src/cli/lesson-cli.ts +86 -10
- package/src/cli/log-event-names.ts +1 -0
- package/src/cli/pod-cli.ts +17 -2
- package/src/cli/pr-land-overlap-evidence.ts +38 -5
- package/src/cli/pr-land-refusal.ts +1 -1
- package/src/cli/pty-takeover-cli.ts +125 -12
- package/src/cli/release-checklist-read-cli.ts +5 -2
- package/src/cli/release-cli.ts +99 -15
- package/src/cli/repo-cli.ts +2 -1
- package/src/cli/review-carry.ts +77 -0
- package/src/cli/self-update.ts +1 -1
- package/src/cli/tasks-card-show.ts +31 -1
- package/src/cli/tasks-cli.ts +98 -32
- package/src/cli/tasks-read-cli.ts +13 -5
- package/src/context-bus/context-now.ts +86 -2
- package/src/control-plane/ledger.ts +21 -4
- package/src/core-turn/run-core-turn.ts +51 -3
- package/src/core-turn/run-goal-loop.ts +152 -8
- package/src/core-turn/types.ts +12 -0
- package/src/dashboard/chat/acp-chat.ts +2 -2
- package/src/dashboard/classic-sigquit.ts +16 -0
- package/src/dashboard/index.ts +339 -44
- package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
- package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
- package/src/dashboard/input/external-input-host.ts +2 -0
- package/src/dashboard/input/terminal-modal-router.ts +8 -159
- package/src/dashboard/side-basic-runtime.ts +61 -0
- package/src/dashboard/sidetab-runtime.ts +228 -0
- package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +22 -8
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
- package/src/dashboard/term-slash-runtime.ts +18 -18
- package/src/dashboard/turn-preamble.ts +30 -4
- package/src/domains/guardian-tick.ts +9 -0
- package/src/domains/knowledge.ts +1 -1
- package/src/esc-abort-gate.ts +33 -1
- package/src/execution-loop/launch-gate.ts +206 -1
- package/src/git-fs/watcher.ts +27 -22
- package/src/git-fs/worktree.ts +19 -3
- package/src/graph-runner/graph-cli.ts +6 -4
- package/src/graph-runner/graph-grow.ts +37 -9
- package/src/graph-runner/runner.ts +48 -11
- package/src/graph-wizard/generate.ts +16 -7
- package/src/graph-wizard/mission-compose.ts +201 -0
- package/src/grok/agent-search.ts +8 -2
- package/src/grok/credential.ts +112 -36
- package/src/grounding/ref-index.ts +11 -0
- package/src/grounding/ref-vector.ts +61 -0
- package/src/grounding/sources-cli.ts +2 -2
- package/src/grounding/sources.ts +15 -1
- package/src/harness/harness-cli-command.ts +38 -9
- package/src/harness/harness-pod-dispatch.ts +7 -1
- package/src/hq/fence-wrapper.ts +1 -1
- package/src/hq/transfer.ts +1 -1
- package/src/index.ts +60 -16
- package/src/input/external-input-queue.ts +10 -0
- package/src/intake-plane/collect-telegram-saved.ts +90 -6
- package/src/intake-plane/intake-to-tasks.ts +246 -3
- package/src/interactive-terminal-modal.ts +3 -0
- package/src/keybindings.ts +17 -22
- package/src/lessons/friction-ledger.ts +154 -0
- package/src/live-supply/collector.ts +149 -0
- package/src/live-supply/probes.ts +52 -0
- package/src/live-supply/snapshot.ts +40 -0
- package/src/llm/provider-credentials.ts +1 -1
- package/src/llm-tool-schema.ts +20 -0
- package/src/llm.ts +486 -61
- package/src/loops/orchestrator/inbox-once.ts +28 -0
- package/src/loops/orchestrator/inbox.ts +130 -1
- package/src/loops/orchestrator/tick.ts +14 -3
- package/src/maturity/feature-maturity.ts +1 -0
- package/src/nexus/api/channel-ask-op.ts +96 -0
- package/src/nexus/api/discord-trigger-bot.ts +28 -1
- package/src/nexus/api/harness-api.ts +2 -1
- package/src/nexus/api/telegram-trigger-bot.ts +24 -0
- package/src/nexus/api/terminals.ts +28 -6
- package/src/patents/ledger.ts +18 -1
- package/src/preview/terminal.ts +4 -2
- package/src/prompt-cache/anthropic.ts +2 -0
- package/src/prompt-enhance/enhance.ts +5 -0
- package/src/pty/snapshot.py +132 -0
- package/src/pty-shell/pty-control-ipc.ts +29 -2
- package/src/pty-shell/pty-manifest.ts +75 -5
- package/src/pty-shell/registry.ts +2 -0
- package/src/pty-shell/tui-run-state.ts +80 -3
- package/src/release-loop/gate-host-reservation.ts +13 -4
- package/src/release-loop/gate-shard-ledger.ts +68 -0
- package/src/release-loop/gate-shards.ts +61 -0
- package/src/release-loop/light-rc.ts +7 -4
- package/src/release-loop/merged-pr-checklist.ts +25 -2
- package/src/release-loop/rehearsal-shard-plan.ts +6 -1
- package/src/release-loop/rehearsal.ts +28 -1
- package/src/repl/index.ts +10 -0
- package/src/research/axis-fanout.ts +133 -0
- package/src/research/edge-decision.ts +197 -0
- package/src/research/gap-followup.ts +249 -0
- package/src/research/lenses/counter-evidence.ts +100 -0
- package/src/research/lenses/working-backwards.ts +89 -0
- package/src/research/output-router.ts +127 -0
- package/src/research/plugin-discovery.ts +242 -0
- package/src/research-bridge/format.ts +16 -1
- package/src/research-bridge/index.ts +1 -0
- package/src/research-bridge/invoke.ts +45 -7
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +34 -106
- package/src/self-dev/decompose.ts +45 -9
- package/src/self-dev/dev-cli.ts +2 -0
- package/src/self-dev/dev-pipeline.ts +8 -4
- package/src/self-dev/draft-residue.ts +221 -2
- package/src/self-dev/draft-sweep.ts +29 -16
- package/src/self-dev/graph-journey-route.ts +10 -2
- package/src/self-dev/launch-preflight-text.ts +2 -2
- package/src/self-dev/launch-preflight.ts +38 -7
- package/src/self-dev/orchestrate-cli.ts +1 -0
- package/src/self-dev/orchestrate.ts +1 -0
- package/src/self-dev/run-supervisor.ts +41 -7
- package/src/self-dev/shard-run.ts +260 -3
- package/src/self-implement/comment-only-source.ts +54 -0
- package/src/self-implement/device-first.ts +8 -2
- package/src/self-implement/doctor-visit.ts +100 -57
- package/src/self-implement/gate-artifacts.ts +5 -2
- package/src/self-implement/gate-baseline.ts +119 -13
- package/src/self-implement/gate-cli.ts +466 -93
- package/src/self-implement/gate-failure-signature.ts +44 -0
- package/src/self-implement/gate-receipt-registry.ts +180 -0
- package/src/self-implement/gate-remote.ts +147 -22
- package/src/self-implement/goal-author-clarification.ts +178 -24
- package/src/self-implement/goal-author-decompose.ts +24 -15
- package/src/self-implement/goal-author.ts +82 -7
- package/src/self-implement/goal-doc/section.ts +22 -0
- package/src/self-implement/goal-supervisor-fill.ts +38 -4
- package/src/self-implement/host-regate.ts +120 -45
- package/src/self-implement/impl-findings-feedback.ts +188 -0
- package/src/self-implement/knowhow-pack.ts +301 -9
- package/src/self-implement/l8-merge-queue.ts +198 -32
- package/src/self-implement/off-diff-evidence.ts +147 -0
- package/src/self-implement/orchestrator.ts +137 -16
- package/src/self-implement/pod-inplace-worktree.ts +82 -0
- package/src/self-implement/pod-warm-pool-profile.ts +2 -2
- package/src/self-implement/premise-review.ts +7 -5
- package/src/self-implement/run-ledger.ts +304 -8
- package/src/self-implement/run-stop.ts +12 -0
- package/src/self-implement/seams.ts +39 -13
- package/src/self-implement/self-implement-cli.ts +30 -4
- package/src/session/channel-ask-op-envelope.ts +36 -0
- package/src/session/channel-op-reply-route.ts +200 -0
- package/src/session/chat.ts +92 -15
- package/src/session/index.ts +2 -0
- package/src/session-runtime/index.ts +9 -22
- package/src/session-runtime/provider-circuit.ts +140 -0
- package/src/shell-runner/file-engine.ts +1 -0
- package/src/shell-runner/types.ts +4 -0
- package/src/sidetab-core/model.ts +176 -0
- package/src/skills/runner.ts +7 -3
- package/src/skills/tools/dev-harness.ts +2 -2
- package/src/skills/tools/schedule-wakeup.ts +24 -7
- package/src/skills/tools/shell.ts +51 -5
- package/src/status/bar.ts +3 -3
- package/src/steward/directive-audit.ts +354 -0
- package/src/storage/file-lock.ts +17 -4
- package/src/surface/child-process.ts +31 -0
- package/src/surface/tui-stderr-owner.ts +48 -0
- package/src/task-agent/adopt-pr.ts +63 -2
- package/src/task-agent/cover.ts +30 -12
- package/src/task-agent/evidence-command-normalize.ts +42 -0
- package/src/task-agent/export-redactions-provision.ts +43 -0
- package/src/task-agent/judge.ts +56 -0
- package/src/task-agent/parent-host.ts +59 -12
- package/src/task-agent/postland-card.ts +35 -2
- package/src/task-agent/rejudge-on-head.ts +46 -2
- package/src/task-agent/repair-cycle.ts +68 -9
- package/src/task-agent/repair-worker.ts +37 -1
- package/src/task-agent/task-hand.ts +226 -33
- package/src/task-agent/tier-split.ts +142 -24
- package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
- package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +57 -5
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
- package/src/task-orchestrator/surfaces/pod-pool.ts +27 -4
- package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +310 -79
- package/src/task-orchestrator/surfaces/self-implement.ts +33 -2
- package/src/terminal/session-registry.ts +1 -0
- package/src/terminal/terminal-modal-router.ts +156 -0
- package/src/tool-hints/gate.ts +6 -4
- package/src/tool-hints/signals.ts +33 -1
- package/src/tool-runtime/skill-exec-runtime.ts +95 -5
- package/src/tui/chat/background-job-status.ts +8 -2
- package/src/tui/entry.ts +483 -32
- package/src/tui/inline-choice.ts +188 -0
- package/src/tui/sidetab/attach.ts +304 -0
- package/src/tui/sidetab/list.ts +2 -0
- package/src/tui/sidetab/nl-tool.ts +136 -0
- package/src/tui/slash/resume-command.ts +23 -0
- package/src/tui/slash/resume.ts +3 -23
- package/src/tui/slash/term-next.ts +2 -1
- package/src/tui/slash/term.ts +12 -1
- package/src/tui-client/dashboard-session.ts +7 -1
- package/src/tui-client/local-chat-turn.ts +29 -8
- package/src/user-config.ts +42 -3
- package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
- package/src/ux-sim/fake-land-queue.ts +88 -0
- package/src/ux-sim/fake-llm.ts +11 -5
- package/src/ux-sim/gate-shard-host-reroute.ts +82 -0
- package/src/ux-sim/goal-interim-trace.ts +24 -0
- package/src/ux-sim/next-tui-seat-scenarios.ts +61 -14
- package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/recipes/explainer.ts +54 -2
- package/src/web-search/grok.ts +32 -6
- package/src/web-search/index.ts +8 -7
- package/src/workflow-runtime/node-catalog.ts +53 -4
- package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1224.2ceca6c180d5130b.js +0 -62
- package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +0 -32
- package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2479-fe7e188bd9402d14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +0 -148
- package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +0 -27
- package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3199.6a1a9b0e6cd01dc6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4036.d54e55e1ebf5acdc.js +0 -90
- package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +0 -226
- package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +0 -287
- package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +0 -24
- package/apps/pwa/out/_next/static/chunks/4937-28d437999b77c9dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +0 -104
- package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +0 -1
- package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5952.294fc574a8625184.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +0 -74
- package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +0 -149
- package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +0 -41
- package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +0 -1
- package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/757-4fbaf50942b8c424.js +0 -1
- package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7c5ed21f-f286708e57cf88f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +0 -8
- package/apps/pwa/out/_next/static/chunks/8080-40d781e7704d3671.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +0 -77
- package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +0 -1
- package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +0 -286
- package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +0 -79
- package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +0 -1
- package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +0 -94
- package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +0 -1
- package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +0 -64
- package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-5c112c6d7c33656e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-88a1edbff62eaf1d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-b9af2ac1c4737ce8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-fb9e639c107f5f72.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +0 -1
- package/scripts/migrate-monad-to-elanous.ts +0 -195
- package/scripts/rebrand-elanous.ts +0 -242
- /package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → HjeK7zONHfR7op1hKXp4k}/_ssgManifest.js +0 -0
package/src/dashboard/index.ts
CHANGED
|
@@ -7,7 +7,8 @@ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
|
7
7
|
import { join } from 'path';
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
9
|
import { createRunningBuildStatus } from './running-build-status.js';
|
|
10
|
-
import { reportTuiTurn } from '../pty-shell/tui-run-state.js';
|
|
10
|
+
import { reportTuiAbortRequested, reportTuiProgress, reportTuiTurn } from '../pty-shell/tui-run-state.js';
|
|
11
|
+
import { installTuiStderrOwner } from '../surface/tui-stderr-owner.js';
|
|
11
12
|
import { logTurnThrew, runTurnTeardownStep } from './turn-busy-teardown.js';
|
|
12
13
|
import { createStaleInstallCheck, formatStaleInstallNotice, readCurrentInstalledCommit, readDashboardBootCommit, STALE_INSTALL_CHECK_INTERVAL_MS, versionedDashboardInstallDir } from './stale-install-check.js';
|
|
13
14
|
import { spawn, spawnSync } from 'node:child_process';
|
|
@@ -188,6 +189,7 @@ import {
|
|
|
188
189
|
formatResponse,
|
|
189
190
|
onEscAbort,
|
|
190
191
|
attachStreamingKeys,
|
|
192
|
+
SLASH_COMMANDS,
|
|
191
193
|
type InputResult,
|
|
192
194
|
type TextInputExternalSubmitRequest,
|
|
193
195
|
} from '../chat/index.js';
|
|
@@ -397,6 +399,7 @@ import { resolveDashboardChatMainSubmitIntent } from './input/chat-main-submit-r
|
|
|
397
399
|
import { maybeEmitDashboardSubmitQuickPass } from './input/chat-main-submit-control.js';
|
|
398
400
|
import { attachDashboardQuickPassConsumers } from './input/control-signal-consumers.js';
|
|
399
401
|
import { resolveDashboardChatMainSlashCommand } from './input/chat-main-slash-command.js';
|
|
402
|
+
import { isClassicSigquitChord, registerClassicSigquitHandler } from './classic-sigquit.js';
|
|
400
403
|
import { TuiChatPersonaSelection, tuiChatPersonaMessages } from './slash-runtime/chat-persona.js';
|
|
401
404
|
import { awaitGlobalPersonaLoad } from '../persona/global-registry.js';
|
|
402
405
|
import { createDashboardInlineSetupFlow } from './setup-inline.js';
|
|
@@ -526,6 +529,41 @@ export function observeDashboardDevRequestRoute(
|
|
|
526
529
|
observeDevRequestRouteFailSoft(text, cfg, { surface: 'dashboard' });
|
|
527
530
|
}
|
|
528
531
|
|
|
532
|
+
export async function cancelDelegatedToolOnEscape(deps: {
|
|
533
|
+
abortCtrl: AbortController;
|
|
534
|
+
child: { pid: number; isAlive(): boolean; kill(signal?: NodeJS.Signals): void };
|
|
535
|
+
waitForExit(): Promise<void>;
|
|
536
|
+
pushChatLine(line: string): void;
|
|
537
|
+
}): Promise<boolean> {
|
|
538
|
+
abortTurnOnly(deps.abortCtrl);
|
|
539
|
+
try {
|
|
540
|
+
if (deps.child.isAlive()) deps.child.kill();
|
|
541
|
+
await deps.waitForExit();
|
|
542
|
+
if (deps.child.isAlive()) throw new Error('child still alive after exit acknowledgement');
|
|
543
|
+
debug.log('dashboard.esc-child', 'termination-confirmed', { pid: deps.child.pid });
|
|
544
|
+
deps.pushChatLine(' ⏹ 중단됨');
|
|
545
|
+
return true;
|
|
546
|
+
} catch (error) {
|
|
547
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
548
|
+
debug.log('dashboard.esc-child', 'termination-failed', { pid: deps.child.pid, reason });
|
|
549
|
+
deps.pushChatLine(` ✘ 종료 실패 — ${reason}`);
|
|
550
|
+
return false;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
export function activeEscDelegatedPty(
|
|
555
|
+
toolState: EscAbortToolState,
|
|
556
|
+
ptyIdsByCallId: ReadonlyMap<string, string>,
|
|
557
|
+
getPtyById: (id: string) => { pid: number; isAlive(): boolean; kill(signal?: NodeJS.Signals): void } | undefined,
|
|
558
|
+
): { pid: number; isAlive(): boolean; kill(signal?: NodeJS.Signals): void } | null {
|
|
559
|
+
const active = [...toolState.activeToolNamesByCallId];
|
|
560
|
+
if (active.length !== 1) return null;
|
|
561
|
+
const [callId, name] = active[0]!;
|
|
562
|
+
if (name !== 'PtyShellPoll' && name !== 'PtyShellSnapshot' && name !== 'PtyShellSend') return null;
|
|
563
|
+
const ptyId = ptyIdsByCallId.get(callId);
|
|
564
|
+
return ptyId ? getPtyById(ptyId) ?? null : null;
|
|
565
|
+
}
|
|
566
|
+
|
|
529
567
|
export interface EscAbortToolState {
|
|
530
568
|
activeToolNamesByCallId: Map<string, string>;
|
|
531
569
|
}
|
|
@@ -741,7 +779,7 @@ import { needsOnboarding, resetOnboardingMarker } from '../onboarding.js';
|
|
|
741
779
|
import {
|
|
742
780
|
getUserConfig, reloadUserConfig, saveUserConfig,
|
|
743
781
|
rotateNextProvider, jumpToRotationEntry, rotationEntryLabel, applyRotationEntry,
|
|
744
|
-
resolveAcpHopCapFromConfig,
|
|
782
|
+
resolveAcpHopCapFromConfig, resolveTuiUnattended,
|
|
745
783
|
VOICE_HARDCODED_DEFAULTS,
|
|
746
784
|
} from '../user-config.js';
|
|
747
785
|
import { streamLLM, anyProviderAvailable, getProviderForConfig, nextReasoningLevel, reasoningLevelLabel, effectiveReasoningLevel, modelSupportsReasoning, type LLMMessage, type LLMToolSpec } from '../llm.js';
|
|
@@ -917,6 +955,7 @@ import {
|
|
|
917
955
|
runDashboardScratchExportAction,
|
|
918
956
|
} from './context-menu-action-runtime.js';
|
|
919
957
|
import { createDashboardTerminalPopupRuntime } from './terminal-popup-runtime.js';
|
|
958
|
+
import { createDashboardSidetabRuntime } from './sidetab-runtime.js';
|
|
920
959
|
import { toggleDashboardAssistantRenderState } from './assistant-render-state-runtime.js';
|
|
921
960
|
import { bootDashboardAcpBgSweep } from './acp-bg-sweep-boot.js';
|
|
922
961
|
import { bootDashboardConfigTools } from './config-tools-boot.js';
|
|
@@ -1143,7 +1182,7 @@ import type { PlainTurnSubmit } from '../input/turn-submit.js';
|
|
|
1143
1182
|
import { findBlock, logPaneContentHeight, maxLogPaneScroll, visibleSearchRowOffset } from '../panes/log-pane.js';
|
|
1144
1183
|
import { createQuitConfirmationState, gracefulQuit, type QuitConfirmationState } from './graceful-quit.js';
|
|
1145
1184
|
import { consumeTurnEndInterrupted, handoffTurnTypeaheadAtTurnEnd, releaseTurnTypeaheadPending, runTurnTypeaheadPushNow, steerLastTurnTypeaheadSubmission } from './input/turn-steer-bridge.js';
|
|
1146
|
-
import { abortTurnOnly } from '../turn-abort-scope.js';
|
|
1185
|
+
import { abortAndKillChildren, abortTurnOnly } from '../turn-abort-scope.js';
|
|
1147
1186
|
import { consumeInternalTurnYield, createInternalTurnGate, formatInternalTurnBanner, resolveInternalTurnSubmitIntent, type InternalTurnRequest } from './input/internal-turn.js';
|
|
1148
1187
|
import { createClassicInterimFold } from './input/goal-interim.js';
|
|
1149
1188
|
import { createSeatAutowake } from './input/seat-autowake.js';
|
|
@@ -1293,6 +1332,7 @@ export function subscribeDashboardAgentResults(
|
|
|
1293
1332
|
}
|
|
1294
1333
|
}
|
|
1295
1334
|
});
|
|
1335
|
+
queue.replayPendingWakes(listener);
|
|
1296
1336
|
return () => { offWake(); offDrain(); };
|
|
1297
1337
|
}
|
|
1298
1338
|
|
|
@@ -1451,6 +1491,9 @@ import {
|
|
|
1451
1491
|
} from './input/space-longpress-detector.js';
|
|
1452
1492
|
import { isAllowlistedDictationSurface } from './input/dictation-surface-allowlist.js';
|
|
1453
1493
|
import { createDashboardExternalInputHost, stopTurnViaEscGate, updateDashboardExternalInputQueueNotice } from './input/external-input-host.js';
|
|
1494
|
+
import { registerTuiForceStopHandler } from '../capture/tui-self-report.js';
|
|
1495
|
+
import { createInlineAskUserQuestionResolver, resolveUnattendedInlineChoiceTimeoutMs, UNATTENDED_INLINE_CHOICE_TIMEOUT_MS } from '../ask-user-question/index.js';
|
|
1496
|
+
import { createInlineChoiceTurnEndCleanup, InlineChoiceBroker } from '../tui/inline-choice.js';
|
|
1454
1497
|
import { registerExternalInputHost } from '../input/external-input-queue.js';
|
|
1455
1498
|
// H3 #6 follow-up #3 — background sessions render as a distinct sidebar
|
|
1456
1499
|
// kind with live state badge + tap-to-Join. Dashboard pulls BG records
|
|
@@ -2043,9 +2086,18 @@ export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<Da
|
|
|
2043
2086
|
let disposeDashboardEventLoopMonitor = (): void => {};
|
|
2044
2087
|
// TUI-AGENT-IDLE-WAKE — 이 대시보드 «자기» 완료 알림 구독만 푼다(배선 지점에서 채운다).
|
|
2045
2088
|
let disposeDashboardAgentWake = (): void => {};
|
|
2089
|
+
let disposeClassicSigquit = (): void => {};
|
|
2090
|
+
let closeClassicSidetabRuntime = (): void => {};
|
|
2091
|
+
let restoreTuiStderrOwner = (): void => {};
|
|
2046
2092
|
const closeDashboardTui = (): void => {
|
|
2047
2093
|
disposeDashboardEventLoopMonitor();
|
|
2048
2094
|
try { disposeDashboardAgentWake(); } catch { /* never block exit */ }
|
|
2095
|
+
disposeClassicSigquit();
|
|
2096
|
+
disposeClassicSigquit = (): void => {};
|
|
2097
|
+
try { closeClassicSidetabRuntime(); } catch { /* never block exit */ }
|
|
2098
|
+
closeClassicSidetabRuntime = (): void => {};
|
|
2099
|
+
try { restoreTuiStderrOwner(); } catch { /* never block screen cleanup */ }
|
|
2100
|
+
restoreTuiStderrOwner = (): void => {};
|
|
2049
2101
|
closeTui();
|
|
2050
2102
|
};
|
|
2051
2103
|
const exitDashboardTui = (): void => {
|
|
@@ -2582,6 +2634,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
2582
2634
|
}
|
|
2583
2635
|
chatScrollOffset = -1;
|
|
2584
2636
|
};
|
|
2637
|
+
const inlineChoiceBroker = new InlineChoiceBroker({
|
|
2638
|
+
appendLines: (lines) => {
|
|
2639
|
+
for (const line of lines) pushChatLine(C.info(line));
|
|
2640
|
+
draw();
|
|
2641
|
+
},
|
|
2642
|
+
});
|
|
2643
|
+
const resolveInlineAskUserQuestion = createInlineAskUserQuestionResolver(inlineChoiceBroker, {
|
|
2644
|
+
timeoutMs: () => resolveUnattendedInlineChoiceTimeoutMs(getUserConfig()),
|
|
2645
|
+
});
|
|
2585
2646
|
const liveTypeaheadEchoes: { at: number; lines: string[] }[] = [];
|
|
2586
2647
|
const restoreLiveTypeaheadEchoes = (): void => {
|
|
2587
2648
|
let after = 0;
|
|
@@ -3076,6 +3137,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3076
3137
|
let attachedSessionId: string | null = null;
|
|
3077
3138
|
const chatPersonaSelection = new TuiChatPersonaSelection();
|
|
3078
3139
|
let chatPersonaConversationId = crypto.randomUUID();
|
|
3140
|
+
const slashUsageRunId = crypto.randomUUID();
|
|
3079
3141
|
const currentChatPersonaSessionId = () => attachedSessionId ?? chatPersonaConversationId;
|
|
3080
3142
|
let attachedChatId: number | null = null;
|
|
3081
3143
|
const forkableSessionHistory = (source: ChatMessage[] = chat.history): ForkableSessionTurn[] =>
|
|
@@ -5078,8 +5140,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
5078
5140
|
};
|
|
5079
5141
|
|
|
5080
5142
|
// P5 — register the mode-enter actions + default chord bindings so
|
|
5081
|
-
// `Ctrl+
|
|
5082
|
-
// control, `Ctrl+
|
|
5143
|
+
// `Ctrl+X s` from input focus enters sync, `Ctrl+X c` enters
|
|
5144
|
+
// control, `Ctrl+X g` returns to general. The `allowOverwrite`
|
|
5083
5145
|
// flag is critical because this closure may re-run on hot-reload
|
|
5084
5146
|
// scenarios (tests, plugin reinit) — the registry should be idempotent.
|
|
5085
5147
|
// A2 — forward-declared toast hook. mouseWiring is initialized
|
|
@@ -5100,7 +5162,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
5100
5162
|
handler: () => {
|
|
5101
5163
|
enterSessionControlMode(chatModeState);
|
|
5102
5164
|
void inputCoreSetMode(resolveSessionInputModeFromChatMode({ chatModeState }));
|
|
5103
|
-
chatLines.push(C.error('-- CONTROL MODE —') + C.text(' (via ^
|
|
5165
|
+
chatLines.push(C.error('-- CONTROL MODE —') + C.text(' (via ^X c chord)'));
|
|
5104
5166
|
chatScrollOffset = -1;
|
|
5105
5167
|
draw();
|
|
5106
5168
|
pushModeToast('→ control mode', 'success');
|
|
@@ -5138,6 +5200,17 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
5138
5200
|
};
|
|
5139
5201
|
registerLogFoldInputBinding(toggleAllLogFolds);
|
|
5140
5202
|
|
|
5203
|
+
const showClassicSigquitGuidance = (): void => {
|
|
5204
|
+
debug.log('dashboard.signal', 'sigquit-guidance', { surface: 'classic', source: 'ctrl-backslash' });
|
|
5205
|
+
chatLines.push(C.warning(' classic 사이드탭: /side · /side new · /side attach <번호>'));
|
|
5206
|
+
chatScrollOffset = -1;
|
|
5207
|
+
draw({ force: true });
|
|
5208
|
+
};
|
|
5209
|
+
|
|
5210
|
+
restoreTuiStderrOwner = installTuiStderrOwner((line) => {
|
|
5211
|
+
chatLines.push(C.warning(`[stderr] ${line}`));
|
|
5212
|
+
draw({ force: true });
|
|
5213
|
+
});
|
|
5141
5214
|
initTui(true);
|
|
5142
5215
|
|
|
5143
5216
|
// ── Working-dir browser glyphs (shared between the list widget and
|
|
@@ -6748,6 +6821,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6748
6821
|
* this function is invoked.
|
|
6749
6822
|
*/
|
|
6750
6823
|
const escAbortToolState = createEscAbortToolState();
|
|
6824
|
+
let escDelegatedTermination: Promise<boolean> | null = null;
|
|
6825
|
+
let delegatedTerminationPending = false;
|
|
6826
|
+
let delegatedTerminationFailed = false;
|
|
6827
|
+
const escDelegatedPtyIdsByCallId = new Map<string, string>();
|
|
6828
|
+
const escDelegatedShellResultsByCallId = new Map<string, Promise<unknown>>();
|
|
6751
6829
|
const escHarnessSpacesByCallId = new Map<string, string>();
|
|
6752
6830
|
setSelfImplementSoftStopSpaceObserver((callId, spaceId) => {
|
|
6753
6831
|
const toolName = escAbortToolState.activeToolNamesByCallId.get(callId);
|
|
@@ -6768,6 +6846,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6768
6846
|
// the stream — the running count is visible in the HUD (T3-B1)
|
|
6769
6847
|
// so the user can make an informed call.
|
|
6770
6848
|
let abortGateModalId: string | null = null;
|
|
6849
|
+
const getDelegatedPty = () => activeEscDelegatedPty(escAbortToolState, escDelegatedPtyIdsByCallId, getPty);
|
|
6850
|
+
const getDelegatedShell = () => {
|
|
6851
|
+
const active = [...escAbortToolState.activeToolNamesByCallId];
|
|
6852
|
+
if (active.length !== 1 || (active[0]![1] !== 'Bash' && active[0]![1] !== 'RunShell')) return null;
|
|
6853
|
+
return escDelegatedShellResultsByCallId.get(active[0]![0]) ?? null;
|
|
6854
|
+
};
|
|
6771
6855
|
const showHarnessEscHint = createHarnessEscHint((line) => pushChatLine(line));
|
|
6772
6856
|
const activeHarnessSpace = (): string | null => activeEscHarnessSpace(escAbortToolState, escHarnessSpacesByCallId);
|
|
6773
6857
|
// ⭐ TUI-ESC-EXIT — `createEscAbortPendingGate` is the production
|
|
@@ -6779,7 +6863,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6779
6863
|
runSoftStop: runEscAbortPendingSoftStop,
|
|
6780
6864
|
formatWaitingTargets: formatEscAbortWaitingTargets,
|
|
6781
6865
|
getActiveHarnessSpace: activeHarnessSpace,
|
|
6782
|
-
pushChatLine: (line) => pushChatLine(line),
|
|
6866
|
+
pushChatLine: (line) => { if (!getDelegatedPty() && !getDelegatedShell() && !delegatedTerminationPending && !delegatedTerminationFailed) pushChatLine(line); },
|
|
6783
6867
|
showHarnessEscHint,
|
|
6784
6868
|
afterAbortEvent: () => { chatScrollOffset = -1; },
|
|
6785
6869
|
});
|
|
@@ -6796,11 +6880,77 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6796
6880
|
requestRedraw: () => draw(),
|
|
6797
6881
|
getTheme: () => currentThemeTokens(),
|
|
6798
6882
|
getWaitingTargetNames: () => getEscAbortWaitingToolNames(escAbortToolState),
|
|
6799
|
-
shouldAbortImmediately: () => activeHarnessSpace() !== null,
|
|
6883
|
+
shouldAbortImmediately: () => activeHarnessSpace() !== null || getDelegatedPty() !== null || getDelegatedShell() !== null,
|
|
6884
|
+
forceStopWithoutModal: () => resolveTuiUnattended(getUserConfig()),
|
|
6885
|
+
confirmStopInline: async () => {
|
|
6886
|
+
const result = await inlineChoiceBroker.ask({
|
|
6887
|
+
id: `stop-turn:${Date.now().toString(36)}`,
|
|
6888
|
+
question: '도는 작업과 하위 에이전트를 함께 중단할까요?',
|
|
6889
|
+
options: [
|
|
6890
|
+
{ value: 'stop', label: '중단', description: '현재 턴과 자식 작업을 종료합니다.' },
|
|
6891
|
+
{ value: 'continue', label: '계속', description: '현재 작업을 계속 실행합니다.' },
|
|
6892
|
+
],
|
|
6893
|
+
includeOther: false,
|
|
6894
|
+
timeoutMs: UNATTENDED_INLINE_CHOICE_TIMEOUT_MS,
|
|
6895
|
+
});
|
|
6896
|
+
return !('cancelled' in result) && result.selected[0] === 'stop';
|
|
6897
|
+
},
|
|
6800
6898
|
// ⭐ TUI-ESC-EXIT — `runEscAbortPendingSoftStop` is the production
|
|
6801
6899
|
// soft-stop callback seam; the incident test in
|
|
6802
6900
|
// test/esc-harness-stop.test.ts exercises this same function.
|
|
6803
|
-
onAbortPending:
|
|
6901
|
+
onAbortPending: (event) => {
|
|
6902
|
+
const child = getDelegatedPty();
|
|
6903
|
+
const shell = getDelegatedShell();
|
|
6904
|
+
if (!child && !shell) { escAbortPendingGate.onAbortPending(event); return; }
|
|
6905
|
+
if (shell && !child) {
|
|
6906
|
+
delegatedTerminationPending = true;
|
|
6907
|
+
pushChatLine(' ⏳ 중단 요청됨 — 위임 자식 종료를 확인하는 중입니다.');
|
|
6908
|
+
escDelegatedTermination = (async () => {
|
|
6909
|
+
abortTurnOnly(abortCtrl);
|
|
6910
|
+
try {
|
|
6911
|
+
const result = await Promise.race([shell, Bun.sleep(4_000).then(() => { throw new Error('shell child termination timeout'); })]);
|
|
6912
|
+
const status = result as { aborted?: boolean; outcome?: string; output?: string } | null;
|
|
6913
|
+
if (!status?.aborted && status?.outcome !== 'aborted'
|
|
6914
|
+
&& !status?.output?.includes('[aborted]')) throw new Error('shell child exit not confirmed as aborted');
|
|
6915
|
+
debug.log('dashboard.esc-child', 'termination-confirmed', { tool: event.targets });
|
|
6916
|
+
const pendingIndex = chatLines.lastIndexOf(' ⏳ 중단 요청됨 — 위임 자식 종료를 확인하는 중입니다.');
|
|
6917
|
+
if (pendingIndex >= 0) chatLines.splice(pendingIndex, 1);
|
|
6918
|
+
pushChatLine(' ⏹ 중단됨');
|
|
6919
|
+
draw();
|
|
6920
|
+
return true;
|
|
6921
|
+
} catch (error) {
|
|
6922
|
+
delegatedTerminationFailed = true;
|
|
6923
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
6924
|
+
debug.log('dashboard.esc-child', 'termination-failed', { tool: event.targets, reason });
|
|
6925
|
+
const pendingIndex = chatLines.lastIndexOf(' ⏳ 중단 요청됨 — 위임 자식 종료를 확인하는 중입니다.');
|
|
6926
|
+
if (pendingIndex >= 0) chatLines.splice(pendingIndex, 1);
|
|
6927
|
+
pushChatLine(` ✘ 종료 실패 — ${reason}`);
|
|
6928
|
+
draw();
|
|
6929
|
+
return false;
|
|
6930
|
+
}
|
|
6931
|
+
})().finally(() => { delegatedTerminationPending = false; });
|
|
6932
|
+
return;
|
|
6933
|
+
}
|
|
6934
|
+
if (!child) return;
|
|
6935
|
+
delegatedTerminationPending = true;
|
|
6936
|
+
pushChatLine(' ⏳ 중단 요청됨 — 위임 자식 종료를 확인하는 중입니다.');
|
|
6937
|
+
escDelegatedTermination = cancelDelegatedToolOnEscape({
|
|
6938
|
+
abortCtrl,
|
|
6939
|
+
child,
|
|
6940
|
+
waitForExit: async () => {
|
|
6941
|
+
const deadline = Date.now() + 3_000;
|
|
6942
|
+
while (child.isAlive() && Date.now() < deadline) await Bun.sleep(50);
|
|
6943
|
+
if (child.isAlive()) throw new Error('PTY child termination timeout');
|
|
6944
|
+
},
|
|
6945
|
+
pushChatLine: (line) => {
|
|
6946
|
+
delegatedTerminationFailed = line.includes('종료 실패');
|
|
6947
|
+
const pendingIndex = chatLines.lastIndexOf(' ⏳ 중단 요청됨 — 위임 자식 종료를 확인하는 중입니다.');
|
|
6948
|
+
if (pendingIndex >= 0) chatLines.splice(pendingIndex, 1);
|
|
6949
|
+
pushChatLine(line);
|
|
6950
|
+
draw();
|
|
6951
|
+
},
|
|
6952
|
+
}).finally(() => { delegatedTerminationPending = false; });
|
|
6953
|
+
},
|
|
6804
6954
|
onAbortRepeat: escAbortPendingGate.onAbortRepeat,
|
|
6805
6955
|
// ⭐⭐⭐ 턴을 멈추기 «전»에 살아남을 자식을 백그라운드 라우팅으로 넘긴다(`R4a` · 2026-08-19).
|
|
6806
6956
|
// ⛔ 없으면 `R1` 이후 자식이 «고아»가 된다 — 살아 있는데 완료를 실어 나를 채널이 없다
|
|
@@ -6818,6 +6968,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6818
6968
|
} catch { /* 관측·핸드오프가 중단을 막지 않는다 */ }
|
|
6819
6969
|
},
|
|
6820
6970
|
});
|
|
6971
|
+
const unregisterTuiForceStop = registerTuiForceStopHandler(() => {
|
|
6972
|
+
if (abortCtrl.signal.aborted) return false;
|
|
6973
|
+
debug.log('pty.stop-turn', 'force-requested', { targets: getEscAbortWaitingToolNames(escAbortToolState) });
|
|
6974
|
+
abortAndKillChildren(abortCtrl);
|
|
6975
|
+
pushChatLine(' ⏹ 강제 중단을 요청했습니다. 현재 턴과 자식 작업이 정리되면 유휴 상태로 돌아갑니다.');
|
|
6976
|
+
draw();
|
|
6977
|
+
return true;
|
|
6978
|
+
});
|
|
6979
|
+
const cancelInlineChoiceAtTurnEnd = createInlineChoiceTurnEndCleanup(inlineChoiceBroker);
|
|
6821
6980
|
|
|
6822
6981
|
// Scroll the log pane by ±N rows from whatever the current tail-
|
|
6823
6982
|
// relative offset resolves to. Shared by keyboard and mouse-wheel
|
|
@@ -7337,15 +7496,21 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7337
7496
|
streamingInFlight = true;
|
|
7338
7497
|
noteClipboardBusyChange();
|
|
7339
7498
|
reportTuiTurn('busy');
|
|
7340
|
-
const externalStop = (): void => {
|
|
7499
|
+
const externalStop = (): void => {
|
|
7500
|
+
// Esc 게이트가 턴 중단을 청하는 순간 — busy 가 이 뒤로 지속되면 abort-ignored 판정 재료가 된다.
|
|
7501
|
+
reportTuiAbortRequested();
|
|
7502
|
+
stopTurnViaEscGate(escGate);
|
|
7503
|
+
};
|
|
7341
7504
|
currentTurnExternalStop = externalStop;
|
|
7342
7505
|
return () => {
|
|
7343
7506
|
if (currentTurnExternalStop === externalStop) currentTurnExternalStop = null;
|
|
7344
7507
|
// 단계마다 격리 — 앞 단계가 던져도 settle·idle 전이에 닿는다(키 층 유휴 ∧ 턴 층 busy 이원 판정 #55 차단).
|
|
7345
7508
|
runTurnTeardownStep('stream-keys-detach', cleanup);
|
|
7509
|
+
runTurnTeardownStep('inline-choice-cancel', cancelInlineChoiceAtTurnEnd);
|
|
7510
|
+
runTurnTeardownStep('tui-force-stop-detach', unregisterTuiForceStop);
|
|
7346
7511
|
runTurnTeardownStep('esc-gate-dispose', () => { escGate.dispose(); });
|
|
7347
7512
|
try {
|
|
7348
|
-
if (!escAbortPendingGate.getStoppedHarnessSpace()) settleEscAbortPendingLines(chatLines, chatLinesStartIndex);
|
|
7513
|
+
if (!escAbortPendingGate.getStoppedHarnessSpace() && !delegatedTerminationPending && !delegatedTerminationFailed) settleEscAbortPendingLines(chatLines, chatLinesStartIndex);
|
|
7349
7514
|
} catch (err) {
|
|
7350
7515
|
const message = err instanceof Error ? err.message : String(err);
|
|
7351
7516
|
const stackHead = err instanceof Error ? err.stack?.split('\n')[1]?.trim() : undefined;
|
|
@@ -7481,7 +7646,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7481
7646
|
// Scratch visibility (Phase S5). When closed, the workingDir
|
|
7482
7647
|
// layouts drop the scratch cell so the remaining panes expand
|
|
7483
7648
|
// to fill the reclaimed columns — useful on narrow terminals.
|
|
7484
|
-
// Reopen via the ^
|
|
7649
|
+
// Reopen via the ^X ^S chord.
|
|
7485
7650
|
let scratchClosed = false;
|
|
7486
7651
|
const dashboardViewRegistryOptions = () => ({
|
|
7487
7652
|
extraPanes: pluginHost.activeDashboardPanes().map(p => p.paneId),
|
|
@@ -7676,10 +7841,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7676
7841
|
);
|
|
7677
7842
|
};
|
|
7678
7843
|
|
|
7679
|
-
// Prefix chord (Phase O6).
|
|
7680
|
-
//
|
|
7681
|
-
//
|
|
7682
|
-
// `[^B]` while armed so the user knows the terminal is waiting.
|
|
7844
|
+
// Prefix chord (Phase O6). Ctrl+X arms the chord; the next key
|
|
7845
|
+
// within the timeout window triggers a bound action. HUD segment
|
|
7846
|
+
// `chord` shows `[^X]` while armed.
|
|
7683
7847
|
const chord: ChordState = createChord();
|
|
7684
7848
|
const disarmChordHud = (): void => {
|
|
7685
7849
|
disarmChord(chord);
|
|
@@ -7752,7 +7916,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7752
7916
|
let previewTerminalDims: { cols: number; rows: number } | null = null;
|
|
7753
7917
|
// Phase T7 — when true, the preview widget swells to the full
|
|
7754
7918
|
// top-row width, hiding browser / scratch / obsidian / skill
|
|
7755
|
-
// siblings. Toggled by `^
|
|
7919
|
+
// siblings. Toggled by `^X e` / `^X ㄷ` (pane chord) and by `e`
|
|
7756
7920
|
// on the focused preview pane (muscle memory). Auto-clears when
|
|
7757
7921
|
// the terminal session exits.
|
|
7758
7922
|
let terminalExpanded = false;
|
|
@@ -7909,7 +8073,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7909
8073
|
};
|
|
7910
8074
|
|
|
7911
8075
|
/** Shared helper for both the pane-level `t` key AND the global
|
|
7912
|
-
* `Ctrl+
|
|
8076
|
+
* `Ctrl+X t` chord. Idempotent — calling while a session is
|
|
7913
8077
|
* already alive just re-focuses the preview pane. Handles:
|
|
7914
8078
|
* - view 4 (chat-only) → bounce to view 1 so wd-preview is visible
|
|
7915
8079
|
* - wiring onUpdate / onExit callbacks with cleanup
|
|
@@ -8672,7 +8836,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
8672
8836
|
widgetHost.register(planBoardWidget, 'builtin', 'src/widgets/plan-board.ts');
|
|
8673
8837
|
}
|
|
8674
8838
|
// NT4 — notification bell modal widget. Registered + spawned here
|
|
8675
|
-
// so Ctrl+
|
|
8839
|
+
// so Ctrl+X b (NT5) can toggle without spawn latency. The bellOpen
|
|
8676
8840
|
// flag + helpers live further down (after notificationStore is
|
|
8677
8841
|
// created) because refreshBellInto reads from the store.
|
|
8678
8842
|
widgetHost.register(bellModalWidget, 'builtin', 'src/notification-bell-modal.ts');
|
|
@@ -12492,8 +12656,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
12492
12656
|
}
|
|
12493
12657
|
|
|
12494
12658
|
/** N2 — open the shell-runner rollup popup centered on the viewport.
|
|
12495
|
-
*
|
|
12496
|
-
*
|
|
12659
|
+
* Entry point for `/shell rollup` so keyboard users can access the
|
|
12660
|
+
* same UI mouse users get by clicking
|
|
12497
12661
|
* the 🐚 status-bar pill. Anchored-to-pill placement stays in
|
|
12498
12662
|
* dashboard-mouse-wiring; this path is explicitly center-placed so
|
|
12499
12663
|
* it works with status row unknown. */
|
|
@@ -12735,6 +12899,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
12735
12899
|
const disposeExternalInputHost = registerExternalInputHost(createDashboardExternalInputHost({
|
|
12736
12900
|
isTurnActive: () => streamingInFlight,
|
|
12737
12901
|
getTurnStop: () => currentTurnExternalStop,
|
|
12902
|
+
handleInlineChoice: (text) => inlineChoiceBroker.handleInput(text),
|
|
12738
12903
|
promptCtl,
|
|
12739
12904
|
pushNotice: (line) => { chatLines.push(C.muted(` ${line}`)); chatScrollOffset = -1; draw(); },
|
|
12740
12905
|
setQueueNotice: setExternalInputQueueNotice,
|
|
@@ -13470,8 +13635,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13470
13635
|
try {
|
|
13471
13636
|
if (req.kind === 'shell') {
|
|
13472
13637
|
const shellSeat = resolveTuiShellSeat(req.cwd, process.env.COORD_ID);
|
|
13638
|
+
const terminalSessionId = crypto.randomUUID();
|
|
13473
13639
|
session = sessionRegistry.spawn(
|
|
13474
13640
|
{
|
|
13641
|
+
id: terminalSessionId,
|
|
13475
13642
|
title: 'terminal',
|
|
13476
13643
|
cwd: req.cwd,
|
|
13477
13644
|
command: req.command,
|
|
@@ -13481,7 +13648,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13481
13648
|
registryKind: 'shell',
|
|
13482
13649
|
registryNickname: `tui-shell:${req.cwd}`,
|
|
13483
13650
|
registryOrigin: { originRoot: 'elanous-internal', controller: 'tui-shell' },
|
|
13484
|
-
registryPurpose: `tui-shell:${shellSeat}`,
|
|
13651
|
+
registryPurpose: `tui-shell:${shellSeat}:session:${currentChatPersonaSessionId()}:terminal:${terminalSessionId}`,
|
|
13485
13652
|
registrySeat: shellSeat,
|
|
13486
13653
|
onExit: handleExit,
|
|
13487
13654
|
onTitleAction: handleTitleAction,
|
|
@@ -13577,6 +13744,87 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13577
13744
|
const spawnGlobalTerminalModal = (command?: string): void => {
|
|
13578
13745
|
openInteractiveTerminalPopup({ kind: 'shell', cwd: workingDir.cwd, command });
|
|
13579
13746
|
};
|
|
13747
|
+
const classicSidetabRuntime = createDashboardSidetabRuntime({
|
|
13748
|
+
currentSessionId: () => currentChatPersonaSessionId(),
|
|
13749
|
+
termSize,
|
|
13750
|
+
pushModal: (surface) => {
|
|
13751
|
+
attachSurfaceToWorkspace(surface, currentWorkspaceOwnerId());
|
|
13752
|
+
const handle = display.pushModal(surface);
|
|
13753
|
+
draw();
|
|
13754
|
+
return { dispose: () => { handle.dispose(); draw(); } };
|
|
13755
|
+
},
|
|
13756
|
+
attach: (row) => {
|
|
13757
|
+
if (row.sessionId && sessionRegistry.get(row.sessionId)) {
|
|
13758
|
+
const { cols, rows } = termSize();
|
|
13759
|
+
const attached = sessionRegistry.attach(row.sessionId, { termCols: cols, termRows: rows });
|
|
13760
|
+
if (attached?.modal) {
|
|
13761
|
+
terminalModalRouter.set(attached.modal, {
|
|
13762
|
+
onClose: () => { sessionRegistry.detach(attached.id); draw(); },
|
|
13763
|
+
});
|
|
13764
|
+
draw();
|
|
13765
|
+
}
|
|
13766
|
+
return;
|
|
13767
|
+
}
|
|
13768
|
+
if (!row.ptyId) return;
|
|
13769
|
+
void requestRemotePtyControl(row.ptyId, 'snapshot', { ansi: false }, { timeoutMs: 450 })
|
|
13770
|
+
.then((result) => {
|
|
13771
|
+
if (result.status === 'success' && result.screen?.trim()) {
|
|
13772
|
+
chatLines.push(C.muted(` ${row.label} · 읽기 전용 snapshot (입력은 전달되지 않습니다)`));
|
|
13773
|
+
chatLines.push(...stripAnsi(result.screen).split('\n'));
|
|
13774
|
+
} else chatLines.push(C.warning(` PTY 화면 읽기 실패 · ${result.status}`));
|
|
13775
|
+
chatScrollOffset = -1;
|
|
13776
|
+
draw();
|
|
13777
|
+
})
|
|
13778
|
+
.catch((error) => {
|
|
13779
|
+
chatLines.push(C.warning(` PTY 화면 읽기 오류 · ${error instanceof Error ? error.message : String(error)}`));
|
|
13780
|
+
chatScrollOffset = -1;
|
|
13781
|
+
draw();
|
|
13782
|
+
});
|
|
13783
|
+
},
|
|
13784
|
+
spawnShell: () => { spawnGlobalTerminalModal(); },
|
|
13785
|
+
detach: (row) => {
|
|
13786
|
+
if (row?.currentProcess) {
|
|
13787
|
+
chatLines.push(C.muted(' 현재 classic TUI는 분리할 수 없습니다'));
|
|
13788
|
+
} else {
|
|
13789
|
+
const id = row?.sessionId ?? terminalModalRouter.current()?.id ?? sessionRegistry.foreground()?.id;
|
|
13790
|
+
if (!id) chatLines.push(C.muted(' 분리할 셸 세션이 없습니다'));
|
|
13791
|
+
else if (terminalModalRouter.current()?.id === id) terminalModalRouter.close();
|
|
13792
|
+
else sessionRegistry.detach(id);
|
|
13793
|
+
}
|
|
13794
|
+
chatScrollOffset = -1;
|
|
13795
|
+
draw();
|
|
13796
|
+
},
|
|
13797
|
+
kill: (row) => {
|
|
13798
|
+
if (row.sessionId && sessionRegistry.get(row.sessionId)) {
|
|
13799
|
+
if (terminalModalRouter.current()?.id === row.sessionId) terminalModalRouter.close();
|
|
13800
|
+
sessionRegistry.kill(row.sessionId);
|
|
13801
|
+
chatLines.push(C.muted(` ${row.label} 종료 요청 완료`));
|
|
13802
|
+
} else if (row.ptyId) {
|
|
13803
|
+
void requestRemotePtyControl(row.ptyId, 'terminate', undefined, { timeoutMs: 1_000 })
|
|
13804
|
+
.then((result) => chatLines.push(result.status === 'success'
|
|
13805
|
+
? C.muted(` ${row.label} 종료 요청 완료`)
|
|
13806
|
+
: C.warning(` PTY 종료 거부 · ${result.status}`)))
|
|
13807
|
+
.catch((error) => chatLines.push(C.warning(` PTY 종료 오류 · ${error instanceof Error ? error.message : String(error)}`)))
|
|
13808
|
+
.finally(() => { chatScrollOffset = -1; draw(); });
|
|
13809
|
+
}
|
|
13810
|
+
chatScrollOffset = -1;
|
|
13811
|
+
draw();
|
|
13812
|
+
},
|
|
13813
|
+
returnToParent: () => {
|
|
13814
|
+
if (terminalModalRouter.current()) terminalModalRouter.close();
|
|
13815
|
+
setWorkingFocus('input', 'classic-sidetab-parent');
|
|
13816
|
+
draw();
|
|
13817
|
+
},
|
|
13818
|
+
status: (message) => {
|
|
13819
|
+
chatLines.push(C.muted(` ${message}`));
|
|
13820
|
+
chatScrollOffset = -1;
|
|
13821
|
+
draw();
|
|
13822
|
+
},
|
|
13823
|
+
});
|
|
13824
|
+
closeClassicSidetabRuntime = () => classicSidetabRuntime.close();
|
|
13825
|
+
disposeClassicSigquit = registerClassicSigquitHandler(() => {
|
|
13826
|
+
classicSidetabRuntime.beginPrefix();
|
|
13827
|
+
});
|
|
13580
13828
|
|
|
13581
13829
|
// E3 (2026-05-17) — copyLastAssistantTurnToClipboard /
|
|
13582
13830
|
// copyLastAssistantCodeToClipboard land into the outer-scoped
|
|
@@ -14938,7 +15186,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
14938
15186
|
chatScrollOffset = -1;
|
|
14939
15187
|
break;
|
|
14940
15188
|
// Phase T: spawn an embedded terminal in this pane. Same
|
|
14941
|
-
// code path as the `Ctrl+
|
|
15189
|
+
// code path as the `Ctrl+X t` pane chord.
|
|
14942
15190
|
case 't': case 'ㅅ':
|
|
14943
15191
|
openPreviewTerminal();
|
|
14944
15192
|
break;
|
|
@@ -14954,7 +15202,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
14954
15202
|
}
|
|
14955
15203
|
|
|
14956
15204
|
// Ctrl+W (no chord armed — chord would have consumed the
|
|
14957
|
-
// key earlier) closes the scratch pane. Reopen via the ^
|
|
15205
|
+
// key earlier) closes the scratch pane. Reopen via the ^X ^S chord.
|
|
14958
15206
|
if (key.ctrl && (key.name === 'w' || key.name === 'ㅈ')) {
|
|
14959
15207
|
scratchClosed = true;
|
|
14960
15208
|
userClosedPanes.add('scratch');
|
|
@@ -15146,20 +15394,21 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15146
15394
|
const contextUserText = ctx?.userText;
|
|
15147
15395
|
const turnRefUserText = acpTurnRef.userText;
|
|
15148
15396
|
const hasParentTurnAbortSignal = acpTurnRef.abortCtrl?.signal !== undefined;
|
|
15397
|
+
const turnSignal = acpTurnRef.abortCtrl?.signal ?? new AbortController().signal;
|
|
15149
15398
|
observeDashboardToolDispatchSignal({
|
|
15150
15399
|
toolName: name,
|
|
15151
15400
|
turnIndex: ctx?.turnIndex ?? null,
|
|
15152
15401
|
signalSource: hasParentTurnAbortSignal ? 'parent-turn' : 'fallback',
|
|
15153
15402
|
hasParentTurnAbortSignal,
|
|
15154
|
-
signalAlreadyAborted:
|
|
15403
|
+
signalAlreadyAborted: turnSignal.aborted,
|
|
15155
15404
|
});
|
|
15156
|
-
const
|
|
15405
|
+
const dispatchPromise = dispatchDashboardSessionRuntimeTool(name, args, {
|
|
15157
15406
|
contextUserText,
|
|
15158
15407
|
turnRefUserText,
|
|
15159
15408
|
muted: C.muted,
|
|
15160
15409
|
pushChatLine,
|
|
15161
15410
|
draw,
|
|
15162
|
-
signal:
|
|
15411
|
+
signal: turnSignal,
|
|
15163
15412
|
toolCallId: ctx?.callId,
|
|
15164
15413
|
// ⛔⭐ 폴백은 `''` 가 아니라 `undefined` 다 — 「안 넘김」과 「말했는데 어휘가 없음」은 «다른 값»이다.
|
|
15165
15414
|
// harnessMentionState(session-runtime 소비처)는 `undefined → 'absent'` · `'' → 'not-matched'` 로
|
|
@@ -15186,7 +15435,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15186
15435
|
runtime.dispatchToolByName(toolName, input, {
|
|
15187
15436
|
surface: 'tui',
|
|
15188
15437
|
toolCallId,
|
|
15189
|
-
signal:
|
|
15438
|
+
signal: hasParentTurnAbortSignal ? turnSignal : undefined,
|
|
15190
15439
|
// ⭐ Agent-family context. Without these two the sub-agent runs
|
|
15191
15440
|
// text-only (see getTools above). `agentDispatchTool` routes the
|
|
15192
15441
|
// child's calls back through THIS dispatcher so the child gets the
|
|
@@ -15205,6 +15454,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15205
15454
|
dispatchPluginTool: (toolName, input) =>
|
|
15206
15455
|
pluginHost.dispatchTool(toolName, input),
|
|
15207
15456
|
});
|
|
15457
|
+
if (ctx?.callId && (name === 'Bash' || name === 'RunShell')) {
|
|
15458
|
+
escDelegatedShellResultsByCallId.set(ctx.callId, dispatchPromise);
|
|
15459
|
+
}
|
|
15460
|
+
const result = await dispatchPromise;
|
|
15208
15461
|
// Mirror the direct-path truncation wrapper at
|
|
15209
15462
|
// dashboard/index.ts L19917-19932 so large tool outputs
|
|
15210
15463
|
// land in the preview store + the LLM sees the short
|
|
@@ -15654,6 +15907,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15654
15907
|
|
|
15655
15908
|
const priorityRoute = await routeDashboardPriorityKey(key, {
|
|
15656
15909
|
inputOwner: chatMainVisibility.inputOwnership?.owner,
|
|
15910
|
+
routeClassicSigquitChord: (routeKey) => {
|
|
15911
|
+
if (classicSidetabRuntime.routeKey(routeKey)) return true;
|
|
15912
|
+
if (!isClassicSigquitChord(routeKey)) return false;
|
|
15913
|
+
showClassicSigquitGuidance();
|
|
15914
|
+
return true;
|
|
15915
|
+
},
|
|
15657
15916
|
routeBellKey: async (routeKey) => {
|
|
15658
15917
|
if (!bellOpen || routeKey.mouse) return false;
|
|
15659
15918
|
const inst = widgetHost.get('wd-notification-bell');
|
|
@@ -15700,6 +15959,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15700
15959
|
draw();
|
|
15701
15960
|
return true;
|
|
15702
15961
|
},
|
|
15962
|
+
routeSidetabKey: (routeKey) => classicSidetabRuntime.routeKey(routeKey),
|
|
15703
15963
|
dispatchPreKey: (routeKey, targetHandlerName) => {
|
|
15704
15964
|
const questionViewHandler = {
|
|
15705
15965
|
name: 'question-view',
|
|
@@ -15788,13 +16048,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15788
16048
|
return true;
|
|
15789
16049
|
},
|
|
15790
16050
|
// Step 0 force-quit — fires from anywhere (bell modal, popup
|
|
15791
|
-
// terminal, drag, dashboard).
|
|
15792
|
-
//
|
|
15793
|
-
//
|
|
15794
|
-
// The second alias is for terminal/VW-heavy contexts where
|
|
15795
|
-
// Shift-modified control chords may get normalized away by the
|
|
15796
|
-
// terminal emulator. Plain Ctrl+Q is still *not* the true
|
|
15797
|
-
// force-quit because terminal-resident apps use it.
|
|
16051
|
+
// terminal, drag, dashboard). Ctrl+Shift+Q is the escape chord;
|
|
16052
|
+
// Ctrl+\ is reserved for classic side-tab guidance. Plain Ctrl+Q
|
|
16053
|
+
// remains available to terminal-resident apps.
|
|
15798
16054
|
// Korean shifted ㅃ (Shift+ㅂ on 2-bul) accepts ctrl-only
|
|
15799
16055
|
// because the shift bit may be implicit in the codepoint.
|
|
15800
16056
|
isForceQuitChord: (routeKey) => {
|
|
@@ -15811,7 +16067,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15811
16067
|
});
|
|
15812
16068
|
}
|
|
15813
16069
|
if (!routeKey.ctrl) return false;
|
|
15814
|
-
if (routeKey.name === '\\' || routeKey.name === 'backslash') return true;
|
|
15815
16070
|
if (routeKey.shift && (routeKey.name === 'q' || routeKey.name === 'Q' || routeKey.name === 'ㅂ')) return true;
|
|
15816
16071
|
if (routeKey.name === 'ㅃ') return true;
|
|
15817
16072
|
return false;
|
|
@@ -16233,7 +16488,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16233
16488
|
terminalExpanded = !terminalExpanded;
|
|
16234
16489
|
previewTerminalDims = null;
|
|
16235
16490
|
chatLines.push(C.muted(terminalExpanded
|
|
16236
|
-
? 'Terminal expanded. Ctrl+Shift+E
|
|
16491
|
+
? 'Terminal expanded. Ctrl+Shift+E to restore.'
|
|
16237
16492
|
: 'Terminal collapsed to preview slot.'));
|
|
16238
16493
|
chatScrollOffset = -1;
|
|
16239
16494
|
},
|
|
@@ -16572,6 +16827,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16572
16827
|
chatMainInputVisibilityState().inputOwnership?.owner === 'chat-main',
|
|
16573
16828
|
onPasteImage: attachClipboardImage,
|
|
16574
16829
|
routeVoiceKey: async (routeKey) => {
|
|
16830
|
+
if (classicSidetabRuntime.routeKey(routeKey)) return 'consumed';
|
|
16575
16831
|
// 2026-04-30 — voice-chat ESC: when the controller is
|
|
16576
16832
|
// active and the user hits ESC inside chat-main, take
|
|
16577
16833
|
// it as a "exit voice mode" gesture and DO NOT let
|
|
@@ -16824,6 +17080,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16824
17080
|
const outcome = await inputCoreRouteInputEventAsync(ev, ctx);
|
|
16825
17081
|
return outcome === 'consumed' ? 'consumed' : 'passthrough';
|
|
16826
17082
|
},
|
|
17083
|
+
routeQuitChord: (key) => {
|
|
17084
|
+
if (classicSidetabRuntime.routeKey(key)) return 'consumed';
|
|
17085
|
+
if (!isClassicSigquitChord(key)) return 'passthrough';
|
|
17086
|
+
showClassicSigquitGuidance();
|
|
17087
|
+
return 'consumed';
|
|
17088
|
+
},
|
|
16827
17089
|
shouldRouteInputDispatcherKey: (key) => {
|
|
16828
17090
|
const topModalId = display.modalStack().at(-1) ?? null;
|
|
16829
17091
|
const topModal = topModalId ? display.surface(topModalId) : null;
|
|
@@ -17248,9 +17510,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
17248
17510
|
// { return: DashboardAction }.
|
|
17249
17511
|
const dashboardSlashSurfaceUx = resolveDashboardSlashSurfaceUx();
|
|
17250
17512
|
const clarificationSurfaceUx = dashboardSlashSurfaceUx ? {
|
|
17251
|
-
question: (request: Parameters<typeof dashboardSlashSurfaceUx.question>[0]) => {
|
|
17252
|
-
const
|
|
17253
|
-
if ((
|
|
17513
|
+
question: (request: Parameters<typeof dashboardSlashSurfaceUx.question>[0], options?: Parameters<typeof dashboardSlashSurfaceUx.question>[1]) => {
|
|
17514
|
+
const clarification = (request as typeof request & { [DASHBOARD_CLARIFICATION_REQUEST]?: boolean })[DASHBOARD_CLARIFICATION_REQUEST] === true;
|
|
17515
|
+
if (clarification && resolveTuiUnattended(getUserConfig())) return resolveInlineAskUserQuestion(request);
|
|
17516
|
+
const pending = dashboardSlashSurfaceUx.question(request, options);
|
|
17517
|
+
if (clarification) {
|
|
17254
17518
|
const handle = approvalModalRouter.current();
|
|
17255
17519
|
if (approvalModalRouter.currentKind() === 'askUser' && handle) {
|
|
17256
17520
|
clarificationModalId = handle.surface.id;
|
|
@@ -17602,6 +17866,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
17602
17866
|
pushModalSurface: (surface: import('../display/modal-stack.js').ModalSurface) => display.pushModal(surface),
|
|
17603
17867
|
redraw: draw,
|
|
17604
17868
|
onStatus: (line: string) => {
|
|
17869
|
+
// 상태 줄 = 진전 신호(SURVIVAL-PROGRESS-CLOCK) — 마지막 진전 시각을 올린다.
|
|
17870
|
+
reportTuiProgress();
|
|
17605
17871
|
chatLines.push(C.muted(` ${line}`));
|
|
17606
17872
|
chatScrollOffset = -1;
|
|
17607
17873
|
},
|
|
@@ -17946,10 +18212,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
17946
18212
|
schedulerRef: dashboardLoopSchedulerRef,
|
|
17947
18213
|
},
|
|
17948
18214
|
};
|
|
17949
|
-
const
|
|
17950
|
-
if (
|
|
17951
|
-
debug.log('tui.
|
|
18215
|
+
const slashCommand = SLASH_COMMANDS.find((entry) => entry.name === cmdLower || entry.aliases?.includes(cmdLower));
|
|
18216
|
+
if (slashCommand) {
|
|
18217
|
+
debug.log('tui.slash-use', 'dispatch', {
|
|
18218
|
+
command: slashCommand.name,
|
|
18219
|
+
alias: cmdLower === slashCommand.name ? null : cmdLower,
|
|
18220
|
+
surface: 'classic',
|
|
18221
|
+
runId: slashUsageRunId,
|
|
18222
|
+
});
|
|
17952
18223
|
}
|
|
18224
|
+
const slashOutcome = await dashboardSlashRegistry.dispatch(cmdLower, args, slashCtx);
|
|
17953
18225
|
if (debug.enabled) {
|
|
17954
18226
|
debug.log('dashboard.slash.dispatch', cmdLower, {
|
|
17955
18227
|
argsCount: args.length,
|
|
@@ -17962,6 +18234,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
17962
18234
|
if (slashOutcome.kind === 'return') return slashOutcome.value;
|
|
17963
18235
|
if (slashOutcome.kind === 'continue') {
|
|
17964
18236
|
if (exitInputLoop) break;
|
|
18237
|
+
draw();
|
|
17965
18238
|
continue;
|
|
17966
18239
|
}
|
|
17967
18240
|
switch (cmdLower) {
|
|
@@ -18770,7 +19043,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18770
19043
|
createTurnStreamRuntime: (initialAssistantStart) => {
|
|
18771
19044
|
latestTurnUsage = undefined;
|
|
18772
19045
|
createDashboardTurnStreamRuntimeEscBoundary(escAbortToolState);
|
|
19046
|
+
delegatedTerminationPending = false;
|
|
19047
|
+
delegatedTerminationFailed = false;
|
|
18773
19048
|
escHarnessSpacesByCallId.clear();
|
|
19049
|
+
escDelegatedPtyIdsByCallId.clear();
|
|
19050
|
+
escDelegatedShellResultsByCallId.clear();
|
|
18774
19051
|
liveTypeaheadEchoes.length = 0;
|
|
18775
19052
|
const toolRendering = {
|
|
18776
19053
|
...getUserConfig().chat.rendering.tool,
|
|
@@ -18813,19 +19090,31 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18813
19090
|
return {
|
|
18814
19091
|
...turnStreamRuntime,
|
|
18815
19092
|
onText: (chunk, accumulated) => {
|
|
19093
|
+
// 스트림 텍스트 = 진전 신호(SURVIVAL-PROGRESS-CLOCK) — 마지막 진전 시각을 올린다.
|
|
19094
|
+
reportTuiProgress();
|
|
18816
19095
|
turnStreamRuntime.onText(chunk, accumulated);
|
|
18817
19096
|
restoreLiveTypeaheadEchoes();
|
|
18818
19097
|
draw();
|
|
18819
19098
|
},
|
|
18820
19099
|
onToolCall: (call) => {
|
|
18821
19100
|
const toolCall = call as DashboardTurnStreamCall;
|
|
19101
|
+
// 도구 시작 = 진전 신호 — 녹음기가 없으면(reportTuiProgress 계약) 아무 일도 안 한다.
|
|
19102
|
+
reportTuiProgress();
|
|
18822
19103
|
trackEscAbortToolCall(escAbortToolState, toolCall);
|
|
19104
|
+
if ((toolCall.name === 'PtyShellPoll' || toolCall.name === 'PtyShellSnapshot' || toolCall.name === 'PtyShellSend')
|
|
19105
|
+
&& typeof toolCall.args.process_id === 'string') {
|
|
19106
|
+
escDelegatedPtyIdsByCallId.set(toolCall.id, toolCall.args.process_id);
|
|
19107
|
+
}
|
|
18823
19108
|
turnStreamRuntime.onToolCall(toolCall);
|
|
18824
19109
|
},
|
|
18825
19110
|
onToolResult: (call) => {
|
|
18826
19111
|
const toolCall = call as DashboardTurnStreamCall;
|
|
19112
|
+
// 도구 끝 = 진전 신호 — 마지막 진전 시각을 올린다.
|
|
19113
|
+
reportTuiProgress();
|
|
18827
19114
|
turnStreamRuntime.onToolResult(toolCall);
|
|
18828
19115
|
settleEscAbortToolCall(escAbortToolState, toolCall);
|
|
19116
|
+
escDelegatedPtyIdsByCallId.delete(toolCall.id);
|
|
19117
|
+
escDelegatedShellResultsByCallId.delete(toolCall.id);
|
|
18829
19118
|
escHarnessSpacesByCallId.delete(toolCall.id);
|
|
18830
19119
|
},
|
|
18831
19120
|
onThought: (text) => {
|
|
@@ -18967,7 +19256,13 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18967
19256
|
chatLines.push(C.warning(notice));
|
|
18968
19257
|
detailViewerRuntime.stage('turn error', raw.split(/\r?\n/));
|
|
18969
19258
|
},
|
|
18970
|
-
finalizeTurn: (finalStatus, finalError) => {
|
|
19259
|
+
finalizeTurn: async (finalStatus, finalError) => {
|
|
19260
|
+
if (escDelegatedTermination) {
|
|
19261
|
+
const terminated = await escDelegatedTermination;
|
|
19262
|
+
finalStatus = terminated ? 'interrupted' : 'failed';
|
|
19263
|
+
if (!terminated) finalError = 'delegated PTY termination failed';
|
|
19264
|
+
escDelegatedTermination = null;
|
|
19265
|
+
}
|
|
18971
19266
|
lastTurnFinalStatus = finalStatus;
|
|
18972
19267
|
clearEscAbortToolState(escAbortToolState);
|
|
18973
19268
|
finalizeDashboardTurn({
|