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/scripts/tui-regress.ts
CHANGED
|
@@ -4,20 +4,37 @@
|
|
|
4
4
|
//
|
|
5
5
|
// ⛔ Not under `bun test`: a real PTY of the real TUI is outside the test gate (NODE_ENV=test turns the PTY
|
|
6
6
|
// manifest off, and the run takes ~1 minute). Each check gets a fresh temp config/state dir and its own PTY;
|
|
7
|
-
//
|
|
7
|
+
// the temporary config/state directory is removed when the check ends. Failed checks preserve their screens and
|
|
8
|
+
// effective config under TUI_REGRESS_ARTIFACTS (or the default temp artifact root) for diagnosis.
|
|
8
9
|
import { spawnSync } from 'node:child_process';
|
|
10
|
+
import { randomUUID } from 'node:crypto';
|
|
9
11
|
import { mkdtempSync, rmSync } from 'node:fs';
|
|
10
12
|
import { tmpdir } from 'node:os';
|
|
11
13
|
import { join } from 'node:path';
|
|
12
14
|
import { startPty } from '../src/pty-shell/registry.js';
|
|
13
|
-
import { ERASE, TUI_REGRESS_CHECKS, type TuiCheck, type Verdict } from './lib/tui-regress-checks.js';
|
|
15
|
+
import { ERASE, inputRow, TUI_REGRESS_CHECKS, type TuiCheck, type Verdict } from './lib/tui-regress-checks.js';
|
|
16
|
+
import { preserveTuiRegressFailure } from './lib/tui-regress-evidence.js';
|
|
17
|
+
import { debug } from '../src/debug/log.js';
|
|
18
|
+
import { registerStandaloneLogSink } from '../src/domains/standalone-log-sink.js';
|
|
14
19
|
|
|
15
20
|
const COLS = 160;
|
|
16
21
|
const ROWS = 50;
|
|
17
|
-
const
|
|
22
|
+
const BOOT_TIMEOUT_MS = 60_000;
|
|
23
|
+
const BOOT_POLL_MS = 200;
|
|
24
|
+
const RUN_EVENT = 'tui-regress.completed';
|
|
18
25
|
const sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));
|
|
26
|
+
type TuiRegressResult = Verdict & { bootMs: number };
|
|
19
27
|
|
|
20
|
-
async function
|
|
28
|
+
async function waitForInputPrompt(handle: ReturnType<typeof startPty>): Promise<number> {
|
|
29
|
+
const startedAt = Date.now();
|
|
30
|
+
while (Date.now() - startedAt < BOOT_TIMEOUT_MS) {
|
|
31
|
+
if (inputRow(await handle.renderScreen())) return Date.now() - startedAt;
|
|
32
|
+
await sleep(BOOT_POLL_MS);
|
|
33
|
+
}
|
|
34
|
+
throw new Error(`TUI 입력 프롬프트 준비 시간 초과 (${BOOT_TIMEOUT_MS}ms)`);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function runCheck(check: TuiCheck, runId: string, verificationCommand: string): Promise<TuiRegressResult> {
|
|
21
38
|
const dir = mkdtempSync(join(tmpdir(), `tui-regress-${check.id}-`));
|
|
22
39
|
const cli = join(import.meta.dir, '..', 'bin', 'elanous.mjs');
|
|
23
40
|
if (check.role && check.role !== 'owner') {
|
|
@@ -32,8 +49,13 @@ async function runCheck(check: TuiCheck): Promise<Verdict> {
|
|
|
32
49
|
env: { ...process.env, ELANOUS_DRIVE_TUI: '1', ELANOUS_STATE_DIR: dir },
|
|
33
50
|
});
|
|
34
51
|
const snaps: Record<string, string> = {};
|
|
52
|
+
let bootMs = 0;
|
|
53
|
+
let bootStartedAt = Date.now();
|
|
54
|
+
let bootComplete = false;
|
|
35
55
|
try {
|
|
36
|
-
|
|
56
|
+
bootStartedAt = Date.now();
|
|
57
|
+
bootMs = await waitForInputPrompt(handle);
|
|
58
|
+
bootComplete = true;
|
|
37
59
|
for (const step of check.steps) {
|
|
38
60
|
if (step.kind === 'type') handle.write(step.text);
|
|
39
61
|
else if (step.kind === 'key') handle.write(step.data);
|
|
@@ -43,9 +65,52 @@ async function runCheck(check: TuiCheck): Promise<Verdict> {
|
|
|
43
65
|
}
|
|
44
66
|
// TUI_REGRESS_DUMP=<id> prints that check's screens (to see why a verdict failed).
|
|
45
67
|
if (!json && process.env.TUI_REGRESS_DUMP === check.id) for (const [k, v] of Object.entries(snaps)) console.log(`--- ${check.id}:${k}\n${v.split('\n').filter((l) => l.trim()).join('\n')}`);
|
|
46
|
-
|
|
68
|
+
const verdict = check.judge(snaps);
|
|
69
|
+
if (!verdict.ok) {
|
|
70
|
+
const artifactDir = preserveTuiRegressFailure({
|
|
71
|
+
runId,
|
|
72
|
+
event: RUN_EVENT,
|
|
73
|
+
verificationCommand,
|
|
74
|
+
artifactRoot: process.env.TUI_REGRESS_ARTIFACTS || join(tmpdir(), 'elanous-tui-regress-failures'),
|
|
75
|
+
configDir: dir,
|
|
76
|
+
check: { id: check.id, title: check.title, role: check.role ?? 'owner' },
|
|
77
|
+
screens: snaps,
|
|
78
|
+
pty: { cols: COLS, rows: ROWS, bootMs },
|
|
79
|
+
environment: {
|
|
80
|
+
driveTui: '1',
|
|
81
|
+
nodeEnv: process.env.NODE_ENV ?? null,
|
|
82
|
+
credentialVariablesPresent: Object.keys(process.env).filter((key) => /API.?KEY|TOKEN|SECRET|CREDENTIAL/i.test(key)),
|
|
83
|
+
},
|
|
84
|
+
verdict,
|
|
85
|
+
});
|
|
86
|
+
return { ...verdict, bootMs, reason: `${verdict.reason} · 증거 보존: ${artifactDir}` };
|
|
87
|
+
}
|
|
88
|
+
return { ...verdict, bootMs };
|
|
47
89
|
} catch (error) {
|
|
48
|
-
|
|
90
|
+
if (!bootComplete) bootMs = Date.now() - bootStartedAt;
|
|
91
|
+
const verdict: Verdict = { ok: false, reason: `실행 오류: ${String(error).slice(0, 120)}` };
|
|
92
|
+
try { snaps.failure = await handle.renderScreen(); } catch { /* PTY may already be gone */ }
|
|
93
|
+
try {
|
|
94
|
+
const artifactDir = preserveTuiRegressFailure({
|
|
95
|
+
runId,
|
|
96
|
+
event: RUN_EVENT,
|
|
97
|
+
verificationCommand,
|
|
98
|
+
artifactRoot: process.env.TUI_REGRESS_ARTIFACTS || join(tmpdir(), 'elanous-tui-regress-failures'),
|
|
99
|
+
configDir: dir,
|
|
100
|
+
check: { id: check.id, title: check.title, role: check.role ?? 'owner' },
|
|
101
|
+
screens: snaps,
|
|
102
|
+
pty: { cols: COLS, rows: ROWS, bootMs },
|
|
103
|
+
environment: {
|
|
104
|
+
driveTui: '1',
|
|
105
|
+
nodeEnv: process.env.NODE_ENV ?? null,
|
|
106
|
+
credentialVariablesPresent: Object.keys(process.env).filter((key) => /API.?KEY|TOKEN|SECRET|CREDENTIAL/i.test(key)),
|
|
107
|
+
},
|
|
108
|
+
verdict,
|
|
109
|
+
});
|
|
110
|
+
return { ...verdict, bootMs, reason: `${verdict.reason} · 증거 보존: ${artifactDir}` };
|
|
111
|
+
} catch (preserveError) {
|
|
112
|
+
return { ...verdict, bootMs, reason: `${verdict.reason} · 증거 보존 실패: ${String(preserveError).slice(0, 120)}` };
|
|
113
|
+
}
|
|
49
114
|
} finally {
|
|
50
115
|
try { handle.kill('SIGKILL'); } catch { /* already gone */ }
|
|
51
116
|
rmSync(dir, { recursive: true, force: true });
|
|
@@ -58,14 +123,24 @@ const only = onlyArg >= 0 ? new Set((args[onlyArg + 1] ?? '').split(',').map((s)
|
|
|
58
123
|
const json = args.includes('--json');
|
|
59
124
|
const checks = TUI_REGRESS_CHECKS.filter((check) => !only || only.has(check.id));
|
|
60
125
|
if (checks.length === 0) { console.error('tui-regress: 고른 칸이 없다 (--only 확인)'); process.exit(2); }
|
|
126
|
+
const runId = `run-${randomUUID()}`;
|
|
127
|
+
const verificationCommand = `bun scripts/tui-regress.ts${only ? ` --only ${[...only].join(',')}` : ''} --json`;
|
|
128
|
+
await registerStandaloneLogSink('tui-regress');
|
|
61
129
|
|
|
62
|
-
const results: { id: string; title: string; ok: boolean; reason: string }[] = [];
|
|
130
|
+
const results: { id: string; title: string; ok: boolean; reason: string; bootMs: number }[] = [];
|
|
63
131
|
for (const check of checks) {
|
|
64
|
-
const verdict = await runCheck(check);
|
|
132
|
+
const verdict = await runCheck(check, runId, verificationCommand);
|
|
65
133
|
results.push({ id: check.id, title: check.title, ...verdict });
|
|
66
134
|
if (!json) console.log(`${check.id} ${verdict.ok ? '✅' : '❌'} ${check.title} — ${verdict.reason}`);
|
|
67
135
|
}
|
|
68
136
|
const fail = results.filter((r) => !r.ok).length;
|
|
69
|
-
|
|
137
|
+
debug.log('tui-regress', RUN_EVENT, {
|
|
138
|
+
runId,
|
|
139
|
+
verificationCommand,
|
|
140
|
+
outcome: fail === 0 ? 'pass' : 'fail',
|
|
141
|
+
results: results.map(({ id, ok, bootMs }) => ({ id, ok, bootMs })),
|
|
142
|
+
});
|
|
143
|
+
debug.flush();
|
|
144
|
+
if (json) console.log(JSON.stringify({ runId, event: RUN_EVENT, verificationCommand, results, pass: results.length - fail, fail }));
|
|
70
145
|
else console.log(`tui-regress: pass ${results.length - fail} · fail ${fail}`);
|
|
71
146
|
process.exit(fail ? 1 : 0);
|
|
@@ -369,6 +369,8 @@ export function bridgeCoreTurnToAcp(
|
|
|
369
369
|
const runTurnDispatch = (c: CoreTurnContext): Promise<unknown> =>
|
|
370
370
|
armGoalLoop
|
|
371
371
|
? runGoalLoop(c, {
|
|
372
|
+
// ACP owns an interactive provider loop: keep its post-completion response contract.
|
|
373
|
+
terminalCompletionShortcut: false,
|
|
372
374
|
...(goalLoopCfg?.maxIterations !== undefined ? { maxIterations: goalLoopCfg.maxIterations } : {}),
|
|
373
375
|
// #29 처방 — 자리 판정으로 goal loop 에 «되돌아온» 턴만 빈 evidence 완료를 답으로 받는다.
|
|
374
376
|
...(route.reason.startsWith('seat-') ? { lenientCompletionEvidence: true } : {}),
|
|
@@ -434,6 +436,12 @@ export function bridgeCoreTurnToAcp(
|
|
|
434
436
|
...(maxToolTurns !== undefined ? { maxToolTurns } : {}),
|
|
435
437
|
...((!factQuestion || explicitMaxToolTurns !== undefined) && deps.budgetGrant !== undefined ? { budgetGrant: deps.budgetGrant } : {}),
|
|
436
438
|
callbacks: {
|
|
439
|
+
onStatus: (line) => {
|
|
440
|
+
void turnCtx.pushSessionUpdate(
|
|
441
|
+
{ sessionUpdate: 'agent_thought_chunk', content: { type: 'text', text: line } },
|
|
442
|
+
{ status: true },
|
|
443
|
+
);
|
|
444
|
+
},
|
|
437
445
|
onGoalInterim: (text) => {
|
|
438
446
|
void turnCtx.pushSessionUpdate(
|
|
439
447
|
{ sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: '' } },
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
// 콜백으로 위임(tgChat/dcChannel 정체성은 서피스가 소유).
|
|
14
14
|
|
|
15
15
|
import { buildDelegateAgentTool, dispatchDelegateAgent } from '../boot/daemon-tools/delegate-agent.js';
|
|
16
|
-
import { buildSelfImplementDaemonSpec, dispatchSelfImplement } from '../boot/daemon-tools/self-implement.js';
|
|
16
|
+
import { buildSelfImplementDaemonSpec, dispatchSelfImplement, dispatchSelfImplementManaged } from '../boot/daemon-tools/self-implement.js';
|
|
17
17
|
// ⛔ 잎 모듈에서 받는다 — 순환 import TDZ 를 «구조적으로» 없앤 자리(`self-implement-names.ts` 머리말).
|
|
18
18
|
import { SELF_IMPLEMENT_TOOL_NAMES } from '../boot/daemon-tools/self-implement-names.js';
|
|
19
19
|
import { dispatchRelayShellPrompt } from '../skills/tools/relay-shell.js';
|
|
@@ -80,6 +80,9 @@ export function buildAutonomousToolSpecs(): LLMToolSpec[] {
|
|
|
80
80
|
export interface AutonomousToolTurnCtx {
|
|
81
81
|
cwd: string;
|
|
82
82
|
signal: AbortSignal;
|
|
83
|
+
/** Core-turn identity used to make a managed SelfImplement admission retry-safe. */
|
|
84
|
+
sessionId?: string;
|
|
85
|
+
toolCallId?: string;
|
|
83
86
|
surfaceHitlChannels?: ConfirmChannel[];
|
|
84
87
|
surfaceQuestionChannels?: QuestionChannel[];
|
|
85
88
|
surfaceFileSink?: FileSink;
|
|
@@ -139,18 +142,22 @@ export async function dispatchAutonomousTool(
|
|
|
139
142
|
const hctx = {
|
|
140
143
|
cwd: ctx.cwd,
|
|
141
144
|
signal: ctx.signal,
|
|
145
|
+
...(ctx.sessionId ? { sessionId: ctx.sessionId } : {}),
|
|
146
|
+
...(ctx.toolCallId ? { toolCallId: ctx.toolCallId } : {}),
|
|
142
147
|
...(ctx.userText ? { userText: ctx.userText } : {}),
|
|
143
148
|
...(surfaceChannels ? { surfaceHitlChannels: surfaceChannels } : {}),
|
|
144
149
|
...(surfaceQuestionChannels ? { surfaceQuestionChannels } : {}),
|
|
145
150
|
...(surfaceFileSink ? { surfaceFileSink } : {}),
|
|
146
151
|
...(ctx.emitFeedback ? { emitFeedback: ctx.emitFeedback } : {}), // start-ack/진행 push
|
|
147
152
|
};
|
|
148
|
-
const dispatch = ctx.selfImplementDispatch
|
|
153
|
+
const dispatch = ctx.selfImplementDispatch;
|
|
149
154
|
return wrapAutonomousTool(
|
|
150
155
|
{
|
|
151
156
|
toolNames: SELF_IMPLEMENT_TOOL_NAMES as readonly string[],
|
|
152
157
|
label: 'SelfImplement',
|
|
153
|
-
run: () => dispatch
|
|
158
|
+
run: () => dispatch
|
|
159
|
+
? dispatch(args, hctx as Parameters<typeof dispatchSelfImplement>[1])
|
|
160
|
+
: dispatchSelfImplementManaged(args, hctx as Parameters<typeof dispatchSelfImplementManaged>[1]),
|
|
154
161
|
},
|
|
155
162
|
args,
|
|
156
163
|
hctx,
|
|
@@ -18,6 +18,7 @@ import { existsSync } from 'node:fs';
|
|
|
18
18
|
import type { UserConfig } from '../user-config.js';
|
|
19
19
|
import { runTurn, type RunTurnOpts } from '../session/chat.js';
|
|
20
20
|
import type { SessionSource } from '../session/index.js';
|
|
21
|
+
import type { CoreTurnDispatchTool } from '../core-turn/index.js';
|
|
21
22
|
import { buildContinuationAgentTools } from '../dispatch/continuation-turn-runner.js';
|
|
22
23
|
import { buildTerminalCapableTurn } from './terminal-surface.js';
|
|
23
24
|
// ★ turn 조립기 통일 Phase 1(2026-07-22) — 자율tool 5종(delegate·SelfImplement·RelayShell·RunDevHarness·
|
|
@@ -202,7 +203,7 @@ export function makeElanousAgentRunTurn(cfg: UserConfig, surface: SessionSource,
|
|
|
202
203
|
// Track whether the turn handed off to an ACP delegate — the footer then
|
|
203
204
|
// reads acp-<backend> instead of self·<model>.
|
|
204
205
|
let delegatedBackend: string | undefined;
|
|
205
|
-
const dispatch = async (name
|
|
206
|
+
const dispatch: CoreTurnDispatchTool = async (name, args, dispatchCtx) => {
|
|
206
207
|
// ⭐ 소환기(F2 · 2026-07-26) — 이 서피스도 SelfImplement/RunDevHarness/
|
|
207
208
|
// SolveMission 을 defer 하므로 tier-flip 이 ToolSearch 를 주입한다.
|
|
208
209
|
// 라우팅이 없으면 모델이 소환을 시도하는 순간 "unknown tool" 이다.
|
|
@@ -217,6 +218,8 @@ export function makeElanousAgentRunTurn(cfg: UserConfig, surface: SessionSource,
|
|
|
217
218
|
// Forward the turn's abort signal (from a /cancel-aware controller) so
|
|
218
219
|
// an in-flight delegation can be cancelled; inert signal otherwise.
|
|
219
220
|
signal: opts.signal ?? new AbortController().signal,
|
|
221
|
+
...(dispatchCtx?.sessionId ? { sessionId: dispatchCtx.sessionId } : {}),
|
|
222
|
+
...(dispatchCtx?.callId ? { toolCallId: dispatchCtx.callId } : {}),
|
|
220
223
|
...(surfaceChannels ? { surfaceHitlChannels: surfaceChannels } : {}),
|
|
221
224
|
...(surfaceQuestionChannels ? { surfaceQuestionChannels } : {}),
|
|
222
225
|
...(surfaceFileSink ? { surfaceFileSink } : {}),
|
package/src/agent/registry.ts
CHANGED
|
@@ -159,9 +159,9 @@ export class AgentRegistry {
|
|
|
159
159
|
* wants to register the task with the registry before deciding
|
|
160
160
|
* whether to run it (e.g., confirmation gate). Always depth=0 —
|
|
161
161
|
* manual register has no parent context. */
|
|
162
|
-
register(definition: AgentDefinition, prompt: string): AgentTask {
|
|
162
|
+
register(definition: AgentDefinition, prompt: string, opts: { id?: string } = {}): AgentTask {
|
|
163
163
|
const task: AgentTask = {
|
|
164
|
-
id: randomUUID(),
|
|
164
|
+
id: opts.id ?? randomUUID(),
|
|
165
165
|
definition,
|
|
166
166
|
prompt,
|
|
167
167
|
depth: 0,
|
|
@@ -176,6 +176,30 @@ export class AgentRegistry {
|
|
|
176
176
|
return task;
|
|
177
177
|
}
|
|
178
178
|
|
|
179
|
+
/** Run a registered non-LLM job under the same observable/cancellable task lifecycle. */
|
|
180
|
+
async runManaged<T>(id: string, runner: (signal: AbortSignal) => Promise<T>, renderResult: (value: T) => string = String): Promise<T> {
|
|
181
|
+
const task = this.tasks.get(id);
|
|
182
|
+
if (!task) throw new Error(`agent task not found: ${id}`);
|
|
183
|
+
if (task.state !== 'pending') throw new Error(`agent task is not pending: ${id} (${task.state})`);
|
|
184
|
+
task.state = 'running';
|
|
185
|
+
task.startedAt = Date.now();
|
|
186
|
+
try {
|
|
187
|
+
const value = await runner(task.controller.signal);
|
|
188
|
+
task.state = task.controller.signal.aborted ? 'aborted' : 'done';
|
|
189
|
+
task.result = renderResult(value);
|
|
190
|
+
return value;
|
|
191
|
+
} catch (error) {
|
|
192
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
193
|
+
if (task.controller.signal.aborted) task.state = 'aborted';
|
|
194
|
+
else { task.state = 'error'; task.error = message; }
|
|
195
|
+
task.result = message;
|
|
196
|
+
throw error;
|
|
197
|
+
} finally {
|
|
198
|
+
task.finishedAt = Date.now();
|
|
199
|
+
this.notifyTaskDone(task);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
179
203
|
get(id: string): AgentTask | undefined {
|
|
180
204
|
return this.tasks.get(id);
|
|
181
205
|
}
|
|
@@ -39,7 +39,7 @@ export function buildSharedAppTools(cfg?: UserConfig): SharedAppTools {
|
|
|
39
39
|
// context(B5) — 기억 조회 같은 긴 코어 도구가 진행 한 줄(emitFeedback)을 낼 수 있게 코어까지 넘긴다.
|
|
40
40
|
const dispatch = async (name: string, args: Record<string, unknown>, context?: ToolRuntimeContext): Promise<unknown> =>
|
|
41
41
|
name === skillsList.name ? dispatchElanousSkillsList(args as ElanousSkillsListArgs) :
|
|
42
|
-
name === skill.id ? skill.run(args as unknown as SkillExecArgs, { surface: 'skill' }) :
|
|
42
|
+
name === skill.id ? skill.run(args as unknown as SkillExecArgs, { surface: context?.surface ?? 'skill', signal: context?.signal }) :
|
|
43
43
|
fin && fin.names.has(name) ? fin.dispatch(name, args) : core.dispatch(name, args, undefined, context);
|
|
44
44
|
return { specs, names, dispatch };
|
|
45
45
|
}
|
|
@@ -75,7 +75,7 @@ function buildSurfaceUx(src: SurfaceUxSource): SurfaceUx {
|
|
|
75
75
|
debug.log('surface-ux.confirm', 'answered', { surface, channel: res.channel, answer: res.answer });
|
|
76
76
|
return res.answer === true;
|
|
77
77
|
},
|
|
78
|
-
async question(req) {
|
|
78
|
+
async question(req, opts) {
|
|
79
79
|
if (!questionChannels || questionChannels.length === 0) {
|
|
80
80
|
debug.log('surface-ux.confirm', 'question', {
|
|
81
81
|
surface,
|
|
@@ -83,8 +83,17 @@ function buildSurfaceUx(src: SurfaceUxSource): SurfaceUx {
|
|
|
83
83
|
});
|
|
84
84
|
return null;
|
|
85
85
|
}
|
|
86
|
-
const res = await requestQuestion({ request: req, channels: questionChannels });
|
|
87
|
-
if (res.channel === '
|
|
86
|
+
const res = await requestQuestion({ request: req, channels: questionChannels, ...(opts?.timeoutMs === undefined ? {} : { timeoutMs: opts.timeoutMs }) });
|
|
87
|
+
if (res.channel === 'timeout') {
|
|
88
|
+
debug.log('surface-ux.confirm', 'question', {
|
|
89
|
+
surface,
|
|
90
|
+
mode: 'timeout',
|
|
91
|
+
elapsedMs: res.elapsedMs,
|
|
92
|
+
timeoutMs: opts?.timeoutMs,
|
|
93
|
+
});
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
if (res.channel === 'all-failed') {
|
|
88
97
|
debug.log('surface-ux.confirm', 'question', {
|
|
89
98
|
surface,
|
|
90
99
|
mode: QUESTION_OBSERVATION_MODE.unanswered,
|
|
@@ -54,7 +54,7 @@ export interface SurfaceUx {
|
|
|
54
54
|
/** HITL 승인(버튼). 채널 없으면 **fail-closed → false**(자동승인 금지·제1원칙). */
|
|
55
55
|
confirm(req: ConfirmRequest): Promise<boolean>;
|
|
56
56
|
/** 구조화 질문(N옵션). 채널 없으면 null(호출자가 default-and-note). */
|
|
57
|
-
question(req: AskUserQuestionRequest): Promise<AskUserQuestionResult | null>;
|
|
57
|
+
question(req: AskUserQuestionRequest, opts?: { timeoutMs?: number }): Promise<AskUserQuestionResult | null>;
|
|
58
58
|
/** 큰 출력 파일 첨부(fire-and-forget · 실패 삼킴). sink 없으면 no-op. */
|
|
59
59
|
spillFile(f: SurfaceSpillFile): void;
|
|
60
60
|
/** 진행 상태 push(비동기·best-effort). emitFeedback 없으면 no-op. */
|
|
@@ -28,11 +28,12 @@ import {
|
|
|
28
28
|
type AgentRegistry,
|
|
29
29
|
} from './registry.js';
|
|
30
30
|
import type { AgentTask } from './types.js';
|
|
31
|
+
import type { RunStopRecord } from '../self-implement/run-stop.js';
|
|
31
32
|
import { globalAgentFlash } from '../display/agent-flash.js';
|
|
32
33
|
import { debug } from '../debug/log.js';
|
|
33
|
-
import {
|
|
34
|
-
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
35
|
-
import { join } from 'node:path';
|
|
34
|
+
import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
35
|
+
import { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
|
|
36
|
+
import { dirname, join } from 'node:path';
|
|
36
37
|
import { randomUUID } from 'node:crypto';
|
|
37
38
|
|
|
38
39
|
/** Max chars of the child's final result we echo in the notification.
|
|
@@ -65,10 +66,15 @@ export interface PendingTaskNotification {
|
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
export class TaskNotificationQueue {
|
|
69
|
+
private readonly persistencePath: string;
|
|
68
70
|
constructor(
|
|
69
|
-
private readonly resultDir = join(
|
|
71
|
+
private readonly resultDir = join(effectiveInstanceRoot(), 'data', 'agent-results'),
|
|
70
72
|
private readonly maxResultChars = 10_000_000,
|
|
71
|
-
|
|
73
|
+
persistencePath?: string,
|
|
74
|
+
) {
|
|
75
|
+
this.persistencePath = persistencePath ?? '';
|
|
76
|
+
if (this.persistencePath) this.restore();
|
|
77
|
+
}
|
|
72
78
|
|
|
73
79
|
private queue: PendingTaskNotification[] = [];
|
|
74
80
|
/** De-dup guard — same task.finishedAt can fire twice if a caller
|
|
@@ -96,6 +102,13 @@ export class TaskNotificationQueue {
|
|
|
96
102
|
return () => { this.wakeListeners.delete(listener); };
|
|
97
103
|
}
|
|
98
104
|
|
|
105
|
+
/** Replay restored pending receipts to one newly installed wake consumer. */
|
|
106
|
+
replayPendingWakes(listener: (n: PendingTaskNotification) => void): void {
|
|
107
|
+
for (const pending of this.queue) {
|
|
108
|
+
try { listener(pending); } catch { /* replay listener isolation */ }
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
99
112
|
enqueue(n: PendingTaskNotification): void {
|
|
100
113
|
if (this.seen.has(n.taskId)) return;
|
|
101
114
|
let pending = n;
|
|
@@ -119,6 +132,7 @@ export class TaskNotificationQueue {
|
|
|
119
132
|
}
|
|
120
133
|
this.seen.add(n.taskId);
|
|
121
134
|
this.queue.push(pending);
|
|
135
|
+
this.persist();
|
|
122
136
|
debug.log('agent.task-notification', 'wake', { taskId: n.taskId, size: this.queue.length });
|
|
123
137
|
for (const listener of this.wakeListeners) {
|
|
124
138
|
try {
|
|
@@ -141,6 +155,7 @@ export class TaskNotificationQueue {
|
|
|
141
155
|
drain(): PendingTaskNotification[] {
|
|
142
156
|
const out = this.queue;
|
|
143
157
|
this.queue = [];
|
|
158
|
+
this.persist();
|
|
144
159
|
// NOTE: we keep `seen` populated so a listener firing a second
|
|
145
160
|
// time for the same task (rare but possible under races) still
|
|
146
161
|
// can't double-inject. `seen` grows unbounded across a session;
|
|
@@ -172,10 +187,64 @@ export class TaskNotificationQueue {
|
|
|
172
187
|
clear(): void {
|
|
173
188
|
this.queue = [];
|
|
174
189
|
this.seen.clear();
|
|
190
|
+
this.persist();
|
|
175
191
|
}
|
|
192
|
+
|
|
193
|
+
private restore(): void {
|
|
194
|
+
try {
|
|
195
|
+
const value: unknown = JSON.parse(readFileSync(this.persistencePath, 'utf8'));
|
|
196
|
+
if (!value || typeof value !== 'object') throw new Error('invalid task notification snapshot');
|
|
197
|
+
const snapshot = value as { version?: number; queue?: PendingTaskNotification[]; seen?: string[] };
|
|
198
|
+
if (snapshot.version !== 1 || !Array.isArray(snapshot.queue) || !Array.isArray(snapshot.seen)) throw new Error('invalid task notification snapshot');
|
|
199
|
+
this.queue = snapshot.queue;
|
|
200
|
+
this.seen = new Set(snapshot.seen);
|
|
201
|
+
} catch (error) {
|
|
202
|
+
if ((error as NodeJS.ErrnoException).code === 'ENOENT') return;
|
|
203
|
+
debug.log('agent.task-notification', 'restore-failed', { path: this.persistencePath, reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' });
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
private persist(): void {
|
|
208
|
+
if (!this.persistencePath) return;
|
|
209
|
+
try {
|
|
210
|
+
mkdirSync(dirname(this.persistencePath), { recursive: true });
|
|
211
|
+
const temp = `${this.persistencePath}.${randomUUID()}.tmp`;
|
|
212
|
+
writeFileSync(temp, `${JSON.stringify({ version: 1, queue: this.queue, seen: [...this.seen] })}\n`, { encoding: 'utf8', flag: 'wx', mode: 0o600 });
|
|
213
|
+
renameSync(temp, this.persistencePath);
|
|
214
|
+
} catch (error) {
|
|
215
|
+
debug.log('agent.task-notification', 'persist-failed', { path: this.persistencePath, reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export function resolveTaskNotificationPaths(instanceRoot = effectiveInstanceRoot()): { resultDir: string; persistencePath: string } {
|
|
221
|
+
const dataDir = process.env.ELANOUS_DATA_DIR?.trim() || join(instanceRoot, 'data');
|
|
222
|
+
return { resultDir: join(dataDir, 'agent-results'), persistencePath: join(dataDir, 'agent-task-notifications.json') };
|
|
176
223
|
}
|
|
177
224
|
|
|
178
|
-
|
|
225
|
+
const taskNotificationPaths = resolveTaskNotificationPaths();
|
|
226
|
+
export const globalTaskNotificationQueue = new TaskNotificationQueue(
|
|
227
|
+
taskNotificationPaths.resultDir, 10_000_000, taskNotificationPaths.persistencePath,
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
/** Wake a parent as soon as a SelfImplement run records its terminal stop, even if post-stop cleanup stalls. */
|
|
231
|
+
export function enqueueSelfImplementRunStopNotification(
|
|
232
|
+
input: { runId: string; taskId: string; feature: string; stop: RunStopRecord },
|
|
233
|
+
queue: TaskNotificationQueue = globalTaskNotificationQueue,
|
|
234
|
+
): void {
|
|
235
|
+
const { runId, taskId, feature, stop } = input;
|
|
236
|
+
queue.enqueue({
|
|
237
|
+
taskId: `self-implement-stop:${runId}:${taskId}`,
|
|
238
|
+
agentName: 'SelfImplement',
|
|
239
|
+
label: feature.slice(0, 80),
|
|
240
|
+
state: 'error',
|
|
241
|
+
output: `SelfImplement run ${runId} stopped (${stop.class}${stop.site ? ` at ${stop.site}` : ''}): ${stop.cause} · next: ${stop.nextMove}`,
|
|
242
|
+
truncated: false,
|
|
243
|
+
errorMessage: stop.cause,
|
|
244
|
+
durationMs: 0,
|
|
245
|
+
finishedAt: Date.now(),
|
|
246
|
+
});
|
|
247
|
+
}
|
|
179
248
|
|
|
180
249
|
// ── Auto-wire background task completion ─────────────────────────────
|
|
181
250
|
//
|
package/src/agent/types.ts
CHANGED
|
@@ -72,6 +72,9 @@ export interface AgentDefinition {
|
|
|
72
72
|
* other than by going through registry methods. */
|
|
73
73
|
export interface AgentTask {
|
|
74
74
|
id: string;
|
|
75
|
+
/** Optional identity links for managed non-LLM jobs hosted by the registry. */
|
|
76
|
+
runId?: string;
|
|
77
|
+
parentSessionId?: string;
|
|
75
78
|
definition: AgentDefinition;
|
|
76
79
|
/** Caller-supplied short label for this specific spawn — distinct
|
|
77
80
|
* from `definition.description` which is the boilerplate stamp
|
|
@@ -31,7 +31,7 @@ import { verdictForFinalPtyScreen } from '../cli/pty-drive-verdict.js';
|
|
|
31
31
|
import { reemitPtyUsage } from '../budget/pty-usage-reemit.js';
|
|
32
32
|
import { classifyAuthError } from '../oauth/codex.js';
|
|
33
33
|
import { normalizeFallbackChain, type FallbackStep } from '../oauth/fallback-chain.js';
|
|
34
|
-
import { runPtyControlLoop, controlDepsForHandle, type ControlDecision, type ControlObservation, type RunSupervisor } from '../autopilot/pty-control-loop.js';
|
|
34
|
+
import { runPtyControlLoop, controlDepsForHandle, VERIFY_DONE_STOP, type ControlDecision, type ControlObservation, type RunSupervisor } from '../autopilot/pty-control-loop.js';
|
|
35
35
|
import { probeControlStance, stanceBlocksWrite } from '../pty-shell/pty-control-stance.js';
|
|
36
36
|
import { mapControlStance, supervisionObservationFields } from '../self-implement/supervision-vocabulary.js';
|
|
37
37
|
import { createLlmControlBrain, type StreamLLMFn } from '../autopilot/llm-control-brain.js';
|
|
@@ -956,6 +956,8 @@ export function createMissionVerifyDone(opts: MissionVerifyDoneOpts): (obs?: Con
|
|
|
956
956
|
|
|
957
957
|
export interface MissionControlBrainOpts {
|
|
958
958
|
readonly mission: string;
|
|
959
|
+
/** When false, the supervisor may observe and verify but must not inject unrequested follow-up text. */
|
|
960
|
+
readonly allowFollowup?: boolean;
|
|
959
961
|
readonly evidenceReady: () => boolean;
|
|
960
962
|
readonly search: (query: string, step?: number) => Promise<void> | void;
|
|
961
963
|
/** PTY에서 실행 중인 에이전트. 미지정 시 기존 codex 기본값을 유지한다. */
|
|
@@ -1039,6 +1041,10 @@ ${opts.handoffEnabled ? ` - "handoff": 다른 담당자로 넘길 때 to(codex/c
|
|
|
1039
1041
|
if (decision.action === 'handoff' && decision.to && decision.mission) return { action: 'handoff', to: decision.to, mission: decision.mission, ...(decision.carry ? { carry: decision.carry } : {}) };
|
|
1040
1042
|
if (decision.action === 'ask-human') return { action: 'ask-human', reason: decision.reason, ...(decision.url ? { url: decision.url } : {}), ...(decision.code ? { code: decision.code } : {}) };
|
|
1041
1043
|
if (decision.action === 'send') {
|
|
1044
|
+
if (opts.allowFollowup === false) {
|
|
1045
|
+
debug.log('agent-mission', 'followup-suppressed', { step: obs.step, reason: 'verbatim mission' });
|
|
1046
|
+
return { action: 'wait' };
|
|
1047
|
+
}
|
|
1042
1048
|
lastCommand = decision.text || 'continue';
|
|
1043
1049
|
return { action: 'input', text: `${lastCommand}\r` };
|
|
1044
1050
|
}
|
|
@@ -1480,6 +1486,7 @@ export async function runAgentMission(spec: AgentMissionSpec, deps: AgentMission
|
|
|
1480
1486
|
const startedAt = Date.now();
|
|
1481
1487
|
const contextOwner = !deps.contextEventRun;
|
|
1482
1488
|
const contextRunId = contextOwner ? ensureRunId() : undefined;
|
|
1489
|
+
const resultRunId = contextRunId ?? ensureRunId();
|
|
1483
1490
|
let contextPrNumber: number | undefined;
|
|
1484
1491
|
const emitContext = (kind: 'task-claimed' | 'task-done', detail: string): void => {
|
|
1485
1492
|
if (!contextOwner) return;
|
|
@@ -1604,7 +1611,13 @@ export async function runAgentMission(spec: AgentMissionSpec, deps: AgentMission
|
|
|
1604
1611
|
}
|
|
1605
1612
|
}
|
|
1606
1613
|
return result;
|
|
1607
|
-
} finally {
|
|
1614
|
+
} finally {
|
|
1615
|
+
if (result?.reason === 'aborted') {
|
|
1616
|
+
try { debug.log('agent-mission', 'result', { runId: resultRunId, ok: false, reason: 'aborted', rounds: result.rounds, committed: false }); }
|
|
1617
|
+
catch { /* a result receipt must not mask the cancellation result */ }
|
|
1618
|
+
}
|
|
1619
|
+
emitContext('task-done', result?.ok ? 'completed' : 'ended');
|
|
1620
|
+
}
|
|
1608
1621
|
}
|
|
1609
1622
|
|
|
1610
1623
|
async function runAgentMissionBody(spec: AgentMissionSpec, deps: AgentMissionDeps, startedAt: number, initialFiles?: ReadonlyMap<string, string>): Promise<AgentMissionResult> {
|
|
@@ -2060,6 +2073,7 @@ async function runAgentMissionBody(spec: AgentMissionSpec, deps: AgentMissionDep
|
|
|
2060
2073
|
const search = createMissionSearch({ worktree: wt.path, omniPath });
|
|
2061
2074
|
const brain = createMissionControlBrain({
|
|
2062
2075
|
mission: spec.mission,
|
|
2076
|
+
allowFollowup: spec.enhance !== false,
|
|
2063
2077
|
backend,
|
|
2064
2078
|
stream: deps.controlStream,
|
|
2065
2079
|
handoffEnabled: true,
|
|
@@ -2236,6 +2250,10 @@ async function runAgentMissionBody(spec: AgentMissionSpec, deps: AgentMissionDep
|
|
|
2236
2250
|
},
|
|
2237
2251
|
verifyDone: spec.chain && spec.chain.length > 1 ? async () => ({ ok: true as const }) : async (obs) => {
|
|
2238
2252
|
const verdict = await verifyDone(obs);
|
|
2253
|
+
if (!verdict.ok && spec.enhance === false) {
|
|
2254
|
+
decisionEvent({ step: 'recover', text: 'Evidence check failed; retry disabled for verbatim mission', detail: { blocked: verdict.retry, action: 'Stop without modifying the mission' } });
|
|
2255
|
+
return { ...verdict, stop: VERIFY_DONE_STOP };
|
|
2256
|
+
}
|
|
2239
2257
|
if (!verdict.ok) decisionEvent({ step: 'recover', text: 'Evidence check requires another attempt', detail: { blocked: verdict.retry, action: 'Retry after fixing evidence' } });
|
|
2240
2258
|
return verdict;
|
|
2241
2259
|
},
|
|
@@ -2347,9 +2365,17 @@ async function runAgentMissionBody(spec: AgentMissionSpec, deps: AgentMissionDep
|
|
|
2347
2365
|
stopLive();
|
|
2348
2366
|
throw new Error('AGENT_YIELDED: PTY 제어가 사람에게 이양됨(takeover) — 자율 미션 중단');
|
|
2349
2367
|
}
|
|
2350
|
-
|
|
2351
2368
|
if (deps.isMissionAborted?.()) return { ok: false, reason: 'aborted', worktree: wt.path, branch: wt.branch,
|
|
2352
2369
|
rounds: round, evidencePath: null, committed: false, usedOmniCrawl: usedOmni, detail: 'aborted' };
|
|
2370
|
+
|
|
2371
|
+
if (control.termination.kind === 'error' && control.termination.code === VERIFY_DONE_STOP) {
|
|
2372
|
+
stopLive();
|
|
2373
|
+
if (h.pid) await (deps.terminateProcessTree ?? terminateMissionProcessTree)(h.pid);
|
|
2374
|
+
try { h.kill(); } catch { /* noop */ }
|
|
2375
|
+
if (backend.name === 'claude') cleanupClaude();
|
|
2376
|
+
return { ok: false, worktree: wt.path, branch: wt.branch,
|
|
2377
|
+
rounds: round, evidencePath: null, evidenceSatisfied: false, committed: false, usedOmniCrawl: usedOmni, detail: control.termination.message };
|
|
2378
|
+
}
|
|
2353
2379
|
const finalEv = verifyEvidence(wt.path, spec.evidence);
|
|
2354
2380
|
const finalScreen = await h.renderScreen();
|
|
2355
2381
|
const driveVerdict = verdictForFinalPtyScreen({ screen: finalScreen, inputHistory: submittedInputs, exitCode: h.exitCode ?? null, artifactEvidence: finalEv.ok });
|
|
@@ -33,6 +33,7 @@ export interface MissionCliOpts {
|
|
|
33
33
|
|
|
34
34
|
export interface MissionCliDeps {
|
|
35
35
|
resolveBackend: (name?: string) => AgentBackend;
|
|
36
|
+
signal?: AbortSignal;
|
|
36
37
|
readFile?: (path: string) => string;
|
|
37
38
|
runDevPipeline?: typeof runDevPipeline;
|
|
38
39
|
}
|
|
@@ -115,7 +116,7 @@ export async function runAgentMissionCliCommand(
|
|
|
115
116
|
});
|
|
116
117
|
const { result, exitCode } = await executeAgentMissionReroute(
|
|
117
118
|
spec, agentBackend,
|
|
118
|
-
deps.runDevPipeline ? { runDevPipeline: deps.runDevPipeline } :
|
|
119
|
+
{ ...(deps.runDevPipeline ? { runDevPipeline: deps.runDevPipeline } : {}), ...(deps.signal ? { signal: deps.signal } : {}) },
|
|
119
120
|
);
|
|
120
121
|
return { ok: true, result, exitCode };
|
|
121
122
|
}
|