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
package/src/cli/seat-cli.ts
CHANGED
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
|
-
import { existsSync, lstatSync, readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import { existsSync, lstatSync, readFileSync, realpathSync, statSync } from 'node:fs';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { dirname, join, relative, sep } from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
5
6
|
import { redactSecretText } from '../debug/log.js';
|
|
6
7
|
import { defaultMsgStorePath, readUnreadCount } from '../msg/msg-store.js';
|
|
8
|
+
import { parseKnowhowItems, splitKnowhow } from '../seat-loop/seat-knowhow.js';
|
|
7
9
|
|
|
8
10
|
export const SEAT_ROLES = ['OP', 'TC', 'MK', 'UX'] as const;
|
|
9
11
|
export type SeatRole = typeof SEAT_ROLES[number];
|
|
12
|
+
export const SEAT_AGENTS = ['codex', 'elanous', 'claude'] as const;
|
|
13
|
+
export type SeatAgent = typeof SEAT_AGENTS[number];
|
|
14
|
+
export const SEAT_QUICKSTART_MANUAL = join('docs', 'manual', 'MANUAL-seat-agent-quickstart-2026-10-12.md');
|
|
15
|
+
export const SEAT_TRUST_LADDER = '신뢰 사다리: 지시 > 코드 > 문서 > 기억 — 어긋나면 앞이 이긴다';
|
|
16
|
+
export const SEAT_TACIT_TOP_N = 5;
|
|
10
17
|
|
|
11
18
|
const MAX_FIELD = 160;
|
|
12
19
|
const MAX_ROWS = 12;
|
|
@@ -107,11 +114,138 @@ export function collectSeatBootSections(seat: string, options: { home: string; m
|
|
|
107
114
|
return { sections, unread };
|
|
108
115
|
}
|
|
109
116
|
|
|
110
|
-
|
|
117
|
+
/** 표 줄을 칸으로 — 백틱 안의 `|`(예: `<pass|fail>`)는 칸 경계가 아니다. */
|
|
118
|
+
const cells = (line: string): string[] => (line.replace(/^\s*\|/, '').replace(/\|\s*$/, '').match(/(?:`[^`]*`|[^|`])+|(?<=\|)(?=\|)/g) ?? []).map(cell => cell.trim());
|
|
119
|
+
const backticked = (text: string): string[] => [...text.matchAll(/`([^`]+)`/g)].map(match => match[1]!);
|
|
120
|
+
|
|
121
|
+
/** L1 — 빠른 길 매뉴얼의 «무엇을 하려면 → 명령» 표를 고른 에이전트용 한 줄씩으로 접는다. ⚠️ 주석은 다른 에이전트만 이름 대면 뺀다. */
|
|
122
|
+
export function assembleSeatQuickPath(manual: string, agent: SeatAgent): string[] {
|
|
123
|
+
const lines = manual.split(/\r?\n/);
|
|
124
|
+
const start = lines.findIndex(line => /^##\s.*무엇.*명령/.test(line));
|
|
125
|
+
if (start < 0) return [];
|
|
126
|
+
const rows: string[] = [];
|
|
127
|
+
for (const line of lines.slice(start + 1)) {
|
|
128
|
+
if (/^#{1,2}\s/.test(line)) break;
|
|
129
|
+
if (!line.trim().startsWith('|') || /^\s*\|\s*-/.test(line)) continue;
|
|
130
|
+
const [what = '', command = '', dont = ''] = cells(line);
|
|
131
|
+
if (!what || what === '하려는 것') continue;
|
|
132
|
+
const segments = command.split(' · ').filter(segment => {
|
|
133
|
+
if (!segment.trim().startsWith('⚠️')) return true;
|
|
134
|
+
const named = SEAT_AGENTS.filter(name => new RegExp(`\\b${name}\\b`, 'i').test(segment));
|
|
135
|
+
return named.length === 0 || named.includes(agent);
|
|
136
|
+
});
|
|
137
|
+
const commands = segments.flatMap(segment => segment.trim().startsWith('⚠️') ? [segment.replace(/[`*]/g, '').trim()] : backticked(segment));
|
|
138
|
+
rows.push(`${what.replace(/\*\*/g, '')} → ${commands.join(' · ') || '미관측: 명령 없음'}${dont ? ` ⛔ ${dont.replace(/\*\*/g, '')}` : ''}`);
|
|
139
|
+
}
|
|
140
|
+
return rows;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export type SeatMemoryEntry = { title: string; hook: string; updated: string };
|
|
144
|
+
type TacitCandidate = { label: string; details?: string[]; updated: string; hits: number; index: number };
|
|
145
|
+
|
|
146
|
+
const tokens = (text: string): Set<string> => new Set(text.toLowerCase().split(/[^\p{L}\p{N}_]+/u).filter(Boolean));
|
|
147
|
+
const hitsOf = (text: string, query: Set<string>): number => [...tokens(text)].filter(token => query.has(token)).length;
|
|
148
|
+
/** 최근(날짜) 먼저, 같은 날이면 적중(질의 낱말 겹침) 많은 것, 그다음 원래 순서. */
|
|
149
|
+
const recentThenHits = (a: TacitCandidate, b: TacitCandidate): number => b.updated.slice(0, 10).localeCompare(a.updated.slice(0, 10)) || b.hits - a.hits || a.index - b.index;
|
|
150
|
+
|
|
151
|
+
/** 제목 이외의 운영 지침을 보존한다. 상태·검증은 분류에 이미 반영되어 중복 표시하지 않는다. */
|
|
152
|
+
function knowhowDetails(text: string, prefix: string): string[] {
|
|
153
|
+
return text.split(/\r?\n/).slice(1)
|
|
154
|
+
.filter(line => line.trim() && !/^\s*-\s*(?:상태|검증)\s*:/.test(line))
|
|
155
|
+
.flatMap(line => (line.trim().match(/.{1,140}/gu) ?? []).map(part => `${prefix} ↳ ${part}`));
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** L3 — 최근 문서 상위 5개는 본문까지, 기억은 상위 N을 보인다. 절별 출력 하드 캡은 없다. */
|
|
159
|
+
export function assembleSeatTacitKnowledge(input: { seat: string; agent: SeatAgent; knowhow: string; memories: readonly SeatMemoryEntry[]; now: Date; limit?: number }): string[] {
|
|
160
|
+
const limit = Math.max(0, input.limit ?? SEAT_TACIT_TOP_N);
|
|
161
|
+
const query = tokens(`${input.seat} ${input.agent}`);
|
|
162
|
+
const { facts, refs } = splitKnowhow(parseKnowhowItems(input.knowhow, input.seat), input.now);
|
|
163
|
+
const knowhow = [...facts, ...refs].map((item, index): TacitCandidate => {
|
|
164
|
+
const prefix = `[문서${facts.includes(item) ? '' : '·검증 안 됨'}]`;
|
|
165
|
+
const title = (item.text.split('\n', 1)[0] ?? '').replace(/^##\s*/, '');
|
|
166
|
+
return {
|
|
167
|
+
label: `${prefix} ${title}`,
|
|
168
|
+
details: knowhowDetails(item.text, prefix),
|
|
169
|
+
updated: item.verifiedAt?.toISOString() ?? '',
|
|
170
|
+
hits: hitsOf(item.text, query),
|
|
171
|
+
index,
|
|
172
|
+
};
|
|
173
|
+
}).sort(recentThenHits);
|
|
174
|
+
const memories = input.memories.map((entry, index): TacitCandidate => ({
|
|
175
|
+
label: `[기억] ${entry.title}${entry.hook ? ` — ${entry.hook}` : ''} (갱신 ${entry.updated.slice(0, 10) || '미상'})`,
|
|
176
|
+
updated: entry.updated,
|
|
177
|
+
hits: hitsOf(`${entry.title} ${entry.hook}`, query),
|
|
178
|
+
index,
|
|
179
|
+
})).sort(recentThenHits).slice(0, limit);
|
|
180
|
+
const visibleKnowhow = knowhow.slice(0, SEAT_TACIT_TOP_N);
|
|
181
|
+
const omittedKnowhow = knowhow.length - visibleKnowhow.length;
|
|
182
|
+
return [SEAT_TRUST_LADDER,
|
|
183
|
+
...visibleKnowhow.flatMap(row => [row.label, ...(row.details ?? [])]),
|
|
184
|
+
...(omittedKnowhow ? [`[문서] 나머지 ${omittedKnowhow}항목은 원문 KNOWHOW 참고`] : []),
|
|
185
|
+
...memories.map(row => row.label)];
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/** 저장소 안 일반 파일만 읽는다 — 링크가 저장소 밖을 가리키면 없는 것으로 친다. */
|
|
189
|
+
function readRepoDoc(repoRoot: string, path: string): { updated: string; text: string } | null {
|
|
190
|
+
try {
|
|
191
|
+
const suffix = relative(realpathSync(repoRoot), realpathSync(path));
|
|
192
|
+
if (!suffix || suffix === '..' || suffix.startsWith(`..${sep}`) || suffix.startsWith(sep)) return null;
|
|
193
|
+
const stat = statSync(path);
|
|
194
|
+
if (!stat.isFile()) return null;
|
|
195
|
+
return { updated: stat.mtime.toISOString(), text: readFileSync(path, 'utf8').slice(0, 256_000) };
|
|
196
|
+
} catch { return null; }
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function memoryEntries(home: string, root: string): { entries: SeatMemoryEntry[]; reason?: string } {
|
|
200
|
+
const dir = join(root, 'memory');
|
|
201
|
+
const index = join(dir, 'MEMORY.md');
|
|
202
|
+
try {
|
|
203
|
+
if (!existsSync(index)) return { entries: [], reason: '미관측: 기억 색인 파일 없음' };
|
|
204
|
+
if (!isRegularSeatPath(home, root, index)) return { entries: [], reason: '미관측: 기억 색인이 일반 경로가 아님' };
|
|
205
|
+
const entries = readFileSync(index, 'utf8').slice(0, 256_000).split(/\r?\n/).flatMap(line => {
|
|
206
|
+
const match = line.match(/^-\s*\[([^\]]+)\]\(([^)]+)\)\s*(?:[—-]\s*(.*))?$/);
|
|
207
|
+
if (!match) return [];
|
|
208
|
+
const file = join(dir, match[2]!);
|
|
209
|
+
try {
|
|
210
|
+
if (!existsSync(file) || !isRegularSeatPath(home, root, file)) return [];
|
|
211
|
+
return [{ title: match[1]!, hook: match[3] ?? '', updated: statSync(file).mtime.toISOString() }];
|
|
212
|
+
} catch { return []; }
|
|
213
|
+
});
|
|
214
|
+
return entries.length ? { entries } : { entries, reason: '미관측: 기억 색인에 읽을 항목 없음' };
|
|
215
|
+
} catch { return { entries: [], reason: '미관측: 기억 색인 읽기 실패' }; }
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/** L1·L3 절 — `--agent` 를 줬을 때만 L0 카드 뒤에 붙는다. */
|
|
219
|
+
export function collectSeatLadderSections(seat: string, agent: SeatAgent, options: { home: string; repoRoot: string; now: Date }): SeatBootSection[] {
|
|
220
|
+
const manualPath = join(options.repoRoot, SEAT_QUICKSTART_MANUAL);
|
|
221
|
+
const manual = readRepoDoc(options.repoRoot, manualPath);
|
|
222
|
+
const quick = manual ? assembleSeatQuickPath(manual.text, agent) : [];
|
|
223
|
+
const knowhowPath = join(options.repoRoot, 'docs', 'roles', seat, 'KNOWHOW.md');
|
|
224
|
+
const knowhow = readRepoDoc(options.repoRoot, knowhowPath);
|
|
225
|
+
const root = join(options.home, 'elanous-hq', 'seat-state');
|
|
226
|
+
const memories = memoryEntries(options.home, root);
|
|
227
|
+
const tacit = assembleSeatTacitKnowledge({ seat, agent, knowhow: knowhow?.text ?? '', memories: memories.entries, now: options.now });
|
|
228
|
+
const docs = tacit.filter(row => row.startsWith('[문서'));
|
|
229
|
+
const remembered = tacit.filter(row => row.startsWith('[기억]'));
|
|
230
|
+
const tacitRows = [
|
|
231
|
+
SEAT_TRUST_LADDER,
|
|
232
|
+
...(docs.length ? docs : [knowhow ? '미관측: KNOWHOW 에 읽을 항목 없음' : '미관측: KNOWHOW 파일 없음']),
|
|
233
|
+
...(remembered.length ? remembered : [memories.reason ?? '미관측: 기억 없음']),
|
|
234
|
+
];
|
|
235
|
+
return [
|
|
236
|
+
{ title: `L1 빠른 길 (${agent})`, source: manualPath, updated: manual?.updated ?? '미상', rows: quick, ...(quick.length ? {} : { reason: manual ? '미관측: «무엇→명령» 표 없음' : '미관측: 파일 없음' }) },
|
|
237
|
+
{ title: `L3 암묵지 (${agent})`, source: `${knowhowPath} ⊕ ${join(root, 'memory', 'MEMORY.md')}`, updated: knowhow?.updated ?? '미상', rows: tacitRows },
|
|
238
|
+
];
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export function registerSeatBootCommands(command: Command, options: { home?: () => string; contextNow?: () => unknown; msgPath?: () => string; repoRoot?: () => string; now?: () => Date } = {}): void {
|
|
111
242
|
command.command('boot <seat>').description('현재 자리 카드 — 허용된 메타데이터만 읽기 전용 표시')
|
|
112
|
-
.
|
|
243
|
+
.option('--agent <agent>', '에이전트(codex|elanous|claude) — 주면 L1 빠른 길 ⊕ L3 암묵지를 붙인다')
|
|
244
|
+
.action(async (rawSeat: string, flags: { agent?: string }) => {
|
|
113
245
|
const seat = rawSeat.toUpperCase();
|
|
114
246
|
if (!(SEAT_ROLES as readonly string[]).includes(seat)) { console.error(`seat boot: unknown seat ${rawSeat} (OP|TC|MK|UX)`); process.exitCode = 2; return; }
|
|
247
|
+
const agent = flags.agent?.toLowerCase();
|
|
248
|
+
if (agent !== undefined && !(SEAT_AGENTS as readonly string[]).includes(agent)) { console.error(`seat boot: unknown agent ${flags.agent} (codex|elanous|claude)`); process.exitCode = 2; return; }
|
|
115
249
|
const home = options.home?.() ?? homedir();
|
|
116
250
|
let facts: string[] = [];
|
|
117
251
|
let contextUpdated = '미상';
|
|
@@ -125,6 +259,7 @@ export function registerSeatBootCommands(command: Command, options: { home?: ()
|
|
|
125
259
|
facts = contextFacts(snapshot);
|
|
126
260
|
} catch { facts = []; contextUpdated = '미관측: contextNow 조회 실패'; }
|
|
127
261
|
const sections = collectSeatBootSections(seat, { home, msgPath: options.msgPath?.() ?? defaultMsgStorePath() }).sections;
|
|
262
|
+
if (agent !== undefined) sections.push(...collectSeatLadderSections(seat, agent as SeatAgent, { home, repoRoot: options.repoRoot?.() ?? fileURLToPath(new URL('../../', import.meta.url)), now: options.now?.() ?? new Date() }));
|
|
128
263
|
console.log(renderSeatBootCard(seat as SeatRole, sections, facts, contextUpdated));
|
|
129
264
|
});
|
|
130
265
|
}
|
package/src/cli/self-update.ts
CHANGED
|
@@ -590,8 +590,11 @@ function pruneUnusedVersions(dir: string, outcome: VersionPruneOutcome, listProc
|
|
|
590
590
|
try { owner = statSync(join('/proc', pid)).uid; stat = readFileSync(join('/proc', pid, 'stat'), 'utf8'); }
|
|
591
591
|
catch (failure) { if (exited(failure) && !existsSync(join('/proc', pid))) continue; throw failure; }
|
|
592
592
|
if (procStatHoldsNothing(stat)) continue;
|
|
593
|
-
//
|
|
594
|
-
|
|
593
|
+
// A denied link falls back to argv for any owner: Linux ptrace access also refuses same-UID
|
|
594
|
+
// processes holding extra capabilities or another user namespace (systemd --user, rootless
|
|
595
|
+
// containers), so requiring them would disable pruning on every systemd host. ENOENT from a
|
|
596
|
+
// live process stays fatal for our own UID and falls back to argv only for another UID.
|
|
597
|
+
if (code === 'EACCES' || code === 'EPERM' || (code === 'ENOENT' && owner !== process.getuid?.())) {
|
|
595
598
|
if (!argvRead.has(pid)) {
|
|
596
599
|
argvRead.add(pid);
|
|
597
600
|
let argv: string | undefined;
|
package/src/cli/tasks-cli.ts
CHANGED
|
@@ -14,7 +14,8 @@ import { assignedVersions, releasedVersion, validateVersion } from '../release-l
|
|
|
14
14
|
import { compareVersions } from '../directives/version-at.js';
|
|
15
15
|
import { cardsBoard, countBoardTasks, INTERNAL_PACK_PROJECT, mergeBoards, releasePackBoard, type BoardNode } from '../task-agent/board.js';
|
|
16
16
|
import type { Task } from '../task-orchestrator/types.js';
|
|
17
|
-
import { cardPrNumber, CLOSED_BY_HAND_EVENT, closeTaskCard, COMPLETION_KINDS, handTask, updateTaskCard, LIVE_MOVE_HISTORY_EVENT, LIVE_MOVE_RESULT_EVENT, nextMoveFor, resolveHandText, readTaskAgentState, readTaskCard, taskAgentStatePath as taskStatePathDefault, shellQuote, TASK_CARD_PREFIX, TASK_SEATS, type CompletionKind, type TaskCard, type TaskLaunchContext, type TaskLaunchReceipt, type TaskLauncher, type TaskSeat } from '../task-agent/task-hand.js';
|
|
17
|
+
import { cardPrNumber, CLOSED_BY_HAND_EVENT, closeTaskCard, COMPLETION_KINDS, handTask, updateTaskCard, LIVE_MOVE_HISTORY_EVENT, LIVE_MOVE_RESULT_EVENT, nextMoveFor, resolveHandText, readTaskAgentState, readTaskCard, runTagChange, taskAgentStatePath as taskStatePathDefault, taskCardLabelContext, shellQuote, TASK_CARD_PREFIX, TASK_SEATS, type CompletionKind, type TaskCard, type TaskLaunchContext, type TaskLaunchReceipt, type TaskLauncher, type TaskSeat } from '../task-agent/task-hand.js';
|
|
18
|
+
import { RUN_TAG_KEYS, runIdentityFieldText, runPriorityClass } from '../task-agent/run-identity.js';
|
|
18
19
|
import { readCardSalvageBranch, recordWiringLiveVerified, refreshCardRunBinding, type CardRunEvidenceDeps } from '../task-agent/card-evidence.js';
|
|
19
20
|
import { captureReviewResults } from '../task-agent/review-result-capture.js';
|
|
20
21
|
import { replayRemoteCardMoves } from '../task-agent/shadow.js';
|
|
@@ -33,6 +34,9 @@ export interface TasksCliDeps {
|
|
|
33
34
|
bearerToken?: string;
|
|
34
35
|
fetch?: typeof fetch;
|
|
35
36
|
output?: (line: string) => void;
|
|
37
|
+
/** green-sweep entrypoint test seam: keep the actual CLI decision chain, replace only process reads. */
|
|
38
|
+
greenSweepChecklist?: typeof listChecklist;
|
|
39
|
+
greenSweepRun?: (command: string, args: string[]) => { status: number | null; stdout: string };
|
|
36
40
|
/** `task hand --live` 의 발사기(시험 주입). 기본은 운영 config-dir 로 `harness say` 를 떼어 띄운다. */
|
|
37
41
|
taskLauncher?: TaskLauncher;
|
|
38
42
|
/** TA-REVIEW-RESULT-CAPTURE — `tasks show` 의 리뷰 결과 회수 시각(시험 주입 · 기본 지금). */
|
|
@@ -185,6 +189,12 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
|
|
|
185
189
|
failed(targets[0]!, ['project-target-is-local']);
|
|
186
190
|
return null;
|
|
187
191
|
}
|
|
192
|
+
// ⛔ R7(2026-10-16): 시험 안에서 실 ssh 원격 발사는 명시 허용 없이 거부한다(가짜 ssh 주입은 통과).
|
|
193
|
+
// ⚠️ 이 가드는 hold(launchHoldActive) 판정보다 «앞»이어야 한다 — hold 는 preflightParentHost 의 입력일 뿐이고,
|
|
194
|
+
// preflightParentHost(parent-host.ts `preflightParentHost` 첫 줄)는 hold 와 무관하게 먼저 실 ssh 를 부른다(다중 대상이면
|
|
195
|
+
// 그 앞의 readParentHostCapacity 도 ssh). 가드를 아래로 내리면 hold 경로에서 시험이 실 ssh 를 쏜다(R7 사고 모양).
|
|
196
|
+
// hold 경로를 재는 시험은 deps.ssh 가짜 또는 parentHost:null 을 주입한다(real-launch-guard.test 가 이 순서를 문다).
|
|
197
|
+
if (!deps.ssh) (await import('../task-agent/real-launch-guard.js')).refuseRealLaunchUnderTest('remote-parent-ssh', targets.map((target) => target.host).join(','));
|
|
188
198
|
let launchHoldActive = false;
|
|
189
199
|
try {
|
|
190
200
|
if (deps.launchHoldActive) launchHoldActive = deps.launchHoldActive();
|
|
@@ -236,6 +246,8 @@ export async function defaultTaskLauncher(args: string[], cwd?: string, context?
|
|
|
236
246
|
const remote = await tryRemoteParent(args, cwd, context, deps);
|
|
237
247
|
if (remote) return remote;
|
|
238
248
|
}
|
|
249
|
+
// ⛔ R7(2026-10-16): 시험 안에서 실 `elanous harness say` 를 띄우는 것은 명시 허용 없이 거부한다(가짜 spawn 주입은 통과).
|
|
250
|
+
if (!deps.spawn) (await import('../task-agent/real-launch-guard.js')).refuseRealLaunchUnderTest('local-harness-spawn', args.slice(0, 2).join(' '));
|
|
239
251
|
const spawn = deps.spawn ?? ((await import('node:child_process')).spawn as unknown as DetachedSpawn);
|
|
240
252
|
const { getElanousConfigDirOverride } = await import('../elanous-config-dir.js');
|
|
241
253
|
const { prodInstanceRoot } = await import('../instance/resolve.js');
|
|
@@ -366,9 +378,26 @@ function runLinkLine(card: TaskCard): string[] {
|
|
|
366
378
|
return [`런: ${card.runId} · 골: ${card.goalId ?? '-'} · PR: ${pr}${card.runChildId ? ` · 자식 런: ${card.runChildId}` : ''}`];
|
|
367
379
|
}
|
|
368
380
|
|
|
381
|
+
/** RUN-IDENTITY-TAGS — 신분 한 줄 + Pod 라벨 한 줄(원장 정본 2줄 렌더 · 신분 없는 카드는 «미기록»으로 적고 기본값 정책을 밝힌다). */
|
|
382
|
+
function cardIdentityLines(card: TaskCard): string[] {
|
|
383
|
+
const identity = card.identity;
|
|
384
|
+
const { labels } = taskCardLabelContext({ id: card.id });
|
|
385
|
+
// 경계: Pod 에 실제로 붙는 라벨은 카드 id 하나뿐이다 — 신분 값은 Pod 라벨에 아직 안 실린다(RUN-IDENTITY-ADMIT 몫). 화면도 그렇게 말한다.
|
|
386
|
+
const podLine = `Pod 라벨 ${Object.entries(labels).map(([key, value]) => `${key}=${value}`).join(' ')} (신분 값은 Pod 라벨 미탑재 — RUN-IDENTITY-ADMIT)`;
|
|
387
|
+
if (!identity) return [`신분 미기록 — 원장에 identity 없음 · 승인·선점은 기본 class=${runPriorityClass(identity)} 로 읽는다`, podLine];
|
|
388
|
+
// ⛔ 모르는 칸을 기본값으로 보이지 않는다 — 원장에 없는 칸은 «미기록»으로 적는다(확인된 칸만 값으로).
|
|
389
|
+
const identityText = RUN_TAG_KEYS.map((key) => `${key}=${runIdentityFieldText(identity, key)}`).join(' · ');
|
|
390
|
+
const originParts = [identity.origin?.checklistId, identity.origin?.version, identity.origin?.seat, identity.origin?.launcher].filter((part) => part !== undefined);
|
|
391
|
+
return [
|
|
392
|
+
`신분 ${identityText}${originParts.length > 0 ? ` — 출생 ${originParts.join(' · ')}` : ''}`,
|
|
393
|
+
podLine,
|
|
394
|
+
];
|
|
395
|
+
}
|
|
396
|
+
|
|
369
397
|
function taskCardLines(card: TaskCard): string[] {
|
|
370
398
|
return [
|
|
371
399
|
[card.id, card.status, card.seat ?? '-', card.checklistId ?? '-', card.createdAt, card.text].join('\t'),
|
|
400
|
+
...cardIdentityLines(card),
|
|
372
401
|
...(card.mission ? [`미션: ${card.mission} · after: ${card.after?.length ? card.after.join(', ') : '-'}`] : []),
|
|
373
402
|
...runLinkLine(card),
|
|
374
403
|
...liveMoveLines(card),
|
|
@@ -786,7 +815,9 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
|
|
|
786
815
|
.action((opts: { version: string; cell?: string; traffic?: string; json?: boolean }) => {
|
|
787
816
|
try {
|
|
788
817
|
validateVersion(opts.version);
|
|
789
|
-
const snapshot = listChecklist(opts.version);
|
|
818
|
+
const snapshot = (deps.greenSweepChecklist ?? listChecklist)(opts.version);
|
|
819
|
+
const run = deps.greenSweepRun ?? ((command: string, args: string[]) => spawnSync(command, args,
|
|
820
|
+
{ cwd: process.cwd(), encoding: 'utf8', timeout: 20_000 }));
|
|
790
821
|
const cards = Object.values(readTaskAgentState<{ tasks?: Record<string, TaskCard> }>(deps.taskStatePath ?? taskStatePathDefault()).tasks ?? {});
|
|
791
822
|
let holds: Set<string> | null = null;
|
|
792
823
|
if (opts.traffic) {
|
|
@@ -800,14 +831,11 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
|
|
|
800
831
|
}
|
|
801
832
|
const prCache = new Map<number, GreenSweepPr | null>();
|
|
802
833
|
const ambiguousPrs = ambiguousGreenSweepPrs(snapshot.items, opts.version, cards);
|
|
803
|
-
const origin =
|
|
804
|
-
{ cwd: process.cwd(), encoding: 'utf8', timeout: 20_000 });
|
|
834
|
+
const origin = run('git', ['remote', 'get-url', 'origin']);
|
|
805
835
|
const originRepo = origin.status === 0
|
|
806
836
|
? /github\.com[:/]([^/\s]+\/[^/\s]+?)(?:\.git)?$/i.exec(origin.stdout.trim())?.[1]?.toLowerCase() : undefined;
|
|
807
|
-
const localMain =
|
|
808
|
-
|
|
809
|
-
const remoteMain = spawnSync('git', ['ls-remote', 'origin', 'refs/heads/main'],
|
|
810
|
-
{ cwd: process.cwd(), encoding: 'utf8', timeout: 20_000 });
|
|
837
|
+
const localMain = run('git', ['rev-parse', 'origin/main']);
|
|
838
|
+
const remoteMain = run('git', ['ls-remote', 'origin', 'refs/heads/main']);
|
|
811
839
|
const localMainSha = localMain.status === 0 ? localMain.stdout.trim() : '';
|
|
812
840
|
const remoteMainSha = remoteMain.status === 0 ? remoteMain.stdout.trim().split(/\s+/)[0] : '';
|
|
813
841
|
const mainFresh = /^[a-f0-9]{40}$/i.test(localMainSha) && localMainSha === remoteMainSha;
|
|
@@ -817,8 +845,7 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
|
|
|
817
845
|
return candidates.map((candidate) => {
|
|
818
846
|
let pr = prCache.get(candidate.pr);
|
|
819
847
|
if (pr === undefined) {
|
|
820
|
-
const view =
|
|
821
|
-
{ cwd: process.cwd(), encoding: 'utf8', timeout: 20_000 });
|
|
848
|
+
const view = run('gh', ['pr', 'view', String(candidate.pr), '--json', 'number,state,mergeCommit,url']);
|
|
822
849
|
try {
|
|
823
850
|
if (view.status !== 0) throw new Error('gh failed');
|
|
824
851
|
const parsed = JSON.parse(view.stdout) as { number?: number; state?: string; mergeCommit?: { oid?: string }; url?: string };
|
|
@@ -827,16 +854,31 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
|
|
|
827
854
|
} catch { pr = null; }
|
|
828
855
|
prCache.set(candidate.pr, pr);
|
|
829
856
|
}
|
|
830
|
-
|
|
857
|
+
// A component PR stays CLOSED after a merged train. Reverify the integration PR
|
|
858
|
+
// recorded on the card before using its merge commit as landing evidence.
|
|
859
|
+
let landingPr = pr;
|
|
860
|
+
const train = candidate.card?.trainLanding;
|
|
861
|
+
if (pr?.state === 'CLOSED' && train?.componentPr === candidate.pr && /^[a-f0-9]{40}$/i.test(train.mergeSha)) {
|
|
862
|
+
const view = run('gh', ['pr', 'view', String(train.integrationPr), '--json', 'number,state,mergeCommit']);
|
|
863
|
+
try {
|
|
864
|
+
if (view.status === 0) {
|
|
865
|
+
const parsed = JSON.parse(view.stdout) as { number?: number; state?: string; mergeCommit?: { oid?: string } };
|
|
866
|
+
if (parsed.number === train.integrationPr && parsed.state === 'MERGED'
|
|
867
|
+
&& parsed.mergeCommit?.oid?.toLowerCase() === train.mergeSha.toLowerCase()) {
|
|
868
|
+
landingPr = { ...pr, state: 'MERGED', mergeSha: train.mergeSha, viaTrain: { integrationPr: train.integrationPr } };
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
} catch { /* Unverified train is still a CLOSED component PR. */ }
|
|
872
|
+
}
|
|
873
|
+
const sha = landingPr?.mergeSha;
|
|
831
874
|
const prRepo = /^https:\/\/github\.com\/([^/]+\/[^/]+)\/pull\/\d+(?:\/|$)/i.exec(pr?.url ?? '')?.[1]?.toLowerCase();
|
|
832
875
|
const repositoryMatches = originRepo && prRepo ? originRepo === prRepo : null;
|
|
833
876
|
const ancestor = !mainFresh || !sha || !/^[a-f0-9]{40}$/i.test(sha) ? null : (() => {
|
|
834
|
-
const check =
|
|
835
|
-
{ cwd: process.cwd(), encoding: 'utf8', timeout: 20_000 });
|
|
877
|
+
const check = run('git', ['merge-base', '--is-ancestor', sha, 'origin/main']);
|
|
836
878
|
return check.status === 0 ? true : check.status === 1 ? false : null;
|
|
837
879
|
})();
|
|
838
880
|
const decision = decideGreenSweep({ item, candidate, candidateCount: candidates.length,
|
|
839
|
-
pr:
|
|
881
|
+
pr: landingPr ?? null, ancestor, hold: holds === null ? null : holds.has(item.id), repositoryMatches,
|
|
840
882
|
ambiguousAcrossCells: ambiguousPrs.has(candidate.pr) });
|
|
841
883
|
observeGreenSweep(decision);
|
|
842
884
|
return decision;
|
|
@@ -954,9 +996,13 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
|
|
|
954
996
|
.option('--ta-land', 'TA-LIVE-LAND-2 — 호스트는 재게이트만 하고 병합은 TASK-AGENT 의 propose-land(`pr land --expected-head`)에 맡긴다 · 카드 taLand ⊕ 발사 env ELANOUS_TA_LAND=1 · taskAgent.liveMoves 에 propose-land 가 없으면 종전대로 호스트가 병합')
|
|
955
997
|
.option('--child-llm <provider/model>', 'TASKS-HAND-CHILD-LLM — 구현 자식 LLM(예: grok/grok-4.7) → 발사 인자 --child-llm-provider <provider> --child-llm-model <model> · «첫» `/` 에서만 가른다(모델 id 의 `/` 는 보존) · openrouter 는 모델 id 가 openrouter/ 접두를 포함하므로 전체를 모델로(openrouter/z-ai/glm-5.3 → --child-llm-model openrouter/z-ai/glm-5.3) · 카드 childLlm · 안 주면 명령·카드 무변경')
|
|
956
998
|
.option('--child-llm-effort <level>', '구현 자식 추론 노력 → 발사 인자 --child-llm-effort(검증은 하니스 · --child-llm 과 함께)')
|
|
999
|
+
.addOption(new Option('--tier <level>', '디스패처 난이도(하|중|상|특) — 카드에 보존해 수리 모델 정책에 사용').choices(['하', '중', '상', '특']))
|
|
1000
|
+
.option('--tag <k=v>', 'RUN-IDENTITY-TAGS — 출생 신분을 덮는다(class|care|rights|protect 의 k=v · 반복: --tag class=gate --tag protect=true) — 카드 원장 identity 에 남는다', (value: string, previous: string[] | undefined) => [...(previous ?? []), value])
|
|
957
1001
|
.option('--json', 'JSON 출력')
|
|
958
|
-
.action(async (text: string | undefined, opts: { seat?: TaskSeat; checklist?: string; version?: string; completion?: CompletionKind; mission?: string; project?: string; target?: string; goal?: string; milestone?: string; live?: boolean; taLand?: boolean; childLlm?: string; childLlmEffort?: string; json?: boolean }) => {
|
|
1002
|
+
.action(async (text: string | undefined, opts: { seat?: TaskSeat; checklist?: string; version?: string; completion?: CompletionKind; mission?: string; project?: string; target?: string; goal?: string; milestone?: string; live?: boolean; taLand?: boolean; childLlm?: string; childLlmEffort?: string; tier?: TaskCard['tier']; tag?: string[]; json?: boolean }) => {
|
|
959
1003
|
const suppliedText = text !== undefined;
|
|
1004
|
+
/** RUN-IDENTITY-TAGS — 칸을 찾은 판(출생 신분이 그 판의 칸 우선순위를 읽는다 · 개발 판 밖 칸도). */
|
|
1005
|
+
let birthBoardVersion: string | undefined;
|
|
960
1006
|
if (opts.version !== undefined && opts.checklist === undefined) {
|
|
961
1007
|
out('--version 은 --checklist 와 함께 준다');
|
|
962
1008
|
process.exitCode = 1;
|
|
@@ -1014,6 +1060,7 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
|
|
|
1014
1060
|
return;
|
|
1015
1061
|
}
|
|
1016
1062
|
if (matches.length > 1) console.error(`⚠ 체크리스트 칸 ${opts.checklist} 중복: ${matches.map((match) => match.version).join(', ')} — 가장 가까운 판 ${matches[0]!.version} 선택 (--version 으로 고정 가능)`);
|
|
1063
|
+
birthBoardVersion = matches[0]!.version;
|
|
1017
1064
|
if (opts.mission === undefined && text === undefined) text = title;
|
|
1018
1065
|
}
|
|
1019
1066
|
if (opts.checklist !== undefined && opts.mission === undefined && suppliedText && !text!.split(/\r?\n/, 1)[0]!.startsWith('대상 경로:')) {
|
|
@@ -1032,8 +1079,8 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
|
|
|
1032
1079
|
process.exitCode = 1;
|
|
1033
1080
|
return;
|
|
1034
1081
|
}
|
|
1035
|
-
if (opts.mission !== undefined && (opts.completion !== undefined || opts.project !== undefined || opts.goal !== undefined || opts.milestone !== undefined || opts.taLand === true || opts.childLlm !== undefined || opts.childLlmEffort !== undefined)) {
|
|
1036
|
-
out('--completion/--project/--target/--goal/--milestone/--ta-land/--child-llm
|
|
1082
|
+
if (opts.mission !== undefined && (opts.completion !== undefined || opts.project !== undefined || opts.goal !== undefined || opts.milestone !== undefined || opts.taLand === true || opts.childLlm !== undefined || opts.childLlmEffort !== undefined || opts.tier !== undefined || opts.tag !== undefined)) {
|
|
1083
|
+
out('--completion/--project/--target/--goal/--milestone/--ta-land/--child-llm/--tier/--tag 는 과제 한 줄에만 준다 — --mission 조각은 종전처럼 code-pr 이다');
|
|
1037
1084
|
process.exitCode = 1;
|
|
1038
1085
|
return;
|
|
1039
1086
|
}
|
|
@@ -1089,6 +1136,9 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
|
|
|
1089
1136
|
...(opts.taLand === true ? { taLand: true } : {}),
|
|
1090
1137
|
...(opts.childLlm !== undefined ? { childLlm: opts.childLlm } : {}),
|
|
1091
1138
|
...(opts.childLlmEffort !== undefined ? { childLlmEffort: opts.childLlmEffort } : {}),
|
|
1139
|
+
...(opts.tier !== undefined ? { tier: opts.tier } : {}),
|
|
1140
|
+
...(opts.tag !== undefined ? { tags: opts.tag } : {}),
|
|
1141
|
+
...(birthBoardVersion !== undefined ? { checklistVersion: birthBoardVersion } : {}),
|
|
1092
1142
|
...(deps.taskStatePath ? { statePath: deps.taskStatePath } : {}),
|
|
1093
1143
|
...(deps.taskCompositionRoot ? { compositionRoot: deps.taskCompositionRoot } : {}),
|
|
1094
1144
|
launcher: deps.taskLauncher ?? defaultTaskLauncher,
|
|
@@ -1096,10 +1146,12 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
|
|
|
1096
1146
|
if (opts.json) out(JSON.stringify(result));
|
|
1097
1147
|
else {
|
|
1098
1148
|
out(`${result.card.id}\t${result.mode}\t${result.launched ? 'launched' : 'not launched'}`);
|
|
1099
|
-
out(`elanous ${result.move.command
|
|
1149
|
+
if (result.move.command) out(`elanous ${result.move.command.map(shellQuote).join(' ')}`);
|
|
1150
|
+
else out(result.move.reason);
|
|
1100
1151
|
if (result.cwd) out(`(cwd: ${result.cwd})`);
|
|
1101
1152
|
if (result.card.taLand) out('(ta-land — 발사 env ELANOUS_TA_LAND=1 · 원격 또는 로컬 부모 · taskAgent.liveMoves 에 propose-land 가 있으면 병합은 TASK-AGENT 몫, 없으면 종전대로 호스트 병합)');
|
|
1102
|
-
if (!result.launched) out('(
|
|
1153
|
+
if (!result.launched && result.card.alreadyDoneCandidate) out('(main 증거 통과 — 발사 0 · green 후보만 기록, 주인 판정 대기)');
|
|
1154
|
+
else if (!result.launched) out('(shadow — 띄우지 않았다 · 띄우려면 --live)');
|
|
1103
1155
|
}
|
|
1104
1156
|
} catch (error) {
|
|
1105
1157
|
out(error instanceof Error ? error.message : '과제 넘기기 실패');
|
|
@@ -1107,6 +1159,32 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
|
|
|
1107
1159
|
}
|
|
1108
1160
|
});
|
|
1109
1161
|
|
|
1162
|
+
tasks.command('tag <id> <k=v>')
|
|
1163
|
+
.description('RUN-IDENTITY-TAGS — 카드의 런 신분 태그를 바꾼다(class|care|rights|protect 의 k=v · 카드 history 에 감사 줄 run-tag-change {from, to, by, reason} 이 남는다 · 카드 상태 파일이 원장 정본 · 목록 밖 값은 거부)')
|
|
1164
|
+
.option('--by <seat>', '바꾼 자리(예: OP·MK·TC·UX) — 안 주면 호출 자리 ELANOUS_TRACK, 그것도 없으면 «unknown» 으로 감사 줄에 적는다(지어내지 않는다)')
|
|
1165
|
+
.option('--reason <text>', '왜 바꾸나 — 감사 줄에 남긴다')
|
|
1166
|
+
.option('--json', '바뀐 카드를 JSON 으로 출력')
|
|
1167
|
+
.action((id: string, kv: string, opts: { by?: string; reason?: string; json?: boolean }) => {
|
|
1168
|
+
try {
|
|
1169
|
+
const by = opts.by?.trim() || process.env.ELANOUS_TRACK?.trim() || 'unknown';
|
|
1170
|
+
const card = runTagChange(id, { tag: kv, by, ...(opts.reason !== undefined ? { reason: opts.reason } : {}) }, deps.taskStatePath ?? taskStatePathDefault());
|
|
1171
|
+
if (card === undefined) {
|
|
1172
|
+
out(`카드가 없습니다: ${id}`);
|
|
1173
|
+
process.exitCode = 1;
|
|
1174
|
+
return;
|
|
1175
|
+
}
|
|
1176
|
+
if (opts.json) {
|
|
1177
|
+
out(JSON.stringify(card));
|
|
1178
|
+
return;
|
|
1179
|
+
}
|
|
1180
|
+
out(`${card.id}\t${kv}`);
|
|
1181
|
+
for (const line of cardIdentityLines(card)) out(line);
|
|
1182
|
+
} catch (error) {
|
|
1183
|
+
out(error instanceof Error ? error.message : '태그 바꾸기 실패');
|
|
1184
|
+
process.exitCode = 1;
|
|
1185
|
+
}
|
|
1186
|
+
});
|
|
1187
|
+
|
|
1110
1188
|
tasks.command('hand-move <id>')
|
|
1111
1189
|
.description('HAND-MOVE-LEDGER — 자리가 손으로 마무리한 수(기존 실패 면제 · diff 재적용 · 범위 자르기 · 쪼개기 · 다른 모델 의견)를 그 카드 history 에 한 줄로 남긴다 — live-move 와 같은 원장 칸 · 기존 줄은 건드리지 않는다')
|
|
1112
1190
|
.requiredOption('--kind <kind>', `손으로 쓴 수 (${HAND_MOVE_KINDS.join('|')})`)
|
|
@@ -69,6 +69,19 @@ export function isOperationalQuery(text: string | undefined): boolean {
|
|
|
69
69
|
return !!text && OPERATIONAL_QUERY.test(text);
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
+
/** 칸 3 a59c1c24c — «맥락 먼저 판단»의 공통 게이트 결정: 개시 대기 소진 → 표면 스위치 → 운영 질문 스킵.
|
|
73
|
+
* Telegram(maybeSendContextFirst)과 Discord(maybeSendContextFirst)가 같은 한 지점에서 판단한다. */
|
|
74
|
+
export function takeContextFirstOpening(opts: {
|
|
75
|
+
gate: ReturnType<typeof createContextFirstGate>;
|
|
76
|
+
key: string;
|
|
77
|
+
text?: string;
|
|
78
|
+
enabled?: boolean;
|
|
79
|
+
}): boolean {
|
|
80
|
+
if (!opts.gate.take(opts.key)) return false;
|
|
81
|
+
if (opts.enabled === false) return false;
|
|
82
|
+
return !isOperationalQuery(opts.text);
|
|
83
|
+
}
|
|
84
|
+
|
|
72
85
|
export function renderContextFirst(
|
|
73
86
|
read: (options: {}, deps?: ContextNowDeps) => ContextNowAnswer,
|
|
74
87
|
deps: ContextNowDeps | undefined,
|
|
@@ -2,7 +2,7 @@ import { existsSync, lstatSync, readdirSync, readFileSync } from 'node:fs';
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { isMainThread, parentPort, workerData, Worker } from 'node:worker_threads';
|
|
4
4
|
import { queryRunningRuns, type QueriedRunningRunsResult } from '../self-implement/running-runs.js';
|
|
5
|
-
import { loadRunLedger } from '../self-implement/run-ledger.js';
|
|
5
|
+
import { loadRunLedger, resolveFederatedRunLedgerDirectories, runLedgerDir } from '../self-implement/run-ledger.js';
|
|
6
6
|
import { localLoopRows } from '../dashboard/slash-runtime/loops-table.js';
|
|
7
7
|
import { checkBrand } from '../../scripts/brand/check.js';
|
|
8
8
|
import { debug, redactSecretText } from '../debug/log.js';
|
|
@@ -69,7 +69,15 @@ const releaseSource = 'elanous://graph-runs/release-loop';
|
|
|
69
69
|
const scheduleSource = 'elanous://schedules';
|
|
70
70
|
const oneLine = (text: string) => redactSecretText(text.split(/\r?\n/, 1)[0] ?? '').slice(0, 120);
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
// src/dashboard/slash-runtime/dashboard-handlers.ts:buildDashboardSlashRegistry /now calls contextNowInWorker;
|
|
73
|
+
// contextNow → queryRunningRuns → queryFederatedUnfinishedRunLedgers → queryUnfinishedRunLedgers (persisted scan index).
|
|
74
|
+
function runningRunFacts(now: Date, queryRuns: () => QueriedRunningRunsResult = () => queryRunningRuns({
|
|
75
|
+
includeTest: false,
|
|
76
|
+
caller: 'context-now',
|
|
77
|
+
noCache: false,
|
|
78
|
+
}, {
|
|
79
|
+
ledgerDirectories: () => [...new Set([runLedgerDir(), ...resolveFederatedRunLedgerDirectories({ includeTest: false })])],
|
|
80
|
+
})): Extract<ContextFact, { kind: 'run' }>[] {
|
|
73
81
|
const observed = queryRuns();
|
|
74
82
|
const unreadable = observed.completeness === 'partial' || observed.pty.unreadable.length || !!observed.phases?.unreadableTargetCount;
|
|
75
83
|
const facts = observed.entries.filter(entry => observed.countedStatuses.includes(entry.status)).slice(0, 8).flatMap(entry => {
|
|
@@ -239,6 +247,7 @@ export function scanContextNowInWorker(options: Parameters<typeof contextNow>[0]
|
|
|
239
247
|
createWorker: () => Worker = () => new Worker(new URL(import.meta.url), { workerData: { kind: 'context-now' } }),
|
|
240
248
|
timeoutMs = WORKER_SCAN_TIMEOUT_MS): Promise<ContextNowAnswer> {
|
|
241
249
|
const worker = createWorker();
|
|
250
|
+
const startedAt = Date.now();
|
|
242
251
|
return new Promise((resolve, reject) => {
|
|
243
252
|
let settled = false;
|
|
244
253
|
const timeout = setTimeout(() => {
|
|
@@ -249,6 +258,8 @@ export function scanContextNowInWorker(options: Parameters<typeof contextNow>[0]
|
|
|
249
258
|
if (settled) return;
|
|
250
259
|
settled = true;
|
|
251
260
|
clearTimeout(timeout);
|
|
261
|
+
// 첫 호출 지연은 색인과 무관하게 «따로» 재야 판정선과 비교할 수 있다 — 스캔 자체의 ms 를 남긴다.
|
|
262
|
+
debug.log('context.now', 'worker-answer', { topic: options?.topic ?? null, ok: !error, ms: Date.now() - startedAt });
|
|
252
263
|
void worker.terminate();
|
|
253
264
|
if (error) reject(error);
|
|
254
265
|
else resolve(answer!);
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { Database } from 'bun:sqlite';
|
|
2
|
+
import { debug, redactSecretText } from '../debug/log.js';
|
|
3
|
+
import { openSurfaceEventsDb, recordEvent, surfaceEventsDbPath } from '../domains/surface-events.js';
|
|
4
|
+
|
|
5
|
+
export const OPS_EVENT_KINDS = [
|
|
6
|
+
'land.start', 'land.refused', 'land.merged',
|
|
7
|
+
'review.verdict',
|
|
8
|
+
'gate.rc',
|
|
9
|
+
'cell.opened', 'cell.hold',
|
|
10
|
+
'config.set',
|
|
11
|
+
] as const;
|
|
12
|
+
export type OpsEventKind = typeof OPS_EVENT_KINDS[number];
|
|
13
|
+
|
|
14
|
+
export interface OpsEventInput {
|
|
15
|
+
kind: OpsEventKind;
|
|
16
|
+
/** One nonempty line describing the ops fact; multi-line input keeps only the first line. */
|
|
17
|
+
text: string;
|
|
18
|
+
/** Optional locator — PR number, checklist cell id, config key, release version. */
|
|
19
|
+
ref?: string;
|
|
20
|
+
/** Optional ISO timestamp; unparseable values are dropped. */
|
|
21
|
+
at?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface OpsEventDeps {
|
|
25
|
+
db?: Database;
|
|
26
|
+
/** Injection seam for tests; defaults to the surface-events recordEvent. */
|
|
27
|
+
record?: typeof recordEvent;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Persist a one-line harness ops fact (land flow · review verdict · release gate ·
|
|
31
|
+
* checklist cell · config set) into the existing surface_events.db journal via
|
|
32
|
+
* recordEvent (src/domains/surface-events.ts) so pr-cli / release-loop operations
|
|
33
|
+
* become recallable observations instead of vanishing side effects.
|
|
34
|
+
* Fail-soft contract: any write-path failure — db open error, recordEvent throw,
|
|
35
|
+
* schema mismatch — is caught, logged to debug, and swallowed. This writer never
|
|
36
|
+
* throws and never rejects; callers fire it as a side call without touching their
|
|
37
|
+
* own control flow. Malformed input (non-object, unknown kind, empty text) is a
|
|
38
|
+
* silent no-op. Returns the recorded event id, or null when nothing was recorded. */
|
|
39
|
+
export function emitOpsEvent(input: OpsEventInput, deps: OpsEventDeps = {}): string | null {
|
|
40
|
+
if (!input || typeof input !== 'object') return null;
|
|
41
|
+
let db: Database | undefined = deps.db;
|
|
42
|
+
let ownDb = false;
|
|
43
|
+
try {
|
|
44
|
+
if (!(OPS_EVENT_KINDS as readonly string[]).includes(input.kind)) return null;
|
|
45
|
+
const oneLine = (value: unknown): string =>
|
|
46
|
+
redactSecretText(String(value ?? '').split(/\r?\n/, 1)[0] ?? '').trim();
|
|
47
|
+
const text = oneLine(input.text);
|
|
48
|
+
if (!text) return null;
|
|
49
|
+
const ref = oneLine(input.ref) || null;
|
|
50
|
+
const at = typeof input.at === 'string' && !Number.isNaN(Date.parse(input.at)) ? input.at : undefined;
|
|
51
|
+
if (!db) {
|
|
52
|
+
// Test runners must never fall through to the user's production memory DB
|
|
53
|
+
// (same guard as recordInboundTurn in domains/surface-events.ts).
|
|
54
|
+
const testRunner = process.env.NODE_ENV === 'test' || process.env.BUN_TEST !== undefined;
|
|
55
|
+
db = openSurfaceEventsDb(testRunner
|
|
56
|
+
? (process.env.ELANOUS_STATE_DIR?.trim() ? surfaceEventsDbPath() : ':memory:')
|
|
57
|
+
: surfaceEventsDbPath());
|
|
58
|
+
ownDb = true;
|
|
59
|
+
}
|
|
60
|
+
const record = deps.record ?? recordEvent;
|
|
61
|
+
return record(db, {
|
|
62
|
+
surface: 'ops', direction: 'outbound', domain: 'elanous', category: 'ops',
|
|
63
|
+
kind: input.kind, text, summary: text.slice(0, 120),
|
|
64
|
+
refs: JSON.stringify({ kind: input.kind, ref, url: null }),
|
|
65
|
+
...(at ? { ts: at } : {}),
|
|
66
|
+
});
|
|
67
|
+
} catch (error) {
|
|
68
|
+
try { debug.log('ops.event', 'record-failed', {
|
|
69
|
+
kind: input.kind, reason: error instanceof Error ? error.message : String(error),
|
|
70
|
+
}, { level: 'warn' }); } catch { /* A broken logger cannot change the caller's result. */ }
|
|
71
|
+
return null;
|
|
72
|
+
} finally {
|
|
73
|
+
if (ownDb && db) { try { db.close(); } catch { /* close failure is not the caller's problem */ } }
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -8,7 +8,7 @@ export interface LeaseHolderSnapshot {
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export interface LeaseHolderView {
|
|
11
|
-
get(): Promise<LeaseHolderSnapshot>;
|
|
11
|
+
get(options?: { fresh?: boolean }): Promise<LeaseHolderSnapshot>;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export function createLeaseHolderView({ machine, read, ttlMs = 10_000, now = Date.now }: {
|
|
@@ -20,17 +20,21 @@ export function createLeaseHolderView({ machine, read, ttlMs = 10_000, now = Dat
|
|
|
20
20
|
let cached: LeaseHolderSnapshot | undefined;
|
|
21
21
|
let measuredAt = 0;
|
|
22
22
|
let pending: Promise<LeaseHolderSnapshot> | undefined;
|
|
23
|
+
const readSnapshot = async (): Promise<LeaseHolderSnapshot> => {
|
|
24
|
+
let result: RoleLeaseRead;
|
|
25
|
+
try { result = await read(); }
|
|
26
|
+
catch { result = { kind: 'unmeasured', why: 'read failed' }; }
|
|
27
|
+
return result.kind === 'present'
|
|
28
|
+
? { holder: result.doc.holder, generation: result.doc.generation, iAmHolder: result.doc.holder === machine, known: true }
|
|
29
|
+
: { holder: null, generation: null, iAmHolder: false, known: false };
|
|
30
|
+
};
|
|
23
31
|
return {
|
|
24
|
-
get() {
|
|
32
|
+
get(options) {
|
|
33
|
+
if (options?.fresh) return readSnapshot();
|
|
25
34
|
if (cached && now() - measuredAt < ttlMs) return Promise.resolve(cached);
|
|
26
35
|
if (pending) return pending;
|
|
27
36
|
pending = (async () => {
|
|
28
|
-
|
|
29
|
-
try { result = await read(); }
|
|
30
|
-
catch { result = { kind: 'unmeasured', why: 'read failed' }; }
|
|
31
|
-
const snapshot: LeaseHolderSnapshot = result.kind === 'present'
|
|
32
|
-
? { holder: result.doc.holder, generation: result.doc.generation, iAmHolder: result.doc.holder === machine, known: true }
|
|
33
|
-
: { holder: null, generation: null, iAmHolder: false, known: false };
|
|
37
|
+
const snapshot = await readSnapshot();
|
|
34
38
|
cached = snapshot;
|
|
35
39
|
measuredAt = now();
|
|
36
40
|
return snapshot;
|