elanous 0.2.32 → 0.2.34
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/{IVKr3AlRUVLKsw2fh7eXF → L04y73dlwKeTW-GetaTF3}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/1162.c69abda138c7ce43.js +79 -0
- package/apps/pwa/out/_next/static/chunks/1449-1fede62af84c3e43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1598-13fc845935e816df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1639.62c5e16fa20d242f.js +94 -0
- package/apps/pwa/out/_next/static/chunks/{4174.92ed04922709ac9e.js → 1644.35dd25240ae24e4b.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1661-adb8b2babc9aaf8c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2940-619bfd8ef337c611.js → 1895-60ed0e341c658bd4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5525.86debf231e181813.js → 2124.ed5bf480cea7f85b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2147.107c0fc6146fb15a.js +23 -0
- package/apps/pwa/out/_next/static/chunks/2202-ef1c9b000c3074fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2247.1e326638ee43e672.js +115 -0
- package/apps/pwa/out/_next/static/chunks/2268.56e1e3d58180abae.js +8 -0
- package/apps/pwa/out/_next/static/chunks/2469-606819c812414021.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6092.a7f99e68b188ca66.js → 2547.dd27303624cb4da8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2213.2ccbada92c33ea0f.js → 2554.3b5e200f5f5cfcd6.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/2593.e53c1620c0bb3599.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2690.e96671114222676a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2898-79ee1a5cc0cd9d13.js +1 -0
- package/apps/pwa/out/_next/static/chunks/298.26099a9f65e5c8ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5173-233188df2f42c626.js → 2987-30cf9c2eb7b8bdd5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2992.51fc2a7295bd8139.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3541-ce3a5424ed5ad7f1.js → 3001-5a52788c813b6113.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3014-291245fba9df7b5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3068.ee78201f0251a18d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3083.cd399a17e9365f78.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3103.84470c8445962f04.js +34 -0
- package/apps/pwa/out/_next/static/chunks/{6433.fc573af22bbc9ab7.js → 3110.0a7065f25c841818.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/3117-e1c474683fd1f824.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3121.779fafe3e44612c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3251-2c17bd5a91f8de2e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/326.3fb32322bb2ddf6d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3411-f87314c6c66ebc73.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6157.0c9af021de4fb31b.js → 3414.172ad4ca2d9b08e8.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3421-7ff7fbaa156985a7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4745.67d6f99c245af3f7.js → 3498.cf2a15a8a9e5b926.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/381.f55dc63ea87735e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3819.163d4777f0a597f6.js +32 -0
- package/apps/pwa/out/_next/static/chunks/{5543.a438b8ab5a13ea47.js → 3837.722e053fb9f321ad.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4129-ab0a6189f1778633.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4361.93d14ba594b3a035.js +104 -0
- package/apps/pwa/out/_next/static/chunks/4364.7a7eb19cceb67d2f.js +286 -0
- package/apps/pwa/out/_next/static/chunks/4406.d71f506f7c3ee9d3.js +149 -0
- package/apps/pwa/out/_next/static/chunks/4461.2ad1514180ae7e29.js +148 -0
- package/apps/pwa/out/_next/static/chunks/4479.bd309cbe0e3842ee.js +64 -0
- package/apps/pwa/out/_next/static/chunks/4522-05966f777d66d13b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4543-9a3e9812e845de65.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4557.f8f1d84a0d90d590.js +74 -0
- package/apps/pwa/out/_next/static/chunks/4589-79b11542179ef58c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4633-9f8f9f88ffbb8f5c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4831.23af4d10c0697b5e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4983.5951b85724f61f2a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b313b242.cb1265eea908db61.js → 4fa33ebd.21c1bd5b294496e6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{997ce8a5-2ad501927003b41b.js → 5014f970-22bef0b5210f7d60.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2112-e4efc21a6505d5bc.js → 5028-f0722e6114c313e7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2898.fd781bc7cf01a7b7.js → 5249.96a848656b582a93.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5311.16e0ffbfa5468b80.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{9407.e49124dedf0f5e72.js → 5446.edf141cff9ef647d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9002.e5658224e3dc1b6f.js → 5489.ec2dd1b5272a19dc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1335-6731f392c35216eb.js → 5576-82d3703636d5c4b9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/559.df87695df637920c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5618-5c88f2f70178c4ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5764.05487bf0b73ddb6b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5930.e678826c3f831aab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5dfb57f7.f2e3305326202474.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6053-d893974de92e6198.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2985.39ccdecd36848b12.js → 6086.913a69e6fa3e4a8b.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/6200-cefd6f33f59d765e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6314-edeba650ae686ac9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6316-bc9a9b74d7842d79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6476-13b9779b73528008.js +1 -0
- package/apps/pwa/out/_next/static/chunks/666-04db3ac4c8e3c66f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/670.682e55106ef915a6.js +77 -0
- package/apps/pwa/out/_next/static/chunks/{7862.30a8d6482bb238eb.js → 6740.43de73fc427c9fe2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6816.b7ba9d0a1a4a46a7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/690-fbbcc777f189af37.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6989.0d3d4020e5cb3df6.js +90 -0
- package/apps/pwa/out/_next/static/chunks/{2871.0bca6137343b3f76.js → 7005.1623d2aea78eb85f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7193-cf355cca5ba6c5d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7217-d17393fe7af78fa6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7232.24edbd938a69c8d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7295cd1e.b4b557908888eeee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7323.adb02de21991883c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7386.5d8e7e42e818dfb6.js +287 -0
- package/apps/pwa/out/_next/static/chunks/{7502.ccd5b8065545edd0.js → 7431.3051e9b8a4372d2d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{3583.a05e88cc8d594628.js → 7448.478958ffbbba0ac0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7537.ba2208c5c656b8a3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7562.948255cbc3e79d33.js +41 -0
- package/apps/pwa/out/_next/static/chunks/7596-962ae6db6cfc9c83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7671.cff51beac212a2ba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7883.3916734ee16d3e58.js +27 -0
- package/apps/pwa/out/_next/static/chunks/{9989.3694300e5f000b14.js → 7952.b192c31b6a0e00cc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/801.5b24e81eded22d1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8176.8c9a8613f5a01ac1.js +36 -0
- package/apps/pwa/out/_next/static/chunks/819e78a6.fa3dd7f7da19bf61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8220-78978450c3183d8d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8221-eb60b5bc692a3361.js +1 -0
- package/apps/pwa/out/_next/static/chunks/826.e9a26064f474949e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5307.60f2209e809bd627.js → 8368.014caa8de2f5af34.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8459-a351487a4480f584.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8482-75823d513a4ce151.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8488.8da515248cda3f3a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9221.7d22eaf353a2d4e7.js → 8548.036c344973968847.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8584.388a1779d9b203af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8637.a55e098e61ffefb8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8817.61bb7ffbba502ecb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9398-6aed28f0a96d0d6f.js → 9131-fce7256c4180c4a5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9207-8e6a12db30373f32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9263-00ae932c62696a86.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9318.caafc3a130e8769c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/932.da3fb55951882562.js +93 -0
- package/apps/pwa/out/_next/static/chunks/9433.002f8426ac75b6b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9464.dd631a5a14b1d660.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{3278.2e5d15b53a4091c8.js → 9550.d5f76828f972058c.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{2534.e85ae21ad0dac829.js → 9739.8d5f36ac67a3b236.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9743.beeabb9d5f86abe4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9843-a23d3f32dc43f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/994-28211077c7c587d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7a1887c4.f36b88fba31da8fd.js → 9a8cb466.cc9fc9e6e46038aa.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{0bb0ff36.b8d418980951e5ba.js → 9b48c871.204d5d13e7809bd0.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{409f1e57.d0649fc47691ebfe.js → abb4b98b.163e0f56e84ae35d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-3b4c947f174e33d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-369d5ce99483f859.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-63c0ed0eb26e5fce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-62802c6003bc85cc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ecb41560d4e77be9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-7b65ad8130c93e95.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8755477c15a9060c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-5725447dd972c471.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b979de0591a69375.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-6d0796bf4633751a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-59c31dc0394e67b4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-12dfc95f6cc5c718.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-25788244e66aa4dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-a2555dc705466322.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-4fb31eb476dcbad3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-3b4c947f174e33d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-578729adbeaa40cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a1d20fffbec35205.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-4a558f94516b8004.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-9e3834705b86145e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d7bff0f0905a662c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-cb1c5fe746ea4014.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-9ee320507356582a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66fd183b74835886.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-3272a064a01a9927.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-f281b7a7f6ef2529.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-d45a65f8b7124fcd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-e9c1fe684dd19a66.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-b8322932fc6e34de.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-82c66d9af2290575.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-63c6752009c97b05.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-bb33d42ebc358aec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-7e4c9379197d7214.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-38bf1e9a7001732b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-2e5b752012389d56.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-8c66a3b24a745630.js → page-398c0faa173203f7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-002f53a965b6445c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-7f75997f61a26269.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-3b4c947f174e33d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-05631753294f23fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-edd700fd2cc3d7f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-105f83ecb4594365.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-5823e87d2017f19c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-04d00ae9b0890349.js → page-df3445b207ceceab.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-b51ca09566c03de7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-8aacd5ded5dbac60.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bae3365a0b3c6a8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ed52b48ff1aa7fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b6f8cad35fe00946.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6d25ceda500d2457.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-b6401a5f2c962fe8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/ebf6cf5e.0d2f887b040e80fb.js +122 -0
- package/apps/pwa/out/_next/static/chunks/f09ec7d7-d29abe23edcbb193.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{ebc7d829.264a0bcb6c750b50.js → ffdc3a04.b9c23c1b28dd4a96.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-9322cb8a56ac081c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-2fbab294e49a1561.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-f36729f56621a8f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-2a62e450b47c6114.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-5e17f7b445f34d43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-b4263e2190ea7adf.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/bin/elanous.mjs +9 -2
- package/docs/goal-context/README.md +1 -0
- package/graphs/default-loop.yaml +20 -3
- package/graphs/document-loop.yaml +21 -2
- package/graphs/implement-loop.yaml +6 -0
- package/graphs/journey/SCENARIOS.md +33 -0
- package/graphs/journey/recipes.yaml +1 -0
- package/graphs/journey/ta-journey.yaml +84 -0
- package/graphs/journey/units/author/author.yaml +20 -0
- package/graphs/journey/units/author/recipes.yaml +2 -0
- package/graphs/journey/units/green/green.yaml +20 -0
- package/graphs/journey/units/green/recipes.yaml +2 -0
- package/graphs/journey/units/pr/pr.yaml +20 -0
- package/graphs/journey/units/pr/recipes.yaml +2 -0
- package/graphs/journey/units/remember/recipes.yaml +2 -0
- package/graphs/journey/units/remember/remember.yaml +20 -0
- package/graphs/operate-loop.yaml +21 -2
- package/graphs/overlays/stop-heal-ladder.yaml +1 -1
- package/graphs/release-rehearsal/recipes.yaml +1 -1
- package/graphs/release-rehearsal/release-rehearsal.yaml +2 -2
- package/graphs/research-loop.yaml +23 -2
- package/graphs/units/dispatch-pod/dispatch-pod.yaml +50 -0
- package/graphs/units/dispatch-pod/recipes.yaml +14 -0
- package/graphs/units/entry/entry.yaml +50 -0
- package/graphs/units/entry/recipes.yaml +14 -0
- package/graphs/units/harvest/harvest.yaml +25 -0
- package/graphs/units/harvest/recipes.yaml +4 -0
- package/graphs/units/land/land.yaml +45 -0
- package/graphs/units/land/recipes.yaml +3 -0
- package/graphs/units/recipes.yaml +7 -0
- package/graphs/units/recover.yaml +39 -0
- package/graphs/units/reflect/recipes.yaml +3 -0
- package/graphs/units/reflect/reflect.yaml +15 -0
- package/graphs/units/task-agent-recover-review.yaml +17 -0
- package/graphs/units/task-agent-recover-wait.yaml +17 -0
- package/graphs/units/verbs/make-doc.yaml +34 -0
- package/graphs/units/verbs/recipes.yaml +33 -0
- package/graphs/units/verbs/verify.yaml +55 -0
- package/graphs/work/recipes.yaml +2 -0
- package/graphs/work/research-report.yaml +28 -0
- package/package.json +1 -1
- package/scripts/ci-typecheck-changed.ts +69 -16
- package/scripts/docs/generate-graph-anatomy.ts +19 -2
- package/scripts/graph-harvest-unit.ts +22 -0
- package/scripts/graph-units/journey-stub.ts +6 -0
- package/scripts/graph-units/land-enqueue.ts +78 -0
- package/scripts/graph-units/recover-plan.ts +15 -0
- package/scripts/graph-units/reflect-node.ts +88 -0
- package/scripts/graph-units/ta-journey-observe.ts +109 -0
- package/scripts/graph-units/verbs/headless-goal-loop.ts +152 -0
- package/scripts/graph-units/verbs/verify-stage.ts +75 -0
- package/scripts/graph-units/verbs-envelope.ts +139 -0
- package/scripts/hq/standby-snapshot.ts +25 -0
- package/scripts/public-export.ts +43 -1
- package/scripts/ratchets/train-side-invariants.sh +45 -0
- package/scripts/release-loop/auto-approve-node.ts +30 -16
- package/scripts/release-loop/gate-closure.ts +5 -1
- package/scripts/release-loop/gate-diff.ts +1 -1
- package/scripts/release-loop/gate-node.ts +498 -31
- package/scripts/release-loop/gate-partial.ts +3 -3
- package/scripts/release-loop/gate-radius-shadow.ts +138 -0
- package/scripts/release-loop/gate-traffic-mode.ts +128 -0
- package/scripts/release-loop/gate-triage-node.ts +5 -2
- package/scripts/release-loop/known-issues-0.2.33-approved.json +194 -0
- package/scripts/release-loop/known-issues-node.ts +77 -8
- package/scripts/release-loop/preflight.ts +93 -7
- package/scripts/release-loop/publish-node.ts +60 -9
- package/scripts/release-loop/resume-cap.ts +56 -0
- package/scripts/release-loop/resume-release.ts +114 -15
- package/scripts/release-loop/resume.ts +24 -1
- package/scripts/release-loop/tui-sim-node.ts +8 -2
- package/scripts/release-loop/unattended-release.ts +8 -2
- package/src/acp/core-turn-bridge.ts +20 -5
- package/src/acp/reasoning-thought-buffer.ts +45 -0
- package/src/agent-substrate/acp-reviewer.ts +52 -12
- package/src/agent-substrate/review-finding-key.ts +53 -0
- package/src/agent-substrate/self-review-cli.ts +126 -5
- package/src/ask-user-question/pending-questions.ts +1 -1
- package/src/autopilot/pr-manager.ts +192 -43
- package/src/chat/tool-render/dispatch.ts +62 -10
- package/src/cli/control-cli.ts +24 -7
- package/src/cli/guardian-cli.ts +10 -0
- package/src/cli/light-entry-route.ts +35 -0
- package/src/cli/llm-detect-cli.ts +23 -1
- package/src/cli/pr-cli.ts +76 -12
- package/src/cli/pr-land-base-read.ts +2 -0
- package/src/cli/pr-land-overlap-evidence.ts +154 -16
- package/src/cli/pr-land-recovery.ts +64 -0
- package/src/cli/pty-takeover-cli.ts +6 -5
- package/src/cli/release-cli.ts +120 -33
- package/src/cli/release-run-if-ready.ts +29 -28
- package/src/cli/release-single-flight.ts +178 -0
- package/src/cli/seat-cli.ts +37 -0
- package/src/cli/setup-cli.ts +40 -1
- package/src/cli/tasks-cli.ts +149 -5
- package/src/control/control-status.ts +8 -3
- package/src/control-plane/ledger.ts +5 -3
- package/src/control-plane/server.ts +5 -3
- package/src/core-turn/short-question.ts +5 -1
- package/src/dashboard/index.ts +36 -67
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +3 -0
- package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
- package/src/dashboard/input/seat-autowake.ts +56 -3
- package/src/dashboard/seat-boot-preamble.ts +1 -1
- package/src/dashboard/slash-runtime/ask-clarification.ts +48 -0
- package/src/dashboard/slash-runtime/dashboard-delegated-slashes.ts +68 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +62 -322
- package/src/dashboard/slash-runtime/dashboard-log-slash.ts +208 -0
- package/src/dashboard/turn-preamble.ts +47 -1
- package/src/dashboard/turn-stream-formatter.ts +34 -1
- package/src/dashboard/turn-stream-runtime.ts +2 -0
- package/src/dashboard/turn-typeahead-prompt-zone.ts +67 -0
- package/src/domains/guardian-tick.ts +54 -2
- package/src/domains/outbound-alert.ts +3 -2
- package/src/extractors.ts +3 -1
- package/src/git-fs/retry.ts +4 -0
- package/src/git-fs/runner.ts +2 -0
- package/src/graph-runner/runner.ts +114 -44
- package/src/grok/credential.ts +5 -0
- package/src/harness/harness-cli-command.ts +39 -10
- package/src/harness/harness-incidents.ts +4 -0
- package/src/harness/harness-pod-dispatch.ts +38 -1
- package/src/harness/harness-salvage-cli.ts +14 -2
- package/src/index.ts +192 -8
- package/src/intake-plane/already-built-hint.ts +89 -0
- package/src/knowhow/pack.ts +199 -0
- package/src/light-cli.ts +95 -0
- package/src/llm.ts +55 -9
- package/src/loops/budget.ts +95 -0
- package/src/loops/msg-wake.ts +8 -2
- package/src/loops/orchestrator/traffic.ts +132 -1
- package/src/mss/logging/log-store.ts +4 -5
- package/src/nexus/api/graphs-api.ts +22 -3
- package/src/nexus/api/http-server.ts +1 -1
- package/src/nexus/api/ops-api.ts +12 -0
- package/src/oauth/claude-pty-maturity.ts +66 -0
- package/src/oauth/codex-access-mirror.ts +55 -0
- package/src/oauth/fallback-chain.ts +1 -1
- package/src/onboarding/first-run.ts +5 -3
- package/src/onboarding/non-interactive.ts +64 -13
- package/src/onboarding.ts +10 -2
- package/src/ops/overview-collect.ts +36 -1
- package/src/ops/overview.ts +11 -0
- package/src/pr-tool/census.ts +23 -5
- package/src/pr-tool/inflight-registry.ts +160 -7
- package/src/prompt-library/gpt6-family-addendum.ts +14 -1
- package/src/pty-shell/herdr-agent-report.ts +442 -0
- package/src/pty-shell/pty-control-ipc.ts +5 -5
- package/src/pty-shell/pty-write-outcome.ts +24 -6
- package/src/pty-shell/tui-run-state.ts +117 -3
- package/src/release-loop/checklist.ts +79 -5
- package/src/release-loop/feature-store.ts +19 -2
- package/src/release-loop/placement.ts +10 -3
- package/src/release-loop/rehearsal.ts +205 -25
- package/src/release-loop/rubric.ts +16 -2
- package/src/self-dev/draft-sweep.ts +52 -3
- package/src/self-dev/graph-journey-nodes.ts +10 -6
- package/src/self-dev/graph-journey-route.ts +60 -6
- package/src/self-dev/orchestrate.ts +79 -3
- package/src/self-dev/run-supervisor.ts +107 -12
- package/src/self-dev/run-types.ts +5 -1
- package/src/self-implement/gate-baseline.ts +49 -5
- package/src/self-implement/gate-remote.ts +9 -5
- package/src/self-implement/goal-author-identity.ts +66 -0
- package/src/self-implement/goal-author-preservation-obligation.ts +35 -0
- package/src/self-implement/goal-author.ts +4 -120
- package/src/self-implement/graph-overlay-yaml.ts +17 -2
- package/src/self-implement/graph-unit-flatten.ts +103 -0
- package/src/self-implement/graph-unit-resolver.ts +107 -0
- package/src/self-implement/graph-yaml.ts +151 -1
- package/src/self-implement/headless-elanous-driver.ts +1 -0
- package/src/self-implement/knowhow-pack.ts +103 -0
- package/src/self-implement/orchestrator.ts +8 -0
- package/src/self-implement/pod-warm-pool-profile.ts +45 -0
- package/src/self-implement/review-mustfix-class.ts +203 -0
- package/src/self-implement/run-stop.ts +8 -2
- package/src/self-implement/seams.ts +32 -1
- package/src/self-implement/stop-autoheal.ts +25 -1
- package/src/session/chat.ts +27 -0
- package/src/session-runtime/retry-policy.ts +2 -1
- package/src/skills/tools/schedule-wakeup.ts +66 -17
- package/src/steward/release-day.ts +7 -3
- package/src/steward/triage.ts +37 -4
- package/src/task-agent/harvest-unit.ts +141 -0
- package/src/task-agent/live-moves.ts +98 -12
- package/src/task-agent/parent-host.ts +93 -3
- package/src/task-agent/postland-card.ts +80 -1
- package/src/task-agent/rejudge-on-head.ts +112 -26
- package/src/task-agent/repair-branch-cas.ts +4 -1
- package/src/task-agent/repair-cycle.ts +16 -3
- package/src/task-agent/run-identity.ts +4 -3
- package/src/task-agent/shadow.ts +12 -2
- package/src/task-agent/task-hand.ts +54 -7
- package/src/task-agent/work-order-build.ts +22 -0
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +39 -3
- package/src/task-orchestrator/surfaces/pod-command-job.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +86 -8
- package/src/task-orchestrator/surfaces/pod-pool.ts +73 -17
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +54 -4
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +26 -3
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +389 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +2 -1
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +223 -38
- package/src/task-orchestrator/surfaces/self-implement.ts +83 -2
- package/src/tool-runtime/truncation-store.ts +4 -0
- package/src/tui-client/dashboard-session.ts +10 -1
- package/src/user-config/coercion.ts +36 -0
- package/src/user-config.ts +18 -41
- package/src/ux-sim/scenario.ts +72 -13
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +0 -287
- package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +0 -62
- package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1654.32de4b324981a188.js +0 -23
- package/apps/pwa/out/_next/static/chunks/1834-98b64172bc1efe77.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +0 -149
- package/apps/pwa/out/_next/static/chunks/1913.7cc6fb6055b1ed3f.js +0 -41
- package/apps/pwa/out/_next/static/chunks/2001.6c7e0fd02190886c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +0 -115
- package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +0 -64
- package/apps/pwa/out/_next/static/chunks/3267c0e6.d34854e7b3984a6e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3902.e1e71aaac850a045.js +0 -34
- package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4111.2bfedbb233ad206b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +0 -36
- package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +0 -77
- package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4999.c064a4000c2a9e94.js +0 -79
- package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5304.04d24756f242a094.js +0 -148
- package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5458-16cd7a2b51b74c8c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +0 -94
- package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/60fb96c9.360b01d8d4927b7b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6323.8672b4817a306928.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +0 -90
- package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +0 -32
- package/apps/pwa/out/_next/static/chunks/6544cb48.a87fe20ddf137be2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +0 -104
- package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6767.ea607cf0c20a25af.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +0 -93
- package/apps/pwa/out/_next/static/chunks/69-0a2c8209c6d4a158.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7371.80c05c653b08e907.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7391.ebae168025c91b6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +0 -8
- package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7947-d0759430f8042240.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8018.a32663f04a6fc5f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8097-9530c03bcc550f02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +0 -1
- package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9138.b6e80031afb1d973.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9279-d28c5b7754d010ae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-504204b58c82c253.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a9717a67c2eecbaf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-5c9ec30aee62dfbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-584191533721fa16.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-73c4b4bb3ac7ab5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-c0f1ca371f710b06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-46430d45a9e04eac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-3b2ebf1dc64ff0be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-a27b1e5a0d1b308f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-25654b82094f7d22.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-8ea49a4c6dd2c6e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-ce5113aefea0a8d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0e5a41fac1c75396.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-31aaf1ed37c6df9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-3dcc1fa411e1f4e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c69247e7134d329d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-66dc5cd3a0999abe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-26ff7ff651a7217d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-617b3976981efa96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-d256f5d5d9552823.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-ce8f1907b8a6101c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-33e182a316263116.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-32866485913d6a04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-7607cca9b84950c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-eeab86176b03dc3b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-5b93dbae3432b996.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-77a6cb90a9cf2b10.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f47e768b5b242b5a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-eb41aa3367fc2505.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-4d13ab0b8a267e3f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-84dad32ff0fc0831.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-95306f892aa2d0ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-940fb6c217f6b470.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7b675dfd35c36fc9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8bd0d3cf7665bcfc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-c219f2ed171131be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-40f8fa21bdae955b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-468f8313e4f1fbd9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-7bbb8fa353a246c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-4214b855d9233ea8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-936752c7aa58762e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-ec052ad359df1797.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8305570551091338.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-fad650e4793adb65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-d90e64743826e1d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a16bcfd49af86a32.js +0 -1
- package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +0 -122
- package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +0 -1
- package/src/cli/g6a-registration-probe.ts +0 -16
- /package/apps/pwa/out/_next/static/{IVKr3AlRUVLKsw2fh7eXF → L04y73dlwKeTW-GetaTF3}/_ssgManifest.js +0 -0
package/src/index.ts
CHANGED
|
@@ -6,7 +6,6 @@ import { accessSync, constants as fsConstants, existsSync, lstatSync, readFileSy
|
|
|
6
6
|
import type { SelfDevRunParticipant, SelfDevRunState } from './self-dev/run-store.js';
|
|
7
7
|
import { applyConfigDirFlagFromArgv } from './cli/config-dir-flag.js';
|
|
8
8
|
import { LOGS_SINCE_OPTION, registerLogsCommands } from './cli/logs-cli.js';
|
|
9
|
-
import { registerSimCommands } from './cli/sim-cli.js';
|
|
10
9
|
import { registerDocsCommands } from './cli/docs-cli.js';
|
|
11
10
|
import { registerBenchCommands } from './cli/bench-cli.js';
|
|
12
11
|
import { registerRetroCommands } from './cli/retro-cli.js';
|
|
@@ -45,7 +44,6 @@ import { applyTestFlagFromArgv, observeTestFlagOwnership, uncoveredTestFlagPaths
|
|
|
45
44
|
import { registerPtyTakeoverCommands } from './cli/pty-takeover-cli.js';
|
|
46
45
|
import { registerPtyRecordCommand } from './cli/pty-record-cli.js';
|
|
47
46
|
import { registerLeaderCommands } from './cli/leader-cli.js';
|
|
48
|
-
import { registerPrCommands } from './cli/pr-cli.js';
|
|
49
47
|
import { registerRepoCommands } from './cli/repo-cli.js';
|
|
50
48
|
import { registerAgentCommands, runChatTurnCli, emitDetachedProgress } from './cli/agent-cli.js';
|
|
51
49
|
export { runChatTurnCli, buildCliAgentTools, setCliAgentDispatchForTesting, emitDetachedProgress, emitHarnessFeedbackProgress } from './cli/agent-cli.js';
|
|
@@ -917,7 +915,114 @@ async function runDevSayFromWords(
|
|
|
917
915
|
|
|
918
916
|
registerPtyTakeoverCommands(program);
|
|
919
917
|
registerPtyRecordCommand(program.commands.find((command) => command.name() === 'pty')!);
|
|
920
|
-
|
|
918
|
+
// Keep the public PR help slot but defer its large CI/landing import graph
|
|
919
|
+
// until the PR command is actually selected (including direct Commander use).
|
|
920
|
+
const prCommandOrder = program.commands.length;
|
|
921
|
+
const prShell = program.command('pr').description('PR landing commands');
|
|
922
|
+
// The exported Commander tree is also the public entrance inventory. Keep its
|
|
923
|
+
// lightweight declarations visible without importing the CI/landing graph.
|
|
924
|
+
prShell.command('supersede-drafts').description('확인된 병합 PR의 명시 Supersedes 같은 칸 draft만 정리')
|
|
925
|
+
.requiredOption('--pr <number>', '병합 PR 번호')
|
|
926
|
+
.option('--cwd <path>', '저장소 경로');
|
|
927
|
+
prShell.command('census').description('열린 PR 전체·골 문서만·2일 무커밋 draft·미닫힌 superseded 집계').option('--cwd <path>', '저장소 경로');
|
|
928
|
+
prShell.command('open-guard').description('새 PR 전에 같은 파일 OPEN PR·골 문서만·자리별 상한 검사')
|
|
929
|
+
.option('--cwd <path>', '작업 트리 경로').option('--base <ref>', '비교 base ref', 'origin/main')
|
|
930
|
+
.option('--seat <seat>', 'PR 소유 자리(OP|TC|MK|UX)').option('--cell <id>', '릴리스 칸 id (같은 칸 OPEN PR 검사)')
|
|
931
|
+
.option('--seat-cap <number>', '자리별 열린 PR 경고 상한', '30');
|
|
932
|
+
const prQueueShell = prShell.command('queue').description('Shadow merge queue (never lands PRs)');
|
|
933
|
+
prQueueShell.command('status').description('Show pending PRs and shadow verdicts');
|
|
934
|
+
prQueueShell.command('enqueue <pr>').description('Pin a ready PR at the tail of the shadow queue');
|
|
935
|
+
prQueueShell.command('run').description('Evaluate the first PR without merging').requiredOption('--shadow', 'Only evaluate; never land');
|
|
936
|
+
prShell.command('land').description('현재 브랜치 PR을 생성 또는 갱신해 ready 상태로 만들고 squash merge')
|
|
937
|
+
.option('--base <branch>', 'PR base branch').option('--cwd <path>', '작업 트리 경로')
|
|
938
|
+
.option('--pr <number>', '기존 PR 번호 고정 (--expected-head 와 함께)')
|
|
939
|
+
.option('--expected-head <sha>', '리뷰된 PR 머리 SHA 고정 (--pr 와 함께)')
|
|
940
|
+
.option('--heavy-remote', '머리 고정 착지의 무거운 게이트를 node-b·node-c 중 빈 호스트에서 실행; head⊕main 증거가 없거나 실패하면 거부(로컬 폴백 없음)')
|
|
941
|
+
.option('--heavy-on-pod-shadow', '--heavy-remote 판정을 유지하고 같은 head/main의 Pod 타입·변경 시험 결과를 비교만 한다')
|
|
942
|
+
.option('--dry-run', '변경 없이 landing 계획만 출력').option('--hold', 'PR을 생성 또는 갱신한 뒤 병합하지 않고 쌓아 둔다')
|
|
943
|
+
.option('--title <title>', 'PR title').option('--title-file <path>', 'PR title file')
|
|
944
|
+
.option('--body <body>', 'PR body').option('--body-file <path>', 'PR body file')
|
|
945
|
+
.option('--commit-message <message>', 'upsert commit message')
|
|
946
|
+
.option('--commit-message-file <path>', 'upsert commit message file (takes precedence over --commit-message)')
|
|
947
|
+
.option('--include-active-run-files', '도는 런 파일을 이번 착지에 포함 (기본 동작)')
|
|
948
|
+
.option('--exclude-active-run-files', '도는 런과 겹친 파일을 이번 착지에서 제외')
|
|
949
|
+
.option('--exclude-active-run-sources', '⚠ 위험: --exclude-active-run-files 가 골 문서가 아닌 파일(소스)을 빼도 착지를 강행')
|
|
950
|
+
.option('--land-reason <text>', '권고를 보고도 지금 내는 이유(예: 남이 기다리는 차단 해제)')
|
|
951
|
+
.option('--force-freeze <reason>', '동결을 넘겨 병합할 명시적 이유(필수)')
|
|
952
|
+
.option('--allow-public-leak', '바뀐 파일이 공개본에 사적 흔적을 실어도 착지(이유는 --land-reason)')
|
|
953
|
+
.option('--overlap-evidence <file>', '머리 고정 착지 전용: 비대화형 겹침 승인을 대신할 증거 JSON {pr, head, gate:{head,baseCommit,passed}, reviewResult} — 재기반·재게이트·리뷰를 CLI 가 다시 잰다(겹친 착지가 전부 머리의 조상이면 리뷰만 · gate 생략 가능)');
|
|
954
|
+
prShell.command('granularity').description('로컬 git log 로 최근 착지 단위(파일 중복·단일 파일 비율)를 센다')
|
|
955
|
+
.option('--since <window>', 'git log --since 창', '1 day ago')
|
|
956
|
+
.option('--cwd <path>', '작업 트리 경로').option('--base <branch>', '착지 집계에 쓸 base 브랜치')
|
|
957
|
+
.option('--with-source', 'PR 번호로 브랜치를 조회해 하니스↔사람 갈래를 함께 낸다 (gh 필요)');
|
|
958
|
+
const parseBeforePrRegistration = program.parse.bind(program);
|
|
959
|
+
const parseAsyncBeforePrRegistration = program.parseAsync.bind(program);
|
|
960
|
+
let prRegistered = false;
|
|
961
|
+
function ensurePrRegistered(): void {
|
|
962
|
+
if (prRegistered) return;
|
|
963
|
+
const { registerPrCommands } = require('./cli/pr-cli.js') as typeof import('./cli/pr-cli.js');
|
|
964
|
+
// Commander exposes this array as readonly in types, while registration still mutates it at runtime.
|
|
965
|
+
const commands = program.commands as Command[];
|
|
966
|
+
commands.splice(prCommandOrder, 1);
|
|
967
|
+
registerPrCommands(program);
|
|
968
|
+
const registered = commands.pop()!;
|
|
969
|
+
commands.splice(prCommandOrder, 0, registered);
|
|
970
|
+
prRegistered = true;
|
|
971
|
+
}
|
|
972
|
+
// Consumers may hold a reference to the exported PR subtree and parse that
|
|
973
|
+
// command directly, bypassing program.parse. Keep those references executable
|
|
974
|
+
// without loading the PR registrar until a direct parse actually occurs.
|
|
975
|
+
function deferPrSubtreeParse(shell: Command, path: number[] = []): void {
|
|
976
|
+
const selected = () => {
|
|
977
|
+
ensurePrRegistered();
|
|
978
|
+
let command = program.commands[prCommandOrder]!;
|
|
979
|
+
for (const index of path) command = command.commands[index]!;
|
|
980
|
+
return command;
|
|
981
|
+
};
|
|
982
|
+
shell.parse = (...args: Parameters<Command['parse']>) => selected().parse(...args);
|
|
983
|
+
shell.parseAsync = (...args: Parameters<Command['parseAsync']>) => selected().parseAsync(...args);
|
|
984
|
+
shell.commands.forEach((child, index) => deferPrSubtreeParse(child, [...path, index]));
|
|
985
|
+
}
|
|
986
|
+
deferPrSubtreeParse(prShell);
|
|
987
|
+
function selectedRootArgs(argv: readonly string[] | undefined, from?: string): { command: string | undefined; next: string | undefined; rootHelp: boolean } {
|
|
988
|
+
const args = (argv ?? process.argv).slice(from === 'user' ? 0 : from === 'electron' ? 1 : 2);
|
|
989
|
+
// parseOptions() emits Commander option events, so do not run it before the
|
|
990
|
+
// real parse. Only inspect leading root options; a subcommand owns the rest.
|
|
991
|
+
let position = 0;
|
|
992
|
+
let rootHelp = args.length === 0;
|
|
993
|
+
while (position < args.length) {
|
|
994
|
+
const token = args[position];
|
|
995
|
+
if (token === '--') { position++; break; }
|
|
996
|
+
if (token === '--help' || token === '-h' || token === '--help-all') {
|
|
997
|
+
rootHelp = true;
|
|
998
|
+
position++;
|
|
999
|
+
continue;
|
|
1000
|
+
}
|
|
1001
|
+
const option = program.options.find((item) => token === item.long || token === item.short
|
|
1002
|
+
|| (item.long && token.startsWith(`${item.long}=`)));
|
|
1003
|
+
if (!option) {
|
|
1004
|
+
if (token.startsWith('-')) { position++; continue; }
|
|
1005
|
+
break;
|
|
1006
|
+
}
|
|
1007
|
+
position++;
|
|
1008
|
+
if (option.required && !token.includes('=')) position++;
|
|
1009
|
+
else if (option.optional && position < args.length && !args[position].startsWith('-')) position++;
|
|
1010
|
+
}
|
|
1011
|
+
return { command: args[position], next: args[position + 1], rootHelp };
|
|
1012
|
+
}
|
|
1013
|
+
function prSelectedForParse(argv: readonly string[] | undefined, from?: string): boolean {
|
|
1014
|
+
const { command, next, rootHelp } = selectedRootArgs(argv, from);
|
|
1015
|
+
return command === 'pr' || (command === 'help' && (!next || next === 'pr'))
|
|
1016
|
+
|| (!command && rootHelp);
|
|
1017
|
+
}
|
|
1018
|
+
program.parse = (...args: Parameters<typeof program.parse>) => {
|
|
1019
|
+
if (prSelectedForParse(args[0], args[1]?.from)) ensurePrRegistered();
|
|
1020
|
+
return parseBeforePrRegistration(...args);
|
|
1021
|
+
};
|
|
1022
|
+
program.parseAsync = (...args: Parameters<typeof program.parseAsync>) => {
|
|
1023
|
+
if (prSelectedForParse(args[0], args[1]?.from)) ensurePrRegistered();
|
|
1024
|
+
return parseAsyncBeforePrRegistration(...args);
|
|
1025
|
+
};
|
|
921
1026
|
registerRepoCommands(program);
|
|
922
1027
|
registerRoleCommands(program);
|
|
923
1028
|
registerMachineCommands(program);
|
|
@@ -4941,6 +5046,22 @@ const selfOrchestrateCmd = selfCmd
|
|
|
4941
5046
|
const grokKeyNames = ['XAI_API_KEY', 'GROK_API_KEY', 'GROK_CODE_XAI_API_KEY'];
|
|
4942
5047
|
// 명시 계정은 사람의 선택 — 공급자 폴백과 계정 브로커를 우회한다.
|
|
4943
5048
|
const explicitPodAccount = (opts as { podAccount?: string }).podAccount;
|
|
5049
|
+
const ownerMirrorAccount = process.env.ELANOUS_REMOTE_CODEX_ACCOUNT?.trim();
|
|
5050
|
+
const childProvider = opts as { childLlmProvider?: string };
|
|
5051
|
+
const requestedChildProvider = childProvider.childLlmProvider?.trim();
|
|
5052
|
+
if (ownerMirrorAccount && explicitPodAccount && explicitPodAccount !== ownerMirrorAccount) {
|
|
5053
|
+
ui.error(`pod: HQ 미러 계정은 ${ownerMirrorAccount} 인데 --pod-account ${explicitPodAccount} 을 사용할 수 없다`);
|
|
5054
|
+
process.exit(2);
|
|
5055
|
+
}
|
|
5056
|
+
if (ownerMirrorAccount && requestedChildProvider && requestedChildProvider !== 'openai-codex') {
|
|
5057
|
+
const reason = `pod: HQ 미러 계정 ${ownerMirrorAccount} 은 openai-codex 전용이라 --child-llm-provider ${requestedChildProvider} 을 사용할 수 없다`;
|
|
5058
|
+
ui.error(reason);
|
|
5059
|
+
debug.log('self-implement.pod', 'child-provider-refused', { provider: requestedChildProvider, reason });
|
|
5060
|
+
process.exit(2);
|
|
5061
|
+
}
|
|
5062
|
+
// An owner mirror pins the Pod child to that access-only Codex account; do not let a configured
|
|
5063
|
+
// podChildDefault route the child to an unrelated provider.
|
|
5064
|
+
if (ownerMirrorAccount && !requestedChildProvider) childProvider.childLlmProvider = 'openai-codex';
|
|
4944
5065
|
let accountBroker: (() => string) | undefined;
|
|
4945
5066
|
let rotationAccounts: readonly string[] | undefined;
|
|
4946
5067
|
let podProvider: import('./task-orchestrator/surfaces/pod-child-providers.js').PodChildProvider = 'openai-codex';
|
|
@@ -5032,7 +5153,8 @@ const selfOrchestrateCmd = selfCmd
|
|
|
5032
5153
|
}
|
|
5033
5154
|
}
|
|
5034
5155
|
// 10-05 PODPROVIDER: a launch that named the child provider gets it, or is refused — never a silent codex.
|
|
5035
|
-
const
|
|
5156
|
+
const explicitChild = (opts as { childLlmProvider?: string }).childLlmProvider?.trim();
|
|
5157
|
+
const namedChild = ownerMirrorAccount && !explicitChild ? 'openai-codex' : explicitChild;
|
|
5036
5158
|
const { podNamedChildProvider, podFallbackCredentials, podGrokSubscriptionUsable: namedGrokUsable } = await import('./task-orchestrator/surfaces/self-implement-pod.js');
|
|
5037
5159
|
const { readFileSync: readPodKeyFile } = await import('node:fs');
|
|
5038
5160
|
const { homedir: podHome } = await import('node:os');
|
|
@@ -5052,12 +5174,27 @@ const selfOrchestrateCmd = selfCmd
|
|
|
5052
5174
|
if (namedChildDecision.refuse) { ui.error(namedChildDecision.refuse); debug.log('self-implement.pod', 'child-provider-refused', { provider: namedChild, reason: namedChildDecision.refuse }); process.exit(2); }
|
|
5053
5175
|
// A named codex child must stay codex — the plan may not fall back to grok (post-review must-fix).
|
|
5054
5176
|
const namedCodex = namedChildDecision.provider === 'openai-codex';
|
|
5177
|
+
let planCandidates = inspectCodexRotation().candidates;
|
|
5178
|
+
if (ownerMirrorAccount) {
|
|
5179
|
+
const used = process.env.ELANOUS_REMOTE_CODEX_USED_PERCENT;
|
|
5180
|
+
const parsedUsed = used && used !== 'unknown' ? Number(used) : undefined;
|
|
5181
|
+
const threshold = Number(process.env.ELANOUS_REMOTE_CODEX_THRESHOLD_PERCENT);
|
|
5182
|
+
if (!Number.isFinite(threshold) || threshold <= 0 || threshold > 100) {
|
|
5183
|
+
ui.error('pod: HQ Codex 미러의 유효 임계 표지가 없어 발사를 거부한다');
|
|
5184
|
+
process.exit(2);
|
|
5185
|
+
}
|
|
5186
|
+
const { ownerCodexMirrorCandidate } = await import('./task-orchestrator/surfaces/pod-account-broker.js');
|
|
5187
|
+
planCandidates = ownerCodexMirrorCandidate(planCandidates, ownerMirrorAccount, parsedUsed !== undefined && Number.isFinite(parsedUsed) ? parsedUsed : undefined);
|
|
5188
|
+
if (planCandidates.length === 0) { ui.error(`pod: HQ Codex 미러 계정 ${ownerMirrorAccount} 이 원격 auth-store 후보에 없다`); process.exit(2); }
|
|
5189
|
+
}
|
|
5055
5190
|
const plan: import('./task-orchestrator/surfaces/pod-account-broker.js').PodProviderPlan | null = namedChildDecision.provider === 'openrouter' || namedChildDecision.provider === 'anthropic' || namedChildDecision.provider === 'bedrock' || namedChildDecision.provider === 'glm' ? null : namedChildDecision.provider === 'grok'
|
|
5056
5191
|
? { provider: 'grok', excluded: [], grokSubscriptionEligible: credential?.kind === 'subscription' }
|
|
5057
5192
|
: planPodProvider({
|
|
5058
|
-
codexCandidates:
|
|
5193
|
+
codexCandidates: planCandidates,
|
|
5059
5194
|
// Per-account caps (대표 default:97) override the Pod default cap — without them default was dropped at 60%.
|
|
5060
|
-
thresholdPercentByAccount:
|
|
5195
|
+
thresholdPercentByAccount: ownerMirrorAccount
|
|
5196
|
+
? { [ownerMirrorAccount]: Number(process.env.ELANOUS_REMOTE_CODEX_THRESHOLD_PERCENT) }
|
|
5197
|
+
: launchPolicy.llm?.codexAccountRotationThresholdPercentByAccount,
|
|
5061
5198
|
// 대표 한도 정책 한 값(`llm.codexQuotaPolicy`) — 크레딧·폴백을 같이 정한다.
|
|
5062
5199
|
creditsAllowed: codexPolicyAllowsCredits(quotaPolicy),
|
|
5063
5200
|
// SUBSCRIPTION-EXHAUST-REROUTE — 예비분 이하 잔액(«알려진» 값)의 계정은 크레딧으로 쓰지 않는다.
|
|
@@ -5760,7 +5897,8 @@ selfCmd
|
|
|
5760
5897
|
.option('--context-text <text>', '리뷰어가 함께 판단할 텍스트(반복 가능)', (value: string, previous: string[] = []) => [...previous, value])
|
|
5761
5898
|
.option('--json', '구조화 출력 {pr, verdict, mustFix, shouldFix, reviewed}')
|
|
5762
5899
|
.option('--save <name>', '리뷰 결과를 상태 디렉터리의 review-results/<name>-<PR>-<head12>.json에 저장')
|
|
5763
|
-
.
|
|
5900
|
+
.option('--over-cap-reason <reason>', '저장 리뷰 r5 상한 이후 이번 호출 1회 예외 사유(doctor.review cap-override 기록)')
|
|
5901
|
+
.action(async (prParts: string[], opts: { intent?: string; model?: string; acp?: boolean; acpModel?: string; acpBackend?: string; acpTimeout?: string; context?: string[]; contextText?: string[]; json?: boolean; save?: string; overCapReason?: string }) => {
|
|
5764
5902
|
const prArgs = prParts.flatMap((p) => String(p).split(/[,\s]+/).filter(Boolean)); // 번호/#번호/URL·콤마목록.
|
|
5765
5903
|
if (!prArgs.length) { ui.error('PR 필요: elanous self review <번호|URL> [..]'); process.exit(2); }
|
|
5766
5904
|
// ⭐ 본문은 seam(`runSelfReviewCliCommand`)에 있다 — 이 액션은 **의존 배선만** 한다.
|
|
@@ -5851,6 +5989,17 @@ selfCmd
|
|
|
5851
5989
|
roleFallbackModel: () => (getOpenRouterApiKeyForReview()?.trim() ? ROLE_REVIEWER_FALLBACK_MODEL : undefined),
|
|
5852
5990
|
registerSink: async (surface) => { await registerStandaloneLogSink(surface); },
|
|
5853
5991
|
log: (event, data, o) => debug.log('self-review', event, data, o ?? {}),
|
|
5992
|
+
observeDoctorReview: (event, data, o) => debug.log('doctor.review', event, data, o ?? {}),
|
|
5993
|
+
loadDoctorReviewBrief: async ({ pr, head, title, body, changedFiles }) => {
|
|
5994
|
+
// MK's doctor module is a separate PR. Until it lands, keep the original intent and record brief-unavailable.
|
|
5995
|
+
const modulePath = './self-implement/review-round-brief.js';
|
|
5996
|
+
const { effectiveInstanceRoot } = await import('./instance/resolve.js');
|
|
5997
|
+
const doctor = await import(modulePath) as {
|
|
5998
|
+
loadReviewRoundBrief(input: { pr: number; head: string; title: string; body: string; changedFiles: string[]; reviewResultsDir: string }): unknown;
|
|
5999
|
+
renderReviewBriefIntentBlock(brief: unknown): string | null;
|
|
6000
|
+
};
|
|
6001
|
+
return doctor.renderReviewBriefIntentBlock(doctor.loadReviewRoundBrief({ pr, head, title, body, changedFiles, reviewResultsDir: _joinPath(effectiveInstanceRoot(), 'review-results') }));
|
|
6002
|
+
},
|
|
5854
6003
|
info: (t) => ui.info(t),
|
|
5855
6004
|
error: (t) => ui.error(t),
|
|
5856
6005
|
print: (t) => console.log(t),
|
|
@@ -6176,7 +6325,36 @@ async function loadJevAccessOrExit(): Promise<import('./decide/jev.js').JevAcces
|
|
|
6176
6325
|
registerIntakeCommands(program);
|
|
6177
6326
|
|
|
6178
6327
|
registerLogsCommands(program);
|
|
6179
|
-
|
|
6328
|
+
// Keep the sim command in its public slot until either CLI or direct Commander
|
|
6329
|
+
// parsing selects it (or asks for help). The domain registrar owns its definition.
|
|
6330
|
+
const simCommandOrder = program.commands.length;
|
|
6331
|
+
program.command('sim').description('격리 시나리오를 실행하고 화면·로그 기대값을 대조한다');
|
|
6332
|
+
const parseWithRegisteredCommands = program.parse.bind(program);
|
|
6333
|
+
const parseAsyncWithRegisteredCommands = program.parseAsync.bind(program);
|
|
6334
|
+
let simRegistered = false;
|
|
6335
|
+
function ensureSimRegistered(): void {
|
|
6336
|
+
if (simRegistered) return;
|
|
6337
|
+
const { registerSimCommands } = require('./cli/sim-cli.js') as typeof import('./cli/sim-cli.js');
|
|
6338
|
+
const commands = program.commands as Command[];
|
|
6339
|
+
commands.splice(simCommandOrder, 1);
|
|
6340
|
+
registerSimCommands(program);
|
|
6341
|
+
const registered = commands.pop()!;
|
|
6342
|
+
commands.splice(simCommandOrder, 0, registered);
|
|
6343
|
+
simRegistered = true;
|
|
6344
|
+
}
|
|
6345
|
+
function simSelectedForParse(argv: readonly string[] | undefined, from?: string): boolean {
|
|
6346
|
+
const { command, next, rootHelp } = selectedRootArgs(argv, from);
|
|
6347
|
+
return command === 'sim' || (command === 'help' && next === 'sim')
|
|
6348
|
+
|| (!command && rootHelp);
|
|
6349
|
+
}
|
|
6350
|
+
program.parse = (...parseArgs: Parameters<typeof program.parse>) => {
|
|
6351
|
+
if (simSelectedForParse(parseArgs[0], parseArgs[1]?.from)) ensureSimRegistered();
|
|
6352
|
+
return parseWithRegisteredCommands(...parseArgs);
|
|
6353
|
+
};
|
|
6354
|
+
program.parseAsync = (...parseArgs: Parameters<typeof program.parseAsync>) => {
|
|
6355
|
+
if (simSelectedForParse(parseArgs[0], parseArgs[1]?.from)) ensureSimRegistered();
|
|
6356
|
+
return parseAsyncWithRegisteredCommands(...parseArgs);
|
|
6357
|
+
};
|
|
6180
6358
|
|
|
6181
6359
|
// ── ad (marketing-ad pipeline entrance) ──
|
|
6182
6360
|
/** ⛔ 「있다」와 「읽을 수 있는 파일이다」는 다른 값 — 디렉토리·권한 없는 파일을 실사로 읽지 않는다. */
|
|
@@ -11854,6 +12032,12 @@ async function main(): Promise<void> {
|
|
|
11854
12032
|
return;
|
|
11855
12033
|
}
|
|
11856
12034
|
const showAll = args[0] === '--help-all';
|
|
12035
|
+
if (firstCommand === 'sim' || (firstCommand === 'help' && args[1] === 'sim') || showAll || firstCommand === '--help' || firstCommand === '-h') {
|
|
12036
|
+
await ensureSimRegistered();
|
|
12037
|
+
}
|
|
12038
|
+
// Maturity filtering mutates command visibility; register the final PR
|
|
12039
|
+
// object before filtering so replacing the placeholder cannot reveal it.
|
|
12040
|
+
if (prSelectedForParse(['node', 'elanous', ...args])) ensurePrRegistered();
|
|
11857
12041
|
const role = getUserConfig().cli?.helpRole ?? 'owner';
|
|
11858
12042
|
const { shown, hidden } = filterCliRootHelp(program.commands, role, showAll);
|
|
11859
12043
|
debug.log('cli.maturity', 'help-filtered', { role, shown, hidden });
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// ── ALREADY-BUILT-HINT — «이미 있는 기능» 알림 원시함수 (UX · 0.2.34 칸) ──────────
|
|
2
|
+
//
|
|
3
|
+
// RFC-harness-full-journey-as-graph §4f 판정 — 다른 폴더의 «이미 있는 기능»을 새 요구로
|
|
4
|
+
// 넣으면 근거 링크(커밋·파일) 붙은 알림을 낸다 · 관련 없으면 0건 · 거절한 짝은 다시 묻지
|
|
5
|
+
// 않는다. 순수 함수·부수효과 0. 관련도 점수는 세션 검색의 trigram FTS5 원시함수
|
|
6
|
+
// (src/session/search-index.ts rankByTrigramFts — BM25, 낮을수록 관련도 높음)를 그대로
|
|
7
|
+
// 재사용한다. DEV-FEATURE-MAP 행을 넘겨 부르는 인테이크·저작 경로 배선(intake.hint
|
|
8
|
+
// 관측)은 다음 조각(남은 것)이다.
|
|
9
|
+
|
|
10
|
+
import { rankByTrigramFts, type RankedDoc, type RankResult } from '../session/search-index.js';
|
|
11
|
+
import { hashContent } from '../hasher.js';
|
|
12
|
+
|
|
13
|
+
/** DEV-FEATURE-MAP 한 행 — «이미 있는 기능» 후보. evidence 가 비면 그 행은 버린다(근거 없으면 침묵). */
|
|
14
|
+
export interface AlreadyBuiltFeature {
|
|
15
|
+
readonly devProject: string;
|
|
16
|
+
readonly feature: string;
|
|
17
|
+
readonly text: string;
|
|
18
|
+
readonly evidence: { readonly commit?: string; readonly file?: string };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** 거절한 짝 — «요구 해시 ⊕ feature». 요구 해시는 hashContent(request)(sha256 hex). */
|
|
22
|
+
export interface AlreadyBuiltRefusedPair {
|
|
23
|
+
readonly requestHash: string;
|
|
24
|
+
readonly feature: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type AlreadyBuiltHintKind = 'already' | 'similar';
|
|
28
|
+
|
|
29
|
+
/** A compact notification: one best match and at most two related matches. */
|
|
30
|
+
const MAX_ALREADY_BUILT_HINTS = 3;
|
|
31
|
+
|
|
32
|
+
/** 힌트 1건 — 근거 링크(커밋·파일) + BM25 점수(낮을수록 관련도 높음). */
|
|
33
|
+
export interface AlreadyBuiltHint {
|
|
34
|
+
readonly kind: AlreadyBuiltHintKind;
|
|
35
|
+
readonly devProject: string;
|
|
36
|
+
readonly feature: string;
|
|
37
|
+
readonly evidence: { readonly commit?: string; readonly file?: string };
|
|
38
|
+
readonly score: number;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** 근거 유무 — commit·file 중 하나라도 실값(빈 문자열 제외)이면 근거 있음. */
|
|
42
|
+
function hasEvidence(evidence: AlreadyBuiltFeature['evidence']): boolean {
|
|
43
|
+
return (evidence.commit != null && evidence.commit !== '') || (evidence.file != null && evidence.file !== '');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* 새 요구가 «이미 있는 기능»을 가리키는지 판정하는 순수 함수.
|
|
48
|
+
*
|
|
49
|
+
* - 후보의 배열 인덱스를 sessionId 로 사용해 rankByTrigramFts(request, docs) 로
|
|
50
|
+
* BM25 관련도 점수를 매긴다(재사용 · 낮을수록 높음).
|
|
51
|
+
* - evidence 가 비면 그 행은 버리고(근거 없으면 침묵) refused 짝(요구 해시 ⊕ feature)에
|
|
52
|
+
* 있는 행은 뺀다.
|
|
53
|
+
* - 매칭 행 중 관련도순 상위 3건만 내고, 첫 행(최고 관련도)은 kind='already',
|
|
54
|
+
* 그 뒤는 kind='similar'.
|
|
55
|
+
* - 관련 없는 요구·3자 미만 요구·FTS 오류·남는 후보 없음 → [] (출력 없음 = 침묵).
|
|
56
|
+
*/
|
|
57
|
+
export function alreadyBuiltHints(
|
|
58
|
+
request: string,
|
|
59
|
+
features: readonly AlreadyBuiltFeature[],
|
|
60
|
+
refused: readonly AlreadyBuiltRefusedPair[],
|
|
61
|
+
): AlreadyBuiltHint[] {
|
|
62
|
+
const requestHash = hashContent(request);
|
|
63
|
+
const candidates = features.filter((f) =>
|
|
64
|
+
hasEvidence(f.evidence)
|
|
65
|
+
&& !refused.some((p) => p.requestHash === requestHash && p.feature === f.feature),
|
|
66
|
+
);
|
|
67
|
+
if (candidates.length === 0) return [];
|
|
68
|
+
|
|
69
|
+
const docs: RankedDoc[] = candidates.map((f, index) => ({
|
|
70
|
+
sessionId: String(index),
|
|
71
|
+
content: f.text,
|
|
72
|
+
}));
|
|
73
|
+
const ranked: RankResult[] | null = rankByTrigramFts(request, docs);
|
|
74
|
+
if (!ranked || ranked.length === 0) return []; // 관련 없는 요구 · <3자 · FTS 오류 → 침묵
|
|
75
|
+
|
|
76
|
+
const hints: AlreadyBuiltHint[] = [];
|
|
77
|
+
for (const r of ranked.slice(0, MAX_ALREADY_BUILT_HINTS)) {
|
|
78
|
+
const f = candidates[Number(r.sessionId)];
|
|
79
|
+
if (!f) continue;
|
|
80
|
+
hints.push({
|
|
81
|
+
kind: hints.length === 0 ? 'already' : 'similar',
|
|
82
|
+
devProject: f.devProject,
|
|
83
|
+
feature: f.feature,
|
|
84
|
+
evidence: { ...f.evidence },
|
|
85
|
+
score: r.score,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return hints;
|
|
89
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/** Shared, deterministic retrieval contract for TUI and task-agent knowhow. */
|
|
2
|
+
|
|
3
|
+
export const KNOWHOW_PACK_DEFAULT_K = 8;
|
|
4
|
+
export const KNOWHOW_PACK_DEFAULT_CHAR_BUDGET = 32_000;
|
|
5
|
+
|
|
6
|
+
export type KnowhowSourceKind = 'KNOWHOW.md' | 'PLAYBOOK' | 'know-candidates' | 'autopsy';
|
|
7
|
+
export type KnowhowKind = 'fact' | 'warning' | 'heuristic' | 'playbook' | 'case';
|
|
8
|
+
|
|
9
|
+
export const KNOWHOW_HALF_LIFE_DAYS: Readonly<Record<KnowhowKind, number>> = {
|
|
10
|
+
fact: 14,
|
|
11
|
+
warning: 30,
|
|
12
|
+
heuristic: 90,
|
|
13
|
+
playbook: 60,
|
|
14
|
+
case: Number.POSITIVE_INFINITY,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export interface KnowhowTarget {
|
|
18
|
+
surface: string;
|
|
19
|
+
scope: string;
|
|
20
|
+
tool?: string;
|
|
21
|
+
commandClass?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Values are normalized by the consumer; the shared core compares them exactly. */
|
|
25
|
+
export interface KnowhowFailureSignature {
|
|
26
|
+
kind: string;
|
|
27
|
+
stableCode: string;
|
|
28
|
+
normalizedArgsHash: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface KnowhowFragment {
|
|
32
|
+
id: string;
|
|
33
|
+
target: KnowhowTarget;
|
|
34
|
+
signature: KnowhowFailureSignature;
|
|
35
|
+
text: string;
|
|
36
|
+
kind: KnowhowKind;
|
|
37
|
+
source: { kind: KnowhowSourceKind; path: string; ref: string };
|
|
38
|
+
status: 'verified' | 'candidate' | 'challenged' | 'rejected';
|
|
39
|
+
confidence: number;
|
|
40
|
+
verifiedAt: string;
|
|
41
|
+
expiresAt: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface KnowhowPackRequest {
|
|
45
|
+
target: KnowhowTarget;
|
|
46
|
+
signature: KnowhowFailureSignature;
|
|
47
|
+
now?: number;
|
|
48
|
+
maxItems?: number;
|
|
49
|
+
maxChars?: number;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface KnowhowPack {
|
|
53
|
+
snippets: Array<Pick<KnowhowFragment, 'id' | 'text' | 'source' | 'status' | 'confidence' | 'verifiedAt'>>;
|
|
54
|
+
omittedCount: number;
|
|
55
|
+
diagnostics: string[];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function sameTarget(a: KnowhowTarget, b: KnowhowTarget): boolean {
|
|
59
|
+
return a.surface === b.surface
|
|
60
|
+
&& a.scope === b.scope
|
|
61
|
+
&& a.tool === b.tool
|
|
62
|
+
&& a.commandClass === b.commandClass;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function sameSignature(a: KnowhowFailureSignature, b: KnowhowFailureSignature): boolean {
|
|
66
|
+
return a.kind === b.kind
|
|
67
|
+
&& a.stableCode === b.stableCode
|
|
68
|
+
&& a.normalizedArgsHash === b.normalizedArgsHash;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function timestamp(value: string): number | null {
|
|
72
|
+
const parsed = Date.parse(value);
|
|
73
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function compareText(a: string, b: string): number {
|
|
77
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
81
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function validTarget(value: unknown): value is KnowhowTarget {
|
|
85
|
+
if (!isRecord(value)) return false;
|
|
86
|
+
return typeof value.surface === 'string' && value.surface.trim().length > 0
|
|
87
|
+
&& typeof value.scope === 'string' && value.scope.trim().length > 0
|
|
88
|
+
&& (value.tool === undefined || typeof value.tool === 'string')
|
|
89
|
+
&& (value.commandClass === undefined || typeof value.commandClass === 'string');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function validSignature(value: unknown): value is KnowhowFailureSignature {
|
|
93
|
+
return isRecord(value)
|
|
94
|
+
&& typeof value.kind === 'string' && value.kind.trim().length > 0
|
|
95
|
+
&& typeof value.stableCode === 'string' && value.stableCode.trim().length > 0
|
|
96
|
+
&& typeof value.normalizedArgsHash === 'string' && value.normalizedArgsHash.trim().length > 0;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function validFragment(fragment: KnowhowFragment, request: KnowhowPackRequest, now: number): boolean {
|
|
100
|
+
const verifiedAt = timestamp(fragment.verifiedAt);
|
|
101
|
+
const expiresAt = timestamp(fragment.expiresAt);
|
|
102
|
+
return fragment.status === 'verified'
|
|
103
|
+
&& Object.hasOwn(KNOWHOW_HALF_LIFE_DAYS, fragment.kind)
|
|
104
|
+
&& Number.isFinite(fragment.confidence)
|
|
105
|
+
&& fragment.confidence >= 0 && fragment.confidence <= 1
|
|
106
|
+
&& ['KNOWHOW.md', 'PLAYBOOK', 'know-candidates', 'autopsy'].includes(fragment.source.kind)
|
|
107
|
+
&& fragment.id.trim().length > 0
|
|
108
|
+
&& fragment.text.trim().length > 0
|
|
109
|
+
&& fragment.source.path.trim().length > 0
|
|
110
|
+
&& fragment.source.ref.trim().length > 0
|
|
111
|
+
&& verifiedAt !== null && verifiedAt <= now
|
|
112
|
+
&& expiresAt !== null && expiresAt > now
|
|
113
|
+
&& expiresAt >= verifiedAt
|
|
114
|
+
&& (now - verifiedAt <= KNOWHOW_HALF_LIFE_DAYS[fragment.kind]
|
|
115
|
+
* 24 * 60 * 60 * 1000)
|
|
116
|
+
&& sameTarget(fragment.target, request.target)
|
|
117
|
+
&& sameSignature(fragment.signature, request.signature);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Select only verified, unexpired fragments for an exact target and failure
|
|
122
|
+
* signature. Whole snippets are admitted or omitted; this function never
|
|
123
|
+
* truncates evidence-bearing text. Invalid limits and malformed input fail
|
|
124
|
+
* open as an empty pack, leaving the caller's existing path usable.
|
|
125
|
+
*/
|
|
126
|
+
export function buildKnowhowPack(
|
|
127
|
+
fragments: readonly KnowhowFragment[],
|
|
128
|
+
request: KnowhowPackRequest,
|
|
129
|
+
): KnowhowPack {
|
|
130
|
+
try {
|
|
131
|
+
const inputCount = Array.isArray(fragments) ? fragments.length : 0;
|
|
132
|
+
if (!isRecord(request) || !validTarget(request.target) || !validSignature(request.signature)) {
|
|
133
|
+
return { snippets: [], omittedCount: inputCount, diagnostics: ['invalid-request'] };
|
|
134
|
+
}
|
|
135
|
+
if (!Array.isArray(fragments)) {
|
|
136
|
+
return { snippets: [], omittedCount: 0, diagnostics: ['invalid-fragments'] };
|
|
137
|
+
}
|
|
138
|
+
const maxItems = request.maxItems ?? KNOWHOW_PACK_DEFAULT_K;
|
|
139
|
+
const maxChars = request.maxChars ?? KNOWHOW_PACK_DEFAULT_CHAR_BUDGET;
|
|
140
|
+
const now = request.now ?? Date.now();
|
|
141
|
+
if (!Number.isFinite(now) || !Number.isInteger(maxItems) || maxItems < 0
|
|
142
|
+
|| !Number.isInteger(maxChars) || maxChars < 0) {
|
|
143
|
+
return { snippets: [], omittedCount: inputCount, diagnostics: ['invalid-request'] };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const sorted = [...fragments].filter((fragment) => validFragment(fragment, request, now)).sort((a, b) => {
|
|
147
|
+
// Most recently verified wins; the id is the stable tie breaker.
|
|
148
|
+
return timestamp(b.verifiedAt)! - timestamp(a.verifiedAt)!
|
|
149
|
+
|| compareText(a.id, b.id)
|
|
150
|
+
|| compareText(a.verifiedAt, b.verifiedAt)
|
|
151
|
+
|| b.confidence - a.confidence
|
|
152
|
+
|| compareText(a.expiresAt, b.expiresAt)
|
|
153
|
+
|| compareText(a.source.kind, b.source.kind)
|
|
154
|
+
|| compareText(a.source.path, b.source.path)
|
|
155
|
+
|| compareText(a.source.ref, b.source.ref)
|
|
156
|
+
|| compareText(a.text, b.text);
|
|
157
|
+
});
|
|
158
|
+
const seen = new Set<string>();
|
|
159
|
+
const eligible = sorted.filter((fragment) => {
|
|
160
|
+
if (seen.has(fragment.id)) return false;
|
|
161
|
+
seen.add(fragment.id);
|
|
162
|
+
return true;
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
const snippets: KnowhowPack['snippets'] = [];
|
|
166
|
+
let chars = 0;
|
|
167
|
+
for (const fragment of eligible) {
|
|
168
|
+
if (snippets.length >= maxItems) break;
|
|
169
|
+
const snippet: KnowhowPack['snippets'][number] = {
|
|
170
|
+
id: fragment.id,
|
|
171
|
+
text: fragment.text,
|
|
172
|
+
source: {
|
|
173
|
+
kind: fragment.source.kind,
|
|
174
|
+
path: fragment.source.path,
|
|
175
|
+
ref: fragment.source.ref,
|
|
176
|
+
},
|
|
177
|
+
status: fragment.status,
|
|
178
|
+
confidence: fragment.confidence,
|
|
179
|
+
verifiedAt: fragment.verifiedAt,
|
|
180
|
+
};
|
|
181
|
+
// Budget the complete serialized snippet, including provenance metadata.
|
|
182
|
+
const snippetChars = JSON.stringify(snippet).length;
|
|
183
|
+
if (chars + snippetChars > maxChars) continue;
|
|
184
|
+
snippets.push(snippet);
|
|
185
|
+
chars += snippetChars;
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
snippets,
|
|
189
|
+
omittedCount: fragments.length - snippets.length,
|
|
190
|
+
diagnostics: [],
|
|
191
|
+
};
|
|
192
|
+
} catch {
|
|
193
|
+
return {
|
|
194
|
+
snippets: [],
|
|
195
|
+
omittedCount: Array.isArray(fragments) ? fragments.length : 0,
|
|
196
|
+
diagnostics: ['fragment-validation-failed'],
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
}
|
package/src/light-cli.ts
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { applyConfigDirFlagFromArgv } from './cli/config-dir-flag.js';
|
|
3
|
+
import { applyTestStateDirFlagFromArgv } from './cli/test-state-dir-flag.js';
|
|
4
|
+
import { applyTestFlagFromArgv } from './cli/test-flag.js';
|
|
5
|
+
import type { LightCliRoute } from './cli/light-entry-route.js';
|
|
6
|
+
|
|
7
|
+
/** Dispatch a small read-only command without loading the full command registry. */
|
|
8
|
+
export async function runLightCli(route: LightCliRoute): Promise<void> {
|
|
9
|
+
// Keep the same pre-import isolation order as src/index.ts. In particular,
|
|
10
|
+
// config-touching command modules must not load before these flags apply.
|
|
11
|
+
applyTestStateDirFlagFromArgv();
|
|
12
|
+
applyTestFlagFromArgv();
|
|
13
|
+
applyConfigDirFlagFromArgv();
|
|
14
|
+
|
|
15
|
+
const program = new Command().name('elanous').enablePositionalOptions();
|
|
16
|
+
switch (route) {
|
|
17
|
+
case 'msg': {
|
|
18
|
+
const { registerMsgCommands } = await import('./cli/msg-cli.js');
|
|
19
|
+
registerMsgCommands(program);
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
case 'release': {
|
|
23
|
+
const { registerReleaseCommands } = await import('./cli/release-cli.js');
|
|
24
|
+
registerReleaseCommands(program);
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
case 'tasks': {
|
|
28
|
+
const { registerTasksCommands } = await import('./cli/tasks-cli.js');
|
|
29
|
+
registerTasksCommands(program);
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
case 'pty': {
|
|
33
|
+
const { registerPtyTakeoverCommands } = await import('./cli/pty-takeover-cli.js');
|
|
34
|
+
registerPtyTakeoverCommands(program);
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
case 'logs': {
|
|
38
|
+
const { registerLogsCommands } = await import('./cli/logs-cli.js');
|
|
39
|
+
registerLogsCommands(program);
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
case 'config': {
|
|
43
|
+
const { getUserConfig } = await import('./user-config.js');
|
|
44
|
+
const { redactSecrets, redactSecretText } = await import('./debug/log.js');
|
|
45
|
+
const { resolveCurrentInstance } = await import('./instance/current.js');
|
|
46
|
+
const redactDisplay = (value: unknown): unknown => {
|
|
47
|
+
if (Array.isArray(value)) return value.map(redactDisplay);
|
|
48
|
+
if (value !== null && typeof value === 'object') {
|
|
49
|
+
return Object.fromEntries(Object.entries(value as Record<string, unknown>).map(([key, child]) => [
|
|
50
|
+
redactSecretText(key), redactDisplay(child),
|
|
51
|
+
]));
|
|
52
|
+
}
|
|
53
|
+
return typeof value === 'string' ? redactSecretText(value) : value;
|
|
54
|
+
};
|
|
55
|
+
const config = program.command('config').description('Inspect and edit ~/.config/elanous/config.json');
|
|
56
|
+
config.command('get [path]')
|
|
57
|
+
.description('Print all config or one dotted path, e.g. llm.provider (secrets redacted by default)')
|
|
58
|
+
.option('--reveal', 'Print unredacted output and record the reveal')
|
|
59
|
+
.action(async (path: string | undefined) => {
|
|
60
|
+
if (resolveCurrentInstance().kind === 'test' && String(resolveCurrentInstance().layer) === 'tree-derived') {
|
|
61
|
+
console.error('⚠️ test 우주의 config를 읽습니다 — 운영 값은 --config-dir ~/.elanous');
|
|
62
|
+
}
|
|
63
|
+
const config = getUserConfig() as unknown as Record<string, unknown>;
|
|
64
|
+
const lookup = (root: unknown): unknown => {
|
|
65
|
+
let value = root;
|
|
66
|
+
for (const part of path?.split('.').filter(Boolean) ?? []) {
|
|
67
|
+
if (value === null || typeof value !== 'object') return undefined;
|
|
68
|
+
value = (value as Record<string, unknown>)[part];
|
|
69
|
+
}
|
|
70
|
+
return value;
|
|
71
|
+
};
|
|
72
|
+
const selected = path ? (lookup(config) ?? lookup(config.raw)) : config;
|
|
73
|
+
if (selected === undefined) {
|
|
74
|
+
const { error } = await import('./ui.js');
|
|
75
|
+
error(`config path not found: ${path}`);
|
|
76
|
+
process.exitCode = 1;
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const displayKey = path?.split('.').filter(Boolean).at(-1);
|
|
80
|
+
const display = displayKey
|
|
81
|
+
? redactDisplay(redactSecrets({ [displayKey]: selected })[displayKey])
|
|
82
|
+
: redactDisplay(redactSecrets(selected));
|
|
83
|
+
console.log(typeof display === 'string' ? display : JSON.stringify(display, null, 2));
|
|
84
|
+
});
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
try {
|
|
90
|
+
await program.parseAsync(['node', 'elanous', ...process.argv.slice(2)]);
|
|
91
|
+
} catch (error) {
|
|
92
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
93
|
+
process.exitCode = 1;
|
|
94
|
+
}
|
|
95
|
+
}
|