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/cli/seat-cli.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { existsSync, lstatSync, readFileSync, realpathSync, statSync } from 'nod
|
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { dirname, join, relative, sep } from 'node:path';
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { LAST_SESSION_FILE } from '../dashboard/seat-local-instructions.js';
|
|
6
7
|
import { redactSecretText } from '../debug/log.js';
|
|
7
8
|
import { defaultMsgStorePath, readUnreadCount } from '../msg/msg-store.js';
|
|
8
9
|
import { parseKnowhowItems, splitKnowhow } from '../seat-loop/seat-knowhow.js';
|
|
@@ -96,6 +97,40 @@ export function renderSeatBootCard(seat: string, sections: ReadonlyArray<SeatBoo
|
|
|
96
97
|
return out.join('\n');
|
|
97
98
|
}
|
|
98
99
|
|
|
100
|
+
/** 자리의 현재 역할 선언 한 줄만 부트 카드에 싣는다. 긴 지시문 본문은 카드로 복사하지 않는다. */
|
|
101
|
+
function seatRoleSection(home: string, seat: string): { source: string; updated: string; rows: readonly string[]; reason?: string } {
|
|
102
|
+
const root = join(home, 'elanous-hq');
|
|
103
|
+
const path = join(root, 'seats', seat, 'AGENTS.local.md');
|
|
104
|
+
if (!existsSync(path)) return { source: path, updated: '미상', rows: [], reason: '미관측: 파일 없음' };
|
|
105
|
+
try {
|
|
106
|
+
if (!isRegularSeatPath(home, root, path)) return { source: path, updated: '미상', rows: [], reason: '미관측: 일반 경로가 아님' };
|
|
107
|
+
const role = readFileSync(path, 'utf8').slice(0, 4096).split(/\r?\n/)
|
|
108
|
+
.map(line => line.match(/^\s*#?\s*역할\s*=\s*(.+)$/)?.[1])
|
|
109
|
+
.find(Boolean);
|
|
110
|
+
return { source: path, updated: statSync(path).mtime.toISOString(), rows: role ? [`역할: ${clean(role)}`] : [],
|
|
111
|
+
...(role ? {} : { reason: '미관측: 역할 선언 없음' }) };
|
|
112
|
+
} catch {
|
|
113
|
+
return { source: path, updated: '미상', rows: [], reason: '미관측: 읽기 실패' };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** «지난 세션» 절 — TUI 가 대화 끝마다 자리 작업 디렉터리 루트에 갈아 쓰는 `LAST_SESSION_FILE`(`dashboard/seat-local-instructions.ts`)이 곧 지난 세션의 정본이다.
|
|
118
|
+
* 카드도 같은 정본을 읽는다 — 머리 보일러플레이트(`## …`)는 빼고 요약 줄만 실는다. */
|
|
119
|
+
function lastSessionSection(home: string, seat: string): { source: string; updated: string; rows: readonly string[]; reason?: string } {
|
|
120
|
+
const path = join(home, 'elanous-hq', 'seats', seat, LAST_SESSION_FILE);
|
|
121
|
+
if (!existsSync(path)) return { source: path, updated: '미상', rows: [], reason: '미관측: 파일 없음' };
|
|
122
|
+
try {
|
|
123
|
+
if (!isRegularSeatPath(home, join(home, 'elanous-hq'), path)) return { source: path, updated: '미상', rows: [], reason: '미관측: 일반 경로가 아님' };
|
|
124
|
+
const rows = readFileSync(path, 'utf8').slice(0, 256_000).split(/\r?\n/)
|
|
125
|
+
.filter(line => line.trim() && !/^#{1,6}\s/.test(line))
|
|
126
|
+
.slice(0, MAX_ROWS)
|
|
127
|
+
.map(line => clean(line.replace(/^[-*]\s*/, '')));
|
|
128
|
+
return { source: path, updated: statSync(path).mtime.toISOString(), rows, ...(rows.length ? {} : { reason: '미관측: 요약 줄 없음' }) };
|
|
129
|
+
} catch {
|
|
130
|
+
return { source: path, updated: '미상', rows: [], reason: '미관측: 읽기 실패' };
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
99
134
|
/** 자리 카드의 파일·우편 절(동기) — `eln seat boot` 와 TUI 세션 부트(`dashboard/seat-boot-preamble.ts`)가 같이 쓴다. */
|
|
100
135
|
export function collectSeatBootSections(seat: string, options: { home: string; msgPath: string }): { sections: SeatBootSection[]; unread: number | null } {
|
|
101
136
|
const root = join(options.home, 'elanous-hq', 'seat-state');
|
|
@@ -104,11 +139,13 @@ export function collectSeatBootSections(seat: string, options: { home: string; m
|
|
|
104
139
|
try { unread = readUnreadCount(seat, options.msgPath); }
|
|
105
140
|
catch { /* unavailable is not a measured zero */ }
|
|
106
141
|
const sections: SeatBootSection[] = [
|
|
142
|
+
{ title: '자리 역할', ...seatRoleSection(options.home, seat) },
|
|
107
143
|
{ title: 'msg 원장', source: options.msgPath, updated: unread === null ? '미상' : new Date().toISOString(), rows: [`안 읽은 msg ${unread ?? '미관측'} (${seat})`] },
|
|
108
144
|
{ title: 'HANDOFF', ...metadata(options.home, root, join(seatDir, 'HANDOFF.md'), 'markdown') },
|
|
109
145
|
{ title: 'inbox', ...metadata(options.home, root, join(seatDir, 'inbox.md'), 'markdown') },
|
|
110
146
|
{ title: '수확 주장', ...metadata(options.home, root, join(seatDir, 'harvest-claims.tsv'), 'tsv') },
|
|
111
147
|
{ title: '예약', ...metadata(options.home, root, join(seatDir, 'scheduled.tsv'), 'tsv') },
|
|
148
|
+
{ title: '지난 세션', ...lastSessionSection(options.home, seat) },
|
|
112
149
|
{ title: '공통 메모리 색인', ...metadata(options.home, root, join(root, 'memory', 'MEMORY.md'), 'memory') },
|
|
113
150
|
];
|
|
114
151
|
return { sections, unread };
|
package/src/cli/setup-cli.ts
CHANGED
|
@@ -182,10 +182,47 @@ function reportCliSkills(deps: SetupCliDeps, apply: boolean): string[] {
|
|
|
182
182
|
return lines;
|
|
183
183
|
}
|
|
184
184
|
|
|
185
|
+
/** 최초 셋업 묶음 제안(읽기 전용). 등급·승인 어휘는 문서 원전을 그대로 쓴다 —
|
|
186
|
+
* 묶음·층 구성 = 내부 문서 `RESEARCH-plugins-connectors-baseline-2026-09-30` §4(0층 «키 없이 항상 켬»),
|
|
187
|
+
* 항목별 보안 등급·승인 = 같은 문서 §5. §5 표에 등급이 없는 0층 항목(Edge/macOS TTS·스킬)은
|
|
188
|
+
* 등급을 지어내지 않기 위해 목록에서 뺀다. 실제 설치·자격 부여는 승인 뒤 후속 조각(plan-then-apply). */
|
|
189
|
+
interface SetupBundleItem {
|
|
190
|
+
name: string;
|
|
191
|
+
grade: string;
|
|
192
|
+
approval: string;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const DEFAULT_SETUP_BUNDLE: readonly SetupBundleItem[] = [
|
|
196
|
+
{ name: '셸·파일(작업 트리 안)', grade: '쓰기(로컬)', approval: '기존 모래상자·워크트리 규칙' },
|
|
197
|
+
{ name: 'WebFetch', grade: '읽기', approval: '불요' },
|
|
198
|
+
{ name: 'WebSearch(무료 DuckDuckGo·Jina)', grade: '읽기', approval: '불요' },
|
|
199
|
+
{ name: 'GitHub 공개 읽기(무인증)', grade: '읽기', approval: '불요' },
|
|
200
|
+
{ name: 'PDF/HWP 읽기', grade: '읽기', approval: '불요' },
|
|
201
|
+
{ name: '비전', grade: '읽기', approval: '불요' },
|
|
202
|
+
{ name: 'Obsidian 검색', grade: '읽기', approval: '불요' },
|
|
203
|
+
{ name: 'Obsidian 쓰기', grade: '쓰기(로컬)', approval: 'vault-write-guard' },
|
|
204
|
+
{ name: '기억·일정', grade: '쓰기(로컬)', approval: '기존 모래상자·워크트리 규칙' },
|
|
205
|
+
{ name: 'CDP 브라우저 탐색·읽기', grade: '읽기(네트워크)', approval: '불요(클릭·입력은 쓰기 → 승인)' },
|
|
206
|
+
];
|
|
207
|
+
|
|
208
|
+
function formatDefaultBundleProposal(): string[] {
|
|
209
|
+
return [
|
|
210
|
+
'Setup: 기본 플러그인·커넥터 묶음 제안 (읽기 전용)',
|
|
211
|
+
`묶음 1/1: 기본 묶음 — 키 없이 항상 켬(0층) · 항목 ${DEFAULT_SETUP_BUNDLE.length}개`,
|
|
212
|
+
...DEFAULT_SETUP_BUNDLE.map((item) => `- ${item.name} — 보안 등급: ${item.grade} · 승인: ${item.approval}`),
|
|
213
|
+
'후속 층(승인 뒤 조각): 1층 로그인된 CLI 재사용 · 2층 원격 MCP 한 번 OAuth · 3층 채널',
|
|
214
|
+
'제안은 표시만 합니다 — 승인 전 설치 0 · 자격 쓰기 0 · 승인 뒤 설치는 `elanous plugin add <spec>` 경로로(후속 조각)',
|
|
215
|
+
];
|
|
216
|
+
}
|
|
217
|
+
|
|
185
218
|
export function registerSetupCommand(program: Command, deps: SetupCliDeps = {}): void {
|
|
186
219
|
const out = deps.out ?? { log: (value: string) => console.log(value), error: (value: string) => console.error(value) };
|
|
187
220
|
const setExitCode = deps.setExitCode ?? ((code: number) => { process.exitCode = code; });
|
|
188
221
|
const doctorRunner = deps.runDoctor ?? runDoctor;
|
|
222
|
+
const isFirstRunSetup = (): boolean => deps.firstRunTopics ?? (!deps.getUserConfig && !existsSync(userConfigPath()));
|
|
223
|
+
const showDefaultBundleProposal = (): void => {
|
|
224
|
+
for (const line of formatDefaultBundleProposal()) out.log(line);
|
|
225
|
+
};
|
|
189
226
|
const showCliSkills = (apply: boolean) => {
|
|
190
227
|
out.log('Setup: CLI skills (public GitHub repository reads remain available without login)');
|
|
191
228
|
for (const line of reportCliSkills(deps, apply)) out.log(line);
|
|
@@ -206,6 +243,7 @@ export function registerSetupCommand(program: Command, deps: SetupCliDeps = {}):
|
|
|
206
243
|
if (opts.nonInteractive) {
|
|
207
244
|
out.log(formatSetupReport(doctor, setupSteps(deps), true));
|
|
208
245
|
showCliSkills(false);
|
|
246
|
+
if (isFirstRunSetup()) showDefaultBundleProposal();
|
|
209
247
|
for (const line of recommendedSetup((deps.getUserConfig ?? getUserConfig)())) out.log(line);
|
|
210
248
|
setExitCode(0);
|
|
211
249
|
return;
|
|
@@ -215,7 +253,7 @@ export function registerSetupCommand(program: Command, deps: SetupCliDeps = {}):
|
|
|
215
253
|
setExitCode(1);
|
|
216
254
|
return;
|
|
217
255
|
}
|
|
218
|
-
const isFirstRun =
|
|
256
|
+
const isFirstRun = isFirstRunSetup();
|
|
219
257
|
let steps = setupSteps(deps);
|
|
220
258
|
const provider = steps[1]!;
|
|
221
259
|
if (!provider.complete) {
|
|
@@ -230,6 +268,7 @@ export function registerSetupCommand(program: Command, deps: SetupCliDeps = {}):
|
|
|
230
268
|
}
|
|
231
269
|
out.log(formatSetupReport(doctor, steps, false));
|
|
232
270
|
showCliSkills(false);
|
|
271
|
+
if (isFirstRun) showDefaultBundleProposal();
|
|
233
272
|
for (const line of recommendedSetup((deps.getUserConfig ?? getUserConfig)())) out.log(line);
|
|
234
273
|
let configured = (deps.getUserConfig ?? getUserConfig)();
|
|
235
274
|
if (!configured.starter?.topics && configured.watch?.enabled !== false
|
package/src/cli/tasks-cli.ts
CHANGED
|
@@ -162,10 +162,17 @@ export interface DefaultTaskLauncherDeps {
|
|
|
162
162
|
launchHoldActive?: () => boolean;
|
|
163
163
|
/** HQ 판(시험 주입). */
|
|
164
164
|
localVersion?: string;
|
|
165
|
+
/** HQ-owned, refresh-less Codex access mirror to install before a remote parent launch. */
|
|
166
|
+
codexAccessMirror?: () => Promise<{ elanousAuth: string; codexAuth: string; account?: string; usedPercent?: number; thresholdPercent?: number } | null>;
|
|
167
|
+
/** Isolated integration seam; production still reads the HQ rotation snapshot and config directly. */
|
|
168
|
+
ownerCodexRotation?: () => ReturnType<typeof import('../oauth/codex-account-store.js').inspectCodexRotation>;
|
|
169
|
+
ownerCodexRotationConfig?: { accountOrder?: readonly string[]; thresholdPercentByAccount?: Readonly<Record<string, unknown>> };
|
|
165
170
|
/** 원격 → 로컬 되돌림 알림(시험 주입). 기본 = stderr 한 줄. */
|
|
166
171
|
notice?: (line: string) => void;
|
|
167
172
|
}
|
|
168
173
|
|
|
174
|
+
class NoEligibleOwnerCodexAccountError extends Error {}
|
|
175
|
+
|
|
169
176
|
/**
|
|
170
177
|
* HARNESS-PARENT-ON-MSB1 — 켜져 있고 발사 전 점검이 통과하면 원격(ssh)에서 부모를 띄운다(PR 까지만 · 병합은 HQ).
|
|
171
178
|
* 막히면 null — 호출부가 종전 로컬 발사로 간다(관측: task-agent parent-host-fallback).
|
|
@@ -185,6 +192,52 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
|
|
|
185
192
|
try { debug.log('task-agent', 'parent-host-fallback', { host: target.host, runId: context.runId, gaps, facts }); } catch { /* fail-soft */ }
|
|
186
193
|
notice(`[parent-host] ${target.host} 로 못 띄움 — ${multi ? '다음 호스트 또는 로컬 발사로 간다' : '로컬 발사로 간다'}: ${gaps.join(' · ')}`);
|
|
187
194
|
};
|
|
195
|
+
let accessMirror: { elanousAuth: string; codexAuth: string; account?: string; usedPercent?: number; thresholdPercent?: number } | null | undefined;
|
|
196
|
+
const getAccessMirror = async (): Promise<{ elanousAuth: string; codexAuth: string; account?: string; usedPercent?: number; thresholdPercent?: number } | null> => {
|
|
197
|
+
if (accessMirror !== undefined) return accessMirror;
|
|
198
|
+
if (deps.codexAccessMirror) {
|
|
199
|
+
accessMirror = await deps.codexAccessMirror();
|
|
200
|
+
return accessMirror;
|
|
201
|
+
}
|
|
202
|
+
const [pod, authStore, codex, hq] = await Promise.all([
|
|
203
|
+
import('../task-orchestrator/surfaces/self-implement-pod.js'),
|
|
204
|
+
import('../oauth/store.js'),
|
|
205
|
+
import('../oauth/codex.js'),
|
|
206
|
+
import('../hq/hq.js'),
|
|
207
|
+
]);
|
|
208
|
+
const { inspectCodexRotation } = await import('../oauth/codex-account-store.js');
|
|
209
|
+
const { planOwnerCodexMirrorCandidates, podAccountThresholdPercent } = await import('../task-orchestrator/surfaces/pod-account-broker.js');
|
|
210
|
+
const { getUserConfig } = await import('../user-config.js');
|
|
211
|
+
const rotation = deps.ownerCodexRotation?.() ?? inspectCodexRotation();
|
|
212
|
+
const config = getUserConfig();
|
|
213
|
+
const ownerConfig = deps.ownerCodexRotationConfig;
|
|
214
|
+
const candidates = [...rotation.candidates];
|
|
215
|
+
const eligible = planOwnerCodexMirrorCandidates(candidates, {
|
|
216
|
+
accountOrder: ownerConfig?.accountOrder ?? config.llm?.codexAccountOrder ?? [],
|
|
217
|
+
thresholdPercentByAccount: ownerConfig?.thresholdPercentByAccount ?? config.llm?.codexAccountRotationThresholdPercentByAccount,
|
|
218
|
+
});
|
|
219
|
+
if (candidates.length > 0 && eligible.length === 0) throw new NoEligibleOwnerCodexAccountError('HQ 소유 Codex 계정이 모두 사용 임계에 도달해 원격 부모 발사를 거부한다');
|
|
220
|
+
const prerefreshDeps = {
|
|
221
|
+
credentials: (account: string) => pod.hostCredentials(account, authStore.authStorePath(), () => '', { requireExplicitChatgptAuthMode: true }),
|
|
222
|
+
refresh: (account: string) => codex.refreshCodexAccountHome(account),
|
|
223
|
+
isLeaseHolder: () => hq.hqFenceDecision('ledger-cli').run,
|
|
224
|
+
};
|
|
225
|
+
for (const candidate of eligible) {
|
|
226
|
+
// The account's refresh token stays on HQ. Only the selected account's access-only mirror crosses SSH.
|
|
227
|
+
let credential: Awaited<ReturnType<typeof pod.podCodexCredentialWithPrerefresh>> = null;
|
|
228
|
+
try { credential = await pod.podCodexCredentialWithPrerefresh(candidate.name, prerefreshDeps); }
|
|
229
|
+
catch { continue; }
|
|
230
|
+
if (!credential) continue;
|
|
231
|
+
accessMirror = { elanousAuth: credential.elanousAuth, codexAuth: credential.codexAuth, account: candidate.name,
|
|
232
|
+
...(candidate.usedPercent !== undefined ? { usedPercent: candidate.usedPercent } : {}),
|
|
233
|
+
thresholdPercent: podAccountThresholdPercent(candidate.name, {
|
|
234
|
+
thresholdPercentByAccount: ownerConfig?.thresholdPercentByAccount ?? config.llm?.codexAccountRotationThresholdPercentByAccount,
|
|
235
|
+
}) };
|
|
236
|
+
return accessMirror;
|
|
237
|
+
}
|
|
238
|
+
accessMirror = null;
|
|
239
|
+
return accessMirror;
|
|
240
|
+
};
|
|
188
241
|
if (cwd) {
|
|
189
242
|
failed(targets[0]!, ['project-target-is-local']);
|
|
190
243
|
return null;
|
|
@@ -204,8 +257,37 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
|
|
|
204
257
|
launchHoldActive = readLandingFreeze(prodInstanceRoot())?.holdLaunches === true;
|
|
205
258
|
}
|
|
206
259
|
} catch { launchHoldActive = true; /* 못 읽으면 막힌 것으로(fail-closed) */ }
|
|
207
|
-
const
|
|
208
|
-
|
|
260
|
+
const podGoal = context.substrate === 'pod' ? context.podGoal : undefined;
|
|
261
|
+
// 부모에서 잰 메모리 선택자만 원격 자식에도 넘긴다. 로컬의 나머지 환경·자격은 SSH 로 복사하지 않는다.
|
|
262
|
+
const remoteEnv = { ...context.env };
|
|
263
|
+
// These labels describe an HQ-selected Codex access mirror; never forward an inherited label by itself.
|
|
264
|
+
delete remoteEnv.ELANOUS_REMOTE_CODEX_ACCOUNT;
|
|
265
|
+
delete remoteEnv.ELANOUS_REMOTE_CODEX_USED_PERCENT;
|
|
266
|
+
delete remoteEnv.ELANOUS_REMOTE_CODEX_THRESHOLD_PERCENT;
|
|
267
|
+
if (podGoal) for (const key of ['ELANOUS_POD_MEMORY_TIER', 'ELANOUS_POD_MEMORY', 'ELANOUS_POD_MEMORY_HIGH', 'ELANOUS_POD_MEMORY_LITE', 'ELANOUS_POD_GOAL_TYPE'] as const) {
|
|
268
|
+
const value = context.env[key] ?? process.env[key];
|
|
269
|
+
if (value !== undefined) remoteEnv[key] = value;
|
|
270
|
+
}
|
|
271
|
+
const memoryLimit = podGoal ? (await import('../task-orchestrator/surfaces/self-implement-pod.js')).podMemoryLimitFor(podGoal, remoteEnv).limit : undefined;
|
|
272
|
+
const fits = Object.fromEntries(targets.map((target) => {
|
|
273
|
+
const fit = memoryLimit
|
|
274
|
+
? parentHostModule.readParentHostPodFit(target, memoryLimit, deps.ssh)
|
|
275
|
+
: { state: 'unmeasured' as const, memoryLimit: '', requiredBytes: null, allocatableBytes: null, reason: 'pod-context-unmeasured' };
|
|
276
|
+
try { debug.log('task-agent.parent-host', 'pod-fit', { host: target.host, runId: context.runId, ...fit }); } catch { /* fail-soft */ }
|
|
277
|
+
if (fit.state === 'never-fits') notice(`[parent-host] ${target.host} 제외 — ${fit.reason}: Pod ${fit.memoryLimit} (${fit.requiredBytes} bytes) > node allocatable ${fit.allocatableBytes} bytes`);
|
|
278
|
+
return [target.host, fit];
|
|
279
|
+
}));
|
|
280
|
+
const eligible = targets.filter((target) => fits[target.host]?.state !== 'never-fits');
|
|
281
|
+
if (!eligible.length) {
|
|
282
|
+
const details = targets.map((target) => `${target.host}: Pod ${fits[target.host]!.memoryLimit} (${fits[target.host]!.requiredBytes} bytes) > node allocatable ${fits[target.host]!.allocatableBytes} bytes`).join(' · ');
|
|
283
|
+
throw new Error(`parent-host memory-never-fits — ${details}; local fallback refused`);
|
|
284
|
+
}
|
|
285
|
+
const capacities = Object.fromEntries(multi ? eligible.map((target) => [target.host, parentHostModule.readParentHostCapacity(target, deps.ssh)]) : []);
|
|
286
|
+
const measured = eligible.filter((target) => fits[target.host]?.state === 'fits');
|
|
287
|
+
const unknown = eligible.filter((target) => fits[target.host]?.state !== 'fits');
|
|
288
|
+
const ordered = multi
|
|
289
|
+
? [...parentHostModule.orderParentHosts(measured, context.runId, capacities), ...parentHostModule.orderParentHosts(unknown, context.runId, capacities)]
|
|
290
|
+
: eligible;
|
|
209
291
|
for (const target of ordered) {
|
|
210
292
|
if (multi && (!capacities[target.host] || capacities[target.host]!.approvalHeadroom <= 0)) {
|
|
211
293
|
failed(target, ['capacity-unavailable']);
|
|
@@ -217,7 +299,27 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
|
|
|
217
299
|
if (!preflight.ok) { failed(target, preflight.gaps, preflight.facts); continue; }
|
|
218
300
|
if (preflight.warnings.length) notice(`⚠ ${target.host} 자격: ${preflight.warnings.join(' · ')}`);
|
|
219
301
|
try {
|
|
220
|
-
|
|
302
|
+
if (parentHostModule.shouldInstallRemoteCodexAccess(context.effectiveChildProvider)) {
|
|
303
|
+
let mirror: { elanousAuth: string; codexAuth: string; account?: string; usedPercent?: number; thresholdPercent?: number } | null = null;
|
|
304
|
+
let mirrorReason = 'credential-source-empty';
|
|
305
|
+
try { mirror = await getAccessMirror(); }
|
|
306
|
+
catch (error) {
|
|
307
|
+
if (error instanceof NoEligibleOwnerCodexAccountError) throw error;
|
|
308
|
+
mirrorReason = 'credential-source-error';
|
|
309
|
+
}
|
|
310
|
+
if (mirror) parentHostModule.installRemoteCodexAccess(target, mirror, deps.ssh);
|
|
311
|
+
else {
|
|
312
|
+
try { debug.log('task-agent.parent-host', 'codex-access-mirror-unavailable', { host: target.host, runId: context.runId, reason: mirrorReason }); } catch { /* fail-soft */ }
|
|
313
|
+
failed(target, ['codex-access-mirror-unavailable']);
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
if (mirror.account) {
|
|
317
|
+
remoteEnv.ELANOUS_REMOTE_CODEX_ACCOUNT = mirror.account;
|
|
318
|
+
remoteEnv.ELANOUS_REMOTE_CODEX_USED_PERCENT = mirror.usedPercent === undefined ? 'unknown' : String(mirror.usedPercent);
|
|
319
|
+
if (mirror.thresholdPercent !== undefined) remoteEnv.ELANOUS_REMOTE_CODEX_THRESHOLD_PERCENT = String(mirror.thresholdPercent);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
const launched = parentHostModule.launchRemoteParent(target, args, remoteEnv, deps.ssh);
|
|
221
323
|
try { debug.log('task-agent', 'parent-host-launched', { host: target.host, runId: context.runId, pid: launched.pid, log: launched.log }); } catch { /* fail-soft */ }
|
|
222
324
|
return { runId: context.runId, parentHost: { host: target.host, ...(target.configDir ? { configDir: target.configDir } : {}), pid: launched.pid, log: launched.log } };
|
|
223
325
|
} catch (error) {
|
|
@@ -398,6 +500,7 @@ function taskCardLines(card: TaskCard): string[] {
|
|
|
398
500
|
return [
|
|
399
501
|
[card.id, card.status, card.seat ?? '-', card.checklistId ?? '-', card.createdAt, card.text].join('\t'),
|
|
400
502
|
...cardIdentityLines(card),
|
|
503
|
+
...(card.targetPaths !== undefined ? [`대상 경로: ${card.targetPaths.length ? card.targetPaths.join(' · ') : '(유효한 경로 없음)'}`] : []),
|
|
401
504
|
...(card.mission ? [`미션: ${card.mission} · after: ${card.after?.length ? card.after.join(', ') : '-'}`] : []),
|
|
402
505
|
...runLinkLine(card),
|
|
403
506
|
...liveMoveLines(card),
|
|
@@ -1578,7 +1681,45 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
|
|
|
1578
1681
|
: {});
|
|
1579
1682
|
try { debug.log('task-agent', 'remote-rejudge-bind', binding); } catch { /* fail-soft */ }
|
|
1580
1683
|
}
|
|
1581
|
-
ids =
|
|
1684
|
+
if (id) ids = [id];
|
|
1685
|
+
else {
|
|
1686
|
+
const maxAgeHours = (await import('../user-config.js')).getUserConfig().taskAgent?.rejudgeMaxAgeHours ?? 72;
|
|
1687
|
+
const cards = readTaskAgentState<{ tasks?: Record<string, TaskCard> }>(statePath).tasks ?? {};
|
|
1688
|
+
const candidates = rejudgeCandidates(cards, { maxAgeHours, onAgeSkip: (card, ageHours) => {
|
|
1689
|
+
try { debug.log('task-agent', 'rejudge-age-skip', { card: card.id, ageHours, maxAgeHours }); } catch { /* fail-soft */ }
|
|
1690
|
+
} });
|
|
1691
|
+
const { capturedLandReview } = await import('../task-agent/review-result-capture.js');
|
|
1692
|
+
const { defaultPrHead, defaultReviewRepoCandidates } = await import('../task-agent/live-moves.js');
|
|
1693
|
+
const currentHeads = new Map<string, string>();
|
|
1694
|
+
// Priority is a hint, not a gate. Consider only the three newest candidates;
|
|
1695
|
+
// a non-mf0 card still consumes one of those three places. Everyone else runs in age order.
|
|
1696
|
+
const priorityCandidates = candidates.slice(0, 3);
|
|
1697
|
+
let headProbes = 0;
|
|
1698
|
+
for (const cardId of priorityCandidates) {
|
|
1699
|
+
const card = cards[cardId];
|
|
1700
|
+
if (!card || typeof card.pr !== 'object' || !card.pr?.url) continue;
|
|
1701
|
+
const pr = card.pr.number;
|
|
1702
|
+
const lastHead = card.reviewRequests?.filter((entry) => entry.pr === pr).at(-1)?.head;
|
|
1703
|
+
if (!lastHead || capturedLandReview(card, pr, lastHead)?.mustFixCount !== 0) continue;
|
|
1704
|
+
let repos: readonly import('../task-agent/live-moves.js').ReviewRepoCandidate[] = [];
|
|
1705
|
+
try { repos = (deps.rejudge?.live?.repoCandidates ?? defaultReviewRepoCandidates)(card); } catch { /* no trusted repo */ }
|
|
1706
|
+
const repo = repos[0];
|
|
1707
|
+
if (!repo) continue;
|
|
1708
|
+
headProbes++;
|
|
1709
|
+
let view: Awaited<ReturnType<typeof defaultPrHead>>;
|
|
1710
|
+
try { view = await (deps.rejudge?.live?.prHead
|
|
1711
|
+
? deps.rejudge.live.prHead(pr, repo.cwd)
|
|
1712
|
+
: defaultPrHead(pr, repo.cwd, (args, options) => spawnSync('gh', args, {
|
|
1713
|
+
encoding: 'utf8', timeout: 3_000, env: options.env, ...(options.cwd ? { cwd: options.cwd } : {}),
|
|
1714
|
+
}))); } catch { view = null; }
|
|
1715
|
+
if (view?.state === 'OPEN' && view.url === card.pr.url) currentHeads.set(cardId, view.head);
|
|
1716
|
+
}
|
|
1717
|
+
if (candidates.length > priorityCandidates.length) {
|
|
1718
|
+
try { debug.log('task-agent', 'rejudge-head-priority-probe-cap', { considered: priorityCandidates.length,
|
|
1719
|
+
probed: headProbes, totalCandidates: candidates.length, max: 3 }); } catch { /* fail-soft */ }
|
|
1720
|
+
}
|
|
1721
|
+
ids = rejudgeCandidates(cards, { maxAgeHours, currentHeads });
|
|
1722
|
+
}
|
|
1582
1723
|
} catch (error) {
|
|
1583
1724
|
out(error instanceof Error ? error.message : '과제 카드 읽기 실패'); process.exitCode = 1; return;
|
|
1584
1725
|
}
|
|
@@ -1586,6 +1727,8 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
|
|
|
1586
1727
|
const liveMoves = deps.rejudge?.liveMoves ?? await configuredTaskAgentLiveMoves();
|
|
1587
1728
|
const repairBudget = opts.all ? { max: (await import('../user-config.js')).getUserConfig().taskAgent?.repairMaxPerTick ?? 3,
|
|
1588
1729
|
requested: 0, capped: 0 } : undefined;
|
|
1730
|
+
const reviewBudget = opts.all ? { max: 1, requested: 0 } : undefined;
|
|
1731
|
+
const landBudget = opts.all ? { max: 1, requested: 0 } : undefined;
|
|
1589
1732
|
const all = [];
|
|
1590
1733
|
for (const cardId of ids) {
|
|
1591
1734
|
await mirrorRemoteCardLedger(cardId, deps);
|
|
@@ -1594,7 +1737,8 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
|
|
|
1594
1737
|
}
|
|
1595
1738
|
let outcomes: Awaited<ReturnType<typeof rejudgeCardOnHead>>;
|
|
1596
1739
|
try { outcomes = await rejudgeCardOnHead(cardId, { ...deps.rejudge, liveMoves,
|
|
1597
|
-
...(repairBudget ? { repairBudget } : {}),
|
|
1740
|
+
...(repairBudget ? { repairBudget } : {}), ...(reviewBudget ? { reviewBudget } : {}), ...(landBudget ? { landBudget } : {}),
|
|
1741
|
+
live: { ...deps.rejudge?.live, statePath } }); } catch (error) {
|
|
1598
1742
|
// 카드 하나의 예외가 --all 의 나머지 카드 판단을 멈추지 않게 — 사유를 남기고 다음 카드로.
|
|
1599
1743
|
const reason = (error instanceof Error ? error.message : String(error)).slice(-300);
|
|
1600
1744
|
try { debug.log('task-agent', 'rejudge-on-head', { card: cardId, pr: null, fromHead: null, toHead: null, step: 'target', decision: 'rejudge-threw', reason }, { level: 'warn' }); } catch { /* fail-soft */ }
|
|
@@ -33,6 +33,13 @@ export interface ControlStatusDeps {
|
|
|
33
33
|
log?: typeof debug.log;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
/** The same read-only HQ source used by `control status` and HQ-fenced control serve. */
|
|
37
|
+
export function readControlHqLease(): ReturnType<typeof readHqLease> {
|
|
38
|
+
return readHqLease(getElanousConfigDirOverride() !== undefined
|
|
39
|
+
? { store: fileLeaseStore(join(effectiveInstanceRoot(), 'hq', 'lease.json')), hostPath: join(effectiveInstanceRoot(), 'hq', 'host') }
|
|
40
|
+
: {});
|
|
41
|
+
}
|
|
42
|
+
|
|
36
43
|
const missing = (row: ControlStatusRowName, reason: string): ControlStatusRow => ({ row, state: 'unmeasured', text: '못 쟀다', reason });
|
|
37
44
|
|
|
38
45
|
function localInstallRoot(): string {
|
|
@@ -76,9 +83,7 @@ export async function collectControlStatus(deps: ControlStatusDeps = {}): Promis
|
|
|
76
83
|
};
|
|
77
84
|
|
|
78
85
|
await add('집', async () => {
|
|
79
|
-
const readLease = deps.readLease ??
|
|
80
|
-
? { store: fileLeaseStore(join(effectiveInstanceRoot(), 'hq', 'lease.json')), hostPath: join(effectiveInstanceRoot(), 'hq', 'host') }
|
|
81
|
-
: {}));
|
|
86
|
+
const readLease = deps.readLease ?? readControlHqLease;
|
|
82
87
|
const { record, ageSeconds, expired } = await readLease();
|
|
83
88
|
if (!record) return missing('집', '본부 임대 기록 없음');
|
|
84
89
|
return { row: '집', state: expired ? 'warn' : 'ok',
|
|
@@ -23,6 +23,7 @@ export interface PodWorkerKey { context: string; imageDigest: string; lockHash:
|
|
|
23
23
|
type PodWorkerState = 'idle' | 'leased' | 'sanitizing' | 'quarantined';
|
|
24
24
|
interface PodWorkerLeaseAttrs {
|
|
25
25
|
key: PodWorkerKey;
|
|
26
|
+
podUid: string;
|
|
26
27
|
state: PodWorkerState;
|
|
27
28
|
generation: number;
|
|
28
29
|
idleTtlMs: number;
|
|
@@ -203,20 +204,20 @@ export class ResourceLedger {
|
|
|
203
204
|
}
|
|
204
205
|
|
|
205
206
|
/** A trusted host registers a clean instance; canary verification is a separate, still unwired step. */
|
|
206
|
-
registerPodWorker(request: { workerId: string; machine: string; key: PodWorkerKey; owner: string; ttlMs: number }, now?: number): ResourceRecord {
|
|
207
|
+
registerPodWorker(request: { workerId: string; machine: string; podUid: string; key: PodWorkerKey; owner: string; ttlMs: number }, now?: number): ResourceRecord {
|
|
207
208
|
return this.mutate(() => {
|
|
209
|
+
if (typeof request.podUid !== 'string' || !request.podUid.trim()) throw new ResourceLedgerError(400, 'invalid-pod-worker-uid');
|
|
208
210
|
now ??= Date.now();
|
|
209
211
|
const rows = this.read();
|
|
210
212
|
const id = `pod-worker-lease:${request.workerId}`;
|
|
211
213
|
const index = rows.findIndex(row => row.id === id);
|
|
212
214
|
const previous = index < 0 ? undefined : rows[index]!;
|
|
213
215
|
if (previous && previous.kind !== 'pod-worker-lease') throw new ResourceLedgerError(409, 'worker-id-conflict');
|
|
214
|
-
if (previous && previous.owner !== request.owner) throw new ResourceLedgerError(403, 'not-owner');
|
|
215
216
|
// A workerId identifies one Pod instance. Expiry never proves that a leased or quarantined Pod was cleaned.
|
|
216
217
|
if (previous) throw new ResourceLedgerError(409, 'worker-id-used');
|
|
217
218
|
const generation = 0;
|
|
218
219
|
const row: ResourceRecord = { id, kind: 'pod-worker-lease', machine: request.machine, name: request.workerId,
|
|
219
|
-
owner: request.owner, attrs: { key: request.key, state: 'idle', generation, idleTtlMs: request.ttlMs }, observedAt: now, ttlMs: request.ttlMs };
|
|
220
|
+
owner: request.owner, attrs: { key: request.key, podUid: request.podUid, state: 'idle', generation, idleTtlMs: request.ttlMs }, observedAt: now, ttlMs: request.ttlMs };
|
|
220
221
|
if (index < 0) rows.push(row); else rows[index] = row;
|
|
221
222
|
this.write(rows);
|
|
222
223
|
return row;
|
|
@@ -229,6 +230,7 @@ export class ResourceLedger {
|
|
|
229
230
|
const rows = this.read();
|
|
230
231
|
const index = rows.findIndex(row => row.kind === 'pod-worker-lease' && (!request.machine || row.machine === request.machine)
|
|
231
232
|
&& Math.max(0, at - row.observedAt) < row.ttlMs && workerAttrs(row).state === 'idle'
|
|
233
|
+
&& typeof workerAttrs(row).podUid === 'string' && workerAttrs(row).podUid.trim().length > 0
|
|
232
234
|
&& sameWorkerKey(workerAttrs(row).key, request.key));
|
|
233
235
|
if (index < 0) throw new ResourceLedgerError(409, 'no-warm-worker');
|
|
234
236
|
const row = rows[index]!;
|
|
@@ -164,15 +164,16 @@ export function startControlServer(opts: ControlServerOptions = {}): {
|
|
|
164
164
|
if (workerRegister) {
|
|
165
165
|
if (!machine) throw new ResourceLedgerError(403, 'worker-host-required');
|
|
166
166
|
const body = podWorkerBody(await req.json());
|
|
167
|
-
const { workerId, machine: workerMachine, key, ttlMs } = body;
|
|
167
|
+
const { workerId, machine: workerMachine, podUid, key, ttlMs } = body;
|
|
168
168
|
if (typeof workerId !== 'string' || !/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,95}$/.test(workerId)
|
|
169
169
|
|| typeof workerMachine !== 'string' || !workerMachine.trim()
|
|
170
|
+
|| typeof podUid !== 'string' || !podUid.trim()
|
|
170
171
|
|| typeof ttlMs !== 'number' || !Number.isSafeInteger(ttlMs) || ttlMs <= 0 || ttlMs > MAX_POD_WORKER_TTL_MS) throw new ResourceLedgerError(400, 'invalid-pod-worker-lease');
|
|
171
172
|
requireMachine(workerMachine);
|
|
172
173
|
const stale = await currentWorkerPrimary();
|
|
173
174
|
if (stale) return stale;
|
|
174
175
|
return json(await ledger.withGuardedWorkerMutation(async () => !(await currentWorkerPrimary()),
|
|
175
|
-
() => ledger.registerPodWorker({ workerId, machine: workerMachine, key: podWorkerKey(key), ttlMs, owner })));
|
|
176
|
+
() => ledger.registerPodWorker({ workerId, machine: workerMachine, podUid, key: podWorkerKey(key), ttlMs, owner })));
|
|
176
177
|
}
|
|
177
178
|
if (workerAcquire) {
|
|
178
179
|
if (scope !== 'member') throw new ResourceLedgerError(403, 'worker-consumer-required');
|
|
@@ -244,7 +245,8 @@ export function startControlServer(opts: ControlServerOptions = {}): {
|
|
|
244
245
|
name: url.searchParams.get('name') || undefined,
|
|
245
246
|
});
|
|
246
247
|
return json({ resources: rows.map(row => row.kind === 'pod-worker-lease'
|
|
247
|
-
? { ...row, attrs: { key: row.attrs.key,
|
|
248
|
+
? { ...row, attrs: { key: row.attrs.key, podUid: row.attrs.podUid,
|
|
249
|
+
state: row.attrs.state, generation: row.attrs.generation, idleTtlMs: row.attrs.idleTtlMs } }
|
|
248
250
|
: row.kind === 'port-lease'
|
|
249
251
|
? { ...row, attrs: { ...row.attrs, leaseId: undefined } }
|
|
250
252
|
: row) });
|
|
@@ -105,7 +105,11 @@ function classifyTuiChatIntentBase(text: string, ctx: ShortQuestionContext): Tui
|
|
|
105
105
|
if (!q || ctx.hasAttachments) return coding(ctx.hasAttachments ? 'attachment' : 'empty');
|
|
106
106
|
if (/(?:하니스|구현|코딩|버그|리팩터|커밋|패치|테스트|시험\s*돌|빌드|배포|\b(?:implement|coding|refactor|commit|patch|tests?|build|deploy)\b)/i.test(q)) return coding('coding');
|
|
107
107
|
// Destructive or executing verbs in any form (not only «…줘») are never a quick turn.
|
|
108
|
-
|
|
108
|
+
// A no-tool answer can transcribe its first line. Keep the verb for file changes and
|
|
109
|
+
// remove only this copy phrase, so another write request in the same answer is still caught.
|
|
110
|
+
const answerOnly = /도구\s*쓰지\s*말고\s*답해\s*:/i.test(q);
|
|
111
|
+
const writeVerbInput = answerOnly ? q.replace(/첫\s*줄(?:을|를)?\s*그대로\s*옮기고/g, '') : q;
|
|
112
|
+
if (/(?:지워|지우|삭제|제거|옮겨|옮기|돌려|실행(?!\s*중(?:인)?(?:\s|[?!.~]|$))|설치|되돌려|롤백|재시작|죽여|\b(?:delete|remove|rm|rename|move|run|install|revert|rollback|drop|kill|restart)\b)/i.test(writeVerbInput)) return coding('write-verb');
|
|
109
113
|
// Allowlist, not denylist: every «…줘» request verb must be one a quick turn can do; anything else
|
|
110
114
|
// (지워줘 · 돌려줘 · 옮겨줘 …) keeps the coding goal loop.
|
|
111
115
|
for (const match of q.matchAll(/([가-힣]+?)\s*(?:줘|주세요|줄래|주라)/g)) {
|
package/src/dashboard/index.ts
CHANGED
|
@@ -306,13 +306,20 @@ import {
|
|
|
306
306
|
} from './render/renderer.js';
|
|
307
307
|
import { buildPromptFrameDividerRows } from '../display/prompt-frame-paint.js';
|
|
308
308
|
import {
|
|
309
|
-
drawTurnTypeaheadPromptRows,
|
|
310
309
|
paintTurnTypeaheadEchoRow,
|
|
311
310
|
resolveEssentialFrameCursorDecision,
|
|
312
311
|
type EssentialFrameCursorDecision,
|
|
313
|
-
type TurnTypeaheadPromptPaintSink,
|
|
314
|
-
type TurnTypeaheadPromptRowsInput,
|
|
315
312
|
} from './input/turn-typeahead-prompt.js';
|
|
313
|
+
import {
|
|
314
|
+
buildDashboardTurnTypeaheadPromptZone,
|
|
315
|
+
drawDashboardTurnTypeaheadPromptRows,
|
|
316
|
+
observeDashboardTurnTypeaheadPromptZone,
|
|
317
|
+
} from './turn-typeahead-prompt-zone.js';
|
|
318
|
+
export {
|
|
319
|
+
buildDashboardTurnTypeaheadPromptZone,
|
|
320
|
+
drawDashboardTurnTypeaheadPromptRows,
|
|
321
|
+
observeDashboardTurnTypeaheadPromptZone,
|
|
322
|
+
} from './turn-typeahead-prompt-zone.js';
|
|
316
323
|
import { DashboardStateStore } from './runtime/state-store.js';
|
|
317
324
|
import { perf } from '../perf-counters.js';
|
|
318
325
|
import { createSearchModal, type SearchModalHandle, type SearchItem } from '../chat/search/modal.js';
|
|
@@ -1467,30 +1474,6 @@ export function resolveDashboardSlashSurfaceUx(
|
|
|
1467
1474
|
: undefined;
|
|
1468
1475
|
}
|
|
1469
1476
|
|
|
1470
|
-
/** Dashboard draw entry for the input-prompt zone. Streaming redraws reach
|
|
1471
|
-
* this production binding through the zone renderer below. */
|
|
1472
|
-
export function drawDashboardTurnTypeaheadPromptRows(
|
|
1473
|
-
input: TurnTypeaheadPromptRowsInput,
|
|
1474
|
-
sink?: TurnTypeaheadPromptPaintSink,
|
|
1475
|
-
): string[] {
|
|
1476
|
-
return drawTurnTypeaheadPromptRows(input, sink);
|
|
1477
|
-
}
|
|
1478
|
-
|
|
1479
|
-
/** Essential frames own the fallback prompt caret; Z-axis state only wins
|
|
1480
|
-
* when a modal has made a visible claim. */
|
|
1481
|
-
export function buildDashboardTurnTypeaheadPromptZone(input: TurnTypeaheadPromptRowsInput & {
|
|
1482
|
-
suppressPromptArea: boolean;
|
|
1483
|
-
}): LayoutZone {
|
|
1484
|
-
return {
|
|
1485
|
-
id: 'input-prompt',
|
|
1486
|
-
height: input.frame.inputHeight,
|
|
1487
|
-
render: (height, width) => {
|
|
1488
|
-
if (input.suppressPromptArea) return Array.from({ length: height }, () => ' '.repeat(width));
|
|
1489
|
-
return drawDashboardTurnTypeaheadPromptRows({ ...input, height, width });
|
|
1490
|
-
},
|
|
1491
|
-
};
|
|
1492
|
-
}
|
|
1493
|
-
|
|
1494
1477
|
/** The chat-main submit branch calls this before any model dispatch. Keeping
|
|
1495
1478
|
* the decision here lets the dashboard test execute the same entry point. */
|
|
1496
1479
|
export function resolveDashboardHarnessSubmitIntent(
|
|
@@ -1501,42 +1484,6 @@ export function resolveDashboardHarnessSubmitIntent(
|
|
|
1501
1484
|
return routeDevHarnessSubmitIntent(resolveIntent(text, options));
|
|
1502
1485
|
}
|
|
1503
1486
|
|
|
1504
|
-
/** 프롬프트 zone 에 관측만 덧입힌다 — 렌더 산출은 `inner` 가 소유한다.
|
|
1505
|
-
*
|
|
1506
|
-
* ⭐ **왜 뽑았나**(무인 리뷰 must-fix · 2026-08-01): 종전엔 이 래퍼가 `zones.push({...})` 안에
|
|
1507
|
-
* 인라인이라, 테스트가 `inner`(=`buildDashboardTurnTypeaheadPromptZone`)만 불러도 통과했다.
|
|
1508
|
-
* ⇒ ***래퍼가 `inner.render` 를 부르는 것을 끊어도 검사가 침묵***했다. 이제 그 결선이 검사된다.
|
|
1509
|
-
*
|
|
1510
|
-
* ⛔⚠️ **여전히 검사 밖인 한 겹**: 이 함수의 반환이 실제로 `zones` 배열에 **push 되는지**는
|
|
1511
|
-
* `showDashboard` 안의 지역 조립부라 단위 검사가 닿지 않는다. ***무한 후퇴이므로 여기서 경계를 긋는다*** —
|
|
1512
|
-
* 그 한 겹은 **라이브 검증**(`dev --elanous --hold` ⊕ `pty snapshot`)이 맡는다. */
|
|
1513
|
-
export function observeDashboardTurnTypeaheadPromptZone(
|
|
1514
|
-
inner: LayoutZone,
|
|
1515
|
-
deps: {
|
|
1516
|
-
promptBottomRow: number;
|
|
1517
|
-
state: { buffer: string; queuedSubmissions: string[] };
|
|
1518
|
-
isDebugEnabled?: () => boolean;
|
|
1519
|
-
log?: (category: string, event: string, data: Record<string, unknown>) => void;
|
|
1520
|
-
},
|
|
1521
|
-
): LayoutZone {
|
|
1522
|
-
return {
|
|
1523
|
-
...inner,
|
|
1524
|
-
render: (height, width) => {
|
|
1525
|
-
const rows = inner.render(height, width);
|
|
1526
|
-
const enabled = deps.isDebugEnabled ? deps.isDebugEnabled() : debug.enabled;
|
|
1527
|
-
if (deps.state.buffer && enabled) {
|
|
1528
|
-
(deps.log ?? ((c, e, d) => debug.log(c, e, d)))('dashboard.turn-typeahead-prompt', 'dashboard-draw-prompt', {
|
|
1529
|
-
row: deps.promptBottomRow,
|
|
1530
|
-
text: rows.at(-1) ?? '',
|
|
1531
|
-
bufferLength: deps.state.buffer.length,
|
|
1532
|
-
queuedSubmissionCount: deps.state.queuedSubmissions.length,
|
|
1533
|
-
});
|
|
1534
|
-
}
|
|
1535
|
-
return rows;
|
|
1536
|
-
},
|
|
1537
|
-
};
|
|
1538
|
-
}
|
|
1539
|
-
|
|
1540
1487
|
type DashboardFrameRenderer = (lines: string[], options: RenderOptions) => void;
|
|
1541
1488
|
|
|
1542
1489
|
/** Compose coordinator-owned modal surfaces into the dashboard's single frame overlay. */
|
|
@@ -1915,6 +1862,20 @@ export function renderDashboardStatusLines(input: Omit<DashboardStatusLinesInput
|
|
|
1915
1862
|
return buildDashboardStatusLines({ ...input, seatsNow });
|
|
1916
1863
|
}
|
|
1917
1864
|
|
|
1865
|
+
/** The pending-input registry is process-local; a remote ACP loop cannot drain it. */
|
|
1866
|
+
export function activeDashboardTypeaheadSessionId(acpSessionId: string | null, daemonAttached: boolean): string | null {
|
|
1867
|
+
return daemonAttached ? null : acpSessionId;
|
|
1868
|
+
}
|
|
1869
|
+
|
|
1870
|
+
/** The streaming keyboard's production typeahead transition. */
|
|
1871
|
+
export function applyDashboardStreamingTypeaheadKey(
|
|
1872
|
+
state: Parameters<typeof applyTurnTypeaheadKey>[0],
|
|
1873
|
+
key: Parameters<typeof applyTurnTypeaheadKey>[1],
|
|
1874
|
+
isImmediate: Parameters<typeof applyTurnTypeaheadKey>[2],
|
|
1875
|
+
): ReturnType<typeof applyTurnTypeaheadKey> {
|
|
1876
|
+
return applyTurnTypeaheadKey(state, key, isImmediate);
|
|
1877
|
+
}
|
|
1878
|
+
|
|
1918
1879
|
export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<DashboardAction> {
|
|
1919
1880
|
let firstDashboardFrameRendered = false;
|
|
1920
1881
|
await awaitGlobalPersonaLoad().catch(() => {});
|
|
@@ -3404,6 +3365,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3404
3365
|
getCwd: () => workingDir.cwd,
|
|
3405
3366
|
notify: (line) => { chatLines.push(C.muted(line)); draw(); },
|
|
3406
3367
|
});
|
|
3368
|
+
// Set only by the failed-turn callback and consumed by that turn's streaming cleanup.
|
|
3369
|
+
let autowakeTurnFailureRaw: string | null = null;
|
|
3407
3370
|
const internalTurnYieldPort = wrapAgentWakePort(seatAutowake.wrapPort(internalTurnGate.port));
|
|
3408
3371
|
// ⭐ H5 자기 예약 깨움(TUI-H5-SCHEDULE-WAKEUP) — 프로세스 안 타이머가 그 시각에 H2 문으로 한 턴을 청한다.
|
|
3409
3372
|
// 직전 회차 판정 = 그 예약이 연 내부 턴이 아직 도나. 도구 등록은 아래 host tool 자리(하니스 자식 제외).
|
|
@@ -3416,7 +3379,6 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3416
3379
|
const acpSessionIdRef: { current: string | null } = { current: null };
|
|
3417
3380
|
const adoptedAcpSessionIds = new Set<string>();
|
|
3418
3381
|
let activeAcpSessionId: string | null = null;
|
|
3419
|
-
const activeSessionIdForTypeahead = (): string | null => acpSessionIdRef.current;
|
|
3420
3382
|
const paintTurnTypeaheadEcho = (): void => {
|
|
3421
3383
|
const { rows: tr, cols: tc } = termSize();
|
|
3422
3384
|
const pf = currentPromptFrame(tr);
|
|
@@ -6857,7 +6819,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6857
6819
|
} catch { /* 승격 실패가 스트리밍을 막지 않는다 */ }
|
|
6858
6820
|
return 'consumed';
|
|
6859
6821
|
}
|
|
6860
|
-
const r =
|
|
6822
|
+
const r = applyDashboardStreamingTypeaheadKey(turnTypeaheadRef.state, k, isStreamingImmediateSlash);
|
|
6861
6823
|
if (r.consumed) {
|
|
6862
6824
|
turnTypeaheadRef.state = r.state;
|
|
6863
6825
|
if (r.submissionDisposition) {
|
|
@@ -6873,7 +6835,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6873
6835
|
// ⛔ H2 — 내부 턴 중의 사람 입력은 그 턴에 끼워 넣지 않는다(턴 끝 FIFO 로 기다린다).
|
|
6874
6836
|
if (r.submissionDisposition === 'fifo' && !r.immediateSubmission && !internalTurnGate.isInternalTurnActive()) {
|
|
6875
6837
|
const queuedText = turnTypeaheadRef.state.queuedSubmissions.at(-1);
|
|
6876
|
-
const sid =
|
|
6838
|
+
const sid = activeDashboardTypeaheadSessionId(acpSessionIdRef.current, daemonAttached);
|
|
6877
6839
|
if (queuedText && sid) {
|
|
6878
6840
|
const queuedHistoryEntry = inputHistoryStore.record({
|
|
6879
6841
|
text: queuedText,
|
|
@@ -7165,7 +7127,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7165
7127
|
userScrolledDuringStream = false;
|
|
7166
7128
|
streamingInFlight = false;
|
|
7167
7129
|
reportTuiTurn('idle');
|
|
7168
|
-
|
|
7130
|
+
const failedTurnRaw = autowakeTurnFailureRaw;
|
|
7131
|
+
autowakeTurnFailureRaw = null;
|
|
7132
|
+
seatAutowake.noteTurnEnded({ sessionId: currentChatPersonaSessionId(), lastLine: chatLines.at(-1) ?? '', errorDetail: failedTurnRaw ?? undefined });
|
|
7169
7133
|
}
|
|
7170
7134
|
};
|
|
7171
7135
|
};
|
|
@@ -18570,6 +18534,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18570
18534
|
settleEscAbortToolCall(escAbortToolState, toolCall);
|
|
18571
18535
|
escHarnessSpacesByCallId.delete(toolCall.id);
|
|
18572
18536
|
},
|
|
18537
|
+
onThought: (text) => {
|
|
18538
|
+
turnStreamRuntime.onThought?.(text);
|
|
18539
|
+
draw();
|
|
18540
|
+
},
|
|
18573
18541
|
};
|
|
18574
18542
|
},
|
|
18575
18543
|
runTurnUsageRuntime: (usage) => {
|
|
@@ -18690,6 +18658,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18690
18658
|
warningLine: (message) => C.warning(`${ICONS.warning} ${message}`),
|
|
18691
18659
|
pushErrorLine: (message) => { chatLines.push(C.error(`Error: ${message}`)); },
|
|
18692
18660
|
pushFailureNotice: (notice, raw) => {
|
|
18661
|
+
autowakeTurnFailureRaw = raw;
|
|
18693
18662
|
chatLines.push(C.warning(notice));
|
|
18694
18663
|
detailViewerRuntime.stage('turn error', raw.split(/\r?\n/));
|
|
18695
18664
|
},
|