elanous 0.2.29 → 0.2.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{cIpv5nU9AycwYWZI9H589 → LSXfY0u9QtfDbejY0Ukf_}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{058a98ba.7eb28d5e6dc03565.js → 0bb0ff36.b8d418980951e5ba.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +287 -0
- package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +62 -0
- package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6013-2f769370d8b4c2c6.js → 1335-6731f392c35216eb.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8332.6f0f49df772e163b.js → 1654.32de4b324981a188.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1834-50625904996a8fa8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{8795.32573a185af18c7b.js → 1913.7cc6fb6055b1ed3f.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{419.736c0d6f426249a7.js → 2001.6c7e0fd02190886c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2112-e4efc21a6505d5bc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6767.1fcfc9b8be83975f.js → 2213.2ccbada92c33ea0f.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2534.e85ae21ad0dac829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4759.1f76713aefb87db5.js → 2871.0bca6137343b3f76.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6776.06ff1e3b464cc607.js → 2898.fd781bc7cf01a7b7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1782-59db1b5aa06df38a.js → 2940-619bfd8ef337c611.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8471.8d2a8c74f09c36ff.js → 2985.39ccdecd36848b12.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +115 -0
- package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +64 -0
- package/apps/pwa/out/_next/static/chunks/{bc324b7c.02a09dd93f6a399b.js → 3267c0e6.d34854e7b3984a6e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3278.2e5d15b53a4091c8.js +2 -0
- package/apps/pwa/out/_next/static/chunks/{7725-4f83d5541fbdb81b.js → 3541-ce3a5424ed5ad7f1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3583.a05e88cc8d594628.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3902.e1e71aaac850a045.js +34 -0
- package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{46bd8bea.2f4b4099172fcdb7.js → 409f1e57.d0649fc47691ebfe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4111.2bfedbb233ad206b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1142.65d002789ab3af7d.js → 4174.92ed04922709ac9e.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +36 -0
- package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +286 -0
- package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +77 -0
- package/apps/pwa/out/_next/static/chunks/4745.67d6f99c245af3f7.js +226 -0
- package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4999.c064a4000c2a9e94.js +79 -0
- package/apps/pwa/out/_next/static/chunks/5173-233188df2f42c626.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5304.04d24756f242a094.js +148 -0
- package/apps/pwa/out/_next/static/chunks/5307.60f2209e809bd627.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3396-97b97928c49190c9.js → 5458-16cd7a2b51b74c8c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3403.7199205e65124486.js → 5525.86debf231e181813.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9143.ff14585db1d275ff.js → 5543.a438b8ab5a13ea47.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +74 -0
- package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +94 -0
- package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8398.73a19b39715eda04.js → 6092.a7f99e68b188ca66.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/60fb96c9.360b01d8d4927b7b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5591.a35e7a217734a8b9.js → 6157.0c9af021de4fb31b.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6323.8672b4817a306928.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7375.050ea0d72968e49f.js → 6433.fc573af22bbc9ab7.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +90 -0
- package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6544cb48.a87fe20ddf137be2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +104 -0
- package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6767.ea607cf0c20a25af.js +24 -0
- package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +93 -0
- package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7371.80c05c653b08e907.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7391.ebae168025c91b6a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1852.7f7b53991fcb99ef.js → 7502.ccd5b8065545edd0.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +8 -0
- package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6534.1ab00f370db7b105.js → 7862.30a8d6482bb238eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7947-d0759430f8042240.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{285adb1a.5654e605dddf86d2.js → 7a1887c4.f36b88fba31da8fd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8018.a32663f04a6fc5f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8097-92f87bd108322f66.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +1 -0
- package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9002.e5658224e3dc1b6f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1516.dfaceff3fd2d0e0d.js → 9138.b6e80031afb1d973.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9907.49be0fcadaf214b5.js → 9221.7d22eaf353a2d4e7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8767-2f6a634f5abeaa01.js → 9279-d28c5b7754d010ae.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3160-95c96f4d2a21dd26.js → 9398-6aed28f0a96d0d6f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9407.e49124dedf0f5e72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{328bb3ab-6628a1114fe3fb3b.js → 997ce8a5-2ad501927003b41b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6853.cc5174a9dee59593.js → 9989.3694300e5f000b14.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-bf3634a117322df7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-3535a4a69f1fafaa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-b9f51447f757fbf2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-a5635eba0d73b84e.js → page-2ebb8fd59b9461f9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-a2fc4e49a4fa4ba8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-5a503541353e60a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-6025101384e361a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f4b630cc8b5273cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-a645f00a06483e9a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-61ac22cbab1ee4ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e9bab7413b028b28.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c992eafe028b642e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-e547e6ce55f1fb33.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-d27e1b9850fd54bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-805ac2e137b7a121.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-0fec29c7ba01894b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-339a07410cd6f36b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-349f2752d8cd37ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d5c6dcf31c25cecc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2fd93ed8c9f16580.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-9b564dbff0fefc35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-62f4475d3c38fb9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-814ba51385225776.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-397d479626e5a459.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-af1bba4e3251b728.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ad3be5e7d3fdce9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-f219ccdbc0bf27df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4da93ad35d4a8d28.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-456666766e5ce6fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-7404e377e8adb8c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-14456240ed2a36ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-3a658d5fa6d16a25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-0157de6e85f8bb6b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-0a07363b130182a1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-841d73d4ac44ed49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6f43a3d1146e6377.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/{page-29900ed0011b2c83.js → page-521ee23ac8c0abfa.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9992ee285efaa83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-3d48e85fa89ec04f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d2ced71132fac9b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-f08358bdf251adb9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-233c71cd5f68f0d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-70151d78de2f375e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-dcac33a3e2cb72c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/{page-9f92737b8766009a.js → page-149dc1caba411bb9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0448145ccd5c45c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-9cb0c444903da65d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-17e504c396e0e389.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{425cfc4d.fb91158e3971c39f.js → b313b242.cb1265eea908db61.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +122 -0
- package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +1 -0
- package/apps/pwa/out/_next/static/chunks/ebc7d829.264a0bcb6c750b50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +1 -0
- package/apps/pwa/out/_next/static/css/{72becfd42807b50d.css → 3f5fc6f96e2cf7b2.css} +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/bin/elanous.mjs +7 -3
- package/graphs/context/nightly-condense.yaml +1 -0
- package/graphs/intake/intake-daily.yaml +8 -1
- package/graphs/intake/recipes.yaml +5 -0
- package/graphs/lecture/lecture-note.yaml +2 -2
- package/graphs/ops/harness-gc.yaml +1 -0
- package/graphs/release/recipes.yaml +3 -0
- package/graphs/release/release-loop.yaml +9 -5
- package/graphs/units/recipes.yaml +3 -0
- package/graphs/units/release-gate-recheck.yaml +15 -0
- package/package.json +2 -1
- package/scripts/check-native-tool-wiring.ts +3 -2
- package/scripts/ci-android-unit-tests.ts +16 -0
- package/scripts/ci-typecheck-changed.ts +37 -9
- package/scripts/coord-channel-watch.sh +22 -16
- package/scripts/coord-role-pack.ts +81 -2
- package/scripts/cron-run.ts +96 -3
- package/scripts/detect-test-interference.ts +38 -5
- package/scripts/gate-pr-cache.ts +65 -0
- package/scripts/gh-surface/capture.ts +126 -0
- package/scripts/gh-surface/gh +40 -0
- package/scripts/import-graph-scc.ts +38 -0
- package/scripts/install.ps1 +19 -0
- package/scripts/intake-social.ts +181 -0
- package/scripts/lecture-note/node.ts +71 -4
- package/scripts/lib/android-toolchain.ts +32 -0
- package/scripts/lib/deterministic-env.ts +62 -0
- package/scripts/lib/gate-test-env.ts +19 -0
- package/scripts/measure-goal-grounding-corpus.ts +2 -1
- package/scripts/ratchets/test-interference-patterns.allowlist.txt +257 -0
- package/scripts/ratchets/test-interference-patterns.ts +367 -0
- package/scripts/release-loop/cut-branch.ts +4 -3
- package/scripts/release-loop/export-check-node.ts +0 -1
- package/scripts/release-loop/fixtures/warm-failure-assertion/sample.junit.xml +8 -0
- package/scripts/release-loop/fixtures/warm-job-029/sample.json +1 -0
- package/scripts/release-loop/fixtures/warm-job-029/sample.junit.xml +10 -0
- package/scripts/release-loop/gate-closure.ts +12 -8
- package/scripts/release-loop/gate-diff.ts +1 -1
- package/scripts/release-loop/gate-host-mirror.ts +66 -0
- package/scripts/release-loop/gate-node.ts +523 -75
- package/scripts/release-loop/gate-partial.ts +106 -9
- package/scripts/release-loop/gate-pr-cache.ts +66 -0
- package/scripts/release-loop/gate-prewarm-plan.ts +66 -0
- package/scripts/release-loop/gate-r2-verdict.ts +189 -0
- package/scripts/release-loop/gate-recheck-plan-node.ts +52 -0
- package/scripts/release-loop/gate-warm-artifacts.ts +253 -0
- package/scripts/release-loop/import-graph-scc-run.ts +54 -0
- package/scripts/release-loop/import-graph-scc.ts +215 -0
- package/scripts/release-loop/node-verdict.ts +2 -0
- package/scripts/release-loop/probe-pod-host-dirs-live.ts +113 -0
- package/scripts/release-loop/resume-release.ts +33 -4
- package/scripts/release-loop/resume.ts +13 -5
- package/scripts/release-loop/spawn-lane.ts +2 -19
- package/scripts/release-loop/tui-sim-node.ts +3 -2
- package/scripts/release-loop/unattended-release.ts +16 -0
- package/scripts/test-deterministic.ts +5 -61
- package/scripts/train-reach-grouping.ts +48 -0
- package/scripts/tsc-incremental-cache.ts +86 -0
- package/scripts/tsc-incremental-diagnostics.ts +76 -0
- package/scripts/tsc-main-safety-net.ts +2 -2
- package/src/acp/client.ts +4 -1
- package/src/acp/core-turn-bridge.ts +50 -5
- package/src/ad-pipeline/run.ts +4 -2
- package/src/agent/runner.ts +169 -3
- package/src/agent/subagent-callable.ts +3 -2
- package/src/agent-mission/review-loop.ts +6 -3
- package/src/agent-substrate/acp-implementer.ts +14 -2
- package/src/agent-substrate/pr-reviewer.ts +12 -0
- package/src/agent-substrate/self-review-cli.ts +30 -4
- package/src/autopilot/pr-manager.ts +62 -7
- package/src/briefing/brief-items.ts +24 -22
- package/src/capture/tui-self-report.ts +15 -0
- package/src/chat/chat-cli.ts +10 -2
- package/src/chat/index.ts +77 -11
- package/src/chat/input-control-key.ts +5 -3
- package/src/chat/tool-interrupt-behavior.ts +38 -0
- package/src/chat/tool-render/dispatch.ts +5 -1
- package/src/chat/turn-typeahead.ts +75 -20
- package/src/cli/__fixtures__/agent-help-before/agent.txt +4 -2
- package/src/cli/agent-cli.ts +41 -13
- package/src/cli/config-audit.ts +123 -0
- package/src/cli/decisions-cli.ts +80 -6
- package/src/cli/log-event-names.ts +7 -0
- package/src/cli/mcp-login.ts +21 -5
- package/src/cli/msg-cli.ts +88 -0
- package/src/cli/pr-cli.ts +214 -57
- package/src/cli/pr-land-heavy-remote.ts +2 -2
- package/src/cli/pr-land-overlap-evidence.ts +63 -9
- package/src/cli/pr-land-pod-shadow-job.ts +83 -0
- package/src/cli/pr-land-pod-shadow.ts +16 -3
- package/src/cli/pr-land-virtual-rebase.ts +108 -0
- package/src/cli/release-cli.ts +80 -14
- package/src/cli/seat-cli.ts +138 -3
- package/src/cli/self-update.ts +5 -2
- package/src/cli/tasks-cli.ts +97 -19
- package/src/context-bus/context-first.ts +13 -0
- package/src/context-bus/context-now.ts +13 -2
- package/src/context-bus/ops-events.ts +75 -0
- package/src/control-plane/lease-holder.ts +12 -8
- package/src/control-plane/ledger.ts +163 -4
- package/src/control-plane/server.ts +91 -11
- package/src/core-turn/run-core-turn.ts +1 -0
- package/src/core-turn/run-goal-loop.ts +222 -3
- package/src/core-turn/seat-turn-cap.ts +79 -0
- package/src/core-turn/short-question.ts +38 -6
- package/src/core-turn/types.ts +3 -0
- package/src/dashboard/acp-boot.ts +3 -0
- package/src/dashboard/index.ts +224 -615
- package/src/dashboard/input/chat-main-entry-runtime.ts +1 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +4 -1
- package/src/dashboard/input/chat-main-session.ts +8 -1
- package/src/dashboard/input/chat-main-turn.ts +12 -3
- package/src/dashboard/input/compact-prepass-recovery.ts +33 -0
- package/src/dashboard/input/external-input-host.ts +26 -0
- package/src/dashboard/input/internal-turn.ts +261 -0
- package/src/dashboard/input/seat-autowake.ts +318 -0
- package/src/dashboard/input/turn-steer-bridge.ts +70 -0
- package/src/dashboard/loop-scheduler.ts +72 -0
- package/src/dashboard/seat-boot-preamble.ts +18 -0
- package/src/dashboard/skill-runtime.ts +2 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +126 -1181
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -1
- package/src/dashboard/slash-runtime/index.ts +13 -0
- package/src/dashboard/turn-busy-teardown.ts +50 -0
- package/src/decisions/decision-ledger.ts +45 -4
- package/src/discord-self-message.ts +4 -4
- package/src/domains/release-tool.ts +18 -1
- package/src/field-note/transcribe.ts +17 -0
- package/src/github/remote-call.ts +81 -0
- package/src/goals/registry.ts +46 -6
- package/src/goals/types.ts +7 -1
- package/src/graph-runner/runner.ts +1 -0
- package/src/grok/credential.ts +26 -0
- package/src/harness/harness-clean.ts +2 -1
- package/src/harness/harness-cli-command.ts +52 -5
- package/src/harness/harness-gc.ts +2 -1
- package/src/harness/harness-incidents.ts +57 -20
- package/src/harness/harness-pod-dispatch.ts +87 -10
- package/src/harness/harness-queue.ts +53 -4
- package/src/harness/harness-stop.ts +4 -3
- package/src/harness/harness-substrate-default.ts +78 -7
- package/src/harness/harness-worktree-auto.ts +2 -1
- package/src/harness/harness-worktrees.ts +3 -2
- package/src/hooks/dispatch.ts +2 -1
- package/src/index.ts +152 -25
- package/src/input/external-input-queue.ts +33 -1
- package/src/intake-plane/slash.ts +14 -3
- package/src/keybindings.ts +4 -1
- package/src/llm/tool-loop-steered-rejection.ts +33 -0
- package/src/llm.ts +138 -19
- package/src/loops/consensus.ts +348 -0
- package/src/loops/msg-wake.ts +206 -4
- package/src/loops/observe.ts +19 -3
- package/src/loops/orchestrator/tick.ts +64 -10
- package/src/loops/orchestrator/traffic.ts +64 -1
- package/src/loops/registry.ts +30 -0
- package/src/market/signed-index.ts +14 -0
- package/src/mcp/mcp-oauth.ts +54 -5
- package/src/models/prompts.ts +28 -0
- package/src/msg/msg-sse-client.ts +223 -0
- package/src/msg/msg-store.ts +86 -2
- package/src/mss/logging/log-store.ts +225 -1
- package/src/nexus/DAEMON-THIN-inventory-2026-10-15.md +122 -0
- package/src/nexus/api/http-server.ts +54 -15
- package/src/nexus/api/loop-resources.ts +19 -3
- package/src/nexus/api/ops-api.ts +11 -0
- package/src/nexus/daemon-thin-inventory.md +37 -0
- package/src/nexus/index.ts +70 -0
- package/src/nexus/state/state.ts +1 -0
- package/src/oauth/store.ts +32 -7
- package/src/onboarding/first-run.ts +28 -3
- package/src/ops/overview-cache.ts +16 -4
- package/src/ops/resources.ts +82 -0
- package/src/plugins/maker/connector-maker.ts +41 -0
- package/src/plugins/maker/skill-maker.ts +42 -0
- package/src/pr-tool/census.ts +288 -0
- package/src/prompt-library/chat-conciseness.ts +13 -0
- package/src/prompt-library/universal-preamble.ts +10 -5
- package/src/release-loop/gate-host-reservation.ts +97 -0
- package/src/release-loop/landing-freeze.ts +5 -0
- package/src/release-loop/light-rc.ts +5 -2
- package/src/release-loop/placement.ts +92 -1
- package/src/release-loop/rehearsal-shard-plan.ts +149 -0
- package/src/release-loop/rehearsal.ts +73 -17
- package/src/repl/index.ts +20 -2
- package/src/seat-loop/seat-knowhow.ts +282 -0
- package/src/seat-loop/seat-loop.ts +41 -2
- package/src/seat-loop/traffic-signal.ts +3 -0
- package/src/self-dev/ask-launch-flow.ts +24 -3
- package/src/self-dev/decompose-compose-graph.ts +28 -27
- package/src/self-dev/decompose-proposal.ts +53 -38
- package/src/self-dev/decompose.ts +17 -0
- package/src/self-dev/dev-pipeline.ts +31 -2
- package/src/self-dev/draft-residue.ts +24 -9
- package/src/self-dev/draft-sweep.ts +59 -4
- package/src/self-dev/external-call-zero.ts +77 -0
- package/src/self-dev/launch-preflight-text.ts +6 -0
- package/src/self-dev/launch-preflight.ts +25 -3
- package/src/self-dev/local-supervisor-judge.ts +185 -0
- package/src/self-dev/run-supervisor.ts +229 -19
- package/src/self-dev/run-types.ts +20 -0
- package/src/self-dev/shard-aggregate.ts +13 -2
- package/src/self-dev/shard-plan.ts +47 -0
- package/src/self-dev/shard-run.ts +112 -10
- package/src/self-dev/spawn-lane-files.ts +19 -0
- package/src/self-implement/app-api-budget.ts +51 -11
- package/src/self-implement/config-gate.ts +2 -1
- package/src/self-implement/expose-gate.ts +2 -1
- package/src/self-implement/gate-artifacts.ts +405 -0
- package/src/self-implement/gate-cli.ts +201 -16
- package/src/self-implement/gate-remote.ts +110 -25
- package/src/self-implement/gate-scenario.ts +85 -0
- package/src/self-implement/goal-author.ts +160 -8
- package/src/self-implement/graph-authority.ts +38 -6
- package/src/self-implement/graph-overlay-condition.ts +92 -1
- package/src/self-implement/heal-triage.ts +79 -0
- package/src/self-implement/host-regate.ts +61 -3
- package/src/self-implement/orchestrator.ts +14 -123
- package/src/self-implement/pr-title.ts +123 -0
- package/src/self-implement/run-checkpoint.ts +235 -0
- package/src/self-implement/run-ledger.ts +155 -10
- package/src/self-implement/run-stop.ts +4 -3
- package/src/self-implement/run-ttl.ts +28 -4
- package/src/self-implement/seams.ts +2 -0
- package/src/self-implement/shadow-stage.ts +7 -6
- package/src/self-implement/stop-autoheal.ts +2 -1
- package/src/self-implement/train-gate-remote.ts +37 -8
- package/src/self-implement/train-reach-grouping.ts +157 -0
- package/src/self-implement/train-scenario-layers.ts +133 -0
- package/src/self-implement/uncommitted-work.ts +2 -0
- package/src/session/pending-input.ts +19 -0
- package/src/session/session-start.ts +224 -0
- package/src/session-runtime/parallel-dispatch.ts +22 -5
- package/src/skills/tools/dev-harness.ts +6 -4
- package/src/skills/tools/shell.ts +1 -1
- package/src/steward/resync-tick.ts +114 -23
- package/src/steward/ta-repair-event-collect.ts +158 -0
- package/src/task-agent/card-evidence.ts +25 -1
- package/src/task-agent/green-sweep.ts +8 -3
- package/src/task-agent/judge.ts +76 -0
- package/src/task-agent/land-queue.ts +79 -0
- package/src/task-agent/live-moves.ts +30 -9
- package/src/task-agent/postland-card.ts +5 -0
- package/src/task-agent/prelaunch-already-done.ts +98 -0
- package/src/task-agent/real-launch-guard.ts +37 -0
- package/src/task-agent/rejudge-on-head.ts +89 -12
- package/src/task-agent/remote-rejudge-bind.ts +28 -8
- package/src/task-agent/repair-cycle.ts +45 -7
- package/src/task-agent/repair-worker.ts +7 -0
- package/src/task-agent/run-identity.ts +200 -0
- package/src/task-agent/shadow.ts +50 -3
- package/src/task-agent/task-hand.ts +158 -5
- package/src/task-agent/train-landing.ts +77 -0
- package/src/task-agent/work-order.ts +104 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +88 -28
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +88 -19
- package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-image-source.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-install-slots.ts +121 -9
- package/src/task-orchestrator/surfaces/pod-lease.ts +20 -6
- package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +169 -0
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +27 -0
- package/src/task-orchestrator/surfaces/pod-result-marker-wait.ts +33 -0
- package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +63 -0
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +19 -3
- package/src/task-orchestrator/surfaces/pod-warm-switch.ts +141 -0
- package/src/task-orchestrator/surfaces/pod-warm-ta-shadow.ts +85 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +153 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +208 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +132 -15
- package/src/telegram.ts +2 -4
- package/src/tui/input/pickers.ts +732 -0
- package/src/tui/slash/mission.ts +492 -0
- package/src/tui/slash/term.ts +877 -0
- package/src/tui-client/dashboard-session.ts +9 -0
- package/src/tui.ts +48 -0
- package/src/user-config/gemini-server-tools.ts +9 -0
- package/src/user-config.ts +53 -16
- package/src/util/spawn-sync-output.ts +7 -0
- package/src/ux-sim/fake-bin.ts +154 -0
- package/src/ux-sim/fake-clock.ts +36 -0
- package/src/ux-sim/headless-tui.ts +72 -0
- package/src/ux-sim/in-process-cli.ts +2 -1
- package/src/ux-sim/temp-git-remote.ts +82 -0
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/recipes/vlog.ts +25 -7
- package/apps/pwa/out/_next/static/chunks/1015-9cba22a5a4554797.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1084-4e66af7376a18db7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1106.3a6410b7b0c70ad4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1127.32fc642f70423506.js +0 -8
- package/apps/pwa/out/_next/static/chunks/1189-d9b8e1995a831fae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1224.6da98c7ad0eb7dd8.js +0 -34
- package/apps/pwa/out/_next/static/chunks/1370.4e3e2558f111fd5d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1514-b7da377fdc4eb17a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1577.3c24c32584e10d70.js +0 -286
- package/apps/pwa/out/_next/static/chunks/161.130a569855c4d68c.js +0 -24
- package/apps/pwa/out/_next/static/chunks/1864.16da9556e78a9236.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1b6f6b2a.aff090122be3726e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2341.e8a9135e5b910dd5.js +0 -36
- package/apps/pwa/out/_next/static/chunks/257.10afdbe3520f2fc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2658.87550e692dc493f6.js +0 -64
- package/apps/pwa/out/_next/static/chunks/2673.85e2f02efae7a85f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2766-bee623b37472ed63.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2794.6d836872b0bf43e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2806.eb57ced1a528ed39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/283.7a121c4910e6dad7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2870.1dc29aa5fc01f09f.js +0 -115
- package/apps/pwa/out/_next/static/chunks/293.fd38e77ce5d48103.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2993-5952a1cd3fd5d441.js +0 -1
- package/apps/pwa/out/_next/static/chunks/32-a523427c5bd5ed00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280.af38002a6424a905.js +0 -90
- package/apps/pwa/out/_next/static/chunks/3292-5ddffdb2f517b44f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3523.d3231daaf7aba993.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3763.577de3181e1e6ea0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4138-cc56b0938ef72783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4255-8350c43d307a8875.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4352.a4954693499c2714.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4421-f2dcbc6fd80ec013.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4513-51b94aeee37c9905.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4928-c3b72f99aa588699.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4986-f9fc0283fb325219.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5014.671a7b9f69c2b7b1.js +0 -94
- package/apps/pwa/out/_next/static/chunks/5137.d398e24710b3feb6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5298.0bea74885cabe754.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5315.74c53a39739b11c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5317-8b1df8d02105cd07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5358-33051f41a2b239af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5388.a2ec02501f714ad5.js +0 -62
- package/apps/pwa/out/_next/static/chunks/5395.e6ac948a2d15058d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5409-f282bf533c151849.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5466.d0f4aba9d52acfa8.js +0 -27
- package/apps/pwa/out/_next/static/chunks/5564.3d28b353470fe305.js +0 -104
- package/apps/pwa/out/_next/static/chunks/569.b0cbfb4dee4a167a.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5835-72465b73a8bb8d74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5941.045d6093139e1f7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6228.47cabb83564dfe54.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6457-8d1993002a87d0fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6513.ef54cfae52351982.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6582.13d245bf87df69f1.js +0 -148
- package/apps/pwa/out/_next/static/chunks/6655.c33f6acc2c61bb89.js +0 -149
- package/apps/pwa/out/_next/static/chunks/6731-9d7195af289c8d4c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6733.0be05b1db9279fc5.js +0 -79
- package/apps/pwa/out/_next/static/chunks/6742-90937146253a8b9e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/687-816858f77a396a4e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6888.72c7b8cfb02a7e61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6993.c17c828ac3ef3253.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7076.9f27ef666b0cefdd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7113.1403c5d451804e8c.js +0 -287
- package/apps/pwa/out/_next/static/chunks/7169.9dd603c726c2cd7c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7247-e3ec21f761f86710.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7261-a47b72f96f5199df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7335-5cda81ac90310077.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7356-c2e4af090546e2d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/738-59518742078fda71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7385.a7375f10db73243a.js +0 -77
- package/apps/pwa/out/_next/static/chunks/7445.cf1cf2fe109bcd96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7505.a2057432ab6ef99a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7515.31f45fac1f9c70cb.js +0 -74
- package/apps/pwa/out/_next/static/chunks/7658-d4ce8c72a9548a91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8107-0b1ae46bc5bcb788.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8132.bfea2f016ce8d992.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8672.e299832bc7d18ee2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8735.f1ef798a5f260f6f.js +0 -226
- package/apps/pwa/out/_next/static/chunks/8774-88f67f7d8d53d299.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8782.252e5a405d86e4ed.js +0 -32
- package/apps/pwa/out/_next/static/chunks/909-9ed7aa0dba804316.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9100.22b0301256827007.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9140-dde77575570bc71e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9292-a7ad9a01c7044b93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9517.00627dc51b02821c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9725.dcbb585652d8e9c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9761.a3ebf5c389c24ddc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9972.834d2b2b7d48f1ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9995-1a90486f5ae01546.js +0 -1
- package/apps/pwa/out/_next/static/chunks/a435ad95.577add051b4facb2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-83372d8b5863ebf7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d69256d7613c140a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-352c5e9ba3f9b858.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-69f1d725524201a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ad9181d84285e4ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-86feb08080261a2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-ffa15987e4756d03.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-11a3ab44ac327cc1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-6309b11c4264d24d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-8800472079612e87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-d387bf3f2301882a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-048f88d8c8658da6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6c14f9739b7f6880.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-2834f44f64e98d74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-83372d8b5863ebf7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-a13df6f88e824887.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-8a4397248754cf2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-daf0bd329360a336.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-f7ef1c28764cb476.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-61e74f28b9353dac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-8aaa6dedc4c10dfb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-294602ba649be829.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-5fa5f41ed3fce323.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-33bf667a5fb297bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-5ae3cbd6e5dba515.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-eb867d16ad6fdede.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1ab789fa68682f7e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6fd41b5b6ff13a71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fb3d5f7642c99fba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-70f705b2b5ed42ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-c9c93b358a7667b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1563c556b81c96ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ce89c20c45b3a673.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-423ae63d786f4ee9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-591a5378a4c4447c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-a250496b19a5824b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-c36a9277febc5911.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-83372d8b5863ebf7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a5de57edc6d7f942.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-16bdd4c9f40498df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-75e946e6e71cc6d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-9eb56166774eb256.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-1c5f9ef35dbb22c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-657ff9985e508498.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-22dc72499da68fb2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-094ad334e40f8169.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-8bcd379852ff6287.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-6b04413f280cd344.js +0 -1
- package/apps/pwa/out/_next/static/chunks/de70ab42-d28d47437208d458.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f800c5e3.46dbd7f2af8c3fce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f8bc19ad.47579f6d684b0760.js +0 -122
- package/apps/pwa/out/_next/static/chunks/framework-ca9ac4609fb9fed8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-0dd08d32d15a030f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-f0399d33955c4e01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-d42caca6f8ac2211.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-42e713c13aa41ca8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-8fbf8f61a377aa16.js +0 -1
- /package/apps/pwa/out/_next/static/{cIpv5nU9AycwYWZI9H589 → LSXfY0u9QtfDbejY0Ukf_}/_ssgManifest.js +0 -0
|
@@ -19,6 +19,10 @@ export interface TurnTypeaheadState {
|
|
|
19
19
|
* «짝지어» 떨어낸다 — 위치·문자열로 짝지으면 같은 발화가 두 번 들어간다(10-14 중복 수리).
|
|
20
20
|
*/
|
|
21
21
|
queuedPendingIds?: (string | null)[];
|
|
22
|
+
/** «지금 밀어 넣기»가 «다음 도구 경계 최우선»으로 떨어졌다(도는 도구가 취소 불가). 큐가 비거나 턴이 끝나면 지운다. */
|
|
23
|
+
steerPriority?: boolean;
|
|
24
|
+
/** 이번 턴에 도구 경계로 들어간 수 — 큐가 비었을 때 «✓ 넣음» 줄로 보인다. 턴이 끝나면 지운다. */
|
|
25
|
+
injectedCount?: number;
|
|
22
26
|
}
|
|
23
27
|
|
|
24
28
|
/** 큐 길이에 맞춘 id 짝(모자라면 null 로 채운다). 순수. */
|
|
@@ -89,16 +93,31 @@ export type TurnTypeaheadKeyResult = {
|
|
|
89
93
|
submissionDisposition?: 'immediate' | 'fifo';
|
|
90
94
|
/** 큐에서 «다른 길»로 빠진 항목의 레지스트리 id — 호출측이 레지스트리에서도 떨어낸다(되꺼내기). */
|
|
91
95
|
releasedPendingIds?: string[];
|
|
96
|
+
/** 빈 입력에서 Enter(대기 항목이 있을 때) = «지금 밀어 넣기» 요청. 판정·실행은 호출측의 책임이다. */
|
|
97
|
+
pushNowRequested?: boolean;
|
|
92
98
|
};
|
|
93
99
|
|
|
94
100
|
/** 등록소 소유의 관측용 표시 조회. 이름·문법·실행 정책은 이 순수 판정기에 두지 않는다. */
|
|
95
101
|
export type TurnTypeaheadImmediateSubmissionLookup = (text: string) => boolean;
|
|
96
102
|
|
|
103
|
+
/** 줄바꿈 키 — Shift+Enter · Alt+Enter · Ctrl+J(`input-control-key.ts` 와 같은 꼴). */
|
|
104
|
+
export function isTypeaheadNewlineKey(key: { name: string; ctrl?: boolean; alt?: boolean; shift?: boolean; meta?: boolean }): boolean {
|
|
105
|
+
if (key.name === 'enter') return !key.ctrl && !key.meta && (!!key.shift || !!key.alt);
|
|
106
|
+
return key.name === 'j' && !!key.ctrl && !key.alt && !key.shift && !key.meta;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** 에코·큐 행은 한 줄로 그린다 — 버퍼 속 줄바꿈은 `↵` 로 보여 준다(행을 깨지 않는다). */
|
|
110
|
+
function oneLine(text: string): string {
|
|
111
|
+
return text.replace(/\n/g, '↵');
|
|
112
|
+
}
|
|
113
|
+
|
|
97
114
|
/** 스트리밍 중 키 1개 판정(순수). mouse/비-press/수정키는 소유하지 않는다.
|
|
98
115
|
* - printable → buffer 누적
|
|
99
116
|
* - backspace → 마지막 코드포인트 제거(빈 버퍼면 미소유 — 기존 semantics 보존)
|
|
117
|
+
* - shift/alt+enter · ctrl+j → buffer 에 줄바꿈(빈 buffer 면 소유만)
|
|
100
118
|
* - enter → 비어 있지 않은 buffer를 FIFO 제출 큐에 넣고 다음 문장을 위한 buffer를 비운다
|
|
101
|
-
* -
|
|
119
|
+
* - 빈 buffer 에서 enter(대기 항목이 있을 때) → «지금 밀어 넣기» 요청(`pushNowRequested`)
|
|
120
|
+
* - ctrl+up → 대기 항목 «전부»를 입력 순서대로 buffer 앞으로 되꺼낸다(편집 가능한 것만 이 큐에 든다)
|
|
102
121
|
* - escape 등 나머지 → 미소유(턴 중단 등 기존 경로 그대로) */
|
|
103
122
|
export function applyTurnTypeaheadKey(
|
|
104
123
|
state: TurnTypeaheadState,
|
|
@@ -117,8 +136,20 @@ export function applyTurnTypeaheadKey(
|
|
|
117
136
|
return { state: { ...state, buffer: cps.join('') }, consumed: true, changed: true };
|
|
118
137
|
}
|
|
119
138
|
|
|
120
|
-
|
|
121
|
-
|
|
139
|
+
// ⭐ 턴 중에도 Shift+Enter(⊕ Alt+Enter · Ctrl+J)는 «줄바꿈»이다 — 유휴 입력창과 같은 계약.
|
|
140
|
+
// 종전엔 수식자를 안 보고 «제출»(FIFO 대기)로 떨어져, 도는 턴 위에 쓰던 여러 줄이 반토막으로 나갔다.
|
|
141
|
+
// 빈 버퍼의 줄바꿈은 소유만 하고 버퍼는 안 바꾼다(맨 앞 빈 줄을 만들지 않는다).
|
|
142
|
+
if (isTypeaheadNewlineKey(key)) {
|
|
143
|
+
if (!state.buffer) return { state, consumed: true, changed: false };
|
|
144
|
+
return { state: { ...state, buffer: `${state.buffer}\n` }, consumed: true, changed: true };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (key.name === 'enter' && !key.ctrl && !key.alt && !key.shift) {
|
|
148
|
+
if (!state.buffer.trim()) {
|
|
149
|
+
// ⭐ 「한 번 더 Enter = 지금」 — 큐가 비면 옛 계약 그대로 소유하지 않는다.
|
|
150
|
+
if (state.queuedSubmissions.length === 0) return { state, consumed: false, changed: false };
|
|
151
|
+
return { state, consumed: true, changed: false, pushNowRequested: true };
|
|
152
|
+
}
|
|
122
153
|
try {
|
|
123
154
|
if (state.buffer.startsWith('/') && isImmediateSubmission?.(state.buffer)) {
|
|
124
155
|
return {
|
|
@@ -147,18 +178,16 @@ export function applyTurnTypeaheadKey(
|
|
|
147
178
|
// ⛔ 정확한 조합만 소유한다 — 수식자를 덜 보면 `ctrl+shift+up` 같은 조합까지 삼켜
|
|
148
179
|
// 다른 층이 쓸 키를 조용히 먹는다.
|
|
149
180
|
if (key.name === 'up' && key.ctrl && !key.alt && !key.shift && !key.meta) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
181
|
+
if (state.queuedSubmissions.length === 0) return { state, consumed: false, changed: false };
|
|
182
|
+
// ⭐ 전부 꺼낸다(Claude Code 동형) — 한 건씩이면 여러 건을 고칠 때 순서가 뒤집힌다.
|
|
183
|
+
// 입력 순서를 지키고, 치던 초안은 맨 뒤에 둔다.
|
|
184
|
+
const recalled = [...state.queuedSubmissions, ...(state.buffer ? [state.buffer] : [])].join('\n');
|
|
185
|
+
const released = presentIds(turnTypeaheadPendingIds(state));
|
|
153
186
|
return {
|
|
154
|
-
state: {
|
|
155
|
-
buffer: state.buffer + recalled,
|
|
156
|
-
queuedSubmissions: state.queuedSubmissions.slice(0, -1),
|
|
157
|
-
...idsField(ids.slice(0, -1)),
|
|
158
|
-
},
|
|
187
|
+
state: { ...withoutIds(state), buffer: recalled, queuedSubmissions: [], steerPriority: undefined },
|
|
159
188
|
consumed: true,
|
|
160
189
|
changed: true,
|
|
161
|
-
...(
|
|
190
|
+
...(released.length > 0 ? { releasedPendingIds: released } : {}),
|
|
162
191
|
};
|
|
163
192
|
}
|
|
164
193
|
|
|
@@ -203,6 +232,18 @@ export function dequeueTurnTypeaheadHandoff(
|
|
|
203
232
|
return { handoff: { kind: 'prefill', text: state.buffer }, state: createTurnTypeaheadState() };
|
|
204
233
|
}
|
|
205
234
|
|
|
235
|
+
/** 턴 범위 표시(최우선·넣음 수)를 지운다 — 다음 턴으로 넘기지 않는다. 순수. */
|
|
236
|
+
function clearTurnScopedMarks(state: TurnTypeaheadState): TurnTypeaheadState {
|
|
237
|
+
if (state.steerPriority === undefined && state.injectedCount === undefined) return state;
|
|
238
|
+
const { steerPriority: _p, injectedCount: _n, ...rest } = state;
|
|
239
|
+
return rest;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** «지금 밀어 넣기»가 다음 경계 최우선으로 떨어졌음을 적는다. 레지스트리에 든 항목이 없으면 그대로. 순수. */
|
|
243
|
+
export function markTurnTypeaheadPriority(state: TurnTypeaheadState): TurnTypeaheadState {
|
|
244
|
+
return presentIds(turnTypeaheadPendingIds(state)).length > 0 ? { ...state, steerPriority: true } : state;
|
|
245
|
+
}
|
|
246
|
+
|
|
206
247
|
/** ⭐ 턴 종료 드레인 **한 걸음** — `src/dashboard/index.ts` 의 inner-loop 가 반복마다 이걸 부른다.
|
|
207
248
|
* ⛔ 종전엔 그 순서(dequeue → state 교체 → nextInitial 누적 → submit 이면 enter 주입)가
|
|
208
249
|
* `index.ts` 안에만 있어서, 테스트가 그 순서를 **베껴 모사**할 수밖에 없었다. 베낀 테스트는
|
|
@@ -223,6 +264,7 @@ export function drainTurnTypeaheadOnce(
|
|
|
223
264
|
*/
|
|
224
265
|
releasedPendingIds: string[];
|
|
225
266
|
} {
|
|
267
|
+
state = clearTurnScopedMarks(state);
|
|
226
268
|
if (opts?.interrupted && state.queuedSubmissions.length > 0) {
|
|
227
269
|
const restored = [...state.queuedSubmissions, ...(state.buffer ? [state.buffer] : [])].join('\n');
|
|
228
270
|
return {
|
|
@@ -308,6 +350,8 @@ export function drainedIntoTurn(
|
|
|
308
350
|
};
|
|
309
351
|
}
|
|
310
352
|
if (matched.length === 0) return { state: next, sentence: null, matched };
|
|
353
|
+
next = { ...next, injectedCount: (next.injectedCount ?? 0) + matched.length };
|
|
354
|
+
if (presentIds(turnTypeaheadPendingIds(next)).length === 0) delete next.steerPriority;
|
|
311
355
|
const count = matched.length;
|
|
312
356
|
const label = count === 1 ? '⏳ 턴 안 1건' : `⏳ 턴 안 ${count}건`;
|
|
313
357
|
const quoted = matched.map(text => `"${text}"`).join(' · ');
|
|
@@ -333,8 +377,9 @@ export function renderTurnTypeaheadEcho(
|
|
|
333
377
|
const count = state.queuedSubmissions.length;
|
|
334
378
|
const suffix = opts?.includeQueueSuffix && count > 0 ? ` ⏎ ${count}건 대기 · 턴 종료 시 전송` : '';
|
|
335
379
|
const budget = Math.max(8, width - 2 - [...suffix].length);
|
|
336
|
-
const
|
|
337
|
-
const
|
|
380
|
+
const buffer = oneLine(state.buffer);
|
|
381
|
+
const cps = [...buffer];
|
|
382
|
+
const shown = cps.length > budget ? cps.slice(cps.length - budget).join('') : buffer;
|
|
338
383
|
return `${shown}${suffix}`;
|
|
339
384
|
}
|
|
340
385
|
|
|
@@ -351,13 +396,23 @@ export function renderTurnTypeaheadQueueRow(
|
|
|
351
396
|
width: number,
|
|
352
397
|
): string | null {
|
|
353
398
|
const count = state.queuedSubmissions.length;
|
|
354
|
-
if (count === 0)
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
399
|
+
if (count === 0) {
|
|
400
|
+
// ✓ 넣음 — 도구 경계로 들어간 뒤 큐가 비었다(턴이 끝나면 지워진다).
|
|
401
|
+
const injected = state.injectedCount ?? 0;
|
|
402
|
+
return injected > 0 ? `✓ 넣음 ${injected}건 · 도는 턴에 이어서 반영` : null;
|
|
403
|
+
}
|
|
404
|
+
const head = oneLine(state.queuedSubmissions[0] ?? '');
|
|
405
|
+
// ⭐ 항목 상태를 보인다 — 레지스트리에 든 것은 다음 도구 경계에, 안 든 것(슬래시·세션 없음)은 응답 뒤에 나간다.
|
|
406
|
+
const steerable = presentIds(turnTypeaheadPendingIds(state)).length;
|
|
407
|
+
const waiting = count - steerable;
|
|
408
|
+
const parts: string[] = [];
|
|
409
|
+
if (steerable > 0) parts.push(`${state.steerPriority ? '⚡ 최우선 · 다음 도구 경계에 넣음' : '↳ 다음 도구 경계에 넣음'} ${steerable}건`);
|
|
410
|
+
if (waiting > 0) parts.push(`⏳ 대기(응답 뒤) ${waiting}건`);
|
|
411
|
+
const label = parts.join(' · ');
|
|
412
|
+
// 되꺼내기·밀어 넣기 키를 화면에 적는다 — 안내가 없어 대기 발화를 취소·수정할 길을 몰랐다(2026-09-26 베어 VM 실측 · UX 12).
|
|
413
|
+
const tail = ' · Ctrl+↑ 되꺼내기 · 빈 Enter 지금 밀어 넣기';
|
|
359
414
|
const budget = Math.max(8, width - [...label].length - [...tail].length - 5);
|
|
360
415
|
const cps = [...head];
|
|
361
|
-
const shown = cps.length > budget ? `${cps.slice(0, budget).join('')}…` :
|
|
416
|
+
const shown = cps.length > budget ? `${cps.slice(0, budget).join('')}…` : cps.join('');
|
|
362
417
|
return `${label} · "${shown}"${tail}`;
|
|
363
418
|
}
|
|
@@ -8,8 +8,10 @@ Arguments:
|
|
|
8
8
|
text Prompt text for the single-turn agent.
|
|
9
9
|
|
|
10
10
|
Options:
|
|
11
|
-
--new
|
|
12
|
-
--
|
|
11
|
+
--new Start a new session (the default since 0.2.31 — kept for compatibility)
|
|
12
|
+
--continue Continue the active session instead of starting a new one
|
|
13
|
+
--resume [id] Continue a session: the given id (or unique prefix), or the active session when no id is given. A word after --resume that is not session-id shaped (hex uuid) is read as the prompt, not the id.
|
|
14
|
+
--session <id> Continue an explicit session (id or unique prefix). Overrides --new, --continue and --resume.
|
|
13
15
|
--json Emit a single JSON line {sessionId, provider, model, reply, logPath, budget} instead of streaming text + ui.info trailer. Stable shape for LLM self-spawn.
|
|
14
16
|
--no-tools Disable the tool loop and fall back to text-only chat (for benchmarking / parity with `chat`).
|
|
15
17
|
-h, --help display help for command
|
package/src/cli/agent-cli.ts
CHANGED
|
@@ -5,7 +5,8 @@ import { handleOnboardingRefusal, needsOnboarding, runOnboarding } from '../onbo
|
|
|
5
5
|
import { runTurn, ensureCliSession, sessionBudget } from '../session/chat.js';
|
|
6
6
|
import { suggestProjectForFolder } from '../project/project-store.js';
|
|
7
7
|
import { NoLlmProviderAvailableError, noProviderAvailableMessage } from '../llm.js';
|
|
8
|
-
import { resolveSessionId, getActiveSessionId, setActiveSessionId } from '../session/index.js';
|
|
8
|
+
import { resolveSessionId, getActiveSessionId, setActiveSessionId, loadSession, listSessions } from '../session/index.js';
|
|
9
|
+
import { decideSessionStart, observeSessionStart, splitResumeArgument } from '../session/session-start.js';
|
|
9
10
|
import { getHarnessSpace } from '../harness/harness-space.js';
|
|
10
11
|
import { encodeDetachedProgressFrame } from '../harness/dispatch-detached.js';
|
|
11
12
|
import type { FeedbackEnvelope } from '../feedback/envelope.js';
|
|
@@ -65,12 +66,18 @@ export function registerAgentCommands(program: Command): void {
|
|
|
65
66
|
.command('agent')
|
|
66
67
|
.argument('[text...]', 'Prompt text for the single-turn agent.')
|
|
67
68
|
.description('Single-turn agent — same as `chat` but with the tool loop on by default (Read/Grep/Glob/ListDir/Edit/Write + Bash). Use this when the LLM needs to inspect files / run commands / debug itself.')
|
|
68
|
-
.option('--new', '
|
|
69
|
-
.option('--
|
|
69
|
+
.option('--new', 'Start a new session (the default since 0.2.31 — kept for compatibility)')
|
|
70
|
+
.option('--continue', 'Continue the active session instead of starting a new one')
|
|
71
|
+
.option('--resume [id]', 'Continue a session: the given id (or unique prefix), or the active session when no id is given. A word after --resume that is not session-id shaped (hex uuid) is read as the prompt, not the id.')
|
|
72
|
+
.option('--session <id>', 'Continue an explicit session (id or unique prefix). Overrides --new, --continue and --resume.')
|
|
70
73
|
.option('--json', 'Emit a single JSON line {sessionId, provider, model, reply, logPath, budget} instead of streaming text + ui.info trailer. Stable shape for LLM self-spawn.')
|
|
71
74
|
.option('--no-tools', 'Disable the tool loop and fall back to text-only chat (for benchmarking / parity with `chat`).')
|
|
72
|
-
.action(async (
|
|
73
|
-
|
|
75
|
+
.action(async (rawParts: string[], opts: { new?: boolean; continue?: boolean; resume?: string | boolean; session?: string; json?: boolean; tools?: boolean }) => {
|
|
76
|
+
// TUI-H8-FOLLOW ② — `agent --resume "질문"` 에서 Commander 가 질문 첫 낱말을 세션 id 로 먹지 않게.
|
|
77
|
+
const split = splitResumeArgument(opts.resume, rawParts ?? [], 'agent', process.argv.slice(2));
|
|
78
|
+
opts.resume = split.resume;
|
|
79
|
+
const parts = split.parts;
|
|
80
|
+
if (parts.length === 0) {
|
|
74
81
|
console.error("error: missing required argument 'text'");
|
|
75
82
|
process.exit(1);
|
|
76
83
|
}
|
|
@@ -105,10 +112,12 @@ export function registerAgentCommands(program: Command): void {
|
|
|
105
112
|
await runChatTurnCli({
|
|
106
113
|
cfg: refreshed,
|
|
107
114
|
userText: parts.join(' '),
|
|
108
|
-
explicitSessionId: opts.session,
|
|
109
|
-
|
|
115
|
+
explicitSessionId: opts.session ?? (typeof opts.resume === 'string' ? opts.resume : undefined),
|
|
116
|
+
// 대표 #73 — 인자 없음 = 새 세션. 이어하기는 `--continue`/`--resume` 명시일 때만.
|
|
117
|
+
reuseActive: opts.continue === true || opts.resume === true,
|
|
110
118
|
forceNew: opts.new === true,
|
|
111
119
|
json: opts.json === true,
|
|
120
|
+
surface: 'agent',
|
|
112
121
|
// commander stores --no-tools as `tools: false`, plain absence as undefined → default true here.
|
|
113
122
|
enableTools: opts.tools !== false,
|
|
114
123
|
});
|
|
@@ -385,11 +394,13 @@ tierCmd
|
|
|
385
394
|
|
|
386
395
|
/** Single-turn CLI driver shared by `elanous ask` and `elanous chat`.
|
|
387
396
|
*
|
|
388
|
-
* Resolution order for sessionId:
|
|
389
|
-
* 1. opts.explicitSessionId (`--session
|
|
397
|
+
* Resolution order for sessionId (`decideSessionStart` · 대표 #73 기본 = 새 세션):
|
|
398
|
+
* 1. opts.explicitSessionId (`--session`/`--resume <id>`) — wins, validates against
|
|
390
399
|
* resolveSessionId so a 6-char prefix works
|
|
391
|
-
* 2.
|
|
392
|
-
* 3.
|
|
400
|
+
* 2. fresh session — when forceNew
|
|
401
|
+
* 3. active session — only when reuseActive (`--continue`/`--resume`)
|
|
402
|
+
* 4. fresh session — otherwise (the default)
|
|
403
|
+
* Every decision emits `session`/`start` {surface, origin, reason}.
|
|
393
404
|
*
|
|
394
405
|
* When `json` is true, the function suppresses the streaming text +
|
|
395
406
|
* ui.info trailer and instead emits exactly ONE JSON line on stdout
|
|
@@ -402,9 +413,12 @@ export async function runChatTurnCli(opts: {
|
|
|
402
413
|
cfg: ReturnType<typeof reloadUserConfig>;
|
|
403
414
|
userText: string;
|
|
404
415
|
explicitSessionId: string | undefined;
|
|
416
|
+
/** 활성 세션 이어하기를 «명시로» 요청했나(`--continue`/`--resume`). 기본 false = 새 세션. */
|
|
405
417
|
reuseActive: boolean;
|
|
406
418
|
forceNew: boolean;
|
|
407
419
|
json: boolean;
|
|
420
|
+
/** 관측용 표면 이름(`session`/`start`). 기본 'chat'. */
|
|
421
|
+
surface?: 'chat' | 'agent' | 'ask';
|
|
408
422
|
/** When true, build a CORE-native + Bash tool catalog and route
|
|
409
423
|
* through streamLLMWithTools so the LLM can drive multi-turn
|
|
410
424
|
* exploration (file reads, grep, shell). Default false — CLI
|
|
@@ -429,11 +443,25 @@ export async function runChatTurnCli(opts: {
|
|
|
429
443
|
process.exit(1);
|
|
430
444
|
}
|
|
431
445
|
resolvedSessionIdHint = id;
|
|
432
|
-
} else if (opts.reuseActive && !opts.forceNew) {
|
|
433
|
-
resolvedSessionIdHint = getActiveSessionId() ?? undefined;
|
|
434
446
|
}
|
|
447
|
+
const startDecision = decideSessionStart({
|
|
448
|
+
...(resolvedSessionIdHint ? { explicitSessionId: resolvedSessionIdHint } : {}),
|
|
449
|
+
continueActive: opts.reuseActive,
|
|
450
|
+
forceNew: opts.forceNew,
|
|
451
|
+
activeSessionId: () => getActiveSessionId(),
|
|
452
|
+
// TUI-H8-FOLLOW ① — 활성 표지가 사라진 세션이면 최신 세션으로.
|
|
453
|
+
sessionExists: (id) => loadSession(id) !== null,
|
|
454
|
+
latestSessionId: () => listSessions({ limit: 1 })[0]?.id ?? null,
|
|
455
|
+
});
|
|
456
|
+
resolvedSessionIdHint = startDecision.sessionIdHint;
|
|
435
457
|
const session = ensureCliSession(opts.cfg, resolvedSessionIdHint);
|
|
436
458
|
setActiveSessionId(session.id);
|
|
459
|
+
observeSessionStart({
|
|
460
|
+
surface: opts.surface ?? 'chat',
|
|
461
|
+
origin: resolvedSessionIdHint && session.id === resolvedSessionIdHint ? startDecision.origin : 'new',
|
|
462
|
+
reason: resolvedSessionIdHint && session.id !== resolvedSessionIdHint ? 'resume-target-missing' : startDecision.reason,
|
|
463
|
+
sessionId: session.id,
|
|
464
|
+
});
|
|
437
465
|
if (!opts.json && (!resolvedSessionIdHint || session.id !== resolvedSessionIdHint)) {
|
|
438
466
|
try {
|
|
439
467
|
const project = suggestProjectForFolder(process.cwd());
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// ── CFG-STORE2 · config 감사 이력 첫 칸 (0.2.29 · 2026-10-14) ──
|
|
2
|
+
//
|
|
3
|
+
// RFC-universe-by-house-not-tree-and-config-store-2026-10-06 §2 — 겹 저장소의 첫 칸은 «감사 이력».
|
|
4
|
+
// CFG-STORE1(config-drift.ts · 읽기 전용 드리프트) 위에 «쓰기» 축 하나를 더한다:
|
|
5
|
+
// `config set` · `config unset` 이 저장에 성공하면 바꾼 키·이전 값·다음 값·by·why 를 한 행으로 남긴다.
|
|
6
|
+
//
|
|
7
|
+
// ⛔ 불변식
|
|
8
|
+
// • 비밀은 «저장 전에» 가린다 — config-drift.ts 의 가림 원형(isSecretPath·isSecretValue·MASK·maskDeep)을
|
|
9
|
+
// 그대로 재사용한다: 비밀 경로(마디 하나라도 token/secret/key/…) ⊕ 비밀 모양 값(웹훅·토큰 접두·URL userinfo)
|
|
10
|
+
// ⊕ 객체 속 비밀 키(botToken 같은 자리) → '<masked>'. config-drift.ts 는 손대지 않는다(읽기 전용 그대로).
|
|
11
|
+
// • 감사 기록은 명령의 부속이다 — 호출부(src/index.ts config set/unset)가 fail-open 으로 감싼다(실패해도 경고만).
|
|
12
|
+
// • by 는 자리(ELANOUS_TRACK) ⊕ 런 id 환경 변수에서 푼다 — 명시 by > ELANOUS_TRACK > 런 id > 'cli'.
|
|
13
|
+
// • 읽기(readConfigHistory)는 없는 db 파일을 만들지 않는다.
|
|
14
|
+
|
|
15
|
+
import { Database } from 'bun:sqlite';
|
|
16
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
17
|
+
import { dirname, join } from 'node:path';
|
|
18
|
+
import { getElanousConfigDir } from '../elanous-config-dir.js';
|
|
19
|
+
import { isSecretPath, isSecretValue, maskDeep, MASK } from './config-drift.js';
|
|
20
|
+
|
|
21
|
+
// CFG-STORE1 가림 자(MASK) — 테스트 계약(config-audit.test.ts)이 이 경로로 소비한다.
|
|
22
|
+
export { MASK };
|
|
23
|
+
|
|
24
|
+
/** 한 번의 config 변경 — prev/next 는 저장 «전» 값과 저장 «후» 값(undefined = 그 자리에 키가 없다). */
|
|
25
|
+
export interface ConfigChange {
|
|
26
|
+
key: string;
|
|
27
|
+
prev?: unknown;
|
|
28
|
+
next?: unknown;
|
|
29
|
+
by?: string;
|
|
30
|
+
why?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** config_changes 표의 한 행 — prev/next 는 가려 직렬화한 값(null = 그 자리에 값이 없었다). */
|
|
34
|
+
export interface ConfigChangeRow {
|
|
35
|
+
at: string;
|
|
36
|
+
key: string;
|
|
37
|
+
prev: string | null;
|
|
38
|
+
next: string | null;
|
|
39
|
+
by: string;
|
|
40
|
+
why: string | null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** 감사 db 기본 자리 — 활성 config 뿌리(~/.elanous · --config-dir 격리 존중) 바로 옆 config-changes.db. */
|
|
44
|
+
function configAuditDbPath(dbPath?: string): string {
|
|
45
|
+
return dbPath ?? join(getElanousConfigDir(), 'config-changes.db');
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** by 해석 — 명시 by > 자리(ELANOUS_TRACK) > 런 id 환경 변수 > 'cli'. */
|
|
49
|
+
function resolveConfigChangeBy(by?: string): string {
|
|
50
|
+
const explicit = by?.trim();
|
|
51
|
+
if (explicit) return explicit;
|
|
52
|
+
const track = process.env.ELANOUS_TRACK?.trim();
|
|
53
|
+
if (track) return track;
|
|
54
|
+
for (const name of ['ELANOUS_RUN_ID', 'HARNESS_RUN_ID', 'RUN_ID']) {
|
|
55
|
+
const runId = process.env[name]?.trim();
|
|
56
|
+
if (runId) return runId;
|
|
57
|
+
}
|
|
58
|
+
return 'cli';
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** 저장용 값 — undefined → SQL NULL · 비밀(경로 마디 ⊕ 값 모양) → MASK · 나머지는 maskDeep 후 JSON 직렬화. */
|
|
62
|
+
function serializeConfigValue(key: string, value: unknown): string | null {
|
|
63
|
+
if (value === undefined) return null;
|
|
64
|
+
if (isSecretPath(key) || isSecretValue(value)) return MASK;
|
|
65
|
+
return JSON.stringify(maskDeep(value)) ?? 'null';
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Anonymous SQLite memory databases are private to each connection. Keep one
|
|
69
|
+
// connection for this process so record/read share the same audit history.
|
|
70
|
+
// File-backed stores keep their existing open/close-per-call lifetime.
|
|
71
|
+
let memoryDb: Database | undefined;
|
|
72
|
+
|
|
73
|
+
function openConfigChangesDb(dbPath: string): Database {
|
|
74
|
+
if (dbPath !== ':memory:') mkdirSync(dirname(dbPath), { recursive: true });
|
|
75
|
+
const db = dbPath === ':memory:'
|
|
76
|
+
? (memoryDb ??= new Database(':memory:'))
|
|
77
|
+
: new Database(dbPath);
|
|
78
|
+
db.exec(`CREATE TABLE IF NOT EXISTS config_changes (
|
|
79
|
+
at TEXT NOT NULL,
|
|
80
|
+
key TEXT NOT NULL,
|
|
81
|
+
prev TEXT,
|
|
82
|
+
next TEXT,
|
|
83
|
+
by TEXT NOT NULL,
|
|
84
|
+
why TEXT
|
|
85
|
+
)`);
|
|
86
|
+
db.exec('CREATE INDEX IF NOT EXISTS config_changes_key_at ON config_changes(key, at)');
|
|
87
|
+
return db;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** 한 번의 config 변경을 감사 이력에 «한 행»으로 남긴다. 비밀 값은 가려 쓴다. */
|
|
91
|
+
export function recordConfigChange(change: ConfigChange, dbPath?: string): ConfigChangeRow {
|
|
92
|
+
const path = configAuditDbPath(dbPath);
|
|
93
|
+
const db = openConfigChangesDb(path);
|
|
94
|
+
try {
|
|
95
|
+
const row: ConfigChangeRow = {
|
|
96
|
+
at: new Date().toISOString(),
|
|
97
|
+
key: change.key,
|
|
98
|
+
prev: serializeConfigValue(change.key, change.prev),
|
|
99
|
+
next: serializeConfigValue(change.key, change.next),
|
|
100
|
+
by: resolveConfigChangeBy(change.by),
|
|
101
|
+
why: change.why?.trim() ? change.why.trim() : null,
|
|
102
|
+
};
|
|
103
|
+
db.run(
|
|
104
|
+
'INSERT INTO config_changes (at, key, prev, next, by, why) VALUES (?, ?, ?, ?, ?, ?)',
|
|
105
|
+
[row.at, row.key, row.prev, row.next, row.by, row.why],
|
|
106
|
+
);
|
|
107
|
+
return row;
|
|
108
|
+
} finally {
|
|
109
|
+
if (path !== ':memory:') db.close();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** 한 키의 감사 이력 — 시간 오름차순. db 파일이 없으면 빈 배열(읽기가 파일을 만들지 않는다). */
|
|
114
|
+
export function readConfigHistory(key: string, dbPath?: string): ConfigChangeRow[] {
|
|
115
|
+
const path = configAuditDbPath(dbPath);
|
|
116
|
+
if (path !== ':memory:' && !existsSync(path)) return [];
|
|
117
|
+
const db = path === ':memory:' ? openConfigChangesDb(path) : new Database(path, { readonly: true });
|
|
118
|
+
try {
|
|
119
|
+
return db.query('SELECT at, key, prev, next, by, why FROM config_changes WHERE key = ? ORDER BY at ASC, rowid ASC').all(key) as ConfigChangeRow[];
|
|
120
|
+
} finally {
|
|
121
|
+
if (path !== ':memory:') db.close();
|
|
122
|
+
}
|
|
123
|
+
}
|
package/src/cli/decisions-cli.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { getUserConfig } from '../user-config.js';
|
|
|
11
11
|
import { projectDecisionsToLinear } from '../decisions/decision-linear-projection.js';
|
|
12
12
|
import { DecisionLedger, importDecisionMarkdown, type DecisionCategory, type DecisionLedgerOptions, type DecisionOption, type DecisionTrack, type DecisionEntry, type Seat, type SeatDecisionRecord } from '../decisions/decision-ledger.js';
|
|
13
13
|
import { formatProactMeter, readProactMeter } from '../decisions/proact-meter.js';
|
|
14
|
+
import { CROWN_MARK, CROWN_THRESHOLD_CATEGORIES, CONSENSUS_CATEGORIES, ConsensusEngine, MAX_REVIEW_ROUND_TRIPS, categoryLabel, representativeLabel, type ConsensusCategory, type ConsensusRepresentative, type CrownCard, type ProposalCard } from '../loops/consensus.js';
|
|
14
15
|
import { writeStdoutFully } from './stdout-flush.js';
|
|
15
16
|
|
|
16
17
|
const repeat = (value: string, values: string[]) => [...values, value];
|
|
@@ -62,6 +63,14 @@ export function formatSeatDecisionRow(e: SeatDecisionRecord): string {
|
|
|
62
63
|
return `${e.id} · 결정: ${e.decidedAt ? kst(e.decidedAt) : '시각 미상'} · 기록: ${e.recordedAt ? kst(e.recordedAt) : '시각 미상'} · ${e.seat} 결정 · 사후 보고 · ${e.title} → ${e.decision} · 위임: ${e.delegation}${e.refs?.length ? ` · 참조: ${e.refs.join(' · ')}` : ''}`;
|
|
63
64
|
}
|
|
64
65
|
|
|
66
|
+
export function formatProposalRow(p: ProposalCard): string {
|
|
67
|
+
return `${p.id} · ${categoryLabel(p.category)} · ${p.title} · 사실 ${p.factId} · 비용 ${p.cost} · 되돌리기 ${p.undo}${p.thresholds.length ? ` · ${CROWN_MARK} 몫 ${p.thresholds.join('|')}` : ''} · 제안 ${representativeLabel(p.proposedBy)} · ${kst(p.proposedAt)} · 왕복 ${p.roundTrips}/${MAX_REVIEW_ROUND_TRIPS} · ${p.status === 'open' ? '검토 중' : p.status === 'agreed' ? '합의·실행·기록' : '불합의'}`;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function formatCrownCardRow(c: CrownCard): string {
|
|
71
|
+
return `${c.id} · ${CROWN_MARK} ${c.reason === 'disagreement' ? '불합의' : '임계 승인'} · 제안 ${c.proposalId} · 조율자 주장: ${c.coordinatorClaim} | 수호자 주장: ${c.guardianClaim}${c.decisionId ? ` · 결정 카드 ${c.decisionId}` : ''}`;
|
|
72
|
+
}
|
|
73
|
+
|
|
65
74
|
export function registerDecisionsCommands(program: Command, config: DecisionLedgerOptions = {}, out: Pick<Console, 'log'> = console, hqDeps: HqDeps = {}): void {
|
|
66
75
|
const noXcheck = new Option('--no-xcheck <이유>', '교차 확인 생략 이유');
|
|
67
76
|
// This flag takes a reason, not Commander's negated boolean default.
|
|
@@ -176,14 +185,24 @@ export function registerDecisionsCommands(program: Command, config: DecisionLedg
|
|
|
176
185
|
if (!o.auto && (o.delegation || o.track || o.agent)) throw new Error('delegation/track/agent require --auto');
|
|
177
186
|
const by = o.auto ? { kind: 'auto' as const, agent: agent(o.agent), delegation: o.delegation!, ...(o.track ? { track: o.track } : {}) } : { kind: 'human' as const };
|
|
178
187
|
if (!mayWrite('decide', o.hqOverride)) return;
|
|
179
|
-
const { entry, delivery } = new DecisionLedger(config).decideWithDelivery(id, choice, by, o.note);
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
188
|
+
const { entry, delivery, notice } = new DecisionLedger(config).decideWithDelivery(id, choice, by, o.note);
|
|
189
|
+
const failures = [
|
|
190
|
+
...(delivery && !delivery.ok ? [`⚠ 답 전달 실패(${delivery.questionId} · ${delivery.reason}) — 결정은 기록됐다 · 다시: elanous decisions retry-answer ${entry.id}`] : []),
|
|
191
|
+
...(notice.status === 'failed' ? [`⚠ 자리 우편 실패(${notice.seat} · ${notice.reason}) — 결정은 기록됐다 · 다시: elanous decisions retry-notify ${entry.id}`] : []),
|
|
192
|
+
];
|
|
193
|
+
if (failures.length) {
|
|
183
194
|
process.exitCode = 3;
|
|
184
|
-
return emit({ ...entry, delivery }, o.json, `결정: ${formatDecisionDetail(entry)}\n${
|
|
195
|
+
return emit({ ...entry, ...(delivery ? { delivery } : {}), notice }, o.json, `결정: ${formatDecisionDetail(entry)}\n${failures.join('\n')}`);
|
|
185
196
|
}
|
|
186
|
-
|
|
197
|
+
const sent = notice.status === 'sent' ? `\n자리 우편: ${notice.seat} #${notice.messageId}` : '';
|
|
198
|
+
return emit({ ...entry, ...(delivery ? { delivery } : {}), notice }, o.json, `결정: ${formatDecisionDetail(entry)}${sent}`);
|
|
199
|
+
}));
|
|
200
|
+
root.command('retry-notify <id>').description('기록된 결정의 올린 자리 우편만 중복 없이 재시도한다').option('--json').option('--hq-override')
|
|
201
|
+
.action((id: string, o: { json?: boolean; hqOverride?: boolean }) => fail(() => {
|
|
202
|
+
if (!mayWrite('retry-notify', o.hqOverride)) return;
|
|
203
|
+
const notice = new DecisionLedger(config).retryNotice(id);
|
|
204
|
+
if (notice.status === 'failed') process.exitCode = 3;
|
|
205
|
+
return emit(notice, o.json, notice.status === 'sent' ? `자리 우편: ${notice.seat} #${notice.messageId}` : notice.status === 'skipped' ? '올린 자리 없음 — 우편 대상 없음' : `⚠ 자리 우편 실패(${notice.seat} · ${notice.reason})`);
|
|
187
206
|
}));
|
|
188
207
|
root.command('retry-answer <id>').description('기록된 결정의 대기 질문 답 전달만 재시도한다').option('--json').option('--hq-override')
|
|
189
208
|
.action((id: string, o: { json?: boolean; hqOverride?: boolean }) => fail(() => {
|
|
@@ -209,4 +228,59 @@ export function registerDecisionsCommands(program: Command, config: DecisionLedg
|
|
|
209
228
|
if (result.unread.length) process.exitCode = 1;
|
|
210
229
|
return emit(result, o.json, `가져옴 ${result.imported.length} · 기존 ${result.existing.length} · 불완전 ${result.incomplete.length} · 못 읽음 ${result.unread.length}${result.incomplete.length ? `\n${result.incomplete.join('\n')}` : ''}${result.unread.length ? `\n${result.unread.join('\n')}` : ''}`);
|
|
211
230
|
}));
|
|
231
|
+
const consensusRoot = root.command('consensus').description('두 대표 합의 — 조율자(일의 흐름)·수호자(몸)의 다섯 범주는 «둘의 합의» 뒤에 실행');
|
|
232
|
+
const consensusEngine = () => new ConsensusEngine({ stateDir: config.stateDir, now: config.now, resolveVersion: config.resolveVersion });
|
|
233
|
+
consensusRoot.command('propose').description('제안 카드를 올린다 — 사실 id·비용·되돌리기')
|
|
234
|
+
.requiredOption('--by <representative>', '제안 대표 (coordinator|guardian)')
|
|
235
|
+
.requiredOption('--category <category>', `합의 범주 (${CONSENSUS_CATEGORIES.join('|')})`)
|
|
236
|
+
.requiredOption('--title <text>').requiredOption('--fact-id <id>', '사실 id')
|
|
237
|
+
.requiredOption('--cost <text>', '비용').requiredOption('--undo <text>', '되돌리기')
|
|
238
|
+
.option('--threshold <category>', `${CROWN_MARK} 몫 임계 범주 (반복: ${CROWN_THRESHOLD_CATEGORIES.join('|')})`, repeat, [])
|
|
239
|
+
.option('--provider <name>', 'LLM 제공자 표식 — 가능하면 상대와 다른 제공자 (메아리 방지)')
|
|
240
|
+
.option('--json').option('--hq-override')
|
|
241
|
+
.action((o: { by: string; category: string; title: string; factId: string; cost: string; undo: string; threshold: string[]; provider?: string; json?: boolean; hqOverride?: boolean }) => fail(() => {
|
|
242
|
+
if (!mayWrite('consensus propose', o.hqOverride)) return;
|
|
243
|
+
const proposal = consensusEngine().propose({
|
|
244
|
+
by: o.by as ConsensusRepresentative, category: o.category as ConsensusCategory, title: o.title, factId: o.factId, cost: o.cost, undo: o.undo,
|
|
245
|
+
thresholds: o.threshold.map(threshold => threshold as DecisionCategory), provider: o.provider,
|
|
246
|
+
});
|
|
247
|
+
return emit(proposal, o.json, `제안: ${formatProposalRow(proposal)}`);
|
|
248
|
+
}));
|
|
249
|
+
consensusRoot.command('review <id>').description('상대 검토 왕복을 남긴다 — 최대 2왕복, 마지막 왕복은 결론으로')
|
|
250
|
+
.requiredOption('--by <representative>', '검토 대표 — 제안한 대표의 상대 (coordinator|guardian)')
|
|
251
|
+
.requiredOption('--claim <text>', '검토 주장')
|
|
252
|
+
.option('--provider <name>', 'LLM 제공자 표식 (메아리 방지)')
|
|
253
|
+
.option('--json').option('--hq-override')
|
|
254
|
+
.action((id: string, o: { by: string; claim: string; provider?: string; json?: boolean; hqOverride?: boolean }) => fail(() => {
|
|
255
|
+
if (!mayWrite('consensus review', o.hqOverride)) return;
|
|
256
|
+
const proposal = consensusEngine().review(id, { by: o.by as ConsensusRepresentative, claim: o.claim, provider: o.provider });
|
|
257
|
+
return emit(proposal, o.json, `검토 ${proposal.roundTrips}/${MAX_REVIEW_ROUND_TRIPS}왕복: ${formatProposalRow(proposal)}`);
|
|
258
|
+
}));
|
|
259
|
+
consensusRoot.command('agree <id>').description(`상대 대표의 합의 — 실행·합의 원장 기록 (임계 범주면 ${CROWN_MARK} 카드도 함께)`)
|
|
260
|
+
.requiredOption('--by <representative>', '합의 대표 — 제안한 대표의 상대 (coordinator|guardian)')
|
|
261
|
+
.option('--claim <text>', '합의 주장 (생략 시 제안대로 실행)')
|
|
262
|
+
.option('--provider <name>', 'LLM 제공자 표식 (메아리 방지)')
|
|
263
|
+
.option('--json').option('--hq-override')
|
|
264
|
+
.action((id: string, o: { by: string; claim?: string; provider?: string; json?: boolean; hqOverride?: boolean }) => fail(() => {
|
|
265
|
+
if (!mayWrite('consensus agree', o.hqOverride)) return;
|
|
266
|
+
const { proposal, crownCard } = consensusEngine().agree(id, { by: o.by as ConsensusRepresentative, claim: o.claim, provider: o.provider });
|
|
267
|
+
return emit({ proposal, ...(crownCard ? { crownCard } : {}) }, o.json,
|
|
268
|
+
`합의: ${formatProposalRow(proposal)}${crownCard ? `\n${CROWN_MARK} 카드: ${formatCrownCardRow(crownCard)}` : ''}`);
|
|
269
|
+
}));
|
|
270
|
+
consensusRoot.command('disagree <id>').description(`상대 대표의 불합의 — 양쪽 주장 나란히 ${CROWN_MARK} 결정 카드`)
|
|
271
|
+
.requiredOption('--by <representative>', '불합의 대표 — 제안한 대표의 상대 (coordinator|guardian)')
|
|
272
|
+
.requiredOption('--claim <text>', `불합의 주장 — ${CROWN_MARK} 카드에 나란히 실린다`)
|
|
273
|
+
.option('--provider <name>', 'LLM 제공자 표식 (메아리 방지)')
|
|
274
|
+
.option('--json').option('--hq-override')
|
|
275
|
+
.action((id: string, o: { by: string; claim: string; provider?: string; json?: boolean; hqOverride?: boolean }) => fail(() => {
|
|
276
|
+
if (!mayWrite('consensus disagree', o.hqOverride)) return;
|
|
277
|
+
const { proposal, crownCard } = consensusEngine().disagree(id, { by: o.by as ConsensusRepresentative, claim: o.claim, provider: o.provider });
|
|
278
|
+
return emit({ proposal, crownCard }, o.json, `불합의: ${formatProposalRow(proposal)}\n${CROWN_MARK} 카드: ${formatCrownCardRow(crownCard)}`);
|
|
279
|
+
}));
|
|
280
|
+
consensusRoot.command('crown').description(`${CROWN_MARK} 결정 카드 목록 — 불합의·임계 범주만 만든다`)
|
|
281
|
+
.option('--json')
|
|
282
|
+
.action((o: { json?: boolean }) => fail(() => {
|
|
283
|
+
const cards = consensusEngine().crownCards();
|
|
284
|
+
return emit(cards, o.json, cards.length ? cards.map(formatCrownCardRow).join('\n') : `${CROWN_MARK} 결정 카드 0건`);
|
|
285
|
+
}));
|
|
212
286
|
}
|
|
@@ -131,6 +131,7 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
131
131
|
"base.stale-local",
|
|
132
132
|
"baseline-invalidate",
|
|
133
133
|
"baseline-reuse",
|
|
134
|
+
"batch-remaining-skipped",
|
|
134
135
|
"begin",
|
|
135
136
|
"bind",
|
|
136
137
|
"blocked-accepted",
|
|
@@ -705,6 +706,7 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
705
706
|
"initialize",
|
|
706
707
|
"initialized",
|
|
707
708
|
"inject-blocked",
|
|
709
|
+
"injected-key-stream-delivered",
|
|
708
710
|
"input-loop-enter",
|
|
709
711
|
"input-outcome",
|
|
710
712
|
"input.miss",
|
|
@@ -817,6 +819,7 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
817
819
|
"merge-safety-tsc",
|
|
818
820
|
"merge.gh",
|
|
819
821
|
"merged",
|
|
822
|
+
"mirror-seed-skipped",
|
|
820
823
|
"missing-ctrl",
|
|
821
824
|
"missing-shift",
|
|
822
825
|
"missing-widget-definition",
|
|
@@ -1233,6 +1236,7 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
1233
1236
|
"select",
|
|
1234
1237
|
"selected",
|
|
1235
1238
|
"selection",
|
|
1239
|
+
"selection-timed",
|
|
1236
1240
|
"self-orchestrate-exposure",
|
|
1237
1241
|
"self-turn",
|
|
1238
1242
|
"send",
|
|
@@ -1339,6 +1343,7 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
1339
1343
|
"split-check",
|
|
1340
1344
|
"stage-enter",
|
|
1341
1345
|
"stage.route",
|
|
1346
|
+
"stages",
|
|
1342
1347
|
"start",
|
|
1343
1348
|
"start.controller.refused",
|
|
1344
1349
|
"start.enter",
|
|
@@ -1407,6 +1412,7 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
1407
1412
|
"sweep",
|
|
1408
1413
|
"swept",
|
|
1409
1414
|
"switch",
|
|
1415
|
+
"switch-decision",
|
|
1410
1416
|
"switch-off",
|
|
1411
1417
|
"sync",
|
|
1412
1418
|
"syncLogWidgetState",
|
|
@@ -1499,6 +1505,7 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
1499
1505
|
"tool-loop.repair-phase.codex-grace-burned",
|
|
1500
1506
|
"tool-loop.repair-phase.codex-immediate-stop",
|
|
1501
1507
|
"tool-loop.search-only-streak-blocked",
|
|
1508
|
+
"tool-loop.steered-rejection-not-failure",
|
|
1502
1509
|
"tool-loop.synthesis-ignored.hard-stop",
|
|
1503
1510
|
"tool-loop.tool-name.invalid",
|
|
1504
1511
|
"tool-loop.tool-name.repaired",
|