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
|
@@ -35,13 +35,16 @@
|
|
|
35
35
|
// Core really can run headless.
|
|
36
36
|
|
|
37
37
|
import type { LLMMessage, LLMToolSpec, ContentBlock } from '../llm.js';
|
|
38
|
-
import { debug } from '../debug/log.js';
|
|
38
|
+
import { debug, redactSecretText } from '../debug/log.js';
|
|
39
|
+
import { CoreTurnAuthRejectedError } from '../core-turn/auth-rejected-notice.js';
|
|
39
40
|
import {
|
|
40
41
|
runCoreTurn,
|
|
41
42
|
runGoalLoop,
|
|
42
43
|
type CoreTurnContext,
|
|
43
44
|
type CoreTurnDispatchTool,
|
|
44
45
|
} from '../core-turn/index.js';
|
|
46
|
+
import { stripGoalRepeatReadbackPreface } from '../core-turn/run-goal-loop.js';
|
|
47
|
+
import { parseSeatTurnCapConfig, resolveSeatTurnCap } from '../core-turn/seat-turn-cap.js';
|
|
45
48
|
import { getUserConfig } from '../user-config.js';
|
|
46
49
|
import { getModelFamily } from '../models/prompts.js';
|
|
47
50
|
import { resolveModelContextWindow } from '../models/context-window.js';
|
|
@@ -49,20 +52,26 @@ import type { AcpServerOptions, AcpTurnContext } from './server.js';
|
|
|
49
52
|
import { acpToolDenialResult } from './tool-approval.js';
|
|
50
53
|
import { readOriginSessionMeta } from './origin-session-meta.js';
|
|
51
54
|
import { isFactQuestion } from './fact-question.js';
|
|
52
|
-
import { classifyTuiChatIntent, type TuiChatRoute } from '../core-turn/short-question.js';
|
|
55
|
+
import { classifyTuiChatIntent, formatTuiRouteLine, isSeatOpsDirective, type TuiChatRoute } from '../core-turn/short-question.js';
|
|
53
56
|
import { HARNESS_ROLE_ENV } from '../harness/harness-space.js';
|
|
54
57
|
|
|
55
58
|
const FACT_QUESTION_INSTRUCTION = '사실·최신 정보 질문이다. WebSearch 를 1~2회 쓰고 검색 결과(제목·스니펫·URL)로 답하라. 출처 링크를 붙여라. 셸·브라우저·파일 도구는 검색 결과로 부족할 때만. 도구 예산에 닿으면 지금까지 근거로 답하고 끝에 «더 찾아볼까요?»를 붙여라.';
|
|
56
59
|
|
|
60
|
+
// 읽기·분석 keeps every tool (it reads files and state) and only leaves the goal loop.
|
|
61
|
+
type QuickTuiRoute = Exclude<TuiChatRoute, '코딩·구현' | '읽기·분석'>;
|
|
62
|
+
|
|
57
63
|
// An allowlist, not a denylist: a new repository writer cannot slip into a quick turn.
|
|
58
|
-
|
|
64
|
+
// memory_recall is read-only and on every quick route: the self-access discipline (agent/self-ambient.ts) tells
|
|
65
|
+
// every turn to recall before judging, so a route without it asked for a tool it could not call (TUI-SEAT-MEMORY-SCOPE).
|
|
66
|
+
const QUICK_TOOLS: Record<QuickTuiRoute, readonly string[]> = {
|
|
59
67
|
'조회': ['decisions_pending', 'ops_seats', 'ops_status', 'release_status', 'logs_query', 'context_now', 'memory_recall', 'Read'],
|
|
60
|
-
'설정 변경': ['DashboardConfigGet', 'DashboardConfigSet', 'LlmListAvailableModels', 'prompt_getRuntimeConfig', 'prompt_setRuntimeConfig', 'view_getConfig', 'view_applyRuntimeConfig', 'view_saveConfig'],
|
|
61
|
-
|
|
62
|
-
'
|
|
68
|
+
'설정 변경': ['DashboardConfigGet', 'DashboardConfigSet', 'LlmListAvailableModels', 'prompt_getRuntimeConfig', 'prompt_setRuntimeConfig', 'view_getConfig', 'view_applyRuntimeConfig', 'view_saveConfig', 'memory_recall'],
|
|
69
|
+
// MsgList is a read-only ledger listing (never acks); MsgPost · MsgAck · RunShell · Bash stay out (TUI-QUICK-ROUTE-EXPLICIT-CMD).
|
|
70
|
+
'조사': ['WebSearch', 'OmniSearch', 'Grep', 'Glob', 'Read', 'fact_check', 'memory_recall', 'MsgList'],
|
|
71
|
+
'상시 일': ['schedule_manage', 'schedule_list', 'schedule_create', 'schedule_update', 'session_manage', 'ops_status', 'memory_recall'],
|
|
63
72
|
};
|
|
64
73
|
|
|
65
|
-
export function toolsForTuiRoute(tools: readonly LLMToolSpec[], route:
|
|
74
|
+
export function toolsForTuiRoute(tools: readonly LLMToolSpec[], route: QuickTuiRoute): LLMToolSpec[] {
|
|
66
75
|
const preferred = QUICK_TOOLS[route];
|
|
67
76
|
return preferred.flatMap((name) => tools.filter((tool) => tool.name === name));
|
|
68
77
|
}
|
|
@@ -127,6 +136,9 @@ export interface CoreTurnBridgeDeps {
|
|
|
127
136
|
abortPollMs?: number;
|
|
128
137
|
/** Only the in-process dashboard session opts into TUI routing; daemon ACP stays unchanged. */
|
|
129
138
|
tuiRouting?: boolean;
|
|
139
|
+
/** TUI-H1-SEAT-GOALLOOP — the seat this TUI works for (`detectSeatTui`), read per turn. null/absent = a human
|
|
140
|
+
* conversation TUI (routing unchanged). A seat TUI sends operational directives to the goal loop. */
|
|
141
|
+
resolveSeat?: () => string | null;
|
|
130
142
|
}
|
|
131
143
|
|
|
132
144
|
/** Default abort-poll cadence. 50ms = 20 Hz: responsive without
|
|
@@ -155,6 +167,10 @@ export function acpApprovalGatedDispatch(
|
|
|
155
167
|
};
|
|
156
168
|
}
|
|
157
169
|
|
|
170
|
+
/** 사용자 답에서 뺀 검증 보충을 로그에 남길 때 한 조각의 글자 수 — 로그 저장의 문자열 상한
|
|
171
|
+
* (`compactForLog` stringMax 256)보다 작아야 조각이 저장 중에 안 잘린다(리뷰 r4). */
|
|
172
|
+
const FINAL_SUPPLEMENT_LOG_CHUNK = 240;
|
|
173
|
+
|
|
158
174
|
/** Extract the trailing assistant message text from runCoreTurn's
|
|
159
175
|
* `newMessages` array. emitTurnComplete (src/llm.ts:3835) appends
|
|
160
176
|
* `{role:'assistant', content:[{type:'text', text:finalAssistantText}]}`
|
|
@@ -218,25 +234,59 @@ export function bridgeCoreTurnToAcp(
|
|
|
218
234
|
// Only a goal-driven harness child (explicit executor role — dev-harness · self-implement surfaces) keeps every
|
|
219
235
|
// turn on the goal loop. A human TUI inside a harness space (one-word `dev --elanous`, `--hold`) is routed (UX 10-07).
|
|
220
236
|
const harness = process.env[HARNESS_ROLE_ENV]?.trim() === 'executor';
|
|
237
|
+
// seatKnown=false: no resolver (or it threw) — routed as a human TUI, but the log keeps «unknown», not «not a seat».
|
|
238
|
+
let seat: string | null = null;
|
|
239
|
+
let seatKnown = false;
|
|
240
|
+
if (deps.tuiRouting && !harness && deps.resolveSeat) {
|
|
241
|
+
try { seat = deps.resolveSeat(); seatKnown = true; }
|
|
242
|
+
catch (error) { debug.log('chat.route', 'seat-unresolved', { error: String(error) }, { level: 'warn' }); }
|
|
243
|
+
}
|
|
221
244
|
const route = deps.tuiRouting && !harness
|
|
222
245
|
? classifyTuiChatIntent(turnCtx.userText, {
|
|
223
246
|
hasAttachments: turnCtx.promptBlocks?.some((block) => block.type !== 'text') ?? false,
|
|
247
|
+
seat: seat !== null,
|
|
224
248
|
})
|
|
225
249
|
: { route: '코딩·구현' as const, reason: harness ? 'harness' : 'legacy', goalLoop: true };
|
|
226
|
-
const tools = !route.goalLoop && route.route !== '코딩·구현'
|
|
250
|
+
const tools = !route.goalLoop && route.route !== '코딩·구현' && route.route !== '읽기·분석'
|
|
227
251
|
? toolsForTuiRoute(availableTools, route.route)
|
|
228
252
|
: availableTools;
|
|
229
253
|
if (deps.tuiRouting) {
|
|
230
|
-
debug.log('chat.route', 'decided', { route: route.route, reason: route.reason, goalLoop: route.goalLoop });
|
|
254
|
+
debug.log('chat.route', 'decided', { route: route.route, reason: route.reason, goalLoop: route.goalLoop, seat, seatKnown });
|
|
231
255
|
// Only a quick route is announced: a coding turn's transcript stays exactly as before (preservation).
|
|
232
256
|
// Awaited so the route line precedes the answer; a failed write is observed, not fatal to the turn.
|
|
233
257
|
if (!route.goalLoop) {
|
|
234
|
-
try { await turnCtx.push(
|
|
258
|
+
try { await turnCtx.push(formatTuiRouteLine(route.route)); }
|
|
235
259
|
catch (error) { debug.log('chat.route', 'push-failed', { route: route.route, error: String(error) }); }
|
|
236
260
|
}
|
|
237
261
|
}
|
|
238
262
|
const modelOverride = deps.resolveModel?.({ sessionId: turnCtx.sessionId, userText: turnCtx.userText });
|
|
239
|
-
|
|
263
|
+
// Tier 2 arming(config-gated·2026-07-19 goal-exec → 아크4 전-family) — llm.goalLoop.enabled
|
|
264
|
+
// 면 across-turn goal loop(runGoalLoop)로 감싸 목표 완료(update_goal 증거게이트)까지 지속·
|
|
265
|
+
// continuation 재주입. **family 무관**(runGoalLoop 프롬프트·update_goal 툴 전부 provider-generic·
|
|
266
|
+
// 백스톱=max-iter·spin·blocked-3strike·context-pressure). 그 외엔 단일 turn(runCoreTurn).
|
|
267
|
+
// 하드코딩 기본 ON 아님 — config 로 아밍(안전).
|
|
268
|
+
const goalLoopCfg = getUserConfig().llm.goalLoop;
|
|
269
|
+
const armGoalLoop = goalLoopCfg?.enabled === true && route.goalLoop;
|
|
270
|
+
// 인지(TUI-H1-SEAT-GOALLOOP) — 자리 TUI 의 운영 지시가 그래도 단일 턴이면(예: llm.goalLoop 꺼짐) 경고로 남긴다.
|
|
271
|
+
// 빠른 짧은 물음(short-*)은 자리에서도 «의도적» 단일 턴이라 경고에서 뺀다(«다음 행이 뭐야?»).
|
|
272
|
+
if (deps.tuiRouting && seat !== null && !armGoalLoop && !route.reason.startsWith('short-')
|
|
273
|
+
&& isSeatOpsDirective(turnCtx.userText)) {
|
|
274
|
+
try {
|
|
275
|
+
debug.log('chat.route', 'seat-ops-single-turn', {
|
|
276
|
+
seat, route: route.route, reason: route.reason, goalLoop: route.goalLoop,
|
|
277
|
+
goalLoopEnabled: goalLoopCfg?.enabled === true,
|
|
278
|
+
}, { level: 'warn' });
|
|
279
|
+
} catch { /* observation cannot interrupt a turn */ }
|
|
280
|
+
}
|
|
281
|
+
// 사실 질문 예산은 «단일 턴» 전용이다 — goal loop 와 겹치면 예산을 다 쓴 뒤에도 루프가 계속 재촉해
|
|
282
|
+
// 매 continuation 이 «Tool budget reached» 로 거부되고, 모델은 그것을 도구 장애로 읽어 blocked 를 남긴다
|
|
283
|
+
// (10-14 13:48 운영 TUI OP: route short-question·goalLoop ⊕ factQuestion → 소진 뒤 헛호출 7회).
|
|
284
|
+
const factShaped = isFactQuestion(turnCtx.userText);
|
|
285
|
+
const factQuestion = factShaped && !armGoalLoop;
|
|
286
|
+
if (factShaped && armGoalLoop) {
|
|
287
|
+
try { debug.log('chat.turn', 'fact-budget-skipped', { reason: 'goal-loop-armed', route: route.route }); }
|
|
288
|
+
catch { /* observation cannot interrupt a turn */ }
|
|
289
|
+
}
|
|
240
290
|
const explicitMaxToolTurns = deps.resolveMaxToolTurns?.({ sessionId: turnCtx.sessionId });
|
|
241
291
|
const maxToolTurns = explicitMaxToolTurns ?? (factQuestion ? getUserConfig().chat.factQuestion.maxToolTurns : undefined);
|
|
242
292
|
const turnMessages: LLMMessage[] = factQuestion
|
|
@@ -262,15 +312,12 @@ export function bridgeCoreTurnToAcp(
|
|
|
262
312
|
// `delta=''` (synthesizedText lost to ACP). The dashboard never
|
|
263
313
|
// saw the substantive answer — only the streamed narration.
|
|
264
314
|
let streamedTextSum = '';
|
|
265
|
-
//
|
|
266
|
-
//
|
|
267
|
-
|
|
268
|
-
//
|
|
269
|
-
// 하드코딩 기본 ON 아님 — config 로 아밍(안전). turnFamily 는 관측용으로만 유지.
|
|
270
|
-
const goalLoopCfg = getUserConfig().llm.goalLoop;
|
|
315
|
+
// 런타임이 최종 답 꼬리에 붙인 검증 보충(변경 파일·검증 최신성·루프 마감 상태 — goal loop 내부 판정).
|
|
316
|
+
// 사용자 답에서는 빼고 로그로 보낸다(TUI 결함 #25). 코어 턴이 끝날 때마다(goal loop 반복 경계) 비운다.
|
|
317
|
+
let finalSupplement: { answer: string; supplement: string; finalText: string } | null = null;
|
|
318
|
+
// turnFamily 는 관측용으로만 유지(goal loop 아밍 판정은 위 사실 질문 판정 앞에서 한다).
|
|
271
319
|
const turnModel = modelOverride ?? getUserConfig().llm.model;
|
|
272
320
|
const turnFamily = getModelFamily(turnModel);
|
|
273
|
-
const armGoalLoop = goalLoopCfg?.enabled === true && route.goalLoop;
|
|
274
321
|
if (armGoalLoop) {
|
|
275
322
|
// 관측 — 어느 family/모델에서 across-turn goal-loop 가 아밍됐나(전-family 개방 검증).
|
|
276
323
|
debug.log('goal.loop', 'arm', { family: turnFamily, model: turnModel });
|
|
@@ -285,10 +332,17 @@ export function bridgeCoreTurnToAcp(
|
|
|
285
332
|
safeguard: 'context-pressure-bail',
|
|
286
333
|
});
|
|
287
334
|
}
|
|
335
|
+
// TUI-SEAT-TURN-CAP — 자리 판정으로 goal loop 에 온 턴만 core 턴 상한·«할 일 0» 판정을 받는다(사람 TUI·하니스 자식 0).
|
|
336
|
+
const seatTurnCap = armGoalLoop && seat !== null && route.reason.startsWith('seat-')
|
|
337
|
+
? { seat, ...resolveSeatTurnCap(parseSeatTurnCapConfig(getUserConfig().chat?.seatTurnCap)) }
|
|
338
|
+
: undefined;
|
|
288
339
|
const runTurnDispatch = (c: CoreTurnContext): Promise<unknown> =>
|
|
289
340
|
armGoalLoop
|
|
290
341
|
? runGoalLoop(c, {
|
|
291
342
|
...(goalLoopCfg?.maxIterations !== undefined ? { maxIterations: goalLoopCfg.maxIterations } : {}),
|
|
343
|
+
// #29 처방 — 자리 판정으로 goal loop 에 «되돌아온» 턴만 빈 evidence 완료를 답으로 받는다.
|
|
344
|
+
...(route.reason.startsWith('seat-') ? { lenientCompletionEvidence: true } : {}),
|
|
345
|
+
...(seatTurnCap !== undefined ? { seatTurnCap } : {}),
|
|
292
346
|
...(goalCtxWindow > 0 ? { contextTokenLimit: goalCtxWindow } : {}),
|
|
293
347
|
})
|
|
294
348
|
: runCoreTurn(c);
|
|
@@ -326,7 +380,7 @@ export function bridgeCoreTurnToAcp(
|
|
|
326
380
|
return approvedDispatch(name, args, dispatchCtx);
|
|
327
381
|
}
|
|
328
382
|
: approvedDispatch;
|
|
329
|
-
await runTurnDispatch({
|
|
383
|
+
const dispatchResult = await runTurnDispatch({
|
|
330
384
|
sessionId: turnCtx.sessionId,
|
|
331
385
|
...(originSessionId ? { originSessionId } : {}),
|
|
332
386
|
...(turnCtx.userText ? { userText: turnCtx.userText } : {}),
|
|
@@ -338,7 +392,11 @@ export function bridgeCoreTurnToAcp(
|
|
|
338
392
|
...(maxToolTurns !== undefined ? { maxToolTurns } : {}),
|
|
339
393
|
...((!factQuestion || explicitMaxToolTurns !== undefined) && deps.budgetGrant !== undefined ? { budgetGrant: deps.budgetGrant } : {}),
|
|
340
394
|
callbacks: {
|
|
341
|
-
onText: (delta) => {
|
|
395
|
+
onText: (delta, full) => {
|
|
396
|
+
// ⛔ 검증 보충이 붙은 최종 답의 재방출(`onText('', 답+보충)`)은 흘리지 않는다 — 빈 청크를 TUI 는
|
|
397
|
+
// «확정(commit)»으로 읽어 이미 그린 답을 굳히고, 아래 onTurnComplete 재표면화가 같은 답을
|
|
398
|
+
// «한 번 더» 그렸다(TUI 결함 #25 · 10-14 18:36 OPT). 답 표시는 onTurnComplete 가 정한다.
|
|
399
|
+
if (delta === '' && finalSupplement !== null && full === finalSupplement.finalText) return;
|
|
342
400
|
// Fire-and-forget: ACP `push` is async but the core-turn
|
|
343
401
|
// contract is synchronous onText. Chunks are delivered in
|
|
344
402
|
// order because `sessionUpdate` is serialized per-
|
|
@@ -353,6 +411,7 @@ export function bridgeCoreTurnToAcp(
|
|
|
353
411
|
// callers see today. Fire-and-forget for the same reason
|
|
354
412
|
// onText is: callbacks are synchronous, `turnCtx.push*` is
|
|
355
413
|
// async, ordering is preserved by the SDK.
|
|
414
|
+
onFinalAnswerSupplement: (info) => { finalSupplement = info; },
|
|
356
415
|
onToolCall: (call) => {
|
|
357
416
|
if (!factQuestion || maxToolTurns === undefined || maxToolTurns <= 0) {
|
|
358
417
|
toolCallCount += 1;
|
|
@@ -362,7 +421,8 @@ export function bridgeCoreTurnToAcp(
|
|
|
362
421
|
void turnCtx.pushToolCall(call);
|
|
363
422
|
},
|
|
364
423
|
onToolResult: (call) => { void turnCtx.pushToolResult(call); },
|
|
365
|
-
|
|
424
|
+
// 턴 모델(라우팅 결과)을 실어 보낸다 — 대시보드 턴 지표가 설정 모델로 ctx·단가를 잡지 않게.
|
|
425
|
+
onUsage: (usage) => { void turnCtx.pushUsage({ ...usage, model: usage.model ?? turnModel }); },
|
|
366
426
|
// Codex Responses API reasoning summary stream. Currently
|
|
367
427
|
// surfaced via forensic only (debug.log) — acts as the
|
|
368
428
|
// "did the model actually emit reasoning?" verification
|
|
@@ -434,12 +494,28 @@ export function bridgeCoreTurnToAcp(
|
|
|
434
494
|
const visibleFinalText = needsFollowup ? extractLastAssistantText(completedMessages) : finalAssistantText;
|
|
435
495
|
const originalFinalStreamed = needsFollowup && finalAssistantText !== null
|
|
436
496
|
&& streamedTextSum.endsWith(finalAssistantText);
|
|
497
|
+
// TUI-GOAL-REPEAT-ANSWER — 골 루프가 «인사 + 같은 답» 재방출을 화면에서 가리면(원장은 그대로)
|
|
498
|
+
// 브리지의 스트림 합계에는 그 답이 없다. 그대로 보면 «마지막 답을 못 그렸다»고 재표면화로 다시
|
|
499
|
+
// 그린다 — 이전 답이 이미 화면에 있는데도. 인사를 뗀 답 부분이 스트림 꼬리에 있으면 «그렸다»로
|
|
500
|
+
// 본다(골 루프 경로에서만 — 다른 경로의 판정은 그대로).
|
|
501
|
+
const goalRepeatStrippedFinalText = armGoalLoop && visibleFinalText !== null
|
|
502
|
+
? stripGoalRepeatReadbackPreface(visibleFinalText)
|
|
503
|
+
: visibleFinalText;
|
|
437
504
|
const synthesisAlreadyStreamed =
|
|
438
505
|
visibleFinalText !== null
|
|
439
506
|
&& visibleFinalText.length > 0
|
|
440
|
-
&& streamedTextSum.endsWith(visibleFinalText)
|
|
507
|
+
&& (streamedTextSum.endsWith(visibleFinalText)
|
|
508
|
+
|| (goalRepeatStrippedFinalText !== null && goalRepeatStrippedFinalText.length > 0
|
|
509
|
+
&& streamedTextSum.endsWith(goalRepeatStrippedFinalText)));
|
|
510
|
+
// ⭐ 최종 답 = 모델 답 ⊕ 런타임 검증 보충이면 사용자에겐 «모델 답»만 보인다 — 보충은 로그로(#25).
|
|
511
|
+
// 대화 이력(completedMessages)엔 그대로 남아 다음 턴 맥락은 바뀌지 않는다.
|
|
512
|
+
const supplement = finalSupplement !== null && finalAssistantText === finalSupplement.finalText
|
|
513
|
+
? finalSupplement
|
|
514
|
+
: null;
|
|
515
|
+
finalSupplement = null;
|
|
441
516
|
const needsReSurface =
|
|
442
|
-
|
|
517
|
+
supplement === null
|
|
518
|
+
&& visibleFinalText !== null
|
|
443
519
|
&& visibleFinalText !== streamedTextSum
|
|
444
520
|
&& !synthesisAlreadyStreamed
|
|
445
521
|
&& !originalFinalStreamed;
|
|
@@ -452,9 +528,38 @@ export function bridgeCoreTurnToAcp(
|
|
|
452
528
|
&& visibleFinalText.startsWith(streamedTextSum),
|
|
453
529
|
endsWithStreamedTail: synthesisAlreadyStreamed,
|
|
454
530
|
needsReSurface,
|
|
531
|
+
supplementChars: supplement?.supplement.length ?? 0,
|
|
455
532
|
});
|
|
456
533
|
}
|
|
457
|
-
if (
|
|
534
|
+
if (supplement !== null) {
|
|
535
|
+
// TUI-GOAL-REPEAT-ANSWER — 위와 같은 이유: 인사를 뗀 답 부분이 스트림 꼬리에 있으면 그렸다(골 루프만).
|
|
536
|
+
const answerStreamed = supplement.answer.length > 0
|
|
537
|
+
&& (streamedTextSum.trimEnd().endsWith(supplement.answer)
|
|
538
|
+
|| (armGoalLoop
|
|
539
|
+
&& streamedTextSum.trimEnd().endsWith(stripGoalRepeatReadbackPreface(supplement.answer))));
|
|
540
|
+
try {
|
|
541
|
+
// 보충 «전체»를 남긴다 — 한 행이 저장 전에 잘리지 않게 조각(part/parts)으로 나눈다(리뷰 r3·r4).
|
|
542
|
+
const redacted = redactSecretText(supplement.supplement);
|
|
543
|
+
const parts = Math.max(1, Math.ceil(redacted.length / FINAL_SUPPLEMENT_LOG_CHUNK));
|
|
544
|
+
for (let part = 0; part < parts; part += 1) {
|
|
545
|
+
debug.log('acp.turn', 'final-supplement-withheld', {
|
|
546
|
+
sessionId: turnCtx.sessionId,
|
|
547
|
+
answerChars: supplement.answer.length,
|
|
548
|
+
answerStreamed,
|
|
549
|
+
supplementChars: supplement.supplement.length,
|
|
550
|
+
part: part + 1,
|
|
551
|
+
parts,
|
|
552
|
+
supplement: redacted.slice(part * FINAL_SUPPLEMENT_LOG_CHUNK, (part + 1) * FINAL_SUPPLEMENT_LOG_CHUNK),
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
} catch { /* observation cannot interrupt a turn */ }
|
|
556
|
+
if (!answerStreamed && supplement.answer.length > 0) {
|
|
557
|
+
void turnCtx.push('');
|
|
558
|
+
void turnCtx.push(needsFollowup ? `${supplement.answer}${followupSuffix}` : supplement.answer);
|
|
559
|
+
} else if (needsFollowup) {
|
|
560
|
+
void turnCtx.push(followupSuffix);
|
|
561
|
+
}
|
|
562
|
+
} else if (originalFinalStreamed) {
|
|
458
563
|
void turnCtx.push(followupSuffix);
|
|
459
564
|
} else if (needsReSurface) {
|
|
460
565
|
// Emit a clear-then-replace pair so clients that follow
|
|
@@ -476,6 +581,22 @@ export function bridgeCoreTurnToAcp(
|
|
|
476
581
|
},
|
|
477
582
|
},
|
|
478
583
|
});
|
|
584
|
+
// ⭐ 인증 거절은 코어 턴이 «던지지 않고» 돌려준다 — 여기서 안 읽으면 서버는 end_turn 을 내고
|
|
585
|
+
// TUI 엔 «✔ 완료»만 남는다(TUI 결함 #22). 던져서 실패 경로(prompt-failed · 오류 줄)로 보낸다.
|
|
586
|
+
const stopReason = (dispatchResult as { stopReason?: unknown } | null | undefined)?.stopReason;
|
|
587
|
+
if (stopReason === 'auth_rejected') {
|
|
588
|
+
const rawError = (dispatchResult as { errorMessage?: unknown }).errorMessage;
|
|
589
|
+
const error = new CoreTurnAuthRejectedError(typeof rawError === 'string' ? rawError : undefined);
|
|
590
|
+
try {
|
|
591
|
+
debug.log('acp.turn', 'auth-rejected', {
|
|
592
|
+
sessionId: turnCtx.sessionId,
|
|
593
|
+
model: turnModel,
|
|
594
|
+
goalLoop: armGoalLoop,
|
|
595
|
+
error: error.rawMessage.slice(0, 300),
|
|
596
|
+
}, { level: 'warn' });
|
|
597
|
+
} catch { /* observation cannot interrupt a turn */ }
|
|
598
|
+
throw error;
|
|
599
|
+
}
|
|
479
600
|
} finally {
|
|
480
601
|
clearInterval(poll);
|
|
481
602
|
}
|
|
@@ -79,6 +79,8 @@ export interface ElanousUiUsagePayload {
|
|
|
79
79
|
/** Opaque correlation id. Dashboard uses `turn:<epoch>` per turn. */
|
|
80
80
|
id: string;
|
|
81
81
|
provider?: 'anthropic' | 'openai';
|
|
82
|
+
/** 그 턴이 실제로 요청한 모델(라우팅 결과 — 설정 모델과 다를 수 있다). */
|
|
83
|
+
model?: string;
|
|
82
84
|
inputTokens?: number;
|
|
83
85
|
outputTokens?: number;
|
|
84
86
|
cacheReadInputTokens?: number;
|
package/src/acp/server.ts
CHANGED
|
@@ -837,6 +837,7 @@ export interface AcpTurnContext {
|
|
|
837
837
|
* didn't advertise `elanous.ui.usage` in its ClientCapabilities. */
|
|
838
838
|
pushUsage: (usage: {
|
|
839
839
|
provider?: 'anthropic' | 'openai';
|
|
840
|
+
model?: string;
|
|
840
841
|
inputTokens?: number;
|
|
841
842
|
outputTokens?: number;
|
|
842
843
|
cacheReadInputTokens?: number;
|
|
@@ -1837,6 +1838,7 @@ function wireAcpConnection(
|
|
|
1837
1838
|
const payload: ElanousUiUsagePayload = {
|
|
1838
1839
|
id: `turn:${Date.now()}`,
|
|
1839
1840
|
...(usage.provider !== undefined ? { provider: usage.provider } : {}),
|
|
1841
|
+
...(usage.model !== undefined ? { model: usage.model } : {}),
|
|
1840
1842
|
...(usage.inputTokens !== undefined ? { inputTokens: usage.inputTokens } : {}),
|
|
1841
1843
|
...(usage.outputTokens !== undefined ? { outputTokens: usage.outputTokens } : {}),
|
|
1842
1844
|
...(usage.cacheReadInputTokens !== undefined
|
package/src/ad-pipeline/run.ts
CHANGED
|
@@ -223,6 +223,8 @@ export interface AdProductionDeps {
|
|
|
223
223
|
readonly render?: CommandRunner;
|
|
224
224
|
/** Optional calibrated thresholds; omitted thresholds intentionally preserve unmeasured QC findings. */
|
|
225
225
|
readonly qcThresholds?: QcThresholds;
|
|
226
|
+
/** Platform that decides whether on-screen text OCR (macOS Vision via swiftc) is planned; defaults to `process.platform`. */
|
|
227
|
+
readonly qcPlatform?: NodeJS.Platform;
|
|
226
228
|
}
|
|
227
229
|
|
|
228
230
|
export interface AdOutputIdentity {
|
|
@@ -828,7 +830,7 @@ async function runQc(
|
|
|
828
830
|
captionedMasterPath?: string,
|
|
829
831
|
): Promise<QcResult | undefined> {
|
|
830
832
|
if (!production?.render || !scene || !masterPath) return undefined;
|
|
831
|
-
const { measurements, unavailableTextRegions } = await measureQc(production, buildQcMeasurementPlan(scene, masterPath));
|
|
833
|
+
const { measurements, unavailableTextRegions } = await measureQc(production, buildQcMeasurementPlan(scene, masterPath, production.qcPlatform ?? process.platform));
|
|
832
834
|
if (unavailableTextRegions !== undefined) {
|
|
833
835
|
debug.log('ad-pipeline.qc', 'text-regions-unavailable', { reason: unavailableTextRegions });
|
|
834
836
|
}
|
|
@@ -851,7 +853,7 @@ async function runQc(
|
|
|
851
853
|
debug.log('ad-pipeline.qc', 'captioned-master-absent', { reason: !captionedMasterPath ? 'captioned-master-unavailable' : 'no-caption-lines' });
|
|
852
854
|
return baseResult;
|
|
853
855
|
}
|
|
854
|
-
const captionedPlan = buildQcMeasurementPlan(scene, captionedMasterPath, process.platform, {
|
|
856
|
+
const captionedPlan = buildQcMeasurementPlan(scene, captionedMasterPath, production.qcPlatform ?? process.platform, {
|
|
855
857
|
textFrameAtSeconds: (line.startMs + line.endMs) / 2000,
|
|
856
858
|
});
|
|
857
859
|
const captionedMeasurement = await measureQc(production, captionedPlan, (step) => step === 'probe' || step.startsWith('text-'));
|
|
@@ -18,6 +18,23 @@ import { debug } from '../debug/log.js';
|
|
|
18
18
|
/** 로컬 참조 루트(기본 ~/source/ref). 다른 환경엔 없으면 무동작(graceful). */
|
|
19
19
|
export const DEFAULT_REFERENCE_ROOTS = [join(homedir(), 'source', 'ref')];
|
|
20
20
|
|
|
21
|
+
// 대표 2026-10-14 — 비공개 소스(Claude Code 사본) 통로 차단. Claude Code 는 공개 계약(code.claude.com)만 본다.
|
|
22
|
+
// ref 루트 아래 디렉터리가 실존해도 이 이름이면 그라운딩·조회 대상에서 뺀다(대소문자·`_`/`-` 변형 포함).
|
|
23
|
+
const NON_PUBLIC_REFERENCE_PATTERN = /^claude[-_]?code[-_]?(?:fork|src|source|leak|leaked)$/i;
|
|
24
|
+
|
|
25
|
+
/** 공개 계약이 아닌 참조 사본 이름인가. `owner/repo` 꼴이면 마지막 칸으로 본다. */
|
|
26
|
+
export function isNonPublicReferenceName(name: string): boolean {
|
|
27
|
+
const last = name.trim().replace(/\/+$/, '').split('/').pop() ?? '';
|
|
28
|
+
return NON_PUBLIC_REFERENCE_PATTERN.test(last);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** 거부 판정 ⊕ 관측 한 줄. 거부면 true. */
|
|
32
|
+
export function denyNonPublicReference(name: string): boolean {
|
|
33
|
+
if (!isNonPublicReferenceName(name)) return false;
|
|
34
|
+
try { debug.log('ref.grounding', 'denied', { name, reason: 'non-public-source' }); } catch { /* fail-soft */ }
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
|
|
21
38
|
function expandTilde(p: string): string {
|
|
22
39
|
return p.startsWith('~') ? join(homedir(), p.slice(1)) : p;
|
|
23
40
|
}
|
|
@@ -91,6 +108,7 @@ export function localRefGroundingDigest(taskText: string, roots: string[] = DEFA
|
|
|
91
108
|
if (!existsSync(root)) continue;
|
|
92
109
|
for (const token of tokens) {
|
|
93
110
|
if (seen.has(token)) continue;
|
|
111
|
+
if (denyNonPublicReference(token)) { seen.add(token); continue; }
|
|
94
112
|
try {
|
|
95
113
|
const path = join(root, token);
|
|
96
114
|
if (statSync(path).isDirectory()) { found.push({ path, root, token }); seen.add(token); }
|
package/src/agent/runner.ts
CHANGED
|
@@ -13,6 +13,9 @@
|
|
|
13
13
|
// generator terminates instead of hanging.
|
|
14
14
|
|
|
15
15
|
import {
|
|
16
|
+
inferProviderFromModel,
|
|
17
|
+
isModelCompatible,
|
|
18
|
+
resolveDefaultProvider,
|
|
16
19
|
streamLLMWithTools,
|
|
17
20
|
type LLMMessage,
|
|
18
21
|
type LLMToolSpec,
|
|
@@ -20,6 +23,7 @@ import {
|
|
|
20
23
|
import { debug } from '../debug/log.js';
|
|
21
24
|
import { buildUniversalPreamble } from '../prompt-library/universal-preamble.js';
|
|
22
25
|
import { getModelFamily } from '../models/prompts.js';
|
|
26
|
+
import { resolveModelAlias } from '../intelligence-map/model-alias.js';
|
|
23
27
|
import type {
|
|
24
28
|
AgentDefinition, AgentEvent, AgentSpawnOpts, AgentTask,
|
|
25
29
|
} from './types.js';
|
|
@@ -57,6 +61,151 @@ class AsyncEventQueue<T> {
|
|
|
57
61
|
}
|
|
58
62
|
}
|
|
59
63
|
|
|
64
|
+
// ── Model resolution (TUI-AGENT-MODEL-FALLBACK · 결함 #34) ──
|
|
65
|
+
//
|
|
66
|
+
// A definition's frontmatter `model:` is a REQUEST, not a guarantee. The
|
|
67
|
+
// runner must check it against the provider the child will actually run
|
|
68
|
+
// on BEFORE handing it to streamLLMWithTools — a codex parent used to
|
|
69
|
+
// request `haiku` verbatim and die (the provider chain re-routed the
|
|
70
|
+
// Claude-family id to Anthropic, 결함 #34, 2026-10-14).
|
|
71
|
+
//
|
|
72
|
+
// `model: undefined` in the result means "inherit the parent": the child
|
|
73
|
+
// then rides streamLLMWithTools's own provider decision
|
|
74
|
+
// (`opts.provider ?? resolveDefaultProvider(opts.model)`), exactly like a
|
|
75
|
+
// spawn with no model hint at all.
|
|
76
|
+
|
|
77
|
+
/** Why resolveAgentModel returned the model it did. Six distinct exits —
|
|
78
|
+
* never collapse them into one value: "fell back to parent" and "sent an
|
|
79
|
+
* unrecognized id verbatim" must stay separable in the logs. */
|
|
80
|
+
export type AgentModelResolutionReason =
|
|
81
|
+
| 'no-definition-model'
|
|
82
|
+
| 'declared-inherit'
|
|
83
|
+
| 'definition'
|
|
84
|
+
| 'incompatible-provider'
|
|
85
|
+
| 'unknown-model'
|
|
86
|
+
| 'provider-unknown';
|
|
87
|
+
|
|
88
|
+
export interface AgentModelResolution {
|
|
89
|
+
/** Canonical model id; undefined = inherit the parent's model. */
|
|
90
|
+
model: string | undefined;
|
|
91
|
+
reason: AgentModelResolutionReason;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Injection seams so tests can pin the provider / inference without
|
|
95
|
+
* touching user config. Defaults are the production functions. */
|
|
96
|
+
export interface ResolveAgentModelDeps {
|
|
97
|
+
currentProviderName: () => string;
|
|
98
|
+
isCompatible: (providerName: string, model: string) => boolean;
|
|
99
|
+
inferProvider: (model: string) => string | null;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Production `currentProviderName` — the provider a model-less spawn
|
|
103
|
+
* would run on right now (the parent-configured default). A lookup
|
|
104
|
+
* failure is NOT hidden behind a made-up name: it throws, and
|
|
105
|
+
* resolveAgentModel turns it into the separate `provider-unknown` exit
|
|
106
|
+
* (judging compatibility against a fake name like 'auto' would drop a
|
|
107
|
+
* usable definition model to inherit). */
|
|
108
|
+
function productionCurrentProviderName(): string {
|
|
109
|
+
return resolveDefaultProvider().name;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const defaultResolveAgentModelDeps: ResolveAgentModelDeps = {
|
|
113
|
+
currentProviderName: productionCurrentProviderName,
|
|
114
|
+
isCompatible: isModelCompatible,
|
|
115
|
+
inferProvider: inferProviderFromModel,
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
/** Resolve a definition model against the provider the child would run
|
|
119
|
+
* on RIGHT NOW. Decision order — each step guards the next:
|
|
120
|
+
* 1. no model → { undefined, 'no-definition-model' }
|
|
121
|
+
* 2. `inherit` (trimmed, case-insensitive; an inheritance MARKER, not
|
|
122
|
+
* a model name) → { undefined, 'declared-inherit' }
|
|
123
|
+
* 3. resolveModelAlias → canonical id
|
|
124
|
+
* 4. inferProvider(canonical) === null → { canonical, 'unknown-model' }
|
|
125
|
+
* — do NOT fall back: free-form names ride the provider as-is
|
|
126
|
+
* (isModelCompatible's "unknown prefix is the provider's problem"
|
|
127
|
+
* stance; dropping a local free-form name to inherit is a regression)
|
|
128
|
+
* 5. isCompatible(currentProviderName, canonical)
|
|
129
|
+
* true → { canonical, 'definition' }
|
|
130
|
+
* false → { undefined, 'incompatible-provider' } (parent fallback)
|
|
131
|
+
* currentProviderName throws → { undefined, 'provider-unknown' } —
|
|
132
|
+
* compatibility cannot be judged, so the definition model is NOT
|
|
133
|
+
* sent (sending it could re-route the provider by model name); the
|
|
134
|
+
* child inherits the parent model — the goal's «can't call it →
|
|
135
|
+
* parent model» intent, kept as its own reason so a lookup failure
|
|
136
|
+
* is never confused with a real incompatibility
|
|
137
|
+
*
|
|
138
|
+
* Inference (4) runs BEFORE compatibility (5) because isModelCompatible
|
|
139
|
+
* returns true on null inference — checking compatibility first would
|
|
140
|
+
* mislabel every unknown model as compatible and the unknown-model exit
|
|
141
|
+
* would be unreachable. */
|
|
142
|
+
export function resolveAgentModel(
|
|
143
|
+
defModel: string | undefined,
|
|
144
|
+
deps: Partial<ResolveAgentModelDeps> = {},
|
|
145
|
+
): AgentModelResolution {
|
|
146
|
+
const d: ResolveAgentModelDeps = { ...defaultResolveAgentModelDeps, ...deps };
|
|
147
|
+
if (defModel === undefined || defModel.trim() === '') {
|
|
148
|
+
return { model: undefined, reason: 'no-definition-model' };
|
|
149
|
+
}
|
|
150
|
+
const trimmed = defModel.trim();
|
|
151
|
+
if (trimmed.toLowerCase() === 'inherit') {
|
|
152
|
+
return { model: undefined, reason: 'declared-inherit' };
|
|
153
|
+
}
|
|
154
|
+
const canonical = resolveModelAlias(trimmed) ?? trimmed;
|
|
155
|
+
if (d.inferProvider(canonical) === null) {
|
|
156
|
+
return { model: canonical, reason: 'unknown-model' };
|
|
157
|
+
}
|
|
158
|
+
let providerName: string;
|
|
159
|
+
try {
|
|
160
|
+
providerName = d.currentProviderName();
|
|
161
|
+
} catch {
|
|
162
|
+
return { model: undefined, reason: 'provider-unknown' };
|
|
163
|
+
}
|
|
164
|
+
if (d.isCompatible(providerName, canonical)) {
|
|
165
|
+
return { model: canonical, reason: 'definition' };
|
|
166
|
+
}
|
|
167
|
+
return { model: undefined, reason: 'incompatible-provider' };
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** Resolve + record exactly one `agent.model` observation. Every runtime
|
|
171
|
+
* resolution goes through here (runAgent ⊕ a direct buildAgentMessages call
|
|
172
|
+
* without a pre-resolved `model`) so «one observation per resolution» holds
|
|
173
|
+
* on both paths. incompatible-provider (parent fallback), unknown-model
|
|
174
|
+
* (verbatim pass-through of an unrecognizable id) and provider-unknown
|
|
175
|
+
* (provider lookup failed, inherited the parent unjudged) are the exits an
|
|
176
|
+
* operator must tell apart from a log line alone — they get warn level. */
|
|
177
|
+
function resolveAgentModelObserved(
|
|
178
|
+
def: Pick<AgentDefinition, 'name' | 'model'>,
|
|
179
|
+
pinnedProviderName?: string,
|
|
180
|
+
): AgentModelResolution {
|
|
181
|
+
let providerError: string | undefined;
|
|
182
|
+
let currentProviderName: string | undefined = pinnedProviderName;
|
|
183
|
+
const resolution = resolveAgentModel(def.model, {
|
|
184
|
+
currentProviderName: () => {
|
|
185
|
+
if (currentProviderName !== undefined) return currentProviderName;
|
|
186
|
+
try {
|
|
187
|
+
currentProviderName = productionCurrentProviderName();
|
|
188
|
+
return currentProviderName;
|
|
189
|
+
} catch (error) {
|
|
190
|
+
providerError = error instanceof Error ? error.message : String(error);
|
|
191
|
+
throw error;
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
debug.log('agent.model', 'resolved', {
|
|
196
|
+
agent: def.name,
|
|
197
|
+
declared: def.model,
|
|
198
|
+
model: resolution.model,
|
|
199
|
+
reason: resolution.reason,
|
|
200
|
+
provider: currentProviderName ?? null,
|
|
201
|
+
...(providerError !== undefined ? { providerError } : {}),
|
|
202
|
+
}, resolution.reason === 'incompatible-provider' || resolution.reason === 'unknown-model'
|
|
203
|
+
|| resolution.reason === 'provider-unknown'
|
|
204
|
+
? { level: 'warn' as const }
|
|
205
|
+
: undefined);
|
|
206
|
+
return resolution;
|
|
207
|
+
}
|
|
208
|
+
|
|
60
209
|
// ── Helpers ──
|
|
61
210
|
|
|
62
211
|
/** Assemble the initial message history. The parent's rendered system
|
|
@@ -74,7 +223,7 @@ export function buildAgentMessages(
|
|
|
74
223
|
def: AgentDefinition,
|
|
75
224
|
prompt: string,
|
|
76
225
|
systemPromptPrefix?: string,
|
|
77
|
-
ctx: { cwd?: string; enabledTools?: readonly string[] } = {},
|
|
226
|
+
ctx: { cwd?: string; enabledTools?: readonly string[]; model?: string } = {},
|
|
78
227
|
): LLMMessage[] {
|
|
79
228
|
let effectivePrefix: string | undefined = systemPromptPrefix;
|
|
80
229
|
if (def.omitInheritedContext) {
|
|
@@ -108,7 +257,15 @@ export function buildAgentMessages(
|
|
|
108
257
|
// omitInheritedContext contract stable we honor it strictly.
|
|
109
258
|
let universalPreamble: LLMMessage[] = [];
|
|
110
259
|
if (!def.omitInheritedContext && ctx.cwd) {
|
|
111
|
-
|
|
260
|
+
// TUI-AGENT-MODEL-FALLBACK: the preamble's modelFamily must track the
|
|
261
|
+
// model the run will actually use. runAgent passes the already-resolved
|
|
262
|
+
// model (one resolution + one `agent.model` observation per spawn);
|
|
263
|
+
// direct callers that omit `model` resolve here so a definition model
|
|
264
|
+
// the current provider can't run never reaches the preamble either.
|
|
265
|
+
const effectiveModel = 'model' in ctx
|
|
266
|
+
? ctx.model
|
|
267
|
+
: resolveAgentModelObserved(def).model;
|
|
268
|
+
const agentModelFamily = effectiveModel ? getModelFamily(effectiveModel) : undefined;
|
|
112
269
|
universalPreamble = buildUniversalPreamble({
|
|
113
270
|
cwd: ctx.cwd,
|
|
114
271
|
...(agentModelFamily !== undefined ? { modelFamily: agentModelFamily } : {}),
|
|
@@ -206,6 +363,14 @@ export async function* runAgent(
|
|
|
206
363
|
// `Agent` → search-vs-spawn split, `TaskCreate` → don't batch).
|
|
207
364
|
const tools = filterAgentTools(opts.tools, task.definition.tools);
|
|
208
365
|
|
|
366
|
+
// TUI-AGENT-MODEL-FALLBACK (결함 #34): resolve the definition model
|
|
367
|
+
// against the provider the child will ACTUALLY run on — the pinned
|
|
368
|
+
// `opts.provider` when the dispatcher chose one, otherwise the
|
|
369
|
+
// parent-configured default (what streamLLMWithTools picks for a
|
|
370
|
+
// model-less spawn). `model: undefined` = inherit: the child then takes
|
|
371
|
+
// the same provider/model decision path as the parent.
|
|
372
|
+
const modelResolution = resolveAgentModelObserved(task.definition, opts.provider?.name);
|
|
373
|
+
|
|
209
374
|
// Build history on the task so callers can inspect it after the run.
|
|
210
375
|
// PFC-S1 P5: pass task.cwd so the slim-context notice (when
|
|
211
376
|
// omitInheritedContext) can name the child's working directory.
|
|
@@ -214,6 +379,7 @@ export async function* runAgent(
|
|
|
214
379
|
task.prompt,
|
|
215
380
|
opts.systemPromptPrefix,
|
|
216
381
|
{
|
|
382
|
+
model: modelResolution.model,
|
|
217
383
|
...(task.cwd ? { cwd: task.cwd } : {}),
|
|
218
384
|
...(tools ? { enabledTools: tools.map(t => t.name) } : {}),
|
|
219
385
|
},
|
|
@@ -252,7 +418,7 @@ export async function* runAgent(
|
|
|
252
418
|
dispatchTool,
|
|
253
419
|
},
|
|
254
420
|
{
|
|
255
|
-
model:
|
|
421
|
+
model: modelResolution.model,
|
|
256
422
|
tools,
|
|
257
423
|
signal: task.controller.signal,
|
|
258
424
|
provider: opts.provider,
|
|
@@ -132,7 +132,7 @@ export function createGlobalSubagentCallable(
|
|
|
132
132
|
const done = drainToResult(handle.events, () => ({
|
|
133
133
|
durationMs: Date.now() - startedAt,
|
|
134
134
|
modelId: effectiveDefinition.model,
|
|
135
|
-
}));
|
|
135
|
+
}), () => handle.task.controller?.signal.aborted ?? (signal?.aborted === true));
|
|
136
136
|
|
|
137
137
|
return { address, done };
|
|
138
138
|
};
|
|
@@ -154,6 +154,7 @@ async function drainToResult(
|
|
|
154
154
|
unknown
|
|
155
155
|
>,
|
|
156
156
|
closing: () => { durationMs: number; modelId?: string },
|
|
157
|
+
signalAborted: () => boolean,
|
|
157
158
|
): Promise<{
|
|
158
159
|
status: 'completed' | 'failed' | 'cancelled';
|
|
159
160
|
output: string;
|
|
@@ -190,7 +191,7 @@ async function drainToResult(
|
|
|
190
191
|
|
|
191
192
|
const close = closing();
|
|
192
193
|
const baseModel = close.modelId ? { modelId: close.modelId } : {};
|
|
193
|
-
if (aborted) {
|
|
194
|
+
if (aborted || signalAborted()) {
|
|
194
195
|
return { status: 'cancelled', output: accumulated, durationMs: close.durationMs, ...baseModel };
|
|
195
196
|
}
|
|
196
197
|
if (errorMsg !== null) {
|