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
|
@@ -4,6 +4,7 @@ import { readFileSync, readdirSync } from 'node:fs';
|
|
|
4
4
|
import { join } from 'node:path';
|
|
5
5
|
import { parse as parseYaml } from 'yaml';
|
|
6
6
|
import { HARNESS_CORE_KINDS, hasNodeKind } from '../graph-kinds/registry.js';
|
|
7
|
+
import { parseOverlayCondition } from './graph-overlay-condition.js';
|
|
7
8
|
|
|
8
9
|
/** ⭐ RFC-graph-templates-as-yaml §5 «0단계» — YAML 저작본을 읽어 실행·해시·원장용 정규형으로.
|
|
9
10
|
*
|
|
@@ -36,6 +37,8 @@ export interface GraphNodeSpec {
|
|
|
36
37
|
/** Entry selected by this call when a unit exposes more than one entry. */
|
|
37
38
|
readonly callEntry?: string;
|
|
38
39
|
readonly budget?: { readonly innerSteps: number };
|
|
40
|
+
/** L1: skip this optional node when a measured state condition holds. */
|
|
41
|
+
readonly skipWhen?: string;
|
|
39
42
|
}
|
|
40
43
|
|
|
41
44
|
export interface GraphEdgeSpec {
|
|
@@ -48,6 +51,8 @@ export interface GraphEdgeSpec {
|
|
|
48
51
|
/** 심이 «주입 안 됐을 때» 내려가는 순서. `requires` 는 그 심 이름들. */
|
|
49
52
|
readonly fallback?: readonly { readonly node: string; readonly requires: readonly string[]; readonly observed?: number }[];
|
|
50
53
|
readonly observed?: number;
|
|
54
|
+
/** L1: a measured state condition takes precedence over the default edge. */
|
|
55
|
+
readonly when?: string;
|
|
51
56
|
}
|
|
52
57
|
|
|
53
58
|
export interface GraphTemplateSpec {
|
|
@@ -63,10 +68,41 @@ export interface GraphTemplateSpec {
|
|
|
63
68
|
/** ⭐ 런 계약(선택) — 이 그래프가 «기본으로» 요구하는 실행 칸 등. 발사 인자가 덮는다(graph-run-contract.ts). */
|
|
64
69
|
readonly runContract?: GraphRunContractSpec;
|
|
65
70
|
readonly unit?: { readonly inputs: readonly string[]; readonly outputs: readonly string[]; readonly exits: readonly string[]; readonly entries?: readonly string[] };
|
|
71
|
+
/** Non-executable landing policy declaration. The train executor consumes this in a later slice. */
|
|
72
|
+
readonly policy?: LandUnitTrainPolicySpec;
|
|
66
73
|
readonly nodes: readonly GraphNodeSpec[];
|
|
67
74
|
readonly edges: readonly GraphEdgeSpec[];
|
|
68
75
|
}
|
|
69
76
|
|
|
77
|
+
export interface LandUnitTrainPolicySpec {
|
|
78
|
+
readonly express: {
|
|
79
|
+
readonly by: readonly ('queueFlag' | 'predecessorOf' | 'multiplierTier' | 'p0InCutWindow2h')[];
|
|
80
|
+
readonly waitsForBatch: false;
|
|
81
|
+
readonly directive: string;
|
|
82
|
+
};
|
|
83
|
+
readonly batch: {
|
|
84
|
+
readonly min: number;
|
|
85
|
+
readonly max: number;
|
|
86
|
+
readonly groupBy: readonly ('area' | 'cellPrefix')[];
|
|
87
|
+
readonly maxWaitMin: number;
|
|
88
|
+
readonly order: readonly ('express' | 'predecessor' | 'enqueued')[];
|
|
89
|
+
readonly directive: string;
|
|
90
|
+
};
|
|
91
|
+
readonly scenarioPrebuild: {
|
|
92
|
+
readonly source: readonly ('src/ux-sim' | 'scenarios/ux-sim' | 'fake-llm' | 'fake-harness')[];
|
|
93
|
+
readonly mock: 'required';
|
|
94
|
+
readonly directive: string;
|
|
95
|
+
};
|
|
96
|
+
readonly gate: { readonly oncePerBatch: true; readonly directive: string };
|
|
97
|
+
readonly land: {
|
|
98
|
+
readonly perPr: 'squash';
|
|
99
|
+
readonly pinnedHead: true;
|
|
100
|
+
readonly ejectOnFail: true;
|
|
101
|
+
readonly integrationPr: false;
|
|
102
|
+
readonly directive: string;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
70
106
|
export interface GraphParseIssue {
|
|
71
107
|
readonly path: string;
|
|
72
108
|
readonly message: string;
|
|
@@ -80,6 +116,7 @@ export interface GraphParseResult {
|
|
|
80
116
|
|
|
81
117
|
/** ⚠️ YAML 함정 — `no`/`off`/`yes`/`on` 이 boolean 으로 파싱된다(Norway 문제). 노드 이름에 쓰면 조용히 깨진다. */
|
|
82
118
|
const YAML_TRAP_WORDS = new Set(['true', 'false', 'yes', 'no', 'on', 'off', 'null', '~']);
|
|
119
|
+
export const L1_PROTECTED_ROUTE_NODES = new Set(['gate', 'regate', 'review', 'merge', 'freeze-check']);
|
|
83
120
|
|
|
84
121
|
function asArray(value: unknown): unknown[] {
|
|
85
122
|
return Array.isArray(value) ? value : [];
|
|
@@ -102,6 +139,8 @@ export function parseGraphTemplateYaml(source: string, label = '<inline>'): Grap
|
|
|
102
139
|
|
|
103
140
|
const graphId = typeof doc.graph_id === 'string' ? doc.graph_id : undefined;
|
|
104
141
|
if (graphId === undefined) errors.push({ path: `${label}/graph_id`, message: 'graph_id 가 없거나 문자열이 아니다' });
|
|
142
|
+
const policy = graphId === 'land' ? parseLandUnitTrainPolicy(doc.policy, `${label}/policy`, errors) : undefined;
|
|
143
|
+
if (graphId === 'land' && doc.policy === undefined) errors.push({ path: `${label}/policy`, message: 'land 유닛에는 착지 열차 policy 가 필요하다' });
|
|
105
144
|
const version = typeof doc.version === 'number' && Number.isInteger(doc.version) ? doc.version : undefined;
|
|
106
145
|
if (version === undefined) errors.push({ path: `${label}/version`, message: 'version 이 없거나 정수가 아니다' });
|
|
107
146
|
const entryNode = typeof doc.entry_node === 'string' ? doc.entry_node : undefined;
|
|
@@ -147,6 +186,12 @@ export function parseGraphTemplateYaml(source: string, label = '<inline>'): Grap
|
|
|
147
186
|
: 'journey_stage 는 비어 있지 않은 문자열이어야 한다' });
|
|
148
187
|
continue;
|
|
149
188
|
}
|
|
189
|
+
if (n.skip_when !== undefined) {
|
|
190
|
+
if (typeof n.skip_when !== 'string' || !parseOverlayCondition(n.skip_when).ok)
|
|
191
|
+
errors.push({ path: `${at}/skip_when`, message: 'skip_when 은 오버레이 조건 한 개(key op literal)여야 한다' });
|
|
192
|
+
if (L1_PROTECTED_ROUTE_NODES.has(nodeId) || kind === 'gate' || terminalNodes.includes(nodeId))
|
|
193
|
+
errors.push({ path: `${at}/skip_when`, message: `'${nodeId}' 는 필수 검증·착지·종결 노드라 건너뛸 수 없다` });
|
|
194
|
+
}
|
|
150
195
|
const contractRaw = n.contract as Record<string, unknown> | undefined;
|
|
151
196
|
const contract: GraphNodeContract | undefined = contractRaw && typeof contractRaw === 'object'
|
|
152
197
|
? {
|
|
@@ -190,6 +235,7 @@ export function parseGraphTemplateYaml(source: string, label = '<inline>'): Grap
|
|
|
190
235
|
...(kind === 'subgraph' && n.budget && typeof n.budget === 'object' && !Array.isArray(n.budget) &&
|
|
191
236
|
typeof (n.budget as Record<string, unknown>).inner_steps === 'number'
|
|
192
237
|
? { budget: { innerSteps: (n.budget as { inner_steps: number }).inner_steps } } : {}),
|
|
238
|
+
...(typeof n.skip_when === 'string' ? { skipWhen: n.skip_when } : {}),
|
|
193
239
|
});
|
|
194
240
|
}
|
|
195
241
|
if (nodes.length === 0) errors.push({ path: `${label}/nodes`, message: '노드가 하나도 없다' });
|
|
@@ -205,6 +251,12 @@ export function parseGraphTemplateYaml(source: string, label = '<inline>'): Grap
|
|
|
205
251
|
if (!known.has(from)) { errors.push({ path: `${at}/from`, message: `'${from}' 은 선언된 노드가 아니다` }); continue; }
|
|
206
252
|
const hasTo = typeof e.to === 'string';
|
|
207
253
|
const hasMap = e.map !== null && typeof e.map === 'object';
|
|
254
|
+
if (e.when !== undefined && (typeof e.when !== 'string' || !parseOverlayCondition(e.when).ok))
|
|
255
|
+
errors.push({ path: `${at}/when`, message: 'when 은 오버레이 조건 한 개(key op literal)여야 한다' });
|
|
256
|
+
if (e.when !== undefined && (L1_PROTECTED_ROUTE_NODES.has(from) || nodes.some(node => node.nodeId === from && node.kind === 'gate') || terminalNodes.includes(from)))
|
|
257
|
+
errors.push({ path: `${at}/when`, message: `'${from}' 의 필수 검증·착지 결과는 when 간선으로 덮을 수 없다` });
|
|
258
|
+
if (e.when !== undefined && (!hasTo || hasMap || e.on !== undefined))
|
|
259
|
+
errors.push({ path: `${at}/when`, message: 'when 은 to 간선에서만 쓴다' });
|
|
208
260
|
if (hasTo === hasMap) {
|
|
209
261
|
errors.push({ path: at, message: 'to 와 map 중 «정확히 하나»를 써야 한다' });
|
|
210
262
|
continue;
|
|
@@ -237,8 +289,21 @@ export function parseGraphTemplateYaml(source: string, label = '<inline>'): Grap
|
|
|
237
289
|
...(hasMap ? { on: String(e.on), map } : {}),
|
|
238
290
|
...(fallback.length > 0 ? { fallback } : {}),
|
|
239
291
|
...(typeof e.observed === 'number' ? { observed: e.observed } : {}),
|
|
292
|
+
...(typeof e.when === 'string' ? { when: e.when } : {}),
|
|
240
293
|
});
|
|
241
294
|
}
|
|
295
|
+
for (const node of nodes) {
|
|
296
|
+
if (node.skipWhen === undefined) continue;
|
|
297
|
+
const outgoing = edges.filter(edge => edge.from === node.nodeId);
|
|
298
|
+
if (outgoing.length !== 1 || outgoing[0]?.to === undefined || outgoing[0]?.when !== undefined ||
|
|
299
|
+
(outgoing[0]?.fallback?.length ?? 0) > 0)
|
|
300
|
+
errors.push({ path: `${label}/nodes/${node.nodeId}/skip_when`, message: 'skip_when 노드에는 분기 없는 무조건 to 후속 간선 하나만 필요하다' });
|
|
301
|
+
}
|
|
302
|
+
for (const edge of edges) {
|
|
303
|
+
if (edge.when === undefined) continue;
|
|
304
|
+
if (!edges.some(candidate => candidate.from === edge.from && candidate.when === undefined))
|
|
305
|
+
errors.push({ path: `${label}/edges/${edge.from}/when`, message: 'when 간선에는 모호·미관측 때 탈 무조건 기본 간선이 필요하다' });
|
|
306
|
+
}
|
|
242
307
|
|
|
243
308
|
if (entryNode !== undefined && !known.has(entryNode)) errors.push({ path: `${label}/entry_node`, message: `'${entryNode}' 는 선언된 노드가 아니다` });
|
|
244
309
|
for (const t of terminalNodes) if (!known.has(t)) errors.push({ path: `${label}/terminal_nodes`, message: `'${t}' 는 선언된 노드가 아니다` });
|
|
@@ -288,6 +353,7 @@ export function parseGraphTemplateYaml(source: string, label = '<inline>'): Grap
|
|
|
288
353
|
template: {
|
|
289
354
|
graphId: graphId!, version: version!, entryNode: entryNode!, terminalNodes, nodes, edges,
|
|
290
355
|
...(unit ? { unit } : {}),
|
|
356
|
+
...(policy ? { policy } : {}),
|
|
291
357
|
...(Array.isArray(journeyStages) ? { journeyStages: journeyStages as string[] } : {}),
|
|
292
358
|
...(loop ? { loop } : {}),
|
|
293
359
|
...(typeof doc.docs_only_gate_skip === 'boolean' ? { docsOnlyGateSkip: doc.docs_only_gate_skip } : {}),
|
|
@@ -298,6 +364,89 @@ export function parseGraphTemplateYaml(source: string, label = '<inline>'): Grap
|
|
|
298
364
|
};
|
|
299
365
|
}
|
|
300
366
|
|
|
367
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
368
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
function exactKeys(value: Record<string, unknown>, keys: readonly string[]): boolean {
|
|
372
|
+
return Object.keys(value).length === keys.length && keys.every((key) => Object.hasOwn(value, key));
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function isEnumList<T extends string>(value: unknown, allowed: readonly T[], expected: readonly T[]): value is T[] {
|
|
376
|
+
return Array.isArray(value) && value.every((item): item is T => typeof item === 'string' && allowed.includes(item as T))
|
|
377
|
+
&& value.length === expected.length && expected.every((item, index) => value[index] === item);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function isDirectiveText(value: unknown): value is string {
|
|
381
|
+
if (typeof value !== 'string') return false;
|
|
382
|
+
const entry = value.replace(/[\p{P}\p{S}\s]/gu, '');
|
|
383
|
+
return entry.length > 0;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
function parseLandUnitTrainPolicy(
|
|
387
|
+
value: unknown,
|
|
388
|
+
path: string,
|
|
389
|
+
errors: GraphParseIssue[],
|
|
390
|
+
): LandUnitTrainPolicySpec | undefined {
|
|
391
|
+
if (value === undefined) return undefined;
|
|
392
|
+
const fail = (suffix: string, message: string): void => { errors.push({ path: `${path}${suffix}`, message }); };
|
|
393
|
+
if (!isRecord(value) || !exactKeys(value, ['express', 'batch', 'scenarioPrebuild', 'gate', 'land'])) {
|
|
394
|
+
fail('', 'policy 는 express·batch·scenarioPrebuild·gate·land 만 가진 맵이어야 한다');
|
|
395
|
+
return undefined;
|
|
396
|
+
}
|
|
397
|
+
const express = value.express;
|
|
398
|
+
const batch = value.batch;
|
|
399
|
+
const scenarioPrebuild = value.scenarioPrebuild;
|
|
400
|
+
const gate = value.gate;
|
|
401
|
+
const land = value.land;
|
|
402
|
+
const field = (name: string, raw: unknown, keys: readonly string[]): Record<string, unknown> | undefined => {
|
|
403
|
+
if (!isRecord(raw) || !exactKeys(raw, keys)) {
|
|
404
|
+
fail(`/${name}`, `${name} 필드는 ${keys.join('·')} 키만 가진 맵이어야 한다`);
|
|
405
|
+
return undefined;
|
|
406
|
+
}
|
|
407
|
+
if (!isDirectiveText(raw.directive))
|
|
408
|
+
fail(`/${name}/directive`, 'directive 는 구두점만으로 된 값이 아닌 비어 있지 않은 문자열이어야 한다');
|
|
409
|
+
return raw;
|
|
410
|
+
};
|
|
411
|
+
const e = field('express', express, ['by', 'waitsForBatch', 'directive']);
|
|
412
|
+
const b = field('batch', batch, ['min', 'max', 'groupBy', 'maxWaitMin', 'order', 'directive']);
|
|
413
|
+
const s = field('scenarioPrebuild', scenarioPrebuild, ['source', 'mock', 'directive']);
|
|
414
|
+
const g = field('gate', gate, ['oncePerBatch', 'directive']);
|
|
415
|
+
const l = field('land', land, ['perPr', 'pinnedHead', 'ejectOnFail', 'integrationPr', 'directive']);
|
|
416
|
+
|
|
417
|
+
if (e && !isEnumList(e.by, ['queueFlag', 'predecessorOf', 'multiplierTier', 'p0InCutWindow2h'], ['queueFlag', 'predecessorOf', 'multiplierTier', 'p0InCutWindow2h']))
|
|
418
|
+
fail('/express/by', 'by 는 queueFlag·predecessorOf·multiplierTier·p0InCutWindow2h 를 각각 한 번 포함해야 한다');
|
|
419
|
+
if (e && e.waitsForBatch !== false) fail('/express/waitsForBatch', 'express 는 waitsForBatch: false 여야 한다');
|
|
420
|
+
if (b) {
|
|
421
|
+
if (!Number.isSafeInteger(b.min) || b.min !== 2) fail('/batch/min', 'min 은 정확히 2여야 한다');
|
|
422
|
+
if (!Number.isSafeInteger(b.max) || b.max !== 4) fail('/batch/max', 'max 는 정확히 4여야 한다');
|
|
423
|
+
if (Number.isSafeInteger(b.min) && Number.isSafeInteger(b.max) && (b.min as number) > (b.max as number)) fail('/batch', 'min 은 max 이하여야 한다');
|
|
424
|
+
if (!isEnumList(b.groupBy, ['area', 'cellPrefix'], ['area', 'cellPrefix'])) fail('/batch/groupBy', 'groupBy 는 area·cellPrefix 를 각각 한 번 포함해야 한다');
|
|
425
|
+
if (!Number.isSafeInteger(b.maxWaitMin) || (b.maxWaitMin as number) !== 30) fail('/batch/maxWaitMin', 'maxWaitMin 은 30 정수여야 한다');
|
|
426
|
+
if (!Array.isArray(b.order) || b.order.length !== 3 || b.order.some((item, index) => item !== ['express', 'predecessor', 'enqueued'][index]))
|
|
427
|
+
fail('/batch/order', 'order 는 express·predecessor·enqueued 순이어야 한다');
|
|
428
|
+
}
|
|
429
|
+
if (s && !isEnumList(s.source, ['src/ux-sim', 'scenarios/ux-sim', 'fake-llm', 'fake-harness'], ['src/ux-sim', 'scenarios/ux-sim', 'fake-llm', 'fake-harness']))
|
|
430
|
+
fail('/scenarioPrebuild/source', 'source 는 UX sim·fake LLM·fake harness 네 경로를 각각 한 번 포함해야 한다');
|
|
431
|
+
if (s && s.mock !== 'required') fail('/scenarioPrebuild/mock', 'mock 은 required 여야 한다');
|
|
432
|
+
if (g && g.oncePerBatch !== true) fail('/gate/oncePerBatch', 'oncePerBatch 는 true 여야 한다');
|
|
433
|
+
if (l) {
|
|
434
|
+
if (l.perPr !== 'squash') fail('/land/perPr', 'perPr 은 squash 여야 한다');
|
|
435
|
+
if (l.pinnedHead !== true) fail('/land/pinnedHead', 'pinnedHead 는 true 여야 한다');
|
|
436
|
+
if (l.ejectOnFail !== true) fail('/land/ejectOnFail', 'ejectOnFail 은 true 여야 한다');
|
|
437
|
+
if (l.integrationPr !== false) fail('/land/integrationPr', 'integrationPr 는 false 여야 한다');
|
|
438
|
+
}
|
|
439
|
+
if (!e || !b || !s || !g || !l || errors.some((error) => error.path.startsWith(`${path}/`))) return undefined;
|
|
440
|
+
return {
|
|
441
|
+
express: { by: e.by as LandUnitTrainPolicySpec['express']['by'], waitsForBatch: false, directive: e.directive as string },
|
|
442
|
+
batch: { min: b.min as number, max: b.max as number, groupBy: b.groupBy as LandUnitTrainPolicySpec['batch']['groupBy'], maxWaitMin: b.maxWaitMin as number,
|
|
443
|
+
order: b.order as LandUnitTrainPolicySpec['batch']['order'], directive: b.directive as string },
|
|
444
|
+
scenarioPrebuild: { source: s.source as LandUnitTrainPolicySpec['scenarioPrebuild']['source'], mock: 'required', directive: s.directive as string },
|
|
445
|
+
gate: { oncePerBatch: true, directive: g.directive as string },
|
|
446
|
+
land: { perPr: 'squash', pinnedHead: true, ejectOnFail: true, integrationPr: false, directive: l.directive as string },
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
|
|
301
450
|
/** 정규 JSON — 「같은 그래프인가」를 답하는 유일한 형식. ⛔ 키를 «정렬»해 직렬화 순서를 없앤다. */
|
|
302
451
|
export function canonicalGraphJson(template: GraphTemplateSpec): string {
|
|
303
452
|
const sort = (value: unknown): unknown => {
|
|
@@ -330,7 +479,8 @@ export function loadGraphTemplates(dir: string): GraphLoadResult {
|
|
|
330
479
|
const templates: Record<string, GraphTemplateSpec> = {};
|
|
331
480
|
let files: string[];
|
|
332
481
|
try {
|
|
333
|
-
|
|
482
|
+
// recipes are command catalogs consumed by the runner, not graph templates.
|
|
483
|
+
files = readdirSync(dir).filter((f) => (f.endsWith('.yaml') || f.endsWith('.yml')) && f !== 'recipes.yaml' && f !== 'recipes.yml').sort();
|
|
334
484
|
} catch (error) {
|
|
335
485
|
return { templates, errors: [{ path: dir, message: `그래프 디렉토리를 못 읽었다: ${error instanceof Error ? error.message : String(error)}` }], warnings, scannedFiles: 0 };
|
|
336
486
|
}
|
|
@@ -1329,6 +1329,7 @@ export async function runHeadlessGoalLoopPty(opts: HeadlessGoalLoopPtyOptions):
|
|
|
1329
1329
|
workdir: opts.cwd,
|
|
1330
1330
|
env: {
|
|
1331
1331
|
...(opts.stateDir ? { ELANOUS_STATE_DIR: opts.stateDir } : {}),
|
|
1332
|
+
...(process.env.XDG_DATA_HOME?.trim() ? { XDG_DATA_HOME: process.env.XDG_DATA_HOME } : {}),
|
|
1332
1333
|
[CHILD_LIVENESS_HEARTBEAT_ENV]: resolveChildLivenessHeartbeatPath(opts.cwd),
|
|
1333
1334
|
...controlInboxEnv(controlInboxDir),
|
|
1334
1335
|
// ⛔⭐ 뿌리와 «한 벌»로 간다(`OBS-T121`) — 안 주면 자식이 「파생」을 「명시 격리」로 읽는다.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { spawnSync } from 'node:child_process';
|
|
2
2
|
import { randomUUID } from 'node:crypto';
|
|
3
|
-
import { existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, realpathSync, rmSync, symlinkSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, realpathSync, rmSync, rmdirSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { dirname, join, resolve } from 'node:path';
|
|
6
6
|
import { debug } from '../debug/log.js';
|
|
@@ -26,9 +26,41 @@ export function needsPwaBuild(files: readonly string[], repoRoot: string, graph:
|
|
|
26
26
|
* land worktree (TA-LAND-WORKTREE).
|
|
27
27
|
*/
|
|
28
28
|
export function provideCheckoutDependencies(candidate: string, sourceRoot: string, dir: string, marker: string, install: (cwd: string) => void): void {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
const candidateModules = join(candidate, dir, 'node_modules');
|
|
30
|
+
const candidateMarker = join(candidateModules, marker, 'package.json');
|
|
31
|
+
const sourceModules = join(sourceRoot, dir, 'node_modules');
|
|
32
|
+
if (existsSync(candidateMarker)) return;
|
|
33
|
+
if (existsSync(join(sourceModules, marker, 'package.json'))) {
|
|
34
|
+
let stat: ReturnType<typeof lstatSync> | undefined;
|
|
35
|
+
try { stat = lstatSync(candidateModules); }
|
|
36
|
+
catch (error) { if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error; }
|
|
37
|
+
if (stat) {
|
|
38
|
+
if (stat.isSymbolicLink()) {
|
|
39
|
+
// A dangling or stale link can block symlinkSync with EEXIST; unlink only the link itself.
|
|
40
|
+
try { unlinkSync(candidateModules); }
|
|
41
|
+
catch (error) { if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error; }
|
|
42
|
+
} else if (stat.isDirectory() && readdirSync(candidateModules).length === 0) {
|
|
43
|
+
try { rmdirSync(candidateModules); }
|
|
44
|
+
catch (error) {
|
|
45
|
+
if ((error as NodeJS.ErrnoException).code === 'ENOTEMPTY') {
|
|
46
|
+
install(join(candidate, dir));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
install(join(candidate, dir));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
symlinkSync(sourceModules, candidateModules, 'dir');
|
|
59
|
+
} catch (error) {
|
|
60
|
+
// Concurrent host regates may provision the same checked-out worktree. The first link wins;
|
|
61
|
+
// accept EEXIST only after confirming its package marker is now visible.
|
|
62
|
+
if ((error as NodeJS.ErrnoException).code !== 'EEXIST' || !existsSync(candidateMarker)) throw error;
|
|
63
|
+
}
|
|
32
64
|
} else install(join(candidate, dir));
|
|
33
65
|
}
|
|
34
66
|
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/** Bounded, read-only context from promoted repository knowhow. */
|
|
2
|
+
import { lstatSync, readFileSync, realpathSync, readdirSync, statSync } from 'node:fs';
|
|
3
|
+
import { join, relative, resolve, sep } from 'node:path';
|
|
4
|
+
|
|
5
|
+
export const KNOWHOW_PACK_MAX_BYTES = 4096;
|
|
6
|
+
const MARKER = '[KNOWHOW-PACK v1';
|
|
7
|
+
const SIGNATURES = ['no-progress', 'scope-escape', 'wallclock-cap', 'pod-job-failed', 'gate-failed', 'review-blocked', 'token_revoked'];
|
|
8
|
+
|
|
9
|
+
export interface KnowhowPack {
|
|
10
|
+
text: string;
|
|
11
|
+
ids: string[];
|
|
12
|
+
bytes: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function inside(root: string, path: string): boolean {
|
|
16
|
+
const rel = relative(root, path);
|
|
17
|
+
return rel === '' || (rel !== '..' && !rel.startsWith(`..${sep}`) && !rel.startsWith(sep));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function promotedSections(source: string): Array<{ id: string; text: string }> {
|
|
21
|
+
const sections: Array<{ id: string; text: string }> = [];
|
|
22
|
+
for (const block of source.split(/(?=^## K-[A-Z]+-\d+\b)/m)) {
|
|
23
|
+
const id = /^## (K-[A-Z]+-\d+)\b/m.exec(block)?.[1];
|
|
24
|
+
if (!id || !/^[-*] 출처:.*상태: active\s*$/m.test(block)) continue;
|
|
25
|
+
sections.push({ id, text: block.trim() });
|
|
26
|
+
}
|
|
27
|
+
return sections;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function mentionedPaths(text: string): Set<string> {
|
|
31
|
+
// Keep the complete repository-relative path, including package/docs prefixes.
|
|
32
|
+
// First slice: root filenames have no directory context and are deliberately excluded.
|
|
33
|
+
// A path may use any extension; reject absolute and parent-relative paths as whole tokens.
|
|
34
|
+
const paths = new Set<string>();
|
|
35
|
+
for (const match of text.matchAll(/(?<![\w./~-])([\w.-]+(?:\/[\w.-]+)+)/g)) {
|
|
36
|
+
const path = match[1].replace(/[.,;:!?]+$/, '');
|
|
37
|
+
const segments = path.split('/');
|
|
38
|
+
if (segments.some((segment) => segment === '.' || segment === '..' || !segment)) continue;
|
|
39
|
+
if (!/\.[\w-]+$/.test(segments.at(-1) ?? '')) continue;
|
|
40
|
+
paths.add(path);
|
|
41
|
+
}
|
|
42
|
+
return paths;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function relevance(goal: string, section: string): number {
|
|
46
|
+
const paths = mentionedPaths(goal);
|
|
47
|
+
const sourcePaths = mentionedPaths(section);
|
|
48
|
+
let score = 0;
|
|
49
|
+
for (const path of paths) {
|
|
50
|
+
if (sourcePaths.has(path)) score += 20;
|
|
51
|
+
}
|
|
52
|
+
// A path-scoped remedy must not be selected solely because an unrelated goal shares its failure label.
|
|
53
|
+
// No exact directory path match means no injection, even if the failure label happens to match.
|
|
54
|
+
if (score === 0) return 0;
|
|
55
|
+
for (const signature of SIGNATURES) {
|
|
56
|
+
if (goal.includes(signature) && section.includes(signature)) score += 6;
|
|
57
|
+
}
|
|
58
|
+
return score;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Reads only 내부 문서 `KNOWHOW` inside the supplied repository. */
|
|
62
|
+
export function selectKnowhowPack(repo: string, goal: string): KnowhowPack {
|
|
63
|
+
if (goal.includes(MARKER)) return { text: '', ids: [], bytes: 0 };
|
|
64
|
+
const rolesDir = resolve(repo, 'docs/roles');
|
|
65
|
+
let realRoles: string;
|
|
66
|
+
try {
|
|
67
|
+
realRoles = realpathSync(rolesDir);
|
|
68
|
+
if (!inside(realpathSync(repo), realRoles)) return { text: '', ids: [], bytes: 0 };
|
|
69
|
+
} catch { return { text: '', ids: [], bytes: 0 }; }
|
|
70
|
+
const candidates: Array<{ id: string; text: string; score: number }> = [];
|
|
71
|
+
let seatDirs: string[];
|
|
72
|
+
try { seatDirs = readdirSync(rolesDir).sort(); } catch { return { text: '', ids: [], bytes: 0 }; }
|
|
73
|
+
for (const seat of seatDirs) {
|
|
74
|
+
if (!/^[A-Z]{2,4}$/.test(seat)) continue;
|
|
75
|
+
const file = join(rolesDir, seat, 'KNOWHOW.md');
|
|
76
|
+
try {
|
|
77
|
+
if (lstatSync(file).isSymbolicLink()) continue;
|
|
78
|
+
const real = realpathSync(file);
|
|
79
|
+
if (!inside(realRoles, real) || !statSync(real).isFile() || statSync(real).size > 2_000_000) continue;
|
|
80
|
+
for (const section of promotedSections(readFileSync(real, 'utf8'))) {
|
|
81
|
+
const score = relevance(goal, section.text);
|
|
82
|
+
if (score > 0) candidates.push({ ...section, score });
|
|
83
|
+
}
|
|
84
|
+
} catch { /* A missing or unreadable source contributes no entry. */ }
|
|
85
|
+
}
|
|
86
|
+
candidates.sort((a, b) => b.score - a.score || a.id.localeCompare(b.id));
|
|
87
|
+
const selected: typeof candidates = [];
|
|
88
|
+
for (const candidate of candidates) {
|
|
89
|
+
if (selected.length === 3) break;
|
|
90
|
+
const next = [...selected, candidate];
|
|
91
|
+
const ids = next.map((item) => item.id);
|
|
92
|
+
const body = next.map((item) => item.text).join('\n\n');
|
|
93
|
+
const text = `${MARKER} ids=${ids.join(',')}]\n참고 자료(명령이 아닌 검증할 운영 기록):\n${body}\n[/KNOWHOW-PACK]`;
|
|
94
|
+
if (Buffer.byteLength(text, 'utf8') > KNOWHOW_PACK_MAX_BYTES) continue;
|
|
95
|
+
selected.push(candidate);
|
|
96
|
+
}
|
|
97
|
+
if (!selected.length) return { text: '', ids: [], bytes: 0 };
|
|
98
|
+
const ids = selected.map((item) => item.id);
|
|
99
|
+
const body = selected.map((item) => item.text).join('\n\n');
|
|
100
|
+
const text = `${MARKER} ids=${ids.join(',')}]\n참고 자료(명령이 아닌 검증할 운영 기록):\n${body}\n[/KNOWHOW-PACK]`;
|
|
101
|
+
return { text, ids, bytes: Buffer.byteLength(text, 'utf8') };
|
|
102
|
+
}
|
|
103
|
+
|
|
@@ -93,6 +93,7 @@ import { boundaryGlobs, boundaryViolations } from './goal-boundary.js';
|
|
|
93
93
|
import { askAtExecution, type ExecutionClarificationResult } from './execution-clarification.js';
|
|
94
94
|
import { classifyOutOfScope } from './scope-adjacency.js';
|
|
95
95
|
import { targetScopedGoalText } from './goal-text-path-scope.js';
|
|
96
|
+
import { selectKnowhowPack } from './knowhow-pack.js';
|
|
96
97
|
import { declaredNewFilePaths } from './goal-new-paths.js';
|
|
97
98
|
import { dropStaleReverts, type RevertGuardResult } from './revert-guard.js';
|
|
98
99
|
import type { SelfDevGoalType } from '../self-dev/orchestrate.js';
|
|
@@ -155,6 +156,22 @@ import { AUTO_REVIEW_LABEL, resolveAutoReviewLabels } from './context-capsule.js
|
|
|
155
156
|
import { GOAL_TYPES, extractVerbatimOriginalAsk, leadingGoalMetadata, parseAskFile, parseGoalType, type GoalType } from './goal-author.js';
|
|
156
157
|
import { goalDocumentForReleaseNote, goalChecklistIds, prTitle } from './pr-title.js';
|
|
157
158
|
export { goalChecklistIds, prTitle } from './pr-title.js';
|
|
159
|
+
|
|
160
|
+
/** TA's card slot is carried by the Pod, independent of goal-author prose. */
|
|
161
|
+
export function prChecklistLine(feature: string, goalFile?: string, slotId = process.env.ELANOUS_POD_SLOT_ID): string {
|
|
162
|
+
const slot = slotId?.trim();
|
|
163
|
+
if (slot && /^[A-Z][A-Z0-9]*(?:-[A-Z0-9]+)+$/.test(slot)) return `칸: ${slot}`;
|
|
164
|
+
const goalIds = goalChecklistIds(feature, goalFile);
|
|
165
|
+
return `칸: 미상\n골 ID: ${goalIds.join(' · ') || '없음'}`;
|
|
166
|
+
}
|
|
167
|
+
/** Preserve authored card lines as quoted prose; only the first line is machine readable. */
|
|
168
|
+
function onePrChecklistLine(body: string): string {
|
|
169
|
+
let first = true;
|
|
170
|
+
return body.replace(/^칸:[^\n]*$/gm, (line) => {
|
|
171
|
+
if (first) { first = false; return line; }
|
|
172
|
+
return `> ${line}`;
|
|
173
|
+
});
|
|
174
|
+
}
|
|
158
175
|
import { renderRoundSummaryCard, type RoundSummaryEntry } from './round-summary-card.js';
|
|
159
176
|
import { computeFlexSignals } from './flex-signals.js';
|
|
160
177
|
import { resolveAdaptiveMaxReworkDecision, resolveEscalateTier, resolveEscalateTarget, buildReworkFeature, failIndicator, isRepeatedUnverifiedOnlyGateFailure, unverifiedRepeatKey, appendReworkHistory, truncateReworkHistoryByItem, applyReworkBudgetDecision, parseContractConflictRelaxation, parseReworkBudgetDecision, resolveReworkBudgetCarry, stripReworkBudgetHeaders, countConsecutiveMustFixIds, mergeReworkNotes, resolveReworkKind, type ReworkPlanRevision, type ReworkNotePart } from './rework-policy.js';
|
|
@@ -2305,7 +2322,7 @@ export interface SelfImplementResult {
|
|
|
2305
2322
|
/** Additive hard-cap disposition; outcome remains the stable public terminal contract. */
|
|
2306
2323
|
salvage?: 'launched' | 'parked';
|
|
2307
2324
|
/** Rework stopped on exclusively baseline/flaky/precondition failures; do not retry this goal against the same base. */
|
|
2308
|
-
terminationReason?: 'blocked-by-baseline';
|
|
2325
|
+
terminationReason?: 'blocked-by-baseline' | 'goal-only-rework-exhausted';
|
|
2309
2326
|
sessionId?: string;
|
|
2310
2327
|
worktreePath?: string;
|
|
2311
2328
|
branch?: string;
|
|
@@ -2615,13 +2632,13 @@ export function gateNotRunSection(gateLog?: string): string[] {
|
|
|
2615
2632
|
return lines.length ? ['', '## Gate · 안 돈 소비자 시험(상한 초과)', ...lines.map((line) => `- ${line.replace(/^⚠️ caller test cap exceeded — not run: /, '')}`)] : [];
|
|
2616
2633
|
}
|
|
2617
2634
|
|
|
2618
|
-
function prBody(feature: string, implSummary: string, gateLog?: string, review?: SelfImplementReview, reviewIntent?: string, autoReviewDeclineReasons?: readonly string[], evidence?: string, goalFile?: string, planRevision?: ReworkPlanRevision, releaseNote?: ReturnType<typeof harnessReleaseNote>, revertGuard?: RevertGuardResult): string {
|
|
2635
|
+
export function prBody(feature: string, implSummary: string, gateLog?: string, review?: SelfImplementReview, reviewIntent?: string, autoReviewDeclineReasons?: readonly string[], evidence?: string, goalFile?: string, planRevision?: ReworkPlanRevision, releaseNote?: ReturnType<typeof harnessReleaseNote>, revertGuard?: RevertGuardResult): string {
|
|
2619
2636
|
const note = releaseNote ?? releaseNoteForRun(goalFile, feature);
|
|
2620
2637
|
const relaxation = planRevision?.relaxation
|
|
2621
2638
|
? ['', '## 감독 수용 기준 완화', `- 대상: ${planRevision.relaxation.target}`, `- 이전: ${planRevision.relaxation.expected}`, `- 완화: ${planRevision.relaxation.replacement}`, `- 이유: ${planRevision.reason}`, `- 적용: ${planRevision.application?.status ?? 'failed'}${planRevision.application?.detail ? ` (${planRevision.application.detail})` : ''}`, ...(planRevision.disposition ? [`- 충돌 처분: ${planRevision.disposition}`] : [])]
|
|
2622
2639
|
: [];
|
|
2623
|
-
return [
|
|
2624
|
-
|
|
2640
|
+
return onePrChecklistLine([
|
|
2641
|
+
prChecklistLine(feature, goalFile),
|
|
2625
2642
|
'## 요청',
|
|
2626
2643
|
...(goalFile ? [`- 골 파일: ${formatGoalFileForPrBody(goalFile)}`] : []),
|
|
2627
2644
|
feature.trim(),
|
|
@@ -2650,7 +2667,7 @@ function prBody(feature: string, implSummary: string, gateLog?: string, review?:
|
|
|
2650
2667
|
...relaxation,
|
|
2651
2668
|
'',
|
|
2652
2669
|
'🤖 self-implement 오케스트레이터 (elanous 자율 구현·리뷰-게이트 병합)',
|
|
2653
|
-
].join('\n');
|
|
2670
|
+
].join('\n'));
|
|
2654
2671
|
}
|
|
2655
2672
|
|
|
2656
2673
|
/**
|
|
@@ -2838,8 +2855,8 @@ export function formatBlockedDraftClassificationSection(
|
|
|
2838
2855
|
}
|
|
2839
2856
|
|
|
2840
2857
|
function blockedDraftPrBody(feature: string, implSummary: string, state: BlockedDraftPrState, goalFile?: string): string {
|
|
2841
|
-
return [
|
|
2842
|
-
|
|
2858
|
+
return onePrChecklistLine([
|
|
2859
|
+
prChecklistLine(feature, goalFile),
|
|
2843
2860
|
BLOCKED_DRAFT_PR_HUMAN_JUDGMENT_ANCHOR,
|
|
2844
2861
|
state.salvageStatusExpected
|
|
2845
2862
|
? BLOCKED_DRAFT_PR_SALVAGE_STATUS_INSTRUCTION
|
|
@@ -2886,8 +2903,10 @@ function blockedDraftPrBody(feature: string, implSummary: string, state: Blocked
|
|
|
2886
2903
|
: [`- passed: ${state.typecheck.passed}`, ...(state.typecheck.log ? ['```', state.typecheck.log.trim().slice(0, 3000), '```'] : [])]),
|
|
2887
2904
|
...(state.review?.mustFix.length ? ['', '## 마지막 리뷰 must-fix', ...state.review.mustFix.map((item) => `- ${item}`)] : []),
|
|
2888
2905
|
'',
|
|
2889
|
-
|
|
2890
|
-
|
|
2906
|
+
// The blocked body already carries the card line above; keep exactly one machine-readable line.
|
|
2907
|
+
prBody(feature, implSummary, undefined, state.review, undefined, undefined, undefined, goalFile, state.planRevision)
|
|
2908
|
+
.replace(/^칸: [^\n]*\n/, ''),
|
|
2909
|
+
].join('\n'));
|
|
2891
2910
|
}
|
|
2892
2911
|
|
|
2893
2912
|
type PreparedPrBody = {
|
|
@@ -4867,11 +4886,13 @@ async function runSelfImplementInner(
|
|
|
4867
4886
|
...(n.progress ? { progress: n.progress } : {}), ...(n.phases ? { phases: n.phases } : {}),
|
|
4868
4887
|
...(n.terminalStages ? { terminal_stages: n.terminalStages } : {}),
|
|
4869
4888
|
...(n.fanOut ? { fan_out: n.fanOut } : {}), ...(n.contract ? { contract: n.contract } : {}),
|
|
4889
|
+
...(n.skipWhen ? { skip_when: n.skipWhen } : {}),
|
|
4870
4890
|
})),
|
|
4871
4891
|
edges: variantSpec.edges.map(e => ({
|
|
4872
4892
|
from: e.from, ...(e.to === undefined ? { on: e.on, map: e.map } : { to: e.to }),
|
|
4873
4893
|
...(e.fallback ? { fallback: e.fallback } : {}),
|
|
4874
4894
|
...(e.observed === undefined ? {} : { observed: e.observed }),
|
|
4895
|
+
...(e.when ? { when: e.when } : {}),
|
|
4875
4896
|
})),
|
|
4876
4897
|
}), { flag: 'wx' });
|
|
4877
4898
|
observe('graph-variant-applied', { graphId: variant.template.graphId, overlayId: variant.overlay.overlayId,
|
|
@@ -5233,6 +5254,11 @@ async function runSelfImplementInner(
|
|
|
5233
5254
|
} else observe('memory', { injected: false });
|
|
5234
5255
|
}
|
|
5235
5256
|
|
|
5257
|
+
// The repository copy travels with both local and Pod worktrees. Operational HQ ledgers are never read here.
|
|
5258
|
+
const knowhow = selectKnowhowPack(wt.path, opts.feature);
|
|
5259
|
+
if (knowhow.text) round0Feature = `${knowhow.text}\n\n${round0Feature}`;
|
|
5260
|
+
observe('knowhow-pack', { ids: knowhow.ids, bytes: knowhow.bytes, injected: knowhow.bytes > 0 });
|
|
5261
|
+
|
|
5236
5262
|
const maxRework = Math.max(0, opts.maxReworkRounds ?? 2);
|
|
5237
5263
|
const selfImplementConfig = (await import('../user-config.js')).getUserConfig().tools.selfImplement;
|
|
5238
5264
|
const shadowStop = opts.reworkBudgetShadowStop ?? selfImplementConfig.reworkBudget.shadowStop;
|
|
@@ -5583,6 +5609,9 @@ async function runSelfImplementInner(
|
|
|
5583
5609
|
};
|
|
5584
5610
|
}
|
|
5585
5611
|
let round = 0;
|
|
5612
|
+
// A goal-only retry spends its one allowance for this run even if a later
|
|
5613
|
+
// gate/review round removes the target diff and reaches the same disposition.
|
|
5614
|
+
let goalOnlyReworkUsed = false;
|
|
5586
5615
|
// PR이 열리기 전에 프로세스가 죽으면 PR 자체가 없으므로 잃을 대화도 없다. 따라서 파일로 영속화하지 않는다.
|
|
5587
5616
|
const prCommentBuffer: string[] = [];
|
|
5588
5617
|
// GitHub PR comment bodies are bounded; retain the RFC header and disclose omitted source rather than losing the whole record.
|
|
@@ -6948,6 +6977,75 @@ async function runSelfImplementInner(
|
|
|
6948
6977
|
// ⭐ 성공 경로에서도 닫는다 — 이 호출은 끝났고, 이후 자식이 늦게 보내는 입력은
|
|
6949
6978
|
// 「이 라운드의 재투입」이 아니다(다음 라운드는 자기 콜백을 새로 만든다).
|
|
6950
6979
|
closeSupervisorInput();
|
|
6980
|
+
// A child that actually worked and declared completion may still leave only the
|
|
6981
|
+
// harness-seeded goal document. Give it one actionable implementation retry before
|
|
6982
|
+
// the blocked-artifact path reaches the goal-only PR guard.
|
|
6983
|
+
let goalOnlyReworkExhausted = false;
|
|
6984
|
+
if (!impl.ok && impl.completionDisposition === 'completed-without-changes'
|
|
6985
|
+
&& impl.terminalStatus?.reached === true && impl.terminalStatus.timedOut === false
|
|
6986
|
+
&& !goalOnlyReworkUsed && round < effectiveMax && !hasCurrentProviderError() && !hasCurrentCredentialFailure()
|
|
6987
|
+
&& opts.goalFile) {
|
|
6988
|
+
let targets: readonly string[] | undefined;
|
|
6989
|
+
let goalDocument: string | undefined;
|
|
6990
|
+
try {
|
|
6991
|
+
goalDocument = readFileSync(opts.goalFile, 'utf8');
|
|
6992
|
+
const declared = declaredPathsFromGoalDocumentText(goalDocument);
|
|
6993
|
+
if (declared.readable && declared.paths.length > 0) targets = declared.paths;
|
|
6994
|
+
} catch { /* unreadable scope is not grounds for an automatic retry */ }
|
|
6995
|
+
let before: readonly string[] | undefined;
|
|
6996
|
+
try { before = (s.changedFilesForGateRoute ?? changedFiles)(wt.path); } catch { /* unknown diff */ }
|
|
6997
|
+
if (targets && goalDocument && before !== undefined) {
|
|
6998
|
+
const eligible = (files: readonly string[]): string[] => files.filter(path =>
|
|
6999
|
+
!harnessSeededPaths.includes(path) && !isHarnessTempArtifact(path)
|
|
7000
|
+
&& targets!.some(target => changedFileIsInsideDeclaredTarget(path, target)));
|
|
7001
|
+
if (eligible(before).length === 0) {
|
|
7002
|
+
goalOnlyReworkUsed = true;
|
|
7003
|
+
const firstToolCalls = impl.toolCalls ?? null;
|
|
7004
|
+
const retryRound = round + 1;
|
|
7005
|
+
const retryNote = [
|
|
7006
|
+
'[구현 재작업 · completed-without-changes]',
|
|
7007
|
+
`대상 경로: ${targets.join(' · ')}`,
|
|
7008
|
+
'원래 골의 완료 경계를 위 대상 경로에 구현하라. 해당 파일에 실제 변경을 남기고 바꾼 경로와 검증 결과를 RESULT: 한 줄에 적어라.',
|
|
7009
|
+
'직전 자식은 완료를 선언했지만 대상 변경이 0개였다. 원래 골의 요구와 완료 경계를 다시 읽고 그 구현에 집중하라.',
|
|
7010
|
+
'원래 골 문서(완료 경계 포함):',
|
|
7011
|
+
goalDocument,
|
|
7012
|
+
].join('\n');
|
|
7013
|
+
observe('implementation-goal-only-rework', { status: 'started', round: retryRound, targets, firstToolCalls, targetDiffCount: 0 });
|
|
7014
|
+
progress('implementing', `대상 변경 0 — 구현 재작업 ${retryRound} 시작`);
|
|
7015
|
+
onNodeEntry(node('rework'), retryRound);
|
|
7016
|
+
onNodeEntry(node('implement'), retryRound);
|
|
7017
|
+
const retryAbort = new AbortController();
|
|
7018
|
+
const first = impl;
|
|
7019
|
+
try {
|
|
7020
|
+
impl = await stepTimeout(s.implement({
|
|
7021
|
+
sessionId, cwd: wt.path, feature: `${feature}\n\n${retryNote}`, runId, shardIdentity,
|
|
7022
|
+
signal: retryAbort.signal,
|
|
7023
|
+
...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
|
|
7024
|
+
onSurfaceProgress: line => progress('implementing', line.trimEnd()),
|
|
7025
|
+
roundContext: { round: retryRound, effectiveMax, previousRoundFailure: retryNote },
|
|
7026
|
+
...(opts.childLlm ? { childLlm: opts.childLlm } : {}),
|
|
7027
|
+
...(opts.documentReferences ? { documentReferences: opts.documentReferences } : {}),
|
|
7028
|
+
}), T.implement, 'implement');
|
|
7029
|
+
} catch (error) {
|
|
7030
|
+
retryAbort.abort();
|
|
7031
|
+
impl = { ok: false, summary: `goal-only-rework-exhausted: ${safeErrorDescription(error)}`, completionDisposition: first.completionDisposition };
|
|
7032
|
+
}
|
|
7033
|
+
let after: readonly string[] | undefined;
|
|
7034
|
+
try { after = (s.changedFilesForGateRoute ?? changedFiles)(wt.path); } catch { /* unknown diff */ }
|
|
7035
|
+
const targetDiff = after === undefined ? undefined : eligible(after);
|
|
7036
|
+
const resultLine = /(?:^|\n)\s*RESULT:\s*\S/m.test(impl.evidenceTranscript ?? impl.summary);
|
|
7037
|
+
const succeeded = impl.ok && !!targetDiff?.length && resultLine;
|
|
7038
|
+
goalOnlyReworkExhausted = !succeeded;
|
|
7039
|
+
observe('implementation-goal-only-rework', {
|
|
7040
|
+
status: succeeded ? 'succeeded' : 'exhausted', round: retryRound, targets,
|
|
7041
|
+
firstToolCalls, retryToolCalls: impl.toolCalls ?? null,
|
|
7042
|
+
targetDiffCount: targetDiff?.length ?? null, diffMeasured: after !== undefined, resultLine,
|
|
7043
|
+
}, succeeded ? {} : { level: 'warn' });
|
|
7044
|
+
if (!succeeded) impl = { ...impl, ok: false, summary: `goal-only-rework-exhausted: ${impl.summary}` };
|
|
7045
|
+
round = retryRound;
|
|
7046
|
+
}
|
|
7047
|
+
}
|
|
7048
|
+
}
|
|
6951
7049
|
// A finished child can leave edits without a commit. Measure them before any
|
|
6952
7050
|
// diff/no-changes classification, and commit only paths declared in the goal.
|
|
6953
7051
|
finishedChildCommitMissing = false;
|
|
@@ -7121,7 +7219,7 @@ async function runSelfImplementInner(
|
|
|
7121
7219
|
toolCalls: impl.toolCalls ?? null,
|
|
7122
7220
|
});
|
|
7123
7221
|
progress('aborted', progressLine);
|
|
7124
|
-
const pr = await preserveBlockedArtifacts({
|
|
7222
|
+
const pr = goalOnlyReworkExhausted ? undefined : await preserveBlockedArtifacts({
|
|
7125
7223
|
stage: 'aborted',
|
|
7126
7224
|
reason: abort.reason,
|
|
7127
7225
|
childSummary: abort.childSummary,
|
|
@@ -7132,7 +7230,7 @@ async function runSelfImplementInner(
|
|
|
7132
7230
|
salvageStatusExpected: false,
|
|
7133
7231
|
...(abort.terminalStatus ? { terminalStatus: abort.terminalStatus } : {}),
|
|
7134
7232
|
});
|
|
7135
|
-
return { ok: false, stage: 'aborted', node: 'implement', ...resolveRunOutcome({ termination: 'abandoned' }), sessionId, worktreePath: wt.path, branch: wt.branch, quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(), ...(impl.completionDisposition ? { completionDisposition: impl.completionDisposition } : {}), ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: impl.summary };
|
|
7233
|
+
return { ok: false, stage: 'aborted', node: 'implement', ...resolveRunOutcome({ termination: 'abandoned' }), ...(goalOnlyReworkExhausted ? { terminationReason: 'goal-only-rework-exhausted' as const } : {}), sessionId, worktreePath: wt.path, branch: wt.branch, quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(), ...(impl.completionDisposition ? { completionDisposition: impl.completionDisposition } : {}), ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: impl.summary };
|
|
7136
7234
|
}
|
|
7137
7235
|
|
|
7138
7236
|
if (finishedChildCommitMissing) {
|