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
|
@@ -0,0 +1,707 @@
|
|
|
1
|
+
// ── Ops-ledger native tools — 우편(msg) · 판(release checklist) ──
|
|
2
|
+
//
|
|
3
|
+
// OP TUI turns previously drove `elanous msg list/post/ack` and
|
|
4
|
+
// `elanous release checklist list/move/set/add` through RunShell:
|
|
5
|
+
// 1.3–2s of CLI startup per call, 30+ spawns per turn, and the CLI's
|
|
6
|
+
// human-oriented stdout amplifying TUI screen defects. These eight
|
|
7
|
+
// tools reuse the SAME durable services in-process —
|
|
8
|
+
//
|
|
9
|
+
// • msg tools → src/msg/msg-store.ts (the SQLite ledger `elanous msg`
|
|
10
|
+
// reads/writes; same acknowledgement cursors, same ALL-broadcast rule)
|
|
11
|
+
// • checklist tools → src/release-loop/checklist.ts + feature-store.ts
|
|
12
|
+
// (the same per-version ledger, claim history, seat/OP move rules)
|
|
13
|
+
//
|
|
14
|
+
// The permission and audit contract is preserved 1:1:
|
|
15
|
+
// • writes record the actor from ELANOUS_TRACK (seat identity),
|
|
16
|
+
// • ChecklistMove keeps the CLI routing — anonymous (no ELANOUS_TRACK)
|
|
17
|
+
// moves unchecked, a non-OP seat goes through seatMove (own cell ·
|
|
18
|
+
// next version · capacity), only OP moves unrestricted,
|
|
19
|
+
// • checklist writes pass the same HQ lease fence as the CLI
|
|
20
|
+
// (`hqFenceDecision('ledger-cli', …)` — identical observation,
|
|
21
|
+
// minus the CLI-only process.exitCode side effect),
|
|
22
|
+
// • results are structured data, mirroring the CLI `--json` shapes.
|
|
23
|
+
//
|
|
24
|
+
// Budget: every call stays a local ledger read/write — no process
|
|
25
|
+
// spawn, no network, no running-runs sweep — so a call completes well
|
|
26
|
+
// under 300ms and a TUI OP turn needs zero RunShell round-trips.
|
|
27
|
+
//
|
|
28
|
+
// Output cap: a version's claim history is the bulk of the CLI `--json`
|
|
29
|
+
// (0.2.29: 1006 entries ≈ 630KB of ≈ 920KB). ChecklistList therefore omits
|
|
30
|
+
// it unless `historyLimit` asks for the newest N entries, and writes return
|
|
31
|
+
// only the touched cell ⊕ the summary — never the whole snapshot.
|
|
32
|
+
//
|
|
33
|
+
// Filled arguments: some models fill EVERY schema property (live 10-14,
|
|
34
|
+
// gpt-6-sol on ChecklistSet: disposition block · kind postpub · priority P2
|
|
35
|
+
// · ceoDate "" — the cell was clobbered). So the write schemas stay narrow
|
|
36
|
+
// (ChecklistSet = status/evidence/refs · ChecklistAdd = id/title/owner/…),
|
|
37
|
+
// metadata goes through ChecklistEdit one named field per call, and filled
|
|
38
|
+
// "" / null / [] / 0 read as absent.
|
|
39
|
+
//
|
|
40
|
+
// Observation: runtimes go through `observeLedgerCall`, which writes one
|
|
41
|
+
// `ops-ledger` `call` line per call (tool · ms · ok · actor · ids — never
|
|
42
|
+
// message bodies or evidence text), the native-call timing and audit line.
|
|
43
|
+
|
|
44
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
45
|
+
import { join } from 'node:path';
|
|
46
|
+
import type { LLMToolSpec } from '../../llm.js';
|
|
47
|
+
import { canonicalSeatId, openMsgStore, validateMessageEnvelope, type Message, type MsgStore } from '../../msg/msg-store.js';
|
|
48
|
+
import {
|
|
49
|
+
addItem,
|
|
50
|
+
devVersion,
|
|
51
|
+
listChecklist,
|
|
52
|
+
ownerMatches,
|
|
53
|
+
parityGap,
|
|
54
|
+
parseOwner,
|
|
55
|
+
setItem,
|
|
56
|
+
summarizeChecklist,
|
|
57
|
+
type Checklist,
|
|
58
|
+
type ChecklistItem,
|
|
59
|
+
type ChecklistStatus,
|
|
60
|
+
type ChecklistSummary,
|
|
61
|
+
} from '../../release-loop/checklist.js';
|
|
62
|
+
import * as checklistFeatures from '../../release-loop/feature-store.js';
|
|
63
|
+
import { seatMove, type PlacementPriority } from '../../release-loop/placement.js';
|
|
64
|
+
import { listSchedules } from '../../release-loop/release-schedule.js';
|
|
65
|
+
import { effectiveInstanceRoot, releaseLedgerRoot } from '../../instance/resolve.js';
|
|
66
|
+
import { getElanousConfigDirOverride } from '../../elanous-config-dir.js';
|
|
67
|
+
import { getUserConfig, userConfigPath } from '../../user-config.js';
|
|
68
|
+
import { hqFenceDecision, type HqDeps } from '../../hq/hq.js';
|
|
69
|
+
import { fileLeaseStore } from '../../hq/lease.js';
|
|
70
|
+
import { isIsolatedLedgerWriteRoot } from '../../hq/ledger-write-target.js';
|
|
71
|
+
import { debug } from '../../debug/log.js';
|
|
72
|
+
|
|
73
|
+
// ── shared helpers ──────────────────────────────────────────────────────────
|
|
74
|
+
|
|
75
|
+
/** Same release-version shape as `src/cli/release-cli.ts` (SEMVER). */
|
|
76
|
+
const RELEASE_VERSION = /^\d+\.\d+\.\d+(?:-(?:rc|alpha|beta)\.\d+)?$/;
|
|
77
|
+
|
|
78
|
+
function requiredString(raw: unknown, name: string): string {
|
|
79
|
+
if (typeof raw !== 'string' || !raw.trim()) throw new Error(`'${name}' must be a nonempty string`);
|
|
80
|
+
return raw;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Optional string that tolerates «filled» absence. Models that fill every
|
|
84
|
+
* schema property send "" (or null) for fields they do not mean to set —
|
|
85
|
+
* live 10-14 gpt-6-sol: `owner: ""`, `ceoDate: ""`. Those read as absent. */
|
|
86
|
+
function filledString(raw: unknown, name: string): string | undefined {
|
|
87
|
+
if (raw === undefined || raw === null || (typeof raw === 'string' && !raw.trim())) return undefined;
|
|
88
|
+
return requiredString(raw, name);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Optional string array; a filled `[]` reads as absent (never «clear»). */
|
|
92
|
+
function filledArray(raw: unknown, name: string): string[] | undefined {
|
|
93
|
+
if (raw === undefined || raw === null) return undefined;
|
|
94
|
+
const values = stringArray(raw, name);
|
|
95
|
+
return values.length ? values : undefined;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function stringArray(raw: unknown, name: string): string[] {
|
|
99
|
+
if (!Array.isArray(raw) || raw.some((entry) => typeof entry !== 'string')) {
|
|
100
|
+
throw new Error(`'${name}' must be an array of strings`);
|
|
101
|
+
}
|
|
102
|
+
return raw;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function integerArg(raw: unknown, name: string, min: number, max: number): number {
|
|
106
|
+
if (typeof raw !== 'number' || !Number.isSafeInteger(raw) || raw < min || raw > max) {
|
|
107
|
+
throw new Error(`'${name}' must be an integer between ${min} and ${max}`);
|
|
108
|
+
}
|
|
109
|
+
return raw;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Codename table from the active instance config — same source as the CLI. */
|
|
113
|
+
function checklistCodenames(): Record<string, string> {
|
|
114
|
+
const path = getElanousConfigDirOverride() ? join(effectiveInstanceRoot(), 'config.json') : userConfigPath();
|
|
115
|
+
if (!existsSync(path)) return {};
|
|
116
|
+
const raw = JSON.parse(readFileSync(path, 'utf8')) as { release?: { codenames?: Record<string, string> } };
|
|
117
|
+
return raw.release?.codenames ?? {};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Resolve a version or codename alias — mirrors the CLI `checklistVersion`
|
|
121
|
+
* (default: package.json dev version with the -dev.N suffix stripped). */
|
|
122
|
+
function resolveChecklistVersion(input: string | undefined): string {
|
|
123
|
+
const v = input ?? devVersion().replace(/-dev\.\d+$/, '');
|
|
124
|
+
const resolved = RELEASE_VERSION.test(v)
|
|
125
|
+
? v
|
|
126
|
+
: Object.entries(checklistCodenames()).find(([, name]) => name === v)?.[0] ?? v;
|
|
127
|
+
if (!RELEASE_VERSION.test(resolved)) {
|
|
128
|
+
throw new Error(`체크리스트 판 또는 별칭이 아니다: ${v} (x.y.z 또는 config release.codenames 별칭)`);
|
|
129
|
+
}
|
|
130
|
+
return resolved;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Seat identity recorded on ledger writes — same source as the CLI. */
|
|
134
|
+
function ledgerActor(): string {
|
|
135
|
+
return process.env.ELANOUS_TRACK || 'cli';
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Lease-store wiring for an explicitly overridden instance — mirrors the
|
|
139
|
+
* CLI `ledgerFenceDeps()` (no injected store, arbiter opt-out respected). */
|
|
140
|
+
function ledgerFenceDeps(): HqDeps {
|
|
141
|
+
if (getElanousConfigDirOverride() && !getUserConfig().hq?.arbiter) {
|
|
142
|
+
const root = effectiveInstanceRoot();
|
|
143
|
+
return {
|
|
144
|
+
store: fileLeaseStore(join(root, 'hq', 'lease.json')),
|
|
145
|
+
seenPath: join(root, 'hq', 'seen-generation'),
|
|
146
|
+
localPath: join(root, 'hq', 'local.json'),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
return {};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** The HQ lease fence the CLI applies to `release checklist` writes.
|
|
153
|
+
* `hqFenceDecision` records the same observation (and retires the
|
|
154
|
+
* heartbeat cache) as `hqCliWriteAllowed`; the tool returns a structured
|
|
155
|
+
* refusal instead of the CLI's process.exitCode side effect.
|
|
156
|
+
* Returns null when the write may proceed. */
|
|
157
|
+
function ledgerWriteDenial(command: string, ledgerRoot: string): string | null {
|
|
158
|
+
if (isIsolatedLedgerWriteRoot(ledgerRoot)) {
|
|
159
|
+
try { debug.log('hq.fence', 'skipped-isolated', { root: ledgerRoot, command }); } catch { /* observation is fail-soft */ }
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
const decision = hqFenceDecision('ledger-cli', ledgerFenceDeps());
|
|
163
|
+
if (decision.run || decision.reason === 'no-lease') return null;
|
|
164
|
+
return `원장 쓰기 거부 — 본부는 ${decision.holder ?? 'unknown'} gen ${decision.generation ?? 'unknown'} (${decision.reason}); 쓰기는 본부 자리로 보내라`;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Wrap one native ledger call with its timing/audit observation:
|
|
168
|
+
* `debug.log('ops-ledger', 'call', { tool, ms, ok, actor, … })`. `pick`
|
|
169
|
+
* chooses identifying fields from the args/result — ids only, no bodies. */
|
|
170
|
+
export async function observeLedgerCall<T extends Record<string, unknown>>(
|
|
171
|
+
tool: string,
|
|
172
|
+
args: Record<string, unknown>,
|
|
173
|
+
run: () => Promise<T>,
|
|
174
|
+
pick: (args: Record<string, unknown>, result?: T) => Record<string, unknown> = () => ({}),
|
|
175
|
+
): Promise<T> {
|
|
176
|
+
const startedAt = performance.now();
|
|
177
|
+
const actor = process.env.ELANOUS_TRACK || 'cli';
|
|
178
|
+
try {
|
|
179
|
+
const result = await run();
|
|
180
|
+
try {
|
|
181
|
+
debug.log('ops-ledger', 'call', {
|
|
182
|
+
tool, ms: Math.round(performance.now() - startedAt), ok: result.ok !== false, actor,
|
|
183
|
+
...pick(args, result),
|
|
184
|
+
...(typeof result.error === 'string' ? { error: result.error } : {}),
|
|
185
|
+
});
|
|
186
|
+
} catch { /* observation is fail-soft */ }
|
|
187
|
+
return result;
|
|
188
|
+
} catch (error) {
|
|
189
|
+
try {
|
|
190
|
+
debug.log('ops-ledger', 'call', {
|
|
191
|
+
tool, ms: Math.round(performance.now() - startedAt), ok: false, actor,
|
|
192
|
+
...pick(args), error: error instanceof Error ? error.message : String(error),
|
|
193
|
+
});
|
|
194
|
+
} catch { /* observation is fail-soft */ }
|
|
195
|
+
throw error;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export interface MsgLedgerDeps {
|
|
200
|
+
/** Message-ledger opener; overridden by tests with a temp path. */
|
|
201
|
+
openStore?: () => MsgStore;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export interface ChecklistLedgerDeps {
|
|
205
|
+
/** HQ fence override for tests — returns the denial message or null. */
|
|
206
|
+
fence?: (command: string, ledgerRoot: string) => string | null;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// ── MsgList ─────────────────────────────────────────────────────────────────
|
|
210
|
+
|
|
211
|
+
export function buildMsgListTool(): LLMToolSpec {
|
|
212
|
+
return {
|
|
213
|
+
name: 'MsgList',
|
|
214
|
+
description:
|
|
215
|
+
'List durable seat-addressed messages for one recipient WITHOUT acknowledging them — the same SQLite ledger as `elanous msg list`, in-process (no CLI startup). ' +
|
|
216
|
+
'Reading never advances the acknowledgement cursor; pass an explicit `after` to page beyond it. `ALL` recipients also see broadcast messages. ' +
|
|
217
|
+
'Pair with MsgPost to reply and MsgAck to advance the cursor.',
|
|
218
|
+
parameters: {
|
|
219
|
+
type: 'object',
|
|
220
|
+
properties: {
|
|
221
|
+
to: { type: 'string', description: 'Recipient seat: OP · MK · TC · UX · ALL or another canonical seat id.' },
|
|
222
|
+
after: { type: 'integer', description: 'Exclusive message ID to page beyond; leave out (or 0) to start at the recipient’s acknowledged cursor.' },
|
|
223
|
+
includeAcknowledged: { type: 'boolean', description: 'true = start from the first message, including ones already acknowledged.' },
|
|
224
|
+
limit: { type: 'integer', description: 'Maximum messages to return, 1–1000 (default 100).' },
|
|
225
|
+
},
|
|
226
|
+
required: ['to'],
|
|
227
|
+
additionalProperties: false,
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export interface MsgListResult extends Record<string, unknown> {
|
|
233
|
+
output: string;
|
|
234
|
+
ok: true;
|
|
235
|
+
recipient: string;
|
|
236
|
+
after: number;
|
|
237
|
+
count: number;
|
|
238
|
+
messages: Message[];
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export async function dispatchMsgList(rawArgs: Record<string, unknown>, deps: MsgLedgerDeps = {}): Promise<MsgListResult> {
|
|
242
|
+
const to = canonicalSeatId(requiredString(rawArgs.to, 'to'));
|
|
243
|
+
const limit = rawArgs.limit === undefined || rawArgs.limit === null || rawArgs.limit === 0 ? 100 : integerArg(rawArgs.limit, 'limit', 1, 1000);
|
|
244
|
+
// A filled `after: 0` means «not set» (the model fills every property);
|
|
245
|
+
// reading acknowledged history is the explicit includeAcknowledged flag.
|
|
246
|
+
const after = rawArgs.after === undefined || rawArgs.after === null || rawArgs.after === 0
|
|
247
|
+
? undefined
|
|
248
|
+
: integerArg(rawArgs.after, 'after', 1, Number.MAX_SAFE_INTEGER);
|
|
249
|
+
const store = deps.openStore?.() ?? openMsgStore();
|
|
250
|
+
try {
|
|
251
|
+
const start = after ?? (rawArgs.includeAcknowledged === true ? 0 : store.getCursor(to));
|
|
252
|
+
const messages = store.list(to, start, limit);
|
|
253
|
+
return {
|
|
254
|
+
output: `MsgList ${to}: ${messages.length} message(s) after #${start}`,
|
|
255
|
+
ok: true,
|
|
256
|
+
recipient: to,
|
|
257
|
+
after: start,
|
|
258
|
+
count: messages.length,
|
|
259
|
+
messages,
|
|
260
|
+
};
|
|
261
|
+
} finally {
|
|
262
|
+
store.close();
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// ── MsgPost ─────────────────────────────────────────────────────────────────
|
|
267
|
+
|
|
268
|
+
export function buildMsgPostTool(): LLMToolSpec {
|
|
269
|
+
return {
|
|
270
|
+
name: 'MsgPost',
|
|
271
|
+
description:
|
|
272
|
+
'Post a durable seat-addressed message — the same SQLite ledger as `elanous msg post`, in-process (no CLI startup). ' +
|
|
273
|
+
'The recipient sees it on their next MsgList/watch. ALL may receive but never send; `kind` tags the message; `replyTo` points a reply at a question message ID.',
|
|
274
|
+
parameters: {
|
|
275
|
+
type: 'object',
|
|
276
|
+
properties: {
|
|
277
|
+
from: { type: 'string', description: 'Sender seat (ALL cannot send).' },
|
|
278
|
+
to: { type: 'string', description: 'Recipient seat: OP · MK · TC · UX · ALL or another canonical seat id.' },
|
|
279
|
+
body: { type: 'string', description: 'Message body (nonempty).' },
|
|
280
|
+
kind: { type: 'string', description: 'Optional lowercase tag (letters, digits, -, _).' },
|
|
281
|
+
replyTo: { type: 'integer', description: 'Question message ID this reply points at.' },
|
|
282
|
+
},
|
|
283
|
+
required: ['from', 'to', 'body'],
|
|
284
|
+
additionalProperties: false,
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export interface MsgPostResult extends Record<string, unknown> {
|
|
290
|
+
output: string;
|
|
291
|
+
ok: true;
|
|
292
|
+
message: Message;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
export async function dispatchMsgPost(rawArgs: Record<string, unknown>, deps: MsgLedgerDeps = {}): Promise<MsgPostResult> {
|
|
296
|
+
const envelope = validateMessageEnvelope({
|
|
297
|
+
from: requiredString(rawArgs.from, 'from'),
|
|
298
|
+
to: requiredString(rawArgs.to, 'to'),
|
|
299
|
+
body: requiredString(rawArgs.body, 'body'),
|
|
300
|
+
...(filledString(rawArgs.kind, 'kind') === undefined ? {} : { kind: requiredString(rawArgs.kind, 'kind') }),
|
|
301
|
+
...(rawArgs.replyTo === undefined || rawArgs.replyTo === null || rawArgs.replyTo === 0
|
|
302
|
+
? {} : { replyTo: integerArg(rawArgs.replyTo, 'replyTo', 1, Number.MAX_SAFE_INTEGER) }),
|
|
303
|
+
});
|
|
304
|
+
const store = deps.openStore?.() ?? openMsgStore();
|
|
305
|
+
try {
|
|
306
|
+
const posted = store.post(envelope);
|
|
307
|
+
return {
|
|
308
|
+
output: `MsgPost #${posted.id} ${posted.from} → ${posted.to}`,
|
|
309
|
+
ok: true,
|
|
310
|
+
message: posted,
|
|
311
|
+
};
|
|
312
|
+
} finally {
|
|
313
|
+
store.close();
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// ── MsgAck ──────────────────────────────────────────────────────────────────
|
|
318
|
+
|
|
319
|
+
export function buildMsgAckTool(): LLMToolSpec {
|
|
320
|
+
return {
|
|
321
|
+
name: 'MsgAck',
|
|
322
|
+
description:
|
|
323
|
+
'Acknowledge durable messages for one recipient through an ID — the same SQLite ledger as `elanous msg ack`, in-process. ' +
|
|
324
|
+
'The recipient’s cursor advances so later MsgList calls start after the acknowledged messages.',
|
|
325
|
+
parameters: {
|
|
326
|
+
type: 'object',
|
|
327
|
+
properties: {
|
|
328
|
+
to: { type: 'string', description: 'Recipient seat whose cursor advances.' },
|
|
329
|
+
id: { type: 'integer', description: 'Acknowledge every message through this ID.' },
|
|
330
|
+
},
|
|
331
|
+
required: ['to', 'id'],
|
|
332
|
+
additionalProperties: false,
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export interface MsgAckResult extends Record<string, unknown> {
|
|
338
|
+
output: string;
|
|
339
|
+
ok: true;
|
|
340
|
+
recipient: string;
|
|
341
|
+
cursor: number;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
export async function dispatchMsgAck(rawArgs: Record<string, unknown>, deps: MsgLedgerDeps = {}): Promise<MsgAckResult> {
|
|
345
|
+
const to = canonicalSeatId(requiredString(rawArgs.to, 'to'));
|
|
346
|
+
const cursor = integerArg(rawArgs.id, 'id', 0, Number.MAX_SAFE_INTEGER);
|
|
347
|
+
const store = deps.openStore?.() ?? openMsgStore();
|
|
348
|
+
try {
|
|
349
|
+
const acknowledged = store.ack(to, cursor);
|
|
350
|
+
return {
|
|
351
|
+
output: `MsgAck ${to} acknowledged through #${acknowledged}`,
|
|
352
|
+
ok: true,
|
|
353
|
+
recipient: to,
|
|
354
|
+
cursor: acknowledged,
|
|
355
|
+
};
|
|
356
|
+
} finally {
|
|
357
|
+
store.close();
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// ── ChecklistList ───────────────────────────────────────────────────────────
|
|
362
|
+
|
|
363
|
+
export function buildChecklistListTool(): LLMToolSpec {
|
|
364
|
+
return {
|
|
365
|
+
name: 'ChecklistList',
|
|
366
|
+
description:
|
|
367
|
+
'List the release-checklist cells for one version — the same ledger as `elanous release checklist list --json`, in-process (no CLI startup). ' +
|
|
368
|
+
'Returns the cells with the per-status summary, blocked cells, per-owner counts, and screen-parity warnings. Claim history is omitted unless historyLimit asks for the newest entries. Reading never mutates the ledger.',
|
|
369
|
+
parameters: {
|
|
370
|
+
type: 'object',
|
|
371
|
+
properties: {
|
|
372
|
+
version: { type: 'string', description: 'Release version or codename (default: dev version with -dev.N stripped).' },
|
|
373
|
+
owner: { type: 'string', description: 'Filter cells by seat or sub-seat owner (e.g. OP · TC · MK/graphics).' },
|
|
374
|
+
id: { type: 'string', description: 'Return only this cell (and, with historyLimit, only its history).' },
|
|
375
|
+
historyLimit: { type: 'integer', description: 'Include the newest N claim-history entries, 0–200 (default 0 — history is omitted; it is most of the ledger’s size).' },
|
|
376
|
+
},
|
|
377
|
+
additionalProperties: false,
|
|
378
|
+
},
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export interface ChecklistListResult extends Record<string, unknown> {
|
|
383
|
+
output: string;
|
|
384
|
+
ok: true;
|
|
385
|
+
version: string;
|
|
386
|
+
codename: string;
|
|
387
|
+
released: Checklist['released'];
|
|
388
|
+
dev: string;
|
|
389
|
+
items: Checklist['items'];
|
|
390
|
+
/** Newest `historyLimit` entries (oldest first); empty when not asked. */
|
|
391
|
+
history: Checklist['history'];
|
|
392
|
+
/** History entries in scope before the limit — tells the caller what was left out. */
|
|
393
|
+
historyTotal: number;
|
|
394
|
+
summary: ChecklistSummary;
|
|
395
|
+
parity: Array<{ id: string; why: string }>;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
export async function dispatchChecklistList(rawArgs: Record<string, unknown>): Promise<ChecklistListResult> {
|
|
399
|
+
const version = resolveChecklistVersion(filledString(rawArgs.version, 'version'));
|
|
400
|
+
const owner = filledString(rawArgs.owner, 'owner');
|
|
401
|
+
if (owner !== undefined) parseOwner(owner);
|
|
402
|
+
const id = filledString(rawArgs.id, 'id');
|
|
403
|
+
const historyLimit = rawArgs.historyLimit === undefined ? 0 : integerArg(rawArgs.historyLimit, 'historyLimit', 0, 200);
|
|
404
|
+
const ledgerRoot = releaseLedgerRoot();
|
|
405
|
+
const snapshot = listChecklist(version, ledgerRoot);
|
|
406
|
+
const data = {
|
|
407
|
+
...snapshot,
|
|
408
|
+
items: snapshot.items.filter((item) => (owner === undefined || ownerMatches(item.owner, owner)) && (id === undefined || item.id === id)),
|
|
409
|
+
};
|
|
410
|
+
const scopedHistory = id === undefined ? snapshot.history : snapshot.history.filter((entry) => entry.id === id);
|
|
411
|
+
const history = historyLimit === 0 ? [] : scopedHistory.slice(-historyLimit);
|
|
412
|
+
const summary = summarizeChecklist(data);
|
|
413
|
+
const parity = data.items.flatMap((item) => {
|
|
414
|
+
const why = item.kind === 'screen' ? parityGap(item.evidence) : null;
|
|
415
|
+
return why ? [{ id: item.id, why }] : [];
|
|
416
|
+
});
|
|
417
|
+
for (const { id, why } of parity) debug.log('release.checklist', 'parity-warning', { version, id, why });
|
|
418
|
+
const codename = checklistCodenames()[version] ?? '';
|
|
419
|
+
return {
|
|
420
|
+
output: `ChecklistList ${version}${codename ? ` (${codename})` : ''}: 🟢${summary.green} · 🟡${summary.yellow} · 🔴${summary.red} · ✅${summary.done} · 칸 ${data.items.length}`,
|
|
421
|
+
ok: true,
|
|
422
|
+
version,
|
|
423
|
+
codename,
|
|
424
|
+
released: data.released,
|
|
425
|
+
dev: data.dev,
|
|
426
|
+
items: data.items,
|
|
427
|
+
history,
|
|
428
|
+
historyTotal: scopedHistory.length,
|
|
429
|
+
summary,
|
|
430
|
+
parity,
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// ── ChecklistAdd ───────────────────────────────────────────────────────────
|
|
435
|
+
|
|
436
|
+
export function buildChecklistAddTool(): LLMToolSpec {
|
|
437
|
+
return {
|
|
438
|
+
name: 'ChecklistAdd',
|
|
439
|
+
description:
|
|
440
|
+
'Add one cell to a release checklist — the same ledger as `elanous release checklist add`, in-process. ' +
|
|
441
|
+
'HQ lease fence and claim-history audit are identical to the CLI. Only id and title are needed; leave every other field out unless the user named it. ' +
|
|
442
|
+
'Kind (screen/postpub), dispatch kind, CEO load and the accelerator tier are set afterwards with ChecklistEdit. ' +
|
|
443
|
+
'The CLI’s target-path warnings (git/gh probes) are omitted: they would break the sub-300ms in-process budget and are advisory only.',
|
|
444
|
+
parameters: {
|
|
445
|
+
type: 'object',
|
|
446
|
+
properties: {
|
|
447
|
+
id: { type: 'string', description: 'Cell id (e.g. T-1234).' },
|
|
448
|
+
title: { type: 'string', description: 'Cell title.' },
|
|
449
|
+
version: { type: 'string', description: 'Release version or codename (default: dev version with -dev.N stripped).' },
|
|
450
|
+
owner: { type: 'string', description: 'Owner seat or sub-seat (e.g. TC · MK/graphics) — only when the user named one.' },
|
|
451
|
+
priority: { type: 'string', enum: ['P0', 'P1', 'P2'], description: 'Only when the user named a priority.' },
|
|
452
|
+
deadlineVersion: { type: 'string', description: 'Deadline version — only when the user named one.' },
|
|
453
|
+
predecessors: { type: 'array', items: { type: 'string' }, description: 'Predecessor cell ids.' },
|
|
454
|
+
refs: { type: 'array', items: { type: 'string' }, description: 'Evidence doc refs — repo-relative path[#section].' },
|
|
455
|
+
allowDuplicateId: { type: 'boolean', description: 'Allow the same id in another version (CLI --allow-duplicate-id).' },
|
|
456
|
+
},
|
|
457
|
+
required: ['id', 'title'],
|
|
458
|
+
additionalProperties: false,
|
|
459
|
+
},
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/** Write results carry the touched cell and the version summary — never the
|
|
464
|
+
* whole snapshot (its history alone is hundreds of KB per version). */
|
|
465
|
+
export interface ChecklistWriteView {
|
|
466
|
+
item?: ChecklistItem;
|
|
467
|
+
summary?: ChecklistSummary;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
function writeView(snapshot: Checklist, id: string): ChecklistWriteView {
|
|
471
|
+
const item = snapshot.items.find((entry) => entry.id === id);
|
|
472
|
+
const summary = summarizeChecklist(snapshot);
|
|
473
|
+
return item ? { item, summary } : { summary };
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
export interface ChecklistAddResult extends Record<string, unknown>, ChecklistWriteView {
|
|
477
|
+
output: string;
|
|
478
|
+
ok: boolean;
|
|
479
|
+
error?: string;
|
|
480
|
+
version: string;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
export async function dispatchChecklistAdd(rawArgs: Record<string, unknown>, deps: ChecklistLedgerDeps = {}): Promise<ChecklistAddResult> {
|
|
484
|
+
const id = requiredString(rawArgs.id, 'id');
|
|
485
|
+
const title = requiredString(rawArgs.title, 'title');
|
|
486
|
+
const version = resolveChecklistVersion(filledString(rawArgs.version, 'version'));
|
|
487
|
+
const owner = filledString(rawArgs.owner, 'owner');
|
|
488
|
+
const priority = filledString(rawArgs.priority, 'priority');
|
|
489
|
+
const deadlineVersion = filledString(rawArgs.deadlineVersion, 'deadlineVersion');
|
|
490
|
+
const predecessors = filledArray(rawArgs.predecessors, 'predecessors');
|
|
491
|
+
const refs = filledArray(rawArgs.refs, 'refs');
|
|
492
|
+
const ledgerRoot = releaseLedgerRoot();
|
|
493
|
+
const denial = (deps.fence ?? ledgerWriteDenial)('release checklist add', ledgerRoot);
|
|
494
|
+
if (denial) return { output: `ChecklistAdd ${id} 거부`, ok: false, error: denial, version };
|
|
495
|
+
const snapshot = addItem(version, {
|
|
496
|
+
id,
|
|
497
|
+
title,
|
|
498
|
+
...(refs !== undefined ? { refs } : {}),
|
|
499
|
+
...(owner !== undefined ? { owner } : {}),
|
|
500
|
+
...(priority !== undefined ? { priority: priority as PlacementPriority } : {}),
|
|
501
|
+
...(deadlineVersion !== undefined ? { deadlineVersion } : {}),
|
|
502
|
+
...(predecessors !== undefined ? { predecessors } : {}),
|
|
503
|
+
}, { allowDuplicateId: rawArgs.allowDuplicateId === true });
|
|
504
|
+
return { output: `ChecklistAdd ${id} 추가 — ${version} ${snapshot.items.length}칸`, ok: true, version, ...writeView(snapshot, id) };
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// ── ChecklistSet ───────────────────────────────────────────────────────────
|
|
508
|
+
//
|
|
509
|
+
// Status ⊕ evidence (⊕ additive refs) only. Live 10-14 (node-c, gpt-6-sol):
|
|
510
|
+
// the model filled EVERY optional property of the former wide patch schema
|
|
511
|
+
// (disposition block · kind postpub · priority P2 · ceoMinutes 0 …) and
|
|
512
|
+
// clobbered the cell. Metadata therefore goes through ChecklistEdit, which
|
|
513
|
+
// changes exactly one named field per call.
|
|
514
|
+
|
|
515
|
+
export function buildChecklistSetTool(): LLMToolSpec {
|
|
516
|
+
return {
|
|
517
|
+
name: 'ChecklistSet',
|
|
518
|
+
description:
|
|
519
|
+
'Set one release-checklist cell’s status and/or evidence line — the same ledger as `elanous release checklist set --status/--evidence`, in-process (no CLI startup). ' +
|
|
520
|
+
'Pass only what changes. Invalid status transitions, the HQ lease fence and the actor audit behave exactly like the CLI. ' +
|
|
521
|
+
'A screen cell turning green without the five-screen «짝:» evidence line surfaces a parityWarning. ' +
|
|
522
|
+
'To change owner, priority, disposition, kind, dispatch kind, deadline, predecessors, CEO load or the accelerator tier use ChecklistEdit.',
|
|
523
|
+
parameters: {
|
|
524
|
+
type: 'object',
|
|
525
|
+
properties: {
|
|
526
|
+
id: { type: 'string', description: 'Cell id.' },
|
|
527
|
+
version: { type: 'string', description: 'Release version or codename (default: dev version with -dev.N stripped).' },
|
|
528
|
+
status: { type: 'string', enum: ['green', 'yellow', 'red', 'done'], description: 'New status — leave out to keep the current one.' },
|
|
529
|
+
evidence: { type: 'string', description: '근거 한 줄 — PR #·커밋·실측. REPLACES the current evidence (screen 칸이 green 이면 «짝: PWA … · 데스크톱 … · 폴드 … · 아이폰 … · 아이패드 …» 줄 필요). Leave out to keep it.' },
|
|
530
|
+
refs: { type: 'array', items: { type: 'string' }, description: 'Evidence doc refs to add (deduped; never removes).' },
|
|
531
|
+
},
|
|
532
|
+
required: ['id'],
|
|
533
|
+
additionalProperties: false,
|
|
534
|
+
},
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
export interface ChecklistSetResult extends Record<string, unknown>, ChecklistWriteView {
|
|
539
|
+
output: string;
|
|
540
|
+
ok: boolean;
|
|
541
|
+
error?: string;
|
|
542
|
+
version: string;
|
|
543
|
+
parityWarning?: string;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
export async function dispatchChecklistSet(rawArgs: Record<string, unknown>, deps: ChecklistLedgerDeps = {}): Promise<ChecklistSetResult> {
|
|
547
|
+
const id = requiredString(rawArgs.id, 'id');
|
|
548
|
+
const version = resolveChecklistVersion(filledString(rawArgs.version, 'version'));
|
|
549
|
+
const status = filledString(rawArgs.status, 'status');
|
|
550
|
+
if (status !== undefined && !['green', 'yellow', 'red', 'done'].includes(status)) throw new Error(`잘못된 상태: ${status} (green|yellow|red|done)`);
|
|
551
|
+
const evidence = filledString(rawArgs.evidence, 'evidence');
|
|
552
|
+
const refs = filledArray(rawArgs.refs, 'refs');
|
|
553
|
+
const patch = {
|
|
554
|
+
...(refs !== undefined ? { refs } : {}),
|
|
555
|
+
...(status !== undefined ? { status: status as ChecklistStatus } : {}),
|
|
556
|
+
...(evidence !== undefined ? { evidence } : {}),
|
|
557
|
+
};
|
|
558
|
+
if (Object.keys(patch).length === 0) {
|
|
559
|
+
throw new Error('갱신할 칸을 지정하라 (status · evidence · refs 중 하나 — 다른 칸은 ChecklistEdit)');
|
|
560
|
+
}
|
|
561
|
+
const ledgerRoot = releaseLedgerRoot();
|
|
562
|
+
const denial = (deps.fence ?? ledgerWriteDenial)('release checklist set', ledgerRoot);
|
|
563
|
+
if (denial) return { output: `ChecklistSet ${id} 거부`, ok: false, error: denial, version };
|
|
564
|
+
const snapshot = setItem(version, id, patch, ledgerActor());
|
|
565
|
+
const item = snapshot.items.find((entry) => entry.id === id);
|
|
566
|
+
const parityWarning = item?.kind === 'screen' && item.status === 'green' ? parityGap(item.evidence) : null;
|
|
567
|
+
if (parityWarning) debug.log('release.checklist', 'parity-warning', { version, id, why: parityWarning });
|
|
568
|
+
return {
|
|
569
|
+
output: `ChecklistSet ${id} 갱신${parityWarning ? ` — ⚠ 짝: ${parityWarning}` : ''}`,
|
|
570
|
+
ok: true,
|
|
571
|
+
version,
|
|
572
|
+
...writeView(snapshot, id),
|
|
573
|
+
...(parityWarning ? { parityWarning } : {}),
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
// ── ChecklistEdit ──────────────────────────────────────────────────────────
|
|
578
|
+
|
|
579
|
+
const CHECKLIST_EDIT_FIELDS = [
|
|
580
|
+
'owner', 'priority', 'disposition', 'kind', 'dispatchKind', 'deadlineVersion',
|
|
581
|
+
'predecessors', 'ceoMinutes', 'ceoDate', 'accelerator',
|
|
582
|
+
] as const;
|
|
583
|
+
type ChecklistEditField = typeof CHECKLIST_EDIT_FIELDS[number];
|
|
584
|
+
|
|
585
|
+
export function buildChecklistEditTool(): LLMToolSpec {
|
|
586
|
+
return {
|
|
587
|
+
name: 'ChecklistEdit',
|
|
588
|
+
description:
|
|
589
|
+
'Change exactly ONE metadata field of a release-checklist cell — the same ledger, HQ lease fence and actor audit as `elanous release checklist set --<field>`, in-process. ' +
|
|
590
|
+
'Call once per field the user asked to change; status/evidence go through ChecklistSet. ' +
|
|
591
|
+
'value encoding: priority P0|P1|P2 · disposition move|known-issue|block · kind screen|postpub · dispatchKind code|ops|measure|decision|umbrella · ' +
|
|
592
|
+
'predecessors comma-separated ids ("" clears) · ceoMinutes integer ≥ 0 · ceoDate YYYY-MM-DD · accelerator true|false.',
|
|
593
|
+
parameters: {
|
|
594
|
+
type: 'object',
|
|
595
|
+
properties: {
|
|
596
|
+
id: { type: 'string', description: 'Cell id.' },
|
|
597
|
+
version: { type: 'string', description: 'Release version or codename (default: dev version with -dev.N stripped).' },
|
|
598
|
+
field: { type: 'string', enum: [...CHECKLIST_EDIT_FIELDS], description: 'The one field to change.' },
|
|
599
|
+
value: { type: 'string', description: 'New value, encoded as listed in the tool description.' },
|
|
600
|
+
},
|
|
601
|
+
required: ['id', 'field', 'value'],
|
|
602
|
+
additionalProperties: false,
|
|
603
|
+
},
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
/** One-field patch for ChecklistEdit — `setItem` validates the value itself. */
|
|
608
|
+
function checklistEditPatch(field: ChecklistEditField, value: string): Record<string, unknown> {
|
|
609
|
+
switch (field) {
|
|
610
|
+
case 'predecessors':
|
|
611
|
+
return { predecessors: value.split(/[\s,]+/).filter(Boolean) };
|
|
612
|
+
case 'ceoMinutes': {
|
|
613
|
+
if (!/^(0|[1-9]\d*)$/.test(value.trim())) throw new Error("'ceoMinutes' value must be an integer ≥ 0");
|
|
614
|
+
return { ceoMinutes: Number(value.trim()) };
|
|
615
|
+
}
|
|
616
|
+
case 'accelerator':
|
|
617
|
+
if (value !== 'true' && value !== 'false') throw new Error("'accelerator' value must be true or false");
|
|
618
|
+
return { accelerator: value === 'true' ? true : null };
|
|
619
|
+
default:
|
|
620
|
+
if (!value.trim()) throw new Error(`'${field}' value must be nonempty`);
|
|
621
|
+
return { [field]: value.trim() };
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
export interface ChecklistEditResult extends Record<string, unknown>, ChecklistWriteView {
|
|
626
|
+
output: string;
|
|
627
|
+
ok: boolean;
|
|
628
|
+
error?: string;
|
|
629
|
+
version: string;
|
|
630
|
+
field: string;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
export async function dispatchChecklistEdit(rawArgs: Record<string, unknown>, deps: ChecklistLedgerDeps = {}): Promise<ChecklistEditResult> {
|
|
634
|
+
const id = requiredString(rawArgs.id, 'id');
|
|
635
|
+
const version = resolveChecklistVersion(filledString(rawArgs.version, 'version'));
|
|
636
|
+
const field = requiredString(rawArgs.field, 'field');
|
|
637
|
+
if (!(CHECKLIST_EDIT_FIELDS as readonly string[]).includes(field)) throw new Error(`고칠 수 없는 칸: ${field} (${CHECKLIST_EDIT_FIELDS.join('|')})`);
|
|
638
|
+
if (typeof rawArgs.value !== 'string') throw new Error("'value' must be a string");
|
|
639
|
+
const patch = checklistEditPatch(field as ChecklistEditField, rawArgs.value);
|
|
640
|
+
const ledgerRoot = releaseLedgerRoot();
|
|
641
|
+
const denial = (deps.fence ?? ledgerWriteDenial)('release checklist set', ledgerRoot);
|
|
642
|
+
if (denial) return { output: `ChecklistEdit ${id} 거부`, ok: false, error: denial, version, field };
|
|
643
|
+
const snapshot = setItem(version, id, patch as Parameters<typeof setItem>[2], ledgerActor());
|
|
644
|
+
return { output: `ChecklistEdit ${id} ${field} 갱신`, ok: true, version, field, ...writeView(snapshot, id) };
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
// ── ChecklistMove ──────────────────────────────────────────────────────────
|
|
648
|
+
|
|
649
|
+
export function buildChecklistMoveTool(): LLMToolSpec {
|
|
650
|
+
return {
|
|
651
|
+
name: 'ChecklistMove',
|
|
652
|
+
description:
|
|
653
|
+
'Move one checklist cell to another release version in a single transaction — the same ledger and permission routing as `elanous release checklist move`, in-process. ' +
|
|
654
|
+
'A seat (ELANOUS_TRACK) may move only its own cell into the next version (capacity-checked); the OP seat moves unrestricted; without ELANOUS_TRACK the move runs unchecked and is recorded as anonymous. Seat-rule violations throw.',
|
|
655
|
+
parameters: {
|
|
656
|
+
type: 'object',
|
|
657
|
+
properties: {
|
|
658
|
+
id: { type: 'string', description: 'Cell id.' },
|
|
659
|
+
from: { type: 'string', description: 'Current version (or codename).' },
|
|
660
|
+
to: { type: 'string', description: 'Target version (or codename).' },
|
|
661
|
+
reason: { type: 'string', description: 'Why the cell moves — required, recorded in the claim history.' },
|
|
662
|
+
},
|
|
663
|
+
required: ['id', 'from', 'to', 'reason'],
|
|
664
|
+
additionalProperties: false,
|
|
665
|
+
},
|
|
666
|
+
};
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
export interface ChecklistMoveResult extends Record<string, unknown>, ChecklistWriteView {
|
|
670
|
+
output: string;
|
|
671
|
+
ok: boolean;
|
|
672
|
+
error?: string;
|
|
673
|
+
id: string;
|
|
674
|
+
from: string;
|
|
675
|
+
to: string;
|
|
676
|
+
actor: string;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
export async function dispatchChecklistMove(rawArgs: Record<string, unknown>, deps: ChecklistLedgerDeps = {}): Promise<ChecklistMoveResult> {
|
|
680
|
+
const id = requiredString(rawArgs.id, 'id');
|
|
681
|
+
const from = resolveChecklistVersion(requiredString(rawArgs.from, 'from'));
|
|
682
|
+
const to = resolveChecklistVersion(requiredString(rawArgs.to, 'to'));
|
|
683
|
+
const reason = filledString(rawArgs.reason, 'reason');
|
|
684
|
+
if (!reason?.trim()) throw new Error('이동 이유가 필요하다');
|
|
685
|
+
const ledgerRoot = releaseLedgerRoot();
|
|
686
|
+
const denial = (deps.fence ?? ledgerWriteDenial)('release checklist move', ledgerRoot);
|
|
687
|
+
if (denial) return { output: `ChecklistMove ${id} 거부`, ok: false, error: denial, id, from, to, actor: ledgerActor() };
|
|
688
|
+
const actor = ledgerActor();
|
|
689
|
+
if (actor === 'cli') {
|
|
690
|
+
debug.log('release.placement', 'anonymous-move', { id, from, to });
|
|
691
|
+
checklistFeatures.move(id, from, to, actor, undefined, undefined, reason);
|
|
692
|
+
} else if (actor !== 'OP') {
|
|
693
|
+
seatMove(id, from, to, actor, reason, { schedules: listSchedules(ledgerRoot) });
|
|
694
|
+
} else {
|
|
695
|
+
checklistFeatures.move(id, from, to, actor, undefined, undefined, reason);
|
|
696
|
+
}
|
|
697
|
+
const snapshot = listChecklist(to, ledgerRoot);
|
|
698
|
+
return {
|
|
699
|
+
output: `ChecklistMove ${id} ${from} → ${to}${actor === 'cli' ? ' (⚠ 자리 신원 없음 — 자리 규칙 검사 없이 옮김)' : ''}`,
|
|
700
|
+
ok: true,
|
|
701
|
+
id,
|
|
702
|
+
from,
|
|
703
|
+
to,
|
|
704
|
+
actor,
|
|
705
|
+
...writeView(snapshot, id),
|
|
706
|
+
};
|
|
707
|
+
}
|