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
|
@@ -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/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');
|
|
@@ -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
|
}
|
package/src/cli/pr-cli.ts
CHANGED
|
@@ -58,10 +58,11 @@ import { branchLineageSlug, findSiblingPrs } from './pr-lineage.js';
|
|
|
58
58
|
import { parseReleaseNoteSection } from '../release-loop/release-note.js';
|
|
59
59
|
import { landingFreezeMessage } from '../release-loop/landing-freeze.js';
|
|
60
60
|
import { admitLandingMerge } from '../self-implement/frozen-merges.js';
|
|
61
|
-
import { verifyAllSameHeadReviews, verifyAncestorAutoPass, verifyOverlapEvidence, verifyOverlapEvidenceVirtualRebase } from './pr-land-overlap-evidence.js';
|
|
61
|
+
import { resolveOverlapEvidencePath, verifyAllSameHeadReviews, verifyAncestorAutoPass, verifyOverlapEvidence, verifyOverlapEvidenceVirtualRebase } from './pr-land-overlap-evidence.js';
|
|
62
62
|
import type { VerifyOverlapEvidenceInput } from './pr-land-overlap-evidence.js';
|
|
63
63
|
import { verifyVirtualRebasePatch } from './pr-land-virtual-rebase.js';
|
|
64
64
|
import { observeDirectPrLandRefusal, observePrLandRefusal } from './pr-land-refusal.js';
|
|
65
|
+
import { planPrLandRecovery } from './pr-land-recovery.js';
|
|
65
66
|
import { ensurePrLandHeavyRemote, type HeavyRemoteInput, type HeavyRemoteResult } from './pr-land-heavy-remote.js';
|
|
66
67
|
import { readPrBaseNameWithRetry } from './pr-land-base-read.js';
|
|
67
68
|
import { runHeavyOnPodShadow } from './pr-land-pod-shadow.js';
|
|
@@ -117,6 +118,8 @@ export const PR_LAND_MERGEABLE_UNKNOWN_WAIT_MS = 5_000;
|
|
|
117
118
|
|
|
118
119
|
export interface PrLandDeps {
|
|
119
120
|
manager?: PrManager;
|
|
121
|
+
/** Confirmed merge cleanup; failures are observed and never undo the merge. */
|
|
122
|
+
onMergedSupersede?: (number: number, cwd: string) => Promise<void>;
|
|
120
123
|
/** 병합 재시도 사이 대기(시험 주입용 · 기본 실제 대기). */
|
|
121
124
|
sleep?: (ms: number) => Promise<void>;
|
|
122
125
|
run?: CmdRunner;
|
|
@@ -271,14 +274,14 @@ export async function decideOverlapLanding(input: {
|
|
|
271
274
|
|
|
272
275
|
const liveOut = { log: (message: string) => console.log(message), error: (message: string) => console.error(message) };
|
|
273
276
|
|
|
274
|
-
function runPrLandTypecheckGate(out: { log: (message: string) => void; error: (message: string) => void }, cwd: string
|
|
277
|
+
function runPrLandTypecheckGate(out: { log: (message: string) => void; error: (message: string) => void }, cwd: string): boolean {
|
|
275
278
|
let failed = false;
|
|
276
279
|
const exit = ((code: number): never => {
|
|
277
280
|
failed = code !== 0;
|
|
278
281
|
throw new Error(`ci-typecheck-changed exited ${code}`);
|
|
279
282
|
});
|
|
280
283
|
try {
|
|
281
|
-
runChangedTypecheckGate({ log: out.log, warn: out.error, error: out.error, exit, cwd });
|
|
284
|
+
runChangedTypecheckGate({ log: out.log, warn: out.error, error: out.error, exit, cwd: resolve(cwd), allowMissingCheckoutDependencies: true });
|
|
282
285
|
} catch (error) {
|
|
283
286
|
if (!failed) throw error;
|
|
284
287
|
}
|
|
@@ -1087,7 +1090,7 @@ export function verifyPinnedOverlapDecision(input: {
|
|
|
1087
1090
|
if (decision === 'unavailable' && opts.overlapEvidence !== undefined) {
|
|
1088
1091
|
const ref = resolveRemoteBranchRef(run, cwd, base);
|
|
1089
1092
|
const evidenceInput: VerifyOverlapEvidenceInput = {
|
|
1090
|
-
evidencePath: opts.overlapEvidence, pr: Number(opts.pr), expectedHead: opts.expectedHead!,
|
|
1093
|
+
evidencePath: resolveOverlapEvidencePath(opts.overlapEvidence, cwd), pr: Number(opts.pr), expectedHead: opts.expectedHead!,
|
|
1091
1094
|
remote: ref.remote, branch: ref.branch, cwd, run, readFile,
|
|
1092
1095
|
reviewResultsDir: deps.reviewResultsDir ?? join(dirname(taskAgentStatePath()), 'review-results'),
|
|
1093
1096
|
listDir: (dir) => readdirSync(dir), reviewMtime: (path) => statSync(path).mtimeMs,
|
|
@@ -1318,6 +1321,19 @@ export async function runPrLand(opts: PrLandOpts = {}, deps: PrLandDeps = {}): P
|
|
|
1318
1321
|
const refuse = (message: string, context: { isDraft?: boolean } = {}): void => {
|
|
1319
1322
|
out.error(message);
|
|
1320
1323
|
observePrLandRefusal(message, context);
|
|
1324
|
+
const pr = Number(opts.pr);
|
|
1325
|
+
if (Number.isSafeInteger(pr) && pr > 0 && opts.expectedHead) {
|
|
1326
|
+
try {
|
|
1327
|
+
const plan = planPrLandRecovery({ refusal: message, pr, head: opts.expectedHead, isDraft: context.isDraft });
|
|
1328
|
+
debug.log('pr.land', 'recover-shadow', {
|
|
1329
|
+
pr, head: opts.expectedHead, label: plan.evidence.label, route: plan.evidence.route,
|
|
1330
|
+
outcome: plan.outcome, action: plan.result.action, reason: plan.result.reason,
|
|
1331
|
+
delayMs: plan.result.delayMs ?? null, execution: 'none',
|
|
1332
|
+
});
|
|
1333
|
+
} catch {
|
|
1334
|
+
// Recovery observation must never replace the original landing refusal.
|
|
1335
|
+
}
|
|
1336
|
+
}
|
|
1321
1337
|
};
|
|
1322
1338
|
const refuseDirect = (message: string): void => {
|
|
1323
1339
|
out.error(message);
|
|
@@ -1885,14 +1901,22 @@ export async function runPrLand(opts: PrLandOpts = {}, deps: PrLandDeps = {}): P
|
|
|
1885
1901
|
const baseRead = await readPrBaseNameWithRetry({
|
|
1886
1902
|
pr: String(opts.pr), cwd, run,
|
|
1887
1903
|
sleep: deps.sleep ?? ((ms) => new Promise<void>((resolve) => setTimeout(resolve, ms))),
|
|
1904
|
+
onUnreadable: (attempt, stderr) => {
|
|
1905
|
+
if (stderr?.trim()) out.error(`⚠ heavy-remote: gh pr view base read attempt ${attempt}/3 stderr: ${stderr.trim()}`);
|
|
1906
|
+
},
|
|
1888
1907
|
});
|
|
1889
1908
|
const baseName = baseRead.baseRefName;
|
|
1890
1909
|
record('heavy-remote-pr-base-read', baseName !== null, {
|
|
1891
1910
|
pr: Number(opts.pr), baseRefName: baseName, attempts: baseRead.attempts,
|
|
1892
1911
|
});
|
|
1912
|
+
if (baseName === null) {
|
|
1913
|
+
record('heavy-remote-pr-base', false, { pr: Number(opts.pr), baseRefName: null, attempts: baseRead.attempts, reason: 'unreadable' });
|
|
1914
|
+
refuseDirect(`✗ heavy-remote: PR base 조회 불가 (${baseRead.attempts}회) — 통과한 head/main 쌍을 확인하지 못했다. 병합하지 않는다.`);
|
|
1915
|
+
return 1;
|
|
1916
|
+
}
|
|
1893
1917
|
if (baseName !== 'main') {
|
|
1894
|
-
record('heavy-remote-pr-base', false, { pr: Number(opts.pr), baseRefName: baseName, attempts: baseRead.attempts });
|
|
1895
|
-
refuseDirect(`✗ heavy-remote: PR base=${baseName
|
|
1918
|
+
record('heavy-remote-pr-base', false, { pr: Number(opts.pr), baseRefName: baseName, attempts: baseRead.attempts, reason: 'non-main' });
|
|
1919
|
+
refuseDirect(`✗ heavy-remote: PR base=${baseName} ≠ main — 재타기팅된 PR은 통과한 head/main 쌍이 아니다. 병합하지 않는다.`);
|
|
1896
1920
|
return 1;
|
|
1897
1921
|
}
|
|
1898
1922
|
return undefined;
|
|
@@ -1951,7 +1975,8 @@ export async function runPrLand(opts: PrLandOpts = {}, deps: PrLandDeps = {}): P
|
|
|
1951
1975
|
}
|
|
1952
1976
|
return recheckOverlapAtBase(currentBase);
|
|
1953
1977
|
};
|
|
1954
|
-
|
|
1978
|
+
// The production gate must receive this land invocation's --cwd, never the launching shell's cwd.
|
|
1979
|
+
const typecheckOk = opts.heavyRemote || (deps.runTypecheckGate ? deps.runTypecheckGate(out) : runPrLandTypecheckGate(out, cwd));
|
|
1955
1980
|
record('typecheck', typecheckOk);
|
|
1956
1981
|
if (!typecheckOk) {
|
|
1957
1982
|
// ⛔⭐ 「왜 막혔나」를 «단정하지 않는다» — 이 게이트는 불리언만 돌려주므로 여기서는 이유를 모른다.
|
|
@@ -2374,6 +2399,13 @@ export async function runPrLand(opts: PrLandOpts = {}, deps: PrLandDeps = {}): P
|
|
|
2374
2399
|
}
|
|
2375
2400
|
if (opts.forceFreeze) debug.log('release-loop.freeze', 'force-merge', { pr: prNumber, reason: opts.forceFreeze.trim() });
|
|
2376
2401
|
record('merge', true, { result: merged.kind, ...(merged.remoteBranchDeletion ? { remoteBranchDeletion: merged.remoteBranchDeletion.detail } : {}) });
|
|
2402
|
+
if (Number.isSafeInteger(prNumber) && prNumber > 0 && deps.onMergedSupersede) {
|
|
2403
|
+
try { await deps.onMergedSupersede(prNumber, cwd); }
|
|
2404
|
+
catch (error) {
|
|
2405
|
+
try { debug.log('drafts.cleanup', 'same-cell-hook-failed', { merged: prNumber, error: String(error) }, { level: 'warn' }); }
|
|
2406
|
+
catch { /* a cleanup observation cannot undo a confirmed merge */ }
|
|
2407
|
+
}
|
|
2408
|
+
}
|
|
2377
2409
|
// INFLIGHT-REGISTRY — 착지하면 비행 중 등록부의 그 런 줄을 지운다(색인 실패는 착지를 막지 않는다).
|
|
2378
2410
|
try {
|
|
2379
2411
|
const statePath = deps.taskStatePath ?? taskAgentStatePath();
|
|
@@ -2437,12 +2469,30 @@ export async function runPrLand(opts: PrLandOpts = {}, deps: PrLandDeps = {}): P
|
|
|
2437
2469
|
out.log(`✓ heavy-remote: post-merge host=${post.host ?? 'unknown'} head=${opts.expectedHead!.slice(0, 12)} main=${firstParent.slice(0, 12)} source=${post.source}`);
|
|
2438
2470
|
}
|
|
2439
2471
|
}
|
|
2440
|
-
const
|
|
2472
|
+
const finalBaseRead = upsert.reused && opts.heavyRemote
|
|
2473
|
+
? await readPrBaseNameWithRetry({
|
|
2474
|
+
pr: upsert.url, cwd, run,
|
|
2475
|
+
sleep: deps.sleep ?? ((ms) => new Promise<void>((resolve) => setTimeout(resolve, ms))),
|
|
2476
|
+
onUnreadable: (attempt, stderr) => {
|
|
2477
|
+
if (stderr?.trim()) out.error(`⚠ heavy-remote: final gh pr view base read attempt ${attempt}/3 stderr: ${stderr.trim()}`);
|
|
2478
|
+
},
|
|
2479
|
+
})
|
|
2480
|
+
: undefined;
|
|
2481
|
+
const baseRef = upsert.reused && !opts.heavyRemote
|
|
2441
2482
|
? run('gh', ['pr', 'view', upsert.url, '--json', 'baseRefName', '--jq', '.baseRefName'], { cwd })
|
|
2442
2483
|
: undefined;
|
|
2443
|
-
const landingBase =
|
|
2444
|
-
?
|
|
2445
|
-
:
|
|
2484
|
+
const landingBase = finalBaseRead
|
|
2485
|
+
? finalBaseRead.baseRefName ?? '<base unavailable>'
|
|
2486
|
+
: baseRef
|
|
2487
|
+
? (baseRef.ok && baseRef.out.trim() ? baseRef.out.trim() : '<base unavailable>')
|
|
2488
|
+
: base;
|
|
2489
|
+
if (finalBaseRead?.baseRefName && finalBaseRead.baseRefName !== 'main') {
|
|
2490
|
+
out.error(`✗ heavy-remote: PR base=${finalBaseRead.baseRefName} ≠ main — 병합된 base를 확인했습니다.`);
|
|
2491
|
+
return 1;
|
|
2492
|
+
}
|
|
2493
|
+
if (finalBaseRead?.baseRefName === null) {
|
|
2494
|
+
out.log(`⚠ heavy-remote: final PR base 조회 불가 (${finalBaseRead.attempts}회) — 병합 결과를 실패 처리하지 않습니다.`);
|
|
2495
|
+
}
|
|
2446
2496
|
out.log(`✓ merge: squash ${upsert.url} → ${landingBase}`);
|
|
2447
2497
|
if (landingBase === '<base unavailable>') {
|
|
2448
2498
|
out.log('⚠ local HEAD does not contain the landed result; the landed base is unavailable, so no branch command can be provided.');
|
|
@@ -2458,6 +2508,20 @@ export function registerPrCommands(program: Command, deps: PrLandDeps = {}, queu
|
|
|
2458
2508
|
const prToolRun = deps.run ?? defaultCmdRunner;
|
|
2459
2509
|
const prToolOut = deps.out ?? liveOut;
|
|
2460
2510
|
const prToolExit = deps.setExitCode ?? ((code: number) => { process.exitCode = code; });
|
|
2511
|
+
const supersedeMerged = deps.onMergedSupersede ?? (async (number: number, cwd: string): Promise<void> => {
|
|
2512
|
+
const { supersedeMergedGoalDrafts } = await import('../harness/harness-cli-command.js');
|
|
2513
|
+
await supersedeMergedGoalDrafts(number, cwd, undefined, undefined, { onlyExplicitSameCell: true });
|
|
2514
|
+
});
|
|
2515
|
+
pr.command('supersede-drafts')
|
|
2516
|
+
.description('확인된 병합 PR의 명시 Supersedes 같은 칸 draft만 정리')
|
|
2517
|
+
.requiredOption('--pr <number>', '병합 PR 번호')
|
|
2518
|
+
.option('--cwd <path>', '저장소 경로')
|
|
2519
|
+
.action(async (opts: { pr: string; cwd?: string }) => {
|
|
2520
|
+
const number = Number(opts.pr);
|
|
2521
|
+
if (!Number.isSafeInteger(number) || number < 1) { prToolOut.error('✗ supersede-drafts: 올바른 --pr 번호 필요'); prToolExit(1); return; }
|
|
2522
|
+
try { await supersedeMerged(number, opts.cwd ?? process.cwd()); }
|
|
2523
|
+
catch (error) { prToolOut.error(`✗ supersede-drafts: ${String(error)}`); prToolExit(1); }
|
|
2524
|
+
});
|
|
2461
2525
|
pr.command('census')
|
|
2462
2526
|
.description('열린 PR 전체·골 문서만·2일 무커밋 draft·미닫힌 superseded 집계')
|
|
2463
2527
|
.option('--cwd <path>', '저장소 경로')
|
|
@@ -2532,7 +2596,7 @@ export function registerPrCommands(program: Command, deps: PrLandDeps = {}, queu
|
|
|
2532
2596
|
const { registerStandaloneLogSink } = await import('../domains/standalone-log-sink.js');
|
|
2533
2597
|
await registerStandaloneLogSink('pr-land');
|
|
2534
2598
|
} catch { /* fail-open */ }
|
|
2535
|
-
const code = await runPrLand(opts, deps);
|
|
2599
|
+
const code = await runPrLand(opts, { ...deps, onMergedSupersede: supersedeMerged });
|
|
2536
2600
|
if (code !== 0) (deps.setExitCode ?? ((exitCode: number) => { process.exitCode = exitCode; }))(code);
|
|
2537
2601
|
});
|
|
2538
2602
|
pr.command('granularity')
|
|
@@ -14,6 +14,7 @@ export async function readPrBaseNameWithRetry(input: {
|
|
|
14
14
|
cwd: string;
|
|
15
15
|
run: CmdRunner;
|
|
16
16
|
sleep: (ms: number) => Promise<void>;
|
|
17
|
+
onUnreadable?: (attempt: number, stderr: string | undefined) => void;
|
|
17
18
|
}): Promise<PrBaseReadResult> {
|
|
18
19
|
for (let attempt = 1; attempt <= PR_LAND_BASE_READ_RETRIES + 1; attempt += 1) {
|
|
19
20
|
const viewed = input.run('gh', ['pr', 'view', input.pr, '--json', 'baseRefName,url'], { cwd: input.cwd });
|
|
@@ -28,6 +29,7 @@ export async function readPrBaseNameWithRetry(input: {
|
|
|
28
29
|
} catch { /* Retry unreadable responses; do not treat them as main. */ }
|
|
29
30
|
|
|
30
31
|
if (baseRefName !== null) return { baseRefName, attempts: attempt };
|
|
32
|
+
input.onUnreadable?.(attempt, viewed.err);
|
|
31
33
|
if (attempt <= PR_LAND_BASE_READ_RETRIES) await input.sleep(PR_LAND_BASE_READ_RETRY_DELAY_MS);
|
|
32
34
|
}
|
|
33
35
|
return { baseRefName: null, attempts: PR_LAND_BASE_READ_RETRIES + 1 };
|