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
|
@@ -97,6 +97,7 @@ export function remoteSelfGateArgv(input: {
|
|
|
97
97
|
shardConcurrency?: number;
|
|
98
98
|
fixedShardDistribution?: boolean;
|
|
99
99
|
includeImporters?: boolean;
|
|
100
|
+
noInherit?: boolean;
|
|
100
101
|
artifactDir?: string;
|
|
101
102
|
}, sha: (ref: string) => string): string[] {
|
|
102
103
|
const shards = input.shards ?? (input.includeImporters ? 2 : undefined);
|
|
@@ -106,6 +107,7 @@ export function remoteSelfGateArgv(input: {
|
|
|
106
107
|
...(input.shardConcurrency !== undefined ? ['--shard-concurrency', String(input.shardConcurrency)] : []),
|
|
107
108
|
...(input.fixedShardDistribution ? ['--fixed-shard-distribution'] : []),
|
|
108
109
|
...(input.includeImporters ? ['--include-importers'] : []),
|
|
110
|
+
...(input.noInherit ? ['--no-inherit'] : []),
|
|
109
111
|
...(input.artifactDir ? ['--artifact-dir', input.artifactDir] : [])];
|
|
110
112
|
}
|
|
111
113
|
|
|
@@ -131,6 +133,8 @@ export function decideGateDispatch(input: { flags: Pick<GateRemoteFlags, 'remote
|
|
|
131
133
|
|
|
132
134
|
export const SLOT_DIR = '/tmp/elanous-gate-remote-slots';
|
|
133
135
|
const BUSY = '__GATE_REMOTE_BUSY';
|
|
136
|
+
const HEARTBEAT = '__GATE_REMOTE_HEARTBEAT=';
|
|
137
|
+
const REMOTE_RUN_LIMIT_SECONDS = 105 * 60;
|
|
134
138
|
|
|
135
139
|
/** Shell lines that run "$W/run.sh" under the first free of `cap` slot locks, or print the busy marker and exit 98.
|
|
136
140
|
* run.sh must create "$W/started" first: that is how a lock refusal is told apart from the run's own exit code. */
|
|
@@ -138,14 +142,14 @@ export type SlotLockTool = 'flock' | 'lockf';
|
|
|
138
142
|
const SLOT_LOCK = { flock: 'flock -n', lockf: 'lockf -k -s -t 0' } as const;
|
|
139
143
|
|
|
140
144
|
/** `tools` is the preference order (default: Linux flock, then BSD/macOS lockf); a test can pin one path. */
|
|
141
|
-
function hostSlotScriptWithSlot(cap: number, dir: string, tools: readonly SlotLockTool[], passSlot: boolean): string[] {
|
|
145
|
+
function hostSlotScriptWithSlot(cap: number, dir: string, tools: readonly SlotLockTool[], passSlot: boolean, supervised = false): string[] {
|
|
142
146
|
const n = Math.min(MAX_HOST_CAP, Math.max(1, Math.floor(cap)));
|
|
143
147
|
const pick = tools.map((tool, i) => `${i ? 'elif' : 'if'} command -v ${tool} >/dev/null 2>&1; then GL="${SLOT_LOCK[tool]}"; `).join('');
|
|
144
148
|
return [
|
|
145
149
|
`GS=${quote(dir)}; mkdir -p "$GS" || infra slots`,
|
|
146
150
|
`${pick}else infra lock-tool; fi`,
|
|
147
151
|
'load1() { if [ -r /proc/loadavg ]; then awk \'NR==1 {print $1}\' /proc/loadavg; elif command -v sysctl >/dev/null 2>&1; then sysctl -n vm.loadavg 2>/dev/null | awk \'{gsub(/[{}]/, ""); print $1}\'; else echo unknown; fi; }',
|
|
148
|
-
`n=1; while [ $n -le ${n} ]; do $GL "$GS/slot$n" ${passSlot ? 'env GATE_REMOTE_SLOT="$n" ' : ''}sh "$W
|
|
152
|
+
`n=1; while [ $n -le ${n} ]; do $GL "$GS/slot$n" ${passSlot ? 'env GATE_REMOTE_SLOT="$n" ' : ''}sh "$W/${supervised ? 'supervise.sh' : 'run.sh'}"; s=$?; ${supervised ? '[ -f "$W/supervisor-timeout" ] && infra run-timeout; [ -f "$W/supervisor-infra" ] && infra supervisor-lost; ' : ''}[ -f "$W/started" ] && exit $s; n=$((n+1)); done`,
|
|
149
153
|
`echo "${BUSY}=$((n-1));load1=$(load1)" >&2; exit 98`,
|
|
150
154
|
];
|
|
151
155
|
}
|
|
@@ -154,6 +158,53 @@ export function hostSlotScript(cap: number, dir = SLOT_DIR, tools: readonly Slot
|
|
|
154
158
|
return hostSlotScriptWithSlot(cap, dir, tools, false);
|
|
155
159
|
}
|
|
156
160
|
|
|
161
|
+
/** A slot holder owns exactly one new process group. On a lost SSH shell or wall limit it signals only that group,
|
|
162
|
+
* after checking its unreaped direct child's PGID. The heartbeat also detects a severed SSH output pipe while
|
|
163
|
+
* a silent test is running; runOnRemote removes only these transport lines from the tool's stderr. */
|
|
164
|
+
export function remoteSupervisorScript(limitSeconds = REMOTE_RUN_LIMIT_SECONDS): string {
|
|
165
|
+
const limit = Number.isSafeInteger(limitSeconds) && limitSeconds > 0 ? limitSeconds : REMOTE_RUN_LIMIT_SECONDS;
|
|
166
|
+
return [
|
|
167
|
+
'#!/bin/sh',
|
|
168
|
+
'child=',
|
|
169
|
+
'ready=0',
|
|
170
|
+
'owned_group() {',
|
|
171
|
+
' [ -n "$child" ] && kill -0 "$child" 2>/dev/null && [ "$(ps -p "$child" -o pgid= 2>/dev/null | tr -d " ")" = "$child" ] || return 1',
|
|
172
|
+
'}',
|
|
173
|
+
'reap() {',
|
|
174
|
+
// Our direct child stays unreaped until the caller waits, so its PID/PGID cannot be reused here.
|
|
175
|
+
' [ "$ready" -eq 1 ] && owned_group || return 0',
|
|
176
|
+
' kill -TERM -- "-$child" 2>/dev/null || kill -TERM "-$child" 2>/dev/null || :',
|
|
177
|
+
' sleep 2',
|
|
178
|
+
// The leader remains our unreaped child until the caller waits, so its PGID cannot be reused here. A TERM-ignoring
|
|
179
|
+
// grandchild may outlive the leader; rechecking only the leader would miss that member of the same owned group.
|
|
180
|
+
' kill -KILL -- "-$child" 2>/dev/null || kill -KILL "-$child" 2>/dev/null || :',
|
|
181
|
+
'}',
|
|
182
|
+
'trap \'reap\' HUP INT TERM EXIT',
|
|
183
|
+
'perl -MPOSIX -e \'POSIX::setpgid(0,0) == 0 or die "setpgid: $!"; exec @ARGV\' sh "$W/run.sh" &',
|
|
184
|
+
'child=$!',
|
|
185
|
+
// Set this only after spawning the worker so the worker keeps its normal SIGPIPE behavior.
|
|
186
|
+
'trap \'\' PIPE',
|
|
187
|
+
// The SSH parent can disappear before the child has called setpgid. Wait briefly for the ownership proof first.
|
|
188
|
+
'ready=0; attempt=0',
|
|
189
|
+
'while [ "$attempt" -lt 20 ] && kill -0 "$child" 2>/dev/null; do',
|
|
190
|
+
' if owned_group; then ready=1; break; fi',
|
|
191
|
+
' attempt=$((attempt+1)); sleep 1',
|
|
192
|
+
'done',
|
|
193
|
+
'if [ "$ready" -eq 0 ] && kill -0 "$child" 2>/dev/null; then kill -TERM "$child" 2>/dev/null || :; wait "$child" 2>/dev/null || :; : > "$W/supervisor-infra"; exit 125; fi',
|
|
194
|
+
'started=$(date +%s)',
|
|
195
|
+
'while kill -0 "$child" 2>/dev/null; do',
|
|
196
|
+
' if [ "$(($(date +%s) - started))" -ge ' + limit + ' ]; then reap; wait "$child" 2>/dev/null || :; : > "$W/supervisor-timeout"; exit 124; fi',
|
|
197
|
+
' if ! kill -0 "$GATE_REMOTE_SSH_SHELL" 2>/dev/null; then reap; wait "$child" 2>/dev/null || :; : > "$W/supervisor-infra"; exit 125; fi',
|
|
198
|
+
' if ! printf "\\n' + HEARTBEAT + '%s\\n" "$W" >&2; then reap; wait "$child" 2>/dev/null || :; : > "$W/supervisor-infra"; exit 125; fi',
|
|
199
|
+
' sleep 5',
|
|
200
|
+
'done',
|
|
201
|
+
'wait "$child"; rc=$?',
|
|
202
|
+
'trap - HUP INT TERM EXIT',
|
|
203
|
+
'exit "$rc"',
|
|
204
|
+
'',
|
|
205
|
+
].join('\n');
|
|
206
|
+
}
|
|
207
|
+
|
|
157
208
|
// ── remote execution ───────────────────────────────────────────────
|
|
158
209
|
|
|
159
210
|
export interface ExecResult { rc: number | null; stdout: string; stderr: string; error?: string }
|
|
@@ -217,7 +268,7 @@ export interface PayloadFile { env: string; content: string }
|
|
|
217
268
|
export type RemoteArgv = string[] | ((sha: (ref: string) => string) => string[]);
|
|
218
269
|
|
|
219
270
|
/** Build the remote shell script (exported for tests). Every setup failure ends in an INFRA marker, the tool's rc in an RC marker. */
|
|
220
|
-
export function remoteScript(input: { mirror: string; commit: string; fetchShas: string[]; mainSha?: string; argv: string[]; installPwa: boolean; stableCheckout?: boolean; payloadFiles?: PayloadFile[]; hostCap?: number; slotDir?: string }): string {
|
|
271
|
+
export function remoteScript(input: { mirror: string; commit: string; fetchShas: string[]; mainSha?: string; argv: string[]; installPwa: boolean; stableCheckout?: boolean; payloadFiles?: PayloadFile[]; hostCap?: number; slotDir?: string; runLimitSeconds?: number }): string {
|
|
221
272
|
const mirror = input.mirror.startsWith('~/') ? `"$HOME"/${quote(input.mirror.slice(2))}` : quote(input.mirror);
|
|
222
273
|
const fetches = input.fetchShas.map((sha) => `refs/elanous/gate/${sha}:refs/elanous/gate/${sha}`).join(' ');
|
|
223
274
|
const payloads = (input.payloadFiles ?? []).filter((file) => /^[A-Z_][A-Z0-9_]*$/.test(file.env));
|
|
@@ -280,11 +331,16 @@ export function remoteScript(input: { mirror: string; commit: string; fetchShas:
|
|
|
280
331
|
'W=$(mktemp -d /var/tmp/elanous-gate-remote-XXXXXXXX) || infra mktemp',
|
|
281
332
|
'export W',
|
|
282
333
|
'trap \'rm -rf "$W"\' EXIT',
|
|
334
|
+
'command -v perl >/dev/null 2>&1 && command -v ps >/dev/null 2>&1 || infra supervisor-tool',
|
|
335
|
+
'GATE_REMOTE_SSH_SHELL=$$; export GATE_REMOTE_SSH_SHELL',
|
|
283
336
|
...payloadLines,
|
|
284
337
|
`cat > "$W/run.sh" <<'${RUN}' || infra run-script`,
|
|
285
338
|
...work,
|
|
286
339
|
RUN,
|
|
287
|
-
|
|
340
|
+
'cat > "$W/supervise.sh" <<\'__GATE_REMOTE_SUPERVISE__\' || infra supervise-script',
|
|
341
|
+
remoteSupervisorScript(input.runLimitSeconds),
|
|
342
|
+
'__GATE_REMOTE_SUPERVISE__',
|
|
343
|
+
...hostSlotScriptWithSlot(input.hostCap ?? GATE_REMOTE_DEFAULTS.hostCap, input.slotDir ?? SLOT_DIR, ['flock', 'lockf'], !!input.stableCheckout, true),
|
|
288
344
|
'}',
|
|
289
345
|
'',
|
|
290
346
|
].join('\n');
|
|
@@ -340,11 +396,22 @@ export function runOnRemote(opts: RemoteRunOptions, runner: GateRemoteRunner = r
|
|
|
340
396
|
env: { ...process.env, GIT_SSH_COMMAND: 'ssh -o BatchMode=yes -o ConnectTimeout=10', GIT_TERMINAL_PROMPT: '0' },
|
|
341
397
|
});
|
|
342
398
|
if (push.rc !== 0 || push.error) return { kind: 'infra', stage: 'push', rc: push.rc, stderr: push.stderr || push.error || '', reason: `push-failed rc=${push.rc}: ${(push.stderr || push.error || '').trim().split('\n').slice(-2).join(' | ')}` };
|
|
343
|
-
const
|
|
344
|
-
const
|
|
399
|
+
const sshTimeoutMs = opts.timeoutMs ?? 120 * 60_000;
|
|
400
|
+
const script = remoteScript({ mirror: opts.mirror, commit, fetchShas: shas, mainSha, argv, installPwa: opts.installPwa ?? false, stableCheckout: opts.stableCheckout, payloadFiles: opts.payloadFiles, hostCap: opts.hostCap, slotDir: opts.slotDir,
|
|
401
|
+
runLimitSeconds: Math.min(REMOTE_RUN_LIMIT_SECONDS, Math.max(1, Math.floor((sshTimeoutMs - 30_000) / 1000))) });
|
|
402
|
+
const run = runner.ssh(opts.host, script, sshTimeoutMs);
|
|
345
403
|
// The script prints "\n<marker><rc>\n": everything before that leading newline is the tool's own stderr, byte for byte.
|
|
346
404
|
const stdoutBytes = Buffer.from(run.stdout);
|
|
347
|
-
const
|
|
405
|
+
const rawStderr = Buffer.from(run.stderr);
|
|
406
|
+
// Transport heartbeats may arrive after the RC marker when a short run races the supervisor's final poll.
|
|
407
|
+
// Strip only complete, run-scoped heartbeat lines as bytes so arbitrary tool stderr stays byte-identical.
|
|
408
|
+
const heartbeatLine = /\n__GATE_REMOTE_HEARTBEAT=\/var\/tmp\/elanous-gate-remote-[A-Za-z0-9]+\n/g;
|
|
409
|
+
const heartbeatRanges = [...rawStderr.toString('latin1').matchAll(heartbeatLine)].map((match) => [match.index!, match.index! + match[0].length] as const);
|
|
410
|
+
let previous = 0;
|
|
411
|
+
const kept: Buffer[] = [];
|
|
412
|
+
for (const [from, to] of heartbeatRanges) { kept.push(rawStderr.subarray(previous, from)); previous = to; }
|
|
413
|
+
kept.push(rawStderr.subarray(previous));
|
|
414
|
+
const stderrBytes = Buffer.concat(kept);
|
|
348
415
|
const stderrText = stderrBytes.toString('utf8');
|
|
349
416
|
const marker = stderrBytes.lastIndexOf(Buffer.from(`\n${RC}`));
|
|
350
417
|
// Busy (98) and setup failure (97) are the script's own exits, each with its marker as the last stderr line. A completed
|
|
@@ -450,6 +517,11 @@ export interface DispatchOptions {
|
|
|
450
517
|
reportRemoteHost?: boolean;
|
|
451
518
|
/** Release gate host reservations shared by self gate and changed typecheck. */
|
|
452
519
|
reservationRoot?: string;
|
|
520
|
+
/** Self gate only: hosts to try when the first host holds a release reservation (default: `host-e-wsl` for
|
|
521
|
+
* `node-b`, the same alternative the unmeasured hint names — a reservation is never a local fallback). */
|
|
522
|
+
reservationAltHosts?: string[];
|
|
523
|
+
/** Self gate only: bounded wait for the reservation release, in seconds (default: `settings.slotWaitSeconds`). */
|
|
524
|
+
reservationWaitSeconds?: number;
|
|
453
525
|
runLocal: () => number | Promise<number>;
|
|
454
526
|
/** Called once with the final remote outcome (never on a local decision), before its output passes through or the
|
|
455
527
|
* local fallback runs — e.g. `self gate --artifact-dir` fetches (ran) or removes (infra) the host-side artifact dir.
|
|
@@ -469,6 +541,26 @@ export interface DispatchDeps {
|
|
|
469
541
|
write?: { out: (data: string | Uint8Array) => void; err: (data: string | Uint8Array) => void };
|
|
470
542
|
}
|
|
471
543
|
|
|
544
|
+
/** Hosts a reserved self gate may fall back to: an explicit list wins, otherwise `node-b` (the only host the old
|
|
545
|
+
* unmeasured hint named an alternative for) falls back to `host-e-wsl`. Invalid or duplicate entries are dropped. */
|
|
546
|
+
export function gateReservationAlternateHosts(reservedHost: string, explicit?: string[]): string[] {
|
|
547
|
+
const candidates = explicit ?? (reservedHost === 'node-b' ? ['host-e-wsl'] : []);
|
|
548
|
+
const seen = new Set<string>([reservedHost]);
|
|
549
|
+
const hosts: string[] = [];
|
|
550
|
+
for (const candidate of candidates) {
|
|
551
|
+
if (!candidate || seen.has(candidate) || !isValidGateHost(candidate)) continue;
|
|
552
|
+
seen.add(candidate);
|
|
553
|
+
hosts.push(candidate);
|
|
554
|
+
}
|
|
555
|
+
return hosts;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
/** Reservation diagnostics stamp — ISO 시각 printed next to the claim owner (runId). Claims written before
|
|
559
|
+
* `reservedAt` existed fall back to the gate's own observation time. */
|
|
560
|
+
export function formatReservationStamp(ms: number): string {
|
|
561
|
+
return new Date(ms).toISOString();
|
|
562
|
+
}
|
|
563
|
+
|
|
472
564
|
async function loadSettings(): Promise<GateRemoteSettings> {
|
|
473
565
|
try {
|
|
474
566
|
const { getUserConfig } = await import('../user-config.js');
|
|
@@ -498,26 +590,59 @@ export async function dispatchHeavyCheck(opts: DispatchOptions, deps: DispatchDe
|
|
|
498
590
|
return opts.runLocal();
|
|
499
591
|
}
|
|
500
592
|
let host = decision.host!;
|
|
593
|
+
const sleep = deps.sleep ?? ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));
|
|
594
|
+
const now = deps.now ?? Date.now;
|
|
501
595
|
const reservationRoot = opts.tool === 'self-gate' || opts.tool === 'ci-typecheck-changed'
|
|
502
596
|
? opts.reservationRoot ?? (deps.runner ? undefined : gateHostReservationRoot()) : undefined;
|
|
503
597
|
if (reservationRoot) {
|
|
504
598
|
const reservationHost = host.split('@').at(-1)!;
|
|
505
599
|
const first = inspectReleaseGateHost(reservationRoot, reservationHost);
|
|
506
600
|
if (first.status !== 'free') {
|
|
507
|
-
//
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
601
|
+
// A reserved host is never a reason to run this check locally (반증: 예약 상태에서 --local 무거운 시험 금지).
|
|
602
|
+
// Self gate first tries another remote host, then waits bounded for the release, then ends unmeasured with
|
|
603
|
+
// the owner and the observation stamp.
|
|
604
|
+
const observedAt = formatReservationStamp(now());
|
|
605
|
+
const owner = first.runId || 'unknown';
|
|
606
|
+
// Owner (runId) plus 시각: the claim's own reservedAt when recorded, else the moment this gate observed it.
|
|
607
|
+
const stamp = first.reservedAt !== undefined
|
|
608
|
+
? `reserved-at=${formatReservationStamp(first.reservedAt)}`
|
|
609
|
+
: `observed-at=${observedAt}`;
|
|
610
|
+
const alternates = opts.tool === 'self-gate'
|
|
611
|
+
? gateReservationAlternateHosts(reservationHost, opts.reservationAltHosts) : [];
|
|
612
|
+
const alternate = alternates.find((candidate) => inspectReleaseGateHost(reservationRoot, candidate).status === 'free');
|
|
613
|
+
if (alternate) {
|
|
614
|
+
const rerouted = host.includes('@') ? `${host.slice(0, host.lastIndexOf('@'))}@${alternate}` : alternate;
|
|
615
|
+
debug.log('gate.remote', 'host-reserved-reroute', { tool: opts.tool, from: host, to: rerouted, owner, reason: first.reason, reservedAt: first.reservedAt, observedAt });
|
|
616
|
+
write.err(`[gate.remote] host-reserved: ${host} (${first.reason}) owner=${owner} ${stamp} — rerouting to ${rerouted}\n`);
|
|
617
|
+
host = rerouted;
|
|
514
618
|
} else {
|
|
515
|
-
const
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
619
|
+
const waitSeconds = opts.tool === 'self-gate' ? opts.reservationWaitSeconds ?? settings.slotWaitSeconds : 0;
|
|
620
|
+
const waitStart = now();
|
|
621
|
+
const deadline = waitStart + Math.max(0, waitSeconds) * 1000;
|
|
622
|
+
let latest = inspectReleaseGateHost(reservationRoot, reservationHost);
|
|
623
|
+
while (waitSeconds > 0 && latest.status !== 'free') {
|
|
624
|
+
const left = deadline - now();
|
|
625
|
+
if (left <= 0) break;
|
|
626
|
+
write.err(`[gate.remote] waiting for host-reserved release on ${host} — owner=${owner} ${stamp} elapsed=${Math.floor(Math.max(0, now() - waitStart) / 1000)}s/${waitSeconds}s\n`);
|
|
627
|
+
const before = now();
|
|
628
|
+
await sleep(Math.min(15_000, left));
|
|
629
|
+
if (now() <= before) break; // a frozen test clock must not spin past the bound
|
|
630
|
+
latest = inspectReleaseGateHost(reservationRoot, reservationHost);
|
|
631
|
+
}
|
|
632
|
+
const waitedMs = Math.max(0, now() - waitStart);
|
|
633
|
+
if (latest.status === 'free') {
|
|
634
|
+
debug.log('gate.remote', 'host-reserved-released', { tool: opts.tool, host, owner, waitedMs });
|
|
635
|
+
write.err(`[gate.remote] host-reserved released on ${host} after ${Math.floor(waitedMs / 1000)}s — proceeding remotely\n`);
|
|
636
|
+
} else {
|
|
637
|
+
const reason = `host-reserved: ${host} (${latest.reason})`;
|
|
638
|
+
const manualAlternative = reservationHost === 'node-b'
|
|
639
|
+
? '; if available, non-PWA checks may explicitly select --remote host-e-wsl' : '';
|
|
640
|
+
debug.log('gate.remote', 'host-reserved-unmeasured', { host, reason, owner, reservedAt: latest.reservedAt ?? first.reservedAt, observedAt, waitedMs, alternates: alternates.length });
|
|
641
|
+
write.err(opts.tool === 'self-gate'
|
|
642
|
+
? `[gate.remote] remote unmeasured on ${host} (stage=host-reserved, rc=unknown) — ${reason}; owner=${owner} ${stamp} waited=${Math.floor(waitedMs / 1000)}s${manualAlternative}\n`
|
|
643
|
+
: `[gate.remote] remote unmeasured — ${reason}\n`);
|
|
644
|
+
return 1;
|
|
645
|
+
}
|
|
521
646
|
}
|
|
522
647
|
}
|
|
523
648
|
}
|
|
@@ -535,8 +660,6 @@ export async function dispatchHeavyCheck(opts: DispatchOptions, deps: DispatchDe
|
|
|
535
660
|
};
|
|
536
661
|
if (opts.localOnlyReason) return fallback(opts.localOnlyReason, { stage: 'reproducibility', rc: null });
|
|
537
662
|
const hostCap = gateRemoteHostCap(settings, host);
|
|
538
|
-
const sleep = deps.sleep ?? ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));
|
|
539
|
-
const now = deps.now ?? Date.now;
|
|
540
663
|
const deadline = now() + settings.slotWaitSeconds * 1000;
|
|
541
664
|
let waitStartedAt: number | undefined;
|
|
542
665
|
const logWait = deps.log ?? ((event: string, data: Record<string, unknown>) => debug.log('gate.remote', event, data));
|
|
@@ -50,6 +50,8 @@ export type GoalAuthorClarificationAnswerSource = 'injected' | 'recommended' | '
|
|
|
50
50
|
export interface GoalAuthorClarificationProvenance {
|
|
51
51
|
source: GoalAuthorClarificationAnswerSource;
|
|
52
52
|
evidence?: string[];
|
|
53
|
+
assumption?: string;
|
|
54
|
+
assumptionSource?: 'resolver' | 'policy-default' | 'recommended';
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
export interface GoalAuthorClarificationResponse {
|
|
@@ -81,7 +83,7 @@ export interface GoalAuthorSelfResolutionContext {
|
|
|
81
83
|
}
|
|
82
84
|
|
|
83
85
|
export type GoalAuthorSelfResolution =
|
|
84
|
-
| { answer: string; evidence: readonly string[]; declined?: undefined }
|
|
86
|
+
| { answer: string; evidence: readonly string[]; assumption?: string; declined?: undefined }
|
|
85
87
|
| { answer?: undefined; evidence?: undefined; declined?: boolean };
|
|
86
88
|
|
|
87
89
|
export interface GoalAuthorClarificationResolutionDeps {
|
|
@@ -125,8 +127,8 @@ function truncateAsk(ask: string): string {
|
|
|
125
127
|
function selfResolutionPrompt(context: GoalAuthorSelfResolutionContext): string {
|
|
126
128
|
return [
|
|
127
129
|
'Answer this goal-author clarification using only the supplied repository evidence.',
|
|
128
|
-
'Do not delegate to an implementation agent. If the evidence cannot justify one
|
|
129
|
-
'Return JSON only: {"answer":"..."} or {"answer":null}.',
|
|
130
|
+
'Do not delegate to an implementation agent. Choose the best supported candidate and state the assumption that makes it the best fit. If the evidence cannot justify one answer, return {"answer":null}.',
|
|
131
|
+
'Return JSON only: {"answer":"...","assumption":"..."} or {"answer":null}.',
|
|
130
132
|
...(context.ask?.trim() ? [`Request being authored:\n${truncateAsk(context.ask.trim())}`] : []),
|
|
131
133
|
`Question: ${context.question}`,
|
|
132
134
|
`Options: ${context.options.join(' | ') || '(free input)'}`,
|
|
@@ -195,22 +197,31 @@ export async function defaultGoalAuthorSelfResolve(
|
|
|
195
197
|
return context.questionId === 'preservation_contract' ? { declined: true } : {};
|
|
196
198
|
}
|
|
197
199
|
const controller = new AbortController();
|
|
200
|
+
const prompt = selfResolutionPrompt(context);
|
|
201
|
+
let rejectTimeout!: (reason: Error) => void;
|
|
202
|
+
const timeoutPromise = new Promise<never>((_, reject) => { rejectTimeout = reject; });
|
|
198
203
|
const timeout = setTimeout(
|
|
199
|
-
() =>
|
|
204
|
+
() => {
|
|
205
|
+
const error = new Error(SELF_RESOLUTION_TIMEOUT_MESSAGE);
|
|
206
|
+
controller.abort(error);
|
|
207
|
+
rejectTimeout(error);
|
|
208
|
+
},
|
|
200
209
|
selfResolutionTimeoutMs(deps.timeoutMs),
|
|
201
210
|
);
|
|
202
|
-
const prompt = selfResolutionPrompt(context);
|
|
203
211
|
const onUsage = (usage: LLMUsage) => { usages.push(usage); };
|
|
204
212
|
try {
|
|
205
|
-
const result = await
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
213
|
+
const result = await Promise.race([
|
|
214
|
+
(deps.stream ?? (async (input, signal, reportUsage) => {
|
|
215
|
+
const { streamLLM } = await import('../llm.js');
|
|
216
|
+
return streamLLM([{ role: 'user', content: input }], () => {}, {
|
|
217
|
+
model: process.env.ELANOUS_GOAL_AUTHOR_MODEL || tierModel('better'),
|
|
218
|
+
reasoningEffort: 'high',
|
|
219
|
+
signal,
|
|
220
|
+
onUsage: reportUsage,
|
|
221
|
+
});
|
|
222
|
+
}))(prompt, controller.signal, onUsage),
|
|
223
|
+
timeoutPromise,
|
|
224
|
+
]);
|
|
214
225
|
let parsed: unknown;
|
|
215
226
|
try {
|
|
216
227
|
parsed = JSON.parse(result);
|
|
@@ -222,11 +233,15 @@ export async function defaultGoalAuthorSelfResolve(
|
|
|
222
233
|
? (parsed as { answer?: unknown }).answer
|
|
223
234
|
: undefined;
|
|
224
235
|
if (typeof answer === 'string') {
|
|
236
|
+
const assumptionValue = (parsed as { assumption?: unknown }).assumption;
|
|
237
|
+
const assumption = typeof assumptionValue === 'string' && assumptionValue.trim()
|
|
238
|
+
? assumptionValue.trim()
|
|
239
|
+
: undefined;
|
|
225
240
|
observeSelfResolve('self-resolve-answered', context, startedAt, {
|
|
226
241
|
answerLength: answer.length,
|
|
227
242
|
usage: deriveUsage(usages),
|
|
228
243
|
});
|
|
229
|
-
return { answer, evidence: context.evidence };
|
|
244
|
+
return { answer, evidence: context.evidence, ...(assumption ? { assumption } : {}) };
|
|
230
245
|
}
|
|
231
246
|
observeSelfResolve('self-resolve-unanswered', context, startedAt, {
|
|
232
247
|
reason: answer === null ? 'declined' : 'shape-mismatch',
|
|
@@ -281,7 +296,11 @@ function responseFor(clarification: IntakeClarification, observe = false, selfRe
|
|
|
281
296
|
...deferredResponse(clarification),
|
|
282
297
|
answer: automaticAnswer,
|
|
283
298
|
status: 'ANSWERED',
|
|
284
|
-
provenance: {
|
|
299
|
+
provenance: {
|
|
300
|
+
source: 'recommended',
|
|
301
|
+
assumption: '저작기가 표시한 단일 recommended 후보를 우선 선택하는 정책을 적용한다',
|
|
302
|
+
assumptionSource: 'recommended',
|
|
303
|
+
},
|
|
285
304
|
};
|
|
286
305
|
}
|
|
287
306
|
|
|
@@ -331,11 +350,17 @@ export async function resolveGoalAuthorClarification(
|
|
|
331
350
|
if (!answer || /[\r\n]/.test(answer) || evidence.length === 0) {
|
|
332
351
|
return deterministic;
|
|
333
352
|
}
|
|
353
|
+
const resolverAssumption = 'assumption' in resolution ? resolution.assumption?.trim() : undefined;
|
|
354
|
+
const assumption = resolverAssumption
|
|
355
|
+
|| `정책 가정(resolver가 별도 가정을 생략함): 제공 근거와 요청에 가장 맞는 후보를 선택한다 (${answer})`;
|
|
334
356
|
const response: GoalAuthorClarificationResponse = {
|
|
335
357
|
...deferredResponse(clarification),
|
|
336
358
|
answer,
|
|
337
359
|
status: 'ANSWERED',
|
|
338
|
-
provenance: {
|
|
360
|
+
provenance: {
|
|
361
|
+
source: 'self-authored', evidence, assumption,
|
|
362
|
+
assumptionSource: resolverAssumption ? 'resolver' : 'policy-default',
|
|
363
|
+
},
|
|
339
364
|
};
|
|
340
365
|
observeGoalAuthor('goal-author.clarify', 'self-answered', {
|
|
341
366
|
questionId: clarification.questionId,
|
|
@@ -407,31 +432,58 @@ function parseRecord(raw: string): SerializedGoalAuthorClarification | null {
|
|
|
407
432
|
&& Array.isArray(provenance.evidence)
|
|
408
433
|
&& provenance.evidence.length > 0
|
|
409
434
|
&& provenance.evidence.every((item) => typeof item === 'string' && item.length > 0);
|
|
435
|
+
const selfAuthoredAssumption = typeof provenance?.assumption === 'string' && provenance.assumption.trim()
|
|
436
|
+
? provenance.assumption.trim()
|
|
437
|
+
: undefined;
|
|
410
438
|
const response = isSelfAuthored
|
|
411
439
|
? {
|
|
412
440
|
...deferredResponse(value.clarification),
|
|
413
441
|
answer: value.response.answer!,
|
|
414
442
|
status: 'ANSWERED' as const,
|
|
415
|
-
provenance: {
|
|
443
|
+
provenance: {
|
|
444
|
+
source: 'self-authored' as const,
|
|
445
|
+
evidence: provenance.evidence,
|
|
446
|
+
...(selfAuthoredAssumption ? { assumption: selfAuthoredAssumption } : {}),
|
|
447
|
+
...(provenance.assumptionSource === 'resolver' || provenance.assumptionSource === 'policy-default'
|
|
448
|
+
? { assumptionSource: provenance.assumptionSource }
|
|
449
|
+
: {}),
|
|
450
|
+
},
|
|
416
451
|
}
|
|
417
452
|
: expected;
|
|
418
453
|
const responseProvenance = response.provenance;
|
|
419
454
|
const serializedProvenance = value.response.provenance;
|
|
420
455
|
const expectedProvenanceKeys = responseProvenance === undefined
|
|
421
456
|
? []
|
|
422
|
-
:
|
|
457
|
+
: [
|
|
458
|
+
...(responseProvenance.assumption === undefined ? [] : ['assumption']),
|
|
459
|
+
...(responseProvenance.assumptionSource === undefined ? [] : ['assumptionSource']),
|
|
460
|
+
...(responseProvenance.evidence === undefined ? [] : ['evidence']),
|
|
461
|
+
'source',
|
|
462
|
+
];
|
|
423
463
|
const serializedProvenanceKeys = serializedProvenance === undefined
|
|
424
464
|
? []
|
|
425
465
|
: Object.keys(serializedProvenance).sort();
|
|
466
|
+
// Older serialized goal rows predate assumption provenance. Keep accepting those rows while
|
|
467
|
+
// still validating every field they actually contain; parsing upgrades them to the current
|
|
468
|
+
// deterministic response shape above.
|
|
469
|
+
const legacyAssumptionKeys = responseProvenance?.source === 'recommended'
|
|
470
|
+
? ['assumption', 'assumptionSource']
|
|
471
|
+
: [];
|
|
472
|
+
const provenanceKeysMatch = (serializedProvenanceKeys.length === expectedProvenanceKeys.length
|
|
473
|
+
&& expectedProvenanceKeys.every((key) => serializedProvenanceKeys.includes(key)))
|
|
474
|
+
|| (legacyAssumptionKeys.length > 0
|
|
475
|
+
&& expectedProvenanceKeys.filter((key) => !legacyAssumptionKeys.includes(key)).every((key) => serializedProvenanceKeys.includes(key))
|
|
476
|
+
&& serializedProvenanceKeys.every((key) => expectedProvenanceKeys.includes(key)));
|
|
426
477
|
const provenanceMatches = (serializedProvenance === undefined) === (responseProvenance === undefined)
|
|
427
|
-
&&
|
|
428
|
-
&& serializedProvenanceKeys.every((key, index) => key === expectedProvenanceKeys[index])
|
|
478
|
+
&& provenanceKeysMatch
|
|
429
479
|
&& serializedProvenance?.source === responseProvenance?.source
|
|
430
480
|
&& (responseProvenance?.evidence === undefined
|
|
431
481
|
? serializedProvenance?.evidence === undefined
|
|
432
482
|
: Array.isArray(serializedProvenance?.evidence)
|
|
433
483
|
&& serializedProvenance.evidence.length === responseProvenance.evidence.length
|
|
434
|
-
&& serializedProvenance.evidence.every((item, index) => item === responseProvenance.evidence?.[index]))
|
|
484
|
+
&& serializedProvenance.evidence.every((item, index) => item === responseProvenance.evidence?.[index]))
|
|
485
|
+
&& (serializedProvenance?.assumption === undefined || serializedProvenance.assumption === responseProvenance?.assumption)
|
|
486
|
+
&& (serializedProvenance?.assumptionSource === undefined || serializedProvenance.assumptionSource === responseProvenance?.assumptionSource);
|
|
435
487
|
if (value.response.questionId !== response.questionId
|
|
436
488
|
|| value.response.answer !== response.answer
|
|
437
489
|
|| value.response.status !== response.status
|
|
@@ -469,6 +521,21 @@ export interface GoalDocumentClarification {
|
|
|
469
521
|
provenanceLines?: number[];
|
|
470
522
|
}
|
|
471
523
|
|
|
524
|
+
export type GoalClarificationDecisionCategory = 'money' | 'security' | 'irreversible';
|
|
525
|
+
|
|
526
|
+
/** Only questions that could authorize money, security, or irreversible external effects need a decision card. */
|
|
527
|
+
export function goalClarificationDecisionCategory(
|
|
528
|
+
clarification: Pick<GoalDocumentClarification, 'header' | 'question' | 'options'>,
|
|
529
|
+
): GoalClarificationDecisionCategory | undefined {
|
|
530
|
+
const text = [clarification.header, clarification.question, ...clarification.options.flatMap((option) => [option.label, option.description])]
|
|
531
|
+
.join(' ')
|
|
532
|
+
.toLocaleLowerCase();
|
|
533
|
+
if (/\b(payment|purchase|spend|budget|credit|charge|price|cost|paid)\b|결제|구매|지출|예산|크레딧|과금|가격|비용/.test(text)) return 'money';
|
|
534
|
+
if (/\b(security|credential|token|secret|password|authorization|authentication|permission|access control)\b|보안|자격 증명|토큰|비밀키|비밀번호|인가|인증|권한/.test(text)) return 'security';
|
|
535
|
+
if (/\b(publish|publication|deploy|send|delete|release|irreversible|external side effect|production)\b|발행|게시|배포|전송|삭제|릴리스|되돌릴 수 없|외부 효과|운영 환경/.test(text)) return 'irreversible';
|
|
536
|
+
return undefined;
|
|
537
|
+
}
|
|
538
|
+
|
|
472
539
|
interface GoalAuthorClarificationSeed {
|
|
473
540
|
ask: string;
|
|
474
541
|
parent: GoalAuthorParent;
|
|
@@ -576,6 +643,17 @@ export function parseGoalDocumentClarifications(document: string): GoalDocumentC
|
|
|
576
643
|
readingOptions = false;
|
|
577
644
|
continue;
|
|
578
645
|
}
|
|
646
|
+
const provenanceAssumption = /^ - provenance\.assumption: (.*)$/.exec(line);
|
|
647
|
+
if (provenanceAssumption) {
|
|
648
|
+
provenanceLines.push(index);
|
|
649
|
+
readingOptions = false;
|
|
650
|
+
continue;
|
|
651
|
+
}
|
|
652
|
+
if (/^ - provenance\.assumption-source: (resolver|policy-default|recommended)$/.test(line)) {
|
|
653
|
+
provenanceLines.push(index);
|
|
654
|
+
readingOptions = false;
|
|
655
|
+
continue;
|
|
656
|
+
}
|
|
579
657
|
if (/^ - evidence: /.test(line)) {
|
|
580
658
|
provenanceLines.push(index);
|
|
581
659
|
readingOptions = false;
|
|
@@ -747,6 +825,7 @@ export async function selfAnswerGoalDocumentClarifications(
|
|
|
747
825
|
evidence?: readonly string[];
|
|
748
826
|
resolver?: GoalClarificationSelfResolver;
|
|
749
827
|
runId?: string;
|
|
828
|
+
skipQuestionIds?: ReadonlySet<string>;
|
|
750
829
|
},
|
|
751
830
|
): Promise<{ document: string; asked: number; answered: number; unanswered: number; newlyAnswered: number }> {
|
|
752
831
|
const clarifications = parseGoalDocumentClarifications(document);
|
|
@@ -761,7 +840,7 @@ export async function selfAnswerGoalDocumentClarifications(
|
|
|
761
840
|
const evidence = options.evidence ?? document.split(/\r?\n/)
|
|
762
841
|
.filter((line) => /^(?:\s*- (?:\[code:|\[document:|TRACED PATHS|evidence:|Evidence:)|\s*-?\s*`?(?:src|test|scripts)\/[^\s`]+:\d+)/i.test(line))
|
|
763
842
|
.slice(0, 40);
|
|
764
|
-
for (const item of pending) {
|
|
843
|
+
for (const item of pending.filter((entry) => !options.skipQuestionIds?.has(entry.questionId))) {
|
|
765
844
|
if (parseGoalDocumentClarifications(updated).filter((entry) => entry.questionId === item.questionId).length !== 1) continue;
|
|
766
845
|
let response: Awaited<ReturnType<typeof resolveGoalAuthorClarification>>;
|
|
767
846
|
let declined = false;
|
|
@@ -789,7 +868,9 @@ export async function selfAnswerGoalDocumentClarifications(
|
|
|
789
868
|
if (response.answer === null && item.questionId === 'preservation_contract'
|
|
790
869
|
&& declined) {
|
|
791
870
|
const fallback = preservationDefault(options.ask ?? document);
|
|
792
|
-
response = { ...response, answer: fallback.answer, status: 'ANSWERED', provenance: {
|
|
871
|
+
response = { ...response, answer: fallback.answer, status: 'ANSWERED', provenance: {
|
|
872
|
+
source: 'default', assumption: '기존 공개 동작 보존을 기본 가정으로 적용한다', assumptionSource: 'policy-default',
|
|
873
|
+
} };
|
|
793
874
|
defaultExportCount = fallback.exportCount;
|
|
794
875
|
}
|
|
795
876
|
if (response.answer === null || (response.provenance?.source !== 'self-authored' && response.provenance?.source !== 'default')
|
|
@@ -806,6 +887,8 @@ export async function selfAnswerGoalDocumentClarifications(
|
|
|
806
887
|
lines[answerLine] = ` - answer: ${response.answer}`;
|
|
807
888
|
lines.splice(answerLine + 1, 0,
|
|
808
889
|
` - provenance.source: ${answerSource}`,
|
|
890
|
+
...(response.provenance.assumption ? [` - provenance.assumption: ${response.provenance.assumption.replace(/[\r\n]/g, ' ')}`] : []),
|
|
891
|
+
...(response.provenance.assumptionSource ? [` - provenance.assumption-source: ${response.provenance.assumptionSource}`] : []),
|
|
809
892
|
...(response.provenance.evidence ?? []).map((entry) => ` - evidence: ${entry.replace(/[\r\n]/g, ' ')}`));
|
|
810
893
|
updateWhatToBuildRenderAnswers(lines, item.questionId, response.answer);
|
|
811
894
|
if (hasWhatToBuildUnansweredRenderAnswer(lines, item.questionId)) continue;
|
|
@@ -836,6 +919,77 @@ export async function selfAnswerGoalDocumentClarifications(
|
|
|
836
919
|
return { document: updated, asked, answered, unanswered, newlyAnswered };
|
|
837
920
|
}
|
|
838
921
|
|
|
922
|
+
/** SelfImplement boundary: resolve pending questions itself and record a bounded policy assumption if that fails.
|
|
923
|
+
* Interactive callers must not turn an authoring clarification into a human popup. */
|
|
924
|
+
export async function selfAnswerOrAssumeGoalDocumentClarifications(
|
|
925
|
+
document: string,
|
|
926
|
+
options: Parameters<typeof selfAnswerGoalDocumentClarifications>[1],
|
|
927
|
+
): Promise<Awaited<ReturnType<typeof selfAnswerGoalDocumentClarifications>> & {
|
|
928
|
+
assumed: number;
|
|
929
|
+
decisionRequired: Array<{ questionId: string; header: string; question: string; category: GoalClarificationDecisionCategory }>;
|
|
930
|
+
}> {
|
|
931
|
+
const safetyQuestions = parseGoalDocumentClarifications(document).filter((entry) => !entry.answered)
|
|
932
|
+
.map((entry) => ({ entry, category: goalClarificationDecisionCategory(entry) }))
|
|
933
|
+
.filter((item): item is { entry: GoalDocumentClarification; category: GoalClarificationDecisionCategory } => item.category !== undefined);
|
|
934
|
+
const attempted = await selfAnswerGoalDocumentClarifications(document, {
|
|
935
|
+
...options,
|
|
936
|
+
skipQuestionIds: new Set(safetyQuestions.map((item) => item.entry.questionId)),
|
|
937
|
+
});
|
|
938
|
+
let updated = attempted.document;
|
|
939
|
+
let assumed = 0;
|
|
940
|
+
const decisionRequired: Array<{ questionId: string; header: string; question: string; category: GoalClarificationDecisionCategory }> =
|
|
941
|
+
safetyQuestions.map(({ entry, category }) => ({ questionId: entry.questionId, header: entry.header, question: entry.question, category }));
|
|
942
|
+
for (const item of parseGoalDocumentClarifications(updated).filter((entry) => !entry.answered)) {
|
|
943
|
+
const category = goalClarificationDecisionCategory(item);
|
|
944
|
+
if (category) continue;
|
|
945
|
+
const offered = item.options.filter((option) => option.label.trim() && !/[\r\n]/.test(option.label));
|
|
946
|
+
const useOfferedOption = !item.includeOther && offered.length > 0;
|
|
947
|
+
const answer = useOfferedOption
|
|
948
|
+
? offered[0]!.label.trim()
|
|
949
|
+
: '근거가 부족하므로 요청에 명시된 범위만 진행한다고 가정한다';
|
|
950
|
+
const assumption = useOfferedOption
|
|
951
|
+
? '자가 해소가 답을 내지 못해 자유 답변 없이 제시된 첫 후보를 정책 가정으로 선택했다'
|
|
952
|
+
: '자가 해소가 답을 내지 못해 추가 범위를 만들지 않고 요청에 명시된 범위만 진행한다고 가정했다';
|
|
953
|
+
try {
|
|
954
|
+
const current = findUnansweredGoalDocumentClarification(updated, item.questionId);
|
|
955
|
+
const lines = updated.split(/\r?\n/);
|
|
956
|
+
const provenanceLines = current.provenanceLines ?? [];
|
|
957
|
+
for (const line of [...provenanceLines].sort((left, right) => right - left)) lines.splice(line, 1);
|
|
958
|
+
const answerLine = current.answerLine - provenanceLines.filter((line) => line < current.answerLine).length;
|
|
959
|
+
lines[answerLine] = ` - answer: ${answer}`;
|
|
960
|
+
lines.splice(answerLine + 1, 0,
|
|
961
|
+
' - provenance.source: default',
|
|
962
|
+
` - provenance.assumption: ${assumption}`,
|
|
963
|
+
' - provenance.assumption-source: policy-default',
|
|
964
|
+
);
|
|
965
|
+
updateWhatToBuildRenderAnswers(lines, item.questionId, answer);
|
|
966
|
+
if (hasWhatToBuildUnansweredRenderAnswer(lines, item.questionId)) continue;
|
|
967
|
+
const candidate = lines.join(updated.includes('\r\n') ? '\r\n' : '\n');
|
|
968
|
+
if (!parseGoalDocumentClarifications(candidate).some((entry) => entry.questionId === item.questionId
|
|
969
|
+
&& entry.answered && entry.answer === answer && entry.provenanceSource === 'default')) continue;
|
|
970
|
+
updated = candidate;
|
|
971
|
+
assumed += 1;
|
|
972
|
+
observeGoalAuthor('goal-author.clarify', 'self-answer-assumed', {
|
|
973
|
+
runId: options.runId ?? process.env.ELANOUS_RUN_ID,
|
|
974
|
+
questionId: item.questionId,
|
|
975
|
+
assumptionSource: 'policy-default',
|
|
976
|
+
selectedOfferedOption: useOfferedOption,
|
|
977
|
+
});
|
|
978
|
+
} catch {
|
|
979
|
+
// Keep the pending question visible to the caller as a no-launch reason; never dispatch it to a popup.
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
return {
|
|
983
|
+
...attempted,
|
|
984
|
+
document: updated,
|
|
985
|
+
answered: attempted.answered + assumed,
|
|
986
|
+
unanswered: Math.max(0, attempted.unanswered - assumed),
|
|
987
|
+
newlyAnswered: attempted.newlyAnswered + assumed,
|
|
988
|
+
assumed,
|
|
989
|
+
decisionRequired,
|
|
990
|
+
};
|
|
991
|
+
}
|
|
992
|
+
|
|
839
993
|
|
|
840
994
|
export type ClarificationIntakeMode = 'none' | 'deferred-noninteractive' | 'ask';
|
|
841
995
|
|