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
|
@@ -308,6 +308,7 @@ import {
|
|
|
308
308
|
} from '../../user-config.js';
|
|
309
309
|
import { listProviders } from '../../llm.js';
|
|
310
310
|
import { enabledModels, loadCatalog } from '../../intelligence-map/model-catalog.js';
|
|
311
|
+
import { readTuiSlashAudience, slashMaturity } from '../../maturity/tui-slash-maturity.js';
|
|
311
312
|
import { selfOrchestrateRuntime } from '../../self-dev/self-orchestrate-runtime.js';
|
|
312
313
|
import type { ToolRuntime } from '../../tool-runtime/types.js';
|
|
313
314
|
import { getSessionCwd } from '../../session/working-dir.js';
|
|
@@ -383,10 +384,10 @@ import { resolveLocalEndpoints, runLocalLLMCompat } from '../../local-llm-test.j
|
|
|
383
384
|
import { registerTermSlash, type TermSlashHost } from '../../tui/slash/term.js';
|
|
384
385
|
// 옛 입구 re-export shim 은 slash-runtime/index.ts 한 곳뿐(RFC A5 · /mission 과 같은 꼴).
|
|
385
386
|
import { SlashCommandRegistry } from './registry.js';
|
|
386
|
-
|
|
387
|
-
export { readDashboardAskClarification };
|
|
387
|
+
export { readDashboardAskClarification } from './ask-clarification.js';
|
|
388
388
|
import { createLoopScheduler, type LoopScheduler } from '../loop-scheduler.js';
|
|
389
389
|
import { registerShellSlash } from './shell-slash.js';
|
|
390
|
+
import { registerClassicSideSlash } from '../side-basic-runtime.js';
|
|
390
391
|
export { registerShellSlash } from './shell-slash.js';
|
|
391
392
|
import { registerMissionSlash } from '../../tui/slash/mission.js';
|
|
392
393
|
// TUI-SLASH-SPLIT-MISSION(D4b) — /mission 은 src/tui/slash/mission.ts 로 이사. 옛 입구 re-export shim 은 slash-runtime/index.ts 한 곳뿐(RFC A5).
|
|
@@ -1198,6 +1199,15 @@ export const DASHBOARD_SLASH_CATALOG_BASELINE = {
|
|
|
1198
1199
|
'skills-reload', 'spend', 'squeeze',
|
|
1199
1200
|
'tk', 'tokens',
|
|
1200
1201
|
'undo', 'w', 'wd',
|
|
1202
|
+
'ad', 'agent-room', 'api', 'api-allow', 'auto-tts', 'autotts',
|
|
1203
|
+
'board', 'capture', 'chat', 'claude', 'codex', 'control', 'conv',
|
|
1204
|
+
'dash', 'dashboard', 'debug', 'default', 'delta', 'design', 'design-check', 'diffs',
|
|
1205
|
+
'directive', 'export', 'fork', 'gemini', 'handoff', 'hist', 'history', 'inject', 'inputs',
|
|
1206
|
+
'lane', 'll', 'local', 'log', 'loops', 'mission', 'p', 'paste', 'persona', 'plan', 'plugin',
|
|
1207
|
+
'plugins', 'prompt', 'prompts', 'provider', 'qc', 'r', 'reasoning', 'rebind', 'relay',
|
|
1208
|
+
'reply', 'research', 'resume-turn', 'rewind', 'rs', 'run', 'run-skill', 's', 'showroom',
|
|
1209
|
+
'surface', 'sync', 'tablet', 'telegram', 'term', 'terminal', 'tg', 'theme', 'think', 'tts',
|
|
1210
|
+
'vc', 'voice-chat', 'widget', 'widgets', 'wish',
|
|
1201
1211
|
],
|
|
1202
1212
|
listedOnly: [
|
|
1203
1213
|
'acp', 'rsh', 'sr',
|
|
@@ -1495,6 +1505,12 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
1495
1505
|
});
|
|
1496
1506
|
|
|
1497
1507
|
registry.register('directive', async (args, ctx) => {
|
|
1508
|
+
const { role } = readTuiSlashAudience();
|
|
1509
|
+
if (slashMaturity('directive') === 'ops' && role === 'general') {
|
|
1510
|
+
ctx.pushChatLine(ctx.warning(' /directive는 ops 등급 기능이라 general 역할에서는 실행할 수 없습니다.'));
|
|
1511
|
+
ctx.setChatScrollOffset(-1);
|
|
1512
|
+
return;
|
|
1513
|
+
}
|
|
1498
1514
|
try {
|
|
1499
1515
|
const { addDirective } = await import('../../steward/directive.js');
|
|
1500
1516
|
const result = await addDirective(args.join(' '), { source: 'tui' });
|
|
@@ -2299,7 +2315,9 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2299
2315
|
return;
|
|
2300
2316
|
}
|
|
2301
2317
|
if (sub === 'ask') {
|
|
2302
|
-
|
|
2318
|
+
// `/harness ask` arrives as one raw tail so a pasted path header keeps its line boundary.
|
|
2319
|
+
const askTail = args.length === 2 ? args[1]! : args.slice(1).join(' ');
|
|
2320
|
+
const say = askTail.replace(/^["'“]|["'”]$/g, '').trim();
|
|
2303
2321
|
ctx.chatLines.push('');
|
|
2304
2322
|
ctx.chatLines.push(ctx.accent('❯ /harness ask'));
|
|
2305
2323
|
if (!say) {
|
|
@@ -2345,11 +2363,6 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2345
2363
|
print: (line) => { for (const part of line.split('\n')) ctx.chatLines.push(` ${part}`); },
|
|
2346
2364
|
log: (event, data, level) => debug.log('dev-pipeline', event, { ...data, surface: 'tui-slash' }, { level }),
|
|
2347
2365
|
readLine: async () => '',
|
|
2348
|
-
readClarification: (clarification) => readDashboardAskClarification(clarification, ctx.surfaceUx, (line) => {
|
|
2349
|
-
ctx.pushChatLine(line);
|
|
2350
|
-
ctx.setChatScrollOffset(-1);
|
|
2351
|
-
ctx.draw();
|
|
2352
|
-
}),
|
|
2353
2366
|
readFile: (file) => readFileSync(file, 'utf8'),
|
|
2354
2367
|
writeFile: (file, data) => writeFileSync(file, data, 'utf8'),
|
|
2355
2368
|
cwd: () => process.cwd(),
|
|
@@ -2577,6 +2590,7 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
|
|
|
2577
2590
|
|
|
2578
2591
|
|
|
2579
2592
|
registerShellSlash(registry);
|
|
2593
|
+
registerClassicSideSlash(registry);
|
|
2580
2594
|
|
|
2581
2595
|
// ── B-3.b ─────────────────────────────────────────────────────────
|
|
2582
2596
|
|
|
@@ -47,7 +47,7 @@ export function buildEssentialHelpLines({
|
|
|
47
47
|
maxRows,
|
|
48
48
|
}: {
|
|
49
49
|
names: readonly string[];
|
|
50
|
-
descriptions: readonly Pick<SlashCommand, 'name' | 'aliases' | 'description'>[];
|
|
50
|
+
descriptions: readonly Pick<SlashCommand, 'name' | 'aliases' | 'description' | 'hidden'>[];
|
|
51
51
|
width: number;
|
|
52
52
|
audience?: { role: Role; showBeta: boolean };
|
|
53
53
|
/** The modal's row budget. When the readable layout overflows it, add columns (shorter descriptions)
|
|
@@ -56,7 +56,7 @@ export function buildEssentialHelpLines({
|
|
|
56
56
|
}): string[] {
|
|
57
57
|
const registered = new Set(names);
|
|
58
58
|
const entries = descriptions
|
|
59
|
-
.filter((command) => registered.has(command.name) &&
|
|
59
|
+
.filter((command) => !command.hidden && registered.has(command.name) &&
|
|
60
60
|
((audience.role === 'owner' && slashMaturity(command.name) === undefined) || slashVisibleFor(command.name, audience.role, { showBeta: audience.showBeta })))
|
|
61
61
|
.map((command) => {
|
|
62
62
|
const aliases = [...new Set(command.aliases ?? [])].filter((alias) => registered.has(alias) && alias !== command.name);
|
|
@@ -45,6 +45,7 @@ export interface DashboardTermSlashRuntimeDeps {
|
|
|
45
45
|
|
|
46
46
|
export interface DashboardTermSlashRuntime {
|
|
47
47
|
helpLines(): string[];
|
|
48
|
+
experimentalHelpLines(): string[];
|
|
48
49
|
terminalSessionsEmptyLine(): string;
|
|
49
50
|
terminalSessionLine(entry: DashboardTerminalListEntry): string;
|
|
50
51
|
shellRunnerSectionDividerLine(): string;
|
|
@@ -122,35 +123,34 @@ export function createDashboardTermSlashRuntime(
|
|
|
122
123
|
helpLines: () => [
|
|
123
124
|
'',
|
|
124
125
|
deps.accent('\u276f /term'),
|
|
125
|
-
deps.muted('
|
|
126
|
+
deps.muted('Formal commands:'),
|
|
126
127
|
deps.muted(' /term new [command] Open a shell PTY (Ctrl+Shift+T or Alt+T).'),
|
|
127
128
|
deps.muted(' /term list List all alive sessions (fg / bg / exited).'),
|
|
128
129
|
deps.muted(' /term attach <id> Bring a backgrounded session to foreground.'),
|
|
129
130
|
deps.muted(' /term detach Send foreground session to background (PTY survives).'),
|
|
131
|
+
deps.muted(' Ctrl+B (while streaming) Background running child tasks; turn continues.'),
|
|
132
|
+
deps.muted(' Ctrl+X c (chat input) Enter control mode.'),
|
|
130
133
|
deps.muted(' /term switch Open the session picker modal.'),
|
|
131
134
|
deps.muted(' /term kill <id> Stop the PTY and remove the session.'),
|
|
132
135
|
deps.muted(' /term snapshot <id> [tail [bytes]] Capture current grid (snapshot) or last N bytes (tail).'),
|
|
133
|
-
deps.muted(' /term
|
|
134
|
-
deps.muted(' /term
|
|
135
|
-
deps.muted(' /term group list Show groups + members.'),
|
|
136
|
-
deps.muted(' /term group join <id> <group> Add terminal to a broadcast group.'),
|
|
137
|
-
deps.muted(' /term group leave <id> <group> Remove terminal from a broadcast group.'),
|
|
138
|
-
deps.muted(' /term group send <group> <text> Broadcast raw bytes to the group.'),
|
|
139
|
-
deps.muted(' /term channel list Show IPC channels + stats.'),
|
|
140
|
-
deps.muted(' /term channel pub <channel> <text> Publish on a channel.'),
|
|
141
|
-
deps.muted(' /term channel tail <id> <channel> [--replay] Subscribe <id> — msgs stream into PTY stdin.'),
|
|
142
|
-
deps.muted(' /term channel snapshot <channel> [N=10] Show last N buffered messages (read-only).'),
|
|
143
|
-
deps.muted(' /term pipe <id> <channel> [--line] Publish <id> stdout onto <channel> (raw|line).'),
|
|
144
|
-
deps.muted(' /term unpipe <pipeId> Detach a pipe started with /term pipe.'),
|
|
145
|
-
deps.muted(' /term pipes List every active stdout → channel pipe.'),
|
|
146
|
-
deps.muted(' /term readonly <id> [on|off] Toggle read-only (matrix writeTo drops writes).'),
|
|
147
|
-
deps.muted(' /term recharacter <id> <shell|claude|codex|custom:<name>> Swap character + reexec.'),
|
|
148
|
-
deps.muted(' /term vw-sync <windowId> <text> Broadcast to every terminal-slot in a VW.'),
|
|
149
|
-
deps.muted(' /term vw-bar [windowId] [on|off] Toggle per-VW sync input bar (default: current).'),
|
|
136
|
+
deps.muted(' /term resume <id> Re-spawn a saved terminal session.'),
|
|
137
|
+
deps.muted(' /term help experimental Show experimental commands.'),
|
|
150
138
|
deps.muted(''),
|
|
151
139
|
deps.muted('Shell-runner handles (RunShell) — separate registry:'),
|
|
152
140
|
deps.muted(' /shell list|kill|attach See /shell help.'),
|
|
153
141
|
],
|
|
142
|
+
experimentalHelpLines: () => [
|
|
143
|
+
'',
|
|
144
|
+
deps.accent('\u276f /term help experimental'),
|
|
145
|
+
deps.muted('Experimental commands — behavior may change:'),
|
|
146
|
+
deps.muted(' /term matrix Show matrix-wide view.'),
|
|
147
|
+
deps.muted(' /term move <id> bg|modal|preview Move terminal between placements.'),
|
|
148
|
+
deps.muted(' /term group list|join|leave|send Coordinate terminal groups.'),
|
|
149
|
+
deps.muted(' /term channel list|pub|tail|snapshot Manage terminal channels.'),
|
|
150
|
+
deps.muted(' /term pipe|unpipe|pipes Pipe terminal output to channels.'),
|
|
151
|
+
deps.muted(' /term readonly <id> [on|off] Toggle read-only.'),
|
|
152
|
+
deps.muted(' /term recharacter <id> <character> Change terminal character.'),
|
|
153
|
+
],
|
|
154
154
|
terminalSessionsEmptyLine: () => deps.muted(' No terminal sessions.'),
|
|
155
155
|
terminalSessionLine: (entry) => {
|
|
156
156
|
const brand = entry.agentBrand ? ` [${entry.agentBrand}]` : '';
|
|
@@ -25,6 +25,7 @@ import { buildConcisenessSystemMessages } from '../prompt-library/chat-concisene
|
|
|
25
25
|
import {
|
|
26
26
|
buildSessionRuntimeSystemMessages,
|
|
27
27
|
buildSessionRuntimeTurnSystemMessages,
|
|
28
|
+
buildResearchDateSystemMessage,
|
|
28
29
|
type SessionTurnProfile,
|
|
29
30
|
} from '../session-runtime/index.js';
|
|
30
31
|
import { buildExecutionAskSystemMessages } from '../ask-user-question/index.js';
|
|
@@ -208,9 +209,15 @@ function buildDashboardTurnPreambleUnmeasured(
|
|
|
208
209
|
gitSnapshotStaleMs: DASHBOARD_GIT_SNAPSHOT_STALE_MS,
|
|
209
210
|
}));
|
|
210
211
|
const turnProfile = ctx.turnProfile;
|
|
212
|
+
// Keep the synchronous preamble on the already-resolved surface. Shared
|
|
213
|
+
// research-intent routing and Bloom evidence guidance are added by core-turn.
|
|
214
|
+
const researchTurn = turnProfile?.surface.id === 'research/agent';
|
|
211
215
|
const surfaceSystemMsgs = turnProfile
|
|
212
216
|
? timed(builderMs, 'surface', () => buildSessionRuntimeTurnSystemMessages(turnProfile, ctx.userText))
|
|
213
217
|
: ([] as LLMMessage[]);
|
|
218
|
+
if (researchTurn) {
|
|
219
|
+
surfaceSystemMsgs.push(buildResearchDateSystemMessage());
|
|
220
|
+
}
|
|
214
221
|
// ⭐⭐ `tools.nativeStructure` 는 «어느 provider 에 켤지»를 목록으로 고를 수 있다(2026-08-18).
|
|
215
222
|
// ⛔ 목록이 없으면 종전대로 «전 provider» — 기존 설정을 쓰는 사람의 값이 안 바뀐다.
|
|
216
223
|
// ⛔ `config.llm.provider` 를 그대로 읽지 않는다. 그것은 `'auto'` 일 수 있고,
|
|
@@ -240,9 +247,9 @@ function buildDashboardTurnPreambleUnmeasured(
|
|
|
240
247
|
nativeStructureEnabled,
|
|
241
248
|
...(nativeTools !== undefined ? { enabledTools: nativeTools } : {}),
|
|
242
249
|
}) as LLMMessage[]);
|
|
243
|
-
const concisenessSystemMsgs = timed(builderMs, 'conciseness', () =>
|
|
244
|
-
|
|
245
|
-
|
|
250
|
+
const concisenessSystemMsgs = timed(builderMs, 'conciseness', () => researchTurn
|
|
251
|
+
? [] as LLMMessage[]
|
|
252
|
+
: buildConcisenessSystemMessages(ctx.userConfig.chat.conciseness) as LLMMessage[]);
|
|
246
253
|
// ★ elanous 자기접근 규율 + 자기인지 ambient(P3 · 2026-07-13) — 텔레그램/디스코드
|
|
247
254
|
// (makeElanousAgentRunTurn)와 단일 출처(agent/self-ambient.ts). TUI 채팅에서도 미션
|
|
248
255
|
// 진단("P2 왜 실패?")·자율 시스템 관측·회상이 규율+ambient+툴(self-ops family) 3박자로
|
|
@@ -313,10 +320,29 @@ function buildDashboardTurnPreambleUnmeasured(
|
|
|
313
320
|
let taskNotificationCount = 0;
|
|
314
321
|
try {
|
|
315
322
|
timed(builderMs, 'taskNotifications', () => {
|
|
323
|
+
// ACP may ask for a preamble while the session is idle. Keep queued
|
|
324
|
+
// completion receipts for the next actual user/auto-wake turn.
|
|
325
|
+
if (!ctx.userText.trim()) return;
|
|
326
|
+
const notificationOnlyWake = /(?:^|\n)(?:Question: )?\[자동 재개\] 위임 끝: .+ \((?:done|error|aborted)\) — <task-notification> 의 결과를 읽고 이어서 처리$/u
|
|
327
|
+
.test(ctx.userText);
|
|
328
|
+
if (notificationOnlyWake) {
|
|
329
|
+
preamble.push({ role: 'system', content: '[알림 전용 턴] 이것은 완료 알림을 전달한 비요청 status receipt다. 작업 요청으로 취급하지 말고 Agent 또는 SelfImplement 위임을 시작하지 않는다. 포함된 결과를 바탕으로 한 번의 간결한 상태 요약만 답하고 멈춘다. 결과가 전달되지 않았다면 결과가 아직 제공되지 않았다고 알리고 내용을 추측하지 않는다.' });
|
|
330
|
+
}
|
|
316
331
|
const pendingNotifications = globalTaskNotificationQueue.drain();
|
|
317
332
|
taskNotificationCount = pendingNotifications.length;
|
|
318
|
-
|
|
333
|
+
if (pendingNotifications.length === 0) {
|
|
334
|
+
if (notificationOnlyWake) {
|
|
335
|
+
debug.log('tui.notify', 'notification-only-turn', { notificationCount: 0, resultAvailable: false });
|
|
336
|
+
}
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
const taskNotificationsXml = renderTaskNotificationsXml(pendingNotifications, {
|
|
340
|
+
statusReceipt: notificationOnlyWake,
|
|
341
|
+
});
|
|
319
342
|
if (taskNotificationsXml) {
|
|
343
|
+
debug.log('tui.notify', notificationOnlyWake ? 'notification-only-turn' : 'notification-with-user-request', {
|
|
344
|
+
notificationCount: pendingNotifications.length,
|
|
345
|
+
});
|
|
320
346
|
preamble.push({ role: 'user', content: taskNotificationsXml });
|
|
321
347
|
}
|
|
322
348
|
});
|
|
@@ -19,6 +19,8 @@ export interface GuardianDeps {
|
|
|
19
19
|
execute?: (command: string) => Promise<SpawnOutcome>;
|
|
20
20
|
/** Injected only for deterministic expiry-alert tests. Production reads the local Grok auth file. */
|
|
21
21
|
grokExpiry?: () => string | null;
|
|
22
|
+
/** Injected in tests; production reevaluates recorded doctor visits without dispatching a prescription. */
|
|
23
|
+
doctorShadow?: () => void | Promise<void>;
|
|
22
24
|
hostName?: string;
|
|
23
25
|
}
|
|
24
26
|
|
|
@@ -100,6 +102,13 @@ export async function guardianTick(now: Date, plan: GuardianPlan, deps: Guardian
|
|
|
100
102
|
errorName: error instanceof Error ? error.name : 'unknown',
|
|
101
103
|
});
|
|
102
104
|
}
|
|
105
|
+
try {
|
|
106
|
+
await deps.doctorShadow?.();
|
|
107
|
+
} catch (error) {
|
|
108
|
+
debug.log('guardian.doctor-shadow', 'reevaluation-failed', {
|
|
109
|
+
errorName: error instanceof Error ? error.name : 'unknown',
|
|
110
|
+
});
|
|
111
|
+
}
|
|
103
112
|
const timeZone = plan.timeZone ?? resolveTimeZone().timeZone;
|
|
104
113
|
const wouldRun: string[] = [];
|
|
105
114
|
let executed = 0;
|
package/src/domains/knowledge.ts
CHANGED
|
@@ -52,7 +52,7 @@ export interface KnowledgeDoc {
|
|
|
52
52
|
// 의미검색으로 회상(domain='elanous'). [[self-awareness]].
|
|
53
53
|
// memory = M3 consolidation(2026-07-08): 흐린 에피소드 다수를 의미 umbrella 1건으로
|
|
54
54
|
// 압축·영속(에피소드→의미·수면 공고화). 원본은 consolidated 마킹.
|
|
55
|
-
kind: 'signal' | 'dig' | 'alpha' | 'xreport' | 'morning' | 'outbound' | 'docs' | 'memory' | 'taste';
|
|
55
|
+
kind: 'signal' | 'dig' | 'alpha' | 'xreport' | 'morning' | 'outbound' | 'docs' | 'memory' | 'taste' | 'reference';
|
|
56
56
|
sector_tags: string | null;
|
|
57
57
|
text: string;
|
|
58
58
|
source_ref: string | null;
|
package/src/esc-abort-gate.ts
CHANGED
|
@@ -33,7 +33,7 @@ import type { ModalBounds, ModalSurface } from './display/modal-stack.js';
|
|
|
33
33
|
import type { KeyEvent } from './display/types.js';
|
|
34
34
|
import type { ThemeTokens } from './theme/tokens.js';
|
|
35
35
|
import { debug } from './debug/log.js';
|
|
36
|
-
import { abortTurnOnly } from './turn-abort-scope.js';
|
|
36
|
+
import { abortAndKillChildren, abortTurnOnly } from './turn-abort-scope.js';
|
|
37
37
|
import { SELF_IMPLEMENT_TOOL_NAMES } from './boot/daemon-tools/self-implement-names.js';
|
|
38
38
|
|
|
39
39
|
export const DASHBOARD_CLARIFICATION_REQUEST = Symbol.for('elanous.dashboard.clarification-request');
|
|
@@ -57,6 +57,10 @@ export interface EscAbortGateDeps {
|
|
|
57
57
|
getWaitingTargetNames?: () => readonly string[];
|
|
58
58
|
/** Only an identified foreground harness run may bypass the sub-agent confirmation. */
|
|
59
59
|
shouldAbortImmediately?: () => boolean;
|
|
60
|
+
/** Seat mode can have no operator to answer a confirmation: Esc stops this turn and its children without opening a modal. */
|
|
61
|
+
forceStopWithoutModal?: () => boolean;
|
|
62
|
+
/** Non-modal replacement for the approval surface in unattended TUI mode. Timeout/cancel resolves false. */
|
|
63
|
+
confirmStopInline?: () => Promise<boolean>;
|
|
60
64
|
/** Called before abortTurnOnly so the UI can paint a visible pending state immediately. */
|
|
61
65
|
onAbortPending?: (event: { running: number; repeat: number; targets: readonly string[] }) => void;
|
|
62
66
|
/** Called when another Escape arrives after the first abort request. */
|
|
@@ -218,7 +222,9 @@ export function createEscAbortGate(deps: EscAbortGateDeps): EscAbortGate {
|
|
|
218
222
|
let current: ApprovalModalHandle | null = null;
|
|
219
223
|
let currentDispose: (() => void) | null = null;
|
|
220
224
|
let abortPending = false;
|
|
225
|
+
let inlineConfirmationPending = false;
|
|
221
226
|
let escapePresses = 0;
|
|
227
|
+
let disposed = false;
|
|
222
228
|
|
|
223
229
|
const redraw = (): void => {
|
|
224
230
|
try { deps.requestRedraw?.(); } catch { /* ignore */ }
|
|
@@ -282,6 +288,31 @@ export function createEscAbortGate(deps: EscAbortGateDeps): EscAbortGate {
|
|
|
282
288
|
return;
|
|
283
289
|
}
|
|
284
290
|
const running = deps.getRunningCount();
|
|
291
|
+
if (running > 0 && deps.forceStopWithoutModal?.()) {
|
|
292
|
+
if (inlineConfirmationPending) return;
|
|
293
|
+
if (!deps.confirmStopInline) {
|
|
294
|
+
debug.log('esc.abort', 'unattended-force-stop', { running, repeat: Math.max(0, escapePresses - 1) });
|
|
295
|
+
abortAndKillChildren(deps.abortCtrl);
|
|
296
|
+
redraw();
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
inlineConfirmationPending = true;
|
|
300
|
+
debug.log('esc.abort', 'unattended-inline-confirmation', { running, repeat: Math.max(0, escapePresses - 1) });
|
|
301
|
+
void deps.confirmStopInline().then((confirmed) => {
|
|
302
|
+
if (confirmed && !disposed && !deps.abortCtrl.signal.aborted) {
|
|
303
|
+
debug.log('esc.abort', 'unattended-inline-confirmed', { running });
|
|
304
|
+
abortAndKillChildren(deps.abortCtrl);
|
|
305
|
+
} else {
|
|
306
|
+
debug.log('esc.abort', 'unattended-inline-cancelled', { running, reason: 'declined-or-timeout' });
|
|
307
|
+
resetAbortRequestState();
|
|
308
|
+
}
|
|
309
|
+
}).catch((error) => {
|
|
310
|
+
debug.log('esc.abort', 'unattended-inline-failed', { reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' });
|
|
311
|
+
resetAbortRequestState();
|
|
312
|
+
}).finally(() => { inlineConfirmationPending = false; redraw(); });
|
|
313
|
+
redraw();
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
285
316
|
if (running <= 0 || deps.shouldAbortImmediately?.()) {
|
|
286
317
|
debug.log('esc.abort', 'abort-immediately', { running, repeat: Math.max(0, escapePresses - 1) });
|
|
287
318
|
abortPendingTurn(running);
|
|
@@ -347,6 +378,7 @@ export function createEscAbortGate(deps: EscAbortGateDeps): EscAbortGate {
|
|
|
347
378
|
resetAbortRequestState();
|
|
348
379
|
},
|
|
349
380
|
dispose(): void {
|
|
381
|
+
disposed = true;
|
|
350
382
|
if (current) current.dispose(false);
|
|
351
383
|
resetAbortRequestState();
|
|
352
384
|
close();
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { closeSync, constants, fstatSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, writeSync } from 'node:fs';
|
|
3
|
+
import { join, resolve } from 'node:path';
|
|
3
4
|
import { debug } from '../debug/log.js';
|
|
5
|
+
import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
6
|
+
import { assertLedgerPathPolicy } from '../harness/launch-utterance-ledger.js';
|
|
4
7
|
import { extractVerbatimOriginalAsk } from '../self-implement/goal-author.js';
|
|
5
8
|
import { loadRunLedger } from '../self-implement/run-ledger.js';
|
|
6
9
|
import { queryRunningRuns, type QueriedRunningRunsResult } from '../self-implement/running-runs.js';
|
|
@@ -252,6 +255,8 @@ export interface PreLaunchGateInput {
|
|
|
252
255
|
|
|
253
256
|
export interface PreLaunchGateDeps extends ActiveRunsForGoalDeps {
|
|
254
257
|
activeRuns?: (goalId: string) => ActiveRunsForGoal;
|
|
258
|
+
/** LAUNCH-SINGLE-DOOR-1C — 주입 우선 단일문: 시험 우주가 격리 루트의 문을 끼워 생산 배선을 그대로 검증한다. */
|
|
259
|
+
launchDoor?: LaunchRequestDoor;
|
|
255
260
|
}
|
|
256
261
|
|
|
257
262
|
export interface PreLaunchGateDecision {
|
|
@@ -279,3 +284,203 @@ function decidePreLaunch(input: PreLaunchGateInput, deps: PreLaunchGateDeps): Pr
|
|
|
279
284
|
}
|
|
280
285
|
return { action: 'proceed', sameGoalActiveRuns, budget, reason: sameGoalActiveRuns === 'unknown' ? 'active runs unknown' : input.forceLaunch && sameGoalActiveRuns.length > 0 ? 'duplicate overridden by force-launch' : 'no confirmed duplicate' };
|
|
281
286
|
}
|
|
287
|
+
|
|
288
|
+
// ─────────────────────────────────────────────────────────────────────────────────────
|
|
289
|
+
// LAUNCH-SINGLE-DOOR-1C — 발사 요청의 단일 문.
|
|
290
|
+
// ─────────────────────────────────────────────────────────────────────────────────────
|
|
291
|
+
|
|
292
|
+
/** Env contract: hand 가 소비한 requestId 를 자식 say 가 물려받아 같은 문을 다시 두드리지 않게 한다(한 번만 상속). */
|
|
293
|
+
export const LAUNCH_DOOR_RECEIPT_ENV = 'ELANOUS_LAUNCH_DOOR_RECEIPT';
|
|
294
|
+
|
|
295
|
+
/** append 전용 요청 원장의 행 종류 — 요청(중복 포함)·소비·거절·강제·실패·단일문 사용 불가 관측. */
|
|
296
|
+
export type LaunchRequestLedgerEvent = 'requested' | 'consumed' | 'refused-duplicate' | 'forced-duplicate' | 'launch-failed' | 'door-unavailable';
|
|
297
|
+
|
|
298
|
+
/** append 전용 요청 원장의 한 행 — 행은 지우거나 고치지 않는다(관측 전용). */
|
|
299
|
+
export interface LaunchRequestLedgerRow {
|
|
300
|
+
readonly event: LaunchRequestLedgerEvent;
|
|
301
|
+
readonly requestId: string;
|
|
302
|
+
readonly at: string;
|
|
303
|
+
readonly source?: string;
|
|
304
|
+
readonly receiptId?: string;
|
|
305
|
+
readonly reason?: string;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/** requestId 단위 소비 영수증 — 최초 1회만 발급된다(O_EXCL 파일이 곧 영수증이다). */
|
|
309
|
+
export interface LaunchRequestReceipt {
|
|
310
|
+
readonly requestId: string;
|
|
311
|
+
readonly receiptId: string;
|
|
312
|
+
readonly at: string;
|
|
313
|
+
readonly source?: string;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/** `consume` 의 답 — `refused` 는 기존 영수증을 읽어 사유와 함께 거절한 것이다. */
|
|
317
|
+
export type LaunchRequestConsumption =
|
|
318
|
+
| { readonly status: 'consumed'; readonly requestId: string; readonly receiptId: string; readonly receiptAt: string; readonly inherited?: true }
|
|
319
|
+
| { readonly status: 'forced'; readonly requestId: string; readonly receiptId: string | null; readonly receiptAt: string | null; readonly reason: string }
|
|
320
|
+
| { readonly status: 'refused'; readonly requestId: string; readonly receiptId: string | null; readonly receiptAt: string | null; readonly reason: string }
|
|
321
|
+
| { readonly status: 'unavailable'; readonly requestId: string; readonly reason: string };
|
|
322
|
+
|
|
323
|
+
/** 발사 요청의 단일 문 — 원장 append · 단일 소비 · 실패 기록 · 원장 조회. */
|
|
324
|
+
export interface LaunchRequestDoor {
|
|
325
|
+
/** 요청 한 건을 원장에 append 하고 그 requestId 를 돌려준다(중복 재요청도 매번 append 된다). */
|
|
326
|
+
requestId(ask: string): string;
|
|
327
|
+
/** requestId 단위 단일 소비 — 영수증은 최초 1회만 발급된다(두 번째는 기존 영수증과 사유로 거절). */
|
|
328
|
+
consume(requestId: string, opts?: { readonly force?: boolean; readonly inheritedReceipt?: string }): LaunchRequestConsumption;
|
|
329
|
+
/** 발사 실패 사유를 원장에 append 한다(관측 — 발사를 막지 않는다). */
|
|
330
|
+
fail(requestId: string, reason: string): void;
|
|
331
|
+
/** 원장 조회 — 중복 거절·실패·재시도 사유를 읽는다(인자를 주면 그 requestId 의 행만). */
|
|
332
|
+
rows(requestId?: string): readonly LaunchRequestLedgerRow[];
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/** 단일문 deps — 원장 뿌리(기본 = 이 우주의 실효 인스턴스 루트)·시계·요청 출처 표지. */
|
|
336
|
+
export interface LaunchRequestDoorDeps {
|
|
337
|
+
readonly root?: string;
|
|
338
|
+
readonly now?: () => Date;
|
|
339
|
+
readonly source?: string;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const LAUNCH_REQUEST_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
|
|
343
|
+
const LAUNCH_REQUEST_DATE_FILE = /^\d{4}-\d{2}-\d{2}\.jsonl$/;
|
|
344
|
+
|
|
345
|
+
function launchRequestLedgerDir(root: string): string {
|
|
346
|
+
return join(resolve(root), 'launch-requests');
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/** 단일문을 연다 — 문 자체는 상태를 갖지 않고, 원장·영수증은 이 우주의 인스턴스 루트 아래 파일로 남는다. */
|
|
350
|
+
export function openLaunchRequestDoor(deps: LaunchRequestDoorDeps = {}): LaunchRequestDoor {
|
|
351
|
+
const dir = launchRequestLedgerDir(deps.root ?? effectiveInstanceRoot());
|
|
352
|
+
const receiptsDir = join(dir, 'receipts');
|
|
353
|
+
const now = deps.now ?? (() => new Date());
|
|
354
|
+
const source = deps.source;
|
|
355
|
+
|
|
356
|
+
const observe = (event: string, data: Record<string, unknown>): void => {
|
|
357
|
+
try { debug.log('execution-loop.launch-gate', event, data, { level: 'warn' }); } catch { /* 관측은 fail-soft */ }
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
const appendRow = (row: LaunchRequestLedgerRow): boolean => {
|
|
361
|
+
try {
|
|
362
|
+
assertLedgerPathPolicy(dir);
|
|
363
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
364
|
+
assertLedgerPathPolicy(dir);
|
|
365
|
+
if (!lstatSync(dir).isDirectory()) throw new Error(`launch request ledger dir is not a directory: ${dir}`);
|
|
366
|
+
const file = join(dir, `${row.at.slice(0, 10)}.jsonl`);
|
|
367
|
+
const fd = openSync(file, constants.O_WRONLY | constants.O_APPEND | constants.O_CREAT | constants.O_NOFOLLOW, 0o600);
|
|
368
|
+
try {
|
|
369
|
+
if (!fstatSync(fd).isFile()) throw new Error(`launch request ledger file is not a regular file: ${file}`);
|
|
370
|
+
writeSync(fd, `${JSON.stringify(row)}\n`);
|
|
371
|
+
} finally { closeSync(fd); }
|
|
372
|
+
return true;
|
|
373
|
+
} catch (error) {
|
|
374
|
+
observe('request-ledger-unwritten', { event: row.event, requestId: row.requestId, reason: error instanceof Error ? error.message : String(error) });
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
|
|
379
|
+
const readReceipt = (requestId: string): LaunchRequestReceipt | null => {
|
|
380
|
+
try {
|
|
381
|
+
const fd = openSync(join(receiptsDir, `${requestId}.json`), constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
382
|
+
try {
|
|
383
|
+
if (!fstatSync(fd).isFile()) return null;
|
|
384
|
+
const parsed = JSON.parse(readFileSync(fd, 'utf8')) as LaunchRequestReceipt;
|
|
385
|
+
return parsed && typeof parsed === 'object' && parsed.requestId === requestId
|
|
386
|
+
&& typeof parsed.receiptId === 'string' && typeof parsed.at === 'string' ? parsed : null;
|
|
387
|
+
} finally { closeSync(fd); }
|
|
388
|
+
} catch { return null; }
|
|
389
|
+
};
|
|
390
|
+
|
|
391
|
+
const requestId = (ask: string): string => {
|
|
392
|
+
const id = launchRequestId(ask);
|
|
393
|
+
appendRow({ event: 'requested', requestId: id, at: now().toISOString(), ...(source ? { source } : {}) });
|
|
394
|
+
return id;
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
const consume = (id: string, opts: { readonly force?: boolean; readonly inheritedReceipt?: string } = {}): LaunchRequestConsumption => {
|
|
398
|
+
if (!LAUNCH_REQUEST_ID_PATTERN.test(id)) {
|
|
399
|
+
return { status: 'unavailable', requestId: id, reason: `requestId 가 원장 키로 쓸 수 없다: ${JSON.stringify(id)}` };
|
|
400
|
+
}
|
|
401
|
+
const at = now().toISOString();
|
|
402
|
+
// 부모(hand)가 같은 requestId 를 이미 소비했다면 상속 영수증으로 지나간다 — 새 영수증을 만들지 않는다.
|
|
403
|
+
if (opts.inheritedReceipt !== undefined && opts.inheritedReceipt === id) {
|
|
404
|
+
const inherited = readReceipt(id);
|
|
405
|
+
if (inherited !== null) {
|
|
406
|
+
try { debug.log('execution-loop.launch-gate', 'request-consumption-inherited', { requestId: id, receiptId: inherited.receiptId }); } catch { /* 관측은 fail-soft */ }
|
|
407
|
+
return { status: 'consumed', requestId: id, receiptId: inherited.receiptId, receiptAt: inherited.at, inherited: true };
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
const receipt: LaunchRequestReceipt = { requestId: id,
|
|
411
|
+
receiptId: `receipt-${createHash('sha256').update(`${id}:${at}`).digest('hex').slice(0, 12)}`, at,
|
|
412
|
+
...(source ? { source } : {}) };
|
|
413
|
+
let created = true;
|
|
414
|
+
try {
|
|
415
|
+
assertLedgerPathPolicy(receiptsDir);
|
|
416
|
+
mkdirSync(receiptsDir, { recursive: true, mode: 0o700 });
|
|
417
|
+
assertLedgerPathPolicy(receiptsDir);
|
|
418
|
+
const fd = openSync(join(receiptsDir, `${id}.json`), constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
|
|
419
|
+
try {
|
|
420
|
+
if (!fstatSync(fd).isFile()) throw new Error(`소비 영수증이 일반 파일이 아니다: ${id}`);
|
|
421
|
+
writeSync(fd, JSON.stringify(receipt));
|
|
422
|
+
} finally { closeSync(fd); }
|
|
423
|
+
} catch (error) {
|
|
424
|
+
if ((error as NodeJS.ErrnoException)?.code !== 'EEXIST') {
|
|
425
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
426
|
+
observe('request-receipt-unavailable', { requestId: id, reason });
|
|
427
|
+
appendRow({ event: 'door-unavailable', requestId: id, at, ...(source ? { source } : {}), reason });
|
|
428
|
+
return { status: 'unavailable', requestId: id, reason: `소비 영수증을 만들지 못했다 — 발사를 막지 않는다: ${reason}` };
|
|
429
|
+
}
|
|
430
|
+
created = false;
|
|
431
|
+
}
|
|
432
|
+
if (created) {
|
|
433
|
+
appendRow({ event: 'consumed', requestId: id, at, ...(source ? { source } : {}), receiptId: receipt.receiptId });
|
|
434
|
+
return { status: 'consumed', requestId: id, receiptId: receipt.receiptId, receiptAt: receipt.at };
|
|
435
|
+
}
|
|
436
|
+
const existing = readReceipt(id);
|
|
437
|
+
if (existing === null) {
|
|
438
|
+
const reason = `requestId ${id} 의 소비 영수증이 이미 있지만 읽지 못했다 — 중복 발사 거절`;
|
|
439
|
+
appendRow({ event: 'refused-duplicate', requestId: id, at, ...(source ? { source } : {}), reason });
|
|
440
|
+
return { status: 'refused', requestId: id, receiptId: null, receiptAt: null, reason };
|
|
441
|
+
}
|
|
442
|
+
if (opts.force === true) {
|
|
443
|
+
const reason = `requestId ${id} 는 영수증 ${existing.receiptId} (${existing.at}) 로 이미 소비됐다 — force 로 다시 띄운다`;
|
|
444
|
+
appendRow({ event: 'forced-duplicate', requestId: id, at, ...(source ? { source } : {}), receiptId: existing.receiptId, reason });
|
|
445
|
+
return { status: 'forced', requestId: id, receiptId: existing.receiptId, receiptAt: existing.at, reason };
|
|
446
|
+
}
|
|
447
|
+
const reason = `requestId ${id} 는 영수증 ${existing.receiptId} (${existing.at}) 로 이미 소비됐다 — 중복 발사 거절`;
|
|
448
|
+
appendRow({ event: 'refused-duplicate', requestId: id, at, ...(source ? { source } : {}), receiptId: existing.receiptId, reason });
|
|
449
|
+
return { status: 'refused', requestId: id, receiptId: existing.receiptId, receiptAt: existing.at, reason };
|
|
450
|
+
};
|
|
451
|
+
|
|
452
|
+
const fail = (id: string, reason: string): void => {
|
|
453
|
+
appendRow({ event: 'launch-failed', requestId: id, at: now().toISOString(),
|
|
454
|
+
...(source ? { source } : {}), reason: reason.trim() || '사유 없음' });
|
|
455
|
+
};
|
|
456
|
+
|
|
457
|
+
const rows = (requestId?: string): readonly LaunchRequestLedgerRow[] => {
|
|
458
|
+
const result: LaunchRequestLedgerRow[] = [];
|
|
459
|
+
let names: string[];
|
|
460
|
+
try {
|
|
461
|
+
assertLedgerPathPolicy(dir);
|
|
462
|
+
names = readdirSync(dir);
|
|
463
|
+
} catch { return result; }
|
|
464
|
+
for (const name of names.filter((candidate) => LAUNCH_REQUEST_DATE_FILE.test(candidate)).sort()) {
|
|
465
|
+
let text: string;
|
|
466
|
+
try {
|
|
467
|
+
const fd = openSync(join(dir, name), constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
468
|
+
try {
|
|
469
|
+
if (!fstatSync(fd).isFile()) continue;
|
|
470
|
+
text = readFileSync(fd, 'utf8');
|
|
471
|
+
} finally { closeSync(fd); }
|
|
472
|
+
} catch { continue; }
|
|
473
|
+
for (const line of text.split('\n')) {
|
|
474
|
+
if (!line) continue;
|
|
475
|
+
try {
|
|
476
|
+
const row = JSON.parse(line) as LaunchRequestLedgerRow;
|
|
477
|
+
if (row && typeof row === 'object' && typeof row.event === 'string' && typeof row.requestId === 'string'
|
|
478
|
+
&& typeof row.at === 'string' && (requestId === undefined || row.requestId === requestId)) result.push(row);
|
|
479
|
+
} catch { /* 찢어진 줄은 건너뛴다 */ }
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
return result;
|
|
483
|
+
};
|
|
484
|
+
|
|
485
|
+
return { requestId, consume, fail, rows };
|
|
486
|
+
}
|