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,16 +1,24 @@
|
|
|
1
1
|
/** Bind remote TA parents from the HQ ledger mirror before `rejudge --all` selects PR cards. */
|
|
2
|
-
import {
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
3
4
|
import { debug } from '../debug/log.js';
|
|
4
5
|
import { loadRunLedger } from '../self-implement/run-ledger.js';
|
|
5
|
-
import { bindCardEvidence, podChildRunIds, readCardRunSnapshot, refreshCardRunBinding } from './card-evidence.js';
|
|
6
|
+
import { bindCardEvidence, podChildRunIds, podTerminalPr, readCardRunSnapshot, refreshCardRunBinding } from './card-evidence.js';
|
|
6
7
|
import { mirrorRemoteRunLedgers, remoteLedgerMirrorDir } from './parent-host.js';
|
|
7
8
|
import { cardPrNumber, type TaskCard } from './task-hand.js';
|
|
8
9
|
|
|
9
10
|
const RECENT_LAUNCH_MS = 24 * 60 * 60 * 1000;
|
|
11
|
+
/**
|
|
12
|
+
* TA-BIND-PULL-ONCE — an older launch whose parent ledger was never mirrored at HQ gets one pull («묶기만»).
|
|
13
|
+
* Bounded per tick so the first tick after deploy does not run hundreds of sequential ssh reads (backlog ≈690
|
|
14
|
+
* cards on 10-15 drains over ticks); a pulled mirror is then read locally and never pulled again by this rule.
|
|
15
|
+
*/
|
|
16
|
+
export const UNMIRRORED_PULL_CAP_PER_TICK = 20;
|
|
10
17
|
|
|
11
18
|
type BindDeps = {
|
|
12
19
|
now?: () => number;
|
|
13
20
|
mirror?: typeof mirrorRemoteRunLedgers;
|
|
21
|
+
unmirroredPullCap?: number;
|
|
14
22
|
onFailure?: (failure: { card: string; runId: string; host: string; reason: string }) => void;
|
|
15
23
|
};
|
|
16
24
|
|
|
@@ -23,13 +31,14 @@ function recentlyLaunched(card: TaskCard, now: number): boolean {
|
|
|
23
31
|
/**
|
|
24
32
|
* A remote child PR can appear after the last HQ card refresh. A card without a PR is otherwise absent from
|
|
25
33
|
* `rejudgeCandidates`, so the normal rejudge tick never reaches `mirrorRemoteCardLedger` or the binding replay.
|
|
26
|
-
* Only an existing, launched TA-owned
|
|
34
|
+
* Only an existing, launched parent (TA-owned or not — TA-BIND-WIDEN) with a parent→child edge in its own host
|
|
35
|
+
* mirror is bound; rejudge/land selection keeps its own taLand gate. The
|
|
27
36
|
* launch registry (including foreign/test universes) and child-only ledgers are never scanned or adopted here.
|
|
28
37
|
*/
|
|
29
38
|
export async function bindMirroredRemoteRejudgeCards(
|
|
30
39
|
tasks: Readonly<Record<string, TaskCard>>, statePath: string,
|
|
31
40
|
deps: BindDeps = {},
|
|
32
|
-
): Promise<{ scanned: number; bound: number; skipped: number }> {
|
|
41
|
+
): Promise<{ scanned: number; bound: number; skipped: number; pulledUnmirrored: number }> {
|
|
33
42
|
const root = dirname(statePath);
|
|
34
43
|
const now = (deps.now ?? Date.now)();
|
|
35
44
|
const mirror = deps.mirror ?? mirrorRemoteRunLedgers;
|
|
@@ -41,8 +50,12 @@ export async function bindMirroredRemoteRejudgeCards(
|
|
|
41
50
|
let scanned = 0;
|
|
42
51
|
let bound = 0;
|
|
43
52
|
let skipped = 0;
|
|
53
|
+
let pulledUnmirrored = 0;
|
|
54
|
+
const unmirroredCap = deps.unmirroredPullCap ?? UNMIRRORED_PULL_CAP_PER_TICK;
|
|
44
55
|
for (const card of Object.values(tasks)) {
|
|
45
|
-
|
|
56
|
+
// TA-BIND-WIDEN — «묶기»는 taLand 와 무관하게 launched ⊕ runId 카드 전부. 묶여도 재판정(rejudge)·land 후보는
|
|
57
|
+
// `rejudgeCandidates`/`remoteBoundRunTerminal` 의 taLand 관문이 그대로 거른다 — 여기서 넓히는 것은 카드↔PR 연결뿐이다.
|
|
58
|
+
if (card.status !== 'launched' || !card.parentHost || !card.runId
|
|
46
59
|
|| cardPrNumber(card) !== undefined || card.refSource === 'manual') continue;
|
|
47
60
|
scanned++;
|
|
48
61
|
const dir = remoteLedgerMirrorDir(root, card.parentHost.host);
|
|
@@ -51,6 +64,10 @@ export async function bindMirroredRemoteRejudgeCards(
|
|
|
51
64
|
// dependency: cards with a remote PR cannot be selected while their parent/child ledgers are absent locally.
|
|
52
65
|
// Limit fresh remote pulls to recent launches, but keep binding older ledgers already mirrored at HQ.
|
|
53
66
|
if (recentlyLaunched(card, now)) mirror(card.parentHost, card.runId, root);
|
|
67
|
+
else if (!existsSync(join(dir, `${card.runId}.jsonl`)) && pulledUnmirrored < unmirroredCap) {
|
|
68
|
+
pulledUnmirrored++;
|
|
69
|
+
mirror(card.parentHost, card.runId, root);
|
|
70
|
+
}
|
|
54
71
|
const snapshot = await readCardRunSnapshot(card, {
|
|
55
72
|
loadLedger: (id) => loadRunLedger(id, dir),
|
|
56
73
|
podFinishes: () => [],
|
|
@@ -67,10 +84,13 @@ export async function bindMirroredRemoteRejudgeCards(
|
|
|
67
84
|
}
|
|
68
85
|
// A PR event alone is not a completed remote run. The rejudge candidate must have the same exact
|
|
69
86
|
// child PR and terminal status that remoteBoundRunTerminal will later require.
|
|
87
|
+
// TA-BIND-PR-TERMINAL — a blocked-draft child has no `pr-opened`; the parent's `pr-terminal` for that exact child,
|
|
88
|
+
// number and URL is the same PR evidence.
|
|
89
|
+
const terminal = parent ? podTerminalPr(parent, [childRunId ?? '']) : undefined;
|
|
70
90
|
if (!parent || !childRunId || !pr?.url || !child
|
|
71
91
|
|| !podChildRunIds(parent, card.runId).includes(childRunId)
|
|
72
|
-
|| !child.some((entry) => entry.event === 'pr-opened' && entry.data?.number === pr.number
|
|
73
|
-
&& entry.data?.url === pr.url)
|
|
92
|
+
|| !(child.some((entry) => entry.event === 'pr-opened' && entry.data?.number === pr.number
|
|
93
|
+
&& entry.data?.url === pr.url) || (terminal?.number === pr.number && terminal.url === pr.url))
|
|
74
94
|
|| !child.some((entry) => entry.event === 'run-status'
|
|
75
95
|
&& ['completed', 'failed', 'cancelled'].includes(String(entry.data?.runStatus)))) { skipped++; continue; }
|
|
76
96
|
const result = await refreshCardRunBinding(card.id, statePath, {
|
|
@@ -87,5 +107,5 @@ export async function bindMirroredRemoteRejudgeCards(
|
|
|
87
107
|
reportFailure(card, error instanceof Error ? error.message : String(error));
|
|
88
108
|
}
|
|
89
109
|
}
|
|
90
|
-
return { scanned, bound, skipped };
|
|
110
|
+
return { scanned, bound, skipped, pulledUnmirrored };
|
|
91
111
|
}
|
|
@@ -3,6 +3,7 @@ import { spawn } from 'node:child_process';
|
|
|
3
3
|
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
4
4
|
import { dirname, join, resolve, sep } from 'node:path';
|
|
5
5
|
import { debug } from '../debug/log.js';
|
|
6
|
+
import { readBudgetInputsLive, type BudgetInputs } from '../self-implement/budget-gate.js';
|
|
6
7
|
import { mintRunId } from '../harness/harness-space.js';
|
|
7
8
|
import { spawnElanousSync } from '../instance/spawn-elanous.js';
|
|
8
9
|
import { passJourneyNode } from '../self-dev/graph-journey-nodes.js';
|
|
@@ -32,11 +33,17 @@ export interface RepairCycleInput {
|
|
|
32
33
|
resolveOwner?: (card: TaskCard) => RepairOwner;
|
|
33
34
|
/** Shared only by one `tasks rejudge --all` invocation; a single-card rejudge has no cap. */
|
|
34
35
|
repairBudget?: RepairTickBudget;
|
|
36
|
+
/** Test seam; production reads the existing subscription quota signals. */
|
|
37
|
+
modelAvailability?: RepairModelAvailability;
|
|
38
|
+
/** Test seam for the same live quota reader used when availability is not injected. */
|
|
39
|
+
readBudgetInputs?: () => Promise<Pick<BudgetInputs, 'codexCandidates' | 'grokUsedPercent' | 'maxUsedPercent'>>;
|
|
35
40
|
}
|
|
36
41
|
|
|
37
42
|
export interface RepairTickBudget { max: number; requested: number; capped: number }
|
|
38
43
|
|
|
39
|
-
export type RepairCycleOutcome = { decision: 'would-repair' | 'repair-requested' | 'repair-pending' | 'repair-applied' | 'repair-failed' | 'repair-stopped'; reason: string
|
|
44
|
+
export type RepairCycleOutcome = { decision: 'would-repair' | 'repair-requested' | 'repair-pending' | 'repair-applied' | 'repair-failed' | 'repair-stopped'; reason: string;
|
|
45
|
+
/** Present only when this tick actually consumed a bound worker result. */
|
|
46
|
+
repairRunId?: string; repairHead?: string };
|
|
40
47
|
export type RepairOwner = { seat?: TaskSeat; source: string; reason?: string };
|
|
41
48
|
|
|
42
49
|
/** A missing card seat may use only a uniquely identified checklist cell's valid seat. */
|
|
@@ -70,12 +77,39 @@ export function resolveRepairOwner(card: TaskCard, deps: {
|
|
|
70
77
|
} catch { return { source: 'none', reason: `checklist owner invalid: ${cell.version}/${card.checklistId}` }; }
|
|
71
78
|
}
|
|
72
79
|
|
|
73
|
-
export
|
|
80
|
+
export interface RepairModelAvailability { codexSubscription: boolean; grokSubscription: boolean }
|
|
81
|
+
|
|
82
|
+
export async function repairModelAvailability(readInputs: () => Promise<Pick<BudgetInputs, 'codexCandidates' | 'grokUsedPercent' | 'maxUsedPercent'>> = readBudgetInputsLive): Promise<RepairModelAvailability> {
|
|
83
|
+
try {
|
|
84
|
+
const input = await readInputs();
|
|
85
|
+
const codexCap = input.maxUsedPercent['openai-codex'] ?? 95;
|
|
86
|
+
const grokCap = input.maxUsedPercent.grok ?? 100;
|
|
87
|
+
return {
|
|
88
|
+
codexSubscription: input.codexCandidates.some((candidate) => candidate.reached !== true
|
|
89
|
+
&& typeof candidate.usedPercent === 'number' && candidate.usedPercent < codexCap),
|
|
90
|
+
grokSubscription: typeof input.grokUsedPercent === 'number' && input.grokUsedPercent < grokCap,
|
|
91
|
+
};
|
|
92
|
+
} catch { return { codexSubscription: false, grokSubscription: false }; }
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Repair stays inside the dispatch tier. A missing legacy tier is high, with Sol allowed only on measured subscription quota. */
|
|
96
|
+
export function alternateRepairModel(card: TaskCard, availability: RepairModelAvailability = { codexSubscription: false, grokSubscription: false }): { from: string; to: TaskChildLlm } {
|
|
74
97
|
const last = card.repairs?.at(-1);
|
|
75
98
|
const from = last?.toModel ?? (card.childLlm ? `${card.childLlm.provider}/${card.childLlm.model}` : 'unknown');
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
99
|
+
const glm: TaskChildLlm = { provider: 'openrouter', model: 'openrouter/z-ai/glm-5.3' };
|
|
100
|
+
const sol: TaskChildLlm = { provider: 'openai-codex', model: 'gpt-6-sol' };
|
|
101
|
+
const grok: TaskChildLlm = { provider: 'grok', model: 'grok-4.6' };
|
|
102
|
+
const tier = card.tier ?? '상';
|
|
103
|
+
const pr = typeof card.pr === 'number' ? card.pr : card.pr?.number;
|
|
104
|
+
const mixEven = ((pr ?? [...card.id].reduce((sum, ch) => sum + ch.charCodeAt(0), 0)) % 2) === 0;
|
|
105
|
+
let to: TaskChildLlm;
|
|
106
|
+
if (tier === '특') to = sol;
|
|
107
|
+
else if (tier === '상' && availability.codexSubscription && mixEven && !from.includes('gpt-6-sol')) to = sol;
|
|
108
|
+
else if (tier === '상') to = availability.grokSubscription && from.includes('glm') ? grok
|
|
109
|
+
: from.includes('glm-5.3-flash') ? glm
|
|
110
|
+
: from.includes('glm-5.3') ? { provider: 'openrouter', model: 'openrouter/z-ai/glm-5.3-flash' } : glm;
|
|
111
|
+
else to = from.includes('glm-5.3-flash') ? glm : from.includes('glm-5.3')
|
|
112
|
+
? { provider: 'openrouter', model: 'openrouter/z-ai/glm-5.3-flash' } : glm;
|
|
79
113
|
return { from, to };
|
|
80
114
|
}
|
|
81
115
|
|
|
@@ -131,6 +165,7 @@ export async function runRepairCycle(input: RepairCycleInput): Promise<RepairCyc
|
|
|
131
165
|
runId: latest.runId, effect: status, detail: applied.ok ? applied.toHead : applied.reason }] } : undefined);
|
|
132
166
|
} catch (error) { return { decision: 'repair-pending', reason: `repair confirmation card write failed: ${String(error).slice(-200)}` }; }
|
|
133
167
|
const recorded = readTaskCard(card.id, statePath)?.repairs?.find((entry) => entry.runId === latest.runId)?.status === status;
|
|
168
|
+
// This confirms a result already claimed by another tick; it did not consume the worker result.
|
|
134
169
|
return recorded ? { decision: applied.ok ? 'repair-applied' : 'repair-failed', reason: applied.ok ? `same PR #${pr} fast-forward ${latest.head.slice(0, 12)} → ${applied.toHead.slice(0, 12)}` : applied.reason }
|
|
135
170
|
: { decision: 'repair-pending', reason: 'repair confirmation card changed concurrently' };
|
|
136
171
|
}
|
|
@@ -187,7 +222,8 @@ export async function runRepairCycle(input: RepairCycleInput): Promise<RepairCyc
|
|
|
187
222
|
runId: latest.runId, effect: status, detail }] } : undefined);
|
|
188
223
|
} catch (error) { return { decision: 'repair-pending', reason: `repair card write failed after CAS: ${String(error).slice(-200)}` }; }
|
|
189
224
|
const recorded = readTaskCard(card.id, statePath)?.repairs?.find((entry) => entry.runId === latest.runId)?.status === status;
|
|
190
|
-
return recorded ? { decision: applied?.ok ? 'repair-applied' : applied?.unconfirmed ? 'repair-pending' : 'repair-failed', reason: detail
|
|
225
|
+
return recorded ? { decision: applied?.ok ? 'repair-applied' : applied?.unconfirmed ? 'repair-pending' : 'repair-failed', reason: detail,
|
|
226
|
+
repairRunId: latest.runId, repairHead: latest.head }
|
|
191
227
|
: { decision: 'repair-pending', reason: 'repair result card changed concurrently' };
|
|
192
228
|
}
|
|
193
229
|
if (latest?.status === 'applied' && latest.head.toLowerCase() === head.toLowerCase())
|
|
@@ -244,7 +280,9 @@ export async function runRepairCycle(input: RepairCycleInput): Promise<RepairCyc
|
|
|
244
280
|
}
|
|
245
281
|
const next = attempts.length + 1;
|
|
246
282
|
const runId = mintRunId();
|
|
247
|
-
const
|
|
283
|
+
const availability = input.modelAvailability ?? (card.tier === '특' || card.tier === '중' || card.tier === '하'
|
|
284
|
+
? { codexSubscription: false, grokSubscription: false } : await repairModelAvailability(input.readBudgetInputs));
|
|
285
|
+
const { from, to } = alternateRepairModel(card, availability);
|
|
248
286
|
const resultPath = repairResultPath(statePath, card.id, pr, head, next, runId);
|
|
249
287
|
const goalFile = resultPath.replace(/\.json$/, '.goal.txt');
|
|
250
288
|
const goal = `기존 PR #${pr}의 리뷰 때 head ${head}를 같은 가지에서 수리한다. 새 PR을 열지 말고 아래 must-fix 원문만 고쳐 commit-only 결과를 반환한다.\n\n${input.mustFix.map((item, i) => `${i + 1}. ${item}`).join('\n')}`;
|
|
@@ -4,6 +4,7 @@ import { mkdirSync, renameSync, writeFileSync } from 'node:fs';
|
|
|
4
4
|
import { dirname } from 'node:path';
|
|
5
5
|
import type { RepairCommitResult } from './repair-branch-cas.js';
|
|
6
6
|
import type { TaskChildLlm } from './task-hand.js';
|
|
7
|
+
import { publishInsideEvent } from '../nexus/api/inside-events.js';
|
|
7
8
|
|
|
8
9
|
const SHA40 = /^[0-9a-f]{40}$/i;
|
|
9
10
|
const SHA256 = /^[0-9a-f]{64}$/i;
|
|
@@ -70,6 +71,12 @@ export async function runRepairWorker(request: RepairWorkerRequest): Promise<Rep
|
|
|
70
71
|
const tmp = `${request.resultPath}.${process.pid}.tmp`;
|
|
71
72
|
writeFileSync(tmp, JSON.stringify(result));
|
|
72
73
|
renameSync(tmp, request.resultPath);
|
|
74
|
+
// The result file, rather than this best-effort notification, is the durable source.
|
|
75
|
+
try {
|
|
76
|
+
publishInsideEvent({ kind: 'ta.repair.completed', schema: 1, card: request.card,
|
|
77
|
+
pr: request.pr, head: request.head, runId: request.runId,
|
|
78
|
+
resultPath: request.resultPath, completedAt: new Date().toISOString() });
|
|
79
|
+
} catch { /* a missing daemon cannot change the worker result */ }
|
|
73
80
|
return result;
|
|
74
81
|
}
|
|
75
82
|
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RUN-IDENTITY-TAGS(칸 0.2.32 · P0) — 런 신분 묶음 정본(RFC adaptive-graph-ops §9.9).
|
|
3
|
+
*
|
|
4
|
+
* - 닫힌 목록 신분 묶음 `RunIdentity`: GATE-PRIORITY 의 «run priority» 를 `class` 로
|
|
5
|
+
* 흡수한다(승인·선점이 `RUN_IDENTITY_QUEUE_PRIORITY` 로 이 문을 읽는다 — 나머지
|
|
6
|
+
* 디스패처 배선은 RUN-IDENTITY-ADMIT).
|
|
7
|
+
* - parse/validate: 목록 밖 값은 거부한다(조용히 다듬지 않는다).
|
|
8
|
+
* - 출생 신분 자동(`deriveBirthIdentity`): 칸 우선순위(P0 = critical·special·protect ·
|
|
9
|
+
* P1 = normal · 그 외 normal)·대표 표시에서 단다.
|
|
10
|
+
* - 태그 덮기(`applyRunIdentityTags`): `tasks hand --tag k=v`(반복) 이 출생 신분을 덮는다.
|
|
11
|
+
* - ⛔ 모르는 칸을 기본값으로 확정하지 않는다: 칸 조회가 실패하면 명시 태그만 담고 나머지는 «미기록».
|
|
12
|
+
* - 태그 바꾸기 감사(`runTagChange` — task-hand.ts): 카드 history 에 `run-tag-change`
|
|
13
|
+
* {from, to, by, reason} 을 남긴다.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/** 신분 계급 — GATE-PRIORITY «run priority» 흡수: 게이트|착지|비상|보통|유휴. */
|
|
17
|
+
export const RUN_IDENTITY_CLASSES = ['gate', 'landing', 'critical', 'normal', 'idle'] as const;
|
|
18
|
+
export type RunIdentityClass = (typeof RUN_IDENTITY_CLASSES)[number];
|
|
19
|
+
/** 돌봄: 표준|특별|집중돌봄. */
|
|
20
|
+
export const RUN_IDENTITY_CARES = ['standard', 'special', 'icu'] as const;
|
|
21
|
+
export type RunIdentityCare = (typeof RUN_IDENTITY_CARES)[number];
|
|
22
|
+
/** 권한 크기: 보통|중간|큰. */
|
|
23
|
+
export const RUN_IDENTITY_RIGHTS = ['s', 'm', 'l'] as const;
|
|
24
|
+
export type RunIdentityRights = (typeof RUN_IDENTITY_RIGHTS)[number];
|
|
25
|
+
/** 출생 자리: 디스패처|손|대기열|의사. */
|
|
26
|
+
export const RUN_IDENTITY_LAUNCHERS = ['dispatcher', 'hand', 'queue', 'doctor'] as const;
|
|
27
|
+
export type RunIdentityLauncher = (typeof RUN_IDENTITY_LAUNCHERS)[number];
|
|
28
|
+
|
|
29
|
+
/** 출생 기록 — 칸마다 optional: 없는 칸은 «미기록»(모른다)이다. 출생 자리를 모르면 `launcher` 를 비운다(지어내지 않는다). */
|
|
30
|
+
export interface RunIdentityOrigin {
|
|
31
|
+
checklistId?: string;
|
|
32
|
+
version?: string;
|
|
33
|
+
seat?: string;
|
|
34
|
+
launcher?: RunIdentityLauncher;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 런 신분 묶음 — 카드 상태 파일(원장 정본)에 실린다(`TaskCard.identity`).
|
|
39
|
+
* ⛔ 모르는 칸을 기본값으로 확정하지 않는다 — 칸마다 optional 이고 없는 칸은 «미기록»이다.
|
|
40
|
+
* 확인된 칸만 담는다: 명시 태그(`--tag k=v`) ⊕ 조회에 성공한 칸에서 단 출생값(`deriveBirthIdentity`).
|
|
41
|
+
* 승인·선점이 `class` 를 못 찾으면 normal 로 «읽을» 뿐(`runPriorityClass`) 원장엔 적지 않는다.
|
|
42
|
+
*/
|
|
43
|
+
export interface RunIdentity {
|
|
44
|
+
class?: RunIdentityClass;
|
|
45
|
+
care?: RunIdentityCare;
|
|
46
|
+
rights?: RunIdentityRights;
|
|
47
|
+
protect?: boolean;
|
|
48
|
+
origin: RunIdentityOrigin;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** 화면·감사 줄의 «미기록» 표기 — 원장에 없는 칸(모른다). */
|
|
52
|
+
export const RUN_IDENTITY_UNRECORDED = '미기록';
|
|
53
|
+
|
|
54
|
+
/** 신분 칸 하나를 글로 — 없으면 «미기록»(기본값으로 채우지 않는다). */
|
|
55
|
+
export function runIdentityFieldText(identity: RunIdentity | undefined, key: RunTagKey): string {
|
|
56
|
+
const value = identity?.[key];
|
|
57
|
+
return value === undefined ? RUN_IDENTITY_UNRECORDED : String(value);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** `--tag k=v` 칸(닫힌 목록) — 신분의 어느 칸을 바꾸는지. */
|
|
61
|
+
export const RUN_TAG_KEYS = ['class', 'care', 'rights', 'protect'] as const;
|
|
62
|
+
export type RunTagKey = (typeof RUN_TAG_KEYS)[number];
|
|
63
|
+
export type RunIdentityTag =
|
|
64
|
+
| { key: 'class'; value: RunIdentityClass }
|
|
65
|
+
| { key: 'care'; value: RunIdentityCare }
|
|
66
|
+
| { key: 'rights'; value: RunIdentityRights }
|
|
67
|
+
| { key: 'protect'; value: boolean };
|
|
68
|
+
|
|
69
|
+
/** 칸(체크리스트 셀) — 출생 신분이 단다: 우선순위·대표 표시(제목)·칸보드 판. */
|
|
70
|
+
export interface RunIdentityCell {
|
|
71
|
+
title?: string;
|
|
72
|
+
priority?: string;
|
|
73
|
+
version?: string;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function parseRunIdentityClass(value: string): RunIdentityClass {
|
|
77
|
+
if (!RUN_IDENTITY_CLASSES.includes(value as RunIdentityClass)) throw new Error(`run identity class 는 ${RUN_IDENTITY_CLASSES.join('|')} 중 하나다: ${JSON.stringify(value)}`);
|
|
78
|
+
return value as RunIdentityClass;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function parseRunIdentityCare(value: string): RunIdentityCare {
|
|
82
|
+
if (!RUN_IDENTITY_CARES.includes(value as RunIdentityCare)) throw new Error(`run identity care 는 ${RUN_IDENTITY_CARES.join('|')} 중 하나다: ${JSON.stringify(value)}`);
|
|
83
|
+
return value as RunIdentityCare;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function parseRunIdentityRights(value: string): RunIdentityRights {
|
|
87
|
+
if (!RUN_IDENTITY_RIGHTS.includes(value as RunIdentityRights)) throw new Error(`run identity rights 는 ${RUN_IDENTITY_RIGHTS.join('|')} 중 하나다: ${JSON.stringify(value)}`);
|
|
88
|
+
return value as RunIdentityRights;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function parseRunIdentityProtect(value: string): boolean {
|
|
92
|
+
if (value !== 'true' && value !== 'false') throw new Error(`run identity protect 는 true|false 다: ${JSON.stringify(value)}`);
|
|
93
|
+
return value === 'true';
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** `k=v` 한 줄을 신분 태그로 — 모르는 칸·목록 밖 값은 거부한다. */
|
|
97
|
+
export function parseRunIdentityTag(tag: string): RunIdentityTag {
|
|
98
|
+
const eq = tag.indexOf('=');
|
|
99
|
+
const key = eq < 0 ? '' : tag.slice(0, eq);
|
|
100
|
+
const value = eq < 0 ? '' : tag.slice(eq + 1);
|
|
101
|
+
if (!RUN_TAG_KEYS.includes(key as RunTagKey)) throw new Error(`run identity 태그 칸은 ${RUN_TAG_KEYS.join('|')} 중 하나다: ${JSON.stringify(tag)}`);
|
|
102
|
+
switch (key) {
|
|
103
|
+
case 'class': return { key: 'class', value: parseRunIdentityClass(value) };
|
|
104
|
+
case 'care': return { key: 'care', value: parseRunIdentityCare(value) };
|
|
105
|
+
case 'rights': return { key: 'rights', value: parseRunIdentityRights(value) };
|
|
106
|
+
default: return { key: 'protect', value: parseRunIdentityProtect(value) };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** 이미 검증한 태그 하나를 신분에 얹는다(검증은 `parseRunIdentityTag` 몫). */
|
|
111
|
+
export function applyRunIdentityTag(identity: RunIdentity, tag: RunIdentityTag): RunIdentity {
|
|
112
|
+
switch (tag.key) {
|
|
113
|
+
case 'class': return { ...identity, class: tag.value };
|
|
114
|
+
case 'care': return { ...identity, care: tag.value };
|
|
115
|
+
case 'rights': return { ...identity, rights: tag.value };
|
|
116
|
+
default: return { ...identity, protect: tag.value };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** `--tag k=v`(반복) 이 출생 신분을 덮는다 — 순서대로 얹는다. */
|
|
121
|
+
export function applyRunIdentityTags(identity: RunIdentity, tags: readonly string[]): RunIdentity {
|
|
122
|
+
let next = identity;
|
|
123
|
+
for (const tag of tags) next = applyRunIdentityTag(next, parseRunIdentityTag(tag));
|
|
124
|
+
return next;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** 대표 표시(왕관) — 이스케이프로 적어 이 줄이 누출 검사(ceo-mark)에 걸리지 않게 한다. */
|
|
128
|
+
const CROWN_MARK = '\u{1F451}';
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* 출생 신분 자동 — «조회에 성공한» 칸의 우선순위(P0 = critical·special·protect · P1 = normal · 그 외 normal)·대표 표시에서 단다.
|
|
132
|
+
* 권한(rights)은 출생에서 올리지 않는다(기본 s · 올림은 `--tag rights=…` 명시만).
|
|
133
|
+
* ⛔ 칸을 못 읽었으면 부르지 않는다 — 그때는 `{ origin }` 에 명시 태그만 얹는다(나머지 «미기록»).
|
|
134
|
+
* ⛔ 읽은 칸이라도 `priority`·`title` 이 비면 그 값에서 파생되는 칸을 확정하지 않는다(«미기록»):
|
|
135
|
+
* class 는 priority 가 있어야 · care·protect 는 P0 이거나 대표 가 보이면 올리고, «안 올림»(standard·false)은
|
|
136
|
+
* priority 와 title 이 둘 다 있을 때만 확정한다.
|
|
137
|
+
*/
|
|
138
|
+
export function deriveBirthIdentity(cell: RunIdentityCell, origin: RunIdentityOrigin): RunIdentity {
|
|
139
|
+
const priority = cell.priority?.trim() ? cell.priority.trim() : undefined;
|
|
140
|
+
const title = cell.title?.trim() ? cell.title : undefined;
|
|
141
|
+
const critical = priority === 'P0';
|
|
142
|
+
const crown = title?.includes(CROWN_MARK) === true;
|
|
143
|
+
const raised = critical || crown;
|
|
144
|
+
const careKnown = raised || (priority !== undefined && title !== undefined);
|
|
145
|
+
return {
|
|
146
|
+
...(priority !== undefined ? { class: critical ? 'critical' as const : 'normal' as const } : {}),
|
|
147
|
+
...(careKnown ? { care: raised ? 'special' as const : 'standard' as const, protect: raised } : {}),
|
|
148
|
+
rights: 's',
|
|
149
|
+
origin,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** GATE-PRIORITY «run priority» 흡수 — 신분 `class` 가 런 우선순위다(승인·선점이 읽는다 · 없거나 «미기록»이면 normal 로 «읽는다» — 원장엔 적지 않는다). */
|
|
154
|
+
export function runPriorityClass(identity?: Pick<RunIdentity, 'class'> | null): RunIdentityClass {
|
|
155
|
+
return identity?.class ?? 'normal';
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* 승인·선점 가늠자 — 신분 `class` 를 대기열 줄 우선순위로 옮긴다(RUN-IDENTITY-ADMIT 첫 배선).
|
|
160
|
+
* 게이트 > 착지 > 비상 순, 셋 다 칸 러브릭·CEO 보너스(`harness-queue.ts` ≈ 125.5 이하)보다
|
|
161
|
+
* 위에 줄 선다 — `tasks hand` 발사 인자가 이 값을 싣고 승인·선점이 읽는다.
|
|
162
|
+
* 보통·유휴는 칸 러브릭을 그대로 쓴다(값 없음).
|
|
163
|
+
*/
|
|
164
|
+
export const RUN_IDENTITY_QUEUE_PRIORITY: Record<RunIdentityClass, number | undefined> = { gate: 200, landing: 175, critical: 150, normal: undefined, idle: undefined };
|
|
165
|
+
|
|
166
|
+
/** 신분의 대기열 줄 우선순위 — 보통·유휴는 칸 러브릭으로 흐른다(값 없음). */
|
|
167
|
+
export function runIdentityQueuePriority(identity?: Pick<RunIdentity, 'class'> | null): number | undefined {
|
|
168
|
+
return RUN_IDENTITY_QUEUE_PRIORITY[runPriorityClass(identity)];
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** 평범한 객체인가 — 원형이 Object.prototype 또는 null 인 객체만(배열·Date·클래스 인스턴스·null 아님). 원장에서 읽은 값의 형태 검사. */
|
|
172
|
+
function isPlainRecord(value: unknown): value is Record<string, unknown> {
|
|
173
|
+
if (value === null || typeof value !== 'object') return false;
|
|
174
|
+
const proto = Object.getPrototypeOf(value);
|
|
175
|
+
return proto === Object.prototype || proto === null;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* 원장에서 읽은 신분도 닫힌 목록으로 검증한다 — 목록 밖 값·형태가 틀린 값은 거부한다.
|
|
180
|
+
* 출생 기록(origin)은 없으면 «미기록»(빈 출생 기록 `{}` 으로 읽는다 — 지어내지 않는다) ·
|
|
181
|
+
* 있으면 평범한 객체여야 하고 checklistId·version·seat 는 문자열, launcher 는 닫힌 목록이다.
|
|
182
|
+
*/
|
|
183
|
+
export function validateRunIdentity(identity: RunIdentity): RunIdentity {
|
|
184
|
+
if (!isPlainRecord(identity)) throw new Error(`run identity 는 객체다: ${JSON.stringify(identity)}`);
|
|
185
|
+
// 칸마다 optional(없으면 «미기록») — 있는 칸만 닫힌 목록으로 검증한다.
|
|
186
|
+
const { class: klass, care, rights, protect, origin } = identity as Partial<RunIdentity>;
|
|
187
|
+
if (klass !== undefined && !RUN_IDENTITY_CLASSES.includes(klass)) throw new Error(`run identity class 는 ${RUN_IDENTITY_CLASSES.join('|')} 중 하나다: ${JSON.stringify(klass)}`);
|
|
188
|
+
if (care !== undefined && !RUN_IDENTITY_CARES.includes(care)) throw new Error(`run identity care 는 ${RUN_IDENTITY_CARES.join('|')} 중 하나다: ${JSON.stringify(care)}`);
|
|
189
|
+
if (rights !== undefined && !RUN_IDENTITY_RIGHTS.includes(rights)) throw new Error(`run identity rights 는 ${RUN_IDENTITY_RIGHTS.join('|')} 중 하나다: ${JSON.stringify(rights)}`);
|
|
190
|
+
if (protect !== undefined && typeof protect !== 'boolean') throw new Error(`run identity protect 는 true|false 다: ${JSON.stringify(protect)}`);
|
|
191
|
+
if (origin === undefined) return { ...identity, origin: {} }; // 출생 기록 «미기록» — 칸을 지어내지 않는다.
|
|
192
|
+
if (!isPlainRecord(origin)) throw new Error(`run identity origin 은 객체다: ${JSON.stringify(origin)}`);
|
|
193
|
+
for (const key of ['checklistId', 'version', 'seat'] as const) {
|
|
194
|
+
const value = origin[key];
|
|
195
|
+
if (value !== undefined && typeof value !== 'string') throw new Error(`run identity origin.${key} 는 문자열이다: ${JSON.stringify(value)}`);
|
|
196
|
+
}
|
|
197
|
+
const launcher = origin.launcher;
|
|
198
|
+
if (launcher !== undefined && !RUN_IDENTITY_LAUNCHERS.includes(launcher as RunIdentityLauncher)) throw new Error(`run identity 출생 자리는 ${RUN_IDENTITY_LAUNCHERS.join('|')} 중 하나다: ${JSON.stringify(launcher)}`);
|
|
199
|
+
return identity;
|
|
200
|
+
}
|
package/src/task-agent/shadow.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* TASK-AGENT-SHADOW — 슈퍼바이저가 런의 멈춤을 확정한 자리에서 판단부를 «그림자»로 부른다.
|
|
3
3
|
*
|
|
4
4
|
* RFC-task-agent-any-task-to-completion-2026-10-06 §A9 «판단부 호출부 0»을 메운다.
|
|
5
|
-
* -
|
|
6
|
-
* PR
|
|
5
|
+
* - 기본 판단은 슈퍼바이저 결과에 이미 실린 종료 어휘·PR 번호·병합 여부를 쓴다.
|
|
6
|
+
* 카드가 묶인 코드 PR의 target diff는 저장소가 고정된 gh 조회로 별도 측정한다. 리뷰 판정·must-fix 는 결과에 없으므로 비운다
|
|
7
7
|
* («통과»로 읽지 않는다 — 판단부가 review 수를 고른다).
|
|
8
8
|
* - 슈퍼바이저의 기본 호출은 shadow: «했을 수»만 기록하고 명령·복사는 하나도 돌리지 않는다.
|
|
9
9
|
* 전달 과제의 명시적 live 호출만 파일을 복사한다. 설정 `taskAgent.mode=live` 는 기본 호출에 먹지 않는다.
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { lstatSync, readFileSync, readdirSync, realpathSync } from 'node:fs';
|
|
13
13
|
import { randomUUID } from 'node:crypto';
|
|
14
|
+
import { execFile } from 'node:child_process';
|
|
15
|
+
import { promisify } from 'node:util';
|
|
14
16
|
import { extname, join, relative, resolve } from 'node:path';
|
|
15
17
|
import { debug } from '../debug/log.js';
|
|
16
18
|
import { readTaskAgentState, readTaskCard, taskAgentStatePath, TASK_CARD_PREFIX, type CompletionKind, type TaskCard } from './task-hand.js';
|
|
@@ -72,12 +74,32 @@ export interface TaskAgentShadowDeps {
|
|
|
72
74
|
statePath?: string;
|
|
73
75
|
/** TA-WIRING-CHECK — 배선 근거 수집 의존(시험 주입 · 기본 = gh pr diff 한 번 ⊕ 카드 런 원장). */
|
|
74
76
|
wiring?: Omit<WiringEvidenceDeps, 'card'>;
|
|
77
|
+
/** Complete PR target paths; undefined means unmeasured, never goal-only. */
|
|
78
|
+
prFiles?: (pr: number, prUrl: string | undefined) => Promise<readonly string[] | undefined>;
|
|
75
79
|
/** Process env for the launched-run id (`ELANOUS_RUN_ID`) — test seam; default process.env. */
|
|
76
80
|
env?: NodeJS.ProcessEnv;
|
|
77
81
|
/** Remote pending-move ledger seam; defaults to the run ledger. */
|
|
78
82
|
queueMove?: typeof appendRunLedgerEntry;
|
|
79
83
|
}
|
|
80
84
|
|
|
85
|
+
const execFileAsync = promisify(execFile);
|
|
86
|
+
export function prRepositoryFromUrl(pr: number, prUrl: string | undefined): string | undefined {
|
|
87
|
+
const match = prUrl?.match(/^https:\/\/github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/pull\/(\d+)\/?$/);
|
|
88
|
+
return match && Number(match[3]) === pr ? `${match[1]}/${match[2]}` : undefined;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export async function defaultPrFiles(pr: number, prUrl: string | undefined,
|
|
92
|
+
run: (args: readonly string[]) => Promise<string> = async (args) => {
|
|
93
|
+
const { stdout } = await execFileAsync('gh', [...args],
|
|
94
|
+
{ encoding: 'utf8', timeout: 20_000, maxBuffer: 4 * 1024 * 1024 });
|
|
95
|
+
return stdout;
|
|
96
|
+
}): Promise<readonly string[]> {
|
|
97
|
+
const repository = prRepositoryFromUrl(pr, prUrl);
|
|
98
|
+
if (!repository) throw new Error('bound PR repository unavailable');
|
|
99
|
+
const stdout = await run(['pr', 'diff', String(pr), '--name-only', '-R', repository]);
|
|
100
|
+
return stdout.split(/\r?\n/).filter(Boolean);
|
|
101
|
+
}
|
|
102
|
+
|
|
81
103
|
export const REMOTE_CARD_MOVE_PENDING = 'task-agent-card-move-pending';
|
|
82
104
|
|
|
83
105
|
/** 카드 조회 상태 파일 — 조회 경로 전부가 같은 파일을 본다. */
|
|
@@ -258,6 +280,17 @@ export async function recordTaskAgentShadowMove(input: TaskAgentShadowInput, dep
|
|
|
258
280
|
}
|
|
259
281
|
}
|
|
260
282
|
if (selfReview) judgeInput.review = selfReview.verdict;
|
|
283
|
+
if (card && typeof judgeInput.pr === 'number' && (!kind || kind === 'code-pr')) {
|
|
284
|
+
try {
|
|
285
|
+
const prUrl = typeof card.pr === 'object' && card.pr.number === judgeInput.pr && card.pr.url
|
|
286
|
+
? card.pr.url : successful?.prUrl;
|
|
287
|
+
const files = await (deps.prFiles ?? defaultPrFiles)(judgeInput.pr, prUrl);
|
|
288
|
+
if (files) judgeInput.prTargetPaths = files;
|
|
289
|
+
} catch (error) {
|
|
290
|
+
try { (deps.log ?? ((c, e, d) => debug.log(c, e, d)))('task-agent', 'pr-target-diff-unavailable',
|
|
291
|
+
{ runId: input.runId, pr: judgeInput.pr, reason: error instanceof Error ? error.message : String(error) }); } catch { /* fail-soft */ }
|
|
292
|
+
}
|
|
293
|
+
}
|
|
261
294
|
const delivery = successful?.worktreePath && card?.project?.target && isDeliveryKind(kind)
|
|
262
295
|
? { kind, worktreePath: successful.worktreePath, projectTarget: card.project.target, files: selectDeliveryCandidates(successful.worktreePath, kind) }
|
|
263
296
|
: undefined;
|
|
@@ -266,6 +299,16 @@ export async function recordTaskAgentShadowMove(input: TaskAgentShadowInput, dep
|
|
|
266
299
|
? { move: 'wait', stage: 'observing', reason: '전달 후보 확인 — 산출물 판독 대기', executorKind: 'deliver' }
|
|
267
300
|
: { move: 'wait', stage: 'waiting', reason: '전달 후보 없음' }
|
|
268
301
|
: judgeNextMove(judgeInput);
|
|
302
|
+
if (judgement.reason.startsWith('goal-only-pr —') && input.runId) {
|
|
303
|
+
try {
|
|
304
|
+
(deps.queueMove ?? appendRunLedgerEntry)({ timestamp: new Date().toISOString(), runId: input.runId,
|
|
305
|
+
event: 'task-agent-goal-only-pr', data: { pr: judgeInput.pr, paths: judgeInput.prTargetPaths,
|
|
306
|
+
targetDiff: 0, reason: judgement.reason, requeue: 'stopped' } });
|
|
307
|
+
} catch (error) {
|
|
308
|
+
try { (deps.log ?? ((c, e, d) => debug.log(c, e, d)))('task-agent', 'goal-only-pr-ledger-failed',
|
|
309
|
+
{ runId: input.runId, pr: judgeInput.pr, reason: error instanceof Error ? error.message : String(error) }); } catch { /* fail-soft */ }
|
|
310
|
+
}
|
|
311
|
+
}
|
|
269
312
|
if (cardLookupFailed) judgement.reason = `${judgement.reason} · 종결 종류 미확인(카드 조회 실패)`;
|
|
270
313
|
// 판단마다 해석한다 — 허용되지 않은 수를 판단할 때도 모르는 항목 경고가 남게.
|
|
271
314
|
const liveMoves = deps.liveMoves ?? await configuredTaskAgentLiveMoves();
|
|
@@ -342,8 +385,12 @@ export async function recordTaskAgentShadowMove(input: TaskAgentShadowInput, dep
|
|
|
342
385
|
} } : {}),
|
|
343
386
|
}, liveMoveDeps(deps));
|
|
344
387
|
} else if (liveKind === 'propose-land') {
|
|
388
|
+
// A supervisor live move can reach land before the periodic rejudge tick. Carry
|
|
389
|
+
// the captured review file for this PR/head so queue mode can verify its bytes.
|
|
390
|
+
const reviewResultPath = boundCard?.reviewRequests?.find((request) => request.pr === prResult?.prNumber
|
|
391
|
+
&& request.head.toLowerCase() === selfReview?.head.toLowerCase() && request.resultPath && !request.error)?.resultPath;
|
|
345
392
|
liveMove = await executeLiveLand(boundCard, prResult?.prNumber,
|
|
346
|
-
{ runId: input.runId, cycleId: input.cycleId, review: selfReview,
|
|
393
|
+
{ runId: input.runId, cycleId: input.cycleId, review: selfReview, ...(reviewResultPath ? { reviewResultPath } : {}),
|
|
347
394
|
...(prResult?.worktreePath ? { cwd: prResult.worktreePath } : {}),
|
|
348
395
|
...(prResult && !prResult.worktreePath ? { produced: {
|
|
349
396
|
...(prResult.checkedHeadCommit !== undefined ? { headCommit: prResult.checkedHeadCommit } : {}),
|