elanous 0.2.29 → 0.2.32
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/{cIpv5nU9AycwYWZI9H589 → IVKr3AlRUVLKsw2fh7eXF}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{058a98ba.7eb28d5e6dc03565.js → 0bb0ff36.b8d418980951e5ba.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +287 -0
- package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +62 -0
- package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6013-2f769370d8b4c2c6.js → 1335-6731f392c35216eb.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8332.6f0f49df772e163b.js → 1654.32de4b324981a188.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1834-98b64172bc1efe77.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{8795.32573a185af18c7b.js → 1913.7cc6fb6055b1ed3f.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{419.736c0d6f426249a7.js → 2001.6c7e0fd02190886c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2112-e4efc21a6505d5bc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6767.1fcfc9b8be83975f.js → 2213.2ccbada92c33ea0f.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2534.e85ae21ad0dac829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4759.1f76713aefb87db5.js → 2871.0bca6137343b3f76.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6776.06ff1e3b464cc607.js → 2898.fd781bc7cf01a7b7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1782-59db1b5aa06df38a.js → 2940-619bfd8ef337c611.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8471.8d2a8c74f09c36ff.js → 2985.39ccdecd36848b12.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +115 -0
- package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +64 -0
- package/apps/pwa/out/_next/static/chunks/{bc324b7c.02a09dd93f6a399b.js → 3267c0e6.d34854e7b3984a6e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3278.2e5d15b53a4091c8.js +2 -0
- package/apps/pwa/out/_next/static/chunks/{7725-4f83d5541fbdb81b.js → 3541-ce3a5424ed5ad7f1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3583.a05e88cc8d594628.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3902.e1e71aaac850a045.js +34 -0
- package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{46bd8bea.2f4b4099172fcdb7.js → 409f1e57.d0649fc47691ebfe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4111.2bfedbb233ad206b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1142.65d002789ab3af7d.js → 4174.92ed04922709ac9e.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +36 -0
- package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +286 -0
- package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +77 -0
- package/apps/pwa/out/_next/static/chunks/4745.67d6f99c245af3f7.js +226 -0
- package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4999.c064a4000c2a9e94.js +79 -0
- package/apps/pwa/out/_next/static/chunks/5173-233188df2f42c626.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5304.04d24756f242a094.js +148 -0
- package/apps/pwa/out/_next/static/chunks/5307.60f2209e809bd627.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3396-97b97928c49190c9.js → 5458-16cd7a2b51b74c8c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3403.7199205e65124486.js → 5525.86debf231e181813.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9143.ff14585db1d275ff.js → 5543.a438b8ab5a13ea47.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +74 -0
- package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +94 -0
- package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8398.73a19b39715eda04.js → 6092.a7f99e68b188ca66.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/60fb96c9.360b01d8d4927b7b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5591.a35e7a217734a8b9.js → 6157.0c9af021de4fb31b.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6323.8672b4817a306928.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7375.050ea0d72968e49f.js → 6433.fc573af22bbc9ab7.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +90 -0
- package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6544cb48.a87fe20ddf137be2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +104 -0
- package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6767.ea607cf0c20a25af.js +24 -0
- package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +93 -0
- package/apps/pwa/out/_next/static/chunks/69-0a2c8209c6d4a158.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7371.80c05c653b08e907.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7391.ebae168025c91b6a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1852.7f7b53991fcb99ef.js → 7502.ccd5b8065545edd0.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +8 -0
- package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6534.1ab00f370db7b105.js → 7862.30a8d6482bb238eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7947-d0759430f8042240.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{285adb1a.5654e605dddf86d2.js → 7a1887c4.f36b88fba31da8fd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8018.a32663f04a6fc5f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8097-9530c03bcc550f02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +1 -0
- package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9002.e5658224e3dc1b6f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1516.dfaceff3fd2d0e0d.js → 9138.b6e80031afb1d973.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9907.49be0fcadaf214b5.js → 9221.7d22eaf353a2d4e7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8767-2f6a634f5abeaa01.js → 9279-d28c5b7754d010ae.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3160-95c96f4d2a21dd26.js → 9398-6aed28f0a96d0d6f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9407.e49124dedf0f5e72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{328bb3ab-6628a1114fe3fb3b.js → 997ce8a5-2ad501927003b41b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6853.cc5174a9dee59593.js → 9989.3694300e5f000b14.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-504204b58c82c253.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a9717a67c2eecbaf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-5c9ec30aee62dfbf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-584191533721fa16.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-73c4b4bb3ac7ab5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-c0f1ca371f710b06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-46430d45a9e04eac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-3b2ebf1dc64ff0be.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-a27b1e5a0d1b308f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-25654b82094f7d22.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-8ea49a4c6dd2c6e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-ce5113aefea0a8d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0e5a41fac1c75396.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-31aaf1ed37c6df9a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-3dcc1fa411e1f4e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c69247e7134d329d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-66dc5cd3a0999abe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-26ff7ff651a7217d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-617b3976981efa96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-d256f5d5d9552823.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-ce8f1907b8a6101c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-33e182a316263116.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-32866485913d6a04.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-7607cca9b84950c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-eeab86176b03dc3b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-5b93dbae3432b996.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-77a6cb90a9cf2b10.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f47e768b5b242b5a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-eb41aa3367fc2505.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-4d13ab0b8a267e3f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-84dad32ff0fc0831.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-95306f892aa2d0ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-940fb6c217f6b470.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-8c66a3b24a745630.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7b675dfd35c36fc9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8bd0d3cf7665bcfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/{page-29900ed0011b2c83.js → page-c219f2ed171131be.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-40f8fa21bdae955b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-468f8313e4f1fbd9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-7bbb8fa353a246c4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-04d00ae9b0890349.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-4214b855d9233ea8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-936752c7aa58762e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-ec052ad359df1797.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8305570551091338.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-fad650e4793adb65.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-d90e64743826e1d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a16bcfd49af86a32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{425cfc4d.fb91158e3971c39f.js → b313b242.cb1265eea908db61.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +122 -0
- package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +1 -0
- package/apps/pwa/out/_next/static/chunks/ebc7d829.264a0bcb6c750b50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.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 +7 -3
- package/graphs/context/nightly-condense.yaml +1 -0
- package/graphs/implement-loop.yaml +5 -0
- package/graphs/intake/intake-daily.yaml +8 -1
- package/graphs/intake/recipes.yaml +5 -0
- package/graphs/lecture/lecture-note.yaml +2 -2
- package/graphs/ops/harness-gc.yaml +1 -0
- package/graphs/release/recipes.yaml +3 -0
- package/graphs/release/release-loop.yaml +9 -5
- package/graphs/units/recipes.yaml +3 -0
- package/graphs/units/release-gate-recheck.yaml +15 -0
- package/package.json +2 -1
- package/scripts/check-native-tool-wiring.ts +3 -2
- package/scripts/ci-android-unit-tests.ts +16 -0
- package/scripts/ci-typecheck-changed.ts +63 -10
- package/scripts/coord-channel-watch.sh +22 -16
- package/scripts/coord-role-pack.ts +81 -2
- package/scripts/cron-run.ts +96 -3
- package/scripts/detect-test-interference.ts +38 -5
- package/scripts/gate-pr-cache.ts +65 -0
- package/scripts/gh-surface/capture.ts +126 -0
- package/scripts/gh-surface/gh +40 -0
- package/scripts/import-graph-scc.ts +38 -0
- package/scripts/install.ps1 +19 -0
- package/scripts/intake-social.ts +181 -0
- package/scripts/lecture-note/node.ts +71 -4
- package/scripts/lib/android-toolchain.ts +32 -0
- package/scripts/lib/deterministic-env.ts +62 -0
- package/scripts/lib/gate-test-env.ts +19 -0
- package/scripts/measure-goal-grounding-corpus.ts +2 -1
- package/scripts/measure-si-task-cpu.ts +143 -0
- package/scripts/ratchets/test-interference-patterns.allowlist.txt +255 -0
- package/scripts/ratchets/test-interference-patterns.ts +367 -0
- package/scripts/release-loop/cut-branch.ts +4 -3
- package/scripts/release-loop/export-check-node.ts +0 -1
- package/scripts/release-loop/fixtures/warm-failure-assertion/sample.junit.xml +8 -0
- package/scripts/release-loop/fixtures/warm-job-029/sample.json +1 -0
- package/scripts/release-loop/fixtures/warm-job-029/sample.junit.xml +10 -0
- package/scripts/release-loop/gate-closure.ts +12 -8
- package/scripts/release-loop/gate-diff.ts +1 -1
- package/scripts/release-loop/gate-host-mirror.ts +66 -0
- package/scripts/release-loop/gate-node.ts +523 -75
- package/scripts/release-loop/gate-partial.ts +106 -9
- package/scripts/release-loop/gate-pr-cache.ts +66 -0
- package/scripts/release-loop/gate-prewarm-plan.ts +66 -0
- package/scripts/release-loop/gate-r2-verdict.ts +189 -0
- package/scripts/release-loop/gate-recheck-plan-node.ts +52 -0
- package/scripts/release-loop/gate-warm-artifacts.ts +253 -0
- package/scripts/release-loop/import-graph-scc-run.ts +54 -0
- package/scripts/release-loop/import-graph-scc.ts +215 -0
- package/scripts/release-loop/node-verdict.ts +2 -0
- package/scripts/release-loop/prepare-node.ts +102 -4
- package/scripts/release-loop/probe-pod-host-dirs-live.ts +113 -0
- package/scripts/release-loop/resume-release.ts +33 -4
- package/scripts/release-loop/resume.ts +13 -5
- package/scripts/release-loop/spawn-lane.ts +2 -19
- package/scripts/release-loop/tui-sim-node.ts +3 -2
- package/scripts/release-loop/unattended-release.ts +16 -0
- package/scripts/test-deterministic.ts +5 -61
- package/scripts/train-reach-grouping.ts +48 -0
- package/scripts/tsc-incremental-cache.ts +86 -0
- package/scripts/tsc-incremental-diagnostics.ts +76 -0
- package/scripts/tsc-main-safety-net.ts +2 -2
- package/src/acp/client.ts +4 -1
- package/src/acp/core-turn-bridge.ts +65 -8
- package/src/acp/elanous-extensions.ts +3 -0
- package/src/acp/server.ts +3 -0
- package/src/acp/tool-trace.ts +186 -11
- package/src/ad-pipeline/run.ts +4 -2
- package/src/agent/runner.ts +169 -3
- package/src/agent/self-ambient-cache.ts +156 -0
- package/src/agent/self-ambient.ts +8 -1
- package/src/agent/subagent-callable.ts +3 -2
- package/src/agent/task-notification.ts +5 -0
- package/src/agent-mission/review-loop.ts +6 -3
- package/src/agent-substrate/acp-implementer.ts +14 -2
- package/src/agent-substrate/pr-reviewer.ts +14 -0
- package/src/agent-substrate/self-review-cli.ts +30 -4
- 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 +80 -7
- package/src/briefing/brief-items.ts +24 -22
- package/src/capture/frame-state-detect.ts +39 -0
- package/src/capture/tui-self-report.ts +149 -6
- package/src/chat/chat-cli.ts +10 -2
- package/src/chat/index.ts +138 -26
- package/src/chat/input-control-key.ts +5 -3
- package/src/chat/pickers/modal-runtime.ts +6 -0
- package/src/chat/pickers/modals.ts +8 -2
- package/src/chat/tool-interrupt-behavior.ts +38 -0
- package/src/chat/tool-render/dispatch.ts +5 -1
- package/src/chat/turn-typeahead.ts +75 -20
- package/src/cli/__fixtures__/agent-help-before/agent.txt +4 -2
- package/src/cli/agent-cli.ts +41 -13
- package/src/cli/ask-bare.ts +1 -0
- package/src/cli/config-audit.ts +123 -0
- package/src/cli/decisions-cli.ts +80 -6
- package/src/cli/import-cli.ts +12 -0
- package/src/cli/log-event-names.ts +17 -0
- package/src/cli/mcp-login.ts +21 -5
- package/src/cli/msg-cli.ts +89 -0
- package/src/cli/pod-cli.ts +14 -3
- package/src/cli/pr-cli.ts +273 -81
- package/src/cli/pr-land-base-read.ts +34 -0
- package/src/cli/pr-land-heavy-remote.ts +82 -26
- package/src/cli/pr-land-overlap-evidence.ts +109 -11
- package/src/cli/pr-land-pod-shadow-job.ts +106 -0
- package/src/cli/pr-land-pod-shadow.ts +16 -3
- package/src/cli/pr-land-refusal.ts +20 -5
- package/src/cli/pr-land-virtual-rebase.ts +108 -0
- package/src/cli/pty-takeover-cli.ts +88 -14
- package/src/cli/release-cli.ts +80 -14
- package/src/cli/seat-cli.ts +138 -3
- package/src/cli/self-update.ts +5 -2
- package/src/cli/sim-cli.ts +18 -0
- package/src/cli/tasks-cli.ts +97 -19
- package/src/context-bus/context-first.ts +13 -0
- package/src/context-bus/context-now.ts +13 -2
- package/src/context-bus/ops-events.ts +79 -0
- package/src/control-plane/lease-holder.ts +12 -8
- package/src/control-plane/ledger.ts +163 -4
- package/src/control-plane/server.ts +91 -11
- package/src/core-turn/run-core-turn.ts +2 -0
- package/src/core-turn/run-goal-loop.ts +243 -3
- package/src/core-turn/seat-turn-cap.ts +79 -0
- package/src/core-turn/short-question.ts +38 -6
- package/src/core-turn/types.ts +6 -0
- package/src/dashboard/acp-active-model.ts +42 -1
- package/src/dashboard/acp-boot.ts +3 -0
- package/src/dashboard/background-jobs-status.ts +66 -0
- package/src/dashboard/index.ts +339 -657
- package/src/dashboard/input/agent-wake.ts +242 -0
- package/src/dashboard/input/chat-main-entry-runtime.ts +6 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +4 -1
- package/src/dashboard/input/chat-main-session.ts +8 -1
- package/src/dashboard/input/chat-main-turn.ts +12 -3
- package/src/dashboard/input/compact-prepass-recovery.ts +33 -0
- package/src/dashboard/input/external-input-host.ts +49 -9
- package/src/dashboard/input/internal-turn.ts +261 -0
- package/src/dashboard/input/mouse-wiring.ts +108 -11
- package/src/dashboard/input/seat-autowake.ts +318 -0
- package/src/dashboard/input/turn-steer-bridge.ts +70 -0
- package/src/dashboard/log-click-runtime.ts +118 -2
- package/src/dashboard/loop-scheduler.ts +72 -0
- package/src/dashboard/seat-boot-preamble.ts +18 -0
- package/src/dashboard/skill-runtime.ts +2 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +126 -1181
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -1
- package/src/dashboard/slash-runtime/index.ts +13 -0
- package/src/dashboard/turn-busy-teardown.ts +50 -0
- package/src/dashboard/turn-preamble.ts +116 -40
- package/src/dashboard/turn-session-layers.ts +4 -2
- package/src/dashboard/turn-start-segments.ts +222 -0
- package/src/decisions/decision-ledger.ts +45 -4
- package/src/discord-self-message.ts +4 -4
- package/src/display/prompt-row-owner.ts +146 -0
- package/src/display/resize-listener.ts +33 -2
- package/src/domains/release-tool.ts +18 -1
- package/src/field-note/transcribe.ts +17 -0
- package/src/fold-stack.ts +4 -2
- package/src/git-fs/index.ts +263 -36
- package/src/github/remote-call.ts +81 -0
- package/src/goals/registry.ts +46 -6
- package/src/goals/types.ts +7 -1
- package/src/graph-runner/runner.ts +1 -0
- package/src/grok/credential.ts +26 -0
- package/src/harness/gate-reserve.ts +87 -0
- package/src/harness/harness-clean.ts +2 -1
- package/src/harness/harness-cli-command.ts +52 -5
- package/src/harness/harness-gc.ts +2 -1
- package/src/harness/harness-incidents.ts +70 -20
- package/src/harness/harness-pod-dispatch.ts +87 -10
- package/src/harness/harness-queue.ts +68 -4
- package/src/harness/harness-stop.ts +4 -3
- package/src/harness/harness-substrate-default.ts +78 -7
- package/src/harness/harness-worktree-auto.ts +2 -1
- package/src/harness/harness-worktrees.ts +3 -2
- package/src/hooks/dispatch.ts +2 -1
- package/src/index.ts +156 -27
- package/src/input/external-input-queue.ts +64 -7
- package/src/intake-plane/slash.ts +14 -3
- package/src/keybindings.ts +4 -1
- package/src/llm/route-decision.ts +36 -0
- package/src/llm/tool-loop-steered-rejection.ts +41 -0
- package/src/llm-request-shape.ts +209 -0
- package/src/llm.ts +301 -283
- package/src/loops/consensus.ts +348 -0
- package/src/loops/msg-wake.ts +206 -4
- package/src/loops/observe.ts +19 -3
- package/src/loops/orchestrator/tick.ts +88 -12
- package/src/loops/orchestrator/traffic.ts +64 -1
- package/src/loops/registry.ts +30 -0
- package/src/market/signed-index.ts +14 -0
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/mcp/mcp-oauth.ts +54 -5
- package/src/models/prompts.ts +28 -0
- package/src/msg/msg-sse-client.ts +223 -0
- package/src/msg/msg-store.ts +86 -2
- package/src/mss/logging/log-store.ts +225 -1
- package/src/mss/logging/render-categories.ts +5 -0
- package/src/nexus/DAEMON-THIN-inventory-2026-10-15.md +122 -0
- package/src/nexus/api/http-server.ts +54 -15
- package/src/nexus/api/loop-resources.ts +19 -3
- package/src/nexus/api/ops-api.ts +11 -0
- package/src/nexus/daemon-thin-inventory.md +37 -0
- package/src/nexus/index.ts +70 -0
- package/src/nexus/state/state.ts +1 -0
- package/src/oauth/store.ts +32 -7
- package/src/onboarding/first-run.ts +28 -3
- package/src/ops/overview-cache.ts +16 -4
- package/src/ops/overview.ts +59 -2
- package/src/ops/resources.ts +82 -0
- package/src/plugins/maker/connector-maker.ts +41 -0
- package/src/plugins/maker/skill-maker.ts +42 -0
- package/src/pr-tool/census.ts +303 -0
- package/src/pr-tool/inflight-registry.ts +143 -0
- package/src/prompt-library/chat-conciseness.ts +13 -0
- package/src/prompt-library/universal-preamble.ts +10 -5
- package/src/pty-shell/pty-manifest.ts +12 -3
- package/src/pty-shell/tui-run-state.ts +34 -3
- package/src/release-loop/gate-host-reservation.ts +97 -0
- package/src/release-loop/landing-freeze.ts +5 -0
- package/src/release-loop/light-rc.ts +5 -2
- package/src/release-loop/placement.ts +92 -1
- package/src/release-loop/rehearsal-shard-plan.ts +149 -0
- package/src/release-loop/rehearsal.ts +73 -17
- package/src/repl/index.ts +20 -2
- package/src/seat-loop/seat-knowhow.ts +282 -0
- package/src/seat-loop/seat-loop.ts +41 -2
- package/src/seat-loop/traffic-signal.ts +5 -1
- package/src/self-dev/ask-launch-flow.ts +37 -3
- package/src/self-dev/decompose-compose-graph.ts +28 -27
- package/src/self-dev/decompose-proposal.ts +53 -38
- package/src/self-dev/decompose.ts +17 -0
- package/src/self-dev/dev-pipeline.ts +31 -2
- package/src/self-dev/draft-residue.ts +267 -33
- package/src/self-dev/draft-sweep.ts +59 -4
- package/src/self-dev/external-call-zero.ts +77 -0
- package/src/self-dev/launch-preflight-text.ts +6 -0
- package/src/self-dev/launch-preflight.ts +25 -3
- package/src/self-dev/local-supervisor-judge.ts +185 -0
- package/src/self-dev/run-supervisor.ts +229 -19
- package/src/self-dev/run-types.ts +20 -0
- package/src/self-dev/shard-aggregate.ts +13 -2
- package/src/self-dev/shard-plan.ts +56 -1
- package/src/self-dev/shard-run.ts +207 -12
- package/src/self-dev/spawn-lane-files.ts +19 -0
- package/src/self-implement/app-api-budget.ts +51 -11
- package/src/self-implement/config-gate.ts +2 -1
- package/src/self-implement/elanous-tui-spawn.ts +14 -0
- package/src/self-implement/expose-gate.ts +2 -1
- package/src/self-implement/follow-up-placement.ts +79 -0
- package/src/self-implement/gate-artifacts.ts +416 -0
- package/src/self-implement/gate-baseline.ts +96 -5
- package/src/self-implement/gate-cli.ts +207 -17
- package/src/self-implement/gate-remote.ts +136 -26
- package/src/self-implement/gate-scenario.ts +85 -0
- package/src/self-implement/goal-author.ts +160 -8
- package/src/self-implement/graph-authority.ts +38 -6
- package/src/self-implement/graph-overlay-condition.ts +92 -1
- package/src/self-implement/heal-triage.ts +79 -0
- package/src/self-implement/host-regate.ts +97 -7
- package/src/self-implement/orchestrator.ts +115 -134
- package/src/self-implement/pr-title.ts +123 -0
- package/src/self-implement/run-checkpoint.ts +235 -0
- package/src/self-implement/run-ledger.ts +162 -15
- package/src/self-implement/run-stop.ts +4 -3
- package/src/self-implement/run-ttl.ts +28 -4
- package/src/self-implement/seams.ts +2 -0
- package/src/self-implement/shadow-stage.ts +7 -6
- package/src/self-implement/stop-autoheal.ts +2 -1
- package/src/self-implement/train-gate-remote.ts +37 -8
- package/src/self-implement/train-reach-grouping.ts +157 -0
- package/src/self-implement/train-scenario-layers.ts +133 -0
- package/src/self-implement/uncommitted-work.ts +2 -0
- package/src/session/pending-input.ts +19 -0
- package/src/session/session-start.ts +224 -0
- package/src/session-runtime/index.ts +22 -267
- package/src/session-runtime/parallel-dispatch.ts +22 -5
- package/src/shell-runner/background-surface.ts +15 -5
- package/src/skills/tools/agent.ts +39 -6
- package/src/skills/tools/dev-harness.ts +6 -4
- package/src/skills/tools/list-dir.ts +11 -0
- package/src/skills/tools/schedule-wakeup.ts +408 -0
- package/src/skills/tools/shell.ts +246 -4
- 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/resync-tick.ts +114 -23
- package/src/steward/ta-repair-event-collect.ts +158 -0
- package/src/steward/triage.ts +10 -0
- package/src/surface/shell-runner-boot.ts +5 -2
- package/src/task-agent/card-evidence.ts +25 -1
- package/src/task-agent/green-sweep.ts +8 -3
- package/src/task-agent/judge.ts +76 -0
- package/src/task-agent/land-queue.ts +79 -0
- package/src/task-agent/live-moves.ts +30 -9
- package/src/task-agent/postland-card.ts +5 -0
- package/src/task-agent/prelaunch-already-done.ts +98 -0
- package/src/task-agent/real-launch-guard.ts +37 -0
- package/src/task-agent/rejudge-on-head.ts +89 -12
- package/src/task-agent/remote-rejudge-bind.ts +28 -8
- package/src/task-agent/repair-cycle.ts +45 -7
- package/src/task-agent/repair-worker.ts +7 -0
- package/src/task-agent/run-identity.ts +200 -0
- package/src/task-agent/shadow.ts +50 -3
- package/src/task-agent/task-hand.ts +182 -5
- package/src/task-agent/train-landing.ts +77 -0
- package/src/task-agent/work-order.ts +104 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +151 -37
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +88 -19
- package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-image-source.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-install-slots.ts +121 -9
- package/src/task-orchestrator/surfaces/pod-lease.ts +118 -6
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +169 -0
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +27 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +3 -1
- package/src/task-orchestrator/surfaces/pod-result-marker-wait.ts +33 -0
- package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +67 -0
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +19 -3
- package/src/task-orchestrator/surfaces/pod-warm-switch.ts +141 -0
- package/src/task-orchestrator/surfaces/pod-warm-ta-shadow.ts +85 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +525 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +153 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runner.ts +90 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +362 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +138 -19
- package/src/telegram.ts +2 -4
- package/src/tui/chat/execution-badge.ts +5 -1
- package/src/tui/input/pickers.ts +732 -0
- package/src/tui/input-lag-probe.ts +230 -0
- package/src/tui/slash/mission.ts +492 -0
- package/src/tui/slash/term.ts +877 -0
- package/src/tui-client/dashboard-session.ts +9 -0
- package/src/tui.ts +52 -0
- package/src/user-config/gemini-server-tools.ts +9 -0
- package/src/user-config.ts +53 -16
- package/src/util/spawn-sync-output.ts +7 -0
- package/src/ux-sim/fake-bin.ts +154 -0
- package/src/ux-sim/fake-clock.ts +36 -0
- package/src/ux-sim/headless-tui.ts +72 -0
- package/src/ux-sim/in-process-cli.ts +2 -1
- package/src/ux-sim/scenario.ts +255 -0
- package/src/ux-sim/temp-git-remote.ts +82 -0
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/recipes/vlog.ts +25 -7
- package/apps/pwa/out/_next/static/chunks/1015-9cba22a5a4554797.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1084-4e66af7376a18db7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1106.3a6410b7b0c70ad4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1127.32fc642f70423506.js +0 -8
- package/apps/pwa/out/_next/static/chunks/1189-d9b8e1995a831fae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1224.6da98c7ad0eb7dd8.js +0 -34
- package/apps/pwa/out/_next/static/chunks/1370.4e3e2558f111fd5d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1514-b7da377fdc4eb17a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1577.3c24c32584e10d70.js +0 -286
- package/apps/pwa/out/_next/static/chunks/161.130a569855c4d68c.js +0 -24
- package/apps/pwa/out/_next/static/chunks/1864.16da9556e78a9236.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1b6f6b2a.aff090122be3726e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2341.e8a9135e5b910dd5.js +0 -36
- package/apps/pwa/out/_next/static/chunks/257.10afdbe3520f2fc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2658.87550e692dc493f6.js +0 -64
- package/apps/pwa/out/_next/static/chunks/2673.85e2f02efae7a85f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2766-bee623b37472ed63.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2794.6d836872b0bf43e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2806.eb57ced1a528ed39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/283.7a121c4910e6dad7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2870.1dc29aa5fc01f09f.js +0 -115
- package/apps/pwa/out/_next/static/chunks/293.fd38e77ce5d48103.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2993-5952a1cd3fd5d441.js +0 -1
- package/apps/pwa/out/_next/static/chunks/32-a523427c5bd5ed00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280.af38002a6424a905.js +0 -90
- package/apps/pwa/out/_next/static/chunks/3292-5ddffdb2f517b44f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3523.d3231daaf7aba993.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3763.577de3181e1e6ea0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4138-cc56b0938ef72783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4255-8350c43d307a8875.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4352.a4954693499c2714.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4421-f2dcbc6fd80ec013.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4513-51b94aeee37c9905.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4928-c3b72f99aa588699.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4986-f9fc0283fb325219.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5014.671a7b9f69c2b7b1.js +0 -94
- package/apps/pwa/out/_next/static/chunks/5137.d398e24710b3feb6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5298.0bea74885cabe754.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5315.74c53a39739b11c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5317-8b1df8d02105cd07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5358-33051f41a2b239af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5388.a2ec02501f714ad5.js +0 -62
- package/apps/pwa/out/_next/static/chunks/5395.e6ac948a2d15058d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5409-f282bf533c151849.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5466.d0f4aba9d52acfa8.js +0 -27
- package/apps/pwa/out/_next/static/chunks/5564.3d28b353470fe305.js +0 -104
- package/apps/pwa/out/_next/static/chunks/569.b0cbfb4dee4a167a.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5835-72465b73a8bb8d74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5941.045d6093139e1f7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6228.47cabb83564dfe54.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6457-8d1993002a87d0fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6513.ef54cfae52351982.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6582.13d245bf87df69f1.js +0 -148
- package/apps/pwa/out/_next/static/chunks/6655.c33f6acc2c61bb89.js +0 -149
- package/apps/pwa/out/_next/static/chunks/6731-9d7195af289c8d4c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6733.0be05b1db9279fc5.js +0 -79
- package/apps/pwa/out/_next/static/chunks/6742-90937146253a8b9e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/687-816858f77a396a4e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6888.72c7b8cfb02a7e61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6993.c17c828ac3ef3253.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7076.9f27ef666b0cefdd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7113.1403c5d451804e8c.js +0 -287
- package/apps/pwa/out/_next/static/chunks/7169.9dd603c726c2cd7c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7247-e3ec21f761f86710.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7261-a47b72f96f5199df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7335-5cda81ac90310077.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7356-c2e4af090546e2d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/738-59518742078fda71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7385.a7375f10db73243a.js +0 -77
- package/apps/pwa/out/_next/static/chunks/7445.cf1cf2fe109bcd96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7505.a2057432ab6ef99a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7515.31f45fac1f9c70cb.js +0 -74
- package/apps/pwa/out/_next/static/chunks/7658-d4ce8c72a9548a91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8107-0b1ae46bc5bcb788.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8132.bfea2f016ce8d992.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8672.e299832bc7d18ee2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8735.f1ef798a5f260f6f.js +0 -226
- package/apps/pwa/out/_next/static/chunks/8774-88f67f7d8d53d299.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8782.252e5a405d86e4ed.js +0 -32
- package/apps/pwa/out/_next/static/chunks/909-9ed7aa0dba804316.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9100.22b0301256827007.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9140-dde77575570bc71e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9292-a7ad9a01c7044b93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9517.00627dc51b02821c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9725.dcbb585652d8e9c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9761.a3ebf5c389c24ddc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9972.834d2b2b7d48f1ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9995-1a90486f5ae01546.js +0 -1
- package/apps/pwa/out/_next/static/chunks/a435ad95.577add051b4facb2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-83372d8b5863ebf7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d69256d7613c140a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-352c5e9ba3f9b858.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-69f1d725524201a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-a5635eba0d73b84e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ad9181d84285e4ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-86feb08080261a2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-ffa15987e4756d03.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-11a3ab44ac327cc1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-6309b11c4264d24d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-8800472079612e87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-d387bf3f2301882a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-048f88d8c8658da6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6c14f9739b7f6880.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-2834f44f64e98d74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-83372d8b5863ebf7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-a13df6f88e824887.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-8a4397248754cf2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-daf0bd329360a336.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-f7ef1c28764cb476.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-61e74f28b9353dac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-8aaa6dedc4c10dfb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-294602ba649be829.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-5fa5f41ed3fce323.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-33bf667a5fb297bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-5ae3cbd6e5dba515.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-eb867d16ad6fdede.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1ab789fa68682f7e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6fd41b5b6ff13a71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fb3d5f7642c99fba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-70f705b2b5ed42ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-c9c93b358a7667b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1563c556b81c96ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ce89c20c45b3a673.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-423ae63d786f4ee9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-591a5378a4c4447c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-a250496b19a5824b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-c36a9277febc5911.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-83372d8b5863ebf7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a5de57edc6d7f942.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-16bdd4c9f40498df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-75e946e6e71cc6d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-9eb56166774eb256.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-1c5f9ef35dbb22c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-657ff9985e508498.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-22dc72499da68fb2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9f92737b8766009a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-094ad334e40f8169.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-8bcd379852ff6287.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-6b04413f280cd344.js +0 -1
- package/apps/pwa/out/_next/static/chunks/de70ab42-d28d47437208d458.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f800c5e3.46dbd7f2af8c3fce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f8bc19ad.47579f6d684b0760.js +0 -122
- package/apps/pwa/out/_next/static/chunks/framework-ca9ac4609fb9fed8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-0dd08d32d15a030f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-f0399d33955c4e01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-d42caca6f8ac2211.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-42e713c13aa41ca8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-8fbf8f61a377aa16.js +0 -1
- package/apps/pwa/out/_next/static/css/72becfd42807b50d.css +0 -1
- /package/apps/pwa/out/_next/static/{cIpv5nU9AycwYWZI9H589 → IVKr3AlRUVLKsw2fh7eXF}/_ssgManifest.js +0 -0
|
@@ -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';
|
|
@@ -11,6 +11,7 @@ import { releaseGitDiffPaths, releasePathHold, releasePathHoldShouldPost, releas
|
|
|
11
11
|
import { detectTestInterference, failedNamesFromStreams, parseFailureCount, runBunTest, type MeasuredRun } from '../../scripts/detect-test-interference.js';
|
|
12
12
|
import { MAX_INSPECTED_TEST_FILES, runTestInterferenceGate } from '../../scripts/ci-test-interference-gate.js';
|
|
13
13
|
import { pwaGraph, pwaReach } from '../../scripts/ci-pwa-build-gate.js';
|
|
14
|
+
import { changedPathPairs, changedTsFiles, readGitFile, requiredExportFieldsInChanges } from '../../scripts/ci-typecheck-changed.js';
|
|
14
15
|
import { classifyMergeFailure, clipRegateDetail, parseConflictFiles, type HostRegateFailure } from './regate-detail.js';
|
|
15
16
|
import { buildImporterTestIndex, isTestPath } from './importer-test-index.js';
|
|
16
17
|
|
|
@@ -25,9 +26,41 @@ export function needsPwaBuild(files: readonly string[], repoRoot: string, graph:
|
|
|
25
26
|
* land worktree (TA-LAND-WORKTREE).
|
|
26
27
|
*/
|
|
27
28
|
export function provideCheckoutDependencies(candidate: string, sourceRoot: string, dir: string, marker: string, install: (cwd: string) => void): void {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
+
}
|
|
31
64
|
} else install(join(candidate, dir));
|
|
32
65
|
}
|
|
33
66
|
|
|
@@ -55,6 +88,48 @@ export type HostRegateDeps = {
|
|
|
55
88
|
syncMergedChecklist?: typeof import('../release-loop/merged-pr-checklist.js').syncMergedPrChecklist;
|
|
56
89
|
};
|
|
57
90
|
|
|
91
|
+
/**
|
|
92
|
+
* REGATE-PWA-DEPS-FOR-TSC (#26698 → #27484 must-fix): the typecheck gate requires apps/pwa dependencies for
|
|
93
|
+
* `runsPwa || wholeRepository` — present .ts/.tsx under apps/pwa/ in its own changed set, or any of its
|
|
94
|
+
* whole-repository promotion triggers (필수 export 필드 추가 · exported 심볼 삭제 · exported 함수 매개변수 증가,
|
|
95
|
+
* in ANY changed file). Decide it with the gate's own collectors — changedTsFiles ⊕ changedPathPairs ⊕
|
|
96
|
+
* requiredExportFieldsInChanges — against the candidate worktree and the same TSC_BASE_REF the gate receives,
|
|
97
|
+
* so dependency provision and restoration can never be narrower than the real typecheck scope. Git observation
|
|
98
|
+
* goes through the regate's injectable `command` seam (hermetic tests); changedTsFiles composes whitespace-token
|
|
99
|
+
* command strings, so its shell runner just splits them into (bin, args).
|
|
100
|
+
*/
|
|
101
|
+
export function typecheckGateTouchesPwa(
|
|
102
|
+
worktree: string,
|
|
103
|
+
typecheckBase: string,
|
|
104
|
+
command: NonNullable<HostRegateDeps['command']>,
|
|
105
|
+
): boolean {
|
|
106
|
+
const git = (bin: string, args: readonly string[]): unknown => {
|
|
107
|
+
const r = command(bin, args, worktree);
|
|
108
|
+
if (r.status !== 0) throw Object.assign(new Error((r.stderr || r.stdout || `${bin} exited ${String(r.status)}`).trim()), { status: r.status });
|
|
109
|
+
return r.stdout;
|
|
110
|
+
};
|
|
111
|
+
const changed = changedTsFiles((cmd) => {
|
|
112
|
+
const [bin, ...args] = cmd.split(' ');
|
|
113
|
+
return git(bin, args) as string;
|
|
114
|
+
}, { ...process.env, TSC_BASE_REF: typecheckBase }, worktree);
|
|
115
|
+
// Collection failures make the gate exit(1) before its dependency requirement; an empty changed set makes it
|
|
116
|
+
// pass without running tsc — neither path can demand apps/pwa dependencies.
|
|
117
|
+
if ((changed.failures?.length ?? 0) > 0 || changed.files.size === 0) return false;
|
|
118
|
+
// runsPwa: a present .ts/.tsx under apps/pwa/ in the gate's own changed set.
|
|
119
|
+
if ([...changed.files].some((file) => file.startsWith('apps/pwa/'))) return true;
|
|
120
|
+
const triggers = requiredExportFieldsInChanges(
|
|
121
|
+
changed.files,
|
|
122
|
+
changed.base,
|
|
123
|
+
changedPathPairs(changed.base, git),
|
|
124
|
+
(ref, path) => readGitFile(ref, path, git),
|
|
125
|
+
(file) => readFileSync(join(worktree, file), 'utf8'),
|
|
126
|
+
);
|
|
127
|
+
// A judgement failure makes the gate exit(1) before its dependency requirement, like the collection failures above.
|
|
128
|
+
if (triggers.failure) return false;
|
|
129
|
+
// wholeRepository: any promotion trigger widens the inspection to the whole repository, apps/pwa included.
|
|
130
|
+
return triggers.fields.length > 0 || triggers.removedSymbols.length > 0 || triggers.parameterIncreases.length > 0;
|
|
131
|
+
}
|
|
132
|
+
|
|
58
133
|
const SPAWN_MAX_BUFFER = 256 * 1024 * 1024;
|
|
59
134
|
|
|
60
135
|
const defaultCommand: NonNullable<HostRegateDeps['command']> = (bin, args, cwd, env) => {
|
|
@@ -271,7 +346,10 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
|
|
|
271
346
|
const result = (event: 'passed' | 'failed' | 'unmeasured', step?: string, detail?: string, facts: Omit<HostRegateFailure, 'step' | 'detail'> = {}): HostRegateResult => {
|
|
272
347
|
if (step) failures.push({ step, detail: clipRegateDetail(detail ?? 'unknown'), ...facts });
|
|
273
348
|
log(event, { pr: input.prNumber, files, os: process.platform, ...interferenceNote, ...(step ? { failedStep: step, detail: clipRegateDetail(detail ?? 'unknown'), ...facts } : {}) });
|
|
274
|
-
|
|
349
|
+
// TA-REGATE-UNMEASURED — noMerge(TA 재게이트) 도 status 를 싣는다: draft `pr-head` 거부 같은 «못 잼»을 «실패»와 가르게.
|
|
350
|
+
return { passed: event === 'passed', failures, os: process.platform,
|
|
351
|
+
...(input.verifyOnly || input.noMerge ? { status: event } : {}),
|
|
352
|
+
...(input.verifyOnly && verifiedBase ? { baseCommit: verifiedBase } : {}) };
|
|
275
353
|
};
|
|
276
354
|
const run = (bin: string, args: readonly string[], cwd: string, env?: NodeJS.ProcessEnv): string => {
|
|
277
355
|
const r = command(bin, args, cwd, env);
|
|
@@ -305,6 +383,11 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
|
|
|
305
383
|
let stalePrBase: string | undefined;
|
|
306
384
|
const initialPrBase = baseCommit;
|
|
307
385
|
let buildPwa = false;
|
|
386
|
+
// REGATE-PWA-DEPS-FOR-TSC (#26698 → #27484 must-fix): the typecheck gate picks its own changed set and its own
|
|
387
|
+
// whole-repository promotion triggers — TSC_BASE_REF..HEAD — which can carry apps/pwa files that landed on
|
|
388
|
+
// main after this PR branched, and root-file export changes that widen the inspection to the whole repository.
|
|
389
|
+
// Set in the worktree phase below.
|
|
390
|
+
let typecheckTouchesPwa = false;
|
|
308
391
|
try {
|
|
309
392
|
let fetchedBase = fetchRef(`refs/heads/${baseRefName}`, 'base');
|
|
310
393
|
if (input.verifyOnly) { baseCommit = fetchedBase; verifiedBase = fetchedBase; }
|
|
@@ -406,7 +489,14 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
|
|
|
406
489
|
const provide = (dir: string, marker: string): void => provideCheckoutDependencies(candidate, input.repoRoot, dir, marker, (cwd) => { run('bun', ['install', '--frozen-lockfile'], cwd); });
|
|
407
490
|
provide('', 'typescript');
|
|
408
491
|
buildPwa = needsPwaBuild(files, worktree);
|
|
409
|
-
|
|
492
|
+
// REGATE-PWA-DEPS-FOR-TSC (#26698 → #27484 must-fix): provide('apps/pwa') must also fire when the typecheck
|
|
493
|
+
// gate's own scope — the same TSC_BASE_REF..HEAD it receives below — holds present .ts/.tsx files under
|
|
494
|
+
// apps/pwa/ OR any of its whole-repository promotion triggers (필수 export 필드 추가 · exported 심볼 삭제 ·
|
|
495
|
+
// exported 함수 매개변수 증가, in ANY changed file), even when buildPwa never turns on: without app deps
|
|
496
|
+
// the gate fails such runs as «의존성 없음» for environment reasons, not code defects.
|
|
497
|
+
const typecheckBase = input.verifyOnly ? baseCommit : base;
|
|
498
|
+
typecheckTouchesPwa = typecheckGateTouchesPwa(worktree, typecheckBase, command);
|
|
499
|
+
if ((buildPwa || typecheckTouchesPwa) && existsSync(join(worktree, 'apps/pwa'))) provide('apps/pwa', 'next');
|
|
410
500
|
} catch (e) { return result('unmeasured', 'worktree', String(e)); }
|
|
411
501
|
try {
|
|
412
502
|
const interferenceOptions = { neighbors: !input.verifyOnly };
|
|
@@ -427,7 +517,7 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
|
|
|
427
517
|
}
|
|
428
518
|
// The checked checkout is shared with interference/exposure gates. Verify dependencies at the
|
|
429
519
|
// typecheck boundary as well: a missing PWA link here made #27414 fail as an unmeasured host regate.
|
|
430
|
-
if (buildPwa && !existsSync(join(worktree, 'apps/pwa/node_modules'))) {
|
|
520
|
+
if ((buildPwa || typecheckTouchesPwa) && !existsSync(join(worktree, 'apps/pwa/node_modules'))) {
|
|
431
521
|
let failure: string | null = null;
|
|
432
522
|
try {
|
|
433
523
|
if (existsSync(join(worktree, 'apps/pwa'))) {
|
|
@@ -86,7 +86,6 @@ import { LogStore, logsDbPath, type LogQuery, type LogStoreRow } from '../mss/lo
|
|
|
86
86
|
import { refreshCodexQuotaSignals } from '../budget/codex-quota-refresh.js';
|
|
87
87
|
import { inspectActiveProvider, type ActiveProviderInfo } from '../provider-summary.js';
|
|
88
88
|
import { recordHitlEvent } from '../self-dev/hitl-log.js';
|
|
89
|
-
import { parseAskProseTitle } from '../self-dev/launch-preflight.js';
|
|
90
89
|
import { classifyReviewProviderFailure } from '../self-dev/review-provider-fallback.js';
|
|
91
90
|
import { classifyError } from '../session-runtime/retry-policy.js';
|
|
92
91
|
import { decomposeSelfDevGoal, inferHotPaths, type SelfDevDecomposeOptions } from '../self-dev/decompose.js';
|
|
@@ -154,6 +153,24 @@ import { plannedSelfImplBranch } from '../harness/worktree-branch-prefix.js';
|
|
|
154
153
|
export { slugifyFeature } from '../harness/worktree-branch-prefix.js';
|
|
155
154
|
import { AUTO_REVIEW_LABEL, resolveAutoReviewLabels } from './context-capsule.js';
|
|
156
155
|
import { GOAL_TYPES, extractVerbatimOriginalAsk, leadingGoalMetadata, parseAskFile, parseGoalType, type GoalType } from './goal-author.js';
|
|
156
|
+
import { goalDocumentForReleaseNote, goalChecklistIds, prTitle } from './pr-title.js';
|
|
157
|
+
export { goalChecklistIds, prTitle } from './pr-title.js';
|
|
158
|
+
|
|
159
|
+
/** TA's card slot is carried by the Pod, independent of goal-author prose. */
|
|
160
|
+
export function prChecklistLine(feature: string, goalFile?: string, slotId = process.env.ELANOUS_POD_SLOT_ID): string {
|
|
161
|
+
const slot = slotId?.trim();
|
|
162
|
+
if (slot && /^[A-Z][A-Z0-9]*(?:-[A-Z0-9]+)+$/.test(slot)) return `칸: ${slot}`;
|
|
163
|
+
const goalIds = goalChecklistIds(feature, goalFile);
|
|
164
|
+
return `칸: 미상\n골 ID: ${goalIds.join(' · ') || '없음'}`;
|
|
165
|
+
}
|
|
166
|
+
/** Preserve authored card lines as quoted prose; only the first line is machine readable. */
|
|
167
|
+
function onePrChecklistLine(body: string): string {
|
|
168
|
+
let first = true;
|
|
169
|
+
return body.replace(/^칸:[^\n]*$/gm, (line) => {
|
|
170
|
+
if (first) { first = false; return line; }
|
|
171
|
+
return `> ${line}`;
|
|
172
|
+
});
|
|
173
|
+
}
|
|
157
174
|
import { renderRoundSummaryCard, type RoundSummaryEntry } from './round-summary-card.js';
|
|
158
175
|
import { computeFlexSignals } from './flex-signals.js';
|
|
159
176
|
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';
|
|
@@ -862,8 +879,15 @@ export function isHarnessTempArtifact(file: string): boolean {
|
|
|
862
879
|
return /(^|\/)\.elanous-typecheck-scope-[^/]+\.json$/.test(file);
|
|
863
880
|
}
|
|
864
881
|
|
|
882
|
+
/** Only this run's GOAL document is a harness artifact; unrelated GOAL edits remain in scope accounting. */
|
|
883
|
+
export function isHarnessGeneratedGoal(file: string, goalDocumentPath?: string): boolean {
|
|
884
|
+
const ownGoal = goalDocumentPath?.replace(/\\/g, '/').match(/(?:^|\/)(docs\/goals\/GOAL-[^/]+\.(?:md|txt))$/)?.[1];
|
|
885
|
+
return !!ownGoal && normalizeDeclaredScopePath(file) === ownGoal;
|
|
886
|
+
}
|
|
887
|
+
|
|
865
888
|
export function detectDeclaredScopeDiff(input: {
|
|
866
889
|
goalDocument?: string | null;
|
|
890
|
+
goalDocumentPath?: string;
|
|
867
891
|
changedFiles?: readonly string[] | null;
|
|
868
892
|
nameCap?: number;
|
|
869
893
|
}): DeclaredScopeDiff {
|
|
@@ -879,7 +903,8 @@ export function detectDeclaredScopeDiff(input: {
|
|
|
879
903
|
return { status: 'unknown-changed-files', outsideCount: null, outsideNames: [], nameCapReached: false, unmadeCount: null, unmadeNames: [], declaredCount: null };
|
|
880
904
|
}
|
|
881
905
|
const outside = [...new Set(input.changedFiles.map(normalizeDeclaredScopePath).filter(Boolean))]
|
|
882
|
-
.filter((file) => !
|
|
906
|
+
.filter((file) => !isHarnessGeneratedGoal(file, input.goalDocumentPath)
|
|
907
|
+
&& !declared.paths.some((target) => changedFileIsInsideDeclaredTarget(file, target)));
|
|
883
908
|
// ⭐ 「선언했는데 «안 채워진»」 것 — `outside` 의 반대 방향이다.
|
|
884
909
|
const changed = [...new Set(input.changedFiles.map(normalizeDeclaredScopePath).filter(Boolean))];
|
|
885
910
|
const unmade = declared.paths.filter((target) => !changed.some((file) => changedFileIsInsideDeclaredTarget(file, target)));
|
|
@@ -914,6 +939,7 @@ function observeDeclaredScopeDiff(
|
|
|
914
939
|
}
|
|
915
940
|
const diff = detectDeclaredScopeDiff({
|
|
916
941
|
goalDocument,
|
|
942
|
+
goalDocumentPath: input.goalFile,
|
|
917
943
|
changedFiles: input.changedFiles,
|
|
918
944
|
nameCap: input.nameCap,
|
|
919
945
|
});
|
|
@@ -2295,7 +2321,7 @@ export interface SelfImplementResult {
|
|
|
2295
2321
|
/** Additive hard-cap disposition; outcome remains the stable public terminal contract. */
|
|
2296
2322
|
salvage?: 'launched' | 'parked';
|
|
2297
2323
|
/** Rework stopped on exclusively baseline/flaky/precondition failures; do not retry this goal against the same base. */
|
|
2298
|
-
terminationReason?: 'blocked-by-baseline';
|
|
2324
|
+
terminationReason?: 'blocked-by-baseline' | 'goal-only-rework-exhausted';
|
|
2299
2325
|
sessionId?: string;
|
|
2300
2326
|
worktreePath?: string;
|
|
2301
2327
|
branch?: string;
|
|
@@ -2357,120 +2383,6 @@ function addedDiffEvidence(diff: string): { text: string; truncated: boolean } {
|
|
|
2357
2383
|
};
|
|
2358
2384
|
}
|
|
2359
2385
|
|
|
2360
|
-
function isRepositoryRelativePath(candidate: string): boolean {
|
|
2361
|
-
if (/^(?:[A-Za-z][A-Za-z0-9+.-]*:\/\/|[\\/]|[A-Za-z]:[\\/])/.test(candidate)) return false;
|
|
2362
|
-
const parts = candidate.split('/');
|
|
2363
|
-
return parts.length > 1
|
|
2364
|
-
&& parts.every((part) => part !== '.' && part !== '..' && /^[A-Za-z0-9_.-]+$/.test(part))
|
|
2365
|
-
&& /\.[A-Za-z0-9]+$/.test(parts.at(-1)!);
|
|
2366
|
-
}
|
|
2367
|
-
|
|
2368
|
-
function extractRepositoryRelativePaths(first: string): string[] {
|
|
2369
|
-
const candidates = first.split(/[\s,;()[\]{}"'`<>]+/).filter(Boolean);
|
|
2370
|
-
return candidates.filter(isRepositoryRelativePath);
|
|
2371
|
-
}
|
|
2372
|
-
|
|
2373
|
-
function parseAskMarkdownH1(feature: string): string | undefined {
|
|
2374
|
-
// ⛔ 펜스는 «문자»만이 아니라 «길이»로 닫힌다(CommonMark): 닫는 줄은 같은 문자 · 여는 줄 이상의 길이 · 뒤에 정보 문자열 없음.
|
|
2375
|
-
// 🩸 2026-09-23(#20050 착지 직후 실물): GOAL 문서가 원래 ask 를 ```` 네 개 펜스로 싸고, 그 안에 ``` 블록이 있다.
|
|
2376
|
-
// 문자만 보면 안쪽 ``` 이 바깥 ```` 를 «닫아» 안팎이 뒤집히고 ```bash 안의 `# 주석` 이 다시 제목이 됐다.
|
|
2377
|
-
let fence: { marker: '`' | '~'; run: number } | undefined;
|
|
2378
|
-
for (const line of feature.split(/\r?\n/)) {
|
|
2379
|
-
const trimmed = line.trim();
|
|
2380
|
-
const marker = trimmed[0] === '`' || trimmed[0] === '~' ? trimmed[0] : undefined;
|
|
2381
|
-
let run = 0;
|
|
2382
|
-
if (marker) {
|
|
2383
|
-
while (run < trimmed.length && trimmed[run] === marker) run += 1;
|
|
2384
|
-
}
|
|
2385
|
-
if (marker && run >= 3) {
|
|
2386
|
-
if (!fence) {
|
|
2387
|
-
fence = { marker, run };
|
|
2388
|
-
continue;
|
|
2389
|
-
}
|
|
2390
|
-
if (fence.marker === marker && run >= fence.run && trimmed.slice(run).trim() === '') {
|
|
2391
|
-
fence = undefined;
|
|
2392
|
-
continue;
|
|
2393
|
-
}
|
|
2394
|
-
}
|
|
2395
|
-
if (fence) continue;
|
|
2396
|
-
if (line[0] !== '#' || line[1] === '#') continue;
|
|
2397
|
-
if (line.length < 2 || !/\s/.test(line[1]!)) continue;
|
|
2398
|
-
const text = line.slice(1).trim();
|
|
2399
|
-
if (text) return text;
|
|
2400
|
-
}
|
|
2401
|
-
return undefined;
|
|
2402
|
-
}
|
|
2403
|
-
|
|
2404
|
-
function prTitleCodePointCount(text: string): number {
|
|
2405
|
-
return Array.from(text).length;
|
|
2406
|
-
}
|
|
2407
|
-
|
|
2408
|
-
function truncatePrTitle(text: string): string {
|
|
2409
|
-
const points = Array.from(text);
|
|
2410
|
-
return points.length <= 72 ? text : `${points.slice(0, 69).join('')}...`;
|
|
2411
|
-
}
|
|
2412
|
-
|
|
2413
|
-
export function goalChecklistIds(feature: string, goalFile?: string): string[] {
|
|
2414
|
-
const document = goalFile ? goalDocumentForReleaseNote(goalFile) : feature;
|
|
2415
|
-
const declaration = document.split(/\r?\n/).find((line) => line.startsWith('- 칸 id: '));
|
|
2416
|
-
const declared = declaration?.slice('- 칸 id: '.length).trim();
|
|
2417
|
-
if (declared && declared !== 'not declared') {
|
|
2418
|
-
return [...new Set(declared.split(' · ').map((id) => id.trim()).filter(Boolean))];
|
|
2419
|
-
}
|
|
2420
|
-
const firstLine = feature.split(/\r?\n/, 1)[0] ?? '';
|
|
2421
|
-
return [...new Set(Array.from(firstLine.matchAll(/\b[A-Z][A-Z0-9]+-[A-Z0-9]+\b/g), (match) => match[0]))];
|
|
2422
|
-
}
|
|
2423
|
-
|
|
2424
|
-
function prTitleWithoutChecklistId(feature: string): string {
|
|
2425
|
-
const proseTitle = parseAskProseTitle(feature);
|
|
2426
|
-
if (proseTitle) return truncatePrTitle(proseTitle);
|
|
2427
|
-
|
|
2428
|
-
const headingTitle = parseAskMarkdownH1(feature);
|
|
2429
|
-
if (headingTitle) return truncatePrTitle(headingTitle);
|
|
2430
|
-
|
|
2431
|
-
// ⛔ GOAL 문서는 원래 ask 를 `Original ask (verbatim, unmodified):` 아래 ```` 펜스로 싣는다 — 그 안은 «코드»가 아니라 인용된 마크다운이다.
|
|
2432
|
-
// 🩸 2026-09-23: #20051 이 펜스를 길이로 닫게 고치자 그 인용 블록 안의 H1 까지 «건너뛰어»,
|
|
2433
|
-
// 첫 줄이 `대상 경로:` 인 GOAL 문서 대부분이 경로 요약 제목으로 떨어졌다(실물: #20055 `src/self-implement: gate-baseline.ts, …`).
|
|
2434
|
-
// ⇒ 인용된 ask 를 꺼내 그 «안»에서 같은 규칙(제목: 줄 → 펜스 밖 H1)으로 한 번 더 찾는다.
|
|
2435
|
-
// ⚠️ 정보 문자열이 붙은 펜스(```bash 등)로 싸였으면 그 안은 «코드»다 — 인용된 마크다운으로 보지 않는다.
|
|
2436
|
-
const verbatim = extractVerbatimOriginalAsk(feature);
|
|
2437
|
-
const opener = verbatim?.range ? feature.slice(0, verbatim.range.start).split(/\r?\n/).filter((line, i, all) => i === all.length - 2)[0] ?? '' : '';
|
|
2438
|
-
const verbatimAsk = verbatim && /^\s*(`{3,}|~{3,})\s*$/.test(opener) ? verbatim.ask : undefined;
|
|
2439
|
-
if (verbatimAsk) {
|
|
2440
|
-
const askTitle = parseAskProseTitle(verbatimAsk) ?? parseAskMarkdownH1(verbatimAsk);
|
|
2441
|
-
if (askTitle) return truncatePrTitle(askTitle);
|
|
2442
|
-
}
|
|
2443
|
-
|
|
2444
|
-
const first = feature.split('\n')[0]!.trim();
|
|
2445
|
-
const paths = extractRepositoryRelativePaths(first);
|
|
2446
|
-
if (!paths.length) return truncatePrTitle(first);
|
|
2447
|
-
|
|
2448
|
-
const pathParts = paths.map((path) => path.split('/'));
|
|
2449
|
-
const commonParts: string[] = [];
|
|
2450
|
-
for (let index = 0; index < pathParts[0]!.length - 1; index++) {
|
|
2451
|
-
const part = pathParts[0]![index]!;
|
|
2452
|
-
if (!pathParts.every((parts) => parts[index] === part)) break;
|
|
2453
|
-
commonParts.push(part);
|
|
2454
|
-
}
|
|
2455
|
-
const fileNames = pathParts.map((parts) => parts.at(-1)!);
|
|
2456
|
-
const directoryPrefix = commonParts.length ? `${commonParts.join('/')}: ` : '';
|
|
2457
|
-
const titlePrefix = prTitleCodePointCount(directoryPrefix) + prTitleCodePointCount(fileNames[0]!) <= 72 ? directoryPrefix : '';
|
|
2458
|
-
const title = fileNames.reduce((result, fileName) => {
|
|
2459
|
-
const next = result ? `${result}, ${fileName}` : fileName;
|
|
2460
|
-
return prTitleCodePointCount(titlePrefix) + prTitleCodePointCount(next) <= 72 ? next : result;
|
|
2461
|
-
}, '');
|
|
2462
|
-
if (title) return `${titlePrefix}${title}`;
|
|
2463
|
-
const firstFileName = fileNames[0]!;
|
|
2464
|
-
return truncatePrTitle(firstFileName);
|
|
2465
|
-
}
|
|
2466
|
-
|
|
2467
|
-
export function prTitle(feature: string, goalFile?: string): string {
|
|
2468
|
-
const title = prTitleWithoutChecklistId(feature);
|
|
2469
|
-
const id = goalChecklistIds(feature, goalFile)[0];
|
|
2470
|
-
if (!id) return title;
|
|
2471
|
-
return truncatePrTitle(title.startsWith(`${id}: `) ? title : `${id}: ${title}`);
|
|
2472
|
-
}
|
|
2473
|
-
|
|
2474
2386
|
const BLOCKED_DRAFT_PR_HUMAN_JUDGMENT_ANCHOR = '## 사람 판단 필요';
|
|
2475
2387
|
|
|
2476
2388
|
/** 사람이 읽는 중단 사유 상한. 관측 `reason.slice(0, 240)` 과 같은 길이라 표시가 앞부분을 버리지 않는다. */
|
|
@@ -2683,12 +2595,6 @@ export class MergedReleaseNoteWriteError extends Error {
|
|
|
2683
2595
|
}
|
|
2684
2596
|
}
|
|
2685
2597
|
|
|
2686
|
-
function goalDocumentForReleaseNote(goalFile?: string): string {
|
|
2687
|
-
if (!goalFile) return '';
|
|
2688
|
-
try { return readFileSync(goalFile, 'utf8'); }
|
|
2689
|
-
catch { return ''; }
|
|
2690
|
-
}
|
|
2691
|
-
|
|
2692
2598
|
function shardReleaseNote(feature: string): ReleaseNoteSection | undefined {
|
|
2693
2599
|
const matches = [...feature.matchAll(/^## Shard identity\r?\n([^\r\n]+)/gm)];
|
|
2694
2600
|
const identity = matches.at(-1)?.[1];
|
|
@@ -2725,13 +2631,13 @@ export function gateNotRunSection(gateLog?: string): string[] {
|
|
|
2725
2631
|
return lines.length ? ['', '## Gate · 안 돈 소비자 시험(상한 초과)', ...lines.map((line) => `- ${line.replace(/^⚠️ caller test cap exceeded — not run: /, '')}`)] : [];
|
|
2726
2632
|
}
|
|
2727
2633
|
|
|
2728
|
-
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 {
|
|
2634
|
+
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 {
|
|
2729
2635
|
const note = releaseNote ?? releaseNoteForRun(goalFile, feature);
|
|
2730
2636
|
const relaxation = planRevision?.relaxation
|
|
2731
2637
|
? ['', '## 감독 수용 기준 완화', `- 대상: ${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}`] : [])]
|
|
2732
2638
|
: [];
|
|
2733
|
-
return [
|
|
2734
|
-
|
|
2639
|
+
return onePrChecklistLine([
|
|
2640
|
+
prChecklistLine(feature, goalFile),
|
|
2735
2641
|
'## 요청',
|
|
2736
2642
|
...(goalFile ? [`- 골 파일: ${formatGoalFileForPrBody(goalFile)}`] : []),
|
|
2737
2643
|
feature.trim(),
|
|
@@ -2760,7 +2666,7 @@ function prBody(feature: string, implSummary: string, gateLog?: string, review?:
|
|
|
2760
2666
|
...relaxation,
|
|
2761
2667
|
'',
|
|
2762
2668
|
'🤖 self-implement 오케스트레이터 (elanous 자율 구현·리뷰-게이트 병합)',
|
|
2763
|
-
].join('\n');
|
|
2669
|
+
].join('\n'));
|
|
2764
2670
|
}
|
|
2765
2671
|
|
|
2766
2672
|
/**
|
|
@@ -2948,8 +2854,8 @@ export function formatBlockedDraftClassificationSection(
|
|
|
2948
2854
|
}
|
|
2949
2855
|
|
|
2950
2856
|
function blockedDraftPrBody(feature: string, implSummary: string, state: BlockedDraftPrState, goalFile?: string): string {
|
|
2951
|
-
return [
|
|
2952
|
-
|
|
2857
|
+
return onePrChecklistLine([
|
|
2858
|
+
prChecklistLine(feature, goalFile),
|
|
2953
2859
|
BLOCKED_DRAFT_PR_HUMAN_JUDGMENT_ANCHOR,
|
|
2954
2860
|
state.salvageStatusExpected
|
|
2955
2861
|
? BLOCKED_DRAFT_PR_SALVAGE_STATUS_INSTRUCTION
|
|
@@ -2996,8 +2902,10 @@ function blockedDraftPrBody(feature: string, implSummary: string, state: Blocked
|
|
|
2996
2902
|
: [`- passed: ${state.typecheck.passed}`, ...(state.typecheck.log ? ['```', state.typecheck.log.trim().slice(0, 3000), '```'] : [])]),
|
|
2997
2903
|
...(state.review?.mustFix.length ? ['', '## 마지막 리뷰 must-fix', ...state.review.mustFix.map((item) => `- ${item}`)] : []),
|
|
2998
2904
|
'',
|
|
2999
|
-
|
|
3000
|
-
|
|
2905
|
+
// The blocked body already carries the card line above; keep exactly one machine-readable line.
|
|
2906
|
+
prBody(feature, implSummary, undefined, state.review, undefined, undefined, undefined, goalFile, state.planRevision)
|
|
2907
|
+
.replace(/^칸: [^\n]*\n/, ''),
|
|
2908
|
+
].join('\n'));
|
|
3001
2909
|
}
|
|
3002
2910
|
|
|
3003
2911
|
type PreparedPrBody = {
|
|
@@ -5693,6 +5601,9 @@ async function runSelfImplementInner(
|
|
|
5693
5601
|
};
|
|
5694
5602
|
}
|
|
5695
5603
|
let round = 0;
|
|
5604
|
+
// A goal-only retry spends its one allowance for this run even if a later
|
|
5605
|
+
// gate/review round removes the target diff and reaches the same disposition.
|
|
5606
|
+
let goalOnlyReworkUsed = false;
|
|
5696
5607
|
// PR이 열리기 전에 프로세스가 죽으면 PR 자체가 없으므로 잃을 대화도 없다. 따라서 파일로 영속화하지 않는다.
|
|
5697
5608
|
const prCommentBuffer: string[] = [];
|
|
5698
5609
|
// GitHub PR comment bodies are bounded; retain the RFC header and disclose omitted source rather than losing the whole record.
|
|
@@ -7058,6 +6969,75 @@ async function runSelfImplementInner(
|
|
|
7058
6969
|
// ⭐ 성공 경로에서도 닫는다 — 이 호출은 끝났고, 이후 자식이 늦게 보내는 입력은
|
|
7059
6970
|
// 「이 라운드의 재투입」이 아니다(다음 라운드는 자기 콜백을 새로 만든다).
|
|
7060
6971
|
closeSupervisorInput();
|
|
6972
|
+
// A child that actually worked and declared completion may still leave only the
|
|
6973
|
+
// harness-seeded goal document. Give it one actionable implementation retry before
|
|
6974
|
+
// the blocked-artifact path reaches the goal-only PR guard.
|
|
6975
|
+
let goalOnlyReworkExhausted = false;
|
|
6976
|
+
if (!impl.ok && impl.completionDisposition === 'completed-without-changes'
|
|
6977
|
+
&& impl.terminalStatus?.reached === true && impl.terminalStatus.timedOut === false
|
|
6978
|
+
&& !goalOnlyReworkUsed && round < effectiveMax && !hasCurrentProviderError() && !hasCurrentCredentialFailure()
|
|
6979
|
+
&& opts.goalFile) {
|
|
6980
|
+
let targets: readonly string[] | undefined;
|
|
6981
|
+
let goalDocument: string | undefined;
|
|
6982
|
+
try {
|
|
6983
|
+
goalDocument = readFileSync(opts.goalFile, 'utf8');
|
|
6984
|
+
const declared = declaredPathsFromGoalDocumentText(goalDocument);
|
|
6985
|
+
if (declared.readable && declared.paths.length > 0) targets = declared.paths;
|
|
6986
|
+
} catch { /* unreadable scope is not grounds for an automatic retry */ }
|
|
6987
|
+
let before: readonly string[] | undefined;
|
|
6988
|
+
try { before = (s.changedFilesForGateRoute ?? changedFiles)(wt.path); } catch { /* unknown diff */ }
|
|
6989
|
+
if (targets && goalDocument && before !== undefined) {
|
|
6990
|
+
const eligible = (files: readonly string[]): string[] => files.filter(path =>
|
|
6991
|
+
!harnessSeededPaths.includes(path) && !isHarnessTempArtifact(path)
|
|
6992
|
+
&& targets!.some(target => changedFileIsInsideDeclaredTarget(path, target)));
|
|
6993
|
+
if (eligible(before).length === 0) {
|
|
6994
|
+
goalOnlyReworkUsed = true;
|
|
6995
|
+
const firstToolCalls = impl.toolCalls ?? null;
|
|
6996
|
+
const retryRound = round + 1;
|
|
6997
|
+
const retryNote = [
|
|
6998
|
+
'[구현 재작업 · completed-without-changes]',
|
|
6999
|
+
`대상 경로: ${targets.join(' · ')}`,
|
|
7000
|
+
'원래 골의 완료 경계를 위 대상 경로에 구현하라. 해당 파일에 실제 변경을 남기고 바꾼 경로와 검증 결과를 RESULT: 한 줄에 적어라.',
|
|
7001
|
+
'직전 자식은 완료를 선언했지만 대상 변경이 0개였다. 원래 골의 요구와 완료 경계를 다시 읽고 그 구현에 집중하라.',
|
|
7002
|
+
'원래 골 문서(완료 경계 포함):',
|
|
7003
|
+
goalDocument,
|
|
7004
|
+
].join('\n');
|
|
7005
|
+
observe('implementation-goal-only-rework', { status: 'started', round: retryRound, targets, firstToolCalls, targetDiffCount: 0 });
|
|
7006
|
+
progress('implementing', `대상 변경 0 — 구현 재작업 ${retryRound} 시작`);
|
|
7007
|
+
onNodeEntry(node('rework'), retryRound);
|
|
7008
|
+
onNodeEntry(node('implement'), retryRound);
|
|
7009
|
+
const retryAbort = new AbortController();
|
|
7010
|
+
const first = impl;
|
|
7011
|
+
try {
|
|
7012
|
+
impl = await stepTimeout(s.implement({
|
|
7013
|
+
sessionId, cwd: wt.path, feature: `${feature}\n\n${retryNote}`, runId, shardIdentity,
|
|
7014
|
+
signal: retryAbort.signal,
|
|
7015
|
+
...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
|
|
7016
|
+
onSurfaceProgress: line => progress('implementing', line.trimEnd()),
|
|
7017
|
+
roundContext: { round: retryRound, effectiveMax, previousRoundFailure: retryNote },
|
|
7018
|
+
...(opts.childLlm ? { childLlm: opts.childLlm } : {}),
|
|
7019
|
+
...(opts.documentReferences ? { documentReferences: opts.documentReferences } : {}),
|
|
7020
|
+
}), T.implement, 'implement');
|
|
7021
|
+
} catch (error) {
|
|
7022
|
+
retryAbort.abort();
|
|
7023
|
+
impl = { ok: false, summary: `goal-only-rework-exhausted: ${safeErrorDescription(error)}`, completionDisposition: first.completionDisposition };
|
|
7024
|
+
}
|
|
7025
|
+
let after: readonly string[] | undefined;
|
|
7026
|
+
try { after = (s.changedFilesForGateRoute ?? changedFiles)(wt.path); } catch { /* unknown diff */ }
|
|
7027
|
+
const targetDiff = after === undefined ? undefined : eligible(after);
|
|
7028
|
+
const resultLine = /(?:^|\n)\s*RESULT:\s*\S/m.test(impl.evidenceTranscript ?? impl.summary);
|
|
7029
|
+
const succeeded = impl.ok && !!targetDiff?.length && resultLine;
|
|
7030
|
+
goalOnlyReworkExhausted = !succeeded;
|
|
7031
|
+
observe('implementation-goal-only-rework', {
|
|
7032
|
+
status: succeeded ? 'succeeded' : 'exhausted', round: retryRound, targets,
|
|
7033
|
+
firstToolCalls, retryToolCalls: impl.toolCalls ?? null,
|
|
7034
|
+
targetDiffCount: targetDiff?.length ?? null, diffMeasured: after !== undefined, resultLine,
|
|
7035
|
+
}, succeeded ? {} : { level: 'warn' });
|
|
7036
|
+
if (!succeeded) impl = { ...impl, ok: false, summary: `goal-only-rework-exhausted: ${impl.summary}` };
|
|
7037
|
+
round = retryRound;
|
|
7038
|
+
}
|
|
7039
|
+
}
|
|
7040
|
+
}
|
|
7061
7041
|
// A finished child can leave edits without a commit. Measure them before any
|
|
7062
7042
|
// diff/no-changes classification, and commit only paths declared in the goal.
|
|
7063
7043
|
finishedChildCommitMissing = false;
|
|
@@ -7231,7 +7211,7 @@ async function runSelfImplementInner(
|
|
|
7231
7211
|
toolCalls: impl.toolCalls ?? null,
|
|
7232
7212
|
});
|
|
7233
7213
|
progress('aborted', progressLine);
|
|
7234
|
-
const pr = await preserveBlockedArtifacts({
|
|
7214
|
+
const pr = goalOnlyReworkExhausted ? undefined : await preserveBlockedArtifacts({
|
|
7235
7215
|
stage: 'aborted',
|
|
7236
7216
|
reason: abort.reason,
|
|
7237
7217
|
childSummary: abort.childSummary,
|
|
@@ -7242,7 +7222,7 @@ async function runSelfImplementInner(
|
|
|
7242
7222
|
salvageStatusExpected: false,
|
|
7243
7223
|
...(abort.terminalStatus ? { terminalStatus: abort.terminalStatus } : {}),
|
|
7244
7224
|
});
|
|
7245
|
-
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 };
|
|
7225
|
+
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 };
|
|
7246
7226
|
}
|
|
7247
7227
|
|
|
7248
7228
|
if (finishedChildCommitMissing) {
|
|
@@ -7261,7 +7241,8 @@ async function runSelfImplementInner(
|
|
|
7261
7241
|
try { goalDocument = readFileSync(opts.goalFile, 'utf8'); } catch { /* unknown scope */ }
|
|
7262
7242
|
// 🩸 10-09: 범위 타입검사 임시 tsconfig(.elanous-typecheck-scope-*.json · scoped-typecheck-config.ts)가 옛 가지에 커밋된 뒤 지워지면
|
|
7263
7243
|
// «추적 파일 삭제» 라 impact=critical → 결정 카드가 «irreversible» 로 대표에게 갔다(D-20·35·43·80). 하니스 임시물은 범위 판정 밖이다.
|
|
7264
|
-
const scope = detectDeclaredScopeDiff({ goalDocument,
|
|
7244
|
+
const scope = detectDeclaredScopeDiff({ goalDocument, goalDocumentPath: opts.goalFile,
|
|
7245
|
+
changedFiles: gateRouteFiles?.filter(file => !harnessSeededPaths.includes(file) && !isHarnessTempArtifact(file)), nameCap: gateRouteFiles?.length });
|
|
7265
7246
|
// SCOPE-HELD-DELIVER — no declared target means the declaration was unreadable (e.g. paths listed with spaces), not
|
|
7266
7247
|
// that every edit is outside it: treat it like an unknown declaration and go on to the gate.
|
|
7267
7248
|
if (scope.status === 'known' && scope.declaredCount === 0 && (scope.outsideCount ?? 0) > 0) {
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { parseAskProseTitle } from '../self-dev/launch-preflight.js';
|
|
3
|
+
import { extractVerbatimOriginalAsk } from './goal-author.js';
|
|
4
|
+
|
|
5
|
+
export function goalDocumentForReleaseNote(goalFile?: string): string {
|
|
6
|
+
if (!goalFile) return '';
|
|
7
|
+
try { return readFileSync(goalFile, 'utf8'); }
|
|
8
|
+
catch { return ''; }
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function isRepositoryRelativePath(candidate: string): boolean {
|
|
12
|
+
if (/^(?:[A-Za-z][A-Za-z0-9+.-]*:\/\/|[\\/]|[A-Za-z]:[\\/])/.test(candidate)) return false;
|
|
13
|
+
const parts = candidate.split('/');
|
|
14
|
+
return parts.length > 1
|
|
15
|
+
&& parts.every((part) => part !== '.' && part !== '..' && /^[A-Za-z0-9_.-]+$/.test(part))
|
|
16
|
+
&& /\.[A-Za-z0-9]+$/.test(parts.at(-1)!);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function extractRepositoryRelativePaths(first: string): string[] {
|
|
20
|
+
const candidates = first.split(/[\s,;()[\]{}"'`<>]+/).filter(Boolean);
|
|
21
|
+
return candidates.filter(isRepositoryRelativePath);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function parseAskMarkdownH1(feature: string): string | undefined {
|
|
25
|
+
// ⛔ 펜스는 «문자»만이 아니라 «길이»로 닫힌다(CommonMark): 닫는 줄은 같은 문자 · 여는 줄 이상의 길이 · 뒤에 정보 문자열 없음.
|
|
26
|
+
// 🩸 2026-09-23(#20050 착지 직후 실물): GOAL 문서가 원래 ask 를 ```` 네 개 펜스로 싸고, 그 안에 ``` 블록이 있다.
|
|
27
|
+
// 문자만 보면 안쪽 ``` 이 바깥 ```` 를 «닫아» 안팎이 뒤집히고 ```bash 안의 `# 주석` 이 다시 제목이 됐다.
|
|
28
|
+
let fence: { marker: '`' | '~'; run: number } | undefined;
|
|
29
|
+
for (const line of feature.split(/\r?\n/)) {
|
|
30
|
+
const trimmed = line.trim();
|
|
31
|
+
const marker = trimmed[0] === '`' || trimmed[0] === '~' ? trimmed[0] : undefined;
|
|
32
|
+
let run = 0;
|
|
33
|
+
if (marker) {
|
|
34
|
+
while (run < trimmed.length && trimmed[run] === marker) run += 1;
|
|
35
|
+
}
|
|
36
|
+
if (marker && run >= 3) {
|
|
37
|
+
if (!fence) {
|
|
38
|
+
fence = { marker, run };
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (fence.marker === marker && run >= fence.run && trimmed.slice(run).trim() === '') {
|
|
42
|
+
fence = undefined;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (fence) continue;
|
|
47
|
+
if (line[0] !== '#' || line[1] === '#') continue;
|
|
48
|
+
if (line.length < 2 || !/\s/.test(line[1]!)) continue;
|
|
49
|
+
const text = line.slice(1).trim();
|
|
50
|
+
if (text) return text;
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function prTitleCodePointCount(text: string): number {
|
|
56
|
+
return Array.from(text).length;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function truncatePrTitle(text: string): string {
|
|
60
|
+
const points = Array.from(text);
|
|
61
|
+
return points.length <= 72 ? text : `${points.slice(0, 69).join('')}...`;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function goalChecklistIds(feature: string, goalFile?: string): string[] {
|
|
65
|
+
const document = goalFile ? goalDocumentForReleaseNote(goalFile) : feature;
|
|
66
|
+
const declaration = document.split(/\r?\n/).find((line) => line.startsWith('- 칸 id: '));
|
|
67
|
+
const declared = declaration?.slice('- 칸 id: '.length).trim();
|
|
68
|
+
if (declared && declared !== 'not declared') {
|
|
69
|
+
return [...new Set(declared.split(' · ').map((id) => id.trim()).filter(Boolean))];
|
|
70
|
+
}
|
|
71
|
+
const firstLine = feature.split(/\r?\n/, 1)[0] ?? '';
|
|
72
|
+
return [...new Set(Array.from(firstLine.matchAll(/\b[A-Z][A-Z0-9]+-[A-Z0-9]+\b/g), (match) => match[0]))];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function prTitleWithoutChecklistId(feature: string): string {
|
|
76
|
+
const proseTitle = parseAskProseTitle(feature);
|
|
77
|
+
if (proseTitle) return truncatePrTitle(proseTitle);
|
|
78
|
+
|
|
79
|
+
const headingTitle = parseAskMarkdownH1(feature);
|
|
80
|
+
if (headingTitle) return truncatePrTitle(headingTitle);
|
|
81
|
+
|
|
82
|
+
// ⛔ GOAL 문서는 원래 ask 를 `Original ask (verbatim, unmodified):` 아래 ```` 펜스로 싣는다 — 그 안은 «코드»가 아니라 인용된 마크다운이다.
|
|
83
|
+
// 🩸 2026-09-23: #20051 이 펜스를 길이로 닫게 고치자 그 인용 블록 안의 H1 까지 «건너뛰어»,
|
|
84
|
+
// 첫 줄이 `대상 경로:` 인 GOAL 문서 대부분이 경로 요약 제목으로 떨어졌다(실물: #20055 `src/self-implement: gate-baseline.ts, …`).
|
|
85
|
+
// ⇒ 인용된 ask 를 꺼내 그 «안»에서 같은 규칙(제목: 줄 → 펜스 밖 H1)으로 한 번 더 찾는다.
|
|
86
|
+
// ⚠️ 정보 문자열이 붙은 펜스(```bash 등)로 싸였으면 그 안은 «코드»다 — 인용된 마크다운으로 보지 않는다.
|
|
87
|
+
const verbatim = extractVerbatimOriginalAsk(feature);
|
|
88
|
+
const opener = verbatim?.range ? feature.slice(0, verbatim.range.start).split(/\r?\n/).filter((line, i, all) => i === all.length - 2)[0] ?? '' : '';
|
|
89
|
+
const verbatimAsk = verbatim && /^\s*(`{3,}|~{3,})\s*$/.test(opener) ? verbatim.ask : undefined;
|
|
90
|
+
if (verbatimAsk) {
|
|
91
|
+
const askTitle = parseAskProseTitle(verbatimAsk) ?? parseAskMarkdownH1(verbatimAsk);
|
|
92
|
+
if (askTitle) return truncatePrTitle(askTitle);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const first = feature.split('\n')[0]!.trim();
|
|
96
|
+
const paths = extractRepositoryRelativePaths(first);
|
|
97
|
+
if (!paths.length) return truncatePrTitle(first);
|
|
98
|
+
|
|
99
|
+
const pathParts = paths.map((path) => path.split('/'));
|
|
100
|
+
const commonParts: string[] = [];
|
|
101
|
+
for (let index = 0; index < pathParts[0]!.length - 1; index++) {
|
|
102
|
+
const part = pathParts[0]![index]!;
|
|
103
|
+
if (!pathParts.every((parts) => parts[index] === part)) break;
|
|
104
|
+
commonParts.push(part);
|
|
105
|
+
}
|
|
106
|
+
const fileNames = pathParts.map((parts) => parts.at(-1)!);
|
|
107
|
+
const directoryPrefix = commonParts.length ? `${commonParts.join('/')}: ` : '';
|
|
108
|
+
const titlePrefix = prTitleCodePointCount(directoryPrefix) + prTitleCodePointCount(fileNames[0]!) <= 72 ? directoryPrefix : '';
|
|
109
|
+
const title = fileNames.reduce((result, fileName) => {
|
|
110
|
+
const next = result ? `${result}, ${fileName}` : fileName;
|
|
111
|
+
return prTitleCodePointCount(titlePrefix) + prTitleCodePointCount(next) <= 72 ? next : result;
|
|
112
|
+
}, '');
|
|
113
|
+
if (title) return `${titlePrefix}${title}`;
|
|
114
|
+
const firstFileName = fileNames[0]!;
|
|
115
|
+
return truncatePrTitle(firstFileName);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export function prTitle(feature: string, goalFile?: string): string {
|
|
119
|
+
const title = prTitleWithoutChecklistId(feature);
|
|
120
|
+
const id = goalChecklistIds(feature, goalFile)[0];
|
|
121
|
+
if (!id) return title;
|
|
122
|
+
return truncatePrTitle(title.startsWith(`${id}: `) ? title : `${id}: ${title}`);
|
|
123
|
+
}
|