elanous 0.2.34 → 0.2.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/chunks/{abb4b98b.163e0f56e84ae35d.js → 053a429e.9a63436527cc751c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +287 -0
- package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +64 -0
- package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +36 -0
- package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +149 -0
- package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6086.913a69e6fa3e4a8b.js → 2683.c9773a0c589b031b.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{5576-82d3703636d5c4b9.js → 275-02ea4c2a33980422.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{ffdc3a04.b9c23c1b28dd4a96.js → 2812ca6a.3b9f4a7a08885744.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{9550.d5f76828f972058c.js → 2986.45d7652e4f13557e.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3031-85328a92fcce4da6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8817.61bb7ffbba502ecb.js → 3136.30aaaa5fa03662a3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9131-fce7256c4180c4a5.js → 3148-98efd4869d660a87.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3498.cf2a15a8a9e5b926.js → 3155.2587a55196ecb394.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3103.84470c8445962f04.js → 3324.a09703033abcbd2f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +8 -0
- package/apps/pwa/out/_next/static/chunks/3410.7f9af5ab77cbe65f.js +115 -0
- package/apps/pwa/out/_next/static/chunks/{3819.163d4777f0a597f6.js → 3538.a445e50bb359d068.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +286 -0
- package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3414.172ad4ca2d9b08e8.js → 3727.7949ccaacaa71242.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3757-180308bc61021b05.js +1 -0
- package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +74 -0
- package/apps/pwa/out/_next/static/chunks/3840-5825d56d46976a92.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9b48c871.204d5d13e7809bd0.js → 3a3d9966.cc4d4585a2708e7c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4116.a84a92a2492c080e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +104 -0
- package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6740.43de73fc427c9fe2.js → 4286.b70c4520306817e8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4304.e9b2512834a9e23e.js +23 -0
- package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8548.036c344973968847.js → 4615.8525eb0add35eba6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +148 -0
- package/apps/pwa/out/_next/static/chunks/{3411-f87314c6c66ebc73.js → 5085-bce4904931767ca6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +93 -0
- package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3110.0a7065f25c841818.js → 528.38ce20ef8aa251ff.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{1644.35dd25240ae24e4b.js → 552.b7d061ad91eeac51.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3837.722e053fb9f321ad.js → 5711.957b095705c12560.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2124.ed5bf480cea7f85b.js → 575.d929793a53f27c4b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7562.948255cbc3e79d33.js → 599.c39c571b6733f2a2.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +79 -0
- package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6566.926a1d1b7c911442.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +1 -0
- package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +27 -0
- package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5446.edf141cff9ef647d.js → 6925.562d532110879886.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7005.1623d2aea78eb85f.js → 6943.c6b24124853a47b2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8368.014caa8de2f5af34.js → 7481.39f7a4654907bf6e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2554.3b5e200f5f5cfcd6.js → 771.c3cdb6c1f7f47c02.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/7784.1f0ac4a16d190cf4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3121.779fafe3e44612c5.js → 7891.03f910124a737985.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8037.e254fd797aa224d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +1 -0
- package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{9a8cb466.cc9fc9e6e46038aa.js → 873d6c12.09bd499f57171543.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7431.3051e9b8a4372d2d.js → 8904.7d51af2dc033965c.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +90 -0
- package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +94 -0
- package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1895-60ed0e341c658bd4.js → 9250-072df22eaadaa6b5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +77 -0
- package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2547.dd27303624cb4da8.js → 9514.131c52cc75fe6439.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +1 -0
- package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9f31e478.fefcbcd3c388ebc5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/{page-4fb31eb476dcbad3.js → page-083747f1d4518f61.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-e7abc34a48a6f71e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-c15958835534404b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5014f970-22bef0b5210f7d60.js → ccae1c4b-0cf414f5eff1b10d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4fa33ebd.21c1bd5b294496e6.js → ceba0382.650712b56b85b582.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/da5ecc5c-b005ad8cac737d57.js +1 -0
- package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +1 -0
- package/apps/pwa/out/_next/static/{L04y73dlwKeTW-GetaTF3 → uC-N0emedeNOFuaBQFv-I}/_buildManifest.js +1 -1
- 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 +3 -2
- package/catalog/providers/opengateway.yaml +25 -0
- package/docs/goal-context/01-goal-authoring-checks.md +8 -0
- package/docs/goal-context/03-verification-menu.md +24 -0
- package/docs/goal-context/04-mock-scenarios.md +100 -0
- package/docs/goal-context/05-authoring-lessons.jsonl +47 -0
- package/docs/goal-context/README.md +7 -0
- package/graphs/catalog/catalog.yaml +1 -1
- package/graphs/default-loop.yaml +63 -4
- package/graphs/document-loop.yaml +51 -3
- package/graphs/implement-loop.yaml +77 -4
- package/graphs/journey/ta-journey.yaml +11 -1
- package/graphs/journey/units/author-dialogue/author-dialogue.yaml +42 -0
- package/graphs/journey/units/author-dialogue/observe.ts +96 -0
- package/graphs/journey/units/author-dialogue/recipes.yaml +10 -0
- package/graphs/operate-loop.yaml +51 -3
- package/graphs/release/recipes.yaml +6 -0
- package/graphs/release/release-loop.yaml +17 -4
- package/graphs/research-loop.yaml +137 -3
- package/graphs/test-diet/test-diet.yaml +3 -0
- package/graphs/wizard/recipes.yaml +44 -0
- package/graphs/wizard/wizard-loop.yaml +44 -0
- package/graphs/work/research-report.yaml +2 -0
- package/package.json +1 -1
- package/scripts/ci-typecheck-changed.ts +139 -5
- package/scripts/coord-role-pack.ts +19 -6
- package/scripts/first10-gate.ts +416 -0
- package/scripts/fleet/wsl-node-setup.sh +432 -0
- package/scripts/hq/standby-snapshot.ts +17 -12
- package/scripts/release-loop/docs-land-node.ts +21 -5
- package/scripts/release-loop/docs-node.ts +204 -8
- package/scripts/release-loop/gate-baseline-receipt.ts +155 -0
- package/scripts/release-loop/gate-node.ts +427 -72
- package/scripts/release-loop/gate-partial.ts +65 -11
- package/scripts/release-loop/gate-radius-live.ts +177 -0
- package/scripts/release-loop/gate-radius-shadow.ts +1 -1
- package/scripts/release-loop/node-verdict.ts +14 -1
- package/scripts/release-loop/npm-publish-node.ts +66 -12
- package/scripts/release-loop/probe-pod-host-dirs-live.ts +5 -0
- package/scripts/release-loop/pwa-remote.ts +166 -0
- package/scripts/release-loop/pwa-scenarios-node.ts +19 -3
- package/scripts/release-loop/resume-cap.ts +14 -34
- package/scripts/release-loop/resume-release.ts +78 -15
- package/scripts/release-loop/traffic-node.ts +59 -0
- package/scripts/release-loop/traffic-transition.ts +159 -0
- package/scripts/release-loop/unattended-release.ts +2 -0
- package/scripts/rhythm/daily.ts +137 -3
- package/scripts/test-diet/lib.ts +6 -1
- package/scripts/test-diet/node.ts +194 -13
- package/scripts/ux-sim.ts +92 -0
- package/skills/README.md +1 -0
- package/src/acp/core-turn-bridge.ts +48 -6
- package/src/agent/delegate-hint.ts +16 -0
- package/src/agent/runner.ts +82 -2
- package/src/agent/self-ambient-cache.ts +8 -0
- package/src/agent/task-notification.ts +56 -10
- package/src/agent/types.ts +4 -0
- package/src/agent-substrate/acp-reviewer.ts +39 -4
- package/src/agent-substrate/pr-reviewer.ts +72 -3
- package/src/agent-substrate/review-intent.ts +29 -2
- package/src/agent-substrate/review-observation.ts +3 -0
- package/src/agent-substrate/self-review-cli.ts +229 -28
- package/src/autopilot/mission-codebase-gate.ts +141 -12
- package/src/autopilot/pr-manager.ts +240 -41
- package/src/boot/daemon-tools/self-implement.ts +1 -0
- package/src/budget/run-usage-rollup.ts +1 -0
- package/src/budget/usage-outcomes.ts +8 -4
- package/src/capture/tui-self-report.ts +102 -0
- package/src/chat/goal-continue-verdict.ts +41 -0
- package/src/chat/index.ts +30 -6
- package/src/chat/internal-turn-origin.ts +1 -0
- package/src/chat/paste-fold.ts +86 -0
- package/src/chat/pickers/modal-runtime.ts +10 -27
- package/src/chat/tool-render/block.ts +32 -0
- package/src/chat/tool-render/dispatch.ts +2 -20
- package/src/chat/tool-render/result-text.ts +98 -0
- package/src/chat/turn-typeahead.ts +70 -7
- package/src/cli/agent-cli.ts +13 -2
- package/src/cli/config-audit.ts +119 -0
- package/src/cli/doctor-cli.ts +26 -1
- package/src/cli/guardian-cli.ts +10 -0
- package/src/cli/herdr-cli.ts +34 -0
- package/src/cli/light-entry-route.ts +50 -7
- package/src/cli/log-event-names.ts +2 -0
- package/src/cli/make-cli.ts +247 -11
- package/src/cli/msg-cli.ts +117 -3
- package/src/cli/pod-cli.ts +77 -3
- package/src/cli/pr-cli.ts +34 -18
- package/src/cli/pr-land-base-read.ts +11 -2
- package/src/cli/pr-land-heavy-remote.ts +6 -3
- package/src/cli/pr-land-overlap-evidence.ts +23 -4
- package/src/cli/pr-land-pod-shadow-job.ts +3 -0
- package/src/cli/pr-land-recovery.ts +117 -1
- package/src/cli/pty-takeover-cli.ts +8 -7
- package/src/cli/release-checklist-read-cli.ts +79 -0
- package/src/cli/release-cli.ts +92 -106
- package/src/cli/release-single-flight.ts +1 -1
- package/src/cli/remote-resolve.ts +1 -1
- package/src/cli/root-tui-entry.ts +48 -0
- package/src/cli/sim-cli.ts +22 -0
- package/src/cli/tasks-card-show.ts +162 -0
- package/src/cli/tasks-cli.ts +1065 -338
- package/src/cli/tasks-read-cli.ts +197 -0
- package/src/cli/usage-cli.ts +13 -11
- package/src/clipboard/history.ts +179 -13
- package/src/config.ts +8 -1
- package/src/core-turn/run-core-turn.ts +4 -2
- package/src/core-turn/run-goal-loop.ts +73 -16
- package/src/core-turn/types.ts +6 -1
- package/src/dashboard/chat/acp-chat.ts +8 -0
- package/src/dashboard/context/keys.ts +8 -31
- package/src/dashboard/index.ts +280 -59
- package/src/dashboard/input/agent-wake.ts +7 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +146 -3
- package/src/dashboard/input/chat-main-slash-command.ts +4 -2
- package/src/dashboard/input/goal-continue.ts +210 -0
- package/src/dashboard/input/goal-interim.ts +2 -0
- package/src/dashboard/input/internal-turn.ts +2 -8
- package/src/dashboard/input/seat-autowake.ts +9 -7
- package/src/dashboard/input/turn-autoheal.ts +52 -0
- package/src/dashboard/render/theme-resolver.ts +33 -4
- package/src/dashboard/seat-boot-preamble.ts +132 -5
- package/src/dashboard/slash-runtime/chat-persona.ts +65 -8
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +3 -2
- package/src/dashboard/slash-runtime/model-choices.ts +15 -0
- package/src/dashboard/stale-install-check.ts +3 -99
- package/src/debug/batch-queue.ts +119 -0
- package/src/debug/tui-log-tag.ts +67 -0
- package/src/display/agent-surface.ts +7 -0
- package/src/domains/schedule-registry.ts +16 -2
- package/src/domains/standalone-log-sink.ts +15 -2
- package/src/esc-abort-gate.ts +69 -0
- package/src/git-fs/idle-refresh.ts +76 -0
- package/src/git-fs/index.ts +18 -7
- package/src/git-fs/worktree.ts +137 -5
- package/src/graph-kinds/registry.ts +2 -2
- package/src/graph-runner/graph-cli.ts +18 -0
- package/src/graph-runner/runner.ts +173 -21
- package/src/graph-wizard/generate.ts +108 -4
- package/src/graph-wizard/steps.ts +15 -0
- package/src/grok/credential.ts +10 -3
- package/src/grounding/proactive-ground.ts +86 -0
- package/src/harness/control-inbox.ts +49 -1
- package/src/harness/harness-cli-command.ts +163 -35
- package/src/harness/harness-incidents.ts +85 -1
- package/src/harness/launch-utterance-ledger.ts +208 -0
- package/src/harness/pod-control-send.ts +33 -5
- package/src/harness/self-send-remote.ts +69 -0
- package/src/harness/self-send-routing-guard.ts +6 -0
- package/src/harness/self-send-target.ts +4 -3
- package/src/impl-discipline/detector.ts +16 -4
- package/src/impl-discipline/system-prompt.ts +11 -0
- package/src/impl-discipline/types.ts +2 -2
- package/src/index.ts +822 -154
- package/src/input-core/context-key-runtime.ts +21 -0
- package/src/intake-plane/already-built-hint.ts +4 -2
- package/src/intake-plane/requirement-funnel.ts +29 -1
- package/src/light-cli.ts +32 -11
- package/src/llm/opengateway-models.ts +11 -0
- package/src/llm/provider-credentials.ts +14 -0
- package/src/llm/provider-detect.ts +8 -1
- package/src/llm/runtime-model-family.ts +2 -1
- package/src/llm-wellformed.ts +70 -0
- package/src/llm.ts +247 -59
- package/src/loops/msg-wake.ts +35 -39
- package/src/loops/orchestrator/inbox.ts +59 -11
- package/src/loops/orchestrator/knowhow-pack.ts +364 -0
- package/src/loops/orchestrator/tick.ts +5 -1
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/model-tier/llm-tier-map.ts +15 -1
- package/src/models/prompts.ts +17 -2
- package/src/msg/msg-post-office.ts +116 -0
- package/src/mss/logging/log-store.ts +79 -22
- package/src/native-tool-catalog.ts +15 -1
- package/src/nexus/api/decisions-route.ts +38 -18
- package/src/nexus/api/graph-wizard-api.ts +20 -2
- package/src/nexus/api/loop-resources.ts +13 -1
- package/src/nexus/boot/register-mcp-clients.ts +263 -38
- package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
- package/src/oauth/codex.ts +7 -0
- package/src/onboarding/first-run.ts +37 -6
- package/src/onboarding/web-first.ts +43 -11
- package/src/ops/overview-collect.ts +30 -9
- package/src/ops/overview.ts +22 -9
- package/src/persona/loader.ts +11 -0
- package/src/persona/types.ts +8 -0
- package/src/pr-tool/census.ts +261 -27
- package/src/prompt-library/session-guidance.ts +14 -0
- package/src/provider-summary.ts +8 -0
- package/src/pty-shell/herdr-agent-report.ts +118 -9
- package/src/pty-shell/herdr-prompt.ts +266 -0
- package/src/pty-shell/pty-control-ipc.ts +151 -8
- package/src/pty-shell/pty-manifest.ts +7 -0
- package/src/pty-shell/pty-special-keys.ts +42 -2
- package/src/pty-shell/stale-install-check.ts +99 -0
- package/src/pty-shell/tui-run-state.ts +14 -2
- package/src/release-loop/auto-start.ts +20 -2
- package/src/release-loop/checklist.ts +100 -4
- package/src/release-loop/landed-but-yellow.ts +129 -5
- package/src/release-loop/light-rc.ts +1 -0
- package/src/release-loop/rehearsal.ts +37 -21
- package/src/repl/index.ts +192 -17
- package/src/repl/ops-msg-bridge.ts +32 -0
- package/src/seat-loop/knowhow-lint.ts +1 -1
- package/src/self-dev/ask-launch-flow.ts +44 -5
- package/src/self-dev/cli-help-text.ts +17 -0
- package/src/self-dev/decompose-proposal.ts +172 -20
- package/src/self-dev/decompose.ts +61 -0
- package/src/self-dev/dev-cli.ts +48 -12
- package/src/self-dev/dev-pipeline.ts +8 -2
- package/src/self-dev/draft-residue.ts +37 -1
- package/src/self-dev/draft-sweep.ts +137 -11
- package/src/self-dev/draft-triage-rules.ts +138 -0
- package/src/self-dev/fleet-reduce.ts +3 -2
- package/src/self-dev/glm-credential-guard.ts +77 -0
- package/src/self-dev/graph-front-nodes.ts +112 -0
- package/src/self-dev/graph-journey-nodes.ts +2 -0
- package/src/self-dev/graph-journey-route.ts +12 -2
- package/src/self-dev/harness-run-cli.ts +3 -15
- package/src/self-dev/orchestrate-cli-text.ts +10 -0
- package/src/self-dev/orchestrate-cli.ts +68 -3
- package/src/self-dev/orchestrate.ts +116 -17
- package/src/self-dev/review-provider-fallback.ts +35 -1
- package/src/self-dev/run-supervisor.ts +55 -2
- package/src/self-dev/run-types.ts +1 -1
- package/src/self-dev/self-orchestrate-runtime.ts +1 -11
- package/src/self-dev/shard-aggregate.ts +42 -5
- package/src/self-dev/shard-run.ts +8 -1
- package/src/self-health/autoheal.ts +153 -0
- package/src/self-health/signatures.ts +6 -0
- package/src/self-implement/blocked-draft-policy.ts +20 -0
- package/src/self-implement/classify-shadow.ts +3 -7
- package/src/self-implement/device-first.ts +116 -0
- package/src/self-implement/doctor-visit.ts +257 -2
- package/src/self-implement/evidence-command-budget.ts +80 -0
- package/src/self-implement/gate-baseline.ts +56 -17
- package/src/self-implement/gate-cli.ts +1 -0
- package/src/self-implement/gate-remote.ts +31 -20
- package/src/self-implement/goal-author-cli.ts +1 -0
- package/src/self-implement/goal-author-decompose.ts +534 -45
- package/src/self-implement/goal-author.ts +282 -7
- package/src/self-implement/goal-elaborate.ts +449 -0
- package/src/self-implement/goal-refine.ts +273 -0
- package/src/self-implement/graph-overlay-yaml.ts +14 -3
- package/src/self-implement/graph-variant.ts +40 -6
- package/src/self-implement/headless-elanous-driver.ts +19 -3
- package/src/self-implement/off-diff-evidence.ts +58 -6
- package/src/self-implement/orchestrator.ts +370 -62
- package/src/self-implement/pod-warm-pool-profile.ts +1 -0
- package/src/self-implement/pwa-import-graph.ts +1 -1
- package/src/self-implement/rework-budget-judgment.ts +5 -8
- package/src/self-implement/rework-policy.ts +30 -0
- package/src/self-implement/run-ledger.ts +108 -0
- package/src/self-implement/run-stop.ts +10 -1
- package/src/self-implement/run-ttl.ts +38 -24
- package/src/self-implement/running-runs.ts +29 -1
- package/src/self-implement/scope-adjacency.ts +115 -0
- package/src/self-implement/seams.ts +187 -28
- package/src/self-implement/stop-autoheal.ts +87 -1
- package/src/self-implement/wiring-check.ts +358 -0
- package/src/session-runtime/index.ts +1 -1
- package/src/setup/llm-env-detect.ts +5 -0
- package/src/shell-env-bootstrap.ts +11 -4
- package/src/skills/runner.ts +4 -2
- package/src/skills/tools/agent.ts +408 -40
- package/src/skills/tools/msg-ask.ts +100 -0
- package/src/skills/tools/ops-ledger.ts +2 -1
- package/src/skills/tools/schedule-wakeup.ts +23 -4
- package/src/skills/tools/shell.ts +61 -6
- package/src/skills/tools/terminal-modal-inject.ts +1 -2
- package/src/skills/tools/terminal-modal.ts +10 -8
- package/src/skills/url-router.ts +41 -1
- package/src/smart-wizard/run.ts +66 -0
- package/src/status/bar.ts +34 -6
- package/src/status/status-provider-info.ts +37 -6
- package/src/steward/hold-hygiene.ts +24 -6
- package/src/steward/rejudge-tick.ts +10 -2
- package/src/steward/ta-repair-event-collect.ts +17 -6
- package/src/steward/triage-budget.ts +194 -0
- package/src/steward/triage.ts +20 -3
- package/src/task-agent/actions.ts +72 -2
- package/src/task-agent/green-sweep.ts +4 -0
- package/src/task-agent/land-queue.ts +21 -8
- package/src/task-agent/live-moves.ts +182 -10
- package/src/task-agent/mission.ts +30 -0
- package/src/task-agent/parent-host.ts +123 -3
- package/src/task-agent/rejudge-on-head.ts +15 -0
- package/src/task-agent/repair-cycle.ts +138 -32
- package/src/task-agent/repair-next-move.ts +31 -3
- package/src/task-agent/repair-outcomes.ts +29 -0
- package/src/task-agent/repair-worker.ts +14 -4
- package/src/task-agent/shadow.ts +48 -4
- package/src/task-agent/task-card-prefix.ts +2 -0
- package/src/task-agent/task-hand.ts +525 -57
- package/src/task-agent/task-parent-role-llm.ts +36 -0
- package/src/task-agent/tier-split.ts +196 -0
- package/src/task-agent/work-order-build.ts +2 -0
- package/src/task-agent/work-order.ts +3 -2
- package/src/task-orchestrator/generator-prompt.ts +60 -11
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +42 -0
- package/src/task-orchestrator/surfaces/pod-child-providers.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +130 -11
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
- package/src/task-orchestrator/surfaces/pod-image-source.ts +89 -1
- package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
- package/src/task-orchestrator/surfaces/pod-lease.ts +17 -8
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +19 -2
- package/src/task-orchestrator/surfaces/pod-pool.ts +76 -4
- package/src/task-orchestrator/surfaces/pod-provenance.ts +82 -0
- package/src/task-orchestrator/surfaces/pod-repair-commit.ts +18 -3
- package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +16 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +224 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +201 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-provider.ts +444 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-runner.ts +387 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-transport.ts +157 -0
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +18 -0
- package/src/task-orchestrator/surfaces/pod-warm-provenance.ts +81 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +6 -2
- package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +7 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +521 -40
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +759 -50
- package/src/task-orchestrator/surfaces/self-implement.ts +65 -2
- package/src/tool-runtime/index.ts +15 -2
- package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
- package/src/tool-runtime/ops-ledger-runtimes.ts +10 -2
- package/src/tty-foreground.ts +155 -0
- package/src/tui/README.md +2 -0
- package/src/tui/chat/background-job-status.ts +54 -0
- package/src/tui/chat/goal-interim.ts +173 -0
- package/src/tui/chat/log-view.ts +267 -0
- package/src/tui/chat/self-health-status.ts +232 -0
- package/src/tui/entry.ts +695 -0
- package/src/tui/input/composer.ts +151 -0
- package/src/tui/seat-mail-boot.ts +59 -0
- package/src/tui/slash/compact-command.ts +7 -0
- package/src/tui/slash/compact.ts +94 -0
- package/src/tui/slash/new-session.ts +35 -0
- package/src/tui/slash/resume.ts +75 -0
- package/src/tui-client/local-chat-turn.ts +282 -0
- package/src/tui-client/local-harness-command.ts +63 -0
- package/src/tui-client/local-provider-command.ts +184 -0
- package/src/tui-client/next-dashboard-runtime.ts +8 -0
- package/src/tui-client/next-loop-command.ts +70 -0
- package/src/tui-client/next-wakeup.ts +191 -0
- package/src/tui.ts +37 -0
- package/src/ui/modal-adapter.ts +2 -2
- package/src/user-config.ts +4 -2
- package/src/ux-sim/classic-tui-seat-scenarios.ts +516 -0
- package/src/ux-sim/cli-config-audit-device.ts +121 -0
- package/src/ux-sim/dashboard-event-loop-stall-monitor-device.ts +238 -0
- package/src/ux-sim/event-monkey.ts +379 -0
- package/src/ux-sim/fake-bin.ts +87 -7
- package/src/ux-sim/fake-herdr.ts +238 -0
- package/src/ux-sim/fake-llm.ts +111 -6
- package/src/ux-sim/fault-glm-no-credential.ts +116 -0
- package/src/ux-sim/fault-nextmove-dispatch.ts +367 -0
- package/src/ux-sim/fault-pod-codex-503.ts +211 -0
- package/src/ux-sim/fault-scope-escape-lift.ts +216 -0
- package/src/ux-sim/fault-tui-400-autoheal.ts +297 -0
- package/src/ux-sim/goal-device.ts +619 -0
- package/src/ux-sim/in-process-cli.ts +22 -5
- package/src/ux-sim/mock-authoring-first-run-child.ts +35 -0
- package/src/ux-sim/mock-authoring-first-run.ts +97 -0
- package/src/ux-sim/mock-seat-pty-frame-child.ts +29 -0
- package/src/ux-sim/mock-seat-pty-frame.ts +297 -0
- package/src/ux-sim/mock-seat-pty-sequence-child.ts +21 -0
- package/src/ux-sim/mock-seat-pty-sequence.ts +206 -0
- package/src/ux-sim/next-tui-seat-scenarios.ts +631 -0
- package/src/ux-sim/onboarding-first-run-device.ts +269 -0
- package/src/ux-sim/pty-key-modifiers-device.ts +85 -0
- package/src/ux-sim/subagent-tools-device.ts +81 -0
- package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +250 -0
- package/src/ux-sim/tty-foreground-steal-child.ts +21 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1162.c69abda138c7ce43.js +0 -79
- package/apps/pwa/out/_next/static/chunks/1449-1fede62af84c3e43.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1598-13fc845935e816df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1639.62c5e16fa20d242f.js +0 -94
- package/apps/pwa/out/_next/static/chunks/1661-adb8b2babc9aaf8c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2147.107c0fc6146fb15a.js +0 -23
- package/apps/pwa/out/_next/static/chunks/2202-ef1c9b000c3074fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2247.1e326638ee43e672.js +0 -115
- package/apps/pwa/out/_next/static/chunks/2268.56e1e3d58180abae.js +0 -8
- package/apps/pwa/out/_next/static/chunks/2469-606819c812414021.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2593.e53c1620c0bb3599.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2690.e96671114222676a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2898-79ee1a5cc0cd9d13.js +0 -1
- package/apps/pwa/out/_next/static/chunks/298.26099a9f65e5c8ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2987-30cf9c2eb7b8bdd5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2992.51fc2a7295bd8139.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3001-5a52788c813b6113.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3014-291245fba9df7b5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3068.ee78201f0251a18d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3083.cd399a17e9365f78.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3117-e1c474683fd1f824.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3251-2c17bd5a91f8de2e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/326.3fb32322bb2ddf6d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3421-7ff7fbaa156985a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/381.f55dc63ea87735e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4129-ab0a6189f1778633.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4361.93d14ba594b3a035.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4364.7a7eb19cceb67d2f.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4406.d71f506f7c3ee9d3.js +0 -149
- package/apps/pwa/out/_next/static/chunks/4461.2ad1514180ae7e29.js +0 -148
- package/apps/pwa/out/_next/static/chunks/4479.bd309cbe0e3842ee.js +0 -64
- package/apps/pwa/out/_next/static/chunks/4522-05966f777d66d13b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4543-9a3e9812e845de65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4557.f8f1d84a0d90d590.js +0 -74
- package/apps/pwa/out/_next/static/chunks/4589-79b11542179ef58c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4633-9f8f9f88ffbb8f5c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4831.23af4d10c0697b5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4983.5951b85724f61f2a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5028-f0722e6114c313e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5249.96a848656b582a93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5311.16e0ffbfa5468b80.js +0 -62
- package/apps/pwa/out/_next/static/chunks/5489.ec2dd1b5272a19dc.js +0 -24
- package/apps/pwa/out/_next/static/chunks/559.df87695df637920c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5618-5c88f2f70178c4ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5764.05487bf0b73ddb6b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5930.e678826c3f831aab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5dfb57f7.f2e3305326202474.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6053-d893974de92e6198.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6200-cefd6f33f59d765e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6314-edeba650ae686ac9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6316-bc9a9b74d7842d79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6476-13b9779b73528008.js +0 -1
- package/apps/pwa/out/_next/static/chunks/666-04db3ac4c8e3c66f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/670.682e55106ef915a6.js +0 -77
- package/apps/pwa/out/_next/static/chunks/6816.b7ba9d0a1a4a46a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/690-fbbcc777f189af37.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6989.0d3d4020e5cb3df6.js +0 -90
- package/apps/pwa/out/_next/static/chunks/7193-cf355cca5ba6c5d5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7217-d17393fe7af78fa6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7232.24edbd938a69c8d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7295cd1e.b4b557908888eeee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7323.adb02de21991883c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7386.5d8e7e42e818dfb6.js +0 -287
- package/apps/pwa/out/_next/static/chunks/7448.478958ffbbba0ac0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7537.ba2208c5c656b8a3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7596-962ae6db6cfc9c83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7671.cff51beac212a2ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7883.3916734ee16d3e58.js +0 -27
- package/apps/pwa/out/_next/static/chunks/7952.b192c31b6a0e00cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/801.5b24e81eded22d1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8176.8c9a8613f5a01ac1.js +0 -36
- package/apps/pwa/out/_next/static/chunks/819e78a6.fa3dd7f7da19bf61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8220-78978450c3183d8d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8221-eb60b5bc692a3361.js +0 -1
- package/apps/pwa/out/_next/static/chunks/826.e9a26064f474949e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8459-a351487a4480f584.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8482-75823d513a4ce151.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8488.8da515248cda3f3a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8584.388a1779d9b203af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8637.a55e098e61ffefb8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9207-8e6a12db30373f32.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9263-00ae932c62696a86.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9318.caafc3a130e8769c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/932.da3fb55951882562.js +0 -93
- package/apps/pwa/out/_next/static/chunks/9433.002f8426ac75b6b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9464.dd631a5a14b1d660.js +0 -24
- package/apps/pwa/out/_next/static/chunks/9739.8d5f36ac67a3b236.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9743.beeabb9d5f86abe4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9843-a23d3f32dc43f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/994-28211077c7c587d5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-3b4c947f174e33d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-369d5ce99483f859.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-63c0ed0eb26e5fce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-62802c6003bc85cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ecb41560d4e77be9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-7b65ad8130c93e95.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8755477c15a9060c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-5725447dd972c471.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b979de0591a69375.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-6d0796bf4633751a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-59c31dc0394e67b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-12dfc95f6cc5c718.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-25788244e66aa4dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-a2555dc705466322.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-3b4c947f174e33d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-578729adbeaa40cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a1d20fffbec35205.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-4a558f94516b8004.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-9e3834705b86145e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d7bff0f0905a662c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-cb1c5fe746ea4014.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-9ee320507356582a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66fd183b74835886.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-3272a064a01a9927.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-f281b7a7f6ef2529.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-d45a65f8b7124fcd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-e9c1fe684dd19a66.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-b8322932fc6e34de.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-82c66d9af2290575.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-63c6752009c97b05.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-bb33d42ebc358aec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-7e4c9379197d7214.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-38bf1e9a7001732b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-2e5b752012389d56.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-398c0faa173203f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-002f53a965b6445c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-7f75997f61a26269.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-3b4c947f174e33d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-05631753294f23fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-edd700fd2cc3d7f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-105f83ecb4594365.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-5823e87d2017f19c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-df3445b207ceceab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-b51ca09566c03de7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-8aacd5ded5dbac60.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bae3365a0b3c6a8e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ed52b48ff1aa7fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b6f8cad35fe00946.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6d25ceda500d2457.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-b6401a5f2c962fe8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ebf6cf5e.0d2f887b040e80fb.js +0 -122
- package/apps/pwa/out/_next/static/chunks/f09ec7d7-d29abe23edcbb193.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-9322cb8a56ac081c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-2fbab294e49a1561.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-f36729f56621a8f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-2a62e450b47c6114.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-5e17f7b445f34d43.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-b4263e2190ea7adf.js +0 -1
- /package/apps/pwa/out/_next/static/{L04y73dlwKeTW-GetaTF3 → uC-N0emedeNOFuaBQFv-I}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import type { Command } from 'commander';
|
|
4
|
+
import { getElanousConfigDir } from '../elanous-config-dir.js';
|
|
5
|
+
import { readNexusRuntime } from '../nexus/runtime.js';
|
|
6
|
+
import { TASK_CARD_PREFIX } from '../task-agent/task-card-prefix.js';
|
|
7
|
+
import type { Task } from '../task-orchestrator/types.js';
|
|
8
|
+
import type { TasksCliDeps } from './tasks-cli.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* CLI-ENTRY-LAZY — `tasks list`·`tasks show` 의 등록과 넥서스 조회 보조.
|
|
12
|
+
* ⛔ 이 파일은 task-agent 의 board·shadow·mission 클러스터(·dashboard)를 «정적으로» 싣지 않는다 — 가벼운 진입(`light-cli.ts`)이
|
|
13
|
+
* `tasks-cli.ts` 전체 대신 이것만 등록한다. 과제 카드(`ta-…`) 상세는 `tasks-card-show.ts` 를 그때 싣는다.
|
|
14
|
+
* 같은 등록 함수를 `tasks-cli.ts` 가 부르므로 전체 진입과 출력 계약이 한 코드다.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
type TaskRow = Pick<Task, 'id' | 'title' | 'priority' | 'status' | 'createdAt' | 'approval' | 'generatedBy'>;
|
|
18
|
+
|
|
19
|
+
/** `tasks hand`·`show` 가 남기는 `task-agent` 관측의 logs.db surface 라벨. */
|
|
20
|
+
export const TASK_AGENT_SINK_SURFACE = 'task-agent';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* 독립 CLI 프로세스는 데몬의 logs.db 싱크를 상속하지 않는다 — 등록하지 않으면 `debug.log('task-agent', …)` 가
|
|
24
|
+
* 파일 트레일에만 남고 `elanous logs --category task-agent` 에 0건으로 보인다(10-06 실측: 카드 3장 · 이벤트 0).
|
|
25
|
+
* fail-open — 등록 실패가 과제 넘기기를 막지 않는다.
|
|
26
|
+
*/
|
|
27
|
+
export async function registerTaskAgentSink(register?: (surface: string) => Promise<unknown>): Promise<void> {
|
|
28
|
+
try {
|
|
29
|
+
const fn = register ?? (await import('../domains/standalone-log-sink.js')).registerStandaloneLogSink;
|
|
30
|
+
await fn(TASK_AGENT_SINK_SURFACE);
|
|
31
|
+
} catch { /* fail-open — 파일 트레일이 진실원 */ }
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const PRIORITY_RANK: Record<Task['priority'], number> = { urgent: 0, high: 1, medium: 2, low: 3 };
|
|
35
|
+
export const NEXUS_DOWN = '넥서스가 안 떠 있다 — `elanous nexus run`';
|
|
36
|
+
|
|
37
|
+
function taskOrder(a: TaskRow, b: TaskRow): number {
|
|
38
|
+
return PRIORITY_RANK[a.priority] - PRIORITY_RANK[b.priority]
|
|
39
|
+
|| a.createdAt - b.createdAt || a.id.localeCompare(b.id);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function taskSource(task: TaskRow): string {
|
|
43
|
+
return task.generatedBy?.kind === 'external'
|
|
44
|
+
? `${task.generatedBy.provider}:${task.generatedBy.ref}` : '-';
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function taskLine(task: TaskRow): string {
|
|
48
|
+
return [task.id, task.priority, task.status, task.approval?.state ?? '-', taskSource(task), task.title].join('\t');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function credentials(deps: TasksCliDeps): { baseUrl: string; token?: string } | null {
|
|
52
|
+
const port = deps.baseUrl !== undefined ? undefined : readNexusRuntime()?.httpPort;
|
|
53
|
+
const baseUrl = deps.baseUrl ?? (port ? `http://127.0.0.1:${port}` : undefined);
|
|
54
|
+
if (!baseUrl) return null;
|
|
55
|
+
// Same as `connector linear sync`: an isolated (--test) universe has no acp-token and its
|
|
56
|
+
// daemon accepts loopback callers without one — send the bearer only when there is one.
|
|
57
|
+
let token = deps.bearerToken;
|
|
58
|
+
if (token === undefined) {
|
|
59
|
+
try { token = readFileSync(join(getElanousConfigDir(), 'acp-token'), 'utf8').trim() || undefined; }
|
|
60
|
+
catch { token = undefined; }
|
|
61
|
+
}
|
|
62
|
+
return { baseUrl, ...(token ? { token } : {}) };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export class NexusUnavailable extends Error {}
|
|
66
|
+
|
|
67
|
+
export async function request(deps: TasksCliDeps, auth: { baseUrl: string; token?: string }, path: string, method = 'GET'): Promise<Response> {
|
|
68
|
+
try {
|
|
69
|
+
return await (deps.fetch ?? fetch)(`${auth.baseUrl}${path}`, {
|
|
70
|
+
method,
|
|
71
|
+
headers: auth.token ? { Authorization: `Bearer ${auth.token}` } : {},
|
|
72
|
+
});
|
|
73
|
+
} catch {
|
|
74
|
+
// Fetch exceptions can include the URL or credentials; never forward their text.
|
|
75
|
+
throw new NexusUnavailable();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export async function responseJson(response: Response): Promise<unknown> {
|
|
80
|
+
try { return await response.json(); }
|
|
81
|
+
catch { throw new Error('넥서스 응답 JSON이 유효하지 않다'); }
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function httpError(response: Response): Error {
|
|
85
|
+
// Do not echo server-supplied error bodies: they may contain credentials.
|
|
86
|
+
return new Error(`HTTP ${response.status}`);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function handleError(error: unknown, out: (line: string) => void): void {
|
|
90
|
+
if (error instanceof NexusUnavailable) {
|
|
91
|
+
out(NEXUS_DOWN);
|
|
92
|
+
process.exitCode = 2;
|
|
93
|
+
} else {
|
|
94
|
+
out(error instanceof Error ? error.message : '태스크 요청 실패');
|
|
95
|
+
process.exitCode = 1;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** `tasks` 하위 명령들이 함께 쓰는 출력·인증 문맥 — 응답 출력에서 쓰인 토큰을 가린다. */
|
|
100
|
+
export interface TasksCliContext {
|
|
101
|
+
deps: TasksCliDeps;
|
|
102
|
+
out: (line: string) => void;
|
|
103
|
+
authenticate: () => { baseUrl: string; token?: string };
|
|
104
|
+
clearToken: () => void;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function createTasksCliContext(deps: TasksCliDeps): TasksCliContext {
|
|
108
|
+
let activeToken: string | undefined;
|
|
109
|
+
const output = deps.output ?? console.log;
|
|
110
|
+
return {
|
|
111
|
+
deps,
|
|
112
|
+
out: (line: string) => output(activeToken ? line.replaceAll(activeToken, '[redacted]') : line),
|
|
113
|
+
authenticate: () => {
|
|
114
|
+
const auth = credentials(deps);
|
|
115
|
+
activeToken = auth?.token;
|
|
116
|
+
if (!auth) throw new NexusUnavailable();
|
|
117
|
+
return auth;
|
|
118
|
+
},
|
|
119
|
+
clearToken: () => { activeToken = undefined; },
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** `tasks` 뿌리 명령(별칭 `task`) — 전체·가벼운 등록이 같은 뿌리를 쓴다. */
|
|
124
|
+
export function registerTasksRoot(program: Command): Command {
|
|
125
|
+
return program.command('tasks').alias('task').description('TOX 태스크 조회 및 승인 · TASK-AGENT 과제 넘기기(hand)');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function registerTaskListCommand(tasks: Command, ctx: TasksCliContext): void {
|
|
129
|
+
const { deps, out, authenticate } = ctx;
|
|
130
|
+
tasks.command('list')
|
|
131
|
+
.description('우선순위와 생성 시각 순으로 태스크 보기')
|
|
132
|
+
.option('--status <s>', '상태로 필터')
|
|
133
|
+
.option('--provider <p>', '외부 출처로 필터')
|
|
134
|
+
.option('--json', 'JSON 출력')
|
|
135
|
+
.action(async (opts: { status?: string; provider?: string; json?: boolean }) => {
|
|
136
|
+
try {
|
|
137
|
+
ctx.clearToken();
|
|
138
|
+
const auth = authenticate();
|
|
139
|
+
const response = await request(deps, auth, '/v1/tasks');
|
|
140
|
+
if (!response.ok) throw httpError(response);
|
|
141
|
+
const body = await responseJson(response) as { tasks?: Array<Pick<TaskRow, 'id' | 'status'>> };
|
|
142
|
+
if (!Array.isArray(body?.tasks)) throw new Error('넥서스 태스크 목록 형식이 유효하지 않다');
|
|
143
|
+
const cards = body.tasks.filter((task) => !opts.status || task.status === opts.status);
|
|
144
|
+
// The list endpoint returns board cards without approval or provenance.
|
|
145
|
+
// Obtain those fields from the detail endpoint rather than displaying guesses.
|
|
146
|
+
const rows: TaskRow[] = [];
|
|
147
|
+
for (const card of cards) {
|
|
148
|
+
const detail = await request(deps, auth, `/v1/tasks/${encodeURIComponent(card.id)}`);
|
|
149
|
+
if (!detail.ok) throw httpError(detail);
|
|
150
|
+
const data = await responseJson(detail) as { task?: TaskRow };
|
|
151
|
+
if (!data?.task || data.task.id !== card.id) throw new Error('넥서스 태스크 상세 형식이 유효하지 않다');
|
|
152
|
+
if (!opts.provider || (data.task.generatedBy?.kind === 'external' && data.task.generatedBy.provider === opts.provider)) rows.push(data.task);
|
|
153
|
+
}
|
|
154
|
+
rows.sort(taskOrder);
|
|
155
|
+
if (opts.json) out(JSON.stringify(rows));
|
|
156
|
+
else {
|
|
157
|
+
out('id\t우선순위\t상태\t승인\t출처\t제목');
|
|
158
|
+
for (const row of rows) out(taskLine(row));
|
|
159
|
+
}
|
|
160
|
+
} catch (error) { handleError(error, out); }
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function registerTaskShowCommand(tasks: Command, ctx: TasksCliContext): void {
|
|
165
|
+
const { deps, out, authenticate } = ctx;
|
|
166
|
+
tasks.command('show <id>')
|
|
167
|
+
.description(`태스크 상세 보기 (id 가 \`${TASK_CARD_PREFIX}\` 로 시작하면 TASK-AGENT 과제 카드 ⊕ 다음 수)`)
|
|
168
|
+
.option('--json', 'JSON 출력')
|
|
169
|
+
.action(async (id: string, opts: { json?: boolean }) => {
|
|
170
|
+
if (id.startsWith(TASK_CARD_PREFIX)) {
|
|
171
|
+
const { showTaskCard } = await import('./tasks-card-show.js');
|
|
172
|
+
await showTaskCard(id, opts, deps, out);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
ctx.clearToken();
|
|
177
|
+
const auth = authenticate();
|
|
178
|
+
const response = await request(deps, auth, `/v1/tasks/${encodeURIComponent(id)}`);
|
|
179
|
+
if (!response.ok) throw httpError(response);
|
|
180
|
+
const data = await responseJson(response) as { task?: TaskRow };
|
|
181
|
+
if (!data?.task) throw new Error('넥서스 태스크 상세 형식이 유효하지 않다');
|
|
182
|
+
if (opts.json) out(JSON.stringify(data));
|
|
183
|
+
else {
|
|
184
|
+
out(taskLine(data.task));
|
|
185
|
+
out(JSON.stringify(data, null, 2));
|
|
186
|
+
}
|
|
187
|
+
} catch (error) { handleError(error, out); }
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** 가벼운 진입 전용 — `tasks list`·`tasks show` 만 등록한다(전체 레지스트리 `registerTasksCommands` 를 싣지 않는다). */
|
|
192
|
+
export function registerTaskReadCommands(program: Command, deps: TasksCliDeps = {}): void {
|
|
193
|
+
const ctx = createTasksCliContext(deps);
|
|
194
|
+
const tasks = registerTasksRoot(program);
|
|
195
|
+
registerTaskListCommand(tasks, ctx);
|
|
196
|
+
registerTaskShowCommand(tasks, ctx);
|
|
197
|
+
}
|
package/src/cli/usage-cli.ts
CHANGED
|
@@ -75,10 +75,11 @@ function configuredUsageHosts(): { local: string; remote: string[] } {
|
|
|
75
75
|
return { local, remote: [...new Set(entries.map((entry) => entry.host?.trim()).filter((host): host is string => !!host && host !== local))] };
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
type UsageAxis = 'stage' | 'model' | 'account';
|
|
78
|
+
type UsageAxis = 'stage' | 'phase' | 'model' | 'account';
|
|
79
79
|
type ExtendedRunUsageInput = RunUsageInput & { stage?: string | null; account?: string | null; origin?: string; podJob?: string; job?: string; measured?: boolean };
|
|
80
80
|
type AxisUsageRow = {
|
|
81
81
|
stage?: string;
|
|
82
|
+
phase?: string;
|
|
82
83
|
model?: string;
|
|
83
84
|
account?: string;
|
|
84
85
|
hostIds: string[];
|
|
@@ -97,7 +98,7 @@ type AxisUsageRow = {
|
|
|
97
98
|
};
|
|
98
99
|
|
|
99
100
|
type FederatedUsageRow = {
|
|
100
|
-
runId?: string; role?: string; site?: string; stage?: string; model?: string; account?: string;
|
|
101
|
+
runId?: string; role?: string; site?: string; stage?: string; phase?: string; model?: string; account?: string;
|
|
101
102
|
billingProvider?: string; billing?: string; hostIds: string[]; rankUsd?: number;
|
|
102
103
|
calls: number; inputTokens: number; outputTokens: number; cacheReadInputTokens: number;
|
|
103
104
|
cacheCreationInputTokens: number; reasoningOutputTokens: number; usdKnown: number;
|
|
@@ -122,7 +123,7 @@ function validUsageRows(value: unknown, axis: 'run' | 'role' | UsageAxis): value
|
|
|
122
123
|
const number = row[field];
|
|
123
124
|
return typeof number === 'number' && Number.isFinite(number) && number >= 0;
|
|
124
125
|
})
|
|
125
|
-
&& (axis !== 'stage' && axis !== 'model' && axis !== 'account'
|
|
126
|
+
&& (axis !== 'stage' && axis !== 'phase' && axis !== 'model' && axis !== 'account'
|
|
126
127
|
|| typeof row.rankUsd === 'number' && Number.isFinite(row.rankUsd));
|
|
127
128
|
});
|
|
128
129
|
}
|
|
@@ -137,7 +138,7 @@ function mergeUsageRows(groups: readonly FederatedUsageRow[][], axis: 'run' | 'r
|
|
|
137
138
|
if (!previous) { merged.set(key, { ...row, hostIds: [...row.hostIds] }); continue; }
|
|
138
139
|
for (const field of SUM_FIELDS) previous[field] += row[field];
|
|
139
140
|
previous.hostIds = [...new Set([...previous.hostIds, ...row.hostIds])];
|
|
140
|
-
if (axis === 'stage' || axis === 'model' || axis === 'account') previous.rankUsd = previous.usdKnown + previous.apiEquivalentUsd;
|
|
141
|
+
if (axis === 'stage' || axis === 'phase' || axis === 'model' || axis === 'account') previous.rankUsd = previous.usdKnown + previous.apiEquivalentUsd;
|
|
141
142
|
}
|
|
142
143
|
return [...merged.values()];
|
|
143
144
|
}
|
|
@@ -186,6 +187,7 @@ function rollupByAxis(inputs: readonly ExtendedRunUsageInput[], axis: UsageAxis)
|
|
|
186
187
|
const groups = new Map<string, ExtendedRunUsageInput[]>();
|
|
187
188
|
for (const data of inputs) {
|
|
188
189
|
const value = axis === 'stage' ? stageForUsage(data)
|
|
190
|
+
: axis === 'phase' ? (typeof data.phase === 'string' && data.phase.length > 0 ? data.phase : '(none)')
|
|
189
191
|
: axis === 'model' ? (data.model || '(none)')
|
|
190
192
|
: (data.account || '(none)');
|
|
191
193
|
const group = groups.get(value) ?? [];
|
|
@@ -216,7 +218,7 @@ function rollupByAxis(inputs: readonly ExtendedRunUsageInput[], axis: UsageAxis)
|
|
|
216
218
|
}
|
|
217
219
|
|
|
218
220
|
function isUsageAxis(value: string): value is 'run' | 'role' | UsageAxis {
|
|
219
|
-
return value === 'run' || value === 'role' || value === 'stage' || value === 'model' || value === 'account';
|
|
221
|
+
return value === 'run' || value === 'role' || value === 'stage' || value === 'phase' || value === 'model' || value === 'account';
|
|
220
222
|
}
|
|
221
223
|
|
|
222
224
|
function formatAxisUsage(row: AxisUsageRow, axis: UsageAxis): string {
|
|
@@ -249,9 +251,9 @@ export function registerUsageCommand(program: Command, deps: UsageCliDeps = {}):
|
|
|
249
251
|
|
|
250
252
|
usage
|
|
251
253
|
.command('runs')
|
|
252
|
-
.description('저장된 llm-usage 로그를
|
|
254
|
+
.description('저장된 llm-usage 로그를 런·역할·단계·phase·모델·계정별로 집계한다')
|
|
253
255
|
.option('--run <runId>', '런 ID 정확 일치')
|
|
254
|
-
.option('--by <axis>', '집계 축 (run | role | stage | model | account)', 'run')
|
|
256
|
+
.option('--by <axis>', '집계 축 (run | role | stage | phase | model | account)', 'run')
|
|
255
257
|
.option(...LOGS_SINCE_OPTION)
|
|
256
258
|
.option('--hosts <scope>', '호스트 연합 (all: 이 호스트 + 설정된 taskAgent.parentHost)')
|
|
257
259
|
.option('--json', '집계 행 JSON 출력')
|
|
@@ -298,14 +300,14 @@ export function registerUsageCommand(program: Command, deps: UsageCliDeps = {}):
|
|
|
298
300
|
const complete = !rosterReason && hosts.every((host) => host.status === 'ok');
|
|
299
301
|
const rows = mergeUsageRows(parts, opts.by as 'run' | 'role' | UsageAxis);
|
|
300
302
|
if (opts.by === 'role') rows.sort((a, b) => b.calls - a.calls);
|
|
301
|
-
if (opts.by === 'stage' || opts.by === 'model' || opts.by === 'account') rows.sort((a, b) => (b.rankUsd ?? 0) - (a.rankUsd ?? 0) || b.calls - a.calls);
|
|
303
|
+
if (opts.by === 'stage' || opts.by === 'phase' || opts.by === 'model' || opts.by === 'account') rows.sort((a, b) => (b.rankUsd ?? 0) - (a.rankUsd ?? 0) || b.calls - a.calls);
|
|
302
304
|
if (json) { out.log(JSON.stringify({ rows, hosts, complete, ...(rosterReason ? { reason: rosterReason } : {}) }, null, 2)); return; }
|
|
303
305
|
out.log(`호스트 ${hosts.filter((host) => host.status === 'ok').length}/${hosts.length} 측정 · ${complete ? '완결' : '부분 합계'}`);
|
|
304
306
|
if (rosterReason) out.log(`호스트 목록: 못 잼 (${rosterReason})`);
|
|
305
307
|
for (const host of hosts) if (host.status === 'unmeasured') out.log(`${host.host}: 못 잼 (${host.reason})`);
|
|
306
308
|
if (rows.length === 0) { out.log('(일치하는 런 사용량 없음)'); return; }
|
|
307
309
|
for (const row of rows) {
|
|
308
|
-
if (opts.by === 'stage' || opts.by === 'model' || opts.by === 'account') out.log(formatAxisUsage(row as AxisUsageRow, opts.by));
|
|
310
|
+
if (opts.by === 'stage' || opts.by === 'phase' || opts.by === 'model' || opts.by === 'account') out.log(formatAxisUsage(row as AxisUsageRow, opts.by));
|
|
309
311
|
else if (opts.by === 'role') out.log(`${row.role} ${row.site} ${row.model} ${row.billingProvider}/${row.billing} calls=${row.calls} input=${row.inputTokens} output=${row.outputTokens} usdKnown=${row.usdKnown} unknownCostCalls=${row.unknownCostCalls} includedCalls=${row.includedCalls} apiEquivalentUsd=${row.apiEquivalentUsd}`);
|
|
310
312
|
else out.log(`${row.runId} ${row.model} ${row.billingProvider}/${row.billing} hosts=${row.hostIds.join(',') || '(none)'} calls=${row.calls} input=${row.inputTokens} output=${row.outputTokens} cacheRead=${row.cacheReadInputTokens} cacheCreation=${row.cacheCreationInputTokens} reasoning=${row.reasoningOutputTokens} usdKnown=${row.usdKnown} unknownCostCalls=${row.unknownCostCalls} includedCalls=${row.includedCalls} apiEquivalentUsd=${row.apiEquivalentUsd}`);
|
|
311
313
|
}
|
|
@@ -323,14 +325,14 @@ export function registerUsageCommand(program: Command, deps: UsageCliDeps = {}):
|
|
|
323
325
|
localFailure = '로컬 logs.db 조회 실패';
|
|
324
326
|
}
|
|
325
327
|
}
|
|
326
|
-
const unwrapPod = opts.by === 'stage' || opts.by === 'model' || opts.by === 'account';
|
|
328
|
+
const unwrapPod = opts.by === 'stage' || opts.by === 'phase' || opts.by === 'model' || opts.by === 'account';
|
|
327
329
|
// ⭐ METER-POD-ROLLUP-GAP-2 — Pod 사용량 재방출 행(podRollupKey)은 «더 완전한 한 행»만 센다(키 없는 행은 그대로).
|
|
328
330
|
const selected = rows.map((row) => usageData(row, unwrapPod))
|
|
329
331
|
.filter((data): data is ExtendedRunUsageInput => data !== null)
|
|
330
332
|
.filter((data) => opts.run === undefined || data.runId === opts.run);
|
|
331
333
|
// A returned Pod raw row and its host rollup describe the same usage. Keep raw rows when no measured rollup exists.
|
|
332
334
|
const inputs = dedupePodRollupRows(unwrapPod ? excludeCoveredPodRawRows(selected) : selected);
|
|
333
|
-
if (opts.by === 'stage' || opts.by === 'model' || opts.by === 'account') {
|
|
335
|
+
if (opts.by === 'stage' || opts.by === 'phase' || opts.by === 'model' || opts.by === 'account') {
|
|
334
336
|
const report = rollupByAxis(inputs, opts.by);
|
|
335
337
|
if (opts.hosts === 'all') { emitFederated(report, localFailure); return; }
|
|
336
338
|
if (json) {
|
package/src/clipboard/history.ts
CHANGED
|
@@ -8,15 +8,19 @@
|
|
|
8
8
|
//
|
|
9
9
|
// Why polling vs an OS event hook: macOS doesn't expose a clipboard-
|
|
10
10
|
// changed notification to userland binaries without entitlements.
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
11
|
+
// Keep a short active cadence, then back off while the TUI is idle so
|
|
12
|
+
// an open terminal does not spawn pbpaste every 1.5s indefinitely.
|
|
13
|
+
// CLASSIC-IDLE-CLIPBOARD (2026-10-21): callers that only show the history
|
|
14
|
+
// inside a panel start with `active: false` and flip `setActive(true)` while
|
|
15
|
+
// the panel is visible — a closed panel spawns zero pbpaste processes
|
|
16
|
+
// (5-minute idle classic TUI measured 88 reads before this change).
|
|
14
17
|
//
|
|
15
18
|
// Image entries: we already track a separate path-based registry for
|
|
16
19
|
// pasted screenshots (context.ts). This module is text-only by
|
|
17
20
|
// design — image previews live in the main scratchpad already.
|
|
18
21
|
|
|
19
22
|
import { readClipboardText, isClipboardSupported } from './index.js';
|
|
23
|
+
import { debug } from '../debug/log.js';
|
|
20
24
|
|
|
21
25
|
export interface ClipboardEntry {
|
|
22
26
|
/** UTF-8 text. Trimmed of a single trailing newline so visually
|
|
@@ -29,6 +33,19 @@ export interface ClipboardEntry {
|
|
|
29
33
|
export interface ClipboardHistoryOpts {
|
|
30
34
|
/** Polling interval in ms. Defaults to 1500. */
|
|
31
35
|
intervalMs?: number;
|
|
36
|
+
/** Start slowing clipboard reads after this much user inactivity. Defaults to 2 minutes. */
|
|
37
|
+
idleAfterMs?: number;
|
|
38
|
+
/** Poll interval multiplier after idleAfterMs. Defaults to 10 (15s with the default cadence). */
|
|
39
|
+
idleIntervalMultiplier?: number;
|
|
40
|
+
/** Start the deepest backoff after this much user inactivity. Defaults to 10 minutes. */
|
|
41
|
+
longIdleAfterMs?: number;
|
|
42
|
+
/** Poll interval multiplier after longIdleAfterMs. Defaults to 60 (90s with the default cadence). */
|
|
43
|
+
longIdleIntervalMultiplier?: number;
|
|
44
|
+
/** Start polling immediately. Defaults to true. `false` keeps the poller
|
|
45
|
+
* dormant (no reads, no timer) until `setActive(true)`. */
|
|
46
|
+
active?: boolean;
|
|
47
|
+
/** Busy streams keep the active cadence and restart the idle grace period when they finish. */
|
|
48
|
+
isBusy?: () => boolean;
|
|
32
49
|
/** Cap on stored entries; oldest fall off when exceeded. Defaults
|
|
33
50
|
* to 50 — enough for a typical session, not so big the list
|
|
34
51
|
* becomes unscrollable. */
|
|
@@ -40,6 +57,17 @@ export interface ClipboardHistoryOpts {
|
|
|
40
57
|
maxBytes?: number;
|
|
41
58
|
}
|
|
42
59
|
|
|
60
|
+
/** Dependencies are injectable so tests can exercise the real poller without
|
|
61
|
+
* process-wide `mock.module()` state. Production callers use the defaults. */
|
|
62
|
+
export interface ClipboardHistoryDependencies {
|
|
63
|
+
readClipboardText(): Promise<string | null>;
|
|
64
|
+
isClipboardSupported(): boolean;
|
|
65
|
+
/** Observation sink for poll-state transitions. Defaults to
|
|
66
|
+
* `debug.log('clipboard.history', …)`; tests inject a recorder because
|
|
67
|
+
* the debug sink arms its own flush timer. */
|
|
68
|
+
observe?(event: 'poll-state', data: { active: boolean; reason: string }): void;
|
|
69
|
+
}
|
|
70
|
+
|
|
43
71
|
export interface ClipboardHistory {
|
|
44
72
|
/** Snapshot list, newest first. Caller may read but should not
|
|
45
73
|
* mutate — use `clear` to reset. */
|
|
@@ -54,12 +82,27 @@ export interface ClipboardHistory {
|
|
|
54
82
|
* history reflects the just-promoted entry without waiting for
|
|
55
83
|
* the next tick. */
|
|
56
84
|
pokeNow(): Promise<void>;
|
|
85
|
+
/** Mark TUI input. Wakes the poller immediately if it had slowed down. */
|
|
86
|
+
noteActivity(): void;
|
|
87
|
+
/** Notify the poller immediately when its busy source changes state. */
|
|
88
|
+
noteBusyChange(): void;
|
|
89
|
+
/** Start/stop background polling (e.g. history panel opened/closed).
|
|
90
|
+
* Activating reads once immediately; deactivating clears the timer.
|
|
91
|
+
* Repeating the current state is a no-op. */
|
|
92
|
+
setActive(active: boolean, reason?: string): void;
|
|
57
93
|
}
|
|
58
94
|
|
|
59
95
|
/** Start polling. No-op on non-clipboard platforms — returns a stub
|
|
60
96
|
* with empty entries so callers don't need to guard every call. */
|
|
61
|
-
export function startClipboardHistory(
|
|
97
|
+
export function startClipboardHistory(
|
|
98
|
+
opts: ClipboardHistoryOpts = {},
|
|
99
|
+
dependencies: ClipboardHistoryDependencies = { readClipboardText, isClipboardSupported },
|
|
100
|
+
): ClipboardHistory {
|
|
62
101
|
const intervalMs = opts.intervalMs ?? 1500;
|
|
102
|
+
const idleAfterMs = opts.idleAfterMs ?? 2 * 60_000;
|
|
103
|
+
const idleIntervalMultiplier = opts.idleIntervalMultiplier ?? 10;
|
|
104
|
+
const longIdleAfterMs = opts.longIdleAfterMs ?? 10 * 60_000;
|
|
105
|
+
const longIdleIntervalMultiplier = opts.longIdleIntervalMultiplier ?? 60;
|
|
63
106
|
const maxEntries = opts.maxEntries ?? 50;
|
|
64
107
|
const maxBytes = opts.maxBytes ?? 8 * 1024;
|
|
65
108
|
|
|
@@ -67,15 +110,51 @@ export function startClipboardHistory(opts: ClipboardHistoryOpts = {}): Clipboar
|
|
|
67
110
|
const subs = new Set<() => void>();
|
|
68
111
|
let stopped = false;
|
|
69
112
|
let lastSeenText: string | null = null;
|
|
70
|
-
let timer: ReturnType<typeof
|
|
113
|
+
let timer: ReturnType<typeof setTimeout> | null = null;
|
|
114
|
+
let inFlight: Promise<void> | null = null;
|
|
115
|
+
let immediatePollAfterInFlight = false;
|
|
116
|
+
let queuedActivityPoll: Promise<void> | null = null;
|
|
117
|
+
let lastActivityAt = Date.now();
|
|
118
|
+
let wasBusy = readBusy();
|
|
119
|
+
let active = opts.active ?? true;
|
|
120
|
+
|
|
121
|
+
function readBusy(): boolean {
|
|
122
|
+
try { return opts.isBusy?.() ?? false; } catch { return false; }
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const idleMs = (): number => {
|
|
126
|
+
const busy = readBusy();
|
|
127
|
+
if (wasBusy && !busy) lastActivityAt = Date.now();
|
|
128
|
+
wasBusy = busy;
|
|
129
|
+
return busy ? 0 : Math.max(0, Date.now() - lastActivityAt);
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const nextDelayMs = (): number => {
|
|
133
|
+
const idle = idleMs();
|
|
134
|
+
if (idle >= longIdleAfterMs) return intervalMs * longIdleIntervalMultiplier;
|
|
135
|
+
if (idle >= idleAfterMs) return intervalMs * idleIntervalMultiplier;
|
|
136
|
+
return intervalMs;
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
const scheduleNext = (): void => {
|
|
140
|
+
if (stopped || !active) return;
|
|
141
|
+
if (timer) clearTimeout(timer);
|
|
142
|
+
timer = setTimeout(() => {
|
|
143
|
+
timer = null;
|
|
144
|
+
void poll();
|
|
145
|
+
}, nextDelayMs());
|
|
146
|
+
};
|
|
71
147
|
|
|
72
|
-
if (!isClipboardSupported()) {
|
|
148
|
+
if (!dependencies.isClipboardSupported()) {
|
|
73
149
|
return {
|
|
74
150
|
entries,
|
|
75
151
|
onChange: (fn) => { subs.add(fn); return () => subs.delete(fn); },
|
|
76
152
|
stop: () => { stopped = true; },
|
|
77
153
|
clear: () => { entries.length = 0; },
|
|
78
154
|
pokeNow: async () => { /* no-op */ },
|
|
155
|
+
noteActivity: () => {},
|
|
156
|
+
noteBusyChange: () => {},
|
|
157
|
+
setActive: () => {},
|
|
79
158
|
};
|
|
80
159
|
}
|
|
81
160
|
|
|
@@ -97,25 +176,112 @@ export function startClipboardHistory(opts: ClipboardHistoryOpts = {}): Clipboar
|
|
|
97
176
|
for (const fn of subs) { try { fn(); } catch { /* ignore */ } }
|
|
98
177
|
};
|
|
99
178
|
|
|
100
|
-
const poll =
|
|
101
|
-
if (stopped) return;
|
|
102
|
-
|
|
179
|
+
const poll = (): Promise<void> => {
|
|
180
|
+
if (stopped) return Promise.resolve();
|
|
181
|
+
if (inFlight) return inFlight;
|
|
182
|
+
const run = Promise.resolve().then(async (): Promise<void> => {
|
|
183
|
+
try { ingest(await dependencies.readClipboardText()); } catch { /* swallow */ }
|
|
184
|
+
finally {
|
|
185
|
+
inFlight = null;
|
|
186
|
+
if (immediatePollAfterInFlight && !stopped) {
|
|
187
|
+
immediatePollAfterInFlight = false;
|
|
188
|
+
queuedActivityPoll = poll();
|
|
189
|
+
void queuedActivityPoll;
|
|
190
|
+
} else {
|
|
191
|
+
immediatePollAfterInFlight = false;
|
|
192
|
+
scheduleNext();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
inFlight = run;
|
|
197
|
+
return run;
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
const pollImmediately = (): void => {
|
|
201
|
+
if (inFlight) {
|
|
202
|
+
immediatePollAfterInFlight = true;
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
void poll();
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
const noteActivity = (): void => {
|
|
209
|
+
const wokeFromIdle = idleMs() >= idleAfterMs;
|
|
210
|
+
lastActivityAt = Date.now();
|
|
211
|
+
wasBusy = readBusy();
|
|
212
|
+
if (wokeFromIdle && active) {
|
|
213
|
+
if (timer) clearTimeout(timer);
|
|
214
|
+
timer = null;
|
|
215
|
+
pollImmediately();
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
const noteBusyChange = (): void => {
|
|
220
|
+
const busy = readBusy();
|
|
221
|
+
if (busy === wasBusy) return;
|
|
222
|
+
wasBusy = busy;
|
|
223
|
+
lastActivityAt = Date.now();
|
|
224
|
+
if (!active) return;
|
|
225
|
+
if (timer) clearTimeout(timer);
|
|
226
|
+
timer = null;
|
|
227
|
+
pollImmediately();
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
const setActive = (next: boolean, reason = 'unspecified'): void => {
|
|
231
|
+
if (stopped || next === active) return;
|
|
232
|
+
active = next;
|
|
233
|
+
const observe = dependencies.observe
|
|
234
|
+
?? ((event: string, data: unknown) => { debug.log('clipboard.history', event, data); });
|
|
235
|
+
try { observe('poll-state', { active, reason }); } catch { /* observation must not break polling */ }
|
|
236
|
+
if (timer) clearTimeout(timer);
|
|
237
|
+
timer = null;
|
|
238
|
+
if (!active) {
|
|
239
|
+
immediatePollAfterInFlight = false;
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
lastActivityAt = Date.now();
|
|
243
|
+
wasBusy = readBusy();
|
|
244
|
+
pollImmediately();
|
|
103
245
|
};
|
|
104
246
|
|
|
105
247
|
// Kick off immediately so the very first frame already has at
|
|
106
248
|
// least one entry (whatever's currently on the clipboard).
|
|
107
|
-
|
|
108
|
-
|
|
249
|
+
// A dormant poller (active:false) reads on its first setActive(true).
|
|
250
|
+
if (active) void poll();
|
|
109
251
|
|
|
110
252
|
return {
|
|
111
253
|
entries,
|
|
112
254
|
onChange: (fn) => { subs.add(fn); return () => subs.delete(fn); },
|
|
113
255
|
stop: () => {
|
|
114
256
|
stopped = true;
|
|
115
|
-
if (timer)
|
|
257
|
+
if (timer) clearTimeout(timer);
|
|
116
258
|
timer = null;
|
|
117
259
|
},
|
|
118
260
|
clear: () => { entries.length = 0; lastSeenText = null; },
|
|
119
|
-
pokeNow: async () => {
|
|
261
|
+
pokeNow: async () => {
|
|
262
|
+
// Keep this request independent from noteActivity. If a wake poll is
|
|
263
|
+
// already queued behind the current read, it will satisfy this poke.
|
|
264
|
+
lastActivityAt = Date.now();
|
|
265
|
+
wasBusy = readBusy();
|
|
266
|
+
const currentRead = inFlight;
|
|
267
|
+
const canUseQueuedWake = Boolean(currentRead && immediatePollAfterInFlight);
|
|
268
|
+
if (timer) clearTimeout(timer);
|
|
269
|
+
timer = null;
|
|
270
|
+
if (currentRead) {
|
|
271
|
+
await currentRead;
|
|
272
|
+
if (canUseQueuedWake && queuedActivityPoll) {
|
|
273
|
+
await queuedActivityPoll;
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
if (timer) clearTimeout(timer);
|
|
277
|
+
timer = null;
|
|
278
|
+
}
|
|
279
|
+
// Reads already in progress may have captured the clipboard before
|
|
280
|
+
// this promotion, so take a fresh snapshot after they finish.
|
|
281
|
+
await poll();
|
|
282
|
+
},
|
|
283
|
+
noteActivity,
|
|
284
|
+
noteBusyChange,
|
|
285
|
+
setActive,
|
|
120
286
|
};
|
|
121
287
|
}
|
package/src/config.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { lookupLlmTierSpec } from './model-tier/llm-tier-map.js';
|
|
|
6
6
|
import { listSshHosts } from './ssh/ssh-hosts.js';
|
|
7
7
|
import { isInstalledPackagePath } from './instance/installed-package.js';
|
|
8
8
|
import { defaultObsidianVault } from './obsidian/default-vault.js';
|
|
9
|
+
import { OPENGATEWAY_DEFAULT_MODEL } from './llm/opengateway-models.js';
|
|
9
10
|
|
|
10
11
|
// ── User config ──
|
|
11
12
|
export const REMOTE_HOME = homedir();
|
|
@@ -191,7 +192,7 @@ export function refreshKeyFromCache(envName: string): boolean {
|
|
|
191
192
|
* 자식 프로세스도 이 env 를 물려받는다. 반환 = 캐시로 채운 이름(값은 절대 안 싣는다).
|
|
192
193
|
*/
|
|
193
194
|
export const DAEMON_KEY_ENV_NAMES = [
|
|
194
|
-
'ANTHROPIC_API_KEY', 'GEMINI_API_KEY', 'OPENAI_API_KEY', 'XAI_API_KEY', 'OPENROUTER_API_KEY',
|
|
195
|
+
'ANTHROPIC_API_KEY', 'GEMINI_API_KEY', 'OPENAI_API_KEY', 'XAI_API_KEY', 'OPENROUTER_API_KEY', 'OPENGATEWAY_API_KEY',
|
|
195
196
|
'ELANOUS_OPENAI_RELAY_SHARED_SECRET',
|
|
196
197
|
] as const;
|
|
197
198
|
|
|
@@ -239,6 +240,12 @@ export const OPENROUTER_API_URL = 'https://openrouter.ai/api/v1/chat/completions
|
|
|
239
240
|
// 기본 = 사다리 `balanced`(`llm-tier-map.ts` OPENROUTER). 카탈로그 id 는 `openrouter/<vendor>/<model>`,
|
|
240
241
|
// wire 로는 `openrouter/` 를 떼고 보낸다(`makeOpenRouterProvider`).
|
|
241
242
|
export const OPENROUTER_MODEL = process.env.OPENROUTER_MODEL || 'openrouter/z-ai/glm-5.3';
|
|
243
|
+
/** Optional OpenAI-compatible gateway. Cache wins over inherited env, as for other API keys. */
|
|
244
|
+
export function getOpenGatewayApiKey(): string | undefined {
|
|
245
|
+
return keyFromCacheOrEnv('OPENGATEWAY_API_KEY');
|
|
246
|
+
}
|
|
247
|
+
export const OPENGATEWAY_API_URL = 'https://apis.opengateway.ai/v1/chat/completions';
|
|
248
|
+
export const OPENGATEWAY_MODEL = process.env.OPENGATEWAY_MODEL || OPENGATEWAY_DEFAULT_MODEL;
|
|
242
249
|
export function getLocalLLMUrl(): string | undefined {
|
|
243
250
|
return process.env.LOCAL_LLM_URL; // e.g. http://localhost:11434/v1 (ollama)
|
|
244
251
|
}
|
|
@@ -256,7 +256,7 @@ export async function runCoreTurn(
|
|
|
256
256
|
mode: deferredEnabled ? 'always' : 'off',
|
|
257
257
|
});
|
|
258
258
|
}
|
|
259
|
-
debug.log('capability.resolve', 'tier-split', {
|
|
259
|
+
debug.log('capability.resolve', 'tool-tier-split', {
|
|
260
260
|
sessionId: ctx.sessionId,
|
|
261
261
|
surfaceId: surface.id,
|
|
262
262
|
surfaceSelectionReason: surface.selectionReason,
|
|
@@ -285,7 +285,9 @@ export async function runCoreTurn(
|
|
|
285
285
|
signal: ctx.signal,
|
|
286
286
|
...(ctx.sessionId !== undefined ? { sessionId: ctx.sessionId } : {}),
|
|
287
287
|
...(ctx.maxToolTurns !== undefined ? { maxTurns: ctx.maxToolTurns } : {}),
|
|
288
|
-
...(ctx.
|
|
288
|
+
...(ctx.initialProvider !== undefined
|
|
289
|
+
? { initialProvider: ctx.initialProvider, ...(ctx.skipProviders ? { skipProviders: ctx.skipProviders } : {}) }
|
|
290
|
+
: ctx.modelOverride !== undefined ? { model: ctx.modelOverride } : {}),
|
|
289
291
|
...(ctx.callbacks?.onResolvedProvider !== undefined ? { onResolvedProvider: ctx.callbacks.onResolvedProvider } : {}),
|
|
290
292
|
...(ctx.budgetGrant !== undefined ? { budgetGrant: ctx.budgetGrant } : {}),
|
|
291
293
|
...(ctx.terminalToolNames !== undefined ? { terminalToolNames: ctx.terminalToolNames } : {}),
|