elanous 0.2.38 → 0.2.41
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/README.md +7 -7
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → GiOLWmt4MqDZePubBjA4Q}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/1115.434ae2ecb0ad986d.js +149 -0
- package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +36 -0
- package/apps/pwa/out/_next/static/chunks/1178.1aa9cad0e7695427.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5203.51e5d8b5f1dcfe53.js → 1219.7e17964e0e7cd8e5.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +287 -0
- package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1661.0dd330f3d89f73f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +90 -0
- package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7573.2376e13c9c21f1f8.js → 1765.679b29625c8e88d4.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{3528.e4b8ab70d339f965.js → 1800.f7ff51dc4978a958.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1971-7efb628c471dc5a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2073.689dcb2680113d76.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +1 -0
- package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8879.ac06755bcf3e44a1.js → 2263.e09b6edea33bad2d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2527-5c636a43c7cc5dde.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2743.5d3f76948be32b34.js +41 -0
- package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +32 -0
- package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9fe1b809.738da85c8b17e3fb.js → 2fdf2931.b431eee4fb468bc3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{eaad0cba.771200940c529df7.js → 2fe2c302.41b517f88d6fe502.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +79 -0
- package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3230-49298c3b73ef2268.js +1 -0
- package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +74 -0
- package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b7478fef.5917716286213fcc.js → 385e4574.e9886ab32759eda3.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4133.2056bb4d78f621af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4156.ba4de4a3664f04b4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +148 -0
- package/apps/pwa/out/_next/static/chunks/{8911.bf5e712acb25fb6c.js → 4527.a69f2894d1bc9f4a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +226 -0
- package/apps/pwa/out/_next/static/chunks/{5307.d7328020227880c2.js → 4667.97e31aa38c95c475.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/{6142.913b44e260a3f925.js → 4702.4a4adc1f16d7c93b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +94 -0
- package/apps/pwa/out/_next/static/chunks/{8487.291666583bebe640.js → 5159.115f1c2ca471386c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/530.d26346e18089640a.js +115 -0
- package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +8 -0
- package/apps/pwa/out/_next/static/chunks/{89d6c04f-6b8ab341748e468a.js → 53aeb4ee-51c92f8d683f5220.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3291.f6c1005387d514bd.js → 5471.1e611302ed3a7c53.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3086.fb14b60ce98b53d3.js → 5574.f35accf4f132b29d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{1632.7d87f998e714bede.js → 5744.b9415e18ad623100.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5300.677c97e0393742e6.js → 5892.2526d962339662d8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5937.c2df9e3447e1f667.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +286 -0
- package/apps/pwa/out/_next/static/chunks/{7161-8f22db3ec5ed005e.js → 5947-135e26537d80a6b9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{3124-561f7f037943cde2.js → 5964-7e21164a8f2cf0ce.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +27 -0
- package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6552.a3840aa7da35ad68.js +62 -0
- package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +24 -0
- package/apps/pwa/out/_next/static/chunks/6874.d5cf7eb8edb2cabe.js +2 -0
- package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +122 -0
- package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2415.738b777642a02233.js → 7191.fdc955f7d96064a4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1026-44010f405704050c.js → 8050-9b364bdef8f71927.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/83184dcd-0ee6247ff41eb3f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +104 -0
- package/apps/pwa/out/_next/static/chunks/8464-e24f10451b658aac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8880.64c445592f04acaf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5638.107314dc479e2f37.js → 9048.212083de42d25be3.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8019.21ca554a821dad01.js → 9507.7026657a2f47eb64.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/9541.eb8e2f8480c7feca.js +93 -0
- package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9579.4a8169600fff2058.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +34 -0
- package/apps/pwa/out/_next/static/chunks/{6493.27ad77de7aac7966.js → 9834.63ab2bbc3153172e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3389.012c70767a872f9b.js → 9869.81a1e24ca682d5a0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8994d93e.33ba491f95345fc2.js → a0a01613.6d1cca322238d7fe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{de8b930d.d94c0f42acf807fc.js → addc2b32.8c4ff8f0aefe987d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-866aac5ff226a7f3.js → page-14949db884bfa672.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-40f9e19149024298.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a142dfb0331a05f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/b2271e54.c1de3347976e90b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b7459770.6539b11860eb8a9c.js → c0c1a699.0ba79f97005965d4.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/bin/elanous.mjs +6 -1
- package/catalog/models/openai/gpt-6.1-sol.yaml +16 -0
- package/catalog/models/openai/gpt-6.1-terra.yaml +16 -0
- package/graphs/demo/persona-marketer/fixtures/marketer-scenario.yaml +10 -0
- package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
- package/graphs/demo/persona-marketer/recipes.yaml +19 -0
- package/graphs/demo/persona-teacher/lesson-pack.yaml +16 -0
- package/graphs/demo/persona-teacher/recipes.yaml +17 -0
- package/graphs/demo/persona-teacher/weekly-lesson.yaml +36 -0
- package/graphs/overlays/stop-heal-ladder.yaml +23 -2
- package/graphs/release/release-loop.yaml +3 -1
- package/graphs/units/gate/gate.yaml +20 -0
- package/graphs/units/git/git.yaml +26 -0
- package/graphs/units/implement/implement.yaml +19 -0
- package/graphs/units/landing/landing.yaml +18 -0
- package/graphs/units/review/review.yaml +20 -0
- package/graphs/units/verbs/recipes.yaml +3 -0
- package/graphs/units/verbs/research.yaml +20 -0
- package/graphs/video/explainer-line.yaml +4 -1
- package/graphs/work/research-report.yaml +11 -1
- package/package.json +1 -1
- package/scripts/dead-code/report.ts +169 -0
- package/scripts/disk-steward.ts +46 -0
- package/scripts/fleet/node-setup.sh +50 -0
- package/scripts/graph-units/verbs/research.ts +55 -0
- package/scripts/lib/morning-report-options.ts +3 -4
- package/scripts/lib/tui-regress-evidence.ts +56 -0
- package/scripts/llm-cost-ledger.ts +179 -8
- package/scripts/measure-nl-routing-corpus.ts +10 -2
- package/scripts/morning-report.ts +5 -1
- package/scripts/persona-teacher/weekly-lesson-node.ts +172 -0
- package/scripts/public-copy-lint.ts +163 -19
- package/scripts/public-export.ts +15 -7
- package/scripts/ratchets/train-side-invariants.sh +0 -1
- package/scripts/release-loop/export-check-node.ts +21 -3
- package/scripts/release-loop/gate-autoheal.ts +117 -0
- package/scripts/release-loop/gate-baseline-receipt.ts +8 -1
- package/scripts/release-loop/gate-diff.ts +22 -3
- package/scripts/release-loop/gate-node.ts +583 -64
- package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
- package/scripts/release-loop/gate-shard-load-flaky.ts +256 -0
- package/scripts/release-loop/gate-shard-receipts.ts +89 -0
- package/scripts/release-loop/gate-triage-node.ts +70 -10
- package/scripts/release-loop/gate-wall.ts +5 -5
- package/scripts/release-loop/preflight.ts +6 -2
- package/scripts/release-loop/resume-release.ts +267 -20
- package/scripts/release-loop/resume.ts +48 -0
- package/scripts/release-loop/traffic-node.ts +6 -3
- package/scripts/release-loop/unattended-release.ts +4 -2
- package/scripts/release-loop/version-node.ts +7 -2
- package/scripts/release-story/draft.ts +1 -1
- package/scripts/research-bench/README.md +53 -0
- package/scripts/research-bench/questions.json +66 -0
- package/scripts/research-bench/rubric.md +33 -0
- package/scripts/research-bench/run.ts +523 -0
- package/scripts/shadow-authoring-probe.ts +20 -0
- package/scripts/tui-regress.ts +85 -10
- package/scripts/ux-sim.ts +19 -2
- package/src/acp/core-turn-bridge.ts +94 -4
- package/src/agent/autonomous-tools.ts +10 -3
- package/src/agent/monad-agent-turn.ts +4 -1
- package/src/agent/registry.ts +26 -2
- package/src/agent/shared-app-tools.ts +1 -1
- package/src/agent/surface-ux/build.ts +12 -3
- package/src/agent/surface-ux/types.ts +1 -1
- package/src/agent/task-notification.ts +75 -6
- package/src/agent/types.ts +3 -0
- package/src/agent-mission/driver.ts +29 -3
- package/src/agent-mission/mission-cli.ts +2 -1
- package/src/agent-substrate/review-context-pack.ts +365 -0
- package/src/agent-substrate/self-review-cli.ts +291 -20
- package/src/ask-user-question/index.ts +6 -0
- package/src/ask-user-question/inline-resolver.ts +49 -0
- package/src/auto-research/question-ladder-contract.ts +22 -3
- package/src/auto-research/research-turn.ts +359 -17
- package/src/autopilot/agent-loop.ts +1 -1
- package/src/autopilot/discovery/wiki-claim-proposer.ts +22 -1
- package/src/autopilot/pty-control-loop.ts +8 -1
- package/src/boot/daemon-tools/index.ts +4 -3
- package/src/boot/daemon-tools/self-implement.ts +312 -7
- package/src/boot/daemon-tools/types.ts +2 -0
- package/src/budget/llm-cost.ts +44 -5
- package/src/budget/shadow-arms.ts +52 -0
- package/src/budget/unified-usage.ts +17 -1
- package/src/capture/tui-self-report.ts +14 -0
- package/src/chat/index.ts +33 -7
- package/src/chat/pickers/state.ts +7 -1
- package/src/cli/agent-cli.ts +43 -8
- package/src/cli/intake-cli.ts +22 -1
- package/src/cli/lesson-cli.ts +19 -3
- package/src/cli/log-event-names.ts +6 -0
- package/src/cli/mcp-login.ts +8 -18
- package/src/cli/msg-cli.ts +57 -1
- package/src/cli/pod-cli.ts +17 -2
- package/src/cli/pr-land-heavy-remote.ts +15 -9
- package/src/cli/pty-takeover-cli.ts +67 -7
- package/src/cli/release-cli.ts +79 -7
- package/src/cli/repo-cli.ts +2 -1
- package/src/cli/sim-cli.ts +7 -1
- package/src/cli/tasks-cli.ts +41 -13
- package/src/codex/models.ts +30 -15
- package/src/control-plane/ledger.ts +21 -4
- package/src/core-turn/run-core-turn.ts +47 -3
- package/src/core-turn/run-goal-loop.ts +240 -10
- package/src/core-turn/types.ts +9 -0
- package/src/dashboard/acp-boot.ts +72 -3
- package/src/dashboard/chat/acp-chat.ts +2 -2
- package/src/dashboard/classic-sigquit.ts +16 -0
- package/src/dashboard/index.ts +327 -27
- package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
- package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
- package/src/dashboard/input/external-input-host.ts +2 -0
- package/src/dashboard/sidetab-runtime.ts +228 -0
- package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -8
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
- package/src/dashboard/term-slash-runtime.ts +16 -18
- package/src/dashboard/turn-preamble.ts +14 -1
- package/src/disk-steward/judge.ts +73 -0
- package/src/disk-steward/ledger.ts +122 -0
- package/src/disk-steward/steward.ts +373 -0
- package/src/domains/guardian-tick.ts +191 -2
- package/src/domains/knowledge.ts +1 -1
- package/src/esc-abort-gate.ts +33 -1
- package/src/execution-loop/launch-gate.ts +206 -1
- package/src/graph-runner/graph-cli.ts +27 -4
- package/src/graph-runner/in-process-registry.ts +37 -0
- package/src/graph-runner/runner.ts +63 -11
- package/src/graph-wizard/generate.ts +16 -7
- package/src/graph-wizard/mission-compose.ts +201 -0
- package/src/grok/agent-search.ts +8 -2
- package/src/grok/credential.ts +5 -0
- package/src/grounding/ref-index.ts +30 -0
- package/src/grounding/ref-vector.ts +61 -0
- package/src/grounding/sources-cli.ts +11 -3
- package/src/grounding/sources.ts +15 -1
- package/src/harness/harness-cli-command.ts +305 -23
- package/src/harness/harness-incidents.ts +312 -7
- package/src/harness/harness-pod-dispatch.ts +7 -1
- package/src/harness/harness-space.ts +15 -1
- package/src/harness/progress-worker-entry.ts +59 -0
- package/src/harness/progress-worker-runtime.ts +11 -0
- package/src/index.ts +35 -5
- package/src/input/external-input-queue.ts +10 -0
- package/src/instance/dev-project.ts +25 -0
- package/src/intake-plane/collect-telegram-saved.ts +36 -1
- package/src/intake-plane/intake-to-tasks.ts +246 -3
- package/src/intelligence-map/model-alias.ts +6 -5
- package/src/intelligence-map/model-catalog.ts +59 -2
- package/src/lessons/friction-ledger.ts +154 -0
- package/src/live-supply/collector.ts +149 -0
- package/src/live-supply/probes.ts +52 -0
- package/src/live-supply/snapshot.ts +40 -0
- package/src/llm/model-defaults.ts +4 -4
- package/src/llm.ts +473 -87
- package/src/loops/orchestrator/tick.ts +56 -0
- package/src/mcp/mcp-oauth.ts +3 -1
- package/src/model-tier/llm-tier-map.ts +9 -9
- package/src/model-tier/turn-tier.ts +1 -1
- package/src/msg/msg-mirror-github.ts +80 -0
- package/src/msg/msg-mirror-policy.ts +61 -0
- package/src/msg/msg-mirror-runner.ts +219 -0
- package/src/msg/msg-mirror-state.ts +33 -0
- package/src/msg/msg-store.ts +11 -0
- package/src/nexus/api/harness-api.ts +2 -1
- package/src/output-truncation.ts +41 -12
- package/src/project/project-store.ts +48 -1
- package/src/pty/snapshot.py +132 -0
- package/src/pty-shell/pty-control-ipc.ts +29 -2
- package/src/pty-shell/pty-manifest.ts +59 -3
- package/src/pty-shell/registry.ts +2 -0
- package/src/pty-shell/tui-run-state.ts +80 -3
- package/src/release-loop/gate-host-reservation.ts +157 -4
- package/src/release-loop/gate-shard-ledger.ts +68 -0
- package/src/release-loop/merged-pr-checklist.ts +25 -2
- package/src/release-loop/rehearsal-shard-plan.ts +6 -1
- package/src/release-loop/rehearsal.ts +27 -0
- package/src/release-loop/release-schedule.ts +90 -1
- package/src/research/bloom-exemplars.ts +135 -0
- package/src/research/edge-decision.ts +124 -15
- package/src/research/gap-followup.ts +249 -0
- package/src/research/lenses/counter-evidence.ts +100 -0
- package/src/research/lenses/working-backwards.ts +89 -0
- package/src/research/plugin-discovery.ts +242 -0
- package/src/research-bridge/invoke.ts +4 -2
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +73 -131
- package/src/self-dev/dev-cli.ts +19 -17
- package/src/self-dev/dev-pipeline.ts +8 -4
- package/src/self-dev/graph-front-nodes.ts +23 -0
- package/src/self-dev/graph-journey-route.ts +10 -2
- package/src/self-dev/launch-preflight-text.ts +2 -2
- package/src/self-dev/launch-preflight.ts +47 -11
- package/src/self-dev/orchestrate-cli.ts +1 -0
- package/src/self-dev/orchestrate.ts +15 -0
- package/src/self-dev/run-supervisor.ts +204 -3
- package/src/self-dev/run-types.ts +3 -0
- package/src/self-implement/device-first.ts +8 -2
- package/src/self-implement/doctor-visit.ts +76 -58
- package/src/self-implement/gate-artifacts.ts +16 -0
- package/src/self-implement/gate-baseline.ts +75 -4
- package/src/self-implement/gate-cli.ts +368 -30
- package/src/self-implement/gate-receipt-registry.ts +180 -0
- package/src/self-implement/gate-remote.ts +165 -24
- package/src/self-implement/goal-author-clarification.ts +205 -32
- package/src/self-implement/goal-author-decompose.ts +24 -15
- package/src/self-implement/goal-author.ts +86 -10
- package/src/self-implement/graph-stage-units.ts +172 -0
- package/src/self-implement/graph-templates.ts +162 -1
- package/src/self-implement/graph-variant.ts +37 -4
- package/src/self-implement/host-regate.ts +124 -49
- package/src/self-implement/impl-findings-feedback.ts +188 -0
- package/src/self-implement/knowhow-pack.ts +227 -10
- package/src/self-implement/off-diff-evidence.ts +124 -0
- package/src/self-implement/orchestrator.ts +320 -28
- package/src/self-implement/run-ledger.ts +110 -14
- package/src/self-implement/run-stop.ts +33 -2
- package/src/self-implement/running-runs.ts +35 -12
- package/src/self-implement/seams.ts +6 -3
- package/src/self-implement/self-implement-cli.ts +40 -6
- package/src/self-implement/stop-autoheal-operational.ts +43 -0
- package/src/self-implement/stop-autoheal.ts +15 -6
- package/src/session/chat.ts +66 -15
- package/src/session/request-size-guard.ts +123 -0
- package/src/session-runtime/provider-circuit.ts +140 -0
- package/src/shell-runner/file-engine.ts +1 -0
- package/src/shell-runner/types.ts +4 -0
- package/src/sidetab-core/model.ts +312 -0
- package/src/skills/tools/schedule-wakeup.ts +23 -1
- package/src/skills/tools/shell.ts +51 -5
- package/src/steward/directive-audit.ts +354 -0
- package/src/surface/child-process.ts +31 -0
- package/src/surface/tui-stderr-owner.ts +48 -0
- package/src/task-agent/cover.ts +30 -12
- package/src/task-agent/judge.ts +56 -0
- package/src/task-agent/parent-host.ts +14 -1
- package/src/task-agent/postland-card.ts +35 -2
- package/src/task-agent/rejudge-on-head.ts +46 -2
- package/src/task-agent/repair-cycle.ts +1 -1
- package/src/task-agent/task-hand.ts +133 -25
- package/src/task-agent/tier-split.ts +105 -21
- package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
- package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +70 -2
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +29 -4
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
- package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +298 -45
- package/src/task-orchestrator/surfaces/self-implement.ts +18 -0
- package/src/tool-runtime/skill-exec-runtime.ts +95 -5
- package/src/tui/entry.ts +25 -5
- package/src/tui/inline-choice.ts +188 -0
- package/src/tui/sidetab/list.ts +36 -165
- package/src/tui/sidetab/nl-tool.ts +2 -136
- package/src/tui/sidetab/peek.ts +52 -0
- package/src/tui/slash/term.ts +12 -1
- package/src/tui-client/dashboard-session.ts +10 -1
- package/src/user-config.ts +45 -9
- package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
- package/src/ux-sim/fake-land-queue.ts +88 -0
- package/src/ux-sim/fault-needs-human-reason-repair.ts +107 -0
- package/src/ux-sim/fault-pod-child-result.ts +42 -0
- package/src/ux-sim/gate-shard-host-reroute.ts +82 -0
- package/src/ux-sim/goal-interim-trace.ts +24 -0
- package/src/ux-sim/next-tui-seat-scenarios.ts +8 -13
- package/src/ux-sim/release-sim-rig.ts +262 -0
- package/src/ux-sim/seminar-rehearsal.ts +109 -0
- package/src/ux-sim/subagent-tools-device.ts +2 -2
- package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/recipes/explainer.ts +54 -2
- package/src/web-search/grok.ts +32 -6
- package/src/web-search/index.ts +8 -7
- package/src/workflow-runtime/node-catalog.ts +53 -4
- package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +0 -148
- package/apps/pwa/out/_next/static/chunks/2104.70e086d5174a4736.js +0 -1
- package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +0 -93
- package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +0 -104
- package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +0 -24
- package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +0 -1
- package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +0 -287
- package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +0 -94
- package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4199-f7c6eb40cd0322f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +0 -32
- package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +0 -90
- package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +0 -79
- package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +0 -286
- package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +0 -1
- package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +0 -8
- package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +0 -62
- package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7488.966b116789f3d41a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7524.ce973525d30b3d52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7628.6b16863ac3972333.js +0 -34
- package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7954.4f7a8832663ee979.js +0 -115
- package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +0 -1
- package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +0 -149
- package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +0 -226
- package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +0 -24
- package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +0 -2
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +0 -1
- package/apps/pwa/out/_next/static/chunks/bb6987f9.3647e1a23b0e3217.js +0 -122
- package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +0 -1
- package/scripts/ratchets/next-tui-entry-budget.ts +0 -124
- /package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → GiOLWmt4MqDZePubBjA4Q}/_ssgManifest.js +0 -0
package/src/chat/index.ts
CHANGED
|
@@ -452,12 +452,21 @@ export interface SlashCommand {
|
|
|
452
452
|
name: string; // e.g. 'quit'
|
|
453
453
|
aliases?: string[]; // e.g. ['q', 'exit']
|
|
454
454
|
description: string; // shown in picker
|
|
455
|
+
/** Keep a command executable, but omit it from slash discovery surfaces. */
|
|
456
|
+
hidden?: boolean;
|
|
455
457
|
/** First-positional-arg suggestions (static). E.g. /plugin → [list, activate, ...]. */
|
|
456
458
|
subcommands?: string[];
|
|
457
459
|
}
|
|
458
460
|
|
|
461
|
+
/** The 15 slash commands exposed on the first-use menu and in /help. */
|
|
462
|
+
export const SLASH_MENU_POLICY = {
|
|
463
|
+
required: ['help', 'status', 'model', 'clear', 'resume', 'quit', 'now', 'harness', 'memory', 'side'],
|
|
464
|
+
reserve: ['context', 'remaining', 'session', 'setup', 'decide'],
|
|
465
|
+
} as const;
|
|
466
|
+
const FIRST_USE_SLASH_COMMANDS: ReadonlySet<string> = new Set([...SLASH_MENU_POLICY.required, ...SLASH_MENU_POLICY.reserve]);
|
|
467
|
+
|
|
459
468
|
// Default commands available in the input
|
|
460
|
-
export const SLASH_COMMANDS: SlashCommand[] = [
|
|
469
|
+
export const SLASH_COMMANDS: SlashCommand[] = ([
|
|
461
470
|
{ name: 'help', aliases: ['?'], description: '명령과 키 보기' },
|
|
462
471
|
{ name: 'resume', aliases: [], description: '지난 대화 이어 가기 · /resume <id 앞자리>' },
|
|
463
472
|
{ name: 'model', aliases: ['m'], description: '모델 바꾸기 — /model 빠름|보통|깊음 (코드명도 됨)', subcommands: ['빠름', '보통', '깊음', 'codex', 'terra', 'sol', 'luna', 'opus', 'sonnet', 'grok'] },
|
|
@@ -538,11 +547,12 @@ export const SLASH_COMMANDS: SlashCommand[] = [
|
|
|
538
547
|
{ name: 'voice-chat', aliases: ['vc'], description: 'Continuous voice chat mode — speak, elanous replies in voice (Phase 4-5). Subcommands: start / stop / cancel / status. Chord: Alt+R toggles enter/exit anywhere.', subcommands: ['start', 'stop', 'cancel', 'status'] },
|
|
539
548
|
{ name: 'auto-tts', aliases: ['tts', 'autotts'], description: 'Auto-TTS for chat responses (Phase 2) — speaks LLM replies sentence-by-sentence. Subcommands: on / off / toggle / status.', subcommands: ['on', 'off', 'toggle', 'status'] },
|
|
540
549
|
{ name: 'directive', aliases: [], description: '(운영) 지시를 Linear 이슈로 기록' },
|
|
541
|
-
];
|
|
550
|
+
]).map((command) => ({ ...command, hidden: !FIRST_USE_SLASH_COMMANDS.has(command.name) }));
|
|
542
551
|
|
|
543
552
|
/** Every user-visible slash spelling, normalized for runtime-catalog comparison. */
|
|
544
553
|
export function displayedSlashCommandNames(commands: readonly SlashCommand[] = SLASH_COMMANDS): string[] {
|
|
545
|
-
return commands.
|
|
554
|
+
return commands.filter((command) => !command.hidden)
|
|
555
|
+
.flatMap((command) => [command.name, ...(command.aliases ?? [])]);
|
|
546
556
|
}
|
|
547
557
|
|
|
548
558
|
/** Score and rank slash commands against the user's typed text (sans leading `/`).
|
|
@@ -553,15 +563,16 @@ export function displayedSlashCommandNames(commands: readonly SlashCommand[] = S
|
|
|
553
563
|
* prefix-on-alias 80
|
|
554
564
|
* substring-on-name 50
|
|
555
565
|
* word-start in desc 10 (regex \b<text>)
|
|
556
|
-
* Sort by score desc, then name asc.
|
|
557
|
-
*
|
|
566
|
+
* Sort by score desc, then name asc. Hidden commands are omitted from discovery,
|
|
567
|
+
* while the dispatch registry continues to accept direct input. */
|
|
558
568
|
export function filterSlashCommands(text: string, commands: SlashCommand[]): SlashCommand[] {
|
|
569
|
+
const discoverable = commands.filter((command) => !command.hidden);
|
|
559
570
|
const q = text.toLowerCase();
|
|
560
|
-
if (!q) return
|
|
571
|
+
if (!q) return discoverable;
|
|
561
572
|
const escaped = q.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
562
573
|
const descRe = new RegExp(`\\b${escaped}`, 'i');
|
|
563
574
|
const scored: { cmd: SlashCommand; score: number }[] = [];
|
|
564
|
-
for (const cmd of
|
|
575
|
+
for (const cmd of discoverable) {
|
|
565
576
|
const name = cmd.name.toLowerCase();
|
|
566
577
|
const aliases = (cmd.aliases ?? []).map(a => a.toLowerCase());
|
|
567
578
|
let score = 0;
|
|
@@ -801,6 +812,11 @@ export async function textInput(opts: {
|
|
|
801
812
|
onKey?: (key: import('../tui.js').Key) =>
|
|
802
813
|
| 'consumed' | 'passthrough'
|
|
803
814
|
| Promise<'consumed' | 'passthrough'>;
|
|
815
|
+
/** Host escape-chord override. Runs before textInput's unconditional
|
|
816
|
+
* quit path so a host can turn a chord into an in-app action. */
|
|
817
|
+
onQuitChord?: (key: import('../tui.js').Key) =>
|
|
818
|
+
| 'consumed' | 'passthrough'
|
|
819
|
+
| Promise<'consumed' | 'passthrough'>;
|
|
804
820
|
/** Provide candidate file/directory entries for the `@`-mention
|
|
805
821
|
* picker. Called with whatever the user has typed after `@` (may
|
|
806
822
|
* include subpath fragments like `foo/ba`). Host decides what
|
|
@@ -1596,6 +1612,16 @@ export async function textInput(opts: {
|
|
|
1596
1612
|
});
|
|
1597
1613
|
}
|
|
1598
1614
|
|
|
1615
|
+
// A host may claim a quit chord as an in-app action (classic
|
|
1616
|
+
// dashboard Ctrl+\\ shows side-tab guidance and keeps the TUI alive).
|
|
1617
|
+
if (isTextInputQuitChord(key) && opts.onQuitChord) {
|
|
1618
|
+
const quitRoute = await Promise.resolve(opts.onQuitChord(key));
|
|
1619
|
+
if (quitRoute === 'consumed') {
|
|
1620
|
+
drawAll();
|
|
1621
|
+
continue;
|
|
1622
|
+
}
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1599
1625
|
// Hard exit must win over modal/VW pre-routing. When a foreground
|
|
1600
1626
|
// virtual window is open, onPreKey may hand keys to the modal
|
|
1601
1627
|
// surface before textInput's own quit branch runs. Claim the quit
|
|
@@ -237,7 +237,13 @@ export function createPickerState(deps: PickerDeps): PickerState {
|
|
|
237
237
|
|
|
238
238
|
const filteredSlash = (buf: PickerBufferView): SlashCommand[] => {
|
|
239
239
|
const { role, showBeta } = readTuiSlashAudience();
|
|
240
|
-
|
|
240
|
+
// /directive is intentionally outside the compact first-use menu, but an owner must be able
|
|
241
|
+
// to discover its ops-only command in the live palette. Keep that role-specific exception local
|
|
242
|
+
// to the palette so the shared first-use menu and help catalog remain at their 15-command policy.
|
|
243
|
+
const paletteCommands = role === 'owner'
|
|
244
|
+
? deps.commands.map((command) => command.name === 'directive' ? { ...command, hidden: false } : command)
|
|
245
|
+
: deps.commands;
|
|
246
|
+
return filterSlashCommands((buf.lines[0] ?? '').slice(1), paletteCommands)
|
|
241
247
|
.filter((cmd) => (role === 'owner' && slashMaturity(cmd.name) === undefined) || slashVisibleFor(cmd.name, role, { showBeta }));
|
|
242
248
|
};
|
|
243
249
|
|
package/src/cli/agent-cli.ts
CHANGED
|
@@ -68,6 +68,25 @@ export function setCliAgentDispatchForTesting(dispatch: CliAgentDispatch | undef
|
|
|
68
68
|
cliAgentDispatchForTesting = dispatch;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
/** A completed standalone agent turn must not wait forever for a tool's leftover handle. */
|
|
72
|
+
function armAgentCliExitSafetyNet(): void {
|
|
73
|
+
const timer = setTimeout(() => {
|
|
74
|
+
try {
|
|
75
|
+
const runtime = process as typeof process & {
|
|
76
|
+
_getActiveHandles?: () => Array<{ constructor?: { name?: string } }>;
|
|
77
|
+
_getActiveRequests?: () => Array<{ constructor?: { name?: string } }>;
|
|
78
|
+
};
|
|
79
|
+
const handleTypes = runtime._getActiveHandles?.().map(h => h.constructor?.name ?? 'unknown') ?? [];
|
|
80
|
+
const requestTypes = runtime._getActiveRequests?.().map(r => r.constructor?.name ?? 'unknown') ?? [];
|
|
81
|
+
debug.log('agent.cli.exit', 'grace-expired', { handleTypes, requestTypes }, { level: 'warn' });
|
|
82
|
+
debug.flush();
|
|
83
|
+
} finally {
|
|
84
|
+
process.exit(0);
|
|
85
|
+
}
|
|
86
|
+
}, 1_000);
|
|
87
|
+
timer.unref();
|
|
88
|
+
}
|
|
89
|
+
|
|
71
90
|
export function registerAgentCommands(program: Command): void {
|
|
72
91
|
const agentCommand = program
|
|
73
92
|
.command('agent')
|
|
@@ -128,6 +147,10 @@ export function registerAgentCommands(program: Command): void {
|
|
|
128
147
|
// commander stores --no-tools as `tools: false`, plain absence as undefined → default true here.
|
|
129
148
|
enableTools: opts.tools !== false,
|
|
130
149
|
});
|
|
150
|
+
// runChatTurnCli has already flushed its JSON reply. Let clean turns exit
|
|
151
|
+
// naturally; a referenced child/socket/timer left by a tool gets one second
|
|
152
|
+
// before we log the surviving handles and end this standalone process.
|
|
153
|
+
armAgentCliExitSafetyNet();
|
|
131
154
|
});
|
|
132
155
|
|
|
133
156
|
// ── agent dispatch — RFC #7333 `A1` (트리거) ──
|
|
@@ -413,7 +436,7 @@ tierCmd
|
|
|
413
436
|
* ui.info trailer and instead emits exactly ONE JSON line on stdout
|
|
414
437
|
* at end-of-turn:
|
|
415
438
|
* {sessionId, provider, model, reply, finalReply, transcript, logPath,
|
|
416
|
-
* budget, durationMs, ts}
|
|
439
|
+
* budget, durationMs, ts, incomplete}
|
|
417
440
|
* Stable shape so LLMs can self-spawn `elanous chat` for follow-ups
|
|
418
441
|
* without parsing human-readable terminal output. */
|
|
419
442
|
export async function runChatTurnCli(opts: {
|
|
@@ -484,7 +507,7 @@ export async function runChatTurnCli(opts: {
|
|
|
484
507
|
dbg.setAmbientSessionId?.(session.id);
|
|
485
508
|
} catch { /* debug module unavailable — fine */ }
|
|
486
509
|
const replyChunks: string[] = [];
|
|
487
|
-
// Tool calls delimit assistant messages.
|
|
510
|
+
// Tool calls delimit assistant messages. Only text after the last tool call can be the final reply.
|
|
488
511
|
let segmentChunks: string[] = [];
|
|
489
512
|
let lastSegment = '';
|
|
490
513
|
let finalMessage = '';
|
|
@@ -507,14 +530,17 @@ export async function runChatTurnCli(opts: {
|
|
|
507
530
|
let tools: ReturnType<typeof buildCliAgentTools> | undefined;
|
|
508
531
|
let dispatchTool: ((name: string, args: Record<string, unknown>) => Promise<unknown>) | undefined;
|
|
509
532
|
let enabledToolNames: string[] | undefined;
|
|
533
|
+
const toolAbort = new AbortController();
|
|
534
|
+
const abortToolsOnSigint = (): void => toolAbort.abort();
|
|
510
535
|
if (opts.enableTools) {
|
|
511
536
|
const built = buildCliAgentTools(opts.cfg, harnessSpace ? {
|
|
512
537
|
sessionId: session.id,
|
|
513
538
|
emitFeedback: emitHarnessFeedbackProgress,
|
|
514
539
|
} : undefined); // ★ cfg 전달 → financeEnabled 시 finance 팩 노출(서피스 게이팅 정리)
|
|
515
540
|
tools = built;
|
|
516
|
-
dispatchTool = built.dispatch;
|
|
541
|
+
dispatchTool = (name, args) => built.dispatch(name, args, { signal: toolAbort.signal });
|
|
517
542
|
enabledToolNames = built.specs.map(s => s.name);
|
|
543
|
+
process.once('SIGINT', abortToolsOnSigint);
|
|
518
544
|
}
|
|
519
545
|
// Wire the universal preamble (project anchor + project tree +
|
|
520
546
|
// family addendum + session-specific guidance) into every CLI system
|
|
@@ -604,6 +630,8 @@ export async function runChatTurnCli(opts: {
|
|
|
604
630
|
process.exit(2);
|
|
605
631
|
}
|
|
606
632
|
throw err;
|
|
633
|
+
} finally {
|
|
634
|
+
if (opts.enableTools) process.removeListener('SIGINT', abortToolsOnSigint);
|
|
607
635
|
}
|
|
608
636
|
if (!sawToolCall && replyChunks.length === 0 && result.text) {
|
|
609
637
|
replyChunks.push(result.text);
|
|
@@ -611,6 +639,7 @@ export async function runChatTurnCli(opts: {
|
|
|
611
639
|
if (!opts.json && !opts.enableTools) process.stdout.write(result.text);
|
|
612
640
|
}
|
|
613
641
|
closeSegment();
|
|
642
|
+
const incomplete = sawToolCall && finalMessage.length === 0;
|
|
614
643
|
if (opts.json) {
|
|
615
644
|
let logPath: string | null = null;
|
|
616
645
|
try {
|
|
@@ -624,17 +653,23 @@ export async function runChatTurnCli(opts: {
|
|
|
624
653
|
model: result.model ?? null,
|
|
625
654
|
reply: finalMessage,
|
|
626
655
|
transcript: replyChunks.join(''),
|
|
627
|
-
finalReply: lastSegment,
|
|
656
|
+
finalReply: sawToolCall ? finalMessage : lastSegment,
|
|
657
|
+
incomplete,
|
|
628
658
|
budget: sessionBudget(session.id),
|
|
629
659
|
durationMs: Date.now() - startedAt,
|
|
630
660
|
logPath,
|
|
631
661
|
ts: new Date().toISOString(),
|
|
632
662
|
};
|
|
633
663
|
await writeStdoutJson(JSON.stringify(out) + '\n');
|
|
664
|
+
if (incomplete) process.exitCode = 1;
|
|
634
665
|
return;
|
|
635
666
|
}
|
|
636
667
|
if (opts.enableTools) process.stdout.write(`${finalMessage}\n`);
|
|
637
668
|
else process.stdout.write('\n');
|
|
669
|
+
if (incomplete) {
|
|
670
|
+
console.error('Turn ended without a final assistant reply.');
|
|
671
|
+
process.exitCode = 1;
|
|
672
|
+
}
|
|
638
673
|
ui.info(`[session ${session.id.slice(0, 8)} ${result.provider}${result.model ? '/' + result.model : ''} ${sessionBudget(session.id)}]`);
|
|
639
674
|
}
|
|
640
675
|
|
|
@@ -655,7 +690,7 @@ export function buildCliAgentTools(
|
|
|
655
690
|
trustedWorkingDirectory?: string,
|
|
656
691
|
): {
|
|
657
692
|
specs: import('../llm.js').LLMToolSpec[];
|
|
658
|
-
dispatch: (name: string, args: Record<string, unknown
|
|
693
|
+
dispatch: (name: string, args: Record<string, unknown>, context?: { signal?: AbortSignal }) => Promise<unknown>;
|
|
659
694
|
workingDirectory: string;
|
|
660
695
|
} {
|
|
661
696
|
// An explicitly assigned child cwd is stable for its isolated lifetime. An
|
|
@@ -706,7 +741,7 @@ export function buildCliAgentTools(
|
|
|
706
741
|
// 게이트. [[project_skill_native_duplication_surface_gating]].
|
|
707
742
|
const shared = (require('../agent/shared-app-tools.js') as typeof import('../agent/shared-app-tools.js')).buildSharedAppTools(cfg);
|
|
708
743
|
for (const s of shared.specs) specs.push(s);
|
|
709
|
-
for (const name of shared.names) dispatchByName.set(name, async (args) => shared.dispatch(name, args));
|
|
744
|
+
for (const name of shared.names) dispatchByName.set(name, async (args, signal) => shared.dispatch(name, args, { surface: 'tui', signal }));
|
|
710
745
|
// Installed knowledge is queryable in CLI chat as well as the dashboard runtime.
|
|
711
746
|
// No installed packs => preserve the existing CLI tool list and avoid creating a KGS database.
|
|
712
747
|
const { kgsDefaultDbPath } = require('../knowledge/kgs/sqlite-store.js') as typeof import('../knowledge/kgs/sqlite-store.js');
|
|
@@ -751,10 +786,10 @@ export function buildCliAgentTools(
|
|
|
751
786
|
const dispatchSessionRuntimeTool = sr.dispatchSessionRuntimeTool;
|
|
752
787
|
const createPlanner = sr.createSearchPlannerState;
|
|
753
788
|
const plannerState = createPlanner({ maxAutoNarrowCandidates: 2 });
|
|
754
|
-
const dispatch = async (name: string, args: Record<string, unknown
|
|
789
|
+
const dispatch = async (name: string, args: Record<string, unknown>, context?: { signal?: AbortSignal }): Promise<unknown> => {
|
|
755
790
|
try {
|
|
756
791
|
const direct = dispatchByName.get(name);
|
|
757
|
-
if (direct) return await direct(args);
|
|
792
|
+
if (direct) return await direct(args, context?.signal);
|
|
758
793
|
// ⭐ BACKLOG L1b (2026-09-25) — ToolSearch 는 지연 도구가 있으면 «자동으로 광고»되는데 이 CLI 디스패처만
|
|
759
794
|
// 라우팅이 없어 `plugin tool unavailable in CLI: ToolSearch` 로 죽었다(daemon·monad-agent-turn 은 라우팅한다).
|
|
760
795
|
// ⇒ 같은 공용 라우터로 이 CLI 의 도구 풀에서 찾는다.
|
package/src/cli/intake-cli.ts
CHANGED
|
@@ -5,7 +5,7 @@ import type { Command } from 'commander';
|
|
|
5
5
|
import { getElanousConfigDir } from '../elanous-config-dir.js';
|
|
6
6
|
import { readNexusRuntime } from '../nexus/runtime.js';
|
|
7
7
|
import { resolveRoleLlm } from '../user-config.js';
|
|
8
|
-
import { runIntakeToTasks, type IntakeTaskInput, type IntakeTaskRequest, type IntakeToTasksResult } from '../intake-plane/intake-to-tasks.js';
|
|
8
|
+
import { approveChannelPublish, runIntakeToTasks, type IntakeTaskInput, type IntakeTaskRequest, type IntakeToTasksResult } from '../intake-plane/intake-to-tasks.js';
|
|
9
9
|
import { writeStdoutJson } from './stdout-json.js';
|
|
10
10
|
import { writeStdoutFully } from './stdout-flush.js';
|
|
11
11
|
import { runGitCommand } from '../git-fs/runner.js';
|
|
@@ -37,6 +37,8 @@ export interface IntakeCliDeps extends IntakeCandidatesCliDeps {
|
|
|
37
37
|
root?: string;
|
|
38
38
|
/** 텔레그램 «저장된 메시지» 연결 (기본 gramjsFetchSaved) — 시험은 가짜 fetch 를 넣는다. */
|
|
39
39
|
connectSaved?: () => Promise<{ fetch: FetchSavedMessages; close: () => Promise<void> }>;
|
|
40
|
+
/** 수집 연결 실패를 CLI 사용자에게 보고한다. */
|
|
41
|
+
error?: (message: string) => void;
|
|
40
42
|
}
|
|
41
43
|
|
|
42
44
|
/** `--limit` 원 문자열 → 0 이상의 정수. 숫자만(`/^\d+$/`) 받고 나머지('' · 공백 · 음수 · 소수)는 거부한다. */
|
|
@@ -535,6 +537,24 @@ export function registerIntakeCommands(program: Command, candidateDeps: IntakeCl
|
|
|
535
537
|
if (result.failed > 0) process.exitCode = 1;
|
|
536
538
|
});
|
|
537
539
|
|
|
540
|
+
intakeCmd
|
|
541
|
+
.command('approve-channel-post <id>')
|
|
542
|
+
.description('보호 범주의 채널 게시 초안을 사람 승인한다 (외부 게시 커넥터는 호출하지 않는다)')
|
|
543
|
+
.requiredOption('--by <approver>', '승인자: MK | 대표')
|
|
544
|
+
.option('--json', '구조화 출력')
|
|
545
|
+
.action(async (id: string, opts: { by: string; json?: boolean }) => {
|
|
546
|
+
const { effectiveInstanceRoot } = await import('../instance/resolve.js');
|
|
547
|
+
const approved = approveChannelPublish(candidateDeps.root ?? effectiveInstanceRoot(), id, opts.by);
|
|
548
|
+
if (!approved) {
|
|
549
|
+
console.error(`대기 중인 보호 초안을 찾지 못했거나 승인자(${opts.by})가 MK·대표가 아니다: ${id}`);
|
|
550
|
+
process.exitCode = 1;
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
const result = { id, status: approved.status, approvedBy: approved.approvedBy, category: approved.category };
|
|
554
|
+
if (opts.json) await writeStdoutFully(JSON.stringify(result) + '\n');
|
|
555
|
+
else console.log(`${id} → ${approved.status} · 승인자 ${approved.approvedBy} · 외부 게시 미실행`);
|
|
556
|
+
});
|
|
557
|
+
|
|
538
558
|
intakeCmd
|
|
539
559
|
.command('collect-telegram-saved')
|
|
540
560
|
.description('텔레그램 «저장된 메시지»를 읽기만 해 흡수 원장에 넣는다 (커서 이후만 · 호스트 전용 · 개인 메모는 user-private)')
|
|
@@ -546,6 +566,7 @@ export function registerIntakeCommands(program: Command, candidateDeps: IntakeCl
|
|
|
546
566
|
...(candidateDeps.root ? { root: candidateDeps.root } : {}),
|
|
547
567
|
...(candidateDeps.connectSaved ? { connect: candidateDeps.connectSaved } : {}),
|
|
548
568
|
...(candidateDeps.write ? { write: candidateDeps.write } : {}),
|
|
569
|
+
...(candidateDeps.error ? { error: candidateDeps.error } : {}),
|
|
549
570
|
});
|
|
550
571
|
});
|
|
551
572
|
|
package/src/cli/lesson-cli.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { Command } from 'commander';
|
|
|
2
2
|
import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
3
3
|
import { dirname, resolve } from 'node:path';
|
|
4
4
|
import { debug } from '../debug/log.js';
|
|
5
|
+
import { FrictionInputError, FrictionLedger, frictionActor, type FrictionRecordInput } from '../lessons/friction-ledger.js';
|
|
5
6
|
import { importLessons, scanLessonDocs } from '../lessons/lesson-import.js';
|
|
6
7
|
import { LessonInputError, LessonLedger, type LessonLedgerOptions, type LessonRow, type LessonDetail } from '../lessons/lesson-ledger.js';
|
|
7
8
|
|
|
@@ -47,6 +48,18 @@ function validAuthoringLessonClass(value: string): boolean {
|
|
|
47
48
|
export function registerLessonCommands(program: Command, options: LessonLedgerOptions = {}, out: Pick<Console, 'log'> = console): void {
|
|
48
49
|
const root = program.command('lesson').description('사고 · 원인 · 처방 · 재발 교훈 원장');
|
|
49
50
|
const ledger = () => new LessonLedger(options);
|
|
51
|
+
// 손 걸음 원장은 그림자 기록이다: 비밀 꼴 note 는 빼고 남기며, 어떤 경우에도 lesson 명령을 실패시키지 않는다.
|
|
52
|
+
const recordFriction = (input: FrictionRecordInput): void => {
|
|
53
|
+
const friction = new FrictionLedger(options);
|
|
54
|
+
const attempts = input.note ? [input, { ...input, note: '' }] : [input];
|
|
55
|
+
for (const attempt of attempts) {
|
|
56
|
+
try { friction.record(attempt); return; }
|
|
57
|
+
catch (error) {
|
|
58
|
+
debug.log('lessons.friction', 'skipped', { kind: attempt.kind, signature: attempt.signature,
|
|
59
|
+
reason: error instanceof FrictionInputError ? error.message : String(error) });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
50
63
|
const emit = (value: unknown, json: boolean | undefined, text: string) => out.log(json ? JSON.stringify(value) : text);
|
|
51
64
|
root.command('import').description('INCIDENT·FINDING 문서 교훈 미리 보기 (기본값); --apply 로 적재')
|
|
52
65
|
.option('--apply', '원장에 적재').option('--json', 'JSON 출력').option('--by <name>', '기록자 (기본 AI_AGENT)')
|
|
@@ -128,11 +141,12 @@ export function registerLessonCommands(program: Command, options: LessonLedgerOp
|
|
|
128
141
|
return;
|
|
129
142
|
}
|
|
130
143
|
const required = ['incident', 'cause', 'remedy', 'owner', 'source'] as const;
|
|
144
|
+
const lessonId = id ?? '';
|
|
131
145
|
const missing: string[] = required.filter((key) => typeof o[key] !== 'string' || !(o[key] as string).trim());
|
|
132
|
-
if (!
|
|
146
|
+
if (!lessonId.trim()) missing.unshift('id');
|
|
133
147
|
if (missing.length) throw new LessonInputError(`required: ${missing.map(key => key === 'id' ? 'id' : `--${key}`).join(', ')}`);
|
|
134
148
|
const by = actor(typeof o.by === 'string' ? o.by : undefined);
|
|
135
|
-
const row = ledger().add({ id, incident: o.incident as string, cause: o.cause as string, remedy: o.remedy as string,
|
|
149
|
+
const row = ledger().add({ id: lessonId, incident: o.incident as string, cause: o.cause as string, remedy: o.remedy as string,
|
|
136
150
|
owner: o.owner as string, source: o.source as string, by,
|
|
137
151
|
...(o.enforcedBy !== undefined ? { enforcedBy: o.enforcedBy as string } : {}),
|
|
138
152
|
...(o.disproof !== undefined ? { disproof: o.disproof as string } : {}) });
|
|
@@ -140,7 +154,9 @@ export function registerLessonCommands(program: Command, options: LessonLedgerOp
|
|
|
140
154
|
}));
|
|
141
155
|
root.command('recur <id>').requiredOption('--source <path>').option('--note <text>').option('--by <name>')
|
|
142
156
|
.action(handle('recur', (id: string, o: { source: string; note?: string; by?: string }) => {
|
|
143
|
-
const
|
|
157
|
+
const by = actor(o.by);
|
|
158
|
+
const row = ledger().recur(id, { source: o.source, note: o.note ?? '', by });
|
|
159
|
+
recordFriction({ actor: frictionActor(by), kind: 'hand-step', signature: row.incident ?? `lesson ${row.id}`, note: o.note ?? '', ref: o.source });
|
|
144
160
|
emit(row, false, format(row));
|
|
145
161
|
}));
|
|
146
162
|
root.command('enforce <id>').requiredOption('--enforced-by <paths>').option('--by <name>')
|
|
@@ -201,6 +201,7 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
201
201
|
"chain-step-failed",
|
|
202
202
|
"change",
|
|
203
203
|
"chat-error",
|
|
204
|
+
"chat-history-compacted",
|
|
204
205
|
"chat-input-consumed",
|
|
205
206
|
"chat-main",
|
|
206
207
|
"chat-main.await",
|
|
@@ -1075,6 +1076,7 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
1075
1076
|
"read-error",
|
|
1076
1077
|
"read.path-resolved",
|
|
1077
1078
|
"readiness-threw",
|
|
1079
|
+
"readonly-tool-repeat-suppressed",
|
|
1078
1080
|
"ready",
|
|
1079
1081
|
"ready.timeout",
|
|
1080
1082
|
"rebuild",
|
|
@@ -1140,6 +1142,9 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
1140
1142
|
"reply.tts.ok",
|
|
1141
1143
|
"request",
|
|
1142
1144
|
"request-received",
|
|
1145
|
+
"request-size",
|
|
1146
|
+
"request-size-compact",
|
|
1147
|
+
"request-size-compact-error",
|
|
1143
1148
|
"request-watch-fail",
|
|
1144
1149
|
"request.error",
|
|
1145
1150
|
"request.out",
|
|
@@ -1362,6 +1367,7 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
|
|
|
1362
1367
|
"status",
|
|
1363
1368
|
"status-ledger",
|
|
1364
1369
|
"status-port-resolved",
|
|
1370
|
+
"status-question-interim-reprompt",
|
|
1365
1371
|
"stdin-backpressure",
|
|
1366
1372
|
"stdout",
|
|
1367
1373
|
"step",
|
package/src/cli/mcp-login.ts
CHANGED
|
@@ -11,6 +11,8 @@ import {
|
|
|
11
11
|
prepareMcpOAuthAuthorization,
|
|
12
12
|
authorizeMcpDevice,
|
|
13
13
|
type McpOAuthFetch,
|
|
14
|
+
type AuthorizationServerMetadata,
|
|
15
|
+
type ProtectedResourceMetadata,
|
|
14
16
|
} from '../mcp/mcp-oauth.js';
|
|
15
17
|
import { parseWwwAuthenticate } from '../mcp/client.js';
|
|
16
18
|
import { debug } from '../debug/log.js';
|
|
@@ -129,6 +131,7 @@ export async function runMcpLogin(opts: McpLoginOpts): Promise<McpLoginResult> {
|
|
|
129
131
|
early: callbackListener,
|
|
130
132
|
serverId: opts.serverId,
|
|
131
133
|
resourceMetadataUrl: challenge.resourceMetadata,
|
|
134
|
+
discovered,
|
|
132
135
|
...(challenge.scope ? { scope: challenge.scope } : {}),
|
|
133
136
|
resourceUrl: spec.url,
|
|
134
137
|
...oauthOpts,
|
|
@@ -245,6 +248,7 @@ function loginFailureStage(error: unknown): 'authorization' | 'token' | 'login'
|
|
|
245
248
|
async function openLoginListener(opts: {
|
|
246
249
|
serverId: string;
|
|
247
250
|
resourceMetadataUrl: string;
|
|
251
|
+
discovered: { resource: ProtectedResourceMetadata; metadata: AuthorizationServerMetadata };
|
|
248
252
|
scope?: string;
|
|
249
253
|
resourceUrl: string;
|
|
250
254
|
fetch?: McpOAuthFetch;
|
|
@@ -253,13 +257,14 @@ async function openLoginListener(opts: {
|
|
|
253
257
|
onListener?: (server: Server) => void;
|
|
254
258
|
early: Awaited<ReturnType<typeof listenForCallback>>;
|
|
255
259
|
}): Promise<{ listener: Awaited<ReturnType<typeof listenForCallback>>; authorization: Awaited<ReturnType<typeof prepareMcpOAuthAuthorization>> }> {
|
|
256
|
-
const prior =
|
|
260
|
+
const prior = loadStoredRegistration(opts.discovered.metadata.issuer, opts);
|
|
257
261
|
const preferred = loopbackRedirectPort(prior?.redirectUri);
|
|
258
262
|
if (preferred === null && (prior === null || prior.redirectUri)) {
|
|
259
263
|
const listener = opts.early;
|
|
260
264
|
debug.log('mcp.login', 'callback-port', { serverId: opts.serverId, source: 'fresh' });
|
|
261
265
|
const authorization = await prepareMcpOAuthAuthorization({
|
|
262
266
|
resourceMetadataUrl: opts.resourceMetadataUrl,
|
|
267
|
+
discovered: opts.discovered,
|
|
263
268
|
scope: opts.scope,
|
|
264
269
|
redirectUri: listener.redirectUri,
|
|
265
270
|
resourceUrl: opts.resourceUrl,
|
|
@@ -276,6 +281,7 @@ async function openLoginListener(opts: {
|
|
|
276
281
|
debug.log('mcp.login', 'callback-port', { serverId: opts.serverId, source: 'registered' });
|
|
277
282
|
const authorization = await prepareMcpOAuthAuthorization({
|
|
278
283
|
resourceMetadataUrl: opts.resourceMetadataUrl,
|
|
284
|
+
discovered: opts.discovered,
|
|
279
285
|
scope: opts.scope,
|
|
280
286
|
redirectUri: listener.redirectUri,
|
|
281
287
|
resourceUrl: opts.resourceUrl,
|
|
@@ -296,6 +302,7 @@ async function openLoginListener(opts: {
|
|
|
296
302
|
});
|
|
297
303
|
const authorization = await prepareMcpOAuthAuthorization({
|
|
298
304
|
resourceMetadataUrl: opts.resourceMetadataUrl,
|
|
305
|
+
discovered: opts.discovered,
|
|
299
306
|
scope: opts.scope,
|
|
300
307
|
redirectUri: listener.redirectUri,
|
|
301
308
|
resourceUrl: opts.resourceUrl,
|
|
@@ -306,23 +313,6 @@ async function openLoginListener(opts: {
|
|
|
306
313
|
return { listener, authorization };
|
|
307
314
|
}
|
|
308
315
|
|
|
309
|
-
async function priorRegistration(opts: {
|
|
310
|
-
resourceMetadataUrl: string;
|
|
311
|
-
resourceUrl: string;
|
|
312
|
-
fetch?: McpOAuthFetch;
|
|
313
|
-
storePath?: string;
|
|
314
|
-
}): Promise<ReturnType<typeof loadStoredRegistration>> {
|
|
315
|
-
try {
|
|
316
|
-
const discovered = await discoverMcpOAuth(opts.resourceMetadataUrl, {
|
|
317
|
-
resourceUrl: opts.resourceUrl,
|
|
318
|
-
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
319
|
-
});
|
|
320
|
-
return loadStoredRegistration(discovered.metadata.issuer, opts);
|
|
321
|
-
} catch {
|
|
322
|
-
return null;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
316
|
function isAddressInUse(error: unknown): boolean {
|
|
327
317
|
return Boolean(error && typeof error === 'object' && 'code' in error && (error as { code: unknown }).code === 'EADDRINUSE');
|
|
328
318
|
}
|
package/src/cli/msg-cli.ts
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
|
+
import { mkdirSync } from 'node:fs';
|
|
3
|
+
import { dirname } from 'node:path';
|
|
2
4
|
import { ensureAuthToken } from '../auth/acp-token.js';
|
|
3
5
|
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
4
6
|
import { canonicalSeatId, openMsgStore, openMsgStoreReadOnly, type Message, type MsgStore } from '../msg/msg-store.js';
|
|
5
7
|
import { clearPostOffice, ensurePostOffice, writePostOffice } from '../msg/msg-post-office.js';
|
|
8
|
+
import { acquireLockSync } from '../storage/file-lock.js';
|
|
9
|
+
import { GitHubMsgMirrorTransport } from '../msg/msg-mirror-github.js';
|
|
10
|
+
import { configuredMirrorTarget, runMsgMirrorTick, type MirrorTarget, type MsgMirrorStateStore, type MsgMirrorTransport } from '../msg/msg-mirror-runner.js';
|
|
11
|
+
import { JsonMsgMirrorStateStore } from '../msg/msg-mirror-state.js';
|
|
6
12
|
import { startMsgSseServer } from '../msg/msg-sse-server.js';
|
|
13
|
+
import { debug } from '../debug/log.js';
|
|
7
14
|
import type { AgentReplyAddress, AgentReplyInput, AgentReplyResult } from '../loops/agent-reply.js';
|
|
8
15
|
import { messageRouteFor, noReplyBodyNotice, unsupportedLoopAddressNotice } from '../loops/msg-address.js';
|
|
9
16
|
import { resolveWake, wakeRecipient, type WakeDeps, type WakeOutcome } from '../loops/msg-wake.js';
|
|
10
|
-
import type
|
|
17
|
+
import { getUserConfig, type RoleLlmSpec } from '../user-config.js';
|
|
11
18
|
|
|
12
19
|
/** The loop rows whose reply body is an LLM agent: `--agent-reply` picks one of these. */
|
|
13
20
|
const AGENT_REPLY_ROLES = { COORDINATOR: 'coordinator', GUARDIAN: 'guardian' } as const;
|
|
@@ -22,6 +29,9 @@ export interface MsgCliDeps {
|
|
|
22
29
|
signal?: AbortSignal;
|
|
23
30
|
fetch?: typeof fetch;
|
|
24
31
|
authToken?: () => string;
|
|
32
|
+
mirrorTarget?: MirrorTarget | null;
|
|
33
|
+
mirrorState?: MsgMirrorStateStore;
|
|
34
|
+
mirrorTransport?: MsgMirrorTransport;
|
|
25
35
|
/** Wake-path resolution for `msg route` (tests inject; default reads pty manifest ⊕ seat folders). */
|
|
26
36
|
wakeDeps?: WakeDeps;
|
|
27
37
|
/** Attach the logs.db sink so `msg.wake` reaches `elanous logs` (a short CLI otherwise writes only the file trail). */
|
|
@@ -198,6 +208,52 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
198
208
|
if (address !== to) throw new Error(`--agent-reply ${address} requires --to ${address}`);
|
|
199
209
|
};
|
|
200
210
|
|
|
211
|
+
msg.command('mirror').description('Mirror selected seat messages to the configured GitHub issue')
|
|
212
|
+
.option('--dry-run', 'read the configured channel and ledger without writing')
|
|
213
|
+
.option('--watch', 'repeat until interrupted')
|
|
214
|
+
.option('--interval <seconds>', 'poll interval in watch mode (default 60)', '60')
|
|
215
|
+
.option('--json')
|
|
216
|
+
.action((opts: CommonOptions & { dryRun?: boolean; watch?: boolean; interval?: string }) => run(async () => {
|
|
217
|
+
const intervalSeconds = integer(opts.interval, '--interval', 60, 1, 3600);
|
|
218
|
+
const state = deps.mirrorState ?? new JsonMsgMirrorStateStore();
|
|
219
|
+
const configTarget = deps.mirrorTarget === undefined
|
|
220
|
+
? configuredMirrorTarget(getUserConfig().raw.msgMirror) : deps.mirrorTarget ?? undefined;
|
|
221
|
+
const existingState = state.read();
|
|
222
|
+
if (!configTarget && !existingState) {
|
|
223
|
+
const result = { status: 'disabled', reason: 'msgMirror.target is not configured', target: null };
|
|
224
|
+
debug.log('msg.mirror', 'disabled', result);
|
|
225
|
+
out.log(opts.json ? JSON.stringify(result) : 'msg mirror 비활성: msgMirror.target 미설정');
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const store = openRead();
|
|
229
|
+
const transport = deps.mirrorTransport ?? new GitHubMsgMirrorTransport();
|
|
230
|
+
const signal = deps.signal;
|
|
231
|
+
try {
|
|
232
|
+
do {
|
|
233
|
+
let release = () => {};
|
|
234
|
+
if (state instanceof JsonMsgMirrorStateStore) {
|
|
235
|
+
mkdirSync(dirname(state.path), { recursive: true, mode: 0o700 });
|
|
236
|
+
release = acquireLockSync(`${state.path}.lock`, { breakDeadHolder: true });
|
|
237
|
+
}
|
|
238
|
+
let result: Awaited<ReturnType<typeof runMsgMirrorTick>>;
|
|
239
|
+
try {
|
|
240
|
+
result = await runMsgMirrorTick({
|
|
241
|
+
...(configTarget ? { configuredTarget: configTarget } : {}),
|
|
242
|
+
...(opts.dryRun ? { dryRun: true } : {}),
|
|
243
|
+
source: { listAfter: (after, limit) => store.listAfter(after, limit),
|
|
244
|
+
listWindow: (start, end) => store.listCreatedBetween(start, end), latestId: () => store.latestId() },
|
|
245
|
+
state, transport,
|
|
246
|
+
});
|
|
247
|
+
} finally { release(); }
|
|
248
|
+
debug.log('msg.mirror', 'tick', result);
|
|
249
|
+
out.log(opts.json ? JSON.stringify(result)
|
|
250
|
+
: `msg mirror ${result.status} · scanned ${result.scanned} · posted ${result.posted} · rotated ${result.rotated} · summaries ${result.summaries}`);
|
|
251
|
+
if (!opts.watch || signal?.aborted) break;
|
|
252
|
+
await sleep(intervalSeconds * 1000);
|
|
253
|
+
} while (!signal?.aborted);
|
|
254
|
+
} finally { store.close(); }
|
|
255
|
+
})());
|
|
256
|
+
|
|
201
257
|
/**
|
|
202
258
|
* Human-free live conversation: the selected address's LLM body answers the message that was just saved.
|
|
203
259
|
* The durable ledger stays authoritative — `replyWithAgent` owns the one-reply-per-request transaction and
|
package/src/cli/pod-cli.ts
CHANGED
|
@@ -14,7 +14,7 @@ import { getUserConfig } from '../user-config.js';
|
|
|
14
14
|
import { listCodexAccountsInStore } from '../oauth/codex-account-store.js';
|
|
15
15
|
import { parsePodPool, resolvePodPoolSpec, podPoolHostLease, type PoolKubectl } from '../task-orchestrator/surfaces/pod-pool.js';
|
|
16
16
|
import { leaseKubectl, measurePoolLease, probePoolDns, probePoolGitHub, recommendConcurrency, type PoolLeaseMeasure, type PoolDnsProbe, type ExternalGitHubProbe } from '../task-orchestrator/surfaces/pod-lease.js';
|
|
17
|
-
import { POD_COMMAND_DEADLINE_SECONDS, runPodCommand, type PodCommandResult, type RunPodCommandOptions } from '../task-orchestrator/surfaces/pod-command-job.js';
|
|
17
|
+
import { POD_COMMAND_DEADLINE_SECONDS, parseCpuRightsizeRequest, runPodCommand, type PodCommandResult, type PodCpuRightsizeRequest, type RunPodCommandOptions } from '../task-orchestrator/surfaces/pod-command-job.js';
|
|
18
18
|
import { hostLeaseCounts, leaseHasPendingPod } from '../pod-lease/host-lease.js';
|
|
19
19
|
|
|
20
20
|
export interface PodCliIo {
|
|
@@ -220,7 +220,8 @@ export function registerPodCommands(program: Command, deps: PodCliDeps = {}): vo
|
|
|
220
220
|
.allowUnknownOption(true)
|
|
221
221
|
.allowExcessArguments(true)
|
|
222
222
|
.option('--lite', '네트워크 스킬(omni-crawl·omni-digest)만 쓰는 명령 — 작은 이미지 ⊕ 2Gi 한도(POD7 · clone 불가)')
|
|
223
|
-
.
|
|
223
|
+
.option('--cpu-rightsize <json>', 'POD-CPU-REQUEST-RIGHTSIZE-2-FU: 공존 재측정 요청(JSON 파일 경로 또는 인라인 JSON) — { condition?, samples[], priorLaunches[] }. 선행 조건·측정이 모자라면 발사하지 않는다')
|
|
224
|
+
.action(async (opts: { pool?: string; skill?: string; llm?: string; clone?: boolean; deadline?: string; lite?: boolean; cpuRightsize?: string }, command: Command) => {
|
|
224
225
|
const argv = process.argv.slice(2);
|
|
225
226
|
const sep = argv.indexOf('--');
|
|
226
227
|
const fromArgv = sep >= 0 ? argv.slice(sep + 1) : [];
|
|
@@ -244,6 +245,19 @@ export function registerPodCommands(program: Command, deps: PodCliDeps = {}): vo
|
|
|
244
245
|
return;
|
|
245
246
|
}
|
|
246
247
|
}
|
|
248
|
+
// POD-CPU-REQUEST-RIGHTSIZE-2-FU — the OP-facing measurement launch reads its request from JSON (file path or inline).
|
|
249
|
+
let cpuRightsize: PodCpuRightsizeRequest | undefined;
|
|
250
|
+
if (opts.cpuRightsize !== undefined) {
|
|
251
|
+
try {
|
|
252
|
+
const source = opts.cpuRightsize.trim();
|
|
253
|
+
const text = source.startsWith('{') ? source : readFileSync(source, 'utf8');
|
|
254
|
+
cpuRightsize = parseCpuRightsizeRequest(JSON.parse(text), '--cpu-rightsize');
|
|
255
|
+
} catch (err) {
|
|
256
|
+
io.error(`pod run: --cpu-rightsize — ${err instanceof Error ? err.message : String(err)}`);
|
|
257
|
+
io.exit(2);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
247
261
|
const skills = (opts.skill ?? '').split(',').map((s) => s.trim()).filter(Boolean);
|
|
248
262
|
const cloneWarning = podCloneWithoutInstallWarning(commandArgs, opts.clone);
|
|
249
263
|
if (cloneWarning !== null) {
|
|
@@ -268,6 +282,7 @@ export function registerPodCommands(program: Command, deps: PodCliDeps = {}): vo
|
|
|
268
282
|
...(opts.llm === 'grok' ? { llm: 'grok' as const } : {}),
|
|
269
283
|
...(opts.clone ? { clone: true } : {}),
|
|
270
284
|
...(opts.lite ? { lite: true } : {}),
|
|
285
|
+
...(cpuRightsize ? { cpuRightsize } : {}),
|
|
271
286
|
...(deadlineSeconds !== undefined ? { deadlineSeconds } : {}),
|
|
272
287
|
});
|
|
273
288
|
if (result.image) io.error(`[pod] image ${result.image} · job ${result.job}`);
|