elanous 0.2.29 → 0.2.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{cIpv5nU9AycwYWZI9H589 → IVKr3AlRUVLKsw2fh7eXF}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{058a98ba.7eb28d5e6dc03565.js → 0bb0ff36.b8d418980951e5ba.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +287 -0
- package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +62 -0
- package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6013-2f769370d8b4c2c6.js → 1335-6731f392c35216eb.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8332.6f0f49df772e163b.js → 1654.32de4b324981a188.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1834-98b64172bc1efe77.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{8795.32573a185af18c7b.js → 1913.7cc6fb6055b1ed3f.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{419.736c0d6f426249a7.js → 2001.6c7e0fd02190886c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2112-e4efc21a6505d5bc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6767.1fcfc9b8be83975f.js → 2213.2ccbada92c33ea0f.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2534.e85ae21ad0dac829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4759.1f76713aefb87db5.js → 2871.0bca6137343b3f76.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6776.06ff1e3b464cc607.js → 2898.fd781bc7cf01a7b7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1782-59db1b5aa06df38a.js → 2940-619bfd8ef337c611.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8471.8d2a8c74f09c36ff.js → 2985.39ccdecd36848b12.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +115 -0
- package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +64 -0
- package/apps/pwa/out/_next/static/chunks/{bc324b7c.02a09dd93f6a399b.js → 3267c0e6.d34854e7b3984a6e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3278.2e5d15b53a4091c8.js +2 -0
- package/apps/pwa/out/_next/static/chunks/{7725-4f83d5541fbdb81b.js → 3541-ce3a5424ed5ad7f1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3583.a05e88cc8d594628.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3902.e1e71aaac850a045.js +34 -0
- package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{46bd8bea.2f4b4099172fcdb7.js → 409f1e57.d0649fc47691ebfe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4111.2bfedbb233ad206b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1142.65d002789ab3af7d.js → 4174.92ed04922709ac9e.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +36 -0
- package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +286 -0
- package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +77 -0
- package/apps/pwa/out/_next/static/chunks/4745.67d6f99c245af3f7.js +226 -0
- package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4999.c064a4000c2a9e94.js +79 -0
- package/apps/pwa/out/_next/static/chunks/5173-233188df2f42c626.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5304.04d24756f242a094.js +148 -0
- package/apps/pwa/out/_next/static/chunks/5307.60f2209e809bd627.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3396-97b97928c49190c9.js → 5458-16cd7a2b51b74c8c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3403.7199205e65124486.js → 5525.86debf231e181813.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9143.ff14585db1d275ff.js → 5543.a438b8ab5a13ea47.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +74 -0
- package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +94 -0
- package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8398.73a19b39715eda04.js → 6092.a7f99e68b188ca66.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/60fb96c9.360b01d8d4927b7b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5591.a35e7a217734a8b9.js → 6157.0c9af021de4fb31b.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6323.8672b4817a306928.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7375.050ea0d72968e49f.js → 6433.fc573af22bbc9ab7.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +90 -0
- package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6544cb48.a87fe20ddf137be2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +104 -0
- package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6767.ea607cf0c20a25af.js +24 -0
- package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +93 -0
- package/apps/pwa/out/_next/static/chunks/69-0a2c8209c6d4a158.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7371.80c05c653b08e907.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7391.ebae168025c91b6a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1852.7f7b53991fcb99ef.js → 7502.ccd5b8065545edd0.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +8 -0
- package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6534.1ab00f370db7b105.js → 7862.30a8d6482bb238eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7947-d0759430f8042240.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{285adb1a.5654e605dddf86d2.js → 7a1887c4.f36b88fba31da8fd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8018.a32663f04a6fc5f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8097-9530c03bcc550f02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +1 -0
- package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9002.e5658224e3dc1b6f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1516.dfaceff3fd2d0e0d.js → 9138.b6e80031afb1d973.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9907.49be0fcadaf214b5.js → 9221.7d22eaf353a2d4e7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8767-2f6a634f5abeaa01.js → 9279-d28c5b7754d010ae.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3160-95c96f4d2a21dd26.js → 9398-6aed28f0a96d0d6f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9407.e49124dedf0f5e72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{328bb3ab-6628a1114fe3fb3b.js → 997ce8a5-2ad501927003b41b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6853.cc5174a9dee59593.js → 9989.3694300e5f000b14.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-504204b58c82c253.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a9717a67c2eecbaf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-5c9ec30aee62dfbf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-584191533721fa16.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-73c4b4bb3ac7ab5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-c0f1ca371f710b06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-46430d45a9e04eac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-3b2ebf1dc64ff0be.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-a27b1e5a0d1b308f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-25654b82094f7d22.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-8ea49a4c6dd2c6e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-ce5113aefea0a8d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0e5a41fac1c75396.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-31aaf1ed37c6df9a.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-3dcc1fa411e1f4e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c69247e7134d329d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-66dc5cd3a0999abe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-26ff7ff651a7217d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-617b3976981efa96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-d256f5d5d9552823.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-ce8f1907b8a6101c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-33e182a316263116.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-32866485913d6a04.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-7607cca9b84950c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-eeab86176b03dc3b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-5b93dbae3432b996.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-77a6cb90a9cf2b10.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f47e768b5b242b5a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-eb41aa3367fc2505.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-4d13ab0b8a267e3f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-84dad32ff0fc0831.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-95306f892aa2d0ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-940fb6c217f6b470.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-8c66a3b24a745630.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7b675dfd35c36fc9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8bd0d3cf7665bcfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/{page-29900ed0011b2c83.js → page-c219f2ed171131be.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-40f8fa21bdae955b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-468f8313e4f1fbd9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-7bbb8fa353a246c4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-04d00ae9b0890349.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-4214b855d9233ea8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-936752c7aa58762e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-ec052ad359df1797.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8305570551091338.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-fad650e4793adb65.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-d90e64743826e1d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a16bcfd49af86a32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{425cfc4d.fb91158e3971c39f.js → b313b242.cb1265eea908db61.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +122 -0
- package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +1 -0
- package/apps/pwa/out/_next/static/chunks/ebc7d829.264a0bcb6c750b50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +1 -0
- package/apps/pwa/out/_next/static/css/b5d88eba78a3d7bf.css +1 -0
- 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 +26 -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/implement-loop.yaml +5 -0
- package/graphs/intake/intake-daily.yaml +8 -1
- package/graphs/intake/recipes.yaml +5 -0
- package/graphs/lecture/lecture-note.yaml +2 -2
- package/graphs/ops/harness-gc.yaml +1 -0
- package/graphs/release/recipes.yaml +3 -0
- package/graphs/release/release-loop.yaml +9 -5
- package/graphs/units/recipes.yaml +3 -0
- package/graphs/units/release-gate-recheck.yaml +15 -0
- package/package.json +2 -1
- package/scripts/check-native-tool-wiring.ts +3 -2
- package/scripts/ci-android-unit-tests.ts +16 -0
- package/scripts/ci-typecheck-changed.ts +63 -10
- package/scripts/coord-channel-watch.sh +22 -16
- package/scripts/coord-role-pack.ts +81 -2
- package/scripts/cron-run.ts +96 -3
- package/scripts/detect-test-interference.ts +38 -5
- package/scripts/gate-pr-cache.ts +65 -0
- package/scripts/gh-surface/capture.ts +126 -0
- package/scripts/gh-surface/gh +40 -0
- package/scripts/import-graph-scc.ts +38 -0
- package/scripts/install.ps1 +19 -0
- package/scripts/intake-social.ts +181 -0
- package/scripts/lecture-note/node.ts +71 -4
- package/scripts/lib/android-toolchain.ts +32 -0
- package/scripts/lib/deterministic-env.ts +62 -0
- package/scripts/lib/gate-test-env.ts +19 -0
- package/scripts/measure-goal-grounding-corpus.ts +2 -1
- package/scripts/measure-si-task-cpu.ts +143 -0
- package/scripts/ratchets/test-interference-patterns.allowlist.txt +255 -0
- package/scripts/ratchets/test-interference-patterns.ts +367 -0
- package/scripts/release-loop/cut-branch.ts +4 -3
- package/scripts/release-loop/export-check-node.ts +0 -1
- package/scripts/release-loop/fixtures/warm-failure-assertion/sample.junit.xml +8 -0
- package/scripts/release-loop/fixtures/warm-job-029/sample.json +1 -0
- package/scripts/release-loop/fixtures/warm-job-029/sample.junit.xml +10 -0
- package/scripts/release-loop/gate-closure.ts +12 -8
- package/scripts/release-loop/gate-diff.ts +1 -1
- package/scripts/release-loop/gate-host-mirror.ts +66 -0
- package/scripts/release-loop/gate-node.ts +523 -75
- package/scripts/release-loop/gate-partial.ts +106 -9
- package/scripts/release-loop/gate-pr-cache.ts +66 -0
- package/scripts/release-loop/gate-prewarm-plan.ts +66 -0
- package/scripts/release-loop/gate-r2-verdict.ts +189 -0
- package/scripts/release-loop/gate-recheck-plan-node.ts +52 -0
- package/scripts/release-loop/gate-warm-artifacts.ts +253 -0
- package/scripts/release-loop/import-graph-scc-run.ts +54 -0
- package/scripts/release-loop/import-graph-scc.ts +215 -0
- package/scripts/release-loop/node-verdict.ts +2 -0
- package/scripts/release-loop/prepare-node.ts +102 -4
- package/scripts/release-loop/probe-pod-host-dirs-live.ts +113 -0
- package/scripts/release-loop/resume-release.ts +33 -4
- package/scripts/release-loop/resume.ts +13 -5
- package/scripts/release-loop/spawn-lane.ts +2 -19
- package/scripts/release-loop/tui-sim-node.ts +3 -2
- package/scripts/release-loop/unattended-release.ts +16 -0
- package/scripts/test-deterministic.ts +5 -61
- package/scripts/train-reach-grouping.ts +48 -0
- package/scripts/tsc-incremental-cache.ts +86 -0
- package/scripts/tsc-incremental-diagnostics.ts +76 -0
- package/scripts/tsc-main-safety-net.ts +2 -2
- package/src/acp/client.ts +4 -1
- package/src/acp/core-turn-bridge.ts +65 -8
- package/src/acp/elanous-extensions.ts +3 -0
- package/src/acp/server.ts +3 -0
- package/src/acp/tool-trace.ts +186 -11
- package/src/ad-pipeline/run.ts +4 -2
- package/src/agent/runner.ts +169 -3
- package/src/agent/self-ambient-cache.ts +156 -0
- package/src/agent/self-ambient.ts +8 -1
- package/src/agent/subagent-callable.ts +3 -2
- package/src/agent/task-notification.ts +5 -0
- 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 +14 -0
- package/src/agent-substrate/self-review-cli.ts +30 -4
- package/src/ask-user-question/tool.ts +22 -0
- package/src/autopilot/build/llm-conflict-merge.ts +56 -10
- package/src/autopilot/pr-manager.ts +80 -7
- package/src/briefing/brief-items.ts +24 -22
- package/src/capture/frame-state-detect.ts +39 -0
- package/src/capture/tui-self-report.ts +149 -6
- package/src/chat/chat-cli.ts +10 -2
- package/src/chat/index.ts +138 -26
- package/src/chat/input-control-key.ts +5 -3
- package/src/chat/pickers/modal-runtime.ts +6 -0
- package/src/chat/pickers/modals.ts +8 -2
- package/src/chat/tool-interrupt-behavior.ts +38 -0
- package/src/chat/tool-render/dispatch.ts +5 -1
- package/src/chat/turn-typeahead.ts +75 -20
- package/src/cli/__fixtures__/agent-help-before/agent.txt +4 -2
- package/src/cli/agent-cli.ts +41 -13
- package/src/cli/ask-bare.ts +1 -0
- package/src/cli/config-audit.ts +123 -0
- package/src/cli/decisions-cli.ts +80 -6
- package/src/cli/import-cli.ts +12 -0
- package/src/cli/log-event-names.ts +17 -0
- package/src/cli/mcp-login.ts +21 -5
- package/src/cli/msg-cli.ts +89 -0
- package/src/cli/pod-cli.ts +14 -3
- package/src/cli/pr-cli.ts +273 -81
- package/src/cli/pr-land-base-read.ts +34 -0
- package/src/cli/pr-land-heavy-remote.ts +82 -26
- package/src/cli/pr-land-overlap-evidence.ts +109 -11
- package/src/cli/pr-land-pod-shadow-job.ts +106 -0
- package/src/cli/pr-land-pod-shadow.ts +16 -3
- package/src/cli/pr-land-refusal.ts +20 -5
- package/src/cli/pr-land-virtual-rebase.ts +108 -0
- package/src/cli/pty-takeover-cli.ts +88 -14
- package/src/cli/release-cli.ts +80 -14
- package/src/cli/seat-cli.ts +138 -3
- package/src/cli/self-update.ts +5 -2
- package/src/cli/sim-cli.ts +18 -0
- package/src/cli/tasks-cli.ts +97 -19
- package/src/context-bus/context-first.ts +13 -0
- package/src/context-bus/context-now.ts +13 -2
- package/src/context-bus/ops-events.ts +79 -0
- package/src/control-plane/lease-holder.ts +12 -8
- package/src/control-plane/ledger.ts +163 -4
- package/src/control-plane/server.ts +91 -11
- package/src/core-turn/run-core-turn.ts +2 -0
- package/src/core-turn/run-goal-loop.ts +243 -3
- package/src/core-turn/seat-turn-cap.ts +79 -0
- package/src/core-turn/short-question.ts +38 -6
- package/src/core-turn/types.ts +6 -0
- package/src/dashboard/acp-active-model.ts +42 -1
- package/src/dashboard/acp-boot.ts +3 -0
- package/src/dashboard/background-jobs-status.ts +66 -0
- package/src/dashboard/index.ts +339 -657
- package/src/dashboard/input/agent-wake.ts +242 -0
- package/src/dashboard/input/chat-main-entry-runtime.ts +6 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +4 -1
- package/src/dashboard/input/chat-main-session.ts +8 -1
- package/src/dashboard/input/chat-main-turn.ts +12 -3
- package/src/dashboard/input/compact-prepass-recovery.ts +33 -0
- package/src/dashboard/input/external-input-host.ts +49 -9
- package/src/dashboard/input/internal-turn.ts +261 -0
- package/src/dashboard/input/mouse-wiring.ts +108 -11
- package/src/dashboard/input/seat-autowake.ts +318 -0
- package/src/dashboard/input/turn-steer-bridge.ts +70 -0
- package/src/dashboard/log-click-runtime.ts +118 -2
- package/src/dashboard/loop-scheduler.ts +72 -0
- package/src/dashboard/seat-boot-preamble.ts +18 -0
- package/src/dashboard/skill-runtime.ts +2 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +126 -1181
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -1
- package/src/dashboard/slash-runtime/index.ts +13 -0
- package/src/dashboard/turn-busy-teardown.ts +50 -0
- package/src/dashboard/turn-preamble.ts +116 -40
- package/src/dashboard/turn-session-layers.ts +4 -2
- package/src/dashboard/turn-start-segments.ts +222 -0
- package/src/decisions/decision-ledger.ts +45 -4
- package/src/discord-self-message.ts +4 -4
- package/src/display/prompt-row-owner.ts +146 -0
- package/src/display/resize-listener.ts +33 -2
- package/src/domains/release-tool.ts +18 -1
- package/src/field-note/transcribe.ts +17 -0
- package/src/fold-stack.ts +4 -2
- package/src/git-fs/index.ts +263 -36
- package/src/github/remote-call.ts +81 -0
- package/src/goals/registry.ts +46 -6
- package/src/goals/types.ts +7 -1
- package/src/graph-runner/runner.ts +1 -0
- package/src/grok/credential.ts +26 -0
- package/src/harness/gate-reserve.ts +87 -0
- package/src/harness/harness-clean.ts +2 -1
- package/src/harness/harness-cli-command.ts +52 -5
- package/src/harness/harness-gc.ts +2 -1
- package/src/harness/harness-incidents.ts +70 -20
- package/src/harness/harness-pod-dispatch.ts +87 -10
- package/src/harness/harness-queue.ts +68 -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 +156 -27
- package/src/input/external-input-queue.ts +64 -7
- package/src/intake-plane/slash.ts +14 -3
- package/src/keybindings.ts +4 -1
- package/src/llm/route-decision.ts +36 -0
- package/src/llm/tool-loop-steered-rejection.ts +41 -0
- package/src/llm-request-shape.ts +209 -0
- package/src/llm.ts +301 -283
- package/src/loops/consensus.ts +348 -0
- package/src/loops/msg-wake.ts +206 -4
- package/src/loops/observe.ts +19 -3
- package/src/loops/orchestrator/tick.ts +88 -12
- package/src/loops/orchestrator/traffic.ts +64 -1
- package/src/loops/registry.ts +30 -0
- package/src/market/signed-index.ts +14 -0
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/mcp/mcp-oauth.ts +54 -5
- package/src/models/prompts.ts +28 -0
- package/src/msg/msg-sse-client.ts +223 -0
- package/src/msg/msg-store.ts +86 -2
- package/src/mss/logging/log-store.ts +225 -1
- package/src/mss/logging/render-categories.ts +5 -0
- package/src/nexus/DAEMON-THIN-inventory-2026-10-15.md +122 -0
- package/src/nexus/api/http-server.ts +54 -15
- package/src/nexus/api/loop-resources.ts +19 -3
- package/src/nexus/api/ops-api.ts +11 -0
- package/src/nexus/daemon-thin-inventory.md +37 -0
- package/src/nexus/index.ts +70 -0
- package/src/nexus/state/state.ts +1 -0
- package/src/oauth/store.ts +32 -7
- package/src/onboarding/first-run.ts +28 -3
- package/src/ops/overview-cache.ts +16 -4
- package/src/ops/overview.ts +59 -2
- package/src/ops/resources.ts +82 -0
- package/src/plugins/maker/connector-maker.ts +41 -0
- package/src/plugins/maker/skill-maker.ts +42 -0
- package/src/pr-tool/census.ts +303 -0
- package/src/pr-tool/inflight-registry.ts +143 -0
- package/src/prompt-library/chat-conciseness.ts +13 -0
- package/src/prompt-library/universal-preamble.ts +10 -5
- package/src/pty-shell/pty-manifest.ts +12 -3
- package/src/pty-shell/tui-run-state.ts +34 -3
- package/src/release-loop/gate-host-reservation.ts +97 -0
- package/src/release-loop/landing-freeze.ts +5 -0
- package/src/release-loop/light-rc.ts +5 -2
- package/src/release-loop/placement.ts +92 -1
- package/src/release-loop/rehearsal-shard-plan.ts +149 -0
- package/src/release-loop/rehearsal.ts +73 -17
- package/src/repl/index.ts +20 -2
- package/src/seat-loop/seat-knowhow.ts +282 -0
- package/src/seat-loop/seat-loop.ts +41 -2
- package/src/seat-loop/traffic-signal.ts +5 -1
- package/src/self-dev/ask-launch-flow.ts +37 -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 +267 -33
- package/src/self-dev/draft-sweep.ts +59 -4
- package/src/self-dev/external-call-zero.ts +77 -0
- package/src/self-dev/launch-preflight-text.ts +6 -0
- package/src/self-dev/launch-preflight.ts +25 -3
- package/src/self-dev/local-supervisor-judge.ts +185 -0
- package/src/self-dev/run-supervisor.ts +229 -19
- package/src/self-dev/run-types.ts +20 -0
- package/src/self-dev/shard-aggregate.ts +13 -2
- package/src/self-dev/shard-plan.ts +56 -1
- package/src/self-dev/shard-run.ts +207 -12
- package/src/self-dev/spawn-lane-files.ts +19 -0
- package/src/self-implement/app-api-budget.ts +51 -11
- package/src/self-implement/config-gate.ts +2 -1
- package/src/self-implement/elanous-tui-spawn.ts +14 -0
- package/src/self-implement/expose-gate.ts +2 -1
- package/src/self-implement/follow-up-placement.ts +79 -0
- package/src/self-implement/gate-artifacts.ts +416 -0
- package/src/self-implement/gate-baseline.ts +96 -5
- package/src/self-implement/gate-cli.ts +207 -17
- package/src/self-implement/gate-remote.ts +136 -26
- package/src/self-implement/gate-scenario.ts +85 -0
- package/src/self-implement/goal-author.ts +160 -8
- package/src/self-implement/graph-authority.ts +38 -6
- package/src/self-implement/graph-overlay-condition.ts +92 -1
- package/src/self-implement/heal-triage.ts +79 -0
- package/src/self-implement/host-regate.ts +97 -7
- package/src/self-implement/orchestrator.ts +115 -134
- package/src/self-implement/pr-title.ts +123 -0
- package/src/self-implement/run-checkpoint.ts +235 -0
- package/src/self-implement/run-ledger.ts +162 -15
- package/src/self-implement/run-stop.ts +4 -3
- package/src/self-implement/run-ttl.ts +28 -4
- package/src/self-implement/seams.ts +2 -0
- package/src/self-implement/shadow-stage.ts +7 -6
- package/src/self-implement/stop-autoheal.ts +2 -1
- package/src/self-implement/train-gate-remote.ts +37 -8
- package/src/self-implement/train-reach-grouping.ts +157 -0
- package/src/self-implement/train-scenario-layers.ts +133 -0
- package/src/self-implement/uncommitted-work.ts +2 -0
- package/src/session/pending-input.ts +19 -0
- package/src/session/session-start.ts +224 -0
- package/src/session-runtime/index.ts +22 -267
- package/src/session-runtime/parallel-dispatch.ts +22 -5
- package/src/shell-runner/background-surface.ts +15 -5
- package/src/skills/tools/agent.ts +39 -6
- package/src/skills/tools/dev-harness.ts +6 -4
- package/src/skills/tools/list-dir.ts +11 -0
- package/src/skills/tools/schedule-wakeup.ts +408 -0
- package/src/skills/tools/shell.ts +246 -4
- package/src/status/bar.ts +26 -0
- package/src/steward/digest-delivery.ts +118 -0
- package/src/steward/hold-hygiene.ts +120 -0
- package/src/steward/resync-tick.ts +114 -23
- package/src/steward/ta-repair-event-collect.ts +158 -0
- package/src/steward/triage.ts +10 -0
- package/src/surface/shell-runner-boot.ts +5 -2
- package/src/task-agent/card-evidence.ts +25 -1
- package/src/task-agent/green-sweep.ts +8 -3
- package/src/task-agent/judge.ts +76 -0
- package/src/task-agent/land-queue.ts +79 -0
- package/src/task-agent/live-moves.ts +30 -9
- package/src/task-agent/postland-card.ts +5 -0
- package/src/task-agent/prelaunch-already-done.ts +98 -0
- package/src/task-agent/real-launch-guard.ts +37 -0
- package/src/task-agent/rejudge-on-head.ts +89 -12
- package/src/task-agent/remote-rejudge-bind.ts +28 -8
- package/src/task-agent/repair-cycle.ts +45 -7
- package/src/task-agent/repair-worker.ts +7 -0
- package/src/task-agent/run-identity.ts +200 -0
- package/src/task-agent/shadow.ts +50 -3
- package/src/task-agent/task-hand.ts +182 -5
- package/src/task-agent/train-landing.ts +77 -0
- package/src/task-agent/work-order.ts +104 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +151 -37
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +88 -19
- package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-image-source.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-install-slots.ts +121 -9
- package/src/task-orchestrator/surfaces/pod-lease.ts +118 -6
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +169 -0
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +27 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +3 -1
- package/src/task-orchestrator/surfaces/pod-result-marker-wait.ts +33 -0
- package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +67 -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-pod.ts +525 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +153 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runner.ts +90 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +362 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +138 -19
- package/src/telegram.ts +2 -4
- package/src/tui/chat/execution-badge.ts +5 -1
- package/src/tui/input/pickers.ts +732 -0
- package/src/tui/input-lag-probe.ts +230 -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 +52 -0
- package/src/user-config/gemini-server-tools.ts +9 -0
- package/src/user-config.ts +53 -16
- package/src/util/spawn-sync-output.ts +7 -0
- package/src/ux-sim/fake-bin.ts +154 -0
- package/src/ux-sim/fake-clock.ts +36 -0
- package/src/ux-sim/headless-tui.ts +72 -0
- package/src/ux-sim/in-process-cli.ts +2 -1
- package/src/ux-sim/scenario.ts +255 -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/1015-9cba22a5a4554797.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1084-4e66af7376a18db7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1106.3a6410b7b0c70ad4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1127.32fc642f70423506.js +0 -8
- package/apps/pwa/out/_next/static/chunks/1189-d9b8e1995a831fae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1224.6da98c7ad0eb7dd8.js +0 -34
- package/apps/pwa/out/_next/static/chunks/1370.4e3e2558f111fd5d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1514-b7da377fdc4eb17a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1577.3c24c32584e10d70.js +0 -286
- package/apps/pwa/out/_next/static/chunks/161.130a569855c4d68c.js +0 -24
- package/apps/pwa/out/_next/static/chunks/1864.16da9556e78a9236.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1b6f6b2a.aff090122be3726e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2341.e8a9135e5b910dd5.js +0 -36
- package/apps/pwa/out/_next/static/chunks/257.10afdbe3520f2fc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2658.87550e692dc493f6.js +0 -64
- package/apps/pwa/out/_next/static/chunks/2673.85e2f02efae7a85f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2766-bee623b37472ed63.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2794.6d836872b0bf43e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2806.eb57ced1a528ed39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/283.7a121c4910e6dad7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2870.1dc29aa5fc01f09f.js +0 -115
- package/apps/pwa/out/_next/static/chunks/293.fd38e77ce5d48103.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2993-5952a1cd3fd5d441.js +0 -1
- package/apps/pwa/out/_next/static/chunks/32-a523427c5bd5ed00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280.af38002a6424a905.js +0 -90
- package/apps/pwa/out/_next/static/chunks/3292-5ddffdb2f517b44f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3523.d3231daaf7aba993.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3763.577de3181e1e6ea0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4138-cc56b0938ef72783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4255-8350c43d307a8875.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4352.a4954693499c2714.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4421-f2dcbc6fd80ec013.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4513-51b94aeee37c9905.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4928-c3b72f99aa588699.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4986-f9fc0283fb325219.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5014.671a7b9f69c2b7b1.js +0 -94
- package/apps/pwa/out/_next/static/chunks/5137.d398e24710b3feb6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5298.0bea74885cabe754.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5315.74c53a39739b11c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5317-8b1df8d02105cd07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5358-33051f41a2b239af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5388.a2ec02501f714ad5.js +0 -62
- package/apps/pwa/out/_next/static/chunks/5395.e6ac948a2d15058d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5409-f282bf533c151849.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5466.d0f4aba9d52acfa8.js +0 -27
- package/apps/pwa/out/_next/static/chunks/5564.3d28b353470fe305.js +0 -104
- package/apps/pwa/out/_next/static/chunks/569.b0cbfb4dee4a167a.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5835-72465b73a8bb8d74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5941.045d6093139e1f7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6228.47cabb83564dfe54.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6457-8d1993002a87d0fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6513.ef54cfae52351982.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6582.13d245bf87df69f1.js +0 -148
- package/apps/pwa/out/_next/static/chunks/6655.c33f6acc2c61bb89.js +0 -149
- package/apps/pwa/out/_next/static/chunks/6731-9d7195af289c8d4c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6733.0be05b1db9279fc5.js +0 -79
- package/apps/pwa/out/_next/static/chunks/6742-90937146253a8b9e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/687-816858f77a396a4e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6888.72c7b8cfb02a7e61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6993.c17c828ac3ef3253.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7076.9f27ef666b0cefdd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7113.1403c5d451804e8c.js +0 -287
- package/apps/pwa/out/_next/static/chunks/7169.9dd603c726c2cd7c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7247-e3ec21f761f86710.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7261-a47b72f96f5199df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7335-5cda81ac90310077.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7356-c2e4af090546e2d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/738-59518742078fda71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7385.a7375f10db73243a.js +0 -77
- package/apps/pwa/out/_next/static/chunks/7445.cf1cf2fe109bcd96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7505.a2057432ab6ef99a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7515.31f45fac1f9c70cb.js +0 -74
- package/apps/pwa/out/_next/static/chunks/7658-d4ce8c72a9548a91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8107-0b1ae46bc5bcb788.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8132.bfea2f016ce8d992.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8672.e299832bc7d18ee2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8735.f1ef798a5f260f6f.js +0 -226
- package/apps/pwa/out/_next/static/chunks/8774-88f67f7d8d53d299.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8782.252e5a405d86e4ed.js +0 -32
- package/apps/pwa/out/_next/static/chunks/909-9ed7aa0dba804316.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9100.22b0301256827007.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9140-dde77575570bc71e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9292-a7ad9a01c7044b93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9517.00627dc51b02821c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9725.dcbb585652d8e9c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9761.a3ebf5c389c24ddc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9972.834d2b2b7d48f1ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9995-1a90486f5ae01546.js +0 -1
- package/apps/pwa/out/_next/static/chunks/a435ad95.577add051b4facb2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-83372d8b5863ebf7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d69256d7613c140a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-352c5e9ba3f9b858.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-69f1d725524201a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-a5635eba0d73b84e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ad9181d84285e4ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-86feb08080261a2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-ffa15987e4756d03.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-11a3ab44ac327cc1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-6309b11c4264d24d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-8800472079612e87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-d387bf3f2301882a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-048f88d8c8658da6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6c14f9739b7f6880.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-2834f44f64e98d74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-83372d8b5863ebf7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-a13df6f88e824887.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-8a4397248754cf2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-daf0bd329360a336.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-f7ef1c28764cb476.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-61e74f28b9353dac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-8aaa6dedc4c10dfb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-294602ba649be829.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-5fa5f41ed3fce323.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-33bf667a5fb297bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-5ae3cbd6e5dba515.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-eb867d16ad6fdede.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1ab789fa68682f7e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6fd41b5b6ff13a71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fb3d5f7642c99fba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-70f705b2b5ed42ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-c9c93b358a7667b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1563c556b81c96ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ce89c20c45b3a673.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-423ae63d786f4ee9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-591a5378a4c4447c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-a250496b19a5824b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-c36a9277febc5911.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-83372d8b5863ebf7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a5de57edc6d7f942.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-16bdd4c9f40498df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-75e946e6e71cc6d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-9eb56166774eb256.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-1c5f9ef35dbb22c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-657ff9985e508498.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-22dc72499da68fb2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9f92737b8766009a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-094ad334e40f8169.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-8bcd379852ff6287.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-6b04413f280cd344.js +0 -1
- package/apps/pwa/out/_next/static/chunks/de70ab42-d28d47437208d458.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f800c5e3.46dbd7f2af8c3fce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f8bc19ad.47579f6d684b0760.js +0 -122
- package/apps/pwa/out/_next/static/chunks/framework-ca9ac4609fb9fed8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-0dd08d32d15a030f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-f0399d33955c4e01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-d42caca6f8ac2211.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-42e713c13aa41ca8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-8fbf8f61a377aa16.js +0 -1
- package/apps/pwa/out/_next/static/css/72becfd42807b50d.css +0 -1
- /package/apps/pwa/out/_next/static/{cIpv5nU9AycwYWZI9H589 → IVKr3AlRUVLKsw2fh7eXF}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
// 🧭 세션 시작 결정 — «인자 없음 = 깨끗한 새 세션», 이어하기는 명시 인자일 때만 (TUI-H8-SESSION-NEW-DEFAULT · 대표 10-16 #73).
|
|
2
|
+
//
|
|
3
|
+
// S: `elanous chat` · `agent` · `repl` 은 인자 없이 뜨면 «활성 세션»(~/.local/state/elanous/active)을 조용히 이어받았다.
|
|
4
|
+
// 그래서 앞 프로세스가 도구 호출 도중 죽은 기록(호출·결과 짝이 깨진 꼬리)까지 이어받아 첫 턴이 400 으로 죽었다(#69).
|
|
5
|
+
// C: 다른 에이전트(codex·claude·grok)는 인자 없음 = 새 세션 · 이어하기 = `--resume`/`--continue` 다.
|
|
6
|
+
// A: 시작 결정을 이 함수 하나로 모으고, 결정마다 `session`/`start` 한 줄을 남긴다(관측).
|
|
7
|
+
// ⛔ 자리 맥락은 세션이 아니라 자리 문서(AGENTS.local.md · `.AGENTS.local.last-session.md` · 부트 카드)가 매 턴 싣는다 —
|
|
8
|
+
// 새 세션이어도 맥락은 그대로다(`turn-preamble.ts` · `universal-preamble.ts`).
|
|
9
|
+
|
|
10
|
+
import { debug } from '../debug/log.js';
|
|
11
|
+
|
|
12
|
+
export type SessionStartOrigin = 'new' | 'resume';
|
|
13
|
+
export type SessionStartReason =
|
|
14
|
+
| 'default-new'
|
|
15
|
+
| 'force-new'
|
|
16
|
+
| 'explicit-session'
|
|
17
|
+
| 'continue-active'
|
|
18
|
+
| 'continue-latest'
|
|
19
|
+
| 'continue-no-active';
|
|
20
|
+
|
|
21
|
+
export interface SessionStartDecision {
|
|
22
|
+
origin: SessionStartOrigin;
|
|
23
|
+
reason: SessionStartReason;
|
|
24
|
+
/** 이어받을 세션 id(명시 id 는 호출부가 이미 풀어서 넘긴다). 새 세션이면 undefined. */
|
|
25
|
+
sessionIdHint?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** 단일 결정 — 명시 id > `--new` > `--continue`/`--resume`(활성 세션 ⊕ 표지가 낡았으면 최신 세션) > 기본 새 세션.
|
|
29
|
+
* `sessionExists`·`latestSessionId` 를 주면 활성 표지가 «사라진 세션»을 가리킬 때 최신 세션으로 넘어간다
|
|
30
|
+
* (TUI-H8-FOLLOW ① · #28509 리뷰 should-fix). 안 주면 옛 동작(표지를 그대로 믿는다). */
|
|
31
|
+
export function decideSessionStart(input: {
|
|
32
|
+
explicitSessionId?: string;
|
|
33
|
+
continueActive: boolean;
|
|
34
|
+
forceNew: boolean;
|
|
35
|
+
activeSessionId: () => string | null;
|
|
36
|
+
sessionExists?: (id: string) => boolean;
|
|
37
|
+
latestSessionId?: () => string | null;
|
|
38
|
+
}): SessionStartDecision {
|
|
39
|
+
if (input.explicitSessionId) {
|
|
40
|
+
return { origin: 'resume', reason: 'explicit-session', sessionIdHint: input.explicitSessionId };
|
|
41
|
+
}
|
|
42
|
+
if (input.forceNew) return { origin: 'new', reason: 'force-new' };
|
|
43
|
+
if (input.continueActive) {
|
|
44
|
+
const picked = pickContinueSession(input);
|
|
45
|
+
if (!picked) return { origin: 'new', reason: 'continue-no-active' };
|
|
46
|
+
return {
|
|
47
|
+
origin: 'resume',
|
|
48
|
+
reason: picked.from === 'active' ? 'continue-active' : 'continue-latest',
|
|
49
|
+
sessionIdHint: picked.id,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return { origin: 'new', reason: 'default-new' };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** 존재 확인 — 확인 자체가 실패하면 «있다»고 보지 않는다(이어받을 수 없는 세션을 고르지 않는다). */
|
|
56
|
+
function sessionAlive(exists: ((id: string) => boolean) | undefined, id: string): boolean {
|
|
57
|
+
if (!exists) return true;
|
|
58
|
+
try { return exists(id); } catch { return false; }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** «이어하기» 대상 — 활성 표지 ⊕ (표지가 없거나 사라진 세션이면) 최신 세션. 낡은 표지는 `session`/`active-marker-stale` 로 남긴다. */
|
|
62
|
+
function pickContinueSession(deps: {
|
|
63
|
+
activeSessionId: () => string | null;
|
|
64
|
+
sessionExists?: (id: string) => boolean;
|
|
65
|
+
latestSessionId?: () => string | null;
|
|
66
|
+
}): { id: string; from: 'active' | 'latest' } | null {
|
|
67
|
+
let active: string | null = null;
|
|
68
|
+
try { active = deps.activeSessionId(); } catch { /* 활성 표지 읽기 실패 — 최신 세션으로 넘어간다 */ }
|
|
69
|
+
if (active && sessionAlive(deps.sessionExists, active)) return { id: active, from: 'active' };
|
|
70
|
+
const picked = pickLatest(deps, active);
|
|
71
|
+
if (active) {
|
|
72
|
+
// 관측은 «실제로 고른 결과»로 남긴다(r1 should-fix — 최신이 없어 새 세션이면 fallback:'none').
|
|
73
|
+
try {
|
|
74
|
+
debug.log('session', 'active-marker-stale', { activeSessionId: active, fallback: picked ? 'latest' : 'none' });
|
|
75
|
+
} catch { /* 관측 실패가 시작을 막지 않는다 */ }
|
|
76
|
+
}
|
|
77
|
+
return picked;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function pickLatest(deps: {
|
|
81
|
+
sessionExists?: (id: string) => boolean;
|
|
82
|
+
latestSessionId?: () => string | null;
|
|
83
|
+
}, staleActive: string | null): { id: string; from: 'latest' } | null {
|
|
84
|
+
if (!deps.latestSessionId) return null;
|
|
85
|
+
let latest: string | null = null;
|
|
86
|
+
try { latest = deps.latestSessionId(); } catch { return null; }
|
|
87
|
+
if (!latest || latest === staleActive || !sessionAlive(deps.sessionExists, latest)) return null;
|
|
88
|
+
return { id: latest, from: 'latest' };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** `elanous --resume`/`--continue` 처럼 id 없이 «이어하기»만 받은 표면이 이어받을 세션 — 활성 표지 ⊕ 없거나 사라졌으면 최신. */
|
|
92
|
+
export function resolveLatestSessionId(deps: {
|
|
93
|
+
activeSessionId: () => string | null;
|
|
94
|
+
latestSessionId: () => string | null;
|
|
95
|
+
sessionExists?: (id: string) => boolean;
|
|
96
|
+
}): string | null {
|
|
97
|
+
return pickContinueSession(deps)?.id ?? null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** 세션 id 꼴인가 — 세션 id 는 uuid v4(`randomUUID` · 8-4-4-4-12 hex)이고 «고유 접두»도 받는다.
|
|
101
|
+
* uuid 의 «접두»(하이픈은 9·14·19·24번째 자리에만) 4~36자 ⊕ 숫자 하나 이상(«face»·«deadbeef» 같은 낱말을 id 로 먹지 않게).
|
|
102
|
+
* 숫자 없는 hex 접두를 id 로 쓰려면 `--session <id>` 를 쓴다. */
|
|
103
|
+
export function looksLikeSessionId(value: string): boolean {
|
|
104
|
+
const v = value.trim().toLowerCase();
|
|
105
|
+
if (v.length < 4 || v.length > 36 || !/[0-9]/.test(v)) return false;
|
|
106
|
+
for (let i = 0; i < v.length; i += 1) {
|
|
107
|
+
const c = v[i]!;
|
|
108
|
+
const hyphenSlot = i === 8 || i === 13 || i === 18 || i === 23;
|
|
109
|
+
if (hyphenSlot ? c !== '-' : !/[0-9a-f]/.test(c)) return false;
|
|
110
|
+
}
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** `--resume [id]` 뒤 위치 인자 — Commander 는 값 선택형 옵션 뒤 첫 낱말을 값으로 먹는다.
|
|
115
|
+
* 그 값이 세션 id 꼴이 아니면 «id 없는 --resume ⊕ 프롬프트 낱말»로 되돌린다(TUI-H8-FOLLOW ②).
|
|
116
|
+
* `argv` 를 주면 되돌린 낱말을 입력 «순서 그대로» 끼운다(`chat hello --resume world` → `hello world`);
|
|
117
|
+
* 안 주면 맨 앞에 놓는다. */
|
|
118
|
+
export function splitResumeArgument(
|
|
119
|
+
resume: string | boolean | undefined,
|
|
120
|
+
parts: readonly string[],
|
|
121
|
+
surface: 'chat' | 'agent',
|
|
122
|
+
argv?: readonly string[],
|
|
123
|
+
): { resume: string | boolean | undefined; parts: string[] } {
|
|
124
|
+
if (typeof resume !== 'string' || looksLikeSessionId(resume)) return { resume, parts: [...parts] };
|
|
125
|
+
const at = argv ? resumeInsertIndex(argv, parts, resume, surface) : 0;
|
|
126
|
+
try {
|
|
127
|
+
debug.log('session', 'resume-value-as-prompt', { surface, words: resume.split(/\s+/).filter(Boolean).length, at });
|
|
128
|
+
} catch { /* 관측 실패가 시작을 막지 않는다 */ }
|
|
129
|
+
return { resume: true, parts: [...parts.slice(0, at), resume, ...parts.slice(at)] };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** chat·agent argv 를 «한 번» 토큰화한 결과 — 위치 인자(순서대로) ⊕ `--resume` 값이 몇 번째 위치 인자 «앞»에 왔나.
|
|
133
|
+
* (r3 TF 결정: 한 지점 땜질 대신 토큰화로 일반화 — 리뷰 진동을 끊는다.)
|
|
134
|
+
* 규칙(Commander 와 같은 읽기):
|
|
135
|
+
* - 명령 낱말(`chat`/`agent`) «뒤»부터 본다(앞은 루트 옵션).
|
|
136
|
+
* - `--` 뒤는 전부 위치 인자.
|
|
137
|
+
* - `--resume=X` → X 가 resume 값. `--resume X` → X 가 `-` 로 시작하지 않으면 resume 값(값 선택형).
|
|
138
|
+
* - 값을 받는 옵션(`--session`)은 `--session X`·`--session=X` 모두 값을 건너뛴다.
|
|
139
|
+
* - 그 밖의 `-` 로 시작하는 토큰은 값 없는 플래그(`--continue` 등 · `--continue=X` 는 Commander 가 거부한다).
|
|
140
|
+
* - 나머지는 위치 인자. */
|
|
141
|
+
export function tokenizeResumeArgv(
|
|
142
|
+
argv: readonly string[],
|
|
143
|
+
surface: 'chat' | 'agent',
|
|
144
|
+
): { positionals: string[]; resumeValue: string | null; resumeValueAt: number | null } {
|
|
145
|
+
const VALUE_OPTIONS = new Set(['--session']);
|
|
146
|
+
const positionals: string[] = [];
|
|
147
|
+
let resumeValue: string | null = null;
|
|
148
|
+
let resumeValueAt: number | null = null;
|
|
149
|
+
let afterDoubleDash = false;
|
|
150
|
+
for (let i = argv.indexOf(surface) + 1; i < argv.length; i += 1) {
|
|
151
|
+
const token = argv[i]!;
|
|
152
|
+
if (afterDoubleDash) { positionals.push(token); continue; }
|
|
153
|
+
if (token === '--') { afterDoubleDash = true; continue; }
|
|
154
|
+
if (token.startsWith('--resume=')) {
|
|
155
|
+
resumeValue = token.slice('--resume='.length);
|
|
156
|
+
resumeValueAt = positionals.length;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
if (token === '--resume') {
|
|
160
|
+
const next = argv[i + 1];
|
|
161
|
+
if (next !== undefined && !next.startsWith('-')) {
|
|
162
|
+
resumeValue = next;
|
|
163
|
+
resumeValueAt = positionals.length;
|
|
164
|
+
i += 1;
|
|
165
|
+
}
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const eq = token.indexOf('=');
|
|
169
|
+
if (token.startsWith('--') && VALUE_OPTIONS.has(eq >= 0 ? token.slice(0, eq) : token)) {
|
|
170
|
+
if (eq < 0) i += 1;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (token.startsWith('-')) continue;
|
|
174
|
+
positionals.push(token);
|
|
175
|
+
}
|
|
176
|
+
return { positionals, resumeValue, resumeValueAt };
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** 되돌린 낱말을 끼울 자리 — 토큰화 결과가 Commander 가 준 값·위치 인자와 «다르면» 맨 앞(옛 동작)으로 접고 남긴다. */
|
|
180
|
+
function resumeInsertIndex(argv: readonly string[], parts: readonly string[], resume: string, surface: 'chat' | 'agent'): number {
|
|
181
|
+
const t = tokenizeResumeArgv(argv, surface);
|
|
182
|
+
const agrees = t.resumeValue === resume
|
|
183
|
+
&& t.resumeValueAt !== null
|
|
184
|
+
&& t.positionals.length === parts.length
|
|
185
|
+
&& t.positionals.every((p, i) => p === parts[i]);
|
|
186
|
+
if (agrees) return t.resumeValueAt!;
|
|
187
|
+
try { debug.log('session', 'resume-argv-mismatch', { surface, positionals: t.positionals.length, parts: parts.length }); } catch { /* best-effort */ }
|
|
188
|
+
return 0;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** 대시보드 TUI 루트 이어하기 — 우선순위 `--resume <id>` > `--continue`·id 없는 `--resume`(최신 세션) >
|
|
192
|
+
* (폐기 예정) `ELANOUS_RESUME_SESSION`. ⛔ 명시 인자가 있으면 환경변수가 이기지 않는다. 아무것도 없으면 새 세션. */
|
|
193
|
+
export function resolveRootResumeSessionId(input: {
|
|
194
|
+
flagId?: string;
|
|
195
|
+
continueLatest: boolean;
|
|
196
|
+
/** 폐기 예정 env 읽기 — 명시 인자가 하나도 없을 때만 «부른다»(읽기 자체가 폐기 경고를 낸다 · r2 must-fix). */
|
|
197
|
+
readEnvId: () => string | null | undefined;
|
|
198
|
+
latest: () => string | null;
|
|
199
|
+
}): { sessionId?: string; source: 'flag' | 'continue' | 'continue-none' | 'env' | 'none' } {
|
|
200
|
+
const flagId = (input.flagId ?? '').trim();
|
|
201
|
+
if (flagId) return { sessionId: flagId, source: 'flag' };
|
|
202
|
+
if (input.continueLatest) {
|
|
203
|
+
const latest = input.latest();
|
|
204
|
+
return latest ? { sessionId: latest, source: 'continue' } : { source: 'continue-none' };
|
|
205
|
+
}
|
|
206
|
+
const envId = (input.readEnvId() ?? '').trim();
|
|
207
|
+
if (envId) return { sessionId: envId, source: 'env' };
|
|
208
|
+
return { source: 'none' };
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** 관측 — 세션이 «어떻게» 시작됐나. 실패해도 시작을 막지 않는다. */
|
|
212
|
+
export function observeSessionStart(data: {
|
|
213
|
+
surface: 'chat' | 'agent' | 'repl' | 'tui' | 'ask';
|
|
214
|
+
origin: SessionStartOrigin;
|
|
215
|
+
reason: string;
|
|
216
|
+
sessionId?: string | null;
|
|
217
|
+
[key: string]: unknown;
|
|
218
|
+
}): void {
|
|
219
|
+
try {
|
|
220
|
+
debug.log('session', 'start', data);
|
|
221
|
+
} catch {
|
|
222
|
+
// Observation must never block a session start.
|
|
223
|
+
}
|
|
224
|
+
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { buildGitSnapshot } from '../git-fs/index.js';
|
|
2
2
|
import { debug } from '../debug/log.js';
|
|
3
|
-
import { getUserConfig } from '../user-config.js';
|
|
4
3
|
import { resolve } from 'node:path';
|
|
5
4
|
import type { ModelFamily } from '../models/prompts.js';
|
|
6
5
|
import type { InputSourceKind, InputSourceRef } from '../input/input-source-kind.js';
|
|
@@ -411,46 +410,6 @@ const TOOL_NAME_TO_FAMILY = new Map<string, SessionToolFamilyRule>(
|
|
|
411
410
|
SESSION_TOOL_FAMILY_RULES.flatMap(rule => rule.names.map(name => [name, rule] as const)),
|
|
412
411
|
);
|
|
413
412
|
|
|
414
|
-
/** Names belonging to the runtime-debug family — used by the
|
|
415
|
-
* exposeFullLlmTools=false post-filter to know which tools to drop. */
|
|
416
|
-
const RUNTIME_DEBUG_FAMILY_NAMES: ReadonlySet<string> = new Set(
|
|
417
|
-
SESSION_TOOL_FAMILY_RULES.find(r => r.id === 'runtime-debug')?.names ?? [],
|
|
418
|
-
);
|
|
419
|
-
|
|
420
|
-
/** Read-only inspection tools kept alive when minimal mode is on.
|
|
421
|
-
* Roughly half of the 9-entry runtime-debug family — picked by
|
|
422
|
-
* chatlog-triage value and gated to read-only-and-safe operations.
|
|
423
|
-
* Excluded by design (LLM-mutating or UI-stealing):
|
|
424
|
-
* debug_setLevel — would let the LLM crank logs to keytrace,
|
|
425
|
-
* flooding the file sink during a triage.
|
|
426
|
-
* debug_openView — server-side cousin of the user-pressed
|
|
427
|
-
* Ctrl+digit shortcut that already annoyed
|
|
428
|
-
* the user (incident 2026-05-04).
|
|
429
|
-
* debug_selectEvent — UI-cursor mutation; steals focus from the
|
|
430
|
-
* human reviewer.
|
|
431
|
-
* input_history_list — redundant with input_history_search.
|
|
432
|
-
* Leaves the LLM with enough surface to triage chatlogs without
|
|
433
|
-
* the surface area that lets it disrupt the live session. */
|
|
434
|
-
const RUNTIME_DEBUG_MINIMAL_KEEP: ReadonlySet<string> = new Set([
|
|
435
|
-
'debug_getLastLlm', // last request/response pair
|
|
436
|
-
'debug_getState', // event-buffer + stats dump
|
|
437
|
-
'debug_getCallStack', // call-path triage
|
|
438
|
-
'debug_getAgentState', // sub-agent queue inspection
|
|
439
|
-
'input_history_search', // self-lookup of prior user inputs
|
|
440
|
-
]);
|
|
441
|
-
|
|
442
|
-
/** Drop runtime-debug tools (except the single essential one) when
|
|
443
|
-
* the user has set debug.exposeFullLlmTools=false. Other host tool
|
|
444
|
-
* families pass through untouched. Called at the tail of every host
|
|
445
|
-
* tool resolver so the gate applies uniformly across surfaces. */
|
|
446
|
-
function applyDebugMinimalFilter<T extends { name: string }>(tools: T[]): T[] {
|
|
447
|
-
if (getUserConfig().debug.exposeFullLlmTools !== false) return tools;
|
|
448
|
-
return tools.filter(t => {
|
|
449
|
-
if (!RUNTIME_DEBUG_FAMILY_NAMES.has(t.name)) return true;
|
|
450
|
-
return RUNTIME_DEBUG_MINIMAL_KEEP.has(t.name);
|
|
451
|
-
});
|
|
452
|
-
}
|
|
453
|
-
|
|
454
413
|
interface SessionNativeToolRule {
|
|
455
414
|
id: string;
|
|
456
415
|
description: string;
|
|
@@ -650,19 +609,6 @@ const HOST_TOOL_FAMILY_RULE_MAP = new Map<string, SessionToolFamilyRule>(
|
|
|
650
609
|
SESSION_TOOL_FAMILY_RULES.map(rule => [rule.id, rule] as const),
|
|
651
610
|
);
|
|
652
611
|
|
|
653
|
-
function isCodeGroundingModelSurfaceEnabled(): boolean {
|
|
654
|
-
const config = getUserConfig();
|
|
655
|
-
const configured = (config.raw.tools as Record<string, unknown> | undefined)?.nativeStructure;
|
|
656
|
-
const source = configured
|
|
657
|
-
&& typeof configured === 'object'
|
|
658
|
-
&& typeof (configured as Record<string, unknown>).enabled === 'boolean'
|
|
659
|
-
? 'config'
|
|
660
|
-
: 'default';
|
|
661
|
-
const enabled = config.tools.nativeStructure.enabled === true;
|
|
662
|
-
debug.log('tools.surface', 'code-grounding-exposure', { enabled, source });
|
|
663
|
-
return enabled;
|
|
664
|
-
}
|
|
665
|
-
|
|
666
612
|
const SESSION_RUNTIME_TOOL_FAMILY_RULES: SessionRuntimeToolFamilyRule[] = [
|
|
667
613
|
{
|
|
668
614
|
id: 'fleet-core',
|
|
@@ -979,8 +925,12 @@ function isSessionSurfaceId(value: string | null | undefined): value is SessionS
|
|
|
979
925
|
|
|
980
926
|
export function buildSessionRuntimeSystemMessages(opts: {
|
|
981
927
|
cwd: string;
|
|
928
|
+
/** Serve a snapshot up to this old and rebuild it asynchronously (TUI turn path). */
|
|
929
|
+
gitSnapshotStaleMs?: number;
|
|
982
930
|
}): LLMMessage[] {
|
|
983
|
-
const snapshot = buildGitSnapshot(opts.cwd
|
|
931
|
+
const snapshot = buildGitSnapshot(opts.cwd, opts.gitSnapshotStaleMs !== undefined
|
|
932
|
+
? { staleWhileRevalidateMs: opts.gitSnapshotStaleMs }
|
|
933
|
+
: {});
|
|
984
934
|
return snapshot
|
|
985
935
|
? [{ role: 'system', content: `## Git Snapshot\n\n${snapshot}` }]
|
|
986
936
|
: [];
|
|
@@ -1694,45 +1644,6 @@ export function buildSessionSurfaceManualSections(
|
|
|
1694
1644
|
|
|
1695
1645
|
return sections;
|
|
1696
1646
|
}
|
|
1697
|
-
export function resolveDynamicSessionHostTools(opts: {
|
|
1698
|
-
userText: string;
|
|
1699
|
-
hostTools: readonly LLMToolDef[];
|
|
1700
|
-
toolAvailability?: Readonly<Record<string, boolean>>;
|
|
1701
|
-
defaultFamilyIds?: readonly string[];
|
|
1702
|
-
surfaceId?: SessionSurfaceId;
|
|
1703
|
-
}): LLMToolDef[] {
|
|
1704
|
-
const text = opts.userText.toLowerCase();
|
|
1705
|
-
const available = new Map(opts.hostTools.map(tool => [tool.name, tool] as const));
|
|
1706
|
-
const selected = new Set<string>();
|
|
1707
|
-
|
|
1708
|
-
for (const familyId of opts.defaultFamilyIds ?? []) {
|
|
1709
|
-
for (const rule of SESSION_TOOL_FAMILY_RULES) {
|
|
1710
|
-
if (rule.id !== familyId) continue;
|
|
1711
|
-
for (const name of rule.names) {
|
|
1712
|
-
if (available.has(name)) selected.add(name);
|
|
1713
|
-
}
|
|
1714
|
-
}
|
|
1715
|
-
}
|
|
1716
|
-
|
|
1717
|
-
for (const tool of opts.hostTools) {
|
|
1718
|
-
if (mentionsTool(text, tool.name)) selected.add(tool.name);
|
|
1719
|
-
}
|
|
1720
|
-
for (const rule of SESSION_TOOL_FAMILY_RULES) {
|
|
1721
|
-
const surfaceMatch = matchesSurfaceAwareFamilyIntent(rule.id, text, opts.surfaceId);
|
|
1722
|
-
if (!rule.match(text) && !surfaceMatch) continue;
|
|
1723
|
-
for (const name of rule.names) {
|
|
1724
|
-
if (available.has(name)) selected.add(name);
|
|
1725
|
-
}
|
|
1726
|
-
}
|
|
1727
|
-
|
|
1728
|
-
return applyDebugMinimalFilter(
|
|
1729
|
-
[...selected]
|
|
1730
|
-
.filter(name => isToolAvailable(name, opts.toolAvailability))
|
|
1731
|
-
.map(name => available.get(name))
|
|
1732
|
-
.filter((tool): tool is LLMToolDef => !!tool),
|
|
1733
|
-
);
|
|
1734
|
-
}
|
|
1735
|
-
|
|
1736
1647
|
const ESSENTIAL_NATIVE_RULE_IDS = [
|
|
1737
1648
|
'code-read', 'code-grep', 'code-glob', 'code-list-dir', 'code-edit', 'code-write',
|
|
1738
1649
|
// Keep dev-harness in the assembly candidate set so the catalog policy below is the single model-exposure authority.
|
|
@@ -1740,7 +1651,8 @@ const ESSENTIAL_NATIVE_RULE_IDS = [
|
|
|
1740
1651
|
] as const;
|
|
1741
1652
|
const ESSENTIAL_HOST_FAMILY_IDS = ['self-ops', 'release-read'] as const;
|
|
1742
1653
|
// Keep this TUI essential addition out of the shared control/agent self-ops family.
|
|
1743
|
-
|
|
1654
|
+
// ScheduleWakeup (H5) is a dashboard-only host tool — present only when the TUI registered it.
|
|
1655
|
+
const ESSENTIAL_HOST_EXTRA_NAMES = ['logs_query', 'ScheduleWakeup'] as const;
|
|
1744
1656
|
const ESSENTIAL_RUNTIME_FAMILY_IDS = ['bash', 'run-shell', 'ops-ledger', 'pty-shell', 'run-tests', 'elanous_skills_list', 'skill_exec', 'code-grounding'] as const;
|
|
1745
1657
|
const ESSENTIAL_OPTIONAL_TOOL_NAMES = [
|
|
1746
1658
|
'GetDashboardState',
|
|
@@ -1802,76 +1714,35 @@ export function buildSessionRuntimeToolSpecs(opts: {
|
|
|
1802
1714
|
userText: string;
|
|
1803
1715
|
hostTools: readonly LLMToolDef[];
|
|
1804
1716
|
runtimeTools?: readonly ToolRuntime<Record<string, unknown>, ToolRunResult>[];
|
|
1805
|
-
pluginTools?: readonly LLMToolDef[];
|
|
1806
|
-
schedulerTools?: readonly LLMToolSpec[];
|
|
1807
1717
|
optionalTools?: readonly LLMToolSpec[];
|
|
1808
1718
|
toolAvailability?: Readonly<Record<string, boolean>>;
|
|
1809
1719
|
surface?: SessionSurfaceProfile;
|
|
1810
1720
|
preferredSurfaceId?: SessionSurfaceId;
|
|
1811
1721
|
controlMode?: boolean;
|
|
1812
|
-
/** TUI --rich preserves the legacy userText-driven surface catalog. */
|
|
1813
|
-
rich?: boolean;
|
|
1814
1722
|
}): LLMToolSpec[] {
|
|
1723
|
+
// TUI-DIET-D1-TAIL — the legacy userText-driven catalog (`rich !== false`) is gone;
|
|
1724
|
+
// every caller already passed rich=false, so the essential catalog is the only path.
|
|
1725
|
+
// The surface profile is still resolved for the always-on observation below.
|
|
1815
1726
|
const surface = opts.surface ?? resolveSessionSurfaceProfile({
|
|
1816
1727
|
userText: opts.userText,
|
|
1817
1728
|
preferredSurfaceId: opts.preferredSurfaceId,
|
|
1818
1729
|
controlMode: opts.controlMode,
|
|
1819
1730
|
});
|
|
1820
|
-
const
|
|
1821
|
-
userText: opts.userText,
|
|
1731
|
+
const essentialSpecs = buildEssentialSessionRuntimeToolSpecs({
|
|
1822
1732
|
hostTools: opts.hostTools,
|
|
1823
|
-
toolAvailability: opts.toolAvailability,
|
|
1824
|
-
defaultFamilyIds: surface.defaultHostFamilyIds,
|
|
1825
|
-
surfaceId: surface.id,
|
|
1826
|
-
});
|
|
1827
|
-
const dynamicRuntimeTools = resolveDynamicSessionRuntimeToolSpecs({
|
|
1828
|
-
userText: opts.userText,
|
|
1829
1733
|
runtimeTools: opts.runtimeTools ?? [],
|
|
1830
|
-
|
|
1831
|
-
surfaceId: surface.id,
|
|
1832
|
-
});
|
|
1833
|
-
const dynamicNativeTools = resolveDynamicSessionNativeToolSpecs({
|
|
1834
|
-
userText: opts.userText,
|
|
1734
|
+
optionalTools: opts.optionalTools ?? [],
|
|
1835
1735
|
toolAvailability: opts.toolAvailability,
|
|
1836
|
-
defaultFamilyIds: surface.defaultNativeFamilyIds,
|
|
1837
|
-
surfaceId: surface.id,
|
|
1838
1736
|
});
|
|
1839
|
-
const
|
|
1840
|
-
const
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
// session" while Bash was actually exposed at position 7+).
|
|
1849
|
-
const finalSpecs: LLMToolSpec[] = opts.rich === false
|
|
1850
|
-
? (() => {
|
|
1851
|
-
const essentialSpecs = buildEssentialSessionRuntimeToolSpecs({
|
|
1852
|
-
hostTools: opts.hostTools,
|
|
1853
|
-
runtimeTools: opts.runtimeTools ?? [],
|
|
1854
|
-
optionalTools: opts.optionalTools ?? [],
|
|
1855
|
-
toolAvailability: opts.toolAvailability,
|
|
1856
|
-
});
|
|
1857
|
-
if (!hasDevHarnessIntent(opts.userText)) return essentialSpecs;
|
|
1858
|
-
const droppedNames = new Set(['Edit', 'Write']);
|
|
1859
|
-
const filteredSpecs = essentialSpecs.filter(spec => !droppedNames.has(spec.name));
|
|
1860
|
-
if (filteredSpecs.length !== essentialSpecs.length) {
|
|
1861
|
-
debug.log('session-runtime.tools', 'harness-phrase-write-tools-dropped', {
|
|
1862
|
-
dropped: ['Edit', 'Write'],
|
|
1863
|
-
});
|
|
1864
|
-
}
|
|
1865
|
-
return filteredSpecs;
|
|
1866
|
-
})()
|
|
1867
|
-
: [
|
|
1868
|
-
...dynamicNativeTools,
|
|
1869
|
-
...hostSpecs,
|
|
1870
|
-
...dynamicRuntimeTools,
|
|
1871
|
-
...pluginSpecs,
|
|
1872
|
-
...schedulerSpecs,
|
|
1873
|
-
...optionalSpecs,
|
|
1874
|
-
];
|
|
1737
|
+
const droppedNames = new Set(['Edit', 'Write']);
|
|
1738
|
+
const finalSpecs: LLMToolSpec[] = hasDevHarnessIntent(opts.userText)
|
|
1739
|
+
? essentialSpecs.filter(spec => !droppedNames.has(spec.name))
|
|
1740
|
+
: essentialSpecs;
|
|
1741
|
+
if (finalSpecs.length !== essentialSpecs.length) {
|
|
1742
|
+
debug.log('session-runtime.tools', 'harness-phrase-write-tools-dropped', {
|
|
1743
|
+
dropped: ['Edit', 'Write'],
|
|
1744
|
+
});
|
|
1745
|
+
}
|
|
1875
1746
|
// Forensic — final tool list returned to streamLLMWithTools. Lets
|
|
1876
1747
|
// us diff TUI vs JSON-test (`elanous repro`) tool exposure when codex
|
|
1877
1748
|
// behavior diverges. Counts AND names so we can spot per-source
|
|
@@ -1903,18 +1774,10 @@ export function buildSessionRuntimeToolSpecs(opts: {
|
|
|
1903
1774
|
// diag-gated (분석 레벨) 유지 — 매턴 detail 이라 always-on 이면 노이즈 독.
|
|
1904
1775
|
// 노출 tool 셋을 보려면 `/debug diag` 후 elanous logs --category llm.tool-
|
|
1905
1776
|
// exposure. always-on 은 이상탐지(surface tool 0개·core 누락) 전용 — 루틴
|
|
1906
|
-
// per-turn 노출은 diag. (2026-07-17 규율: over-log
|
|
1777
|
+
// per-turn 노출은 diag. (2026-07-17 규율: over-log 되돌림.)
|
|
1907
1778
|
if (debug.enabled) {
|
|
1908
1779
|
debug.log('llm.tool-exposure', 'session-runtime-tool-specs.return', {
|
|
1909
1780
|
total: finalSpecs.length,
|
|
1910
|
-
counts: {
|
|
1911
|
-
host: hostSpecs.length,
|
|
1912
|
-
runtime: dynamicRuntimeTools.length,
|
|
1913
|
-
native: dynamicNativeTools.length,
|
|
1914
|
-
plugin: pluginSpecs.length,
|
|
1915
|
-
scheduler: schedulerSpecs.length,
|
|
1916
|
-
optional: optionalSpecs.length,
|
|
1917
|
-
},
|
|
1918
1781
|
names: finalSpecs.map(s => s.name),
|
|
1919
1782
|
surfaceId: surface.id,
|
|
1920
1783
|
userTextChars: opts.userText.length,
|
|
@@ -1923,76 +1786,6 @@ export function buildSessionRuntimeToolSpecs(opts: {
|
|
|
1923
1786
|
return finalSpecs;
|
|
1924
1787
|
}
|
|
1925
1788
|
|
|
1926
|
-
function resolveDynamicSessionRuntimeToolSpecs(opts: {
|
|
1927
|
-
userText: string;
|
|
1928
|
-
runtimeTools: readonly ToolRuntime<Record<string, unknown>, ToolRunResult>[];
|
|
1929
|
-
defaultFamilyIds?: readonly string[];
|
|
1930
|
-
surfaceId?: SessionSurfaceId;
|
|
1931
|
-
}): LLMToolSpec[] {
|
|
1932
|
-
const text = opts.userText.toLowerCase();
|
|
1933
|
-
const available = new Map(opts.runtimeTools.map(tool => [tool.id, tool] as const));
|
|
1934
|
-
const selected = new Set<string>();
|
|
1935
|
-
|
|
1936
|
-
// Pass 0 — T1 world-I/O substrate (RFC §3 · P2 상시화). Shell/PTY
|
|
1937
|
-
// execution is domain-independent substrate: a coding agent needs to
|
|
1938
|
-
// run what it builds on EVERY surface (research cross-check, ops
|
|
1939
|
-
// triage, control), not only the coding surfaces. Mirrors the native
|
|
1940
|
-
// 6-core Pass-0. Subject to availability — a surface that doesn't wire
|
|
1941
|
-
// the shell runtimes (`available.has` false) simply skips them, so no
|
|
1942
|
-
// phantom tools appear. Trade/financial dispatch is unaffected: these
|
|
1943
|
-
// are exposure only; execution safety stays in bash sandbox / PtyShell
|
|
1944
|
-
// approval (shell.allowDashboardPty) gates.
|
|
1945
|
-
for (const familyId of CORE_RUNTIME_FAMILY_IDS) {
|
|
1946
|
-
const rule = RUNTIME_TOOL_FAMILY_RULE_MAP.get(familyId);
|
|
1947
|
-
if (!rule) continue;
|
|
1948
|
-
for (const name of rule.names) {
|
|
1949
|
-
if (available.has(name)) selected.add(name);
|
|
1950
|
-
}
|
|
1951
|
-
}
|
|
1952
|
-
|
|
1953
|
-
for (const familyId of opts.defaultFamilyIds ?? []) {
|
|
1954
|
-
const rule = RUNTIME_TOOL_FAMILY_RULE_MAP.get(familyId);
|
|
1955
|
-
if (!rule) continue;
|
|
1956
|
-
// code-grounding belongs to coding defaults but remains opt-in to avoid carrying its spec on every coding turn.
|
|
1957
|
-
// Its rule intentionally never dynamically matches: only coding profiles list it as a default family.
|
|
1958
|
-
if (rule.id === 'code-grounding' && !isCodeGroundingModelSurfaceEnabled()) continue;
|
|
1959
|
-
for (const name of rule.names) {
|
|
1960
|
-
if (available.has(name)) selected.add(name);
|
|
1961
|
-
}
|
|
1962
|
-
}
|
|
1963
|
-
|
|
1964
|
-
for (const tool of opts.runtimeTools) {
|
|
1965
|
-
if (mentionsTool(text, tool.id) || mentionsTool(text, tool.spec.name)) {
|
|
1966
|
-
selected.add(tool.id);
|
|
1967
|
-
}
|
|
1968
|
-
}
|
|
1969
|
-
|
|
1970
|
-
for (const rule of SESSION_RUNTIME_TOOL_FAMILY_RULES) {
|
|
1971
|
-
const surfaceMatch = matchesSurfaceAwareRuntimeIntent(rule.id, text, opts.surfaceId);
|
|
1972
|
-
if (!rule.match(text) && !surfaceMatch) continue;
|
|
1973
|
-
for (const name of rule.names) {
|
|
1974
|
-
if (available.has(name)) selected.add(name);
|
|
1975
|
-
}
|
|
1976
|
-
}
|
|
1977
|
-
|
|
1978
|
-
const specs = [...selected]
|
|
1979
|
-
.map(name => available.get(name))
|
|
1980
|
-
.filter((tool): tool is ToolRuntime<Record<string, unknown>, ToolRunResult> => !!tool)
|
|
1981
|
-
.map(tool => tool.spec);
|
|
1982
|
-
// 관측 보강(2026-07-17) — native.resolve 미러. runtime 축(Bash·RunShell 등)이
|
|
1983
|
-
// 어느 surface/family 로 노출됐는지 elanous logs --category llm.tool-exposure 로
|
|
1984
|
-
// 조회 가능하게. runtime 축 로깅이 없어 "Bash 노출됐나" 를 로그로 못 봤던 갭.
|
|
1985
|
-
if (debug.enabled) {
|
|
1986
|
-
debug.log('llm.tool-exposure', 'runtime.resolve', {
|
|
1987
|
-
surfaceId: opts.surfaceId ?? null,
|
|
1988
|
-
defaultFamilyIds: [...(opts.defaultFamilyIds ?? [])],
|
|
1989
|
-
availableCount: available.size,
|
|
1990
|
-
selectedNames: specs.map(s => s.name),
|
|
1991
|
-
});
|
|
1992
|
-
}
|
|
1993
|
-
return specs;
|
|
1994
|
-
}
|
|
1995
|
-
|
|
1996
1789
|
/** Six core file-IO tools that survive on EVERY surface regardless
|
|
1997
1790
|
* of the surface's `defaultNativeFamilyIds`. User-stated invariant
|
|
1998
1791
|
* (2026-05-04): "the 6 core tools must stay alive even in basic
|
|
@@ -2011,19 +1804,6 @@ const CORE_NATIVE_FAMILY_IDS: readonly string[] = [
|
|
|
2011
1804
|
'code-write',
|
|
2012
1805
|
];
|
|
2013
1806
|
|
|
2014
|
-
/** T1 world-I/O substrate on the RUNTIME axis (RFC §3 · P2 상시화) —
|
|
2015
|
-
* shell + interactive PTY execution that survives on EVERY surface,
|
|
2016
|
-
* regardless of the surface's `defaultRuntimeFamilyIds`. Domain-
|
|
2017
|
-
* independent: a coding agent must run what it builds on the research /
|
|
2018
|
-
* control / ops surfaces too, not only the coding surfaces. The
|
|
2019
|
-
* symmetric counterpart to `CORE_NATIVE_FAMILY_IDS`. Availability-gated
|
|
2020
|
-
* (a surface that doesn't wire these runtimes just skips them). */
|
|
2021
|
-
const CORE_RUNTIME_FAMILY_IDS: readonly string[] = [
|
|
2022
|
-
'bash',
|
|
2023
|
-
'run-shell',
|
|
2024
|
-
'pty-shell',
|
|
2025
|
-
];
|
|
2026
|
-
|
|
2027
1807
|
export function resolveDynamicSessionNativeToolSpecs(opts: {
|
|
2028
1808
|
userText: string;
|
|
2029
1809
|
toolAvailability?: Readonly<Record<string, boolean>>;
|
|
@@ -2263,13 +2043,6 @@ function toSpec(tool: LLMToolDef): LLMToolSpec {
|
|
|
2263
2043
|
};
|
|
2264
2044
|
}
|
|
2265
2045
|
|
|
2266
|
-
function mentionsTool(text: string, toolName: string): boolean {
|
|
2267
|
-
const normalized = toolName.toLowerCase();
|
|
2268
|
-
if (text.includes(normalized)) return true;
|
|
2269
|
-
const humanized = normalized.replace(/[_]/g, ' ');
|
|
2270
|
-
return humanized !== normalized && text.includes(humanized);
|
|
2271
|
-
}
|
|
2272
|
-
|
|
2273
2046
|
function hasAny(text: string, needles: readonly string[]): boolean {
|
|
2274
2047
|
return needles.some(needle => text.includes(needle));
|
|
2275
2048
|
}
|
|
@@ -2804,15 +2577,6 @@ function hasOpsUiIntent(text: string): boolean {
|
|
|
2804
2577
|
return matchesIntentLexicon(text, OPS_UI_INTENT_TERMS);
|
|
2805
2578
|
}
|
|
2806
2579
|
|
|
2807
|
-
function matchesSurfaceAwareFamilyIntent(
|
|
2808
|
-
familyId: string,
|
|
2809
|
-
text: string,
|
|
2810
|
-
surfaceId?: SessionSurfaceId,
|
|
2811
|
-
): boolean {
|
|
2812
|
-
if (!surfaceId) return false;
|
|
2813
|
-
return SURFACE_AWARE_POLICIES[surfaceId]?.hostFamilyMatchers?.[familyId]?.(text) ?? false;
|
|
2814
|
-
}
|
|
2815
|
-
|
|
2816
2580
|
function matchesSurfaceAwareNativeIntent(
|
|
2817
2581
|
familyId: string,
|
|
2818
2582
|
text: string,
|
|
@@ -2822,15 +2586,6 @@ function matchesSurfaceAwareNativeIntent(
|
|
|
2822
2586
|
return SURFACE_AWARE_POLICIES[surfaceId]?.nativeFamilyMatchers?.[familyId]?.(text) ?? false;
|
|
2823
2587
|
}
|
|
2824
2588
|
|
|
2825
|
-
function matchesSurfaceAwareRuntimeIntent(
|
|
2826
|
-
familyId: string,
|
|
2827
|
-
text: string,
|
|
2828
|
-
surfaceId?: SessionSurfaceId,
|
|
2829
|
-
): boolean {
|
|
2830
|
-
if (!surfaceId) return false;
|
|
2831
|
-
return SURFACE_AWARE_POLICIES[surfaceId]?.runtimeFamilyMatchers?.[familyId]?.(text) ?? false;
|
|
2832
|
-
}
|
|
2833
|
-
|
|
2834
2589
|
function isToolAvailable(
|
|
2835
2590
|
name: string,
|
|
2836
2591
|
overrides?: Readonly<Record<string, boolean>>,
|
|
@@ -93,31 +93,48 @@ export function partitionByParallelSafety<T extends { name: string }>(
|
|
|
93
93
|
*
|
|
94
94
|
* When `safe.length < 2`, the helper degenerates into pure sequential
|
|
95
95
|
* dispatch in original order — no parallelism benefit for 0-1 safe
|
|
96
|
-
* calls so we keep behaviour identical to pre-P2.
|
|
96
|
+
* calls so we keep behaviour identical to pre-P2.
|
|
97
|
+
*
|
|
98
|
+
* ⭐ `signal` (TUI-ESC-ABORT-TOOLS · 2026-10-15) — 턴 중단(Esc)이 걸리면 묶음 안
|
|
99
|
+
* «남은» 호출을 새로 시작하지 않는다. 순차 갈래·unsafe 갈래에서 호출마다
|
|
100
|
+
* `signal.aborted` 를 보고, 참이면 그 호출과 뒤의 호출을 부르지 않는다.
|
|
101
|
+
* ⛔ 이미 시작한 호출은 끊지 않는다(진행 중 도구의 중단은 도구가 받는 신호의 몫).
|
|
102
|
+
* ⛔ 병렬(safe) 묶음은 한꺼번에 시작되므로 시작 «전»에만 본다.
|
|
103
|
+
* 부르지 않은 호출의 결과 칸은 비어 있다 — 호출자가 «중단됨» 결과로 채워
|
|
104
|
+
* 공급자 이력의 tool_call/tool_result 짝을 지킨다(`skippedIndices`). */
|
|
97
105
|
export async function dispatchWithParallelSafety<T extends { name: string }>(
|
|
98
106
|
calls: readonly T[],
|
|
99
107
|
dispatchOne: (call: T, index: number) => Promise<void>,
|
|
100
|
-
|
|
108
|
+
signal?: AbortSignal,
|
|
109
|
+
): Promise<{ safeCount: number; unsafeCount: number; parallelActivated: boolean; skippedIndices: number[] }> {
|
|
101
110
|
const { safe, unsafe } = partitionByParallelSafety(calls);
|
|
102
111
|
const parallelActivated = safe.length >= 2;
|
|
112
|
+
const skippedIndices: number[] = [];
|
|
103
113
|
if (!parallelActivated) {
|
|
104
114
|
// Fall back to pure sequential in original order. Keeps pre-P2
|
|
105
115
|
// behaviour bit-exact when only one read tool is in the batch
|
|
106
116
|
// (common case — no benefit to firing Promise.all for a single
|
|
107
117
|
// call).
|
|
108
118
|
for (let i = 0; i < calls.length; i += 1) {
|
|
119
|
+
if (signal?.aborted) { skippedIndices.push(i); continue; }
|
|
109
120
|
await dispatchOne(calls[i]!, i);
|
|
110
121
|
}
|
|
111
|
-
return { safeCount: safe.length, unsafeCount: unsafe.length, parallelActivated };
|
|
122
|
+
return { safeCount: safe.length, unsafeCount: unsafe.length, parallelActivated, skippedIndices };
|
|
112
123
|
}
|
|
113
124
|
// Parallel kickoff for the safe group. Promise.all is safe here
|
|
114
125
|
// because `dispatchOne` is expected to catch its own errors and
|
|
115
126
|
// write an error result into the caller's storage — we never want
|
|
116
127
|
// one failing Read to cancel two sibling Reads.
|
|
117
|
-
|
|
128
|
+
if (signal?.aborted) {
|
|
129
|
+
for (const { index } of safe) skippedIndices.push(index);
|
|
130
|
+
} else {
|
|
131
|
+
await Promise.all(safe.map(({ call, index }) => dispatchOne(call, index)));
|
|
132
|
+
}
|
|
118
133
|
// Unsafe group: sequential, in original order.
|
|
119
134
|
for (const { call, index } of unsafe) {
|
|
135
|
+
if (signal?.aborted) { skippedIndices.push(index); continue; }
|
|
120
136
|
await dispatchOne(call, index);
|
|
121
137
|
}
|
|
122
|
-
|
|
138
|
+
skippedIndices.sort((a, b) => a - b);
|
|
139
|
+
return { safeCount: safe.length, unsafeCount: unsafe.length, parallelActivated, skippedIndices };
|
|
123
140
|
}
|