elanous 0.2.31 → 0.2.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{LSXfY0u9QtfDbejY0Ukf_ → L04y73dlwKeTW-GetaTF3}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/1162.c69abda138c7ce43.js +79 -0
- package/apps/pwa/out/_next/static/chunks/1449-1fede62af84c3e43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1598-13fc845935e816df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1639.62c5e16fa20d242f.js +94 -0
- package/apps/pwa/out/_next/static/chunks/{4174.92ed04922709ac9e.js → 1644.35dd25240ae24e4b.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1661-adb8b2babc9aaf8c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2940-619bfd8ef337c611.js → 1895-60ed0e341c658bd4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5525.86debf231e181813.js → 2124.ed5bf480cea7f85b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2147.107c0fc6146fb15a.js +23 -0
- package/apps/pwa/out/_next/static/chunks/2202-ef1c9b000c3074fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2247.1e326638ee43e672.js +115 -0
- package/apps/pwa/out/_next/static/chunks/2268.56e1e3d58180abae.js +8 -0
- package/apps/pwa/out/_next/static/chunks/2469-606819c812414021.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6092.a7f99e68b188ca66.js → 2547.dd27303624cb4da8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2213.2ccbada92c33ea0f.js → 2554.3b5e200f5f5cfcd6.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/2593.e53c1620c0bb3599.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2690.e96671114222676a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2898-79ee1a5cc0cd9d13.js +1 -0
- package/apps/pwa/out/_next/static/chunks/298.26099a9f65e5c8ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5173-233188df2f42c626.js → 2987-30cf9c2eb7b8bdd5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2992.51fc2a7295bd8139.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3541-ce3a5424ed5ad7f1.js → 3001-5a52788c813b6113.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3014-291245fba9df7b5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3068.ee78201f0251a18d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3083.cd399a17e9365f78.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3103.84470c8445962f04.js +34 -0
- package/apps/pwa/out/_next/static/chunks/{6433.fc573af22bbc9ab7.js → 3110.0a7065f25c841818.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/3117-e1c474683fd1f824.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3121.779fafe3e44612c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3251-2c17bd5a91f8de2e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/326.3fb32322bb2ddf6d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3411-f87314c6c66ebc73.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6157.0c9af021de4fb31b.js → 3414.172ad4ca2d9b08e8.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3421-7ff7fbaa156985a7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4745.67d6f99c245af3f7.js → 3498.cf2a15a8a9e5b926.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/381.f55dc63ea87735e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3819.163d4777f0a597f6.js +32 -0
- package/apps/pwa/out/_next/static/chunks/{5543.a438b8ab5a13ea47.js → 3837.722e053fb9f321ad.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4129-ab0a6189f1778633.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4361.93d14ba594b3a035.js +104 -0
- package/apps/pwa/out/_next/static/chunks/4364.7a7eb19cceb67d2f.js +286 -0
- package/apps/pwa/out/_next/static/chunks/4406.d71f506f7c3ee9d3.js +149 -0
- package/apps/pwa/out/_next/static/chunks/4461.2ad1514180ae7e29.js +148 -0
- package/apps/pwa/out/_next/static/chunks/4479.bd309cbe0e3842ee.js +64 -0
- package/apps/pwa/out/_next/static/chunks/4522-05966f777d66d13b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4543-9a3e9812e845de65.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4557.f8f1d84a0d90d590.js +74 -0
- package/apps/pwa/out/_next/static/chunks/4589-79b11542179ef58c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4633-9f8f9f88ffbb8f5c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4831.23af4d10c0697b5e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4983.5951b85724f61f2a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b313b242.cb1265eea908db61.js → 4fa33ebd.21c1bd5b294496e6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{997ce8a5-2ad501927003b41b.js → 5014f970-22bef0b5210f7d60.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2112-e4efc21a6505d5bc.js → 5028-f0722e6114c313e7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2898.fd781bc7cf01a7b7.js → 5249.96a848656b582a93.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5311.16e0ffbfa5468b80.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{9407.e49124dedf0f5e72.js → 5446.edf141cff9ef647d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9002.e5658224e3dc1b6f.js → 5489.ec2dd1b5272a19dc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1335-6731f392c35216eb.js → 5576-82d3703636d5c4b9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/559.df87695df637920c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5618-5c88f2f70178c4ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5764.05487bf0b73ddb6b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5930.e678826c3f831aab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5dfb57f7.f2e3305326202474.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6053-d893974de92e6198.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2985.39ccdecd36848b12.js → 6086.913a69e6fa3e4a8b.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/6200-cefd6f33f59d765e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6314-edeba650ae686ac9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6316-bc9a9b74d7842d79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6476-13b9779b73528008.js +1 -0
- package/apps/pwa/out/_next/static/chunks/666-04db3ac4c8e3c66f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/670.682e55106ef915a6.js +77 -0
- package/apps/pwa/out/_next/static/chunks/{7862.30a8d6482bb238eb.js → 6740.43de73fc427c9fe2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6816.b7ba9d0a1a4a46a7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/690-fbbcc777f189af37.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6989.0d3d4020e5cb3df6.js +90 -0
- package/apps/pwa/out/_next/static/chunks/{2871.0bca6137343b3f76.js → 7005.1623d2aea78eb85f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7193-cf355cca5ba6c5d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7217-d17393fe7af78fa6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7232.24edbd938a69c8d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7295cd1e.b4b557908888eeee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7323.adb02de21991883c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7386.5d8e7e42e818dfb6.js +287 -0
- package/apps/pwa/out/_next/static/chunks/{7502.ccd5b8065545edd0.js → 7431.3051e9b8a4372d2d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{3583.a05e88cc8d594628.js → 7448.478958ffbbba0ac0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7537.ba2208c5c656b8a3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7562.948255cbc3e79d33.js +41 -0
- package/apps/pwa/out/_next/static/chunks/7596-962ae6db6cfc9c83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7671.cff51beac212a2ba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7883.3916734ee16d3e58.js +27 -0
- package/apps/pwa/out/_next/static/chunks/{9989.3694300e5f000b14.js → 7952.b192c31b6a0e00cc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/801.5b24e81eded22d1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8176.8c9a8613f5a01ac1.js +36 -0
- package/apps/pwa/out/_next/static/chunks/819e78a6.fa3dd7f7da19bf61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8220-78978450c3183d8d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8221-eb60b5bc692a3361.js +1 -0
- package/apps/pwa/out/_next/static/chunks/826.e9a26064f474949e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5307.60f2209e809bd627.js → 8368.014caa8de2f5af34.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8459-a351487a4480f584.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8482-75823d513a4ce151.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8488.8da515248cda3f3a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9221.7d22eaf353a2d4e7.js → 8548.036c344973968847.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8584.388a1779d9b203af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8637.a55e098e61ffefb8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8817.61bb7ffbba502ecb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9398-6aed28f0a96d0d6f.js → 9131-fce7256c4180c4a5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9207-8e6a12db30373f32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9263-00ae932c62696a86.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9318.caafc3a130e8769c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/932.da3fb55951882562.js +93 -0
- package/apps/pwa/out/_next/static/chunks/9433.002f8426ac75b6b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9464.dd631a5a14b1d660.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{3278.2e5d15b53a4091c8.js → 9550.d5f76828f972058c.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{2534.e85ae21ad0dac829.js → 9739.8d5f36ac67a3b236.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9743.beeabb9d5f86abe4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9843-a23d3f32dc43f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/994-28211077c7c587d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7a1887c4.f36b88fba31da8fd.js → 9a8cb466.cc9fc9e6e46038aa.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{0bb0ff36.b8d418980951e5ba.js → 9b48c871.204d5d13e7809bd0.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{409f1e57.d0649fc47691ebfe.js → abb4b98b.163e0f56e84ae35d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-3b4c947f174e33d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-369d5ce99483f859.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-63c0ed0eb26e5fce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-62802c6003bc85cc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ecb41560d4e77be9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-7b65ad8130c93e95.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8755477c15a9060c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-5725447dd972c471.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b979de0591a69375.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-6d0796bf4633751a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-59c31dc0394e67b4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-12dfc95f6cc5c718.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-25788244e66aa4dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-a2555dc705466322.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-4fb31eb476dcbad3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-3b4c947f174e33d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-578729adbeaa40cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a1d20fffbec35205.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-4a558f94516b8004.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-9e3834705b86145e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d7bff0f0905a662c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-cb1c5fe746ea4014.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-9ee320507356582a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66fd183b74835886.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-3272a064a01a9927.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-f281b7a7f6ef2529.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-d45a65f8b7124fcd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-e9c1fe684dd19a66.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-b8322932fc6e34de.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-82c66d9af2290575.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-63c6752009c97b05.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-bb33d42ebc358aec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-7e4c9379197d7214.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-38bf1e9a7001732b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-2e5b752012389d56.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-0a07363b130182a1.js → page-398c0faa173203f7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-002f53a965b6445c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-7f75997f61a26269.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-3b4c947f174e33d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-05631753294f23fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-edd700fd2cc3d7f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-105f83ecb4594365.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-5823e87d2017f19c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-df3445b207ceceab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-b51ca09566c03de7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-8aacd5ded5dbac60.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bae3365a0b3c6a8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ed52b48ff1aa7fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b6f8cad35fe00946.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6d25ceda500d2457.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-b6401a5f2c962fe8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/ebf6cf5e.0d2f887b040e80fb.js +122 -0
- package/apps/pwa/out/_next/static/chunks/f09ec7d7-d29abe23edcbb193.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{ebc7d829.264a0bcb6c750b50.js → ffdc3a04.b9c23c1b28dd4a96.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-9322cb8a56ac081c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-2fbab294e49a1561.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-f36729f56621a8f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-2a62e450b47c6114.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-5e17f7b445f34d43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-b4263e2190ea7adf.js +1 -0
- package/apps/pwa/out/_next/static/css/b5d88eba78a3d7bf.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +26 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/bin/elanous.mjs +9 -2
- package/docs/goal-context/README.md +1 -0
- package/graphs/default-loop.yaml +20 -3
- package/graphs/document-loop.yaml +21 -2
- package/graphs/implement-loop.yaml +11 -0
- package/graphs/journey/SCENARIOS.md +33 -0
- package/graphs/journey/recipes.yaml +1 -0
- package/graphs/journey/ta-journey.yaml +84 -0
- package/graphs/journey/units/author/author.yaml +20 -0
- package/graphs/journey/units/author/recipes.yaml +2 -0
- package/graphs/journey/units/green/green.yaml +20 -0
- package/graphs/journey/units/green/recipes.yaml +2 -0
- package/graphs/journey/units/pr/pr.yaml +20 -0
- package/graphs/journey/units/pr/recipes.yaml +2 -0
- package/graphs/journey/units/remember/recipes.yaml +2 -0
- package/graphs/journey/units/remember/remember.yaml +20 -0
- package/graphs/operate-loop.yaml +21 -2
- package/graphs/overlays/stop-heal-ladder.yaml +1 -1
- package/graphs/release-rehearsal/recipes.yaml +1 -1
- package/graphs/release-rehearsal/release-rehearsal.yaml +2 -2
- package/graphs/research-loop.yaml +23 -2
- package/graphs/units/dispatch-pod/dispatch-pod.yaml +50 -0
- package/graphs/units/dispatch-pod/recipes.yaml +14 -0
- package/graphs/units/entry/entry.yaml +50 -0
- package/graphs/units/entry/recipes.yaml +14 -0
- package/graphs/units/harvest/harvest.yaml +25 -0
- package/graphs/units/harvest/recipes.yaml +4 -0
- package/graphs/units/land/land.yaml +45 -0
- package/graphs/units/land/recipes.yaml +3 -0
- package/graphs/units/recipes.yaml +7 -0
- package/graphs/units/recover.yaml +39 -0
- package/graphs/units/reflect/recipes.yaml +3 -0
- package/graphs/units/reflect/reflect.yaml +15 -0
- package/graphs/units/task-agent-recover-review.yaml +17 -0
- package/graphs/units/task-agent-recover-wait.yaml +17 -0
- package/graphs/units/verbs/make-doc.yaml +34 -0
- package/graphs/units/verbs/recipes.yaml +33 -0
- package/graphs/units/verbs/verify.yaml +55 -0
- package/graphs/work/recipes.yaml +2 -0
- package/graphs/work/research-report.yaml +28 -0
- package/package.json +1 -1
- package/scripts/ci-typecheck-changed.ts +95 -17
- package/scripts/docs/generate-graph-anatomy.ts +19 -2
- package/scripts/graph-harvest-unit.ts +22 -0
- package/scripts/graph-units/journey-stub.ts +6 -0
- package/scripts/graph-units/land-enqueue.ts +78 -0
- package/scripts/graph-units/recover-plan.ts +15 -0
- package/scripts/graph-units/reflect-node.ts +88 -0
- package/scripts/graph-units/ta-journey-observe.ts +109 -0
- package/scripts/graph-units/verbs/headless-goal-loop.ts +152 -0
- package/scripts/graph-units/verbs/verify-stage.ts +75 -0
- package/scripts/graph-units/verbs-envelope.ts +139 -0
- package/scripts/hq/standby-snapshot.ts +25 -0
- package/scripts/measure-si-task-cpu.ts +143 -0
- package/scripts/public-export.ts +43 -1
- package/scripts/ratchets/test-interference-patterns.allowlist.txt +0 -2
- package/scripts/ratchets/train-side-invariants.sh +45 -0
- package/scripts/release-loop/auto-approve-node.ts +30 -16
- package/scripts/release-loop/gate-closure.ts +5 -1
- package/scripts/release-loop/gate-diff.ts +1 -1
- package/scripts/release-loop/gate-node.ts +498 -31
- package/scripts/release-loop/gate-partial.ts +3 -3
- package/scripts/release-loop/gate-radius-shadow.ts +138 -0
- package/scripts/release-loop/gate-traffic-mode.ts +128 -0
- package/scripts/release-loop/gate-triage-node.ts +5 -2
- package/scripts/release-loop/known-issues-0.2.33-approved.json +194 -0
- package/scripts/release-loop/known-issues-node.ts +77 -8
- package/scripts/release-loop/preflight.ts +93 -7
- package/scripts/release-loop/prepare-node.ts +102 -4
- package/scripts/release-loop/publish-node.ts +60 -9
- package/scripts/release-loop/resume-cap.ts +56 -0
- package/scripts/release-loop/resume-release.ts +114 -15
- package/scripts/release-loop/resume.ts +24 -1
- package/scripts/release-loop/tui-sim-node.ts +8 -2
- package/scripts/release-loop/unattended-release.ts +8 -2
- package/src/acp/core-turn-bridge.ts +36 -9
- package/src/acp/elanous-extensions.ts +3 -0
- package/src/acp/reasoning-thought-buffer.ts +45 -0
- package/src/acp/server.ts +3 -0
- package/src/acp/tool-trace.ts +186 -11
- package/src/agent/self-ambient-cache.ts +156 -0
- package/src/agent/self-ambient.ts +8 -1
- package/src/agent/task-notification.ts +5 -0
- package/src/agent-substrate/acp-reviewer.ts +52 -12
- package/src/agent-substrate/pr-reviewer.ts +3 -1
- package/src/agent-substrate/review-finding-key.ts +53 -0
- package/src/agent-substrate/self-review-cli.ts +126 -5
- package/src/ask-user-question/pending-questions.ts +1 -1
- package/src/ask-user-question/tool.ts +22 -0
- package/src/autopilot/build/llm-conflict-merge.ts +56 -10
- package/src/autopilot/pr-manager.ts +213 -46
- package/src/capture/frame-state-detect.ts +39 -0
- package/src/capture/tui-self-report.ts +134 -6
- package/src/chat/index.ts +61 -15
- package/src/chat/pickers/modal-runtime.ts +6 -0
- package/src/chat/pickers/modals.ts +8 -2
- package/src/chat/tool-render/dispatch.ts +62 -10
- package/src/cli/ask-bare.ts +1 -0
- package/src/cli/control-cli.ts +24 -7
- package/src/cli/guardian-cli.ts +10 -0
- package/src/cli/import-cli.ts +12 -0
- package/src/cli/light-entry-route.ts +35 -0
- package/src/cli/llm-detect-cli.ts +23 -1
- package/src/cli/log-event-names.ts +10 -0
- package/src/cli/msg-cli.ts +1 -0
- package/src/cli/pod-cli.ts +14 -3
- package/src/cli/pr-cli.ts +140 -41
- package/src/cli/pr-land-base-read.ts +36 -0
- package/src/cli/pr-land-heavy-remote.ts +81 -25
- package/src/cli/pr-land-overlap-evidence.ts +200 -18
- package/src/cli/pr-land-pod-shadow-job.ts +26 -3
- package/src/cli/pr-land-recovery.ts +64 -0
- package/src/cli/pr-land-refusal.ts +20 -5
- package/src/cli/pty-takeover-cli.ts +94 -19
- package/src/cli/release-cli.ts +120 -33
- package/src/cli/release-run-if-ready.ts +29 -28
- package/src/cli/release-single-flight.ts +178 -0
- package/src/cli/seat-cli.ts +37 -0
- package/src/cli/setup-cli.ts +40 -1
- package/src/cli/sim-cli.ts +18 -0
- package/src/cli/tasks-cli.ts +149 -5
- package/src/context-bus/ops-events.ts +6 -2
- package/src/control/control-status.ts +8 -3
- package/src/control-plane/ledger.ts +5 -3
- package/src/control-plane/server.ts +5 -3
- package/src/core-turn/run-core-turn.ts +1 -0
- package/src/core-turn/run-goal-loop.ts +21 -0
- package/src/core-turn/short-question.ts +5 -1
- package/src/core-turn/types.ts +3 -0
- package/src/dashboard/acp-active-model.ts +42 -1
- package/src/dashboard/background-jobs-status.ts +66 -0
- package/src/dashboard/index.ts +153 -111
- package/src/dashboard/input/agent-wake.ts +242 -0
- package/src/dashboard/input/chat-main-entry-runtime.ts +5 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +3 -0
- package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
- package/src/dashboard/input/external-input-host.ts +23 -9
- package/src/dashboard/input/mouse-wiring.ts +108 -11
- package/src/dashboard/input/seat-autowake.ts +56 -3
- package/src/dashboard/log-click-runtime.ts +118 -2
- package/src/dashboard/seat-boot-preamble.ts +1 -1
- package/src/dashboard/slash-runtime/ask-clarification.ts +48 -0
- package/src/dashboard/slash-runtime/dashboard-delegated-slashes.ts +68 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +62 -322
- package/src/dashboard/slash-runtime/dashboard-log-slash.ts +208 -0
- package/src/dashboard/turn-preamble.ts +163 -41
- package/src/dashboard/turn-session-layers.ts +4 -2
- package/src/dashboard/turn-start-segments.ts +222 -0
- package/src/dashboard/turn-stream-formatter.ts +34 -1
- package/src/dashboard/turn-stream-runtime.ts +2 -0
- package/src/dashboard/turn-typeahead-prompt-zone.ts +67 -0
- package/src/display/prompt-row-owner.ts +146 -0
- package/src/display/resize-listener.ts +33 -2
- package/src/domains/guardian-tick.ts +54 -2
- package/src/domains/outbound-alert.ts +3 -2
- package/src/extractors.ts +3 -1
- package/src/fold-stack.ts +4 -2
- package/src/git-fs/index.ts +263 -36
- package/src/git-fs/retry.ts +4 -0
- package/src/git-fs/runner.ts +2 -0
- package/src/graph-runner/runner.ts +114 -44
- package/src/grok/credential.ts +5 -0
- package/src/harness/gate-reserve.ts +87 -0
- package/src/harness/harness-cli-command.ts +39 -10
- package/src/harness/harness-incidents.ts +17 -0
- package/src/harness/harness-pod-dispatch.ts +38 -1
- package/src/harness/harness-queue.ts +15 -0
- package/src/harness/harness-salvage-cli.ts +14 -2
- package/src/index.ts +198 -12
- package/src/input/external-input-queue.ts +34 -9
- package/src/intake-plane/already-built-hint.ts +89 -0
- package/src/knowhow/pack.ts +199 -0
- package/src/light-cli.ts +95 -0
- package/src/llm/route-decision.ts +36 -0
- package/src/llm/tool-loop-steered-rejection.ts +8 -0
- package/src/llm-request-shape.ts +209 -0
- package/src/llm.ts +221 -276
- package/src/loops/budget.ts +95 -0
- package/src/loops/msg-wake.ts +8 -2
- package/src/loops/orchestrator/tick.ts +24 -2
- package/src/loops/orchestrator/traffic.ts +132 -1
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/mss/logging/log-store.ts +4 -5
- package/src/mss/logging/render-categories.ts +5 -0
- package/src/nexus/api/graphs-api.ts +22 -3
- package/src/nexus/api/http-server.ts +1 -1
- package/src/nexus/api/ops-api.ts +12 -0
- package/src/oauth/claude-pty-maturity.ts +66 -0
- package/src/oauth/codex-access-mirror.ts +55 -0
- package/src/oauth/fallback-chain.ts +1 -1
- package/src/onboarding/first-run.ts +5 -3
- package/src/onboarding/non-interactive.ts +64 -13
- package/src/onboarding.ts +10 -2
- package/src/ops/overview-collect.ts +36 -1
- package/src/ops/overview.ts +70 -2
- package/src/pr-tool/census.ts +41 -8
- package/src/pr-tool/inflight-registry.ts +296 -0
- package/src/prompt-library/gpt6-family-addendum.ts +14 -1
- package/src/pty-shell/herdr-agent-report.ts +442 -0
- package/src/pty-shell/pty-control-ipc.ts +5 -5
- package/src/pty-shell/pty-manifest.ts +12 -3
- package/src/pty-shell/pty-write-outcome.ts +24 -6
- package/src/pty-shell/tui-run-state.ts +151 -6
- package/src/release-loop/checklist.ts +79 -5
- package/src/release-loop/feature-store.ts +19 -2
- package/src/release-loop/placement.ts +10 -3
- package/src/release-loop/rehearsal.ts +205 -25
- package/src/release-loop/rubric.ts +16 -2
- package/src/seat-loop/traffic-signal.ts +2 -1
- package/src/self-dev/ask-launch-flow.ts +13 -0
- package/src/self-dev/draft-residue.ts +243 -24
- package/src/self-dev/draft-sweep.ts +52 -3
- package/src/self-dev/graph-journey-nodes.ts +10 -6
- package/src/self-dev/graph-journey-route.ts +60 -6
- package/src/self-dev/orchestrate.ts +79 -3
- package/src/self-dev/run-supervisor.ts +107 -12
- package/src/self-dev/run-types.ts +5 -1
- package/src/self-dev/shard-plan.ts +11 -3
- package/src/self-dev/shard-run.ts +103 -10
- package/src/self-implement/elanous-tui-spawn.ts +14 -0
- package/src/self-implement/follow-up-placement.ts +79 -0
- package/src/self-implement/gate-artifacts.ts +15 -4
- package/src/self-implement/gate-baseline.ts +145 -10
- package/src/self-implement/gate-cli.ts +7 -2
- package/src/self-implement/gate-remote.ts +35 -6
- package/src/self-implement/goal-author-identity.ts +66 -0
- package/src/self-implement/goal-author-preservation-obligation.ts +35 -0
- package/src/self-implement/goal-author.ts +4 -120
- package/src/self-implement/graph-overlay-yaml.ts +17 -2
- package/src/self-implement/graph-unit-flatten.ts +103 -0
- package/src/self-implement/graph-unit-resolver.ts +107 -0
- package/src/self-implement/graph-yaml.ts +151 -1
- package/src/self-implement/headless-elanous-driver.ts +1 -0
- package/src/self-implement/host-regate.ts +36 -4
- package/src/self-implement/knowhow-pack.ts +103 -0
- package/src/self-implement/orchestrator.ts +109 -11
- package/src/self-implement/pod-warm-pool-profile.ts +45 -0
- package/src/self-implement/review-mustfix-class.ts +203 -0
- package/src/self-implement/run-ledger.ts +16 -14
- package/src/self-implement/run-stop.ts +8 -2
- package/src/self-implement/seams.ts +32 -1
- package/src/self-implement/stop-autoheal.ts +25 -1
- package/src/session/chat.ts +27 -0
- package/src/session-runtime/index.ts +22 -267
- package/src/session-runtime/retry-policy.ts +2 -1
- package/src/shell-runner/background-surface.ts +15 -5
- package/src/skills/tools/agent.ts +39 -6
- package/src/skills/tools/list-dir.ts +11 -0
- package/src/skills/tools/schedule-wakeup.ts +457 -0
- package/src/skills/tools/shell.ts +245 -3
- package/src/status/bar.ts +26 -0
- package/src/steward/digest-delivery.ts +118 -0
- package/src/steward/hold-hygiene.ts +120 -0
- package/src/steward/release-day.ts +7 -3
- package/src/steward/triage.ts +47 -4
- package/src/surface/shell-runner-boot.ts +5 -2
- package/src/task-agent/harvest-unit.ts +141 -0
- package/src/task-agent/live-moves.ts +98 -12
- package/src/task-agent/parent-host.ts +93 -3
- package/src/task-agent/postland-card.ts +80 -1
- package/src/task-agent/rejudge-on-head.ts +112 -26
- package/src/task-agent/repair-branch-cas.ts +4 -1
- package/src/task-agent/repair-cycle.ts +16 -3
- package/src/task-agent/run-identity.ts +4 -3
- package/src/task-agent/shadow.ts +12 -2
- package/src/task-agent/task-hand.ts +76 -5
- package/src/task-agent/work-order-build.ts +22 -0
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +39 -3
- package/src/task-orchestrator/surfaces/pod-command-job.ts +67 -12
- package/src/task-orchestrator/surfaces/pod-lease.ts +98 -0
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +86 -8
- package/src/task-orchestrator/surfaces/pod-pool.ts +76 -18
- package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +10 -6
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +54 -4
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +548 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +389 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runner.ts +90 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +158 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +230 -43
- package/src/task-orchestrator/surfaces/self-implement.ts +83 -2
- package/src/tool-runtime/truncation-store.ts +4 -0
- package/src/tui/chat/execution-badge.ts +5 -1
- package/src/tui/input-lag-probe.ts +230 -0
- package/src/tui-client/dashboard-session.ts +10 -1
- package/src/tui.ts +4 -0
- package/src/user-config/coercion.ts +36 -0
- package/src/user-config.ts +18 -41
- package/src/ux-sim/scenario.ts +314 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +0 -287
- package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +0 -62
- package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1654.32de4b324981a188.js +0 -23
- package/apps/pwa/out/_next/static/chunks/1834-50625904996a8fa8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +0 -149
- package/apps/pwa/out/_next/static/chunks/1913.7cc6fb6055b1ed3f.js +0 -41
- package/apps/pwa/out/_next/static/chunks/2001.6c7e0fd02190886c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +0 -115
- package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +0 -64
- package/apps/pwa/out/_next/static/chunks/3267c0e6.d34854e7b3984a6e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3902.e1e71aaac850a045.js +0 -34
- package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4111.2bfedbb233ad206b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +0 -36
- package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +0 -77
- package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4999.c064a4000c2a9e94.js +0 -79
- package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5304.04d24756f242a094.js +0 -148
- package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5458-16cd7a2b51b74c8c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +0 -94
- package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/60fb96c9.360b01d8d4927b7b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6323.8672b4817a306928.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +0 -90
- package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +0 -32
- package/apps/pwa/out/_next/static/chunks/6544cb48.a87fe20ddf137be2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +0 -104
- package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6767.ea607cf0c20a25af.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +0 -93
- package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7371.80c05c653b08e907.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7391.ebae168025c91b6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +0 -8
- package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7947-d0759430f8042240.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8018.a32663f04a6fc5f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8097-92f87bd108322f66.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +0 -1
- package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9138.b6e80031afb1d973.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9279-d28c5b7754d010ae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-bf3634a117322df7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-3535a4a69f1fafaa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-b9f51447f757fbf2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-2ebb8fd59b9461f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-a2fc4e49a4fa4ba8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-5a503541353e60a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-6025101384e361a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f4b630cc8b5273cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-a645f00a06483e9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-61ac22cbab1ee4ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e9bab7413b028b28.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c992eafe028b642e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-e547e6ce55f1fb33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-d27e1b9850fd54bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-805ac2e137b7a121.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-0fec29c7ba01894b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-339a07410cd6f36b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-349f2752d8cd37ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d5c6dcf31c25cecc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2fd93ed8c9f16580.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-9b564dbff0fefc35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-62f4475d3c38fb9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-814ba51385225776.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-397d479626e5a459.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-af1bba4e3251b728.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ad3be5e7d3fdce9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-f219ccdbc0bf27df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4da93ad35d4a8d28.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-456666766e5ce6fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7404e377e8adb8c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-14456240ed2a36ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-3a658d5fa6d16a25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-0157de6e85f8bb6b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-841d73d4ac44ed49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6f43a3d1146e6377.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-521ee23ac8c0abfa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9992ee285efaa83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-3d48e85fa89ec04f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d2ced71132fac9b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-f08358bdf251adb9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-233c71cd5f68f0d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-70151d78de2f375e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-dcac33a3e2cb72c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-149dc1caba411bb9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0448145ccd5c45c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-9cb0c444903da65d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-17e504c396e0e389.js +0 -1
- package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +0 -122
- package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +0 -1
- package/apps/pwa/out/_next/static/css/3f5fc6f96e2cf7b2.css +0 -1
- package/src/cli/g6a-registration-probe.ts +0 -16
- /package/apps/pwa/out/_next/static/{LSXfY0u9QtfDbejY0Ukf_ → L04y73dlwKeTW-GetaTF3}/_ssgManifest.js +0 -0
|
@@ -9,7 +9,7 @@ import { appendRunLedgerEntry, listRunLedgers, loadRunLedger, runLedgerDir, type
|
|
|
9
9
|
import { queryRunningRuns } from '../self-implement/running-runs.js';
|
|
10
10
|
import { clipRegateDetail, regateFailureFacts, type HostRegateFailure } from '../self-implement/regate-detail.js';
|
|
11
11
|
import { DRAFT_SWEEP_CLOSE_CAP } from './draft-sweep.js';
|
|
12
|
-
import { PROTECTED_LABELS,
|
|
12
|
+
import { PROTECTED_LABELS, type DraftTriagePr } from './draft-triage-rules.js';
|
|
13
13
|
|
|
14
14
|
export type PodTerminalClass = 'landed' | 'merge-ready-not-merged' | 'failed-with-pr' | 'failed-no-pr' | 'failed-pr-unobserved' | 'timed-out-harvestable';
|
|
15
15
|
export interface PrTerminalRecord {
|
|
@@ -43,7 +43,26 @@ export interface PodTerminalInput {
|
|
|
43
43
|
at?: string;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
function cardOf(text?: string): string | null {
|
|
47
|
+
const lines = (text ?? '').split(/\r?\n/).filter((line) => line.startsWith('칸:'));
|
|
48
|
+
if (lines.length !== 1) return null;
|
|
49
|
+
const slot = lines[0]!.slice('칸:'.length).trim();
|
|
50
|
+
// A blank marker cannot borrow an ID from the following line. Duplicate markers are
|
|
51
|
+
// ambiguous even when they happen to name the same card.
|
|
52
|
+
return slot && !/\s/.test(slot) ? slot : null;
|
|
53
|
+
}
|
|
54
|
+
const validCardSlot = (text: string | null): text is string => !!text && /^[A-Z][A-Z0-9]*(?:-[A-Z0-9]+)+$/.test(text);
|
|
55
|
+
const goalLineage = (pr: ResiduePr): string | undefined =>
|
|
56
|
+
/(?:^|[-/])goalid-([a-f0-9]+)(?=-|\/|$)/i.exec(pr.branch)?.[1]?.toLowerCase()
|
|
57
|
+
?? /^골(?: ID)?:\s*(\S.*?)\s*$/m.exec(pr.body ?? '')?.[1];
|
|
58
|
+
const hasCodeDiff = (paths: readonly string[]): boolean => paths.some((path) =>
|
|
59
|
+
!path.startsWith('docs/') && (
|
|
60
|
+
/\.(?:[cm]?[jt]sx?|py|sh|bash|zsh|rs|go|c|cc|cpp|h|hpp|java|kt|swift|rb|php|lua|sql)$/.test(path)
|
|
61
|
+
|| /(?:^|\/)(?:Dockerfile|Containerfile|Makefile)(?:\.[^/]*)?$/.test(path)
|
|
62
|
+
|| (path.startsWith('graphs/') && /\.ya?ml$/.test(path))));
|
|
63
|
+
function sameCardSlot(previous: ResiduePr, current: ResiduePr, slot: string): boolean {
|
|
64
|
+
return cardOf(previous.body) === slot && cardOf(current.body) === slot;
|
|
65
|
+
}
|
|
47
66
|
const harvestable = PR_LABELS.find((label) => label.name === 'elanous:harvestable')!.name;
|
|
48
67
|
const superseded = PR_LABELS.find((label) => label.name === 'elanous:superseded')!.name;
|
|
49
68
|
|
|
@@ -83,6 +102,8 @@ export function classifyPodTerminal(input: PodTerminalInput): PrTerminalRecord {
|
|
|
83
102
|
export interface ResiduePr extends DraftTriagePr {
|
|
84
103
|
createdAt: string;
|
|
85
104
|
labels: readonly string[];
|
|
105
|
+
headSha?: string;
|
|
106
|
+
isDraft?: boolean;
|
|
86
107
|
body?: string;
|
|
87
108
|
comments?: readonly string[];
|
|
88
109
|
/** GitHub PR state at lookup time (review r8) — absent only from injected inventories. */
|
|
@@ -92,8 +113,12 @@ export interface DraftResidueAdapters {
|
|
|
92
113
|
loadLedger(runId: string, ledgerDir: string): readonly RunLedgerEntry[] | null;
|
|
93
114
|
appendLedger(entry: RunLedgerEntry, ledgerDir: string): void;
|
|
94
115
|
getPr(number: number): Promise<ResiduePr | undefined> | ResiduePr | undefined;
|
|
116
|
+
/** Return all issue comments only after pagination completes; undefined means completeness is unknown. */
|
|
117
|
+
getAllComments?(repository: string, number: number): Promise<readonly string[] | undefined> | readonly string[] | undefined;
|
|
95
118
|
/** Undefined means the open-draft inventory could not be observed («못 셌음») — never a disguised zero count. */
|
|
96
119
|
listOpenDrafts(repository: string): Promise<readonly ResiduePr[] | undefined> | readonly ResiduePr[] | undefined;
|
|
120
|
+
/** Complete changed-path inventory for the newly opened PR; undefined is unmeasured. */
|
|
121
|
+
listPrChangedPaths?(repository: string, number: number): Promise<readonly string[] | undefined> | readonly string[] | undefined;
|
|
97
122
|
addLabel(repository: string, number: number, label: string): Promise<void> | void;
|
|
98
123
|
setLabels(repository: string, number: number, change: { add: string; remove: readonly string[] }): Promise<void> | void;
|
|
99
124
|
comment(repository: string, number: number, body: string): Promise<void> | void;
|
|
@@ -125,9 +150,9 @@ function gh(args: string[]): string {
|
|
|
125
150
|
if (result.status !== 0) throw new Error((result.stderr || result.error?.message || `gh exited ${result.status}`).trim().slice(0, 200));
|
|
126
151
|
return result.stdout.trim();
|
|
127
152
|
}
|
|
128
|
-
function ghPr(row: { number: number; title: string; headRefName: string; createdAt: string; body: string; labels: Array<{ name: string }>; comments?: Array<{ body: string }>; state?: string }): ResiduePr {
|
|
153
|
+
function ghPr(row: { number: number; title: string; headRefName: string; headRefOid?: string; isDraft?: boolean; createdAt: string; body: string; labels: Array<{ name: string }>; comments?: Array<{ body: string }>; state?: string }): ResiduePr {
|
|
129
154
|
const state = row.state === 'OPEN' || row.state === 'CLOSED' || row.state === 'MERGED' ? row.state : undefined;
|
|
130
|
-
return { number: row.number, title: row.title, branch: row.headRefName, createdAt: row.createdAt, body: row.body,
|
|
155
|
+
return { number: row.number, title: row.title, branch: row.headRefName, headSha: row.headRefOid, isDraft: row.isDraft, createdAt: row.createdAt, body: row.body,
|
|
131
156
|
labels: row.labels.map((label) => label.name), comments: row.comments?.map((comment) => comment.body), ...(state ? { state } : {}) };
|
|
132
157
|
}
|
|
133
158
|
/** Where the default `getRunStatus` reads run facts. Production reads the federated host ledgers and the running-runs
|
|
@@ -174,11 +199,22 @@ export function residueRunStatus(draft: Pick<ResiduePr, 'number'>, repository: s
|
|
|
174
199
|
}
|
|
175
200
|
|
|
176
201
|
export function defaultAdapters(sources: ResidueRunStatusSources = defaultRunStatusSources): DraftResidueAdapters {
|
|
177
|
-
const fields = 'number,title,headRefName,createdAt,body,labels,comments,state';
|
|
202
|
+
const fields = 'number,title,headRefName,headRefOid,isDraft,createdAt,body,labels,comments,state';
|
|
178
203
|
return {
|
|
179
204
|
loadLedger: loadRunLedger,
|
|
180
205
|
appendLedger: appendRunLedgerEntry,
|
|
181
206
|
getPr: (number) => ghPr(JSON.parse(gh(['pr', 'view', String(number), '-R', hostRepository() ?? '', '--json', fields]))),
|
|
207
|
+
getAllComments: (repository, number) => {
|
|
208
|
+
try {
|
|
209
|
+
const pages: unknown = JSON.parse(gh(['api', `repos/${repository}/issues/${number}/comments?per_page=100`, '--paginate', '--slurp']));
|
|
210
|
+
if (!Array.isArray(pages) || !pages.every((page) => Array.isArray(page)
|
|
211
|
+
&& page.every((row: unknown) => !!row && typeof row === 'object' && typeof (row as { body?: unknown }).body === 'string'))) return undefined;
|
|
212
|
+
return (pages as Array<Array<{ body: string }>>).flat().map((row) => row.body);
|
|
213
|
+
} catch (error) {
|
|
214
|
+
debug.log('draft.residue', 'comments-unobserved', { repository, number, reason: error instanceof Error ? error.message : String(error) });
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
},
|
|
182
218
|
listOpenDrafts: (repository) => {
|
|
183
219
|
const rows: ResiduePr[] = [];
|
|
184
220
|
try {
|
|
@@ -198,8 +234,19 @@ export function defaultAdapters(sources: ResidueRunStatusSources = defaultRunSta
|
|
|
198
234
|
return undefined;
|
|
199
235
|
}
|
|
200
236
|
},
|
|
237
|
+
listPrChangedPaths: (repository, number) => {
|
|
238
|
+
try {
|
|
239
|
+
const pages: unknown = JSON.parse(gh(['api', `repos/${repository}/pulls/${number}/files?per_page=100`, '--paginate', '--slurp']));
|
|
240
|
+
if (!Array.isArray(pages) || !pages.every((page) => Array.isArray(page)
|
|
241
|
+
&& page.every((row: unknown) => !!row && typeof row === 'object' && typeof (row as { filename?: unknown }).filename === 'string'))) return undefined;
|
|
242
|
+
return (pages as Array<Array<{ filename: string }>>).flat().map((row) => row.filename);
|
|
243
|
+
} catch { return undefined; }
|
|
244
|
+
},
|
|
201
245
|
addLabel: (repository, number, label) => { gh(['pr', 'edit', String(number), '-R', repository, '--add-label', label]); },
|
|
202
|
-
setLabels: (repository, number, change) => {
|
|
246
|
+
setLabels: (repository, number, change) => {
|
|
247
|
+
const flags = [...(change.add ? ['--add-label', change.add] : []), ...change.remove.flatMap((label) => ['--remove-label', label])];
|
|
248
|
+
if (flags.length) gh(['pr', 'edit', String(number), '-R', repository, ...flags]);
|
|
249
|
+
},
|
|
203
250
|
comment: (repository, number, body) => { gh(['pr', 'comment', String(number), '-R', repository, '--body', body]); },
|
|
204
251
|
closePr: (repository, number) => { gh(['pr', 'close', String(number), '-R', repository]); },
|
|
205
252
|
listLiveBranches: (repository) => {
|
|
@@ -334,7 +381,7 @@ export async function replayPodTerminals(options: DraftResidueReplayOptions = {}
|
|
|
334
381
|
const outcome = await applyPodTerminal(record, { ledgerDir, ledgerRunId, adapters: replayAdapters, closeBudget });
|
|
335
382
|
if (outcome.status === 'recorded' || outcome.reason === 'already-recorded') recovered++;
|
|
336
383
|
else if (outcome.status === 'skipped' && outcome.reason === 'repository-unobserved') unresolved++;
|
|
337
|
-
else if (outcome.status === 'skipped' && !['previous-run-unverified', 'previous-run-live', 'close-cap', 'host-repository-unobserved'].includes(outcome.reason ?? '')) recovered++;
|
|
384
|
+
else if (outcome.status === 'skipped' && !['previous-run-unverified', 'previous-run-live', 'close-cap', 'host-repository-unobserved', 'restore-unverified'].includes(outcome.reason ?? '')) recovered++;
|
|
338
385
|
else pending++;
|
|
339
386
|
}
|
|
340
387
|
}
|
|
@@ -348,6 +395,7 @@ export async function applyPodTerminal(record: PrTerminalRecord, ctx: DraftResid
|
|
|
348
395
|
const skipped = (reason: string): DraftResidueResult => { log('skipped', { reason }); return { status: 'skipped', reason }; };
|
|
349
396
|
const budget: DraftCloseBudget = ctx.closeBudget ?? { remaining: DRAFT_SWEEP_CLOSE_CAP };
|
|
350
397
|
let step = 'ledger';
|
|
398
|
+
let pendingSupersession: { repository: string; number: number; prNumber: number; commentMayExist: boolean } | null = null;
|
|
351
399
|
try {
|
|
352
400
|
const ledger = adapters.loadLedger(ctx.ledgerRunId, ctx.ledgerDir);
|
|
353
401
|
if (ledger === undefined) throw new Error('Terminal ledger unavailable');
|
|
@@ -422,6 +470,28 @@ export async function applyPodTerminal(record: PrTerminalRecord, ctx: DraftResid
|
|
|
422
470
|
step = 'ledger';
|
|
423
471
|
acknowledge('owner-comment', pr.number);
|
|
424
472
|
}
|
|
473
|
+
// PR1a records a recovery pointer but never closes this failed draft. PR1b owns the close decision.
|
|
474
|
+
if (record.terminalClass === 'failed-with-pr' && !completed('restore-comment', pr.number)) {
|
|
475
|
+
step = 'get-pr';
|
|
476
|
+
let latest: ResiduePr | undefined;
|
|
477
|
+
try { latest = await adapters.getPr(pr.number); }
|
|
478
|
+
catch { return skipped('restore-unverified'); }
|
|
479
|
+
if (!latest || latest.state !== 'OPEN' || latest.isDraft !== true || !record.headSha
|
|
480
|
+
|| latest.headSha?.toLowerCase() !== record.headSha.toLowerCase()
|
|
481
|
+
|| !latest.branch?.trim() || latest.branch !== pr.branch || (record.branch && latest.branch !== record.branch)
|
|
482
|
+
|| !Array.isArray(latest.labels) || latest.labels.some((label) => PROTECTED_LABELS.has(label))) {
|
|
483
|
+
return skipped('restore-unverified');
|
|
484
|
+
}
|
|
485
|
+
step = 'list-comments';
|
|
486
|
+
let comments: readonly string[] | undefined;
|
|
487
|
+
try { comments = await adapters.getAllComments?.(record.repository, pr.number); }
|
|
488
|
+
catch { return skipped('restore-unverified'); }
|
|
489
|
+
if (!Array.isArray(comments) || comments.some((comment) => typeof comment !== 'string'
|
|
490
|
+
|| /landing-verified\s*:|land-enqueue\s*:/i.test(comment))) return skipped('restore-unverified');
|
|
491
|
+
const restore = `Draft residue: failed-run recovery · run=${record.childRunId} · head=${record.headSha} · branch=${latest.branch} preserved. Restore from this branch.`;
|
|
492
|
+
if (!comments.includes(restore)) { step = 'comment'; await adapters.comment(record.repository, pr.number, restore); }
|
|
493
|
+
step = 'ledger'; acknowledge('restore-comment', pr.number);
|
|
494
|
+
}
|
|
425
495
|
} else skipped('landed');
|
|
426
496
|
step = 'list-open-drafts';
|
|
427
497
|
const drafts = await adapters.listOpenDrafts(record.repository);
|
|
@@ -430,12 +500,33 @@ export async function applyPodTerminal(record: PrTerminalRecord, ctx: DraftResid
|
|
|
430
500
|
throw new Error('Open draft lookup unavailable or incomplete');
|
|
431
501
|
}
|
|
432
502
|
const newerAt = Date.parse(pr.createdAt);
|
|
433
|
-
const
|
|
503
|
+
const slot = cardOf(pr.body);
|
|
504
|
+
const taSlot = validCardSlot(slot) ? slot : undefined;
|
|
505
|
+
const earlier: ResiduePr[] = drafts.filter((draft: ResiduePr) => draft.number !== pr.number && draft.branch.startsWith('self-impl/')
|
|
434
506
|
&& Date.parse(draft.createdAt) < newerAt && !draft.labels.some((label: string) => PROTECTED_LABELS.has(label))
|
|
435
|
-
&& !completed('superseded-close', draft.number)
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
507
|
+
&& !completed('superseded-close', draft.number));
|
|
508
|
+
const sameSlot = taSlot ? earlier.filter((draft) => /^[a-f0-9]{40}$/i.test(draft.headSha ?? '') && sameCardSlot(draft, pr, taSlot)
|
|
509
|
+
&& !draft.labels.some((label) => label === 'elanous:running' || label.includes('harvest-claimed'))) : [];
|
|
510
|
+
let codeDiff = false;
|
|
511
|
+
if (taSlot && sameSlot.length) {
|
|
512
|
+
// A changed PR head can turn a measured code PR into a goal-only PR while files are being fetched.
|
|
513
|
+
step = 'get-pr';
|
|
514
|
+
const beforeFiles = await adapters.getPr(pr.number);
|
|
515
|
+
if (!beforeFiles || beforeFiles.number !== pr.number || beforeFiles.state !== pr.state
|
|
516
|
+
|| !pr.headSha || beforeFiles.headSha !== pr.headSha || beforeFiles.branch !== pr.branch
|
|
517
|
+
|| !sameCardSlot(beforeFiles, pr, taSlot)) return skipped('new-pr-changed-before-files');
|
|
518
|
+
step = 'list-pr-changed-paths';
|
|
519
|
+
const paths = await adapters.listPrChangedPaths?.(record.repository, pr.number);
|
|
520
|
+
if (!paths || !Array.isArray(paths) || paths.some((path) => typeof path !== 'string')) return skipped('new-pr-code-diff-unobserved');
|
|
521
|
+
step = 'get-pr';
|
|
522
|
+
const afterFiles = await adapters.getPr(pr.number);
|
|
523
|
+
if (!afterFiles || afterFiles.number !== pr.number || afterFiles.state !== pr.state
|
|
524
|
+
|| afterFiles.headSha !== pr.headSha || afterFiles.branch !== pr.branch
|
|
525
|
+
|| !sameCardSlot(afterFiles, pr, taSlot)) return skipped('new-pr-changed-after-files');
|
|
526
|
+
codeDiff = hasCodeDiff(paths);
|
|
527
|
+
if (!codeDiff) log('skipped', { reason: 'new-pr-goal-only', prNumber: pr.number });
|
|
528
|
+
}
|
|
529
|
+
const candidates = codeDiff ? sameSlot : [];
|
|
439
530
|
let liveBranches: ReadonlySet<string> | undefined;
|
|
440
531
|
if (candidates.length) {
|
|
441
532
|
step = 'list-live-branches';
|
|
@@ -446,6 +537,16 @@ export async function applyPodTerminal(record: PrTerminalRecord, ctx: DraftResid
|
|
|
446
537
|
let capped = false;
|
|
447
538
|
for (const draft of candidates) {
|
|
448
539
|
if (budget.remaining <= 0) { capped = true; break; }
|
|
540
|
+
if (taSlot) {
|
|
541
|
+
step = 'get-pr';
|
|
542
|
+
const latest = await adapters.getPr(draft.number);
|
|
543
|
+
if (!latest || latest.number !== draft.number || latest.state !== 'OPEN' || latest.isDraft !== true
|
|
544
|
+
|| !draft.headSha
|
|
545
|
+
|| latest.branch !== draft.branch || latest.headSha !== draft.headSha
|
|
546
|
+
|| !Array.isArray(latest.labels) || latest.labels.some((label) => PROTECTED_LABELS.has(label)
|
|
547
|
+
|| label === 'elanous:running' || label.includes('harvest-claimed'))
|
|
548
|
+
|| !sameCardSlot(latest, pr, taSlot)) { deferred = true; skipped('previous-pr-changed'); continue; }
|
|
549
|
+
}
|
|
449
550
|
step = 'get-run-status';
|
|
450
551
|
const status = await adapters.getRunStatus(draft, record.repository);
|
|
451
552
|
if (liveBranches!.has(draft.branch) || !['completed', 'failed', 'cancelled', 'abandoned', 'self-implement.result final'].includes(status ?? '')) {
|
|
@@ -453,38 +554,145 @@ export async function applyPodTerminal(record: PrTerminalRecord, ctx: DraftResid
|
|
|
453
554
|
skipped(`previous-run-${status === 'running' || status === 'probable-running' || liveBranches!.has(draft.branch) ? 'live' : 'unobserved'}`);
|
|
454
555
|
continue;
|
|
455
556
|
}
|
|
557
|
+
if (taSlot) {
|
|
558
|
+
step = 'list-live-branches';
|
|
559
|
+
const liveNow = await adapters.listLiveBranches(record.repository);
|
|
560
|
+
step = 'get-run-status';
|
|
561
|
+
const statusNow = await adapters.getRunStatus(draft, record.repository);
|
|
562
|
+
if (!liveNow || liveNow.has(draft.branch)
|
|
563
|
+
|| !['completed', 'failed', 'cancelled', 'abandoned', 'self-implement.result final'].includes(statusNow ?? '')) {
|
|
564
|
+
deferred = true; skipped('previous-run-changed-before-label'); continue;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
// Revalidate the effective diff and both PRs before applying any public supersession marker.
|
|
568
|
+
if (taSlot) {
|
|
569
|
+
const newBeforeClose = await adapters.getPr(pr.number);
|
|
570
|
+
if (!newBeforeClose || newBeforeClose.number !== pr.number || newBeforeClose.state !== pr.state
|
|
571
|
+
|| newBeforeClose.headSha !== pr.headSha || newBeforeClose.branch !== pr.branch
|
|
572
|
+
|| !sameCardSlot(newBeforeClose, pr, taSlot)) { deferred = true; skipped('new-pr-changed-before-close'); continue; }
|
|
573
|
+
// The base can move without changing this PR's head. Re-read the effective diff before closing the old draft.
|
|
574
|
+
step = 'list-pr-changed-paths';
|
|
575
|
+
const currentPaths = await adapters.listPrChangedPaths?.(record.repository, pr.number);
|
|
576
|
+
if (!currentPaths || !Array.isArray(currentPaths) || currentPaths.some((path) => typeof path !== 'string')
|
|
577
|
+
|| !hasCodeDiff(currentPaths)) { deferred = true; skipped('new-pr-code-diff-changed-before-close'); continue; }
|
|
578
|
+
step = 'get-pr';
|
|
579
|
+
const afterCloseDiff = await adapters.getPr(pr.number);
|
|
580
|
+
if (!afterCloseDiff || afterCloseDiff.number !== pr.number || afterCloseDiff.state !== pr.state
|
|
581
|
+
|| afterCloseDiff.headSha !== pr.headSha || afterCloseDiff.branch !== pr.branch
|
|
582
|
+
|| !sameCardSlot(afterCloseDiff, pr, taSlot)) { deferred = true; skipped('new-pr-changed-after-close-diff'); continue; }
|
|
583
|
+
const beforeClose = await adapters.getPr(draft.number);
|
|
584
|
+
if (!beforeClose || beforeClose.number !== draft.number || beforeClose.state !== 'OPEN' || beforeClose.isDraft !== true
|
|
585
|
+
|| !draft.headSha
|
|
586
|
+
|| beforeClose.branch !== draft.branch || beforeClose.headSha !== draft.headSha
|
|
587
|
+
|| !Array.isArray(beforeClose.labels) || beforeClose.labels.some((label) => PROTECTED_LABELS.has(label)
|
|
588
|
+
|| label === 'elanous:running' || label.includes('harvest-claimed'))
|
|
589
|
+
|| !sameCardSlot(beforeClose, pr, taSlot)) { deferred = true; skipped('previous-pr-changed-before-close'); continue; }
|
|
590
|
+
step = 'list-live-branches';
|
|
591
|
+
const liveBeforeClose = await adapters.listLiveBranches(record.repository);
|
|
592
|
+
step = 'get-run-status';
|
|
593
|
+
const statusBeforeClose = await adapters.getRunStatus(draft, record.repository);
|
|
594
|
+
if (!liveBeforeClose || liveBeforeClose.has(draft.branch)
|
|
595
|
+
|| !['completed', 'failed', 'cancelled', 'abandoned', 'self-implement.result final'].includes(statusBeforeClose ?? '')) {
|
|
596
|
+
deferred = true; skipped('previous-run-changed-before-close'); continue;
|
|
597
|
+
}
|
|
598
|
+
}
|
|
456
599
|
if (!completed('supersede-intent', draft.number)) {
|
|
457
600
|
step = 'ledger';
|
|
458
601
|
acknowledge('supersede-intent', draft.number);
|
|
459
602
|
}
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
603
|
+
// The inventory was read before the liveness and diff checks. Labels can change while
|
|
604
|
+
// those checks run, so ownership and the state to restore come from a fresh PR read.
|
|
605
|
+
step = 'get-pr';
|
|
606
|
+
const beforeLabel = await adapters.getPr(draft.number);
|
|
607
|
+
if (!beforeLabel || beforeLabel.number !== draft.number || beforeLabel.state !== 'OPEN'
|
|
608
|
+
|| beforeLabel.isDraft !== true || beforeLabel.branch !== draft.branch
|
|
609
|
+
|| beforeLabel.headSha !== draft.headSha || !Array.isArray(beforeLabel.labels)
|
|
610
|
+
|| beforeLabel.labels.some((label) => PROTECTED_LABELS.has(label)
|
|
611
|
+
|| label === 'elanous:running' || label.includes('harvest-claimed'))
|
|
612
|
+
|| (taSlot && !sameCardSlot(beforeLabel, pr, taSlot))) {
|
|
613
|
+
deferred = true; skipped('previous-pr-changed-before-label-write'); continue;
|
|
468
614
|
}
|
|
469
|
-
|
|
615
|
+
// There is no conditional GitHub add-label operation. A label written before close
|
|
616
|
+
// cannot be safely removed on a race: another run may have added that same label
|
|
617
|
+
// between our read and write. Apply the public state marker only after close succeeds.
|
|
618
|
+
pendingSupersession = { repository: record.repository, number: draft.number, prNumber: pr.number,
|
|
619
|
+
commentMayExist: false };
|
|
620
|
+
const body = taSlot
|
|
621
|
+
? `Draft residue: superseded-by #${pr.number} (same card ${taSlot}; old goalid=${goalLineage(draft) ?? 'unobserved'}; new goalid=${goalLineage(pr) ?? 'unobserved'}; newer run ${record.childRunId}). Branch preserved.`
|
|
622
|
+
: `Draft residue: superseded-by #${pr.number} (newer run ${record.childRunId} of the same goal). Branch preserved.`;
|
|
623
|
+
pendingSupersession.commentMayExist = completed('supersede-comment', draft.number);
|
|
470
624
|
if (!completed('supersede-comment', draft.number)) {
|
|
471
|
-
// REST draft listings do not contain comments; fetch them
|
|
625
|
+
// REST draft listings do not contain comments; fetch them before deciding whether to comment.
|
|
472
626
|
let comments = draft.comments;
|
|
473
|
-
if (comments === undefined
|
|
627
|
+
if (comments === undefined) {
|
|
474
628
|
step = 'get-pr';
|
|
475
629
|
const prior = await adapters.getPr(draft.number);
|
|
476
630
|
if (!prior || prior.number !== draft.number) throw new Error('Previous PR lookup unavailable');
|
|
477
631
|
comments = prior.comments;
|
|
478
632
|
}
|
|
479
|
-
if (!comments?.includes(body)) {
|
|
633
|
+
if (!comments?.includes(body)) {
|
|
634
|
+
pendingSupersession.commentMayExist = true;
|
|
635
|
+
step = 'comment'; await adapters.comment(record.repository, draft.number, body);
|
|
636
|
+
}
|
|
480
637
|
step = 'ledger';
|
|
481
638
|
acknowledge('supersede-comment', draft.number);
|
|
482
639
|
}
|
|
640
|
+
if (taSlot) {
|
|
641
|
+
// A claimant or new commit can arrive while GitHub accepts the label/comment writes.
|
|
642
|
+
step = 'list-pr-changed-paths';
|
|
643
|
+
const pathsAfterEffects = await adapters.listPrChangedPaths?.(record.repository, pr.number);
|
|
644
|
+
// The diff lookup can race a new head; bind its result to the head read after it.
|
|
645
|
+
step = 'get-pr';
|
|
646
|
+
const newAfterEffects = await adapters.getPr(pr.number);
|
|
647
|
+
step = 'list-live-branches';
|
|
648
|
+
const liveAfterEffects = await adapters.listLiveBranches(record.repository);
|
|
649
|
+
step = 'get-run-status';
|
|
650
|
+
const statusAfterEffects = await adapters.getRunStatus(draft, record.repository);
|
|
651
|
+
step = 'get-pr';
|
|
652
|
+
const oldAfterEffects = await adapters.getPr(draft.number);
|
|
653
|
+
if (!newAfterEffects || newAfterEffects.number !== pr.number || newAfterEffects.state !== pr.state
|
|
654
|
+
|| newAfterEffects.headSha !== pr.headSha || newAfterEffects.branch !== pr.branch
|
|
655
|
+
|| !sameCardSlot(newAfterEffects, pr, taSlot)
|
|
656
|
+
|| !pathsAfterEffects || !Array.isArray(pathsAfterEffects)
|
|
657
|
+
|| pathsAfterEffects.some((path) => typeof path !== 'string') || !hasCodeDiff(pathsAfterEffects)
|
|
658
|
+
|| !oldAfterEffects || oldAfterEffects.number !== draft.number || oldAfterEffects.state !== 'OPEN'
|
|
659
|
+
|| oldAfterEffects.isDraft !== true || oldAfterEffects.headSha !== draft.headSha
|
|
660
|
+
|| oldAfterEffects.branch !== draft.branch || !Array.isArray(oldAfterEffects.labels)
|
|
661
|
+
|| oldAfterEffects.labels.some((label) => PROTECTED_LABELS.has(label)
|
|
662
|
+
|| label === 'elanous:running' || label.includes('harvest-claimed'))
|
|
663
|
+
|| !sameCardSlot(oldAfterEffects, pr, taSlot)
|
|
664
|
+
|| !liveAfterEffects || liveAfterEffects.has(draft.branch)
|
|
665
|
+
|| !['completed', 'failed', 'cancelled', 'abandoned', 'self-implement.result final'].includes(statusAfterEffects ?? '')) {
|
|
666
|
+
const correction = `Draft residue: supersession by #${pr.number} deferred after PR or run changed; branch preserved. Prior superseded-by comment is no longer a close decision.`;
|
|
667
|
+
if (!oldAfterEffects?.comments?.includes(correction)) {
|
|
668
|
+
step = 'comment';
|
|
669
|
+
await adapters.comment(record.repository, draft.number, correction);
|
|
670
|
+
}
|
|
671
|
+
pendingSupersession = null;
|
|
672
|
+
deferred = true; skipped('supersession-changed-after-effects'); continue;
|
|
673
|
+
}
|
|
674
|
+
}
|
|
483
675
|
step = 'close-pr';
|
|
484
676
|
await adapters.closePr(record.repository, draft.number);
|
|
677
|
+
pendingSupersession = null;
|
|
485
678
|
budget.remaining--;
|
|
486
679
|
step = 'ledger';
|
|
487
680
|
acknowledge('superseded-close', draft.number);
|
|
681
|
+
// The close is irreversible. Label failure is diagnostic, never a reason to retry
|
|
682
|
+
// supersession or to roll back a label whose writer cannot be identified.
|
|
683
|
+
if (!beforeLabel.labels.includes(superseded)) {
|
|
684
|
+
try {
|
|
685
|
+
step = 'set-labels';
|
|
686
|
+
// A state label read before close may have been written by another run
|
|
687
|
+
// before this call. Its writer is unknown, so only add our marker.
|
|
688
|
+
await adapters.setLabels(record.repository, draft.number, { add: superseded, remove: [] });
|
|
689
|
+
step = 'ledger';
|
|
690
|
+
if (!completed('superseded-label', draft.number)) acknowledge('superseded-label', draft.number);
|
|
691
|
+
} catch (labelError) {
|
|
692
|
+
log('superseded-label-unobserved', { previousPrNumber: draft.number,
|
|
693
|
+
reason: labelError instanceof Error ? labelError.message : String(labelError) });
|
|
694
|
+
}
|
|
695
|
+
}
|
|
488
696
|
log('superseded-previous', { previousPrNumber: draft.number });
|
|
489
697
|
}
|
|
490
698
|
if (deferred) return skipped('previous-run-unverified');
|
|
@@ -494,6 +702,17 @@ export async function applyPodTerminal(record: PrTerminalRecord, ctx: DraftResid
|
|
|
494
702
|
return { status: 'recorded' };
|
|
495
703
|
} catch (error) {
|
|
496
704
|
const reason = error instanceof Error ? error.message : String(error);
|
|
705
|
+
if (pendingSupersession) {
|
|
706
|
+
const pending = pendingSupersession;
|
|
707
|
+
try {
|
|
708
|
+
if (pending.commentMayExist) await adapters.comment(pending.repository, pending.number,
|
|
709
|
+
`Draft residue: supersession by #${pending.prNumber} deferred after an interrupted check; branch preserved. Prior superseded-by comment is no longer a close decision.`);
|
|
710
|
+
log('supersession-compensated', { previousPrNumber: pending.number, failedStep: step });
|
|
711
|
+
} catch (compensationError) {
|
|
712
|
+
log('supersession-compensation-failed', { previousPrNumber: pending.number,
|
|
713
|
+
reason: compensationError instanceof Error ? compensationError.message : String(compensationError) });
|
|
714
|
+
}
|
|
715
|
+
}
|
|
497
716
|
log('failed', { step, reason });
|
|
498
717
|
return { status: 'failed', step, reason };
|
|
499
718
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CLAIM_IDLE_HOURS, PR_LABELS, STALLED_DRAFT_HOURS } from '../github/pr-labels.js';
|
|
2
2
|
import { debug } from '../debug/log.js';
|
|
3
|
-
import { decideDraft, draftClaimComment, draftClaimState, draftReleaseComment, laterMergedTwins, sameGoalPr, type DraftTriagePr } from './draft-triage-rules.js';
|
|
3
|
+
import { decideDraft, draftClaimComment, draftClaimState, draftReleaseComment, laterMergedTwins, sameGoalPr, PROTECTED_LABELS, type DraftTriagePr } from './draft-triage-rules.js';
|
|
4
|
+
import { cellIdFromBody } from '../pr-tool/census.js';
|
|
4
5
|
import { cardPrNumber, draftTaskOwner, type TaskCard } from '../task-agent/task-hand.js';
|
|
5
6
|
import type { PrTerminalRecord } from './draft-residue.js';
|
|
6
7
|
import { branchLineageSlug } from '../cli/pr-lineage.js';
|
|
@@ -47,6 +48,8 @@ export interface DraftSweepAdapters {
|
|
|
47
48
|
/** Host ledger terminal records; undefined means the ledger could not be read. */
|
|
48
49
|
listPrTerminals?(): Promise<readonly PrTerminalRecord[] | undefined>;
|
|
49
50
|
commentDraft?(repository: string, number: number, body: string): Promise<void>;
|
|
51
|
+
/** Complete issue-comment inventory for idempotent merge-time same-cell cleanup. */
|
|
52
|
+
listIssueComments?(repository: string, number: number): Promise<readonly string[]>;
|
|
50
53
|
removeLabel?(repository: string, number: number, label: string): Promise<void>;
|
|
51
54
|
/** Whether the current owned run has a self-implement.result final observation, even if its worktree remains. */
|
|
52
55
|
hasFinalRunResult?(draft: SweepDraft, repository: string): Promise<boolean | undefined>;
|
|
@@ -587,12 +590,14 @@ export function resolveDraftSweepCloseCap(input: { flag?: unknown; config?: unkn
|
|
|
587
590
|
return { closeCap: DRAFT_SWEEP_CLOSE_CAP, closeCapSource: 'default', warnings };
|
|
588
591
|
}
|
|
589
592
|
|
|
590
|
-
/** Post-merge
|
|
593
|
+
/** Post-merge cleanup: an explicit same-cell successor or the existing verified-goal decision can authorize a close. */
|
|
591
594
|
export async function supersedeDraftsOnMerge(input: {
|
|
592
595
|
repository: string;
|
|
593
596
|
merged: SweepMergedPr & { createdAt: string; mergedAt: string };
|
|
597
|
+
/** `pr land` and HQ train invoke only the explicit same-cell successor path. */
|
|
598
|
+
onlyExplicitSameCell?: boolean;
|
|
594
599
|
adapters: Pick<DraftSweepAdapters, 'listDrafts' | 'listLiveBranches' | 'getRunStatus' | 'setLabels' | 'closeDraft'>
|
|
595
|
-
& Pick<Partial<DraftSweepAdapters>, 'getLatestFileChanges' | 'getPrFiles'>;
|
|
600
|
+
& Pick<Partial<DraftSweepAdapters>, 'getLatestFileChanges' | 'getPrFiles' | 'commentDraft' | 'listIssueComments'>;
|
|
596
601
|
}): Promise<{ closed: number[]; kept: number[] }> {
|
|
597
602
|
const { repository, merged, adapters } = input;
|
|
598
603
|
const closed: number[] = [];
|
|
@@ -611,6 +616,43 @@ export async function supersedeDraftsOnMerge(input: {
|
|
|
611
616
|
|| !Number.isFinite(Date.parse(merged.createdAt)) || !Number.isFinite(Date.parse(merged.mergedAt))
|
|
612
617
|
|| drafts.some((pr) => !Number.isInteger(pr.number) || !pr.branch || !Array.isArray(pr.labels)
|
|
613
618
|
|| !Number.isFinite(Date.parse(pr.createdAt)))) throw new Error('Incomplete merge draft inventory');
|
|
619
|
+
// The conflicting-PR path writes this exact marker. A marker by itself is not authority:
|
|
620
|
+
// both PR bodies must identify the same cell, and the old PR must still be an open draft.
|
|
621
|
+
const markers = [...(merged.body ?? '').matchAll(/^Supersedes:\s*#(\d+)\s*$/gm)];
|
|
622
|
+
const markedNumber = markers.length === 1 ? Number(markers[0]![1]) : null;
|
|
623
|
+
const explicitOld = Number.isSafeInteger(markedNumber) && markedNumber! > 0 ? markedNumber : null;
|
|
624
|
+
const mergedCell = cellIdFromBody(merged.body ?? '');
|
|
625
|
+
if (explicitOld && explicitOld !== merged.number && mergedCell) {
|
|
626
|
+
const old = drafts.find((draft) => draft.number === explicitOld);
|
|
627
|
+
if (old && cellIdFromBody(old.body ?? '') === mergedCell
|
|
628
|
+
&& Date.parse(old.createdAt) < Date.parse(merged.mergedAt)
|
|
629
|
+
&& !old.labels.some((label) => PROTECTED_LABELS.has(label))
|
|
630
|
+
&& PR_LABELS.filter((label) => label.axis === 'state' && old.labels.includes(label.name)).length <= 1) {
|
|
631
|
+
const marker = `<!-- elanous:same-cell-superseded #${old.number} -> #${merged.number} -->`;
|
|
632
|
+
const comment = `${marker}\nSame-cell draft superseded by merged PR #${merged.number} (https://github.com/${repository}/pull/${merged.number}). Branch preserved.`;
|
|
633
|
+
try {
|
|
634
|
+
if (!adapters.listIssueComments || !adapters.commentDraft) throw new Error('same-cell comment inventory unavailable');
|
|
635
|
+
const comments = await adapters.listIssueComments(repository, old.number);
|
|
636
|
+
if (!Array.isArray(comments)) throw new Error('same-cell comment inventory incomplete');
|
|
637
|
+
const remove = stateLabels.filter((label) => old.labels.includes(label.name) && label.name !== supersededLabel).map((label) => label.name);
|
|
638
|
+
if (!old.labels.includes(supersededLabel)) await adapters.setLabels(repository, old.number, { add: supersededLabel, remove });
|
|
639
|
+
if (!comments.some((body) => body.includes(marker))) await adapters.commentDraft(repository, old.number, comment);
|
|
640
|
+
await adapters.closeDraft(repository, old.number);
|
|
641
|
+
closed.push(old.number);
|
|
642
|
+
closeAttempts += 1;
|
|
643
|
+
} catch (failure) {
|
|
644
|
+
failed.push(old.number);
|
|
645
|
+
error = String(failure);
|
|
646
|
+
debug.log('drafts.cleanup', 'same-cell-supersede-failed', { merged: merged.number, old: old.number, error });
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
if (input.onlyExplicitSameCell) {
|
|
651
|
+
kept.push(...drafts.map((draft) => draft.number).filter((number) => !closed.includes(number)));
|
|
652
|
+
debug.log('drafts.cleanup', 'superseded-on-merge', { merged: merged.number, closed, kept,
|
|
653
|
+
...(failed.length ? { failed } : {}), ...(error ? { error } : {}) });
|
|
654
|
+
return { closed, kept };
|
|
655
|
+
}
|
|
614
656
|
const statuses = new Map<number, string | undefined>();
|
|
615
657
|
const latestChanges = new Map<number, Readonly<Record<string, string>> | undefined>();
|
|
616
658
|
const mergedFiles = await adapters.getPrFiles?.(repository, merged.number);
|
|
@@ -625,7 +667,14 @@ export async function supersedeDraftsOnMerge(input: {
|
|
|
625
667
|
}
|
|
626
668
|
}
|
|
627
669
|
for (const listedDraft of drafts) {
|
|
670
|
+
if (closed.includes(listedDraft.number)) continue;
|
|
628
671
|
const draft = { ...listedDraft, latestFileChanges: latestChanges.get(listedDraft.number) };
|
|
672
|
+
// The same-cell route is never inferred from a title, goal, or file overlap.
|
|
673
|
+
// A failed explicit cleanup also stays open for a later retry instead of falling through to generic triage.
|
|
674
|
+
if (draft.number === explicitOld || (mergedCell && cellIdFromBody(draft.body ?? '') === mergedCell)) {
|
|
675
|
+
kept.push(draft.number);
|
|
676
|
+
continue;
|
|
677
|
+
}
|
|
629
678
|
if (draft.number === merged.number || !draft.branch.startsWith('self-impl/') || liveBranches.has(draft.branch)
|
|
630
679
|
|| Date.parse(draft.createdAt) >= Date.parse(merged.mergedAt)) {
|
|
631
680
|
kept.push(draft.number);
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
2
|
import { debug } from '../debug/log.js';
|
|
3
|
+
import type { FrontNodeId } from './graph-front-nodes.js';
|
|
4
|
+
import type { PipelineNodeId } from '../self-implement/pipeline-shape.js';
|
|
3
5
|
import { GRAPH_SPECS, GRAPH_TEMPLATES, GRAPH_TEMPLATES_SOURCE, pipelineNodeEntryPayload, templateForGoalType, type GraphTemplate } from '../self-implement/graph-templates.js';
|
|
4
6
|
import type { GoalType } from '../self-implement/goal-author.js';
|
|
5
7
|
|
|
@@ -42,6 +44,8 @@ export const JOURNEY_NODE_IDS = [
|
|
|
42
44
|
'stopped',
|
|
43
45
|
] as const;
|
|
44
46
|
export type JourneyNodeId = typeof JOURNEY_NODE_IDS[number];
|
|
47
|
+
/** Existing author/front and self-implement pipeline nodes may use the same observation helpers. */
|
|
48
|
+
export type JourneyObservationNodeId = JourneyNodeId | FrontNodeId | PipelineNodeId;
|
|
45
49
|
|
|
46
50
|
export const JOURNEY_KEY_ENV = 'ELANOUS_JOURNEY_KEY';
|
|
47
51
|
const QUEUE_LAUNCH_ENV = 'ELANOUS_HARNESS_QUEUE_LAUNCH';
|
|
@@ -81,7 +85,7 @@ export interface JourneyObservation {
|
|
|
81
85
|
readonly data?: Readonly<Record<string, unknown>>;
|
|
82
86
|
}
|
|
83
87
|
|
|
84
|
-
function emit(entry: boolean, node:
|
|
88
|
+
function emit(entry: boolean, node: JourneyObservationNodeId, o: JourneyObservation): void {
|
|
85
89
|
try {
|
|
86
90
|
const template = journeyTemplate(node, o.goalType);
|
|
87
91
|
const runId = o.runId ?? process.env[RUN_ID_ENV]?.trim();
|
|
@@ -104,14 +108,14 @@ function emit(entry: boolean, node: JourneyNodeId, o: JourneyObservation): void
|
|
|
104
108
|
}
|
|
105
109
|
|
|
106
110
|
/** 노드 진입. */
|
|
107
|
-
export function enterJourneyNode(node:
|
|
111
|
+
export function enterJourneyNode(node: JourneyObservationNodeId, o: JourneyObservation): void {
|
|
108
112
|
emit(true, node, o);
|
|
109
113
|
}
|
|
110
114
|
|
|
111
115
|
/** 노드 출구 — `outcome` 이 그 노드에서 나간 간선의 라벨(YAML `map` 키)이다.
|
|
112
116
|
* ⭐ 그 라벨이 선언에서 종결 노드 `stopped` 로 가면 `stopped` 진입도 남긴다 — 거절·포기 런이 «선언된 종결점»에서 끝난다.
|
|
113
117
|
* `outcome: 'error'` = 노드 안 작업이 예외를 던졌다(예외는 호출자에게 그대로 간다). */
|
|
114
|
-
export function exitJourneyNode(node:
|
|
118
|
+
export function exitJourneyNode(node: JourneyObservationNodeId, o: JourneyObservation & { readonly outcome: string }): void {
|
|
115
119
|
emit(false, node, o);
|
|
116
120
|
if (node !== 'stopped' && journeyEdgeTarget(node, o.outcome) === 'stopped') {
|
|
117
121
|
const { outcome: _outcome, ...rest } = o;
|
|
@@ -130,7 +134,7 @@ export function journeyEdgeTarget(from: string, label: string): string | undefin
|
|
|
130
134
|
}
|
|
131
135
|
|
|
132
136
|
/** 노드 안 작업을 감싼다 — 예외면 출구 `error` 를 남기고 다시 던진다(진입 뒤 출구가 빠지지 않게). */
|
|
133
|
-
export function withJourneyNode<T>(node:
|
|
137
|
+
export function withJourneyNode<T>(node: JourneyObservationNodeId, o: JourneyObservation, work: () => Promise<T>): Promise<T> {
|
|
134
138
|
const onError = (error: unknown): void => {
|
|
135
139
|
exitJourneyNode(node, { ...o, outcome: 'error', data: { ...o.data, error: error instanceof Error ? error.message : String(error) } });
|
|
136
140
|
};
|
|
@@ -144,7 +148,7 @@ export function withJourneyNode<T>(node: JourneyNodeId, o: JourneyObservation, w
|
|
|
144
148
|
}
|
|
145
149
|
|
|
146
150
|
/** 동기 판. */
|
|
147
|
-
export function withJourneyNodeSync<T>(node:
|
|
151
|
+
export function withJourneyNodeSync<T>(node: JourneyObservationNodeId, o: JourneyObservation, work: () => T): T {
|
|
148
152
|
try { return work(); }
|
|
149
153
|
catch (error) {
|
|
150
154
|
exitJourneyNode(node, { ...o, outcome: 'error', data: { ...o.data, error: error instanceof Error ? error.message : String(error) } });
|
|
@@ -153,7 +157,7 @@ export function withJourneyNodeSync<T>(node: JourneyNodeId, o: JourneyObservatio
|
|
|
153
157
|
}
|
|
154
158
|
|
|
155
159
|
/** 진입·출구를 한 번에 — 판정만 하는 노드(대기 없는 관문)용. */
|
|
156
|
-
export function passJourneyNode(node:
|
|
160
|
+
export function passJourneyNode(node: JourneyObservationNodeId, o: JourneyObservation & { readonly outcome: string }): void {
|
|
157
161
|
enterJourneyNode(node, o);
|
|
158
162
|
exitJourneyNode(node, o);
|
|
159
163
|
}
|