elanous 0.2.28 → 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/{y1ltt7oCZxVpC6zVPhZ2O → LSXfY0u9QtfDbejY0Ukf_}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{ab4d57c2.e90bc2cb31949045.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/{5492-e05e26a033ba80d2.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/1654.32de4b324981a188.js +23 -0
- 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/1913.7cc6fb6055b1ed3f.js +41 -0
- package/apps/pwa/out/_next/static/chunks/2001.6c7e0fd02190886c.js +1 -0
- 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/{8578.dff22d988cc2b106.js → 2213.2ccbada92c33ea0f.js} +3 -3
- 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/{5081.a240b63fad28663a.js → 2871.0bca6137343b3f76.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2898.fd781bc7cf01a7b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2940-619bfd8ef337c611.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2846.d6a433b8663819a5.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/{f4dfbfc0.a69fb12f854882aa.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/3541-ce3a5424ed5ad7f1.js +1 -0
- 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/{3143.257997a5f1ed79df.js → 3902.e1e71aaac850a045.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{16e57f67.3ea19e893461e611.js → 409f1e57.d0649fc47691ebfe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1146.80d15ea7c6e6ee95.js → 4111.2bfedbb233ad206b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1516.83dd2c1b86b4e507.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/{9938.b23e4d4dfa0114cd.js → 4999.c064a4000c2a9e94.js} +2 -2
- 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/{1157.f08bf2b70915e176.js → 5304.04d24756f242a094.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{7752.5cbdd0b433c54af9.js → 5307.60f2209e809bd627.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9917-9e26abc5f7772735.js → 5458-16cd7a2b51b74c8c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6196.34d6b229079e9e28.js → 5525.86debf231e181813.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4593.10f5b9bd702d4a6c.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/{7483.ba01c6c209b81bba.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/{9974.e77b4ff4884557b3.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/{3309.364573ceedbdfd5f.js → 6323.8672b4817a306928.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{94.4cfed21c0b781a06.js → 6433.fc573af22bbc9ab7.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{949.1e7d45ccb71580aa.js → 6517.4147878ac06d584d.js} +2 -2
- 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/{2528.3868070ef1be69f9.js → 6767.ea607cf0c20a25af.js} +2 -2
- 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/{1743.563d3168e95825ef.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/{5408.377c8c543635b81f.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/{65ebff95.081daeff622d238e.js → 7a1887c4.f36b88fba31da8fd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2697.76ca2ac3efef6f3b.js → 8018.a32663f04a6fc5f9.js} +1 -1
- 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/9138.b6e80031afb1d973.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4204.a409ab6250c0f6a8.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/{5785-ea8d2c633b6688e3.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/9398-6aed28f0a96d0d6f.js +1 -0
- 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/997ce8a5-2ad501927003b41b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9311.24c8f5ea793253dd.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-fa46d4588e8442c2.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-ced0bcfc6542b3fc.js → page-349f2752d8cd37ad.js} +1 -1
- 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-cb249e81ed339318.js → page-0a07363b130182a1.js} +1 -1
- 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-521ee23ac8c0abfa.js +1 -0
- 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-149dc1caba411bb9.js +1 -0
- 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/{6def8a8e.c81f9ca41028eccf.js → b313b242.cb1265eea908db61.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{e87d89b9.2e71c0ae475d28a1.js → e5012ffe.f727e23c231f4342.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{e117f801.e92bf10242653497.js → ebc7d829.264a0bcb6c750b50.js} +1 -1
- 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 +15 -7
- package/graphs/units/recipes.yaml +3 -0
- package/graphs/units/release-gate-recheck.yaml +15 -0
- package/package.json +2 -1
- package/plugins/agent-team/agents/research.md +1 -0
- package/scripts/check-native-tool-wiring.ts +3 -2
- package/scripts/ci-android-unit-tests.ts +16 -0
- package/scripts/ci-typecheck-changed.ts +40 -11
- package/scripts/coord-channel-watch.sh +45 -19
- package/scripts/coord-role-pack.ts +222 -0
- 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/lib/morning-report-options.ts +41 -0
- package/scripts/measure-goal-grounding-corpus.ts +2 -1
- package/scripts/pr-land-extra-remote-gates.ts +49 -0
- 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-batch-safe.ts +23 -0
- package/scripts/release-loop/gate-closure.ts +12 -8
- package/scripts/release-loop/gate-diff.ts +1 -1
- package/scripts/release-loop/gate-history.ts +422 -0
- package/scripts/release-loop/gate-host-mirror.ts +66 -0
- package/scripts/release-loop/gate-node.ts +806 -94
- 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-triage-node.ts +190 -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 +51 -0
- package/scripts/release-loop/tui-node-checks.ts +23 -0
- package/scripts/release-loop/tui-sim-node.ts +3 -2
- package/scripts/release-loop/unattended-release.ts +16 -0
- package/scripts/release-loop/version-node.ts +62 -4
- package/scripts/test-deterministic.ts +46 -73
- 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/scripts/usage-rollup.ts +11 -3
- package/src/acp/client.ts +4 -1
- package/src/acp/core-turn-bridge.ts +145 -24
- package/src/acp/elanous-extensions.ts +2 -0
- package/src/acp/server.ts +2 -0
- package/src/ad-pipeline/run.ts +4 -2
- package/src/agent/ref-grounding.ts +18 -0
- 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 +41 -21
- 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/budget/pty-usage-reemit.ts +7 -0
- package/src/budget/run-usage-rollup.ts +9 -0
- package/src/budget/usage-daily-store.ts +98 -0
- package/src/capture/tui-self-report.ts +37 -4
- package/src/chat/chat-cli.ts +10 -2
- package/src/chat/index.ts +107 -20
- package/src/chat/input-control-key.ts +5 -3
- package/src/chat/pickers/modal-runtime.ts +1 -0
- package/src/chat/pickers/modals.ts +3 -1
- package/src/chat/tool-interrupt-behavior.ts +38 -0
- package/src/chat/tool-render/dispatch.ts +5 -1
- package/src/chat/turn-typeahead.ts +191 -29
- 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/dashboard-name-flag.ts +48 -0
- package/src/cli/decisions-cli.ts +80 -6
- package/src/cli/doctor-cli.ts +80 -0
- package/src/cli/log-event-names.ts +19 -0
- package/src/cli/mcp-login.ts +21 -5
- package/src/cli/msg-cli.ts +133 -2
- package/src/cli/pr-cli.ts +546 -112
- package/src/cli/pr-land-heavy-remote.ts +233 -0
- package/src/cli/pr-land-overlap-evidence.ts +167 -14
- 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/pty-takeover-cli.ts +125 -16
- package/src/cli/release-cli.ts +122 -14
- package/src/cli/remote-resolve.ts +2 -1
- package/src/cli/seat-cli.ts +164 -19
- package/src/cli/self-update.ts +5 -2
- package/src/cli/tasks-cli.ts +105 -21
- package/src/cli/usage-cli.ts +146 -12
- package/src/cli/usage-daily-cli.ts +84 -0
- package/src/context-bus/context-first.ts +13 -0
- package/src/context-bus/context-now.ts +95 -7
- 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/auth-rejected-notice.ts +41 -0
- package/src/core-turn/run-core-turn.ts +14 -2
- package/src/core-turn/run-goal-loop.ts +239 -4
- package/src/core-turn/seat-turn-cap.ts +79 -0
- package/src/core-turn/short-question.ts +78 -13
- package/src/core-turn/types.ts +10 -0
- package/src/dashboard/acp-active-model.ts +40 -0
- package/src/dashboard/acp-boot.ts +3 -0
- package/src/dashboard/auto-compact-runtime.ts +2 -0
- package/src/dashboard/boot-banner.ts +80 -0
- package/src/dashboard/dashboard-status-lines.ts +11 -0
- package/src/dashboard/detail-viewer-runtime.ts +15 -2
- package/src/dashboard/event-loop-stall-monitor.ts +4 -0
- package/src/dashboard/goal-loop-thinking.ts +16 -0
- package/src/dashboard/hitl-boot.ts +9 -4
- package/src/dashboard/index.ts +448 -998
- package/src/dashboard/input/chat-main-entry-runtime.ts +2 -0
- package/src/dashboard/input/chat-main-log-actions.ts +4 -0
- package/src/dashboard/input/chat-main-log-command.ts +12 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +176 -4
- package/src/dashboard/input/chat-main-session.ts +14 -3
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/chat-main-turn.ts +14 -4
- package/src/dashboard/input/compact-prepass-recovery.ts +130 -0
- package/src/dashboard/input/dashboard-chord-actions.ts +10 -1
- package/src/dashboard/input/dashboard-chord-runtime.ts +2 -0
- package/src/dashboard/input/external-input-host.ts +71 -0
- package/src/dashboard/input/internal-turn.ts +261 -0
- package/src/dashboard/input/log-fold-binding.ts +18 -0
- package/src/dashboard/input/mouse-wiring.ts +17 -4
- package/src/dashboard/input/seat-autowake.ts +318 -0
- package/src/dashboard/input/turn-steer-bridge.ts +164 -0
- package/src/dashboard/log-click-runtime.ts +5 -3
- package/src/dashboard/loop-scheduler.ts +72 -0
- package/src/dashboard/running-build-status.ts +74 -0
- package/src/dashboard/seat-boot-preamble.ts +131 -0
- package/src/dashboard/seat-local-instructions.ts +305 -0
- package/src/dashboard/skill-runtime.ts +2 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +220 -1203
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -1
- package/src/dashboard/slash-runtime/index.ts +13 -0
- package/src/dashboard/slash-runtime/model-choices.ts +35 -0
- package/src/dashboard/term-slash-runtime.ts +15 -0
- package/src/dashboard/turn-busy-teardown.ts +50 -0
- package/src/dashboard/turn-preamble.ts +30 -2
- package/src/dashboard/turn-session-layers.ts +176 -0
- package/src/dashboard/turn-stream-formatter.ts +14 -6
- package/src/dashboard/turn-stream-presentation-applier.ts +8 -0
- package/src/decisions/decision-ledger.ts +45 -4
- package/src/discord-self-message.ts +4 -4
- package/src/domains/release-tool.ts +26 -10
- package/src/domains/surface-events.ts +4 -1
- package/src/domains/watch-default-scheduler.ts +8 -9
- package/src/field-note/transcribe.ts +17 -0
- package/src/fold-stack.ts +24 -1
- package/src/git-fs/dirty.ts +32 -4
- package/src/git-fs/index.ts +43 -1
- 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 +2 -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 +34 -6
- 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 +166 -26
- package/src/input/external-input-queue.ts +251 -0
- package/src/intake-plane/slash.ts +14 -3
- package/src/interactive-terminal-modal.ts +13 -0
- package/src/keybindings.ts +4 -1
- package/src/llm/route-decision.ts +25 -0
- package/src/llm/tool-loop-steered-rejection.ts +33 -0
- package/src/llm-stream-retry-display.ts +59 -0
- package/src/llm.ts +391 -74
- package/src/log-entry.ts +3 -3
- package/src/log-pane/search.ts +29 -4
- package/src/loops/agent-reply.ts +256 -0
- package/src/loops/budget.ts +37 -7
- package/src/loops/consensus.ts +348 -0
- package/src/loops/loop-cli.ts +3 -2
- package/src/loops/msg-address.ts +57 -0
- package/src/loops/msg-wake.ts +484 -0
- package/src/loops/observe.ts +19 -3
- package/src/loops/orchestrator/inbox.ts +60 -3
- package/src/loops/orchestrator/tick.ts +80 -6
- package/src/loops/orchestrator/traffic.ts +64 -1
- package/src/loops/registry.ts +72 -4
- package/src/market/signed-index.ts +14 -0
- package/src/mcp/mcp-oauth.ts +54 -5
- package/src/memory.ts +20 -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/native-tool-catalog.ts +125 -0
- package/src/nexus/DAEMON-THIN-inventory-2026-10-15.md +122 -0
- package/src/nexus/api/http-server.ts +59 -15
- package/src/nexus/api/loop-resources.ts +19 -3
- package/src/nexus/api/ops-api.ts +13 -0
- package/src/nexus/api/project-autopsy.ts +127 -0
- package/src/nexus/api/terminals.ts +3 -0
- package/src/nexus/api/workflow-approvals.ts +2 -0
- package/src/nexus/daemon-thin-inventory.md +37 -0
- package/src/nexus/index.ts +70 -0
- package/src/nexus/onboarding/first-boot-wizard.ts +56 -2
- package/src/nexus/state/state.ts +1 -0
- package/src/oauth/codex-account-store.ts +15 -3
- package/src/oauth/codex-billing-route.ts +31 -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-collect.ts +19 -2
- package/src/ops/resources.ts +82 -0
- package/src/panes/log-pane.ts +67 -8
- package/src/persona/presets.ts +44 -0
- package/src/plugins/maker/connector-maker.ts +41 -0
- package/src/plugins/maker/skill-maker.ts +42 -0
- package/src/plugins/maker/wizard-generate.ts +6 -4
- package/src/pr-tool/census.ts +288 -0
- package/src/preview/terminal.ts +14 -1
- package/src/prompt-cache/types.ts +2 -0
- package/src/prompt-enhance/enhance.ts +24 -8
- package/src/prompt-library/chat-conciseness.ts +13 -0
- package/src/prompt-library/universal-preamble.ts +283 -61
- package/src/pty-shell/pty-control-ipc.ts +4 -1
- package/src/pty-shell/pty-manifest.ts +77 -5
- package/src/pty-shell/registry.ts +19 -2
- package/src/pty-shell/tui-run-state.ts +253 -0
- 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 +32 -4
- 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/render.ts +5 -1
- 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/seat-report.ts +42 -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 +300 -24
- package/src/self-dev/run-types.ts +20 -0
- package/src/self-dev/shard-aggregate.ts +15 -2
- package/src/self-dev/shard-plan.ts +47 -0
- package/src/self-dev/shard-run.ts +135 -12
- package/src/self-dev/spawn-lane-files.ts +19 -0
- package/src/self-health/signatures.ts +132 -0
- package/src/self-implement/app-api-budget.ts +51 -11
- package/src/self-implement/config-gate.ts +2 -1
- package/src/self-implement/doctor-visit.ts +118 -0
- 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 +212 -18
- package/src/self-implement/gate-remote.ts +110 -25
- package/src/self-implement/gate-scenario.ts +85 -0
- package/src/self-implement/goal-author-decompose.ts +80 -16
- package/src/self-implement/goal-author.ts +270 -76
- package/src/self-implement/goal-authoring-grounding.ts +1 -1
- package/src/self-implement/goal-file-name.ts +65 -0
- package/src/self-implement/graph-authority.ts +38 -6
- package/src/self-implement/graph-overlay-condition.ts +92 -1
- package/src/self-implement/ground-goal.ts +2 -1
- package/src/self-implement/heal-triage.ts +79 -0
- package/src/self-implement/host-regate.ts +74 -2
- package/src/self-implement/orchestrator.ts +14 -123
- package/src/self-implement/pr-title.ts +123 -0
- package/src/self-implement/review-mustfix-class.ts +115 -0
- package/src/self-implement/run-checkpoint.ts +235 -0
- package/src/self-implement/run-ledger.ts +266 -17
- package/src/self-implement/run-stop.ts +4 -3
- package/src/self-implement/run-ttl.ts +28 -4
- package/src/self-implement/running-runs.ts +10 -6
- package/src/self-implement/seams.ts +2 -0
- package/src/self-implement/self-implement-runtime.ts +32 -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 +81 -11
- package/src/session/session-start.ts +224 -0
- package/src/session-runtime/index.ts +7 -1
- package/src/session-runtime/parallel-dispatch.ts +22 -5
- package/src/skills/tools/dev-harness.ts +6 -4
- package/src/skills/tools/ops-ledger.ts +707 -0
- package/src/skills/tools/persistent-grounding.ts +47 -7
- package/src/skills/tools/shell.ts +117 -1
- package/src/status/bar.ts +32 -2
- package/src/status/status-provider-info.ts +58 -0
- 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 +93 -13
- package/src/task-agent/remote-rejudge-bind.ts +62 -13
- package/src/task-agent/repair-cycle.ts +58 -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/kubectl-transient-retry.ts +51 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +138 -22
- 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 +122 -15
- 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 +103 -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 +237 -46
- package/src/telegram.ts +2 -4
- package/src/terminal/session-registry.ts +6 -0
- package/src/thinking-line.ts +12 -3
- package/src/tool-runtime/index.ts +4 -0
- package/src/tool-runtime/ops-ledger-runtimes.ts +84 -0
- package/src/tool-runtime/ref-consult-runtime.ts +17 -2
- package/src/tool-runtime/run-shell-runtime.ts +4 -1
- package/src/tool-runtime/self-cognition-runtimes.ts +5 -1
- 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 +53 -0
- package/src/user-config/gemini-server-tools.ts +9 -0
- package/src/user-config.ts +106 -21
- 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/fake-llm.ts +29 -0
- package/src/ux-sim/headless-tui.ts +72 -0
- package/src/ux-sim/in-process-cli.ts +176 -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/1027.a0f04663d24c2779.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +0 -1
- package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +0 -36
- package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1454-29d1d773d5996a49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +0 -1
- package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +0 -32
- package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3259-86f3be56e43eaf6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +0 -287
- package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4084.15ecaf4240bd9e77.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +0 -8
- package/apps/pwa/out/_next/static/chunks/4565-67e4c620597965c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +0 -149
- package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +0 -1
- package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/599-56f2c0a5cc4a7295.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +0 -23
- package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +0 -77
- package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +0 -64
- package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +0 -62
- package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8085-1e5fce59500a2cc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +0 -226
- package/apps/pwa/out/_next/static/chunks/83a80514-b897b64df43ce108.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +0 -93
- package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +0 -115
- package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +0 -74
- package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/973cbf1b.3bbcf2b41548eca7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-5ab1e47978577c5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-24453f6a302816b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-6c131d30bb1cf871.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-dc0772b11861af51.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-66ad46ed0279feb9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-5159dc8752c6cd29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-c5a2478861c08b87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-f722a9dec084e08b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-256ffd365d32e100.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e0de78ae7b99f01c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-cfbdc44b708d9801.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-4c741eb760f2f77c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-e9ba98f5f1440a21.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-dafc901bb1b72b5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-2f6f303fa114ec24.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-1634081c5272006c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-bb1f05cd51c38944.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-646b50f63b6fe732.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-db069b48a59c8c00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-f736324afa2117c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-6f131b51193a36f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-435f5e2faf02bc01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-497e0eedf20e7890.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-a8d28fdf995e16ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-8966452228753c5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fd5d18656cb432b6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-5663779cb1a37609.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-66a67eb19ebd976b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-3b492aa78cf3c4a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c71267e7681da982.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-a21d1e1797172692.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-781cfc5114e097da.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-478157214db6a023.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-86141f12cf090b7f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-7256c73bb1c36751.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-5c738ca7adef3de5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-0138c8091ec17224.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-cc2f24f16d85e735.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-979d318a534e92da.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-182d394f7e6e096b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-21050928a697ed7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-44b9d807005a9030.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-601fb77340e63c9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-75d3fb5d47af0edf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-11bf9e5725a72c22.js +0 -1
- package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +0 -1
- package/src/dashboard/bench-slash-runtime.ts +0 -40
- package/src/dashboard/input/search-modal-router.ts +0 -9
- package/src/dashboard/modals/pane-key-router.ts +0 -27
- package/src/dashboard/view-slash-runtime.ts +0 -48
- /package/apps/pwa/out/_next/static/{y1ltt7oCZxVpC6zVPhZ2O → LSXfY0u9QtfDbejY0Ukf_}/_ssgManifest.js +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { spawnSync } from 'node:child_process';
|
|
2
2
|
import { readFileSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
+
import { loadavg, cpus, freemem } from 'node:os';
|
|
4
5
|
import { effectiveInstanceRoot, prodInstanceRoot, treeDerivedRootFor } from '../instance/resolve.js';
|
|
5
6
|
import { getElanousConfigDirOverride } from '../elanous-config-dir.js';
|
|
6
7
|
import { buildUserConfig, getUserConfig, type UserConfig } from '../user-config.js';
|
|
@@ -99,6 +100,60 @@ export interface AutoSubstrateDecision {
|
|
|
99
100
|
reason: string;
|
|
100
101
|
}
|
|
101
102
|
|
|
103
|
+
export interface AutoSubstrateReadDeps {
|
|
104
|
+
loadavg?: typeof loadavg;
|
|
105
|
+
cpus?: typeof cpus;
|
|
106
|
+
freemem?: typeof freemem;
|
|
107
|
+
podAdmission?: () => AutoSubstrateSignals['podAdmission'];
|
|
108
|
+
localLaneOpen?: () => boolean;
|
|
109
|
+
/** Resolved by the launch decision, using its flag → env → config → context precedence. */
|
|
110
|
+
pool?: string | null;
|
|
111
|
+
config?: Pick<UserConfig, 'harness' | 'pod'>;
|
|
112
|
+
measurePoolLease?: typeof import('../task-orchestrator/surfaces/pod-lease.js').measurePoolLease;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** Read Pod admission using the same pool, usage and account inputs as dispatch backpressure. */
|
|
116
|
+
function readAutoPodAdmission(deps: AutoSubstrateReadDeps): AutoSubstrateSignals['podAdmission'] {
|
|
117
|
+
// Keep Pod lease dependencies lazy for local-only launches.
|
|
118
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
119
|
+
const { leaseKubectl, measurePoolLease, recommendConcurrency } = require('../task-orchestrator/surfaces/pod-lease.js') as typeof import('../task-orchestrator/surfaces/pod-lease.js');
|
|
120
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
121
|
+
const { parsePodPool, resolvePodPoolSpec } = require('../task-orchestrator/surfaces/pod-pool.js') as typeof import('../task-orchestrator/surfaces/pod-pool.js');
|
|
122
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
123
|
+
const { listCodexAccountsInStore } = require('../oauth/codex-account-store.js') as typeof import('../oauth/codex-account-store.js');
|
|
124
|
+
// A direct collector call can resolve its own pool. The launch resolver passes a string or null
|
|
125
|
+
// explicitly so it never substitutes another universe's pool when the launch pool is unreadable.
|
|
126
|
+
const fallback = deps.pool === undefined ? (deps.config ?? getUserConfig()) : null;
|
|
127
|
+
const spec = fallback ? resolvePodPoolSpec(undefined, process.env, () => fallback.harness?.podPool ?? fallback.pod?.pool) : null;
|
|
128
|
+
const current = fallback && !spec ? leaseKubectl(['config', 'current-context']) : null;
|
|
129
|
+
const pool = deps.pool === undefined ? (spec ?? (current?.status === 0 ? current.stdout.trim() : null)) : deps.pool;
|
|
130
|
+
if (!pool) return null;
|
|
131
|
+
const members = parsePodPool(pool);
|
|
132
|
+
const measure = (deps.measurePoolLease ?? measurePoolLease)(members, { measureUsage: true, skipDnsProbe: true });
|
|
133
|
+
let accounts = -1;
|
|
134
|
+
try { accounts = listCodexAccountsInStore().length; } catch { /* Accounts are only observed, not a limit. */ }
|
|
135
|
+
const { recommended, limitedBy } = recommendConcurrency(measure, {
|
|
136
|
+
capacity: members.reduce((sum, member) => sum + member.capacity, 0),
|
|
137
|
+
accounts, perAccount: (deps.config ?? getUserConfig()).pod?.lease?.perAccount ?? 4,
|
|
138
|
+
});
|
|
139
|
+
return recommended === null || limitedBy === null ? null : { recommended, limitedBy };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** Collect observations on the launch host; an unreadable Pod recommendation is not a refusal. */
|
|
143
|
+
export function readAutoSubstrateSignals(deps: AutoSubstrateReadDeps = {}): AutoSubstrateSignals {
|
|
144
|
+
let podAdmission: AutoSubstrateSignals['podAdmission'];
|
|
145
|
+
try { podAdmission = (deps.podAdmission ?? (() => readAutoPodAdmission(deps)))() ?? null; }
|
|
146
|
+
catch { podAdmission = null; }
|
|
147
|
+
if (podAdmission?.recommended === null || podAdmission?.limitedBy === null) podAdmission = null;
|
|
148
|
+
return {
|
|
149
|
+
load1: (deps.loadavg ?? loadavg)()[0],
|
|
150
|
+
cores: (deps.cpus ?? cpus)().length,
|
|
151
|
+
availableMemoryBytes: (deps.freemem ?? freemem)(),
|
|
152
|
+
podAdmission,
|
|
153
|
+
localLaneOpen: deps.localLaneOpen?.() ?? false,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
102
157
|
export interface NextLocalLaneCapInput {
|
|
103
158
|
current: number;
|
|
104
159
|
wanted: number;
|
|
@@ -194,28 +249,44 @@ export function checkHarnessPodPool(pool: string, run?: PoolKubectl): HarnessPoo
|
|
|
194
249
|
export function resolveHarnessSubstrate({ flag, config, env, currentContext = () => {
|
|
195
250
|
const result = spawnSync('kubectl', ['config', 'current-context'], { encoding: 'utf8', timeout: 5000 });
|
|
196
251
|
return result.status === 0 ? result.stdout?.trim() : undefined;
|
|
197
|
-
}, autoSignals, poolCheck = checkHarnessPodPool }: {
|
|
252
|
+
}, autoSignals, readAutoSignals, autoReadDeps, poolCheck = checkHarnessPodPool }: {
|
|
198
253
|
flag?: { substrate?: HarnessSubstrate | 'auto'; podPool?: string };
|
|
199
254
|
config?: Pick<UserConfig, 'harness' | 'pod'>;
|
|
200
255
|
env?: NodeJS.ProcessEnv;
|
|
201
256
|
currentContext?: () => string | undefined;
|
|
202
257
|
/** Signals must come from the launch host and Pod admission, not a worktree's cached config. */
|
|
203
258
|
autoSignals?: AutoSubstrateSignals;
|
|
259
|
+
/** Inject the collector at the decision boundary; explicit requests never invoke it. */
|
|
260
|
+
readAutoSignals?: () => AutoSubstrateSignals;
|
|
261
|
+
/** Inject measurement dependencies without bypassing the default collector or pool selection. */
|
|
262
|
+
autoReadDeps?: Omit<AutoSubstrateReadDeps, 'pool' | 'config' | 'podAdmission'>;
|
|
204
263
|
/** POD-POOL-UNCAPPED-SPEC — pre-launch check of the implicit kube context; tests inject it instead of shelling out. */
|
|
205
264
|
poolCheck?: (pool: string) => HarnessPoolCheck;
|
|
206
265
|
}): ResolvedHarnessSubstrate {
|
|
207
266
|
const requested = flag?.substrate ?? config?.harness?.substrate ?? 'local';
|
|
208
267
|
if (requested !== 'local' && requested !== 'pod' && requested !== 'auto') throw new Error('harness.substrate: local, pod 또는 auto 만 허용한다');
|
|
209
268
|
const source = flag?.substrate ? 'flag' : config?.harness?.substrate ? 'config' : 'default';
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
269
|
+
const explicit = flag?.podPool?.trim() || env?.ELANOUS_POD_POOL?.trim() || config?.harness?.podPool?.trim() || config?.pod?.pool?.trim();
|
|
270
|
+
// Reuse the same pool choice for admission and launch; do not fall back to a different universe's pool.
|
|
271
|
+
let implicit: string | undefined;
|
|
272
|
+
let contextRead = false;
|
|
273
|
+
const selectedPool = () => {
|
|
274
|
+
if (explicit) return explicit;
|
|
275
|
+
if (!contextRead) { implicit = currentContext()?.trim(); contextRead = true; }
|
|
276
|
+
return implicit;
|
|
277
|
+
};
|
|
278
|
+
const signals = requested === 'auto'
|
|
279
|
+
? (autoSignals ?? (readAutoSignals ?? (() => readAutoSubstrateSignals({ ...autoReadDeps, pool: selectedPool() ?? null, config })))())
|
|
280
|
+
: null;
|
|
281
|
+
if (signals && autoSignals === undefined) debug.log('harness.substrate', 'auto-signals', {
|
|
282
|
+
load1: signals.load1, cores: signals.cores, availableMemoryBytes: signals.availableMemoryBytes,
|
|
283
|
+
podAdmission: signals.podAdmission, localLaneOpen: signals.localLaneOpen,
|
|
284
|
+
});
|
|
285
|
+
const decision = signals ? routeAutoSubstrate(signals) : null;
|
|
214
286
|
const substrate: HarnessSubstrate = requested === 'auto' ? decision!.substrate : requested;
|
|
215
287
|
if (decision) debug.log('harness.substrate', 'route', { substrate, reason: decision.reason, source });
|
|
216
288
|
if (substrate === 'local') return { substrate, pool: null, source };
|
|
217
|
-
const
|
|
218
|
-
const pool = explicit || currentContext()?.trim();
|
|
289
|
+
const pool = selectedPool();
|
|
219
290
|
if (!pool) throw new Error(`harness.substrate=${decision ? `auto→pod(${decision.reason})` : 'pod'}: Pod 풀 또는 현재 컨텍스트에 닿지 못했다 — 풀을 설정하거나 \`--substrate local\` 로 명시하라`);
|
|
220
291
|
// POD-POOL-UNCAPPED-SPEC — an explicit pool is the operator's own statement and gets `checkPodPool` at the launch
|
|
221
292
|
// site (`src/index.ts` self orchestrate · `src/loops/orchestrator/tick.ts` · `pod-command-job.ts`). The implicit
|
|
@@ -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 { readFileSync } from 'node:fs';
|
|
3
4
|
import { resolveMainRepoRoot, type HarnessWorktreeCommand } from '../git-fs/worktree.js';
|
|
4
5
|
import { goalTitleFromDocument } from '../self-implement/seams.js';
|
|
@@ -25,7 +26,7 @@ interface DevWorktreeGoal {
|
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
function git(cwd: string, args: string[]): string {
|
|
28
|
-
const result = spawnSync('git', args, { cwd, encoding: 'utf8' });
|
|
29
|
+
const result = spawnSync('git', args, { cwd, encoding: 'utf8', maxBuffer: SPAWN_SYNC_MAX_BUFFER });
|
|
29
30
|
if (result.status !== 0) {
|
|
30
31
|
const message = (result.stderr || result.stdout || '').trim() || `git exited ${result.status}`;
|
|
31
32
|
throw new Error(`dev auto-worktree inspection failed — ${message}`);
|
|
@@ -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 { resolve } from 'node:path';
|
|
3
4
|
import { debug } from '../debug/log.js';
|
|
4
5
|
import { gitStdout, type GitRunner } from './harness-clean.js';
|
|
@@ -146,7 +147,7 @@ export function renderHarnessWorktreesReport(report: WorktreeAssessmentReport, r
|
|
|
146
147
|
|
|
147
148
|
export type GhWorktreeRunner = (args: string[], cwd: string) => { status: number | null; stdout: string };
|
|
148
149
|
const defaultGhRunner: GhWorktreeRunner = (args, cwd) => {
|
|
149
|
-
const result = spawnSync('gh', args, { cwd, encoding: 'utf8', timeout: 25_000 });
|
|
150
|
+
const result = spawnSync('gh', args, { cwd, encoding: 'utf8', timeout: 25_000, maxBuffer: SPAWN_SYNC_MAX_BUFFER });
|
|
150
151
|
return { status: result.status, stdout: result.stdout ?? '' };
|
|
151
152
|
};
|
|
152
153
|
|
|
@@ -366,7 +367,7 @@ export function execHarnessWorktrees(deps: {
|
|
|
366
367
|
progress?: (line: string) => void;
|
|
367
368
|
} = {}): WorktreeAssessmentReport {
|
|
368
369
|
const run: GitRunner = deps.run ?? ((args) => {
|
|
369
|
-
const result = spawnSync('git', args, { encoding: 'utf8', timeout: 25_000 });
|
|
370
|
+
const result = spawnSync('git', args, { encoding: 'utf8', timeout: 25_000, maxBuffer: SPAWN_SYNC_MAX_BUFFER });
|
|
370
371
|
return { status: result.status, stdout: result.stdout ?? '', stderr: result.stderr ?? '' };
|
|
371
372
|
});
|
|
372
373
|
const worktrees = listRegisteredWorktrees(run);
|
package/src/hooks/dispatch.ts
CHANGED
|
@@ -24,7 +24,8 @@ const DEFAULT_SEAT_ROUTES = [
|
|
|
24
24
|
* So a delivered card with the seat loop off is not retried (the card waits in the inbox), and a shadow loop's wake is
|
|
25
25
|
* recorded as `wake_status = 'shadow'` — visible as «not executed», not mistaken for a real run. */
|
|
26
26
|
export async function dispatchHook(event: QueuedHook, root: string, config: EventsConfig,
|
|
27
|
-
|
|
27
|
+
// Autonomous hook wake: the needs-owner hold stays on (NEEDS-OWNER-BOUNDARY).
|
|
28
|
+
wake: HookWake = seat => runSeatLoopOnce(seat, { root, needsOwnerGate: true, config: getUserConfig().loops?.seat ?? { mode: 'off' } }),
|
|
28
29
|
now: () => number = Date.now): Promise<void> {
|
|
29
30
|
const key = `${event.provider}:${event.eventId}`;
|
|
30
31
|
const route = config.routes.find(candidate => candidate.source === event.provider && candidate.kind === event.kind);
|
package/src/index.ts
CHANGED
|
@@ -72,6 +72,7 @@ import { registerPodCommands } from './cli/pod-cli.js';
|
|
|
72
72
|
import { registerBrowserAnnotateCommand } from './cli/browser-annotate-cli.js';
|
|
73
73
|
import { registerPendingQuestionsCommand } from './cli/pending-questions-cli.js';
|
|
74
74
|
import { registerUsageCommand } from './cli/usage-cli.js';
|
|
75
|
+
import { registerUsageDailyCommand } from './cli/usage-daily-cli.js';
|
|
75
76
|
import { registerLiveCommands } from './cli/live-cli.js';
|
|
76
77
|
import { registerResearchCommand } from './cli/research-cli.js';
|
|
77
78
|
import { registerReleaseCommands } from './cli/release-cli.js';
|
|
@@ -488,7 +489,17 @@ async function executeHarnessSelfRun(
|
|
|
488
489
|
runId: string,
|
|
489
490
|
startDraftTriage: typeof import('./self-dev/dev-cli.js')['startDraftTriage'],
|
|
490
491
|
startDraftTriageOptions?: RunDevAskStartDraftTriageOptions,
|
|
492
|
+
entranceId?: EntranceId,
|
|
491
493
|
): Promise<Awaited<ReturnType<RunDevAskRunDevPipeline>>> {
|
|
494
|
+
// TA harness say/ask may be decomposed into parallel text goals before
|
|
495
|
+
// runDevPipeline reads the authored file. Check the original GOAL here,
|
|
496
|
+
// before any orchestrator or Pod child can be dispatched.
|
|
497
|
+
const isGoalFile = existsSync(input);
|
|
498
|
+
if (process.env.ELANOUS_TASK_CARD_ID?.trim() || isGoalFile) {
|
|
499
|
+
const { preflightGoalDoneBoundary } = await import('./self-dev/dev-pipeline.js');
|
|
500
|
+
preflightGoalDoneBoundary({ file: isGoalFile ? input : '<harness request>' }, isGoalFile ? readFileSync(input, 'utf8') : input,
|
|
501
|
+
process.env.ELANOUS_TASK_CARD_ID, entranceId, isGoalFile ? 'goal' : 'request');
|
|
502
|
+
}
|
|
492
503
|
startDraftTriage(runId, startDraftTriageOptions);
|
|
493
504
|
// 정지 요청의 «신선도» 기준 — 첫 런 «전»에 잰다(첫 런 도중의 정지도 이 호출의 것이다).
|
|
494
505
|
const invocationStartedAtMs = Date.now();
|
|
@@ -650,6 +661,11 @@ async function runDevAskFromAskFile(askPath: string, opts: HarnessAskSayChildLlm
|
|
|
650
661
|
},
|
|
651
662
|
);
|
|
652
663
|
if (flowResult.kind !== 'launch') {
|
|
664
|
+
// ⭐ 프리플라이트 거절은 «자식 결과» 봉투로 마지막 JSON 행을 남긴다 — Pod 원장(pod-failure-reason.nestedPodResult)이
|
|
665
|
+
// {ok, kind, result:{stage, blockers}} 중첩 행에서 사유 코드·검사 이름·경로를 읽는다. 나머지 중단은 기존대로 조용히 exit(1).
|
|
666
|
+
if (opts.json && flowResult.kind === 'stopped-by-preflight') {
|
|
667
|
+
await writeStdoutJson(`${JSON.stringify({ ok: false, kind: 'self', result: { stage: 'preflight-blocked', ok: false, blockers: flowResult.blockers } })}\n`);
|
|
668
|
+
}
|
|
653
669
|
runDevAskFromGoalFileDeps.setExitCode(1);
|
|
654
670
|
return;
|
|
655
671
|
}
|
|
@@ -676,6 +692,7 @@ async function runDevAskFromAskFile(askPath: string, opts: HarnessAskSayChildLlm
|
|
|
676
692
|
identity.runId,
|
|
677
693
|
startDraftTriage,
|
|
678
694
|
startDraftTriageOptions,
|
|
695
|
+
CLI_HARNESS_ASK_ENTRANCE.id,
|
|
679
696
|
);
|
|
680
697
|
const ok = devResultOk(result);
|
|
681
698
|
if (opts.json) {
|
|
@@ -781,6 +798,7 @@ async function runDevAskFromGoalFile(goalPath: string, opts: HarnessAskSayChildL
|
|
|
781
798
|
identity.runId,
|
|
782
799
|
startDraftTriage,
|
|
783
800
|
startDraftTriageOptions,
|
|
801
|
+
CLI_HARNESS_ASK_ENTRANCE.id,
|
|
784
802
|
);
|
|
785
803
|
const ok = devResultOk(result);
|
|
786
804
|
if (opts.json) {
|
|
@@ -885,6 +903,7 @@ async function runDevSayFromWords(
|
|
|
885
903
|
identity.runId,
|
|
886
904
|
startDraftTriage,
|
|
887
905
|
startDraftTriageOptions,
|
|
906
|
+
entrance,
|
|
888
907
|
);
|
|
889
908
|
const ok = devResultOk(result);
|
|
890
909
|
if (opts.json) {
|
|
@@ -915,6 +934,7 @@ registerPodCommands(program);
|
|
|
915
934
|
registerBrowserAnnotateCommand(program);
|
|
916
935
|
registerPendingQuestionsCommand(program);
|
|
917
936
|
registerUsageCommand(program);
|
|
937
|
+
registerUsageDailyCommand(program);
|
|
918
938
|
// main() → program.parseAsync() → live detail action; --test was applied before dispatch.
|
|
919
939
|
registerLiveCommands(program);
|
|
920
940
|
registerResearchCommand(program);
|
|
@@ -1473,6 +1493,8 @@ program
|
|
|
1473
1493
|
'--test',
|
|
1474
1494
|
'격리 테스트 인스턴스로 실행 — cwd 의 git 트리(worktree 포함)에서 `<트리>/.elanous-test` 를 루트로 잡고 state·config 두 축을 함께 격리한다. config 사본이 없으면 자동 물질화. `--test=<dir>` 로 루트 직접 지정 가능(값 문법은 `=` 형태 하나 — 모호함 없음). ELANOUS_STATE_DIR/--config-dir 을 손으로 줄 필요가 없다.',
|
|
1475
1495
|
)
|
|
1496
|
+
// Documentation-only — `readDashboardNameFlag` 가 Commander «전»에 argv 에서 걷어낸다.
|
|
1497
|
+
.option('--name <name>', '대시보드 TUI 의 PTY 행(tui:<pid>)에 별명을 달고 뜬다 — `elanous pty list` 에 보이고 `pty snapshot <name>` 으로 부른다. 뜬 뒤 바꾸려면 `elanous pty rename <ref> <name>`.')
|
|
1476
1498
|
.option('--help-all', '시스템 명령을 제외한 모든 최상위 명령 표시');
|
|
1477
1499
|
program.addHelpText('after', acpServerHelpText());
|
|
1478
1500
|
|
|
@@ -4315,10 +4337,15 @@ selfCmd
|
|
|
4315
4337
|
.option('--base <ref>', '커밋됐지만 PR 없는 변경의 비교 기준(ref...HEAD)')
|
|
4316
4338
|
.option('--pr <number>', '열린 PR 번호에서 gh pr view files로 변경 파일을 읽는다')
|
|
4317
4339
|
.option('--shards [number]', '메모리 예산에 맞춰 시험을 별도 프로세스로 분할한다 (기본 2)')
|
|
4340
|
+
.option('--fixed-shard-distribution', '--shards N 과 함께만: RSS 사전 측정 없이 정렬된 파일을 N 조각에 라운드로빈 고정 배정한다(opt-in · 메모리 보증 아님 · 조각 타임아웃/OOM = unmeasured)')
|
|
4341
|
+
.option('--include-importers', '변경 모듈을 가져오는 importer 시험도 실행한다 (기본 caller 한도 밖까지)')
|
|
4318
4342
|
.option('--remote [host]', 'GATE-REMOTE — 같은 커밋을 원격 호스트(기본 config gateRemote.host=node-b)에서 돌리고 결과만 가져온다(깨끗한 트리 · --pr 은 로컬)')
|
|
4319
4343
|
.option('--local', '원격 자동 분배(로컬 1분 부하 > gateRemote.loadThreshold=20)를 끄고 로컬에서 돌린다')
|
|
4320
|
-
.
|
|
4344
|
+
.option('--artifact-dir <dir>', '조각별 지금/기준 JUnit ⊕ summary.json 을 이 디렉토리에 남긴다(판정 불변 · JUnit 은 --shards 경로만 · 원격 실행이면 그 호스트에서 가져온다)')
|
|
4345
|
+
.action(async (opts: { changed?: boolean; base?: string; pr?: string; shards?: string | boolean; fixedShardDistribution?: boolean; includeImporters?: boolean; remote?: string | boolean; local?: boolean; artifactDir?: string }) => {
|
|
4321
4346
|
if (!opts.changed && opts.shards === undefined) { ui.error('self gate requires --changed or --shards'); process.exitCode = 2; return; }
|
|
4347
|
+
if (opts.fixedShardDistribution && opts.shards === undefined) { ui.error('self gate: --fixed-shard-distribution requires --shards <n>'); process.exitCode = 2; return; }
|
|
4348
|
+
if (opts.artifactDir !== undefined && !opts.artifactDir.trim()) { ui.error('self gate: --artifact-dir needs a non-empty directory'); process.exitCode = 2; return; }
|
|
4322
4349
|
// The root strips `--local` from argv anywhere (remote-bookmark attach · src/cli/remote-resolve.ts) before Commander
|
|
4323
4350
|
// sees it, so this subcommand reads it from the untouched process.argv.
|
|
4324
4351
|
opts.local = !!opts.local || process.argv.slice(2).includes('--local');
|
|
@@ -4328,10 +4355,13 @@ selfCmd
|
|
|
4328
4355
|
if (!isValidGateHost(opts.remote)) { ui.error(`self gate: invalid --remote host: ${opts.remote}`); process.exitCode = 2; return; }
|
|
4329
4356
|
}
|
|
4330
4357
|
const shards = opts.shards === undefined ? undefined : opts.shards === true ? 2 : Number(opts.shards);
|
|
4358
|
+
let ranLocal = false;
|
|
4359
|
+
let remoteArtifacts: { dir: string; fetch?: { ok: true; summaryPath: string; junitFiles: string[]; remoteDirKept: boolean } | { ok: false; reason: string } } | { unsupported: true } | undefined;
|
|
4331
4360
|
const runLocal = () => {
|
|
4361
|
+
ranLocal = true;
|
|
4332
4362
|
try {
|
|
4333
4363
|
const { runSelfGateCli } = require('./self-implement/gate-cli.js') as typeof import('./self-implement/gate-cli.js');
|
|
4334
|
-
const result = runSelfGateCli(process.cwd(), { base: opts.base, pr: opts.pr, shards });
|
|
4364
|
+
const result = runSelfGateCli(process.cwd(), { base: opts.base, pr: opts.pr, shards, ...(opts.fixedShardDistribution ? { fixedShardDistribution: true } : {}), includeImporterTests: !!opts.includeImporters, ...(opts.artifactDir !== undefined ? { artifactDir: opts.artifactDir } : {}) });
|
|
4335
4365
|
console.log(result.lines.join('\n'));
|
|
4336
4366
|
return result.exitCode;
|
|
4337
4367
|
} catch (error) {
|
|
@@ -4346,23 +4376,74 @@ selfCmd
|
|
|
4346
4376
|
if (topLevel.status !== 0) throw new Error(`git rev-parse --show-toplevel failed: ${topLevel.stderr.trim() || `rc=${topLevel.status}`}`);
|
|
4347
4377
|
const repo = topLevel.stdout.trim();
|
|
4348
4378
|
// Only a committed --base range is reproducible on another host: the default mode measures uncommitted files, --pr
|
|
4349
|
-
// reads files through gh on this host, and the remote checkout runs from the repository root —
|
|
4379
|
+
// reads files through gh on this host, and the remote checkout runs from the repository root — automatic placement
|
|
4380
|
+
// falls back locally; an explicit --remote reports that this check was not measured.
|
|
4350
4381
|
const { realpathSync } = await import('node:fs');
|
|
4351
4382
|
const localOnlyReason = opts.pr ? 'self gate --pr reads PR files through gh on this host'
|
|
4352
4383
|
: !opts.base ? 'self gate without --base measures uncommitted files on this host'
|
|
4353
4384
|
: realpathSync(repo) !== realpathSync(process.cwd()) ? 'self gate run from a sub-directory' : undefined;
|
|
4385
|
+
// SIDE-VERIFY-GATE-SHARDS ② — the host writes its artifacts outside its scratch tree (which its trap removes) and we
|
|
4386
|
+
// fetch them back after the run. Only when the measured commit knows --artifact-dir: an unknown option would kill the
|
|
4387
|
+
// remote CLI and change the verdict itself.
|
|
4388
|
+
if (opts.artifactDir !== undefined) {
|
|
4389
|
+
const { remoteCommitSupportsArtifactDir, newRemoteArtifactDir } = await import('./self-implement/gate-artifacts.js');
|
|
4390
|
+
remoteArtifacts = remoteCommitSupportsArtifactDir(repo) ? { dir: newRemoteArtifactDir() } : { unsupported: true };
|
|
4391
|
+
}
|
|
4392
|
+
const remoteArtifactArgs = remoteArtifacts && 'dir' in remoteArtifacts ? ['--artifact-dir', remoteArtifacts.dir] : [];
|
|
4354
4393
|
// origin/main is pinned to this machine's origin/main on the host; any other base is passed as its resolved sha.
|
|
4355
4394
|
const remoteArgv = (sha: (ref: string) => string) => ['bun', 'bin/elanous.mjs', 'self', 'gate', '--local', ...(opts.changed ? ['--changed'] : []),
|
|
4356
|
-
...(opts.base ? ['--base', opts.base === 'origin/main' ? opts.base : sha(opts.base)] : []), ...(shards !== undefined ? ['--shards', String(shards)] : [])
|
|
4395
|
+
...(opts.base ? ['--base', opts.base === 'origin/main' ? opts.base : sha(opts.base)] : []), ...(shards !== undefined ? ['--shards', String(shards)] : []),
|
|
4396
|
+
// A measured commit without this option rejects it (exit ≠ 0) — read as not passed, never as a silent measured run.
|
|
4397
|
+
...(opts.fixedShardDistribution ? ['--fixed-shard-distribution'] : []),
|
|
4398
|
+
...(opts.includeImporters ? ['--include-importers'] : []), ...remoteArtifactArgs];
|
|
4399
|
+
const { gateHostReservationRoot } = await import('./release-loop/gate-host-reservation.js');
|
|
4357
4400
|
process.exitCode = await dispatchHeavyCheck({
|
|
4358
|
-
tool: 'self-gate', repo, installPwa: true, remoteArgv, refs: opts.base ? [opts.base] : [],
|
|
4401
|
+
tool: 'self-gate', repo, installPwa: true, remoteArgv, refs: opts.base ? [opts.base] : [], reservationRoot: gateHostReservationRoot(),
|
|
4359
4402
|
localOnlyReason,
|
|
4403
|
+
explicitRemoteOnly: opts.remote !== undefined, reportRemoteHost: true,
|
|
4360
4404
|
flags: { remote: typeof opts.remote === 'string' ? opts.remote : opts.remote ? true : undefined, local: !!opts.local },
|
|
4361
4405
|
runLocal,
|
|
4406
|
+
...(remoteArtifacts && 'dir' in remoteArtifacts && opts.artifactDir !== undefined ? {
|
|
4407
|
+
onRemoteOutcome: ((outcome, host, runner) => {
|
|
4408
|
+
const { fetchRemoteGateArtifacts, remoteArtifactCleanupScript, resolveArtifactDir } = require('./self-implement/gate-artifacts.js') as typeof import('./self-implement/gate-artifacts.js');
|
|
4409
|
+
const target = remoteArtifacts as { dir: string; fetch?: { ok: true; summaryPath: string; junitFiles: string[]; remoteDirKept: boolean } | { ok: false; reason: string } };
|
|
4410
|
+
if (outcome.kind === 'ran') {
|
|
4411
|
+
target.fetch = fetchRemoteGateArtifacts({ host, remoteDir: target.dir, localDir: resolveArtifactDir(opts.artifactDir!, process.cwd()), ssh: runner.ssh });
|
|
4412
|
+
} else if (outcome.kind === 'infra') {
|
|
4413
|
+
// The run may have started before it broke — remove the host-side dir; automatic placement's local fallback writes its own.
|
|
4414
|
+
try { runner.ssh(host, remoteArtifactCleanupScript(target.dir), 30_000); } catch { /* best effort */ }
|
|
4415
|
+
}
|
|
4416
|
+
}) satisfies NonNullable<import('./self-implement/gate-remote.js').DispatchOptions['onRemoteOutcome']>,
|
|
4417
|
+
} : {}),
|
|
4362
4418
|
});
|
|
4363
4419
|
} catch (error) {
|
|
4364
|
-
|
|
4365
|
-
|
|
4420
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
4421
|
+
if (opts.remote !== undefined) {
|
|
4422
|
+
ui.error(`self gate remote unmeasured — ${reason.replace(/\s+/g, ' ').trim()}`);
|
|
4423
|
+
process.exitCode = 1;
|
|
4424
|
+
} else {
|
|
4425
|
+
ui.error(`self gate dispatch failed: ${reason}`);
|
|
4426
|
+
process.exitCode = runLocal();
|
|
4427
|
+
}
|
|
4428
|
+
}
|
|
4429
|
+
// 원격에서 돌았으면 그 호스트의 산출을 가져와 같은 꼴로 썼다 — 못 가져왔으면 «조용히» 비우지 않고 summary 에 이유를 적는다(판정 불변).
|
|
4430
|
+
if (opts.artifactDir !== undefined && !ranLocal) {
|
|
4431
|
+
const fetched = remoteArtifacts && 'dir' in remoteArtifacts ? remoteArtifacts.fetch : undefined;
|
|
4432
|
+
try {
|
|
4433
|
+
if (fetched?.ok) {
|
|
4434
|
+
console.log(`artifacts: ${fetched.summaryPath} (junit ${fetched.junitFiles.length} · fetched from remote)`);
|
|
4435
|
+
if (fetched.remoteDirKept) console.log(`⚠ artifacts: 원격 산출 디렉토리를 못 지웠다 — ${(remoteArtifacts as { dir: string }).dir} (판정은 그대로다)`);
|
|
4436
|
+
}
|
|
4437
|
+
else {
|
|
4438
|
+
const reason = remoteArtifacts && 'unsupported' in remoteArtifacts ? 'remote-unsupported' as const : 'remote-fetch-failed' as const;
|
|
4439
|
+
if (reason === 'remote-fetch-failed') console.log(`⚠ artifacts: 원격 산출을 못 가져왔다 — ${fetched && !fetched.ok ? fetched.reason : 'no remote fetch ran'} (판정은 그대로다)`);
|
|
4440
|
+
const { writeRemoteUnavailableGateArtifacts } = await import('./self-implement/gate-artifacts.js');
|
|
4441
|
+
const written = writeRemoteUnavailableGateArtifacts(opts.artifactDir, process.cwd(), opts.base, Number(process.exitCode ?? 0), reason);
|
|
4442
|
+
console.log(`artifacts: ${written.summaryPath} (junit 0 · unavailable=${reason})`);
|
|
4443
|
+
}
|
|
4444
|
+
} catch (error) {
|
|
4445
|
+
console.log(`⚠ artifacts: ${opts.artifactDir} 에 못 썼다 — ${error instanceof Error ? error.message : String(error)} (판정은 그대로다)`);
|
|
4446
|
+
}
|
|
4366
4447
|
}
|
|
4367
4448
|
});
|
|
4368
4449
|
|
|
@@ -7501,7 +7582,7 @@ const selfDevCmd = program
|
|
|
7501
7582
|
cfg: reloadUserConfig(),
|
|
7502
7583
|
userText: text,
|
|
7503
7584
|
explicitSessionId: chat.session,
|
|
7504
|
-
reuseActive:
|
|
7585
|
+
reuseActive: chat.continueActive === true,
|
|
7505
7586
|
forceNew: chat.forceNew === true,
|
|
7506
7587
|
json: chat.json === true,
|
|
7507
7588
|
enableTools: chat.enableTools,
|
|
@@ -7786,7 +7867,7 @@ configCmd
|
|
|
7786
7867
|
.command('set <path> <value>')
|
|
7787
7868
|
.description('Set a dotted config path. Value is parsed as JSON when possible.')
|
|
7788
7869
|
.option('--no-backup', "Don't write config.json.bak before saving")
|
|
7789
|
-
.action((path: string, value: string, opts: { backup?: boolean }) => {
|
|
7870
|
+
.action(async (path: string, value: string, opts: { backup?: boolean }) => {
|
|
7790
7871
|
const parsed = parseConfigValue(value);
|
|
7791
7872
|
const cfg = getUserConfig() as unknown as Record<string, unknown>;
|
|
7792
7873
|
const previousProvider = getConfigPath(cfg, 'llm.provider');
|
|
@@ -7805,6 +7886,7 @@ configCmd
|
|
|
7805
7886
|
: undefined;
|
|
7806
7887
|
|
|
7807
7888
|
if (opts.backup !== false) backupUserConfig(userConfigPath());
|
|
7889
|
+
const prev = getConfigPath(cfg, path); // CFG-STORE2 감사 이력 — 변경 «전» 값
|
|
7808
7890
|
setConfigPath(cfg, path, parsed);
|
|
7809
7891
|
if (credential?.apiKey && (credential.source === 'rotation' || credential.source === 'env')) {
|
|
7810
7892
|
setConfigPath(cfg, 'llm.apiKey', credential.apiKey);
|
|
@@ -7818,6 +7900,8 @@ configCmd
|
|
|
7818
7900
|
console.error(`⚠️ set ${path} — 저장 후 값 미반영(직렬화 드롭). 읽힌값=${JSON.stringify(after)}`);
|
|
7819
7901
|
process.exit(1);
|
|
7820
7902
|
}
|
|
7903
|
+
// CFG-STORE2 — 저장 «성공» 뒤 감사 이력 한 줄 · fail-open(기록 실패가 set 을 막지 않는다).
|
|
7904
|
+
try { (await import('./cli/config-audit.js')).recordConfigChange({ key: path, prev, next: parsed, why: 'config set' }); } catch (err) { ui.warn(`config 감사 이력 기록 실패(무시): ${err instanceof Error ? err.message : String(err)}`); }
|
|
7821
7905
|
if (credential?.apiKey && (credential.source === 'rotation' || credential.source === 'env')) {
|
|
7822
7906
|
ui.info(`provider credential updated: ${parsed} via ${credential.source} (${credential.apiKey.length} chars)`);
|
|
7823
7907
|
} else if (credential?.source === 'none' && !isKeylessProvider(nextProvider)) {
|
|
@@ -7832,9 +7916,10 @@ configCmd
|
|
|
7832
7916
|
.command('unset <path>')
|
|
7833
7917
|
.description('Remove a dotted config path (set 의 역 · 배열 인덱스 지원). 이미 없으면 no-op.')
|
|
7834
7918
|
.option('--no-backup', "Don't write config.json.bak before saving")
|
|
7835
|
-
.action((path: string, opts: { backup?: boolean }) => {
|
|
7919
|
+
.action(async (path: string, opts: { backup?: boolean }) => {
|
|
7836
7920
|
const cfg = getUserConfig() as unknown as Record<string, unknown>;
|
|
7837
|
-
|
|
7921
|
+
const prev = getConfigPath(cfg, path); // CFG-STORE2 감사 이력 — 삭제 «전» 값
|
|
7922
|
+
if (prev === undefined) {
|
|
7838
7923
|
ui.info(`unset ${path} — 이미 없음 (no-op)`);
|
|
7839
7924
|
return;
|
|
7840
7925
|
}
|
|
@@ -7848,6 +7933,8 @@ configCmd
|
|
|
7848
7933
|
console.error(`⚠️ unset ${path} — 삭제 후에도 값 잔존. 남은값=${JSON.stringify(after)}`);
|
|
7849
7934
|
process.exit(1);
|
|
7850
7935
|
}
|
|
7936
|
+
// CFG-STORE2 — 삭제 저장 «성공» 뒤 감사 이력 한 줄 · fail-open(기록 실패가 unset 을 막지 않는다).
|
|
7937
|
+
try { (await import('./cli/config-audit.js')).recordConfigChange({ key: path, prev, why: 'config unset' }); } catch (err) { ui.warn(`config 감사 이력 기록 실패(무시): ${err instanceof Error ? err.message : String(err)}`); }
|
|
7851
7938
|
ui.info(`unset ${path}`);
|
|
7852
7939
|
});
|
|
7853
7940
|
|
|
@@ -8046,6 +8133,7 @@ program
|
|
|
8046
8133
|
reuseActive: opts.reuse === true,
|
|
8047
8134
|
forceNew: false,
|
|
8048
8135
|
json: opts.json === true,
|
|
8136
|
+
surface: 'ask',
|
|
8049
8137
|
});
|
|
8050
8138
|
});
|
|
8051
8139
|
|
|
@@ -8896,15 +8984,26 @@ function announceChatToolsCompatibility(): void {
|
|
|
8896
8984
|
|
|
8897
8985
|
// ── chat (single-turn helper, non-TUI) ──
|
|
8898
8986
|
program
|
|
8899
|
-
.command('chat
|
|
8900
|
-
.description('Send one message in
|
|
8901
|
-
.option('--new', '
|
|
8902
|
-
.option('--
|
|
8987
|
+
.command('chat [text...]')
|
|
8988
|
+
.description('Send one message in a new session (or a continued one with --continue/--resume/--session) and print the reply')
|
|
8989
|
+
.option('--new', 'Start a new session (the default since 0.2.31 — kept for compatibility)')
|
|
8990
|
+
.option('--continue', 'Continue the active session instead of starting a new one')
|
|
8991
|
+
.option('--resume [id]', 'Continue a session: the given id (or unique prefix), or the active session when no id is given. A word after --resume that is not session-id shaped (hex uuid) is read as the prompt, not the id.')
|
|
8992
|
+
.option('--session <id>', 'Continue an explicit session (id or unique prefix). Overrides --new, --continue and --resume.')
|
|
8903
8993
|
.option('--json', 'Emit a single JSON line {sessionId, provider, model, reply, logPath, budget} instead of streaming text + ui.info trailer. Stable shape for LLM self-spawn.')
|
|
8904
8994
|
.option('--tools', 'Enable the tool-loop path (Read/Grep/Glob/ListDir/Edit/Write + Bash). Default off — chat is text-only by default for backward compatibility. `elanous agent` is a thin wrapper that flips this on.')
|
|
8905
8995
|
.option('--goal-loop', 'Arm the across-turn goal loop (runGoalLoop): wrap the tool-loop so the model keeps iterating until the goal is complete (GOAL-COMPLETE evidence gate) or maxIterations. Requires --tools. Same engine as ACP/dashboard (재발명 없음). Config `llm.goalLoop.enabled` also arms it.')
|
|
8906
8996
|
.option('--implement', 'Bypass the harness goal-loop guard for the legacy implementation child entrypoint')
|
|
8907
|
-
.action(async (
|
|
8997
|
+
.action(async (rawParts: string[], opts: { new?: boolean; continue?: boolean; resume?: string | boolean; session?: string; json?: boolean; tools?: boolean; goalLoop?: boolean; implement?: boolean }) => {
|
|
8998
|
+
// TUI-H8-FOLLOW ② — `chat --resume "질문"` 에서 Commander 가 질문 첫 낱말을 세션 id 로 먹지 않게.
|
|
8999
|
+
const { splitResumeArgument } = await import('./session/session-start.js');
|
|
9000
|
+
const split = splitResumeArgument(opts.resume, rawParts ?? [], 'chat', process.argv.slice(2));
|
|
9001
|
+
opts.resume = split.resume;
|
|
9002
|
+
const parts = split.parts;
|
|
9003
|
+
if (parts.length === 0) {
|
|
9004
|
+
console.error("error: missing required argument 'text'");
|
|
9005
|
+
process.exit(1);
|
|
9006
|
+
}
|
|
8908
9007
|
if (getHarnessSpace() && opts.tools && opts.goalLoop && !opts.implement) {
|
|
8909
9008
|
process.stderr.write('Harness chat goal-loop requires `dev --implement`; use that implementation entrypoint instead.\n');
|
|
8910
9009
|
process.exitCode = 1;
|
|
@@ -8947,7 +9046,7 @@ program
|
|
|
8947
9046
|
cfg: refreshed,
|
|
8948
9047
|
userText: text,
|
|
8949
9048
|
explicitSessionId: chat.session,
|
|
8950
|
-
reuseActive:
|
|
9049
|
+
reuseActive: chat.continueActive === true,
|
|
8951
9050
|
forceNew: chat.forceNew === true,
|
|
8952
9051
|
json: chat.json === true,
|
|
8953
9052
|
enableTools: chat.enableTools,
|
|
@@ -8959,8 +9058,10 @@ program
|
|
|
8959
9058
|
// ── repl (sticky multi-turn REPL) ──
|
|
8960
9059
|
program
|
|
8961
9060
|
.command('repl')
|
|
8962
|
-
.description('Sticky multi-turn REPL — same session across turns, no per-turn process boot. Drives chat / agent / scenario from one shell.
|
|
8963
|
-
.option('--new', '
|
|
9061
|
+
.description('Sticky multi-turn REPL — same session across turns, no per-turn process boot. Drives chat / agent / scenario from one shell. Boots a new session by default; --continue/--resume continue the active one, --session <id> resumes an explicit one, --scenario <yaml> for a scripted run, JSONL on stdin for piped automation.')
|
|
9062
|
+
.option('--new', 'Start a new session at boot (the default since 0.2.31 — kept for compatibility)')
|
|
9063
|
+
.option('--continue', 'Continue the active session at boot instead of starting a new one')
|
|
9064
|
+
.option('--resume [id]', 'Continue a session at boot: the given id (or unique prefix), or the active session when no id is given')
|
|
8964
9065
|
.option('--session <id>', 'Resume an explicit session (id or unique prefix)')
|
|
8965
9066
|
.option('--scenario <path>', 'Run a YAML multi-turn scenario before handing back to interactive (or exit)')
|
|
8966
9067
|
.option('--replay <session-id>', 'Re-execute the user prompts from a previous session in a fresh REPL run. User prompts are extracted in order and fed through the same dispatcher as --scenario; assistant/tool messages and attachments are dropped. Mutually exclusive with --scenario.')
|
|
@@ -8971,6 +9072,8 @@ program
|
|
|
8971
9072
|
.option('--stdin-jsonl', 'Force JSONL-on-stdin mode even when stdin is a TTY (useful for testing automation paths)')
|
|
8972
9073
|
.action(async (opts: {
|
|
8973
9074
|
new?: boolean;
|
|
9075
|
+
continue?: boolean;
|
|
9076
|
+
resume?: string | boolean;
|
|
8974
9077
|
session?: string;
|
|
8975
9078
|
scenario?: string;
|
|
8976
9079
|
replay?: string;
|
|
@@ -8995,8 +9098,9 @@ program
|
|
|
8995
9098
|
const exitAfterScenario = opts.exitAfterScenario === undefined ? exitDefault : opts.exitAfterScenario;
|
|
8996
9099
|
const code = await runRepl({
|
|
8997
9100
|
cfg: refreshed,
|
|
8998
|
-
initialSessionId: opts.session,
|
|
9101
|
+
initialSessionId: opts.session ?? (typeof opts.resume === 'string' ? opts.resume : undefined),
|
|
8999
9102
|
forceNew: opts.new === true,
|
|
9103
|
+
continueActive: opts.continue === true || opts.resume === true,
|
|
9000
9104
|
enableTools: opts.tools !== false,
|
|
9001
9105
|
scenarioPath: opts.scenario,
|
|
9002
9106
|
replaySessionId: opts.replay,
|
|
@@ -11428,7 +11532,14 @@ voiceCmd
|
|
|
11428
11532
|
});
|
|
11429
11533
|
|
|
11430
11534
|
// ── Default: Dashboard (no subcommand) ──
|
|
11431
|
-
const DASHBOARD_FLAGS = new Set(['--debug', '--chat-only', '--chat', '--yolo', '--benchmark']);
|
|
11535
|
+
const DASHBOARD_FLAGS = new Set(['--debug', '--chat-only', '--chat', '--yolo', '--benchmark', '--continue']);
|
|
11536
|
+
|
|
11537
|
+
/** 대표 #73 — `--resume` 뒤 토큰이 세션 id 인가(없거나 다른 플래그면 «id 없는 이어하기» = 최신 세션). */
|
|
11538
|
+
export function rootResumeIdAt(rawArgs: readonly string[], resumeFlagIdx: number): string | undefined {
|
|
11539
|
+
if (resumeFlagIdx < 0) return undefined;
|
|
11540
|
+
const next = rawArgs[resumeFlagIdx + 1];
|
|
11541
|
+
return next !== undefined && !next.startsWith('-') ? next : undefined;
|
|
11542
|
+
}
|
|
11432
11543
|
|
|
11433
11544
|
export function filterDashboardArgs(rawArgs: readonly string[], resumeFlagIdx?: number): string[] {
|
|
11434
11545
|
const rootResumeFlagIdx = resumeFlagIdx ?? rawArgs.findIndex((arg, index) =>
|
|
@@ -11443,7 +11554,8 @@ export function filterDashboardArgs(rawArgs: readonly string[], resumeFlagIdx?:
|
|
|
11443
11554
|
return rawArgs.filter((a, i) => {
|
|
11444
11555
|
if (!leadsWithSubcommand && (DASHBOARD_FLAGS.has(a) || a === '--rich')) return false;
|
|
11445
11556
|
if (!leadsWithSubcommand && i === rootResumeFlagIdx) return false;
|
|
11446
|
-
if (!leadsWithSubcommand && rootResumeFlagIdx >= 0 && i === rootResumeFlagIdx + 1
|
|
11557
|
+
if (!leadsWithSubcommand && rootResumeFlagIdx >= 0 && i === rootResumeFlagIdx + 1
|
|
11558
|
+
&& rootResumeIdAt(rawArgs, rootResumeFlagIdx) !== undefined) return false;
|
|
11447
11559
|
return true;
|
|
11448
11560
|
});
|
|
11449
11561
|
}
|
|
@@ -11608,6 +11720,15 @@ async function main(): Promise<void> {
|
|
|
11608
11720
|
// ⇒ 이제 규칙이 «문법»뿐이라(북마크 스토어를 안 본다) 인자도 없다.
|
|
11609
11721
|
rawArgs = stripRemoteFlags(rawArgs);
|
|
11610
11722
|
|
|
11723
|
+
// `elanous --name <name>` — 대시보드 TUI 의 자기 PTY 행(`tui:<pid>`) 별명. 루트 실행 플래그라
|
|
11724
|
+
// Commander «전»에 걷어낸다(하위 명령이 앞이면 손대지 않는다 — dashboard-name-flag.ts 머리말).
|
|
11725
|
+
const dashboardName = (await import('./cli/dashboard-name-flag.js')).readDashboardNameFlag(rawArgs);
|
|
11726
|
+
if (dashboardName.error) {
|
|
11727
|
+
console.error(dashboardName.error);
|
|
11728
|
+
process.exit(1);
|
|
11729
|
+
}
|
|
11730
|
+
rawArgs = dashboardName.args;
|
|
11731
|
+
|
|
11611
11732
|
// M2.4 — remote-daemon path. `ELANOUS_REMOTE=mbp.tailnet:31415` (or
|
|
11612
11733
|
// a full ws:// URL) makes the dashboard attach to a remote daemon
|
|
11613
11734
|
// instead of booting an in-process ACP pair. Token + no-auth
|
|
@@ -11632,13 +11753,32 @@ async function main(): Promise<void> {
|
|
|
11632
11753
|
// 🩹 옛 손버릇은 `readRemoteFlag` 쪽 오류 문면이 «갈 곳을 말해» 받는다.
|
|
11633
11754
|
arg === '--resume' && rawArgs.slice(0, index).every((prior) => prior.startsWith('-')),
|
|
11634
11755
|
);
|
|
11635
|
-
const resumeFromFlag =
|
|
11756
|
+
const resumeFromFlag = rootResumeIdAt(rawArgs, resumeFlagIdx);
|
|
11636
11757
|
// Step 5 PR γ — env read routes through readDeprecatedEnv so the
|
|
11637
11758
|
// user gets a one-shot deprecation warning when the env override
|
|
11638
11759
|
// drives the resume path. CLI flag wins outright (no warning).
|
|
11639
11760
|
const { readDeprecatedEnv: readDeprecatedEnvForResume } = await import('./control-client/env-resolver.js');
|
|
11640
|
-
|
|
11641
|
-
const
|
|
11761
|
+
// 대표 #73 — 인자 없는 `elanous` 는 새 세션. 이어하기는 `--resume <id>` · id 없는 `--resume` · `--continue`(= 최신 세션)일 때만.
|
|
11762
|
+
const leadsWithSubcommandForResume = rawArgs.length > 0 && !rawArgs[0]!.startsWith('-');
|
|
11763
|
+
const continueLatest = !leadsWithSubcommandForResume
|
|
11764
|
+
&& (rawArgs.includes('--continue') || (resumeFlagIdx >= 0 && resumeFromFlag === undefined));
|
|
11765
|
+
// 우선순위: `--resume <id>` > `--continue`·id 없는 `--resume`(최신) > (폐기 예정) ELANOUS_RESUME_SESSION.
|
|
11766
|
+
// ⛔ 명시 인자가 있으면 환경변수가 이기지 않는다(TUI-H8 r1 must-fix).
|
|
11767
|
+
const { resolveLatestSessionId, resolveRootResumeSessionId } = await import('./session/session-start.js');
|
|
11768
|
+
const rootResume = resolveRootResumeSessionId({
|
|
11769
|
+
...(resumeFromFlag !== undefined ? { flagId: resumeFromFlag } : {}),
|
|
11770
|
+
continueLatest,
|
|
11771
|
+
// 명시 인자가 있으면 env 를 «읽지도» 않는다(폐기 경고가 명시 이어하기에 섞이지 않게).
|
|
11772
|
+
readEnvId: () => readDeprecatedEnvForResume('ELANOUS_RESUME_SESSION').value ?? null,
|
|
11773
|
+
latest: () => resolveLatestSessionId({
|
|
11774
|
+
activeSessionId: () => getActiveSessionId(),
|
|
11775
|
+
latestSessionId: () => listSessions({ limit: 1 })[0]?.id ?? null,
|
|
11776
|
+
// TUI-H8-FOLLOW ① — 활성 표지가 사라진 세션이면 최신 세션으로(#28509 리뷰 should-fix).
|
|
11777
|
+
sessionExists: (id) => loadSession(id) !== null,
|
|
11778
|
+
}),
|
|
11779
|
+
});
|
|
11780
|
+
if (rootResume.source === 'continue-none') console.log('[elanous] --continue: 이어갈 세션이 없다 — 새 세션으로 시작한다');
|
|
11781
|
+
const resumeSessionId = rootResume.sessionId;
|
|
11642
11782
|
|
|
11643
11783
|
// user-config can opt into benchmark mode persistently
|
|
11644
11784
|
// (`dashboard.benchmark: true`) so callers don't have to retype the
|
|
@@ -11784,7 +11924,7 @@ async function main(): Promise<void> {
|
|
|
11784
11924
|
// dashboard the user is actually looking at. Off unless this boots
|
|
11785
11925
|
// (no producer in headless/daemon paths). fail-soft·비블로킹.
|
|
11786
11926
|
bootTimer.begin();
|
|
11787
|
-
try { (await import('./capture/tui-self-report.js')).startTuiSelfReport(); } catch { /* fail-soft */ }
|
|
11927
|
+
try { (await import('./capture/tui-self-report.js')).startTuiSelfReport(dashboardName.name ? { nickname: dashboardName.name } : {}); } catch { /* fail-soft */ }
|
|
11788
11928
|
bootTimer.phase('self-report');
|
|
11789
11929
|
|
|
11790
11930
|
// Dashboard handles sync inline — only returns on quit
|