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
|
@@ -42,7 +42,9 @@ import {
|
|
|
42
42
|
upsertPtyManifest, updatePtyManifestFrame, touchLivePtyManifest, markPtyManifestClosed, removePtyManifest,
|
|
43
43
|
} from '../pty-shell/pty-manifest.js';
|
|
44
44
|
import { writeHarnessScreen } from '../harness/harness-screen.js';
|
|
45
|
+
import { startTuiRunStateRecorder } from '../pty-shell/tui-run-state.js';
|
|
45
46
|
import { debug } from '../debug/log.js';
|
|
47
|
+
import { routeExternalInput, type ExternalInputRoute } from '../input/external-input-queue.js';
|
|
46
48
|
|
|
47
49
|
export interface TuiFrameObserverCfg {
|
|
48
50
|
surfaceId: string;
|
|
@@ -99,6 +101,8 @@ export interface TuiControlTargetDeps {
|
|
|
99
101
|
splitKeys?: (input: string) => Key[];
|
|
100
102
|
/** The foreground terminal's real size; `undefined` when it cannot be known (stdout is not a TTY). */
|
|
101
103
|
dims?: () => { readonly cols: number; readonly rows: number } | undefined;
|
|
104
|
+
/** 외부 주입 라우터 — 글 한 줄을 사용자 버퍼에 섞지 않고 별도 대기열로 돌린다(`input/external-input-queue`). */
|
|
105
|
+
routeExternal?: (chars: string) => ExternalInputRoute;
|
|
102
106
|
}
|
|
103
107
|
|
|
104
108
|
function stdoutDims(): { cols: number; rows: number } | undefined {
|
|
@@ -116,6 +120,7 @@ export function createTuiControlTarget(surfaceId: string, deps: TuiControlTarget
|
|
|
116
120
|
const inject = deps.injectKey ?? injectKey;
|
|
117
121
|
const parse = deps.splitKeys ?? splitKeys;
|
|
118
122
|
const dims = deps.dims ?? stdoutDims;
|
|
123
|
+
const routeExternal = deps.routeExternal ?? routeExternalInput;
|
|
119
124
|
let alive = true;
|
|
120
125
|
let accessMode: PtyAccessMode = 'write';
|
|
121
126
|
let transitionPolicy: PtyTransitionPolicy = 'open';
|
|
@@ -135,6 +140,8 @@ export function createTuiControlTarget(surfaceId: string, deps: TuiControlTarget
|
|
|
135
140
|
isAlive: () => alive,
|
|
136
141
|
canWrite: (actor: PtyWriteActor = 'human') => resolveWriteDecision(accessMode, actor).allow,
|
|
137
142
|
write(chars: string): void {
|
|
143
|
+
// ⭐ 이 write 는 «바깥»(제어 IPC)에서만 온다 — 키보드와 섞이기 전에 라우터가 먼저 가른다.
|
|
144
|
+
if (routeExternal(chars) !== 'passthrough') return;
|
|
138
145
|
const keys = parse(chars);
|
|
139
146
|
if (!keys.length || !keys.every(inject)) throw new Error('tui-input-undelivered');
|
|
140
147
|
},
|
|
@@ -145,11 +152,13 @@ export function createTuiControlTarget(surfaceId: string, deps: TuiControlTarget
|
|
|
145
152
|
|
|
146
153
|
export interface TuiSelfReportDeps {
|
|
147
154
|
surfaceId?: string;
|
|
155
|
+
/** `elanous --name <name>` — 자기 manifest 행 별명. `pty list`·`pty snapshot <name>` 이 이것으로 부른다. */
|
|
156
|
+
nickname?: string;
|
|
148
157
|
throttleMs?: number;
|
|
149
158
|
now?: () => number;
|
|
150
159
|
register?: (fn: ((lines: readonly string[], dims: { rows: number; cols: number }) => void) | null) => void;
|
|
151
160
|
publishFrame?: (frame: SelfReportFrame) => void;
|
|
152
|
-
registerRow?: (surfaceId: string, now: number) => void;
|
|
161
|
+
registerRow?: (surfaceId: string, now: number, nickname?: string) => void;
|
|
153
162
|
writeFrame?: (surfaceId: string, text: string, now: number) => void;
|
|
154
163
|
/** B(harness-screens 파일) sink — `elanous self screen` 이 읽는 substrate.
|
|
155
164
|
* 자식 harness 발행과 대칭(tmux 없이 L2 대시보드 자기 화면 관측). */
|
|
@@ -174,6 +183,10 @@ export interface TuiSelfReportDeps {
|
|
|
174
183
|
startControlPoller?: () => (() => void);
|
|
175
184
|
reportControlInitFailure?: (stage: TuiControlInitStage, error: unknown) => void;
|
|
176
185
|
reportControlCleanupFailure?: (stage: TuiControlCleanupStage, error: unknown) => void;
|
|
186
|
+
/** 행 등록 직후 실행 판 ⊕ 턴(idle) 기록을 연다 — `elanous pty state` 가 읽는다. 반환 = 정리. */
|
|
187
|
+
startRunState?: (surfaceId: string) => (() => void);
|
|
188
|
+
/** 미룬 우편 깨움 폴러(TUI-H4)를 연다 — 반환 = 정리. 기본은 실 행 등록과 짝일 때만 늦게 불러온 `startPendingWakePoller`. */
|
|
189
|
+
startWakePoller?: (surfaceId: string) => (() => void);
|
|
177
190
|
}
|
|
178
191
|
|
|
179
192
|
export type TuiControlInitStage = 'create-target' | 'register-target' | 'start-poller' | 'publish-manifest';
|
|
@@ -235,7 +248,9 @@ export function startTuiSelfReport(deps: TuiSelfReportDeps = {}): () => void {
|
|
|
235
248
|
initDisposers.push({ stage: 'stop-poller', dispose: stopControlPoller });
|
|
236
249
|
controlInitStage = 'publish-manifest';
|
|
237
250
|
initDisposers.push({ stage: 'rollback-manifest', dispose: () => rollbackRow(surfaceId) });
|
|
238
|
-
|
|
251
|
+
const nickname = deps.nickname?.trim() || undefined;
|
|
252
|
+
registerRow(surfaceId, now(), nickname);
|
|
253
|
+
if (nickname) debug.log('pty.rename', 'tui-launch-name', { ptyId: surfaceId, nickname });
|
|
239
254
|
} catch (error) {
|
|
240
255
|
for (let disposer = initDisposers.pop(); disposer; disposer = initDisposers.pop()) {
|
|
241
256
|
try { disposer.dispose(); } catch (cleanupError) {
|
|
@@ -246,6 +261,21 @@ export function startTuiSelfReport(deps: TuiSelfReportDeps = {}): () => void {
|
|
|
246
261
|
return () => {};
|
|
247
262
|
}
|
|
248
263
|
const activeControlTarget = controlTarget;
|
|
264
|
+
let stopRunState: () => void = () => {};
|
|
265
|
+
// 행 등록을 갈아 끼운 호출자(시험)는 실 manifest 를 안 건드린다 — 기본 녹음기는 기본 행 등록과 짝일 때만.
|
|
266
|
+
const startRunState = deps.startRunState ?? (deps.registerRow ? () => () => {} : startTuiRunStateRecorder);
|
|
267
|
+
try { stopRunState = startRunState(surfaceId); } catch { /* fail-soft — recorder logs its own write failures */ }
|
|
268
|
+
// 미룬 우편 깨움(TUI-H4) — 이 TUI 가 턴 중·5분 창이라 못 받은 깨움을 idle 로 «기록»된 뒤 한 번 다시 두드린다.
|
|
269
|
+
// 실 행 등록과 짝일 때만(시험이 행 등록을 갈아 끼우면 0) · 무거운 모듈은 늦게 불러온다.
|
|
270
|
+
let stopWakePoller: () => void = () => {};
|
|
271
|
+
let wakePollerStopped = false;
|
|
272
|
+
if (deps.startWakePoller) {
|
|
273
|
+
try { stopWakePoller = deps.startWakePoller(surfaceId); } catch { /* fail-soft */ }
|
|
274
|
+
} else if (!deps.registerRow) {
|
|
275
|
+
void import('../loops/msg-wake.js').then(mod => {
|
|
276
|
+
if (!wakePollerStopped) stopWakePoller = mod.startPendingWakePoller(surfaceId);
|
|
277
|
+
}).catch(() => { /* fail-soft — the post-time wake still runs */ });
|
|
278
|
+
}
|
|
249
279
|
const driveTicks = deps.driveTicks ?? ((tick, ms) => {
|
|
250
280
|
const t = setInterval(tick, ms);
|
|
251
281
|
(t as { unref?: () => void }).unref?.();
|
|
@@ -320,6 +350,9 @@ export function startTuiSelfReport(deps: TuiSelfReportDeps = {}): () => void {
|
|
|
320
350
|
try { stopSource(); } catch { /* fail-soft — unregisters observer / clears tick timer */ }
|
|
321
351
|
try { mirror?.stop(); } catch { /* fail-soft — restores stdout.write */ }
|
|
322
352
|
clearInterval(hb);
|
|
353
|
+
try { stopRunState(); } catch { /* fail-soft */ }
|
|
354
|
+
wakePollerStopped = true;
|
|
355
|
+
try { stopWakePoller(); } catch { /* fail-soft */ }
|
|
323
356
|
try { markClosed(surfaceId, now()); } catch { /* fail-soft */ }
|
|
324
357
|
try { activeControlTarget?.deactivate(); } catch { /* fail-soft */ }
|
|
325
358
|
try { stopControlPoller(); } catch { /* fail-soft */ }
|
|
@@ -357,8 +390,8 @@ function defaultPublishFrame(frame: SelfReportFrame): void {
|
|
|
357
390
|
publishSelfReportFrame(getChannelBus(), frame);
|
|
358
391
|
}
|
|
359
392
|
|
|
360
|
-
function defaultRegisterRow(surfaceId: string, now: number): void {
|
|
361
|
-
upsertPtyManifest({ id: surfaceId, kind: 'tui', cmd: 'elanous', startedAt: now, now });
|
|
393
|
+
function defaultRegisterRow(surfaceId: string, now: number, nickname?: string): void {
|
|
394
|
+
upsertPtyManifest({ id: surfaceId, kind: 'tui', ...(nickname ? { nickname } : {}), cmd: 'elanous', startedAt: now, now });
|
|
362
395
|
}
|
|
363
396
|
|
|
364
397
|
function defaultWriteFrame(surfaceId: string, text: string, now: number): void {
|
package/src/chat/chat-cli.ts
CHANGED
|
@@ -17,6 +17,10 @@ import type { DevChatOpts } from '../self-dev/dev-pipeline.js';
|
|
|
17
17
|
export interface ChatCliOpts {
|
|
18
18
|
session?: string;
|
|
19
19
|
new?: boolean;
|
|
20
|
+
/** `--continue` — 활성 세션 이어하기(명시). 대표 #73: 기본은 새 세션. */
|
|
21
|
+
continue?: boolean;
|
|
22
|
+
/** `--resume [id]` — id 면 그 세션, 값 없이(true) 면 활성 세션. */
|
|
23
|
+
resume?: string | boolean;
|
|
20
24
|
json?: boolean;
|
|
21
25
|
tools?: boolean;
|
|
22
26
|
goalLoop?: boolean;
|
|
@@ -29,13 +33,17 @@ export interface ChatCliDeps {
|
|
|
29
33
|
runDevPipeline?: typeof runDevPipeline;
|
|
30
34
|
}
|
|
31
35
|
|
|
32
|
-
/** CLI 옵션 → DevChatOpts(--new→forceNew·나머지 boolean 정규화).
|
|
36
|
+
/** CLI 옵션 → DevChatOpts(--new→forceNew·--continue/--resume→continueActive·나머지 boolean 정규화).
|
|
37
|
+
* 대표 #73 — reuseActive 는 dispatch 클로저에서 continueActive 로만 켠다(인자 없음 = 새 세션).
|
|
33
38
|
* session 은 `!== undefined` 로 통과(원 액션 explicitSessionId:opts.session 과 정확 등가 — 빈 문자열도 그대로,
|
|
34
39
|
* runChatTurnCli 가 falsy 처리해 결과는 동일하나 중간값까지 무손실 유지). */
|
|
35
40
|
export function toDevChatOpts(opts: ChatCliOpts): DevChatOpts {
|
|
36
41
|
return {
|
|
37
|
-
...(opts.session !== undefined
|
|
42
|
+
...(opts.session !== undefined
|
|
43
|
+
? { session: opts.session }
|
|
44
|
+
: typeof opts.resume === 'string' ? { session: opts.resume } : {}),
|
|
38
45
|
forceNew: opts.new === true,
|
|
46
|
+
continueActive: opts.continue === true || opts.resume === true,
|
|
39
47
|
json: opts.json === true,
|
|
40
48
|
enableTools: opts.tools === true,
|
|
41
49
|
goalLoop: opts.goalLoop === true,
|
package/src/chat/index.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Integrates into the dashboard log pane as an inline chat
|
|
3
3
|
|
|
4
4
|
import { getGrokApiKey, GROK_MODEL, GROK_API_URL } from '../config.js';
|
|
5
|
-
import { C, ansi, KeyStreamParser, readKey, traceKey, traceKeyListener, termSize, pad, visibleWidth, stripAnsi, truncate, render, hLine, closeTui, resetRenderCache, invalidateRenderCacheFromRow, injectKey } from '../tui.js';
|
|
5
|
+
import { C, ansi, KeyStreamParser, readKey, traceKey, traceKeyListener, termSize, pad, visibleWidth, stripAnsi, truncate, render, hLine, closeTui, resetRenderCache, invalidateRenderCacheFromRow, injectKey, takeInjectedKeys, cancelPendingReadKey } from '../tui.js';
|
|
6
6
|
import { paintCursorMove, paintCursorVisibility, type CursorState } from '../display/cursor-state.js';
|
|
7
7
|
import { firstVisibleInputLineIdx, inputLineWindow } from '../display/prompt-frame.js';
|
|
8
8
|
import { createChatPickerFamilySource, createChatPickerFamilySources } from './pickers/modals.js';
|
|
@@ -211,6 +211,8 @@ export interface TextInputHost {
|
|
|
211
211
|
* exactly as if the user had typed Enter. Reset to undefined on
|
|
212
212
|
* textInput return. */
|
|
213
213
|
submit?: (request?: string | TextInputExternalSubmitRequest) => void;
|
|
214
|
+
/** Live buffer text while textInput is mounted; undefined after it returns. */
|
|
215
|
+
getBufferText?: () => string;
|
|
214
216
|
};
|
|
215
217
|
onLinesChange?: (visibleLines: number) => void;
|
|
216
218
|
/** Preferred host seam for input-global shortcuts. textInput emits a
|
|
@@ -230,6 +232,7 @@ export interface ResolvedTextInputHost {
|
|
|
230
232
|
repaint: () => void;
|
|
231
233
|
insertAtCursor?: (text: string) => void;
|
|
232
234
|
submit?: (request?: string | TextInputExternalSubmitRequest) => void;
|
|
235
|
+
getBufferText?: () => string;
|
|
233
236
|
};
|
|
234
237
|
onLinesChange?: (visibleLines: number) => void;
|
|
235
238
|
dispatchGlobalAction?: (action: TextInputGlobalAction) => void | Promise<void>;
|
|
@@ -245,6 +248,8 @@ export interface TextInputRenderActions {
|
|
|
245
248
|
repaintUserMutation: () => void;
|
|
246
249
|
}
|
|
247
250
|
|
|
251
|
+
/** Prefix painted in place of the prompt on input continuation rows. */
|
|
252
|
+
const TEXT_INPUT_CONTINUATION_PREFIX = ' \u00B7 ';
|
|
248
253
|
const TEXT_INPUT_CURSOR_PROTOCOL_ENABLE = '\x1b[>1u\x1b[>4;2m';
|
|
249
254
|
const TEXT_INPUT_CURSOR_PROTOCOL_DISABLE = '\x1b[<u\x1b[>4;0m';
|
|
250
255
|
const SYNCHRONIZED_OUTPUT_BEGIN = '\x1b[?2026h';
|
|
@@ -473,7 +478,7 @@ export const SLASH_COMMANDS: SlashCommand[] = [
|
|
|
473
478
|
{ name: 'sync', aliases: ['s'], description: 'Enter sync mode' },
|
|
474
479
|
{ name: 'plugin', aliases: ['plugins'], description: 'Manage plugins', subcommands: ['list', 'activate', 'deactivate', 'reload'] },
|
|
475
480
|
{ name: 'widget', aliases: ['widgets'], description: 'Manage widgets', subcommands: ['list', 'reload', 'instances'] },
|
|
476
|
-
{ name: 'log', aliases: [], description: 'Chat Log controls — size / clear / filter / search / freeze / solo / turn / fold / help', subcommands: ['size', 'clear', 'filter', 'search', 'freeze', 'solo', 'turn', 'fold', 'help'] },
|
|
481
|
+
{ name: 'log', aliases: [], description: 'Chat Log controls — size / clear / filter / search / freeze / solo / turn / fold / unfold / help', subcommands: ['size', 'clear', 'filter', 'search', 'freeze', 'solo', 'turn', 'fold', 'unfold', 'help'] },
|
|
477
482
|
{ name: 'loops', aliases: [], description: '루프와 크론 상태 표 — /loops [owner]' },
|
|
478
483
|
{ name: 'board', aliases: [], description: '판 체크리스트 — /board [판]' },
|
|
479
484
|
{ name: 'memory', aliases: ['mem'], description: 'Memory ops — list / show / search / add / delete (see `elanous memory --help`)', subcommands: ['list', 'show', 'search', 'add', 'delete', 'index'] },
|
|
@@ -496,7 +501,7 @@ export const SLASH_COMMANDS: SlashCommand[] = [
|
|
|
496
501
|
{ name: 'telegram', aliases: ['tg'], description: 'Telegram bot — status / pair / send / pause / stop / attach / detach / sessions', subcommands: ['status', 'pair', 'setup', 'send', 'pause', 'stop', 'attach', 'detach', 'sessions'] },
|
|
497
502
|
{ name: 'tablet', aliases: [], description: 'Tablet mode — collapse layout to log + input', subcommands: ['on', 'off', 'toggle', 'auto', 'status', 'browser-preview', 'bp'] },
|
|
498
503
|
{ name: 'surface', aliases: [], description: 'Surface control — open a pane/catalog launcher (/surface catalog · browser · preview · log · scratch · obsidian · skill) OR set a preferred LLM surface (/surface coding-agent · research-agent · control-agent · ops-agent · … · clear · status)', subcommands: ['catalog', 'browser', 'preview', 'browser-preview', 'log', 'scratch', 'obsidian', 'skill', 'skill-file', 'agents', 'coding-agent', 'coding-chat', 'research-agent', 'research-chat', 'control-agent', 'ops-ui-agent', 'ops-fleet-agent', 'ops-agent', 'clear', 'status'] },
|
|
499
|
-
{ name: 'term', aliases: ['terminal'], description: 'Interactive terminal modal —
|
|
504
|
+
{ name: 'term', aliases: ['terminal'], description: 'Interactive terminal modal — new / list / attach / detach / switch / kill / snapshot / resume', subcommands: ['new', 'list', 'attach', 'detach', 'switch', 'kill', 'snapshot', 'resume'] },
|
|
500
505
|
{ name: 'claude', aliases: [], description: 'Spawn claude-code CLI in a terminal modal' },
|
|
501
506
|
{ name: 'codex', aliases: [], description: 'Spawn codex CLI in a terminal modal' },
|
|
502
507
|
{ name: 'gemini', aliases: [], description: 'Spawn gemini CLI in a terminal modal' },
|
|
@@ -675,6 +680,20 @@ export interface InputResult {
|
|
|
675
680
|
* similar. textInput itself doesn't act on the chord beyond
|
|
676
681
|
* returning — the host decides. */
|
|
677
682
|
saved?: boolean;
|
|
683
|
+
/** H2 내부 턴 문 — 입력칸이 «비켜 줬다»(버퍼가 비어 있었다). 텍스트 없음 · 제출 아님. 호스트는
|
|
684
|
+
* 내부 턴 문(`InternalTurnGate.takePending`)에서 실행할 턴을 꺼낸다. */
|
|
685
|
+
yieldedToInternalTurn?: true;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
/** H2 내부 턴 문이 마운트된 textInput 에 «비켜 달라»를 청하는 자리.
|
|
689
|
+
* ⛔ 입력칸 버퍼·합성 키를 쓰지 않는다 — textInput 은 버퍼가 «비었을 때만» 스스로 물러난다. */
|
|
690
|
+
export interface TextInputInternalTurnYieldPort {
|
|
691
|
+
/** textInput 이 마운트되면 부른다. 넘긴 함수는 버퍼가 비었으면 true(물러남 예약), 아니면 false. */
|
|
692
|
+
attach(requestYield: () => boolean): void;
|
|
693
|
+
/** textInput 이 내려가면 부른다. `yielded` 가 아니면 열린 내부 턴은 거둬진다(사람이 먼저 끝냈다). */
|
|
694
|
+
detach(opts?: { yielded?: boolean }): void;
|
|
695
|
+
/** 물러남을 예약한 뒤 그 사이 사람이 글자를 넣어 «물러나지 않았다». */
|
|
696
|
+
declined?(detail: string): void;
|
|
678
697
|
}
|
|
679
698
|
|
|
680
699
|
export interface TextInputExternalSubmitRequest {
|
|
@@ -693,6 +712,7 @@ export async function textInput(opts: {
|
|
|
693
712
|
getRow?: () => number;
|
|
694
713
|
col: number;
|
|
695
714
|
width: number;
|
|
715
|
+
getWidth?: () => number;
|
|
696
716
|
maxLines?: number;
|
|
697
717
|
prompt?: string;
|
|
698
718
|
placeholder?: string;
|
|
@@ -891,8 +911,11 @@ export async function textInput(opts: {
|
|
|
891
911
|
* side-effect boundary instead of a flat callback bag. Legacy
|
|
892
912
|
* fields above remain supported for compatibility/tests. */
|
|
893
913
|
host?: TextInputHost;
|
|
914
|
+
/** H2 내부 턴 문 — 버퍼가 비었을 때 입력 루프가 물러나 호스트가 내부 턴을 실행하게 한다. */
|
|
915
|
+
internalTurnYield?: TextInputInternalTurnYieldPort;
|
|
894
916
|
}): Promise<InputResult> {
|
|
895
917
|
const { row: initialRow, col, width, maxLines = 5, prompt = '\u276f ', placeholder = '' } = opts;
|
|
918
|
+
const getWidth = (): number => opts.getWidth?.() ?? width;
|
|
896
919
|
const getRow = (): number => opts.getRow?.() ?? initialRow;
|
|
897
920
|
const row = getRow();
|
|
898
921
|
// P2.1: report the input's top row so writeTerminal scopes its
|
|
@@ -902,7 +925,8 @@ export async function textInput(opts: {
|
|
|
902
925
|
setInputPromptStartRow(row);
|
|
903
926
|
const commands = opts.commands ?? SLASH_COMMANDS;
|
|
904
927
|
const history = opts.history ?? [];
|
|
905
|
-
|
|
928
|
+
// 턴 중 typeahead 가 Shift+Enter 로 만든 여러 줄 prefill 은 줄 단위로 연다.
|
|
929
|
+
let lines: string[] = (opts.initialText ?? '').split('\n');
|
|
906
930
|
// Line-count reporting: only fires when the visible count actually
|
|
907
931
|
// changes, so hosts don't re-render on every keystroke.
|
|
908
932
|
const resolvedHost = resolveTextInputHost(opts);
|
|
@@ -910,8 +934,8 @@ export async function textInput(opts: {
|
|
|
910
934
|
const onLinesChangeHandler = resolvedHost.onLinesChange;
|
|
911
935
|
const dispatchGlobalAction = resolvedHost.dispatchGlobalAction;
|
|
912
936
|
let lastReportedLines = -1;
|
|
913
|
-
let lineIdx =
|
|
914
|
-
let colIdx = lines[
|
|
937
|
+
let lineIdx = lines.length - 1; // current line
|
|
938
|
+
let colIdx = lines[lineIdx]!.length; // cursor at end of initial text
|
|
915
939
|
let ctrlCArmedAt: number | null = null;
|
|
916
940
|
let ctrlCHintTimer: ReturnType<typeof setTimeout> | null = null;
|
|
917
941
|
let ctrlCHint: string | null = null;
|
|
@@ -985,7 +1009,7 @@ export async function textInput(opts: {
|
|
|
985
1009
|
picker,
|
|
986
1010
|
getBufferView: bufView,
|
|
987
1011
|
writeTerminal,
|
|
988
|
-
getBounds: () => ({ row: getRow(), col, width, height: 1 }),
|
|
1012
|
+
getBounds: () => ({ row: getRow(), col, width: getWidth(), height: 1 }),
|
|
989
1013
|
getInputZoneHeight: () => Math.min(lines.length, maxLines),
|
|
990
1014
|
onDispatchResult: async (dispatched) => processPickerDispatch(dispatched),
|
|
991
1015
|
});
|
|
@@ -1129,7 +1153,12 @@ export async function textInput(opts: {
|
|
|
1129
1153
|
setInputPromptStartRow(row);
|
|
1130
1154
|
const promptStr = C.accent(prompt);
|
|
1131
1155
|
const promptW = visibleWidth(prompt);
|
|
1132
|
-
|
|
1156
|
+
// Continuation rows carry a 4-cell ` · ` prefix instead of the prompt,
|
|
1157
|
+
// so each row gets its own text width — sharing the first row's width
|
|
1158
|
+
// let continuation rows overrun the terminal by `contPfxW - promptW` cells.
|
|
1159
|
+
const contPfxW = visibleWidth(TEXT_INPUT_CONTINUATION_PREFIX);
|
|
1160
|
+
const textWFor = (idx: number): number =>
|
|
1161
|
+
Math.max(0, getWidth() - (idx === 0 ? promptW : contPfxW) - 1);
|
|
1133
1162
|
const numLines = lines.length;
|
|
1134
1163
|
// Visible window: at most `maxLines` rows on screen, but the buffer
|
|
1135
1164
|
// (`lines`) may exceed that. `firstVisibleIdx` keeps the cursor's
|
|
@@ -1172,16 +1201,17 @@ export async function textInput(opts: {
|
|
|
1172
1201
|
if (i < visibleLines) {
|
|
1173
1202
|
const lineIdxInArray = firstVisibleIdx + (visibleLines - 1 - i);
|
|
1174
1203
|
const lineContent = lines[lineIdxInArray]!;
|
|
1175
|
-
const pfx = lineIdxInArray === 0 ? promptStr : C.muted(
|
|
1204
|
+
const pfx = lineIdxInArray === 0 ? promptStr : C.muted(TEXT_INPUT_CONTINUATION_PREFIX);
|
|
1205
|
+
const rowTextW = textWFor(lineIdxInArray);
|
|
1176
1206
|
const display = lineIdxInArray === 0 && numLines === 1 && !lineContent
|
|
1177
|
-
? truncate(C.muted(placeholder), Math.max(0,
|
|
1207
|
+
? truncate(C.muted(placeholder), Math.max(0, rowTextW))
|
|
1178
1208
|
: inputLineWindow(
|
|
1179
1209
|
lineContent,
|
|
1180
1210
|
lineIdxInArray === lineIdx ? colIdx : lineContent.length,
|
|
1181
|
-
|
|
1211
|
+
rowTextW,
|
|
1182
1212
|
).display;
|
|
1183
1213
|
|
|
1184
|
-
const padded = display + ' '.repeat(Math.max(0,
|
|
1214
|
+
const padded = display + ' '.repeat(Math.max(0, rowTextW - visibleWidth(display)));
|
|
1185
1215
|
writeTerminal(ansi.moveTo(r, col) + '\x1b[2K' + pfx + padded);
|
|
1186
1216
|
} else {
|
|
1187
1217
|
// This row had content on the previous paint but doesn't anymore
|
|
@@ -1194,7 +1224,7 @@ export async function textInput(opts: {
|
|
|
1194
1224
|
prevDrawnLines = visibleLines;
|
|
1195
1225
|
|
|
1196
1226
|
if (ctrlCHint) {
|
|
1197
|
-
writeTerminal(ansi.moveTo(row + 2, col) + '\x1b[2K' + C.muted(truncate(ctrlCHint,
|
|
1227
|
+
writeTerminal(ansi.moveTo(row + 2, col) + '\x1b[2K' + C.muted(truncate(ctrlCHint, getWidth())));
|
|
1198
1228
|
ctrlCHintPainted = true;
|
|
1199
1229
|
} else if (ctrlCHintPainted) {
|
|
1200
1230
|
writeTerminal(ansi.moveTo(row + 2, col) + '\x1b[2K');
|
|
@@ -1211,8 +1241,8 @@ export async function textInput(opts: {
|
|
|
1211
1241
|
Math.min(lineIdx - firstVisibleIdx, visibleLines - 1),
|
|
1212
1242
|
);
|
|
1213
1243
|
const curR = row - (visibleLines - 1 - cursorScreenLine);
|
|
1214
|
-
const pfxW = lineIdx === 0 ? visibleWidth(prompt) :
|
|
1215
|
-
const { cursorCol } = inputLineWindow(lines[lineIdx]!, colIdx,
|
|
1244
|
+
const pfxW = lineIdx === 0 ? visibleWidth(prompt) : contPfxW;
|
|
1245
|
+
const { cursorCol } = inputLineWindow(lines[lineIdx]!, colIdx, textWFor(lineIdx));
|
|
1216
1246
|
const curX = col + pfxW + cursorCol;
|
|
1217
1247
|
// P2.2.c — coordinator owns the cursor emit when wired; falls
|
|
1218
1248
|
// back to direct stdout for non-coordinator callers (tests, non-dashboard
|
|
@@ -1248,7 +1278,7 @@ export async function textInput(opts: {
|
|
|
1248
1278
|
};
|
|
1249
1279
|
|
|
1250
1280
|
const pickerModalFamily = pickerModalRuntime.createFamily({
|
|
1251
|
-
bounds: { row: getRow(), col, width, height: 1 },
|
|
1281
|
+
bounds: { row: getRow(), col, width: getWidth(), height: 1 },
|
|
1252
1282
|
sources: createChatPickerFamilySources({
|
|
1253
1283
|
// 명시 K — createChatPickerFamilySource<K> 의 K 를 pin. getItems 반환이
|
|
1254
1284
|
// conditional 타입 ChatPickerItems<K> 라 역추론이 K 를 union(ChatPickerKind)
|
|
@@ -1282,7 +1312,7 @@ export async function textInput(opts: {
|
|
|
1282
1312
|
pickerModalRuntime.syncFamily({
|
|
1283
1313
|
activeKind: activePickerKind(),
|
|
1284
1314
|
clearRows: MAX_PICKER + 3,
|
|
1285
|
-
debugLayout: { row, col, width },
|
|
1315
|
+
debugLayout: { row: getRow(), col, width: getWidth() },
|
|
1286
1316
|
family: pickerModalFamily,
|
|
1287
1317
|
});
|
|
1288
1318
|
};
|
|
@@ -1295,7 +1325,7 @@ export async function textInput(opts: {
|
|
|
1295
1325
|
const searchRow = row;
|
|
1296
1326
|
const promptStr = C.accent(prompt);
|
|
1297
1327
|
const promptW = visibleWidth(prompt);
|
|
1298
|
-
const textW =
|
|
1328
|
+
const textW = Math.max(0, getWidth() - promptW - 1);
|
|
1299
1329
|
const match = currentReverseSearchResult();
|
|
1300
1330
|
const status = match ? 'reverse-i-search' : 'failed reverse-i-search';
|
|
1301
1331
|
const prefixRaw = `(${status})\`${reverseSearch.query}': `;
|
|
@@ -1375,6 +1405,9 @@ export async function textInput(opts: {
|
|
|
1375
1405
|
const drawAll = renderActions.repaintUserMutation;
|
|
1376
1406
|
let pendingExternalSubmitSource: InputSourceRef | undefined;
|
|
1377
1407
|
const finalizeInput = (result: InputResult): InputResult => {
|
|
1408
|
+
// 외부 주입 라우터가 «composer 가 안 떠 있다»를 알 수 있게 내린다.
|
|
1409
|
+
if (hostControl) hostControl.getBufferText = undefined;
|
|
1410
|
+
detachInternalTurnYield(result.yieldedToInternalTurn === true);
|
|
1378
1411
|
clearPicker();
|
|
1379
1412
|
writeTerminal(endTextInputCursor(opts.cursorSink));
|
|
1380
1413
|
return result;
|
|
@@ -1420,23 +1453,61 @@ export async function textInput(opts: {
|
|
|
1420
1453
|
// Enter into the readKey queue so the main loop returns the
|
|
1421
1454
|
// submit outcome exactly like a typed Enter. Reset to
|
|
1422
1455
|
// undefined on textInput return.
|
|
1456
|
+
hostControl.getBufferText = () => lines.join('\n');
|
|
1423
1457
|
hostControl.submit = (request?: string | TextInputExternalSubmitRequest) => {
|
|
1424
1458
|
const nextText = typeof request === 'string' ? request : request?.text;
|
|
1459
|
+
// 합성 Enter 가 못 들어가면 버퍼·커서·출처를 «통째로» 되돌린다 — 외부 글이 composer 에 남아
|
|
1460
|
+
// 사용자 입력과 섞이거나 대기열이 다시 보내 중복되지 않게(원자적 제출).
|
|
1461
|
+
const before = { lines: [...lines], lineIdx, colIdx, source: pendingExternalSubmitSource };
|
|
1425
1462
|
pendingExternalSubmitSource = typeof request === 'string' ? undefined : request?.source;
|
|
1426
1463
|
if (nextText !== undefined) {
|
|
1427
1464
|
const next = nextText.split('\n');
|
|
1428
1465
|
lines = next.length > 0 ? next : [''];
|
|
1429
1466
|
lineIdx = lines.length - 1;
|
|
1430
1467
|
colIdx = lines[lineIdx]!.length;
|
|
1431
|
-
drawAll();
|
|
1432
1468
|
}
|
|
1433
|
-
|
|
1469
|
+
// 반환값 = 합성 Enter 가 키 큐에 들어갔나(raw 모드가 아니면 false) — 외부 입력 대기열이 유실을 막는 데 쓴다.
|
|
1470
|
+
const accepted = injectKey({ name: 'enter', ctrl: false, shift: false });
|
|
1471
|
+
if (!accepted) {
|
|
1472
|
+
lines = before.lines; lineIdx = before.lineIdx; colIdx = before.colIdx;
|
|
1473
|
+
pendingExternalSubmitSource = before.source;
|
|
1474
|
+
}
|
|
1475
|
+
// 렌더 실패가 수락 결과를 뒤집으면 이미 큐에 든 Enter 와 대기열이 같은 글을 두 번 보낸다 — 삼킨다.
|
|
1476
|
+
if (nextText !== undefined) {
|
|
1477
|
+
try { drawAll(); } catch (error) { debug.log('chat.input', 'external-submit-draw-failed', { accepted, error: String(error) }); }
|
|
1478
|
+
}
|
|
1479
|
+
return accepted;
|
|
1434
1480
|
};
|
|
1435
1481
|
}
|
|
1436
1482
|
|
|
1483
|
+
// ⭐ H2 내부 턴 문 — 버퍼가 비었을 때만 물러남을 예약하고 걸린 readKey 를 «빈 키»로 깨운다.
|
|
1484
|
+
// ⛔ 버퍼·커서·키 큐는 건드리지 않는다(대표 비침투). 마운트가 끝나면(어느 반환 길이든) 무효다.
|
|
1485
|
+
let internalYieldRequested = false;
|
|
1486
|
+
let internalYieldMounted = true;
|
|
1487
|
+
function detachInternalTurnYield(yielded = false): void {
|
|
1488
|
+
if (!internalYieldMounted) return;
|
|
1489
|
+
internalYieldMounted = false;
|
|
1490
|
+
internalYieldRequested = false;
|
|
1491
|
+
opts.internalTurnYield?.detach({ yielded });
|
|
1492
|
+
}
|
|
1493
|
+
opts.internalTurnYield?.attach(() => {
|
|
1494
|
+
if (!internalYieldMounted || lines.join('\n').length > 0) return false;
|
|
1495
|
+
internalYieldRequested = true;
|
|
1496
|
+
cancelPendingReadKey();
|
|
1497
|
+
return true;
|
|
1498
|
+
});
|
|
1499
|
+
|
|
1437
1500
|
drawAll();
|
|
1438
1501
|
|
|
1439
1502
|
while (true) {
|
|
1503
|
+
if (internalYieldRequested) {
|
|
1504
|
+
internalYieldRequested = false;
|
|
1505
|
+
if (lines.join('\n').length === 0) {
|
|
1506
|
+
return finalizeInput({ text: '', submitted: false, yieldedToInternalTurn: true });
|
|
1507
|
+
}
|
|
1508
|
+
// 판정과 물러남 사이에 사람이 글자를 넣었다 — 사람이 먼저다.
|
|
1509
|
+
opts.internalTurnYield?.declined?.('buffer');
|
|
1510
|
+
}
|
|
1440
1511
|
// IDX-F2.5 — picker.onKey may have set pendingSubmit on the
|
|
1441
1512
|
// previous iteration (the closure can't return from textInput
|
|
1442
1513
|
// itself). Consume the signal at the top of the loop, tear
|
|
@@ -1451,6 +1522,7 @@ export async function textInput(opts: {
|
|
|
1451
1522
|
}
|
|
1452
1523
|
|
|
1453
1524
|
const key = await (opts.readKey ?? (() => readKey('input')))();
|
|
1525
|
+
if (internalYieldRequested && !key.name) continue; // H2 — 내부 턴 문이 깨운 빈 키
|
|
1454
1526
|
traceAfterSubmitKey(key);
|
|
1455
1527
|
|
|
1456
1528
|
// Raw-key trace — diagnoses "modifier bit dropped before global-action
|
|
@@ -1650,6 +1722,8 @@ export async function textInput(opts: {
|
|
|
1650
1722
|
// Host owns the focus swap; we return gotoPane:true so the
|
|
1651
1723
|
// input loop exits cleanly and the dashboard's pane dispatcher
|
|
1652
1724
|
// picks up the keys.
|
|
1725
|
+
if (hostControl) hostControl.getBufferText = undefined;
|
|
1726
|
+
detachInternalTurnYield();
|
|
1653
1727
|
return { text: '', submitted: false, gotoPane: true };
|
|
1654
1728
|
}
|
|
1655
1729
|
drawAll();
|
|
@@ -1980,8 +2054,18 @@ export function attachStreamingKeys(
|
|
|
1980
2054
|
// ⭐ 창 길이는 `readKey` 와 같은 25ms — 두 진입점이 같은 규칙을 쓴다.
|
|
1981
2055
|
let escapeTimer: ReturnType<typeof setTimeout> | undefined;
|
|
1982
2056
|
const clearEscapeTimer = () => { if (escapeTimer) { clearTimeout(escapeTimer); escapeTimer = undefined; } };
|
|
2057
|
+
// ⭐ TUI-ESC-ABORT-TOOLS (2026-10-15) — 바깥 키(`pty key` · 제어 IPC input-key)는 stdin 이
|
|
2058
|
+
// 아니라 `injectKey` 큐로 들어오고 빈 청크로 깨울 뿐이다. 이 리스너가 큐를 안 보면 턴 중
|
|
2059
|
+
// Esc 가 escGate 에 닿지 않고 다음 readKey(턴 끝)까지 잠든다. 주입이 먼저 왔으므로 먼저 배달한다.
|
|
2060
|
+
const deliverInjected = () => {
|
|
2061
|
+
const injected = takeInjectedKeys();
|
|
2062
|
+
if (injected.length === 0) return;
|
|
2063
|
+
for (const key of injected) debug.log('tui.input', 'injected-key-stream-delivered', { key: key.name });
|
|
2064
|
+
deliver(injected);
|
|
2065
|
+
};
|
|
1983
2066
|
const listener = (data: string | Buffer) => {
|
|
1984
2067
|
clearEscapeTimer();
|
|
2068
|
+
deliverInjected();
|
|
1985
2069
|
const keys = parser.push(data);
|
|
1986
2070
|
deliver(keys);
|
|
1987
2071
|
// ⚠️ `unref()` — 이 타이머가 프로세스를 붙잡아 두면 안 된다(입력 대기는 stdin 의 몫).
|
|
@@ -2012,6 +2096,9 @@ export function attachStreamingKeys(
|
|
|
2012
2096
|
// leaves streaming typeahead and lone Escape with no events at all.
|
|
2013
2097
|
process.stdin.resume();
|
|
2014
2098
|
traceKeyListener('attach', 'stream');
|
|
2099
|
+
// 턴 시작 «전»에 주입돼 큐에 남은 키도 배달한다 — 마이크로태스크로 미뤄 호출자가 cleanup 을
|
|
2100
|
+
// 손에 쥔 뒤에 handler 가 불리게 한다.
|
|
2101
|
+
queueMicrotask(() => { if (!cleanedUp) deliverInjected(); });
|
|
2015
2102
|
return () => {
|
|
2016
2103
|
if (cleanedUp) return;
|
|
2017
2104
|
cleanedUp = true;
|
|
@@ -16,22 +16,24 @@ export interface TextInputControlState {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export function resolveTextInputControlAction(
|
|
19
|
-
key: Pick<Key, 'name' | 'ctrl' | 'shift'
|
|
19
|
+
key: Pick<Key, 'name' | 'ctrl' | 'shift'> & { alt?: boolean },
|
|
20
20
|
state: TextInputControlState,
|
|
21
21
|
): TextInputControlAction {
|
|
22
22
|
const stripTrailingBackslash =
|
|
23
23
|
key.name === 'enter'
|
|
24
24
|
&& state.cursor > 0
|
|
25
25
|
&& state.currentLine[state.cursor - 1] === '\\';
|
|
26
|
+
// ⭐ Alt+Enter 도 줄바꿈이다 — kitty 프로토콜을 켠 멀티플렉서(herdr)는 바깥의 `ESC CR` 을
|
|
27
|
+
// `CSI 13;3u`(alt) 로 바꿔 넘긴다. 종전엔 그 꼴이 «제출»로 떨어져 대체 키가 죽어 있었다.
|
|
26
28
|
const isNewline =
|
|
27
|
-
(key.name === 'enter' && key.shift)
|
|
29
|
+
(key.name === 'enter' && (key.shift || key.alt === true))
|
|
28
30
|
|| (key.name === 'j' && key.ctrl)
|
|
29
31
|
|| stripTrailingBackslash;
|
|
30
32
|
|
|
31
33
|
if (isNewline) {
|
|
32
34
|
return { kind: 'newline', stripTrailingBackslash };
|
|
33
35
|
}
|
|
34
|
-
if (key.name === 'enter' && !key.shift) {
|
|
36
|
+
if (key.name === 'enter' && !key.shift && !key.alt) {
|
|
35
37
|
return { kind: 'submit' };
|
|
36
38
|
}
|
|
37
39
|
if (key.name === 'escape') {
|
|
@@ -145,6 +145,7 @@ export function createChatPickerModalRuntime(deps: ChatPickerModalRuntimeDeps):
|
|
|
145
145
|
maxVisible: spec.maxVisible,
|
|
146
146
|
getInputZoneHeight: deps.getInputZoneHeight,
|
|
147
147
|
width: deps.getBounds().width,
|
|
148
|
+
getWidth: () => deps.getBounds().width,
|
|
148
149
|
onKey: makePickerOnKey(kind),
|
|
149
150
|
onRowClick: makePickerOnRowClick(kind),
|
|
150
151
|
});
|
|
@@ -107,6 +107,7 @@ export interface ChatPickerModalBindings {
|
|
|
107
107
|
maxVisible: number;
|
|
108
108
|
getInputZoneHeight: () => number;
|
|
109
109
|
width: number;
|
|
110
|
+
getWidth?: () => number;
|
|
110
111
|
onKey?: PickerOnKey;
|
|
111
112
|
onRowClick?: PickerOnRowClick;
|
|
112
113
|
}
|
|
@@ -122,6 +123,7 @@ type FramedPickerSpec<T> = {
|
|
|
122
123
|
maxVisible: number;
|
|
123
124
|
getInputZoneHeight: () => number;
|
|
124
125
|
width: number;
|
|
126
|
+
getWidth?: () => number;
|
|
125
127
|
onKey?: PickerOnKey;
|
|
126
128
|
onRowClick?: PickerOnRowClick;
|
|
127
129
|
};
|
|
@@ -140,7 +142,7 @@ function createFramedPickerModal<T>(spec: FramedPickerSpec<T>): ModalSurface {
|
|
|
140
142
|
if (visibleCount <= 0) return null;
|
|
141
143
|
const height = visibleCount + 3;
|
|
142
144
|
const row = bottomRow - height + 1;
|
|
143
|
-
return { row, col: spec.bounds.col, width: spec.width, height, startIdx, visibleCount };
|
|
145
|
+
return { row, col: spec.bounds.col, width: spec.getWidth?.() ?? spec.width, height, startIdx, visibleCount };
|
|
144
146
|
};
|
|
145
147
|
|
|
146
148
|
/** Phase 4.5a (substrate Occam · §4-pre.7 · 2026-05-03) — update
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// ── 도구별 «제출로 끊어도 되나» 선언 (10-14 · 대표 «지금 밀어 넣기») ─────────────────
|
|
2
|
+
//
|
|
3
|
+
// 턴 중에 사용자가 «지금 밀어 넣기»를 하면, 도는 도구가 «전부» `cancel` 일 때만 턴을 끊고 그 발화로
|
|
4
|
+
// 바로 이어 간다. 하나라도 `block` 이면 끊지 않고 다음 도구 경계에 최우선으로 넣는다.
|
|
5
|
+
// ⭐ 기본은 `block` 이다 — 모르는 도구(쓰기·실행·자식 띄우기)를 «끊어도 된다»로 읽지 않는다.
|
|
6
|
+
// ⭐ `cancel` 은 부작용 없는 읽기·대기 도구만 — 끊으면 결과를 버릴 뿐 바깥 상태가 안 바뀐다.
|
|
7
|
+
// (Claude Code `Tool.interruptBehavior()` 계약과 같은 축 · 기본 block)
|
|
8
|
+
// ⚠️ 이 표가 «도구 선언 칸»이다. TUI 는 도는 도구의 «이름»만 알아서 스펙 객체가 아니라 이름으로 선언한다.
|
|
9
|
+
// 새 읽기 전용 도구를 더하면 여기 한 줄을 더한다.
|
|
10
|
+
|
|
11
|
+
export type ToolInterruptBehavior = 'cancel' | 'block';
|
|
12
|
+
|
|
13
|
+
const DECLARED: ReadonlyMap<string, ToolInterruptBehavior> = new Map<string, ToolInterruptBehavior>([
|
|
14
|
+
['Read', 'cancel'],
|
|
15
|
+
['Grep', 'cancel'],
|
|
16
|
+
['Glob', 'cancel'],
|
|
17
|
+
['ListDir', 'cancel'],
|
|
18
|
+
['WebSearch', 'cancel'],
|
|
19
|
+
['WebFetch', 'cancel'],
|
|
20
|
+
// 대기·조회 — 끊어도 자식은 산다(턴만 끊는다).
|
|
21
|
+
['AgentOutput', 'cancel'],
|
|
22
|
+
['AgentList', 'cancel'],
|
|
23
|
+
['TaskGet', 'cancel'],
|
|
24
|
+
['TaskList', 'cancel'],
|
|
25
|
+
]);
|
|
26
|
+
|
|
27
|
+
export function toolInterruptBehavior(name: string): ToolInterruptBehavior {
|
|
28
|
+
return DECLARED.get(name) ?? 'block';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* 도는 도구가 «전부» 끊어도 되는가. 도는 도구가 없으면(모델이 글을 쓰는 중) 참이다.
|
|
33
|
+
* 막는 도구 이름을 함께 낸다(안내 줄용).
|
|
34
|
+
*/
|
|
35
|
+
export function canInterruptRunningTools(names: readonly string[]): { ok: boolean; blocking: string[] } {
|
|
36
|
+
const blocking = [...new Set(names.filter(name => toolInterruptBehavior(name) === 'block'))].sort();
|
|
37
|
+
return { ok: blocking.length === 0, blocking };
|
|
38
|
+
}
|
|
@@ -361,7 +361,11 @@ function extractSyntheticGuardSummary(result: unknown): string | null {
|
|
|
361
361
|
return 'inspect budget exhausted — summarize inspected files';
|
|
362
362
|
}
|
|
363
363
|
if (text.includes('TOOL CALL REJECTED')) {
|
|
364
|
-
|
|
364
|
+
// Only the turn-budget stub is a budget; phase guards (VERIFY/REPAIR/INSPECT ACTION
|
|
365
|
+
// REQUIRED …) reject a tool for the current phase and must not read as «budget» (#67).
|
|
366
|
+
if (text.includes('tool-loop budget exhausted')) return 'tool budget exhausted — final answer required';
|
|
367
|
+
const reason = /\b([A-Z][A-Z]+(?: [A-Z]+)* (?:REQUIRED|EXHAUSTED))\b/.exec(text)?.[1];
|
|
368
|
+
return reason ? `tool call rejected — ${reason.toLowerCase()}` : 'tool call rejected';
|
|
365
369
|
}
|
|
366
370
|
if (text.includes('RUNTIME BLOCKED')) {
|
|
367
371
|
return 'reuse current candidates';
|