elanous 0.2.35 → 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/{d06f9160.a3d9062f95de8ad7.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/{4346.8601952e73bf5803.js → 1201.afbfc5b1c5e5cbe4.js} +1 -1
- 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/{3103.0df8da390948bb84.js → 2500.cbc1257b774aae52.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7644.17e37ba6f1d4226e.js → 2683.c9773a0c589b031b.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{4718-17d2af636796a330.js → 275-02ea4c2a33980422.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/2812ca6a.3b9f4a7a08885744.js +1 -0
- package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8714.ff0b7ce3ec3e3ae2.js → 2941.3c3546f96bc6efa7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{9214.63a510d39178e997.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/3136.30aaaa5fa03662a3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3677-4215f826f6aa68e5.js → 3148-98efd4869d660a87.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +226 -0
- 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/3324.a09703033abcbd2f.js +34 -0
- 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/3538.a445e50bb359d068.js +32 -0
- 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/{9512.5a76207a730e0491.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/{8557-e7898769499cd56f.js → 3757-180308bc61021b05.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +74 -0
- package/apps/pwa/out/_next/static/chunks/{359-2250789a2d3499e7.js → 3840-5825d56d46976a92.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{da5176c6.6773b6c5994e1d99.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/{9952.5daf5f94063a2b3e.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/{938.66ad1ef0e5abae1c.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/5085-bce4904931767ca6.js +1 -0
- 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/{6236.e18cced2d5ba6afb.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/{3408.21d1570602f4b6c0.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/5711.957b095705c12560.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1530.0e612369b6fd7ea0.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/599.c39c571b6733f2a2.js +41 -0
- 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/6925.562d532110879886.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7385.50a308a477bdfc21.js → 6943.c6b24124853a47b2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{630.fe5a46428d63b013.js → 727.7deb87749b0a343a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2018.a741297bce759490.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/{8444.4c26b379ca2b9596.js → 771.c3cdb6c1f7f47c02.js} +17 -17
- 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/{3589.5444a06bcf6e775c.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/{b2f6ba4d.fb56fdbbf798df33.js → 873d6c12.09bd499f57171543.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5101.e32282718f99ed6f.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/{5637.281e5dec4ea6ecf1.js → 914.8abefd48d579547b.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4705-194e64e47ca0fbdb.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/{8637.47f5b35afcae5e6b.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/{1674.2a65fd5668e1cc5f.js → 9789.60f723d18097ec30.js} +1 -1
- 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-083747f1d4518f61.js +1 -0
- 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/{0368f25d-ad84af92fefee68f.js → ccae1c4b-0cf414f5eff1b10d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{cbe38a15.5a032598e39970c6.js → ceba0382.650712b56b85b582.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{b6705a4f-b9a9047de9eecfd0.js → da5ecc5c-b005ad8cac737d57.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{56d372f2.681ab4ec4c998fae.js → f9a61e4d.1fc2c1dbdd49fe46.js} +1 -1
- 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/{T1mBQqmkwKDLGtyisDCOd → 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/docs/goal-context/05-authoring-lessons.jsonl +47 -0
- package/docs/goal-context/README.md +3 -0
- package/graphs/default-loop.yaml +6 -1
- package/graphs/implement-loop.yaml +24 -0
- package/graphs/release/recipes.yaml +6 -0
- package/graphs/release/release-loop.yaml +17 -4
- 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 +1 -1
- package/scripts/first10-gate.ts +416 -0
- package/scripts/fleet/wsl-node-setup.sh +432 -0
- package/scripts/release-loop/docs-node.ts +204 -8
- package/scripts/release-loop/gate-node.ts +249 -53
- package/scripts/release-loop/node-verdict.ts +2 -0
- package/scripts/release-loop/resume-cap.ts +14 -34
- package/scripts/release-loop/resume-release.ts +37 -11
- package/scripts/release-loop/traffic-node.ts +59 -0
- package/scripts/release-loop/traffic-transition.ts +159 -0
- package/scripts/rhythm/daily.ts +137 -3
- package/scripts/ux-sim.ts +53 -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/task-notification.ts +56 -10
- package/src/agent/types.ts +4 -0
- package/src/agent-substrate/pr-reviewer.ts +55 -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 +168 -16
- package/src/autopilot/mission-codebase-gate.ts +141 -12
- package/src/autopilot/pr-manager.ts +25 -5
- package/src/boot/daemon-tools/self-implement.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 -4
- package/src/chat/internal-turn-origin.ts +1 -0
- package/src/chat/paste-fold.ts +86 -0
- 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/config-audit.ts +119 -0
- package/src/cli/doctor-cli.ts +22 -0
- package/src/cli/guardian-cli.ts +10 -0
- package/src/cli/herdr-cli.ts +34 -0
- package/src/cli/light-entry-route.ts +6 -3
- 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/pr-cli.ts +29 -16
- 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-recovery.ts +117 -1
- package/src/cli/pty-takeover-cli.ts +8 -7
- package/src/cli/release-cli.ts +21 -5
- package/src/cli/release-single-flight.ts +1 -1
- package/src/cli/tasks-card-show.ts +162 -0
- package/src/cli/tasks-cli.ts +574 -356
- package/src/cli/tasks-read-cli.ts +197 -0
- 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/context/keys.ts +8 -31
- package/src/dashboard/index.ts +202 -49
- 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/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/standalone-log-sink.ts +15 -2
- package/src/esc-abort-gate.ts +69 -0
- package/src/git-fs/worktree.ts +95 -1
- package/src/graph-runner/graph-cli.ts +18 -0
- package/src/graph-runner/runner.ts +20 -11
- package/src/graph-wizard/generate.ts +108 -4
- package/src/graph-wizard/steps.ts +15 -0
- package/src/grounding/proactive-ground.ts +86 -0
- package/src/harness/control-inbox.ts +49 -1
- package/src/harness/harness-cli-command.ts +51 -7
- package/src/harness/harness-incidents.ts +52 -1
- 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/index.ts +327 -12
- package/src/input-core/context-key-runtime.ts +21 -0
- package/src/light-cli.ts +6 -1
- package/src/llm-wellformed.ts +70 -0
- package/src/llm.ts +35 -4
- 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/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/nexus/api/decisions-route.ts +38 -18
- package/src/nexus/api/graph-wizard-api.ts +20 -2
- package/src/nexus/boot/register-mcp-clients.ts +263 -38
- package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
- package/src/onboarding/first-run.ts +37 -6
- package/src/onboarding/web-first.ts +43 -11
- package/src/ops/overview-collect.ts +12 -6
- package/src/ops/overview.ts +3 -3
- package/src/persona/loader.ts +11 -0
- package/src/persona/types.ts +8 -0
- 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-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 +76 -4
- package/src/release-loop/rehearsal.ts +36 -20
- package/src/repl/index.ts +19 -1
- package/src/seat-loop/knowhow-lint.ts +1 -1
- package/src/self-dev/decompose-proposal.ts +172 -20
- package/src/self-dev/decompose.ts +61 -0
- package/src/self-dev/dev-cli.ts +37 -3
- package/src/self-dev/dev-pipeline.ts +8 -2
- package/src/self-dev/draft-triage-rules.ts +31 -0
- package/src/self-dev/glm-credential-guard.ts +77 -0
- package/src/self-dev/graph-journey-nodes.ts +1 -0
- package/src/self-dev/graph-journey-route.ts +12 -2
- package/src/self-dev/orchestrate-cli.ts +68 -3
- package/src/self-dev/orchestrate.ts +116 -17
- package/src/self-dev/run-supervisor.ts +55 -2
- package/src/self-dev/run-types.ts +1 -1
- package/src/self-health/autoheal.ts +153 -0
- package/src/self-health/signatures.ts +6 -0
- package/src/self-implement/device-first.ts +116 -0
- package/src/self-implement/doctor-visit.ts +239 -1
- package/src/self-implement/evidence-command-budget.ts +80 -0
- package/src/self-implement/goal-author-cli.ts +1 -0
- package/src/self-implement/goal-author-decompose.ts +265 -4
- package/src/self-implement/goal-author.ts +33 -8
- package/src/self-implement/goal-elaborate.ts +176 -22
- package/src/self-implement/goal-refine.ts +3 -0
- 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 +222 -21
- 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-policy.ts +30 -0
- package/src/self-implement/run-ledger.ts +108 -0
- package/src/self-implement/run-ttl.ts +38 -24
- package/src/self-implement/scope-adjacency.ts +3 -1
- package/src/self-implement/seams.ts +60 -4
- package/src/self-implement/wiring-check.ts +358 -0
- package/src/shell-env-bootstrap.ts +11 -4
- package/src/skills/runner.ts +4 -2
- package/src/skills/tools/agent.ts +290 -48
- 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/rejudge-tick.ts +10 -2
- package/src/steward/ta-repair-event-collect.ts +17 -6
- package/src/task-agent/actions.ts +3 -1
- package/src/task-agent/land-queue.ts +21 -8
- package/src/task-agent/live-moves.ts +22 -6
- package/src/task-agent/mission.ts +30 -0
- 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 +41 -3
- package/src/task-agent/task-card-prefix.ts +2 -0
- package/src/task-agent/task-hand.ts +477 -22
- package/src/task-agent/task-parent-role-llm.ts +36 -0
- package/src/task-agent/tier-split.ts +78 -9
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +9 -0
- package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +86 -5
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
- package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +11 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +76 -4
- package/src/task-orchestrator/surfaces/pod-provenance.ts +8 -2
- 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-warm-worker-protocol.ts +4 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +485 -36
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +396 -19
- package/src/task-orchestrator/surfaces/self-implement.ts +42 -2
- package/src/tool-runtime/index.ts +15 -2
- package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
- package/src/tty-foreground.ts +155 -0
- package/src/tui/chat/goal-interim.ts +173 -0
- package/src/tui/chat/log-view.ts +205 -18
- package/src/tui/chat/self-health-status.ts +232 -0
- package/src/tui/entry.ts +370 -81
- package/src/tui/input/composer.ts +8 -1
- package/src/tui/slash/compact-command.ts +7 -0
- package/src/tui/slash/compact.ts +1 -7
- package/src/tui/slash/resume.ts +75 -0
- package/src/tui-client/local-chat-turn.ts +45 -2
- 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/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 +3 -2
- package/src/ux-sim/fake-bin.ts +45 -0
- 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 +102 -1
- package/src/ux-sim/fault-scope-escape-lift.ts +33 -6
- 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/1165.bad13fc9151a7288.js +0 -1
- package/apps/pwa/out/_next/static/chunks/13.02a07436dec15f89.js +0 -32
- package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +0 -41
- package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +0 -24
- package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +0 -74
- package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1993-c0007b7ad0c0ef41.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1c735de4.f993a30bbd3c57c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1dc5a567.9b092bfae3d7099b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +0 -148
- package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2625.5d870aa999f33db1.js +0 -34
- package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +0 -77
- package/apps/pwa/out/_next/static/chunks/2833-0fe47af99ed13c29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +0 -62
- package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +0 -90
- package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +0 -79
- package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3f7c4ee5.3dde54f01a816613.js +0 -122
- package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4441-875b97f5821ed58a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +0 -24
- package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5154.a118f3957ed14e36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +0 -23
- package/apps/pwa/out/_next/static/chunks/5483-dd5d7697f6bdb106.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5852.db1f7449f4f74612.js +0 -287
- package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +0 -1
- package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +0 -8
- package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +0 -93
- package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6866-79aa5b4e47cac6aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6b89c8bd.24df687a820500b3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +0 -149
- package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +0 -104
- package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8219.baa715d1deee80e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8256.e3ac8421a71f82f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8437-8d5492094b166cfa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +0 -226
- package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +0 -64
- package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +0 -115
- package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/967-2aa39b2d04b4c690.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-406b47745b53f269.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-26e6c18a1a750cf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-47c5d4db587266bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1f5a60f70cb4dd0c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-bac7dee94e5eae4a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-dc0a532f5b9196ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +0 -1
- /package/apps/pwa/out/_next/static/{T1mBQqmkwKDLGtyisDCOd → uC-N0emedeNOFuaBQFv-I}/_ssgManifest.js +0 -0
package/src/skills/runner.ts
CHANGED
|
@@ -171,7 +171,6 @@ import {
|
|
|
171
171
|
buildLlmRequestInstallTool,
|
|
172
172
|
dispatchLlmRequestInstall,
|
|
173
173
|
} from './tools/llm-install.js';
|
|
174
|
-
import { createInjectApprover } from '../dashboard/runtime/approvers.js';
|
|
175
174
|
import {
|
|
176
175
|
buildBrowserOpenTool,
|
|
177
176
|
buildBrowserNavigateTool,
|
|
@@ -1526,7 +1525,10 @@ async function executeSkillUnrecorded(
|
|
|
1526
1525
|
TerminalModalFocus: (a) => dispatchTerminalModalFocus(a),
|
|
1527
1526
|
TerminalModalDetach: (a) => dispatchTerminalModalDetach(a),
|
|
1528
1527
|
TerminalModalKill: (a) => dispatchTerminalModalKill(a),
|
|
1529
|
-
TerminalModalInject: (a) =>
|
|
1528
|
+
TerminalModalInject: async (a) => {
|
|
1529
|
+
const { createInjectApprover } = await import('../dashboard/runtime/approvers.js');
|
|
1530
|
+
return dispatchTerminalModalInject(a, { approver: createInjectApprover() });
|
|
1531
|
+
},
|
|
1530
1532
|
// H5 P2 · embodied-agent TTY observability.
|
|
1531
1533
|
SnapshotPtyState: (a) => dispatchSnapshotPtyState(a),
|
|
1532
1534
|
ListPtySnapshots: (a) => dispatchListPtySnapshots(a),
|
|
@@ -119,11 +119,121 @@ export function countSessionBackgroundFanout(session: object): number {
|
|
|
119
119
|
return backgroundFanoutSlots.get(session) ?? 0;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
/** Release one of this session's fan-out slots (floors at zero)
|
|
122
|
+
/** Release one of this session's fan-out slots (floors at zero) and hand the
|
|
123
|
+
* freed slot to the next waiting launch (see `admitNextBackgroundAdmission`). */
|
|
123
124
|
function releaseBackgroundFanoutSlot(session: object): void {
|
|
124
125
|
const live = backgroundFanoutSlots.get(session);
|
|
125
126
|
if (live === undefined || live <= 1) backgroundFanoutSlots.delete(session);
|
|
126
127
|
else backgroundFanoutSlots.set(session, live - 1);
|
|
128
|
+
admitNextBackgroundAdmission(session);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Admission class for a waiting background launch. A launch that names a
|
|
132
|
+
* concrete agent definition is a SUBAGENT spawn (the parent asked for a
|
|
133
|
+
* specific worker); the default general-purpose fan-out is a GENERAL worker.
|
|
134
|
+
* Subagent spawns enter the shared queue first because they carry the
|
|
135
|
+
* parent's explicit delegation intent — a general worker can be re-issued
|
|
136
|
+
* in the foreground at no cost, a named subagent cannot. */
|
|
137
|
+
export type BackgroundAdmissionPriority = 'subagent' | 'general';
|
|
138
|
+
|
|
139
|
+
/** A launch waiting for a fan-out slot. `seq` is the process-wide arrival
|
|
140
|
+
* ordinal; equal-priority entries are admitted oldest-first (FIFO). */
|
|
141
|
+
export interface BackgroundAdmissionEntry {
|
|
142
|
+
priority: BackgroundAdmissionPriority;
|
|
143
|
+
seq: number;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Pick the index of the next entry to admit from a waiting queue: subagent
|
|
147
|
+
* entries before general ones, oldest (`seq`) first inside a class.
|
|
148
|
+
* Returns -1 for an empty queue. Pure — the queue order itself never has to
|
|
149
|
+
* be pre-sorted. */
|
|
150
|
+
export function selectNextAdmissionIndex(
|
|
151
|
+
entries: readonly BackgroundAdmissionEntry[],
|
|
152
|
+
): number {
|
|
153
|
+
let oldestSubagent = -1;
|
|
154
|
+
let oldestAny = -1;
|
|
155
|
+
for (let i = 0; i < entries.length; i++) {
|
|
156
|
+
const entry = entries[i]!;
|
|
157
|
+
if (oldestAny === -1 || entry.seq < entries[oldestAny]!.seq) oldestAny = i;
|
|
158
|
+
if (
|
|
159
|
+
entry.priority === 'subagent'
|
|
160
|
+
&& (oldestSubagent === -1 || entry.seq < entries[oldestSubagent]!.seq)
|
|
161
|
+
) {
|
|
162
|
+
oldestSubagent = i;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return oldestSubagent >= 0 ? oldestSubagent : oldestAny;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** Classify a dispatch for admission priority (see BackgroundAdmissionPriority). */
|
|
169
|
+
export function classifyBackgroundAdmissionPriority(
|
|
170
|
+
requestedType: string,
|
|
171
|
+
): BackgroundAdmissionPriority {
|
|
172
|
+
return requestedType === 'general-purpose' ? 'general' : 'subagent';
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
interface QueuedBackgroundAdmission extends BackgroundAdmissionEntry {
|
|
176
|
+
admit: () => void;
|
|
177
|
+
abandon: () => void;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** The SHARED waiting queue, per session (same scope as the slot ledger, so
|
|
181
|
+
* a busy session's waiters cannot head-of-line block another session).
|
|
182
|
+
* Entries live only while the fan-out ceiling is full and their launch
|
|
183
|
+
* opted in with `wait_for_slot`; every other launch keeps the immediate
|
|
184
|
+
* `background-fanout-limit` refusal. */
|
|
185
|
+
const backgroundAdmissionQueues = new WeakMap<object, QueuedBackgroundAdmission[]>();
|
|
186
|
+
let backgroundAdmissionSeq = 0;
|
|
187
|
+
|
|
188
|
+
/** Park this launch on the session's shared queue and resolve `true` when it
|
|
189
|
+
* is admitted — the admitting release has ALREADY reserved the slot for it,
|
|
190
|
+
* so no dispatch can slip in between the handoff and the spawn. Resolves
|
|
191
|
+
* `false` when the caller's abort signal fires while it waits. */
|
|
192
|
+
function waitForBackgroundFanoutSlot(
|
|
193
|
+
session: object,
|
|
194
|
+
priority: BackgroundAdmissionPriority,
|
|
195
|
+
signal?: AbortSignal,
|
|
196
|
+
): Promise<boolean> {
|
|
197
|
+
if (signal?.aborted) return Promise.resolve(false);
|
|
198
|
+
return new Promise<boolean>((resolve) => {
|
|
199
|
+
let settled = false;
|
|
200
|
+
const entry: QueuedBackgroundAdmission = {
|
|
201
|
+
priority,
|
|
202
|
+
seq: backgroundAdmissionSeq++,
|
|
203
|
+
admit: () => finish(true),
|
|
204
|
+
abandon: () => finish(false),
|
|
205
|
+
};
|
|
206
|
+
// Always mutate the CURRENT queue (never a snapshot): entries settle out of
|
|
207
|
+
// order under priority admission, and writing back a stale array would
|
|
208
|
+
// resurrect an entry that was already admitted or abandoned.
|
|
209
|
+
function finish(admitted: boolean): void {
|
|
210
|
+
if (settled) return;
|
|
211
|
+
settled = true;
|
|
212
|
+
signal?.removeEventListener('abort', onAbort);
|
|
213
|
+
const rest = (backgroundAdmissionQueues.get(session) ?? []).filter(e => e !== entry);
|
|
214
|
+
if (rest.length > 0) backgroundAdmissionQueues.set(session, rest);
|
|
215
|
+
else backgroundAdmissionQueues.delete(session);
|
|
216
|
+
resolve(admitted);
|
|
217
|
+
}
|
|
218
|
+
const onAbort = (): void => { entry.abandon(); };
|
|
219
|
+
const queue = backgroundAdmissionQueues.get(session) ?? [];
|
|
220
|
+
queue.push(entry);
|
|
221
|
+
backgroundAdmissionQueues.set(session, queue);
|
|
222
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/** Admit exactly one waiter for a slot that just opened, reserving the slot
|
|
227
|
+
* in this same synchronous block as the release. Selection is delegated to
|
|
228
|
+
* the pure `selectNextAdmissionIndex` (subagent first, FIFO inside a class). */
|
|
229
|
+
function admitNextBackgroundAdmission(session: object): void {
|
|
230
|
+
const queue = backgroundAdmissionQueues.get(session);
|
|
231
|
+
if (!queue || queue.length === 0) return;
|
|
232
|
+
const index = selectNextAdmissionIndex(queue);
|
|
233
|
+
if (index < 0) return;
|
|
234
|
+
const entry = queue[index]!;
|
|
235
|
+
backgroundFanoutSlots.set(session, countSessionBackgroundFanout(session) + 1);
|
|
236
|
+
entry.admit();
|
|
127
237
|
}
|
|
128
238
|
|
|
129
239
|
/** Fallback agent when subagent_type is missing or unresolvable. The
|
|
@@ -161,6 +271,12 @@ export interface AgentToolArgs {
|
|
|
161
271
|
* child keeps running; completion emits a task-notification
|
|
162
272
|
* (P2) which the parent sees in the next turn's user message. */
|
|
163
273
|
run_in_background?: boolean;
|
|
274
|
+
/** When true, a background launch that hits the fan-out ceiling WAITS on
|
|
275
|
+
* the session's shared admission queue instead of being refused: it spawns
|
|
276
|
+
* as soon as a live background agent terminals (subagent waits are
|
|
277
|
+
* admitted before general-purpose ones, FIFO inside each class). Omitted
|
|
278
|
+
* or false keeps the immediate `background-fanout-limit` refusal. */
|
|
279
|
+
wait_for_slot?: boolean;
|
|
164
280
|
/** UI label for this spawn — shown on agent-roster so siblings
|
|
165
281
|
* sharing a definition are distinguishable. Takes precedence
|
|
166
282
|
* over `description` as task.label. */
|
|
@@ -230,6 +346,10 @@ export function buildAgentTool(): LLMToolSpec {
|
|
|
230
346
|
' • You want to fan out N independent workers in parallel — call Agent N times in the same turn; each runs independently.\n' +
|
|
231
347
|
' • A SKILL.md instructs you to "spawn N expert agents" / "use the Agent tool" — that is exactly this tool.\n' +
|
|
232
348
|
'\n' +
|
|
349
|
+
'Delegate heavy multistep work that would overflow your context, fan out independent units in parallel, ' +
|
|
350
|
+
'and hand off long investigations; use run_in_background for long-running work so you can keep coordinating ' +
|
|
351
|
+
'and finish after the results arrive.\n' +
|
|
352
|
+
'\n' +
|
|
233
353
|
'The sub-agent gets its own tools (Bash/Read/Edit/Grep/WebFetch by default) and its own ' +
|
|
234
354
|
'turn budget (default 20). It returns ONE final message which becomes your tool_result. ' +
|
|
235
355
|
'Pass everything the worker needs (data, persona, framing) inside `prompt` — the worker ' +
|
|
@@ -257,6 +377,10 @@ export function buildAgentTool(): LLMToolSpec {
|
|
|
257
377
|
type: 'boolean',
|
|
258
378
|
description: 'When true, returns the spawn handle immediately instead of waiting for completion. The child keeps running; its final message arrives in your next turn as a <task-notification> user message. Use for long-running explorations (multi-minute research, 10+ tool calls) so you can keep working in parallel.',
|
|
259
379
|
},
|
|
380
|
+
wait_for_slot: {
|
|
381
|
+
type: 'boolean',
|
|
382
|
+
description: 'Only meaningful with run_in_background. When the per-session background fan-out ceiling is already full, this launch waits on the shared admission queue instead of being refused, and spawns as soon as one live background agent finishes. Waiting subagent spawns (ones that name a subagent_type) are admitted before general-purpose ones; launches with the same class keep arrival order. Omit it to get the immediate "NOT SPAWNED" refusal and re-issue later.',
|
|
383
|
+
},
|
|
260
384
|
name: {
|
|
261
385
|
type: 'string',
|
|
262
386
|
description: 'Optional UI label for this spawn (shown in agent-roster / logs). Useful when fanning out N workers with the same subagent_type — give each a distinct name so the roster can tell them apart.',
|
|
@@ -277,12 +401,12 @@ export function buildAgentTool(): LLMToolSpec {
|
|
|
277
401
|
},
|
|
278
402
|
tool_filter: {
|
|
279
403
|
type: 'object',
|
|
280
|
-
description: 'Optional per-spawn tool
|
|
404
|
+
description: 'Optional per-spawn tool filter. The sub-agent inherits the parent\'s full tool registry by default; usually omit this field. Only `deny` is applied (hide specific tools). `allow` is ignored unless the user explicitly enabled narrowing, so do not try to restrict the child with it.',
|
|
281
405
|
properties: {
|
|
282
406
|
allow: {
|
|
283
407
|
type: 'array',
|
|
284
408
|
items: { type: 'string' },
|
|
285
|
-
description: '
|
|
409
|
+
description: 'Ignored by default (the child keeps every tool). Applied only when the user explicitly enabled narrowing; then unknown names are ignored with a warning and a filter that would leave 0 tools is refused (NOT SPAWNED).',
|
|
286
410
|
},
|
|
287
411
|
deny: {
|
|
288
412
|
type: 'array',
|
|
@@ -383,6 +507,7 @@ export async function dispatchAgent(
|
|
|
383
507
|
|
|
384
508
|
// PFC-S1 P1: new optional fields.
|
|
385
509
|
const runInBackground = args.run_in_background === true;
|
|
510
|
+
const waitsForSlot = args.wait_for_slot === true;
|
|
386
511
|
const spawnName = typeof args.name === 'string' && args.name.trim() ? args.name.trim() : undefined;
|
|
387
512
|
const teamName = typeof args.team_name === 'string' && args.team_name.trim() ? args.team_name.trim() : undefined;
|
|
388
513
|
const isolation = args.isolation === 'worktree' || args.isolation === 'cwd'
|
|
@@ -498,41 +623,82 @@ export async function dispatchAgent(
|
|
|
498
623
|
// slot re-opens the moment any background agent finishes, which is what
|
|
499
624
|
// lets the next launch through again.
|
|
500
625
|
let fanoutSession: object | undefined;
|
|
626
|
+
// Set when the shared admission queue handed this dispatch its slot while it
|
|
627
|
+
// waited (see `admitNextBackgroundAdmission`) — the reservation block below
|
|
628
|
+
// must then not take a second one.
|
|
629
|
+
let fanoutSlotReserved = false;
|
|
501
630
|
if (runInBackground) {
|
|
502
631
|
// Per-session scope: slots count against THIS session's cache
|
|
503
632
|
// identity (shared fallback bucket for cache-less callers), so a
|
|
504
633
|
// busy OTHER session cannot starve this one's first launch.
|
|
505
634
|
fanoutSession = opts.sessionCache ?? UNSCOPED_BACKGROUND_FANOUT_SESSION;
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
635
|
+
if (countSessionBackgroundFanout(fanoutSession) >= AGENT_TOOL_BACKGROUND_FANOUT_CEILING) {
|
|
636
|
+
// Not spawned: no registry task, no provider call, no cache entry.
|
|
637
|
+
// taskId is a sentinel (like 'dedup' above) so a caller can tell a
|
|
638
|
+
// refusal from a real spawn without parsing the prose. The live count
|
|
639
|
+
// is re-read here so an abandoned wait reports the current number.
|
|
640
|
+
const refuseForCeiling = (): AgentToolResult => {
|
|
641
|
+
const liveBackground = countSessionBackgroundFanout(fanoutSession!);
|
|
642
|
+
debug.log('agent.spawn', 'background-fanout-limit', {
|
|
643
|
+
cid: debugCorrelationId,
|
|
644
|
+
requestedType,
|
|
645
|
+
description: description.slice(0, 80),
|
|
646
|
+
liveBackground,
|
|
647
|
+
ceiling: AGENT_TOOL_BACKGROUND_FANOUT_CEILING,
|
|
648
|
+
}, { level: 'warn' });
|
|
649
|
+
return {
|
|
650
|
+
output:
|
|
651
|
+
`NOT SPAWNED — ${liveBackground} background agents are already live and the ` +
|
|
652
|
+
`fan-out ceiling is ${AGENT_TOOL_BACKGROUND_FANOUT_CEILING}. A slot reopens as ` +
|
|
653
|
+
`soon as one of them reaches a terminal state (done/error/aborted); its result ` +
|
|
654
|
+
`then arrives as a task-notification. Either wait for one to finish, fold this ` +
|
|
655
|
+
`work into an existing background spawn, or re-issue it without ` +
|
|
656
|
+
`run_in_background so it runs in the foreground.`,
|
|
657
|
+
agent: requestedType,
|
|
658
|
+
cid: debugCorrelationId,
|
|
659
|
+
durationMs: 0,
|
|
660
|
+
maxTurns: requestedMaxTurns,
|
|
661
|
+
taskId: 'background-fanout-limit',
|
|
662
|
+
};
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
// Shared waiting queue — opt-in only. Launches that did not pass
|
|
666
|
+
// `wait_for_slot` keep the immediate refusal above, byte for byte.
|
|
667
|
+
if (!waitsForSlot) return refuseForCeiling();
|
|
668
|
+
|
|
669
|
+
const admissionPriority = classifyBackgroundAdmissionPriority(requestedType);
|
|
670
|
+
debug.log('agent.spawn', 'background-queue-wait', {
|
|
509
671
|
cid: debugCorrelationId,
|
|
510
672
|
requestedType,
|
|
511
673
|
description: description.slice(0, 80),
|
|
512
|
-
|
|
674
|
+
priority: admissionPriority,
|
|
675
|
+
liveBackground: countSessionBackgroundFanout(fanoutSession),
|
|
513
676
|
ceiling: AGENT_TOOL_BACKGROUND_FANOUT_CEILING,
|
|
514
677
|
}, { level: 'warn' });
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
678
|
+
const admitted = await waitForBackgroundFanoutSlot(fanoutSession, admissionPriority, opts.signal);
|
|
679
|
+
if (!admitted) {
|
|
680
|
+
debug.log('agent.spawn', 'background-queue-abandoned', {
|
|
681
|
+
cid: debugCorrelationId,
|
|
682
|
+
requestedType,
|
|
683
|
+
description: description.slice(0, 80),
|
|
684
|
+
priority: admissionPriority,
|
|
685
|
+
reason: 'aborted-while-waiting',
|
|
686
|
+
}, { level: 'warn' });
|
|
687
|
+
return refuseForCeiling();
|
|
688
|
+
}
|
|
689
|
+
// The admitting release already reserved this dispatch's slot.
|
|
690
|
+
fanoutSlotReserved = true;
|
|
691
|
+
debug.log('agent.spawn', 'background-queue-admit', {
|
|
527
692
|
cid: debugCorrelationId,
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
693
|
+
requestedType,
|
|
694
|
+
description: description.slice(0, 80),
|
|
695
|
+
priority: admissionPriority,
|
|
696
|
+
liveBackground: countSessionBackgroundFanout(fanoutSession),
|
|
697
|
+
});
|
|
532
698
|
}
|
|
533
699
|
}
|
|
534
700
|
|
|
535
|
-
if (fanoutSession !== undefined) {
|
|
701
|
+
if (fanoutSession !== undefined && !fanoutSlotReserved) {
|
|
536
702
|
// Atomic reservation: taken in the SAME synchronous block as the
|
|
537
703
|
// ceiling check above, before any await — concurrent dispatches
|
|
538
704
|
// cannot all pass the check and push this session past the ceiling
|
|
@@ -716,32 +882,44 @@ export async function dispatchAgent(
|
|
|
716
882
|
// Strip the Agent tool itself from the sub-agent's available tools.
|
|
717
883
|
// One level of nesting only — see file header rationale.
|
|
718
884
|
childTools = stripAgentToolForOneLevelNesting(childTools);
|
|
719
|
-
// Wave 5 E1 — apply per-spawn tool_filter.
|
|
720
|
-
//
|
|
721
|
-
//
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
: null;
|
|
730
|
-
const denyList = Array.isArray(toolFilter.deny)
|
|
731
|
-
? new Set((toolFilter.deny as unknown[]).filter((n): n is string => typeof n === 'string'))
|
|
732
|
-
: null;
|
|
733
|
-
childTools = childTools.filter((t) => {
|
|
734
|
-
if (denyList && denyList.has(t.name)) return false;
|
|
735
|
-
if (allowList && !allowList.has(t.name)) return false;
|
|
736
|
-
return true;
|
|
737
|
-
});
|
|
885
|
+
// Wave 5 E1 — apply per-spawn tool_filter (SUBAGENT-TOOLS-EMPTY · 0.2.36 · 대표 «서브에이전트에 제약이 생기지 않게»).
|
|
886
|
+
// 기본 = 메인과 같은 도구 전부(필터 없음). allow 는 «좁히기»일 때만 — 모르는 이름은 무시하고 경고,
|
|
887
|
+
// 아는 이름이 하나도 없으면 allow 전체를 무시(이름 불일치로 49→0 이 되던 10-22 실물). 결과가 0개면
|
|
888
|
+
// 발사하지 않는다(조용히 빈손 금지 — «0 tools · Blocked» 로 끝나 «✓ done» 처럼 보이던 것).
|
|
889
|
+
// SUBAGENT-NO-NARROWING(0.2.36 · 대표 22:5x «서브에이전트에 제약 없게») — 모델이 넘긴 allow 는 기본 «무시», deny 만 반영.
|
|
890
|
+
// (10-22 n8n 실물: 49 → 9 로 좁혀진 자식 둘이 1분 만에 «완료 못함».) 좁히기는 사람이 명시할 때만 — ELANOUS_SUBAGENT_HONOR_ALLOW=1
|
|
891
|
+
// 또는 agent 정의(.md)의 tools 목록(위에서 이미 반영).
|
|
892
|
+
const filtered = applySpawnToolFilter(childTools, args.tool_filter, { honorAllow: subagentHonorsModelAllow() });
|
|
893
|
+
childTools = filtered.tools;
|
|
894
|
+
if (filtered.applied || filtered.unknownAllow.length > 0 || filtered.unknownDeny.length > 0) {
|
|
738
895
|
debug.log('agent.spawn', 'tool-filter', {
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
896
|
+
cid: debugCorrelationId,
|
|
897
|
+
allowSize: filtered.allowSize,
|
|
898
|
+
denySize: filtered.denySize,
|
|
899
|
+
available: filtered.available,
|
|
742
900
|
remaining: childTools.length,
|
|
743
|
-
removed:
|
|
744
|
-
|
|
901
|
+
removed: filtered.available - childTools.length,
|
|
902
|
+
...(filtered.unknownAllow.length ? { unknownAllow: filtered.unknownAllow.slice(0, 20) } : {}),
|
|
903
|
+
...(filtered.unknownDeny.length ? { unknownDeny: filtered.unknownDeny.slice(0, 20) } : {}),
|
|
904
|
+
...(filtered.allowIgnored ? { allowIgnored: filtered.allowIgnored } : {}),
|
|
905
|
+
}, filtered.unknownAllow.length || filtered.unknownDeny.length || filtered.allowIgnored ? { level: 'warn' } : undefined);
|
|
906
|
+
}
|
|
907
|
+
if (childTools.length === 0 && filtered.available > 0) {
|
|
908
|
+
debug.log('agent.spawn', 'no-tools-refused', {
|
|
909
|
+
cid: debugCorrelationId, requestedType, description: description.slice(0, 80),
|
|
910
|
+
available: filtered.available, denySize: filtered.denySize,
|
|
911
|
+
}, { level: 'warn' });
|
|
912
|
+
return {
|
|
913
|
+
output:
|
|
914
|
+
`NOT SPAWNED — the tool_filter would leave this sub-agent with 0 of ${filtered.available} tools, ` +
|
|
915
|
+
`so it could not read files or run commands. Omit tool_filter to inherit the parent's full tool set, ` +
|
|
916
|
+
`or narrow with real tool names (for example: ${childToolNamesSample(filtered.availableNames)}).`,
|
|
917
|
+
agent: requestedType,
|
|
918
|
+
cid: debugCorrelationId,
|
|
919
|
+
durationMs: 0,
|
|
920
|
+
maxTurns: requestedMaxTurns,
|
|
921
|
+
taskId: 'no-tools-refused',
|
|
922
|
+
};
|
|
745
923
|
}
|
|
746
924
|
|
|
747
925
|
const hasNoTools = childTools.length === 0;
|
|
@@ -1034,3 +1212,67 @@ export async function dispatchAgent(
|
|
|
1034
1212
|
releaseReservedFanoutSlot();
|
|
1035
1213
|
}
|
|
1036
1214
|
}
|
|
1215
|
+
|
|
1216
|
+
// ── SUBAGENT-TOOLS-EMPTY: per-spawn tool filter (pure) ──────────────────────────────────────
|
|
1217
|
+
|
|
1218
|
+
export interface SpawnToolFilterResult<T extends { name: string }> {
|
|
1219
|
+
tools: T[];
|
|
1220
|
+
available: number;
|
|
1221
|
+
availableNames: string[];
|
|
1222
|
+
applied: boolean;
|
|
1223
|
+
allowSize?: number;
|
|
1224
|
+
denySize?: number;
|
|
1225
|
+
unknownAllow: string[];
|
|
1226
|
+
unknownDeny: string[];
|
|
1227
|
+
/** allow 를 통째로 무시했다 — 이유(빈 배열 · 아는 이름 없음 · 모델이 넘긴 allow 는 기본 무시). */
|
|
1228
|
+
allowIgnored?: 'empty' | 'no-known-names' | 'model-allow-ignored';
|
|
1229
|
+
}
|
|
1230
|
+
|
|
1231
|
+
/** 모델이 넘긴 tool_filter.allow 로 좁히는가 — 사람이 명시할 때만(기본 false). */
|
|
1232
|
+
export function subagentHonorsModelAllow(env: NodeJS.ProcessEnv = process.env): boolean {
|
|
1233
|
+
return /^(1|true|on)$/i.test((env.ELANOUS_SUBAGENT_HONOR_ALLOW ?? '').trim());
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
/** 기본 = 전부 상속 · deny = 아는 이름 빼기 · allow 는 `honorAllow` 일 때만 아는 이름으로 좁히기(없으면 무시). 넓히지는 못한다. */
|
|
1237
|
+
export function applySpawnToolFilter<T extends { name: string }>(
|
|
1238
|
+
tools: readonly T[],
|
|
1239
|
+
rawFilter: unknown,
|
|
1240
|
+
opts: { honorAllow?: boolean } = {},
|
|
1241
|
+
): SpawnToolFilterResult<T> {
|
|
1242
|
+
const available = tools.length;
|
|
1243
|
+
const availableNames = tools.map((t) => t.name);
|
|
1244
|
+
const known = new Set(availableNames);
|
|
1245
|
+
const filter = rawFilter && typeof rawFilter === 'object' && !Array.isArray(rawFilter)
|
|
1246
|
+
? rawFilter as { allow?: unknown; deny?: unknown }
|
|
1247
|
+
: undefined;
|
|
1248
|
+
if (!filter) return { tools: [...tools], available, availableNames, applied: false, unknownAllow: [], unknownDeny: [] };
|
|
1249
|
+
const names = (v: unknown): string[] | null => (Array.isArray(v) ? v.filter((n): n is string => typeof n === 'string' && n.trim() !== '') : null);
|
|
1250
|
+
const allowRaw = names(filter.allow);
|
|
1251
|
+
const denyRaw = names(filter.deny);
|
|
1252
|
+
const unknownAllow = (allowRaw ?? []).filter((n) => !known.has(n));
|
|
1253
|
+
const unknownDeny = (denyRaw ?? []).filter((n) => !known.has(n));
|
|
1254
|
+
const allowKnown = (allowRaw ?? []).filter((n) => known.has(n));
|
|
1255
|
+
let allowIgnored: SpawnToolFilterResult<T>['allowIgnored'];
|
|
1256
|
+
let allow: Set<string> | null = null;
|
|
1257
|
+
if (allowRaw) {
|
|
1258
|
+
if (allowRaw.length === 0) allowIgnored = 'empty';
|
|
1259
|
+
else if (!opts.honorAllow) allowIgnored = 'model-allow-ignored';
|
|
1260
|
+
else if (allowKnown.length === 0) allowIgnored = 'no-known-names';
|
|
1261
|
+
else allow = new Set(allowKnown);
|
|
1262
|
+
}
|
|
1263
|
+
const deny = new Set((denyRaw ?? []).filter((n) => known.has(n)));
|
|
1264
|
+
const kept = tools.filter((t) => !deny.has(t.name) && (!allow || allow.has(t.name)));
|
|
1265
|
+
return {
|
|
1266
|
+
tools: kept, available, availableNames, applied: true,
|
|
1267
|
+
...(allowRaw ? { allowSize: allowRaw.length } : {}),
|
|
1268
|
+
...(denyRaw ? { denySize: denyRaw.length } : {}),
|
|
1269
|
+
unknownAllow, unknownDeny,
|
|
1270
|
+
...(allowIgnored ? { allowIgnored } : {}),
|
|
1271
|
+
};
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
function childToolNamesSample(names: readonly string[]): string {
|
|
1275
|
+
const preferred = ['Read', 'Grep', 'Glob', 'RunShell', 'Write', 'Edit'].filter((n) => names.includes(n));
|
|
1276
|
+
return (preferred.length ? preferred : names.slice(0, 6)).join(', ');
|
|
1277
|
+
}
|
|
1278
|
+
|
|
@@ -33,6 +33,11 @@ export const WAKEUP_MIN_DELAY_MS = 60_000;
|
|
|
33
33
|
export const WAKEUP_MAX_ENTRIES = 5;
|
|
34
34
|
export const WAKEUP_REPEAT_TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
35
35
|
export const WAKEUP_RETRY_DELAY_MS = 60_000;
|
|
36
|
+
/** 바쁨(NotIdle)·사람 입력 중(HumanTyping)으로 못 연 깨움을 «버리지 않고» 미루는 상한 — 첫 예정 시각부터.
|
|
37
|
+
* TUI-WAKEUP-DEFER-NOT-DROP(10-22 OPT w7: 02:38·02:39 NotIdle → dropped · codex 는 idle 때 골을 이어가고 바쁘면 미룬다). */
|
|
38
|
+
export const WAKEUP_DEFER_MAX_MS = 30 * 60_000;
|
|
39
|
+
/** 미룸 대상인 거부 이유 — 곧 풀리는 «지금 바쁨» 뿐이다(Disabled·Cap·Superseded 는 미뤄도 안 풀린다). */
|
|
40
|
+
const WAKEUP_DEFERRABLE_REASONS: ReadonlySet<string> = new Set(['NotIdle', 'HumanTyping']);
|
|
36
41
|
/** 일회성 지연의 상한 — 반복 TTL 과 같은 7일(그보다 먼 일은 cron `schedule_manage` 몫). */
|
|
37
42
|
export const WAKEUP_MAX_DELAY_MS = WAKEUP_REPEAT_TTL_MS;
|
|
38
43
|
/** 한 턴 안 schedule·cancel 호출 합계 상한 — 넘으면 «다음 턴에» 로 거부(예약·취소 고리 차단). */
|
|
@@ -260,18 +265,32 @@ export function createWakeupScheduler(deps: WakeupSchedulerDeps): WakeupSchedule
|
|
|
260
265
|
log('tui.wakeup', 'rejected', {
|
|
261
266
|
id, reason: result.reason, ...(result.detail ? { detail: result.detail } : {}), retried: entry.retried,
|
|
262
267
|
});
|
|
263
|
-
|
|
264
|
-
|
|
268
|
+
const deferrable = WAKEUP_DEFERRABLE_REASONS.has(result.reason);
|
|
269
|
+
if (deferrable) {
|
|
270
|
+
// 바쁨·사람 입력 중 — 버리지 않고 1분마다 다시 청한다(같은 회차). 상한 = 첫 예정 시각 + WAKEUP_DEFER_MAX_MS,
|
|
271
|
+
// 반복이면 다음 회차 시각도 상한(그 회차가 이 깨움을 대신한다).
|
|
272
|
+
const nextTry = t + WAKEUP_RETRY_DELAY_MS;
|
|
273
|
+
// 상한 시각의 시도까지는 한다(<=) · 반복은 다음 회차 시각과 겹치면 그 회차에 넘긴다(<).
|
|
274
|
+
const withinDeferCap = nextTry <= entry.dueAt + WAKEUP_DEFER_MAX_MS;
|
|
275
|
+
const beforeNextTick = !entry.repeatMs || nextTry < entry.dueAt + entry.repeatMs;
|
|
276
|
+
if (withinDeferCap && beforeNextTick) {
|
|
277
|
+
entry.retried = true;
|
|
278
|
+
timers.set(id, setTimer(() => fire(id), WAKEUP_RETRY_DELAY_MS));
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
} else if (!entry.retried) {
|
|
282
|
+
// 바쁨이 아닌 거부 — 1분 뒤 한 번만 다시 청한다(기존 계약).
|
|
265
283
|
entry.retried = true;
|
|
266
284
|
timers.set(id, setTimer(() => fire(id), WAKEUP_RETRY_DELAY_MS));
|
|
267
285
|
return;
|
|
268
286
|
}
|
|
287
|
+
const exhausted = deferrable ? 'defer-exhausted' : 'retry-exhausted';
|
|
269
288
|
if (entry.repeatMs) {
|
|
270
|
-
log('tui.wakeup', 'skipped', { id, reason:
|
|
289
|
+
log('tui.wakeup', 'skipped', { id, reason: exhausted, next: 'repeat' });
|
|
271
290
|
advance(entry, t);
|
|
272
291
|
return;
|
|
273
292
|
}
|
|
274
|
-
log('tui.wakeup', 'skipped', { id, reason:
|
|
293
|
+
log('tui.wakeup', 'skipped', { id, reason: exhausted, next: 'dropped' });
|
|
275
294
|
deps.notify?.(`⏰ 예약 깨움 놓침(${id}): ${entry.reason} — ${result.reason}`);
|
|
276
295
|
drop(id);
|
|
277
296
|
};
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
getShellRunnerDeps,
|
|
33
33
|
} from '../../shell-runner/dispatch.js';
|
|
34
34
|
import type { ShellHandle, ShellResult as RunnerResult } from '../../shell-runner/types.js';
|
|
35
|
-
import { debug } from '../../debug/log.js';
|
|
35
|
+
import { debug, redactSecretText, redactSecrets } from '../../debug/log.js';
|
|
36
36
|
import { getSessionCwd } from '../../session/working-dir.js';
|
|
37
37
|
import { getUserConfig } from '../../user-config.js';
|
|
38
38
|
import { SCHEDULE_WAKEUP_TOOL_NAME } from './schedule-wakeup.js';
|
|
@@ -515,8 +515,62 @@ function withLongSleepWarning(
|
|
|
515
515
|
return { ...result, output: `${formatLongSleepWarning(finding, bgAvailable, resumeHint)}\n${result.output}` };
|
|
516
516
|
}
|
|
517
517
|
|
|
518
|
-
|
|
519
|
-
|
|
518
|
+
/** The per-event cap holds for the whole recorded args text, including the
|
|
519
|
+
* truncation marker. Source: TUI-OBS-TRACE-PERSIST GOAL STEPS (2048 chars). */
|
|
520
|
+
export const SHELL_DISPATCH_ARGS_TEXT_LIMIT = 2048;
|
|
521
|
+
|
|
522
|
+
interface BoundedShellArgsText {
|
|
523
|
+
/** Redacted JSON text of the arguments received by dispatchRunShell. */
|
|
524
|
+
argsText: string;
|
|
525
|
+
/** True when argsText was cut to the cap. */
|
|
526
|
+
argsTextTruncated: boolean;
|
|
527
|
+
/** Length of the full redacted JSON text before bounding. */
|
|
528
|
+
argsTextChars: number;
|
|
529
|
+
/** Short scalar remains readable even if argsText itself is compacted. */
|
|
530
|
+
argsTextMarker?: string;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
function stringifyShellArgs(rawArgs: unknown): string {
|
|
534
|
+
try {
|
|
535
|
+
const json = JSON.stringify(redactSecrets(rawArgs));
|
|
536
|
+
if (json !== undefined) return json;
|
|
537
|
+
} catch { /* circular / BigInt args — redact fallback text too */ }
|
|
538
|
+
try {
|
|
539
|
+
return redactSecretText(String(rawArgs));
|
|
540
|
+
} catch {
|
|
541
|
+
return '[unserializable shell args]';
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/** Bounded, secret-redacted serialization for one RunShell dispatch record. */
|
|
546
|
+
export function boundedShellArgsText(
|
|
547
|
+
rawArgs: unknown,
|
|
548
|
+
): BoundedShellArgsText {
|
|
549
|
+
const full = stringifyShellArgs(rawArgs);
|
|
550
|
+
if (full.length <= SHELL_DISPATCH_ARGS_TEXT_LIMIT) {
|
|
551
|
+
return { argsText: full, argsTextTruncated: false, argsTextChars: full.length };
|
|
552
|
+
}
|
|
553
|
+
const argsTextMarker = '[truncated]';
|
|
554
|
+
const prefixLen = SHELL_DISPATCH_ARGS_TEXT_LIMIT - argsTextMarker.length - 1;
|
|
555
|
+
return {
|
|
556
|
+
argsText: `${full.slice(0, prefixLen)} ${argsTextMarker}`,
|
|
557
|
+
argsTextTruncated: true,
|
|
558
|
+
argsTextChars: full.length,
|
|
559
|
+
argsTextMarker,
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
function logShellDispatch(
|
|
564
|
+
event: string,
|
|
565
|
+
data: Record<string, unknown>,
|
|
566
|
+
argsTrace?: BoundedShellArgsText,
|
|
567
|
+
): void {
|
|
568
|
+
debug.log(
|
|
569
|
+
'shell.dispatch',
|
|
570
|
+
event,
|
|
571
|
+
argsTrace ? { ...data, ...argsTrace } : data,
|
|
572
|
+
{ compact: { stringMax: SHELL_DISPATCH_ARGS_TEXT_LIMIT } },
|
|
573
|
+
);
|
|
520
574
|
}
|
|
521
575
|
|
|
522
576
|
// ── bg completion → turn notification queue (TUI-BG-SHELL) ───────────
|
|
@@ -588,8 +642,9 @@ export async function dispatchRunShell(
|
|
|
588
642
|
const network = asNetwork(rawArgs.network);
|
|
589
643
|
const mode = asMode(rawArgs.mode);
|
|
590
644
|
const description = typeof rawArgs.description === 'string' ? rawArgs.description : undefined;
|
|
645
|
+
const argsTrace = boundedShellArgsText(rawArgs);
|
|
591
646
|
if (command[0] === 'cd') {
|
|
592
|
-
logShellDispatch('cd.rejected', { reason: 'argv-state-does-not-persist' });
|
|
647
|
+
logShellDispatch('cd.rejected', { reason: 'argv-state-does-not-persist' }, argsTrace);
|
|
593
648
|
return rejectedCdResult();
|
|
594
649
|
}
|
|
595
650
|
const ledgerCliMatch = matchLedgerCli(command, opts.availableToolNames);
|
|
@@ -627,7 +682,7 @@ export async function dispatchRunShell(
|
|
|
627
682
|
signal: opts.signal,
|
|
628
683
|
deps,
|
|
629
684
|
});
|
|
630
|
-
logShellDispatch(`runner.${result.outcome}`, { cwd: effectiveCwd, cwdSource });
|
|
685
|
+
logShellDispatch(`runner.${result.outcome}`, { cwd: effectiveCwd, cwdSource }, argsTrace);
|
|
631
686
|
return withLongSleepWarning(result, longSleep, bgAvailable, resumeHint);
|
|
632
687
|
}
|
|
633
688
|
|
|
@@ -641,7 +696,7 @@ export async function dispatchRunShell(
|
|
|
641
696
|
signal: opts.signal,
|
|
642
697
|
});
|
|
643
698
|
|
|
644
|
-
logShellDispatch(`legacy.${result.outcome}`, { cwd: effectiveCwd, cwdSource });
|
|
699
|
+
logShellDispatch(`legacy.${result.outcome}`, { cwd: effectiveCwd, cwdSource }, argsTrace);
|
|
645
700
|
const summary = formatSummary(result);
|
|
646
701
|
return withLongSleepWarning({
|
|
647
702
|
output: summary,
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
// overflowed.
|
|
19
19
|
|
|
20
20
|
import type { LLMToolSpec } from '../../llm.js';
|
|
21
|
-
import { getDashboardTerminalSessions } from '../../dashboard/terminal/session.js';
|
|
22
21
|
import type { TerminalSessionRegistry } from '../../terminal/session-registry.js';
|
|
23
22
|
|
|
24
23
|
const CHUNK_BYTES = 256;
|
|
@@ -92,7 +91,7 @@ export async function dispatchTerminalModalInject(
|
|
|
92
91
|
rawArgs: Record<string, unknown>,
|
|
93
92
|
deps: DispatchInjectDeps = {},
|
|
94
93
|
): Promise<{ output: string }> {
|
|
95
|
-
const registry = deps.registry ?? getDashboardTerminalSessions();
|
|
94
|
+
const registry = deps.registry ?? (await import('../../dashboard/terminal/session.js')).getDashboardTerminalSessions();
|
|
96
95
|
const id = String(rawArgs.id ?? '').trim();
|
|
97
96
|
if (!id) throw new Error(`'id' is required`);
|
|
98
97
|
const session = registry.get(id);
|