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
package/src/dashboard/index.ts
CHANGED
|
@@ -328,6 +328,7 @@ import { composeDashboardKeyHandlers, dispatchDashboardKey } from './input/key-d
|
|
|
328
328
|
import { runDashboardChatMainEntry } from './input/chat-main-entry-runtime.js';
|
|
329
329
|
import { createMirrorDrawThrottle } from './mirror-draw-throttle.js';
|
|
330
330
|
import { runDashboardChatMainPlainTurn } from './input/chat-main-plain-turn-runtime.js';
|
|
331
|
+
import { createDashboardTurnAutoheal } from './input/turn-autoheal.js';
|
|
331
332
|
import {
|
|
332
333
|
createDashboardChatMainTurnSubmit,
|
|
333
334
|
runDashboardChatMainSubmitIntent,
|
|
@@ -451,7 +452,7 @@ import { FoldStack } from '../fold-stack.js';
|
|
|
451
452
|
import { getSkillIndex, reloadSkillIndex, applySkillFilter, skillIndexProblems } from '../skills/index.js';
|
|
452
453
|
import { skillRepairNotice } from '../skills/repair.js';
|
|
453
454
|
import type { DetectResult } from '../skills/router.js';
|
|
454
|
-
import { detectUrlRoute } from '../skills/url-router.js';
|
|
455
|
+
import { detectUrlRoute, extractUrls, workContextGuardReason } from '../skills/url-router.js';
|
|
455
456
|
import {
|
|
456
457
|
observeDevRequestRouteFailSoft,
|
|
457
458
|
type DevRequestRoutingConfig,
|
|
@@ -541,6 +542,54 @@ export function settleEscAbortPendingLines(lines: string[], fromIndex: number):
|
|
|
541
542
|
}
|
|
542
543
|
}
|
|
543
544
|
|
|
545
|
+
export interface EscAbortPendingSoftStopDeps {
|
|
546
|
+
/** Live foreground harness space for this turn — null when unidentified or multiple runs. */
|
|
547
|
+
getActiveHarnessSpace: () => string | null;
|
|
548
|
+
/** Push a line into the chat transcript. */
|
|
549
|
+
pushChatLine: (line: string) => void;
|
|
550
|
+
/** Self-implement hint line; returns true when it consumed the event. */
|
|
551
|
+
showHarnessEscHint: (targets: readonly string[]) => boolean;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
export type EscAbortPendingSoftStopOutcome = 'stopped' | 'failed' | 'hint' | 'waiting';
|
|
555
|
+
|
|
556
|
+
export interface EscAbortPendingSoftStopResult {
|
|
557
|
+
outcome: EscAbortPendingSoftStopOutcome;
|
|
558
|
+
/** Harness space that received the durable stop marker, when any. */
|
|
559
|
+
stoppedHarnessSpace: string | null;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
* ⭐ TUI-ESC-EXIT production seam — the ESC soft-stop callback that
|
|
564
|
+
* `attachChatStreamingKeys` wires into `createEscAbortGate`'s
|
|
565
|
+
* `onAbortPending`, extracted as a directly callable export so the incident
|
|
566
|
+
* test (test/esc-harness-stop.test.ts) exercises the same function the
|
|
567
|
+
* dashboard executes. Identified foreground harness space → enqueue the real
|
|
568
|
+
* durable soft-stop marker (`enqueueSoftStop`) and verify it
|
|
569
|
+
* (`readSoftStopRequestStatus`), pushing the Korean stopped/failure line;
|
|
570
|
+
* unidentified/multiple-run falls back to the self-implement hint, else the
|
|
571
|
+
* caller paints the waiting line (`waiting`).
|
|
572
|
+
*/
|
|
573
|
+
export function runEscAbortPendingSoftStop(
|
|
574
|
+
targets: readonly string[],
|
|
575
|
+
deps: EscAbortPendingSoftStopDeps,
|
|
576
|
+
): EscAbortPendingSoftStopResult {
|
|
577
|
+
const spaceId = deps.getActiveHarnessSpace();
|
|
578
|
+
if (spaceId) {
|
|
579
|
+
try {
|
|
580
|
+
enqueueSoftStop(spaceId);
|
|
581
|
+
if (readSoftStopRequestStatus(spaceId).status !== 'present') throw new Error('soft-stop marker not persisted');
|
|
582
|
+
deps.pushChatLine(' ⏹ 멈췄다 — 해당 하니스 런에 중단 요청을 보냈습니다.');
|
|
583
|
+
return { outcome: 'stopped', stoppedHarnessSpace: spaceId };
|
|
584
|
+
} catch {
|
|
585
|
+
deps.pushChatLine(' ⚠ 하니스 런 중단 요청을 보내지 못했습니다. /harness runs 에서 확인해 주세요.');
|
|
586
|
+
return { outcome: 'failed', stoppedHarnessSpace: null };
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
if (deps.showHarnessEscHint(targets)) return { outcome: 'hint', stoppedHarnessSpace: null };
|
|
590
|
+
return { outcome: 'waiting', stoppedHarnessSpace: null };
|
|
591
|
+
}
|
|
592
|
+
|
|
544
593
|
export type DashboardToolDispatchSignalSource = 'parent-turn' | 'fallback';
|
|
545
594
|
|
|
546
595
|
export interface DashboardToolDispatchSignalObservation {
|
|
@@ -646,7 +695,7 @@ import { getModelFamily, getModelTier } from '../models/prompts.js';
|
|
|
646
695
|
import { buildPromptInjection, getPromptBankStore } from '../prompt-bank/index.js';
|
|
647
696
|
import { getInputHistoryStore } from '../input-history.js';
|
|
648
697
|
import { inspectActiveProvider } from '../provider-summary.js';
|
|
649
|
-
import { createStatusProviderInfoReader } from '../status/status-provider-info.js';
|
|
698
|
+
import { createStatusProviderInfoReader, statusModelActual } from '../status/status-provider-info.js';
|
|
650
699
|
import { activeCodexAccountView } from '../oauth/codex-account-store.js';
|
|
651
700
|
import { buildDashboardStatusLines, readDashboardSeatsNow, type DashboardStatusLinesInput } from './dashboard-status-lines.js';
|
|
652
701
|
import { buildFirstScreenBand, resolveTuiDaemonLink, type TuiDaemonLink } from './first-screen-band.js';
|
|
@@ -889,7 +938,8 @@ import {
|
|
|
889
938
|
refreshDirtyAsync as refreshGitDirtyAsync,
|
|
890
939
|
refreshGitSnapshotAsync,
|
|
891
940
|
} from '../git-fs/index.js';
|
|
892
|
-
import {
|
|
941
|
+
import { createIdleGitPoll, dashboardIdleMs, gitDirtyRefreshIntervalMs } from '../git-fs/idle-refresh.js';
|
|
942
|
+
import { refreshSelfAmbientCache, selfAmbientKeepWarmIntervalMs } from '../agent/self-ambient-cache.js';
|
|
893
943
|
import { getPty, listPty, requestPtyTakeover } from '../pty-shell/registry.js';
|
|
894
944
|
import { listPtyManifestRowsAt } from '../pty-shell/pty-manifest.js';
|
|
895
945
|
import { ptyManifestTargets } from '../domains/fleet.js';
|
|
@@ -1038,7 +1088,9 @@ import { createQuitConfirmationState, gracefulQuit, type QuitConfirmationState }
|
|
|
1038
1088
|
import { consumeTurnEndInterrupted, handoffTurnTypeaheadAtTurnEnd, releaseTurnTypeaheadPending, runTurnTypeaheadPushNow, steerLastTurnTypeaheadSubmission } from './input/turn-steer-bridge.js';
|
|
1039
1089
|
import { abortTurnOnly } from '../turn-abort-scope.js';
|
|
1040
1090
|
import { consumeInternalTurnYield, createInternalTurnGate, formatInternalTurnBanner, resolveInternalTurnSubmitIntent, type InternalTurnRequest } from './input/internal-turn.js';
|
|
1091
|
+
import { createClassicInterimFold } from './input/goal-interim.js';
|
|
1041
1092
|
import { createSeatAutowake } from './input/seat-autowake.js';
|
|
1093
|
+
import { createGoalContinue } from './input/goal-continue.js';
|
|
1042
1094
|
import { createDashboardWakeupScheduler, registerScheduleWakeupHostTool } from '../skills/tools/schedule-wakeup.js';
|
|
1043
1095
|
import { createAttachmentRowMap } from '../log-pane/attachment-row-map.js';
|
|
1044
1096
|
import { createAttachmentPopup, type AttachmentPopupAction } from '../log-pane/attachment-popup.js';
|
|
@@ -1066,7 +1118,7 @@ import {
|
|
|
1066
1118
|
AGENT_ACTIVITY_SEGMENT_KEY,
|
|
1067
1119
|
PULSE_HALF_PERIOD_MS,
|
|
1068
1120
|
} from '../agent-activity-hud.js';
|
|
1069
|
-
import { DASHBOARD_CLARIFICATION_REQUEST, consumeStreamingTopModalEscape, createEscAbortGate, createHarnessEscHint, routeStreamingEscapeKey } from '../esc-abort-gate.js';
|
|
1121
|
+
import { DASHBOARD_CLARIFICATION_REQUEST, consumeStreamingTopModalEscape, createEscAbortGate, createEscAbortPendingGate, createHarnessEscHint, routeStreamingEscapeKey } from '../esc-abort-gate.js';
|
|
1070
1122
|
import { enqueueSoftStop, readSoftStopRequestStatus } from '../harness/control-inbox.js';
|
|
1071
1123
|
import { setSelfImplementSoftStopSpaceObserver } from '../self-implement/self-implement-runtime.js';
|
|
1072
1124
|
import { createViEditor, type ViEditorHandle } from '../vi-editor.js';
|
|
@@ -1160,7 +1212,7 @@ import { agentBatchScratchTitle, renderAgentBatchScratch } from '../display/agen
|
|
|
1160
1212
|
import { type ExecutionSurfaceHandle } from '../display/index.js';
|
|
1161
1213
|
import { AgentSurfaceStore, renderAgentDetail, renderAgentRoster, type AgentSurfaceState } from '../display/agent-surface.js';
|
|
1162
1214
|
import { globalAgentFlash } from '../display/agent-flash.js';
|
|
1163
|
-
import { globalTaskNotificationQueue } from '../agent/task-notification.js';
|
|
1215
|
+
import { globalTaskNotificationQueue, type TaskNotificationQueue, type PendingTaskNotification } from '../agent/task-notification.js';
|
|
1164
1216
|
import { createDashboardAgentWakeNotify, installAgentWake, wrapAgentWakePort } from './input/agent-wake.js';
|
|
1165
1217
|
import { renderDebugEventDetail, renderDebugEventRows, renderDebugStack, renderPromptInjectionDebug } from '../display/debug-surface.js';
|
|
1166
1218
|
import { buildDebugCallStack } from '../debug/call-stack.js';
|
|
@@ -1168,6 +1220,25 @@ import { buildAstGrepHostTool } from '../skills/tools/ast-grep.js';
|
|
|
1168
1220
|
import { buildLspHostTool } from '../skills/tools/lsp/index.js';
|
|
1169
1221
|
import { PluginHost } from '../plugins/core/host.js';
|
|
1170
1222
|
|
|
1223
|
+
/** Keep wake notifications immediate; display completed results only when a turn drains them. */
|
|
1224
|
+
export function subscribeDashboardAgentResults(
|
|
1225
|
+
queue: TaskNotificationQueue,
|
|
1226
|
+
listener: (notification: PendingTaskNotification) => void,
|
|
1227
|
+
pushHistoryLine: (line: string) => void,
|
|
1228
|
+
): () => void {
|
|
1229
|
+
const offWake = queue.onEnqueue(listener);
|
|
1230
|
+
const offDrain = queue.onDrain((items) => {
|
|
1231
|
+
for (const notification of items) {
|
|
1232
|
+
if (notification.resultPath) {
|
|
1233
|
+
pushHistoryLine(` Agent result · full result: ${notification.resultPath} · summary: ${notification.output}`);
|
|
1234
|
+
} else if (notification.preservationError) {
|
|
1235
|
+
pushHistoryLine(` Agent result preservation failed: ${notification.preservationError} · ${notification.output}`);
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
});
|
|
1239
|
+
return () => { offWake(); offDrain(); };
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1171
1242
|
/** Register the same L2 host tools used by the live TUI before each turn's catalog is assembled. */
|
|
1172
1243
|
export function registerDashboardCoreHostTools(host: Pick<PluginHost, 'registerHostTool'>): void {
|
|
1173
1244
|
const coreMod = require('../domains/core-tools.js') as typeof import('../domains/core-tools.js');
|
|
@@ -1183,7 +1254,7 @@ export function registerDashboardCoreHostTools(host: Pick<PluginHost, 'registerH
|
|
|
1183
1254
|
}
|
|
1184
1255
|
import { registerDashboardPaneHostTools } from './panes/host-tools.js';
|
|
1185
1256
|
import { type ThemeTokens } from '../theme/tokens.js';
|
|
1186
|
-
import { resolveActiveTheme } from './render/theme-resolver.js';
|
|
1257
|
+
import { getActiveThemeName, resolveActiveTheme } from './render/theme-resolver.js';
|
|
1187
1258
|
import { getTheme } from '../themes/index.js';
|
|
1188
1259
|
import type { PaneFocus, PreviewSource, WorkingDirView } from '../workspace-types.js';
|
|
1189
1260
|
import type { DisplayMouseEvent } from '../display/types.js';
|
|
@@ -1402,6 +1473,10 @@ const isPluginBusy = (host: { active(): { plugin: { isBusy?: (s: any) => boolean
|
|
|
1402
1473
|
// ── Main dashboard ──
|
|
1403
1474
|
|
|
1404
1475
|
export interface ShowDashboardOptions {
|
|
1476
|
+
/** Internal startup timing signal for the completed synchronous setup: persona load,
|
|
1477
|
+
* input-core bootstrap, plugin discovery and the widget host. This is the pre-frame block
|
|
1478
|
+
* that `onFirstFrameRendered` used to hide behind one number. Elapsed ms since entry. */
|
|
1479
|
+
onSyncSetupComplete?: (elapsedMs: number) => void;
|
|
1405
1480
|
/** Internal startup timing signal for the first successfully flushed dashboard frame. */
|
|
1406
1481
|
onFirstFrameRendered?: () => void;
|
|
1407
1482
|
/** Force debug sinks on at launch (file + mirror). Equivalent to
|
|
@@ -1876,7 +1951,34 @@ export function applyDashboardStreamingTypeaheadKey(
|
|
|
1876
1951
|
return applyTurnTypeaheadKey(state, key, isImmediate);
|
|
1877
1952
|
}
|
|
1878
1953
|
|
|
1954
|
+
/** TUI-BOOT-TIMING-HOLES — show-dashboard 동기 셋업 창(첫 프레임 직전) 계측기.
|
|
1955
|
+
* `finish()` 는 한 번만 보고하고, 보고가 던져도 부팅을 막지 않는다(fail-open). */
|
|
1956
|
+
export interface SyncSetupWindow {
|
|
1957
|
+
/** 셋업이 끝난 지점에서 호출 — 진입 이후 경과 ms 를 보고한다. */
|
|
1958
|
+
finish(): void;
|
|
1959
|
+
}
|
|
1960
|
+
|
|
1961
|
+
export function openSyncSetupWindow(
|
|
1962
|
+
report: ((elapsedMs: number) => void) | undefined,
|
|
1963
|
+
now: () => number = () => performance.now(),
|
|
1964
|
+
): SyncSetupWindow {
|
|
1965
|
+
const startedAt = now();
|
|
1966
|
+
let finished = false;
|
|
1967
|
+
return {
|
|
1968
|
+
finish(): void {
|
|
1969
|
+
if (finished) return;
|
|
1970
|
+
finished = true;
|
|
1971
|
+
if (!report) return;
|
|
1972
|
+
try {
|
|
1973
|
+
report(now() - startedAt);
|
|
1974
|
+
} catch { /* timing signal must never break boot */ }
|
|
1975
|
+
},
|
|
1976
|
+
};
|
|
1977
|
+
}
|
|
1978
|
+
|
|
1879
1979
|
export async function showDashboard(opts: ShowDashboardOptions = {}): Promise<DashboardAction> {
|
|
1980
|
+
// TUI-BOOT-TIMING-HOLES — 첫 프레임 직전 동기 셋업 구간을 여기서 연다(셋업 종료 지점에서 닫는다).
|
|
1981
|
+
const syncSetupWindow = openSyncSetupWindow(opts.onSyncSetupComplete);
|
|
1880
1982
|
let firstDashboardFrameRendered = false;
|
|
1881
1983
|
await awaitGlobalPersonaLoad().catch(() => {});
|
|
1882
1984
|
const dashboardQuitConfirmationState = createQuitConfirmationState();
|
|
@@ -2876,6 +2978,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
2876
2978
|
// current value so log analysis can filter "what keys fired while
|
|
2877
2979
|
// a turn was in flight".
|
|
2878
2980
|
let streamingInFlight = false;
|
|
2981
|
+
let noteClipboardActivity: () => void = () => {};
|
|
2982
|
+
let noteClipboardBusyChange: () => void = () => {};
|
|
2983
|
+
let noteClipboardPanelState: (active: boolean, reason: string) => void = () => {};
|
|
2984
|
+
let dashboardAcpIsBusy: () => boolean = () => false;
|
|
2985
|
+
let lastDashboardInputAt = Date.now();
|
|
2879
2986
|
/** 지금 턴의 escGate 중단 — 외부 `/stop`(TUI-STOP-INPUT-BYPASS)이 대기열을 건너뛰어 부른다. 턴 밖이면 null. */
|
|
2880
2987
|
let currentTurnExternalStop: (() => void) | null = null;
|
|
2881
2988
|
const resolveTmuxStatusLabel = (): string | null => {
|
|
@@ -3351,7 +3458,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3351
3458
|
// ⭐ H2 내부 턴 문(TUI-H2-INTERNAL-TURN) — 자율 재개(H3·H4·H5)가 지나갈 «문 하나». 판정은 모듈,
|
|
3352
3459
|
// 여기선 상태를 읽어 넘기기만 한다(⚠️ promptCtl·가시성 함수는 아래에서 선언 — 호출 시점엔 있다).
|
|
3353
3460
|
const internalTurnGate = createInternalTurnGate({
|
|
3354
|
-
isTurnRunning: () => streamingInFlight,
|
|
3461
|
+
isTurnRunning: () => streamingInFlight || dashboardAcpChat.isBusy() || internalTurnGate.isInternalTurnActive(),
|
|
3355
3462
|
isInputForeground: () =>
|
|
3356
3463
|
chatMainInputVisibilityState().inputOwnership?.owner === 'chat-main' && !topBlockingForegroundModal(),
|
|
3357
3464
|
getBufferText: () => promptCtl.getBufferText?.(),
|
|
@@ -3367,7 +3474,21 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3367
3474
|
});
|
|
3368
3475
|
// Set only by the failed-turn callback and consumed by that turn's streaming cleanup.
|
|
3369
3476
|
let autowakeTurnFailureRaw: string | null = null;
|
|
3370
|
-
|
|
3477
|
+
// ⭐ TURN-END-BEFORE-GOAL 골 이어가기 — 답이 «…하겠습니다/해야 합니다» 로 끝났는데 결과물이 없으면 H2 문으로 한 턴 더.
|
|
3478
|
+
// 판정·상한은 모듈(goal-continue.ts), 여기선 배선만(입력칸 무접촉).
|
|
3479
|
+
const goalContinue = createGoalContinue({
|
|
3480
|
+
startTurnIfIdle: (text, opts) => internalTurnGate.startTurnIfIdle(text, opts),
|
|
3481
|
+
notify: (line) => { chatLines.push(C.muted(line)); draw(); },
|
|
3482
|
+
});
|
|
3483
|
+
const internalTurnYieldPort = wrapAgentWakePort(goalContinue.wrapPort(seatAutowake.wrapPort(internalTurnGate.port)));
|
|
3484
|
+
// ⭐ TUI-GOAL-INTERIM-QUIET — 이어가기 내부 턴이 열리면 «바로 앞» 중간 보고(못 했다·약속) 문단을 한 줄로 접는다.
|
|
3485
|
+
// 끼워 넣은 사람 에코가 있으면 줄 위치를 믿지 않고 접지 않는다(판정·관측은 goal-interim.ts).
|
|
3486
|
+
const goalInterimFold = createClassicInterimFold({ canFold: () => liveTypeaheadEchoes.length === 0 });
|
|
3487
|
+
/** 지금 턴의 스트림 런타임 — 턴 끝에 «마지막 답 블록» 시작을 읽는다(없으면 null → 접지 않는다). */
|
|
3488
|
+
let latestTurnStream: { getAssistantStart(): number } | null = null;
|
|
3489
|
+
const latestTurnReplyStart = (): number | null => {
|
|
3490
|
+
try { return latestTurnStream?.getAssistantStart() ?? null; } catch { return null; }
|
|
3491
|
+
};
|
|
3371
3492
|
// ⭐ H5 자기 예약 깨움(TUI-H5-SCHEDULE-WAKEUP) — 프로세스 안 타이머가 그 시각에 H2 문으로 한 턴을 청한다.
|
|
3372
3493
|
// 직전 회차 판정 = 그 예약이 연 내부 턴이 아직 도나. 도구 등록은 아래 host tool 자리(하니스 자식 제외).
|
|
3373
3494
|
const wakeupScheduler = createDashboardWakeupScheduler(internalTurnGate, {
|
|
@@ -3735,7 +3856,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
3735
3856
|
return mouseWiring.buildStatusLine({
|
|
3736
3857
|
swd,
|
|
3737
3858
|
gitState,
|
|
3738
|
-
|
|
3859
|
+
// TUI-MODEL-BADGE-ACTUAL (10-16) — 배지의 «지금» 은 이번 턴 실제 실행(폴백이면 «처음 → 실제»).
|
|
3860
|
+
providerInfo: readStatusProviderInfo(activeAcpRuntimeModel(), statusModelActual('dashboard')),
|
|
3739
3861
|
contextUsedTokens: metrics.lastContextUsed,
|
|
3740
3862
|
tmuxLabel: tmuxStatusLabel,
|
|
3741
3863
|
sshLabel: sshStatusLabel,
|
|
@@ -4049,6 +4171,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
4049
4171
|
// makes the "*N" suffix tick up within the same frame so the
|
|
4050
4172
|
// user sees feedback for their own action immediately.
|
|
4051
4173
|
// TUI-TYPING-LAG — async probe: `git status` must not block key input.
|
|
4174
|
+
lastDashboardInputAt = Date.now();
|
|
4175
|
+
lastGitDirtyProbeAt = lastDashboardInputAt;
|
|
4052
4176
|
void refreshGitDirtyAsync(getSessionCwd(), { force: true })
|
|
4053
4177
|
.then(() => { try { draw(); } catch { /* TUI torn down */ } }, () => { /* noop */ });
|
|
4054
4178
|
});
|
|
@@ -4073,9 +4197,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
4073
4197
|
// extras.
|
|
4074
4198
|
// 3. SWD flip → dispose + re-wire (fresh repo root).
|
|
4075
4199
|
let gitUnsub: (() => void) | null = null;
|
|
4200
|
+
let lastGitDirtyProbeAt = Date.now();
|
|
4076
4201
|
const wireGitForSwd = (): void => {
|
|
4077
4202
|
if (gitUnsub) { try { gitUnsub(); } catch {} gitUnsub = null; }
|
|
4078
4203
|
const swd = getSessionCwd();
|
|
4204
|
+
lastGitDirtyProbeAt = Date.now();
|
|
4079
4205
|
gitUnsub = subscribeGitChanges(swd, () => {
|
|
4080
4206
|
try { draw(); } catch { /* noop */ }
|
|
4081
4207
|
});
|
|
@@ -4113,17 +4239,18 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
4113
4239
|
// the git snapshot (async subprocesses) and the self-ambient store scan (worker thread). A turn
|
|
4114
4240
|
// then serves them from cache instead of rebuilding synchronously on the turn path. Both are
|
|
4115
4241
|
// no-ops while the cached value is younger than the threshold; failures are fail-soft.
|
|
4242
|
+
const currentDashboardIdleMs = (): number =>
|
|
4243
|
+
dashboardIdleMs(Date.now(), lastDashboardInputAt, streamingInFlight || dashboardAcpIsBusy());
|
|
4116
4244
|
const warmTurnPreambleCaches = (): void => {
|
|
4117
|
-
|
|
4118
|
-
try { void refreshSelfAmbientCache({}, { ifOlderThanMs:
|
|
4245
|
+
const ambientCacheTtlMs = selfAmbientKeepWarmIntervalMs(currentDashboardIdleMs());
|
|
4246
|
+
try { void refreshSelfAmbientCache({}, { ifOlderThanMs: ambientCacheTtlMs }); } catch { /* noop */ }
|
|
4119
4247
|
};
|
|
4120
|
-
|
|
4121
|
-
|
|
4122
|
-
warmTurnPreambleCaches();
|
|
4248
|
+
const probeGitDirty = (minIntervalMs: number): void => {
|
|
4249
|
+
lastGitDirtyProbeAt = Date.now();
|
|
4123
4250
|
try {
|
|
4124
4251
|
const before = getGitStatusView(getSessionCwd());
|
|
4125
4252
|
// TUI-TYPING-LAG — the 5s probe ran `git status` synchronously (130ms+, hundreds under load).
|
|
4126
|
-
void refreshGitDirtyAsync(getSessionCwd(), { minIntervalMs
|
|
4253
|
+
void refreshGitDirtyAsync(getSessionCwd(), { minIntervalMs }).then((after) => {
|
|
4127
4254
|
if (
|
|
4128
4255
|
(before.dirty?.total ?? -1) !== (after.dirty?.total ?? -1) ||
|
|
4129
4256
|
(before.aheadBehind?.ahead ?? -1) !== (after.aheadBehind?.ahead ?? -1)
|
|
@@ -4132,6 +4259,26 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
4132
4259
|
}
|
|
4133
4260
|
}, () => { /* noop */ });
|
|
4134
4261
|
} catch { /* noop */ }
|
|
4262
|
+
};
|
|
4263
|
+
// CLASSIC-IDLE-GIT-POLL — no git children while idle (2 min without input); the next key warms once
|
|
4264
|
+
// off the input path (deferred) and polling resumes. `git-fs.idle poll-state` records each flip.
|
|
4265
|
+
const gitIdlePoll = createIdleGitPoll({
|
|
4266
|
+
idleMs: currentDashboardIdleMs,
|
|
4267
|
+
poll: (idleMs) => {
|
|
4268
|
+
try { void refreshGitSnapshotAsync(getSessionCwd(), { ifOlderThanMs: 30_000 }); } catch { /* noop */ }
|
|
4269
|
+
if (Date.now() - lastGitDirtyProbeAt < gitDirtyRefreshIntervalMs(idleMs)) return;
|
|
4270
|
+
probeGitDirty(gitDirtyRefreshIntervalMs(idleMs));
|
|
4271
|
+
},
|
|
4272
|
+
warm: () => {
|
|
4273
|
+
try { void refreshGitSnapshotAsync(getSessionCwd(), { ifOlderThanMs: 30_000 }); } catch { /* noop */ }
|
|
4274
|
+
probeGitDirty(0);
|
|
4275
|
+
},
|
|
4276
|
+
});
|
|
4277
|
+
warmTurnPreambleCaches();
|
|
4278
|
+
try { void refreshGitSnapshotAsync(getSessionCwd(), { ifOlderThanMs: 30_000 }); } catch { /* noop */ }
|
|
4279
|
+
const gitDirtyTimer: ReturnType<typeof setInterval> = setInterval(() => {
|
|
4280
|
+
warmTurnPreambleCaches();
|
|
4281
|
+
gitIdlePoll.tick();
|
|
4135
4282
|
}, 5_000);
|
|
4136
4283
|
(gitDirtyTimer as unknown as { unref?: () => void }).unref?.();
|
|
4137
4284
|
// The running module's installed version, not the user's working directory, is the baseline.
|
|
@@ -4546,6 +4693,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
4546
4693
|
};
|
|
4547
4694
|
let pluginHost: PluginHost;
|
|
4548
4695
|
let lastThemeLoadError = '';
|
|
4696
|
+
let lastThemeResolutionName: string | null = null;
|
|
4697
|
+
let lastPluginThemeAppliedDebugKey: string | null = null;
|
|
4549
4698
|
let iulThemePreviewOverride: string | null = null;
|
|
4550
4699
|
let lastHostChromePolicyDebugKey = '';
|
|
4551
4700
|
const observeEssentialFrameCursor = createDashboardEssentialCursorObserver({
|
|
@@ -4560,9 +4709,26 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
4560
4709
|
const raw = iulThemePreviewOverride
|
|
4561
4710
|
? { ...(getUserConfig().dashboard.theme as object ?? {}), active: iulThemePreviewOverride }
|
|
4562
4711
|
: getUserConfig().dashboard.theme;
|
|
4712
|
+
const activeThemeName = getActiveThemeName(raw);
|
|
4713
|
+
if (activeThemeName !== lastThemeResolutionName) {
|
|
4714
|
+
lastThemeResolutionName = activeThemeName;
|
|
4715
|
+
lastPluginThemeAppliedDebugKey = null;
|
|
4716
|
+
}
|
|
4563
4717
|
return resolveActiveTheme({
|
|
4564
4718
|
raw,
|
|
4565
|
-
loadPlugin: (id) =>
|
|
4719
|
+
loadPlugin: (id) => {
|
|
4720
|
+
const tokens = pluginHost?.loadThemeTokens(id) ?? null;
|
|
4721
|
+
if (!tokens) lastPluginThemeAppliedDebugKey = null;
|
|
4722
|
+
return tokens;
|
|
4723
|
+
},
|
|
4724
|
+
onPluginApplied: (event) => {
|
|
4725
|
+
const key = `${event.id}:${event.tokensCount}:${event.source}`;
|
|
4726
|
+
if (key === lastPluginThemeAppliedDebugKey) return;
|
|
4727
|
+
try {
|
|
4728
|
+
debug.log('tui.theme', 'plugin-theme-applied', event);
|
|
4729
|
+
lastPluginThemeAppliedDebugKey = key;
|
|
4730
|
+
} catch { /* observation is best-effort */ }
|
|
4731
|
+
},
|
|
4566
4732
|
onPluginError: (message) => {
|
|
4567
4733
|
if (lastThemeLoadError !== message) {
|
|
4568
4734
|
lastThemeLoadError = message;
|
|
@@ -6011,6 +6177,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6011
6177
|
}
|
|
6012
6178
|
};
|
|
6013
6179
|
const syncCompanionPopups = (): void => {
|
|
6180
|
+
// CLASSIC-IDLE-CLIPBOARD: every clipboard open/close/dock path ends here — keep it the only gate.
|
|
6181
|
+
noteClipboardPanelState(companionPopupHost.isActive('clipboard'), companionPopupHost.isDocked('clipboard') ? 'panel-docked' : companionPopupHost.isOpen('clipboard') ? 'panel-open' : 'panel-close');
|
|
6014
6182
|
const { cols, rows } = termSize();
|
|
6015
6183
|
const workspaceHost = display.workspaceHostAPI();
|
|
6016
6184
|
const ownerId = companionPopupHost.ownerId;
|
|
@@ -6530,7 +6698,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6530
6698
|
});
|
|
6531
6699
|
let clarificationModalId: string | null = null;
|
|
6532
6700
|
|
|
6533
|
-
|
|
6701
|
+
// `turnEnd: false` — a phase inside a turn (skill-route detection) that attaches the same keys: its teardown is
|
|
6702
|
+
// not a turn end (TUI-ORPHAN-AUTO-RESUME-STOP E4 · 10-23: it reset seat-autowake's orphan-400 streak every turn).
|
|
6703
|
+
const attachChatStreamingKeys = (abortCtrl: AbortController, phase: { turnEnd?: boolean } = {}): () => void => {
|
|
6534
6704
|
const chatLinesStartIndex = chatLines.length;
|
|
6535
6705
|
userScrolledDuringStream = false;
|
|
6536
6706
|
const SCROLL_KEYS = new Set(['j', 'k', 'down', 'up', 'pageup', 'pagedown', 'home', 'end', 'g', 'G']);
|
|
@@ -6540,8 +6710,20 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6540
6710
|
// so the user can make an informed call.
|
|
6541
6711
|
let abortGateModalId: string | null = null;
|
|
6542
6712
|
const showHarnessEscHint = createHarnessEscHint((line) => pushChatLine(line));
|
|
6543
|
-
let stoppedHarnessSpace: string | null = null;
|
|
6544
6713
|
const activeHarnessSpace = (): string | null => activeEscHarnessSpace(escAbortToolState, escHarnessSpacesByCallId);
|
|
6714
|
+
// ⭐ TUI-ESC-EXIT — `createEscAbortPendingGate` is the production
|
|
6715
|
+
// onAbortPending/onAbortRepeat seam shared with the incident test in
|
|
6716
|
+
// test/esc-harness-stop.test.ts; `runEscAbortPendingSoftStop` remains the
|
|
6717
|
+
// production soft-stop callback. The gate keeps an earlier successful
|
|
6718
|
+
// stopped space across later waiting/hint/failed callbacks.
|
|
6719
|
+
const escAbortPendingGate = createEscAbortPendingGate({
|
|
6720
|
+
runSoftStop: runEscAbortPendingSoftStop,
|
|
6721
|
+
formatWaitingTargets: formatEscAbortWaitingTargets,
|
|
6722
|
+
getActiveHarnessSpace: activeHarnessSpace,
|
|
6723
|
+
pushChatLine: (line) => pushChatLine(line),
|
|
6724
|
+
showHarnessEscHint,
|
|
6725
|
+
afterAbortEvent: () => { chatScrollOffset = -1; },
|
|
6726
|
+
});
|
|
6545
6727
|
const escGate = createEscAbortGate({
|
|
6546
6728
|
abortCtrl,
|
|
6547
6729
|
getRunningCount: () => getEscAbortRunningCount(escAbortToolState),
|
|
@@ -6556,28 +6738,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6556
6738
|
getTheme: () => currentThemeTokens(),
|
|
6557
6739
|
getWaitingTargetNames: () => getEscAbortWaitingToolNames(escAbortToolState),
|
|
6558
6740
|
shouldAbortImmediately: () => activeHarnessSpace() !== null,
|
|
6559
|
-
|
|
6560
|
-
|
|
6561
|
-
|
|
6562
|
-
|
|
6563
|
-
|
|
6564
|
-
if (readSoftStopRequestStatus(spaceId).status !== 'present') throw new Error('soft-stop marker not persisted');
|
|
6565
|
-
stoppedHarnessSpace = spaceId;
|
|
6566
|
-
pushChatLine(' ⏹ 멈췄다 — 해당 하니스 런에 중단 요청을 보냈습니다.');
|
|
6567
|
-
} catch {
|
|
6568
|
-
pushChatLine(' ⚠ 하니스 런 중단 요청을 보내지 못했습니다. /harness runs 에서 확인해 주세요.');
|
|
6569
|
-
}
|
|
6570
|
-
} else if (!showHarnessEscHint(targets)) {
|
|
6571
|
-
pushChatLine(` ⏳ 중단 요청됨 — ${formatEscAbortWaitingTargets(targets)} 종료를 기다리는 중입니다.`);
|
|
6572
|
-
}
|
|
6573
|
-
chatScrollOffset = -1;
|
|
6574
|
-
},
|
|
6575
|
-
onAbortRepeat: ({ repeat, targets }) => {
|
|
6576
|
-
if (!stoppedHarnessSpace && !showHarnessEscHint(targets)) {
|
|
6577
|
-
pushChatLine(` ⏳ ESC 재시도 ${repeat}회 — ${formatEscAbortWaitingTargets(targets)} 종료를 기다리는 중입니다.`);
|
|
6578
|
-
}
|
|
6579
|
-
chatScrollOffset = -1;
|
|
6580
|
-
},
|
|
6741
|
+
// ⭐ TUI-ESC-EXIT — `runEscAbortPendingSoftStop` is the production
|
|
6742
|
+
// soft-stop callback seam; the incident test in
|
|
6743
|
+
// test/esc-harness-stop.test.ts exercises this same function.
|
|
6744
|
+
onAbortPending: escAbortPendingGate.onAbortPending,
|
|
6745
|
+
onAbortRepeat: escAbortPendingGate.onAbortRepeat,
|
|
6581
6746
|
// ⭐⭐⭐ 턴을 멈추기 «전»에 살아남을 자식을 백그라운드 라우팅으로 넘긴다(`R4a` · 2026-08-19).
|
|
6582
6747
|
// ⛔ 없으면 `R1` 이후 자식이 «고아»가 된다 — 살아 있는데 완료를 실어 나를 채널이 없다
|
|
6583
6748
|
// (`task-notification` 은 background 만 본다 · 부모 툴 루프는 턴과 함께 사라졌다).
|
|
@@ -6822,6 +6987,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
6822
6987
|
const r = applyDashboardStreamingTypeaheadKey(turnTypeaheadRef.state, k, isStreamingImmediateSlash);
|
|
6823
6988
|
if (r.consumed) {
|
|
6824
6989
|
turnTypeaheadRef.state = r.state;
|
|
6990
|
+
// TUI-PASTE-WHILE-STREAMING — 턴 중 붙여넣기를 버퍼가 받았다(종전엔 조용히 버려졌다).
|
|
6991
|
+
if (r.pasted) { try { debug.log('tui.paste', r.pasted.folded ? 'folded' : 'kept', { during: 'streaming', lines: r.pasted.lines, chars: r.pasted.chars }); } catch { /* fail-soft */ } }
|
|
6825
6992
|
if (r.submissionDisposition) {
|
|
6826
6993
|
debug.log('dashboard.turn-typeahead', 'submission-classified', {
|
|
6827
6994
|
length: (r.immediateSubmission ?? turnTypeaheadRef.state.queuedSubmissions.at(-1))?.length ?? 0,
|
|
@@ -7011,6 +7178,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7011
7178
|
};
|
|
7012
7179
|
|
|
7013
7180
|
const cleanup = attachStreamingKeys(async (key) => {
|
|
7181
|
+
noteClipboardActivity();
|
|
7014
7182
|
// ── Pre-dispatch gates ────────────────────────────────────
|
|
7015
7183
|
//
|
|
7016
7184
|
// These run BEFORE `routeInputEventAsync` because:
|
|
@@ -7108,6 +7276,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7108
7276
|
// ⛔ TUI-STALE-BUSY-MARKER — busy 는 «끄는 closure 를 돌려주기 직전»에 켠다. 위 준비(ESC 게이트·키 리스너)가
|
|
7109
7277
|
// 던지면 호출자는 cleanup 을 못 받으므로, 먼저 켜 두면 아무도 못 끄는 busy 가 남는다(#37).
|
|
7110
7278
|
streamingInFlight = true;
|
|
7279
|
+
noteClipboardBusyChange();
|
|
7111
7280
|
reportTuiTurn('busy');
|
|
7112
7281
|
const externalStop = (): void => { stopTurnViaEscGate(escGate); };
|
|
7113
7282
|
currentTurnExternalStop = externalStop;
|
|
@@ -7117,7 +7286,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7117
7286
|
runTurnTeardownStep('stream-keys-detach', cleanup);
|
|
7118
7287
|
runTurnTeardownStep('esc-gate-dispose', () => { escGate.dispose(); });
|
|
7119
7288
|
try {
|
|
7120
|
-
if (!
|
|
7289
|
+
if (!escAbortPendingGate.getStoppedHarnessSpace()) settleEscAbortPendingLines(chatLines, chatLinesStartIndex);
|
|
7121
7290
|
} catch (err) {
|
|
7122
7291
|
const message = err instanceof Error ? err.message : String(err);
|
|
7123
7292
|
const stackHead = err instanceof Error ? err.stack?.split('\n')[1]?.trim() : undefined;
|
|
@@ -7126,10 +7295,22 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7126
7295
|
} finally {
|
|
7127
7296
|
userScrolledDuringStream = false;
|
|
7128
7297
|
streamingInFlight = false;
|
|
7298
|
+
noteClipboardBusyChange();
|
|
7129
7299
|
reportTuiTurn('idle');
|
|
7130
7300
|
const failedTurnRaw = autowakeTurnFailureRaw;
|
|
7131
7301
|
autowakeTurnFailureRaw = null;
|
|
7132
|
-
seatAutowake.noteTurnEnded({ sessionId: currentChatPersonaSessionId(), lastLine: chatLines.at(-1) ?? '', errorDetail: failedTurnRaw ?? undefined });
|
|
7302
|
+
if (phase.turnEnd !== false) seatAutowake.noteTurnEnded({ sessionId: currentChatPersonaSessionId(), lastLine: chatLines.at(-1) ?? '', errorDetail: failedTurnRaw ?? undefined });
|
|
7303
|
+
try {
|
|
7304
|
+
// «이번 턴»이 그린 줄만 본다 — 앞 턴의 ✘·취소 표시가 이번 턴 판정에 새지 않게(r1 must-fix).
|
|
7305
|
+
const turnLines = chatLines.slice(chatLinesStartIndex);
|
|
7306
|
+
const tailLines = turnLines.slice(-16);
|
|
7307
|
+
// 실패(✘)·취소로 끝난 턴은 이어가지 않는다 — 사람이 판단할 자리다.
|
|
7308
|
+
const failed = failedTurnRaw !== null || turnLines.some((line) => /✘ 실패|응답 취소|취소됨/.test(line));
|
|
7309
|
+
// 마지막 답 블록만 — 스트림 applier 의 assistantStart(이번 턴 범위 안일 때). 도구 줄은 그 앞에 남는다.
|
|
7310
|
+
const replyStart = latestTurnReplyStart();
|
|
7311
|
+
goalInterimFold.noteTurnEnded(chatLines, replyStart !== null && replyStart >= chatLinesStartIndex ? replyStart : chatLines.length);
|
|
7312
|
+
goalContinue.noteTurnEnded({ lines: tailLines, failed });
|
|
7313
|
+
} catch { /* fail-soft: 골 이어가기는 턴 정리를 막지 않는다 */ }
|
|
7133
7314
|
}
|
|
7134
7315
|
};
|
|
7135
7316
|
};
|
|
@@ -7196,6 +7377,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7196
7377
|
const dashboardAcpChat = new DashboardAcpChat({
|
|
7197
7378
|
cwd: () => workingDir.cwd,
|
|
7198
7379
|
log: (msg) => pushLog('debug', ` [acp] ${msg}`),
|
|
7380
|
+
onBusyChange: () => noteClipboardBusyChange(),
|
|
7199
7381
|
// Follow-up #9 — wrap the modal approver so BG records flip to
|
|
7200
7382
|
// `waiting_for_confirmation` even when the peer (codex-acp /
|
|
7201
7383
|
// gemini-cli) doesn't emit the `tool_call_update.status` field.
|
|
@@ -7205,6 +7387,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
7205
7387
|
globalBackgroundManager(),
|
|
7206
7388
|
),
|
|
7207
7389
|
});
|
|
7390
|
+
dashboardAcpIsBusy = () => dashboardAcpChat.isBusy();
|
|
7208
7391
|
activeAcpRuntimeModel = () => dashboardAcpChat.activeRuntimeModel();
|
|
7209
7392
|
|
|
7210
7393
|
// Obsidian vault browser (Phase O3). Shares the FsEntry shape and
|
|
@@ -11495,8 +11678,16 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
11495
11678
|
const frameCursorDecision = display.cursorDecision();
|
|
11496
11679
|
renderDashboardFrame(baseLines, composeDashboardFrameWithCoordinatorModal(display, {
|
|
11497
11680
|
onFrameWriteComplete: firstDashboardFrameRendered ? undefined : (error) => {
|
|
11498
|
-
if (
|
|
11681
|
+
if (firstDashboardFrameRendered) return;
|
|
11682
|
+
// TUI-BOOT-TIMING-HOLES — 셋업 창은 «첫 프레임 flush 완료» 에 닫는다(진입~flush).
|
|
11683
|
+
// 실패한 flush 도 창을 닫아 신호가 영영 오지 않는 일을 막는다(재시도 의미론은 그대로:
|
|
11684
|
+
// 첫 프레임 신호는 다음 성공 flush 가 낸다).
|
|
11685
|
+
if (error) {
|
|
11686
|
+
syncSetupWindow.finish();
|
|
11687
|
+
return;
|
|
11688
|
+
}
|
|
11499
11689
|
firstDashboardFrameRendered = true;
|
|
11690
|
+
syncSetupWindow.finish();
|
|
11500
11691
|
try { opts.onFirstFrameRendered?.(); } catch { /* timing must not break dashboard */ }
|
|
11501
11692
|
},
|
|
11502
11693
|
overlay: modalFrame,
|
|
@@ -12358,7 +12549,17 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
12358
12549
|
// ticks every ~1.5s on Darwin and stores up to 50 unique text
|
|
12359
12550
|
// snapshots. Stopped during dashboard teardown to avoid leaking
|
|
12360
12551
|
// intervals if the host re-enters showDashboard.
|
|
12361
|
-
|
|
12552
|
+
// CLASSIC-IDLE-CLIPBOARD: dormant until the clipboard companion is open.
|
|
12553
|
+
const clipHistory: ClipboardHistory = startClipboardHistory({
|
|
12554
|
+
active: companionPopupHost.isActive('clipboard'),
|
|
12555
|
+
isBusy: () => streamingInFlight || dashboardAcpChat.isBusy(),
|
|
12556
|
+
});
|
|
12557
|
+
noteClipboardPanelState = (active, reason) => clipHistory.setActive(active, reason);
|
|
12558
|
+
noteClipboardActivity = () => {
|
|
12559
|
+
lastDashboardInputAt = Date.now();
|
|
12560
|
+
clipHistory.noteActivity();
|
|
12561
|
+
};
|
|
12562
|
+
noteClipboardBusyChange = () => clipHistory.noteBusyChange();
|
|
12362
12563
|
process.once('beforeExit', () => { clipHistory.stop(); });
|
|
12363
12564
|
// Re-render whenever the poller picks up a new entry — only when
|
|
12364
12565
|
// we're actually showing the history viewer, otherwise the side-
|
|
@@ -13067,7 +13268,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
13067
13268
|
// 채팅 한 줄 «✓ 위임 끝: <이름> — 다음 턴에 결과» · 결과는 다음 턴 preamble 이 싣는다.
|
|
13068
13269
|
// ⛔ 입력칸·injectKey·pty 주입 0(대표 비침투). dedupe·수명은 모듈, 여기선 배선만.
|
|
13069
13270
|
const agentWake = installAgentWake({
|
|
13070
|
-
subscribe: (listener) =>
|
|
13271
|
+
subscribe: (listener) => subscribeDashboardAgentResults(
|
|
13272
|
+
globalTaskNotificationQueue, listener, (line) => { pushChatLine(C.muted(line)); draw(); },
|
|
13273
|
+
),
|
|
13071
13274
|
// 그리기 실패는 삼키지 않는다 — 모듈이 잡아 notified{shown:false} 로 남긴다.
|
|
13072
13275
|
notify: createDashboardAgentWakeNotify((line) => { chatLines.push(C.muted(line)); }, () => draw()),
|
|
13073
13276
|
// 조각 2 — 자리 TUI ∧ 유휴면 H2 문으로 다음 턴(origin child-complete) · 판정은 모듈.
|
|
@@ -14774,7 +14977,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
14774
14977
|
let acpDispatchToolSelf: CoreTurnDispatchTool | null = null;
|
|
14775
14978
|
let acpToolDispatchCount = 0;
|
|
14776
14979
|
const trMod = await import('../tool-runtime/index.js');
|
|
14777
|
-
trMod.registerAllDefaultToolRuntimes();
|
|
14980
|
+
trMod.registerAllDefaultToolRuntimes({ mcpLazyBoot: true });
|
|
14778
14981
|
acpToolRuntime = trMod;
|
|
14779
14982
|
acpPersistToolOutputPreview = (
|
|
14780
14983
|
await import('../tool-runtime/truncation-store.js')
|
|
@@ -15160,6 +15363,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
15160
15363
|
const key: import('../tui.js').Key = wdAutoInput
|
|
15161
15364
|
? { name: CHAT_MAIN_AUTO_ENTRY_KEY_NAME, ctrl: false, shift: false }
|
|
15162
15365
|
: await readKey();
|
|
15366
|
+
if (!wdAutoInput) { noteClipboardActivity(); gitIdlePoll.noteActivity('input'); }
|
|
15163
15367
|
const helpModal = currentTransientTerminalModal('dashboard-help');
|
|
15164
15368
|
if (key.name === 'escape' && helpModal) {
|
|
15165
15369
|
helpModal.dispose();
|
|
@@ -16172,6 +16376,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16172
16376
|
// those tokens into the initial buffer so the user can just type
|
|
16173
16377
|
// their question next to the pre-filled [PDF #N] tokens.
|
|
16174
16378
|
let nextInitial: string | undefined = inputEntry.initialText;
|
|
16379
|
+
// TUI-PASTE-WHILE-STREAMING — 턴 중 접은 붙여넣기 토큰의 원문(넘김 입력창이 넘겨받는다 · 글에 토큰이 없으면 버린다).
|
|
16380
|
+
let nextInitialPastes: Array<[string, string]> = [];
|
|
16175
16381
|
let exitInputLoop = false;
|
|
16176
16382
|
let lastTurnFinalStatus: 'completed' | 'interrupted' | 'failed' | undefined;
|
|
16177
16383
|
|
|
@@ -16203,6 +16409,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16203
16409
|
});
|
|
16204
16410
|
lastTurnFinalStatus = undefined;
|
|
16205
16411
|
nextInitial = drained.nextInitial;
|
|
16412
|
+
nextInitialPastes = [...nextInitialPastes, ...(drained.initialPastes ?? [])].filter(([token]) => nextInitial?.includes(token));
|
|
16206
16413
|
const queuedTurnEndText = drained.injectEnter ? drained.nextInitial : undefined;
|
|
16207
16414
|
if (interrupted && queuedBeforeDrain > 0) {
|
|
16208
16415
|
debug.log('dashboard.turn-typeahead', 'restored-after-interrupt', { count: queuedBeforeDrain });
|
|
@@ -16242,6 +16449,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16242
16449
|
debugLog: debug.enabled ? (event, label, payload) => debug.log(event, label, payload) : undefined,
|
|
16243
16450
|
textInputOpts: {
|
|
16244
16451
|
internalTurnYield: internalTurnYieldPort,
|
|
16452
|
+
...(nextInitialPastes.length ? { initialPastes: nextInitialPastes } : {}),
|
|
16245
16453
|
onScrollKey: (name) => {
|
|
16246
16454
|
const { rows } = termSize();
|
|
16247
16455
|
const viewport = computePromptFrameLogViewportBounds(
|
|
@@ -16740,7 +16948,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
16740
16948
|
|
|
16741
16949
|
// Save to durable input history. Up/down reads the in-memory
|
|
16742
16950
|
// tail, while slash/LLM tools can search the full store.
|
|
16743
|
-
if (!internalTurn) internalTurnGate.noteHumanTurn();
|
|
16951
|
+
if (!internalTurn) { internalTurnGate.noteHumanTurn(); goalContinue.noteHumanTurn(); goalInterimFold.noteHumanTurn(); }
|
|
16744
16952
|
if (postTurn.historyRecord && !internalTurn) {
|
|
16745
16953
|
inputHistoryStore.record(postTurn.historyRecord);
|
|
16746
16954
|
refreshInputHistory();
|
|
@@ -17645,18 +17853,14 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
17645
17853
|
setWorkingFocusPreview: () => { setWorkingFocus('preview', 'slash-term-move-preview'); },
|
|
17646
17854
|
nextTerminalVwSlotId: (terminalId) => `term-slot:${terminalId}`,
|
|
17647
17855
|
},
|
|
17648
|
-
// TUI-LOOP-COMMAND —
|
|
17649
|
-
//
|
|
17650
|
-
// idle/busy 신호는 대시보드 루프가 이미 쓰는 것을 그대로 쓴다 —
|
|
17651
|
-
// 스트리밍 턴(streamingInFlight · reportTuiTurn busy/idle) +
|
|
17652
|
-
// ACP 세션 바쁨(dashboardAcpChat.isBusy()). 프롬프트 제출은
|
|
17653
|
-
// 플러그인 submitDashboardText 와 같은 기존 제출 틈
|
|
17654
|
-
// (dispatchDashboardSubmitText)으로 낸다 — 새 제출 경로를 만들지 않는다.
|
|
17856
|
+
// TUI-LOOP-COMMAND — the scheduler ticks; H2 alone judges whether
|
|
17857
|
+
// an internal turn can open. A rejection waits for the next tick.
|
|
17655
17858
|
loopCommand: {
|
|
17656
|
-
isIdle: () =>
|
|
17859
|
+
isIdle: () => true,
|
|
17657
17860
|
submitPrompt: (prompt: string) => {
|
|
17658
|
-
|
|
17659
|
-
|
|
17861
|
+
const result = internalTurnGate.startTurnIfIdle(prompt, { origin: 'scheduled', reason: '/loop' });
|
|
17862
|
+
if (result.opened) debug.log('dashboard.loop', 'fired', { turnId: result.turnId });
|
|
17863
|
+
else debug.log('dashboard.loop', 'rejected', { reason: result.reason });
|
|
17660
17864
|
},
|
|
17661
17865
|
schedulerRef: dashboardLoopSchedulerRef,
|
|
17662
17866
|
},
|
|
@@ -18108,6 +18312,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18108
18312
|
// array but doesn't paint until after the skill router's
|
|
18109
18313
|
// classifier LLM call returns (~1-2s of visual silence).
|
|
18110
18314
|
if (internalTurn) {
|
|
18315
|
+
try { goalInterimFold.foldBeforeInternalTurn(chatLines, internalTurn.origin, C.muted); } catch { /* fail-soft: 접기는 턴을 막지 않는다 */ }
|
|
18111
18316
|
chatLines.push(C.muted(` ${formatInternalTurnBanner(internalTurn)}`));
|
|
18112
18317
|
chatScrollOffset = -1;
|
|
18113
18318
|
} else {
|
|
@@ -18153,6 +18358,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18153
18358
|
// through to keyword routing in those cases.
|
|
18154
18359
|
{
|
|
18155
18360
|
const urlDec = detectUrlRoute(tok.text, getUserConfig().skills.urlRouting);
|
|
18361
|
+
const urlGuard = urlDec ? null : workContextGuardReason(tok.text);
|
|
18362
|
+
if (urlGuard && extractUrls(tok.text).length > 0) {
|
|
18363
|
+
debug.log('skill.router', 'url-route-guarded', { reason: urlGuard, textLength: tok.text.length });
|
|
18364
|
+
}
|
|
18156
18365
|
if (urlDec) {
|
|
18157
18366
|
debug.log('skill.router', 'url-route', {
|
|
18158
18367
|
kind: urlDec.kind, skill: urlDec.skill, absorb: urlDec.absorb,
|
|
@@ -18204,7 +18413,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18204
18413
|
const detectTier = getModelTier(getUserConfig().llm.provider, getUserConfig().llm.model);
|
|
18205
18414
|
const routeStartedAt = Date.now();
|
|
18206
18415
|
const route = await runAbortableDashboardSkillRoute({
|
|
18207
|
-
attachKeys: attachChatStreamingKeys,
|
|
18416
|
+
attachKeys: (ctrl: AbortController) => attachChatStreamingKeys(ctrl, { turnEnd: false }),
|
|
18208
18417
|
detect: (signal) => detectDashboardSkillRoute(tok.text, visibleIndex, {
|
|
18209
18418
|
llmFallback: userCfg.llmFallback,
|
|
18210
18419
|
keywordScoreThreshold: userCfg.keywordScoreThreshold,
|
|
@@ -18469,7 +18678,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18469
18678
|
return buildDashboardOptionalToolSpecs({
|
|
18470
18679
|
userConfig: uc,
|
|
18471
18680
|
termSize,
|
|
18472
|
-
registerAllDefaultToolRuntimes: () => { toolRuntime.registerAllDefaultToolRuntimes(); },
|
|
18681
|
+
registerAllDefaultToolRuntimes: () => { toolRuntime.registerAllDefaultToolRuntimes({ mcpLazyBoot: true }); },
|
|
18473
18682
|
setTerminalModalRuntimeDeps: (deps) => { toolRuntime.setTerminalModalRuntimeDeps(deps); },
|
|
18474
18683
|
...buildDefaultDashboardToolBuilders(),
|
|
18475
18684
|
}) as unknown[];
|
|
@@ -18516,6 +18725,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18516
18725
|
renderedToolRuntime,
|
|
18517
18726
|
brainIcon: ICONS.brain,
|
|
18518
18727
|
});
|
|
18728
|
+
latestTurnStream = turnStreamRuntime;
|
|
18519
18729
|
return {
|
|
18520
18730
|
...turnStreamRuntime,
|
|
18521
18731
|
onText: (chunk, accumulated) => {
|
|
@@ -18574,6 +18784,17 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
|
|
|
18574
18784
|
},
|
|
18575
18785
|
resetAcpTurnRef: () => resetDashboardAcpTurnRef(acpTurnRef),
|
|
18576
18786
|
acpSession: dashboardAcpSession,
|
|
18787
|
+
// TUI-400-AUTOHEAL-FALLBACK(대표 10-22) — 400(대화 기록 어긋남)이면 ① 새 세션 ⊕ 요약 ② 다음 공급자로 스스로 회복.
|
|
18788
|
+
autoheal: createDashboardTurnAutoheal({
|
|
18789
|
+
session: dashboardAcpSession,
|
|
18790
|
+
getCwd: getSessionCwd,
|
|
18791
|
+
onRenewed: (sessionId) => {
|
|
18792
|
+
acpSessionIdRef.current = sessionId;
|
|
18793
|
+
observeSessionStart({ surface: 'tui', origin: 'new', reason: 'autoheal-400', sessionId });
|
|
18794
|
+
},
|
|
18795
|
+
remote: daemonAttached,
|
|
18796
|
+
activeModel: () => resolveDashboardActiveModel(tok.text) ?? undefined,
|
|
18797
|
+
}),
|
|
18577
18798
|
control: {
|
|
18578
18799
|
signalBus: dashboardControlSignals,
|
|
18579
18800
|
},
|