elanous 0.2.31 → 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/{LSXfY0u9QtfDbejY0Ukf_ → 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-0a07363b130182a1.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-df3445b207ceceab.js +1 -0
- 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/_next/static/css/b5d88eba78a3d7bf.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +26 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- 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 +11 -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 +95 -17
- 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/measure-si-task-cpu.ts +143 -0
- package/scripts/public-export.ts +43 -1
- package/scripts/ratchets/test-interference-patterns.allowlist.txt +0 -2
- 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/prepare-node.ts +102 -4
- 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 +36 -9
- package/src/acp/elanous-extensions.ts +3 -0
- package/src/acp/reasoning-thought-buffer.ts +45 -0
- package/src/acp/server.ts +3 -0
- package/src/acp/tool-trace.ts +186 -11
- package/src/agent/self-ambient-cache.ts +156 -0
- package/src/agent/self-ambient.ts +8 -1
- package/src/agent/task-notification.ts +5 -0
- package/src/agent-substrate/acp-reviewer.ts +52 -12
- package/src/agent-substrate/pr-reviewer.ts +3 -1
- 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/ask-user-question/tool.ts +22 -0
- package/src/autopilot/build/llm-conflict-merge.ts +56 -10
- package/src/autopilot/pr-manager.ts +213 -46
- package/src/capture/frame-state-detect.ts +39 -0
- package/src/capture/tui-self-report.ts +134 -6
- package/src/chat/index.ts +61 -15
- package/src/chat/pickers/modal-runtime.ts +6 -0
- package/src/chat/pickers/modals.ts +8 -2
- package/src/chat/tool-render/dispatch.ts +62 -10
- package/src/cli/ask-bare.ts +1 -0
- package/src/cli/control-cli.ts +24 -7
- package/src/cli/guardian-cli.ts +10 -0
- package/src/cli/import-cli.ts +12 -0
- package/src/cli/light-entry-route.ts +35 -0
- package/src/cli/llm-detect-cli.ts +23 -1
- package/src/cli/log-event-names.ts +10 -0
- package/src/cli/msg-cli.ts +1 -0
- package/src/cli/pod-cli.ts +14 -3
- package/src/cli/pr-cli.ts +140 -41
- package/src/cli/pr-land-base-read.ts +36 -0
- package/src/cli/pr-land-heavy-remote.ts +81 -25
- package/src/cli/pr-land-overlap-evidence.ts +200 -18
- package/src/cli/pr-land-pod-shadow-job.ts +26 -3
- package/src/cli/pr-land-recovery.ts +64 -0
- package/src/cli/pr-land-refusal.ts +20 -5
- package/src/cli/pty-takeover-cli.ts +94 -19
- 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/sim-cli.ts +18 -0
- package/src/cli/tasks-cli.ts +149 -5
- package/src/context-bus/ops-events.ts +6 -2
- 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/run-core-turn.ts +1 -0
- package/src/core-turn/run-goal-loop.ts +21 -0
- package/src/core-turn/short-question.ts +5 -1
- package/src/core-turn/types.ts +3 -0
- package/src/dashboard/acp-active-model.ts +42 -1
- package/src/dashboard/background-jobs-status.ts +66 -0
- package/src/dashboard/index.ts +153 -111
- package/src/dashboard/input/agent-wake.ts +242 -0
- package/src/dashboard/input/chat-main-entry-runtime.ts +5 -0
- 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/external-input-host.ts +23 -9
- package/src/dashboard/input/mouse-wiring.ts +108 -11
- package/src/dashboard/input/seat-autowake.ts +56 -3
- package/src/dashboard/log-click-runtime.ts +118 -2
- 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 +163 -41
- package/src/dashboard/turn-session-layers.ts +4 -2
- package/src/dashboard/turn-start-segments.ts +222 -0
- 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/display/prompt-row-owner.ts +146 -0
- package/src/display/resize-listener.ts +33 -2
- package/src/domains/guardian-tick.ts +54 -2
- package/src/domains/outbound-alert.ts +3 -2
- package/src/extractors.ts +3 -1
- package/src/fold-stack.ts +4 -2
- package/src/git-fs/index.ts +263 -36
- 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/gate-reserve.ts +87 -0
- package/src/harness/harness-cli-command.ts +39 -10
- package/src/harness/harness-incidents.ts +17 -0
- package/src/harness/harness-pod-dispatch.ts +38 -1
- package/src/harness/harness-queue.ts +15 -0
- package/src/harness/harness-salvage-cli.ts +14 -2
- package/src/index.ts +198 -12
- package/src/input/external-input-queue.ts +34 -9
- 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/route-decision.ts +36 -0
- package/src/llm/tool-loop-steered-rejection.ts +8 -0
- package/src/llm-request-shape.ts +209 -0
- package/src/llm.ts +221 -276
- package/src/loops/budget.ts +95 -0
- package/src/loops/msg-wake.ts +8 -2
- package/src/loops/orchestrator/tick.ts +24 -2
- package/src/loops/orchestrator/traffic.ts +132 -1
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/mss/logging/log-store.ts +4 -5
- package/src/mss/logging/render-categories.ts +5 -0
- 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 +70 -2
- package/src/pr-tool/census.ts +41 -8
- package/src/pr-tool/inflight-registry.ts +296 -0
- 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-manifest.ts +12 -3
- package/src/pty-shell/pty-write-outcome.ts +24 -6
- package/src/pty-shell/tui-run-state.ts +151 -6
- 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/seat-loop/traffic-signal.ts +2 -1
- package/src/self-dev/ask-launch-flow.ts +13 -0
- package/src/self-dev/draft-residue.ts +243 -24
- 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-dev/shard-plan.ts +11 -3
- package/src/self-dev/shard-run.ts +103 -10
- package/src/self-implement/elanous-tui-spawn.ts +14 -0
- package/src/self-implement/follow-up-placement.ts +79 -0
- package/src/self-implement/gate-artifacts.ts +15 -4
- package/src/self-implement/gate-baseline.ts +145 -10
- package/src/self-implement/gate-cli.ts +7 -2
- package/src/self-implement/gate-remote.ts +35 -6
- 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/host-regate.ts +36 -4
- package/src/self-implement/knowhow-pack.ts +103 -0
- package/src/self-implement/orchestrator.ts +109 -11
- 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-ledger.ts +16 -14
- 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/index.ts +22 -267
- package/src/session-runtime/retry-policy.ts +2 -1
- package/src/shell-runner/background-surface.ts +15 -5
- package/src/skills/tools/agent.ts +39 -6
- package/src/skills/tools/list-dir.ts +11 -0
- package/src/skills/tools/schedule-wakeup.ts +457 -0
- package/src/skills/tools/shell.ts +245 -3
- package/src/status/bar.ts +26 -0
- package/src/steward/digest-delivery.ts +118 -0
- package/src/steward/hold-hygiene.ts +120 -0
- package/src/steward/release-day.ts +7 -3
- package/src/steward/triage.ts +47 -4
- package/src/surface/shell-runner-boot.ts +5 -2
- 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 +76 -5
- 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 +67 -12
- package/src/task-orchestrator/surfaces/pod-lease.ts +98 -0
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +86 -8
- package/src/task-orchestrator/surfaces/pod-pool.ts +76 -18
- package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +10 -6
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +54 -4
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +548 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +389 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runner.ts +90 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +158 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +230 -43
- package/src/task-orchestrator/surfaces/self-implement.ts +83 -2
- package/src/tool-runtime/truncation-store.ts +4 -0
- package/src/tui/chat/execution-badge.ts +5 -1
- package/src/tui/input-lag-probe.ts +230 -0
- package/src/tui-client/dashboard-session.ts +10 -1
- package/src/tui.ts +4 -0
- package/src/user-config/coercion.ts +36 -0
- package/src/user-config.ts +18 -41
- package/src/ux-sim/scenario.ts +314 -0
- 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-50625904996a8fa8.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/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-92f87bd108322f66.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-bf3634a117322df7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-3535a4a69f1fafaa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-b9f51447f757fbf2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-2ebb8fd59b9461f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-a2fc4e49a4fa4ba8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-5a503541353e60a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-6025101384e361a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f4b630cc8b5273cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-a645f00a06483e9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-61ac22cbab1ee4ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e9bab7413b028b28.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c992eafe028b642e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-e547e6ce55f1fb33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-d27e1b9850fd54bf.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-805ac2e137b7a121.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-0fec29c7ba01894b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-339a07410cd6f36b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-349f2752d8cd37ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d5c6dcf31c25cecc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2fd93ed8c9f16580.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-9b564dbff0fefc35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-62f4475d3c38fb9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-814ba51385225776.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-397d479626e5a459.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-af1bba4e3251b728.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ad3be5e7d3fdce9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-f219ccdbc0bf27df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4da93ad35d4a8d28.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-456666766e5ce6fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7404e377e8adb8c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-14456240ed2a36ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-3a658d5fa6d16a25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-0157de6e85f8bb6b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-841d73d4ac44ed49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6f43a3d1146e6377.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-521ee23ac8c0abfa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9992ee285efaa83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-3d48e85fa89ec04f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d2ced71132fac9b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-f08358bdf251adb9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-233c71cd5f68f0d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-70151d78de2f375e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-dcac33a3e2cb72c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-149dc1caba411bb9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0448145ccd5c45c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-9cb0c444903da65d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-17e504c396e0e389.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/apps/pwa/out/_next/static/css/3f5fc6f96e2cf7b2.css +0 -1
- package/src/cli/g6a-registration-probe.ts +0 -16
- /package/apps/pwa/out/_next/static/{LSXfY0u9QtfDbejY0Ukf_ → L04y73dlwKeTW-GetaTF3}/_ssgManifest.js +0 -0
package/src/chat/index.ts
CHANGED
|
@@ -10,6 +10,7 @@ import type { ChatPickerKind } from './pickers/kinds.js';
|
|
|
10
10
|
import { createPickerState, type BufferAction, type PickerBufferView } from './pickers/state.js';
|
|
11
11
|
import { createChatPickerModalRuntime } from './pickers/modal-runtime.js';
|
|
12
12
|
import type { ModalSurface } from '../display/modal-stack.js';
|
|
13
|
+
import type { PromptRowOwner } from '../display/prompt-row-owner.js';
|
|
13
14
|
// Type-only import: avoids the runtime circular dep that streamGrok
|
|
14
15
|
// below sidesteps with a dynamic `await import('../llm.js')`. Keeping
|
|
15
16
|
// ChatMessage structurally compatible with LLMMessage lets the
|
|
@@ -35,6 +36,7 @@ import {
|
|
|
35
36
|
} from '../input-core/index.js';
|
|
36
37
|
import { applyInlineEditorKey } from '../input-core/inline-editor-key.js';
|
|
37
38
|
import type { InputSourceRef } from '../input/input-source-kind.js';
|
|
39
|
+
import { routeRawPtyStop } from '../input/external-input-queue.js';
|
|
38
40
|
import {
|
|
39
41
|
multilineEditorBackspace,
|
|
40
42
|
multilineEditorInsertLineBreak,
|
|
@@ -70,6 +72,7 @@ export interface ModalSink {
|
|
|
70
72
|
* DisplayCoordinator that satisfies both. */
|
|
71
73
|
export interface DisplaySink extends CursorSink, ModalSink {}
|
|
72
74
|
import type { Key } from '../tui.js';
|
|
75
|
+
import { noteInputLagKey, noteInputLagPaint } from '../tui/input-lag-probe.js';
|
|
73
76
|
import {
|
|
74
77
|
createSpinner,
|
|
75
78
|
createToolLoader,
|
|
@@ -173,6 +176,8 @@ function writeTerminal(chunk: string): void {
|
|
|
173
176
|
process.stdout.write(chunk);
|
|
174
177
|
// viaCoordinator=false — this is the bypass path /perf highlights.
|
|
175
178
|
perf.recordStdoutWrite(chunk.length, false);
|
|
179
|
+
// 입력칸 키 echo 는 render() 가 아니라 이 직접 쓰기로 칠해진다 — 키→칠 관측의 칠 지점.
|
|
180
|
+
noteInputLagPaint();
|
|
176
181
|
}
|
|
177
182
|
|
|
178
183
|
/** textInput reports the current prompt's top row so writeTerminal
|
|
@@ -324,11 +329,16 @@ export function createTextInputRenderActions(opts: {
|
|
|
324
329
|
* coordinator-owned cursor sinks re-show it at the final position. */
|
|
325
330
|
hideCursorBeforePaint?: boolean;
|
|
326
331
|
beforePaint?: () => void;
|
|
332
|
+
/** The frame renderer owns the prompt band (TUI-PROMPT-SINGLE-OWNER):
|
|
333
|
+
* `paint` only publishes, so there are no direct writes to wrap in
|
|
334
|
+
* synchronized output. */
|
|
335
|
+
frameOwned?: boolean;
|
|
327
336
|
modalSink?: ModalSink;
|
|
328
337
|
shouldRequestModalRender?: () => boolean;
|
|
329
338
|
}): TextInputRenderActions {
|
|
330
|
-
const paintAll = (
|
|
339
|
+
const paintAll = (requestSynchronizedOutput = false) => {
|
|
331
340
|
if (opts.shouldPaint?.() === false) return false;
|
|
341
|
+
const synchronizedOutput = requestSynchronizedOutput && !opts.frameOwned;
|
|
332
342
|
if (synchronizedOutput) writeTerminal(SYNCHRONIZED_OUTPUT_BEGIN);
|
|
333
343
|
try {
|
|
334
344
|
if (opts.beforePaint) {
|
|
@@ -837,6 +847,10 @@ export async function textInput(opts: {
|
|
|
837
847
|
* input is idle. */
|
|
838
848
|
insertAtCursor?: (text: string) => void;
|
|
839
849
|
};
|
|
850
|
+
/** TUI-PROMPT-SINGLE-OWNER — when supplied, the frame renderer owns
|
|
851
|
+
* the prompt band: drawInput publishes its rows/hint/caret here and
|
|
852
|
+
* writes nothing to the prompt rows itself (no direct `\x1b[2K`). */
|
|
853
|
+
promptRowOwner?: PromptRowOwner;
|
|
840
854
|
/** P2.2.c — sink for cursor placement. When supplied, drawInput
|
|
841
855
|
* routes its caret-position decision through this instead of
|
|
842
856
|
* emitting `\\x1b[r;cH` directly. The coordinator owns the
|
|
@@ -1194,6 +1208,8 @@ export async function textInput(opts: {
|
|
|
1194
1208
|
// from there as lines accumulate. `startOffset` is how many rows
|
|
1195
1209
|
// up from `row` we start touching — zero when both current and
|
|
1196
1210
|
// previous drew only one line.
|
|
1211
|
+
const promptRowOwner = opts.promptRowOwner;
|
|
1212
|
+
const ownedRows: string[] = [];
|
|
1197
1213
|
for (let i = 0; i < rowsToTouch; i++) {
|
|
1198
1214
|
const r = row - i; // i=0 → bottom row; i=1 → one row up; etc.
|
|
1199
1215
|
if (r < 1) continue;
|
|
@@ -1212,8 +1228,9 @@ export async function textInput(opts: {
|
|
|
1212
1228
|
).display;
|
|
1213
1229
|
|
|
1214
1230
|
const padded = display + ' '.repeat(Math.max(0, rowTextW - visibleWidth(display)));
|
|
1215
|
-
|
|
1216
|
-
|
|
1231
|
+
if (promptRowOwner) ownedRows.unshift(pfx + padded);
|
|
1232
|
+
else writeTerminal(ansi.moveTo(r, col) + '\x1b[2K' + pfx + padded);
|
|
1233
|
+
} else if (!promptRowOwner) {
|
|
1217
1234
|
// This row had content on the previous paint but doesn't anymore
|
|
1218
1235
|
// (user deleted a line / shrank the input). Clear it so stale
|
|
1219
1236
|
// text doesn't linger on what is now part of the log / divider
|
|
@@ -1223,7 +1240,9 @@ export async function textInput(opts: {
|
|
|
1223
1240
|
}
|
|
1224
1241
|
prevDrawnLines = visibleLines;
|
|
1225
1242
|
|
|
1226
|
-
if (
|
|
1243
|
+
if (promptRowOwner) {
|
|
1244
|
+
// The frame renders the hint row from the published paint.
|
|
1245
|
+
} else if (ctrlCHint) {
|
|
1227
1246
|
writeTerminal(ansi.moveTo(row + 2, col) + '\x1b[2K' + C.muted(truncate(ctrlCHint, getWidth())));
|
|
1228
1247
|
ctrlCHintPainted = true;
|
|
1229
1248
|
} else if (ctrlCHintPainted) {
|
|
@@ -1244,6 +1263,12 @@ export async function textInput(opts: {
|
|
|
1244
1263
|
const pfxW = lineIdx === 0 ? visibleWidth(prompt) : contPfxW;
|
|
1245
1264
|
const { cursorCol } = inputLineWindow(lines[lineIdx]!, colIdx, textWFor(lineIdx));
|
|
1246
1265
|
const curX = col + pfxW + cursorCol;
|
|
1266
|
+
promptRowOwner?.publish({
|
|
1267
|
+
rows: ownedRows,
|
|
1268
|
+
hint: ctrlCHint ? C.muted(truncate(ctrlCHint, getWidth())) : null,
|
|
1269
|
+
caret: curR >= 1 ? { row: curR, col: curX, visible: true } : null,
|
|
1270
|
+
source: 'text-input',
|
|
1271
|
+
});
|
|
1247
1272
|
// P2.2.c — coordinator owns the cursor emit when wired; falls
|
|
1248
1273
|
// back to direct stdout for non-coordinator callers (tests, non-dashboard
|
|
1249
1274
|
// entry points) so the change is non-breaking.
|
|
@@ -1342,19 +1367,28 @@ export async function textInput(opts: {
|
|
|
1342
1367
|
const display = prefix + result;
|
|
1343
1368
|
const padded = display + ' '.repeat(Math.max(0, textW - visibleWidth(display)));
|
|
1344
1369
|
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1370
|
+
const curR = searchRow;
|
|
1371
|
+
const curX = col + promptW + visibleWidth(prefix);
|
|
1372
|
+
if (opts.promptRowOwner) {
|
|
1373
|
+
opts.promptRowOwner.publish({
|
|
1374
|
+
rows: [promptStr + padded],
|
|
1375
|
+
hint: null,
|
|
1376
|
+
caret: { row: curR, col: curX, visible: true },
|
|
1377
|
+
source: 'reverse-search',
|
|
1378
|
+
});
|
|
1379
|
+
} else {
|
|
1380
|
+
for (let i = 0; i < rowsToTouch; i++) {
|
|
1381
|
+
const r = row - i;
|
|
1382
|
+
if (r < 1) continue;
|
|
1383
|
+
if (i === 0) {
|
|
1384
|
+
writeTerminal(ansi.moveTo(searchRow, col) + '\x1b[2K' + promptStr + padded);
|
|
1385
|
+
} else {
|
|
1386
|
+
writeTerminal(ansi.moveTo(r, col) + '\x1b[2K');
|
|
1387
|
+
}
|
|
1352
1388
|
}
|
|
1353
1389
|
}
|
|
1354
1390
|
prevDrawnLines = visibleLines;
|
|
1355
1391
|
|
|
1356
|
-
const curR = searchRow;
|
|
1357
|
-
const curX = col + promptW + visibleWidth(prefix);
|
|
1358
1392
|
if (opts.cursorSink && (opts.canClaimCursor?.() ?? true)) {
|
|
1359
1393
|
opts.cursorSink.setCursor({ row: curR, col: curX, visible: true });
|
|
1360
1394
|
} else if (!opts.cursorSink) {
|
|
@@ -1389,11 +1423,16 @@ export async function textInput(opts: {
|
|
|
1389
1423
|
syncActivePickerModal();
|
|
1390
1424
|
drawInput();
|
|
1391
1425
|
};
|
|
1426
|
+
// A frame-owned prompt band has no direct paint to hide the cursor
|
|
1427
|
+
// for, wrap in synchronized output, or re-assert divider chrome around:
|
|
1428
|
+
// the frame render does all three in its own single write.
|
|
1429
|
+
const frameOwnsPromptBand = opts.promptRowOwner !== undefined;
|
|
1392
1430
|
const renderActions = createTextInputRenderActions({
|
|
1393
1431
|
shouldPaint: opts.shouldPaint,
|
|
1394
|
-
paintChrome: opts.onPaintChrome,
|
|
1432
|
+
paintChrome: frameOwnsPromptBand ? undefined : opts.onPaintChrome,
|
|
1395
1433
|
paint: repaintPure,
|
|
1396
|
-
|
|
1434
|
+
frameOwned: frameOwnsPromptBand,
|
|
1435
|
+
beforePaint: frameOwnsPromptBand ? () => {} : () => {
|
|
1397
1436
|
const chunk = hideTextInputCursor(opts.cursorSink);
|
|
1398
1437
|
if (chunk) writeTerminal(chunk);
|
|
1399
1438
|
else if (opts.cursorSink) writeTerminal(paintCursorVisibility(false));
|
|
@@ -1407,6 +1446,7 @@ export async function textInput(opts: {
|
|
|
1407
1446
|
const finalizeInput = (result: InputResult): InputResult => {
|
|
1408
1447
|
// 외부 주입 라우터가 «composer 가 안 떠 있다»를 알 수 있게 내린다.
|
|
1409
1448
|
if (hostControl) hostControl.getBufferText = undefined;
|
|
1449
|
+
opts.promptRowOwner?.clear();
|
|
1410
1450
|
detachInternalTurnYield(result.yieldedToInternalTurn === true);
|
|
1411
1451
|
clearPicker();
|
|
1412
1452
|
writeTerminal(endTextInputCursor(opts.cursorSink));
|
|
@@ -1723,6 +1763,7 @@ export async function textInput(opts: {
|
|
|
1723
1763
|
// input loop exits cleanly and the dashboard's pane dispatcher
|
|
1724
1764
|
// picks up the keys.
|
|
1725
1765
|
if (hostControl) hostControl.getBufferText = undefined;
|
|
1766
|
+
opts.promptRowOwner?.clear();
|
|
1726
1767
|
detachInternalTurnYield();
|
|
1727
1768
|
return { text: '', submitted: false, gotoPane: true };
|
|
1728
1769
|
}
|
|
@@ -2066,7 +2107,12 @@ export function attachStreamingKeys(
|
|
|
2066
2107
|
const listener = (data: string | Buffer) => {
|
|
2067
2108
|
clearEscapeTimer();
|
|
2068
2109
|
deliverInjected();
|
|
2110
|
+
// ⏹ TUI-STOP-RAW-PTY — 원시 pty 길로 한 청크에 온 `/stop⏎`·`/esc⏎` 는 typeahead 대기열 대신 지금 턴의 escGate 로.
|
|
2111
|
+
// 파서가 이스케이프·붙여넣기·UTF-8 조각을 쥐고 있으면 그 청크는 앞 입력의 이어짐이라 건드리지 않는다.
|
|
2112
|
+
if (!parser.hasPendingEscape() && !parser.hasPendingPaste() && !parser.hasPendingDecoderBytes()
|
|
2113
|
+
&& routeRawPtyStop(typeof data === 'string' ? data : data.toString('utf8'))) return;
|
|
2069
2114
|
const keys = parser.push(data);
|
|
2115
|
+
if (keys.length > 0) noteInputLagKey(keys.length);
|
|
2070
2116
|
deliver(keys);
|
|
2071
2117
|
// ⚠️ `unref()` — 이 타이머가 프로세스를 붙잡아 두면 안 된다(입력 대기는 stdin 의 몫).
|
|
2072
2118
|
if (parser.hasPendingEscape()) {
|
|
@@ -146,6 +146,12 @@ export function createChatPickerModalRuntime(deps: ChatPickerModalRuntimeDeps):
|
|
|
146
146
|
getInputZoneHeight: deps.getInputZoneHeight,
|
|
147
147
|
width: deps.getBounds().width,
|
|
148
148
|
getWidth: () => deps.getBounds().width,
|
|
149
|
+
// TUI-PICKER-RESIZE-SHRINK — follow the live prompt row, not the
|
|
150
|
+
// row captured when the family was created (stale after resize).
|
|
151
|
+
getAnchor: () => {
|
|
152
|
+
const b = deps.getBounds();
|
|
153
|
+
return { row: b.row, col: b.col };
|
|
154
|
+
},
|
|
149
155
|
onKey: makePickerOnKey(kind),
|
|
150
156
|
onRowClick: makePickerOnRowClick(kind),
|
|
151
157
|
});
|
|
@@ -108,6 +108,10 @@ export interface ChatPickerModalBindings {
|
|
|
108
108
|
getInputZoneHeight: () => number;
|
|
109
109
|
width: number;
|
|
110
110
|
getWidth?: () => number;
|
|
111
|
+
/** Live prompt anchor (input bottom row + col). When present it wins
|
|
112
|
+
* over the mount-time `bounds` snapshot, so a terminal resize moves
|
|
113
|
+
* an already-open picker with the prompt (TUI-PICKER-RESIZE-SHRINK). */
|
|
114
|
+
getAnchor?: () => { row: number; col: number };
|
|
111
115
|
onKey?: PickerOnKey;
|
|
112
116
|
onRowClick?: PickerOnRowClick;
|
|
113
117
|
}
|
|
@@ -124,6 +128,7 @@ type FramedPickerSpec<T> = {
|
|
|
124
128
|
getInputZoneHeight: () => number;
|
|
125
129
|
width: number;
|
|
126
130
|
getWidth?: () => number;
|
|
131
|
+
getAnchor?: () => { row: number; col: number };
|
|
127
132
|
onKey?: PickerOnKey;
|
|
128
133
|
onRowClick?: PickerOnRowClick;
|
|
129
134
|
};
|
|
@@ -132,7 +137,8 @@ function createFramedPickerModal<T>(spec: FramedPickerSpec<T>): ModalSurface {
|
|
|
132
137
|
const computeBounds = (): (ModalBounds & { startIdx: number; visibleCount: number }) | null => {
|
|
133
138
|
const rows = spec.getRows();
|
|
134
139
|
const inputZoneHeight = spec.getInputZoneHeight();
|
|
135
|
-
const
|
|
140
|
+
const anchor = spec.getAnchor?.() ?? spec.bounds;
|
|
141
|
+
const bottomRow = anchor.row - inputZoneHeight;
|
|
136
142
|
if (rows.length === 0 || bottomRow < 4) return null;
|
|
137
143
|
const { visibleCount, startIdx } = pickerWindow(
|
|
138
144
|
rows.length,
|
|
@@ -142,7 +148,7 @@ function createFramedPickerModal<T>(spec: FramedPickerSpec<T>): ModalSurface {
|
|
|
142
148
|
if (visibleCount <= 0) return null;
|
|
143
149
|
const height = visibleCount + 3;
|
|
144
150
|
const row = bottomRow - height + 1;
|
|
145
|
-
return { row, col:
|
|
151
|
+
return { row, col: anchor.col, width: spec.getWidth?.() ?? spec.width, height, startIdx, visibleCount };
|
|
146
152
|
};
|
|
147
153
|
|
|
148
154
|
/** Phase 4.5a (substrate Occam · §4-pre.7 · 2026-05-03) — update
|
|
@@ -18,7 +18,12 @@ import type {
|
|
|
18
18
|
import { renderToolBlock } from './block.js';
|
|
19
19
|
import { renderToolInline } from './inline.js';
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
/** 접힌 결과 요약 첫 조각은 `MsgPost` 하나뿐이라 이름 확장을 `dispatch.ts` 안에 둔다.
|
|
22
|
+
* `types.ts:ToolRenderName` 은 나머지 도구의 공용 계약 그대로 두고, 이 파일의 내부
|
|
23
|
+
* 시그니처만 넓힌다(블록·인라인 렌더는 `ToolRenderModel.kind` 문자열만 본다). */
|
|
24
|
+
type ToolRenderKind = ToolRenderName | 'MsgPost';
|
|
25
|
+
|
|
26
|
+
const SUPPORTED_TOOLS = new Set<ToolRenderKind>([
|
|
22
27
|
'Bash',
|
|
23
28
|
'Read',
|
|
24
29
|
'Grep',
|
|
@@ -35,9 +40,10 @@ const SUPPORTED_TOOLS = new Set<ToolRenderName>([
|
|
|
35
40
|
'WebSearch',
|
|
36
41
|
'WebFetch',
|
|
37
42
|
'GetDashboardState',
|
|
43
|
+
'MsgPost',
|
|
38
44
|
]);
|
|
39
45
|
|
|
40
|
-
export function isToolRenderSupported(name: string): name is
|
|
46
|
+
export function isToolRenderSupported(name: string): name is ToolRenderKind | 'update_plan' | 'update_goal' {
|
|
41
47
|
return normalizeToolRenderName(name) !== null;
|
|
42
48
|
}
|
|
43
49
|
|
|
@@ -48,6 +54,9 @@ export function renderToolCallEvent(
|
|
|
48
54
|
if (config.displayMode !== 'inline-to-block') return null;
|
|
49
55
|
const kind = normalizeToolRenderName(call.name);
|
|
50
56
|
if (!kind) return null;
|
|
57
|
+
// Keep the generic running block: a MsgPost error must still fall back to
|
|
58
|
+
// the same generic result block that was used before this summary slice.
|
|
59
|
+
if (kind === 'MsgPost') return null;
|
|
51
60
|
const model: ToolRenderModel = {
|
|
52
61
|
kind,
|
|
53
62
|
status: 'running',
|
|
@@ -75,9 +84,18 @@ export function renderToolResultVariants(
|
|
|
75
84
|
if (config.displayMode !== 'inline-to-block') return null;
|
|
76
85
|
const kind = normalizeToolRenderName(call.name);
|
|
77
86
|
if (!kind) return null;
|
|
87
|
+
// Only successful MsgPost results enter the compact renderer. Returning
|
|
88
|
+
// null for errors lets the dashboard formatter use its existing generic
|
|
89
|
+
// result path, including its expanded argument/result view.
|
|
90
|
+
if (kind === 'MsgPost' && extractErrorText(call.result)) return null;
|
|
78
91
|
const model = buildToolRenderModel(kind, call, config);
|
|
79
92
|
const collapsed = renderToolBlock(model, config.blockMaxLines, config.foldMode, config.expandHint);
|
|
80
|
-
|
|
93
|
+
// ⭐ MsgPost 는 접힌 행에서 본문을 빼고 펼친 행에서만 싣는다 ⇒ 같은 model 로는 두 변형을
|
|
94
|
+
// 만들 수 없어, 펼친 쪽만 본문 포함 model 을 따로 세운다(다른 도구는 종전과 동일 model).
|
|
95
|
+
const expandedModel = kind === 'MsgPost'
|
|
96
|
+
? buildToolRenderModel(kind, call, config, { includeMsgPostBody: true })
|
|
97
|
+
: model;
|
|
98
|
+
const expanded = renderToolBlock(expandedModel, Number.POSITIVE_INFINITY);
|
|
81
99
|
const variants: ToolRenderResultVariants = {
|
|
82
100
|
collapsed,
|
|
83
101
|
expanded: arraysEqual(collapsed, expanded) ? null : expanded,
|
|
@@ -88,22 +106,28 @@ export function renderToolResultVariants(
|
|
|
88
106
|
return variants;
|
|
89
107
|
}
|
|
90
108
|
|
|
91
|
-
|
|
109
|
+
interface ToolRenderModelOptions {
|
|
110
|
+
/** 펼친 변형만 `message.body` 를 싣는다 — 접힌 행에는 본문·전체 JSON 이 남지 않는다. */
|
|
111
|
+
includeMsgPostBody?: boolean;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function normalizeToolRenderName(name: string): ToolRenderKind | null {
|
|
92
115
|
if (name === 'update_plan' || name === 'UpdatePlan') return 'UpdatePlan';
|
|
93
116
|
if (name === 'update_goal' || name === 'UpdateGoal') return 'UpdateGoal';
|
|
94
|
-
return SUPPORTED_TOOLS.has(name as
|
|
117
|
+
return SUPPORTED_TOOLS.has(name as ToolRenderKind) ? (name as ToolRenderKind) : null;
|
|
95
118
|
}
|
|
96
119
|
|
|
97
120
|
function buildToolRenderModel(
|
|
98
|
-
kind:
|
|
121
|
+
kind: ToolRenderKind,
|
|
99
122
|
call: ToolRenderResult,
|
|
100
123
|
config?: ToolRenderConfig,
|
|
124
|
+
options?: ToolRenderModelOptions,
|
|
101
125
|
): ToolRenderModel {
|
|
102
126
|
const resultRecord = asRecord(call.result);
|
|
103
127
|
const errorText = extractErrorText(call.result);
|
|
104
128
|
const bodyLines = errorText
|
|
105
129
|
? errorText.split('\n')
|
|
106
|
-
: buildToolBodyLines(kind, call.args, call.result, resultRecord);
|
|
130
|
+
: buildToolBodyLines(kind, call.args, call.result, resultRecord, options);
|
|
107
131
|
const status = errorText ? 'error' : 'success';
|
|
108
132
|
const model: ToolRenderModel = {
|
|
109
133
|
kind,
|
|
@@ -119,7 +143,7 @@ function buildToolRenderModel(
|
|
|
119
143
|
}
|
|
120
144
|
|
|
121
145
|
function summarizeCollapsedToolResult(
|
|
122
|
-
kind:
|
|
146
|
+
kind: ToolRenderKind,
|
|
123
147
|
status: 'success' | 'error',
|
|
124
148
|
resultRecord: Record<string, unknown> | null,
|
|
125
149
|
bodyLines: string[],
|
|
@@ -206,10 +230,12 @@ function summarizeCollapsedToolResult(
|
|
|
206
230
|
}
|
|
207
231
|
|
|
208
232
|
function summarizeToolCallForRender(
|
|
209
|
-
kind:
|
|
233
|
+
kind: ToolRenderKind,
|
|
210
234
|
args: Record<string, unknown>,
|
|
211
235
|
result?: unknown,
|
|
212
236
|
): string {
|
|
237
|
+
// ⭐ MsgPost — 행위(`post`)·수신자·(결과가 있으면) id 셋만. 본문은 부르지도 읽지도 않는다.
|
|
238
|
+
if (kind === 'MsgPost') return summarizeMsgPostCall(args, result);
|
|
213
239
|
if (kind === 'UpdatePlan') {
|
|
214
240
|
const plan = Array.isArray(args.plan) ? args.plan : [];
|
|
215
241
|
const current = plan.find((step) => asRecord(step)?.status === 'in_progress');
|
|
@@ -230,6 +256,29 @@ function summarizeToolCallForRender(
|
|
|
230
256
|
return summarizeToolCall(kind, args);
|
|
231
257
|
}
|
|
232
258
|
|
|
259
|
+
/** MsgPost 머리글 — 행위(`post`)·수신자·id. 펼치기 전에도 세 가지가 한 줄에 다 있다. */
|
|
260
|
+
function summarizeMsgPostCall(args: Record<string, unknown>, result?: unknown): string {
|
|
261
|
+
const to = typeof args.to === 'string' ? args.to.trim() : '';
|
|
262
|
+
const id = msgPostMessage(asRecord(result))?.id;
|
|
263
|
+
const route = to ? `post → ${to}` : 'post';
|
|
264
|
+
return typeof id === 'string' || typeof id === 'number' ? `${route} #${id}` : route;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/** 결과 페이로드의 `message` 레코드. 모양을 못 읽으면 `null` — 없는 필드를 지어내지 않는다. */
|
|
268
|
+
function msgPostMessage(resultRecord: Record<string, unknown> | null): Record<string, unknown> | null {
|
|
269
|
+
return asRecord(resultRecord?.message);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/** MsgPost 결과 본문. 접힌 행은 비우고 펼친 변형에는 원래 결과 전체를 한 번만 싣는다. */
|
|
273
|
+
function buildMsgPostBodyLines(
|
|
274
|
+
resultRecord: Record<string, unknown> | null,
|
|
275
|
+
includeMsgPostBody: boolean,
|
|
276
|
+
): string[] {
|
|
277
|
+
if (!includeMsgPostBody) return [];
|
|
278
|
+
if (!resultRecord) return [];
|
|
279
|
+
return JSON.stringify(resultRecord, null, 2).split('\n');
|
|
280
|
+
}
|
|
281
|
+
|
|
233
282
|
function summarizeSpecialToolCall(kind: ToolRenderName, args: Record<string, unknown>): string | null {
|
|
234
283
|
if (kind === 'AstGrep') {
|
|
235
284
|
const pattern = typeof args.pattern === 'string' ? args.pattern : '';
|
|
@@ -292,14 +341,17 @@ function summarizeStructuralSearchRender(kind: ToolRenderName, bodyText: string
|
|
|
292
341
|
}
|
|
293
342
|
|
|
294
343
|
function buildToolBodyLines(
|
|
295
|
-
kind:
|
|
344
|
+
kind: ToolRenderKind,
|
|
296
345
|
args: Record<string, unknown>,
|
|
297
346
|
result: unknown,
|
|
298
347
|
resultRecord: Record<string, unknown> | null,
|
|
348
|
+
options?: ToolRenderModelOptions,
|
|
299
349
|
): string[] {
|
|
300
350
|
const syntheticGuard = extractSyntheticGuardSummary(result);
|
|
301
351
|
if (syntheticGuard) return [syntheticGuard];
|
|
302
352
|
|
|
353
|
+
if (kind === 'MsgPost') return buildMsgPostBodyLines(resultRecord, options?.includeMsgPostBody === true);
|
|
354
|
+
|
|
303
355
|
if (kind === 'Edit' || kind === 'Write') {
|
|
304
356
|
const edit = resultRecord?.edit && isEditResult(resultRecord.edit) ? resultRecord.edit : null;
|
|
305
357
|
const output = typeof resultRecord?.output === 'string' ? resultRecord.output : null;
|
package/src/cli/ask-bare.ts
CHANGED
|
@@ -37,6 +37,7 @@ export async function askBare({ text, provider, model, deps }: {
|
|
|
37
37
|
...(provider === undefined ? { initialProvider: chosenProvider } : { provider: chosenProvider }),
|
|
38
38
|
...(selected.model === '(none)' ? {} : { model: selected.model }),
|
|
39
39
|
onResolvedProvider: (name, activeModel) => { resolvedProvider = name; resolvedModel = activeModel; },
|
|
40
|
+
usageSite: 'cli.ask-bare',
|
|
40
41
|
});
|
|
41
42
|
return { provider: resolvedProvider, model: resolvedModel, reply };
|
|
42
43
|
}
|
package/src/cli/control-cli.ts
CHANGED
|
@@ -13,7 +13,8 @@ import { RESOURCE_KINDS, type ResourceKind } from '../control-plane/ledger.js';
|
|
|
13
13
|
import { runControlJoin, type ControlJoinOptions } from './control-join-cli.js';
|
|
14
14
|
import type { ResourceView } from '../control-plane/ledger.js';
|
|
15
15
|
import { issueMemberToken, revokeMemberToken, listMemberTokens } from '../control-plane/member-tokens.js';
|
|
16
|
-
import { collectControlStatus } from '../control/control-status.js';
|
|
16
|
+
import { collectControlStatus, readControlHqLease } from '../control/control-status.js';
|
|
17
|
+
import { getUserConfig } from '../user-config.js';
|
|
17
18
|
|
|
18
19
|
function controlPort(flag?: string): number {
|
|
19
20
|
const raw = flag ?? (process.env.ELANOUS_CONTROL_PORT?.trim() || undefined);
|
|
@@ -97,8 +98,9 @@ export async function runResourcesQuery(options: { where?: string; kind?: string
|
|
|
97
98
|
}
|
|
98
99
|
}
|
|
99
100
|
|
|
100
|
-
export async function runControlServe(options: { port?: string; host?: string; followLease?: boolean; bucket?: string;
|
|
101
|
+
export async function runControlServe(options: { port?: string; host?: string; followLease?: boolean; followHqLease?: boolean; bucket?: string;
|
|
101
102
|
read?: (bucket: string) => RoleLeaseRead | Promise<RoleLeaseRead>; machine?: string;
|
|
103
|
+
readHq?: typeof readControlHqLease; hqHostName?: string;
|
|
102
104
|
/** 시험 seam — 이 신호로 멈춘다. ⛔ 시험이 `process.emit('SIGTERM')` 로 멈추면 같은 프로세스의 다른 SIGTERM 처리기
|
|
103
105
|
* (로그 저장소가 «남은 처리기가 없으면 자기에게 진짜 SIGTERM 을 다시 보낸다»)가 깨어 **시험 러너가 죽었다**
|
|
104
106
|
* (📏 09-27 0.2.3 게이트: 전체 한 프로세스면 이 시험 자리에서 rc 143 · 조각으로 나누면 완주). */
|
|
@@ -108,12 +110,26 @@ export async function runControlServe(options: { port?: string; host?: string; f
|
|
|
108
110
|
let bucket: string | undefined;
|
|
109
111
|
try {
|
|
110
112
|
port = controlPort(options.port);
|
|
113
|
+
if (options.followLease && options.followHqLease) throw new Error('GCS 임대와 HQ 임대는 동시에 따를 수 없음');
|
|
111
114
|
if (options.followLease) bucket = resolveRoleBucket(options.bucket);
|
|
112
115
|
} catch (error) { console.error(reasonFor(error)); process.exitCode = 2; return; }
|
|
113
|
-
const machine = resolveMachineName({ option: options.machine }).machine;
|
|
114
|
-
|
|
116
|
+
const machine = options.followHqLease ? '' : resolveMachineName({ option: options.machine }).machine;
|
|
117
|
+
// HQ's holder identity is hq.hostName. A caller-controlled role machine alias cannot grant primary writes.
|
|
118
|
+
let hqHostName: string | undefined;
|
|
119
|
+
if (options.followHqLease) {
|
|
120
|
+
try { hqHostName = options.hqHostName ?? getUserConfig().hq?.hostName; }
|
|
121
|
+
catch { /* Unknown local identity must remain fail closed at the write boundary. */ }
|
|
122
|
+
}
|
|
123
|
+
const leaseView = bucket !== undefined ? createLeaseHolderView({
|
|
115
124
|
machine, read: () => (options.read ?? readRoleLeaseAsync)(bucket),
|
|
116
|
-
})
|
|
125
|
+
}) : options.followHqLease ? createLeaseHolderView({
|
|
126
|
+
machine: hqHostName ?? '', read: () => {
|
|
127
|
+
const { record, expired } = (options.readHq ?? readControlHqLease)();
|
|
128
|
+
return hqHostName && record && expired === false
|
|
129
|
+
? { kind: 'present' as const, doc: { holder: record.holder, generation: record.generation, state: 'held' as const, renewedAt: record.renewedAt } }
|
|
130
|
+
: { kind: 'unmeasured' as const, why: 'HQ lease missing or expired' };
|
|
131
|
+
},
|
|
132
|
+
}) : undefined;
|
|
117
133
|
let server: ReturnType<typeof startControlServer>;
|
|
118
134
|
try { server = startControlServer({ port, hostname: options.host, ...(leaseView ? { leaseView, requireKnownLeaseForWrites: true } : {}) }); }
|
|
119
135
|
catch (error) { console.error(`관제부 시작 실패: ${reasonFor(error)}`); process.exitCode = 2; return; }
|
|
@@ -130,7 +146,7 @@ export async function runControlServe(options: { port?: string; host?: string; f
|
|
|
130
146
|
if (options.signal.aborted) { stop(); return; }
|
|
131
147
|
options.signal.addEventListener('abort', stop, { once: true });
|
|
132
148
|
}
|
|
133
|
-
console.log(`관제부 ${new URL(server.url).host} · 토큰 ${join(effectiveInstanceRoot(), 'control', 'tokens.json')}${bucket
|
|
149
|
+
console.log(`관제부 ${new URL(server.url).host} · 토큰 ${join(effectiveInstanceRoot(), 'control', 'tokens.json')}${bucket !== undefined ? ` · 임대 따름 · ${bucket} · 나=${machine}` : options.followHqLease ? ` · HQ 임대 따름 · 나=${hqHostName ?? '미확인'}` : ''}`);
|
|
134
150
|
});
|
|
135
151
|
}
|
|
136
152
|
|
|
@@ -199,8 +215,9 @@ export function registerControlCommands(program: Command): void {
|
|
|
199
215
|
.option('--port <n>', '리스닝 포트(0=임시 포트)')
|
|
200
216
|
.option('--host <addr>', '루프백 또는 tailnet 바인드 주소')
|
|
201
217
|
.option('--follow-lease', '임대 보유자일 때만 쓰기')
|
|
218
|
+
.option('--follow-hq-lease', 'HQ 임대 보유자일 때만 쓰기')
|
|
202
219
|
.option('--bucket <bucket>', 'GCS 임대 버킷')
|
|
203
|
-
.action((options: { port?: string; host?: string; followLease?: boolean; bucket?: string }) => runControlServe(options));
|
|
220
|
+
.action((options: { port?: string; host?: string; followLease?: boolean; followHqLease?: boolean; bucket?: string }) => runControlServe(options));
|
|
204
221
|
control.command('member').description('합류 기계의 자원을 포그라운드에서 등록·심박')
|
|
205
222
|
.option('--resource <kind:name=url>', '등록할 자원', (value: string, previous: string[]) => [...previous, value], [] as string[])
|
|
206
223
|
.option('--interval <seconds>', '심박 간격(초)')
|
package/src/cli/guardian-cli.ts
CHANGED
|
@@ -19,6 +19,16 @@ async function guardianPlan(): Promise<{ db: Database; plan: GuardianPlan }> {
|
|
|
19
19
|
|
|
20
20
|
export function registerGuardianCommands(program: Command): void {
|
|
21
21
|
const guardian = program.command('guardian').description('크론 수호자 그림자 관측(기존 크론·알림 무변경)');
|
|
22
|
+
guardian.command('grok-expiry').description('현재 호스트 Grok 구독 만료 시각과 4시간 경보 상태 출력')
|
|
23
|
+
.action(async () => {
|
|
24
|
+
const { readGrokSubscriptionExpiry } = await import('../grok/credential.js');
|
|
25
|
+
const { grokExpiryAlertLine, grokExpiryStatusLine } = await import('../domains/guardian-tick.js');
|
|
26
|
+
const now = new Date();
|
|
27
|
+
const expiresAt = readGrokSubscriptionExpiry();
|
|
28
|
+
console.log(grokExpiryStatusLine({ now, expiresAt }));
|
|
29
|
+
const alert = grokExpiryAlertLine({ now, expiresAt });
|
|
30
|
+
if (alert) console.log(alert);
|
|
31
|
+
});
|
|
22
32
|
guardian.command('tick').description('현재 시각에 발화했을 잡을 관측(잡은 실행하지 않음)')
|
|
23
33
|
.action(async () => {
|
|
24
34
|
const { guardianTick } = await import('../domains/guardian-tick.js');
|
package/src/cli/import-cli.ts
CHANGED
|
@@ -21,8 +21,20 @@ export async function buildImportPlan(home = homedir()): Promise<ImportPlan> {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
export function registerImportCommand(program: Command): void {
|
|
24
|
+
const publicContributionHelp = `
|
|
25
|
+
Public contribution (EC1 · 10-28 update; moved from 0.2.8 in the 10-01 release split):
|
|
26
|
+
Show HN / community: share a working import example and feedback; posting and replies remain with the human author.
|
|
27
|
+
CB1 contribution entry: open an issue or pull request at https://github.com/ElanvitalAI/elanous
|
|
28
|
+
Marketplace plugins: propose a plugin in plugins/ via pull request; inclusion in the signed marketplace is reviewed, not automatic.
|
|
29
|
+
Remaining drafts (not published): Show HN · 긱뉴스 · 3-minute install-to-first-result video
|
|
30
|
+
docs/marketing/DRAFT-ec1-show-hn-geeknews-and-3min-video-2026-10-01.md
|
|
31
|
+
Measure adoption separately: GitHub stars · installs · npm downloads (downloads are not unique users).
|
|
32
|
+
Historical positioning (§4, 2026-10-01; not current counts): elanous ★0 · OpenClaw ~390k · Hermes ~250k · Codex ~127k.
|
|
33
|
+
10-03 baseline (not current results): stars 0 · npm 7-day downloads 790 (includes our own installs).
|
|
34
|
+
`;
|
|
24
35
|
program.command('import')
|
|
25
36
|
.description('Show what elanous can bring over from Claude Code, Codex, ~/.agents, OpenClaw and Hermes — a plan first; `--apply` registers skills in place and adds MCP switched off, `--undo` puts everything back')
|
|
37
|
+
.addHelpText('after', publicContributionHelp)
|
|
26
38
|
.option('--json', 'Print the plan (or the apply result) as JSON')
|
|
27
39
|
.option('--apply', 'Apply the plan: skills in place (ref) or as link/copy · MCP switched off · secrets and hooks only listed')
|
|
28
40
|
.option('--mode <mode>', `How skills come over: ${IMPORT_MODES.join('|')} (default ref — nothing copied)`)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export type LightCliRoute = 'msg' | 'release' | 'tasks' | 'pty' | 'logs' | 'config';
|
|
2
|
+
|
|
3
|
+
const VALUE_FLAGS = new Set(['--config-dir', '--test-state-dir']);
|
|
4
|
+
|
|
5
|
+
/** Select only read-heavy command paths whose CLI module can stand alone. */
|
|
6
|
+
export function selectLightCliRoute(args: readonly string[]): LightCliRoute | undefined {
|
|
7
|
+
const command: string[] = [];
|
|
8
|
+
let index = 0;
|
|
9
|
+
while (index < args.length && args[index]!.startsWith('-')) {
|
|
10
|
+
const flag = args[index]!;
|
|
11
|
+
index += 1;
|
|
12
|
+
if ([...VALUE_FLAGS].some(value => flag.startsWith(`${value}=`))) continue;
|
|
13
|
+
if (VALUE_FLAGS.has(flag)) {
|
|
14
|
+
if (index >= args.length || args[index]!.startsWith('-')) return undefined;
|
|
15
|
+
index += 1;
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
// Only flags removed by the pre-import isolation helpers can safely
|
|
19
|
+
// precede a light route. Other root flags keep their original parser.
|
|
20
|
+
if (flag !== '--test' && !flag.startsWith('--test=')) return undefined;
|
|
21
|
+
}
|
|
22
|
+
for (const token of args.slice(index)) {
|
|
23
|
+
if (token.startsWith('-')) break;
|
|
24
|
+
command.push(token);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (command[0] === 'msg' && (command[1] === 'list' || command[1] === 'ack' || command[1] === 'watch')) return 'msg';
|
|
28
|
+
// --reveal has an audit-log contract owned by the full CLI.
|
|
29
|
+
if (command[0] === 'config' && command[1] === 'get' && !args.some(arg => arg === '--reveal' || arg.startsWith('--reveal='))) return 'config';
|
|
30
|
+
if (command[0] === 'release' && command[1] === 'checklist' && command[2] === 'status') return 'release';
|
|
31
|
+
if (command[0] === 'tasks' && command[1] === 'show') return 'tasks';
|
|
32
|
+
if (command[0] === 'pty' && (command[1] === 'list' || command[1] === 'state')) return 'pty';
|
|
33
|
+
if (command[0] === 'logs') return 'logs';
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
@@ -2,6 +2,7 @@ import type { Command } from 'commander';
|
|
|
2
2
|
import type { LLMProvider } from '../llm.js';
|
|
3
3
|
import { detectProviders, type DetectedProvider } from '../llm/provider-detect.js';
|
|
4
4
|
import { probeProvider, type ProviderProbeResult } from '../llm/provider-probe.js';
|
|
5
|
+
import { openrouterSource } from '../registry/discovery/sources/openrouter.js';
|
|
5
6
|
import {
|
|
6
7
|
getUserConfig, reloadUserConfig, saveUserConfig, userConfigPath,
|
|
7
8
|
type UserConfig,
|
|
@@ -20,6 +21,7 @@ export interface LlmDetectDeps {
|
|
|
20
21
|
config?: () => UserConfig;
|
|
21
22
|
save?: (config: UserConfig) => void;
|
|
22
23
|
output?: (line: string) => void;
|
|
24
|
+
discoverUpstageModels?: () => Promise<string[] | null>;
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
export interface LlmDetectResult {
|
|
@@ -29,6 +31,15 @@ export interface LlmDetectResult {
|
|
|
29
31
|
/** Why a selected provider was not written (an explicit llm.provider is never overwritten). */
|
|
30
32
|
notApplied?: string;
|
|
31
33
|
error?: string;
|
|
34
|
+
/** OpenRouter /models candidates; null means discovery was unavailable, not an empty catalogue. */
|
|
35
|
+
upstageCandidates?: string[] | null;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function discoverUpstageModels(): Promise<string[] | null> {
|
|
39
|
+
const result = await openrouterSource.run({ timeoutMs: 3_000 });
|
|
40
|
+
if (!result.ok) return null;
|
|
41
|
+
return result.models.map(({ id }) => id).filter((id) => /^upstage\/[^/]+$/.test(id))
|
|
42
|
+
.map((id) => `openrouter/${id}`).sort();
|
|
32
43
|
}
|
|
33
44
|
|
|
34
45
|
/** Discovery alone cannot validate credentials. Only a successful probe can select a provider. */
|
|
@@ -76,6 +87,13 @@ export async function runLlmDetect(
|
|
|
76
87
|
}
|
|
77
88
|
}
|
|
78
89
|
|
|
90
|
+
let upstageCandidates: string[] | null | undefined;
|
|
91
|
+
if (!options.apply && (!options.probe || selected === 'openrouter')
|
|
92
|
+
&& rows.some((row) => row.provider === 'openrouter' && row.available && row.auth === 'apikey')) {
|
|
93
|
+
try { upstageCandidates = await (deps.discoverUpstageModels ?? discoverUpstageModels)(); }
|
|
94
|
+
catch { upstageCandidates = null; }
|
|
95
|
+
}
|
|
96
|
+
|
|
79
97
|
let applied = false;
|
|
80
98
|
let notApplied: string | undefined;
|
|
81
99
|
const previous = config.llm?.provider ?? 'auto';
|
|
@@ -91,7 +109,8 @@ export async function runLlmDetect(
|
|
|
91
109
|
}
|
|
92
110
|
applied = true;
|
|
93
111
|
}
|
|
94
|
-
const result: LlmDetectResult = { candidates: rows, selected, applied,
|
|
112
|
+
const result: LlmDetectResult = { candidates: rows, selected, applied,
|
|
113
|
+
...(upstageCandidates !== undefined ? { upstageCandidates } : {}), ...(notApplied ? { notApplied } : {}) };
|
|
95
114
|
if (options.json) output(JSON.stringify(result));
|
|
96
115
|
else {
|
|
97
116
|
if (rows.length === 0) output('No LLM providers detected.');
|
|
@@ -111,6 +130,9 @@ export async function runLlmDetect(
|
|
|
111
130
|
}
|
|
112
131
|
}
|
|
113
132
|
if (options.probe && !selected) output('No provider passed the probe; configuration unchanged.');
|
|
133
|
+
if (upstageCandidates !== undefined) output(upstageCandidates === null
|
|
134
|
+
? 'Upstage candidates: catalogue unavailable'
|
|
135
|
+
: `Upstage candidates: ${upstageCandidates.join(', ') || '(none in OpenRouter /models)'}`);
|
|
114
136
|
if (applied) output(`Applied llm.provider=${selected} — revert: elanous config set llm.provider auto`);
|
|
115
137
|
if (notApplied) output(notApplied);
|
|
116
138
|
}
|