elanous 0.2.28 → 0.2.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{y1ltt7oCZxVpC6zVPhZ2O → LSXfY0u9QtfDbejY0Ukf_}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{ab4d57c2.e90bc2cb31949045.js → 0bb0ff36.b8d418980951e5ba.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +287 -0
- package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +62 -0
- package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5492-e05e26a033ba80d2.js → 1335-6731f392c35216eb.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1654.32de4b324981a188.js +23 -0
- package/apps/pwa/out/_next/static/chunks/1834-50625904996a8fa8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +149 -0
- package/apps/pwa/out/_next/static/chunks/1913.7cc6fb6055b1ed3f.js +41 -0
- package/apps/pwa/out/_next/static/chunks/2001.6c7e0fd02190886c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2112-e4efc21a6505d5bc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8578.dff22d988cc2b106.js → 2213.2ccbada92c33ea0f.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2534.e85ae21ad0dac829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5081.a240b63fad28663a.js → 2871.0bca6137343b3f76.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2898.fd781bc7cf01a7b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2940-619bfd8ef337c611.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2846.d6a433b8663819a5.js → 2985.39ccdecd36848b12.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +115 -0
- package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +64 -0
- package/apps/pwa/out/_next/static/chunks/{f4dfbfc0.a69fb12f854882aa.js → 3267c0e6.d34854e7b3984a6e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3278.2e5d15b53a4091c8.js +2 -0
- package/apps/pwa/out/_next/static/chunks/3541-ce3a5424ed5ad7f1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3583.a05e88cc8d594628.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3143.257997a5f1ed79df.js → 3902.e1e71aaac850a045.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{16e57f67.3ea19e893461e611.js → 409f1e57.d0649fc47691ebfe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1146.80d15ea7c6e6ee95.js → 4111.2bfedbb233ad206b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1516.83dd2c1b86b4e507.js → 4174.92ed04922709ac9e.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +36 -0
- package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +286 -0
- package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +77 -0
- package/apps/pwa/out/_next/static/chunks/4745.67d6f99c245af3f7.js +226 -0
- package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9938.b23e4d4dfa0114cd.js → 4999.c064a4000c2a9e94.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5173-233188df2f42c626.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1157.f08bf2b70915e176.js → 5304.04d24756f242a094.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{7752.5cbdd0b433c54af9.js → 5307.60f2209e809bd627.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9917-9e26abc5f7772735.js → 5458-16cd7a2b51b74c8c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6196.34d6b229079e9e28.js → 5525.86debf231e181813.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4593.10f5b9bd702d4a6c.js → 5543.a438b8ab5a13ea47.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +74 -0
- package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +94 -0
- package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7483.ba01c6c209b81bba.js → 6092.a7f99e68b188ca66.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/60fb96c9.360b01d8d4927b7b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9974.e77b4ff4884557b3.js → 6157.0c9af021de4fb31b.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3309.364573ceedbdfd5f.js → 6323.8672b4817a306928.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{94.4cfed21c0b781a06.js → 6433.fc573af22bbc9ab7.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{949.1e7d45ccb71580aa.js → 6517.4147878ac06d584d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6544cb48.a87fe20ddf137be2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +104 -0
- package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2528.3868070ef1be69f9.js → 6767.ea607cf0c20a25af.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +93 -0
- package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7371.80c05c653b08e907.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7391.ebae168025c91b6a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1743.563d3168e95825ef.js → 7502.ccd5b8065545edd0.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +8 -0
- package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5408.377c8c543635b81f.js → 7862.30a8d6482bb238eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7947-d0759430f8042240.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{65ebff95.081daeff622d238e.js → 7a1887c4.f36b88fba31da8fd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2697.76ca2ac3efef6f3b.js → 8018.a32663f04a6fc5f9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8097-92f87bd108322f66.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +1 -0
- package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9002.e5658224e3dc1b6f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9138.b6e80031afb1d973.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4204.a409ab6250c0f6a8.js → 9221.7d22eaf353a2d4e7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5785-ea8d2c633b6688e3.js → 9279-d28c5b7754d010ae.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9398-6aed28f0a96d0d6f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9407.e49124dedf0f5e72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/997ce8a5-2ad501927003b41b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9311.24c8f5ea793253dd.js → 9989.3694300e5f000b14.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-bf3634a117322df7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-3535a4a69f1fafaa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-b9f51447f757fbf2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-fa46d4588e8442c2.js → page-2ebb8fd59b9461f9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-a2fc4e49a4fa4ba8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-5a503541353e60a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-6025101384e361a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f4b630cc8b5273cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-a645f00a06483e9a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-61ac22cbab1ee4ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e9bab7413b028b28.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c992eafe028b642e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-e547e6ce55f1fb33.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-d27e1b9850fd54bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-805ac2e137b7a121.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-0fec29c7ba01894b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-339a07410cd6f36b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/{page-ced0bcfc6542b3fc.js → page-349f2752d8cd37ad.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d5c6dcf31c25cecc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2fd93ed8c9f16580.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-9b564dbff0fefc35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-62f4475d3c38fb9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-814ba51385225776.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-397d479626e5a459.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-af1bba4e3251b728.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ad3be5e7d3fdce9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-f219ccdbc0bf27df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4da93ad35d4a8d28.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-456666766e5ce6fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-7404e377e8adb8c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-14456240ed2a36ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-3a658d5fa6d16a25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-0157de6e85f8bb6b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-cb249e81ed339318.js → page-0a07363b130182a1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-841d73d4ac44ed49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6f43a3d1146e6377.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-521ee23ac8c0abfa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9992ee285efaa83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-3d48e85fa89ec04f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d2ced71132fac9b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-f08358bdf251adb9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-233c71cd5f68f0d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-70151d78de2f375e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-dcac33a3e2cb72c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-149dc1caba411bb9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0448145ccd5c45c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-9cb0c444903da65d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-17e504c396e0e389.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6def8a8e.c81f9ca41028eccf.js → b313b242.cb1265eea908db61.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{e87d89b9.2e71c0ae475d28a1.js → e5012ffe.f727e23c231f4342.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{e117f801.e92bf10242653497.js → ebc7d829.264a0bcb6c750b50.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +1 -0
- package/apps/pwa/out/_next/static/css/{72becfd42807b50d.css → 3f5fc6f96e2cf7b2.css} +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/bin/elanous.mjs +7 -3
- package/graphs/context/nightly-condense.yaml +1 -0
- package/graphs/intake/intake-daily.yaml +8 -1
- package/graphs/intake/recipes.yaml +5 -0
- package/graphs/lecture/lecture-note.yaml +2 -2
- package/graphs/ops/harness-gc.yaml +1 -0
- package/graphs/release/recipes.yaml +3 -0
- package/graphs/release/release-loop.yaml +15 -7
- package/graphs/units/recipes.yaml +3 -0
- package/graphs/units/release-gate-recheck.yaml +15 -0
- package/package.json +2 -1
- package/plugins/agent-team/agents/research.md +1 -0
- package/scripts/check-native-tool-wiring.ts +3 -2
- package/scripts/ci-android-unit-tests.ts +16 -0
- package/scripts/ci-typecheck-changed.ts +40 -11
- package/scripts/coord-channel-watch.sh +45 -19
- package/scripts/coord-role-pack.ts +222 -0
- package/scripts/cron-run.ts +96 -3
- package/scripts/detect-test-interference.ts +38 -5
- package/scripts/gate-pr-cache.ts +65 -0
- package/scripts/gh-surface/capture.ts +126 -0
- package/scripts/gh-surface/gh +40 -0
- package/scripts/import-graph-scc.ts +38 -0
- package/scripts/install.ps1 +19 -0
- package/scripts/intake-social.ts +181 -0
- package/scripts/lecture-note/node.ts +71 -4
- package/scripts/lib/android-toolchain.ts +32 -0
- package/scripts/lib/deterministic-env.ts +62 -0
- package/scripts/lib/gate-test-env.ts +19 -0
- package/scripts/lib/morning-report-options.ts +41 -0
- package/scripts/measure-goal-grounding-corpus.ts +2 -1
- package/scripts/pr-land-extra-remote-gates.ts +49 -0
- package/scripts/ratchets/test-interference-patterns.allowlist.txt +257 -0
- package/scripts/ratchets/test-interference-patterns.ts +367 -0
- package/scripts/release-loop/cut-branch.ts +4 -3
- package/scripts/release-loop/export-check-node.ts +0 -1
- package/scripts/release-loop/fixtures/warm-failure-assertion/sample.junit.xml +8 -0
- package/scripts/release-loop/fixtures/warm-job-029/sample.json +1 -0
- package/scripts/release-loop/fixtures/warm-job-029/sample.junit.xml +10 -0
- package/scripts/release-loop/gate-batch-safe.ts +23 -0
- package/scripts/release-loop/gate-closure.ts +12 -8
- package/scripts/release-loop/gate-diff.ts +1 -1
- package/scripts/release-loop/gate-history.ts +422 -0
- package/scripts/release-loop/gate-host-mirror.ts +66 -0
- package/scripts/release-loop/gate-node.ts +806 -94
- package/scripts/release-loop/gate-partial.ts +106 -9
- package/scripts/release-loop/gate-pr-cache.ts +66 -0
- package/scripts/release-loop/gate-prewarm-plan.ts +66 -0
- package/scripts/release-loop/gate-r2-verdict.ts +189 -0
- package/scripts/release-loop/gate-recheck-plan-node.ts +52 -0
- package/scripts/release-loop/gate-triage-node.ts +190 -0
- package/scripts/release-loop/gate-warm-artifacts.ts +253 -0
- package/scripts/release-loop/import-graph-scc-run.ts +54 -0
- package/scripts/release-loop/import-graph-scc.ts +215 -0
- package/scripts/release-loop/node-verdict.ts +2 -0
- package/scripts/release-loop/probe-pod-host-dirs-live.ts +113 -0
- package/scripts/release-loop/resume-release.ts +33 -4
- package/scripts/release-loop/resume.ts +13 -5
- package/scripts/release-loop/spawn-lane.ts +51 -0
- package/scripts/release-loop/tui-node-checks.ts +23 -0
- package/scripts/release-loop/tui-sim-node.ts +3 -2
- package/scripts/release-loop/unattended-release.ts +16 -0
- package/scripts/release-loop/version-node.ts +62 -4
- package/scripts/test-deterministic.ts +46 -73
- package/scripts/train-reach-grouping.ts +48 -0
- package/scripts/tsc-incremental-cache.ts +86 -0
- package/scripts/tsc-incremental-diagnostics.ts +76 -0
- package/scripts/tsc-main-safety-net.ts +2 -2
- package/scripts/usage-rollup.ts +11 -3
- package/src/acp/client.ts +4 -1
- package/src/acp/core-turn-bridge.ts +145 -24
- package/src/acp/elanous-extensions.ts +2 -0
- package/src/acp/server.ts +2 -0
- package/src/ad-pipeline/run.ts +4 -2
- package/src/agent/ref-grounding.ts +18 -0
- package/src/agent/runner.ts +169 -3
- package/src/agent/subagent-callable.ts +3 -2
- package/src/agent-mission/review-loop.ts +6 -3
- package/src/agent-substrate/acp-implementer.ts +14 -2
- package/src/agent-substrate/pr-reviewer.ts +41 -21
- package/src/agent-substrate/self-review-cli.ts +30 -4
- package/src/autopilot/pr-manager.ts +62 -7
- package/src/briefing/brief-items.ts +24 -22
- package/src/budget/pty-usage-reemit.ts +7 -0
- package/src/budget/run-usage-rollup.ts +9 -0
- package/src/budget/usage-daily-store.ts +98 -0
- package/src/capture/tui-self-report.ts +37 -4
- package/src/chat/chat-cli.ts +10 -2
- package/src/chat/index.ts +107 -20
- package/src/chat/input-control-key.ts +5 -3
- package/src/chat/pickers/modal-runtime.ts +1 -0
- package/src/chat/pickers/modals.ts +3 -1
- package/src/chat/tool-interrupt-behavior.ts +38 -0
- package/src/chat/tool-render/dispatch.ts +5 -1
- package/src/chat/turn-typeahead.ts +191 -29
- package/src/cli/__fixtures__/agent-help-before/agent.txt +4 -2
- package/src/cli/agent-cli.ts +41 -13
- package/src/cli/config-audit.ts +123 -0
- package/src/cli/dashboard-name-flag.ts +48 -0
- package/src/cli/decisions-cli.ts +80 -6
- package/src/cli/doctor-cli.ts +80 -0
- package/src/cli/log-event-names.ts +19 -0
- package/src/cli/mcp-login.ts +21 -5
- package/src/cli/msg-cli.ts +133 -2
- package/src/cli/pr-cli.ts +546 -112
- package/src/cli/pr-land-heavy-remote.ts +233 -0
- package/src/cli/pr-land-overlap-evidence.ts +167 -14
- package/src/cli/pr-land-pod-shadow-job.ts +83 -0
- package/src/cli/pr-land-pod-shadow.ts +16 -3
- package/src/cli/pr-land-virtual-rebase.ts +108 -0
- package/src/cli/pty-takeover-cli.ts +125 -16
- package/src/cli/release-cli.ts +122 -14
- package/src/cli/remote-resolve.ts +2 -1
- package/src/cli/seat-cli.ts +164 -19
- package/src/cli/self-update.ts +5 -2
- package/src/cli/tasks-cli.ts +105 -21
- package/src/cli/usage-cli.ts +146 -12
- package/src/cli/usage-daily-cli.ts +84 -0
- package/src/context-bus/context-first.ts +13 -0
- package/src/context-bus/context-now.ts +95 -7
- package/src/context-bus/ops-events.ts +75 -0
- package/src/control-plane/lease-holder.ts +12 -8
- package/src/control-plane/ledger.ts +163 -4
- package/src/control-plane/server.ts +91 -11
- package/src/core-turn/auth-rejected-notice.ts +41 -0
- package/src/core-turn/run-core-turn.ts +14 -2
- package/src/core-turn/run-goal-loop.ts +239 -4
- package/src/core-turn/seat-turn-cap.ts +79 -0
- package/src/core-turn/short-question.ts +78 -13
- package/src/core-turn/types.ts +10 -0
- package/src/dashboard/acp-active-model.ts +40 -0
- package/src/dashboard/acp-boot.ts +3 -0
- package/src/dashboard/auto-compact-runtime.ts +2 -0
- package/src/dashboard/boot-banner.ts +80 -0
- package/src/dashboard/dashboard-status-lines.ts +11 -0
- package/src/dashboard/detail-viewer-runtime.ts +15 -2
- package/src/dashboard/event-loop-stall-monitor.ts +4 -0
- package/src/dashboard/goal-loop-thinking.ts +16 -0
- package/src/dashboard/hitl-boot.ts +9 -4
- package/src/dashboard/index.ts +448 -998
- package/src/dashboard/input/chat-main-entry-runtime.ts +2 -0
- package/src/dashboard/input/chat-main-log-actions.ts +4 -0
- package/src/dashboard/input/chat-main-log-command.ts +12 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +176 -4
- package/src/dashboard/input/chat-main-session.ts +14 -3
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/chat-main-turn.ts +14 -4
- package/src/dashboard/input/compact-prepass-recovery.ts +130 -0
- package/src/dashboard/input/dashboard-chord-actions.ts +10 -1
- package/src/dashboard/input/dashboard-chord-runtime.ts +2 -0
- package/src/dashboard/input/external-input-host.ts +71 -0
- package/src/dashboard/input/internal-turn.ts +261 -0
- package/src/dashboard/input/log-fold-binding.ts +18 -0
- package/src/dashboard/input/mouse-wiring.ts +17 -4
- package/src/dashboard/input/seat-autowake.ts +318 -0
- package/src/dashboard/input/turn-steer-bridge.ts +164 -0
- package/src/dashboard/log-click-runtime.ts +5 -3
- package/src/dashboard/loop-scheduler.ts +72 -0
- package/src/dashboard/running-build-status.ts +74 -0
- package/src/dashboard/seat-boot-preamble.ts +131 -0
- package/src/dashboard/seat-local-instructions.ts +305 -0
- package/src/dashboard/skill-runtime.ts +2 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +220 -1203
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -1
- package/src/dashboard/slash-runtime/index.ts +13 -0
- package/src/dashboard/slash-runtime/model-choices.ts +35 -0
- package/src/dashboard/term-slash-runtime.ts +15 -0
- package/src/dashboard/turn-busy-teardown.ts +50 -0
- package/src/dashboard/turn-preamble.ts +30 -2
- package/src/dashboard/turn-session-layers.ts +176 -0
- package/src/dashboard/turn-stream-formatter.ts +14 -6
- package/src/dashboard/turn-stream-presentation-applier.ts +8 -0
- package/src/decisions/decision-ledger.ts +45 -4
- package/src/discord-self-message.ts +4 -4
- package/src/domains/release-tool.ts +26 -10
- package/src/domains/surface-events.ts +4 -1
- package/src/domains/watch-default-scheduler.ts +8 -9
- package/src/field-note/transcribe.ts +17 -0
- package/src/fold-stack.ts +24 -1
- package/src/git-fs/dirty.ts +32 -4
- package/src/git-fs/index.ts +43 -1
- package/src/github/remote-call.ts +81 -0
- package/src/goals/registry.ts +46 -6
- package/src/goals/types.ts +7 -1
- package/src/graph-runner/runner.ts +2 -0
- package/src/grok/credential.ts +26 -0
- package/src/harness/harness-clean.ts +2 -1
- package/src/harness/harness-cli-command.ts +52 -5
- package/src/harness/harness-gc.ts +34 -6
- package/src/harness/harness-incidents.ts +57 -20
- package/src/harness/harness-pod-dispatch.ts +87 -10
- package/src/harness/harness-queue.ts +53 -4
- package/src/harness/harness-stop.ts +4 -3
- package/src/harness/harness-substrate-default.ts +78 -7
- package/src/harness/harness-worktree-auto.ts +2 -1
- package/src/harness/harness-worktrees.ts +3 -2
- package/src/hooks/dispatch.ts +2 -1
- package/src/index.ts +166 -26
- package/src/input/external-input-queue.ts +251 -0
- package/src/intake-plane/slash.ts +14 -3
- package/src/interactive-terminal-modal.ts +13 -0
- package/src/keybindings.ts +4 -1
- package/src/llm/route-decision.ts +25 -0
- package/src/llm/tool-loop-steered-rejection.ts +33 -0
- package/src/llm-stream-retry-display.ts +59 -0
- package/src/llm.ts +391 -74
- package/src/log-entry.ts +3 -3
- package/src/log-pane/search.ts +29 -4
- package/src/loops/agent-reply.ts +256 -0
- package/src/loops/budget.ts +37 -7
- package/src/loops/consensus.ts +348 -0
- package/src/loops/loop-cli.ts +3 -2
- package/src/loops/msg-address.ts +57 -0
- package/src/loops/msg-wake.ts +484 -0
- package/src/loops/observe.ts +19 -3
- package/src/loops/orchestrator/inbox.ts +60 -3
- package/src/loops/orchestrator/tick.ts +80 -6
- package/src/loops/orchestrator/traffic.ts +64 -1
- package/src/loops/registry.ts +72 -4
- package/src/market/signed-index.ts +14 -0
- package/src/mcp/mcp-oauth.ts +54 -5
- package/src/memory.ts +20 -5
- package/src/models/prompts.ts +28 -0
- package/src/msg/msg-sse-client.ts +223 -0
- package/src/msg/msg-store.ts +86 -2
- package/src/mss/logging/log-store.ts +225 -1
- package/src/native-tool-catalog.ts +125 -0
- package/src/nexus/DAEMON-THIN-inventory-2026-10-15.md +122 -0
- package/src/nexus/api/http-server.ts +59 -15
- package/src/nexus/api/loop-resources.ts +19 -3
- package/src/nexus/api/ops-api.ts +13 -0
- package/src/nexus/api/project-autopsy.ts +127 -0
- package/src/nexus/api/terminals.ts +3 -0
- package/src/nexus/api/workflow-approvals.ts +2 -0
- package/src/nexus/daemon-thin-inventory.md +37 -0
- package/src/nexus/index.ts +70 -0
- package/src/nexus/onboarding/first-boot-wizard.ts +56 -2
- package/src/nexus/state/state.ts +1 -0
- package/src/oauth/codex-account-store.ts +15 -3
- package/src/oauth/codex-billing-route.ts +31 -0
- package/src/oauth/store.ts +32 -7
- package/src/onboarding/first-run.ts +28 -3
- package/src/ops/overview-cache.ts +16 -4
- package/src/ops/overview-collect.ts +19 -2
- package/src/ops/resources.ts +82 -0
- package/src/panes/log-pane.ts +67 -8
- package/src/persona/presets.ts +44 -0
- package/src/plugins/maker/connector-maker.ts +41 -0
- package/src/plugins/maker/skill-maker.ts +42 -0
- package/src/plugins/maker/wizard-generate.ts +6 -4
- package/src/pr-tool/census.ts +288 -0
- package/src/preview/terminal.ts +14 -1
- package/src/prompt-cache/types.ts +2 -0
- package/src/prompt-enhance/enhance.ts +24 -8
- package/src/prompt-library/chat-conciseness.ts +13 -0
- package/src/prompt-library/universal-preamble.ts +283 -61
- package/src/pty-shell/pty-control-ipc.ts +4 -1
- package/src/pty-shell/pty-manifest.ts +77 -5
- package/src/pty-shell/registry.ts +19 -2
- package/src/pty-shell/tui-run-state.ts +253 -0
- package/src/release-loop/gate-host-reservation.ts +97 -0
- package/src/release-loop/landing-freeze.ts +5 -0
- package/src/release-loop/light-rc.ts +32 -4
- package/src/release-loop/placement.ts +92 -1
- package/src/release-loop/rehearsal-shard-plan.ts +149 -0
- package/src/release-loop/rehearsal.ts +73 -17
- package/src/render.ts +5 -1
- package/src/repl/index.ts +20 -2
- package/src/seat-loop/seat-knowhow.ts +282 -0
- package/src/seat-loop/seat-loop.ts +41 -2
- package/src/seat-loop/seat-report.ts +42 -2
- package/src/seat-loop/traffic-signal.ts +3 -0
- package/src/self-dev/ask-launch-flow.ts +24 -3
- package/src/self-dev/decompose-compose-graph.ts +28 -27
- package/src/self-dev/decompose-proposal.ts +53 -38
- package/src/self-dev/decompose.ts +17 -0
- package/src/self-dev/dev-pipeline.ts +31 -2
- package/src/self-dev/draft-residue.ts +24 -9
- package/src/self-dev/draft-sweep.ts +59 -4
- package/src/self-dev/external-call-zero.ts +77 -0
- package/src/self-dev/launch-preflight-text.ts +6 -0
- package/src/self-dev/launch-preflight.ts +25 -3
- package/src/self-dev/local-supervisor-judge.ts +185 -0
- package/src/self-dev/run-supervisor.ts +300 -24
- package/src/self-dev/run-types.ts +20 -0
- package/src/self-dev/shard-aggregate.ts +15 -2
- package/src/self-dev/shard-plan.ts +47 -0
- package/src/self-dev/shard-run.ts +135 -12
- package/src/self-dev/spawn-lane-files.ts +19 -0
- package/src/self-health/signatures.ts +132 -0
- package/src/self-implement/app-api-budget.ts +51 -11
- package/src/self-implement/config-gate.ts +2 -1
- package/src/self-implement/doctor-visit.ts +118 -0
- package/src/self-implement/expose-gate.ts +2 -1
- package/src/self-implement/gate-artifacts.ts +405 -0
- package/src/self-implement/gate-cli.ts +212 -18
- package/src/self-implement/gate-remote.ts +110 -25
- package/src/self-implement/gate-scenario.ts +85 -0
- package/src/self-implement/goal-author-decompose.ts +80 -16
- package/src/self-implement/goal-author.ts +270 -76
- package/src/self-implement/goal-authoring-grounding.ts +1 -1
- package/src/self-implement/goal-file-name.ts +65 -0
- package/src/self-implement/graph-authority.ts +38 -6
- package/src/self-implement/graph-overlay-condition.ts +92 -1
- package/src/self-implement/ground-goal.ts +2 -1
- package/src/self-implement/heal-triage.ts +79 -0
- package/src/self-implement/host-regate.ts +74 -2
- package/src/self-implement/orchestrator.ts +14 -123
- package/src/self-implement/pr-title.ts +123 -0
- package/src/self-implement/review-mustfix-class.ts +115 -0
- package/src/self-implement/run-checkpoint.ts +235 -0
- package/src/self-implement/run-ledger.ts +266 -17
- package/src/self-implement/run-stop.ts +4 -3
- package/src/self-implement/run-ttl.ts +28 -4
- package/src/self-implement/running-runs.ts +10 -6
- package/src/self-implement/seams.ts +2 -0
- package/src/self-implement/self-implement-runtime.ts +32 -0
- package/src/self-implement/shadow-stage.ts +7 -6
- package/src/self-implement/stop-autoheal.ts +2 -1
- package/src/self-implement/train-gate-remote.ts +37 -8
- package/src/self-implement/train-reach-grouping.ts +157 -0
- package/src/self-implement/train-scenario-layers.ts +133 -0
- package/src/self-implement/uncommitted-work.ts +2 -0
- package/src/session/pending-input.ts +81 -11
- package/src/session/session-start.ts +224 -0
- package/src/session-runtime/index.ts +7 -1
- package/src/session-runtime/parallel-dispatch.ts +22 -5
- package/src/skills/tools/dev-harness.ts +6 -4
- package/src/skills/tools/ops-ledger.ts +707 -0
- package/src/skills/tools/persistent-grounding.ts +47 -7
- package/src/skills/tools/shell.ts +117 -1
- package/src/status/bar.ts +32 -2
- package/src/status/status-provider-info.ts +58 -0
- package/src/steward/resync-tick.ts +114 -23
- package/src/steward/ta-repair-event-collect.ts +158 -0
- package/src/task-agent/card-evidence.ts +25 -1
- package/src/task-agent/green-sweep.ts +8 -3
- package/src/task-agent/judge.ts +76 -0
- package/src/task-agent/land-queue.ts +79 -0
- package/src/task-agent/live-moves.ts +30 -9
- package/src/task-agent/postland-card.ts +5 -0
- package/src/task-agent/prelaunch-already-done.ts +98 -0
- package/src/task-agent/real-launch-guard.ts +37 -0
- package/src/task-agent/rejudge-on-head.ts +93 -13
- package/src/task-agent/remote-rejudge-bind.ts +62 -13
- package/src/task-agent/repair-cycle.ts +58 -7
- package/src/task-agent/repair-worker.ts +7 -0
- package/src/task-agent/run-identity.ts +200 -0
- package/src/task-agent/shadow.ts +50 -3
- package/src/task-agent/task-hand.ts +158 -5
- package/src/task-agent/train-landing.ts +77 -0
- package/src/task-agent/work-order.ts +104 -0
- package/src/task-orchestrator/surfaces/kubectl-transient-retry.ts +51 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +138 -22
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +88 -19
- package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-image-source.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-install-slots.ts +122 -15
- package/src/task-orchestrator/surfaces/pod-lease.ts +20 -6
- package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +169 -0
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +103 -0
- package/src/task-orchestrator/surfaces/pod-result-marker-wait.ts +33 -0
- package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +63 -0
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +19 -3
- package/src/task-orchestrator/surfaces/pod-warm-switch.ts +141 -0
- package/src/task-orchestrator/surfaces/pod-warm-ta-shadow.ts +85 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +153 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +208 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +237 -46
- package/src/telegram.ts +2 -4
- package/src/terminal/session-registry.ts +6 -0
- package/src/thinking-line.ts +12 -3
- package/src/tool-runtime/index.ts +4 -0
- package/src/tool-runtime/ops-ledger-runtimes.ts +84 -0
- package/src/tool-runtime/ref-consult-runtime.ts +17 -2
- package/src/tool-runtime/run-shell-runtime.ts +4 -1
- package/src/tool-runtime/self-cognition-runtimes.ts +5 -1
- package/src/tui/input/pickers.ts +732 -0
- package/src/tui/slash/mission.ts +492 -0
- package/src/tui/slash/term.ts +877 -0
- package/src/tui-client/dashboard-session.ts +9 -0
- package/src/tui.ts +53 -0
- package/src/user-config/gemini-server-tools.ts +9 -0
- package/src/user-config.ts +106 -21
- package/src/util/spawn-sync-output.ts +7 -0
- package/src/ux-sim/fake-bin.ts +154 -0
- package/src/ux-sim/fake-clock.ts +36 -0
- package/src/ux-sim/fake-llm.ts +29 -0
- package/src/ux-sim/headless-tui.ts +72 -0
- package/src/ux-sim/in-process-cli.ts +176 -0
- package/src/ux-sim/temp-git-remote.ts +82 -0
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/recipes/vlog.ts +25 -7
- package/apps/pwa/out/_next/static/chunks/1027.a0f04663d24c2779.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +0 -1
- package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +0 -36
- package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1454-29d1d773d5996a49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +0 -1
- package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +0 -32
- package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3259-86f3be56e43eaf6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +0 -287
- package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4084.15ecaf4240bd9e77.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +0 -8
- package/apps/pwa/out/_next/static/chunks/4565-67e4c620597965c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +0 -149
- package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +0 -1
- package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/599-56f2c0a5cc4a7295.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +0 -23
- package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +0 -77
- package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +0 -64
- package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +0 -62
- package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8085-1e5fce59500a2cc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +0 -226
- package/apps/pwa/out/_next/static/chunks/83a80514-b897b64df43ce108.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +0 -93
- package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +0 -115
- package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +0 -74
- package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/973cbf1b.3bbcf2b41548eca7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-5ab1e47978577c5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-24453f6a302816b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-6c131d30bb1cf871.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-dc0772b11861af51.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-66ad46ed0279feb9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-5159dc8752c6cd29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-c5a2478861c08b87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-f722a9dec084e08b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-256ffd365d32e100.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e0de78ae7b99f01c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-cfbdc44b708d9801.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-4c741eb760f2f77c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-e9ba98f5f1440a21.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-dafc901bb1b72b5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-2f6f303fa114ec24.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-1634081c5272006c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-bb1f05cd51c38944.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-646b50f63b6fe732.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-db069b48a59c8c00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-f736324afa2117c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-6f131b51193a36f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-435f5e2faf02bc01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-497e0eedf20e7890.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-a8d28fdf995e16ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-8966452228753c5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fd5d18656cb432b6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-5663779cb1a37609.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-66a67eb19ebd976b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-3b492aa78cf3c4a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c71267e7681da982.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-a21d1e1797172692.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-781cfc5114e097da.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-478157214db6a023.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-86141f12cf090b7f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-7256c73bb1c36751.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-5c738ca7adef3de5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-0138c8091ec17224.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-cc2f24f16d85e735.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-979d318a534e92da.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-182d394f7e6e096b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-21050928a697ed7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-44b9d807005a9030.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-601fb77340e63c9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-75d3fb5d47af0edf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-11bf9e5725a72c22.js +0 -1
- package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +0 -1
- package/src/dashboard/bench-slash-runtime.ts +0 -40
- package/src/dashboard/input/search-modal-router.ts +0 -9
- package/src/dashboard/modals/pane-key-router.ts +0 -27
- package/src/dashboard/view-slash-runtime.ts +0 -48
- /package/apps/pwa/out/_next/static/{y1ltt7oCZxVpC6zVPhZ2O → LSXfY0u9QtfDbejY0Ukf_}/_ssgManifest.js +0 -0
|
@@ -388,6 +388,131 @@ export const nativeToolCatalog: NativeToolCatalogEntry[] = [
|
|
|
388
388
|
alwaysLoad: false,
|
|
389
389
|
shouldDefer: true,
|
|
390
390
|
},
|
|
391
|
+
// ── Ops-ledger native tools (우편 msg · 판 release checklist) ──────────────
|
|
392
|
+
// OP TUI turns drove msg list/post/ack and release checklist
|
|
393
|
+
// list/move/set/add through `eln` RunShell calls — 1.3–2s of CLI
|
|
394
|
+
// startup each, 30+ spawns per turn, shell stdout amplifying screen
|
|
395
|
+
// defects. These eight tools reuse the SAME durable services
|
|
396
|
+
// in-process (msg-store SQLite ledger · release-loop checklist
|
|
397
|
+
// ledger), preserving the structured results, the seat/OP permission
|
|
398
|
+
// boundaries (ELANOUS_TRACK actor routing, seatMove rules, the HQ
|
|
399
|
+
// lease fence) and the claim-history audit. Every call is a local
|
|
400
|
+
// ledger read/write — no process spawn, no network, no running-runs
|
|
401
|
+
// sweep — so a TUI OP turn needs zero RunShell round-trips (RunShell
|
|
402
|
+
// steers these exact CLI shapes to the native tools; see
|
|
403
|
+
// src/skills/tools/shell.ts). Dispatchers: src/skills/tools/ops-ledger.ts.
|
|
404
|
+
{
|
|
405
|
+
id: 'msg_list',
|
|
406
|
+
kind: 'other',
|
|
407
|
+
aliases: ['MsgList', 'msg_list'],
|
|
408
|
+
displayName: 'MsgList',
|
|
409
|
+
description: 'List durable seat-addressed messages for one recipient WITHOUT acknowledging them. Same SQLite ledger as `elanous msg list`, in-process — no CLI startup. Reading never advances the acknowledgement cursor; `after` pages beyond it.',
|
|
410
|
+
promptSummary: '`MsgList(to, after?, limit?)` (durable seat mailbox listing · read never acks · in-process)',
|
|
411
|
+
host: ['skill', 'tui'],
|
|
412
|
+
safety: ['read-only'],
|
|
413
|
+
supportsParallel: true,
|
|
414
|
+
defaultEnabled: true,
|
|
415
|
+
intentScope: 'ops-fleet',
|
|
416
|
+
cleanerFitThanShell: true,
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
id: 'msg_post',
|
|
420
|
+
kind: 'other',
|
|
421
|
+
aliases: ['MsgPost', 'msg_post'],
|
|
422
|
+
displayName: 'MsgPost',
|
|
423
|
+
description: 'Post a durable seat-addressed message. Same SQLite ledger as `elanous msg post`, in-process — no CLI startup. ALL may receive but never send; `kind` tags the message; `replyTo` points a reply at a question message ID.',
|
|
424
|
+
promptSummary: '`MsgPost(from, to, body, kind?, replyTo?)` (post durable seat message · in-process)',
|
|
425
|
+
host: ['skill', 'tui'],
|
|
426
|
+
safety: ['mutating'],
|
|
427
|
+
supportsParallel: false,
|
|
428
|
+
defaultEnabled: true,
|
|
429
|
+
intentScope: 'ops-fleet',
|
|
430
|
+
cleanerFitThanShell: true,
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
id: 'msg_ack',
|
|
434
|
+
kind: 'other',
|
|
435
|
+
aliases: ['MsgAck', 'msg_ack'],
|
|
436
|
+
displayName: 'MsgAck',
|
|
437
|
+
description: 'Acknowledge durable messages for one recipient through an ID, advancing their cursor so later MsgList calls start after them. Same SQLite ledger as `elanous msg ack`, in-process.',
|
|
438
|
+
promptSummary: '`MsgAck(to, id)` (advance a seat’s ack cursor through id · in-process)',
|
|
439
|
+
host: ['skill', 'tui'],
|
|
440
|
+
safety: ['mutating'],
|
|
441
|
+
supportsParallel: false,
|
|
442
|
+
defaultEnabled: true,
|
|
443
|
+
intentScope: 'ops-fleet',
|
|
444
|
+
cleanerFitThanShell: true,
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
id: 'checklist_list',
|
|
448
|
+
kind: 'other',
|
|
449
|
+
aliases: ['ChecklistList', 'checklist_list'],
|
|
450
|
+
displayName: 'ChecklistList',
|
|
451
|
+
description: 'List the release-checklist cells for one version with per-status summary, blocked cells, per-owner counts and screen-parity warnings. Same ledger as `elanous release checklist list --json`, in-process. Read-only.',
|
|
452
|
+
promptSummary: '`ChecklistList(version?, owner?)` (판 checklist snapshot + summary + parity · in-process)',
|
|
453
|
+
host: ['skill', 'tui'],
|
|
454
|
+
safety: ['read-only'],
|
|
455
|
+
supportsParallel: true,
|
|
456
|
+
defaultEnabled: true,
|
|
457
|
+
intentScope: 'ops-fleet',
|
|
458
|
+
cleanerFitThanShell: true,
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
id: 'checklist_add',
|
|
462
|
+
kind: 'other',
|
|
463
|
+
aliases: ['ChecklistAdd', 'checklist_add'],
|
|
464
|
+
displayName: 'ChecklistAdd',
|
|
465
|
+
description: 'Add one cell to a release checklist (owner · priority · deadlineVersion · predecessors · refs; kind/dispatchKind/CEO load/accelerator afterwards via ChecklistEdit). Same ledger, HQ lease fence and claim-history audit as `elanous release checklist add`, in-process.',
|
|
466
|
+
promptSummary: '`ChecklistAdd(id, title, version?, owner?, kind?, …)` (add a release checklist cell · in-process)',
|
|
467
|
+
host: ['skill', 'tui'],
|
|
468
|
+
safety: ['mutating'],
|
|
469
|
+
supportsParallel: false,
|
|
470
|
+
defaultEnabled: true,
|
|
471
|
+
intentScope: 'ops-fleet',
|
|
472
|
+
cleanerFitThanShell: true,
|
|
473
|
+
},
|
|
474
|
+
{
|
|
475
|
+
id: 'checklist_set',
|
|
476
|
+
kind: 'other',
|
|
477
|
+
aliases: ['ChecklistSet', 'checklist_set'],
|
|
478
|
+
displayName: 'ChecklistSet',
|
|
479
|
+
description: 'Set one release-checklist cell’s status and/or evidence line (⊕ additive refs). Same ledger, HQ lease fence, actor audit and screen-parity warning as `elanous release checklist set`, in-process. Other metadata goes through ChecklistEdit.',
|
|
480
|
+
promptSummary: '`ChecklistSet(id, version?, status?, evidence?, refs?)` (cell status/evidence · seat-audited · in-process)',
|
|
481
|
+
host: ['skill', 'tui'],
|
|
482
|
+
safety: ['mutating'],
|
|
483
|
+
supportsParallel: false,
|
|
484
|
+
defaultEnabled: true,
|
|
485
|
+
intentScope: 'ops-fleet',
|
|
486
|
+
cleanerFitThanShell: true,
|
|
487
|
+
},
|
|
488
|
+
{
|
|
489
|
+
id: 'checklist_edit',
|
|
490
|
+
kind: 'other',
|
|
491
|
+
aliases: ['ChecklistEdit', 'checklist_edit'],
|
|
492
|
+
displayName: 'ChecklistEdit',
|
|
493
|
+
description: 'Change exactly one metadata field of a release-checklist cell (owner · priority · disposition · kind · dispatchKind · deadlineVersion · predecessors · ceoMinutes · ceoDate · accelerator) — one field per call so a model that fills every property cannot clobber the rest. Same ledger, HQ lease fence and actor audit as `elanous release checklist set`, in-process.',
|
|
494
|
+
promptSummary: '`ChecklistEdit(id, field, value, version?)` (one cell metadata field · seat-audited · in-process)',
|
|
495
|
+
host: ['skill', 'tui'],
|
|
496
|
+
safety: ['mutating'],
|
|
497
|
+
supportsParallel: false,
|
|
498
|
+
defaultEnabled: true,
|
|
499
|
+
intentScope: 'ops-fleet',
|
|
500
|
+
cleanerFitThanShell: true,
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
id: 'checklist_move',
|
|
504
|
+
kind: 'other',
|
|
505
|
+
aliases: ['ChecklistMove', 'checklist_move'],
|
|
506
|
+
displayName: 'ChecklistMove',
|
|
507
|
+
description: 'Move one checklist cell to another release version in a single transaction. Permission routing preserved: a seat moves only its own cell into the next version (capacity-checked), OP moves unrestricted, no ELANOUS_TRACK runs unchecked as anonymous. Same ledger and history audit as `elanous release checklist move`, in-process.',
|
|
508
|
+
promptSummary: '`ChecklistMove(id, from, to, reason)` (move a cell across versions · seat/OP rules preserved · in-process)',
|
|
509
|
+
host: ['skill', 'tui'],
|
|
510
|
+
safety: ['mutating'],
|
|
511
|
+
supportsParallel: false,
|
|
512
|
+
defaultEnabled: true,
|
|
513
|
+
intentScope: 'ops-fleet',
|
|
514
|
+
cleanerFitThanShell: true,
|
|
515
|
+
},
|
|
391
516
|
// Input-policy tools — Phase 6 of the unified-input plan.
|
|
392
517
|
// SetInputMode is mutating but side-effect is tiny (context tag +
|
|
393
518
|
// onEnter/onExit). GetInputPolicy is read-only. SetInputBinding is
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# DAEMON-THIN 1단계 산출물 — 데몬 안 로직 목록 ⊕ 뺄 순서 (측정 먼저)
|
|
2
|
+
|
|
3
|
+
- 골: 27fa65fa79651b12 · 칸 [OP · 0.2.35 DAEMON-THIN · TASK-AGENT(OP 디스패처)]
|
|
4
|
+
- 준거: RFC-universe-by-house §4 · 루브릭 A1 E2 R2 D0 M1 B0 S2 X1 · 기둥 B(데몬 얇게, 재시작 없는 받침 강건성)
|
|
5
|
+
- 대상 파일: `src/nexus/index.ts` (runNexus 본체, 4,030줄) · `src/workflow-runtime/daemon.ts` (createWorkflowRuntimeDaemon, 440줄)
|
|
6
|
+
- 이 문서는 1단계(측정) 산출물이다 — **코드 동작은 바꾸지 않는다.**
|
|
7
|
+
|
|
8
|
+
## 1. 데몬 안 로직 목록 — src/nexus/index.ts (runNexus)
|
|
9
|
+
|
|
10
|
+
### A. 남길 것 (얇은 데몬에 그대로)
|
|
11
|
+
|
|
12
|
+
| # | 로직 | 위치(줄) | 비고 |
|
|
13
|
+
|---|---|---|---|
|
|
14
|
+
| A1 | 싱글인스턴스 락 (`~/.elanous/nexus/.lock`) | 부트 초반 | 보존 계약 |
|
|
15
|
+
| A2 | `runtime.json` 사이드카 (pid·startedAt·phase·httpPort·httpAuth·tailnetUrl·template — `NexusRuntimeMeta`, `src/nexus/runtime.ts`) | 부트 + `onRuntimeSidecarWrite` | 외부 발견 계약 — 형식 무변 |
|
|
16
|
+
| A3 | HTTP 서버 `startNexusHttpServer` 배선 | L2951(DI 기본값 `opts.startNexusHttpServerFn ?? startNexusHttpServer`) · L2988(호출 `httpServer = startHttpServer({`) | 데몬 표면의 핵심 |
|
|
17
|
+
| A4 | PWA static (staticDir) | L3004(`...(pwaStaticDir ? { staticDir: pwaStaticDir } : {})`) | 남긴다 |
|
|
18
|
+
| A5 | SSE 이벤트버스 (`NexusEventBus` + bridge) | 생성 L1069(`const eventBus = new NexusEventBus();`) · 배선 시 `eventBus` 인자(L2991 인접) · L2999(`...(wsBridgeOpts ? { wsBridge: wsBridgeOpts } : {})`) | 남긴다 |
|
|
19
|
+
| A6 | 발송 substrate (`buildOutboundSubstrate` — telegram/discord 발송) | L2784(선언) · L2788(`outboundSubstrate = buildOutboundSubstrate({`) | 발송은 남긴다 |
|
|
20
|
+
| A7 | 카드 webPushDecisionTimer | L2762(`webPushDecisionTimer = setInterval(`) · L2767(`.unref()`) | 카드는 남긴다(발송 타이머 자체) |
|
|
21
|
+
| A8 | 종결 훅: `gracefulExit`/`cleanExit` · `wrappedRelease` · `drainTelegramThen` | 임포트 L251(`gracefulExit, cleanExit`) · `wrappedRelease` 정의 L3312 · `drainTelegramThen` 정의 L3514 · 발화 L3710·L3770(`drainTelegramThen(() => gracefulExit({`) · `cleanExit` L3730·L3790 | **무조건 보존** — 재시작 0·깨끗한 종료의 받침 |
|
|
22
|
+
| A9 | supervisor 배선 (`createSupervisor` + TabRegistry + 종결 순서) | L1854(`supervisor = createSupervisor({`) | 운영 레일의 받침 |
|
|
23
|
+
| A10 | 워크플로 데몬 배선 (`createWorkflowRuntimeDaemon` — 트리거 소스 구독) | L2438(`workflowDaemon = createWorkflowRuntimeDaemon({`) | emit→디스패치 경계는 유지(2단계 이후 슬림화) |
|
|
24
|
+
|
|
25
|
+
### B. 뺄 것 (짧게 사는 프로세스로 이전)
|
|
26
|
+
|
|
27
|
+
| # | 로직 | 위치(줄) | 이전 형태 |
|
|
28
|
+
|---|---|---|---|
|
|
29
|
+
| B1 | §5-③ continuation scheduler (자율 idle-continuation) | L2272–2419 (주석 L2272 · try L2278 · catch L2417–2419) | bun 자식 프로세스 |
|
|
30
|
+
| B2 | TOX (`wireTox` 부트 + subagent surface bridge) | L2242–2269 (`wireTox({` L2242 · catch 경고 L2269) | bun 자식 프로세스 |
|
|
31
|
+
| B3 | thread sweep | L2546–2589 (주석 L2546 `★ UR4b 조율자 상주 thread-awareness sweep` · try L2550 · `setInterval`(180초 주기) L2575 · catch L2587–2589) | bun 자식 프로세스 |
|
|
32
|
+
| B4 | dig/replay armer (dig L2387–2400 · replay L2402–2415) | L2387–2415 — **B1 try 블록 내부에 중첩**(L2387 > B1 try L2278 · L2415 < B1 catch L2417) ⇒ B1과 분리해 이전 불가, 같은 조각으로만 | bun 자식 프로세스(B1 조각에 동승) |
|
|
33
|
+
| B5 | catch-up sweep | L2489–2518 (주석 L2489 `Mission Fabric 통합 U4b — 이관잡(run_via='trigger') catch-up 자기회복` · try L2494 · catch L2515–2517) | bun 자식 프로세스 |
|
|
34
|
+
| B6 | patcher substrate (`buildPatcherSubstrate`) | L2869(`patcherSubstrateHandle = buildPatcherSubstrate({`) | bun 자식 프로세스 |
|
|
35
|
+
| B7 | devices cron (`buildDevicesSubstrate`) | L2897(`devicesSubstrateHandle = buildDevicesSubstrate({`) | bun 자식 프로세스 |
|
|
36
|
+
| B8 | 텔레그램/디스코드 폴러 (`wireNexusTelegramQaPollers` 정의 L301 · 호출 L2715·L2727) — **폴링** 로직. 발송(A6)과 구분 | 부트 배선 | bun 자식 프로세스 |
|
|
37
|
+
| B9 | 카드 decision 판단 로직 (webPushDecisionTimer의 «판단» 부분 — 타이머·발송은 A7로 남김) | L2752–2767 (판단 게이트 L2752 — 타이머 A7 L2762와 같은 블록) | bun 자식 프로세스 |
|
|
38
|
+
|
|
39
|
+
### B-제외 검토 (빼지 «않는» 것 — 목록 대조용)
|
|
40
|
+
|
|
41
|
+
- `startSessionDecisionForward` — 발송 표면(A6 계열)과 결합 → 이번 칸에서는 남긴다.
|
|
42
|
+
- workflow 트리거 소스 구독(daemon.ts) — dispatch 경계는 데몬에 유지(TASK-AGENT가 붙는 지점이므로 칸 근거 끝 반영).
|
|
43
|
+
|
|
44
|
+
## 2. 데몬 안 로직 목록 — src/workflow-runtime/daemon.ts (createWorkflowRuntimeDaemon)
|
|
45
|
+
|
|
46
|
+
| # | 로직 | 상태 |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| C1 | 트리거 소스 구독 (schedule/webhook/discord/telegram/chat) | **남긴다** — 데몬의 디스패치 표면 |
|
|
49
|
+
| C2 | emit→`runWorkflowToCompletion` 디스패치 | 남긴다 (슬림화는 후속 조각) |
|
|
50
|
+
| C3 | `registerWorkflow` 라이브 등록 | 남긴다 |
|
|
51
|
+
| C4 | dispatchWebhook/Chat/Discord/Telegram | 남긴다 |
|
|
52
|
+
| C5 | L212 `lifecycle === 'draft'` 게이트 (recordSkip 3-sink) | **남긴다** — 칸 근거 끝(draft #27303 닫음)의 반영 지점. TASK-AGENT(OP 디스패처)가 붙는 경계 |
|
|
53
|
+
| C6 | run-to-completion 내부의 판단·루프·하니스 성 로직 — **구체 경계(실측)**: `emit` 트리거 콜백 전체 L183–261(페이로드 정규화 → C5 draft 게이트 L212 → runId 생성 L228 → `await runFn(...)` L231–234). `runFn` = `runWorkflowToCompletion`(임포트 L14 · 주입 L152 `const runFn = opts.runWorkflow ?? runWorkflowToCompletion;`) | 뺄 후보 — 별도 조각에서 자식 프로세스로 (이번 1단계에서는 경계 실측만) |
|
|
54
|
+
|
|
55
|
+
## 3. 뺄 순서 (확정)
|
|
56
|
+
|
|
57
|
+
1. **B1 continuation scheduler (L2272–2418)** — 첫 조각. §5-③ 자율 발화라 위험도가 가장 높고 경계가 가장 깨끗하다. **B4 dig/replay armer(L2387–2415)는 이 조각에 동승한다** — §1 B4 행대로 B1 try 블록 내부에 중첩되어 분리 이전 불가(별도 단계 없음).
|
|
58
|
+
2. **B2 TOX wireTox (L2242–2269)** — B1과 같은 조각으로 함께 이전 가능(분해 권고 조각 2의 첫 명세: "continuation·TOX 등 목록 상 첫 번째").
|
|
59
|
+
3. B3 thread sweep (L2546–2589)
|
|
60
|
+
4. B5 catch-up sweep
|
|
61
|
+
5. B6 patcher substrate
|
|
62
|
+
6. B7 devices cron
|
|
63
|
+
7. B8 텔레그램/디스코드 폴러
|
|
64
|
+
8. B9 카드 decision 판단
|
|
65
|
+
9. C6 run-to-completion 내부 판단·루프·하니스 성 로직(daemon.ts emit 콜백 L183–261) — 별도 조각(§2 C6 행의 구체 경계대로)
|
|
66
|
+
|
|
67
|
+
## 4. 이전 형태(수송 계약) — running-runs 패턴 복제
|
|
68
|
+
|
|
69
|
+
- 짧게 사는 **bun 자식 프로세스** (`src/nexus/api/running-runs-background.ts` / `running-runs-child.ts` 선례):
|
|
70
|
+
- 자식 스크립트가 로직을 실행하고 결과를 stdout JSON으로 인쇄
|
|
71
|
+
- 부모는 15s refresh · 60s timeout · in-flight dedup로 스냅샷만 즉시 반환
|
|
72
|
+
- supervisor TabSpec (`src/nexus/kinds/daemon.ts` `createDaemonTabSpec` 계약): socket health 10s · on-crash backoff [5s,15s,60s] · maxPerHour 5 — **재시작 0 운영 레일**.
|
|
73
|
+
- 호출자: `runNexus()`(src/nexus/index.ts) 안 해당 로직의 기존 위치 — diff에서 호출 치환이 보여야 한다(wiring 증거).
|
|
74
|
+
|
|
75
|
+
## 5. 보존 지점 (무조건)
|
|
76
|
+
|
|
77
|
+
- `gracefulExit`/`cleanExit` · `wrappedRelease` · `drainTelegramThen` 종결 훅 — 이전되는 로직의 자식 프로세스는 이 훅에서 함께 정지되어야 한다.
|
|
78
|
+
- `runtime.json` 사이드카 형식(`NexusRuntimeMeta`) — 무변.
|
|
79
|
+
- 다른 명령·화면의 기본 동작 · 원장 형식 — 무변.
|
|
80
|
+
- 칸 범위 밖(src/nexus/index.ts · src/workflow-runtime/daemon.ts 외)은 건드리지 않는다. (자식 스크립트·TabSpec 신규 파일은 이 목적의 산출물로 칸 근거가 허용하는 범위에서 후속 조각이 판단한다.)
|
|
81
|
+
|
|
82
|
+
## 6. 남은 것 (칸 근거 끝 반영)
|
|
83
|
+
|
|
84
|
+
- 이번 런(1단계) = 이 문서(목록 ⊕ 순서)까지. 가지 보존, 재발사는 디스패처·TA 판단.
|
|
85
|
+
- 미이전 항목: 위 §3 전부 (B1–B9 · C6) — 순서 확정만 됨.
|
|
86
|
+
|
|
87
|
+
## 7. 검증 기록 (1단계 실측 · 줄 단위 대조)
|
|
88
|
+
|
|
89
|
+
이 절은 §1 목록이 실제 코드와 대응하는지 `rg -n`으로 대조한 실측 기록이다. 이 라운드에 코드는 건드리지 않았다(1단계 = 측정 먼저).
|
|
90
|
+
|
|
91
|
+
| 문서 항목 | 실측 (rg -n on src/nexus/index.ts) | 일치 |
|
|
92
|
+
|---|---|---|
|
|
93
|
+
| B1 continuation | L2272 `nexus boot: autonomous continuation scheduler` … L2418 | ✅ |
|
|
94
|
+
| B2 TOX | L2242 `nexus boot: TOX` … L2269 | ✅ |
|
|
95
|
+
| B3 thread sweep | L2546 `UR4b 조율자 상주 thread-awareness sweep` … L2589 | ✅ |
|
|
96
|
+
| B4 dig/replay armer | L2387 `nexus boot: dig/replay armer` (continuation 블록 내부) | ✅ |
|
|
97
|
+
| B5 catch-up sweep | L2489 `이관잡 catch-up 자기회복` | ✅ |
|
|
98
|
+
| A3 HTTP 배선 | `rg -n 'startNexusHttpServer\('` → L2951 호출 | ✅ |
|
|
99
|
+
| A7 카드 타이머 | `rg -n 'webPushDecisionTimer'` → L2762 | ✅ |
|
|
100
|
+
| A8 종결 훅 | L3312 `Awaiting completion of async termination tasks (p0)` · L3514 `drainTelegramThen(…)` · L3710 `wireTox` 자동 해제 | ✅ |
|
|
101
|
+
| B6/B7 | `buildPatcherSubstrate`·`buildDevicesSubstrate` 임포트 + `wireSubstrates` L3170 | ✅ |
|
|
102
|
+
|
|
103
|
+
### 판정선 시험
|
|
104
|
+
|
|
105
|
+
골이 지정한 11개 경로 중 이 트리에 실재하는 8개와 그 자리의 실물 시험(총 12파일)을 실행했다:
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
bun test src/nexus/index.test.ts test/workflow-runtime-daemon.test.ts \
|
|
109
|
+
src/nexus/api/running-runs-background.test.ts test/nexus-supervisor-health.test.ts \
|
|
110
|
+
test/nexus-supervisor-restart.test.ts test/nexus-kinds-daemon.test.ts \
|
|
111
|
+
test/nexus-daemon-tab-default-off.test.ts test/nexus-runtime-integration.test.ts \
|
|
112
|
+
test/nexus-prompt-stream-sse.test.ts src/nexus/api/task-cards-api.test.ts \
|
|
113
|
+
test/nexus-headless-mode.test.ts test/nexus-graceful-exit.test.ts
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
결과: **182 pass · 0 fail · 1 skip**. 골이 지정한 3개 경로(`supervisor/index`·`kinds/daemon`·`sse-heartbeat`)는 이 트리에 존재하지 않고(경로 실측: `bun test 'src/nexus/supervisor/index.test.ts'` → `error: Could not find`), 같은 단위를 커버하는 실물 시험이 위 목록으로 돌았다.
|
|
117
|
+
|
|
118
|
+
### §간 정합 대조 (must-fix 수리 기록)
|
|
119
|
+
|
|
120
|
+
- §1 B4 행(«B1 try 블록 내부 중첩 ⇒ 분리 이전 불가, 같은 조각으로만(B1 조각에 동승)») ↔ §3: B4는 §3에서 독립 단계로 존재하지 «않고» 1번 B1 항에 «B4 dig/replay armer는 이 조각에 동승한다»로 명시 — 모순 0건. 재현: `rg -n '같은 조각|이 조각에 동승' src/nexus/DAEMON-THIN-inventory-2026-10-15.md` → §1 B4 행·§3 1번만 B4를 언급(§3 4번 독립 단계 행은 삭제됨).
|
|
121
|
+
- §2 C6 행(구체 경계: emit 콜백 L183–261 · runFn = runWorkflowToCompletion) ↔ §3: C6가 §3 9번에 같은 경계로 배치 — §3가 C6 없이 끝나던 공백 제거.
|
|
122
|
+
- 골 문서 U층 ↔ 게이트 관측: 이 diff에는 실행 코드 변경이 없다(`Verify-by-breaking: skipped; reason=no-changes`). 골 U층의 «데몬 얇음·자식 프로세스 이전·재시작 0» 줄은 «이 조각에서 미측정 — 후속 조각(이전 완료 후) 판정»으로 정정했다(§6 미이전 명시와 정합). `runNexus()` 실경로 관측은 후속 조각의 수용 기준으로 이관된다.
|
|
@@ -176,6 +176,7 @@ import { dispatchPersonaRoute } from './personas.js';
|
|
|
176
176
|
import { handleMe, operatorSignal } from './operator.js';
|
|
177
177
|
import { handleGraphRunRoute } from '../../graph-runner/graph-run-api.js';
|
|
178
178
|
import { handleOpsApi } from './ops-api.js';
|
|
179
|
+
import { handleProjectAutopsy } from './project-autopsy.js';
|
|
179
180
|
import { handleRoleJudge } from './role-judge.js';
|
|
180
181
|
import { handleAudioStt } from './audio-stt.js';
|
|
181
182
|
import { handleLlmModels } from './llm-models.js';
|
|
@@ -860,29 +861,53 @@ function isWithinRoot(path: string, root: string): boolean {
|
|
|
860
861
|
return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));
|
|
861
862
|
}
|
|
862
863
|
|
|
864
|
+
/** realpath-resolved folder-root allow-list; a missing root grants nothing. */
|
|
865
|
+
function resolveFolderRoots(roots: string[]): string[] {
|
|
866
|
+
const allowed: string[] = [];
|
|
867
|
+
for (const root of roots) {
|
|
868
|
+
try { allowed.push(realpathSync(root)); } catch { /* a missing root grants nothing */ }
|
|
869
|
+
}
|
|
870
|
+
return allowed;
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
/** Outcome of the folder-root allow-list check shared by the picker and project creation. */
|
|
874
|
+
type FolderRootResolution =
|
|
875
|
+
| { ok: true; path: string }
|
|
876
|
+
| { ok: false; error: 'folder_unavailable' | 'outside_allowed_roots'; status: 404 | 403 };
|
|
877
|
+
|
|
878
|
+
/**
|
|
879
|
+
* Resolves a folder path against the allow-listed roots with realpath first,
|
|
880
|
+
* so `..` segments and symlinks cannot escape the roots. A path that cannot
|
|
881
|
+
* be resolved is unavailable (404); a resolved path outside every root is
|
|
882
|
+
* refused (403).
|
|
883
|
+
*/
|
|
884
|
+
function resolveWithinFolderRoots(requested: string, allowed: string[]): FolderRootResolution {
|
|
885
|
+
let path: string;
|
|
886
|
+
try { path = realpathSync(requested); }
|
|
887
|
+
catch { return { ok: false, error: 'folder_unavailable', status: 404 }; }
|
|
888
|
+
if (!allowed.some(root => isWithinRoot(path, root))) {
|
|
889
|
+
return { ok: false, error: 'outside_allowed_roots', status: 403 };
|
|
890
|
+
}
|
|
891
|
+
return { ok: true, path };
|
|
892
|
+
}
|
|
893
|
+
|
|
863
894
|
/**
|
|
864
895
|
* Remote folder picker: lists sub-folders under an allow-listed root only.
|
|
865
896
|
* Every path is resolved with realpath first, so `..` segments and symlinks cannot escape the roots;
|
|
866
897
|
* dot-folders are hidden and symlinked entries that point outside the roots are not listed.
|
|
867
898
|
*/
|
|
868
899
|
export function handleProjectFoldersGet(req: Request, roots: string[] = [homedir()]): Response {
|
|
869
|
-
const allowed
|
|
870
|
-
for (const root of roots) {
|
|
871
|
-
try { allowed.push(realpathSync(root)); } catch { /* a missing root grants nothing */ }
|
|
872
|
-
}
|
|
900
|
+
const allowed = resolveFolderRoots(roots);
|
|
873
901
|
if (allowed.length === 0) return jsonResponse({ error: 'folder_unavailable' }, 404);
|
|
874
902
|
const requested = new URL(req.url).searchParams.get('path') ?? allowed[0]!;
|
|
875
903
|
if (!isAbsolute(requested) || requested.includes('\0')) return jsonResponse({ error: 'invalid_folder' }, 400);
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
debug.log('nexus.projects', 'folders-unavailable', { reason: 'missing' });
|
|
880
|
-
return jsonResponse({ error:
|
|
881
|
-
}
|
|
882
|
-
if (!allowed.some(root => isWithinRoot(path, root))) {
|
|
883
|
-
debug.log('nexus.projects', 'folders-refused', { reason: 'outside-roots' });
|
|
884
|
-
return jsonResponse({ error: 'outside_allowed_roots' }, 403);
|
|
904
|
+
const resolved = resolveWithinFolderRoots(requested, allowed);
|
|
905
|
+
if (!resolved.ok) {
|
|
906
|
+
if (resolved.status === 403) debug.log('nexus.projects', 'folders-refused', { reason: 'outside-roots' });
|
|
907
|
+
else debug.log('nexus.projects', 'folders-unavailable', { reason: 'missing' });
|
|
908
|
+
return jsonResponse({ error: resolved.error }, resolved.status);
|
|
885
909
|
}
|
|
910
|
+
const path = resolved.path;
|
|
886
911
|
try {
|
|
887
912
|
if (!statSync(path).isDirectory()) return jsonResponse({ error: 'not_directory' }, 400);
|
|
888
913
|
const folders = readdirSync(path, { withFileTypes: true })
|
|
@@ -904,7 +929,12 @@ export function handleProjectFoldersGet(req: Request, roots: string[] = [homedir
|
|
|
904
929
|
}
|
|
905
930
|
}
|
|
906
931
|
|
|
907
|
-
|
|
932
|
+
/**
|
|
933
|
+
* Project creation. A `primaryFolder`, when given, must pass the same
|
|
934
|
+
* projectFolderRoots allow-list as the remote folder picker: realpath first,
|
|
935
|
+
* so `..` segments and symlinks cannot persist a folder outside the roots.
|
|
936
|
+
*/
|
|
937
|
+
export async function handleProjectsPost(req: Request, roots: string[] = [homedir()]): Promise<Response> {
|
|
908
938
|
let body: unknown;
|
|
909
939
|
try { body = await req.json(); }
|
|
910
940
|
catch { return jsonResponse({ error: 'invalid_json' }, 400); }
|
|
@@ -918,6 +948,16 @@ export async function handleProjectsPost(req: Request): Promise<Response> {
|
|
|
918
948
|
if (primaryFolder !== undefined && (typeof primaryFolder !== 'string' || !isAbsolute(primaryFolder))) {
|
|
919
949
|
return jsonResponse({ error: 'invalid_primary_folder' }, 400);
|
|
920
950
|
}
|
|
951
|
+
if (typeof primaryFolder === 'string') {
|
|
952
|
+
const allowed = resolveFolderRoots(roots);
|
|
953
|
+
if (allowed.length === 0) return jsonResponse({ error: 'folder_unavailable' }, 404);
|
|
954
|
+
const resolved = resolveWithinFolderRoots(primaryFolder, allowed);
|
|
955
|
+
if (!resolved.ok) {
|
|
956
|
+
if (resolved.status === 403) debug.log('nexus.projects', 'post-primary-folder-refused', { reason: 'outside-roots' });
|
|
957
|
+
else debug.log('nexus.projects', 'post-primary-folder-unavailable', { reason: 'missing' });
|
|
958
|
+
return jsonResponse({ error: resolved.error }, resolved.status);
|
|
959
|
+
}
|
|
960
|
+
}
|
|
921
961
|
return jsonResponse({ project: createProject({ name, ...(primaryFolder !== undefined ? { primaryFolder } : {}) }) }, 201);
|
|
922
962
|
}
|
|
923
963
|
|
|
@@ -1497,7 +1537,11 @@ export async function routeRequest(
|
|
|
1497
1537
|
}
|
|
1498
1538
|
if (pathname === '/v1/projects' && (method === 'GET' || method === 'POST')) {
|
|
1499
1539
|
if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
|
|
1500
|
-
return method === 'GET' ? handleProjectsGet() : handleProjectsPost(req);
|
|
1540
|
+
return method === 'GET' ? handleProjectsGet() : handleProjectsPost(req, opts.projectFolderRoots);
|
|
1541
|
+
}
|
|
1542
|
+
if (pathname.startsWith('/v1/projects/') && pathname.endsWith('/autopsy') && method === 'GET') {
|
|
1543
|
+
if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
|
|
1544
|
+
return handleProjectAutopsy(req, pathname.slice('/v1/projects/'.length, pathname.length - '/autopsy'.length));
|
|
1501
1545
|
}
|
|
1502
1546
|
|
|
1503
1547
|
// Polling must remain outside the non-GET dispatch below.
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { defaultListHarnessProcesses } from '../../harness/harness-cli-command.js';
|
|
2
2
|
import { devVersion, listChecklist } from '../../release-loop/checklist.js';
|
|
3
3
|
import { listSchedules } from '../../release-loop/release-schedule.js';
|
|
4
|
-
import { releaseLedgerRoot } from '../../instance/resolve.js';
|
|
4
|
+
import { effectiveInstanceRoot, releaseLedgerRoot } from '../../instance/resolve.js';
|
|
5
|
+
import { ResourceLedger, type ResourceView } from '../../control-plane/ledger.js';
|
|
5
6
|
import { getUserConfig, ORCHESTRATOR_DEFAULTS } from '../../user-config.js';
|
|
6
7
|
import { seatOfTree, trafficTick, TRAFFIC_SEATS, type TrafficCell, type TrafficResult } from '../../loops/orchestrator/traffic.js';
|
|
7
8
|
import { finishAdvice, measureFinish } from '../../loops/orchestrator/finish-rate.js';
|
|
8
9
|
import { jsonResponse } from './json-response.js';
|
|
10
|
+
import { debug } from '../../debug/log.js';
|
|
9
11
|
|
|
10
12
|
/** Read-only snapshot of the same ORCH traffic decision used by the scheduled tick. */
|
|
11
13
|
export function observeLoopResources(deps: {
|
|
@@ -36,7 +38,21 @@ export function observeLoopResources(deps: {
|
|
|
36
38
|
});
|
|
37
39
|
}
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
/** The Nexus resource view reads the existing control ledger; it never allocates a second pool ledger. */
|
|
42
|
+
export function handleLoopResourcesGet(
|
|
43
|
+
observe: () => TrafficResult = observeLoopResources,
|
|
44
|
+
listPodWorkers: () => ResourceView[] = () => new ResourceLedger(effectiveInstanceRoot()).list({ kind: 'pod-worker-lease' }),
|
|
45
|
+
): Response {
|
|
46
|
+
try {
|
|
47
|
+
const resource = observe();
|
|
48
|
+
try {
|
|
49
|
+
const podWorkers = listPodWorkers().map(row => ({ id: row.id, machine: row.machine, workerId: row.name,
|
|
50
|
+
key: row.attrs.key, state: row.attrs.state, generation: row.attrs.generation, ageMs: row.ageMs, expired: row.expired }));
|
|
51
|
+
return jsonResponse({ resource, podWorkers });
|
|
52
|
+
} catch (error) {
|
|
53
|
+
debug.log('nexus.resource', 'pod-worker-ledger-unmeasured', { errorKind: error instanceof Error ? error.name : typeof error });
|
|
54
|
+
return jsonResponse({ resource, podWorkers: null, podWorkersError: 'unmeasured' });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
41
57
|
catch { return jsonResponse({ error: 'resource-unavailable' }, 503); }
|
|
42
58
|
}
|
package/src/nexus/api/ops-api.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { operatorSignal } from './operator.js';
|
|
|
10
10
|
import { createSeatsCache, todayKst } from './ops-seats.js';
|
|
11
11
|
import { liveSeatsSources } from './ops-seats-sources.js';
|
|
12
12
|
import { createOverviewCache } from '../../ops/overview-cache.js';
|
|
13
|
+
import { resourcesFromOverview } from '../../ops/resources.js';
|
|
13
14
|
import { parseSince } from '../../ops/overview-collect.js';
|
|
14
15
|
import type { MetaApiOpts } from './meta-api.js';
|
|
15
16
|
|
|
@@ -131,6 +132,8 @@ export function releaseNodeFacts(output: unknown): ReleaseNodeFacts {
|
|
|
131
132
|
}
|
|
132
133
|
export interface ReleaseRunView {
|
|
133
134
|
runId: string; status: string; startedAt: string; version: string | null; path: string[]; nodes: ReleaseRunNodeView[];
|
|
135
|
+
/** Explicit project ownership. The release ledger does not currently populate this field. */
|
|
136
|
+
projectId?: string;
|
|
134
137
|
/** GATE-LIVE-OBS — 지금 gate 노드에 있는 런에만 싣는다(발행 원장 `gate-logs/cut/shards.json`). 파일이 없으면 생략. */
|
|
135
138
|
gateShards?: GateShardsFile & { summary: GateShardsSummary };
|
|
136
139
|
}
|
|
@@ -190,6 +193,8 @@ export function handleOpsApi(req: Request, metaApi: MetaApiOpts | undefined): Re
|
|
|
190
193
|
const signal = metaApi ? operatorSignal(req, metaApi) : { operator: false, operatorSource: null };
|
|
191
194
|
if (!signal.operator) {
|
|
192
195
|
debug.log('ops.api', 'refused', { path: pathname, source: signal.operatorSource });
|
|
196
|
+
// RES-FLOOR-API: no credential was offered at all — this endpoint names it 401; every other path keeps 403.
|
|
197
|
+
if (pathname === '/v1/ops/resources') return jsonResponse({ error: 'unauthorized' }, 401);
|
|
193
198
|
return jsonResponse({ error: 'forbidden' }, 403);
|
|
194
199
|
}
|
|
195
200
|
const served = (response: Response): Response => {
|
|
@@ -208,6 +213,14 @@ export function handleOpsApi(req: Request, metaApi: MetaApiOpts | undefined): Re
|
|
|
208
213
|
...(version ? { version } : {}), ...(url.searchParams.has('owner') ? { owner: url.searchParams.get('owner')! } : {}) })
|
|
209
214
|
.then((overview) => served(jsonResponse(overview)), () => jsonResponse({ error: 'overview-unavailable' }, 500));
|
|
210
215
|
}
|
|
216
|
+
if (pathname === '/v1/ops/resources') {
|
|
217
|
+
// RES-FLOOR-API — shares the overview cache; no new collection, no kubectl/ssh call, never waits.
|
|
218
|
+
overviewCache ??= createOverviewCache();
|
|
219
|
+
const peeked = overviewCache.peek();
|
|
220
|
+
return Promise.resolve(peeked
|
|
221
|
+
? served(jsonResponse(resourcesFromOverview(peeked.snapshot, peeked.pods, peeked.at)))
|
|
222
|
+
: served(jsonResponse({ stale: true })));
|
|
223
|
+
}
|
|
211
224
|
if (pathname === '/v1/ops/seats') {
|
|
212
225
|
const date = url.searchParams.get('date') ?? todayKst();
|
|
213
226
|
if (!DATE.test(date) || Number.isNaN(Date.parse(`${date}T00:00:00+09:00`))) return jsonResponse({ error: 'invalid-date' }, 400);
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { jsonResponse } from './json-response.js';
|
|
2
|
+
import { readReleaseRuns, type ReleaseRunView } from './ops-api.js';
|
|
3
|
+
import { listPendingApprovals, type PendingApprovalSummary } from './workflow-approvals.js';
|
|
4
|
+
import { getProject, type Project } from '../../project/project-store.js';
|
|
5
|
+
import { classifyMergeFailure, type MergeFailureKind } from '../../self-implement/regate-detail.js';
|
|
6
|
+
|
|
7
|
+
/** One failed node of a release run explicitly assigned to the project. */
|
|
8
|
+
export interface ProjectAutopsyFailure {
|
|
9
|
+
runId: string;
|
|
10
|
+
nodeId: string;
|
|
11
|
+
summary: string;
|
|
12
|
+
kind: MergeFailureKind;
|
|
13
|
+
status: string;
|
|
14
|
+
startedAt?: string;
|
|
15
|
+
endedAt?: string;
|
|
16
|
+
verdict?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Failure-kind rollup across the project's failed rows (desc by count, kind asc). */
|
|
20
|
+
export interface ProjectAutopsyCause {
|
|
21
|
+
kind: MergeFailureKind;
|
|
22
|
+
count: number;
|
|
23
|
+
runs: string[];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** A project's autopsy: failed rows + causes + pending proposals, read-only over the existing ledgers. */
|
|
27
|
+
export interface ProjectAutopsyReport {
|
|
28
|
+
project: { id: string; name: string; primaryFolder?: string };
|
|
29
|
+
attribution: { status: 'measured' | 'partial' | 'unavailable'; reason?: 'ledger-project-id-missing' };
|
|
30
|
+
coverage: { failuresTruncated: boolean; proposalsTruncated: boolean; causeCounts: 'returned-failures' };
|
|
31
|
+
failures: ProjectAutopsyFailure[];
|
|
32
|
+
causes: ProjectAutopsyCause[];
|
|
33
|
+
proposals: PendingApprovalSummary[];
|
|
34
|
+
pendingApprovals: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface ProjectAutopsyDeps {
|
|
38
|
+
getProject?: (id: string) => Project | null;
|
|
39
|
+
readRuns?: (version: string | null) => ReleaseRunView[] | 'unavailable';
|
|
40
|
+
listApprovals?: () => PendingApprovalSummary[];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const FAILURE_LIMIT = 50;
|
|
44
|
+
const PROPOSAL_LIMIT = 20;
|
|
45
|
+
const PROJECT_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
46
|
+
|
|
47
|
+
const defaultReadRuns = (version: string | null): ReleaseRunView[] | 'unavailable' =>
|
|
48
|
+
readReleaseRuns(version, undefined, { facts: true });
|
|
49
|
+
|
|
50
|
+
function projectViewOf(project: Project): ProjectAutopsyReport['project'] {
|
|
51
|
+
return {
|
|
52
|
+
id: project.id,
|
|
53
|
+
name: project.name,
|
|
54
|
+
...(project.primaryFolder !== undefined ? { primaryFolder: project.primaryFolder } : {}),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** GET /v1/projects/:id/autopsy — 실패·원인·제안 rows for one project, fail-soft per the ops-route pattern. */
|
|
59
|
+
export function handleProjectAutopsy(req: Request, rawId: string, deps: ProjectAutopsyDeps = {}): Response {
|
|
60
|
+
if (req.method !== 'GET') return jsonResponse({ error: 'method-not-allowed' }, 405);
|
|
61
|
+
let projectId: string;
|
|
62
|
+
try {
|
|
63
|
+
projectId = decodeURIComponent(rawId);
|
|
64
|
+
} catch {
|
|
65
|
+
return jsonResponse({ error: 'bad_request', reason: 'invalid project id' }, 400);
|
|
66
|
+
}
|
|
67
|
+
if (!PROJECT_ID.test(projectId)) return jsonResponse({ error: 'bad_request', reason: 'invalid project id' }, 400);
|
|
68
|
+
const project = (deps.getProject ?? getProject)(projectId);
|
|
69
|
+
if (!project) return jsonResponse({ error: 'not-found' }, 404);
|
|
70
|
+
const pending = deps.listApprovals ? deps.listApprovals() : listPendingApprovals();
|
|
71
|
+
const runs = (deps.readRuns ?? defaultReadRuns)(null);
|
|
72
|
+
if (runs === 'unavailable') return jsonResponse({ error: 'runs-unavailable' }, 500);
|
|
73
|
+
if (!runs.some((run) => Boolean(run.projectId))) {
|
|
74
|
+
return jsonResponse({ project: projectViewOf(project),
|
|
75
|
+
attribution: { status: 'unavailable', reason: 'ledger-project-id-missing' },
|
|
76
|
+
coverage: { failuresTruncated: false, proposalsTruncated: false, causeCounts: 'returned-failures' },
|
|
77
|
+
failures: [], causes: [], proposals: [], pendingApprovals: 0 });
|
|
78
|
+
}
|
|
79
|
+
const unattributed = runs.some((run) => !run.projectId) || pending.some((approval) => !approval.projectId);
|
|
80
|
+
const attributed = runs.some((run) => Boolean(run.projectId)) || pending.some((approval) => Boolean(approval.projectId));
|
|
81
|
+
const attribution: ProjectAutopsyReport['attribution'] = unattributed || !attributed
|
|
82
|
+
? { status: attributed ? 'partial' : 'unavailable', reason: 'ledger-project-id-missing' }
|
|
83
|
+
: { status: 'measured' };
|
|
84
|
+
const failures: ProjectAutopsyFailure[] = [];
|
|
85
|
+
for (const run of runs) {
|
|
86
|
+
if (run.projectId !== project.id) continue;
|
|
87
|
+
for (const node of run.nodes) {
|
|
88
|
+
if (node.ok !== false) continue;
|
|
89
|
+
failures.push({
|
|
90
|
+
runId: run.runId,
|
|
91
|
+
nodeId: node.nodeId,
|
|
92
|
+
summary: node.summary,
|
|
93
|
+
kind: classifyMergeFailure(node.summary),
|
|
94
|
+
status: run.status,
|
|
95
|
+
...(node.startedAt !== undefined ? { startedAt: node.startedAt } : {}),
|
|
96
|
+
...(node.endedAt !== undefined ? { endedAt: node.endedAt } : {}),
|
|
97
|
+
...(node.facts?.verdict !== undefined ? { verdict: node.facts.verdict } : {}),
|
|
98
|
+
});
|
|
99
|
+
if (failures.length > FAILURE_LIMIT) break;
|
|
100
|
+
}
|
|
101
|
+
if (failures.length > FAILURE_LIMIT) break;
|
|
102
|
+
}
|
|
103
|
+
const failuresTruncated = failures.length > FAILURE_LIMIT;
|
|
104
|
+
if (failuresTruncated) failures.length = FAILURE_LIMIT;
|
|
105
|
+
const counts = new Map<MergeFailureKind, { count: number; runs: Set<string> }>();
|
|
106
|
+
for (const failure of failures) {
|
|
107
|
+
const entry = counts.get(failure.kind) ?? { count: 0, runs: new Set<string>() };
|
|
108
|
+
entry.count += 1;
|
|
109
|
+
entry.runs.add(failure.runId);
|
|
110
|
+
counts.set(failure.kind, entry);
|
|
111
|
+
}
|
|
112
|
+
const causes: ProjectAutopsyCause[] = [...counts.entries()]
|
|
113
|
+
.map(([kind, entry]) => ({ kind, count: entry.count, runs: [...entry.runs].sort() }))
|
|
114
|
+
.sort((a, b) => b.count - a.count || (a.kind < b.kind ? -1 : 1));
|
|
115
|
+
const projectApprovals = pending.filter((summary) => summary.projectId === project.id);
|
|
116
|
+
const proposals = projectApprovals.slice(0, PROPOSAL_LIMIT);
|
|
117
|
+
return jsonResponse({
|
|
118
|
+
project: projectViewOf(project),
|
|
119
|
+
attribution,
|
|
120
|
+
coverage: { failuresTruncated, proposalsTruncated: projectApprovals.length > PROPOSAL_LIMIT,
|
|
121
|
+
causeCounts: 'returned-failures' },
|
|
122
|
+
failures,
|
|
123
|
+
causes,
|
|
124
|
+
proposals,
|
|
125
|
+
pendingApprovals: projectApprovals.length,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
@@ -74,6 +74,7 @@ export interface TerminalSummary {
|
|
|
74
74
|
cmd: string;
|
|
75
75
|
workdir?: string;
|
|
76
76
|
nickname?: string;
|
|
77
|
+
purpose?: string;
|
|
77
78
|
treeName: string;
|
|
78
79
|
worktreeName: string;
|
|
79
80
|
parentPtyId: string;
|
|
@@ -278,6 +279,7 @@ function summarize(
|
|
|
278
279
|
cmd: handle.cmd,
|
|
279
280
|
...(handle.workdir ? { workdir: handle.workdir } : {}),
|
|
280
281
|
...(manifest?.nickname ? { nickname: manifest.nickname } : {}),
|
|
282
|
+
...(manifest?.purpose ? { purpose: manifest.purpose } : {}),
|
|
281
283
|
...names,
|
|
282
284
|
parentPtyId: manifest?.parentPtyId ?? '',
|
|
283
285
|
parentPid: manifest?.parentPid ?? 0,
|
|
@@ -322,6 +324,7 @@ function summarizeManifest(
|
|
|
322
324
|
id: row.id, cmd: row.cmd,
|
|
323
325
|
...(row.workdir ? { workdir: row.workdir } : {}),
|
|
324
326
|
...(row.nickname ? { nickname: row.nickname } : {}),
|
|
327
|
+
...(row.purpose ? { purpose: row.purpose } : {}),
|
|
325
328
|
...terminalTreeNames(row.workdir),
|
|
326
329
|
parentPtyId: row.parentPtyId, parentPid: row.parentPid, parentKind: row.parentKind, runId: row.runId,
|
|
327
330
|
...(row.chainOrigin === undefined ? {} : { chainOrigin: row.chainOrigin }),
|
|
@@ -21,6 +21,8 @@ export interface PendingApprovalSummary {
|
|
|
21
21
|
runId: string;
|
|
22
22
|
message: string;
|
|
23
23
|
requestedAt: number;
|
|
24
|
+
/** Explicit project ownership. The approval registry does not currently populate this field. */
|
|
25
|
+
projectId?: string;
|
|
24
26
|
}
|
|
25
27
|
|
|
26
28
|
interface PendingApprovalEntry extends PendingApprovalSummary {
|