elanous 0.2.29 → 0.2.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{cIpv5nU9AycwYWZI9H589 → LSXfY0u9QtfDbejY0Ukf_}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{058a98ba.7eb28d5e6dc03565.js → 0bb0ff36.b8d418980951e5ba.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +287 -0
- package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +62 -0
- package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6013-2f769370d8b4c2c6.js → 1335-6731f392c35216eb.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8332.6f0f49df772e163b.js → 1654.32de4b324981a188.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1834-50625904996a8fa8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{8795.32573a185af18c7b.js → 1913.7cc6fb6055b1ed3f.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{419.736c0d6f426249a7.js → 2001.6c7e0fd02190886c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2112-e4efc21a6505d5bc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6767.1fcfc9b8be83975f.js → 2213.2ccbada92c33ea0f.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2534.e85ae21ad0dac829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4759.1f76713aefb87db5.js → 2871.0bca6137343b3f76.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6776.06ff1e3b464cc607.js → 2898.fd781bc7cf01a7b7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1782-59db1b5aa06df38a.js → 2940-619bfd8ef337c611.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8471.8d2a8c74f09c36ff.js → 2985.39ccdecd36848b12.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +115 -0
- package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +64 -0
- package/apps/pwa/out/_next/static/chunks/{bc324b7c.02a09dd93f6a399b.js → 3267c0e6.d34854e7b3984a6e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3278.2e5d15b53a4091c8.js +2 -0
- package/apps/pwa/out/_next/static/chunks/{7725-4f83d5541fbdb81b.js → 3541-ce3a5424ed5ad7f1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3583.a05e88cc8d594628.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3902.e1e71aaac850a045.js +34 -0
- package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{46bd8bea.2f4b4099172fcdb7.js → 409f1e57.d0649fc47691ebfe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4111.2bfedbb233ad206b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1142.65d002789ab3af7d.js → 4174.92ed04922709ac9e.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +36 -0
- package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +286 -0
- package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +77 -0
- package/apps/pwa/out/_next/static/chunks/4745.67d6f99c245af3f7.js +226 -0
- package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4999.c064a4000c2a9e94.js +79 -0
- package/apps/pwa/out/_next/static/chunks/5173-233188df2f42c626.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5304.04d24756f242a094.js +148 -0
- package/apps/pwa/out/_next/static/chunks/5307.60f2209e809bd627.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3396-97b97928c49190c9.js → 5458-16cd7a2b51b74c8c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3403.7199205e65124486.js → 5525.86debf231e181813.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9143.ff14585db1d275ff.js → 5543.a438b8ab5a13ea47.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +74 -0
- package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +94 -0
- package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8398.73a19b39715eda04.js → 6092.a7f99e68b188ca66.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/60fb96c9.360b01d8d4927b7b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5591.a35e7a217734a8b9.js → 6157.0c9af021de4fb31b.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6323.8672b4817a306928.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7375.050ea0d72968e49f.js → 6433.fc573af22bbc9ab7.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +90 -0
- package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6544cb48.a87fe20ddf137be2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +104 -0
- package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6767.ea607cf0c20a25af.js +24 -0
- package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +93 -0
- package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7371.80c05c653b08e907.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7391.ebae168025c91b6a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1852.7f7b53991fcb99ef.js → 7502.ccd5b8065545edd0.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +8 -0
- package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6534.1ab00f370db7b105.js → 7862.30a8d6482bb238eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7947-d0759430f8042240.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{285adb1a.5654e605dddf86d2.js → 7a1887c4.f36b88fba31da8fd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8018.a32663f04a6fc5f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8097-92f87bd108322f66.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +1 -0
- package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9002.e5658224e3dc1b6f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1516.dfaceff3fd2d0e0d.js → 9138.b6e80031afb1d973.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9907.49be0fcadaf214b5.js → 9221.7d22eaf353a2d4e7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8767-2f6a634f5abeaa01.js → 9279-d28c5b7754d010ae.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3160-95c96f4d2a21dd26.js → 9398-6aed28f0a96d0d6f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9407.e49124dedf0f5e72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{328bb3ab-6628a1114fe3fb3b.js → 997ce8a5-2ad501927003b41b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6853.cc5174a9dee59593.js → 9989.3694300e5f000b14.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-bf3634a117322df7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-3535a4a69f1fafaa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-b9f51447f757fbf2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-a5635eba0d73b84e.js → page-2ebb8fd59b9461f9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-a2fc4e49a4fa4ba8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-5a503541353e60a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-6025101384e361a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f4b630cc8b5273cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-a645f00a06483e9a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-61ac22cbab1ee4ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e9bab7413b028b28.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c992eafe028b642e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-e547e6ce55f1fb33.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-d27e1b9850fd54bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-805ac2e137b7a121.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-0fec29c7ba01894b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-339a07410cd6f36b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-349f2752d8cd37ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d5c6dcf31c25cecc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2fd93ed8c9f16580.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-9b564dbff0fefc35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-62f4475d3c38fb9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-814ba51385225776.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-397d479626e5a459.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-af1bba4e3251b728.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ad3be5e7d3fdce9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-f219ccdbc0bf27df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4da93ad35d4a8d28.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-456666766e5ce6fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-7404e377e8adb8c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-14456240ed2a36ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-3a658d5fa6d16a25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-0157de6e85f8bb6b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-0a07363b130182a1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-841d73d4ac44ed49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6f43a3d1146e6377.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/{page-29900ed0011b2c83.js → page-521ee23ac8c0abfa.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9992ee285efaa83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-3d48e85fa89ec04f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d2ced71132fac9b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-f08358bdf251adb9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-233c71cd5f68f0d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-70151d78de2f375e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-dcac33a3e2cb72c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/{page-9f92737b8766009a.js → page-149dc1caba411bb9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0448145ccd5c45c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-9cb0c444903da65d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-17e504c396e0e389.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{425cfc4d.fb91158e3971c39f.js → b313b242.cb1265eea908db61.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +122 -0
- package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +1 -0
- package/apps/pwa/out/_next/static/chunks/ebc7d829.264a0bcb6c750b50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +1 -0
- package/apps/pwa/out/_next/static/css/{72becfd42807b50d.css → 3f5fc6f96e2cf7b2.css} +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/bin/elanous.mjs +7 -3
- package/graphs/context/nightly-condense.yaml +1 -0
- package/graphs/intake/intake-daily.yaml +8 -1
- package/graphs/intake/recipes.yaml +5 -0
- package/graphs/lecture/lecture-note.yaml +2 -2
- package/graphs/ops/harness-gc.yaml +1 -0
- package/graphs/release/recipes.yaml +3 -0
- package/graphs/release/release-loop.yaml +9 -5
- package/graphs/units/recipes.yaml +3 -0
- package/graphs/units/release-gate-recheck.yaml +15 -0
- package/package.json +2 -1
- package/scripts/check-native-tool-wiring.ts +3 -2
- package/scripts/ci-android-unit-tests.ts +16 -0
- package/scripts/ci-typecheck-changed.ts +37 -9
- package/scripts/coord-channel-watch.sh +22 -16
- package/scripts/coord-role-pack.ts +81 -2
- package/scripts/cron-run.ts +96 -3
- package/scripts/detect-test-interference.ts +38 -5
- package/scripts/gate-pr-cache.ts +65 -0
- package/scripts/gh-surface/capture.ts +126 -0
- package/scripts/gh-surface/gh +40 -0
- package/scripts/import-graph-scc.ts +38 -0
- package/scripts/install.ps1 +19 -0
- package/scripts/intake-social.ts +181 -0
- package/scripts/lecture-note/node.ts +71 -4
- package/scripts/lib/android-toolchain.ts +32 -0
- package/scripts/lib/deterministic-env.ts +62 -0
- package/scripts/lib/gate-test-env.ts +19 -0
- package/scripts/measure-goal-grounding-corpus.ts +2 -1
- package/scripts/ratchets/test-interference-patterns.allowlist.txt +257 -0
- package/scripts/ratchets/test-interference-patterns.ts +367 -0
- package/scripts/release-loop/cut-branch.ts +4 -3
- package/scripts/release-loop/export-check-node.ts +0 -1
- package/scripts/release-loop/fixtures/warm-failure-assertion/sample.junit.xml +8 -0
- package/scripts/release-loop/fixtures/warm-job-029/sample.json +1 -0
- package/scripts/release-loop/fixtures/warm-job-029/sample.junit.xml +10 -0
- package/scripts/release-loop/gate-closure.ts +12 -8
- package/scripts/release-loop/gate-diff.ts +1 -1
- package/scripts/release-loop/gate-host-mirror.ts +66 -0
- package/scripts/release-loop/gate-node.ts +523 -75
- package/scripts/release-loop/gate-partial.ts +106 -9
- package/scripts/release-loop/gate-pr-cache.ts +66 -0
- package/scripts/release-loop/gate-prewarm-plan.ts +66 -0
- package/scripts/release-loop/gate-r2-verdict.ts +189 -0
- package/scripts/release-loop/gate-recheck-plan-node.ts +52 -0
- package/scripts/release-loop/gate-warm-artifacts.ts +253 -0
- package/scripts/release-loop/import-graph-scc-run.ts +54 -0
- package/scripts/release-loop/import-graph-scc.ts +215 -0
- package/scripts/release-loop/node-verdict.ts +2 -0
- package/scripts/release-loop/probe-pod-host-dirs-live.ts +113 -0
- package/scripts/release-loop/resume-release.ts +33 -4
- package/scripts/release-loop/resume.ts +13 -5
- package/scripts/release-loop/spawn-lane.ts +2 -19
- package/scripts/release-loop/tui-sim-node.ts +3 -2
- package/scripts/release-loop/unattended-release.ts +16 -0
- package/scripts/test-deterministic.ts +5 -61
- package/scripts/train-reach-grouping.ts +48 -0
- package/scripts/tsc-incremental-cache.ts +86 -0
- package/scripts/tsc-incremental-diagnostics.ts +76 -0
- package/scripts/tsc-main-safety-net.ts +2 -2
- package/src/acp/client.ts +4 -1
- package/src/acp/core-turn-bridge.ts +50 -5
- package/src/ad-pipeline/run.ts +4 -2
- package/src/agent/runner.ts +169 -3
- package/src/agent/subagent-callable.ts +3 -2
- package/src/agent-mission/review-loop.ts +6 -3
- package/src/agent-substrate/acp-implementer.ts +14 -2
- package/src/agent-substrate/pr-reviewer.ts +12 -0
- package/src/agent-substrate/self-review-cli.ts +30 -4
- package/src/autopilot/pr-manager.ts +62 -7
- package/src/briefing/brief-items.ts +24 -22
- package/src/capture/tui-self-report.ts +15 -0
- package/src/chat/chat-cli.ts +10 -2
- package/src/chat/index.ts +77 -11
- package/src/chat/input-control-key.ts +5 -3
- package/src/chat/tool-interrupt-behavior.ts +38 -0
- package/src/chat/tool-render/dispatch.ts +5 -1
- package/src/chat/turn-typeahead.ts +75 -20
- package/src/cli/__fixtures__/agent-help-before/agent.txt +4 -2
- package/src/cli/agent-cli.ts +41 -13
- package/src/cli/config-audit.ts +123 -0
- package/src/cli/decisions-cli.ts +80 -6
- package/src/cli/log-event-names.ts +7 -0
- package/src/cli/mcp-login.ts +21 -5
- package/src/cli/msg-cli.ts +88 -0
- package/src/cli/pr-cli.ts +214 -57
- package/src/cli/pr-land-heavy-remote.ts +2 -2
- package/src/cli/pr-land-overlap-evidence.ts +63 -9
- package/src/cli/pr-land-pod-shadow-job.ts +83 -0
- package/src/cli/pr-land-pod-shadow.ts +16 -3
- package/src/cli/pr-land-virtual-rebase.ts +108 -0
- package/src/cli/release-cli.ts +80 -14
- package/src/cli/seat-cli.ts +138 -3
- package/src/cli/self-update.ts +5 -2
- package/src/cli/tasks-cli.ts +97 -19
- package/src/context-bus/context-first.ts +13 -0
- package/src/context-bus/context-now.ts +13 -2
- package/src/context-bus/ops-events.ts +75 -0
- package/src/control-plane/lease-holder.ts +12 -8
- package/src/control-plane/ledger.ts +163 -4
- package/src/control-plane/server.ts +91 -11
- package/src/core-turn/run-core-turn.ts +1 -0
- package/src/core-turn/run-goal-loop.ts +222 -3
- package/src/core-turn/seat-turn-cap.ts +79 -0
- package/src/core-turn/short-question.ts +38 -6
- package/src/core-turn/types.ts +3 -0
- package/src/dashboard/acp-boot.ts +3 -0
- package/src/dashboard/index.ts +224 -615
- package/src/dashboard/input/chat-main-entry-runtime.ts +1 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +4 -1
- package/src/dashboard/input/chat-main-session.ts +8 -1
- package/src/dashboard/input/chat-main-turn.ts +12 -3
- package/src/dashboard/input/compact-prepass-recovery.ts +33 -0
- package/src/dashboard/input/external-input-host.ts +26 -0
- package/src/dashboard/input/internal-turn.ts +261 -0
- package/src/dashboard/input/seat-autowake.ts +318 -0
- package/src/dashboard/input/turn-steer-bridge.ts +70 -0
- package/src/dashboard/loop-scheduler.ts +72 -0
- package/src/dashboard/seat-boot-preamble.ts +18 -0
- package/src/dashboard/skill-runtime.ts +2 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +126 -1181
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -1
- package/src/dashboard/slash-runtime/index.ts +13 -0
- package/src/dashboard/turn-busy-teardown.ts +50 -0
- package/src/decisions/decision-ledger.ts +45 -4
- package/src/discord-self-message.ts +4 -4
- package/src/domains/release-tool.ts +18 -1
- package/src/field-note/transcribe.ts +17 -0
- package/src/github/remote-call.ts +81 -0
- package/src/goals/registry.ts +46 -6
- package/src/goals/types.ts +7 -1
- package/src/graph-runner/runner.ts +1 -0
- package/src/grok/credential.ts +26 -0
- package/src/harness/harness-clean.ts +2 -1
- package/src/harness/harness-cli-command.ts +52 -5
- package/src/harness/harness-gc.ts +2 -1
- package/src/harness/harness-incidents.ts +57 -20
- package/src/harness/harness-pod-dispatch.ts +87 -10
- package/src/harness/harness-queue.ts +53 -4
- package/src/harness/harness-stop.ts +4 -3
- package/src/harness/harness-substrate-default.ts +78 -7
- package/src/harness/harness-worktree-auto.ts +2 -1
- package/src/harness/harness-worktrees.ts +3 -2
- package/src/hooks/dispatch.ts +2 -1
- package/src/index.ts +152 -25
- package/src/input/external-input-queue.ts +33 -1
- package/src/intake-plane/slash.ts +14 -3
- package/src/keybindings.ts +4 -1
- package/src/llm/tool-loop-steered-rejection.ts +33 -0
- package/src/llm.ts +138 -19
- package/src/loops/consensus.ts +348 -0
- package/src/loops/msg-wake.ts +206 -4
- package/src/loops/observe.ts +19 -3
- package/src/loops/orchestrator/tick.ts +64 -10
- package/src/loops/orchestrator/traffic.ts +64 -1
- package/src/loops/registry.ts +30 -0
- package/src/market/signed-index.ts +14 -0
- package/src/mcp/mcp-oauth.ts +54 -5
- package/src/models/prompts.ts +28 -0
- package/src/msg/msg-sse-client.ts +223 -0
- package/src/msg/msg-store.ts +86 -2
- package/src/mss/logging/log-store.ts +225 -1
- package/src/nexus/DAEMON-THIN-inventory-2026-10-15.md +122 -0
- package/src/nexus/api/http-server.ts +54 -15
- package/src/nexus/api/loop-resources.ts +19 -3
- package/src/nexus/api/ops-api.ts +11 -0
- package/src/nexus/daemon-thin-inventory.md +37 -0
- package/src/nexus/index.ts +70 -0
- package/src/nexus/state/state.ts +1 -0
- package/src/oauth/store.ts +32 -7
- package/src/onboarding/first-run.ts +28 -3
- package/src/ops/overview-cache.ts +16 -4
- package/src/ops/resources.ts +82 -0
- package/src/plugins/maker/connector-maker.ts +41 -0
- package/src/plugins/maker/skill-maker.ts +42 -0
- package/src/pr-tool/census.ts +288 -0
- package/src/prompt-library/chat-conciseness.ts +13 -0
- package/src/prompt-library/universal-preamble.ts +10 -5
- package/src/release-loop/gate-host-reservation.ts +97 -0
- package/src/release-loop/landing-freeze.ts +5 -0
- package/src/release-loop/light-rc.ts +5 -2
- package/src/release-loop/placement.ts +92 -1
- package/src/release-loop/rehearsal-shard-plan.ts +149 -0
- package/src/release-loop/rehearsal.ts +73 -17
- package/src/repl/index.ts +20 -2
- package/src/seat-loop/seat-knowhow.ts +282 -0
- package/src/seat-loop/seat-loop.ts +41 -2
- package/src/seat-loop/traffic-signal.ts +3 -0
- package/src/self-dev/ask-launch-flow.ts +24 -3
- package/src/self-dev/decompose-compose-graph.ts +28 -27
- package/src/self-dev/decompose-proposal.ts +53 -38
- package/src/self-dev/decompose.ts +17 -0
- package/src/self-dev/dev-pipeline.ts +31 -2
- package/src/self-dev/draft-residue.ts +24 -9
- package/src/self-dev/draft-sweep.ts +59 -4
- package/src/self-dev/external-call-zero.ts +77 -0
- package/src/self-dev/launch-preflight-text.ts +6 -0
- package/src/self-dev/launch-preflight.ts +25 -3
- package/src/self-dev/local-supervisor-judge.ts +185 -0
- package/src/self-dev/run-supervisor.ts +229 -19
- package/src/self-dev/run-types.ts +20 -0
- package/src/self-dev/shard-aggregate.ts +13 -2
- package/src/self-dev/shard-plan.ts +47 -0
- package/src/self-dev/shard-run.ts +112 -10
- package/src/self-dev/spawn-lane-files.ts +19 -0
- package/src/self-implement/app-api-budget.ts +51 -11
- package/src/self-implement/config-gate.ts +2 -1
- package/src/self-implement/expose-gate.ts +2 -1
- package/src/self-implement/gate-artifacts.ts +405 -0
- package/src/self-implement/gate-cli.ts +201 -16
- package/src/self-implement/gate-remote.ts +110 -25
- package/src/self-implement/gate-scenario.ts +85 -0
- package/src/self-implement/goal-author.ts +160 -8
- package/src/self-implement/graph-authority.ts +38 -6
- package/src/self-implement/graph-overlay-condition.ts +92 -1
- package/src/self-implement/heal-triage.ts +79 -0
- package/src/self-implement/host-regate.ts +61 -3
- package/src/self-implement/orchestrator.ts +14 -123
- package/src/self-implement/pr-title.ts +123 -0
- package/src/self-implement/run-checkpoint.ts +235 -0
- package/src/self-implement/run-ledger.ts +155 -10
- package/src/self-implement/run-stop.ts +4 -3
- package/src/self-implement/run-ttl.ts +28 -4
- package/src/self-implement/seams.ts +2 -0
- package/src/self-implement/shadow-stage.ts +7 -6
- package/src/self-implement/stop-autoheal.ts +2 -1
- package/src/self-implement/train-gate-remote.ts +37 -8
- package/src/self-implement/train-reach-grouping.ts +157 -0
- package/src/self-implement/train-scenario-layers.ts +133 -0
- package/src/self-implement/uncommitted-work.ts +2 -0
- package/src/session/pending-input.ts +19 -0
- package/src/session/session-start.ts +224 -0
- package/src/session-runtime/parallel-dispatch.ts +22 -5
- package/src/skills/tools/dev-harness.ts +6 -4
- package/src/skills/tools/shell.ts +1 -1
- package/src/steward/resync-tick.ts +114 -23
- package/src/steward/ta-repair-event-collect.ts +158 -0
- package/src/task-agent/card-evidence.ts +25 -1
- package/src/task-agent/green-sweep.ts +8 -3
- package/src/task-agent/judge.ts +76 -0
- package/src/task-agent/land-queue.ts +79 -0
- package/src/task-agent/live-moves.ts +30 -9
- package/src/task-agent/postland-card.ts +5 -0
- package/src/task-agent/prelaunch-already-done.ts +98 -0
- package/src/task-agent/real-launch-guard.ts +37 -0
- package/src/task-agent/rejudge-on-head.ts +89 -12
- package/src/task-agent/remote-rejudge-bind.ts +28 -8
- package/src/task-agent/repair-cycle.ts +45 -7
- package/src/task-agent/repair-worker.ts +7 -0
- package/src/task-agent/run-identity.ts +200 -0
- package/src/task-agent/shadow.ts +50 -3
- package/src/task-agent/task-hand.ts +158 -5
- package/src/task-agent/train-landing.ts +77 -0
- package/src/task-agent/work-order.ts +104 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +88 -28
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +88 -19
- package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-image-source.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-install-slots.ts +121 -9
- package/src/task-orchestrator/surfaces/pod-lease.ts +20 -6
- package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +169 -0
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +27 -0
- package/src/task-orchestrator/surfaces/pod-result-marker-wait.ts +33 -0
- package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +63 -0
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +19 -3
- package/src/task-orchestrator/surfaces/pod-warm-switch.ts +141 -0
- package/src/task-orchestrator/surfaces/pod-warm-ta-shadow.ts +85 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +153 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +208 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +132 -15
- package/src/telegram.ts +2 -4
- package/src/tui/input/pickers.ts +732 -0
- package/src/tui/slash/mission.ts +492 -0
- package/src/tui/slash/term.ts +877 -0
- package/src/tui-client/dashboard-session.ts +9 -0
- package/src/tui.ts +48 -0
- package/src/user-config/gemini-server-tools.ts +9 -0
- package/src/user-config.ts +53 -16
- package/src/util/spawn-sync-output.ts +7 -0
- package/src/ux-sim/fake-bin.ts +154 -0
- package/src/ux-sim/fake-clock.ts +36 -0
- package/src/ux-sim/headless-tui.ts +72 -0
- package/src/ux-sim/in-process-cli.ts +2 -1
- package/src/ux-sim/temp-git-remote.ts +82 -0
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/recipes/vlog.ts +25 -7
- package/apps/pwa/out/_next/static/chunks/1015-9cba22a5a4554797.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1084-4e66af7376a18db7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1106.3a6410b7b0c70ad4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1127.32fc642f70423506.js +0 -8
- package/apps/pwa/out/_next/static/chunks/1189-d9b8e1995a831fae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1224.6da98c7ad0eb7dd8.js +0 -34
- package/apps/pwa/out/_next/static/chunks/1370.4e3e2558f111fd5d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1514-b7da377fdc4eb17a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1577.3c24c32584e10d70.js +0 -286
- package/apps/pwa/out/_next/static/chunks/161.130a569855c4d68c.js +0 -24
- package/apps/pwa/out/_next/static/chunks/1864.16da9556e78a9236.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1b6f6b2a.aff090122be3726e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2341.e8a9135e5b910dd5.js +0 -36
- package/apps/pwa/out/_next/static/chunks/257.10afdbe3520f2fc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2658.87550e692dc493f6.js +0 -64
- package/apps/pwa/out/_next/static/chunks/2673.85e2f02efae7a85f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2766-bee623b37472ed63.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2794.6d836872b0bf43e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2806.eb57ced1a528ed39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/283.7a121c4910e6dad7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2870.1dc29aa5fc01f09f.js +0 -115
- package/apps/pwa/out/_next/static/chunks/293.fd38e77ce5d48103.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2993-5952a1cd3fd5d441.js +0 -1
- package/apps/pwa/out/_next/static/chunks/32-a523427c5bd5ed00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280.af38002a6424a905.js +0 -90
- package/apps/pwa/out/_next/static/chunks/3292-5ddffdb2f517b44f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3523.d3231daaf7aba993.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3763.577de3181e1e6ea0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4138-cc56b0938ef72783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4255-8350c43d307a8875.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4352.a4954693499c2714.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4421-f2dcbc6fd80ec013.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4513-51b94aeee37c9905.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4928-c3b72f99aa588699.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4986-f9fc0283fb325219.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5014.671a7b9f69c2b7b1.js +0 -94
- package/apps/pwa/out/_next/static/chunks/5137.d398e24710b3feb6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5298.0bea74885cabe754.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5315.74c53a39739b11c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5317-8b1df8d02105cd07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5358-33051f41a2b239af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5388.a2ec02501f714ad5.js +0 -62
- package/apps/pwa/out/_next/static/chunks/5395.e6ac948a2d15058d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5409-f282bf533c151849.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5466.d0f4aba9d52acfa8.js +0 -27
- package/apps/pwa/out/_next/static/chunks/5564.3d28b353470fe305.js +0 -104
- package/apps/pwa/out/_next/static/chunks/569.b0cbfb4dee4a167a.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5835-72465b73a8bb8d74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5941.045d6093139e1f7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6228.47cabb83564dfe54.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6457-8d1993002a87d0fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6513.ef54cfae52351982.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6582.13d245bf87df69f1.js +0 -148
- package/apps/pwa/out/_next/static/chunks/6655.c33f6acc2c61bb89.js +0 -149
- package/apps/pwa/out/_next/static/chunks/6731-9d7195af289c8d4c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6733.0be05b1db9279fc5.js +0 -79
- package/apps/pwa/out/_next/static/chunks/6742-90937146253a8b9e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/687-816858f77a396a4e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6888.72c7b8cfb02a7e61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6993.c17c828ac3ef3253.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7076.9f27ef666b0cefdd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7113.1403c5d451804e8c.js +0 -287
- package/apps/pwa/out/_next/static/chunks/7169.9dd603c726c2cd7c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7247-e3ec21f761f86710.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7261-a47b72f96f5199df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7335-5cda81ac90310077.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7356-c2e4af090546e2d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/738-59518742078fda71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7385.a7375f10db73243a.js +0 -77
- package/apps/pwa/out/_next/static/chunks/7445.cf1cf2fe109bcd96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7505.a2057432ab6ef99a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7515.31f45fac1f9c70cb.js +0 -74
- package/apps/pwa/out/_next/static/chunks/7658-d4ce8c72a9548a91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8107-0b1ae46bc5bcb788.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8132.bfea2f016ce8d992.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8672.e299832bc7d18ee2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8735.f1ef798a5f260f6f.js +0 -226
- package/apps/pwa/out/_next/static/chunks/8774-88f67f7d8d53d299.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8782.252e5a405d86e4ed.js +0 -32
- package/apps/pwa/out/_next/static/chunks/909-9ed7aa0dba804316.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9100.22b0301256827007.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9140-dde77575570bc71e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9292-a7ad9a01c7044b93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9517.00627dc51b02821c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9725.dcbb585652d8e9c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9761.a3ebf5c389c24ddc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9972.834d2b2b7d48f1ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9995-1a90486f5ae01546.js +0 -1
- package/apps/pwa/out/_next/static/chunks/a435ad95.577add051b4facb2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-83372d8b5863ebf7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d69256d7613c140a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-352c5e9ba3f9b858.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-69f1d725524201a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ad9181d84285e4ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-86feb08080261a2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-ffa15987e4756d03.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-11a3ab44ac327cc1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-6309b11c4264d24d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-8800472079612e87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-d387bf3f2301882a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-048f88d8c8658da6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6c14f9739b7f6880.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-2834f44f64e98d74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-83372d8b5863ebf7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-a13df6f88e824887.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-8a4397248754cf2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-daf0bd329360a336.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-f7ef1c28764cb476.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-61e74f28b9353dac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-8aaa6dedc4c10dfb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-294602ba649be829.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-5fa5f41ed3fce323.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-33bf667a5fb297bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-5ae3cbd6e5dba515.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-eb867d16ad6fdede.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1ab789fa68682f7e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6fd41b5b6ff13a71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fb3d5f7642c99fba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-70f705b2b5ed42ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-c9c93b358a7667b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1563c556b81c96ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ce89c20c45b3a673.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-423ae63d786f4ee9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-591a5378a4c4447c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-a250496b19a5824b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-c36a9277febc5911.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-83372d8b5863ebf7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a5de57edc6d7f942.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-16bdd4c9f40498df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-75e946e6e71cc6d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-9eb56166774eb256.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-1c5f9ef35dbb22c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-657ff9985e508498.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-22dc72499da68fb2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-094ad334e40f8169.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-8bcd379852ff6287.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-6b04413f280cd344.js +0 -1
- package/apps/pwa/out/_next/static/chunks/de70ab42-d28d47437208d458.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f800c5e3.46dbd7f2af8c3fce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f8bc19ad.47579f6d684b0760.js +0 -122
- package/apps/pwa/out/_next/static/chunks/framework-ca9ac4609fb9fed8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-0dd08d32d15a030f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-f0399d33955c4e01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-d42caca6f8ac2211.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-42e713c13aa41ca8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-8fbf8f61a377aa16.js +0 -1
- /package/apps/pwa/out/_next/static/{cIpv5nU9AycwYWZI9H589 → LSXfY0u9QtfDbejY0Ukf_}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,732 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI-DIET-SEAM-PICKERS — the five input pickers that used to live as
|
|
3
|
+
* closures inside `showDashboard` (src/dashboard/index.ts):
|
|
4
|
+
*
|
|
5
|
+
* - openAgentRosterSearch — `/` over the agent roster
|
|
6
|
+
* - openTransferPicker — browser → ssh / iphone transfer target
|
|
7
|
+
* - openFinderPicker — Ctrl+T file finder (+ Ctrl+/ · Ctrl+_ · Ctrl+] preview bindings)
|
|
8
|
+
* - openDirectoryPicker — Alt+C directory finder
|
|
9
|
+
* - openSshPicker — Ctrl+K SSH host picker
|
|
10
|
+
*
|
|
11
|
+
* Pure move: the bodies are unchanged except that dashboard-owned
|
|
12
|
+
* mutable state is reached through `deps.state` (live get/set accessors
|
|
13
|
+
* owned by the dashboard — never a value copy). Everything else the
|
|
14
|
+
* bodies captured is passed in once as an explicit dependency.
|
|
15
|
+
*
|
|
16
|
+
* ⛔ This module must not import src/dashboard/index.ts (cycle).
|
|
17
|
+
*/
|
|
18
|
+
import { homedir } from 'node:os';
|
|
19
|
+
import { C, termSize } from '../../tui.js';
|
|
20
|
+
import { createSearchModal, type SearchModalHandle, type SearchItem } from '../../chat/search/modal.js';
|
|
21
|
+
import { globalAgentRegistry } from '../../agent/registry.js';
|
|
22
|
+
import { attachSurfaceToWorkspace } from '../../display/workspace-affinity.js';
|
|
23
|
+
import type { DisplayCoordinator } from '../../display/coordinator.js';
|
|
24
|
+
import type { AgentSurfaceStore } from '../../display/agent-surface.js';
|
|
25
|
+
import { resolveBrowserTransferCapability } from '../../browser-pane/capabilities.js';
|
|
26
|
+
import { listTransferTargets, type TransferTarget } from '../../transfer/transfer-targets.js';
|
|
27
|
+
import { createTransferPickerModal } from '../../transfer/transfer-picker-modal.js';
|
|
28
|
+
import { scanFinder as defaultScanFinder, relativizeResults } from '../../finder/finder-scan.js';
|
|
29
|
+
import { scanRemoteFinder as defaultScanRemoteFinder, relativizeRemoteResults } from '../../finder/finder-scan-remote.js';
|
|
30
|
+
import { createFinderModal, type FinderItem } from '../../finder/finder-modal.js';
|
|
31
|
+
import { getSessionCwd } from '../../session/working-dir.js';
|
|
32
|
+
import { showPreviewModal } from '../../dashboard/modals/preview.js';
|
|
33
|
+
import { createSshPickerModal } from '../../ssh/ssh-picker-modal.js';
|
|
34
|
+
import { touchSshHost, type SshHost } from '../../ssh/ssh-hosts.js';
|
|
35
|
+
import { refreshRemoteWorkingDir, enterRemoteDirectory } from '../../ssh/remote-browser.js';
|
|
36
|
+
import {
|
|
37
|
+
type BrowserPaneModel,
|
|
38
|
+
refreshWorkingDir,
|
|
39
|
+
enterDirectory,
|
|
40
|
+
type WorkingDirState,
|
|
41
|
+
} from '../../working-dir/index.js';
|
|
42
|
+
import type { PaneFocus } from '../../workspace-types.js';
|
|
43
|
+
import type { ThemeTokens } from '../../theme/tokens.js';
|
|
44
|
+
import type { DashboardFinderFeedbackRuntime } from '../../dashboard/finder-feedback-runtime.js';
|
|
45
|
+
import type { createDashboardTransferFeedbackRuntime } from '../../dashboard/transfer-feedback-runtime.js';
|
|
46
|
+
|
|
47
|
+
type TransferFeedbackRuntime = ReturnType<typeof createDashboardTransferFeedbackRuntime>;
|
|
48
|
+
|
|
49
|
+
/** Dashboard-owned mutable state. Implemented by the dashboard as live
|
|
50
|
+
* get/set accessors so a write here is the dashboard's write. */
|
|
51
|
+
export interface InputPickersState {
|
|
52
|
+
agentSearchModal: SearchModalHandle | null;
|
|
53
|
+
agentSearchHandle: { dispose: () => void } | null;
|
|
54
|
+
agentRosterCursor: number;
|
|
55
|
+
agentCursorLockedId: string;
|
|
56
|
+
agentCursorManual: boolean;
|
|
57
|
+
chatScrollOffset: number;
|
|
58
|
+
readonly chatLines: string[];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface InputPickersDeps {
|
|
62
|
+
state: InputPickersState;
|
|
63
|
+
display: DisplayCoordinator;
|
|
64
|
+
agentSurfaceStore: AgentSurfaceStore;
|
|
65
|
+
workingDir: WorkingDirState;
|
|
66
|
+
dockedPreview: Parameters<typeof refreshRemoteWorkingDir>[2];
|
|
67
|
+
transferFeedbackRuntime: Pick<
|
|
68
|
+
TransferFeedbackRuntime,
|
|
69
|
+
'onNoFilesToTransfer' | 'onTransferDisabled' | 'onNoTransferTargets'
|
|
70
|
+
>;
|
|
71
|
+
finderFeedbackRuntime: Pick<
|
|
72
|
+
DashboardFinderFeedbackRuntime,
|
|
73
|
+
| 'onFinderScanStarted'
|
|
74
|
+
| 'onFinderScanCompleted'
|
|
75
|
+
| 'onFinderScanEmpty'
|
|
76
|
+
| 'onSshConnectStarted'
|
|
77
|
+
| 'onSshConnectSucceeded'
|
|
78
|
+
| 'onSshConnectFailed'
|
|
79
|
+
>;
|
|
80
|
+
currentThemeTokens: () => ThemeTokens;
|
|
81
|
+
currentWorkspaceOwnerId: () => string;
|
|
82
|
+
activeBrowserWidgetId: () => string;
|
|
83
|
+
resolveBrowserStateById: (browserId?: string | null) => BrowserPaneModel | null;
|
|
84
|
+
fmtBytes: (n: number) => string;
|
|
85
|
+
runTransfer: (
|
|
86
|
+
target: TransferTarget,
|
|
87
|
+
files: Array<{ localPath: string; size?: number }>,
|
|
88
|
+
) => Promise<void>;
|
|
89
|
+
/** Existing dashboard closure — passed in, not moved. */
|
|
90
|
+
closeAgentRosterSearch: () => void;
|
|
91
|
+
pushDebugLine: (line: string) => void;
|
|
92
|
+
refreshRemotePreviewBridge: () => Promise<void>;
|
|
93
|
+
refreshWorkingDirPreview: (opts?: { force?: boolean }) => void;
|
|
94
|
+
setWorkingFocus: (next: PaneFocus, reason?: string) => void;
|
|
95
|
+
startRemoteModeBridge: (host: SshHost, cwd?: string) => void;
|
|
96
|
+
draw: () => void;
|
|
97
|
+
/** Scan seams — default to the real fd/ssh scanners. Tests inject fakes. */
|
|
98
|
+
scanFinder?: typeof defaultScanFinder;
|
|
99
|
+
scanRemoteFinder?: typeof defaultScanRemoteFinder;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export interface InputPickers {
|
|
103
|
+
openAgentRosterSearch(): void;
|
|
104
|
+
openTransferPicker(
|
|
105
|
+
files: Array<{ localPath: string; size?: number }>,
|
|
106
|
+
browserId?: string,
|
|
107
|
+
): void;
|
|
108
|
+
openFinderPicker(): Promise<void>;
|
|
109
|
+
openDirectoryPicker(): Promise<void>;
|
|
110
|
+
openSshPicker(): void;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function createInputPickers(deps: InputPickersDeps): InputPickers {
|
|
114
|
+
const {
|
|
115
|
+
state,
|
|
116
|
+
display,
|
|
117
|
+
agentSurfaceStore,
|
|
118
|
+
workingDir,
|
|
119
|
+
dockedPreview,
|
|
120
|
+
transferFeedbackRuntime,
|
|
121
|
+
finderFeedbackRuntime,
|
|
122
|
+
currentThemeTokens,
|
|
123
|
+
currentWorkspaceOwnerId,
|
|
124
|
+
activeBrowserWidgetId,
|
|
125
|
+
resolveBrowserStateById,
|
|
126
|
+
fmtBytes,
|
|
127
|
+
runTransfer,
|
|
128
|
+
closeAgentRosterSearch,
|
|
129
|
+
pushDebugLine,
|
|
130
|
+
refreshRemotePreviewBridge,
|
|
131
|
+
refreshWorkingDirPreview,
|
|
132
|
+
setWorkingFocus,
|
|
133
|
+
startRemoteModeBridge,
|
|
134
|
+
draw,
|
|
135
|
+
scanFinder = defaultScanFinder,
|
|
136
|
+
scanRemoteFinder = defaultScanRemoteFinder,
|
|
137
|
+
} = deps;
|
|
138
|
+
|
|
139
|
+
/** Open the agent-roster search modal. Reads the current roster
|
|
140
|
+
* from agentSurfaceStore + globalAgentRegistry. Items: each
|
|
141
|
+
* entry's name + last 8 chars of id. Enter sets cursor; Esc
|
|
142
|
+
* dismisses. */
|
|
143
|
+
function openAgentRosterSearch(): void {
|
|
144
|
+
if (state.agentSearchModal) return;
|
|
145
|
+
const roster = agentSurfaceStore.syncTasks(globalAgentRegistry.list());
|
|
146
|
+
const cols = termSize().cols;
|
|
147
|
+
const modalWidth = Math.min(60, cols - 4);
|
|
148
|
+
const modalRow = 3; // top-anchored over the roster pane
|
|
149
|
+
const modalCol = Math.max(2, Math.floor((cols - modalWidth) / 2));
|
|
150
|
+
const filterable = roster.length > 3;
|
|
151
|
+
const handle = createSearchModal({
|
|
152
|
+
id: `agent-roster-search:${Date.now().toString(36)}`,
|
|
153
|
+
bounds: { row: modalRow, col: modalCol, width: modalWidth, height: 12 },
|
|
154
|
+
title: 'Search agents',
|
|
155
|
+
width: modalWidth,
|
|
156
|
+
maxVisible: 8,
|
|
157
|
+
primaryActionLabel: 'jump',
|
|
158
|
+
cancelActionLabel: 'cancel',
|
|
159
|
+
filterable,
|
|
160
|
+
actionButtons: true,
|
|
161
|
+
chromeSpec: {
|
|
162
|
+
titleAlign: 'center',
|
|
163
|
+
},
|
|
164
|
+
onQuery: (q) => {
|
|
165
|
+
const roster = agentSurfaceStore.syncTasks(globalAgentRegistry.list());
|
|
166
|
+
const needle = q.trim().toLowerCase();
|
|
167
|
+
const match = (t: typeof roster[number]) => {
|
|
168
|
+
if (!needle) return true;
|
|
169
|
+
return t.name.toLowerCase().includes(needle)
|
|
170
|
+
|| t.definitionName.toLowerCase().includes(needle)
|
|
171
|
+
|| (t.summary ?? '').toLowerCase().includes(needle)
|
|
172
|
+
|| t.id.toLowerCase().includes(needle);
|
|
173
|
+
};
|
|
174
|
+
return roster.filter(match).map((t): SearchItem => ({
|
|
175
|
+
label: `${t.name} ${t.definitionName} ${t.id.slice(0, 8)}`,
|
|
176
|
+
payload: t.id,
|
|
177
|
+
}));
|
|
178
|
+
},
|
|
179
|
+
onAccept: (item) => {
|
|
180
|
+
const roster = agentSurfaceStore.syncTasks(globalAgentRegistry.list());
|
|
181
|
+
const idx = roster.findIndex(t => t.id === item.payload);
|
|
182
|
+
if (idx >= 0) {
|
|
183
|
+
state.agentRosterCursor = idx;
|
|
184
|
+
state.agentCursorLockedId = roster[idx]!.id;
|
|
185
|
+
state.agentCursorManual = true;
|
|
186
|
+
}
|
|
187
|
+
closeAgentRosterSearch();
|
|
188
|
+
},
|
|
189
|
+
onCancel: () => closeAgentRosterSearch(),
|
|
190
|
+
theme: currentThemeTokens(),
|
|
191
|
+
});
|
|
192
|
+
attachSurfaceToWorkspace(handle.surface, currentWorkspaceOwnerId());
|
|
193
|
+
state.agentSearchModal = handle;
|
|
194
|
+
state.agentSearchHandle = display.pushModal(handle.surface);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** T5-J5 — open the transfer picker. Files arg = local paths to
|
|
198
|
+
* ship; destination comes from the picker. Handles both ssh and
|
|
199
|
+
* iphone target kinds. Remote-mode browser isn't supported here
|
|
200
|
+
* yet — the user is transferring LOCAL files (focused entry +
|
|
201
|
+
* selected set) to a remote destination. Transferring REMOTE→X
|
|
202
|
+
* is a separate flow (not this phase). */
|
|
203
|
+
function openTransferPicker(
|
|
204
|
+
files: Array<{ localPath: string; size?: number }>,
|
|
205
|
+
browserId: string = activeBrowserWidgetId(),
|
|
206
|
+
): void {
|
|
207
|
+
const targetBrowser = resolveBrowserStateById(browserId) ?? (workingDir as BrowserPaneModel);
|
|
208
|
+
if (files.length === 0) {
|
|
209
|
+
transferFeedbackRuntime.onNoFilesToTransfer();
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const capability = resolveBrowserTransferCapability(
|
|
213
|
+
targetBrowser,
|
|
214
|
+
listTransferTargets(),
|
|
215
|
+
);
|
|
216
|
+
if (!capability.enabled) {
|
|
217
|
+
transferFeedbackRuntime.onTransferDisabled(capability.reason);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const targets = capability.targets;
|
|
221
|
+
if (targets.length === 0) {
|
|
222
|
+
transferFeedbackRuntime.onNoTransferTargets();
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const totalBytes = files.reduce((a, f) => a + (f.size ?? 0), 0);
|
|
226
|
+
const summary = `${files.length} file${files.length === 1 ? '' : 's'}${
|
|
227
|
+
totalBytes > 0 ? ` (${fmtBytes(totalBytes)})` : ''
|
|
228
|
+
}`;
|
|
229
|
+
|
|
230
|
+
const { cols, rows } = termSize();
|
|
231
|
+
const width = Math.min(74, Math.max(46, cols - 6));
|
|
232
|
+
const visibleRows = Math.min(10, targets.length);
|
|
233
|
+
const height = visibleRows + 3;
|
|
234
|
+
const bounds = {
|
|
235
|
+
row: Math.max(1, Math.floor((rows - height) / 2)),
|
|
236
|
+
col: Math.max(1, Math.floor((cols - width) / 2)),
|
|
237
|
+
width,
|
|
238
|
+
height,
|
|
239
|
+
};
|
|
240
|
+
let handle: ReturnType<typeof display.pushModal> | null = null;
|
|
241
|
+
const picker = createTransferPickerModal({
|
|
242
|
+
targets,
|
|
243
|
+
bounds,
|
|
244
|
+
width,
|
|
245
|
+
maxVisible: visibleRows,
|
|
246
|
+
summary,
|
|
247
|
+
theme: currentThemeTokens(),
|
|
248
|
+
onAccept: (target) => {
|
|
249
|
+
state.agentSearchModal = null;
|
|
250
|
+
handle?.dispose();
|
|
251
|
+
void runTransfer(target, files);
|
|
252
|
+
draw();
|
|
253
|
+
},
|
|
254
|
+
onCancel: () => {
|
|
255
|
+
state.agentSearchModal = null;
|
|
256
|
+
handle?.dispose();
|
|
257
|
+
draw();
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
attachSurfaceToWorkspace(picker.surface, currentWorkspaceOwnerId());
|
|
261
|
+
handle = display.pushModal(picker.surface);
|
|
262
|
+
state.agentSearchModal = picker;
|
|
263
|
+
draw();
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/** T4-F2 / T4-F3 — open the Ctrl+T finder modal. Scans the
|
|
267
|
+
* current working dir (local only at MVP; remote scan is a
|
|
268
|
+
* follow-up). On accept, cd's the browser pane to the file's
|
|
269
|
+
* parent dir, focuses the file in the listing, and switches
|
|
270
|
+
* pane focus to browser so the user can e/enter next. */
|
|
271
|
+
async function openFinderPicker(): Promise<void> {
|
|
272
|
+
const targetBrowserId = activeBrowserWidgetId();
|
|
273
|
+
const targetBrowser = resolveBrowserStateById(targetBrowserId) ?? (workingDir as BrowserPaneModel);
|
|
274
|
+
// T5-I2 — branch on remote vs local. Both paths produce the
|
|
275
|
+
// same {absPath, relPath} finder items so the modal + onAccept
|
|
276
|
+
// handler stay unified.
|
|
277
|
+
let finderItems: FinderItem[] = [];
|
|
278
|
+
let backend = 'fd';
|
|
279
|
+
let truncated = false;
|
|
280
|
+
let scanDurationMs = 0;
|
|
281
|
+
|
|
282
|
+
if (workingDir.remote) {
|
|
283
|
+
const host = workingDir.remote.host;
|
|
284
|
+
const remoteRoot = workingDir.remote.cwd;
|
|
285
|
+
finderFeedbackRuntime.onFinderScanStarted(`${host.name}:${remoteRoot}`);
|
|
286
|
+
draw();
|
|
287
|
+
const scan = await scanRemoteFinder({ host, root: remoteRoot });
|
|
288
|
+
const rels = relativizeRemoteResults(scan.paths, remoteRoot);
|
|
289
|
+
finderItems = scan.paths.map((absPath, i) => ({
|
|
290
|
+
absPath, relPath: rels[i] ?? absPath,
|
|
291
|
+
}));
|
|
292
|
+
backend = `${scan.backend}@${scan.host}`;
|
|
293
|
+
truncated = scan.truncated;
|
|
294
|
+
scanDurationMs = scan.durationMs;
|
|
295
|
+
} else {
|
|
296
|
+
// 2026-05-03 — scan from the Session Working Directory (the
|
|
297
|
+
// "project root"), NOT the browser pane's current navigation
|
|
298
|
+
// cursor. SWD is mutable only via Ctrl+W / /wd / SetWorkingDir
|
|
299
|
+
// tool — exactly the user's intent for "project root". Browser
|
|
300
|
+
// pane's cwd is purely UI navigation and should not narrow
|
|
301
|
+
// Ctrl+T's search scope (matches working-dir.ts:5-8 contract).
|
|
302
|
+
const scanRoot = getSessionCwd();
|
|
303
|
+
finderFeedbackRuntime.onFinderScanStarted(scanRoot);
|
|
304
|
+
draw();
|
|
305
|
+
const scan = await scanFinder({ root: scanRoot });
|
|
306
|
+
const rels = relativizeResults(scan.paths, scanRoot);
|
|
307
|
+
finderItems = scan.paths.map((absPath, i) => ({
|
|
308
|
+
absPath, relPath: rels[i] ?? absPath,
|
|
309
|
+
}));
|
|
310
|
+
backend = scan.backend;
|
|
311
|
+
truncated = scan.truncated;
|
|
312
|
+
scanDurationMs = scan.durationMs;
|
|
313
|
+
}
|
|
314
|
+
if (finderItems.length === 0) {
|
|
315
|
+
finderFeedbackRuntime.onFinderScanEmpty();
|
|
316
|
+
draw();
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
finderFeedbackRuntime.onFinderScanCompleted({
|
|
320
|
+
count: finderItems.length,
|
|
321
|
+
backend,
|
|
322
|
+
truncated,
|
|
323
|
+
durationMs: scanDurationMs,
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
const { cols, rows } = termSize();
|
|
327
|
+
const width = Math.min(90, Math.max(50, cols - 6));
|
|
328
|
+
const visibleRows = Math.min(15, Math.max(6, rows - 8));
|
|
329
|
+
const height = visibleRows + 3;
|
|
330
|
+
const bounds = {
|
|
331
|
+
row: Math.max(1, Math.floor((rows - height) / 2)),
|
|
332
|
+
col: Math.max(1, Math.floor((cols - width) / 2)),
|
|
333
|
+
width,
|
|
334
|
+
height,
|
|
335
|
+
};
|
|
336
|
+
let handle: ReturnType<typeof display.pushModal> | null = null;
|
|
337
|
+
// Title reflects the actual scan root — SWD for local (project
|
|
338
|
+
// root), remote cwd for remote mode. Browser pane's nav cursor
|
|
339
|
+
// is intentionally NOT shown because the scan ignores it.
|
|
340
|
+
const titleRoot = workingDir.remote
|
|
341
|
+
? `${workingDir.remote.host.name}:${workingDir.remote.cwd}`
|
|
342
|
+
: getSessionCwd().replace(homedir(), '~');
|
|
343
|
+
// 2026-05-03 — preview modes (yazi/fzf-style, on-demand).
|
|
344
|
+
//
|
|
345
|
+
// Default mode is OFF — the picker opens cleanly with NO preview
|
|
346
|
+
// so it's never annoying on tablet / narrow terminals. The user
|
|
347
|
+
// toggles preview behaviour with `Ctrl+/` (matches zshrc
|
|
348
|
+
// `--bind 'ctrl-/:toggle-preview'`):
|
|
349
|
+
//
|
|
350
|
+
// off → hover → 2pane → off (cycle)
|
|
351
|
+
//
|
|
352
|
+
// • off — no preview, ever. The cursor moves freely.
|
|
353
|
+
// • hover — popup appears after the cursor stays still for
|
|
354
|
+
// 1 second (HOVER_DELAY_MS). Popup auto-dismisses
|
|
355
|
+
// after 4s. Centered, the same width as legacy
|
|
356
|
+
// behaviour but on-demand.
|
|
357
|
+
// • 2pane — browser-preview style: persistent preview popup
|
|
358
|
+
// docked to the right of the picker. Updates
|
|
359
|
+
// instantly as the cursor moves. Falls back to
|
|
360
|
+
// hover if the terminal is too narrow (<140 cols).
|
|
361
|
+
//
|
|
362
|
+
// showPreviewModal supports remote-skip by itself (preview
|
|
363
|
+
// handlers read local fs), so we simply guard with workingDir
|
|
364
|
+
// .remote before scheduling.
|
|
365
|
+
type PreviewMode = 'off' | 'hover' | '2pane';
|
|
366
|
+
const HOVER_DELAY_MS = 1000;
|
|
367
|
+
const TWO_PANE_MIN_COLS = 140;
|
|
368
|
+
const TWO_PANE_GROUP = 'finder-2pane-preview';
|
|
369
|
+
|
|
370
|
+
let previewMode: PreviewMode = 'off';
|
|
371
|
+
let lastSelected: FinderItem | null = null;
|
|
372
|
+
let hoverTimer: ReturnType<typeof setTimeout> | null = null;
|
|
373
|
+
let lastPreviewHandle: { dispose(): void } | null = null;
|
|
374
|
+
|
|
375
|
+
const clearHoverTimer = () => {
|
|
376
|
+
if (hoverTimer !== null) { clearTimeout(hoverTimer); hoverTimer = null; }
|
|
377
|
+
};
|
|
378
|
+
const disposeActivePreview = () => {
|
|
379
|
+
if (lastPreviewHandle) {
|
|
380
|
+
try { lastPreviewHandle.dispose(); } catch { /* ignore */ }
|
|
381
|
+
lastPreviewHandle = null;
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
/** Compute the docked-preview bounds for 2-pane mode. Picker
|
|
386
|
+
* centred at width≈90; preview takes the right gutter. Returns
|
|
387
|
+
* null when there isn't enough room (caller falls back to
|
|
388
|
+
* hover). */
|
|
389
|
+
const computeDockedPreviewBounds = (): {
|
|
390
|
+
row: number; col: number; width: number; height: number;
|
|
391
|
+
} | null => {
|
|
392
|
+
const { cols: tc, rows: tr } = termSize();
|
|
393
|
+
if (tc < TWO_PANE_MIN_COLS) return null;
|
|
394
|
+
const pickerWidth = Math.min(90, Math.max(50, tc - 6));
|
|
395
|
+
const pickerCol = Math.max(1, Math.floor((tc - pickerWidth) / 2));
|
|
396
|
+
const previewCol = pickerCol + pickerWidth + 2;
|
|
397
|
+
const previewWidth = Math.max(40, tc - previewCol - 2);
|
|
398
|
+
if (previewWidth < 40) return null;
|
|
399
|
+
const previewHeight = Math.max(8, Math.min(tr - 6, 28));
|
|
400
|
+
const previewRow = Math.max(1, Math.floor((tr - previewHeight) / 2));
|
|
401
|
+
return { row: previewRow, col: previewCol, width: previewWidth, height: previewHeight };
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
const paintPreviewFor = (item: FinderItem) => {
|
|
405
|
+
if (workingDir.remote) return; // remote previews unsupported
|
|
406
|
+
const { rows: tr, cols: tc } = termSize();
|
|
407
|
+
const docked = previewMode === '2pane' ? computeDockedPreviewBounds() : null;
|
|
408
|
+
void showPreviewModal(item.absPath, {
|
|
409
|
+
coordinator: display,
|
|
410
|
+
termCols: tc,
|
|
411
|
+
termRows: tr,
|
|
412
|
+
title: item.relPath,
|
|
413
|
+
ttlMs: previewMode === '2pane' ? 0 : 4000,
|
|
414
|
+
bounds: docked ?? undefined,
|
|
415
|
+
group: previewMode === '2pane' ? TWO_PANE_GROUP : 'image-preview',
|
|
416
|
+
}).then((r) => {
|
|
417
|
+
lastPreviewHandle = r?.handle ?? null;
|
|
418
|
+
}).catch(() => { /* preview failure is non-fatal */ });
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
const scheduleHoverPreview = (item: FinderItem | null) => {
|
|
422
|
+
lastSelected = item;
|
|
423
|
+
clearHoverTimer();
|
|
424
|
+
if (previewMode === 'off') return;
|
|
425
|
+
if (!item || workingDir.remote) {
|
|
426
|
+
// Off-screen / remote — kill any straggling popup so the
|
|
427
|
+
// user doesn't see a preview that no longer matches the
|
|
428
|
+
// selection.
|
|
429
|
+
disposeActivePreview();
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
if (previewMode === '2pane') {
|
|
433
|
+
// Instant update — no debounce. Persistent popup replaces
|
|
434
|
+
// itself via group dedup.
|
|
435
|
+
paintPreviewFor(item);
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
// HOVER mode. Selection just changed → the popup currently on
|
|
439
|
+
// screen (if any) is stale. Drop it immediately so the user
|
|
440
|
+
// doesn't keep seeing the previous file's preview while their
|
|
441
|
+
// cursor is on a new file. The next paint waits HOVER_DELAY_MS
|
|
442
|
+
// of stillness before re-appearing.
|
|
443
|
+
disposeActivePreview();
|
|
444
|
+
hoverTimer = setTimeout(() => {
|
|
445
|
+
hoverTimer = null;
|
|
446
|
+
paintPreviewFor(item);
|
|
447
|
+
}, HOVER_DELAY_MS);
|
|
448
|
+
};
|
|
449
|
+
|
|
450
|
+
/** Cycle off → hover → 2pane → off. Surfaces a status line so
|
|
451
|
+
* the user knows which mode they're in (Ctrl+/ has no chrome
|
|
452
|
+
* feedback otherwise). 2pane on a narrow terminal degrades
|
|
453
|
+
* to hover with a warning. */
|
|
454
|
+
const cyclePreviewMode = (): void => {
|
|
455
|
+
const next: PreviewMode = previewMode === 'off' ? 'hover'
|
|
456
|
+
: previewMode === 'hover' ? '2pane'
|
|
457
|
+
: 'off';
|
|
458
|
+
previewMode = next;
|
|
459
|
+
clearHoverTimer();
|
|
460
|
+
// Drop the active popup whenever the mode changes. The new
|
|
461
|
+
// mode (if any) re-paints below.
|
|
462
|
+
disposeActivePreview();
|
|
463
|
+
|
|
464
|
+
if (next === 'off') {
|
|
465
|
+
state.chatLines.push(C.muted(' finder preview: OFF (Ctrl+/ to cycle modes)'));
|
|
466
|
+
} else if (next === 'hover') {
|
|
467
|
+
state.chatLines.push(C.muted(' finder preview: HOVER (popup after 1 s · Ctrl+/ next)'));
|
|
468
|
+
} else {
|
|
469
|
+
// 2pane — refuse if the terminal is too narrow; degrade to
|
|
470
|
+
// hover so the user gets *some* preview without overlap.
|
|
471
|
+
const docked = computeDockedPreviewBounds();
|
|
472
|
+
if (!docked) {
|
|
473
|
+
previewMode = 'hover';
|
|
474
|
+
state.chatLines.push(C.warning(` finder preview: 2-pane needs ≥${TWO_PANE_MIN_COLS} cols — falling back to HOVER`));
|
|
475
|
+
} else {
|
|
476
|
+
state.chatLines.push(C.muted(' finder preview: 2-PANE (docked right · Ctrl+/ to disable)'));
|
|
477
|
+
if (lastSelected) paintPreviewFor(lastSelected);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
state.chatScrollOffset = -1;
|
|
481
|
+
draw();
|
|
482
|
+
};
|
|
483
|
+
|
|
484
|
+
// Declared up here so `onAccept`/`onCancel` closures below can
|
|
485
|
+
// reference both; assigned right after the picker mounts.
|
|
486
|
+
let previewToggleDisposable: { dispose(): void } | null = null;
|
|
487
|
+
let previewDismissDisposable: { dispose(): void } | null = null;
|
|
488
|
+
const picker = createFinderModal({
|
|
489
|
+
items: finderItems,
|
|
490
|
+
bounds, width, maxVisible: visibleRows,
|
|
491
|
+
truncated,
|
|
492
|
+
title: `Find file in ${titleRoot}`,
|
|
493
|
+
theme: currentThemeTokens(),
|
|
494
|
+
onHover: scheduleHoverPreview,
|
|
495
|
+
onAccept: (item) => {
|
|
496
|
+
clearHoverTimer();
|
|
497
|
+
disposeActivePreview();
|
|
498
|
+
previewToggleDisposable?.dispose();
|
|
499
|
+
previewDismissDisposable?.dispose();
|
|
500
|
+
state.agentSearchModal = null;
|
|
501
|
+
handle?.dispose();
|
|
502
|
+
const parentDir = item.absPath.slice(0, item.absPath.lastIndexOf('/')) || '/';
|
|
503
|
+
const basename = item.absPath.slice(item.absPath.lastIndexOf('/') + 1);
|
|
504
|
+
if (workingDir.remote) {
|
|
505
|
+
// T5-I2 — remote cd + focus-by-basename.
|
|
506
|
+
enterRemoteDirectory(workingDir, parentDir);
|
|
507
|
+
(async () => {
|
|
508
|
+
await refreshRemoteWorkingDir(workingDir, {}, dockedPreview);
|
|
509
|
+
const idx = workingDir.entries.findIndex(e => e.name === basename);
|
|
510
|
+
if (idx >= 0) {
|
|
511
|
+
workingDir.cursor = idx;
|
|
512
|
+
workingDir.offset = Math.max(0, idx - 3);
|
|
513
|
+
}
|
|
514
|
+
await refreshRemotePreviewBridge();
|
|
515
|
+
pushDebugLine(C.muted(` ${workingDir.remote?.host.name}:${item.relPath}`));
|
|
516
|
+
state.chatScrollOffset = -1;
|
|
517
|
+
draw();
|
|
518
|
+
})().catch(() => {});
|
|
519
|
+
} else {
|
|
520
|
+
enterDirectory(targetBrowser as WorkingDirState, parentDir);
|
|
521
|
+
refreshWorkingDir(targetBrowser as WorkingDirState);
|
|
522
|
+
const idx = targetBrowser.entries.findIndex(e => e.name === basename);
|
|
523
|
+
if (idx >= 0) {
|
|
524
|
+
targetBrowser.cursor = idx;
|
|
525
|
+
targetBrowser.offset = Math.max(0, idx - 3);
|
|
526
|
+
}
|
|
527
|
+
refreshWorkingDirPreview();
|
|
528
|
+
pushDebugLine(C.muted(` ${item.relPath}`));
|
|
529
|
+
state.chatScrollOffset = -1;
|
|
530
|
+
}
|
|
531
|
+
setWorkingFocus('browser', 'agent-roster-search-pick');
|
|
532
|
+
draw();
|
|
533
|
+
},
|
|
534
|
+
onCancel: () => {
|
|
535
|
+
clearHoverTimer();
|
|
536
|
+
disposeActivePreview();
|
|
537
|
+
previewToggleDisposable?.dispose();
|
|
538
|
+
previewDismissDisposable?.dispose();
|
|
539
|
+
state.agentSearchModal = null;
|
|
540
|
+
handle?.dispose();
|
|
541
|
+
draw();
|
|
542
|
+
},
|
|
543
|
+
});
|
|
544
|
+
// Ctrl+/ (and Ctrl+_ which some terminals send for the same
|
|
545
|
+
// physical chord) cycles preview modes. Active for the lifetime
|
|
546
|
+
// of THIS picker only — disposed in both onAccept and onCancel
|
|
547
|
+
// above. Q4 (substrate Occam): no per-binding pipe alias, register
|
|
548
|
+
// each variant separately. (Korean IME aliases unnecessary — Ctrl+/
|
|
549
|
+
// has no jamo mapping on the 2-set layout.)
|
|
550
|
+
const togglePreviewMode = (): void => { cyclePreviewMode(); };
|
|
551
|
+
const previewSlash = display.registerKeyBinding({
|
|
552
|
+
id: `dashboard:finder-picker-preview-toggle-slash:${Date.now().toString(36)}`,
|
|
553
|
+
key: 'C-/',
|
|
554
|
+
scope: 'global',
|
|
555
|
+
when: () => state.agentSearchModal === picker,
|
|
556
|
+
handler: togglePreviewMode,
|
|
557
|
+
});
|
|
558
|
+
const previewUnder = display.registerKeyBinding({
|
|
559
|
+
id: `dashboard:finder-picker-preview-toggle-under:${Date.now().toString(36)}`,
|
|
560
|
+
key: 'C-_',
|
|
561
|
+
scope: 'global',
|
|
562
|
+
when: () => state.agentSearchModal === picker,
|
|
563
|
+
handler: togglePreviewMode,
|
|
564
|
+
});
|
|
565
|
+
previewToggleDisposable = {
|
|
566
|
+
dispose: () => { previewSlash.dispose(); previewUnder.dispose(); },
|
|
567
|
+
};
|
|
568
|
+
// Ctrl+] — instantly dismiss the active preview popup WITHOUT
|
|
569
|
+
// closing the picker or changing the mode. Esc would be more
|
|
570
|
+
// intuitive but the picker captures Esc internally to cancel
|
|
571
|
+
// itself. Ctrl+\ is unsafe because it raises SIGQUIT in many
|
|
572
|
+
// terminal drivers. Ctrl+] (historically "telnet escape" =
|
|
573
|
+
// "exit this context") is universally safe + semantically right.
|
|
574
|
+
// Active only while a preview is currently visible — otherwise
|
|
575
|
+
// the binding silently no-ops (no flicker, no log spam).
|
|
576
|
+
// Mode stays as set; if user is in HOVER mode, the next
|
|
577
|
+
// cursor stillness re-triggers the popup. To stop the popup
|
|
578
|
+
// from re-appearing entirely, cycle Ctrl+/ back to OFF.
|
|
579
|
+
previewDismissDisposable = display.registerKeyBinding({
|
|
580
|
+
id: `dashboard:finder-picker-preview-dismiss:${Date.now().toString(36)}`,
|
|
581
|
+
key: 'C-]',
|
|
582
|
+
scope: 'global',
|
|
583
|
+
when: () => state.agentSearchModal === picker && lastPreviewHandle !== null,
|
|
584
|
+
handler: () => {
|
|
585
|
+
clearHoverTimer();
|
|
586
|
+
disposeActivePreview();
|
|
587
|
+
draw();
|
|
588
|
+
},
|
|
589
|
+
});
|
|
590
|
+
attachSurfaceToWorkspace(picker.surface, currentWorkspaceOwnerId());
|
|
591
|
+
handle = display.pushModal(picker.surface);
|
|
592
|
+
state.agentSearchModal = picker;
|
|
593
|
+
draw();
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
/** Yazi-style Alt+C — directory finder. Symmetric with openFinder
|
|
597
|
+
* Picker but enumerates directories only (`scanFinder kind:'dir'`)
|
|
598
|
+
* and on accept cd's the browser pane to the chosen directory.
|
|
599
|
+
* Remote-mode is currently unsupported (surfaces a warning) — the
|
|
600
|
+
* remote finder would need a parallel kind-aware backend. */
|
|
601
|
+
async function openDirectoryPicker(): Promise<void> {
|
|
602
|
+
if (workingDir.remote) {
|
|
603
|
+
state.chatLines.push(C.warning(' Alt+C: directory finder is local-only — Esc remote first.'));
|
|
604
|
+
state.chatScrollOffset = -1;
|
|
605
|
+
draw();
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
608
|
+
const targetBrowserId = activeBrowserWidgetId();
|
|
609
|
+
const targetBrowser = resolveBrowserStateById(targetBrowserId) ?? (workingDir as BrowserPaneModel);
|
|
610
|
+
// Symmetric with openFinderPicker — scan from SWD (project root),
|
|
611
|
+
// not the browser pane's nav cursor. The accept handler still
|
|
612
|
+
// mutates targetBrowser to navigate into the chosen dir.
|
|
613
|
+
const scanRoot = getSessionCwd();
|
|
614
|
+
finderFeedbackRuntime.onFinderScanStarted(`${scanRoot} (dirs)`);
|
|
615
|
+
draw();
|
|
616
|
+
const scan = await scanFinder({ root: scanRoot, kind: 'dir' });
|
|
617
|
+
const rels = relativizeResults(scan.paths, scanRoot);
|
|
618
|
+
const dirItems: FinderItem[] = scan.paths.map((absPath, i) => ({
|
|
619
|
+
absPath, relPath: rels[i] ?? absPath,
|
|
620
|
+
}));
|
|
621
|
+
if (dirItems.length === 0) {
|
|
622
|
+
finderFeedbackRuntime.onFinderScanEmpty();
|
|
623
|
+
draw();
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
finderFeedbackRuntime.onFinderScanCompleted({
|
|
627
|
+
count: dirItems.length,
|
|
628
|
+
backend: scan.backend,
|
|
629
|
+
truncated: scan.truncated,
|
|
630
|
+
durationMs: scan.durationMs,
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
const { cols, rows } = termSize();
|
|
634
|
+
const width = Math.min(90, Math.max(50, cols - 6));
|
|
635
|
+
const visibleRows = Math.min(15, Math.max(6, rows - 8));
|
|
636
|
+
const height = visibleRows + 3;
|
|
637
|
+
const bounds = {
|
|
638
|
+
row: Math.max(1, Math.floor((rows - height) / 2)),
|
|
639
|
+
col: Math.max(1, Math.floor((cols - width) / 2)),
|
|
640
|
+
width,
|
|
641
|
+
height,
|
|
642
|
+
};
|
|
643
|
+
let handle: ReturnType<typeof display.pushModal> | null = null;
|
|
644
|
+
const titleRoot = scanRoot.replace(homedir(), '~');
|
|
645
|
+
const picker = createFinderModal({
|
|
646
|
+
items: dirItems,
|
|
647
|
+
bounds, width, maxVisible: visibleRows,
|
|
648
|
+
truncated: scan.truncated,
|
|
649
|
+
title: `Find directory in ${titleRoot}`,
|
|
650
|
+
theme: currentThemeTokens(),
|
|
651
|
+
onAccept: (item) => {
|
|
652
|
+
state.agentSearchModal = null;
|
|
653
|
+
handle?.dispose();
|
|
654
|
+
enterDirectory(targetBrowser as WorkingDirState, item.absPath);
|
|
655
|
+
refreshWorkingDir(targetBrowser as WorkingDirState);
|
|
656
|
+
refreshWorkingDirPreview();
|
|
657
|
+
pushDebugLine(C.muted(` cd ${item.relPath}`));
|
|
658
|
+
state.chatScrollOffset = -1;
|
|
659
|
+
setWorkingFocus('browser', 'alt-c-dir-pick');
|
|
660
|
+
draw();
|
|
661
|
+
},
|
|
662
|
+
onCancel: () => {
|
|
663
|
+
state.agentSearchModal = null;
|
|
664
|
+
handle?.dispose();
|
|
665
|
+
draw();
|
|
666
|
+
},
|
|
667
|
+
});
|
|
668
|
+
attachSurfaceToWorkspace(picker.surface, currentWorkspaceOwnerId());
|
|
669
|
+
handle = display.pushModal(picker.surface);
|
|
670
|
+
state.agentSearchModal = picker;
|
|
671
|
+
draw();
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
/** T4-E4 — open the SSH host picker (Ctrl+K). Accept connects
|
|
675
|
+
* the browser pane to the remote host; Esc cancels silently.
|
|
676
|
+
* Routes keys through state.agentSearchModal (shared pattern with
|
|
677
|
+
* window + session pickers). */
|
|
678
|
+
function openSshPicker(): void {
|
|
679
|
+
const { cols, rows } = termSize();
|
|
680
|
+
const width = Math.min(72, Math.max(44, cols - 6));
|
|
681
|
+
const visibleRows = 8;
|
|
682
|
+
const height = visibleRows + 3;
|
|
683
|
+
const bounds = {
|
|
684
|
+
row: Math.max(1, Math.floor((rows - height) / 2)),
|
|
685
|
+
col: Math.max(1, Math.floor((cols - width) / 2)),
|
|
686
|
+
width,
|
|
687
|
+
height,
|
|
688
|
+
};
|
|
689
|
+
let handle: ReturnType<typeof display.pushModal> | null = null;
|
|
690
|
+
const picker = createSshPickerModal({
|
|
691
|
+
bounds, width, maxVisible: visibleRows,
|
|
692
|
+
activeHostName: workingDir.remote?.host.name ?? null,
|
|
693
|
+
theme: currentThemeTokens(),
|
|
694
|
+
onAccept: async (host) => {
|
|
695
|
+
state.agentSearchModal = null;
|
|
696
|
+
handle?.dispose();
|
|
697
|
+
touchSshHost(host.name);
|
|
698
|
+
startRemoteModeBridge(host, '.');
|
|
699
|
+
finderFeedbackRuntime.onSshConnectStarted({ name: host.name, host: host.host });
|
|
700
|
+
draw();
|
|
701
|
+
try {
|
|
702
|
+
await refreshRemoteWorkingDir(workingDir, {}, dockedPreview);
|
|
703
|
+
await refreshRemotePreviewBridge();
|
|
704
|
+
finderFeedbackRuntime.onSshConnectSucceeded(host.name);
|
|
705
|
+
} catch (err) {
|
|
706
|
+
finderFeedbackRuntime.onSshConnectFailed(
|
|
707
|
+
host.name,
|
|
708
|
+
err instanceof Error ? err.message : String(err),
|
|
709
|
+
);
|
|
710
|
+
}
|
|
711
|
+
draw();
|
|
712
|
+
},
|
|
713
|
+
onCancel: () => {
|
|
714
|
+
state.agentSearchModal = null;
|
|
715
|
+
handle?.dispose();
|
|
716
|
+
draw();
|
|
717
|
+
},
|
|
718
|
+
});
|
|
719
|
+
attachSurfaceToWorkspace(picker.surface, currentWorkspaceOwnerId());
|
|
720
|
+
handle = display.pushModal(picker.surface);
|
|
721
|
+
state.agentSearchModal = picker;
|
|
722
|
+
draw();
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
return {
|
|
726
|
+
openAgentRosterSearch,
|
|
727
|
+
openTransferPicker,
|
|
728
|
+
openFinderPicker,
|
|
729
|
+
openDirectoryPicker,
|
|
730
|
+
openSshPicker,
|
|
731
|
+
};
|
|
732
|
+
}
|