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
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
-
import { execFile } from 'node:child_process';
|
|
2
|
+
import { execFile, spawnSync } from 'node:child_process';
|
|
3
3
|
import { existsSync, linkSync, lstatSync, mkdirSync, readFileSync, readdirSync, readlinkSync, realpathSync, renameSync, rmdirSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
4
4
|
import { dirname, join, resolve, sep } from 'node:path';
|
|
5
|
-
import { fileURLToPath } from 'node:url';
|
|
6
5
|
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
7
6
|
import { getElanousConfigDir, getElanousConfigDirOverride } from '../elanous-config-dir.js';
|
|
8
7
|
import { debug } from '../debug/log.js';
|
|
@@ -17,13 +16,16 @@ import { recordFailureEvent } from '../self-implement/heal-intake.js';
|
|
|
17
16
|
import { growthApprovalRef, proposeGrowth, type GraphGrowth, type GrowthProposer, type GrowthRecipeEffect, type GrowthDecisionDeps, type GrowthCommand } from './graph-grow.js';
|
|
18
17
|
import { DecisionLedger, type DecisionEntry } from '../decisions/decision-ledger.js';
|
|
19
18
|
import { createLLMGrowthProposer } from './graph-grow-llm.js';
|
|
20
|
-
import { parseGraphTemplateYaml, type GraphEdgeSpec, type GraphNodeSpec, type GraphTemplateSpec } from '../self-implement/graph-yaml.js';
|
|
19
|
+
import { graphVersionHash, parseGraphTemplateYaml, type GraphEdgeSpec, type GraphNodeSpec, type GraphTemplateSpec } from '../self-implement/graph-yaml.js';
|
|
20
|
+
import { createGraphUnitResolver, resolveGraphUnit, UnitNotFoundError, type ResolvedGraphUnit } from '../self-implement/graph-unit-resolver.js';
|
|
21
|
+
import { flattenGraphUnits } from '../self-implement/graph-unit-flatten.js';
|
|
22
|
+
export { UnitNotFoundError } from '../self-implement/graph-unit-resolver.js';
|
|
21
23
|
import { createGraphVariant, type GraphVariantPlan } from '../self-implement/graph-variant.js';
|
|
22
24
|
import { psProcessStartMs, START_TOLERANCE_MS } from '../harness/harness-stop.js';
|
|
23
25
|
import { executeBashNode } from '../workflow-runtime/nodes/bash.js';
|
|
24
26
|
import { interpolate } from '../workflow-runtime/variables.js';
|
|
25
27
|
import type { BashNode, NodeExecContext, WorkflowDeps } from '../workflow-runtime/types.js';
|
|
26
|
-
import { releaseResumeAcceptedRegressions, releaseResumeGateExecutor, releaseResumeWaiver, type AcceptedRegression, type GateExecutorOverride } from '../../scripts/release-loop/resume.js';
|
|
28
|
+
import { releaseResumeAcceptedRegressions, releaseResumeGateExecutor, releaseResumeGatePodPool, releaseResumeWaiver, type AcceptedRegression, type GateExecutorOverride, type GatePodPoolOverride } from '../../scripts/release-loop/resume.js';
|
|
27
29
|
|
|
28
30
|
type BashRun = WorkflowDeps['runBash'];
|
|
29
31
|
const DEFAULT_BASH_TIMEOUT_MS = 5 * 60 * 1_000;
|
|
@@ -67,6 +69,20 @@ function assertReleaseCommandBinding(node: GraphNodeSpec, command: string | unde
|
|
|
67
69
|
}
|
|
68
70
|
}
|
|
69
71
|
|
|
72
|
+
const LOOP_TERMINAL_STATUS: Readonly<Record<string, Readonly<Record<string, 'done' | 'failed'>>>> = {
|
|
73
|
+
'ta-journey': { done: 'done', failed: 'failed', 'needs-human': 'failed', rework: 'failed' },
|
|
74
|
+
'default-loop': { landed: 'done', stopped: 'failed' },
|
|
75
|
+
'document-loop': { landed: 'done', 'document-blocked': 'failed', 'needs-human': 'failed' },
|
|
76
|
+
'operate-loop': { landed: 'done', 'operate-blocked': 'failed', 'needs-human': 'failed' },
|
|
77
|
+
'research-loop': { landed: 'done', 'needs-human': 'failed' },
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
function topLevelTerminalStatus(graphId: string, terminal: string): 'done' | 'failed' | undefined {
|
|
81
|
+
const aliases = Object.hasOwn(LOOP_TERMINAL_STATUS, graphId) ? LOOP_TERMINAL_STATUS[graphId] : undefined;
|
|
82
|
+
if (aliases) return Object.hasOwn(aliases, terminal) ? aliases[terminal] : undefined;
|
|
83
|
+
return terminal === 'done' || terminal === 'failed' ? terminal : undefined;
|
|
84
|
+
}
|
|
85
|
+
|
|
70
86
|
export interface GraphRunState {
|
|
71
87
|
graphId: string;
|
|
72
88
|
runId: string;
|
|
@@ -77,6 +93,8 @@ export interface GraphRunState {
|
|
|
77
93
|
activeNode?: { nodeId: string; pid: number; pidStartedAt: string };
|
|
78
94
|
stoppedAt?: string;
|
|
79
95
|
status: 'running' | 'done' | 'failed' | 'budget-exceeded' | 'awaiting-approval';
|
|
96
|
+
/** Original named terminal when status is its canonical done/failed mapping. */
|
|
97
|
+
reason?: string;
|
|
80
98
|
path: string[];
|
|
81
99
|
/** startedAt/endedAt (ISO) and seconds are written when the node runs; ledgers before GRAPH-NODE-TIMES (0.2.19) have none. */
|
|
82
100
|
nodes: Array<{ nodeId: string; ok: boolean; exit: number | null; executed: boolean; output?: unknown; error?: string; decidedBy?: string; decidedAt?: string;
|
|
@@ -101,7 +119,7 @@ export interface GraphRunState {
|
|
|
101
119
|
growthPark?: { from: string; outcome: string; reason: string; decisionId: string; decisionRef: string; growth: GraphGrowth; command?: GrowthCommand; approval?: string };
|
|
102
120
|
resume?: { from: string; at: string; previousStatus: GraphRunState['status']; graph?: 'snapshot' | 'current' };
|
|
103
121
|
/** GATE-HOST-EXECUTOR — every explicit input change a resume made (what was set and what it replaced), oldest first. */
|
|
104
|
-
inputOverrides?: GateExecutorOverride
|
|
122
|
+
inputOverrides?: Array<GateExecutorOverride | GatePodPoolOverride>;
|
|
105
123
|
executed: number;
|
|
106
124
|
dryRun: boolean;
|
|
107
125
|
statePath: string;
|
|
@@ -123,6 +141,8 @@ export interface GraphRunOptions {
|
|
|
123
141
|
releaseAcceptedRegressions?: { requested: AcceptedRegression[]; acceptedRegressions: AcceptedRegression[] };
|
|
124
142
|
/** Release-only (GATE-HOST-EXECUTOR): run the restarted gate on this executor — recorded in `inputOverrides`, never a waiver. */
|
|
125
143
|
releaseGateExecutor?: { executor: string; host?: string };
|
|
144
|
+
/** Release-only (RESUME-GATE-POOL-OVERRIDE): replace the saved gate pool for this resumed gate. */
|
|
145
|
+
releaseGatePodPool?: string;
|
|
126
146
|
useCurrentGraph?: boolean;
|
|
127
147
|
/** Internal unit invocation context, propagated only by runGraph. */
|
|
128
148
|
unitContext?: { parentRunId: string; ancestors: readonly string[]; remainingSteps: number; entryNodeId?: string };
|
|
@@ -132,9 +152,35 @@ export interface GraphRunOptions {
|
|
|
132
152
|
* its own universe and lands in the tree-derived test universe while the run ledger is prod.
|
|
133
153
|
*/
|
|
134
154
|
pinChildUniverse?: boolean;
|
|
155
|
+
/** Release resume: command checkout and cut tip, checked before every Bash dispatch. */
|
|
156
|
+
releaseCommandSource?: { root: string; cutTip: string; git?: (args: string[]) => string };
|
|
135
157
|
deps?: { root?: string; runBash?: BashRun; callLLM?: (prompt: string) => Promise<string>; log?: (event: string, data: Record<string, unknown>) => void; beforeNode?: () => void; processStartMs?: (pid: number) => number | null; growthProposer?: GrowthProposer; growthLLM?: (prompt: string) => Promise<string>; classifyGrowthRecipe?: (node: GraphNodeSpec, resolved: { command?: string; approval?: string }) => GrowthRecipeEffect; growthDecision?: GrowthDecisionDeps & { list?: (filters: { status: 'all' }) => DecisionEntry[] } };
|
|
136
158
|
}
|
|
137
159
|
|
|
160
|
+
/** The command directory must itself be the checkout at the cut tip. */
|
|
161
|
+
export function verifyReleaseCommandRoot(root: string, cutTip: string, git?: (args: string[]) => string): string {
|
|
162
|
+
let commandRoot: string;
|
|
163
|
+
try { commandRoot = realpathSync(root); }
|
|
164
|
+
catch { throw new Error(`release command root missing: ${root} — use --command-root <컷 tip checkout>`); }
|
|
165
|
+
const run = git ?? ((args: string[]): string => {
|
|
166
|
+
// git-spawn-allow: read-only checkout identity before release command dispatch.
|
|
167
|
+
// `git ls-files -v -z` exceeds Node's 1 MiB default in the 25k-path main checkout.
|
|
168
|
+
const result = spawnSync('git', args, { cwd: commandRoot, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 });
|
|
169
|
+
if (result.status !== 0 || result.error) throw new Error(`release command root is not a git checkout: ${commandRoot} — use --command-root <컷 tip checkout>`);
|
|
170
|
+
return result.stdout.trim();
|
|
171
|
+
});
|
|
172
|
+
const head = run(['rev-parse', 'HEAD']);
|
|
173
|
+
// `status` can hide modified tracked code when assume-unchanged or skip-worktree is set.
|
|
174
|
+
// A release command checkout must not carry either index promise.
|
|
175
|
+
const hiddenTracked = run(['ls-files', '-v', '-z']).split('\0').find((entry) => entry && entry[0] !== 'H');
|
|
176
|
+
if (!/^[0-9a-f]{40}$/i.test(cutTip) || head.toLowerCase() !== cutTip.toLowerCase() ||
|
|
177
|
+
(!git && realpathSync(run(['rev-parse', '--show-toplevel'])) !== commandRoot) ||
|
|
178
|
+
hiddenTracked || run(['-c', 'status.showUntrackedFiles=all', 'status', '--porcelain', '--untracked-files=all'])) {
|
|
179
|
+
throw new Error(`release command root ${commandRoot}@${head.slice(0, 12)} differs from cut tip ${cutTip.slice(0, 12)} — use --command-root <컷 tip checkout>`);
|
|
180
|
+
}
|
|
181
|
+
return commandRoot;
|
|
182
|
+
}
|
|
183
|
+
|
|
138
184
|
function safeSegment(value: string): string {
|
|
139
185
|
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value) || value === '.' || value === '..') {
|
|
140
186
|
throw new Error(`invalid graph run identifier: ${value}`);
|
|
@@ -443,46 +489,22 @@ function nextNode(edges: readonly GraphEdgeSpec[], nodeId: string, exitOutcome:
|
|
|
443
489
|
return edge.map?.[exitOutcome] ?? edge.fallback?.[0]?.node;
|
|
444
490
|
}
|
|
445
491
|
|
|
446
|
-
type ResolvedUnit =
|
|
447
|
-
|
|
448
|
-
export class UnitNotFoundError extends Error {
|
|
449
|
-
constructor(call: string) {
|
|
450
|
-
super(`unit not found: ${call}`);
|
|
451
|
-
this.name = 'UnitNotFoundError';
|
|
452
|
-
}
|
|
453
|
-
}
|
|
492
|
+
type ResolvedUnit = ResolvedGraphUnit;
|
|
493
|
+
export const resolveUnit = resolveGraphUnit;
|
|
454
494
|
|
|
455
|
-
export function
|
|
456
|
-
|
|
457
|
-
const repo = join(dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
458
|
-
const directories = [join(dirname(callerPath), 'units'), dirname(callerPath), join(repo, 'graphs', 'units'), join(getElanousConfigDir(), 'graphs', 'units')];
|
|
459
|
-
for (const dir of directories) {
|
|
460
|
-
if (!existsSync(dir)) continue;
|
|
461
|
-
const matches = readdirSync(dir).filter(file => /\.ya?ml$/.test(file) && file !== 'recipes.yaml' && file !== 'recipes.yml').flatMap(file => {
|
|
462
|
-
const path = join(dir, file);
|
|
463
|
-
const source = readFileSync(path, 'utf8');
|
|
464
|
-
const header: unknown = parseYaml(source);
|
|
465
|
-
if (!header || typeof header !== 'object' || Array.isArray(header) || (header as Record<string, unknown>).graph_id !== id) return [];
|
|
466
|
-
const parsed = parseGraphTemplateYaml(source, path);
|
|
467
|
-
if (parsed.errors.length) throw new Error(parsed.errors.map(e => `${e.path}: ${e.message}`).join('\n'));
|
|
468
|
-
const template = parsed.template!;
|
|
469
|
-
return template.unit && (requested === String(template.version) || requested === `^${template.version}`)
|
|
470
|
-
? [{ path, template, hash: createHash('sha256').update(source).digest('hex') }] : [];
|
|
471
|
-
});
|
|
472
|
-
if (matches.length > 1) throw new Error(`ambiguous unit: ${call}`);
|
|
473
|
-
if (matches.length) return matches[0]!;
|
|
474
|
-
}
|
|
475
|
-
throw new UnitNotFoundError(call);
|
|
495
|
+
export function validateUnitCalls(graph: GraphTemplateSpec, path: string, ancestors: readonly string[] = [], onMissing?: (call: string) => void): Map<string, ResolvedUnit> {
|
|
496
|
+
return validateUnitCallsWithResolver(graph, path, ancestors, onMissing, createGraphUnitResolver());
|
|
476
497
|
}
|
|
477
498
|
|
|
478
|
-
|
|
499
|
+
function validateUnitCallsWithResolver(graph: GraphTemplateSpec, path: string, ancestors: readonly string[], onMissing: ((call: string) => void) | undefined,
|
|
500
|
+
resolve: typeof resolveGraphUnit): Map<string, ResolvedUnit> {
|
|
479
501
|
if (ancestors.includes(graph.graphId)) throw new Error(`unit cycle: ${[...ancestors, graph.graphId].join(' -> ')}`);
|
|
480
502
|
if (ancestors.length > 3) throw new Error('unit nesting exceeds depth 3');
|
|
481
503
|
const result = new Map<string, ResolvedUnit>();
|
|
482
504
|
for (const node of graph.nodes) {
|
|
483
505
|
if (node.kind !== 'subgraph' || node.call === undefined) continue;
|
|
484
506
|
let unit: ResolvedUnit;
|
|
485
|
-
try { unit =
|
|
507
|
+
try { unit = resolve(node.call!, path); } catch (error) {
|
|
486
508
|
if (error instanceof UnitNotFoundError && onMissing) { onMissing(node.call!); continue; }
|
|
487
509
|
throw error;
|
|
488
510
|
}
|
|
@@ -501,7 +523,7 @@ export function validateUnitCalls(graph: GraphTemplateSpec, path: string, ancest
|
|
|
501
523
|
debug.log('graph.unit', 'contract-mismatch', { graphId: graph.graphId, nodeId: node.nodeId, call: node.call });
|
|
502
524
|
throw new Error(`unit contract mismatch: ${node.nodeId} -> ${node.call}`);
|
|
503
525
|
}
|
|
504
|
-
|
|
526
|
+
validateUnitCallsWithResolver(unit.template, unit.path, [...ancestors, graph.graphId], onMissing, resolve);
|
|
505
527
|
result.set(node.nodeId, unit);
|
|
506
528
|
}
|
|
507
529
|
return result;
|
|
@@ -515,6 +537,7 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
515
537
|
if (options.releaseWaiver && (!options.resumeRunId || options.fromNodeId !== options.releaseWaiver.nodeId)) throw new Error('release waiver requires --resume --from <waived node>');
|
|
516
538
|
if (options.releaseAcceptedRegressions && (!options.resumeRunId || !options.fromNodeId || options.releaseWaiver)) throw new Error('accepted regressions require a release resume boundary');
|
|
517
539
|
if (options.releaseGateExecutor && (!options.resumeRunId || !options.fromNodeId)) throw new Error('gate executor override requires a release resume boundary');
|
|
540
|
+
if (options.releaseGatePodPool !== undefined && (!options.resumeRunId || !options.fromNodeId)) throw new Error('gate pod pool override requires a release resume boundary');
|
|
518
541
|
const root = options.deps?.root ?? effectiveInstanceRoot();
|
|
519
542
|
const matchingRuns = options.resumeRunId && !options.resumeGraphId
|
|
520
543
|
? listGraphRuns(root).runs.filter((run) => run.runId === options.resumeRunId && run.graphPath === resolve(path)) : [];
|
|
@@ -547,7 +570,13 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
547
570
|
const variant = options.variant ? createGraphVariant({ template: graph, ...options.variant }) : undefined;
|
|
548
571
|
if (variant && !variant.ok) throw new Error(`graph variant rejected: ${JSON.stringify(variant.rejections)}`);
|
|
549
572
|
if (variant?.ok) graph = variant.template;
|
|
550
|
-
const
|
|
573
|
+
const unitResolver = createGraphUnitResolver();
|
|
574
|
+
const units = validateUnitCallsWithResolver(graph, path, options.unitContext?.ancestors ?? [], undefined, unitResolver);
|
|
575
|
+
if (units.size > 0) {
|
|
576
|
+
const staticView = flattenGraphUnits(graph, path, unitResolver);
|
|
577
|
+
debug.log('graph.unit', 'static-view', { graphId: graph.graphId, hash: graphVersionHash(staticView),
|
|
578
|
+
nodeIds: staticView.nodes.map((node) => node.nodeId), edges: staticView.edges });
|
|
579
|
+
}
|
|
551
580
|
const unitEntryNode = options.unitContext?.entryNodeId ?? saved?.entryNodeId ?? graph.entryNode;
|
|
552
581
|
if (saved?.entryNodeId !== undefined && options.unitContext?.entryNodeId !== undefined && saved.entryNodeId !== options.unitContext.entryNodeId) {
|
|
553
582
|
throw new Error('unit entry changed on resume');
|
|
@@ -579,8 +608,10 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
579
608
|
.flatMap(name => credentialStatus(name, pluginRoot).fields.map(field => field.env));
|
|
580
609
|
const credentialFields = owner ? credentialStatus(owner.name, pluginRoot).fields.filter(field => field.set).map(field => field.name) : [];
|
|
581
610
|
for (const terminal of graph.terminalNodes) {
|
|
582
|
-
|
|
583
|
-
|
|
611
|
+
// Units use their declared exits. The four loop graphs also declare named
|
|
612
|
+
// top-level exits; all other graphs retain the done/failed contract.
|
|
613
|
+
if (!(graph.unit ? graph.unit.exits.includes(terminal) : topLevelTerminalStatus(graph.graphId, terminal) !== undefined)) {
|
|
614
|
+
throw new Error(`unsupported terminal node: ${terminal} (expected ${graph.unit ? graph.unit.exits.join(' or ') : 'done or failed'})`);
|
|
584
615
|
}
|
|
585
616
|
}
|
|
586
617
|
const recipeSource = readFileSync(graphMode === 'snapshot' ? join(snapshotDir!, 'recipes.yaml') : join(dirname(path), 'recipes.yaml'), 'utf8');
|
|
@@ -636,6 +667,29 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
636
667
|
...(options.input === undefined ? {} : { input: options.input }),
|
|
637
668
|
...(options.unitContext?.entryNodeId === undefined ? {} : { entryNodeId: options.unitContext.entryNodeId }),
|
|
638
669
|
executed: 0, dryRun: options.dryRun === true, statePath };
|
|
670
|
+
const verifyReleaseSource = (): string | undefined => {
|
|
671
|
+
const source = options.releaseCommandSource;
|
|
672
|
+
if (!source) return undefined;
|
|
673
|
+
const savedCutTip = lastJsonObject(state.nodes.find((node) => node.nodeId === 'version-release')?.output)?.commit;
|
|
674
|
+
if (graphId !== 'release-loop' || !options.resumeRunId || typeof savedCutTip !== 'string' || source.cutTip !== savedCutTip) {
|
|
675
|
+
throw new Error('release command source differs from the saved cut tip');
|
|
676
|
+
}
|
|
677
|
+
const commandRoot = verifyReleaseCommandRoot(source.root, savedCutTip, source.git);
|
|
678
|
+
// The ledger snapshot must be the recipe that the cut checkout actually carries.
|
|
679
|
+
// HEAD alone does not bind a saved graph to that checkout.
|
|
680
|
+
if (!state.graphSnapshot) throw new Error('release recipe snapshot missing — cannot pin command source');
|
|
681
|
+
const cutGraph = join(commandRoot, 'graphs', 'release', 'release-loop.yaml');
|
|
682
|
+
const cutRecipes = join(commandRoot, 'graphs', 'release', 'recipes.yaml');
|
|
683
|
+
const hashFile = (file: string): string => {
|
|
684
|
+
try { return createHash('sha256').update(readFileSync(file)).digest('hex'); }
|
|
685
|
+
catch { throw new Error(`release recipe source missing in cut checkout: ${file}`); }
|
|
686
|
+
};
|
|
687
|
+
if (hashFile(cutGraph) !== state.graphSnapshot.graphSha || hashFile(cutRecipes) !== state.graphSnapshot.recipesSha) {
|
|
688
|
+
throw new Error('release recipe source differs from the saved graph snapshot at cut tip');
|
|
689
|
+
}
|
|
690
|
+
return commandRoot;
|
|
691
|
+
};
|
|
692
|
+
verifyReleaseSource();
|
|
639
693
|
if (options.resumeRunId && graphMode === 'snapshot' && state.sourceHash && state.sourceHash !== approvalSourceHash) {
|
|
640
694
|
throw new Error('graph snapshot changed since run started');
|
|
641
695
|
}
|
|
@@ -728,6 +782,13 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
728
782
|
state.inputOverrides = [...(state.inputOverrides ?? []), override];
|
|
729
783
|
debug.log('graph.runs', 'input-override', { graphId, runId, ...override });
|
|
730
784
|
}
|
|
785
|
+
if (options.releaseGatePodPool !== undefined) {
|
|
786
|
+
if (graphId !== 'release-loop') throw new Error('gate pod pool override requires the release-loop graph');
|
|
787
|
+
const override = releaseResumeGatePodPool(state, { from: options.fromNodeId, pool: options.releaseGatePodPool });
|
|
788
|
+
state.input = { ...(state.input as Record<string, unknown>), ...override.set };
|
|
789
|
+
state.inputOverrides = [...(state.inputOverrides ?? []), override];
|
|
790
|
+
debug.log('graph.runs', 'input-override', { graphId, runId, ...override });
|
|
791
|
+
}
|
|
731
792
|
if (state.unitCalls) {
|
|
732
793
|
const calls = state.unitCalls;
|
|
733
794
|
state.unitCalls = calls.filter(call => {
|
|
@@ -911,6 +972,7 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
911
972
|
const redactCredentials = (text: string) => Object.values(credentials).filter(value => value.length > 0)
|
|
912
973
|
.reduce((safe, value) => safe.replaceAll(value, '[REDACTED]'), text);
|
|
913
974
|
const runBash: BashRun = async (body, opts) => {
|
|
975
|
+
const commandRoot = verifyReleaseSource();
|
|
914
976
|
// Hash the actual /bin/bash argv after interpolation. Keep the command text (which may contain
|
|
915
977
|
// credentials) out of logs, but leave enough to distinguish a replayed publish from npm/docs.
|
|
916
978
|
const argvSha256 = createHash('sha256').update(JSON.stringify(['/bin/bash', '-c', body])).digest('hex');
|
|
@@ -929,7 +991,7 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
929
991
|
return true;
|
|
930
992
|
});
|
|
931
993
|
try {
|
|
932
|
-
const result = await execute(body, opts);
|
|
994
|
+
const result = await execute(body, commandRoot ? { ...opts, cwd: commandRoot } : opts);
|
|
933
995
|
code = result.exitCode;
|
|
934
996
|
return { ...result, stdout: redactCredentials(result.stdout), stderr: redactCredentials(result.stderr) };
|
|
935
997
|
} finally {
|
|
@@ -978,9 +1040,13 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
978
1040
|
for (const record of state.nodes) previous[record.nodeId] = lastJsonObject(record.output) ?? record.output;
|
|
979
1041
|
const supplied = state.input && typeof state.input === 'object' && !Array.isArray(state.input)
|
|
980
1042
|
? state.input as Record<string, unknown> : {};
|
|
1043
|
+
const lastPrior = state.nodes.at(-1);
|
|
1044
|
+
const lastPriorOutput = lastPrior ? previous[lastPrior.nodeId] : undefined;
|
|
1045
|
+
const priorResult = lastPriorOutput && typeof lastPriorOutput === 'object' && !Array.isArray(lastPriorOutput)
|
|
1046
|
+
? (lastPriorOutput as Record<string, unknown>).result : undefined;
|
|
981
1047
|
const inputs: Record<string, unknown> = Object.create(null);
|
|
982
1048
|
for (const key of contract.inputs) {
|
|
983
|
-
const value = Object.hasOwn(supplied, key) ? supplied[key] : previous[key];
|
|
1049
|
+
const value = Object.hasOwn(supplied, key) ? supplied[key] : key === 'prior' ? priorResult : previous[key];
|
|
984
1050
|
if (value !== undefined) inputs[key] = value;
|
|
985
1051
|
}
|
|
986
1052
|
const alreadySpent = state.path.length + (state.unitCalls ?? []).reduce((sum, call) => sum + call.steps, 0);
|
|
@@ -1083,7 +1149,8 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1083
1149
|
} else {
|
|
1084
1150
|
// 승인 노드도 결과를 «값»으로 남긴다 — 뒤 노드가 문맥(outputs)에서 승인 여부를 확인할 수 있게(발행 노드가 승인 없이 돌지 않도록).
|
|
1085
1151
|
if (approval && !state.dryRun && !command) {
|
|
1086
|
-
output = JSON.stringify({ outcome: ok ? 'approved' : 'rejected',
|
|
1152
|
+
output = JSON.stringify({ outcome: ok ? 'approved' : 'rejected', graphId, runId, nodeId: current,
|
|
1153
|
+
...(state.pending?.decidedBy === undefined ? {} : { decidedBy: state.pending.decidedBy }), decidedAt: state.pending?.decidedAt ?? null });
|
|
1087
1154
|
}
|
|
1088
1155
|
state.nodes.push({ nodeId: current, ok, exit, executed: !waiving && ((!!command && (!state.dryRun || !!command.dry_run_command)) || (!!prompt && !state.dryRun) || unitExecuted), ...((waiving || units.has(current) || ((command || prompt || approval) && (!state.dryRun || !!command?.dry_run_command))) && output !== undefined ? { output } : {}), ...(error ? { error } : {}),
|
|
1089
1156
|
...(waiving ? { waiver: { reason: options.releaseWaiver!.reason, at: nodeEndedAt, ...(options.releaseWaiver!.unmeasured === undefined ? {} : { unmeasured: options.releaseWaiver!.unmeasured }), original: { exit: waivedRecord!.exit, ...(waivedRecord!.output === undefined ? {} : { output: waivedRecord!.output }), ...(waivedRecord!.error === undefined ? {} : { error: waivedRecord!.error }) } } } : {}),
|
|
@@ -1111,7 +1178,10 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1111
1178
|
}
|
|
1112
1179
|
persist();
|
|
1113
1180
|
if (graph.terminalNodes.includes(current)) {
|
|
1114
|
-
state.status =
|
|
1181
|
+
state.status = !ok ? 'failed' : graph.unit ? (current === 'failed' ? 'failed' : 'done')
|
|
1182
|
+
: topLevelTerminalStatus(graph.graphId, current)!;
|
|
1183
|
+
if (!graph.unit && current !== 'done' && current !== 'failed') state.reason = current;
|
|
1184
|
+
else delete state.reason;
|
|
1115
1185
|
persist();
|
|
1116
1186
|
if (state.status === 'failed' && !state.dryRun && graphId === 'release-loop') {
|
|
1117
1187
|
recordReleaseRunFailure(state, root, `Graph ${graphId}/${runId} failed at ${current}`);
|
package/src/grok/credential.ts
CHANGED
|
@@ -147,6 +147,11 @@ export function readGrokSubscriptionAccess(
|
|
|
147
147
|
return { key: sub.token, expiresAt: sub.expiresAt };
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
+
/** Read only the selected subscription expiry for status/alert surfaces; never return token or account id. */
|
|
151
|
+
export function readGrokSubscriptionExpiry(home?: string): string | null {
|
|
152
|
+
return readSubscriptionToken(grokAuthFilePath(home))?.expiresAt ?? null;
|
|
153
|
+
}
|
|
154
|
+
|
|
150
155
|
/** 프록시 필수 헤더. ⛔ `x-grok-client-version` 을 빼면 426 이다(실측). */
|
|
151
156
|
export function grokSubscriptionHeaders(opts: {
|
|
152
157
|
model?: string;
|
|
@@ -21,6 +21,7 @@ import { GOAL_TYPES, lintGoalFile, parseGoalId, parseGoalType, resolveGoalAuthor
|
|
|
21
21
|
import { templateForGoalType } from '../self-implement/graph-templates.js';
|
|
22
22
|
import { appendRunLedgerEntry, listRunLedgers, loadFederatedRunLedger, loadRunLedger, queryRunScreenKey, runLedgerDir, type RunLedgerEntry, type RunLedgerMatch, type RunLedgerWriter } from '../self-implement/run-ledger.js';
|
|
23
23
|
import { classifyPodExit, type PodExitClass } from '../task-orchestrator/surfaces/pod-failure-reason.js';
|
|
24
|
+
import type { PodChildEvidence } from '../task-orchestrator/surfaces/self-implement.js';
|
|
24
25
|
import { classifyPodExitStop, recordRunStop, runStopRecorded, RUN_STOP_EVENT } from '../self-implement/run-stop.js';
|
|
25
26
|
import { ensureOpenRouterChildModelLive, resolveChildLlmEffort, resolveImplementationChildModel } from '../self-dev/dev-cli.js';
|
|
26
27
|
import { resolveHarnessTarget } from '../self-implement/harness-target-options.js';
|
|
@@ -571,19 +572,40 @@ export function recordClassifiedHarnessPodExit(runId: string | undefined, reason
|
|
|
571
572
|
context: { entrance?: string; seat?: string; output?: string } = {}): void {
|
|
572
573
|
if (!runId) return;
|
|
573
574
|
try {
|
|
575
|
+
const childEvidence = reason === 'preflight-refused' ? undefined : latestPodChildEvidence(loadRunLedger(runId));
|
|
574
576
|
const signal = status > 128
|
|
575
577
|
? Object.entries(osConstants.signals).find(([, number]) => number === status - 128)?.[0] ?? null : null;
|
|
576
578
|
const cwd = process.cwd();
|
|
577
579
|
const seat = context.seat ?? process.env.ELANOUS_HARNESS_SEAT;
|
|
578
|
-
recordRunExit({ runId, reason, status, signal, at: new Date().toISOString(),
|
|
580
|
+
recordRunExit({ runId, reason: childEvidence?.scopeEscape === true ? 'scope-escape' : reason, status, signal, at: new Date().toISOString(),
|
|
579
581
|
...(context.entrance ? { entrance: context.entrance } : {}),
|
|
580
582
|
...(['OP', 'TC', 'MK', 'UX'].includes(seat ?? '') ? { seat } : {}),
|
|
581
583
|
cwd: `${basename(dirname(cwd))}/${basename(cwd)}`, hostname: hostname().split('.')[0]!, pid: process.pid,
|
|
582
584
|
...(context.output ? { lastLines: incidentLastLines(context.output) } : {}),
|
|
585
|
+
...(childEvidence ? { childEvidence } : {}),
|
|
583
586
|
}, effectiveInstanceRoot());
|
|
584
587
|
} catch { /* incident writes cannot change Pod output or exit */ }
|
|
585
588
|
}
|
|
586
589
|
|
|
590
|
+
function latestPodChildEvidence(entries: readonly RunLedgerEntry[] | null | undefined): PodChildEvidence | undefined {
|
|
591
|
+
// The current attempt's start is the fence. An earlier Pod's terminal facts cannot
|
|
592
|
+
// classify a later attempt when that attempt has no JSON or its ledger write failed.
|
|
593
|
+
const current = entries?.filter((entry) => entry.event === 'pod-child-run').at(-1)?.data;
|
|
594
|
+
if (typeof current?.job !== 'string' || typeof current.childRunId !== 'string') return undefined;
|
|
595
|
+
const data = entries?.filter((entry) => entry.event === 'pod-child-evidence'
|
|
596
|
+
&& entry.data?.job === current.job && entry.data?.childRunId === current.childRunId).at(-1)?.data;
|
|
597
|
+
const evidence = data?.childEvidence;
|
|
598
|
+
if (!evidence || typeof evidence !== 'object' || Array.isArray(evidence)) return undefined;
|
|
599
|
+
const row = evidence as Record<string, unknown>;
|
|
600
|
+
const object = (value: unknown): boolean => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
601
|
+
if (('scopeEscape' in row && row.scopeEscape !== true)
|
|
602
|
+
|| ('goalCauseObserved' in row && row.goalCauseObserved !== true)
|
|
603
|
+
|| ('classification' in row && typeof row.classification !== 'string')
|
|
604
|
+
|| ('abandonedClassification' in row && !object(row.abandonedClassification))
|
|
605
|
+
|| ('accountAvailability' in row && !object(row.accountAvailability))) return undefined;
|
|
606
|
+
return row as PodChildEvidence;
|
|
607
|
+
}
|
|
608
|
+
|
|
587
609
|
/** Every Pod launch entrance (harness ask/say · dev ask --substrate pod) warns once after a recent burst; it never blocks the launch. */
|
|
588
610
|
export function warnRecentIncidentBurst(
|
|
589
611
|
root: string = effectiveInstanceRoot(), now: Date = new Date(), write: (line: string) => void = (line) => console.error(line),
|
|
@@ -754,7 +776,10 @@ export function recordHarnessPodStop(
|
|
|
754
776
|
if (!runId) return false;
|
|
755
777
|
try {
|
|
756
778
|
if (runStopRecorded(runId)) return false;
|
|
757
|
-
|
|
779
|
+
const ledger = (deps.loadLedger ?? loadRunLedger)(runId);
|
|
780
|
+
if (ledger?.some((entry) => entry.event === RUN_STOP_EVENT)) return false;
|
|
781
|
+
const childEvidence = latestPodChildEvidence(ledger);
|
|
782
|
+
const scopeEscape = childEvidence?.scopeEscape === true;
|
|
758
783
|
if (classified.reason === 'preflight-refused') {
|
|
759
784
|
(deps.record ?? recordRunStop)({
|
|
760
785
|
runId, site: 'preflight', class: 'launch-failed',
|
|
@@ -772,18 +797,18 @@ export function recordHarnessPodStop(
|
|
|
772
797
|
if (detail) {
|
|
773
798
|
const write = deps.write ?? ((entry: RunLedgerEntry) => appendRunLedgerEntry(entry));
|
|
774
799
|
(deps.record ?? recordRunStop)({
|
|
775
|
-
runId, site: 'pod-exit', class: classifyPodExitStop(classified.reason),
|
|
800
|
+
runId, site: 'pod-exit', class: scopeEscape ? 'scope-escape' : classifyPodExitStop(classified.reason),
|
|
776
801
|
cause: `Pod exit ${status}: ${detail.podExitClass}${detail.lead ? ` — ${detail.lead}` : ''}`,
|
|
777
|
-
evidenceRef, nextMove,
|
|
802
|
+
evidenceRef, nextMove, ...(childEvidence ? { childEvidence } : {}),
|
|
778
803
|
}, (entry) => write({ ...entry, data: { ...entry.data, podExitClass: detail.podExitClass, tail: detail.tail } }));
|
|
779
804
|
return true;
|
|
780
805
|
}
|
|
781
806
|
// The classified line is our own one-line verdict («Pod 안 자식이 실패했다 — OOMKilled»), not the raw output tail.
|
|
782
807
|
const verdict = classified.lines[0]?.split(' — ').slice(1).join(' — ').trim();
|
|
783
808
|
(deps.record ?? recordRunStop)({
|
|
784
|
-
runId, site: 'pod-exit', class: classifyPodExitStop(classified.reason),
|
|
785
|
-
cause: `Pod exit ${status}: ${classified.reason}${verdict ? ` — ${verdict}` : ''}`,
|
|
786
|
-
evidenceRef, nextMove,
|
|
809
|
+
runId, site: 'pod-exit', class: scopeEscape ? 'scope-escape' : classifyPodExitStop(classified.reason),
|
|
810
|
+
cause: `Pod exit ${status}: ${scopeEscape ? 'scope-escape' : classified.reason}${verdict ? ` — ${verdict}` : ''}`,
|
|
811
|
+
evidenceRef, nextMove, ...(childEvidence ? { childEvidence } : {}),
|
|
787
812
|
}, ...(deps.write ? [deps.write] : []));
|
|
788
813
|
return true;
|
|
789
814
|
} catch { return false; /* ledger observation cannot change Pod output or exit */ }
|
|
@@ -2116,6 +2141,7 @@ const executeGh: GhExecute = (args) => {
|
|
|
2116
2141
|
export async function supersedeMergedGoalDrafts(
|
|
2117
2142
|
number: number, cwd: string,
|
|
2118
2143
|
execute: GhExecute = executeGh, git: DraftSweepGitExecute = runGitCommand,
|
|
2144
|
+
options: { onlyExplicitSameCell?: boolean } = {},
|
|
2119
2145
|
): Promise<void> {
|
|
2120
2146
|
const remote = git(cwd, ['config', '--get', 'remote.origin.url']);
|
|
2121
2147
|
const repository = remote.status === 0 ? githubRemoteRepository(remote.stdout) : undefined;
|
|
@@ -2132,8 +2158,10 @@ export async function supersedeMergedGoalDrafts(
|
|
|
2132
2158
|
number: pr.number, title: pr.title, body: pr.body ?? undefined, branch: pr.head.ref,
|
|
2133
2159
|
createdAt: pr.created_at, mergedAt: pr.merged_at,
|
|
2134
2160
|
};
|
|
2161
|
+
if (options.onlyExplicitSameCell && !/^Supersedes:\s*#\d+\s*$/m.test(merged.body ?? '')) return;
|
|
2135
2162
|
const { supersedeDraftsOnMerge } = await import('../self-dev/draft-sweep.js');
|
|
2136
|
-
await supersedeDraftsOnMerge({ repository, merged, adapters: githubDraftSweepAdapters(execute, git, cwd)
|
|
2163
|
+
await supersedeDraftsOnMerge({ repository, merged, adapters: githubDraftSweepAdapters(execute, git, cwd),
|
|
2164
|
+
...(options.onlyExplicitSameCell ? { onlyExplicitSameCell: true } : {}) });
|
|
2137
2165
|
}
|
|
2138
2166
|
|
|
2139
2167
|
/**
|
|
@@ -2527,7 +2555,7 @@ export function githubDraftSweepAdapters(execute: GhExecute = executeGh, git: Dr
|
|
|
2527
2555
|
}
|
|
2528
2556
|
return undefined;
|
|
2529
2557
|
};
|
|
2530
|
-
const issueCommentsFor = async (repository: string, number: number, what: 'review' | 'landing'): Promise<string[]> => {
|
|
2558
|
+
const issueCommentsFor = async (repository: string, number: number, what: 'review' | 'landing' | 'same-cell'): Promise<string[]> => {
|
|
2531
2559
|
const comments: string[] = [];
|
|
2532
2560
|
for (let page = 1; page <= 100; page++) {
|
|
2533
2561
|
const batch = await ghJsonAsync<Array<{ body?: string }>>(['api', `repos/${repository}/issues/${number}/comments?per_page=100&page=${page}`]);
|
|
@@ -2535,7 +2563,7 @@ export function githubDraftSweepAdapters(execute: GhExecute = executeGh, git: Dr
|
|
|
2535
2563
|
comments.push(...batch.map((comment) => comment.body ?? ''));
|
|
2536
2564
|
if (batch.length < 100) return comments;
|
|
2537
2565
|
}
|
|
2538
|
-
throw new Error(`${what === 'review' ? 'Review' : 'Landing'} comment inventory exceeded pagination limit`);
|
|
2566
|
+
throw new Error(`${what === 'review' ? 'Review' : what === 'same-cell' ? 'Same-cell' : 'Landing'} comment inventory exceeded pagination limit`);
|
|
2539
2567
|
};
|
|
2540
2568
|
const reviewGateForDraft = async (draft: SweepDraft, repository: string): Promise<SweepReviewGate | undefined> => {
|
|
2541
2569
|
const cached = await detailFor(repository, draft.number);
|
|
@@ -2716,6 +2744,7 @@ export function githubDraftSweepAdapters(execute: GhExecute = executeGh, git: Dr
|
|
|
2716
2744
|
listPrTerminals: async () => listRunLedgers().matches.flatMap((match) => match.entries.filter((entry) => entry.event === 'pr-terminal')
|
|
2717
2745
|
.map((entry) => entry.data as unknown as PrTerminalRecord)),
|
|
2718
2746
|
commentDraft: async (repository, number, body) => { execute(['pr', 'comment', String(number), '--repo', repository, '--body', body]); },
|
|
2747
|
+
listIssueComments: async (repository, number) => issueCommentsFor(repository, number, 'same-cell'),
|
|
2719
2748
|
removeLabel: async (repository, number, name) => { execute(['pr', 'edit', String(number), '--repo', repository, '--remove-label', name]); },
|
|
2720
2749
|
getReviewGate: async (draft, repository) => reviewGateForDraft(draft, repository),
|
|
2721
2750
|
// DRAFT-LINEAGE-ONE-1 — the sweep calls this only with `--apply`, only for a live run whose newer same-lineage run
|
|
@@ -3,6 +3,7 @@ import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync, statS
|
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { redactSecretText } from '../debug/log.js';
|
|
5
5
|
import { refuseProductionLedgerWriteInTest } from './ledger-write-guard.js';
|
|
6
|
+
import type { PodChildEvidence } from '../task-orchestrator/surfaces/self-implement.js';
|
|
6
7
|
|
|
7
8
|
export interface RunExit {
|
|
8
9
|
runId: string;
|
|
@@ -16,6 +17,7 @@ export interface RunExit {
|
|
|
16
17
|
hostname?: string;
|
|
17
18
|
pid?: number;
|
|
18
19
|
lastLines?: string[];
|
|
20
|
+
childEvidence?: PodChildEvidence;
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
export interface IncidentBurst {
|
|
@@ -77,6 +79,8 @@ export function readRunExits(root: string): RunExit[] {
|
|
|
77
79
|
...(typeof row.pid === 'number' && Number.isSafeInteger(row.pid) ? { pid: row.pid } : {}),
|
|
78
80
|
...(Array.isArray(row.lastLines) && row.lastLines.every((line) => typeof line === 'string')
|
|
79
81
|
? { lastLines: row.lastLines } : {}),
|
|
82
|
+
...(row.childEvidence && typeof row.childEvidence === 'object' && !Array.isArray(row.childEvidence)
|
|
83
|
+
? { childEvidence: row.childEvidence } : {}),
|
|
80
84
|
});
|
|
81
85
|
}
|
|
82
86
|
}
|
|
@@ -58,11 +58,41 @@ export interface HarnessPodDispatchInput {
|
|
|
58
58
|
readonly authorGradeSource?: import('../self-implement/goal-author.js').GoalAuthorGradeSource;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
/** The mbp fleet alias must select the installed local k3d context, with a deliberately small first capacity. */
|
|
62
|
+
export function resolveHarnessPodPool(spec: string | undefined): string | undefined {
|
|
63
|
+
if (!spec) return spec;
|
|
64
|
+
let changed = false;
|
|
65
|
+
let mbpCapacity = 0;
|
|
66
|
+
let mbpMembers = 0;
|
|
67
|
+
const members = spec.split(',').map((raw) => {
|
|
68
|
+
const part = raw.trim();
|
|
69
|
+
const alias = /^pool-mbp@mbp:(\d+)$/.exec(part);
|
|
70
|
+
const local = /^k3d-monad-h1:(\d+)$/.exec(part);
|
|
71
|
+
if (!alias && !local) {
|
|
72
|
+
if (/^pool-mbp@mbp(?::|$)/.test(part) || /^k3d-monad-h1(?::|$)/.test(part)) {
|
|
73
|
+
throw new Error(`mbp Pod 풀 스펙 오류: ${part}`);
|
|
74
|
+
}
|
|
75
|
+
return part;
|
|
76
|
+
}
|
|
77
|
+
const capacity = Number((alias ?? local)![1]);
|
|
78
|
+
if (!Number.isInteger(capacity) || capacity < 1 || capacity > 2) {
|
|
79
|
+
throw new Error(`mbp Pod 풀 상한은 1~2: ${part}`);
|
|
80
|
+
}
|
|
81
|
+
mbpCapacity += capacity;
|
|
82
|
+
mbpMembers++;
|
|
83
|
+
if (mbpCapacity > 2) throw new Error(`mbp Pod 풀 합산 상한은 2: ${spec}`);
|
|
84
|
+
if (mbpMembers > 1) throw new Error(`mbp Pod 풀 컨텍스트 중복: ${spec}`);
|
|
85
|
+
if (alias) changed = true;
|
|
86
|
+
return `k3d-monad-h1:${capacity}`;
|
|
87
|
+
});
|
|
88
|
+
return changed ? members.join(',') : spec;
|
|
89
|
+
}
|
|
90
|
+
|
|
61
91
|
export function podOrchestrateArgs(input: HarnessPodDispatchInput, goalFile: string): string[] {
|
|
62
92
|
return [
|
|
63
93
|
ELANOUS_ENTRY_SCRIPT, 'self', 'orchestrate', '--goal-file', goalFile,
|
|
64
94
|
'--substrate', 'pod',
|
|
65
|
-
...(input.podPool ? ['--pod-pool', input.podPool] : []),
|
|
95
|
+
...(input.podPool ? ['--pod-pool', resolveHarnessPodPool(input.podPool)!] : []),
|
|
66
96
|
// 하니스 기본(자동 병합)을 따른다 · 끄면 PR 까지 — 어느 쪽이든 Pod 가 사라져도 결과가 남는다.
|
|
67
97
|
...(input.repairCommitOnly ? [] : input.autoMerge === false ? ['--open-pr'] : ['--auto-merge']),
|
|
68
98
|
...(input.repairCommitOnly && input.source ? ['--base', `pr-${input.source.slice(3)}`] : input.base ? ['--base', input.base] : []),
|
|
@@ -99,6 +129,13 @@ export function dispatchHarnessOnPod(input: HarnessPodDispatchInput, deps: PodDi
|
|
|
99
129
|
export function dispatchHarnessOnPod(input: HarnessPodDispatchInput, deps?: PodDispatchDeps): number | Promise<number>;
|
|
100
130
|
export function dispatchHarnessOnPod(input: HarnessPodDispatchInput, deps: PodDispatchDeps = {}): number | Promise<number> {
|
|
101
131
|
const cwd = deps.cwd ?? process.cwd();
|
|
132
|
+
try { resolveHarnessPodPool(input.podPool); }
|
|
133
|
+
catch (error) {
|
|
134
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
135
|
+
debug.log('harness.substrate', 'pod-pool-refused', { entrance: input.entrance, reason });
|
|
136
|
+
console.error(reason);
|
|
137
|
+
return 2;
|
|
138
|
+
}
|
|
102
139
|
if (input.source !== undefined) {
|
|
103
140
|
try {
|
|
104
141
|
parsePodSourceSpec(input.source);
|
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
import type { Command } from 'commander';
|
|
6
6
|
import { debug } from '../debug/log.js';
|
|
7
7
|
import { normalizeRunId } from './harness-space.js';
|
|
8
|
-
import { loadFederatedRunLedger } from '../self-implement/run-ledger.js';
|
|
8
|
+
import { loadFederatedRunLedger, loadRunLedger } from '../self-implement/run-ledger.js';
|
|
9
|
+
import { prodInstanceRoot } from '../instance/resolve.js';
|
|
10
|
+
import { remoteLedgerMirrorDirs } from '../task-agent/parent-host.js';
|
|
9
11
|
import { getUserConfig } from '../user-config.js';
|
|
10
12
|
import { resolveRepositoryName } from './repository-name.js';
|
|
11
13
|
import {
|
|
@@ -35,9 +37,19 @@ export interface HarnessSalvageDeps {
|
|
|
35
37
|
print?: (line: string) => void;
|
|
36
38
|
}
|
|
37
39
|
|
|
40
|
+
/** 원격 부모 거울 원장 — remoteLedgerMirrorDirs(prodInstanceRoot()) 를 로컬·연합 원장 «뒤에»만 붙인다(tasks 쪽 원장 조회와 같은 재사용 경로 · 거울 생성·SSH 는 별개 칸). */
|
|
41
|
+
function loadMirroredRunLedger(runId: string): ReturnType<typeof loadRunLedger> {
|
|
42
|
+
for (const directory of remoteLedgerMirrorDirs(prodInstanceRoot())) {
|
|
43
|
+
const ledger = loadRunLedger(runId, directory);
|
|
44
|
+
if (ledger !== null) return ledger;
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
|
|
38
49
|
function defaultReadPr(runId: string): RunPrState {
|
|
39
50
|
try {
|
|
40
|
-
|
|
51
|
+
// 로컬·연합 원장 먼저, 없으면 원격 부모 거울 — 순서는 tasks 쪽 원장 조회와 같다.
|
|
52
|
+
return prStateFromLedger(loadFederatedRunLedger(runId, { includeTest: true }) ?? loadMirroredRunLedger(runId));
|
|
41
53
|
} catch (error) {
|
|
42
54
|
return { status: 'unknown', reason: `원장 읽기 실패 · ${error instanceof Error ? error.message : String(error)}` };
|
|
43
55
|
}
|