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
|
@@ -16,7 +16,8 @@ const ESSENTIAL_KEYS = [
|
|
|
16
16
|
['Home / End', 'Move to start / end of line'],
|
|
17
17
|
['Ctrl+A / E', 'Move to start / end of line'],
|
|
18
18
|
['PgUp / PgDn', 'Scroll chat log'],
|
|
19
|
-
|
|
19
|
+
// 10-14 — 줄 수는 그대로(행 예산) · 큐는 다음 도구 경계에 들어가고, 빈 Enter 가 «지금 밀어 넣기»다.
|
|
20
|
+
['Ctrl+↑', 'Recall all queued lines (Enter while answering queues · empty Enter pushes now)'],
|
|
20
21
|
] as const;
|
|
21
22
|
|
|
22
23
|
function fitLine(text: string, width: number): string {
|
|
@@ -13,3 +13,16 @@ export {
|
|
|
13
13
|
type SkillToolSlashExecutor,
|
|
14
14
|
type SkillToolSlashResult,
|
|
15
15
|
} from './dashboard-handlers.js';
|
|
16
|
+
// TUI-SLASH-SPLIT-MISSION(D4b) — 새 집 src/tui/slash/mission.ts 의 공개 심볼을 옛 입구에서도 낸다(re-export shim · RFC A5).
|
|
17
|
+
export {
|
|
18
|
+
handleMissionSlash,
|
|
19
|
+
registerMissionSlash,
|
|
20
|
+
type MissionSlashContext,
|
|
21
|
+
} from '../../tui/slash/mission.js';
|
|
22
|
+
// TUI-SLASH-SPLIT-TERM(D4b) — 새 집 src/tui/slash/term.ts 의 공개 심볼을 옛 입구에서도 낸다(re-export shim · RFC A5).
|
|
23
|
+
export {
|
|
24
|
+
handleTermSlash,
|
|
25
|
+
registerTermSlash,
|
|
26
|
+
type TermSlashContext,
|
|
27
|
+
type TermSlashHost,
|
|
28
|
+
} from '../../tui/slash/term.js';
|
|
@@ -123,3 +123,38 @@ export function modelChangeLine(
|
|
|
123
123
|
const providerNote = resolution.target.provider === before.provider ? '' : ` · provider ${resolution.target.provider}`;
|
|
124
124
|
return `모델: ${currentLabel(before.provider, before.model, before.reasoning)} → ${after} (${resolution.target.model}${reasoningNote})${providerNote}`;
|
|
125
125
|
}
|
|
126
|
+
|
|
127
|
+
/** `/model` arguments: the choice word plus the `--global` flag (TUI-MODEL-SESSION-SCOPE · 10-14). */
|
|
128
|
+
export function parseModelSlashArgs(args: readonly string[]): { arg: string; global: boolean } {
|
|
129
|
+
const global = args.some((a) => a.trim().toLowerCase() === '--global');
|
|
130
|
+
const arg = args.find((a) => !a.trim().startsWith('--'))?.trim().toLowerCase() ?? '';
|
|
131
|
+
return { arg, global };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Where a `/model` choice lands. The default is this TUI session only (a pin that the next turn sends as an
|
|
136
|
+
* explicit model, so it beats the Codex tier policy); `--global` writes config. A choice on another provider
|
|
137
|
+
* can't be a session pin — the turn carries a model, not a provider — so it needs `--global`.
|
|
138
|
+
*/
|
|
139
|
+
export function modelSwitchScope(
|
|
140
|
+
targetProvider: LLMProviderName,
|
|
141
|
+
currentProvider: LLMProviderName,
|
|
142
|
+
global: boolean,
|
|
143
|
+
): 'session' | 'global' | 'needs-global' {
|
|
144
|
+
if (global) return 'global';
|
|
145
|
+
return targetProvider === currentProvider ? 'session' : 'needs-global';
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** The muted line under a switch: what scope it took and when it applies — no promise the code doesn't keep. */
|
|
149
|
+
export function modelScopeLine(
|
|
150
|
+
scope: 'session' | 'global',
|
|
151
|
+
reasoning?: { tier: ReasoningLevel; current: ReasoningLevel },
|
|
152
|
+
): string {
|
|
153
|
+
const where = scope === 'session'
|
|
154
|
+
? ' └─ 이 세션만 · 다음 턴부터 · 설정 파일은 그대로 (전역은 /model <이름> --global · 해제 /model reset)'
|
|
155
|
+
: ' └─ 설정 파일(전역)에 저장 · 이 세션은 다음 턴부터 · 다른 세션은 그 세션의 routePolicy 를 따른다 (codex 기본 정책이면 단계 모델이 이긴다)';
|
|
156
|
+
const think = reasoning && reasoning.tier !== reasoning.current
|
|
157
|
+
? ` · 생각 깊이는 그대로 ${reasoning.current} (이 단계는 ${reasoning.tier} — /reasoning ${reasoning.tier})`
|
|
158
|
+
: '';
|
|
159
|
+
return where + think;
|
|
160
|
+
}
|
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
|
|
3
|
+
/** The workdir is the source of truth for a seat shell; env is only a fallback. */
|
|
4
|
+
export function resolveTuiShellSeat(cwd: string, coordId?: string): string {
|
|
5
|
+
const parts = resolve(cwd).split(/[\\/]/);
|
|
6
|
+
const seatIndex = parts.lastIndexOf('seats');
|
|
7
|
+
const fromPath = seatIndex >= 0 ? parts[seatIndex + 1] : undefined;
|
|
8
|
+
const valid = (value: string | undefined): value is string =>
|
|
9
|
+
value !== undefined && /^[A-Za-z0-9_-]{1,64}$/.test(value);
|
|
10
|
+
if (valid(fromPath)) return fromPath;
|
|
11
|
+
const fromEnv = coordId?.trim();
|
|
12
|
+
return valid(fromEnv) ? fromEnv : 'unknown';
|
|
13
|
+
}
|
|
14
|
+
|
|
1
15
|
export interface DashboardPersistedSessionEntry {
|
|
2
16
|
id: string;
|
|
3
17
|
title: string;
|
|
@@ -109,6 +123,7 @@ export function createDashboardTermSlashRuntime(
|
|
|
109
123
|
'',
|
|
110
124
|
deps.accent('\u276f /term'),
|
|
111
125
|
deps.muted('Usage:'),
|
|
126
|
+
deps.muted(' /term new [command] Open a shell PTY (Ctrl+Shift+T or Alt+T).'),
|
|
112
127
|
deps.muted(' /term list List all alive sessions (fg / bg / exited).'),
|
|
113
128
|
deps.muted(' /term attach <id> Bring a backgrounded session to foreground.'),
|
|
114
129
|
deps.muted(' /term detach Send foreground session to background (PTY survives).'),
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// ── 턴 busy 표지 마감 (TUI-STALE-BUSY-MARKER · 0.2.31 · tui-op-issues #36·#37·#45·#54·#55·#58) ──
|
|
2
|
+
//
|
|
3
|
+
// S: 턴이 시작되면 `streamingInFlight = true` ⊕ `reportTuiTurn('busy')` 가 켜지고, 마감 closure 가
|
|
4
|
+
// 끄기 전까지 외부 입력 대기열(`isTurnActive`)·`eln pty state` 는 «바쁨»으로 본다.
|
|
5
|
+
// C: 마감 closure 안의 한 단계가 던지면(10-14 «✘ 실패 line.startsWith») 끄는 줄에 못 닿아 70분+ busy 가 남았다.
|
|
6
|
+
// #27721 이 settle 단계 하나를 try/finally 로 감쌌지만, 그 «앞» 단계(키 리스너 떼기 · ESC 게이트 정리)는
|
|
7
|
+
// 여전히 맨몸이었다 — 거기서 던지면 키 층은 유휴(리스너 떨어짐)·턴 층은 busy 인 이원 판정이 그대로 재현된다.
|
|
8
|
+
// 그리고 실패는 `dashboard.turn settle-failed` 한 곳에서만 보였다(#58 — 턴 본문 실패는 tui 범주 0).
|
|
9
|
+
// A: 마감 단계마다 이 함수로 격리해 «다음 단계 ⊕ idle 전이»가 반드시 돌게 하고,
|
|
10
|
+
// 던진 것은 한 범주 `tui.turn turn-threw {error, phase}` 로 남긴다.
|
|
11
|
+
|
|
12
|
+
import { debug, redactSecretText } from '../debug/log.js';
|
|
13
|
+
|
|
14
|
+
/** 4번째 인자로 `{ level: 'warn' }` 를 받는다 — 주입 기록기도 warn 수준을 그대로 넘겨야 한다(#58). */
|
|
15
|
+
export type TurnThrewLog = (
|
|
16
|
+
category: string,
|
|
17
|
+
event: string,
|
|
18
|
+
payload: Record<string, unknown>,
|
|
19
|
+
opts?: { level?: 'warn' },
|
|
20
|
+
) => void;
|
|
21
|
+
|
|
22
|
+
const ERROR_HEAD_CHARS = 200;
|
|
23
|
+
|
|
24
|
+
const warnLog: TurnThrewLog = (category, event, payload, opts) => debug.log(category, event, payload, opts);
|
|
25
|
+
|
|
26
|
+
/** 턴 경로에서 던진 것을 한 범주로 남긴다(warn — #58 «warn/error 0» 의 몫). 관측 실패가 턴 마감을 막지 않는다. */
|
|
27
|
+
export function logTurnThrew(phase: string, err: unknown, log: TurnThrewLog = warnLog): void {
|
|
28
|
+
try {
|
|
29
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
30
|
+
const stackHead = err instanceof Error
|
|
31
|
+
? err.stack?.split('\n').slice(1, 3).map((line) => line.trim()).join(' | ')
|
|
32
|
+
: undefined;
|
|
33
|
+
log('tui.turn', 'turn-threw', {
|
|
34
|
+
error: redactSecretText(message).slice(0, ERROR_HEAD_CHARS),
|
|
35
|
+
phase,
|
|
36
|
+
...(stackHead ? { stackHead: redactSecretText(stackHead) } : {}),
|
|
37
|
+
}, { level: 'warn' });
|
|
38
|
+
} catch { /* fail-soft — 관측이 마감을 막지 않는다 */ }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** 턴 마감의 한 단계 — 던져도 삼키고 `turn-threw` 로 남긴다. 다음 단계·idle 전이는 계속 돈다. */
|
|
42
|
+
export function runTurnTeardownStep(phase: string, step: () => void, log?: TurnThrewLog): boolean {
|
|
43
|
+
try {
|
|
44
|
+
step();
|
|
45
|
+
return true;
|
|
46
|
+
} catch (err) {
|
|
47
|
+
logTurnThrew(phase, err, log);
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -18,6 +18,7 @@ import type { ModelFamily } from '../models/prompts.js';
|
|
|
18
18
|
import { debug } from '../debug/log.js';
|
|
19
19
|
import type { NativeToolCatalogEntry } from '../native-tool-catalog.js';
|
|
20
20
|
import { buildUniversalPreamble } from '../prompt-library/universal-preamble.js';
|
|
21
|
+
import { buildSeatBootSystemMessages, type SeatBootDeps } from './seat-boot-preamble.js';
|
|
21
22
|
import { buildPlanModeSystemMessages } from '../plan-mode/system-prompt.js';
|
|
22
23
|
import { buildImplDisciplineSystemMessages } from '../impl-discipline/index.js';
|
|
23
24
|
import { buildConcisenessSystemMessages } from '../prompt-library/chat-conciseness.js';
|
|
@@ -29,7 +30,8 @@ import {
|
|
|
29
30
|
import { buildExecutionAskSystemMessages } from '../ask-user-question/index.js';
|
|
30
31
|
import { buildApprovalPolicySystemMessages } from '../code-edit/index.js';
|
|
31
32
|
import { buildSandboxEscalationSystemMessages } from '../shell-primitive/index.js';
|
|
32
|
-
import { elanousSelfAccessPrompt,
|
|
33
|
+
import { elanousSelfAccessPrompt, investigationRecallAmbient } from '../agent/self-ambient.js';
|
|
34
|
+
import { sessionMemoryLayer, sessionSelfAmbientParts } from './turn-session-layers.js';
|
|
33
35
|
import { localRefGroundingAmbient } from '../agent/ref-grounding.js';
|
|
34
36
|
import {
|
|
35
37
|
globalTaskNotificationQueue,
|
|
@@ -66,9 +68,14 @@ export interface DashboardTurnPreambleContext {
|
|
|
66
68
|
* one-liner directives (e.g. AskUserQuestion → use for tool-deny
|
|
67
69
|
* clarification). Pass `tools.map(t => t.name)` from the caller. */
|
|
68
70
|
enabledTools?: readonly string[];
|
|
71
|
+
/** 🪪 L1 자리 부트 카드를 싣나(`seat-boot-preamble.ts`). 대화형 TUI 호출부만 켠다 — 기본 꺼짐이라
|
|
72
|
+
* 다른 호출부·시험은 셸의 `COORD_ID` 에 따라 출력이 갈리지 않는다. */
|
|
73
|
+
seatBoot?: boolean | SeatBootDeps;
|
|
69
74
|
/** Explicit controller provenance for tests and embedded callers. When
|
|
70
75
|
* omitted, the controller environment is used. */
|
|
71
76
|
controlEnv?: { controller?: string; channels?: string };
|
|
77
|
+
/** File-memory layer seam: a store root and env for scope resolution (tests), or false to omit it. */
|
|
78
|
+
memory?: { root?: string; env?: NodeJS.ProcessEnv } | false;
|
|
72
79
|
}
|
|
73
80
|
|
|
74
81
|
export function buildControllerSystemMessage(controller: string, channels?: string): LLMMessage {
|
|
@@ -91,10 +98,22 @@ export function buildDashboardTurnPreamble(
|
|
|
91
98
|
...(ctx.modelFamily !== undefined ? { modelFamily: ctx.modelFamily } : {}),
|
|
92
99
|
...(ctx.enabledTools !== undefined ? { enabledTools: ctx.enabledTools } : {}),
|
|
93
100
|
});
|
|
101
|
+
// 🪪 L1 — 자리 부트 카드(세션마다 한 번 만든 스냅샷). 정체성(앵커) 바로 뒤. 자리가 아니면 [].
|
|
102
|
+
const seatBootSystemMsgs = ctx.seatBoot
|
|
103
|
+
? buildSeatBootSystemMessages(
|
|
104
|
+
{ cwd: ctx.cwd, ...(ctx.sessionId !== undefined ? { sessionId: ctx.sessionId } : {}) },
|
|
105
|
+
ctx.seatBoot === true ? {} : ctx.seatBoot,
|
|
106
|
+
)
|
|
107
|
+
: [];
|
|
94
108
|
const planModeSystemMsgs = buildPlanModeSystemMessages();
|
|
95
109
|
const askSystemMsgs = buildExecutionAskSystemMessages() as LLMMessage[];
|
|
96
110
|
const approvalSystemMsgs = buildApprovalPolicySystemMessages() as LLMMessage[];
|
|
97
111
|
const sandboxSystemMsgs = buildSandboxEscalationSystemMessages() as LLMMessage[];
|
|
112
|
+
// Session-scoped (built once, rebuilt on change) — see turn-session-layers.ts.
|
|
113
|
+
const sessionKey = ctx.sessionId ?? 'tui';
|
|
114
|
+
const memorySystemMsgs = ctx.memory === false
|
|
115
|
+
? []
|
|
116
|
+
: sessionMemoryLayer({ sessionKey, cwd: ctx.cwd, ...(ctx.memory ?? {}) });
|
|
98
117
|
const gitSnapshotSystemMsgs = buildSessionRuntimeSystemMessages({
|
|
99
118
|
cwd: ctx.cwd,
|
|
100
119
|
});
|
|
@@ -137,7 +156,12 @@ export function buildDashboardTurnPreamble(
|
|
|
137
156
|
// 성립한다. fail-soft: ambient 조회 실패가 턴을 막지 않는다.
|
|
138
157
|
let selfOpsSystemMsgs: LLMMessage[] = [];
|
|
139
158
|
try {
|
|
140
|
-
selfOpsSystemMsgs = [
|
|
159
|
+
selfOpsSystemMsgs = [
|
|
160
|
+
elanousSelfAccessPrompt(ctx.sessionId),
|
|
161
|
+
...sessionSelfAmbientParts(sessionKey),
|
|
162
|
+
investigationRecallAmbient(ctx.userText),
|
|
163
|
+
localRefGroundingAmbient(ctx.userText),
|
|
164
|
+
]
|
|
141
165
|
.filter(Boolean)
|
|
142
166
|
.map((content): LLMMessage => ({ role: 'system', content }));
|
|
143
167
|
} catch { /* fail-soft */ }
|
|
@@ -150,10 +174,12 @@ export function buildDashboardTurnPreamble(
|
|
|
150
174
|
: [];
|
|
151
175
|
const preamble = [
|
|
152
176
|
...universalPreamble,
|
|
177
|
+
...seatBootSystemMsgs,
|
|
153
178
|
...planModeSystemMsgs,
|
|
154
179
|
...askSystemMsgs,
|
|
155
180
|
...approvalSystemMsgs,
|
|
156
181
|
...sandboxSystemMsgs,
|
|
182
|
+
...memorySystemMsgs,
|
|
157
183
|
...gitSnapshotSystemMsgs,
|
|
158
184
|
...surfaceSystemMsgs,
|
|
159
185
|
...selfOpsSystemMsgs,
|
|
@@ -190,10 +216,12 @@ export function buildDashboardTurnPreamble(
|
|
|
190
216
|
rich: ctx.rich === true,
|
|
191
217
|
builderCounts: {
|
|
192
218
|
universal: universalPreamble.length,
|
|
219
|
+
seatBoot: seatBootSystemMsgs.length,
|
|
193
220
|
planMode: planModeSystemMsgs.length,
|
|
194
221
|
ask: askSystemMsgs.length,
|
|
195
222
|
approval: approvalSystemMsgs.length,
|
|
196
223
|
sandbox: sandboxSystemMsgs.length,
|
|
224
|
+
memory: memorySystemMsgs.length,
|
|
197
225
|
gitSnapshot: gitSnapshotSystemMsgs.length,
|
|
198
226
|
surface: surfaceSystemMsgs.length,
|
|
199
227
|
selfOps: selfOpsSystemMsgs.length,
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// TUI-SEAT-MEMORY-SCOPE (RFC-tui-self-awareness L2 ①③) — the TUI turn preamble's session layers.
|
|
2
|
+
//
|
|
3
|
+
// ① File memory: until now only chat.ts (telegram · discord · repl · a2a) injected buildMemoryInjection;
|
|
4
|
+
// the TUI preamble had no memory layer at all. Here it does, scoped to global ⊕ this seat/project:
|
|
5
|
+
// a context card tagged with another seat (or another project) is left out — index line included.
|
|
6
|
+
// ③ Injection cadence: the preamble is rebuilt every turn, but these layers are not. They are built once
|
|
7
|
+
// per session and rebuilt only when their source changed (file signature for memory, a short TTL
|
|
8
|
+
// plus content hash for self ambient). Unchanged layers come back byte-identical, which keeps the
|
|
9
|
+
// provider's prompt-cache prefix and skips the per-turn store reads.
|
|
10
|
+
//
|
|
11
|
+
// Both layers are fail-soft: an error drops the layer (observed), it never blocks the turn.
|
|
12
|
+
|
|
13
|
+
import { createHash } from 'node:crypto';
|
|
14
|
+
import { readdirSync, statSync } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import type { LLMMessage } from '../llm.js';
|
|
17
|
+
import { debug } from '../debug/log.js';
|
|
18
|
+
import { buildMemoryInjection, memoryRoot, type MemoryEntry } from '../memory.js';
|
|
19
|
+
import { elanousSelfAmbientParts } from '../agent/self-ambient.js';
|
|
20
|
+
|
|
21
|
+
/** Token budget for the TUI memory layer — the same default chat.ts gives buildMemoryInjection. */
|
|
22
|
+
export const TUI_MEMORY_BUDGET_TOKENS = 1500;
|
|
23
|
+
/** How long cached self ambient is trusted before the stores are read again. */
|
|
24
|
+
export const SELF_AMBIENT_TTL_MS = 60_000;
|
|
25
|
+
/** Sessions remembered per cache; the least recently used one is dropped beyond this. */
|
|
26
|
+
export const SESSION_LAYER_CACHE_MAX = 32;
|
|
27
|
+
|
|
28
|
+
export interface MemoryScope {
|
|
29
|
+
seat?: string;
|
|
30
|
+
project?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** This session's seat: `/seats/<seat>` in the cwd first, then COORD_ID. Project comes only from
|
|
34
|
+
* ELANOUS_PROJECT — a path guess would silently drop cards whose project string does not match it. */
|
|
35
|
+
export function resolveMemoryScope(cwd: string, env: NodeJS.ProcessEnv = process.env): MemoryScope {
|
|
36
|
+
const fromCwd = /(?:^|\/)seats\/([^/]+)/.exec(cwd)?.[1]?.trim();
|
|
37
|
+
const seat = fromCwd || env.COORD_ID?.trim() || undefined;
|
|
38
|
+
const project = env.ELANOUS_PROJECT?.trim() || undefined;
|
|
39
|
+
return { ...(seat ? { seat } : {}), ...(project ? { project } : {}) };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const same = (a: string, b: string): boolean => a.trim().toLowerCase() === b.trim().toLowerCase();
|
|
43
|
+
|
|
44
|
+
/** Global memories (no context card, or a card with an empty seat) stay. A card tagged with a seat
|
|
45
|
+
* stays only for that seat; a card tagged with a project is dropped only when the scope names another one. */
|
|
46
|
+
export function memoryInScope(entry: MemoryEntry, scope: MemoryScope): boolean {
|
|
47
|
+
const card = entry.contextCard;
|
|
48
|
+
if (!card) return true;
|
|
49
|
+
if (card.seat.trim() && !(scope.seat && same(card.seat, scope.seat))) return false;
|
|
50
|
+
if (card.project.trim() && scope.project && !same(card.project, scope.project)) return false;
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** This seat's own cards are injected in full, like pinned memories. */
|
|
55
|
+
export function isSeatCard(entry: MemoryEntry, scope: MemoryScope): boolean {
|
|
56
|
+
const seat = entry.contextCard?.seat.trim();
|
|
57
|
+
return Boolean(seat && scope.seat && same(seat, scope.seat));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Cheap change signal for the file store: names, sizes and mtimes of its markdown files. */
|
|
61
|
+
export function memoryStoreSignature(root: string): string {
|
|
62
|
+
let names: string[];
|
|
63
|
+
try { names = readdirSync(root).filter(name => name.endsWith('.md')).sort(); }
|
|
64
|
+
catch { return 'missing'; }
|
|
65
|
+
const hash = createHash('sha256');
|
|
66
|
+
for (const name of names) {
|
|
67
|
+
try {
|
|
68
|
+
const st = statSync(join(root, name));
|
|
69
|
+
hash.update(`${name}\0${st.size}\0${st.mtimeMs}\n`);
|
|
70
|
+
} catch { hash.update(`${name}\0gone\n`); }
|
|
71
|
+
}
|
|
72
|
+
return hash.digest('hex').slice(0, 16);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const contentHash = (text: string): string => createHash('sha256').update(text).digest('hex').slice(0, 16);
|
|
76
|
+
|
|
77
|
+
interface MemoryCacheEntry { key: string; messages: LLMMessage[]; hash: string }
|
|
78
|
+
interface AmbientCacheEntry { parts: string[]; hash: string; at: number }
|
|
79
|
+
|
|
80
|
+
const memoryCache = new Map<string, MemoryCacheEntry>();
|
|
81
|
+
const ambientCache = new Map<string, AmbientCacheEntry>();
|
|
82
|
+
|
|
83
|
+
/** Map insertion order doubles as recency: re-insert on use, drop the oldest beyond the cap. */
|
|
84
|
+
function remember<V>(cache: Map<string, V>, key: string, value: V): void {
|
|
85
|
+
cache.delete(key);
|
|
86
|
+
cache.set(key, value);
|
|
87
|
+
while (cache.size > SESSION_LAYER_CACHE_MAX) cache.delete(cache.keys().next().value as string);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Test seam — forget every session's cached layers. */
|
|
91
|
+
export function resetTurnSessionLayers(): void {
|
|
92
|
+
memoryCache.clear();
|
|
93
|
+
ambientCache.clear();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface SessionMemoryLayerOpts {
|
|
97
|
+
sessionKey: string;
|
|
98
|
+
cwd: string;
|
|
99
|
+
root?: string;
|
|
100
|
+
env?: NodeJS.ProcessEnv;
|
|
101
|
+
maxTokens?: number;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** The file-memory system message for this session. Rebuilt only when the store or the scope changed. */
|
|
105
|
+
export function sessionMemoryLayer(opts: SessionMemoryLayerOpts): LLMMessage[] {
|
|
106
|
+
try {
|
|
107
|
+
const root = opts.root ?? memoryRoot();
|
|
108
|
+
const scope = resolveMemoryScope(opts.cwd, opts.env);
|
|
109
|
+
const maxTokens = opts.maxTokens ?? TUI_MEMORY_BUDGET_TOKENS;
|
|
110
|
+
const key = JSON.stringify([root, scope.seat ?? '', scope.project ?? '', maxTokens, memoryStoreSignature(root)]);
|
|
111
|
+
const cached = memoryCache.get(opts.sessionKey);
|
|
112
|
+
if (cached && cached.key === key) {
|
|
113
|
+
remember(memoryCache, opts.sessionKey, cached);
|
|
114
|
+
debug.log('chat.memory-layer', 'reused', { session: opts.sessionKey, seat: scope.seat ?? null, hash: cached.hash });
|
|
115
|
+
return cached.messages;
|
|
116
|
+
}
|
|
117
|
+
// Empty user text on purpose: keyword hits would change with every prompt and break the cached prefix.
|
|
118
|
+
// Per-prompt recall is the memory_recall tool's job (it is on every TUI route).
|
|
119
|
+
const inj = buildMemoryInjection('', {
|
|
120
|
+
maxTokens,
|
|
121
|
+
filter: entry => memoryInScope(entry, scope),
|
|
122
|
+
alwaysInject: entry => isSeatCard(entry, scope),
|
|
123
|
+
}, root);
|
|
124
|
+
const messages: LLMMessage[] = inj.block ? [{ role: 'system', content: inj.block }] : [];
|
|
125
|
+
const hash = contentHash(inj.block);
|
|
126
|
+
debug.log('chat.memory-layer', cached ? 'changed' : 'built', {
|
|
127
|
+
session: opts.sessionKey, seat: scope.seat ?? null, project: scope.project ?? null,
|
|
128
|
+
injected: inj.injectedIds.length, tokens: inj.tokens, hash,
|
|
129
|
+
...(cached ? { previousHash: cached.hash, sameContent: cached.hash === hash } : {}),
|
|
130
|
+
});
|
|
131
|
+
// Same content (e.g. an unrelated file touched) keeps the previous array — byte-identical prefix.
|
|
132
|
+
const kept = cached && cached.hash === hash ? cached.messages : messages;
|
|
133
|
+
remember(memoryCache, opts.sessionKey, { key, hash, messages: kept });
|
|
134
|
+
return kept;
|
|
135
|
+
} catch (error) {
|
|
136
|
+
// The layer is dropped for this turn and rebuilt on the next one.
|
|
137
|
+
memoryCache.delete(opts.sessionKey);
|
|
138
|
+
debug.log('chat.memory-layer', 'failed', { session: opts.sessionKey, error: String(error) });
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export interface SessionSelfAmbientOpts {
|
|
144
|
+
now?: number;
|
|
145
|
+
ttlMs?: number;
|
|
146
|
+
build?: () => string[];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** The task-independent self ambient (recent changes · autonomy · ops health · mission incident),
|
|
150
|
+
* read at most once per TTL per session. The task-dependent investigation recall stays per turn. */
|
|
151
|
+
export function sessionSelfAmbientParts(sessionKey: string, opts: SessionSelfAmbientOpts = {}): string[] {
|
|
152
|
+
const now = opts.now ?? Date.now();
|
|
153
|
+
const ttl = opts.ttlMs ?? SELF_AMBIENT_TTL_MS;
|
|
154
|
+
const cached = ambientCache.get(sessionKey);
|
|
155
|
+
if (cached && now - cached.at < ttl) {
|
|
156
|
+
remember(ambientCache, sessionKey, cached);
|
|
157
|
+
return cached.parts;
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
const parts = (opts.build ?? (() => elanousSelfAmbientParts()))();
|
|
161
|
+
const hash = contentHash(parts.join('\0'));
|
|
162
|
+
if (cached && cached.hash === hash) {
|
|
163
|
+
remember(ambientCache, sessionKey, { ...cached, at: now });
|
|
164
|
+
debug.log('chat.self-ambient', 'unchanged', { session: sessionKey, hash });
|
|
165
|
+
return cached.parts;
|
|
166
|
+
}
|
|
167
|
+
remember(ambientCache, sessionKey, { parts, hash, at: now });
|
|
168
|
+
debug.log('chat.self-ambient', cached ? 'changed' : 'built', { session: sessionKey, parts: parts.length, hash });
|
|
169
|
+
return parts;
|
|
170
|
+
} catch (error) {
|
|
171
|
+
// Fail-soft means the layer is left out, not replayed stale; the next turn reads again.
|
|
172
|
+
ambientCache.delete(sessionKey);
|
|
173
|
+
debug.log('chat.self-ambient', 'failed', { session: sessionKey, error: String(error) });
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -166,6 +166,12 @@ export interface TurnStreamFormatter {
|
|
|
166
166
|
export function createTurnStreamFormatter(
|
|
167
167
|
deps: TurnStreamFormatterDeps,
|
|
168
168
|
): TurnStreamFormatter {
|
|
169
|
+
const groupingKind = (name: string, args: Record<string, unknown>): string | undefined => {
|
|
170
|
+
const kind = toolOperationKind(name, args);
|
|
171
|
+
return deps.foldMode === 'kind-unit' || (deps.foldMode === 'task-unit' && kind === 'RunShell')
|
|
172
|
+
? kind
|
|
173
|
+
: undefined;
|
|
174
|
+
};
|
|
169
175
|
// Per-tool-round 누적기. cross-turn 에서 이전 round 의 텍스트를
|
|
170
176
|
// 가져오지 않음. clear-and-commit (onText('', '')) 또는 tool call
|
|
171
177
|
// 발생 시 reset.
|
|
@@ -278,8 +284,8 @@ export function createTurnStreamFormatter(
|
|
|
278
284
|
callId: call.id,
|
|
279
285
|
lines: rendered,
|
|
280
286
|
args: call.args,
|
|
281
|
-
...(
|
|
282
|
-
? { operationKind:
|
|
287
|
+
...(groupingKind(call.name, call.args)
|
|
288
|
+
? { operationKind: groupingKind(call.name, call.args) }
|
|
283
289
|
: {}),
|
|
284
290
|
});
|
|
285
291
|
closeRound();
|
|
@@ -293,8 +299,8 @@ export function createTurnStreamFormatter(
|
|
|
293
299
|
callId: call.id,
|
|
294
300
|
lines: [deps.muted(`${deps.brainIcon} tool: ${call.name} — running`)],
|
|
295
301
|
args: call.args,
|
|
296
|
-
...(
|
|
297
|
-
? { operationKind:
|
|
302
|
+
...(groupingKind(call.name, call.args)
|
|
303
|
+
? { operationKind: groupingKind(call.name, call.args) }
|
|
298
304
|
: {}),
|
|
299
305
|
});
|
|
300
306
|
debug.log('dashboard.chat.generic-tool', 'formatter.genericCall', { toolName: call.name });
|
|
@@ -331,8 +337,10 @@ export function createTurnStreamFormatter(
|
|
|
331
337
|
callId: call.id,
|
|
332
338
|
collapsedLines: variants.collapsed,
|
|
333
339
|
expandedLines: variants.expanded,
|
|
334
|
-
...(
|
|
335
|
-
? { operationKind:
|
|
340
|
+
...(groupingKind(call.name, args)
|
|
341
|
+
? { operationKind: deps.foldMode === 'task-unit'
|
|
342
|
+
? 'RunShell'
|
|
343
|
+
: ('operationKind' in variants ? variants.operationKind : undefined) ?? toolOperationKind(call.name, args) }
|
|
336
344
|
: {}),
|
|
337
345
|
});
|
|
338
346
|
toolArgsByCallId.delete(call.id);
|
|
@@ -99,6 +99,13 @@ export function createTurnStreamPresentationApplier(
|
|
|
99
99
|
switch (event.type) {
|
|
100
100
|
case 'assistant.replaceBlock': {
|
|
101
101
|
const beforeLen = deps.chatLines.length;
|
|
102
|
+
if (assistantStart > deps.chatLines.length) {
|
|
103
|
+
debug.log('dashboard.chat.stream', 'presentation.assistant-start-clamped', {
|
|
104
|
+
assistantStart,
|
|
105
|
+
chatLinesLen: deps.chatLines.length,
|
|
106
|
+
});
|
|
107
|
+
assistantStart = deps.chatLines.length;
|
|
108
|
+
}
|
|
102
109
|
deps.chatLines.length = assistantStart;
|
|
103
110
|
deps.chatLines.push(...event.lines);
|
|
104
111
|
logEvent('assistant.replaceBlock', {
|
|
@@ -158,6 +165,7 @@ export function createTurnStreamPresentationApplier(
|
|
|
158
165
|
event.expandedLines,
|
|
159
166
|
event.operationKind ? { operationKind: event.operationKind } : undefined,
|
|
160
167
|
);
|
|
168
|
+
assistantStart = Math.min(assistantStart, deps.chatLines.length);
|
|
161
169
|
deps.renderedToolRuntime.deleteArgs(event.callId);
|
|
162
170
|
logEvent('tool.replaceBlock', {
|
|
163
171
|
callId: event.callId,
|
|
@@ -7,6 +7,7 @@ import { createVersionResolver, type VersionOptions, type Versions } from '../di
|
|
|
7
7
|
import { getUserConfig } from '../user-config.js';
|
|
8
8
|
import { registeredSeats, resolveSeat } from '../seat-address/seat-address.js';
|
|
9
9
|
import { isSeatId } from '../seat-dispatch/seat-questions.js';
|
|
10
|
+
import { openMsgStore } from '../msg/msg-store.js';
|
|
10
11
|
|
|
11
12
|
export type DecisionCategory = 'secret' | 'publish' | 'money' | 'security' | 'scope' | 'irreversible' | 'other';
|
|
12
13
|
/** Old track letters (S·T·F·O) stay readable; seat names (OP·MK·TC·UX) are the current identities. */
|
|
@@ -42,10 +43,22 @@ export interface SeatDecisionRecord {
|
|
|
42
43
|
}
|
|
43
44
|
export type SeatDecisionInput = Pick<SeatDecisionRecord, 'title' | 'decision' | 'seat' | 'delegation' | 'refs'> & { decidedAt?: string };
|
|
44
45
|
type Event = { type: 'raised'; entry: DecisionEntry } | { type: 'seat-recorded'; entry: SeatDecisionRecord } | { type: 'options-added'; id: string; at: string; options: DecisionOption[]; by: string } | { type: 'decided'; id: string; at?: string; by: DecisionActor; choice?: string; version?: Versions; note?: string } | { type: 'withdrawn'; id: string; at: string; reason: string; version: Versions };
|
|
45
|
-
export interface DecisionLedgerOptions extends VersionOptions { stateDir?: string; now?: () => Date; resolveVersion?: (at: string) => Versions; writeAnswer?: typeof writePendingQuestionAnswer }
|
|
46
|
+
export interface DecisionLedgerOptions extends VersionOptions { stateDir?: string; now?: () => Date; resolveVersion?: (at: string) => Versions; writeAnswer?: typeof writePendingQuestionAnswer; postDecisionNotice?: (entry: DecisionEntry, stateDir: string, seat: string) => number }
|
|
46
47
|
|
|
47
48
|
/** null = the decision resumes no run; otherwise whether the answer file was written (or already matched). */
|
|
48
49
|
export type AnswerDelivery = null | { ok: true; questionId: string } | { ok: false; questionId: string; reason: string };
|
|
50
|
+
export type DecisionNotice = { status: 'skipped' } | { status: 'sent'; seat: string; messageId: number } | { status: 'failed'; seat: string; reason: string };
|
|
51
|
+
|
|
52
|
+
function postDecisionNotice(entry: DecisionEntry, stateDir: string, seat: string): number {
|
|
53
|
+
const selected = entry.options.find(option => option.key === entry.choice);
|
|
54
|
+
if (!selected || !entry.choice) throw new Error('recorded choice not found');
|
|
55
|
+
const recommendedWhy = 'option' in entry.recommendation && entry.recommendation.option === entry.choice ? entry.recommendation.why : undefined;
|
|
56
|
+
const rationale = (entry.note ?? recommendedWhy ?? entry.scqa.c).replace(/\s+/g, ' ').trim();
|
|
57
|
+
const body = `**[OP]** 결정 ${entry.id} · ${entry.title} · 선택 ${entry.choice}: ${selected.label} · 근거 ${rationale}`;
|
|
58
|
+
const store = openMsgStore(join(stateDir, 'msg', 'messages.db'));
|
|
59
|
+
try { return store.appendWithProvenance({ from: 'OP', to: seat, kind: 'info', body }, `decision:${entry.id}:${seat}`).id; }
|
|
60
|
+
finally { store.close(); }
|
|
61
|
+
}
|
|
49
62
|
|
|
50
63
|
/** The decision is durable even when delivery fails; retryAnswer(id) only retries delivery. */
|
|
51
64
|
export class DecisionAnswerDeliveryError extends Error {
|
|
@@ -144,6 +157,7 @@ export class DecisionLedger {
|
|
|
144
157
|
private readonly lockPath: string;
|
|
145
158
|
private readonly now: () => Date;
|
|
146
159
|
private readonly writeAnswer: typeof writePendingQuestionAnswer;
|
|
160
|
+
private readonly postDecisionNotice: NonNullable<DecisionLedgerOptions['postDecisionNotice']>;
|
|
147
161
|
private readonly stateDir: string;
|
|
148
162
|
private versionResolver?: (at: string) => Versions;
|
|
149
163
|
private readonly versionOptions: DecisionLedgerOptions;
|
|
@@ -153,6 +167,7 @@ export class DecisionLedger {
|
|
|
153
167
|
this.lockPath = `${this.path}.lock`;
|
|
154
168
|
this.now = options.now ?? (() => new Date());
|
|
155
169
|
this.writeAnswer = options.writeAnswer ?? writePendingQuestionAnswer;
|
|
170
|
+
this.postDecisionNotice = options.postDecisionNotice ?? postDecisionNotice;
|
|
156
171
|
this.versionOptions = options;
|
|
157
172
|
this.versionResolver = options.resolveVersion;
|
|
158
173
|
}
|
|
@@ -300,13 +315,13 @@ export class DecisionLedger {
|
|
|
300
315
|
return entry;
|
|
301
316
|
}
|
|
302
317
|
/** Record the decision and say whether its answer reached the waiting run (null = the decision resumes nothing). */
|
|
303
|
-
decideWithDelivery(id: string, choice: string, by: DecisionActor, note?: string, decidedAt?: string): { entry: DecisionEntry; delivery: AnswerDelivery } {
|
|
318
|
+
decideWithDelivery(id: string, choice: string, by: DecisionActor, note?: string, decidedAt?: string): { entry: DecisionEntry; delivery: AnswerDelivery; notice: DecisionNotice } {
|
|
304
319
|
return this.decideLocked(id, choice, by, note, decidedAt);
|
|
305
320
|
}
|
|
306
321
|
decide(id: string, choice: string, by: DecisionActor, note?: string, decidedAt?: string): DecisionEntry {
|
|
307
322
|
return this.decideLocked(id, choice, by, note, decidedAt).entry;
|
|
308
323
|
}
|
|
309
|
-
private decideLocked(id: string, choice: string, by: DecisionActor, note?: string, decidedAt?: string): { entry: DecisionEntry; delivery: AnswerDelivery } {
|
|
324
|
+
private decideLocked(id: string, choice: string, by: DecisionActor, note?: string, decidedAt?: string): { entry: DecisionEntry; delivery: AnswerDelivery; notice: DecisionNotice } {
|
|
310
325
|
if (!by || (by.kind !== 'human' && by.kind !== 'auto')) throw new Error('decidedBy is required');
|
|
311
326
|
if (by.kind === 'auto') {
|
|
312
327
|
single(by.delegation, 'delegation'); single(by.agent, 'agent');
|
|
@@ -322,9 +337,35 @@ export class DecisionLedger {
|
|
|
322
337
|
this.append({ type: 'decided', id, at, by, choice, version: this.version(at), ...(note ? { note: safe(single(note, 'note')) } : {}) });
|
|
323
338
|
debug.log('decisions', 'decided', { id, category: old.category, by: by.kind });
|
|
324
339
|
const decided = this.show(id);
|
|
325
|
-
return { entry: decided, delivery: this.deliverAnswer(decided) };
|
|
340
|
+
return { entry: decided, delivery: this.deliverAnswer(decided), notice: this.notifyDecided(decided) };
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
/** Retry only the seat notice; the message provenance key prevents duplicate delivery. */
|
|
344
|
+
retryNotice(id: string): DecisionNotice {
|
|
345
|
+
return this.locked(() => {
|
|
346
|
+
const entry = this.show(id);
|
|
347
|
+
if (entry.status !== 'decided') throw new Error(`decision is not decided: ${id}`);
|
|
348
|
+
return this.notifyDecided(entry);
|
|
326
349
|
});
|
|
327
350
|
}
|
|
351
|
+
private notifyDecided(entry: DecisionEntry): DecisionNotice {
|
|
352
|
+
const track = entry.raisedBy.track;
|
|
353
|
+
if (!track) return { status: 'skipped' };
|
|
354
|
+
const seat = resolveSeat(track)?.id;
|
|
355
|
+
if (!seat) {
|
|
356
|
+
debug.log('decisions', 'decided-notify-unknown-seat', { id: entry.id, track });
|
|
357
|
+
return { status: 'failed', seat: track, reason: '올린 자리 미상' };
|
|
358
|
+
}
|
|
359
|
+
try {
|
|
360
|
+
const messageId = this.postDecisionNotice(entry, this.stateDir, seat);
|
|
361
|
+
debug.log('decisions', 'decided-notify-sent', { id: entry.id, seat, messageId });
|
|
362
|
+
return { status: 'sent', seat, messageId };
|
|
363
|
+
} catch (error) {
|
|
364
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
365
|
+
debug.log('decisions', 'decided-notify-failed', { id: entry.id, seat, reason });
|
|
366
|
+
return { status: 'failed', seat, reason };
|
|
367
|
+
}
|
|
368
|
+
}
|
|
328
369
|
/** Retry delivery of the recorded choice without adding another decided event or changing its actor/note. */
|
|
329
370
|
retryAnswer(id: string): DecisionEntry {
|
|
330
371
|
return this.locked(() => {
|
|
@@ -66,7 +66,7 @@ import { localOcrText } from './telegram-card-followup.js';
|
|
|
66
66
|
import type { runGraph } from './graph-runner/runner.js';
|
|
67
67
|
import { readSlashContextNow, renderContextFirstNow, renderTelegramNow } from './context-bus/context-now-surfaces.js';
|
|
68
68
|
import { contextNow, type ContextNowDeps } from './context-bus/context-now.js';
|
|
69
|
-
import { createContextFirstGate, renderContextFirst } from './context-bus/context-first.js';
|
|
69
|
+
import { createContextFirstGate, renderContextFirst, takeContextFirstOpening } from './context-bus/context-first.js';
|
|
70
70
|
import { telegramLoopsStatus, type LoopsSources } from './telegram-loops-command.js';
|
|
71
71
|
import { botUnavailableSlashReply, deriveTuiSlashAvailability, type TuiSlashAvailability } from './maturity/tui-slash-availability.js';
|
|
72
72
|
|
|
@@ -157,8 +157,8 @@ export function buildDiscordSelfOnMessage(deps: DiscordSelfMessageDeps): DcMessa
|
|
|
157
157
|
const log = deps.log ?? ((): void => {});
|
|
158
158
|
const cfg = deps.userConfig;
|
|
159
159
|
const contextFirstGate = createContextFirstGate({ now: deps.contextFirstNow ?? Date.now });
|
|
160
|
-
const maybeSendContextFirst = async (channelId: string): Promise<void> => {
|
|
161
|
-
if (!contextFirstGate
|
|
160
|
+
const maybeSendContextFirst = async (channelId: string, text?: string): Promise<void> => {
|
|
161
|
+
if (!takeContextFirstOpening({ gate: contextFirstGate, key: channelId, text, enabled: cfg.discord?.contextFirst !== false })) return;
|
|
162
162
|
try {
|
|
163
163
|
await deps.getBot()?.sendMessage(channelId, renderContextFirst(contextNow, deps.nowDeps, renderContextFirstNow));
|
|
164
164
|
} catch (err) {
|
|
@@ -426,7 +426,7 @@ export function buildDiscordSelfOnMessage(deps: DiscordSelfMessageDeps): DcMessa
|
|
|
426
426
|
if (unavailable) return unavailable;
|
|
427
427
|
}
|
|
428
428
|
const cmd = parseDiscordAcpCommand(ctx.text);
|
|
429
|
-
if (!cmd && !/^[!/]/.test(ctx.text.trim())) await maybeSendContextFirst(ctx.channelId);
|
|
429
|
+
if (!cmd && !/^[!/]/.test(ctx.text.trim())) await maybeSendContextFirst(ctx.channelId, ctx.text);
|
|
430
430
|
log(`◀ ${ctx.userName ?? ctx.userId}: ${ctx.text.slice(0, 80)}${ctx.attachments.length ? ` (+첨부 ${ctx.attachments.length})` : ''}`);
|
|
431
431
|
debug.log('discord.self.turn', 'inbound', { channelId: ctx.channelId, chars: ctx.text.length, attachments: ctx.attachments.length });
|
|
432
432
|
// C2+ — 첨부 기억(사진만 먼저 올리는 패턴 지원). 명령 여부와 무관.
|