elanous 0.2.38 → 0.2.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → HjeK7zONHfR7op1hKXp4k}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{7954.4f7a8832663ee979.js → 1060.014f1f01a17aec26.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8911.bf5e712acb25fb6c.js → 1281.d81877e35b9068f4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2104.70e086d5174a4736.js → 1350.59f40e39e02d91b1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +286 -0
- package/apps/pwa/out/_next/static/chunks/1537-6bb97b5214928ea9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +149 -0
- package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +90 -0
- package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +104 -0
- package/apps/pwa/out/_next/static/chunks/2047.8f23e210995d4548.js +2 -0
- package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1632.7d87f998e714bede.js → 2066.a77257c8c350770a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8019.21ca554a821dad01.js → 2177.df8547f9d7215c4e.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3528.e4b8ab70d339f965.js → 2226.2cf61ec781827219.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6493.27ad77de7aac7966.js → 2499.02fbfd18126c10c0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7628.6b16863ac3972333.js → 2522.f2766b76d22c8bdf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3086.fb14b60ce98b53d3.js → 2566.beaffc3a5e1fcd2e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9299.24e2a7d9b6d1f91b.js → 261.0d471e8aded799f3.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +27 -0
- package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2774-719820e3f5b2a3eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2829-734fe8bf2eee7347.js +1 -0
- package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7524.ce973525d30b3d52.js → 3330.7443183b7e6fdbdf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3124-561f7f037943cde2.js → 3746-f80a78f220bf37b5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +24 -0
- package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +77 -0
- package/apps/pwa/out/_next/static/chunks/{bb6987f9.3647e1a23b0e3217.js → 3b355b3d.6f73c98bf6f9c749.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +36 -0
- package/apps/pwa/out/_next/static/chunks/{8994d93e.33ba491f95345fc2.js → 409c787b.e48c5bec8ec10456.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5041-5aada92ca215ffdd.js → 413-24c8284bda08241d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +287 -0
- package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4351.0f37a6db2b34d50b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5638.107314dc479e2f37.js → 470.51a72a2348306455.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8487.291666583bebe640.js → 4769.9fd582071301f382.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8509.3a54d4e61893d7cb.js → 483.725e4a61be922788.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9fe1b809.738da85c8b17e3fb.js → 4864a2ca.1c1c280a7772c5e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +74 -0
- package/apps/pwa/out/_next/static/chunks/{8879.ac06755bcf3e44a1.js → 5383.bdfa5d886e39a826.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6142.913b44e260a3f925.js → 5436.fdf6fa8ae3e9588d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +8 -0
- package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +62 -0
- package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +94 -0
- package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7161-8f22db3ec5ed005e.js → 6051-0ae955eedb10adb9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3291.f6c1005387d514bd.js → 6257.c0037b8949239f5e.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5203.51e5d8b5f1dcfe53.js → 6749.0744ce6eb08d40e9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1938.0e6c60ee91c4d7f5.js → 6908.06008c67f6380ea9.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{de8b930d.d94c0f42acf807fc.js → 6cc1d1d6.9a98dd4622f1afc6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7219-15bdd9a80661af8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +93 -0
- package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7611.85f045bf232053ac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8099.1cccf31c1baa7e1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1026-44010f405704050c.js → 8272-025653884f9645d2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5307.d7328020227880c2.js → 8357.1aaa713b052a78b1.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4199-f7c6eb40cd0322f8.js → 8639-92c11d069792429e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8d173e38.18a2f7b4e1848bdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +41 -0
- package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9175.2de5209a5ce6f68a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9184.45afbf44fec87574.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{eaad0cba.771200940c529df7.js → 9189505a.980427ac048c8c60.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +79 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-866aac5ff226a7f3.js → page-ba957ff875a026a0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-4edb8df90f4537ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-83d27757e2b8060a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-fca2e59a81744d9e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-139d722de1dcd6c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-ccde99f07aaf71f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b7478fef.5917716286213fcc.js → b84cad00.594027ebe0531fe2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b7459770.6539b11860eb8a9c.js → ca3702f8.2913182e73889fa2.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{3f0de3de-2340c532c00395db.js → d5d3cefc-373c4eb722ed848b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{89d6c04f-6b8ab341748e468a.js → d8de0de2-dd0f4ac8e5ab1832.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{framework-4b12a946f352cee2.js → framework-002b472a66935d31.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/graphs/demo/persona-marketer/fixtures/marketer-scenario.yaml +10 -0
- package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
- package/graphs/demo/persona-marketer/recipes.yaml +19 -0
- package/graphs/video/explainer-line.yaml +4 -1
- package/package.json +1 -1
- package/scripts/dead-code/report.ts +169 -0
- package/scripts/lib/morning-report-options.ts +3 -4
- package/scripts/lib/tui-regress-evidence.ts +56 -0
- package/scripts/morning-report.ts +5 -1
- package/scripts/public-export.ts +15 -7
- package/scripts/release-loop/export-check-node.ts +21 -3
- package/scripts/release-loop/gate-node.ts +379 -48
- package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
- package/scripts/release-loop/gate-shard-receipts.ts +89 -0
- package/scripts/release-loop/gate-wall.ts +5 -5
- package/scripts/release-loop/preflight.ts +6 -2
- package/scripts/release-loop/resume-release.ts +20 -5
- package/scripts/release-loop/resume.ts +48 -0
- package/scripts/release-loop/version-node.ts +7 -2
- package/scripts/release-story/draft.ts +1 -1
- package/scripts/research-bench/README.md +53 -0
- package/scripts/research-bench/questions.json +66 -0
- package/scripts/research-bench/rubric.md +33 -0
- package/scripts/research-bench/run.ts +523 -0
- package/scripts/tui-regress.ts +85 -10
- package/src/acp/core-turn-bridge.ts +8 -0
- package/src/agent/autonomous-tools.ts +10 -3
- package/src/agent/monad-agent-turn.ts +4 -1
- package/src/agent/registry.ts +26 -2
- package/src/agent/shared-app-tools.ts +1 -1
- package/src/agent/surface-ux/build.ts +12 -3
- package/src/agent/surface-ux/types.ts +1 -1
- package/src/agent/task-notification.ts +75 -6
- package/src/agent/types.ts +3 -0
- package/src/agent-mission/driver.ts +29 -3
- package/src/agent-mission/mission-cli.ts +2 -1
- package/src/agent-substrate/review-context-pack.ts +365 -0
- package/src/agent-substrate/self-review-cli.ts +226 -17
- package/src/ask-user-question/index.ts +6 -0
- package/src/ask-user-question/inline-resolver.ts +49 -0
- package/src/auto-research/question-ladder-contract.ts +22 -3
- package/src/auto-research/research-turn.ts +350 -17
- package/src/autopilot/agent-loop.ts +1 -1
- package/src/autopilot/pty-control-loop.ts +8 -1
- package/src/boot/daemon-tools/index.ts +4 -3
- package/src/boot/daemon-tools/self-implement.ts +270 -2
- package/src/boot/daemon-tools/types.ts +2 -0
- package/src/budget/llm-cost.ts +44 -5
- package/src/budget/unified-usage.ts +17 -1
- package/src/capture/tui-self-report.ts +14 -0
- package/src/chat/index.ts +33 -7
- package/src/cli/agent-cli.ts +43 -8
- package/src/cli/intake-cli.ts +22 -1
- package/src/cli/lesson-cli.ts +19 -3
- package/src/cli/log-event-names.ts +1 -0
- package/src/cli/pod-cli.ts +17 -2
- package/src/cli/pty-takeover-cli.ts +67 -7
- package/src/cli/release-cli.ts +52 -6
- package/src/cli/repo-cli.ts +2 -1
- package/src/cli/tasks-cli.ts +36 -9
- package/src/control-plane/ledger.ts +21 -4
- package/src/core-turn/run-core-turn.ts +44 -3
- package/src/core-turn/run-goal-loop.ts +152 -8
- package/src/core-turn/types.ts +9 -0
- package/src/dashboard/chat/acp-chat.ts +2 -2
- package/src/dashboard/classic-sigquit.ts +16 -0
- package/src/dashboard/index.ts +321 -27
- package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
- package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
- package/src/dashboard/input/external-input-host.ts +2 -0
- package/src/dashboard/sidetab-runtime.ts +228 -0
- package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -8
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
- package/src/dashboard/term-slash-runtime.ts +16 -18
- package/src/dashboard/turn-preamble.ts +2 -0
- package/src/domains/knowledge.ts +1 -1
- package/src/esc-abort-gate.ts +33 -1
- package/src/execution-loop/launch-gate.ts +206 -1
- package/src/graph-runner/graph-cli.ts +6 -4
- package/src/graph-runner/runner.ts +31 -9
- package/src/graph-wizard/generate.ts +16 -7
- package/src/graph-wizard/mission-compose.ts +201 -0
- package/src/grok/agent-search.ts +8 -2
- package/src/grok/credential.ts +5 -0
- package/src/grounding/ref-index.ts +11 -0
- package/src/grounding/ref-vector.ts +61 -0
- package/src/grounding/sources-cli.ts +2 -2
- package/src/grounding/sources.ts +15 -1
- package/src/harness/harness-cli-command.ts +38 -9
- package/src/harness/harness-pod-dispatch.ts +7 -1
- package/src/index.ts +18 -4
- package/src/input/external-input-queue.ts +10 -0
- package/src/intake-plane/collect-telegram-saved.ts +36 -1
- package/src/intake-plane/intake-to-tasks.ts +246 -3
- package/src/lessons/friction-ledger.ts +154 -0
- package/src/live-supply/collector.ts +149 -0
- package/src/live-supply/probes.ts +52 -0
- package/src/live-supply/snapshot.ts +40 -0
- package/src/llm.ts +431 -76
- package/src/loops/orchestrator/tick.ts +8 -0
- package/src/nexus/api/harness-api.ts +2 -1
- package/src/pty/snapshot.py +132 -0
- package/src/pty-shell/pty-control-ipc.ts +29 -2
- package/src/pty-shell/pty-manifest.ts +59 -3
- package/src/pty-shell/registry.ts +2 -0
- package/src/pty-shell/tui-run-state.ts +80 -3
- package/src/release-loop/gate-host-reservation.ts +13 -4
- package/src/release-loop/gate-shard-ledger.ts +68 -0
- package/src/release-loop/merged-pr-checklist.ts +25 -2
- package/src/release-loop/rehearsal-shard-plan.ts +6 -1
- package/src/release-loop/rehearsal.ts +27 -0
- package/src/research/edge-decision.ts +124 -15
- package/src/research/gap-followup.ts +249 -0
- package/src/research/lenses/counter-evidence.ts +100 -0
- package/src/research/lenses/working-backwards.ts +89 -0
- package/src/research/plugin-discovery.ts +242 -0
- package/src/research-bridge/invoke.ts +4 -2
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +34 -106
- package/src/self-dev/dev-cli.ts +2 -0
- package/src/self-dev/dev-pipeline.ts +8 -4
- package/src/self-dev/graph-journey-route.ts +10 -2
- package/src/self-dev/launch-preflight-text.ts +2 -2
- package/src/self-dev/launch-preflight.ts +38 -7
- package/src/self-dev/orchestrate-cli.ts +1 -0
- package/src/self-dev/run-supervisor.ts +19 -0
- package/src/self-implement/device-first.ts +8 -2
- package/src/self-implement/doctor-visit.ts +76 -58
- package/src/self-implement/gate-artifacts.ts +3 -0
- package/src/self-implement/gate-baseline.ts +75 -4
- package/src/self-implement/gate-cli.ts +317 -9
- package/src/self-implement/gate-receipt-registry.ts +180 -0
- package/src/self-implement/gate-remote.ts +145 -22
- package/src/self-implement/goal-author-clarification.ts +178 -24
- package/src/self-implement/goal-author-decompose.ts +24 -15
- package/src/self-implement/goal-author.ts +9 -5
- package/src/self-implement/host-regate.ts +120 -45
- package/src/self-implement/impl-findings-feedback.ts +188 -0
- package/src/self-implement/knowhow-pack.ts +189 -10
- package/src/self-implement/off-diff-evidence.ts +124 -0
- package/src/self-implement/orchestrator.ts +85 -7
- package/src/self-implement/run-ledger.ts +46 -8
- package/src/self-implement/run-stop.ts +12 -0
- package/src/self-implement/seams.ts +6 -3
- package/src/self-implement/self-implement-cli.ts +4 -2
- package/src/session/chat.ts +89 -15
- package/src/session-runtime/provider-circuit.ts +140 -0
- package/src/shell-runner/file-engine.ts +1 -0
- package/src/shell-runner/types.ts +4 -0
- package/src/sidetab-core/model.ts +176 -0
- package/src/skills/tools/schedule-wakeup.ts +23 -1
- package/src/skills/tools/shell.ts +51 -5
- package/src/steward/directive-audit.ts +354 -0
- package/src/surface/child-process.ts +31 -0
- package/src/surface/tui-stderr-owner.ts +48 -0
- package/src/task-agent/cover.ts +30 -12
- package/src/task-agent/judge.ts +56 -0
- package/src/task-agent/postland-card.ts +35 -2
- package/src/task-agent/rejudge-on-head.ts +46 -2
- package/src/task-agent/repair-cycle.ts +1 -1
- package/src/task-agent/task-hand.ts +129 -24
- package/src/task-agent/tier-split.ts +105 -21
- package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
- package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +27 -2
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
- package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +186 -33
- package/src/tool-runtime/skill-exec-runtime.ts +95 -5
- package/src/tui/entry.ts +15 -2
- package/src/tui/inline-choice.ts +188 -0
- package/src/tui/sidetab/list.ts +2 -176
- package/src/tui/slash/term.ts +12 -1
- package/src/tui-client/dashboard-session.ts +7 -1
- package/src/user-config.ts +34 -4
- package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
- package/src/ux-sim/fake-land-queue.ts +88 -0
- package/src/ux-sim/gate-shard-host-reroute.ts +82 -0
- package/src/ux-sim/goal-interim-trace.ts +24 -0
- package/src/ux-sim/next-tui-seat-scenarios.ts +8 -13
- package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/recipes/explainer.ts +54 -2
- package/src/web-search/grok.ts +32 -6
- package/src/web-search/index.ts +8 -7
- package/src/workflow-runtime/node-catalog.ts +53 -4
- package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +0 -93
- package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +0 -104
- package/apps/pwa/out/_next/static/chunks/2415.738b777642a02233.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +0 -24
- package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +0 -1
- package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +0 -287
- package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +0 -94
- package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +0 -32
- package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +0 -90
- package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +0 -79
- package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +0 -286
- package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +0 -1
- package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +0 -8
- package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +0 -62
- package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7488.966b116789f3d41a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +0 -77
- package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +0 -1
- package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +0 -149
- package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +0 -24
- package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +0 -2
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +0 -1
- /package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → HjeK7zONHfR7op1hKXp4k}/_ssgManifest.js +0 -0
package/src/cli/tasks-cli.ts
CHANGED
|
@@ -843,7 +843,7 @@ export function coverCardsInWindow(cards: readonly CoverCardRow[] | null, window
|
|
|
843
843
|
}
|
|
844
844
|
|
|
845
845
|
/** Read the card ledger itself. A missing file or malformed row makes the aggregate unknown. */
|
|
846
|
-
function readImplementCardBindings(statePath: string): ImplementCardRunBinding[] {
|
|
846
|
+
function readImplementCardBindings(statePath: string): { bindings: ImplementCardRunBinding[]; cleanup: Array<{ cardId: string; outcome: 'complete' | 'partial'; at: string }> | null } {
|
|
847
847
|
if (!existsSync(statePath)) throw new Error('TASK-AGENT card ledger is missing');
|
|
848
848
|
const state = readTaskAgentState<{ tasks?: Record<string, TaskCard> }>(statePath);
|
|
849
849
|
if (state.tasks !== undefined && (!state.tasks || typeof state.tasks !== 'object' || Array.isArray(state.tasks))) {
|
|
@@ -851,14 +851,38 @@ function readImplementCardBindings(statePath: string): ImplementCardRunBinding[]
|
|
|
851
851
|
}
|
|
852
852
|
const cards = Object.entries(state.tasks ?? {});
|
|
853
853
|
if (cards.length >= COVER_QUERY_LIMIT) throw new Error('TASK-AGENT card ledger reached query bound');
|
|
854
|
-
|
|
854
|
+
const bindings: ImplementCardRunBinding[] = [];
|
|
855
|
+
const cleanup: Array<{ cardId: string; outcome: 'complete' | 'partial'; at: string }> = [];
|
|
856
|
+
let cleanupUnreadable = false;
|
|
857
|
+
for (const [key, card] of cards) {
|
|
855
858
|
if (!card || typeof card !== 'object' || Array.isArray(card) || typeof card.id !== 'string' || !card.id
|
|
856
859
|
|| card.id !== key || (card.runId != null && typeof card.runId !== 'string')
|
|
857
860
|
|| (card.runChildId != null && typeof card.runChildId !== 'string')) {
|
|
858
861
|
throw new Error('TASK-AGENT card binding is malformed');
|
|
859
862
|
}
|
|
860
|
-
|
|
861
|
-
|
|
863
|
+
bindings.push({ cardId: card.id, runId: card.runId, runChildId: card.runChildId });
|
|
864
|
+
if (card.postLand === undefined) continue;
|
|
865
|
+
const post = card.postLand;
|
|
866
|
+
if (!post || (post.outcome !== 'complete' && post.outcome !== 'partial')
|
|
867
|
+
|| !Number.isSafeInteger(post.pr) || typeof post.head !== 'string' || !post.head
|
|
868
|
+
|| typeof post.at !== 'string' || !Number.isFinite(Date.parse(post.at))
|
|
869
|
+
|| !Array.isArray(card.history)) { cleanupUnreadable = true; continue; }
|
|
870
|
+
if (card.history.some((event) => !event || typeof event !== 'object')) { cleanupUnreadable = true; continue; }
|
|
871
|
+
if (card.status !== 'done' || card.prTerminal?.state !== 'MERGED'
|
|
872
|
+
|| card.prTerminal.pr !== post.pr || typeof card.prTerminal.head !== 'string'
|
|
873
|
+
|| card.prTerminal.head.toLowerCase() !== post.head.toLowerCase()) continue;
|
|
874
|
+
// A same-outcome reconciliation refreshes postLand.at without appending another history event.
|
|
875
|
+
const sourceEvents = card.history.filter((event) => event.event === 'postland-card' && event.pr === post.pr
|
|
876
|
+
&& typeof event.head === 'string' && event.head.toLowerCase() === post.head.toLowerCase());
|
|
877
|
+
if (sourceEvents.length === 0) continue;
|
|
878
|
+
if (sourceEvents.some((event) => typeof event.at !== 'string' || !Number.isFinite(Date.parse(event.at)))) {
|
|
879
|
+
cleanupUnreadable = true;
|
|
880
|
+
continue;
|
|
881
|
+
}
|
|
882
|
+
const sourceAt = sourceEvents[sourceEvents.length - 1]!.at;
|
|
883
|
+
cleanup.push({ cardId: card.id, outcome: post.outcome, at: sourceAt });
|
|
884
|
+
}
|
|
885
|
+
return { bindings, cleanup: cleanupUnreadable ? null : cleanup };
|
|
862
886
|
}
|
|
863
887
|
|
|
864
888
|
function implementLedgerDirectories(statePath: string, includeTest: boolean): string[] {
|
|
@@ -987,10 +1011,13 @@ export function readTaskAgentCover(
|
|
|
987
1011
|
};
|
|
988
1012
|
// A supplied reader overrides only its own source. The ordinary CLI always reads both physical ledgers.
|
|
989
1013
|
try {
|
|
990
|
-
input.implementCardRuns = goalReaders.coverImplementCardRuns
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
1014
|
+
if (goalReaders.coverImplementCardRuns) input.implementCardRuns = goalReaders.coverImplementCardRuns();
|
|
1015
|
+
else {
|
|
1016
|
+
const { bindings, cleanup } = readImplementCardBindings(goalReaders.taskStatePath ?? taskStatePathDefault());
|
|
1017
|
+
input.implementCardRuns = bindings;
|
|
1018
|
+
input.cleanupCards = cleanup?.filter((card) => inWindow(card.at)) ?? null;
|
|
1019
|
+
}
|
|
1020
|
+
} catch { input.implementCardRuns = null; input.cleanupCards = null; input.implementReadFailure = 'card-ledger-unreadable'; }
|
|
994
1021
|
try {
|
|
995
1022
|
input.implementRunMerges = goalReaders.coverImplementRunMerges
|
|
996
1023
|
? goalReaders.coverImplementRunMerges()
|
|
@@ -1001,7 +1028,7 @@ export function readTaskAgentCover(
|
|
|
1001
1028
|
implementLedgerDirectories(goalReaders.taskStatePath ?? taskStatePathDefault(), goalReaders.coverIncludeTest === true),
|
|
1002
1029
|
window,
|
|
1003
1030
|
);
|
|
1004
|
-
} catch { input.implementRunMerges = null; }
|
|
1031
|
+
} catch { input.implementRunMerges = null; input.implementReadFailure ??= 'run-ledger-unreadable'; }
|
|
1005
1032
|
const orders = orderRead && !orderRead.limitReached ? coverEvents(orderRead.rows, 'task-agent.land-order', 'appended', (data) =>
|
|
1006
1033
|
Number.isSafeInteger(data.pr) ? { pr: data.pr as number } : null) : null;
|
|
1007
1034
|
const landSignals: CoverLandSignals = {
|
|
@@ -29,6 +29,9 @@ interface PodWorkerLeaseAttrs {
|
|
|
29
29
|
idleTtlMs: number;
|
|
30
30
|
leaseId?: string;
|
|
31
31
|
leaseOwner?: string;
|
|
32
|
+
/** The just-sanitized generation remains fenceable until the next acquisition. */
|
|
33
|
+
lastLeaseId?: string;
|
|
34
|
+
lastLeaseOwner?: string;
|
|
32
35
|
runId?: string;
|
|
33
36
|
attemptId?: string;
|
|
34
37
|
reason?: string;
|
|
@@ -235,8 +238,11 @@ export class ResourceLedger {
|
|
|
235
238
|
if (index < 0) throw new ResourceLedgerError(409, 'no-warm-worker');
|
|
236
239
|
const row = rows[index]!;
|
|
237
240
|
const attrs = workerAttrs(row);
|
|
238
|
-
const
|
|
239
|
-
leaseId: randomUUID(), leaseOwner: request.owner, runId: request.runId, attemptId: request.attemptId }
|
|
241
|
+
const nextAttrs: PodWorkerLeaseAttrs = { ...attrs, state: 'leased', generation: attrs.generation + 1,
|
|
242
|
+
leaseId: randomUUID(), leaseOwner: request.owner, runId: request.runId, attemptId: request.attemptId };
|
|
243
|
+
delete nextAttrs.lastLeaseId;
|
|
244
|
+
delete nextAttrs.lastLeaseOwner;
|
|
245
|
+
const next: ResourceRecord = { ...row, attrs: nextAttrs as unknown as Record<string, unknown>,
|
|
240
246
|
observedAt: at, ttlMs: request.ttlMs };
|
|
241
247
|
rows[index] = next;
|
|
242
248
|
this.write(rows);
|
|
@@ -252,9 +258,13 @@ export class ResourceLedger {
|
|
|
252
258
|
if (index < 0) throw new ResourceLedgerError(404, 'not-found');
|
|
253
259
|
const row = rows[index]!;
|
|
254
260
|
const attrs = workerAttrs(row);
|
|
255
|
-
|
|
261
|
+
const lateIdleQuarantine = request.action === 'quarantine' && attrs.state === 'idle'
|
|
262
|
+
&& attrs.lastLeaseId === request.leaseId && attrs.generation === request.generation;
|
|
263
|
+
if (!request.leaseId || (attrs.leaseId !== request.leaseId && !lateIdleQuarantine)
|
|
264
|
+
|| attrs.generation !== request.generation) throw new ResourceLedgerError(409, 'stale-worker-lease');
|
|
256
265
|
const permitted = request.action === 'sanitize' ? row.owner === request.owner
|
|
257
266
|
: request.action === 'quarantine' ? row.owner === request.owner || attrs.leaseOwner === request.owner
|
|
267
|
+
|| (lateIdleQuarantine && attrs.lastLeaseOwner === request.owner)
|
|
258
268
|
: attrs.leaseOwner === request.owner;
|
|
259
269
|
if (!permitted) {
|
|
260
270
|
throw new ResourceLedgerError(403, 'not-owner');
|
|
@@ -266,7 +276,14 @@ export class ResourceLedger {
|
|
|
266
276
|
const state: PodWorkerState = request.action === 'renew' ? 'leased' : request.action === 'release' ? 'sanitizing'
|
|
267
277
|
: request.action === 'sanitize' ? 'idle' : 'quarantined';
|
|
268
278
|
const nextAttrs: PodWorkerLeaseAttrs = { ...attrs, state, ...(request.reason ? { reason: request.reason } : {}) };
|
|
269
|
-
if (state === 'idle') {
|
|
279
|
+
if (state === 'idle') {
|
|
280
|
+
nextAttrs.lastLeaseId = attrs.leaseId;
|
|
281
|
+
nextAttrs.lastLeaseOwner = attrs.leaseOwner;
|
|
282
|
+
delete nextAttrs.leaseId; delete nextAttrs.leaseOwner; delete nextAttrs.runId; delete nextAttrs.attemptId; delete nextAttrs.reason;
|
|
283
|
+
} else if (state === 'quarantined') {
|
|
284
|
+
delete nextAttrs.lastLeaseId;
|
|
285
|
+
delete nextAttrs.lastLeaseOwner;
|
|
286
|
+
}
|
|
270
287
|
const ttlMs = state === 'idle' ? attrs.idleTtlMs : request.ttlMs ?? row.ttlMs;
|
|
271
288
|
const next: ResourceRecord = { ...row, attrs: nextAttrs as unknown as Record<string, unknown>, observedAt: now, ttlMs };
|
|
272
289
|
rows[index] = next;
|
|
@@ -25,6 +25,7 @@ import { drainPendingUserInput } from '../session/pending-input.js';
|
|
|
25
25
|
import type { StreamWithToolsHandlers } from '../llm.js';
|
|
26
26
|
import { debug, redactSecretText, withAmbientSessionScope } from '../debug/log.js';
|
|
27
27
|
import { applyDeferredTools } from '../session-runtime/tier-flip.js';
|
|
28
|
+
import { isResearchAgentIntent } from '../tool-hints/signals.js';
|
|
28
29
|
import { buildResearchDateSystemMessage, resolveSessionSurfaceProfile } from '../session-runtime/index.js';
|
|
29
30
|
import type {
|
|
30
31
|
CoreTurnContext,
|
|
@@ -101,6 +102,7 @@ function selectSurfaceUserText(ctx: CoreTurnContext): string | undefined {
|
|
|
101
102
|
*/
|
|
102
103
|
export interface RunCoreTurnOptions {
|
|
103
104
|
now?: () => number;
|
|
105
|
+
runResearch?: (request: string) => Promise<{ ok: boolean; output: string; error?: string }>;
|
|
104
106
|
}
|
|
105
107
|
|
|
106
108
|
export async function runCoreTurn(
|
|
@@ -127,12 +129,14 @@ export async function runCoreTurn(
|
|
|
127
129
|
|
|
128
130
|
let accumulatedText = '';
|
|
129
131
|
let dispatchCount = 0;
|
|
132
|
+
let finalPhaseAnswer = false;
|
|
130
133
|
|
|
131
134
|
const handlers: StreamWithToolsHandlers = {
|
|
132
135
|
onText: (delta, full) => {
|
|
133
136
|
accumulatedText = full;
|
|
134
137
|
ctx.callbacks?.onText?.(delta, full);
|
|
135
138
|
},
|
|
139
|
+
...(ctx.callbacks?.onStatus ? { onStatus: (line: string) => ctx.callbacks?.onStatus?.(line) } : {}),
|
|
136
140
|
...(ctx.callbacks?.onFinalAnswerSupplement
|
|
137
141
|
? { onFinalAnswerSupplement: (info: { answer: string; supplement: string; finalText: string }) => ctx.callbacks?.onFinalAnswerSupplement?.(info) }
|
|
138
142
|
: {}),
|
|
@@ -213,7 +217,11 @@ export async function runCoreTurn(
|
|
|
213
217
|
handlers.onUsage = (usage) => ctx.callbacks!.onUsage!(usage);
|
|
214
218
|
}
|
|
215
219
|
if (ctx.callbacks?.onTurnComplete) {
|
|
216
|
-
handlers.onTurnComplete = (msgs) =>
|
|
220
|
+
handlers.onTurnComplete = (msgs) => {
|
|
221
|
+
const lastAssistant = [...msgs].reverse().find((message) => message.role === 'assistant');
|
|
222
|
+
finalPhaseAnswer = lastAssistant?.phase === 'final_answer';
|
|
223
|
+
ctx.callbacks!.onTurnComplete!(msgs);
|
|
224
|
+
};
|
|
217
225
|
}
|
|
218
226
|
if (ctx.callbacks?.onReasoning) {
|
|
219
227
|
handlers.onReasoning = (event) => ctx.callbacks!.onReasoning!(event);
|
|
@@ -240,17 +248,47 @@ export async function runCoreTurn(
|
|
|
240
248
|
const recentUserText = extractRecentUserText(ctx.messages);
|
|
241
249
|
const surfaceUserText = selectSurfaceUserText(ctx);
|
|
242
250
|
const surface = ctx.surfaceProfile ?? resolveSessionSurfaceProfile({ userText: surfaceUserText });
|
|
251
|
+
// Use the shared #31663 research-intent verdict. Surface labels are a
|
|
252
|
+
// presentation/routing result and may remain `chat` for a research turn.
|
|
253
|
+
const researchTurn = isResearchAgentIntent(surfaceUserText);
|
|
243
254
|
const { messages, tools, stats } = applyDeferredTools(
|
|
244
255
|
ctx.messages,
|
|
245
256
|
ctx.tools,
|
|
246
257
|
{ enabled: deferredEnabled, ...(recentUserText ? { userText: recentUserText } : {}) },
|
|
247
258
|
);
|
|
248
|
-
if (
|
|
259
|
+
if (researchTurn && !messages.some((message) =>
|
|
249
260
|
message.role === 'system' && typeof message.content === 'string'
|
|
250
261
|
&& message.content.startsWith('Current local date:'))
|
|
251
262
|
) {
|
|
252
263
|
messages.unshift(buildResearchDateSystemMessage());
|
|
253
264
|
}
|
|
265
|
+
if (researchTurn && surfaceUserText?.trim()) {
|
|
266
|
+
debug.log('research.turn', 'tui-research-started', { sessionId: ctx.sessionId });
|
|
267
|
+
try {
|
|
268
|
+
const result = await (options.runResearch ?? (async (request) => {
|
|
269
|
+
// Keep the Bloom/skill pipeline out of ordinary and packaged TUI startup graphs.
|
|
270
|
+
const { researchTurnForGrounding, runResearchQuestionLadder } = await import('../auto-research/research-turn.js');
|
|
271
|
+
return researchTurnForGrounding(await runResearchQuestionLadder(request));
|
|
272
|
+
}))(surfaceUserText);
|
|
273
|
+
if (result.output.trim()) {
|
|
274
|
+
messages.unshift({
|
|
275
|
+
role: 'system',
|
|
276
|
+
content: `<bloom-research>\n${result.output.trim()}\n</bloom-research>\nUse this axis evidence and counterevidence in the answer; preserve uncertainty and distinguish sourced facts from inference.`,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
debug.log('research.turn', 'tui-research-completed', {
|
|
280
|
+
sessionId: ctx.sessionId,
|
|
281
|
+
ok: result.ok,
|
|
282
|
+
outputChars: result.output.length,
|
|
283
|
+
fallbackReason: result.error,
|
|
284
|
+
});
|
|
285
|
+
} catch (error) {
|
|
286
|
+
debug.log('research.turn', 'tui-research-fallback', {
|
|
287
|
+
sessionId: ctx.sessionId,
|
|
288
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
289
|
+
}, { level: 'warn' });
|
|
290
|
+
}
|
|
291
|
+
}
|
|
254
292
|
if (debug.enabled) {
|
|
255
293
|
debug.log('llm.request', 'tools-tier', {
|
|
256
294
|
sessionId: ctx.sessionId,
|
|
@@ -288,8 +326,9 @@ export async function runCoreTurn(
|
|
|
288
326
|
handlers,
|
|
289
327
|
{
|
|
290
328
|
tools,
|
|
291
|
-
researchTurn
|
|
329
|
+
researchTurn,
|
|
292
330
|
signal: ctx.signal,
|
|
331
|
+
...(ctx.requestSizeGuard ? { requestSizeGuard: ctx.requestSizeGuard } : {}),
|
|
293
332
|
...(ctx.sessionId !== undefined ? { sessionId: ctx.sessionId } : {}),
|
|
294
333
|
...(ctx.maxToolTurns !== undefined ? { maxTurns: ctx.maxToolTurns } : {}),
|
|
295
334
|
...(ctx.initialProvider !== undefined
|
|
@@ -299,6 +338,7 @@ export async function runCoreTurn(
|
|
|
299
338
|
...(ctx.budgetGrant !== undefined ? { budgetGrant: ctx.budgetGrant } : {}),
|
|
300
339
|
...(ctx.terminalToolNames !== undefined ? { terminalToolNames: ctx.terminalToolNames } : {}),
|
|
301
340
|
...(ctx.terminalPriorAnswerVisible !== undefined ? { terminalPriorAnswerVisible: ctx.terminalPriorAnswerVisible } : {}),
|
|
341
|
+
...(ctx.terminalCompletionAccepted !== undefined ? { terminalCompletionAccepted: ctx.terminalCompletionAccepted } : {}),
|
|
302
342
|
// ⭐⭐⭐ `B3`(2026-08-19 · 대표 지시 ②) — 도는 턴 «안»으로 들어오는 사용자 발화의 배수구.
|
|
303
343
|
// ⛔ 종전엔 스트리밍 중 친 발화가 ***턴이 끝난 뒤***에야 나갔다.
|
|
304
344
|
// ⭐ 이제 «다음 모델 요청을 만들기 직전»(루프 경계)에 이력으로 들어가고,
|
|
@@ -319,6 +359,7 @@ export async function runCoreTurn(
|
|
|
319
359
|
return {
|
|
320
360
|
stopReason: ctx.signal.aborted ? 'aborted' : 'end_turn',
|
|
321
361
|
finalText,
|
|
362
|
+
...(ctx.callbacks?.onTurnComplete ? { finalPhaseAnswer } : {}),
|
|
322
363
|
};
|
|
323
364
|
} catch (err) {
|
|
324
365
|
const stopReason = classifyStopReason(err, ctx.signal);
|
|
@@ -46,6 +46,7 @@ import {
|
|
|
46
46
|
SEAT_IDLE_NO_WORK_NOTICE, SEAT_TURN_CAP_CONTINUE_PROMPT, SEAT_TURN_CAP_TOOL_NOTICE,
|
|
47
47
|
isEmptyMailListResult, isIdleWaitCall, type SeatTurnCapConfig,
|
|
48
48
|
} from './seat-turn-cap.js';
|
|
49
|
+
import type { TuiChatContext } from './short-question.js';
|
|
49
50
|
|
|
50
51
|
export {
|
|
51
52
|
CHILD_LIVENESS_HEARTBEAT_ENV,
|
|
@@ -186,6 +187,26 @@ export const GOAL_FINAL_ITERATION_NOTE =
|
|
|
186
187
|
|
|
187
188
|
/** 중간 답이 «최종 보고형»(미완 목록)인가 — 관측 전용(행동을 바꾸지 않는다). */
|
|
188
189
|
const INTERIM_REPORT_SHAPED = /(?:보고할 수 없|하지\s?못했습니다|못\s?했습니다|완료되지 않았|검증되지 않았|확인하지 못했|not (?:yet )?(?:verified|completed)|cannot report)/i;
|
|
190
|
+
// TUI-FINAL-ANSWER-COMPLETION(S5 · 10-12 S5-01 실측) — «단순 상태·상황 질문 턴»의 결정론 판별.
|
|
191
|
+
// LLM 호출 0 — 질문 문면만으로 분류한다(AL-eb6797f3b7: 첫 조각은 결정론 분류만). 이 턴의 «완료»는
|
|
192
|
+
// 파일·시험이 아니라 완결 답변 자체다. 그 밖의 실제 골 턴(코딩·자리 운영·쓰기 지시)은 기존대로
|
|
193
|
+
// update_goal 증거 게이트를 지킨다 — 필요한 작업 도구와 update_goal 을 같은 턴에 쓰는 경로는 그대로다.
|
|
194
|
+
export async function isSimpleStatusQuestionTurn(
|
|
195
|
+
userText: string | undefined,
|
|
196
|
+
ctx: TuiChatContext = {},
|
|
197
|
+
): Promise<boolean> {
|
|
198
|
+
if (!userText) return false;
|
|
199
|
+
const { classifyTuiChatIntent, isSeatOpsDirective } = await import('./short-question.js');
|
|
200
|
+
if (isSeatOpsDirective(userText)) return false;
|
|
201
|
+
const chat = classifyTuiChatIntent(userText, ctx);
|
|
202
|
+
if (chat.goalLoop || chat.route === '코딩·구현') return false;
|
|
203
|
+
if (chat.route === '조회') return true;
|
|
204
|
+
// 읽기·분석 은 «판정기가 잡지 못한 나머지 전부»의 기본 라우팅이기도 하다(reason 'read') —
|
|
205
|
+
// 작업 지시(예: 「네 편 영상 재촬영」)까지 상태 질문으로 들이면 진행 중인 골이
|
|
206
|
+
// 미완 진행 한 줄 답에 완결 답으로 끊긴다(TUI-GOAL-INTERIM-QUIET 반례). 물음 형태만 수용한다.
|
|
207
|
+
return chat.route === '읽기·분석' && chat.reason === 'short-question';
|
|
208
|
+
}
|
|
209
|
+
|
|
189
210
|
export function isInterimReportShaped(text: string): boolean {
|
|
190
211
|
return INTERIM_REPORT_SHAPED.test(text);
|
|
191
212
|
}
|
|
@@ -316,6 +337,8 @@ export function stripGoalRepeatReadbackPreface(text: string): string {
|
|
|
316
337
|
export interface GoalLoopOptions {
|
|
317
338
|
/** 목표 문구(관측·프레이밍용). 생략 시 마지막 user 메시지에서 추출. */
|
|
318
339
|
objective?: string;
|
|
340
|
+
/** ACP 대화형 호출자는 false로 기존 provider 재호출 유지; 비대화형·직접 실행은 기본 단축. */
|
|
341
|
+
terminalCompletionShortcut?: boolean;
|
|
319
342
|
/** across-turn 최대 반복. 폭주 방지 하드캡. 기본 8. (ralph max_iterations 류) */
|
|
320
343
|
maxIterations?: number;
|
|
321
344
|
/** 연속 무진전(동일 tool 시그니처 반복) 허용 횟수 → 초과 시 no_progress 종료로 caller 가
|
|
@@ -524,6 +547,12 @@ export async function runGoalLoop(
|
|
|
524
547
|
// ✅ 진입 시점의 messages 에는 아직 그 기계 문장이 «없다» ⇒ 여기서 뽑은 값이 이 턴의 사람 문장이다.
|
|
525
548
|
// ⛔ 고정 prefix 사전으로 「기계 문장인지」를 판별하지 «않는다» — 미등록·변형 프롬프트를 오판하기 때문이다.
|
|
526
549
|
const surfaceUserText = ctx.userText ?? extractRecentUserText(ctx.messages);
|
|
550
|
+
// TUI-FINAL-ANSWER-COMPLETION(S5) — 이 턴이 «단순 상태·상황 질문»인가(결정론 분류 · LLM 호출 0).
|
|
551
|
+
// seatTurnCap 유무를 자리 TUI 판정 신호로 넘긴다 — 자리의 읽기·운영 지시는 기존대로 골 루프를 탄다.
|
|
552
|
+
const statusQuestionTurn = await isSimpleStatusQuestionTurn(
|
|
553
|
+
surfaceUserText,
|
|
554
|
+
{ seat: opts.seatTurnCap != null },
|
|
555
|
+
);
|
|
527
556
|
const harnessRunId = getHarnessRunId();
|
|
528
557
|
const runAttribution = harnessRunId ? { runId: harnessRunId } : {};
|
|
529
558
|
|
|
@@ -570,6 +599,8 @@ export async function runGoalLoop(
|
|
|
570
599
|
let intentStallReprompts = 0;
|
|
571
600
|
// GOAL-LOOP-MIDRUN-STALL — 도구를 쓴 «뒤»의 말뿐인 턴 재촉은 런당 1회뿐이다.
|
|
572
601
|
let intentStallMidrunUsed = false;
|
|
602
|
+
// TUI-FINAL-ANSWER-COMPLETION(S5) — 상태 질문 턴의 미완 보고형 답 재촉도 런당 1회뿐이다(④ 참조).
|
|
603
|
+
let statusQuestionInterimReprompted = false;
|
|
573
604
|
|
|
574
605
|
debug.log('goal.loop', 'start', {
|
|
575
606
|
sessionId: ctx.sessionId, ...runAttribution, objective, maxIterations, noProgressLimit,
|
|
@@ -638,7 +669,8 @@ export async function runGoalLoop(
|
|
|
638
669
|
reportShaped, finalChars: lastResult.finalText.length,
|
|
639
670
|
}, { level: 'debug' });
|
|
640
671
|
} catch { /* 관측 실패가 루프를 막지 않는다 */ }
|
|
641
|
-
//
|
|
672
|
+
// Every non-empty reply that crosses a real iteration boundary is display-only interim;
|
|
673
|
+
// the renderer's shared verdict decides whether it folds, independent of this loop's continuation reason.
|
|
642
674
|
if (lastResult.finalText.trim()) ctx.callbacks?.onGoalInterim?.(lastResult.finalText, iterations);
|
|
643
675
|
const nextIteration = iterations + 1;
|
|
644
676
|
const toolBudget = ctx.maxToolTurns ?? TOOL_LOOP_MAX_TURNS_DEFAULT;
|
|
@@ -851,6 +883,17 @@ export async function runGoalLoop(
|
|
|
851
883
|
goalRepeatWithheld = '';
|
|
852
884
|
ctx.callbacks?.onText?.(withheld, full);
|
|
853
885
|
};
|
|
886
|
+
const flushNovelGoalRepeatWithheld = (full: string): void => {
|
|
887
|
+
if (goalRepeatWithheld === '') return;
|
|
888
|
+
const readback = stripGoalRepeatReadbackPreface(goalRepeatWithheld);
|
|
889
|
+
const normalized = goalRepeatStreamNormalize(readback);
|
|
890
|
+
const prior = goalRepeatPreviousAnswer;
|
|
891
|
+
const novel = normalized.startsWith(prior)
|
|
892
|
+
? normalized.slice(prior.length)
|
|
893
|
+
: normalized;
|
|
894
|
+
goalRepeatWithheld = '';
|
|
895
|
+
if (novel.length > 0) ctx.callbacks?.onText?.(novel, full);
|
|
896
|
+
};
|
|
854
897
|
const turnCtx: CoreTurnContext = {
|
|
855
898
|
...ctx,
|
|
856
899
|
messages,
|
|
@@ -860,8 +903,12 @@ export async function runGoalLoop(
|
|
|
860
903
|
...(surfaceUserText !== undefined ? { userText: surfaceUserText } : {}),
|
|
861
904
|
// TUI-GOAL-LOOP-FRICTION(#46·#63) — update_goal 은 도구 예산 거부를 받지 않고, 답과 함께 오면 그 턴으로 마감한다.
|
|
862
905
|
terminalToolNames: [...(ctx.terminalToolNames ?? []), UPDATE_GOAL_TOOL_NAME],
|
|
863
|
-
|
|
864
|
-
|
|
906
|
+
...(opts.terminalCompletionShortcut !== false ? {
|
|
907
|
+
terminalCompletionAccepted: (name: string, args: Record<string, unknown>) => name === UPDATE_GOAL_TOOL_NAME
|
|
908
|
+
&& args.status === 'complete' && typeof args.evidence === 'string' && args.evidence.trim().length > 0,
|
|
909
|
+
} : {}),
|
|
910
|
+
// The visible-answer hint also guards ACP's legacy empty-tail path; only
|
|
911
|
+
// the validated completion shortcut is caller-scoped.
|
|
865
912
|
...(previousFinalText.trim().length > 0 ? { terminalPriorAnswerVisible: true } : {}),
|
|
866
913
|
// update_goal 은 종결 신호 — 실 dispatcher 로 새지 않게 가로채 ack 만 돌려준다.
|
|
867
914
|
dispatchTool: (name, args, dctx) => {
|
|
@@ -902,6 +949,13 @@ export async function runGoalLoop(
|
|
|
902
949
|
return;
|
|
903
950
|
}
|
|
904
951
|
goalRepeatWithholding = false;
|
|
952
|
+
const combined = goalRepeatWithheld + delta;
|
|
953
|
+
if (opts.terminalCompletionShortcut !== false && previousFinalText
|
|
954
|
+
&& stripGoalRepeatReadbackPreface(combined).startsWith(previousFinalText)) {
|
|
955
|
+
goalRepeatWithheld = combined;
|
|
956
|
+
flushNovelGoalRepeatWithheld(full);
|
|
957
|
+
return;
|
|
958
|
+
}
|
|
905
959
|
flushGoalRepeatWithheld(full);
|
|
906
960
|
}
|
|
907
961
|
ctx.callbacks?.onText?.(delta, full);
|
|
@@ -955,7 +1009,17 @@ export async function runGoalLoop(
|
|
|
955
1009
|
const pureRepeat = normalized === goalRepeatPreviousAnswer
|
|
956
1010
|
|| GOAL_REPEAT_READBACK_PHRASES.some((phrase) => normalized.startsWith(phrase)
|
|
957
1011
|
&& normalized.slice(phrase.length).replace(GOAL_REPEAT_PREFACE_SEPS, '') === goalRepeatPreviousAnswer);
|
|
958
|
-
if (!pureRepeat)
|
|
1012
|
+
if (!pureRepeat) {
|
|
1013
|
+
// A completion-only round may have skipped LLM onText because the prior
|
|
1014
|
+
// answer is already visible. Keep only its genuinely new suffix.
|
|
1015
|
+
if (opts.terminalCompletionShortcut !== false && previousFinalText
|
|
1016
|
+
&& stripGoalRepeatReadbackPreface(goalRepeatWithheld).startsWith(previousFinalText)) {
|
|
1017
|
+
flushNovelGoalRepeatWithheld(goalRepeatWithheld);
|
|
1018
|
+
} else {
|
|
1019
|
+
// ACP keeps its legacy normalized iteration-flush behavior.
|
|
1020
|
+
flushGoalRepeatWithheld(normalized);
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
959
1023
|
}
|
|
960
1024
|
turnNewMessages = msgs;
|
|
961
1025
|
ctx.callbacks?.onTurnComplete?.(msgs);
|
|
@@ -1018,13 +1082,22 @@ export async function runGoalLoop(
|
|
|
1018
1082
|
|
|
1019
1083
|
// ①-0 #29 처방 — 자리 운영 턴은 빈 evidence 를 반려하지 않고 이 턴의 답을 증거로 받는다(관측 남김).
|
|
1020
1084
|
// 답도 비었으면 받을 증거가 없다 — 종전 반려(evidence required)로 그대로 간다.
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1085
|
+
// TUI-FINAL-ANSWER-COMPLETION(S5) — 단순 상태 질문 턴도 같은 수용을 받는다: 이 턴의 «완료»는
|
|
1086
|
+
// 완결 답변 자체다. 빈 evidence 로 반려·재주입하면 답 뒤 빈 턴이 [NO FINAL SYNTHESIS] 로
|
|
1087
|
+
// 떨어져 최종 답이 비었다(10-12 S5-01 실측). 그 안내 문면 자체는 «증거»가 아니다.
|
|
1088
|
+
const lenientScope: 'seat' | 'status-question' | null = opts.lenientCompletionEvidence === true
|
|
1089
|
+
? 'seat'
|
|
1090
|
+
: statusQuestionTurn && !lastResult.finalText.includes('[NO FINAL SYNTHESIS]')
|
|
1091
|
+
? 'status-question'
|
|
1092
|
+
: null;
|
|
1093
|
+
const lenientAnswer = lenientScope === null
|
|
1094
|
+
? ''
|
|
1095
|
+
: boundReadableText(lastResult.finalText, 200).text.trim();
|
|
1024
1096
|
if (goalUpdate?.status === 'complete' && goalUpdate.evidence.trim().length === 0 && lenientAnswer.length > 0) {
|
|
1025
|
-
goalUpdate.evidence =
|
|
1097
|
+
goalUpdate.evidence = `${lenientScope === 'status-question' ? '(상태 질문 턴 — 완결 답을 증거로 수용)' : '(자리 운영 턴 — 답을 증거로 수용)'} ${lenientAnswer}`;
|
|
1026
1098
|
debug.log('goal.loop', 'complete-evidence-lenient', {
|
|
1027
1099
|
sessionId: ctx.sessionId, ...runAttribution, iterations, finalChars: lastResult.finalText.length,
|
|
1100
|
+
scope: lenientScope,
|
|
1028
1101
|
}, { level: 'info' });
|
|
1029
1102
|
}
|
|
1030
1103
|
|
|
@@ -1177,6 +1250,60 @@ export async function runGoalLoop(
|
|
|
1177
1250
|
continue;
|
|
1178
1251
|
}
|
|
1179
1252
|
|
|
1253
|
+
// An explicit provider final phase is a bounded terminal signal for a
|
|
1254
|
+
// substantial structured answer outside the coding executor. A finished
|
|
1255
|
+
// report must not reopen tools solely because update_goal was omitted.
|
|
1256
|
+
const structuredFinalAnswer = lastResult.finalPhaseAnswer === true
|
|
1257
|
+
&& getHarnessRole() !== 'executor'
|
|
1258
|
+
&& lastResult.finalText.trim().length >= 1_200
|
|
1259
|
+
&& (lastResult.finalText.match(/^#{1,3}\s+\S+/gm)?.length ?? 0) >= 2
|
|
1260
|
+
&& goalUpdate == null
|
|
1261
|
+
&& rejectedTools.length === 0
|
|
1262
|
+
&& !markerComplete
|
|
1263
|
+
&& !markerBlocked
|
|
1264
|
+
&& runTests.last?.ok !== false
|
|
1265
|
+
&& !seatCapHit;
|
|
1266
|
+
if (structuredFinalAnswer) {
|
|
1267
|
+
debug.log('goal.loop', 'complete', {
|
|
1268
|
+
sessionId: ctx.sessionId, ...runAttribution, iterations, via: 'structured-final-phase',
|
|
1269
|
+
finalChars: lastResult.finalText.length,
|
|
1270
|
+
}, { level: 'info' });
|
|
1271
|
+
return finish(
|
|
1272
|
+
{ finalText: lastResult.finalText, iterations, stopReason: 'goal_complete', goalComplete: true },
|
|
1273
|
+
{ summary: 'Structured answer completed in the provider final phase.', changedFiles: [] },
|
|
1274
|
+
);
|
|
1275
|
+
}
|
|
1276
|
+
|
|
1277
|
+
// ③-5 TUI-FINAL-ANSWER-COMPLETION(S5) — 단순 상태 질문 턴의 완결한 최종 답 = 그 턴의 목표 달성이다.
|
|
1278
|
+
// structuredFinalAnswer 가 «대형 보고서»의 종결 신호라면, 이것은 그 «한 줄 답» 짝이다. «완료 신호는
|
|
1279
|
+
// update_goal 호출뿐»이라는 계약은 실제 골 턴(코딩·자리 운영·쓰기)의 것이다 — 상태 질문 턴에 그대로
|
|
1280
|
+
// 밀면 완결 답 뒤에 불필요한 update_goal 재촉이 이어붙고 빈 턴이 [NO FINAL SYNTHESIS] 로 떨어져
|
|
1281
|
+
// 최종 답이 비었다(10-12 S5-01 실측 · 0.2.28 TUI-NO-SYNTH-FALLBACK은 그 빈 답의 사람 말 안내일 뿐).
|
|
1282
|
+
// 결정론 분류(statusQuestionTurn) 턴에서 이번 반복이 도구·신호 없이 완결 답으로 끝났으면 추가 골
|
|
1283
|
+
// 도구 0으로 종결한다. 미완 보고형(isInterimReportShaped)과 [NO FINAL SYNTHESIS] 안내 문면은 완결 답이 아니다.
|
|
1284
|
+
const statusQuestionFinalAnswer = statusQuestionTurn
|
|
1285
|
+
&& getHarnessRole() !== 'executor'
|
|
1286
|
+
&& goalUpdate == null
|
|
1287
|
+
&& rejectedTools.length === 0
|
|
1288
|
+
&& !markerComplete
|
|
1289
|
+
&& !markerBlocked
|
|
1290
|
+
&& runTests.last?.ok !== false
|
|
1291
|
+
&& !seatCapHit
|
|
1292
|
+
&& lastResult.stopReason === 'end_turn'
|
|
1293
|
+
&& lastResult.finalText.trim().length > 0
|
|
1294
|
+
&& !isInterimReportShaped(lastResult.finalText)
|
|
1295
|
+
&& !lastResult.finalText.includes('[NO FINAL SYNTHESIS]');
|
|
1296
|
+
if (statusQuestionFinalAnswer) {
|
|
1297
|
+
debug.log('goal.loop', 'complete', {
|
|
1298
|
+
sessionId: ctx.sessionId, ...runAttribution, iterations, via: 'status-question-final-answer',
|
|
1299
|
+
finalChars: lastResult.finalText.length,
|
|
1300
|
+
}, { level: 'info' });
|
|
1301
|
+
return finish(
|
|
1302
|
+
{ finalText: lastResult.finalText, iterations, stopReason: 'goal_complete', goalComplete: true },
|
|
1303
|
+
{ summary: '상태 질문 턴 완결 답 종결 — 추가 골 도구 0 (TUI-FINAL-ANSWER-COMPLETION S5)', changedFiles: [] },
|
|
1304
|
+
);
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1180
1307
|
// ② blocked(구조화 or 마커) — 3연속(hysteresis)일 때만 수용(조기 give-up 방지).
|
|
1181
1308
|
if (goalUpdate?.status === 'blocked' || markerBlocked) {
|
|
1182
1309
|
blockedStreak += 1;
|
|
@@ -1244,7 +1371,24 @@ export async function runGoalLoop(
|
|
|
1244
1371
|
|
|
1245
1372
|
// ④ 순수 텍스트(도구 없음)로 끝났고 종결 신호도 없음 = 일상 답변(목표성 작업 아님).
|
|
1246
1373
|
// 재주입하지 않고 그대로 수용해 trivial chat 을 이중 루프하지 않는다.
|
|
1374
|
+
// TUI-FINAL-ANSWER-COMPLETION(S5) — 단 하나의 예외: «단순 상태 질문» 턴의 미완 보고형 답
|
|
1375
|
+
// (예: 「아직 확인하지 못했습니다」)은 유효한 최종 답이 아니다. 런당 1회만 continuation 을
|
|
1376
|
+
// 재주입해 답을 완성하게 한다(④-0b «런당 1회» 관례와 같은 상한). 두 번째에도 그 모양이면
|
|
1377
|
+
// 이곳의 수용으로 그대로 끝난다 — 이중 루프 방지·maxIterations 하드캡 불변.
|
|
1247
1378
|
if (!toolActivity) {
|
|
1379
|
+
if (statusQuestionTurn
|
|
1380
|
+
&& !seatCapHit
|
|
1381
|
+
&& lastResult.finalText.trim().length > 0
|
|
1382
|
+
&& isInterimReportShaped(lastResult.finalText)
|
|
1383
|
+
&& !lastResult.finalText.includes('[NO FINAL SYNTHESIS]')
|
|
1384
|
+
&& !statusQuestionInterimReprompted) {
|
|
1385
|
+
statusQuestionInterimReprompted = true;
|
|
1386
|
+
debug.log('goal.loop', 'status-question-interim-reprompt', {
|
|
1387
|
+
sessionId: ctx.sessionId, ...runAttribution, iterations, finalChars: lastResult.finalText.length,
|
|
1388
|
+
}, { level: 'info' });
|
|
1389
|
+
reinject(GOAL_CONTINUATION_PROMPT);
|
|
1390
|
+
continue;
|
|
1391
|
+
}
|
|
1248
1392
|
debug.log('goal.loop', 'text-only-accept', { sessionId: ctx.sessionId, ...runAttribution, iterations }, { level: 'info' });
|
|
1249
1393
|
return finish({ finalText: lastResult.finalText, iterations, stopReason: lastResult.stopReason, goalComplete: false });
|
|
1250
1394
|
}
|
package/src/core-turn/types.ts
CHANGED
|
@@ -84,6 +84,8 @@ export interface CoreTurnCallbacks {
|
|
|
84
84
|
/** Streaming text delta — `full` is the accumulated text across the
|
|
85
85
|
* entire turn (not just the current round). */
|
|
86
86
|
onText?(delta: string, full: string): void;
|
|
87
|
+
/** Transient runtime status (for example, a stream retry notice). */
|
|
88
|
+
onStatus?(line: string): void;
|
|
87
89
|
/** The final answer came back enriched with a runtime verification
|
|
88
90
|
* supplement — forwarded from `StreamWithToolsHandlers.onFinalAnswerSupplement`. */
|
|
89
91
|
onFinalAnswerSupplement?(info: { answer: string; supplement: string; finalText: string }): void;
|
|
@@ -142,6 +144,9 @@ export interface CoreTurnContext {
|
|
|
142
144
|
surfaceProfile?: import('../session-runtime/index.js').SessionSurfaceProfile;
|
|
143
145
|
/** Full prompt (system + history + current user blocks). */
|
|
144
146
|
messages: LLMMessage[];
|
|
147
|
+
/** Optional provider request-size hook. Only providers with a measured
|
|
148
|
+
* serializer consume it; all others retain their existing request path. */
|
|
149
|
+
requestSizeGuard?: LLMOpts['requestSizeGuard'];
|
|
145
150
|
/** Tool catalog the model may call this turn. Empty array means
|
|
146
151
|
* "text-only" — the loop delegates to plain `streamLLM`. */
|
|
147
152
|
tools: LLMToolSpec[];
|
|
@@ -166,6 +171,8 @@ export interface CoreTurnContext {
|
|
|
166
171
|
/** TUI-H1-GOALLOOP-EMPTY-TAIL — 이 턴 «앞»에 사람에게 답을 이미 보였다. `streamLLMWithTools` 의
|
|
167
172
|
* `terminalPriorAnswerVisible` 로 그대로 간다(종결 신호 뒤 빈 턴 = 경고 없이 빈 답). goal loop 가 넣는다. */
|
|
168
173
|
terminalPriorAnswerVisible?: LLMOpts['terminalPriorAnswerVisible'];
|
|
174
|
+
/** Only a structurally valid goal completion may stop before the next provider request. */
|
|
175
|
+
terminalCompletionAccepted?: LLMOpts['terminalCompletionAccepted'];
|
|
169
176
|
/** Optional model override (forwarded to `streamLLMWithTools`). */
|
|
170
177
|
modelOverride?: string;
|
|
171
178
|
/** TUI-400-AUTOHEAL-FALLBACK — 이 턴을 이 공급자부터 연다(`streamLLMWithTools` `initialProvider` · 폴백은 허용).
|
|
@@ -178,6 +185,8 @@ export interface CoreTurnContext {
|
|
|
178
185
|
export interface CoreTurnResult {
|
|
179
186
|
stopReason: CoreTurnStopReason;
|
|
180
187
|
finalText: string;
|
|
188
|
+
/** The completed provider response explicitly marked its last assistant answer as final. */
|
|
189
|
+
finalPhaseAnswer?: boolean;
|
|
181
190
|
/** `auth_rejected` 일 때만 — 공급자 오류 원문(비밀값 가림). 호스트가 처방 줄에 원문을 붙인다. */
|
|
182
191
|
errorMessage?: string;
|
|
183
192
|
}
|
|
@@ -510,8 +510,8 @@ export class DashboardAcpChat {
|
|
|
510
510
|
const text = c.text as string;
|
|
511
511
|
if (text.length === 0) return;
|
|
512
512
|
this.closeStreamBuffer(sess, 'flush');
|
|
513
|
-
const meta = (update as any)._meta as { reasoning?: unknown } | undefined;
|
|
514
|
-
const isReasoning = meta?.reasoning === true;
|
|
513
|
+
const meta = (update as any)._meta as { reasoning?: unknown; status?: unknown } | undefined;
|
|
514
|
+
const isReasoning = meta?.status !== true && meta?.reasoning === true;
|
|
515
515
|
if (handlers.pushThought) {
|
|
516
516
|
handlers.pushThought(text, isReasoning);
|
|
517
517
|
} else {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Key } from '../tui.js';
|
|
2
|
+
|
|
3
|
+
export function isClassicSigquitChord(key: Key): boolean {
|
|
4
|
+
return !!key.ctrl && !key.shift && !key.alt
|
|
5
|
+
&& (key.name === '\\' || key.name === 'backslash');
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/** Routes SIGQUIT to the active classic dashboard without terminating it. */
|
|
9
|
+
export function registerClassicSigquitHandler(
|
|
10
|
+
onSigquit: () => void,
|
|
11
|
+
signals: Pick<NodeJS.Process, 'on' | 'removeListener'> = process,
|
|
12
|
+
): () => void {
|
|
13
|
+
const handler = (): void => { onSigquit(); };
|
|
14
|
+
signals.on('SIGQUIT', handler);
|
|
15
|
+
return () => { signals.removeListener('SIGQUIT', handler); };
|
|
16
|
+
}
|