elanous 0.2.29 → 0.2.31
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 → LSXfY0u9QtfDbejY0Ukf_}/_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-50625904996a8fa8.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/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-92f87bd108322f66.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-bf3634a117322df7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-3535a4a69f1fafaa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-b9f51447f757fbf2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-a5635eba0d73b84e.js → page-2ebb8fd59b9461f9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-a2fc4e49a4fa4ba8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-5a503541353e60a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-6025101384e361a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f4b630cc8b5273cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-a645f00a06483e9a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-61ac22cbab1ee4ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e9bab7413b028b28.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c992eafe028b642e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-e547e6ce55f1fb33.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-d27e1b9850fd54bf.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-805ac2e137b7a121.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-0fec29c7ba01894b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-339a07410cd6f36b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-349f2752d8cd37ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d5c6dcf31c25cecc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2fd93ed8c9f16580.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-9b564dbff0fefc35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-62f4475d3c38fb9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-814ba51385225776.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-397d479626e5a459.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-af1bba4e3251b728.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ad3be5e7d3fdce9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-f219ccdbc0bf27df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4da93ad35d4a8d28.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-456666766e5ce6fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-7404e377e8adb8c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-14456240ed2a36ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-3a658d5fa6d16a25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-0157de6e85f8bb6b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-0a07363b130182a1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-841d73d4ac44ed49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6f43a3d1146e6377.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-521ee23ac8c0abfa.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9992ee285efaa83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-3d48e85fa89ec04f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d2ced71132fac9b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-f08358bdf251adb9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-233c71cd5f68f0d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-70151d78de2f375e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-dcac33a3e2cb72c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/{page-9f92737b8766009a.js → page-149dc1caba411bb9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0448145ccd5c45c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-9cb0c444903da65d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-17e504c396e0e389.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/{72becfd42807b50d.css → 3f5fc6f96e2cf7b2.css} +1 -1
- 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 +23 -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/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 +37 -9
- 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/ratchets/test-interference-patterns.allowlist.txt +257 -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/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 +50 -5
- package/src/ad-pipeline/run.ts +4 -2
- package/src/agent/runner.ts +169 -3
- package/src/agent/subagent-callable.ts +3 -2
- 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 +12 -0
- package/src/agent-substrate/self-review-cli.ts +30 -4
- package/src/autopilot/pr-manager.ts +62 -7
- package/src/briefing/brief-items.ts +24 -22
- package/src/capture/tui-self-report.ts +15 -0
- package/src/chat/chat-cli.ts +10 -2
- package/src/chat/index.ts +77 -11
- package/src/chat/input-control-key.ts +5 -3
- 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/config-audit.ts +123 -0
- package/src/cli/decisions-cli.ts +80 -6
- package/src/cli/log-event-names.ts +7 -0
- package/src/cli/mcp-login.ts +21 -5
- package/src/cli/msg-cli.ts +88 -0
- package/src/cli/pr-cli.ts +214 -57
- package/src/cli/pr-land-heavy-remote.ts +2 -2
- package/src/cli/pr-land-overlap-evidence.ts +63 -9
- package/src/cli/pr-land-pod-shadow-job.ts +83 -0
- package/src/cli/pr-land-pod-shadow.ts +16 -3
- package/src/cli/pr-land-virtual-rebase.ts +108 -0
- 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/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 +75 -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 +1 -0
- package/src/core-turn/run-goal-loop.ts +222 -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 +3 -0
- package/src/dashboard/acp-boot.ts +3 -0
- package/src/dashboard/index.ts +224 -615
- package/src/dashboard/input/chat-main-entry-runtime.ts +1 -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 +26 -0
- package/src/dashboard/input/internal-turn.ts +261 -0
- package/src/dashboard/input/seat-autowake.ts +318 -0
- package/src/dashboard/input/turn-steer-bridge.ts +70 -0
- 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/decisions/decision-ledger.ts +45 -4
- package/src/discord-self-message.ts +4 -4
- package/src/domains/release-tool.ts +18 -1
- package/src/field-note/transcribe.ts +17 -0
- 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/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 +57 -20
- package/src/harness/harness-pod-dispatch.ts +87 -10
- package/src/harness/harness-queue.ts +53 -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 +152 -25
- package/src/input/external-input-queue.ts +33 -1
- package/src/intake-plane/slash.ts +14 -3
- package/src/keybindings.ts +4 -1
- package/src/llm/tool-loop-steered-rejection.ts +33 -0
- package/src/llm.ts +138 -19
- 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 +64 -10
- 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/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/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/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 +288 -0
- package/src/prompt-library/chat-conciseness.ts +13 -0
- package/src/prompt-library/universal-preamble.ts +10 -5
- 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 +3 -0
- package/src/self-dev/ask-launch-flow.ts +24 -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 +24 -9
- 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 +47 -0
- package/src/self-dev/shard-run.ts +112 -10
- 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/expose-gate.ts +2 -1
- package/src/self-implement/gate-artifacts.ts +405 -0
- package/src/self-implement/gate-cli.ts +201 -16
- package/src/self-implement/gate-remote.ts +110 -25
- 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 +61 -3
- package/src/self-implement/orchestrator.ts +14 -123
- 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 +155 -10
- 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/parallel-dispatch.ts +22 -5
- package/src/skills/tools/dev-harness.ts +6 -4
- package/src/skills/tools/shell.ts +1 -1
- package/src/steward/resync-tick.ts +114 -23
- package/src/steward/ta-repair-event-collect.ts +158 -0
- 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 +158 -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 +88 -28
- 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 +20 -6
- 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-result-marker-wait.ts +33 -0
- package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +63 -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-protocol.ts +153 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +208 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +132 -15
- package/src/telegram.ts +2 -4
- package/src/tui/input/pickers.ts +732 -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 +48 -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/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/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/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/{cIpv5nU9AycwYWZI9H589 → LSXfY0u9QtfDbejY0Ukf_}/_ssgManifest.js +0 -0
|
@@ -15,7 +15,7 @@ import { stateDirSourceForChild } from '../agent/identity-env.js';
|
|
|
15
15
|
import { lookupGoal, type GoalLookupOptions, type GoalLookupResult } from '../self-implement/goal-lookup.js';
|
|
16
16
|
import { archiveGoals, type GoalArchiveOptions } from '../self-implement/goal-archive.js';
|
|
17
17
|
import { detectBursts, formatIncidentBurstWarning, incidentLastLines, readRunExits, recentBurst, recordRunExit } from './harness-incidents.js';
|
|
18
|
-
import { Command, Option } from 'commander';
|
|
18
|
+
import { Command, InvalidArgumentError, Option } from 'commander';
|
|
19
19
|
import { runGitCommand } from '../git-fs/runner.js';
|
|
20
20
|
import { GOAL_TYPES, lintGoalFile, parseGoalId, parseGoalType, resolveGoalAuthorGrade, tracedPathReferences, type GoalAuthorGrade, type GoalAuthorGradeSelection, type GoalType } from '../self-implement/goal-author.js';
|
|
21
21
|
import { templateForGoalType } from '../self-implement/graph-templates.js';
|
|
@@ -132,6 +132,8 @@ export interface HarnessAskSayOptions {
|
|
|
132
132
|
/** Depth 0 only. At depth >= 1 this flag is ignored and the launch stays refused. */
|
|
133
133
|
nestedElanous?: 'allow';
|
|
134
134
|
queue?: boolean;
|
|
135
|
+
/** RUN-IDENTITY — 태스크 카드 신분이 대기열 줄 우선순위로 옮겨온 값(승인·선점이 신분을 읽는다 · 칸 러브릭보다 위). */
|
|
136
|
+
runPriority?: number;
|
|
135
137
|
}
|
|
136
138
|
|
|
137
139
|
export interface ResolvedHarnessSupervisor {
|
|
@@ -294,6 +296,11 @@ function registerHarnessAskSayOptions(command: Command): Command {
|
|
|
294
296
|
.option('--correlation <id>', '요청과 런을 잇는 불투명 correlation 값')
|
|
295
297
|
.addOption(new Option('--seat <seat>', '런 귀속 자리 (OP|TC|MK|UX)').choices(['OP', 'TC', 'MK', 'UX']))
|
|
296
298
|
.option('--no-queue', '비상시 자리별 대기열을 건너뛰고 직접 발사')
|
|
299
|
+
.option('--run-priority <n>', 'RUN-IDENTITY — 태스크 카드 신분이 대기열 줄 우선순위로 옮겨온 값(승인·선점이 신분을 읽는다 · 칸 러브릭보다 위)', (value: string) => {
|
|
300
|
+
const n = Number(value);
|
|
301
|
+
if (!Number.isFinite(n)) throw new InvalidArgumentError('유한한 숫자여야 한다');
|
|
302
|
+
return n;
|
|
303
|
+
})
|
|
297
304
|
.addOption(new Option('--goal-type <type>', `골 종류 (${GOAL_TYPES.join('|')})`).choices([...GOAL_TYPES]))
|
|
298
305
|
.option('--force-preflight', '전제 검사 막힘을 명시 요청으로 우회(관측에 남음)')
|
|
299
306
|
.option('--force-gate', '같은 골 실행 중 막힘을 명시 요청으로 우회(관측에 남음; 예산 막힘은 우회 불가)')
|
|
@@ -371,6 +378,7 @@ function normalizeHarnessAskSayOptions(opts: HarnessAskSayChildLlmOptions): Harn
|
|
|
371
378
|
...(opts.target !== undefined ? { target: opts.target } : {}),
|
|
372
379
|
...(opts.correlation !== undefined ? { correlation: opts.correlation } : {}),
|
|
373
380
|
...(opts.forcePreflight === true ? { forcePreflight: true } : {}),
|
|
381
|
+
...(opts.runPriority !== undefined ? { runPriority: opts.runPriority } : {}),
|
|
374
382
|
...(opts.childLlmProvider !== undefined ? { childLlmProvider: opts.childLlmProvider } : {}),
|
|
375
383
|
...(opts.childLlmModel !== undefined ? { childLlmModel: opts.childLlmModel } : {}),
|
|
376
384
|
// ⛔⭐⭐ 🩸 2026-09-12 — ***이 줄이 «없어서» `--child-llm-effort` 가 조용히 삼켜졌다.***
|
|
@@ -408,7 +416,7 @@ function resolveLaunchSubstrate(opts: HarnessSubstrateOpts): ResolvedHarnessSubs
|
|
|
408
416
|
return resolved;
|
|
409
417
|
}
|
|
410
418
|
type PodExit = { status: number | null; signal?: string | null };
|
|
411
|
-
type PodExitReason = 'signal' | 'human-stop' | 'supervisor' | 'no-launch' | 'unknown'
|
|
419
|
+
type PodExitReason = 'signal' | 'human-stop' | 'supervisor' | 'no-launch' | 'unknown' | 'preflight-refused'
|
|
412
420
|
| 'pod-error' | 'launch-gate-blocked' | 'ENOBUFS' | 'OOMKilled';
|
|
413
421
|
|
|
414
422
|
function unknownPodExitTailReason(output: string): PodExitReason | undefined {
|
|
@@ -442,6 +450,28 @@ export function classifyHarnessPodExit(
|
|
|
442
450
|
runId?: string;
|
|
443
451
|
} = {},
|
|
444
452
|
): { lines: string[]; reason: PodExitReason | 'pod-failure' } {
|
|
453
|
+
const occupiedNewLine = output.split('\n').find((line) =>
|
|
454
|
+
/^\[self-dev\] run run-[a-z0-9_-]{8,64} \[preflight:new-path-occupied:[0-9a-f-]{36}\] /.test(line));
|
|
455
|
+
const observedRunId = deps.runId ?? harnessPodRunId(output);
|
|
456
|
+
const preflightRunId = occupiedNewLine ? harnessPodRunId(occupiedNewLine) : undefined;
|
|
457
|
+
const preflightAttemptId = occupiedNewLine?.match(/\[preflight:new-path-occupied:([0-9a-f-]{36})\]/)?.[1];
|
|
458
|
+
const preflightPath = occupiedNewLine?.match(/신설 traced path 가 이미 점유됨: (.+) — 골의 신설: 경로를 바로잡아야 한다$/)?.[1];
|
|
459
|
+
let preflightReceipt = false;
|
|
460
|
+
if (exit.status === 2 && !exit.signal && occupiedNewLine && preflightRunId && preflightRunId === observedRunId && preflightPath && preflightAttemptId) {
|
|
461
|
+
try {
|
|
462
|
+
const entries = (deps.loadLedger ?? loadRunLedger)(preflightRunId) ?? [];
|
|
463
|
+
const receiptIndex = entries.findIndex((entry) => entry.runId === preflightRunId && entry.event === 'preflight-refused'
|
|
464
|
+
&& entry.data.kind === 'occupied-new-traced-path' && entry.data.path === preflightPath
|
|
465
|
+
&& entry.data.attemptId === preflightAttemptId);
|
|
466
|
+
preflightReceipt = receiptIndex >= 0 && !entries.slice(receiptIndex + 1).some((entry) => LAUNCH_EVIDENCE_EVENTS.has(entry.event));
|
|
467
|
+
} catch { /* Unreadable run evidence cannot establish a host refusal. */ }
|
|
468
|
+
}
|
|
469
|
+
if (preflightReceipt && occupiedNewLine) {
|
|
470
|
+
const runId = preflightRunId;
|
|
471
|
+
try { debug.log('harness.pod', 'exit-classified', { runId, reason: 'preflight-refused', status: exit.status, signal: exit.signal ?? null }); }
|
|
472
|
+
catch { /* observation is fail-soft */ }
|
|
473
|
+
return { reason: 'preflight-refused', lines: [occupiedNewLine] };
|
|
474
|
+
}
|
|
445
475
|
let podFailure: string | undefined;
|
|
446
476
|
let podJobFailed = false;
|
|
447
477
|
let podChildFailed = false;
|
|
@@ -470,7 +500,6 @@ export function classifyHarnessPodExit(
|
|
|
470
500
|
podChildFailed = summary?.includes(' — pod-child-failed: ') ?? false;
|
|
471
501
|
}
|
|
472
502
|
// Only the run announced at launch — another run id quoted in the output is not this run (review round 3).
|
|
473
|
-
const observedRunId = deps.runId ?? harnessPodRunId(output);
|
|
474
503
|
const runId = observedRunId ? normalizeRunId(observedRunId) : undefined;
|
|
475
504
|
if (podFailure) {
|
|
476
505
|
const childError = podJobFailed ? podFailure.split('childError=')[1]?.split('\\n', 1)[0]?.split('\n', 1)[0] : undefined;
|
|
@@ -726,6 +755,15 @@ export function recordHarnessPodStop(
|
|
|
726
755
|
try {
|
|
727
756
|
if (runStopRecorded(runId)) return false;
|
|
728
757
|
if ((deps.loadLedger ?? loadRunLedger)(runId)?.some((entry) => entry.event === RUN_STOP_EVENT)) return false;
|
|
758
|
+
if (classified.reason === 'preflight-refused') {
|
|
759
|
+
(deps.record ?? recordRunStop)({
|
|
760
|
+
runId, site: 'preflight', class: 'launch-failed',
|
|
761
|
+
cause: 'Preflight refused: occupied new traced path',
|
|
762
|
+
evidenceRef: `run-ledger:${runId}:preflight-refused`,
|
|
763
|
+
nextMove: 'Correct the declared new path in the goal before relaunch',
|
|
764
|
+
}, ...(deps.write ? [deps.write] : []));
|
|
765
|
+
return true;
|
|
766
|
+
}
|
|
729
767
|
const nextMove = classified.reason === 'no-launch' ? 'Check Pod launch gate and pool, then relaunch'
|
|
730
768
|
: 'Inspect Pod exit classification and harvest the branch before relaunch';
|
|
731
769
|
const evidenceRef = `logs:harness.pod/exit-classified:${runId}`;
|
|
@@ -943,6 +981,8 @@ async function dispatchHarnessAskSay(
|
|
|
943
981
|
['--child-llm-model', opts.childLlmModel], ['--child-llm-effort', opts.childLlmEffort],
|
|
944
982
|
['--pod-pool', (opts as HarnessSubstrateOpts).podPool], ['--pod-memory', (opts as HarnessSubstrateOpts).podMemory],
|
|
945
983
|
['--after', (opts as HarnessSubstrateOpts).after], ['--source', (opts as HarnessSubstrateOpts).source], ['--repair-commit-only', (opts as HarnessSubstrateOpts).repairCommitOnly],
|
|
984
|
+
// RUN-IDENTITY — 신분이 줄 우선순위로 흐른다(승인·선점이 읽는다 · 대기열 자식이 다시 상속).
|
|
985
|
+
['--run-priority', opts.runPriority !== undefined ? String(opts.runPriority) : undefined],
|
|
946
986
|
];
|
|
947
987
|
for (const [flag, value] of values) if (value !== undefined) flags.push(flag, value);
|
|
948
988
|
if ((opts as HarnessSubstrateOpts).source !== undefined && resolved.substrate !== 'pod') {
|
|
@@ -967,6 +1007,7 @@ async function dispatchHarnessAskSay(
|
|
|
967
1007
|
try {
|
|
968
1008
|
row = await addHarnessQueue({ seat: stampedSeat, launchCwd: process.cwd(), refuseDuplicate: true,
|
|
969
1009
|
...(dryRunPreview.goalPath ? { ask: dryRunPreview.goalPath } : { say: dryRunPreview.input }),
|
|
1010
|
+
...(opts.runPriority !== undefined ? { runPriority: opts.runPriority } : {}),
|
|
970
1011
|
launchArgs: ['harness', dryRunPreview.goalPath ? 'ask' : 'say', dryRunPreview.goalPath ?? dryRunPreview.input,
|
|
971
1012
|
'--seat', stampedSeat, ...((opts as HarnessSubstrateOpts).substrate ? ['--substrate', (opts as HarnessSubstrateOpts).substrate!] : []), ...flags,
|
|
972
1013
|
...(opts.nestedElanous ? ['--nested-elanous', opts.nestedElanous] : [])],
|
|
@@ -982,7 +1023,11 @@ async function dispatchHarnessAskSay(
|
|
|
982
1023
|
process.exitCode = 1;
|
|
983
1024
|
return;
|
|
984
1025
|
}
|
|
985
|
-
|
|
1026
|
+
// NEEDS-OWNER-BOUNDARY (direct say/ask): the immediate-launch tick stays ungated — a person-initiated
|
|
1027
|
+
// command answers itself, so pre-hold launch behavior is preserved. An embedder can still opt in via
|
|
1028
|
+
// deps.queue.needsOwnerGate.
|
|
1029
|
+
const result = await withJourneyNode('queue', journey, () => tickHarnessQueue(
|
|
1030
|
+
{ ...queueDeps, ...(immediateLaunch ? { launch: immediateLaunch } : {}), needsOwnerGate: queueDeps?.needsOwnerGate ?? false }, row.id));
|
|
986
1031
|
exitJourneyNode('queue', { ...journey, outcome: result.outcome === 'launched' && result.item?.id === row.id ? 'launched' : 'waiting', data: { queueItemId: row.id, queueTick: result.outcome } });
|
|
987
1032
|
if (result.outcome === 'launched' && result.item?.id === row.id) {
|
|
988
1033
|
if (immediateExit) process.exitCode = await immediateExit();
|
|
@@ -3336,7 +3381,9 @@ export function installHarnessCliCommand(program: Command, deps: HarnessCliComma
|
|
|
3336
3381
|
console.log(`${id} ${await reconcileHarnessQueue(id, queueDeps)}`);
|
|
3337
3382
|
}));
|
|
3338
3383
|
queue.command('tick').description('자리별 맨 앞 항목을 라운드로빈으로 돌며 자리 몫·Pod 풀 여유·마무리 관문을 확인하고 발사 — 여유가 있으면 한 tick 에 여러 건(30초 간격 · harness.queue.burstMax 기본 5)').action(() => queueAction(async () => {
|
|
3339
|
-
|
|
3384
|
+
// NEEDS-OWNER-BOUNDARY (queue tick = autonomous): the needs-owner hold defaults ON here — this is
|
|
3385
|
+
// the cron surface. The census runs once per tick and is shared across every candidate seat.
|
|
3386
|
+
const result = await tickHarnessQueue({ ...queueDeps, needsOwnerGate: queueDeps.needsOwnerGate ?? true });
|
|
3340
3387
|
console.log(`${result.outcome}${result.item ? ` ${result.item.id}` : ''}: ${result.reason}`);
|
|
3341
3388
|
// QUEUE-BURST: the first line stays as before; every further launch of the burst gets its own line.
|
|
3342
3389
|
for (const row of result.launched?.slice(1) ?? []) console.log(`launched ${row.id}: spawned`);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { SPAWN_SYNC_MAX_BUFFER } from '../util/spawn-sync-output.js';
|
|
2
3
|
import { mkdirSync, readFileSync, readdirSync, renameSync, writeFileSync } from 'node:fs';
|
|
3
4
|
import { isAbsolute, join, resolve } from 'node:path';
|
|
4
5
|
import { debug } from '../debug/log.js';
|
|
@@ -104,7 +105,7 @@ export function discoverHarnessGcRepos(root: string, expired: () => boolean = ()
|
|
|
104
105
|
}
|
|
105
106
|
|
|
106
107
|
function defaultRun(args: string[]) {
|
|
107
|
-
const result = spawnSync('git', args, { encoding: 'utf8', timeout: 20_000 });
|
|
108
|
+
const result = spawnSync('git', args, { encoding: 'utf8', timeout: 20_000, maxBuffer: SPAWN_SYNC_MAX_BUFFER });
|
|
108
109
|
return { status: result.status, stdout: result.stdout ?? '', stderr: result.stderr ?? '' };
|
|
109
110
|
}
|
|
110
111
|
|
|
@@ -26,6 +26,7 @@ export interface IncidentBurst {
|
|
|
26
26
|
runIds: string[];
|
|
27
27
|
entrance?: string;
|
|
28
28
|
seat?: string;
|
|
29
|
+
hostname?: string;
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
/** Scrub before bounding: a token crossing the 200-character boundary must not leak. */
|
|
@@ -111,33 +112,69 @@ export function recordRunExit(row: RunExit, root: string): void {
|
|
|
111
112
|
}
|
|
112
113
|
}
|
|
113
114
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const bursts: IncidentBurst[] = [];
|
|
119
|
-
const byIdentity = new Map<string, RunExit[]>();
|
|
115
|
+
const HOSTNAME_BURST_WINDOW_MS = 60 * 60_000;
|
|
116
|
+
|
|
117
|
+
function uniqueRunExits(rows: readonly RunExit[]): RunExit[] {
|
|
118
|
+
const unique: RunExit[] = [];
|
|
120
119
|
const seen = new Set<string>();
|
|
121
120
|
for (const row of rows) {
|
|
122
121
|
if (!row.runId || seen.has(row.runId) || !Number.isFinite(Date.parse(row.at))) continue;
|
|
123
122
|
seen.add(row.runId);
|
|
124
|
-
|
|
123
|
+
unique.push(row);
|
|
124
|
+
}
|
|
125
|
+
return unique;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function groupRunExits(rows: readonly RunExit[], keyOf: (row: RunExit) => string): RunExit[][] {
|
|
129
|
+
const byIdentity = new Map<string, RunExit[]>();
|
|
130
|
+
for (const row of rows) {
|
|
131
|
+
const key = keyOf(row);
|
|
125
132
|
const group = byIdentity.get(key) ?? [];
|
|
126
133
|
group.push(row);
|
|
127
134
|
byIdentity.set(key, group);
|
|
128
135
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
136
|
+
return [...byIdentity.values()];
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function burstMemberWindows(group: RunExit[], windowMs: number, threshold: number): RunExit[][] {
|
|
140
|
+
const sorted = group.slice().sort((a, b) => Date.parse(a.at) - Date.parse(b.at) || a.runId.localeCompare(b.runId));
|
|
141
|
+
const windows: RunExit[][] = [];
|
|
142
|
+
for (let start = 0; start < sorted.length;) {
|
|
143
|
+
let end = start + 1;
|
|
144
|
+
while (end < sorted.length && Date.parse(sorted[end]!.at) - Date.parse(sorted[start]!.at) <= windowMs) end++;
|
|
145
|
+
if (end - start < threshold) { start++; continue; }
|
|
146
|
+
windows.push(sorted.slice(start, end));
|
|
147
|
+
start = end;
|
|
148
|
+
}
|
|
149
|
+
return windows;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function burstFromMembers(members: RunExit[], extra: Pick<IncidentBurst, 'seat' | 'entrance' | 'hostname'>): IncidentBurst {
|
|
153
|
+
return {
|
|
154
|
+
reason: members[0]!.reason, count: members.length, firstAt: members[0]!.at,
|
|
155
|
+
lastAt: members[members.length - 1]!.at, runIds: members.map((row) => row.runId),
|
|
156
|
+
...(extra.seat ? { seat: extra.seat } : {}),
|
|
157
|
+
...(extra.entrance ? { entrance: extra.entrance } : {}),
|
|
158
|
+
...(extra.hostname ? { hostname: extra.hostname } : {}),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** Non-overlapping windows within each identity; seat and host are independent views of an exit. */
|
|
163
|
+
export function detectBursts(rows: readonly RunExit[], { windowMs = 60_000, threshold = 3 }: {
|
|
164
|
+
windowMs?: number; threshold?: number;
|
|
165
|
+
} = {}): IncidentBurst[] {
|
|
166
|
+
const unique = uniqueRunExits(rows);
|
|
167
|
+
const bursts: IncidentBurst[] = [];
|
|
168
|
+
for (const group of groupRunExits(unique, (row) => JSON.stringify([row.reason, row.seat ?? null, row.entrance ?? null]))) {
|
|
169
|
+
const { seat, entrance } = group[0]!;
|
|
170
|
+
for (const members of burstMemberWindows(group, windowMs, threshold)) {
|
|
171
|
+
bursts.push(burstFromMembers(members, { ...(seat ? { seat } : {}), ...(entrance ? { entrance } : {}) }));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
for (const group of groupRunExits(unique.filter((row) => row.hostname), (row) => JSON.stringify([row.reason, row.hostname]))) {
|
|
175
|
+
const hostname = group[0]!.hostname;
|
|
176
|
+
for (const members of burstMemberWindows(group, HOSTNAME_BURST_WINDOW_MS, 3)) {
|
|
177
|
+
bursts.push(burstFromMembers(members, { ...(hostname ? { hostname } : {}) }));
|
|
141
178
|
}
|
|
142
179
|
}
|
|
143
180
|
return bursts.sort((a, b) => Date.parse(a.firstAt) - Date.parse(b.firstAt) || a.reason.localeCompare(b.reason));
|
|
@@ -149,7 +186,7 @@ export function recentBurst(root: string, now: Date | number, { lookbackMs = 15
|
|
|
149
186
|
const time = typeof now === 'number' ? now : now.getTime();
|
|
150
187
|
const recent = detectBursts(readRunExits(root)).filter((burst) => {
|
|
151
188
|
const last = Date.parse(burst.lastAt);
|
|
152
|
-
return last <= time && last >= time - lookbackMs
|
|
189
|
+
return !burst.hostname && last <= time && last >= time - lookbackMs
|
|
153
190
|
&& burst.seat === seat && burst.entrance === entrance;
|
|
154
191
|
});
|
|
155
192
|
return recent.sort((a, b) => Date.parse(a.lastAt) - Date.parse(b.lastAt)).at(-1) ?? null;
|
|
@@ -13,17 +13,20 @@ import { mkdirSync, mkdtempSync, readFileSync, realpathSync, rmSync, writeFileSy
|
|
|
13
13
|
import { isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
14
14
|
import { selfDevRunsDir } from '../self-dev/run-store.js';
|
|
15
15
|
import { findGitDir } from '../git-fs/locate.js';
|
|
16
|
+
import { runGitCommand } from '../git-fs/runner.js';
|
|
16
17
|
import { logsDbPath } from '../mss/logging/log-store.js';
|
|
17
18
|
import { POD_REEMIT_LOGS_DB_ENV } from '../task-orchestrator/surfaces/pod-ledger-prod-sink.js';
|
|
18
19
|
import { debug } from '../debug/log.js';
|
|
19
20
|
import { ELANOUS_ENTRY_SCRIPT } from '../self-implement/seams.js';
|
|
20
21
|
import { parsePodSourceSpec } from '../task-orchestrator/surfaces/pod-source-spec.js';
|
|
21
|
-
import { declaredGoalType, type GoalType } from '../self-implement/goal-author.js';
|
|
22
|
+
import { declaredGoalType, extractVerbatimOriginalAsk, tracedPathReferences, type GoalType } from '../self-implement/goal-author.js';
|
|
23
|
+
import { declaredNewFilePaths } from '../self-implement/goal-new-paths.js';
|
|
22
24
|
import { appendRunLedgerEntry } from '../self-implement/run-ledger.js';
|
|
23
25
|
import { HARNESS_RUN_ID_ENV } from './harness-space.js';
|
|
24
26
|
import { podMemoryLimitFor, type PodMemoryTier } from '../task-orchestrator/surfaces/self-implement-pod.js';
|
|
25
27
|
import { oldDoorInternalEnv } from '../self-dev/old-door.js';
|
|
26
28
|
import { selectPodMemoryTier } from './pod-memory-policy.js';
|
|
29
|
+
import { preflightGoalDoneBoundary } from '../self-dev/dev-pipeline.js';
|
|
27
30
|
|
|
28
31
|
export interface HarnessPodDispatchInput {
|
|
29
32
|
readonly entrance: 'cli-harness-ask' | 'cli-harness-say';
|
|
@@ -73,7 +76,24 @@ export function podOrchestrateArgs(input: HarnessPodDispatchInput, goalFile: str
|
|
|
73
76
|
];
|
|
74
77
|
}
|
|
75
78
|
|
|
76
|
-
type PodDispatchDeps = { run?: (cmd: string, args: readonly string[], env: NodeJS.ProcessEnv) => number | null; readFile?: (path: string) => string; cwd?: string; spawnChild?: typeof spawn; onOutput?: (text: string) => void };
|
|
79
|
+
type PodDispatchDeps = { run?: (cmd: string, args: readonly string[], env: NodeJS.ProcessEnv) => number | null; readFile?: (path: string) => string; cwd?: string; spawnChild?: typeof spawn; onOutput?: (text: string) => void; recordRunLedgerEntry?: typeof appendRunLedgerEntry; nowMs?: number };
|
|
80
|
+
|
|
81
|
+
/** Default Pod source clones origin HEAD. Never infer its file occupation from an unrelated worktree. */
|
|
82
|
+
function defaultPodSourceHeadAt(root: string): string | undefined {
|
|
83
|
+
const localResult = runGitCommand(root, ['rev-parse', 'HEAD'], { encoding: 'utf8', timeout: 5_000 });
|
|
84
|
+
if (localResult.status !== 0 || localResult.signal) return undefined;
|
|
85
|
+
const local = localResult.stdout.trim();
|
|
86
|
+
const remoteResult = runGitCommand(root, ['ls-remote', 'origin', 'HEAD'], { encoding: 'utf8', timeout: 5_000 });
|
|
87
|
+
if (remoteResult.status !== 0 || remoteResult.signal) return undefined;
|
|
88
|
+
const remote = remoteResult.stdout.trim().split(/\s+/, 1)[0];
|
|
89
|
+
return /^[0-9a-f]{40}$/.test(remote ?? '') && remote === local ? local : undefined;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function occupiedInTree(root: string, head: string, path: string): boolean | undefined {
|
|
93
|
+
const result = runGitCommand(root, ['ls-tree', head, '--', path], { encoding: 'utf8', timeout: 5_000 });
|
|
94
|
+
if (result.status !== 0 || result.signal) return undefined;
|
|
95
|
+
return result.stdout.trim() !== '';
|
|
96
|
+
}
|
|
77
97
|
|
|
78
98
|
export function dispatchHarnessOnPod(input: HarnessPodDispatchInput, deps: PodDispatchDeps & { run: NonNullable<PodDispatchDeps['run']> }): number;
|
|
79
99
|
export function dispatchHarnessOnPod(input: HarnessPodDispatchInput, deps?: PodDispatchDeps): number | Promise<number>;
|
|
@@ -111,13 +131,6 @@ export function dispatchHarnessOnPod(input: HarnessPodDispatchInput, deps: PodDi
|
|
|
111
131
|
tempDir = mkdtempSync(join(runsDir, 'pod-author-'));
|
|
112
132
|
goalFile = join(tempDir, 'sentence.txt');
|
|
113
133
|
writeFileSync(goalFile, input.input, { mode: 0o600 });
|
|
114
|
-
const runId = env[HARNESS_RUN_ID_ENV]?.trim() || `run-${randomUUID()}`;
|
|
115
|
-
env[HARNESS_RUN_ID_ENV] = runId;
|
|
116
|
-
const receipt = { entrance: input.entrance, host: hostname(), runId, authorOnPod: true,
|
|
117
|
-
sentenceChars: input.input.length, sentenceSha256: createHash('sha256').update(input.input).digest('hex') };
|
|
118
|
-
debug.log('harness.substrate', 'author-on-pod-receipt', receipt);
|
|
119
|
-
try { appendRunLedgerEntry({ runId, event: 'author-on-pod-receipt', data: receipt }); }
|
|
120
|
-
catch (error) { debug.log('harness.substrate', 'author-on-pod-receipt-unwritten', { reason: error instanceof Error ? error.message : String(error) }); }
|
|
121
134
|
} else {
|
|
122
135
|
const goal = input.input;
|
|
123
136
|
goalText = goal;
|
|
@@ -127,8 +140,72 @@ export function dispatchHarnessOnPod(input: HarnessPodDispatchInput, deps: PodDi
|
|
|
127
140
|
goalFile = join(tempDir, 'goal.txt');
|
|
128
141
|
writeFileSync(goalFile, goal, { mode: 0o600 });
|
|
129
142
|
}
|
|
143
|
+
let pinnedDefaultSource: string | undefined;
|
|
144
|
+
// AUTHOR-NEW-FILE-PATHS: when the Pod will use this very repository tree, reject a
|
|
145
|
+
// deterministically occupied new path before creating a Job. A different --source or
|
|
146
|
+
// --base can have different files; the Pod remains responsible for those cases.
|
|
147
|
+
if (!input.source && !input.base && input.entrance === 'cli-harness-ask') {
|
|
148
|
+
const declaration = extractVerbatimOriginalAsk(goalText)?.ask ?? '';
|
|
149
|
+
const newPaths = declaredNewFilePaths(declaration);
|
|
150
|
+
const traced = new Set(tracedPathReferences(goalText).map(({ path }) => path.replace(/^\.\//, '')));
|
|
151
|
+
const candidates = newPaths.filter((path) => traced.has(path));
|
|
152
|
+
const repositoryRoot = candidates.length > 0 ? findGitDir(cwd)?.root : undefined;
|
|
153
|
+
const defaultSourceHead = repositoryRoot ? defaultPodSourceHeadAt(repositoryRoot) : undefined;
|
|
154
|
+
if (candidates.length > 0 && !defaultSourceHead) {
|
|
155
|
+
debug.log('harness.substrate', 'new-path-preflight-unmeasured', {
|
|
156
|
+
entrance: input.entrance, reason: 'default-source-head-unverified', candidateCount: candidates.length,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
// The preflight checks this exact tree, so pin the Pod job to the same commit.
|
|
160
|
+
// Otherwise origin/HEAD could move between this check and the Job's clone.
|
|
161
|
+
if (candidates.length > 0 && defaultSourceHead) pinnedDefaultSource = `commit:${defaultSourceHead}`;
|
|
162
|
+
for (const path of candidates) {
|
|
163
|
+
if (!repositoryRoot || !defaultSourceHead) break; // Unmeasured source parity is never a refusal.
|
|
164
|
+
const occupied = occupiedInTree(repositoryRoot, defaultSourceHead, path);
|
|
165
|
+
if (occupied === undefined) {
|
|
166
|
+
debug.log('harness.substrate', 'new-path-preflight-unmeasured', {
|
|
167
|
+
entrance: input.entrance, reason: 'default-source-tree-query-failed', candidate: path,
|
|
168
|
+
});
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (!occupied) continue;
|
|
172
|
+
const runId = env[HARNESS_RUN_ID_ENV]?.trim() || `run-${randomUUID()}`;
|
|
173
|
+
const attemptId = randomUUID();
|
|
174
|
+
const line = `[self-dev] run ${runId} [preflight:new-path-occupied:${attemptId}] 신설 traced path 가 이미 점유됨: ${path} — 골의 신설: 경로를 바로잡아야 한다\n`;
|
|
175
|
+
try {
|
|
176
|
+
(deps.recordRunLedgerEntry ?? appendRunLedgerEntry)({ runId, event: 'preflight-refused', data: { kind: 'occupied-new-traced-path', path, entrance: input.entrance, sourceHead: defaultSourceHead, attemptId } });
|
|
177
|
+
} catch (error) {
|
|
178
|
+
debug.log('harness.substrate', 'preflight-receipt-unwritten', { reason: String(error) });
|
|
179
|
+
break; // Without the host receipt, let Pod-side validation decide instead of claiming a host refusal.
|
|
180
|
+
}
|
|
181
|
+
deps.onOutput?.(line);
|
|
182
|
+
if (!deps.onOutput) process.stderr.write(line);
|
|
183
|
+
if (tempDir) rmSync(tempDir, { recursive: true, force: true });
|
|
184
|
+
return 2;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (input.authorOnPod && input.entrance === 'cli-harness-say') {
|
|
188
|
+
const runId = env[HARNESS_RUN_ID_ENV]?.trim() || `run-${randomUUID()}`;
|
|
189
|
+
env[HARNESS_RUN_ID_ENV] = runId;
|
|
190
|
+
const receipt = { entrance: input.entrance, host: hostname(), runId, authorOnPod: true,
|
|
191
|
+
sentenceChars: input.input.length, sentenceSha256: createHash('sha256').update(input.input).digest('hex') };
|
|
192
|
+
debug.log('harness.substrate', 'author-on-pod-receipt', receipt);
|
|
193
|
+
try { (deps.recordRunLedgerEntry ?? appendRunLedgerEntry)({ runId, event: 'author-on-pod-receipt', data: receipt }); }
|
|
194
|
+
catch (error) { debug.log('harness.substrate', 'author-on-pod-receipt-unwritten', { reason: error instanceof Error ? error.message : String(error) }); }
|
|
195
|
+
}
|
|
196
|
+
// This is the common host-side Pod launch boundary for harness ask/say and
|
|
197
|
+
// dev ask. A say sentence is the source request; an ask file is the GOAL.
|
|
198
|
+
// Check before the orchestrator child can place or create a Pod Job.
|
|
199
|
+
try {
|
|
200
|
+
preflightGoalDoneBoundary({ file: goalFile }, goalText, env.ELANOUS_TASK_CARD_ID, input.entrance,
|
|
201
|
+
input.entrance === 'cli-harness-say' ? 'request' : 'goal', deps.nowMs ?? Date.now());
|
|
202
|
+
} catch (error) {
|
|
203
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
204
|
+
if (tempDir) rmSync(tempDir, { recursive: true, force: true });
|
|
205
|
+
return 2;
|
|
206
|
+
}
|
|
130
207
|
const goalChars = goalText.length;
|
|
131
|
-
const args = podOrchestrateArgs(input, goalFile);
|
|
208
|
+
const args = podOrchestrateArgs(pinnedDefaultSource ? { ...input, source: pinnedDefaultSource } : input, goalFile);
|
|
132
209
|
debug.log('harness.substrate', 'goal-file', { entrance: input.entrance, mode: tempDir ? 'temp' : 'path' });
|
|
133
210
|
const goalType = input.goalType ?? declaredGoalType(goalText);
|
|
134
211
|
// A process-level memory tier is already an explicit selection; do not replace it with a goal-type default.
|
|
@@ -23,6 +23,7 @@ import { parsePodPool, podPoolHostLease, resolvePodPoolSpec } from '../task-orch
|
|
|
23
23
|
import { writeHarnessQueueReceipt } from './harness-queue-child.js';
|
|
24
24
|
import { adviseLaunch, compareLaunchAdvice, type LaunchAdvice } from './launch-advice.js';
|
|
25
25
|
import { finishAdvice, measureFinish, recordFinishHistory, type FinishMetrics } from '../loops/orchestrator/finish-rate.js';
|
|
26
|
+
import { collectDraftMetrics, DRAFT_NEEDS_OWNER_SEAT_CAP, shouldHoldSeatNewLaunch, type DraftMetrics } from '../self-dev/draft-sweep.js';
|
|
26
27
|
|
|
27
28
|
export type QueueSeat = 'OP' | 'TC' | 'MK' | 'UX';
|
|
28
29
|
export type QueueItem = {
|
|
@@ -74,6 +75,13 @@ export interface HarnessQueueDeps {
|
|
|
74
75
|
root?: string;
|
|
75
76
|
configPath?: string;
|
|
76
77
|
cap?: (seat: QueueSeat) => number;
|
|
78
|
+
/** Fresh GitHub draft inventory for the dispatch boundary; tests inject an isolated source. */
|
|
79
|
+
draftMetrics?: (now: Date) => Promise<DraftMetrics>;
|
|
80
|
+
/** Explicit needs-owner hold gate — the hold is an autonomous-launch guard. Cron `harness queue tick`
|
|
81
|
+
* and the seat-loop launch/wake sites pass true; the direct `harness say`/`ask` immediate-launch tick
|
|
82
|
+
* passes false (a person-initiated command answers itself, pre-hold launch behavior preserved).
|
|
83
|
+
* Tests assert this option instead of inferring the boundary from which seams are injected. */
|
|
84
|
+
needsOwnerGate?: boolean;
|
|
77
85
|
pool?: () => QueuePool;
|
|
78
86
|
/** Shadow-only advice seam; exceptions must not affect the queue decision. */
|
|
79
87
|
advice?: typeof adviseLaunch;
|
|
@@ -322,8 +330,8 @@ function defaultQueuePriority(cellId: string | undefined, root: string, deps: Ha
|
|
|
322
330
|
}
|
|
323
331
|
}
|
|
324
332
|
|
|
325
|
-
/** Seat head order: priority descending (none = lowest), then arrival ascending, then file order. */
|
|
326
|
-
function queueHeadBefore(a: QueueItem, b: QueueItem): boolean {
|
|
333
|
+
/** Seat head order: priority descending (none = lowest), then arrival ascending, then file order. RUN-IDENTITY — 신분에서 온 `runPriority` 가 여기서 승인·선점 순서를 정한다. */
|
|
334
|
+
export function queueHeadBefore(a: QueueItem, b: QueueItem): boolean {
|
|
327
335
|
const pa = a.priority ?? -Infinity, pb = b.priority ?? -Infinity;
|
|
328
336
|
if (pa !== pb) return pa > pb;
|
|
329
337
|
const ta = Date.parse(a.at), tb = Date.parse(b.at);
|
|
@@ -336,7 +344,7 @@ export class HarnessQueueDuplicateError extends Error {
|
|
|
336
344
|
}
|
|
337
345
|
}
|
|
338
346
|
|
|
339
|
-
export async function addHarnessQueue(input: { seat: string; say?: string; ask?: string; hold?: boolean; heavy?: boolean; idempotencyKey?: string; launchArgs?: string[]; poolHint?: string; poolHintSource?: 'grid'; launchCwd?: string; refuseDuplicate?: boolean }, deps: HarnessQueueDeps = {}): Promise<QueueItem> {
|
|
347
|
+
export async function addHarnessQueue(input: { seat: string; say?: string; ask?: string; hold?: boolean; heavy?: boolean; idempotencyKey?: string; launchArgs?: string[]; poolHint?: string; poolHintSource?: 'grid'; launchCwd?: string; refuseDuplicate?: boolean; runPriority?: number }, deps: HarnessQueueDeps = {}): Promise<QueueItem> {
|
|
340
348
|
const assigned = seat(input.seat);
|
|
341
349
|
if ((input.say === undefined) === (input.ask === undefined)) throw new Error('harness queue add: --say 또는 --ask 중 하나만 필요');
|
|
342
350
|
const kind = input.ask === undefined ? 'say' : 'ask';
|
|
@@ -370,7 +378,8 @@ export async function addHarnessQueue(input: { seat: string; say?: string; ask?:
|
|
|
370
378
|
throw new HarnessQueueDuplicateError(existing, key);
|
|
371
379
|
}
|
|
372
380
|
}
|
|
373
|
-
|
|
381
|
+
// RUN-IDENTITY — 신분에서 온 줄 우선순위가 칸 러브릭보다 위다(승인·선점이 신분을 읽는다 · GATE-PRIORITY 흡수).
|
|
382
|
+
const priority = input.runPriority ?? defaultQueuePriority(cellId, root, deps);
|
|
374
383
|
const item: QueueItem = { id: `hq-${randomUUID()}`, seat: assigned, kind, input: value,
|
|
375
384
|
hold: input.hold === true, heavy: input.heavy === true, at: new Date().toISOString(), status: 'queued',
|
|
376
385
|
...(input.launchArgs === undefined ? {} : { launchArgs: input.launchArgs }),
|
|
@@ -1486,6 +1495,23 @@ async function tickHarnessQueueOnce(deps: HarnessQueueDeps, requestedId: string
|
|
|
1486
1495
|
}
|
|
1487
1496
|
return waiting();
|
|
1488
1497
|
}
|
|
1498
|
+
// NEEDS-OWNER-CENSUS: one draft census per tick, shared by every candidate. A full census pages all
|
|
1499
|
+
// open drafts, the 48h closed cohort, and one claim-comment gh call per open draft — re-running it
|
|
1500
|
+
// per candidate multiplied those calls by the seat count and raced the rate limit the seat-loop tick
|
|
1501
|
+
// also spends. The memo lives in this tick only; the next tick re-collects.
|
|
1502
|
+
const needsOwnerGate = deps.needsOwnerGate ?? false;
|
|
1503
|
+
let draftCensus: Promise<DraftMetrics> | undefined;
|
|
1504
|
+
const censusOnce = (): Promise<DraftMetrics> => {
|
|
1505
|
+
draftCensus ??= (deps.draftMetrics
|
|
1506
|
+
? deps.draftMetrics((deps.now ?? (() => new Date()))())
|
|
1507
|
+
: (async () => {
|
|
1508
|
+
const [{ resolveRepositoryName }, { githubDraftSweepAdapters }] = await Promise.all([
|
|
1509
|
+
import('./repository-name.js'), import('./harness-cli-command.js'),
|
|
1510
|
+
]);
|
|
1511
|
+
return collectDraftMetrics(resolveRepositoryName({}), githubDraftSweepAdapters(), (deps.now ?? (() => new Date()))());
|
|
1512
|
+
})());
|
|
1513
|
+
return draftCensus;
|
|
1514
|
+
};
|
|
1489
1515
|
for (const item of candidates) {
|
|
1490
1516
|
const injectedCap = deps.cap?.(item.seat);
|
|
1491
1517
|
const details = seatCapDetails({ seat: item.seat, caps, gate, injectedCap });
|
|
@@ -1545,6 +1571,29 @@ async function tickHarnessQueueOnce(deps: HarnessQueueDeps, requestedId: string
|
|
|
1545
1571
|
catch { /* Observation cannot affect dispatch. */ }
|
|
1546
1572
|
return { outcome: 'waiting', item: { ...item, waitingReason: lateHold.reason }, reason: lateHold.reason };
|
|
1547
1573
|
}
|
|
1574
|
+
// A queued request can outlive the seat's earlier census: check again at the actual launcher boundary.
|
|
1575
|
+
// NEEDS-OWNER-BOUNDARY: the hold is an autonomous-launch guard — cron `harness queue tick` (and any
|
|
1576
|
+
// embedder) opts in via deps.needsOwnerGate; the direct `harness say`/`ask` immediate-launch tick does
|
|
1577
|
+
// not, because a person-initiated command answers itself. The census itself is shared: one call per
|
|
1578
|
+
// tick (censusOnce), never one per candidate.
|
|
1579
|
+
if (needsOwnerGate) {
|
|
1580
|
+
let metrics: DraftMetrics | undefined;
|
|
1581
|
+
try {
|
|
1582
|
+
metrics = await censusOnce();
|
|
1583
|
+
if (!metrics.needsOwnerBySeat) throw new Error('per-seat draft inventory missing');
|
|
1584
|
+
} catch (error) {
|
|
1585
|
+
// NEEDS-OWNER-POLICY: an unreadable census — gh unavailable, rate-limited, or one unreadable
|
|
1586
|
+
// claim comment — is unobserved, not failed-closed. Unobserved input never holds any seat's
|
|
1587
|
+
// launch; only an observed count over the cap does. The next tick re-collects.
|
|
1588
|
+
try {
|
|
1589
|
+
debug.log('loop.orchestrator', 'needs-owner-unobserved', { seat: item.seat, reason: String(error).slice(0, 140) });
|
|
1590
|
+
} catch { /* observation must not affect the dispatch decision */ }
|
|
1591
|
+
}
|
|
1592
|
+
if (metrics && shouldHoldSeatNewLaunch(item.seat, metrics.needsOwnerBySeat ?? {})) {
|
|
1593
|
+
blocked.set(item.seat, { reason: `needs-owner ${item.seat}: ${metrics.needsOwnerBySeat?.[item.seat]} > ${DRAFT_NEEDS_OWNER_SEAT_CAP}`, active });
|
|
1594
|
+
continue;
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1548
1597
|
// QUEUE-BURST: scheduled launches stay `launchStaggerMs` after the last queue launch — any tick or process, a direct
|
|
1549
1598
|
// launch included — so an overlapping cron tick cannot double a burst. A requested (direct say/ask) tick keeps its
|
|
1550
1599
|
// launch-at-once contract (ONEDOOR-2) and only records its time for the next scheduled tick.
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
import { existsSync, readdirSync, readFileSync, readlinkSync } from 'node:fs';
|
|
15
15
|
import { isAbsolute, join, resolve } from 'node:path';
|
|
16
16
|
import { spawnSync } from 'node:child_process';
|
|
17
|
+
import { SPAWN_SYNC_MAX_BUFFER } from '../util/spawn-sync-output.js';
|
|
17
18
|
import { debug } from '../debug/log.js';
|
|
18
19
|
import { selfDevRunsDir } from '../self-dev/run-store.js';
|
|
19
20
|
import { launchBindingRunIds, launchRegistryDir, readLaunchBinding } from './launch-registry.js';
|
|
@@ -124,7 +125,7 @@ export function discoverStopProcesses(runId: string, goalPath: string | null, ta
|
|
|
124
125
|
function stopProcessCwd(pid: number): string | null {
|
|
125
126
|
try {
|
|
126
127
|
if (process.platform === 'linux') return readlinkSync(`/proc/${pid}/cwd`);
|
|
127
|
-
const r = spawnSync('lsof', ['-a', '-p', String(pid), '-d', 'cwd', '-Fn'], { encoding: 'utf8', timeout: 5_000 });
|
|
128
|
+
const r = spawnSync('lsof', ['-a', '-p', String(pid), '-d', 'cwd', '-Fn'], { encoding: 'utf8', timeout: 5_000, maxBuffer: SPAWN_SYNC_MAX_BUFFER });
|
|
128
129
|
if (r.error || r.status !== 0 || typeof r.stdout !== 'string') return null;
|
|
129
130
|
return r.stdout.split(/\r?\n/).find((line) => line.startsWith('n/'))?.slice(1) ?? null;
|
|
130
131
|
} catch { return null; }
|
|
@@ -206,7 +207,7 @@ export function pidRecordFromLaunchBinding(runId: string, registryDir = launchRe
|
|
|
206
207
|
/** macOS·Linux 공통 — UTC 시작 시각과 상태를 같은 ps 관측에서 읽는다. */
|
|
207
208
|
export function psProcessStartMs(pid: number): number | null {
|
|
208
209
|
const r = spawnSync('ps', ['-o', 'lstart=,stat=', '-p', String(pid)], {
|
|
209
|
-
encoding: 'utf8', timeout: 5_000, env: { ...process.env, TZ: 'UTC' },
|
|
210
|
+
encoding: 'utf8', timeout: 5_000, env: { ...process.env, TZ: 'UTC' }, maxBuffer: SPAWN_SYNC_MAX_BUFFER,
|
|
210
211
|
});
|
|
211
212
|
if (r.status !== 0) return null;
|
|
212
213
|
const match = /^\s*((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s+\w+\s+\d+\s+\d\d:\d\d:\d\d\s+\d{4})\s+(\S+)\s*$/.exec(r.stdout);
|
|
@@ -220,7 +221,7 @@ export function defaultHarnessStopDeps(overrides: Partial<HarnessStopDeps> = {},
|
|
|
220
221
|
const env = { ...process.env };
|
|
221
222
|
for (const key of ['HTTPS_PROXY', 'https_proxy', 'HTTP_PROXY', 'http_proxy', 'ALL_PROXY', 'all_proxy']) delete env[key];
|
|
222
223
|
const kubectl = (args: readonly string[]) => {
|
|
223
|
-
const r = spawnSync('kubectl', [...args], { encoding: 'utf8', timeout: 15_000, env });
|
|
224
|
+
const r = spawnSync('kubectl', [...args], { encoding: 'utf8', timeout: 15_000, env, maxBuffer: SPAWN_SYNC_MAX_BUFFER });
|
|
224
225
|
return { status: r.status, stdout: r.stdout ?? '', stderr: r.stderr ?? String(r.error ?? '') };
|
|
225
226
|
};
|
|
226
227
|
return {
|