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/tui/sidetab/list.ts
CHANGED
|
@@ -1,139 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
readonly sessionId?: string;
|
|
15
|
-
readonly ptyId?: string;
|
|
16
|
-
readonly nestDepth?: number;
|
|
17
|
-
readonly ownerPid?: number;
|
|
18
|
-
readonly currentProcess?: boolean;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface SidetabState {
|
|
22
|
-
readonly open: boolean;
|
|
23
|
-
readonly selected: number;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface SidetabScope {
|
|
27
|
-
readonly all?: boolean;
|
|
28
|
-
readonly currentPtyId?: string;
|
|
29
|
-
readonly currentPid?: number;
|
|
30
|
-
/** Current classic chat session; classic shell rows carry it in their purpose tag. */
|
|
31
|
-
readonly currentSessionId?: string;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export type SidetabKey = 'toggle' | 'up' | 'down' | 'other';
|
|
35
|
-
|
|
36
|
-
export function createSidetabState(): SidetabState {
|
|
37
|
-
return { open: false, selected: 0 };
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function sidetabWidthForTerminal(columns: number): number {
|
|
41
|
-
return columns < 34 ? 0 : Math.min(28, Math.max(12, Math.floor(columns / 3)));
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function sidetabRowIndexAtTerminalRow(rowCount: number, selected: number, panelHeight: number, terminalRow: number): number | null {
|
|
45
|
-
const rowCapacity = Math.max(0, Math.floor(panelHeight) - 3);
|
|
46
|
-
const visibleCount = Math.min(rowCount, rowCapacity);
|
|
47
|
-
const offset = terminalRow - 3;
|
|
48
|
-
if (visibleCount === 0 || offset < 0 || offset >= visibleCount) return null;
|
|
49
|
-
const start = rowCount <= visibleCount
|
|
50
|
-
? 0
|
|
51
|
-
: Math.max(0, Math.min(selected - visibleCount + 1, rowCount - visibleCount));
|
|
52
|
-
return start + offset;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export function applySidetabKey(state: SidetabState, key: SidetabKey, rowCount: number): SidetabState {
|
|
56
|
-
if (key === 'toggle') return { ...state, open: !state.open, selected: Math.min(state.selected, Math.max(0, rowCount - 1)) };
|
|
57
|
-
if (!state.open || rowCount === 0 || (key !== 'up' && key !== 'down')) return state;
|
|
58
|
-
const delta = key === 'up' ? -1 : 1;
|
|
59
|
-
return { ...state, selected: (state.selected + delta + rowCount) % rowCount };
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export function sidetabRowsFromManifest(
|
|
63
|
-
rows: readonly PtyManifestRow[],
|
|
64
|
-
instance: string,
|
|
65
|
-
runState: (row: PtyManifestRow) => { turn: string; stale: boolean | null } = describePtyRunState,
|
|
66
|
-
scope?: SidetabScope,
|
|
67
|
-
): SidetabRow[] {
|
|
68
|
-
const currentPid = scope?.currentPid ?? process.pid;
|
|
69
|
-
const currentSessionId = scope?.currentSessionId;
|
|
70
|
-
const eligible = rows.filter((row) => row.instance === instance && (
|
|
71
|
-
(row.kind === 'tui' && Boolean(row.sessionId))
|
|
72
|
-
|| Boolean(row.parentPtyId)
|
|
73
|
-
|| row.purpose?.startsWith('next-tui-sidetab:')
|
|
74
|
-
|| (row.kind === 'shell'
|
|
75
|
-
&& currentSessionId !== undefined
|
|
76
|
-
&& row.parentPid === currentPid
|
|
77
|
-
&& row.purpose?.includes(`:session:${currentSessionId}:terminal:`))
|
|
78
|
-
));
|
|
79
|
-
let scoped = eligible;
|
|
80
|
-
if (scope) {
|
|
81
|
-
const parent = eligible.find((row) => row.kind === 'tui'
|
|
82
|
-
&& (row.id === (scope.currentPtyId ?? `tui:${currentPid}`) || row.ownerPid === currentPid));
|
|
83
|
-
if (!scope.all) {
|
|
84
|
-
const includedIds = new Set<string>(parent ? [parent.id] : []);
|
|
85
|
-
const includedPids = new Set<number>(parent ? [parent.ownerPid, parent.ptyPid, currentPid] : [currentPid]);
|
|
86
|
-
let changed = true;
|
|
87
|
-
while (changed) {
|
|
88
|
-
changed = false;
|
|
89
|
-
for (const row of eligible) {
|
|
90
|
-
if (row.kind === 'tui' || includedIds.has(row.id)) continue;
|
|
91
|
-
if ((row.parentPtyId && includedIds.has(row.parentPtyId)) || (row.parentPid > 0 && includedPids.has(row.parentPid))) {
|
|
92
|
-
includedIds.add(row.id);
|
|
93
|
-
if (row.ownerPid > 0) includedPids.add(row.ownerPid);
|
|
94
|
-
if (row.ptyPid > 0) includedPids.add(row.ptyPid);
|
|
95
|
-
changed = true;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
scoped = eligible.filter((row) => includedIds.has(row.id));
|
|
100
|
-
}
|
|
101
|
-
if (!scope.all) scoped = scoped.filter((row) => row.alive);
|
|
102
|
-
}
|
|
103
|
-
return scoped
|
|
104
|
-
.map((row) => {
|
|
105
|
-
const badge: SidetabBadge = !row.alive
|
|
106
|
-
? 'exited'
|
|
107
|
-
: (() => {
|
|
108
|
-
const state = runState(row);
|
|
109
|
-
return state.stale === true ? 'stale' : state.turn === 'busy' ? 'busy' : state.turn === 'idle' ? 'idle' : 'unknown';
|
|
110
|
-
})();
|
|
111
|
-
const sessionId = row.purpose?.startsWith('next-tui-sidetab:') ? row.purpose.slice('next-tui-sidetab:'.length) : undefined;
|
|
112
|
-
const classicTerminalSessionId = currentSessionId !== undefined && row.kind === 'shell'
|
|
113
|
-
? row.purpose?.split(`:session:${currentSessionId}:terminal:`)[1]
|
|
114
|
-
: undefined;
|
|
115
|
-
return {
|
|
116
|
-
id: row.id,
|
|
117
|
-
label: `${' '.repeat(Math.min(2, row.nestDepth ?? 0))}${row.nickname || row.purpose || row.cmd || row.kind}`,
|
|
118
|
-
...(row.sessionId ? { sessionId: row.sessionId } : {}),
|
|
119
|
-
kind: row.kind,
|
|
120
|
-
badge,
|
|
121
|
-
ptyId: row.id,
|
|
122
|
-
nestDepth: row.nestDepth,
|
|
123
|
-
ownerPid: row.ownerPid,
|
|
124
|
-
currentProcess: row.kind === 'tui' && row.ownerPid === process.pid,
|
|
125
|
-
...(sessionId ? { sessionId } : classicTerminalSessionId ? { sessionId: classicTerminalSessionId } : {}),
|
|
126
|
-
};
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
|
|
1
|
+
/** Compatibility entry point for existing Next TUI callers. Shared behavior lives in sidetab-core. */
|
|
2
|
+
export * from '../../sidetab-core/model.js';
|
|
3
|
+
import {
|
|
4
|
+
formatSidetabLines as formatCoreSidetabLines,
|
|
5
|
+
loadSidetabRows as loadCoreSidetabRows,
|
|
6
|
+
type SidetabRow,
|
|
7
|
+
} from '../../sidetab-core/model.js';
|
|
8
|
+
import { listPtyManifestRows } from '../../pty-shell/pty-manifest.js';
|
|
9
|
+
import { formatSidetabPeekLines } from './peek.js';
|
|
10
|
+
|
|
11
|
+
type PreviewSidetabRow = SidetabRow & { readonly previewSource?: string };
|
|
12
|
+
|
|
13
|
+
/** Attach the latest manifest snapshot without changing the shared row contract. */
|
|
130
14
|
export function loadSidetabRows(all = false, currentSessionId?: string): SidetabRow[] {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
...
|
|
134
|
-
|
|
15
|
+
const snapshots = new Map<string, string>(listPtyManifestRows().map((row) => [row.id, row.snapshot || row.frame] as const));
|
|
16
|
+
return loadCoreSidetabRows(all, currentSessionId).map((row) => ({
|
|
17
|
+
...row,
|
|
18
|
+
previewSource: snapshots.get(row.id) ?? '',
|
|
19
|
+
}));
|
|
135
20
|
}
|
|
136
21
|
|
|
22
|
+
/** Render the core list and reserve a bounded tail preview for the selected PTY row. */
|
|
137
23
|
export function formatSidetabLines(
|
|
138
24
|
rows: readonly SidetabRow[],
|
|
139
25
|
selected: number,
|
|
@@ -141,36 +27,21 @@ export function formatSidetabLines(
|
|
|
141
27
|
height = Number.POSITIVE_INFINITY,
|
|
142
28
|
mode: 'list' | 'new' = 'list',
|
|
143
29
|
): string[] {
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
: [fit(' 세션 · PTY'), fit(' ↑↓ 전환 · 클릭 선택')];
|
|
162
|
-
const rowCapacity = Math.max(0, Math.floor(height) - lines.length - (mode === 'list' ? 1 : 0));
|
|
163
|
-
const visibleCount = Math.min(rows.length || 1, rowCapacity);
|
|
164
|
-
const start = rows.length <= visibleCount
|
|
165
|
-
? 0
|
|
166
|
-
: Math.max(0, Math.min(selected - visibleCount + 1, rows.length - visibleCount));
|
|
167
|
-
if (mode === 'list' && rows.length === 0 && visibleCount > 0) lines.push(fit(' 항목 없음'));
|
|
168
|
-
for (let offset = 0; offset < visibleCount && rows.length > 0; offset++) {
|
|
169
|
-
const index = start + offset;
|
|
170
|
-
const row = rows[index]!;
|
|
171
|
-
const marker = index === selected ? '›' : ' ';
|
|
172
|
-
lines.push(fit(` ${marker} ${row.badge} ${row.label}`));
|
|
173
|
-
}
|
|
174
|
-
if (mode === 'list' && lines.length < Math.floor(height)) lines.push(fit(' + new · /side new'));
|
|
175
|
-
return lines;
|
|
30
|
+
const selectedRow = rows[selected] as PreviewSidetabRow | undefined;
|
|
31
|
+
const peekLines = mode === 'list' && selectedRow
|
|
32
|
+
? formatSidetabPeekLines(selectedRow.previewSource ?? '', width)
|
|
33
|
+
: [];
|
|
34
|
+
if (peekLines.length === 0) return formatCoreSidetabLines(rows, selected, width, height, mode);
|
|
35
|
+
|
|
36
|
+
const reservedRows = peekLines.length + 1;
|
|
37
|
+
const coreLines = formatCoreSidetabLines(rows, selected, width, Math.max(0, height - reservedRows), mode);
|
|
38
|
+
// The core formatter reserves the leading ` › ` token for selection; a
|
|
39
|
+
// session label may itself contain `›`, so searching anywhere in the line
|
|
40
|
+
// can place the preview under the wrong row.
|
|
41
|
+
const selectedLine = coreLines.findIndex((line) => line.startsWith(' › '));
|
|
42
|
+
if (selectedLine < 0) return coreLines;
|
|
43
|
+
|
|
44
|
+
const lines = [...coreLines];
|
|
45
|
+
lines.splice(selectedLine + 1, 0, ' '.repeat(width), ...peekLines);
|
|
46
|
+
return Number.isFinite(height) ? lines.slice(0, Math.max(0, Math.floor(height))) : lines;
|
|
176
47
|
}
|
|
@@ -1,136 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export const NEXT_SIDETAB_TOOL_NAME = 'NextSidetab';
|
|
5
|
-
const CALL = 'elanous.sidetab.call';
|
|
6
|
-
const RESULT = 'elanous.sidetab.result';
|
|
7
|
-
|
|
8
|
-
export type NextSidetabAction = 'list' | 'switch' | 'attach' | 'detach' | 'new' | 'kill';
|
|
9
|
-
export interface NextSidetabRequest {
|
|
10
|
-
action: NextSidetabAction;
|
|
11
|
-
target?: string;
|
|
12
|
-
character?: 'shell' | 'elanous';
|
|
13
|
-
confirm?: boolean;
|
|
14
|
-
}
|
|
15
|
-
export interface NextSidetabCall { type: typeof CALL; callId: string; request: NextSidetabRequest }
|
|
16
|
-
export interface NextSidetabResult { type: typeof RESULT; callId: string; result: unknown }
|
|
17
|
-
export type NextSidetabHandler = (request: NextSidetabRequest) => Promise<unknown>;
|
|
18
|
-
export interface NextSidetabHostDeps {
|
|
19
|
-
rows(): readonly SidetabRow[] | Promise<readonly SidetabRow[]>;
|
|
20
|
-
selected(): number;
|
|
21
|
-
switchSession(row: SidetabRow): Promise<unknown>;
|
|
22
|
-
attach(row: SidetabRow): Promise<unknown>;
|
|
23
|
-
detach(): unknown;
|
|
24
|
-
spawn(character: 'shell' | 'elanous'): unknown;
|
|
25
|
-
kill(row: SidetabRow): unknown;
|
|
26
|
-
}
|
|
27
|
-
export interface NextSidetabIpcProcess {
|
|
28
|
-
send?: (message: unknown) => boolean | void;
|
|
29
|
-
on(event: 'message', listener: (message: unknown) => void): unknown;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export const nextSidetabToolSpec: LLMToolSpec = {
|
|
33
|
-
name: NEXT_SIDETAB_TOOL_NAME,
|
|
34
|
-
description: 'Control the Next TUI side tab: list/view sessions and PTYs, switch sessions, attach or detach, start a local shell or elanous PTY, or kill a PTY. Ask the user to confirm before calling kill with confirm=true. Starting coding agents is not supported.',
|
|
35
|
-
parameters: {
|
|
36
|
-
type: 'object',
|
|
37
|
-
properties: {
|
|
38
|
-
action: { type: 'string', enum: ['list', 'switch', 'attach', 'detach', 'new', 'kill'] },
|
|
39
|
-
target: { type: 'string', description: 'Optional exact or partial row id/label; required for targeted actions.' },
|
|
40
|
-
character: { type: 'string', enum: ['shell', 'elanous'], description: 'Only used with action=new.' },
|
|
41
|
-
confirm: { type: 'boolean', description: 'Must be true only after the user explicitly confirmed killing the selected PTY.' },
|
|
42
|
-
},
|
|
43
|
-
required: ['action'],
|
|
44
|
-
additionalProperties: false,
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
export function isNextSidetabCall(value: unknown): value is NextSidetabCall {
|
|
49
|
-
const call = value as Partial<NextSidetabCall> | null;
|
|
50
|
-
return Boolean(call && call.type === CALL && typeof call.callId === 'string'
|
|
51
|
-
&& call.request && typeof call.request === 'object');
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export async function answerNextSidetabCall(handler: NextSidetabHandler, call: NextSidetabCall): Promise<NextSidetabResult> {
|
|
55
|
-
try { return { type: RESULT, callId: call.callId, result: await handler(call.request) }; }
|
|
56
|
-
catch (error) {
|
|
57
|
-
return { type: RESULT, callId: call.callId, result: { error: error instanceof Error ? error.message : String(error) } };
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export function createNextSidetabHostHandler(deps: NextSidetabHostDeps): NextSidetabHandler {
|
|
62
|
-
return async (request) => {
|
|
63
|
-
if (!request || !['list', 'switch', 'attach', 'detach', 'new', 'kill'].includes(request.action)) {
|
|
64
|
-
return { error: '지원하지 않는 사이드탭 동작입니다' };
|
|
65
|
-
}
|
|
66
|
-
if (request.action === 'new') {
|
|
67
|
-
if (request.character !== 'shell' && request.character !== 'elanous') return { error: 'character는 shell 또는 elanous여야 합니다' };
|
|
68
|
-
return deps.spawn(request.character);
|
|
69
|
-
}
|
|
70
|
-
if (request.action === 'detach') return deps.detach();
|
|
71
|
-
const rows = await deps.rows();
|
|
72
|
-
if (request.action === 'list') return rows.map(({ id, label, kind, badge, sessionId }) => ({ id, label, kind, badge, ...(sessionId ? { sessionId } : {}) }));
|
|
73
|
-
const target = request.target?.trim();
|
|
74
|
-
const exact = target ? rows.find((item) => item.id === target)
|
|
75
|
-
?? rows.find((item) => item.label.toLowerCase() === target.toLowerCase()) : undefined;
|
|
76
|
-
const partial = target && !exact ? rows.filter((item) => item.label.toLowerCase().includes(target.toLowerCase())) : [];
|
|
77
|
-
if (partial.length > 1) return { error: `사이드탭 항목이 여러 개 일치합니다: ${target}` };
|
|
78
|
-
const row = exact ?? partial[0] ?? (target ? undefined : rows[deps.selected()]);
|
|
79
|
-
if (!row) return { error: target ? `사이드탭 항목을 찾지 못했습니다: ${target}` : '선택된 사이드탭 항목이 없습니다' };
|
|
80
|
-
if (request.action === 'switch') return row.kind === 'tui' ? deps.switchSession(row) : { error: 'Next TUI 세션만 전환할 수 있습니다' };
|
|
81
|
-
if (request.action === 'attach') return deps.attach(row);
|
|
82
|
-
if (row.currentProcess) return { error: '현재 TUI 세션은 사이드탭에서 종료할 수 없습니다' };
|
|
83
|
-
if (request.confirm !== true) return { needsConfirmation: true, message: `PTY 종료 확인 필요: ${row.label}` };
|
|
84
|
-
return deps.kill(row);
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export function createReplNextSidetabTool(
|
|
89
|
-
proc: NextSidetabIpcProcess,
|
|
90
|
-
env: NodeJS.ProcessEnv = process.env,
|
|
91
|
-
timeoutMs = 15_000,
|
|
92
|
-
): { spec: LLMToolSpec; dispatch: (args: Record<string, unknown>) => Promise<unknown> } | null {
|
|
93
|
-
if (env.ELANOUS_NEXT_TUI_SIDETAB_IPC !== '1' || typeof proc.send !== 'function') return null;
|
|
94
|
-
const send = proc.send.bind(proc);
|
|
95
|
-
const waiting = new Map<string, (result: unknown) => void>();
|
|
96
|
-
let sequence = 0;
|
|
97
|
-
const listener = (message: unknown): void => {
|
|
98
|
-
const result = message as Partial<NextSidetabResult> | null;
|
|
99
|
-
if (!result || result.type !== RESULT || typeof result.callId !== 'string') return;
|
|
100
|
-
const resolve = waiting.get(result.callId);
|
|
101
|
-
if (!resolve) return;
|
|
102
|
-
waiting.delete(result.callId);
|
|
103
|
-
resolve(result.result);
|
|
104
|
-
};
|
|
105
|
-
proc.on('message', listener);
|
|
106
|
-
return {
|
|
107
|
-
spec: nextSidetabToolSpec,
|
|
108
|
-
dispatch: (args) => new Promise((resolve) => {
|
|
109
|
-
const callId = `s${++sequence}`;
|
|
110
|
-
const timer = setTimeout(() => {
|
|
111
|
-
if (!waiting.delete(callId)) return;
|
|
112
|
-
resolve({ error: 'Next TUI did not answer the side-tab request' });
|
|
113
|
-
}, timeoutMs);
|
|
114
|
-
waiting.set(callId, (result) => { clearTimeout(timer); resolve(result); });
|
|
115
|
-
try {
|
|
116
|
-
send({ type: CALL, callId, request: args as unknown as NextSidetabRequest } satisfies NextSidetabCall);
|
|
117
|
-
} catch (error) {
|
|
118
|
-
waiting.delete(callId);
|
|
119
|
-
clearTimeout(timer);
|
|
120
|
-
resolve({ error: `Next TUI IPC send failed: ${error instanceof Error ? error.message : String(error)}` });
|
|
121
|
-
}
|
|
122
|
-
}),
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export function registerNextSidetabReplTool(
|
|
127
|
-
specs: LLMToolSpec[],
|
|
128
|
-
dispatchByName: Map<string, (args: Record<string, unknown>) => Promise<unknown>>,
|
|
129
|
-
proc: NextSidetabIpcProcess,
|
|
130
|
-
env: NodeJS.ProcessEnv = process.env,
|
|
131
|
-
): void {
|
|
132
|
-
const tool = createReplNextSidetabTool(proc, env);
|
|
133
|
-
if (!tool) return;
|
|
134
|
-
specs.push(tool.spec);
|
|
135
|
-
dispatchByName.set(tool.spec.name, tool.dispatch);
|
|
136
|
-
}
|
|
1
|
+
/** Compatibility entry point for Next TUI callers. Shared contracts and policy live in sidetab-core. */
|
|
2
|
+
export * from '../../sidetab-core/model.js';
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const graphemes = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
|
|
2
|
+
|
|
3
|
+
const ANSI_CONTROL = /\x1b(?:\[[0-?]*[ -/]*[@-~]|\][^\x07]*(?:\x07|\x1b\\)|[PX^_].*?\x1b\\|.)/gs;
|
|
4
|
+
const NON_TEXT_CONTROL = /[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g;
|
|
5
|
+
const MAX_PEEK_SOURCE_CHARS = 16_384;
|
|
6
|
+
|
|
7
|
+
function fitLine(value: string, width: number): string {
|
|
8
|
+
if (width <= 0) return '';
|
|
9
|
+
if (Bun.stringWidth(value) <= width) return value;
|
|
10
|
+
const maxTextWidth = Math.max(0, width - 1);
|
|
11
|
+
let result = '';
|
|
12
|
+
let used = 0;
|
|
13
|
+
for (const { segment } of graphemes.segment(value)) {
|
|
14
|
+
const cells = Bun.stringWidth(segment);
|
|
15
|
+
if (used + cells > maxTextWidth) break;
|
|
16
|
+
result += segment;
|
|
17
|
+
used += cells;
|
|
18
|
+
}
|
|
19
|
+
return `${result}…`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Return up to three recent plain-text output lines for the selected sidebar row. */
|
|
23
|
+
export function formatSidetabPeekLines(
|
|
24
|
+
source: string,
|
|
25
|
+
width: number,
|
|
26
|
+
maxLines = 3,
|
|
27
|
+
): string[] {
|
|
28
|
+
if (!source || width < 5 || maxLines <= 0) return [];
|
|
29
|
+
|
|
30
|
+
let start = Math.max(0, source.length - MAX_PEEK_SOURCE_CHARS);
|
|
31
|
+
// Keep a surrogate pair intact when the bounded tail starts in its second code unit.
|
|
32
|
+
const firstCodeUnit = source.charCodeAt(start);
|
|
33
|
+
if (start > 0 && firstCodeUnit >= 0xdc00 && firstCodeUnit <= 0xdfff) start++;
|
|
34
|
+
let bounded = source.slice(start);
|
|
35
|
+
// The cut may land in an ANSI sequence or line. Drop that partial prefix; recent complete lines follow it.
|
|
36
|
+
if (start > 0) {
|
|
37
|
+
const firstLineBreak = bounded.search(/[\r\n]/);
|
|
38
|
+
if (firstLineBreak >= 0) bounded = bounded.slice(firstLineBreak + 1);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const clean = bounded
|
|
42
|
+
.replace(ANSI_CONTROL, '')
|
|
43
|
+
.replace(NON_TEXT_CONTROL, '')
|
|
44
|
+
.replace(/\r\n?/g, '\n');
|
|
45
|
+
const recent = clean.split('\n')
|
|
46
|
+
.map((line) => line.trimEnd())
|
|
47
|
+
.filter((line) => line.trim().length > 0)
|
|
48
|
+
.slice(-Math.min(3, Math.floor(maxLines)));
|
|
49
|
+
const prefix = ' ↳ ';
|
|
50
|
+
const textWidth = Math.max(1, width - Bun.stringWidth(prefix));
|
|
51
|
+
return recent.map((line) => `${prefix}${fitLine(line, textWidth)}`);
|
|
52
|
+
}
|
package/src/tui/slash/term.ts
CHANGED
|
@@ -176,7 +176,10 @@ type TermSubHandler = (sub: string, args: string[], ctx: TermSlashContext, local
|
|
|
176
176
|
|
|
177
177
|
async function termHelp(sub: string, args: string[], ctx: TermSlashContext, locals: TermSlashLocals): Promise<void> {
|
|
178
178
|
const { slashRuntime } = locals;
|
|
179
|
-
|
|
179
|
+
const lines = (args[1] ?? '').toLowerCase() === 'experimental'
|
|
180
|
+
? slashRuntime.experimentalHelpLines()
|
|
181
|
+
: slashRuntime.helpLines();
|
|
182
|
+
for (const line of lines) ctx.chatLines.push(line);
|
|
180
183
|
ctx.setChatScrollOffset(-1);
|
|
181
184
|
return;
|
|
182
185
|
}
|
|
@@ -850,6 +853,14 @@ export async function handleTermSlash(args: string[], ctx: TermSlashContext): Pr
|
|
|
850
853
|
// dispatchTerminalModalObserve. Behavior preserved verbatim from
|
|
851
854
|
// the inline case.
|
|
852
855
|
const sub = (args[0] ?? '').toLowerCase();
|
|
856
|
+
const destination = (args[2] ?? '').trim().toLowerCase();
|
|
857
|
+
if (sub === 'vw-bar' || sub === 'vwbar' || sub === 'vw-sync' || sub === 'vwsync'
|
|
858
|
+
|| (sub === 'move' && (destination === 'vw' || destination === 'window'))) {
|
|
859
|
+
const command = sub === 'move' ? 'move <id> vw' : sub === 'vwbar' ? 'vw-bar' : sub === 'vwsync' ? 'vw-sync' : sub;
|
|
860
|
+
ctx.chatLines.push(ctx.warning(` /term ${command} is retired; it no longer changes terminal state.`));
|
|
861
|
+
ctx.setChatScrollOffset(-1);
|
|
862
|
+
return;
|
|
863
|
+
}
|
|
853
864
|
const slashRuntime = ctx.termSlash.slashRuntime;
|
|
854
865
|
const sessionRegistry = ctx.termSlash.sessionRegistry;
|
|
855
866
|
const terminalMatrix = ctx.termSlash.terminalMatrix;
|
|
@@ -133,6 +133,8 @@ export interface DashboardSendRequest {
|
|
|
133
133
|
/** TUI-TURN-NARRATION — `agent_thought_chunk` ⊕ `_meta.reasoning: true`(추론 요약 문단).
|
|
134
134
|
* 전에는 usage 봉투가 아니면 버려서 화면에 0줄이었다(결함 #87). */
|
|
135
135
|
onThought?(text: string): void;
|
|
136
|
+
/** Transient runtime status (`_meta.status: true`), kept separate from model reasoning. */
|
|
137
|
+
onStatus?(text: string): void;
|
|
136
138
|
}
|
|
137
139
|
|
|
138
140
|
export interface DashboardSendResult {
|
|
@@ -209,6 +211,9 @@ export class DashboardSession {
|
|
|
209
211
|
? { resolveMaxToolTurns: opts.resolveMaxToolTurns }
|
|
210
212
|
: {}),
|
|
211
213
|
...(opts.abortPollMs !== undefined ? { abortPollMs: opts.abortPollMs } : {}),
|
|
214
|
+
// TUI-TOKEN-GUARD-WIRE — the host history write-back for the request-size cap.
|
|
215
|
+
...(opts.compactPersistedHistory ? { compactPersistedHistory: opts.compactPersistedHistory } : {}),
|
|
216
|
+
...(opts.requestSizeMaxChars !== undefined ? { requestSizeMaxChars: opts.requestSizeMaxChars } : {}),
|
|
212
217
|
});
|
|
213
218
|
|
|
214
219
|
const serverPromise = runAcpServer({
|
|
@@ -553,7 +558,7 @@ function buildSendInterceptor(req: DashboardSendRequest): SessionUpdateIntercept
|
|
|
553
558
|
rawInput?: unknown;
|
|
554
559
|
rawOutput?: unknown;
|
|
555
560
|
status?: string;
|
|
556
|
-
_meta?: { reasoning?: unknown };
|
|
561
|
+
_meta?: { reasoning?: unknown; status?: unknown };
|
|
557
562
|
};
|
|
558
563
|
};
|
|
559
564
|
const inner = n.update;
|
|
@@ -588,6 +593,10 @@ function buildSendInterceptor(req: DashboardSendRequest): SessionUpdateIntercept
|
|
|
588
593
|
case 'agent_thought_chunk': {
|
|
589
594
|
if (inner.content?.type !== 'text') return;
|
|
590
595
|
const text = inner.content.text ?? '';
|
|
596
|
+
if (inner._meta?.status === true) {
|
|
597
|
+
req.onStatus?.(text);
|
|
598
|
+
return;
|
|
599
|
+
}
|
|
591
600
|
if (inner._meta?.reasoning === true) {
|
|
592
601
|
req.onThought?.(text);
|
|
593
602
|
return;
|
package/src/user-config.ts
CHANGED
|
@@ -187,6 +187,8 @@ export interface LLMConfig {
|
|
|
187
187
|
apiKey?: string;
|
|
188
188
|
model?: string;
|
|
189
189
|
baseUrl?: string;
|
|
190
|
+
/** Override the text stream idle watchdog in milliseconds. Omitted keeps provider/family defaults. */
|
|
191
|
+
streamIdleTimeoutMs?: number;
|
|
190
192
|
/** OpenRouter 설정 한 곳(두 골이 같은 키를 쓴다):
|
|
191
193
|
* - `providerPreferences` — 상류 라우팅 선호; 도구 가능 기본값(require_parameters·allow_fallbacks)을 얕게 덮는다(OR-LLM-ROUTING-1).
|
|
192
194
|
* - `fallbackModel` — 유료 OpenRouter 폴백 모델; 체인에 openrouter 를 명시하고 모델·키를 모두 줄 때만 선택된다(OR-FALLBACK-TIER-1).
|
|
@@ -1154,6 +1156,8 @@ export interface HarnessBudgetGateConfig {
|
|
|
1154
1156
|
}
|
|
1155
1157
|
|
|
1156
1158
|
export interface SelfImplementToolConfig {
|
|
1159
|
+
/** Explicit opt-in for the needs-human reason-specific automatic repair goal. Defaults off. */
|
|
1160
|
+
supervisor?: { reasonRepair?: boolean };
|
|
1157
1161
|
/** Absolute root that holds per-repository child worktree directories. */
|
|
1158
1162
|
worktreeRoot: string;
|
|
1159
1163
|
/** Self-implement children receive a derived isolated universe by default; `inherit` keeps the parent's universe. */
|
|
@@ -1290,7 +1294,7 @@ const TOOLS_DEFAULTS: ToolsConfig = {
|
|
|
1290
1294
|
selfOrchestrate: {},
|
|
1291
1295
|
nativeStructure: { enabled: false },
|
|
1292
1296
|
// 대표 결정(2026-07-26): 오토 선호 — 기본 ON.
|
|
1293
|
-
selfImplement: { worktreeRoot: join(homedir(), '.elanous', 'worktrees'), childInstanceMode: 'isolated', prApprovalDelivery: 'terminal' as const, observeOnly: false, goalRecordInDoc: true, fabricDecompose: false, fabricDecomposeAutoPathThreshold: 5, autoOpenPr: true, autoStop: { enabled: true, minRung: 2 }, autoAssist: { enabled: true, minRung: 2 }, screenStallTermination: { enabled: true, minRung: 2 }, reworkBudget: { shadowStop: false, maxRounds: 3 }, decompositionShadow: { enabled: false }, clarificationEscalation: { enabled: false } },
|
|
1297
|
+
selfImplement: { worktreeRoot: join(homedir(), '.elanous', 'worktrees'), childInstanceMode: 'isolated', prApprovalDelivery: 'terminal' as const, observeOnly: false, goalRecordInDoc: true, fabricDecompose: false, fabricDecomposeAutoPathThreshold: 5, autoOpenPr: true, supervisor: { reasonRepair: false }, autoStop: { enabled: true, minRung: 2 }, autoAssist: { enabled: true, minRung: 2 }, screenStallTermination: { enabled: true, minRung: 2 }, reworkBudget: { shadowStop: false, maxRounds: 3 }, decompositionShadow: { enabled: false }, clarificationEscalation: { enabled: false } },
|
|
1294
1298
|
};
|
|
1295
1299
|
|
|
1296
1300
|
// ── Debug ────────────────────────────────────────────────────────────
|
|
@@ -1986,6 +1990,8 @@ function parseTasteConfig(raw: unknown): TasteConfig | undefined {
|
|
|
1986
1990
|
*/
|
|
1987
1991
|
export interface WebSearchConfig {
|
|
1988
1992
|
tavily?: { enabled?: boolean };
|
|
1993
|
+
grokApi?: { enabled?: boolean };
|
|
1994
|
+
firecrawl?: { enabled?: boolean };
|
|
1989
1995
|
}
|
|
1990
1996
|
|
|
1991
1997
|
/** OpenDesign 데몬 접속. url 이 없으면 시안 생성은 꺼진 것이다. tokenFile 은 토큰 «경로»만 담는다. */
|
|
@@ -2032,6 +2038,13 @@ function parseWebSearchConfig(raw: unknown): WebSearchConfig | undefined {
|
|
|
2032
2038
|
const t = r.tavily as Record<string, unknown>;
|
|
2033
2039
|
if (typeof t.enabled === 'boolean') out.tavily = { enabled: t.enabled };
|
|
2034
2040
|
}
|
|
2041
|
+
for (const key of ['grokApi', 'firecrawl'] as const) {
|
|
2042
|
+
const section = r[key];
|
|
2043
|
+
if (section && typeof section === 'object' && !Array.isArray(section)) {
|
|
2044
|
+
const enabled = (section as Record<string, unknown>).enabled;
|
|
2045
|
+
if (typeof enabled === 'boolean') out[key] = { enabled };
|
|
2046
|
+
}
|
|
2047
|
+
}
|
|
2035
2048
|
return Object.keys(out).length > 0 ? out : undefined;
|
|
2036
2049
|
}
|
|
2037
2050
|
|
|
@@ -2041,6 +2054,11 @@ export function isTavilySearchEnabled(cfg: Pick<UserConfig, 'webSearch'> = getUs
|
|
|
2041
2054
|
return cfg.webSearch?.tavily?.enabled === true;
|
|
2042
2055
|
}
|
|
2043
2056
|
|
|
2057
|
+
/** An API key being present does not authorize metered web search. */
|
|
2058
|
+
export function isPaidWebSearchEnabled(provider: 'grokApi' | 'firecrawl', cfg: Pick<UserConfig, 'webSearch'> = getUserConfig()): boolean {
|
|
2059
|
+
return cfg.webSearch?.[provider]?.enabled === true;
|
|
2060
|
+
}
|
|
2061
|
+
|
|
2044
2062
|
function parseSessionFabricConfig(raw: unknown): SessionFabricConfig | undefined {
|
|
2045
2063
|
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
|
|
2046
2064
|
const r = raw as Record<string, unknown>;
|
|
@@ -2633,6 +2651,10 @@ function parseToolsConfig(raw: unknown): ToolsConfig {
|
|
|
2633
2651
|
const selfImplRaw = (root.selfImplement && typeof root.selfImplement === 'object' && !Array.isArray(root.selfImplement))
|
|
2634
2652
|
? root.selfImplement as Record<string, unknown>
|
|
2635
2653
|
: {};
|
|
2654
|
+
const supervisorRaw = selfImplRaw.supervisor && typeof selfImplRaw.supervisor === 'object' && !Array.isArray(selfImplRaw.supervisor)
|
|
2655
|
+
? selfImplRaw.supervisor as Record<string, unknown>
|
|
2656
|
+
: {};
|
|
2657
|
+
const supervisor = { reasonRepair: supervisorRaw.reasonRepair === true };
|
|
2636
2658
|
const observeOnly = typeof selfImplRaw.observeOnly === 'boolean'
|
|
2637
2659
|
? selfImplRaw.observeOnly
|
|
2638
2660
|
: TOOLS_DEFAULTS.selfImplement.observeOnly;
|
|
@@ -2791,7 +2813,7 @@ function parseToolsConfig(raw: unknown): ToolsConfig {
|
|
|
2791
2813
|
runDevHarness,
|
|
2792
2814
|
selfOrchestrate,
|
|
2793
2815
|
nativeStructure,
|
|
2794
|
-
selfImplement: { worktreeRoot, childInstanceMode, prApprovalDelivery, observeOnly, goalRecordInDoc, goalAuthorPersistentGrounding, fabricDecompose, fabricDecomposeAutoPathThreshold, autoOpenPr, draftOnStop, salvageRetention, autoStop, autoAssist, screenStallTermination, reworkBudget, decompositionShadow, clarificationEscalation, ...(childLlm ? { childLlm } : {}), ...(escalateChild && Object.keys(escalateChild).length ? { escalateChild } : {}), ...(selfImplRaw.podChildDefault !== undefined ? { podChildDefault: selfImplRaw.podChildDefault } : {}), ...(runTtlHours !== undefined ? { runTtlHours } : {}), ...(draftSweepCloseCap !== undefined ? { draftSweepCloseCap } : {}), ...(runTtl ? { runTtl } : {}), ...(autoheal ? { autoheal } : {}) },
|
|
2816
|
+
selfImplement: { worktreeRoot, childInstanceMode, prApprovalDelivery, observeOnly, goalRecordInDoc, goalAuthorPersistentGrounding, fabricDecompose, fabricDecomposeAutoPathThreshold, autoOpenPr, supervisor, draftOnStop, salvageRetention, autoStop, autoAssist, screenStallTermination, reworkBudget, decompositionShadow, clarificationEscalation, ...(childLlm ? { childLlm } : {}), ...(escalateChild && Object.keys(escalateChild).length ? { escalateChild } : {}), ...(selfImplRaw.podChildDefault !== undefined ? { podChildDefault: selfImplRaw.podChildDefault } : {}), ...(runTtlHours !== undefined ? { runTtlHours } : {}), ...(draftSweepCloseCap !== undefined ? { draftSweepCloseCap } : {}), ...(runTtl ? { runTtl } : {}), ...(autoheal ? { autoheal } : {}) },
|
|
2795
2817
|
};
|
|
2796
2818
|
}
|
|
2797
2819
|
|
|
@@ -3901,8 +3923,8 @@ function parseProjectsConfig(raw: unknown): Record<string, ProjectConfig> | unde
|
|
|
3901
3923
|
}
|
|
3902
3924
|
|
|
3903
3925
|
export interface UserConfig {
|
|
3904
|
-
/** Next TUI
|
|
3905
|
-
tui?: { sidetab?: 'off' | 'collapsed' | 'open' };
|
|
3926
|
+
/** Next TUI options. `unattended` makes confirmation/clarification paths non-blocking. */
|
|
3927
|
+
tui?: { sidetab?: 'off' | 'collapsed' | 'open'; unattended?: boolean };
|
|
3906
3928
|
projects?: Record<string, ProjectConfig>;
|
|
3907
3929
|
/** Default personal topic watch; absent = enabled when user sources exist. */
|
|
3908
3930
|
watch?: { enabled?: boolean };
|
|
@@ -3937,7 +3959,7 @@ export interface UserConfig {
|
|
|
3937
3959
|
loops?: { owners?: Record<string, EventSeat>; defaultOwner?: EventSeat; orchestrator?: OrchestratorLoopConfig; steward?: { mode?: StewardLoopMode; linearTeam?: string; roles?: Record<string, { maxConcurrent?: number }>; budget?: number; tracks?: Record<string, string>; alertAfterFailures?: number; launch?: 'off' | 'shadow' | 'live'; maxParallel?: number; podPool?: string }; seat?: SeatLoopConfig; persona?: PersonaLoopConfig };
|
|
3938
3960
|
/** 🔐 Pod 의 Grok API 키 과금은 명시 opt-in 만. 생략·잘못된 값은 false.
|
|
3939
3961
|
* budgetGate 와 같은 `harness` 객체다 — 중복 선언이면 뒤 타입이 앞을 지운다. */
|
|
3940
|
-
harness?: { edgeRail?: { canaryOkRuns?: number; failureMultiplier?: number; minSamples?: number }; /** Goal authoring grade; absent or invalid config resolves to full. */ authorGrade?: 'full' | 'lite'; revertGuard?: { depth: number }; pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; exposeGate?: 'warn' | 'strict'; difficultyPlacement?: boolean; defaultRepo?: string; /** Optional GitHub repository name (owner/repo), distinct from the local defaultRepo path. */ repo?: string; /** `auto` = SUBSTRATE-ROUTE: routeAutoSubstrate 가 pod/local 을 고른다(신호가 없으면 pod). */ substrate?: 'local' | 'pod' | 'auto'; podPool?: string; /** IMAGE-ONE-SOURCE: Pod 발사가 당길 기준 이미지 커밋(hex 12~40 · 레지스트리 태그 = 앞 12자리). 없으면 종전대로 HEAD 비교·굽기. */ imageCommit?: string; worktreeAddTimeoutSec?: number; queue?: { seatCap?: Partial<Record<'OP' | 'TC' | 'MK' | 'UX', number>>; /** Direct `harness say|ask` goes through the seat queue first (ONEDOOR-2). Absent = env ELANOUS_HARNESS_QUEUE_DIRECT_SAY, else off. */ directSay?: boolean; /** SEAT-CAP-STALE: a run whose last ledger progress is older than this stops holding its seat. Absent = env ELANOUS_HARNESS_QUEUE_STALE_RUN_MINUTES, else 30. */ staleRunMinutes?: number; /** Seat-less runs count in one bucket with this cap instead of every seat. Absent = env ELANOUS_HARNESS_QUEUE_UNKNOWN_SEAT_CAP, else 2. */ unknownSeatCap?: number; /** QUEUE-BURST: most launches one scheduled tick may make (30 s apart, each within seat cap and Pod pool headroom). Absent or invalid = 5; 1 = one launch per tick. */ burstMax?: number }; /** `harness say` 문장을 Pod 안에서 저작부터 돌릴지. 생략·false = 끔(호스트가 저작). */ authorOnPod?: boolean; /** SIBLING-RESYNC-ON-MERGE: most open sibling PR file inventories fetched per merge. Absent or invalid = 40. */ siblingResync?: { maxFetch?: number }; /** Stopped-PR repair goals: shadow records only (default); live enqueues them. */ helper?: { repair?: 'shadow' | 'live'; /** Live launches allowed per UTC day. Absent or invalid means 3. */ repairPerDay?: number };
|
|
3962
|
+
harness?: { /** KNOWHOW-PACK-TO-SUPERVISORS: child goal injection is legacy opt-in; omitted = off. */ knowhowChildInjection?: boolean; edgeRail?: { canaryOkRuns?: number; failureMultiplier?: number; minSamples?: number }; /** Goal authoring grade; absent or invalid config resolves to full. */ authorGrade?: 'full' | 'lite'; revertGuard?: { depth: number }; pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; exposeGate?: 'warn' | 'strict'; difficultyPlacement?: boolean; defaultRepo?: string; /** Optional GitHub repository name (owner/repo), distinct from the local defaultRepo path. */ repo?: string; /** `auto` = SUBSTRATE-ROUTE: routeAutoSubstrate 가 pod/local 을 고른다(신호가 없으면 pod). */ substrate?: 'local' | 'pod' | 'auto'; podPool?: string; /** IMAGE-ONE-SOURCE: Pod 발사가 당길 기준 이미지 커밋(hex 12~40 · 레지스트리 태그 = 앞 12자리). 없으면 종전대로 HEAD 비교·굽기. */ imageCommit?: string; worktreeAddTimeoutSec?: number; queue?: { seatCap?: Partial<Record<'OP' | 'TC' | 'MK' | 'UX', number>>; /** Direct `harness say|ask` goes through the seat queue first (ONEDOOR-2). Absent = env ELANOUS_HARNESS_QUEUE_DIRECT_SAY, else off. */ directSay?: boolean; /** SEAT-CAP-STALE: a run whose last ledger progress is older than this stops holding its seat. Absent = env ELANOUS_HARNESS_QUEUE_STALE_RUN_MINUTES, else 30. */ staleRunMinutes?: number; /** Seat-less runs count in one bucket with this cap instead of every seat. Absent = env ELANOUS_HARNESS_QUEUE_UNKNOWN_SEAT_CAP, else 2. */ unknownSeatCap?: number; /** QUEUE-BURST: most launches one scheduled tick may make (30 s apart, each within seat cap and Pod pool headroom). Absent or invalid = 5; 1 = one launch per tick. */ burstMax?: number }; /** `harness say` 문장을 Pod 안에서 저작부터 돌릴지. 생략·false = 끔(호스트가 저작). */ authorOnPod?: boolean; /** SIBLING-RESYNC-ON-MERGE: most open sibling PR file inventories fetched per merge. Absent or invalid = 40. */ siblingResync?: { maxFetch?: number }; /** Stopped-PR repair goals: shadow records only (default); live enqueues them. */ helper?: { repair?: 'shadow' | 'live'; /** Live launches allowed per UTC day. Absent or invalid means 3. */ repairPerDay?: number };
|
|
3941
3963
|
/** Nested elanous launches. Only depth 0 may set `allow`. Absent or any other value refuses. A depth >= 1 `--nested-elanous allow` is ignored. */
|
|
3942
3964
|
nestedElanous?: 'allow' | 'refuse';
|
|
3943
3965
|
/** Maximum nested elanous depth; safe positive integer, default 2. */
|
|
@@ -5135,7 +5157,10 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5135
5157
|
const gateRemoteConfig = parseGateRemoteConfig(rawObj.gateRemote);
|
|
5136
5158
|
const projects = parseProjectsConfig(rawObj.projects);
|
|
5137
5159
|
return {
|
|
5138
|
-
tui: {
|
|
5160
|
+
tui: {
|
|
5161
|
+
sidetab: tuiRaw.sidetab === 'off' || tuiRaw.sidetab === 'open' ? tuiRaw.sidetab : 'collapsed',
|
|
5162
|
+
...(typeof tuiRaw.unattended === 'boolean' ? { unattended: tuiRaw.unattended } : {}),
|
|
5163
|
+
},
|
|
5139
5164
|
...(projects ? { projects } : {}),
|
|
5140
5165
|
...(rawObj.starter && typeof rawObj.starter === 'object' && !Array.isArray(rawObj.starter)
|
|
5141
5166
|
&& Array.isArray((rawObj.starter as Record<string, unknown>).topics)
|
|
@@ -5305,6 +5330,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5305
5330
|
};
|
|
5306
5331
|
})(),
|
|
5307
5332
|
model: resolveRuntimeLlmModel(baseProvider, selectedProvider, str(llm.model), escalationProvider || undefined),
|
|
5333
|
+
streamIdleTimeoutMs: positiveFiniteNumber(llm.streamIdleTimeoutMs),
|
|
5308
5334
|
openrouter: (() => {
|
|
5309
5335
|
const router = llm.openrouter;
|
|
5310
5336
|
if (!router || typeof router !== 'object' || Array.isArray(router)) return undefined;
|
|
@@ -6227,6 +6253,15 @@ export function getUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
6227
6253
|
return cache;
|
|
6228
6254
|
}
|
|
6229
6255
|
|
|
6256
|
+
/** Resolve the explicit TUI unattended switch: saved user config wins over the seat-launch env override. */
|
|
6257
|
+
export function resolveTuiUnattended(
|
|
6258
|
+
config: UserConfig = getUserConfig(),
|
|
6259
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
6260
|
+
): boolean {
|
|
6261
|
+
if (typeof config.tui?.unattended === 'boolean') return config.tui.unattended;
|
|
6262
|
+
return env.ELANOUS_TUI_UNATTENDED === '1';
|
|
6263
|
+
}
|
|
6264
|
+
|
|
6230
6265
|
// Read at call time, not registration time, so reload/reset and on-disk edits keep their semantics.
|
|
6231
6266
|
// Stored timezone is kept in raw by buildUserConfig; do not change getUserConfig's returned shape.
|
|
6232
6267
|
setConfigTimeZoneSource(() => {
|
|
@@ -6315,11 +6350,11 @@ export const PROVIDER_DEFAULT_MODEL: Record<LLMProviderName, string> = {
|
|
|
6315
6350
|
// ⛔ openai(API 키)는 gpt-4o 그대로 — `gpt-6-*` 는 openai-codex 계열이라 openai 로 부르면 호환 판정이 거부한다(09-23 대표 · 같은 날 되돌림).
|
|
6316
6351
|
anthropic: 'claude-opus-5-5',
|
|
6317
6352
|
openai: 'gpt-4o',
|
|
6318
|
-
//
|
|
6319
|
-
//
|
|
6353
|
+
// 2026-10-28: GPT-6.1 Terra is the current recommended Codex default.
|
|
6354
|
+
// `llm.ts` avoids importing this UI-facing module, so keep its local default aligned here.
|
|
6320
6355
|
// ⚠️ `llm.ts` 에서 import 하지 «않는다» — 이 파일은 UI 소비자가 CLI 표면을 안 끌어오게
|
|
6321
6356
|
// «일부러» 독립돼 있다(이 상수의 머리말). ⇒ 값을 맞추고 «자»로 묶는다.
|
|
6322
|
-
'openai-codex': 'gpt-6-
|
|
6357
|
+
'openai-codex': 'gpt-6.1-terra',
|
|
6323
6358
|
// ⛔ 2026-08-18: 'grok-4-1-fast' 는 «200 OK 로 응답하지만 실제로는 grok-4.3 이 도는»
|
|
6324
6359
|
// 레거시 별칭이었다(xAI 실호출 대조). 실물 flagship 으로 고친다.
|
|
6325
6360
|
grok: 'grok-4.7',
|
|
@@ -6623,6 +6658,7 @@ export function saveUserConfig(
|
|
|
6623
6658
|
apiKey: cfg.llm.apiKey,
|
|
6624
6659
|
model: cfg.llm.model,
|
|
6625
6660
|
baseUrl: cfg.llm.baseUrl,
|
|
6661
|
+
streamIdleTimeoutMs: cfg.llm.streamIdleTimeoutMs,
|
|
6626
6662
|
// Persist the rotation exactly as held in memory — each entry
|
|
6627
6663
|
// stripped of its own undefined fields so the on-disk JSON
|
|
6628
6664
|
// stays minimal. Omit the key entirely when no rotation is
|