elanous 0.2.37 → 0.2.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → HjeK7zONHfR7op1hKXp4k}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{1746.3563617ea64023a3.js → 1060.014f1f01a17aec26.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9151.a2c51e93f9156dae.js → 1281.d81877e35b9068f4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1350.59f40e39e02d91b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +286 -0
- package/apps/pwa/out/_next/static/chunks/1537-6bb97b5214928ea9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +149 -0
- package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +90 -0
- package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{3578.4e9f9948a9a6f2f4.js → 2047.8f23e210995d4548.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7424.c0fe2a595d4232b5.js → 2066.a77257c8c350770a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4931.95cc6dbd230774ca.js → 2177.df8547f9d7215c4e.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6680.6a693c28aae4cd19.js → 2226.2cf61ec781827219.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2499.02fbfd18126c10c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6252.240578f10952e091.js → 2522.f2766b76d22c8bdf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1262.a89bb27a5b2f844e.js → 2566.beaffc3a5e1fcd2e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/261.0d471e8aded799f3.js +226 -0
- package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +27 -0
- package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2318-450e75d07605b8fe.js → 2774-719820e3f5b2a3eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4725-34bed25720cc326b.js → 2829-734fe8bf2eee7347.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3330.7443183b7e6fdbdf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3746-f80a78f220bf37b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +24 -0
- package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +77 -0
- package/apps/pwa/out/_next/static/chunks/{4337e36d.f42c3b391b3d8f20.js → 3b355b3d.6f73c98bf6f9c749.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +36 -0
- package/apps/pwa/out/_next/static/chunks/{58edce7d.f1b0c72acf13b123.js → 409c787b.e48c5bec8ec10456.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +287 -0
- package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4351.0f37a6db2b34d50b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5046.7fd5cbd859299448.js → 470.51a72a2348306455.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2375.bf364c85dbb6f085.js → 4769.9fd582071301f382.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{de8446d3.31b73eb239fecd7b.js → 4864a2ca.1c1c280a7772c5e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +74 -0
- package/apps/pwa/out/_next/static/chunks/{4383.18e5c54db3a22c88.js → 5383.bdfa5d886e39a826.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5436.fdf6fa8ae3e9588d.js +64 -0
- package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +8 -0
- package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +62 -0
- package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +94 -0
- package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6745-5a63492933959dd9.js → 6051-0ae955eedb10adb9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2283.edd9627b7bdfb546.js → 6257.c0037b8949239f5e.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6819.be5c9c4d67f22922.js → 6749.0744ce6eb08d40e9.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6908.06008c67f6380ea9.js +148 -0
- package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6cc1d1d6.9a98dd4622f1afc6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7219-15bdd9a80661af8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +93 -0
- package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7611.85f045bf232053ac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8099.1cccf31c1baa7e1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2002-a43a3f380df873ec.js → 8272-025653884f9645d2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7867.e8725745ddd1d940.js → 8357.1aaa713b052a78b1.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8639-92c11d069792429e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8d173e38.18a2f7b4e1848bdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +41 -0
- package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4313.76f232c304a15bde.js → 9175.2de5209a5ce6f68a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9184.45afbf44fec87574.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8c58d09b.e8724a299658d86f.js → 9189505a.980427ac048c8c60.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +79 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ba957ff875a026a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/{page-3337c6a1328c2674.js → page-4edb8df90f4537ce.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-83d27757e2b8060a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-1e5da297557d2354.js → page-fca2e59a81744d9e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-ac2c1e6169cfce57.js → page-139d722de1dcd6c1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/{page-c1c80e345fa9d6f5.js → page-ccde99f07aaf71f7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{d9815f84.4918f682a45a8502.js → b84cad00.594027ebe0531fe2.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{709a918c.4fd3b4e2a32cb4e3.js → ca3702f8.2913182e73889fa2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5f6af561-f90b7a67f4f75d13.js → d8de0de2-dd0f4ac8e5ab1832.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/graphs/demo/persona-marketer/fixtures/marketer-scenario.yaml +10 -0
- package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
- package/graphs/demo/persona-marketer/recipes.yaml +19 -0
- package/graphs/release/recipes.yaml +9 -0
- package/graphs/release/release-loop.yaml +26 -18
- package/graphs/video/explainer-line.yaml +4 -1
- package/package.json +1 -1
- package/scripts/ask-op-inbox-once.ts +17 -0
- package/scripts/brand/check.ts +13 -4
- package/scripts/dead-code/report.ts +169 -0
- package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
- package/scripts/gate-0226-failure-census.ts +39 -0
- package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
- package/scripts/lib/morning-report-options.ts +3 -4
- package/scripts/lib/tui-regress-evidence.ts +56 -0
- package/scripts/morning-report.ts +5 -1
- package/scripts/provision-export-redactions.ts +15 -0
- package/scripts/public-copy-lint.ts +122 -0
- package/scripts/public-export.ts +77 -2
- package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
- package/scripts/ratchets/train-side-invariants.sh +7 -1
- package/scripts/release-loop/cut-branch.ts +61 -12
- package/scripts/release-loop/export-check-node.ts +21 -3
- package/scripts/release-loop/gate-node.ts +527 -60
- package/scripts/release-loop/gate-partial.ts +82 -3
- package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
- package/scripts/release-loop/gate-radius-live.ts +4 -2
- package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
- package/scripts/release-loop/gate-shard-receipts.ts +89 -0
- package/scripts/release-loop/gate-wall.ts +5 -5
- package/scripts/release-loop/preflight.ts +6 -2
- package/scripts/release-loop/resume-cap.ts +2 -1
- package/scripts/release-loop/resume-release.ts +317 -13
- package/scripts/release-loop/resume.ts +61 -5
- package/scripts/release-loop/traffic-node.ts +12 -4
- package/scripts/release-loop/traffic-transition.ts +53 -13
- package/scripts/release-loop/version-node.ts +35 -5
- package/scripts/release-story/draft.ts +1 -1
- package/scripts/research-bench/README.md +53 -0
- package/scripts/research-bench/questions.json +66 -0
- package/scripts/research-bench/rubric.md +33 -0
- package/scripts/research-bench/run.ts +523 -0
- package/scripts/tui-regress.ts +85 -10
- package/scripts/ux-sim.ts +1 -1
- package/scripts/video-pipeline.ts +2 -2
- package/src/acp/core-turn-bridge.ts +14 -1
- package/src/agent/autonomous-tools.ts +10 -3
- package/src/agent/monad-agent-turn.ts +4 -1
- package/src/agent/registry.ts +26 -2
- package/src/agent/run-context.ts +1 -1
- package/src/agent/shared-app-tools.ts +1 -1
- package/src/agent/surface-ux/build.ts +12 -3
- package/src/agent/surface-ux/types.ts +1 -1
- package/src/agent/task-notification.ts +78 -7
- package/src/agent/types.ts +3 -0
- package/src/agent-mission/driver.ts +29 -3
- package/src/agent-mission/mission-cli.ts +2 -1
- package/src/agent-substrate/review-context-pack.ts +365 -0
- package/src/agent-substrate/review-observation.ts +10 -0
- package/src/agent-substrate/self-review-cli.ts +419 -42
- package/src/ask-user-question/index.ts +6 -0
- package/src/ask-user-question/inline-resolver.ts +49 -0
- package/src/auto-research/question-ladder-contract.ts +156 -0
- package/src/auto-research/research-turn.ts +467 -0
- package/src/autopilot/agent-loop.ts +1 -1
- package/src/autopilot/discovery/doc-lint.ts +1 -1
- package/src/autopilot/pty-control-loop.ts +8 -1
- package/src/boot/daemon-tools/index.ts +4 -3
- package/src/boot/daemon-tools/self-implement.ts +270 -2
- package/src/boot/daemon-tools/types.ts +2 -0
- package/src/bots/screen-probe.ts +1 -1
- package/src/budget/llm-cost.ts +44 -5
- package/src/budget/unified-usage.ts +17 -1
- package/src/capture/tui-self-report.ts +24 -2
- package/src/chat/index.ts +34 -7
- package/src/chat/tool-render/dispatch.ts +8 -1
- package/src/cli/agent-cli.ts +43 -8
- package/src/cli/guardian-cli.ts +3 -1
- package/src/cli/intake-cli.ts +70 -13
- package/src/cli/lesson-cli.ts +86 -10
- package/src/cli/log-event-names.ts +1 -0
- package/src/cli/pod-cli.ts +17 -2
- package/src/cli/pr-land-overlap-evidence.ts +38 -5
- package/src/cli/pr-land-refusal.ts +1 -1
- package/src/cli/pty-takeover-cli.ts +125 -12
- package/src/cli/release-checklist-read-cli.ts +5 -2
- package/src/cli/release-cli.ts +99 -15
- package/src/cli/repo-cli.ts +2 -1
- package/src/cli/review-carry.ts +77 -0
- package/src/cli/self-update.ts +1 -1
- package/src/cli/tasks-card-show.ts +31 -1
- package/src/cli/tasks-cli.ts +98 -32
- package/src/cli/tasks-read-cli.ts +13 -5
- package/src/context-bus/context-now.ts +86 -2
- package/src/control-plane/ledger.ts +21 -4
- package/src/core-turn/run-core-turn.ts +51 -3
- package/src/core-turn/run-goal-loop.ts +152 -8
- package/src/core-turn/types.ts +12 -0
- package/src/dashboard/chat/acp-chat.ts +2 -2
- package/src/dashboard/classic-sigquit.ts +16 -0
- package/src/dashboard/index.ts +339 -44
- package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
- package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
- package/src/dashboard/input/external-input-host.ts +2 -0
- package/src/dashboard/input/terminal-modal-router.ts +8 -159
- package/src/dashboard/side-basic-runtime.ts +61 -0
- package/src/dashboard/sidetab-runtime.ts +228 -0
- package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +22 -8
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
- package/src/dashboard/term-slash-runtime.ts +18 -18
- package/src/dashboard/turn-preamble.ts +30 -4
- package/src/domains/guardian-tick.ts +9 -0
- package/src/domains/knowledge.ts +1 -1
- package/src/esc-abort-gate.ts +33 -1
- package/src/execution-loop/launch-gate.ts +206 -1
- package/src/git-fs/watcher.ts +27 -22
- package/src/git-fs/worktree.ts +19 -3
- package/src/graph-runner/graph-cli.ts +6 -4
- package/src/graph-runner/graph-grow.ts +37 -9
- package/src/graph-runner/runner.ts +48 -11
- package/src/graph-wizard/generate.ts +16 -7
- package/src/graph-wizard/mission-compose.ts +201 -0
- package/src/grok/agent-search.ts +8 -2
- package/src/grok/credential.ts +112 -36
- package/src/grounding/ref-index.ts +11 -0
- package/src/grounding/ref-vector.ts +61 -0
- package/src/grounding/sources-cli.ts +2 -2
- package/src/grounding/sources.ts +15 -1
- package/src/harness/harness-cli-command.ts +38 -9
- package/src/harness/harness-pod-dispatch.ts +7 -1
- package/src/hq/fence-wrapper.ts +1 -1
- package/src/hq/transfer.ts +1 -1
- package/src/index.ts +60 -16
- package/src/input/external-input-queue.ts +10 -0
- package/src/intake-plane/collect-telegram-saved.ts +90 -6
- package/src/intake-plane/intake-to-tasks.ts +246 -3
- package/src/interactive-terminal-modal.ts +3 -0
- package/src/keybindings.ts +17 -22
- package/src/lessons/friction-ledger.ts +154 -0
- package/src/live-supply/collector.ts +149 -0
- package/src/live-supply/probes.ts +52 -0
- package/src/live-supply/snapshot.ts +40 -0
- package/src/llm/provider-credentials.ts +1 -1
- package/src/llm-tool-schema.ts +20 -0
- package/src/llm.ts +486 -61
- package/src/loops/orchestrator/inbox-once.ts +28 -0
- package/src/loops/orchestrator/inbox.ts +130 -1
- package/src/loops/orchestrator/tick.ts +14 -3
- package/src/maturity/feature-maturity.ts +1 -0
- package/src/nexus/api/channel-ask-op.ts +96 -0
- package/src/nexus/api/discord-trigger-bot.ts +28 -1
- package/src/nexus/api/harness-api.ts +2 -1
- package/src/nexus/api/telegram-trigger-bot.ts +24 -0
- package/src/nexus/api/terminals.ts +28 -6
- package/src/patents/ledger.ts +18 -1
- package/src/preview/terminal.ts +4 -2
- package/src/prompt-cache/anthropic.ts +2 -0
- package/src/prompt-enhance/enhance.ts +5 -0
- package/src/pty/snapshot.py +132 -0
- package/src/pty-shell/pty-control-ipc.ts +29 -2
- package/src/pty-shell/pty-manifest.ts +75 -5
- package/src/pty-shell/registry.ts +2 -0
- package/src/pty-shell/tui-run-state.ts +80 -3
- package/src/release-loop/gate-host-reservation.ts +13 -4
- package/src/release-loop/gate-shard-ledger.ts +68 -0
- package/src/release-loop/gate-shards.ts +61 -0
- package/src/release-loop/light-rc.ts +7 -4
- package/src/release-loop/merged-pr-checklist.ts +25 -2
- package/src/release-loop/rehearsal-shard-plan.ts +6 -1
- package/src/release-loop/rehearsal.ts +28 -1
- package/src/repl/index.ts +10 -0
- package/src/research/axis-fanout.ts +133 -0
- package/src/research/edge-decision.ts +197 -0
- package/src/research/gap-followup.ts +249 -0
- package/src/research/lenses/counter-evidence.ts +100 -0
- package/src/research/lenses/working-backwards.ts +89 -0
- package/src/research/output-router.ts +127 -0
- package/src/research/plugin-discovery.ts +242 -0
- package/src/research-bridge/format.ts +16 -1
- package/src/research-bridge/index.ts +1 -0
- package/src/research-bridge/invoke.ts +45 -7
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +34 -106
- package/src/self-dev/decompose.ts +45 -9
- package/src/self-dev/dev-cli.ts +2 -0
- package/src/self-dev/dev-pipeline.ts +8 -4
- package/src/self-dev/draft-residue.ts +221 -2
- package/src/self-dev/draft-sweep.ts +29 -16
- package/src/self-dev/graph-journey-route.ts +10 -2
- package/src/self-dev/launch-preflight-text.ts +2 -2
- package/src/self-dev/launch-preflight.ts +38 -7
- package/src/self-dev/orchestrate-cli.ts +1 -0
- package/src/self-dev/orchestrate.ts +1 -0
- package/src/self-dev/run-supervisor.ts +41 -7
- package/src/self-dev/shard-run.ts +260 -3
- package/src/self-implement/comment-only-source.ts +54 -0
- package/src/self-implement/device-first.ts +8 -2
- package/src/self-implement/doctor-visit.ts +100 -57
- package/src/self-implement/gate-artifacts.ts +5 -2
- package/src/self-implement/gate-baseline.ts +119 -13
- package/src/self-implement/gate-cli.ts +466 -93
- package/src/self-implement/gate-failure-signature.ts +44 -0
- package/src/self-implement/gate-receipt-registry.ts +180 -0
- package/src/self-implement/gate-remote.ts +147 -22
- package/src/self-implement/goal-author-clarification.ts +178 -24
- package/src/self-implement/goal-author-decompose.ts +24 -15
- package/src/self-implement/goal-author.ts +82 -7
- package/src/self-implement/goal-doc/section.ts +22 -0
- package/src/self-implement/goal-supervisor-fill.ts +38 -4
- package/src/self-implement/host-regate.ts +120 -45
- package/src/self-implement/impl-findings-feedback.ts +188 -0
- package/src/self-implement/knowhow-pack.ts +301 -9
- package/src/self-implement/l8-merge-queue.ts +198 -32
- package/src/self-implement/off-diff-evidence.ts +147 -0
- package/src/self-implement/orchestrator.ts +137 -16
- package/src/self-implement/pod-inplace-worktree.ts +82 -0
- package/src/self-implement/pod-warm-pool-profile.ts +2 -2
- package/src/self-implement/premise-review.ts +7 -5
- package/src/self-implement/run-ledger.ts +304 -8
- package/src/self-implement/run-stop.ts +12 -0
- package/src/self-implement/seams.ts +39 -13
- package/src/self-implement/self-implement-cli.ts +30 -4
- package/src/session/channel-ask-op-envelope.ts +36 -0
- package/src/session/channel-op-reply-route.ts +200 -0
- package/src/session/chat.ts +92 -15
- package/src/session/index.ts +2 -0
- package/src/session-runtime/index.ts +9 -22
- package/src/session-runtime/provider-circuit.ts +140 -0
- package/src/shell-runner/file-engine.ts +1 -0
- package/src/shell-runner/types.ts +4 -0
- package/src/sidetab-core/model.ts +176 -0
- package/src/skills/runner.ts +7 -3
- package/src/skills/tools/dev-harness.ts +2 -2
- package/src/skills/tools/schedule-wakeup.ts +24 -7
- package/src/skills/tools/shell.ts +51 -5
- package/src/status/bar.ts +3 -3
- package/src/steward/directive-audit.ts +354 -0
- package/src/storage/file-lock.ts +17 -4
- package/src/surface/child-process.ts +31 -0
- package/src/surface/tui-stderr-owner.ts +48 -0
- package/src/task-agent/adopt-pr.ts +63 -2
- package/src/task-agent/cover.ts +30 -12
- package/src/task-agent/evidence-command-normalize.ts +42 -0
- package/src/task-agent/export-redactions-provision.ts +43 -0
- package/src/task-agent/judge.ts +56 -0
- package/src/task-agent/parent-host.ts +59 -12
- package/src/task-agent/postland-card.ts +35 -2
- package/src/task-agent/rejudge-on-head.ts +46 -2
- package/src/task-agent/repair-cycle.ts +68 -9
- package/src/task-agent/repair-worker.ts +37 -1
- package/src/task-agent/task-hand.ts +226 -33
- package/src/task-agent/tier-split.ts +142 -24
- package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
- package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +57 -5
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
- package/src/task-orchestrator/surfaces/pod-pool.ts +27 -4
- package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +310 -79
- package/src/task-orchestrator/surfaces/self-implement.ts +33 -2
- package/src/terminal/session-registry.ts +1 -0
- package/src/terminal/terminal-modal-router.ts +156 -0
- package/src/tool-hints/gate.ts +6 -4
- package/src/tool-hints/signals.ts +33 -1
- package/src/tool-runtime/skill-exec-runtime.ts +95 -5
- package/src/tui/chat/background-job-status.ts +8 -2
- package/src/tui/entry.ts +483 -32
- package/src/tui/inline-choice.ts +188 -0
- package/src/tui/sidetab/attach.ts +304 -0
- package/src/tui/sidetab/list.ts +2 -0
- package/src/tui/sidetab/nl-tool.ts +136 -0
- package/src/tui/slash/resume-command.ts +23 -0
- package/src/tui/slash/resume.ts +3 -23
- package/src/tui/slash/term-next.ts +2 -1
- package/src/tui/slash/term.ts +12 -1
- package/src/tui-client/dashboard-session.ts +7 -1
- package/src/tui-client/local-chat-turn.ts +29 -8
- package/src/user-config.ts +42 -3
- package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
- package/src/ux-sim/fake-land-queue.ts +88 -0
- package/src/ux-sim/fake-llm.ts +11 -5
- package/src/ux-sim/gate-shard-host-reroute.ts +82 -0
- package/src/ux-sim/goal-interim-trace.ts +24 -0
- package/src/ux-sim/next-tui-seat-scenarios.ts +61 -14
- package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/recipes/explainer.ts +54 -2
- package/src/web-search/grok.ts +32 -6
- package/src/web-search/index.ts +8 -7
- package/src/workflow-runtime/node-catalog.ts +53 -4
- package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1224.2ceca6c180d5130b.js +0 -62
- package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +0 -32
- package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2479-fe7e188bd9402d14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +0 -148
- package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +0 -27
- package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3199.6a1a9b0e6cd01dc6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4036.d54e55e1ebf5acdc.js +0 -90
- package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +0 -226
- package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +0 -287
- package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +0 -24
- package/apps/pwa/out/_next/static/chunks/4937-28d437999b77c9dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +0 -104
- package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +0 -1
- package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5952.294fc574a8625184.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +0 -74
- package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +0 -149
- package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +0 -41
- package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +0 -1
- package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/757-4fbaf50942b8c424.js +0 -1
- package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7c5ed21f-f286708e57cf88f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +0 -8
- package/apps/pwa/out/_next/static/chunks/8080-40d781e7704d3671.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +0 -77
- package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +0 -1
- package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +0 -286
- package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +0 -79
- package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +0 -1
- package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +0 -94
- package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +0 -1
- package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +0 -64
- package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-5c112c6d7c33656e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-88a1edbff62eaf1d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-b9af2ac1c4737ce8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-fb9e639c107f5f72.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +0 -1
- package/scripts/migrate-monad-to-elanous.ts +0 -195
- package/scripts/rebrand-elanous.ts +0 -242
- /package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → HjeK7zONHfR7op1hKXp4k}/_ssgManifest.js +0 -0
|
@@ -13,7 +13,9 @@
|
|
|
13
13
|
// - onProgress ← ux.progress (각 스테이지 진행을 서피스로).
|
|
14
14
|
// - 큰 gate log → ux.spillFile (파일 첨부).
|
|
15
15
|
|
|
16
|
-
import { basename } from 'node:path';
|
|
16
|
+
import { basename, join } from 'node:path';
|
|
17
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
18
|
+
import { existsSync, linkSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
|
|
17
19
|
import type { LLMToolSpec } from '../../llm.js';
|
|
18
20
|
import { childLifetimeSignal } from '../../turn-abort-scope.js';
|
|
19
21
|
import { buildSelfImplementSpec } from '../../self-implement/self-implement-runtime.js';
|
|
@@ -25,7 +27,13 @@ import type { SurfaceUx } from '../../agent/surface-ux/types.js';
|
|
|
25
27
|
import { resolveAutoOpenPrDecision } from '../../self-implement/auto-open-pr.js';
|
|
26
28
|
import { resolveObserveOnlyDecision, _setObserveOnlyConfigReaderForTesting as _setSharedObserveOnlyReaderForTesting } from '../../self-implement/observe-only.js';
|
|
27
29
|
import { debug } from '../../debug/log.js';
|
|
30
|
+
import { globalAgentRegistry, type AgentRegistry } from '../../agent/registry.js';
|
|
31
|
+
import type { TaskNotificationQueue } from '../../agent/task-notification.js';
|
|
32
|
+
import { effectiveInstanceRoot } from '../../instance/resolve.js';
|
|
28
33
|
import { writeAuthoredGoal } from '../../self-implement/goal-author.js';
|
|
34
|
+
import { selfAnswerOrAssumeGoalDocumentClarifications, type GoalClarificationSelfResolver } from '../../self-implement/goal-author-clarification.js';
|
|
35
|
+
import { writeGoalDocumentAtomic } from '../../self-implement/goal-document-write.js';
|
|
36
|
+
import { DecisionLedger } from '../../decisions/decision-ledger.js';
|
|
29
37
|
import { createGoalAuthorDecomposeSteps, readRecentStepCountsFailOpen, readRecentStepCountsFromLogStore, type RecentStepCountReader } from '../../self-implement/goal-author-decompose.js';
|
|
30
38
|
import type { DaemonToolDispatchCtx } from './types.js';
|
|
31
39
|
|
|
@@ -188,6 +196,7 @@ type RunSelfImplementCliFn = (
|
|
|
188
196
|
deps: SelfImplementCliDeps,
|
|
189
197
|
) => Promise<SelfImplementCliOutcome>;
|
|
190
198
|
type SelfImplementSeamsFactory = (opts: import('../../self-implement/seams.js').DefaultSeamsOptions) => SelfImplementSeams | Promise<SelfImplementSeams>;
|
|
199
|
+
type DecisionLedgerFactory = () => DecisionLedger;
|
|
191
200
|
|
|
192
201
|
async function runSelfImplementViaCli(
|
|
193
202
|
command: RunSelfImplementCliFn,
|
|
@@ -240,9 +249,12 @@ export async function dispatchSelfImplement(
|
|
|
240
249
|
authorGoal: SelfImplementGoalAuthor = writeAuthoredGoal,
|
|
241
250
|
runCli: RunSelfImplementCliFn = runSelfImplementCliCommand,
|
|
242
251
|
seamsFactory?: SelfImplementSeamsFactory,
|
|
252
|
+
clarificationResolver?: GoalClarificationSelfResolver,
|
|
253
|
+
decisionLedgerFactory?: DecisionLedgerFactory,
|
|
243
254
|
): Promise<SelfImplementToolResult> {
|
|
244
255
|
const feature = typeof args.feature === 'string' ? args.feature.trim() : '';
|
|
245
256
|
if (!feature) return buildFailedToolResult('SelfImplement: `feature` is required');
|
|
257
|
+
if (ctx.signal?.aborted) throw ctx.signal.reason ?? new Error('SelfImplement aborted');
|
|
246
258
|
try {
|
|
247
259
|
const base = typeof args.base === 'string' && args.base.trim() ? args.base.trim() : undefined;
|
|
248
260
|
const draft = typeof args.draft === 'boolean' ? args.draft : true;
|
|
@@ -292,6 +304,72 @@ export async function dispatchSelfImplement(
|
|
|
292
304
|
}),
|
|
293
305
|
onProgress: (phase, event) => ux.progress(`goal-author ${phase} ${event === 'start' ? 'started' : 'ended'}`, { phase: 'delta' }),
|
|
294
306
|
})).path;
|
|
307
|
+
if (ctx.signal?.aborted) throw ctx.signal.reason ?? new Error('SelfImplement aborted');
|
|
308
|
+
}
|
|
309
|
+
if (goalFile) {
|
|
310
|
+
let authoredDocument: string;
|
|
311
|
+
try {
|
|
312
|
+
authoredDocument = readFileSync(goalFile, 'utf8');
|
|
313
|
+
} catch (error) {
|
|
314
|
+
const errorCode = error && typeof error === 'object' && 'code' in error && typeof error.code === 'string'
|
|
315
|
+
? error.code
|
|
316
|
+
: undefined;
|
|
317
|
+
const reason = errorCode === 'ENOENT'
|
|
318
|
+
? 'goal file missing before clarification'
|
|
319
|
+
: 'goal file unreadable before clarification';
|
|
320
|
+
debug.log('daemon-tools.self-implement', 'goal-clarification-file-read-failed', {
|
|
321
|
+
goalFile,
|
|
322
|
+
errorCode: errorCode ?? null,
|
|
323
|
+
reason,
|
|
324
|
+
});
|
|
325
|
+
return buildFailedToolResult(reason);
|
|
326
|
+
}
|
|
327
|
+
const clarification = await selfAnswerOrAssumeGoalDocumentClarifications(authoredDocument, {
|
|
328
|
+
path: 'say-first',
|
|
329
|
+
...(goalSourceText !== undefined ? { ask: goalSourceText } : {}),
|
|
330
|
+
...(typeof args.runId === 'string' ? { runId: args.runId } : {}),
|
|
331
|
+
...(clarificationResolver !== undefined ? { resolver: clarificationResolver } : {}),
|
|
332
|
+
});
|
|
333
|
+
if (clarification.document !== authoredDocument) writeGoalDocumentAtomic(goalFile, clarification.document);
|
|
334
|
+
if (clarification.decisionRequired.length > 0) {
|
|
335
|
+
const ledger = decisionLedgerFactory?.() ?? new DecisionLedger();
|
|
336
|
+
const decisions = clarification.decisionRequired.map((item) => {
|
|
337
|
+
const ref = `self-implement-clarification:${args.runId ?? goalFile}:${item.questionId}`;
|
|
338
|
+
return ledger.raiseOnce({
|
|
339
|
+
title: `SelfImplement 확인 필요: ${item.header}`.slice(0, 120),
|
|
340
|
+
category: item.category,
|
|
341
|
+
scqa: {
|
|
342
|
+
s: 'SelfImplement 골 저작 중 자동 답변이 끝나지 않은 확인 질문이 남았다',
|
|
343
|
+
c: '금전·보안·되돌릴 수 없는 외부 효과는 정책 가정으로 승인하지 않는다',
|
|
344
|
+
q: item.question.slice(0, 240),
|
|
345
|
+
},
|
|
346
|
+
pendingQuestion: item.question,
|
|
347
|
+
options: [
|
|
348
|
+
{ key: 'a', label: '답을 골 문서에 반영 후 재실행', consequence: '결정 내용을 골 문서에 명시하고 SelfImplement을 다시 호출한다' },
|
|
349
|
+
{ key: 'b', label: '진행하지 않음', consequence: '이 범위는 실행하지 않는다' },
|
|
350
|
+
],
|
|
351
|
+
recommendation: { skipped: true, reason: '금전·보안·되돌릴 수 없는 외부 효과는 자동으로 선택하지 않는다' },
|
|
352
|
+
crossCheckSkipped: '안전상 대표 판단 필요',
|
|
353
|
+
raisedBy: { agent: 'OPC', track: 'OP' },
|
|
354
|
+
refs: [ref],
|
|
355
|
+
}, ref);
|
|
356
|
+
});
|
|
357
|
+
debug.log('daemon-tools.self-implement', 'goal-clarification-no-launch', {
|
|
358
|
+
goalFile,
|
|
359
|
+
decisionIds: decisions.map((decision) => decision.id),
|
|
360
|
+
unanswered: clarification.decisionRequired.length,
|
|
361
|
+
reason: 'safety-critical-clarification-requires-recorded-decision',
|
|
362
|
+
});
|
|
363
|
+
return buildFailedToolResult(`goal author clarification requires a recorded decision before launch; record the answer in the goal document and rerun SelfImplement (${decisions.map((decision) => decision.id).join(', ')})`);
|
|
364
|
+
}
|
|
365
|
+
if (clarification.unanswered > 0) {
|
|
366
|
+
debug.log('daemon-tools.self-implement', 'goal-clarification-assumption-incomplete', {
|
|
367
|
+
goalFile,
|
|
368
|
+
unanswered: clarification.unanswered,
|
|
369
|
+
reason: 'no-launch-unanswered-clarification',
|
|
370
|
+
});
|
|
371
|
+
return buildFailedToolResult(`goal author clarification remains unanswered; launch withheld to prevent a human popup (${clarification.unanswered})`);
|
|
372
|
+
}
|
|
295
373
|
}
|
|
296
374
|
const goalAuthorSummary: GoalAuthorSummary = {
|
|
297
375
|
authored: goalFile !== undefined,
|
|
@@ -322,6 +400,7 @@ export async function dispatchSelfImplement(
|
|
|
322
400
|
);
|
|
323
401
|
|
|
324
402
|
const cliOpts: SelfImplementCliOpts = {
|
|
403
|
+
...(ctx.runId ? { runId: ctx.runId } : {}),
|
|
325
404
|
entry,
|
|
326
405
|
...(ctx.sessionId ? { parentSessionId: ctx.sessionId } : {}),
|
|
327
406
|
...(base ? { base } : {}),
|
|
@@ -336,10 +415,12 @@ export async function dispatchSelfImplement(
|
|
|
336
415
|
};
|
|
337
416
|
// 승인 통로는 surface seams.approvePr 하나다. opts/pipelineDeps.approver를 보강하면
|
|
338
417
|
// 중앙 심이 seams를 다시 조립해 fail-closed 승인 게이트를 우회할 수 있다.
|
|
339
|
-
const pipelineDeps: DevPipelineDeps = { buildSelfImplementSeams: () => seams };
|
|
418
|
+
const pipelineDeps: DevPipelineDeps = { buildSelfImplementSeams: () => seams, signal: ctx.signal };
|
|
340
419
|
const result = run
|
|
341
420
|
? await run({
|
|
342
421
|
feature,
|
|
422
|
+
...(ctx.runId ? { runId: ctx.runId } : {}),
|
|
423
|
+
...(ctx.signal ? { signal: ctx.signal } : {}),
|
|
343
424
|
...(ctx.sessionId ? { parentSessionId: ctx.sessionId } : {}),
|
|
344
425
|
...(base ? { base } : {}),
|
|
345
426
|
draft,
|
|
@@ -369,3 +450,190 @@ export async function dispatchSelfImplement(
|
|
|
369
450
|
return buildFailedToolResult(reason);
|
|
370
451
|
}
|
|
371
452
|
}
|
|
453
|
+
|
|
454
|
+
export type SelfImplementQueuedToolResult = {
|
|
455
|
+
kind: 'launched'; runId: string; taskId: string; state: 'queued' | 'running' | 'done' | 'error' | 'aborted'; ok: boolean;
|
|
456
|
+
message: string; next: string; missing: [];
|
|
457
|
+
};
|
|
458
|
+
|
|
459
|
+
type ManagedAdmissionState = 'queued' | 'running' | 'done' | 'error' | 'aborted';
|
|
460
|
+
export interface ManagedTaskAdmission {
|
|
461
|
+
version: 1;
|
|
462
|
+
requestKey: string;
|
|
463
|
+
runId: string;
|
|
464
|
+
taskId: string;
|
|
465
|
+
parentSessionId?: string;
|
|
466
|
+
feature: string;
|
|
467
|
+
state: ManagedAdmissionState;
|
|
468
|
+
createdAt: number;
|
|
469
|
+
updatedAt: number;
|
|
470
|
+
result?: string;
|
|
471
|
+
error?: string;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
/** File-backed admission ledger. A hard-link claim makes duplicate tool-call admission atomic. */
|
|
475
|
+
export class ManagedTaskAdmissionStore {
|
|
476
|
+
constructor(private readonly root = resolveManagedAdmissionRoot()) {}
|
|
477
|
+
|
|
478
|
+
claim(input: Omit<ManagedTaskAdmission, 'version' | 'createdAt' | 'updatedAt'>): { record: ManagedTaskAdmission; created: boolean } {
|
|
479
|
+
mkdirSync(this.root, { recursive: true });
|
|
480
|
+
const path = this.pathFor(input.requestKey);
|
|
481
|
+
const now = Date.now();
|
|
482
|
+
const record: ManagedTaskAdmission = { ...input, version: 1, createdAt: now, updatedAt: now };
|
|
483
|
+
const temp = join(this.root, `.claim-${randomUUID()}.tmp`);
|
|
484
|
+
writeFileSync(temp, `${JSON.stringify(record)}\n`, { encoding: 'utf8', flag: 'wx', mode: 0o600 });
|
|
485
|
+
try {
|
|
486
|
+
linkSync(temp, path);
|
|
487
|
+
return { record, created: true };
|
|
488
|
+
} catch (error) {
|
|
489
|
+
if ((error as NodeJS.ErrnoException).code !== 'EEXIST') throw error;
|
|
490
|
+
return { record: this.read(path), created: false };
|
|
491
|
+
} finally { rmSync(temp, { force: true }); }
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
update(requestKey: string, patch: Partial<Pick<ManagedTaskAdmission, 'state' | 'result' | 'error'>>): ManagedTaskAdmission {
|
|
495
|
+
const path = this.pathFor(requestKey);
|
|
496
|
+
const record = { ...this.read(path), ...patch, updatedAt: Date.now() };
|
|
497
|
+
const temp = join(this.root, `.update-${randomUUID()}.tmp`);
|
|
498
|
+
writeFileSync(temp, `${JSON.stringify(record)}\n`, { encoding: 'utf8', flag: 'wx', mode: 0o600 });
|
|
499
|
+
renameSync(temp, path);
|
|
500
|
+
return record;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
get(requestKey: string): ManagedTaskAdmission | undefined {
|
|
504
|
+
const path = this.pathFor(requestKey);
|
|
505
|
+
return existsSync(path) ? this.read(path) : undefined;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
private pathFor(requestKey: string): string {
|
|
509
|
+
const digest = createHash('sha256').update(requestKey).digest('hex');
|
|
510
|
+
return join(this.root, `${digest}.json`);
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
private read(path: string): ManagedTaskAdmission {
|
|
514
|
+
const value: unknown = JSON.parse(readFileSync(path, 'utf8'));
|
|
515
|
+
if (!value || typeof value !== 'object' || (value as ManagedTaskAdmission).version !== 1) {
|
|
516
|
+
throw new Error(`invalid SelfImplement admission record: ${path}`);
|
|
517
|
+
}
|
|
518
|
+
return value as ManagedTaskAdmission;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
export function resolveManagedAdmissionRoot(instanceRoot = effectiveInstanceRoot()): string {
|
|
523
|
+
const dataDir = process.env.ELANOUS_DATA_DIR?.trim() || join(instanceRoot, 'data');
|
|
524
|
+
return join(dataDir, 'self-implement-admissions');
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
/** Return a durable-addressable registry identity before doing any goal authoring or child setup. */
|
|
528
|
+
export function dispatchSelfImplementManaged(
|
|
529
|
+
args: Record<string, unknown>,
|
|
530
|
+
ctx: DaemonToolDispatchCtx & { autoMerge?: boolean },
|
|
531
|
+
run?: SelfImplementRunner,
|
|
532
|
+
authorGoal: SelfImplementGoalAuthor = writeAuthoredGoal,
|
|
533
|
+
runCli: RunSelfImplementCliFn = runSelfImplementCliCommand,
|
|
534
|
+
seamsFactory?: SelfImplementSeamsFactory,
|
|
535
|
+
admissionStore: ManagedTaskAdmissionStore = new ManagedTaskAdmissionStore(),
|
|
536
|
+
runtime: { taskNotifications?: TaskNotificationQueue; registry?: AgentRegistry } = {},
|
|
537
|
+
): Promise<SelfImplementQueuedToolResult | SelfImplementToolResult> {
|
|
538
|
+
const feature = typeof args.feature === 'string' ? args.feature.trim() : '';
|
|
539
|
+
if (!feature) return Promise.resolve(buildFailedToolResult('SelfImplement: `feature` is required'));
|
|
540
|
+
const runId = randomUUID();
|
|
541
|
+
const taskId = randomUUID();
|
|
542
|
+
const requestKey = ctx.sessionId && ctx.toolCallId
|
|
543
|
+
? `tool-call:${ctx.sessionId}:${ctx.toolCallId}`
|
|
544
|
+
: `request:${runId}`;
|
|
545
|
+
let claim: ReturnType<ManagedTaskAdmissionStore['claim']>;
|
|
546
|
+
try {
|
|
547
|
+
claim = admissionStore.claim({
|
|
548
|
+
requestKey, runId, taskId, feature,
|
|
549
|
+
...(ctx.sessionId ? { parentSessionId: ctx.sessionId } : {}), state: 'queued',
|
|
550
|
+
});
|
|
551
|
+
} catch (error) {
|
|
552
|
+
return Promise.resolve(buildFailedToolResult(`SelfImplement admission could not be persisted: ${error instanceof Error ? error.message : String(error)}`));
|
|
553
|
+
}
|
|
554
|
+
const registry = runtime.registry ?? globalAgentRegistry;
|
|
555
|
+
if (!claim.created) {
|
|
556
|
+
let record = claim.record;
|
|
557
|
+
let existingTask = registry.get(record.taskId);
|
|
558
|
+
if (!existingTask) {
|
|
559
|
+
existingTask = registry.register(
|
|
560
|
+
{ name: 'self-implement', systemPrompt: 'Managed SelfImplement execution; do not invoke an LLM agent.' },
|
|
561
|
+
record.feature, { id: record.taskId },
|
|
562
|
+
);
|
|
563
|
+
existingTask.runId = record.runId;
|
|
564
|
+
existingTask.parentSessionId = record.parentSessionId;
|
|
565
|
+
existingTask.label = `SelfImplement ${record.feature.slice(0, 80)}`;
|
|
566
|
+
existingTask.background = true;
|
|
567
|
+
if (record.state === 'queued' || record.state === 'running') {
|
|
568
|
+
record = admissionStore.update(requestKey, { state: 'error', error: 'SelfImplement worker was interrupted by process restart; submit a new request to retry.' });
|
|
569
|
+
existingTask.error = record.error;
|
|
570
|
+
existingTask.result = record.error;
|
|
571
|
+
existingTask.state = 'error';
|
|
572
|
+
existingTask.finishedAt = Date.now();
|
|
573
|
+
registry.notifyTaskDone(existingTask);
|
|
574
|
+
} else {
|
|
575
|
+
existingTask.state = record.state;
|
|
576
|
+
existingTask.result = record.result;
|
|
577
|
+
existingTask.error = record.error;
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
return Promise.resolve({
|
|
581
|
+
kind: 'launched', runId: record.runId, taskId: record.taskId, state: record.state,
|
|
582
|
+
ok: record.state !== 'error' && record.state !== 'aborted',
|
|
583
|
+
message: `SelfImplement prior admission · run ${record.runId} · task ${record.taskId}${record.error ? ` · ${record.error}` : ''}`,
|
|
584
|
+
next: `AgentOutput(${record.taskId})`, missing: [],
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
const task = registry.register(
|
|
588
|
+
{ name: 'self-implement', systemPrompt: 'Managed SelfImplement execution; do not invoke an LLM agent.' },
|
|
589
|
+
feature, { id: taskId },
|
|
590
|
+
);
|
|
591
|
+
task.runId = runId;
|
|
592
|
+
task.parentSessionId = ctx.sessionId;
|
|
593
|
+
task.label = `SelfImplement ${feature.slice(0, 80)}`;
|
|
594
|
+
task.background = true;
|
|
595
|
+
const parentChildSignal = childLifetimeSignal(ctx.signal);
|
|
596
|
+
const signal = parentChildSignal
|
|
597
|
+
? AbortSignal.any([task.controller.signal, parentChildSignal])
|
|
598
|
+
: task.controller.signal;
|
|
599
|
+
let unsubscribeRunStop = (): void => {};
|
|
600
|
+
const runStopListenerReady = import('../../self-implement/run-stop.js').then(({ onRunStop, readRunStopRecord }) => {
|
|
601
|
+
unsubscribeRunStop = onRunStop((entry) => {
|
|
602
|
+
if (entry.runId !== runId) return;
|
|
603
|
+
const stop = readRunStopRecord(entry);
|
|
604
|
+
if (!stop) return;
|
|
605
|
+
void import('../../agent/task-notification.js').then(({ enqueueSelfImplementRunStopNotification, globalTaskNotificationQueue }) => {
|
|
606
|
+
enqueueSelfImplementRunStopNotification(
|
|
607
|
+
{ runId, taskId: task.id, feature, stop },
|
|
608
|
+
runtime.taskNotifications ?? globalTaskNotificationQueue,
|
|
609
|
+
);
|
|
610
|
+
debug.log('daemon-tools.self-implement', 'run-stop-wake-enqueued', { runId, taskId: task.id, stopClass: stop.class, site: stop.site ?? null });
|
|
611
|
+
});
|
|
612
|
+
unsubscribeRunStop();
|
|
613
|
+
});
|
|
614
|
+
});
|
|
615
|
+
// The task registry owns cancellation and terminal notification. All slow setup,
|
|
616
|
+
// including goal authoring and seam construction, happens after this receipt.
|
|
617
|
+
queueMicrotask(() => {
|
|
618
|
+
void runStopListenerReady.then(() => registry.runManaged(task.id, async () => {
|
|
619
|
+
admissionStore.update(requestKey, { state: 'running' });
|
|
620
|
+
if (signal.aborted) throw signal.reason ?? new Error('SelfImplement aborted');
|
|
621
|
+
const result = await dispatchSelfImplement(args, { ...ctx, runId, signal }, run, authorGoal, runCli, seamsFactory);
|
|
622
|
+
if (signal.aborted) throw signal.reason ?? new Error('SelfImplement aborted');
|
|
623
|
+
if (result.kind === 'failed') throw new Error(result.reason);
|
|
624
|
+
admissionStore.update(requestKey, { state: 'done', result: JSON.stringify(result) });
|
|
625
|
+
return result;
|
|
626
|
+
}, (result) => JSON.stringify(result)).catch((error) => {
|
|
627
|
+
try { admissionStore.update(requestKey, { state: task.controller.signal.aborted ? 'aborted' : 'error', error: error instanceof Error ? error.message : String(error) }); } catch { /* registry remains authoritative for this process */ }
|
|
628
|
+
debug.log('daemon-tools.self-implement', 'managed-task-failed', {
|
|
629
|
+
runId, taskId: task.id, reason: error instanceof Error ? error.message : String(error),
|
|
630
|
+
}, { level: 'warn' });
|
|
631
|
+
})).finally(unsubscribeRunStop);
|
|
632
|
+
});
|
|
633
|
+
debug.log('daemon-tools.self-implement', 'managed-admitted', { runId, taskId: task.id, parentSessionId: ctx.sessionId ?? null });
|
|
634
|
+
return Promise.resolve({
|
|
635
|
+
kind: 'launched', runId, taskId: task.id, state: claim.record.state, ok: true,
|
|
636
|
+
message: `SelfImplement accepted · run ${runId} · task ${task.id}`,
|
|
637
|
+
next: `AgentOutput(${task.id})`, missing: [],
|
|
638
|
+
});
|
|
639
|
+
}
|
|
@@ -59,6 +59,8 @@ export interface DaemonToolDispatchCtx {
|
|
|
59
59
|
* the args. Optional for backward compat with tests / surfaces that
|
|
60
60
|
* build the ctx by hand without a session in scope. */
|
|
61
61
|
sessionId?: string;
|
|
62
|
+
/** Caller-minted SelfImplement identity, propagated by managed dispatch. */
|
|
63
|
+
runId?: string;
|
|
62
64
|
/** Trusted server-side classification of the current turn, never supplied as a tool argument. */
|
|
63
65
|
requestOrigin?: RequestOrigin;
|
|
64
66
|
/** Owner principal verified at the server request boundary, not from input source metadata. */
|
package/src/bots/screen-probe.ts
CHANGED
|
@@ -343,7 +343,7 @@ export function interpretCrontab(out: { readonly code: number; readonly said: st
|
|
|
343
343
|
// ⇒ 이제 «화이트리스트»다: 이 문면이 아니면 rc≠0 은 전부 「못 물었다」.
|
|
344
344
|
// ⛔⭐ ***부분문자열로 보지 않는다***(3차 리뷰) — ssh 배너·MOTD 에 그 낱말이 섞이면
|
|
345
345
|
// rc≠0 «실패»가 「빈 크론탭」으로 둔갑한다. ⇒ 다듬은 산출이 ***그 한 줄 «전체»***여야 한다.
|
|
346
|
-
// 📏 실측(2026-09-01 ·
|
|
346
|
+
// 📏 실측(2026-09-01 · 원격 노드): 정확히 `no crontab for <user>\n` ⊕ rc=1.
|
|
347
347
|
// (macOS 는 `crontab: ` 접두를 붙이는 판이 있어 그것만 허용한다)
|
|
348
348
|
if (/^(crontab: )?no crontab for \S+$/i.test(out.said.trim())) return '';
|
|
349
349
|
return null;
|
package/src/budget/llm-cost.ts
CHANGED
|
@@ -25,16 +25,49 @@ export interface LlmPricingUsd {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
/** AWS Bedrock Global Standard prices, USD per million tokens (AWS pricing API, ap-northeast-2).
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* `unknownCost()` 로 `kind:'unknown'` 에 머문다 — 0원으로 꾸미지 않는다. */
|
|
28
|
+
* Anthropic(Claude) 축만 담는다 — 이 표는 `isBedrockPricingModel` 게이트(`claude-` 시작) 뒤에 있다.
|
|
29
|
+
* ⛔ BEDROCK-COST-LEDGER(0.2.38) — mantle-openai 비-Anthropic id 는 «다른 표»
|
|
30
|
+
* (`BEDROCK_NON_ANTHROPIC_PRICING_USD`)로 분리했다. 이 객체는 Claude 5.5 착지분 그대로다(보존 계약). */
|
|
32
31
|
export const BEDROCK_PRICING_USD: Readonly<Record<string, LlmPricingUsd>> = {
|
|
33
32
|
'claude-haiku-5-5': { inputPerM: 0.1, outputPerM: 0.5, cacheWritePerM: 0.125, cacheReadPerM: 0.01 },
|
|
34
33
|
'claude-sonnet-5-5': { inputPerM: 2, outputPerM: 10, cacheWritePerM: 2.5, cacheReadPerM: 0.1 },
|
|
35
34
|
'claude-opus-5-5': { inputPerM: 4, outputPerM: 20, cacheWritePerM: 5, cacheReadPerM: 0.2 },
|
|
36
35
|
};
|
|
37
36
|
|
|
37
|
+
/** Bedrock 비-Anthropic(mantle-openai) 단가의 근거 — AWS Price List API(`AmazonBedrock` offer,
|
|
38
|
+
* us-east-1 = mantle-openai 고정 리전) 조회 결과. 게시 시각 2026-10-16T21:08:06Z.
|
|
39
|
+
* 재현: `awscurl`/SDK 로 `GetProducts`(serviceCode=AmazonBedrock, regionCode=USE1) 후
|
|
40
|
+
* `USE1-<id>-mantle-{input,output}-tokens-standard` 키의 `pricePerUnit.USD` 를 읽는다(1K 토큰 단가 ×1000 = per-M).
|
|
41
|
+
* ⛔ 근거 없는 id 는 표에 «넣지 않는다» — `kind:'unknown'` 에 머문다(0원으로 꾸미지 않는다). */
|
|
42
|
+
export const BEDROCK_NON_ANTHROPIC_PRICING_USD: Readonly<Record<string, LlmPricingUsd>> = {
|
|
43
|
+
// AWS price list key: USE1-deepseek.v3.2-mantle-{input,output}-tokens-standard
|
|
44
|
+
'deepseek.v3.2': { inputPerM: 0.62, outputPerM: 1.85 },
|
|
45
|
+
// AWS price list key: USE1-zai.glm-4.7-flash-mantle-{input,output}-tokens-standard
|
|
46
|
+
'zai.glm-4.7-flash': { inputPerM: 0.07, outputPerM: 0.4 },
|
|
47
|
+
// AWS price list key: USE1-moonshotai.kimi-k2.5-mantle-{input,output}-tokens-standard
|
|
48
|
+
'moonshotai.kimi-k2.5': { inputPerM: 0.6, outputPerM: 3 },
|
|
49
|
+
// AWS price list key: USE1-qwen.qwen3-coder-next-mantle-{input,output}-tokens-standard
|
|
50
|
+
'qwen.qwen3-coder-next': { inputPerM: 0.5, outputPerM: 1.2 },
|
|
51
|
+
// AWS price list key: USE1-minimax.minimax-m2.5-mantle-{input,output}-tokens-standard
|
|
52
|
+
'minimax.minimax-m2.5': { inputPerM: 0.3, outputPerM: 1.2 },
|
|
53
|
+
// AWS price list key: USE1-mistral.devstral-2-123b-mantle-{input,output}-tokens-standard
|
|
54
|
+
'mistral.devstral-2-123b': { inputPerM: 0.4, outputPerM: 2 },
|
|
55
|
+
// ⛔ 근거 없음(AWS price list 조회 0행 → 표에 없음): openai.gpt-6-sol · openai.gpt-6-luna · zai.glm-5.
|
|
56
|
+
// 이 셋은 지금 mantle-openai 로 선택 가능하지만 단가 근거가 없으므로 `kind:'unknown'` 이 정직한 답이다.
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/** Bedrock 비-Anthropic(mantle-openai) 단가 조회용 id 정규화 — invoke id 모양을 표의 키로 되돌린다.
|
|
60
|
+
* - `bedrock/` 접두(레지스트리 별칭) · `us.`/`global.` 같은 리전 스코프 접두
|
|
61
|
+
* - `-v1:0` 버전 꼬리 · `-20251001` 날짜 꼬리
|
|
62
|
+
* Anthropic id(`anthropic.claude-…`)는 이 축이 아니다 — `bedrockPricingModelId` 가 맡는다. */
|
|
63
|
+
export function bedrockNonAnthropicPricingModelId(model: string): string {
|
|
64
|
+
return model.trim()
|
|
65
|
+
.replace(/^bedrock\//, '')
|
|
66
|
+
.replace(/^(?:us|eu|apac|global)\./, '')
|
|
67
|
+
.replace(/-v1:\d+$/, '')
|
|
68
|
+
.replace(/-\d{8}$/, '');
|
|
69
|
+
}
|
|
70
|
+
|
|
38
71
|
export interface LlmCostUsage {
|
|
39
72
|
model: string;
|
|
40
73
|
inputTokens?: number;
|
|
@@ -202,7 +235,7 @@ function resolvePricing(
|
|
|
202
235
|
model: string,
|
|
203
236
|
opts?: EstimateLlmCostOptions,
|
|
204
237
|
): { pricing: LlmPricingUsd; source: 'catalog' | 'bedrock-catalog' | 'config' | 'registry' } | undefined {
|
|
205
|
-
// ⭐ 순서: 손 카탈로그(정확) → 정규화 id → config 오버레이 → Bedrock 표 → 저장소 정본 → 레지스트리. 앞이 이긴다.
|
|
238
|
+
// ⭐ 순서: 손 카탈로그(정확) → 정규화 id → config 오버레이 → Claude Bedrock 표 → 저장소 정본 → mantle Bedrock 표 → 레지스트리. 앞이 이긴다.
|
|
206
239
|
const normalized = normalizePricingModelId(model);
|
|
207
240
|
for (const id of normalized === model ? [model] : [model, normalized]) {
|
|
208
241
|
const catalog = catalogPricing(id);
|
|
@@ -216,8 +249,14 @@ function resolvePricing(
|
|
|
216
249
|
const bedrock = BEDROCK_PRICING_USD[bedrockPricingModelId(model)];
|
|
217
250
|
if (validPricing(bedrock)) return { pricing: bedrock, source: 'bedrock-catalog' };
|
|
218
251
|
}
|
|
252
|
+
// 저장소 정본이 mantle 표보다 우선한다. 같은 id 가 생기면 직접 모델 가격을 Bedrock 가격으로 덮지 않는다.
|
|
219
253
|
const builtin = builtinCatalogPricing(normalized);
|
|
220
254
|
if (validPricing(builtin)) return { pricing: builtin, source: 'catalog' };
|
|
255
|
+
// BEDROCK-COST-LEDGER(0.2.38) — mantle-openai 비-Anthropic 축: 근거 있는 행만 bedrock-catalog 로 값을 낸다.
|
|
256
|
+
// 표에 없는 id(openai.gpt-6-sol·zai.glm-5 등)는 여기서 결정되지 않아 아래 정본·레지스트리로 내려가고,
|
|
257
|
+
// 그것도 없으면 `unknownCost()` — 0원으로 꾸미지 않는다.
|
|
258
|
+
const mantle = BEDROCK_NON_ANTHROPIC_PRICING_USD[bedrockNonAnthropicPricingModelId(model)];
|
|
259
|
+
if (validPricing(mantle)) return { pricing: mantle, source: 'bedrock-catalog' };
|
|
221
260
|
const registry = registryPricing(model);
|
|
222
261
|
if (validPricing(registry)) return { pricing: registry, source: 'registry' };
|
|
223
262
|
return undefined;
|
|
@@ -459,6 +459,16 @@ function subscriptionFromCodexSnapshot(snap: UsageSnapshot): SubscriptionAxis {
|
|
|
459
459
|
* 📏 응답 모양(실측 2026-09-23): `{data:{total_credits, total_usage}}` (USD). */
|
|
460
460
|
export const OPENROUTER_CREDITS_ENDPOINT = 'https://openrouter.ai/api/v1/credits';
|
|
461
461
|
export const OPENROUTER_KEY_ENDPOINT = 'https://openrouter.ai/api/v1/key';
|
|
462
|
+
|
|
463
|
+
/** 📏 CREDIT-READOUT 관측 — /key readout 이 «키 한도 note» 를 못 만든 이유를 남긴다.
|
|
464
|
+
* note 없는 openrouter 행만 보면 «/key 를 안 불렀나 · 404 인가 · 한도가 null(무제한) 인가» 가
|
|
465
|
+
* 안 갈리므로 판단 근거를 로그에 남긴다(행·문면·원장 형식은 불변 — 진단 전용). */
|
|
466
|
+
const OPENROUTER_KEY_UNAVAILABLE_EVENT = 'openrouter-key-unavailable';
|
|
467
|
+
type OpenRouterKeyUnavailableReason = 'http-error' | 'limit-not-finite' | 'throw';
|
|
468
|
+
function logOpenRouterKeyUnavailable(reason: OpenRouterKeyUnavailableReason, detail?: string): void {
|
|
469
|
+
debug.log('usage', OPENROUTER_KEY_UNAVAILABLE_EVENT, detail === undefined ? { reason } : { reason, detail });
|
|
470
|
+
}
|
|
471
|
+
|
|
462
472
|
async function collectOpenRouterRows(deps: UnifiedUsageDeps): Promise<AccountUsageRow[]> {
|
|
463
473
|
// ⛔ 시험 런타임은 seam 이 없으면 «키 없음»으로 본다 — 키 캐시는 «파일»이라 env 스크럽을 통과해
|
|
464
474
|
// 기존 시험들이 실제 네트워크를 치게 된다(seam 을 모르는 옛 시험이 다수).
|
|
@@ -497,10 +507,16 @@ async function collectOpenRouterRows(deps: UnifiedUsageDeps): Promise<AccountUsa
|
|
|
497
507
|
if (typeof limit === 'number' && Number.isFinite(limit)
|
|
498
508
|
&& typeof limitRemaining === 'number' && Number.isFinite(limitRemaining)) {
|
|
499
509
|
note = `키 한도 남은 금액 $${limitRemaining.toFixed(2)}`;
|
|
510
|
+
} else {
|
|
511
|
+
logOpenRouterKeyUnavailable('limit-not-finite',
|
|
512
|
+
`limit=${JSON.stringify(limit) ?? 'absent'} limit_remaining=${JSON.stringify(limitRemaining) ?? 'absent'}`);
|
|
500
513
|
}
|
|
514
|
+
} else {
|
|
515
|
+
logOpenRouterKeyUnavailable('http-error', `http-${keyRes.status}`);
|
|
501
516
|
}
|
|
502
|
-
} catch {
|
|
517
|
+
} catch (err) {
|
|
503
518
|
// Key metadata is optional; preserve the successful credits row when unavailable.
|
|
519
|
+
logOpenRouterKeyUnavailable('throw', err instanceof Error ? err.message : String(err));
|
|
504
520
|
}
|
|
505
521
|
return [{
|
|
506
522
|
...base,
|
|
@@ -39,7 +39,7 @@ import { createTuiScreenMirror } from './tui-screen-mirror.js';
|
|
|
39
39
|
import { getChannelBus } from '../terminal-matrix/index.js';
|
|
40
40
|
import { publishSelfReportFrame } from './self-report-frame.js';
|
|
41
41
|
import {
|
|
42
|
-
upsertPtyManifest, updatePtyManifestFrame, touchLivePtyManifest, markPtyManifestClosed, removePtyManifest, getPtyManifest,
|
|
42
|
+
upsertPtyManifest, updatePtyManifestFrame, updatePtyManifestSession, touchLivePtyManifest, markPtyManifestClosed, removePtyManifest, getPtyManifest,
|
|
43
43
|
updatePtyManifestBuild,
|
|
44
44
|
} from '../pty-shell/pty-manifest.js';
|
|
45
45
|
import { writeHarnessScreen } from '../harness/harness-screen.js';
|
|
@@ -125,6 +125,8 @@ export interface TuiControlTargetDeps {
|
|
|
125
125
|
dims?: () => { readonly cols: number; readonly rows: number } | undefined;
|
|
126
126
|
/** 외부 주입 라우터 — 글 한 줄을 사용자 버퍼에 섞지 않고 별도 대기열로 돌린다(`input/external-input-queue`). */
|
|
127
127
|
routeExternal?: (chars: string) => ExternalInputRoute;
|
|
128
|
+
/** Active TUI turn cancellation hook; absent means there is no force-stop capability. */
|
|
129
|
+
stopTurn?: () => boolean;
|
|
128
130
|
}
|
|
129
131
|
|
|
130
132
|
function stdoutDims(): { cols: number; rows: number } | undefined {
|
|
@@ -136,6 +138,16 @@ export interface TuiControlTarget extends PtyControlTarget {
|
|
|
136
138
|
deactivate(): void;
|
|
137
139
|
}
|
|
138
140
|
|
|
141
|
+
let activeTuiForceStop: (() => boolean) | null = null;
|
|
142
|
+
|
|
143
|
+
/** Dashboard turn owner hook used by the foreground TUI's control target. */
|
|
144
|
+
export function registerTuiForceStopHandler(handler: () => boolean): () => void {
|
|
145
|
+
activeTuiForceStop = handler;
|
|
146
|
+
return () => {
|
|
147
|
+
if (activeTuiForceStop === handler) activeTuiForceStop = null;
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
139
151
|
/** Adapt the foreground TUI's own terminal to the existing PTY control
|
|
140
152
|
* protocol without pretending it is a spawned child process. */
|
|
141
153
|
export function createTuiControlTarget(surfaceId: string, deps: TuiControlTargetDeps = {}): TuiControlTarget {
|
|
@@ -143,6 +155,7 @@ export function createTuiControlTarget(surfaceId: string, deps: TuiControlTarget
|
|
|
143
155
|
const parse = deps.splitKeys ?? splitKeys;
|
|
144
156
|
const dims = deps.dims ?? stdoutDims;
|
|
145
157
|
const routeExternal = deps.routeExternal ?? routeExternalInput;
|
|
158
|
+
const stopTurn = deps.stopTurn ?? (() => activeTuiForceStop?.() ?? false);
|
|
146
159
|
let alive = true;
|
|
147
160
|
let accessMode: PtyAccessMode = 'write';
|
|
148
161
|
let transitionPolicy: PtyTransitionPolicy = 'open';
|
|
@@ -160,6 +173,7 @@ export function createTuiControlTarget(surfaceId: string, deps: TuiControlTarget
|
|
|
160
173
|
return true;
|
|
161
174
|
},
|
|
162
175
|
isAlive: () => alive,
|
|
176
|
+
stopTurn: (force: true) => force && stopTurn(),
|
|
163
177
|
canWrite: (actor: PtyWriteActor = 'human') => resolveWriteDecision(accessMode, actor).allow,
|
|
164
178
|
write(chars: string): void {
|
|
165
179
|
// ⭐ 이 write 는 «바깥»(제어 IPC)에서만 온다 — 키보드와 섞이기 전에 라우터가 먼저 가른다.
|
|
@@ -468,7 +482,15 @@ export function startTuiSelfReport(deps: TuiSelfReportDeps = {}): () => void {
|
|
|
468
482
|
lastEmittedText = text;
|
|
469
483
|
// TUI-H9 — 이 프레임이 «지금 이 TUI 가 보여 주는 대화» 의 소유 기록이다. 재기동은 이 id 로만 잇는다
|
|
470
484
|
// (읽기 실패 → 소유 없음 → 재기동 막힘 · 다른 세션으로 대체하지 않는다).
|
|
471
|
-
|
|
485
|
+
let sessionId: string | null = null;
|
|
486
|
+
try {
|
|
487
|
+
sessionId = readActiveSessionId();
|
|
488
|
+
claimTuiOwnedSession(sessionId, at);
|
|
489
|
+
} catch {
|
|
490
|
+
sessionId = null;
|
|
491
|
+
claimTuiOwnedSession(null, at);
|
|
492
|
+
}
|
|
493
|
+
try { updatePtyManifestSession(surfaceId, sessionId ?? '', at); } catch { /* fail-soft */ }
|
|
472
494
|
const frame: SelfReportFrame = { surfaceId, instance, kind: 'tui', mode: 'self-report', text, cols, rows, at, ...(runId ? { runId } : {}) };
|
|
473
495
|
try { publishFrame(frame); } catch { /* fail-soft */ }
|
|
474
496
|
// `at` is shared with the manifest write → its internal throttle keys
|
package/src/chat/index.ts
CHANGED
|
@@ -452,12 +452,21 @@ export interface SlashCommand {
|
|
|
452
452
|
name: string; // e.g. 'quit'
|
|
453
453
|
aliases?: string[]; // e.g. ['q', 'exit']
|
|
454
454
|
description: string; // shown in picker
|
|
455
|
+
/** Keep a command executable, but omit it from slash discovery surfaces. */
|
|
456
|
+
hidden?: boolean;
|
|
455
457
|
/** First-positional-arg suggestions (static). E.g. /plugin → [list, activate, ...]. */
|
|
456
458
|
subcommands?: string[];
|
|
457
459
|
}
|
|
458
460
|
|
|
461
|
+
/** The 15 slash commands exposed on the first-use menu and in /help. */
|
|
462
|
+
export const SLASH_MENU_POLICY = {
|
|
463
|
+
required: ['help', 'status', 'model', 'clear', 'resume', 'quit', 'now', 'harness', 'memory', 'side'],
|
|
464
|
+
reserve: ['context', 'remaining', 'session', 'setup', 'decide'],
|
|
465
|
+
} as const;
|
|
466
|
+
const FIRST_USE_SLASH_COMMANDS: ReadonlySet<string> = new Set([...SLASH_MENU_POLICY.required, ...SLASH_MENU_POLICY.reserve]);
|
|
467
|
+
|
|
459
468
|
// Default commands available in the input
|
|
460
|
-
export const SLASH_COMMANDS: SlashCommand[] = [
|
|
469
|
+
export const SLASH_COMMANDS: SlashCommand[] = ([
|
|
461
470
|
{ name: 'help', aliases: ['?'], description: '명령과 키 보기' },
|
|
462
471
|
{ name: 'resume', aliases: [], description: '지난 대화 이어 가기 · /resume <id 앞자리>' },
|
|
463
472
|
{ name: 'model', aliases: ['m'], description: '모델 바꾸기 — /model 빠름|보통|깊음 (코드명도 됨)', subcommands: ['빠름', '보통', '깊음', 'codex', 'terra', 'sol', 'luna', 'opus', 'sonnet', 'grok'] },
|
|
@@ -514,6 +523,7 @@ export const SLASH_COMMANDS: SlashCommand[] = [
|
|
|
514
523
|
{ name: 'tablet', aliases: [], description: 'Tablet mode — collapse layout to log + input', subcommands: ['on', 'off', 'toggle', 'auto', 'status', 'browser-preview', 'bp'] },
|
|
515
524
|
{ name: 'surface', aliases: [], description: 'Surface control — open a pane/catalog launcher (/surface catalog · browser · preview · log · scratch · obsidian · skill) OR set a preferred LLM surface (/surface coding-agent · research-agent · control-agent · ops-agent · … · clear · status)', subcommands: ['catalog', 'browser', 'preview', 'browser-preview', 'log', 'scratch', 'obsidian', 'skill', 'skill-file', 'agents', 'coding-agent', 'coding-chat', 'research-agent', 'research-chat', 'control-agent', 'ops-ui-agent', 'ops-fleet-agent', 'ops-agent', 'clear', 'status'] },
|
|
516
525
|
{ name: 'term', aliases: ['terminal'], description: 'Interactive terminal modal — new / list / attach / detach / switch / kill / snapshot / resume', subcommands: ['new', 'list', 'attach', 'detach', 'switch', 'kill', 'snapshot', 'resume'] },
|
|
526
|
+
{ name: 'side', aliases: [], description: '사이드탭 기초 — 목록 · 셸 생성 · 번호로 PTY 보기/attach', subcommands: ['list', 'new', 'attach'] },
|
|
517
527
|
{ name: 'claude', aliases: [], description: 'Spawn claude-code CLI in a terminal modal' },
|
|
518
528
|
{ name: 'codex', aliases: [], description: 'Spawn codex CLI in a terminal modal' },
|
|
519
529
|
{ name: 'gemini', aliases: [], description: 'Spawn gemini CLI in a terminal modal' },
|
|
@@ -537,11 +547,12 @@ export const SLASH_COMMANDS: SlashCommand[] = [
|
|
|
537
547
|
{ name: 'voice-chat', aliases: ['vc'], description: 'Continuous voice chat mode — speak, elanous replies in voice (Phase 4-5). Subcommands: start / stop / cancel / status. Chord: Alt+R toggles enter/exit anywhere.', subcommands: ['start', 'stop', 'cancel', 'status'] },
|
|
538
548
|
{ name: 'auto-tts', aliases: ['tts', 'autotts'], description: 'Auto-TTS for chat responses (Phase 2) — speaks LLM replies sentence-by-sentence. Subcommands: on / off / toggle / status.', subcommands: ['on', 'off', 'toggle', 'status'] },
|
|
539
549
|
{ name: 'directive', aliases: [], description: '(운영) 지시를 Linear 이슈로 기록' },
|
|
540
|
-
];
|
|
550
|
+
]).map((command) => ({ ...command, hidden: !FIRST_USE_SLASH_COMMANDS.has(command.name) }));
|
|
541
551
|
|
|
542
552
|
/** Every user-visible slash spelling, normalized for runtime-catalog comparison. */
|
|
543
553
|
export function displayedSlashCommandNames(commands: readonly SlashCommand[] = SLASH_COMMANDS): string[] {
|
|
544
|
-
return commands.
|
|
554
|
+
return commands.filter((command) => !command.hidden)
|
|
555
|
+
.flatMap((command) => [command.name, ...(command.aliases ?? [])]);
|
|
545
556
|
}
|
|
546
557
|
|
|
547
558
|
/** Score and rank slash commands against the user's typed text (sans leading `/`).
|
|
@@ -552,15 +563,16 @@ export function displayedSlashCommandNames(commands: readonly SlashCommand[] = S
|
|
|
552
563
|
* prefix-on-alias 80
|
|
553
564
|
* substring-on-name 50
|
|
554
565
|
* word-start in desc 10 (regex \b<text>)
|
|
555
|
-
* Sort by score desc, then name asc.
|
|
556
|
-
*
|
|
566
|
+
* Sort by score desc, then name asc. Hidden commands are omitted from discovery,
|
|
567
|
+
* while the dispatch registry continues to accept direct input. */
|
|
557
568
|
export function filterSlashCommands(text: string, commands: SlashCommand[]): SlashCommand[] {
|
|
569
|
+
const discoverable = commands.filter((command) => !command.hidden);
|
|
558
570
|
const q = text.toLowerCase();
|
|
559
|
-
if (!q) return
|
|
571
|
+
if (!q) return discoverable;
|
|
560
572
|
const escaped = q.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
561
573
|
const descRe = new RegExp(`\\b${escaped}`, 'i');
|
|
562
574
|
const scored: { cmd: SlashCommand; score: number }[] = [];
|
|
563
|
-
for (const cmd of
|
|
575
|
+
for (const cmd of discoverable) {
|
|
564
576
|
const name = cmd.name.toLowerCase();
|
|
565
577
|
const aliases = (cmd.aliases ?? []).map(a => a.toLowerCase());
|
|
566
578
|
let score = 0;
|
|
@@ -800,6 +812,11 @@ export async function textInput(opts: {
|
|
|
800
812
|
onKey?: (key: import('../tui.js').Key) =>
|
|
801
813
|
| 'consumed' | 'passthrough'
|
|
802
814
|
| Promise<'consumed' | 'passthrough'>;
|
|
815
|
+
/** Host escape-chord override. Runs before textInput's unconditional
|
|
816
|
+
* quit path so a host can turn a chord into an in-app action. */
|
|
817
|
+
onQuitChord?: (key: import('../tui.js').Key) =>
|
|
818
|
+
| 'consumed' | 'passthrough'
|
|
819
|
+
| Promise<'consumed' | 'passthrough'>;
|
|
803
820
|
/** Provide candidate file/directory entries for the `@`-mention
|
|
804
821
|
* picker. Called with whatever the user has typed after `@` (may
|
|
805
822
|
* include subpath fragments like `foo/ba`). Host decides what
|
|
@@ -1595,6 +1612,16 @@ export async function textInput(opts: {
|
|
|
1595
1612
|
});
|
|
1596
1613
|
}
|
|
1597
1614
|
|
|
1615
|
+
// A host may claim a quit chord as an in-app action (classic
|
|
1616
|
+
// dashboard Ctrl+\\ shows side-tab guidance and keeps the TUI alive).
|
|
1617
|
+
if (isTextInputQuitChord(key) && opts.onQuitChord) {
|
|
1618
|
+
const quitRoute = await Promise.resolve(opts.onQuitChord(key));
|
|
1619
|
+
if (quitRoute === 'consumed') {
|
|
1620
|
+
drawAll();
|
|
1621
|
+
continue;
|
|
1622
|
+
}
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1598
1625
|
// Hard exit must win over modal/VW pre-routing. When a foreground
|
|
1599
1626
|
// virtual window is open, onPreKey may hand keys to the modal
|
|
1600
1627
|
// surface before textInput's own quit branch runs. Claim the quit
|