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
|
@@ -60,8 +60,8 @@ export const AGENT_TOOL_DEFAULT_MAX_TURNS = 20;
|
|
|
60
60
|
export const AGENT_TOOL_TURNS_CEILING = 50;
|
|
61
61
|
|
|
62
62
|
/** Numeric ceiling on concurrent `run_in_background` Agent-tool fan-out.
|
|
63
|
-
*
|
|
64
|
-
*
|
|
63
|
+
* Enforced at exactly one point in `dispatchAgent` (see the
|
|
64
|
+
* `background-fanout-limit` block: after dedup, before `noteSeen`). */
|
|
65
65
|
export const AGENT_TOOL_BACKGROUND_FANOUT_CEILING = 8;
|
|
66
66
|
|
|
67
67
|
/** Clamp a caller-supplied `max_turns` onto `[1, AGENT_TOOL_TURNS_CEILING]`.
|
|
@@ -82,7 +82,9 @@ export function stripAgentToolForOneLevelNesting<T extends { name: string }>(
|
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
/** Live `run_in_background` tasks occupy fan-out slots until they terminal.
|
|
85
|
-
*
|
|
85
|
+
* Counts a task list (e.g. `globalAgentRegistry.list()`). `dispatchAgent`
|
|
86
|
+
* enforces the per-session ceiling over its own reservation ledger
|
|
87
|
+
* (`backgroundFanoutSlots`) instead — see that field's doc. */
|
|
86
88
|
export function countLiveBackgroundFanout(
|
|
87
89
|
tasks: ReadonlyArray<{ background?: boolean; state?: string }>,
|
|
88
90
|
): number {
|
|
@@ -95,6 +97,145 @@ export function countLiveBackgroundFanout(
|
|
|
95
97
|
return n;
|
|
96
98
|
}
|
|
97
99
|
|
|
100
|
+
/** Fallback fan-out session key for dispatches that carry no
|
|
101
|
+
* `sessionCache` (agent-cli, one-off callers). All of their slots share
|
|
102
|
+
* one process-wide bucket so the ceiling still binds for them. */
|
|
103
|
+
const UNSCOPED_BACKGROUND_FANOUT_SESSION: object = Object.freeze({});
|
|
104
|
+
|
|
105
|
+
/** Fan-out slots by session (the dispatching session's `SessionCache`
|
|
106
|
+
* identity; WeakMap so a dropped session releases its key together with
|
|
107
|
+
* the cache instance). A slot is RESERVED in the same synchronous block
|
|
108
|
+
* as the ceiling check inside `dispatchAgent` — concurrent dispatches
|
|
109
|
+
* that interleave at the async definition-resolution awaits cannot all
|
|
110
|
+
* pass the check before any of them registers — and RELEASED when the
|
|
111
|
+
* registered task reaches a terminal state (done/error/aborted) via
|
|
112
|
+
* `globalAgentRegistry.onTaskDone`. A dispatch that throws before it
|
|
113
|
+
* registers releases its own reservation (see
|
|
114
|
+
* `releaseReservedFanoutSlot` inside `dispatchAgent`). */
|
|
115
|
+
const backgroundFanoutSlots = new WeakMap<object, number>();
|
|
116
|
+
|
|
117
|
+
/** Count this session's live fan-out slots (reserved or running). */
|
|
118
|
+
export function countSessionBackgroundFanout(session: object): number {
|
|
119
|
+
return backgroundFanoutSlots.get(session) ?? 0;
|
|
120
|
+
}
|
|
121
|
+
|
|
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`). */
|
|
124
|
+
function releaseBackgroundFanoutSlot(session: object): void {
|
|
125
|
+
const live = backgroundFanoutSlots.get(session);
|
|
126
|
+
if (live === undefined || live <= 1) backgroundFanoutSlots.delete(session);
|
|
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();
|
|
237
|
+
}
|
|
238
|
+
|
|
98
239
|
/** Fallback agent when subagent_type is missing or unresolvable. The
|
|
99
240
|
* loader picks this up from src/agents/general-purpose.md — built
|
|
100
241
|
* inline below as a defensive default in case that file is removed. */
|
|
@@ -130,6 +271,12 @@ export interface AgentToolArgs {
|
|
|
130
271
|
* child keeps running; completion emits a task-notification
|
|
131
272
|
* (P2) which the parent sees in the next turn's user message. */
|
|
132
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;
|
|
133
280
|
/** UI label for this spawn — shown on agent-roster so siblings
|
|
134
281
|
* sharing a definition are distinguishable. Takes precedence
|
|
135
282
|
* over `description` as task.label. */
|
|
@@ -199,6 +346,10 @@ export function buildAgentTool(): LLMToolSpec {
|
|
|
199
346
|
' • You want to fan out N independent workers in parallel — call Agent N times in the same turn; each runs independently.\n' +
|
|
200
347
|
' • A SKILL.md instructs you to "spawn N expert agents" / "use the Agent tool" — that is exactly this tool.\n' +
|
|
201
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' +
|
|
202
353
|
'The sub-agent gets its own tools (Bash/Read/Edit/Grep/WebFetch by default) and its own ' +
|
|
203
354
|
'turn budget (default 20). It returns ONE final message which becomes your tool_result. ' +
|
|
204
355
|
'Pass everything the worker needs (data, persona, framing) inside `prompt` — the worker ' +
|
|
@@ -226,6 +377,10 @@ export function buildAgentTool(): LLMToolSpec {
|
|
|
226
377
|
type: 'boolean',
|
|
227
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.',
|
|
228
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
|
+
},
|
|
229
384
|
name: {
|
|
230
385
|
type: 'string',
|
|
231
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.',
|
|
@@ -246,12 +401,12 @@ export function buildAgentTool(): LLMToolSpec {
|
|
|
246
401
|
},
|
|
247
402
|
tool_filter: {
|
|
248
403
|
type: 'object',
|
|
249
|
-
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.',
|
|
250
405
|
properties: {
|
|
251
406
|
allow: {
|
|
252
407
|
type: 'array',
|
|
253
408
|
items: { type: 'string' },
|
|
254
|
-
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).',
|
|
255
410
|
},
|
|
256
411
|
deny: {
|
|
257
412
|
type: 'array',
|
|
@@ -352,6 +507,7 @@ export async function dispatchAgent(
|
|
|
352
507
|
|
|
353
508
|
// PFC-S1 P1: new optional fields.
|
|
354
509
|
const runInBackground = args.run_in_background === true;
|
|
510
|
+
const waitsForSlot = args.wait_for_slot === true;
|
|
355
511
|
const spawnName = typeof args.name === 'string' && args.name.trim() ? args.name.trim() : undefined;
|
|
356
512
|
const teamName = typeof args.team_name === 'string' && args.team_name.trim() ? args.team_name.trim() : undefined;
|
|
357
513
|
const isolation = args.isolation === 'worktree' || args.isolation === 'cwd'
|
|
@@ -374,19 +530,22 @@ export async function dispatchAgent(
|
|
|
374
530
|
// burn another turn on the same work. Return a stub that points
|
|
375
531
|
// the parent back to its existing history. Parents stuck in a
|
|
376
532
|
// "keep re-spawning Data Collector" loop escape via this gate.
|
|
377
|
-
|
|
378
|
-
|
|
533
|
+
const sessionCache = opts.sessionCache;
|
|
534
|
+
const cacheKey = sessionCache
|
|
535
|
+
? agentCacheKey(requestedType, requestedType, prompt)
|
|
536
|
+
: undefined;
|
|
537
|
+
if (sessionCache && cacheKey) {
|
|
379
538
|
// Key strategy: description is noisy (parents sometimes vary the
|
|
380
539
|
// label between calls); we hash the FUNCTIONAL signature only
|
|
381
540
|
// — subagent_type + prompt. Same prompt to same agent = same
|
|
382
541
|
// expected work, regardless of how the call was labelled.
|
|
383
|
-
const hit =
|
|
542
|
+
const hit = sessionCache.check(cacheKey);
|
|
384
543
|
if (hit) {
|
|
385
544
|
const label = `Agent[${requestedType}] "${description.slice(0, 60)}"`;
|
|
386
545
|
logDedupHit('agent.dedup', label, hit, {
|
|
387
546
|
requestedType,
|
|
388
547
|
description: description.slice(0, 80),
|
|
389
|
-
consecutive:
|
|
548
|
+
consecutive: sessionCache.consecutiveHits,
|
|
390
549
|
});
|
|
391
550
|
|
|
392
551
|
// Runtime-level block: same treatment as Read. When the parent
|
|
@@ -395,16 +554,16 @@ export async function dispatchAgent(
|
|
|
395
554
|
// tool_result carries is_error=true. Soft stubs have been
|
|
396
555
|
// observed to produce 6+ retries in the wild; an error break
|
|
397
556
|
// the reflex loop more reliably.
|
|
398
|
-
if (
|
|
557
|
+
if (sessionCache.consecutiveHits >= CONSECUTIVE_DEDUP_BLOCK_THRESHOLD) {
|
|
399
558
|
debug.log('agent.dedup', 'consecutive-block', {
|
|
400
559
|
requestedType,
|
|
401
560
|
description: description.slice(0, 80),
|
|
402
|
-
consecutive:
|
|
561
|
+
consecutive: sessionCache.consecutiveHits,
|
|
403
562
|
threshold: CONSECUTIVE_DEDUP_BLOCK_THRESHOLD,
|
|
404
563
|
});
|
|
405
564
|
throw new Error(
|
|
406
565
|
`RUNTIME BLOCKED — Agent[${requestedType}] "${description.slice(0, 60)}" ` +
|
|
407
|
-
`has been spawned ${
|
|
566
|
+
`has been spawned ${sessionCache.consecutiveHits} times in a row with ` +
|
|
408
567
|
`no intervening progress. The previous sub-agent's final message is in ` +
|
|
409
568
|
`your conversation history above — use that. Spawn an Agent with a ` +
|
|
410
569
|
`DIFFERENT persona (different subagent_type or a substantively different ` +
|
|
@@ -420,9 +579,9 @@ export async function dispatchAgent(
|
|
|
420
579
|
// ~500 chars of history noise per hit. We now emit the debug
|
|
421
580
|
// event past threshold for traceability but return the normal
|
|
422
581
|
// "spawn a different persona" stub — same message every hit.
|
|
423
|
-
if (
|
|
582
|
+
if (sessionCache.totalHits >= DEDUP_CASCADE_HALT_THRESHOLD) {
|
|
424
583
|
debug.log('agent.dedup', 'cascade-threshold', {
|
|
425
|
-
totalHits:
|
|
584
|
+
totalHits: sessionCache.totalHits,
|
|
426
585
|
threshold: DEDUP_CASCADE_HALT_THRESHOLD,
|
|
427
586
|
requestedType,
|
|
428
587
|
description: description.slice(0, 80),
|
|
@@ -444,7 +603,120 @@ export async function dispatchAgent(
|
|
|
444
603
|
taskId: 'dedup',
|
|
445
604
|
};
|
|
446
605
|
}
|
|
447
|
-
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
// ── TUI-AGENT-CAPS-FU: background fan-out ceiling ──
|
|
609
|
+
//
|
|
610
|
+
// The ONE enforcement point for AGENT_TOOL_BACKGROUND_FANOUT_CEILING, and
|
|
611
|
+
// it sits exactly between the dedup short-circuit above and `noteSeen`
|
|
612
|
+
// below on purpose:
|
|
613
|
+
// • after dedup — a repeat of an already-answered prompt still gets the
|
|
614
|
+
// dedup stub instead of a fan-out refusal (it never reaches here);
|
|
615
|
+
// • before `noteSeen` — a refused launch must NOT register its cache
|
|
616
|
+
// key. Otherwise the caller's retry (same prompt, once a slot opens)
|
|
617
|
+
// would be answered with "you already got this result" even though no
|
|
618
|
+
// child ever ran, permanently poisoning the cache with a spawn that
|
|
619
|
+
// never happened.
|
|
620
|
+
//
|
|
621
|
+
// Live slots are counted over the shared task ledger: `background` tasks
|
|
622
|
+
// that have not reached a terminal state (done / error / aborted). So a
|
|
623
|
+
// slot re-opens the moment any background agent finishes, which is what
|
|
624
|
+
// lets the next launch through again.
|
|
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;
|
|
630
|
+
if (runInBackground) {
|
|
631
|
+
// Per-session scope: slots count against THIS session's cache
|
|
632
|
+
// identity (shared fallback bucket for cache-less callers), so a
|
|
633
|
+
// busy OTHER session cannot starve this one's first launch.
|
|
634
|
+
fanoutSession = opts.sessionCache ?? UNSCOPED_BACKGROUND_FANOUT_SESSION;
|
|
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', {
|
|
671
|
+
cid: debugCorrelationId,
|
|
672
|
+
requestedType,
|
|
673
|
+
description: description.slice(0, 80),
|
|
674
|
+
priority: admissionPriority,
|
|
675
|
+
liveBackground: countSessionBackgroundFanout(fanoutSession),
|
|
676
|
+
ceiling: AGENT_TOOL_BACKGROUND_FANOUT_CEILING,
|
|
677
|
+
}, { level: 'warn' });
|
|
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', {
|
|
692
|
+
cid: debugCorrelationId,
|
|
693
|
+
requestedType,
|
|
694
|
+
description: description.slice(0, 80),
|
|
695
|
+
priority: admissionPriority,
|
|
696
|
+
liveBackground: countSessionBackgroundFanout(fanoutSession),
|
|
697
|
+
});
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
if (fanoutSession !== undefined && !fanoutSlotReserved) {
|
|
702
|
+
// Atomic reservation: taken in the SAME synchronous block as the
|
|
703
|
+
// ceiling check above, before any await — concurrent dispatches
|
|
704
|
+
// cannot all pass the check and push this session past the ceiling
|
|
705
|
+
// while their definitions resolve. Released when the registered
|
|
706
|
+
// task terminals (see the onTaskDone subscription at spawn); a
|
|
707
|
+
// dispatch that throws before registering releases it in the finally
|
|
708
|
+
// below, including failures from definition resolution and lazy imports.
|
|
709
|
+
backgroundFanoutSlots.set(fanoutSession, countSessionBackgroundFanout(fanoutSession) + 1);
|
|
710
|
+
}
|
|
711
|
+
const releaseReservedFanoutSlot = (): void => {
|
|
712
|
+
if (fanoutSession === undefined) return;
|
|
713
|
+
releaseBackgroundFanoutSlot(fanoutSession);
|
|
714
|
+
fanoutSession = undefined;
|
|
715
|
+
};
|
|
716
|
+
|
|
717
|
+
try {
|
|
718
|
+
if (sessionCache && cacheKey) {
|
|
719
|
+
sessionCache.noteSeen(cacheKey, `Agent[${requestedType}] ${description.slice(0, 60)}`);
|
|
448
720
|
}
|
|
449
721
|
|
|
450
722
|
// Resolve the agent definition. Try the 4-layer resolver first;
|
|
@@ -536,7 +808,9 @@ export async function dispatchAgent(
|
|
|
536
808
|
});
|
|
537
809
|
} catch (error) {
|
|
538
810
|
const message = error instanceof Error ? error.message : String(error);
|
|
539
|
-
if (!message.includes('is not inside a git repo'))
|
|
811
|
+
if (!message.includes('is not inside a git repo')) {
|
|
812
|
+
throw error;
|
|
813
|
+
}
|
|
540
814
|
childCwd = opts.cwd ?? getSessionCwd();
|
|
541
815
|
appliedIsolation = 'cwd';
|
|
542
816
|
debug.log('agent.spawn', 'worktree-fallback-cwd', {
|
|
@@ -608,32 +882,44 @@ export async function dispatchAgent(
|
|
|
608
882
|
// Strip the Agent tool itself from the sub-agent's available tools.
|
|
609
883
|
// One level of nesting only — see file header rationale.
|
|
610
884
|
childTools = stripAgentToolForOneLevelNesting(childTools);
|
|
611
|
-
// Wave 5 E1 — apply per-spawn tool_filter.
|
|
612
|
-
//
|
|
613
|
-
//
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
: null;
|
|
622
|
-
const denyList = Array.isArray(toolFilter.deny)
|
|
623
|
-
? new Set((toolFilter.deny as unknown[]).filter((n): n is string => typeof n === 'string'))
|
|
624
|
-
: null;
|
|
625
|
-
childTools = childTools.filter((t) => {
|
|
626
|
-
if (denyList && denyList.has(t.name)) return false;
|
|
627
|
-
if (allowList && !allowList.has(t.name)) return false;
|
|
628
|
-
return true;
|
|
629
|
-
});
|
|
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) {
|
|
630
895
|
debug.log('agent.spawn', 'tool-filter', {
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
896
|
+
cid: debugCorrelationId,
|
|
897
|
+
allowSize: filtered.allowSize,
|
|
898
|
+
denySize: filtered.denySize,
|
|
899
|
+
available: filtered.available,
|
|
634
900
|
remaining: childTools.length,
|
|
635
|
-
removed:
|
|
636
|
-
|
|
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
|
+
};
|
|
637
923
|
}
|
|
638
924
|
|
|
639
925
|
const hasNoTools = childTools.length === 0;
|
|
@@ -679,6 +965,19 @@ export async function dispatchAgent(
|
|
|
679
965
|
...(runInBackground ? { background: true } : {}),
|
|
680
966
|
});
|
|
681
967
|
|
|
968
|
+
// Terminal release for this dispatch's reserved fan-out slot: the
|
|
969
|
+
// registry fires this exactly once per task when it reaches a
|
|
970
|
+
// terminal state (done/error/aborted); until then the slot counts as
|
|
971
|
+
// occupied against this session's ceiling above.
|
|
972
|
+
if (fanoutSession !== undefined) {
|
|
973
|
+
const fanoutSlotSession = fanoutSession;
|
|
974
|
+
const fanoutSlotSubscription = globalAgentRegistry.onTaskDone((task) => {
|
|
975
|
+
if (!task || task.id !== handle.task.id) return;
|
|
976
|
+
fanoutSlotSubscription.dispose();
|
|
977
|
+
releaseBackgroundFanoutSlot(fanoutSlotSession);
|
|
978
|
+
});
|
|
979
|
+
fanoutSession = undefined; // the terminal subscription owns the release now
|
|
980
|
+
}
|
|
682
981
|
// Forward parent abort to the spawned task. The registry owns the
|
|
683
982
|
// child's controller; we just chain ours into it.
|
|
684
983
|
if (opts.signal) {
|
|
@@ -907,4 +1206,73 @@ export async function dispatchAgent(
|
|
|
907
1206
|
...(childCwd ? { cwd: childCwd } : {}),
|
|
908
1207
|
...(appliedIsolation ? { isolation: appliedIsolation } : {}),
|
|
909
1208
|
};
|
|
1209
|
+
} finally {
|
|
1210
|
+
// The registered task owns its slot after the handoff above. Every
|
|
1211
|
+
// pre-registration throw leaves fanoutSession set and releases it here.
|
|
1212
|
+
releaseReservedFanoutSlot();
|
|
1213
|
+
}
|
|
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
|
+
};
|
|
910
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
|
+
|