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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/** In-process LAND-QUEUE simulator. Scheduling and verdict logic use the production train functions;
|
|
2
|
+
* only git's merge-tree/commit-tree and the remote gate are replaced. */
|
|
3
|
+
import { integrateTrain, runTrain, type TrainCandidate, type TrainGit, type TrainVerdict } from '../self-implement/merge-train.js';
|
|
4
|
+
|
|
5
|
+
export type FakeLandQueueItem = TrainCandidate & { files: string[] };
|
|
6
|
+
export type FakeLandQueueInput = {
|
|
7
|
+
readonly queue: readonly FakeLandQueueItem[];
|
|
8
|
+
readonly load: number;
|
|
9
|
+
readonly previousSlots?: 2 | 3;
|
|
10
|
+
readonly cutWindowOpen?: boolean;
|
|
11
|
+
readonly expedite?: number;
|
|
12
|
+
readonly eject?: readonly number[];
|
|
13
|
+
readonly conflicting?: readonly number[];
|
|
14
|
+
readonly gates?: readonly ('pass' | 'fail' | 'unmeasured')[];
|
|
15
|
+
};
|
|
16
|
+
export type FakeLandQueueResult = {
|
|
17
|
+
readonly slots: 2 | 3;
|
|
18
|
+
readonly departed: readonly (readonly number[])[];
|
|
19
|
+
readonly waiting: readonly number[];
|
|
20
|
+
readonly ejected: readonly number[];
|
|
21
|
+
readonly stoppedAtCut: boolean;
|
|
22
|
+
readonly verdicts: readonly TrainVerdict[];
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/** Hysteresis prevents slot oscillation: below 60% expand; at/above 80% contract. */
|
|
26
|
+
export function fakeLandSlots(load: number, previous: 2 | 3 = 2): 2 | 3 {
|
|
27
|
+
if (!Number.isFinite(load) || load < 0 || load > 100) throw new Error('load must be between 0 and 100');
|
|
28
|
+
if (load < 60) return 3;
|
|
29
|
+
if (load >= 80) return 2;
|
|
30
|
+
return previous;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function syntheticGit(conflicting: ReadonlySet<number>, prByHead: ReadonlyMap<string, number>): TrainGit {
|
|
34
|
+
let commit = 0;
|
|
35
|
+
const sha = (n: number) => n.toString(16).padStart(40, '0');
|
|
36
|
+
return (args) => {
|
|
37
|
+
const command = args.find((arg) => arg === 'merge-tree' || arg === 'commit-tree');
|
|
38
|
+
if (command === 'merge-tree') {
|
|
39
|
+
const pr = prByHead.get(args.at(-1) ?? '');
|
|
40
|
+
return pr !== undefined && conflicting.has(pr)
|
|
41
|
+
? { status: 1, stdout: `${sha(900 + (pr ?? 0))}\0src/conflict.ts\0\0`, stderr: '' }
|
|
42
|
+
: { status: 0, stdout: `${sha(900 + (pr ?? 0))}\0`, stderr: '' };
|
|
43
|
+
}
|
|
44
|
+
if (command === 'commit-tree') return { status: 0, stdout: sha(++commit), stderr: '' };
|
|
45
|
+
return { status: 2, stdout: '', stderr: `unsupported fake git command: ${args[0]}` };
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** One dry-run tick. Cut-window closure and ejection never call the train; no ref is updated. */
|
|
50
|
+
export async function simulateFakeLandQueue(input: FakeLandQueueInput): Promise<FakeLandQueueResult> {
|
|
51
|
+
const ejected = new Set(input.eject ?? []);
|
|
52
|
+
const queue = input.queue.filter((item) => !ejected.has(item.number)).map((item) => ({ ...item, files: [...item.files] }));
|
|
53
|
+
if (input.expedite !== undefined) {
|
|
54
|
+
const at = queue.findIndex((item) => item.number === input.expedite);
|
|
55
|
+
if (at >= 0) queue.unshift(...queue.splice(at, 1));
|
|
56
|
+
}
|
|
57
|
+
const slots = fakeLandSlots(input.load, input.previousSlots);
|
|
58
|
+
if (input.cutWindowOpen === false) return {
|
|
59
|
+
slots, departed: [], waiting: queue.map((item) => item.number), ejected: [...ejected], stoppedAtCut: true, verdicts: [],
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const departed: number[][] = [];
|
|
63
|
+
const waiting: number[] = [];
|
|
64
|
+
const verdicts: TrainVerdict[] = [];
|
|
65
|
+
const gates = [...(input.gates ?? [])];
|
|
66
|
+
const git = syntheticGit(new Set(input.conflicting ?? []), new Map(queue.map((item) => [item.head, item.number])));
|
|
67
|
+
while (queue.length) {
|
|
68
|
+
const batch: FakeLandQueueItem[] = [];
|
|
69
|
+
const occupied = new Set<string>();
|
|
70
|
+
for (let i = 0; i < queue.length && batch.length < slots;) {
|
|
71
|
+
const candidate = queue[i]!;
|
|
72
|
+
if (candidate.files.some((file) => occupied.has(file))) { waiting.push(candidate.number); queue.splice(i, 1); continue; }
|
|
73
|
+
batch.push(candidate); queue.splice(i, 1); candidate.files.forEach((file) => occupied.add(file));
|
|
74
|
+
}
|
|
75
|
+
if (!batch.length) break;
|
|
76
|
+
departed.push(batch.map((item) => item.number));
|
|
77
|
+
const train = await runTrain(batch, {
|
|
78
|
+
integrate: (candidates) => {
|
|
79
|
+
const integrated = integrateTrain('/fake-land-queue', '1'.repeat(40), candidates, git);
|
|
80
|
+
return integrated;
|
|
81
|
+
},
|
|
82
|
+
gate: async () => gates.shift() ?? 'pass',
|
|
83
|
+
observe: () => {},
|
|
84
|
+
});
|
|
85
|
+
verdicts.push(...train.verdicts);
|
|
86
|
+
}
|
|
87
|
+
return { slots, departed, waiting: [...waiting, ...queue.map((item) => item.number)], ejected: [...ejected], stoppedAtCut: false, verdicts };
|
|
88
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/** S1 device for a release gate's shard dispatch. It replaces host execution, not planning or reduction. */
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import {
|
|
4
|
+
planGateShardDispatch,
|
|
5
|
+
reduceGateShardReceipts,
|
|
6
|
+
type GateShardAction,
|
|
7
|
+
type GateShardDispatchInput,
|
|
8
|
+
type GateShardReceipt,
|
|
9
|
+
type GateShardReduction,
|
|
10
|
+
} from '../../scripts/release-loop/gate-shard-dispatch.js';
|
|
11
|
+
|
|
12
|
+
export interface FakeGateShardHostResult {
|
|
13
|
+
shardId: string;
|
|
14
|
+
host: string;
|
|
15
|
+
status: 'complete' | 'unmeasured';
|
|
16
|
+
failureIds: string[];
|
|
17
|
+
errorIds: string[];
|
|
18
|
+
envKey?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface GateShardRerouteScenario {
|
|
22
|
+
input: GateShardDispatchInput;
|
|
23
|
+
/** A result is supplied only for an expected host call. An omitted result remains unmeasured. */
|
|
24
|
+
hostResults: readonly FakeGateShardHostResult[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface FakeGateShardHostCall {
|
|
28
|
+
shardId: string;
|
|
29
|
+
host: string;
|
|
30
|
+
files: string[];
|
|
31
|
+
head40: string;
|
|
32
|
+
base40: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface GateShardRerouteObservation {
|
|
36
|
+
actions: GateShardAction[];
|
|
37
|
+
hostCalls: FakeGateShardHostCall[];
|
|
38
|
+
/** One selected receipt per reused or executed shard; no predecessor fills a failed remeasurement. */
|
|
39
|
+
receipts: GateShardReceipt[];
|
|
40
|
+
reduction: GateShardReduction;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Stage inputs without making dispatch decisions; the production planner receives them unchanged. */
|
|
44
|
+
export function gateShardRerouteScenario(
|
|
45
|
+
input: GateShardDispatchInput,
|
|
46
|
+
hostResults: readonly FakeGateShardHostResult[],
|
|
47
|
+
): GateShardRerouteScenario {
|
|
48
|
+
return { input, hostResults };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Inject deterministic fake host results into the production planner and reducer. This never starts a gate,
|
|
53
|
+
* Pod, SSH command, or host sweep. The fake evidence digest is a scenario marker, not an artifact verification;
|
|
54
|
+
* the caller of the production planner still owns verification before reuse.
|
|
55
|
+
*/
|
|
56
|
+
export function simGateShardHostReroute(scenario: GateShardRerouteScenario): GateShardRerouteObservation {
|
|
57
|
+
const actions = planGateShardDispatch(scenario.input);
|
|
58
|
+
const hostCalls: FakeGateShardHostCall[] = [];
|
|
59
|
+
const receipts: GateShardReceipt[] = [];
|
|
60
|
+
for (const action of actions) {
|
|
61
|
+
if (action.kind === 'reuse') {
|
|
62
|
+
receipts.push(action.receipt);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (action.kind === 'unmeasured') continue;
|
|
66
|
+
hostCalls.push({ shardId: action.shardId, host: action.host, files: [...action.files],
|
|
67
|
+
head40: scenario.input.head40, base40: scenario.input.base40 });
|
|
68
|
+
const result = scenario.hostResults.find((row) => row.shardId === action.shardId && row.host === action.host);
|
|
69
|
+
if (!result) continue;
|
|
70
|
+
const evidence = JSON.stringify({ head40: scenario.input.head40, base40: scenario.input.base40,
|
|
71
|
+
shardId: action.shardId, host: action.host, files: action.files, result });
|
|
72
|
+
receipts.push({ id: action.shardId, files: [...action.files], head40: scenario.input.head40, base40: scenario.input.base40,
|
|
73
|
+
host: action.host, envKey: result.envKey ?? `sim:${action.host}`, status: result.status,
|
|
74
|
+
failureIds: [...result.failureIds], errorIds: [...result.errorIds],
|
|
75
|
+
evidencePath: `sim/${action.shardId}-${action.host}.json`,
|
|
76
|
+
evidenceSha256: createHash('sha256').update(evidence).digest('hex'),
|
|
77
|
+
measuredAt: '2026-10-27T00:00:00.000Z', attempt: (action.replacing?.attempt ?? 0) + 1 });
|
|
78
|
+
}
|
|
79
|
+
const reduction = reduceGateShardReceipts({ head40: scenario.input.head40, base40: scenario.input.base40,
|
|
80
|
+
shards: scenario.input.shards, receipts });
|
|
81
|
+
return { actions, hostCalls, receipts, reduction };
|
|
82
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** One injected input trace shared by classic and next goal-interim renderer evidence. */
|
|
2
|
+
export const GOAL_INTERIM_USER_INPUT = '영상 만들어줘';
|
|
3
|
+
export const GOAL_INTERIM_NOT_DONE_REPLY = '[fake-llm] {step}단계 렌더를 진행했습니다.\n남은 작업 {step}단계: 완료 영상 경로는 아직 보고할 수 없습니다 — 아직 못 했습니다.';
|
|
4
|
+
export const GOAL_INTERIM_TOOL_CALL = JSON.stringify({ when: GOAL_INTERIM_USER_INPUT, name: 'ScheduleWakeup', args: { delaySeconds: 3600, reason: '렌더 점검' } });
|
|
5
|
+
|
|
6
|
+
export const GOAL_INTERIM_RENDER_TRACE = {
|
|
7
|
+
userInput: GOAL_INTERIM_USER_INPUT,
|
|
8
|
+
interimReplies: [1, 2].map((step) => GOAL_INTERIM_NOT_DONE_REPLY.replaceAll('{step}', String(step))),
|
|
9
|
+
finalReply: '완료 영상: /tmp/final.mp4',
|
|
10
|
+
toolCalls: ['ScheduleWakeup', 'ScheduleWakeup progress', 'ScheduleWakeup progress'],
|
|
11
|
+
} as const;
|
|
12
|
+
|
|
13
|
+
export function goalInterimRenderMessages(ts: string) {
|
|
14
|
+
const trace = GOAL_INTERIM_RENDER_TRACE;
|
|
15
|
+
return [
|
|
16
|
+
{ role: 'user' as const, content: trace.userInput, ts },
|
|
17
|
+
{ role: 'tool' as const, content: '', toolName: trace.toolCalls[0], toolResult: '예약됨', ts },
|
|
18
|
+
{ role: 'tool' as const, content: '', toolName: trace.toolCalls[1], toolResult: '진행', ts },
|
|
19
|
+
{ role: 'assistant' as const, goalInterim: true, content: trace.interimReplies[0], ts },
|
|
20
|
+
{ role: 'tool' as const, content: '', toolName: trace.toolCalls[2], toolResult: '진행', ts },
|
|
21
|
+
{ role: 'assistant' as const, goalInterim: true, content: trace.interimReplies[1], ts },
|
|
22
|
+
{ role: 'assistant' as const, content: trace.finalReply, ts },
|
|
23
|
+
];
|
|
24
|
+
}
|
|
@@ -7,6 +7,8 @@ import { chmodSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from '
|
|
|
7
7
|
import { join, resolve } from 'node:path';
|
|
8
8
|
import { appendMessage, createSession, getActiveSessionId, loadSession, setActiveSessionId } from '../session/index.js';
|
|
9
9
|
import { mockSeatPtySequence, type SeatPtySequenceEvidence, type SeatPtyStep } from './mock-seat-pty-sequence.js';
|
|
10
|
+
import { GOAL_INTERIM_NOT_DONE_REPLY, GOAL_INTERIM_TOOL_CALL } from './goal-interim-trace.js';
|
|
11
|
+
export { GOAL_INTERIM_NOT_DONE_REPLY, GOAL_INTERIM_TOOL_CALL } from './goal-interim-trace.js';
|
|
10
12
|
import { pasteFoldToken } from '../chat/paste-fold.js';
|
|
11
13
|
import { DEFAULT_GOAL_CONTINUE_CAP } from '../dashboard/input/goal-continue.js';
|
|
12
14
|
import {
|
|
@@ -471,29 +473,24 @@ async function runNextProactiveContinueScenario(spec: NextTuiScenarioSpec, root:
|
|
|
471
473
|
/** TUI-NEXT-QUEUE-AND-WAKE ② — a turn calls ScheduleWakeup(60s); a slow human turn covers the due time
|
|
472
474
|
* (NotIdle → deferred a minute), then the wakeup opens one internal turn on its own. */
|
|
473
475
|
async function runNextWakeupScenario(spec: NextTuiScenarioSpec, root: string, base: ScenarioBase, reply: string, done: Done): Promise<NextTuiScenarioResult> {
|
|
474
|
-
let scheduledAt = 0;
|
|
475
476
|
const banner = '↻ 자동 재개(scheduled): 점검';
|
|
476
477
|
const steps: SeatPtyStep[] = [
|
|
477
478
|
{
|
|
478
479
|
label: 'scheduled',
|
|
479
480
|
text: '60초 뒤 예약해줘',
|
|
480
|
-
until: (s) =>
|
|
481
|
-
const ok = done(1)(s) && s.includes('⏰ 예약 깨움');
|
|
482
|
-
if (ok && scheduledAt === 0) scheduledAt = Date.now();
|
|
483
|
-
return ok;
|
|
484
|
-
},
|
|
481
|
+
until: (s) => done(1)(s) && s.includes('⏰ 예약 깨움'),
|
|
485
482
|
},
|
|
486
|
-
{ label: '
|
|
487
|
-
{ label: '
|
|
488
|
-
{ label: '
|
|
489
|
-
{ label: 'woke', until: (s) => s.includes(banner) && done(3)(s), timeoutMs: 150_000 },
|
|
483
|
+
{ label: 'busy over the due time', text: '긴 작업 하나', until: (s) => s.includes('응답 중'), timeoutMs: 30_000 },
|
|
484
|
+
{ label: 'long turn done', until: done(2, '긴 작업 하나'), timeoutMs: 30_000 },
|
|
485
|
+
{ label: 'woke after one deferral', until: (s) => s.includes(banner) && done(3)(s), timeoutMs: 30_000 },
|
|
490
486
|
];
|
|
491
487
|
const run = await mockSeatPtySequence({
|
|
492
488
|
...base,
|
|
493
489
|
env: {
|
|
494
490
|
...base.env,
|
|
491
|
+
ELANOUS_TEST_FAST_WAKEUP_CLOCK: '1',
|
|
495
492
|
[TEST_FAKE_LLM_TOOL_CALL_ENV]: JSON.stringify({ when: '예약해줘', name: 'ScheduleWakeup', args: { delaySeconds: 60, reason: '점검' } }),
|
|
496
|
-
[TEST_FAKE_LLM_DELAY_MS_ENV]: '
|
|
493
|
+
[TEST_FAKE_LLM_DELAY_MS_ENV]: '5000',
|
|
497
494
|
[TEST_FAKE_LLM_DELAY_WHEN_ENV]: '긴 작업',
|
|
498
495
|
},
|
|
499
496
|
steps,
|
|
@@ -737,13 +734,11 @@ async function runNextGoalContinueScenario(spec: NextTuiScenarioSpec, root: stri
|
|
|
737
734
|
|
|
738
735
|
/** TUI-GOAL-INTERIM-QUIET — every step ends with «아직 못 했다» (a different reply per turn via `{step}`, so the
|
|
739
736
|
* same-reply stop does not end it early). The fake reply's honesty sentence, counted on screen. */
|
|
740
|
-
export const GOAL_INTERIM_NOT_DONE_REPLY = '[fake-llm] {step}단계 렌더를 진행했습니다.\n남은 작업 {step}단계: 완료 영상 경로는 아직 보고할 수 없습니다 — 아직 못 했습니다.';
|
|
741
737
|
const GOAL_INTERIM_STEP_MARK = '단계 렌더를 진행했습니다';
|
|
742
738
|
const GOAL_INTERIM_NOT_DONE_MARK = '아직 못 했습니다';
|
|
743
739
|
/** An internal turn drawn as if a person typed it (classic «❯ …» · next «나: …»). */
|
|
744
740
|
/** The first (human) turn also calls one tool, so a folded reply must leave that turn's tool lines on screen.
|
|
745
741
|
* ScheduleWakeup an hour out: a real registered tool with no approval prompt that never fires inside the run. */
|
|
746
|
-
export const GOAL_INTERIM_TOOL_CALL = JSON.stringify({ when: '영상 만들어줘', name: 'ScheduleWakeup', args: { delaySeconds: 3600, reason: '렌더 점검' } });
|
|
747
742
|
export const INTERNAL_TURN_USER_HEADER = /(?:나:|❯)\s*\[(?:골 이어가기|자동 재개)\]/u;
|
|
748
743
|
|
|
749
744
|
export interface GoalInterimScreenCounts { steps: number; notDone: number; folded: number; userHeader: boolean }
|
|
@@ -31,6 +31,8 @@ export interface PodDeviceEvent {
|
|
|
31
31
|
jobConditionReason?: string;
|
|
32
32
|
jobConditionMessage?: string;
|
|
33
33
|
activeDeadlineSeconds?: number;
|
|
34
|
+
jobCreatedAt?: string;
|
|
35
|
+
jobCompletedAt?: string;
|
|
34
36
|
podPhase?: string;
|
|
35
37
|
podCreatedAt?: string;
|
|
36
38
|
containerReason?: string | null;
|
|
@@ -86,6 +88,7 @@ export const POD_DEVICE_EVENTS: readonly PodDeviceEvent[] = [
|
|
|
86
88
|
jobConditionReason: 'DeadlineExceeded',
|
|
87
89
|
jobConditionMessage: 'Job was active longer than specified deadline',
|
|
88
90
|
activeDeadlineSeconds: 3600,
|
|
91
|
+
jobCreatedAt: '2026-10-22T12:55:10Z',
|
|
89
92
|
podPhase: 'Failed',
|
|
90
93
|
containerReason: 'Error',
|
|
91
94
|
containerExitCode: 143,
|
|
@@ -114,7 +117,7 @@ const ok = (stdout: string) => ({ status: 0, stdout, stderr: '' });
|
|
|
114
117
|
|
|
115
118
|
function answerJob(event: PodDeviceEvent, jsonpath: string): { status: number; stdout: string; stderr: string } {
|
|
116
119
|
if (jsonpath === POD_TERMINATION_JOB_JSONPATH) {
|
|
117
|
-
return ok(`${event.jobConditionReason ?? ''}\t${event.activeDeadlineSeconds ?? ''}\t${event.jobUid ?? ''}`);
|
|
120
|
+
return ok(`${event.jobConditionReason ?? ''}\t${event.activeDeadlineSeconds ?? ''}\t${event.jobUid ?? ''}\t${event.jobCreatedAt ?? ''}\t${event.jobCompletedAt ?? ''}`);
|
|
118
121
|
}
|
|
119
122
|
if (jsonpath.includes('.spec.activeDeadlineSeconds')) return ok(event.activeDeadlineSeconds != null ? String(event.activeDeadlineSeconds) : '');
|
|
120
123
|
if (jsonpath.includes('conditions[?(@.type=="Failed")].reason')) return ok(event.jobConditionReason ?? '');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"commit":"
|
|
1
|
+
{"commit":"0a06cc36728ac7d147fe4988e2fd43d5f5eb8ec8"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { spawnSync } from 'node:child_process';
|
|
2
2
|
import { existsSync, lstatSync, mkdirSync, readFileSync, realpathSync } from 'node:fs';
|
|
3
3
|
import { dirname, isAbsolute, relative, resolve, sep } from 'node:path';
|
|
4
|
+
import { parse as parseYaml } from 'yaml';
|
|
4
5
|
import type { RunResult } from './ffmpeg.js';
|
|
5
6
|
import { UNOBSERVED, type Recipe, type RecipeCtx, type RecipeResult } from './types.js';
|
|
7
|
+
import { parseGraphTemplateYaml, type GraphParseIssue, type GraphTemplateSpec } from '../../self-implement/graph-yaml.js';
|
|
6
8
|
|
|
7
9
|
type CommandRunner = (bin: string, args: readonly string[], timeoutMs: number, cwd?: string) => RunResult;
|
|
8
|
-
interface ExplainerDeps { readonly run?: CommandRunner; readonly engineDir?: string }
|
|
10
|
+
interface ExplainerDeps { readonly run?: CommandRunner; readonly engineDir?: string; readonly declarationPath?: string }
|
|
9
11
|
|
|
10
12
|
const ENGINE = resolve(import.meta.dir, '../../../skills/explainer-video/engine');
|
|
13
|
+
const LINE_DECLARATION = resolve(import.meta.dir, '../../../graphs/video/explainer-line.yaml');
|
|
11
14
|
const ENGINE_MS = 600_000;
|
|
12
15
|
const QC_MS = 180_000;
|
|
13
16
|
|
|
@@ -199,7 +202,19 @@ export function explainerQc(deps: ExplainerDeps = {}): Recipe {
|
|
|
199
202
|
const peak = Number(j.input_tp);
|
|
200
203
|
if (j.input_i == null || j.input_tp == null || !Number.isFinite(loudness) || !Number.isFinite(peak)) throw new Error('통합 음량/트루 피크가 비수다');
|
|
201
204
|
const produced = { loudness_lufs: loudness, true_peak_db: peak };
|
|
202
|
-
|
|
205
|
+
let outcome = loudness >= -16 && loudness <= -12 && peak <= -1 ? 'pass' : 'loudness';
|
|
206
|
+
// ⭐ «3분 영상» — qc 생산 경로에서 loadExplainerLine 으로 선언의 target_seconds(180)를 소비한다.
|
|
207
|
+
// 내레이션이 목표 총 길이를 넘으면 too-long → build(재구성). narration_seconds 를 못 쟀으면 건너뛴다(기존 동작 보존).
|
|
208
|
+
const narrationSeconds = ctx.state.narration_seconds;
|
|
209
|
+
if (outcome === 'pass' && typeof narrationSeconds === 'number' && Number.isFinite(narrationSeconds)) {
|
|
210
|
+
const plan = loadExplainerLine(deps.declarationPath);
|
|
211
|
+
if (plan.targetSeconds !== null && narrationSeconds > plan.targetSeconds) {
|
|
212
|
+
return finish(ctx, 'qc', {
|
|
213
|
+
outcome: 'too-long', produced,
|
|
214
|
+
note: `${Math.round(narrationSeconds)}초 내레이션이 선언 목표 ${plan.targetSeconds}초를 넘는다 — build 로 재구성한다`,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
203
218
|
return finish(ctx, 'qc', { outcome, produced, note: `${loudness} LUFS · ${peak} dBTP` });
|
|
204
219
|
} catch (e) { return finish(ctx, 'qc', { outcome: UNOBSERVED, note: `loudnorm 결과를 못 읽었다: ${String(e)}` }); }
|
|
205
220
|
};
|
|
@@ -211,3 +226,40 @@ export const EXPLAINER: Readonly<Record<string, Recipe>> = {
|
|
|
211
226
|
'explainer-build': explainerBuild(),
|
|
212
227
|
'explainer-qc': explainerQc(),
|
|
213
228
|
};
|
|
229
|
+
|
|
230
|
+
/** ⭐ «3분 영상» — explainer-line 선언이 이 라인의 영상 계획에 건 목표 총 길이(초). */
|
|
231
|
+
export interface ExplainerLinePlan {
|
|
232
|
+
/** 지속 필드 `target_seconds`(초). 선언에 없으면 이 라인은 목표 총 길이를 정하지 않았다(null). */
|
|
233
|
+
readonly targetSeconds: number | null;
|
|
234
|
+
/** 생산 컴파일러(parseGraphTemplateYaml)가 낸 정규형 — 나머지 선언(노드·계약·엣지)은 이것으로 관측한다. */
|
|
235
|
+
readonly template: GraphTemplateSpec | null;
|
|
236
|
+
readonly errors: readonly GraphParseIssue[];
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/** ⭐ 생산 로드 — 라인 저작본(graphs/video/explainer-line.yaml)을 읽어 영상 계획을 낸다.
|
|
240
|
+
* 컴파일러는 top-level 계획 상수를 정규형에 싣지 않는다 — 지속 필드 `target_seconds` 는 로드에서 직접 읽는다.
|
|
241
|
+
* ⛔ 던지지 않는다(graph-yaml 계약) · 뿌리는 인자로 덮는다(ENGINE 과 같은 관습). */
|
|
242
|
+
export function loadExplainerLine(declarationPath = LINE_DECLARATION): ExplainerLinePlan {
|
|
243
|
+
let source: string;
|
|
244
|
+
try {
|
|
245
|
+
source = readFileSync(declarationPath, 'utf8');
|
|
246
|
+
} catch (error) {
|
|
247
|
+
return {
|
|
248
|
+
targetSeconds: null,
|
|
249
|
+
template: null,
|
|
250
|
+
errors: [{ path: declarationPath, message: `선언 읽기 실패: ${error instanceof Error ? error.message : String(error)}` }],
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
const compiled = parseGraphTemplateYaml(source, 'explainer-line.yaml');
|
|
254
|
+
let targetSeconds: number | null = null;
|
|
255
|
+
try {
|
|
256
|
+
const raw: unknown = parseYaml(source);
|
|
257
|
+
const declared = raw !== null && typeof raw === 'object' && !Array.isArray(raw)
|
|
258
|
+
? (raw as Record<string, unknown>).target_seconds
|
|
259
|
+
: undefined;
|
|
260
|
+
if (typeof declared === 'number' && Number.isFinite(declared) && declared > 0) targetSeconds = declared;
|
|
261
|
+
} catch {
|
|
262
|
+
// YAML 파싱 실패는 컴파일 결과(errors)가 이미 싣는다 — 로드는 던지지 않는다.
|
|
263
|
+
}
|
|
264
|
+
return { targetSeconds, template: compiled.template ?? null, errors: compiled.errors };
|
|
265
|
+
}
|
package/src/web-search/grok.ts
CHANGED
|
@@ -18,18 +18,43 @@
|
|
|
18
18
|
// custom MCP provider without touching skill bodies.
|
|
19
19
|
|
|
20
20
|
import { getGrokApiKey } from '../config.js';
|
|
21
|
-
import { grokAgentSearch, GROK_SEARCH_MODEL } from '../grok/agent-search.js';
|
|
21
|
+
import { grokAgentSearch, GROK_SEARCH_MODEL, type GrokAgentSearchOpts } from '../grok/agent-search.js';
|
|
22
|
+
import { peekGrokCredential, resolveFreshGrokCredential } from '../grok/credential.js';
|
|
22
23
|
import { wantsXSearch } from './x-intent.js';
|
|
23
24
|
import type { WebSearchHit, WebSearchProvider, WebSearchResult } from './provider.js';
|
|
24
25
|
|
|
25
26
|
const DEFAULT_LIMIT = 5;
|
|
26
27
|
const GROK_TIMEOUT_MS = 45_000;
|
|
28
|
+
// The subscription proxy's known working model differs from the metered API default.
|
|
29
|
+
const GROK_SUBSCRIPTION_SEARCH_MODEL = 'grok-4.6';
|
|
27
30
|
|
|
28
|
-
|
|
31
|
+
/** Explicitly metered API provider. The registry only adds it with webSearch.grokApi.enabled. */
|
|
32
|
+
export function buildGrokWebSearchProvider(opts: { id?: string } = {}): WebSearchProvider {
|
|
33
|
+
return makeGrokProvider(opts.id ?? 'grok', 'Grok (xAI agent-tools search)',
|
|
34
|
+
() => !!getGrokApiKey(), () => ({}));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Subscription search uses the proven cli-chat-proxy /responses route. No API-key fallback. */
|
|
38
|
+
export function buildGrokSubscriptionWebSearchProvider(): WebSearchProvider {
|
|
39
|
+
return makeGrokProvider('grok', 'Grok (subscription search)',
|
|
40
|
+
() => peekGrokCredential({ model: GROK_SUBSCRIPTION_SEARCH_MODEL })?.kind === 'subscription',
|
|
41
|
+
() => {
|
|
42
|
+
const credential = resolveFreshGrokCredential({ model: GROK_SUBSCRIPTION_SEARCH_MODEL });
|
|
43
|
+
if (credential?.kind !== 'subscription') throw new Error('Grok subscription search unavailable');
|
|
44
|
+
return { apiKey: credential.token, baseUrl: credential.baseUrl, headers: credential.headers, model: GROK_SUBSCRIPTION_SEARCH_MODEL };
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function makeGrokProvider(
|
|
49
|
+
id: string,
|
|
50
|
+
displayName: string,
|
|
51
|
+
available: () => boolean,
|
|
52
|
+
searchOptions: () => GrokAgentSearchOpts,
|
|
53
|
+
): WebSearchProvider {
|
|
29
54
|
return {
|
|
30
|
-
id
|
|
31
|
-
displayName
|
|
32
|
-
available
|
|
55
|
+
id,
|
|
56
|
+
displayName,
|
|
57
|
+
available,
|
|
33
58
|
search: async (q, signal) => {
|
|
34
59
|
const startedAt = Date.now();
|
|
35
60
|
const limit = Math.max(1, Math.min(20, q.limit ?? DEFAULT_LIMIT));
|
|
@@ -45,6 +70,7 @@ export function buildGrokWebSearchProvider(): WebSearchProvider {
|
|
|
45
70
|
|
|
46
71
|
const r = await grokAgentSearch(query, {
|
|
47
72
|
model: GROK_SEARCH_MODEL,
|
|
73
|
+
...searchOptions(),
|
|
48
74
|
tools: ['web_search', 'x_search'],
|
|
49
75
|
systemPrompt: 'You are a concise web-search assistant. Answer in one or two sentences and let the cited sources carry the detail.',
|
|
50
76
|
timeoutMs: GROK_TIMEOUT_MS,
|
|
@@ -67,7 +93,7 @@ export function buildGrokWebSearchProvider(): WebSearchProvider {
|
|
|
67
93
|
const note = r.text.length > 0 ? r.text.slice(0, 1500) : undefined;
|
|
68
94
|
return {
|
|
69
95
|
hits,
|
|
70
|
-
providerName:
|
|
96
|
+
providerName: id,
|
|
71
97
|
durationMs: Date.now() - startedAt,
|
|
72
98
|
...(note ? { note } : {}),
|
|
73
99
|
} satisfies WebSearchResult;
|
package/src/web-search/index.ts
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
// order) and routes the query. Callers that want a specific
|
|
6
6
|
// provider pass `providerId` to force the choice.
|
|
7
7
|
|
|
8
|
-
import { buildGrokWebSearchProvider } from './grok.js';
|
|
8
|
+
import { buildGrokSubscriptionWebSearchProvider, buildGrokWebSearchProvider } from './grok.js';
|
|
9
9
|
import { buildFirecrawlWebSearchProvider } from './firecrawl.js';
|
|
10
10
|
import { buildTavilyWebSearchProvider } from './tavily.js';
|
|
11
11
|
import { buildFreeWebSearchProvider } from './free.js';
|
|
12
|
-
import { isTavilySearchEnabled } from '../user-config.js';
|
|
12
|
+
import { isPaidWebSearchEnabled, isTavilySearchEnabled } from '../user-config.js';
|
|
13
13
|
import { debug } from '../debug/log.js';
|
|
14
14
|
import { wantsXSearch } from './x-intent.js';
|
|
15
15
|
import {
|
|
@@ -35,8 +35,9 @@ function registerBuiltins(): void {
|
|
|
35
35
|
// ⇒ 켜면 종전과 «똑같이» 1순위로 복귀한다: `elanous config set webSearch.tavily.enabled true`.
|
|
36
36
|
// ⚠️ 등록 시점이라 config 변경은 **다음 기동부터** 먹는다(이미 뜬 프로세스엔 안 먹는다).
|
|
37
37
|
if (isTavilySearchEnabled()) providers.push(buildTavilyWebSearchProvider());
|
|
38
|
-
providers.push(
|
|
39
|
-
providers.push(
|
|
38
|
+
providers.push(buildGrokSubscriptionWebSearchProvider());
|
|
39
|
+
if (isPaidWebSearchEnabled('grokApi')) providers.push(buildGrokWebSearchProvider({ id: 'grok-api' }));
|
|
40
|
+
if (isPaidWebSearchEnabled('firecrawl')) providers.push(buildFirecrawlWebSearchProvider());
|
|
40
41
|
providers.push(buildFreeWebSearchProvider());
|
|
41
42
|
}
|
|
42
43
|
registerBuiltins();
|
|
@@ -70,10 +71,10 @@ export async function searchWeb(
|
|
|
70
71
|
): Promise<WebSearchResult> {
|
|
71
72
|
const xIntent = !opts.providerId && wantsXSearch(q.query);
|
|
72
73
|
const candidates = opts.providerId
|
|
73
|
-
? providers.filter(p => p.id === opts.providerId)
|
|
74
|
+
? providers.filter(p => p.id === opts.providerId || (opts.providerId === 'grok' && p.id === 'grok-api'))
|
|
74
75
|
: providers.filter(p => p.available());
|
|
75
76
|
if (xIntent) {
|
|
76
|
-
const grokIndex = candidates.findIndex(p => p.id === 'grok');
|
|
77
|
+
const grokIndex = candidates.findIndex(p => p.id === 'grok' || p.id === 'grok-api');
|
|
77
78
|
if (grokIndex > 0) candidates.unshift(...candidates.splice(grokIndex, 1));
|
|
78
79
|
}
|
|
79
80
|
if (candidates.length === 0) {
|
|
@@ -91,7 +92,7 @@ export async function searchWeb(
|
|
|
91
92
|
try {
|
|
92
93
|
const result = await provider.search(q, opts.signal);
|
|
93
94
|
if (!xIntent) return result;
|
|
94
|
-
if (provider.id === 'grok') {
|
|
95
|
+
if (provider.id === 'grok' || provider.id === 'grok-api') {
|
|
95
96
|
const isXUrl = (raw: string): boolean => {
|
|
96
97
|
try {
|
|
97
98
|
const url = new URL(raw);
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
// M4-5 (2026-05-12 · Phase 4 N5-5) — workflow node catalog.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
3
|
+
// GRAPH-UNIFY-KINDS (0.2.40 · 2026-10-27) — this catalog is a view over the
|
|
4
|
+
// node-kind vocabulary registry `src/graph-kinds/registry.ts` (WORKFLOW_CORE_
|
|
5
|
+
// KINDS · 24 workflow kinds). The registry owns the vocabulary; this file owns
|
|
6
|
+
// the per-kind YAML specs, and NODE_CATALOG below is derived so the catalog can
|
|
7
|
+
// never drift from the registry again.
|
|
4
8
|
// CLI (`elanous wf node search/spec/list`) + PWA NodeCreator + external
|
|
5
9
|
// LLM (R3 NL synth · M4-1 node suggestion) all read this catalog.
|
|
6
10
|
//
|
|
@@ -15,11 +19,13 @@ export type NodeCategory =
|
|
|
15
19
|
| 'core' // prompt · bash · skill · cft
|
|
16
20
|
| 'hitl' // approval
|
|
17
21
|
| 'branch' // if · switch
|
|
18
|
-
| 'iteration' // iteration
|
|
22
|
+
| 'iteration' // iteration · showroom
|
|
19
23
|
| 'transform' // classify · extract · set · filter · template
|
|
20
|
-
| 'integration' // http · task
|
|
24
|
+
| 'integration' // http · task · subworkflow
|
|
21
25
|
| 'trigger'; // scheduleTrigger · webhookTrigger · discordTrigger · telegramTrigger · manualTrigger · chatTrigger
|
|
22
26
|
|
|
27
|
+
import { WORKFLOW_CORE_KINDS } from '../graph-kinds/registry.js';
|
|
28
|
+
|
|
23
29
|
export interface NodeSpec {
|
|
24
30
|
/** Stable identifier (snake-case in the YAML key when relevant). */
|
|
25
31
|
kind: string;
|
|
@@ -42,7 +48,7 @@ export interface NodeSpec {
|
|
|
42
48
|
related?: string[];
|
|
43
49
|
}
|
|
44
50
|
|
|
45
|
-
|
|
51
|
+
const NODE_SPECS: readonly NodeSpec[] = [
|
|
46
52
|
// ── core ────────────────────────────────────────────────────────
|
|
47
53
|
{
|
|
48
54
|
kind: 'prompt',
|
|
@@ -150,6 +156,26 @@ export const NODE_CATALOG: readonly NodeSpec[] = [
|
|
|
150
156
|
echo "item $index = $item"`,
|
|
151
157
|
related: ['filter'],
|
|
152
158
|
},
|
|
159
|
+
{
|
|
160
|
+
kind: 'showroom',
|
|
161
|
+
category: 'iteration',
|
|
162
|
+
summary: 'Run a showroom · parallel lane prompts aggregated into a digest pane (strict by default)',
|
|
163
|
+
yamlKey: 'showroom',
|
|
164
|
+
required: ['lanes'],
|
|
165
|
+
optional: ['aggregator', 'mode'],
|
|
166
|
+
example: `- id: digest
|
|
167
|
+
depends_on: [fetch]
|
|
168
|
+
showroom:
|
|
169
|
+
mode: parallel
|
|
170
|
+
lanes:
|
|
171
|
+
- prompt: |
|
|
172
|
+
$ARGUMENTS 어제 이야기를 레인 요약으로 정리.
|
|
173
|
+
- prompt: |
|
|
174
|
+
오늘 일정을 레인 요약으로 정리.
|
|
175
|
+
aggregator: |
|
|
176
|
+
레인들을 아침 브리핑으로 합친다.`,
|
|
177
|
+
related: ['iteration', 'subworkflow'],
|
|
178
|
+
},
|
|
153
179
|
|
|
154
180
|
// ── transform ───────────────────────────────────────────────────
|
|
155
181
|
{
|
|
@@ -267,6 +293,21 @@ export const NODE_CATALOG: readonly NodeSpec[] = [
|
|
|
267
293
|
url: $hook.output.body.data.url`,
|
|
268
294
|
related: ['http'],
|
|
269
295
|
},
|
|
296
|
+
{
|
|
297
|
+
kind: 'subworkflow',
|
|
298
|
+
category: 'integration',
|
|
299
|
+
summary: 'Call another workflow · child output feeds the parent node result',
|
|
300
|
+
yamlKey: 'subworkflow',
|
|
301
|
+
required: ['workflow'],
|
|
302
|
+
optional: ['inputs'],
|
|
303
|
+
example: `- id: call
|
|
304
|
+
depends_on: [build]
|
|
305
|
+
subworkflow:
|
|
306
|
+
workflow: child-graph
|
|
307
|
+
inputs:
|
|
308
|
+
value: $build.output.value`,
|
|
309
|
+
related: ['task', 'http'],
|
|
310
|
+
},
|
|
270
311
|
|
|
271
312
|
// ── trigger ─────────────────────────────────────────────────────
|
|
272
313
|
{
|
|
@@ -355,6 +396,14 @@ export const NODE_CATALOG: readonly NodeSpec[] = [
|
|
|
355
396
|
},
|
|
356
397
|
] as const;
|
|
357
398
|
|
|
399
|
+
/** The workflow-node catalog is a view over the registry's WORKFLOW_CORE_KINDS
|
|
400
|
+
* vocabulary (24 kinds · showroom · subworkflow included): a spec whose kind
|
|
401
|
+
* is not a registry workflow kind is dropped, and `src/graph-kinds/registry.test.ts`
|
|
402
|
+
* asserts the catalog and the registry cover the same 24-kind set. */
|
|
403
|
+
export const NODE_CATALOG: readonly NodeSpec[] = NODE_SPECS.filter(
|
|
404
|
+
(spec): boolean => (WORKFLOW_CORE_KINDS as readonly string[]).includes(spec.kind),
|
|
405
|
+
);
|
|
406
|
+
|
|
358
407
|
/** Look up a node spec by kind. Case-insensitive. */
|
|
359
408
|
export function getNodeSpec(kind: string): NodeSpec | undefined {
|
|
360
409
|
const lower = kind.trim().toLowerCase();
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1118],{39173:(e,t,i)=>{function r(e,t){e.accDescr&&t.setAccDescription?.(e.accDescr),e.accTitle&&t.setAccTitle?.(e.accTitle),e.title&&t.setDiagramTitle?.(e.title)}i.d(t,{S:()=>r}),(0,i(9820).K)(r,"populateCommonDb")},44845:(e,t,i)=>{i.d(t,{m:()=>n});var r=i(9820),n=class{constructor(e){this.init=e,this.records=this.init()}static{(0,r.K)(this,"ImperativeState")}reset(){this.records=this.init()}}},71118:(e,t,i)=>{i.d(t,{diagram:()=>j});var r=i(44845),n=i(39173),o=i(23208),s=i(36693),a=i(51636),l=i(47356),d=i(54730),c=i(9820),h=i(15568),p=/[─━│┃└┗├┣]/,f=/[└┗├┣]/,g=/[─━]/,u=/^[\s│┃]+$/,w=/^\s*(title[\t ]|accTitle[\t ]*:|accDescr[\t ]*[:{])/,x=/^\s*%%/;function m(e){return e.some(e=>p.test(e))}function b(e){for(let t of e){let e=f.exec(t);if(e?.index&&e.index>0)return e.index}return 4}function y(e,t){return e.replace(/\bline\s+(\d+)\b/gi,(e,i)=>{let r=parseInt(i,10),n=t.get(r);return n?`line ${n}`:e})}function $(e){let t=e.split("\n"),i=new Map,r=-1;for(let[e,i]of t.entries())if("treeView-beta"===i.trim()){r=e;break}if(-1===r)return{text:e,lineMap:i};let n=[];for(let e=r+1;e<t.length;e++){let i=t[e];!(""===i.trim()||x.test(i)||w.test(i))&&(u.test(i)||n.push(i.replace(/\t/g," ")))}if(!m(n))return{text:e,lineMap:i};let o=b(n),s=[],a=0;for(let e=0;e<=r;e++)s.push(t[e]),a++,i.set(a,e+1);for(let e=r+1;e<t.length;e++){let r=t[e],n=r.trim(),l=e+1;if(""===n||x.test(r)||w.test(r)){s.push(r),a++,i.set(a,l);continue}if(u.test(r))continue;let d=r.replace(/\t/g," "),c=f.exec(d);if(c?.index!==void 0){let e=c.index,t=Math.round(e/o)+1,r=e+1;for(;r<d.length&&g.test(d[r]);)r++;for(;r<d.length&&" "===d[r];)r++;let n=d.slice(r).trimEnd();if(!n)throw Error(`Line ${l}: Empty node \u2014 expected a filename or directory name after the box-drawing prefix`);let h=" ".repeat(t);s.push(h+n),a++,i.set(a,l)}else if(/^[\s─━│┃└┗├┣]+$/.test(d))continue;else if(p.test(d))s.push(r),a++,i.set(a,l);else if(/^\s+/.test(d))throw Error(`Line ${l}: Unexpected indentation without box-drawing characters. In box-drawing format, use \u251C\u2500\u2500 or \u2514\u2500\u2500 prefixes for indented nodes.`);else s.push(r),a++,i.set(a,l)}return{text:s.join("\n"),lineMap:i}}(0,c.K)(m,"isBoxDrawingFormat"),(0,c.K)(b,"inferSegmentWidth"),(0,c.K)(y,"remapErrorLines"),(0,c.K)($,"preprocessBoxDrawing");var k=new r.m(()=>({cnt:1,stack:[{id:0,level:-1,name:"/",nodeType:"directory",children:[]}]})),K=(0,c.K)(()=>{k.reset(),(0,l.IU)()},"clear"),v=(0,c.K)(()=>k.records.stack[0],"getRoot"),V=(0,c.K)(()=>k.records.cnt,"getCount"),B=l.UI.treeView,C=(0,c.K)(()=>(0,a.$t)(B,(0,l.zj)().treeView),"getConfig"),I={clear:K,addNode:(0,c.K)((e,t,i,r,n,o)=>{for(;e<=k.records.stack[k.records.stack.length-1].level;)k.records.stack.pop();let s={id:k.records.cnt++,level:e,name:t,nodeType:i,icon:n,cssClass:r,description:o,children:[]};k.records.stack[k.records.stack.length-1].children.push(s),k.records.stack.push(s)},"addNode"),getRoot:v,getCount:V,getConfig:C,getAccTitle:l.iN,getAccDescription:l.m7,getDiagramTitle:l.ab,setAccDescription:l.EI,setAccTitle:l.SV,setDiagramTitle:l.ke},T=(0,c.K)(e=>{for(let t of((0,n.S)(e,I),e.nodes)){let e="number"==typeof t.indent?t.indent:0,i=t.name,r=i.endsWith("/");r&&(i=i.slice(0,-1));let n=r?"directory":"file",o=t.classAnnotation||void 0,s=t.iconAnnotation,a=void 0!==s?s||"none":void 0,d=t.descAnnotation||void 0,c=d?(0,l.jZ)(d,(0,l.zj)()):void 0;I.addNode(e,i,n,o,a,c)}},"populate"),D={parse:(0,c.K)(async e=>{let{text:t,lineMap:i}=$(e);try{let e=await (0,h.qg)("treeView",t);d.R.debug(e),T(e)}catch(e){throw i.size>0&&e instanceof Error&&(e.message=y(e.message,i)),e}},"parse")},E={prefix:"mermaid-treeview",height:24,width:24,icons:{folder:{body:'<path fill="currentColor" d="M10.59 4.59A2 2 0 0 0 9.17 4H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.17z"/>'},file:{body:'<path fill="currentColor" fill-rule="evenodd" d="M6 2a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8.83a2 2 0 0 0-.59-1.42l-4.82-4.82A2 2 0 0 0 13.17 2H6Zm7.5 1.9l4.6 4.6h-3.6a1 1 0 0 1-1-1V3.9Z" clip-rule="evenodd"/>'}}};function A(e,t){let i=t?.filenameIcons?.[e];if(i)return i;let r=e.lastIndexOf(".");if(r>0){let i=e.substring(r).toLowerCase(),n=t?.extensionIcons;return n?.[i]??n?.[i.slice(1)]}}function M(e,t){return e.includes(":")?e:e in E.icons||!t?`${E.prefix}:${e}`:`${t}:${e}`}function N(e,t){if("none"!==e.icon){if(e.icon)return M(e.icon,t.defaultIconPack);if(t.showIcons){if("file"===e.nodeType){let i=A(e.name,t);if("none"===i)return;if(i)return M(i,t.defaultIconPack)}return`${E.prefix}:${"directory"===e.nodeType?"folder":"file"}`}}}(0,c.K)(A,"detectIcon"),(0,c.K)(M,"qualifyIcon"),(0,c.K)(N,"getNodeIcon"),(0,s.pC)([{name:E.prefix,icons:E}]);var z=(0,c.K)(async(e,t)=>{let i=[],r=(0,c.K)(e=>{let n=N(e,t);n&&i.push({icon:n,node:e}),e.children.forEach(r)},"collect");return r(e),new Map((await Promise.all(i.map(async({icon:e,node:t})=>({id:t.id,svg:await (0,s.WY)(e,{height:14,width:14})})))).map(({id:e,svg:t})=>[e,t]))},"resolveNodeIcons"),S=(0,c.K)((e,t,i,r,n,o)=>{let s=r.append("g"),a="treeView-node-label";"directory"===i.nodeType&&(a+=" treeView-node-dir"),i.cssClass&&(a+=` ${i.cssClass}`);let l=N(i,n),d=void 0!==l;l&&s.append("g").attr("class","treeView-node-icon").attr("transform",`translate(${e+n.paddingX}, ${t+n.paddingY})`).html(o.get(i.id)??"");let c=s.append("text").text(i.name).attr("dominant-baseline","middle").attr("class",a),{height:h,width:p}=c.node().getBBox(),f=h+2*n.paddingY,g=e+n.paddingX+18*!!d;c.attr("x",g),c.attr("y",t+f/2);let u=g+p;return i.BBox={x:e,y:t,width:p+2*n.paddingX+18*!!d,height:f},i.cssClass?.split(/\s+/).includes("highlight")&&s.insert("rect",":first-child").attr("x",e).attr("y",t+1).attr("width",0).attr("height",f-2).attr("rx",3).attr("class","treeView-highlight-bg"),{node:i,nodeGroup:s,labelRightEdge:u,centerY:t+f/2}},"positionLabel"),X=(0,c.K)((e,t,i,r,n,o)=>e.append("line").attr("x1",t).attr("y1",i).attr("x2",r).attr("y2",n).attr("stroke-width",o).attr("class","treeView-node-line"),"positionLine"),L=(0,c.K)((e,t,i,r)=>{let n=0,o=0,s=[],a=(0,c.K)((e,t,i,a)=>{let l=a*(i.rowIndent+i.paddingX),d=S(l,n,t,e,i,r);s.push(d);let{height:c,width:h}=t.BBox;X(e,l-i.rowIndent,n+c/2,l,n+c/2,i.lineThickness),o=Math.max(o,l+h),n+=c},"drawNode"),l=(0,c.K)((t,r=0)=>{a(e,t,i,r),t.children.forEach(e=>{l(e,r+1)});let{x:n,y:o,height:s}=t.BBox;if(t.children.length){let{y:r,height:a}=t.children[t.children.length-1].BBox;X(e,n+i.paddingX,o+s,n+i.paddingX,r+a/2+i.lineThickness/2,i.lineThickness)}},"processNode");l(t);let d=s.filter(e=>e.node.description);if(d.length>0){let e=Math.max(...s.map(e=>e.labelRightEdge))+16;for(let t of d){let r=t.nodeGroup.append("text").text(t.node.description).attr("dominant-baseline","middle").attr("class","treeView-node-description").attr("x",e).attr("y",t.centerY).node().getBBox();o=Math.max(o,e+r.width+i.paddingX)}}for(let e of s)if(e.node.cssClass?.split(/\s+/).includes("highlight")){let t=e.nodeGroup.select(".treeView-highlight-bg");if(!t.empty()){let i=o-e.node.BBox.x+8;t.attr("width",i),o=Math.max(o,e.node.BBox.x+i+2)}}return{totalHeight:n,totalWidth:o}},"drawTree"),R=(0,c.K)(async(e,t,i,r)=>{d.R.debug("Rendering treeView diagram\n"+e);let n=r.db,s=n.getRoot(),a=n.getConfig(),c=(0,o.D)(t),h=c.append("g");h.attr("class","tree-view");let p=await z(s,a),{totalHeight:f,totalWidth:g}=L(h,s,a,p);c.attr("viewBox",`-${a.lineThickness/2} 0 ${g} ${f}`),(0,l.a$)(c,f,g,a.useMaxWidth)},"draw"),Y={labelFontSize:"16px",labelColor:"black",lineColor:"black",iconColor:"#546e7a",descriptionColor:"#6a9955",highlightBg:"rgba(255, 193, 7, 0.15)",highlightStroke:"#ffc107"},j={db:I,renderer:{draw:R},parser:D,styles:(0,c.K)(({treeView:e})=>{let{labelFontSize:t,labelColor:i,lineColor:r,iconColor:n,descriptionColor:o,highlightBg:s,highlightStroke:l}=(0,a.$t)(Y,e);return`
|
|
2
|
-
.treeView-node-label {
|
|
3
|
-
font-size: ${t};
|
|
4
|
-
fill: ${i};
|
|
5
|
-
white-space: pre;
|
|
6
|
-
}
|
|
7
|
-
.treeView-node-dir {
|
|
8
|
-
font-weight: bold;
|
|
9
|
-
}
|
|
10
|
-
.treeView-node-line {
|
|
11
|
-
stroke: ${r};
|
|
12
|
-
}
|
|
13
|
-
.treeView-node-icon {
|
|
14
|
-
color: ${n};
|
|
15
|
-
}
|
|
16
|
-
.treeView-node-description {
|
|
17
|
-
font-size: ${t};
|
|
18
|
-
fill: ${o};
|
|
19
|
-
font-style: italic;
|
|
20
|
-
white-space: pre;
|
|
21
|
-
}
|
|
22
|
-
.treeView-highlight-bg {
|
|
23
|
-
fill: ${s};
|
|
24
|
-
stroke: ${l};
|
|
25
|
-
stroke-width: 1;
|
|
26
|
-
}
|
|
27
|
-
`},"styles")}}}]);
|