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/scripts/ux-sim.ts
CHANGED
|
@@ -68,6 +68,59 @@ if (argv[0] === 'emit') {
|
|
|
68
68
|
process.exit(out.code);
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
// ── N03 키 순서열 (TUI-NEXT E4) — 진짜 PTY 에 next TUI 를 fake LLM 으로 띄워 단계별 화면 ⊕ 격리 우주 logs ──
|
|
72
|
+
// bun scripts/ux-sim.ts seat-seq <next-new-session|next-compact|next-queue|next-wakeup|next-paste|next-goal-continue|next-goal-interim|next-proactive-continue|classic-400-heal|classic-400-exhausted|classic-seat-boot|classic-typing-lag|classic-wakeup|classic-paste|classic-goal-continue|classic-goal-interim|classic-orphan-autostop> --root <빈 폴더> [--installed | --executable <bun> --entry <elanous.mjs>] [--expect-sha <sha256>] [--json]
|
|
73
|
+
// 기본 실행 = 이 트리 bin/elanous.mjs ⊕ 이 bun. --installed = ~/.local/share/elanous/current 의 elanous.mjs.
|
|
74
|
+
// rc: 0 = 모든 checks 참 · 1 = 거짓이 있다 · 2 = 인자 오류
|
|
75
|
+
if (argv[0] === 'seat-seq') {
|
|
76
|
+
const rest = argv.slice(1);
|
|
77
|
+
const SEQ_FLAGS = new Set(['--root', '--installed', '--executable', '--entry', '--expect-sha', '--json']);
|
|
78
|
+
const SEQ_VALUED = new Set(['--root', '--executable', '--entry', '--expect-sha']);
|
|
79
|
+
const unknown = rest.filter((a) => a.startsWith('--') && !SEQ_FLAGS.has(a));
|
|
80
|
+
if (unknown.length > 0) { console.error(`⛔ 모르는 인자다: ${unknown.join(' ')} — 아는 것: ${[...SEQ_FLAGS].join(' · ')}`); process.exit(2); }
|
|
81
|
+
const value = (flag: string): string | undefined => {
|
|
82
|
+
const i = rest.indexOf(flag);
|
|
83
|
+
if (i < 0) return undefined;
|
|
84
|
+
const v = rest[i + 1];
|
|
85
|
+
if (!v || v.startsWith('--')) { console.error(`⛔ ${flag} 에 값이 필요하다`); process.exit(2); }
|
|
86
|
+
return v;
|
|
87
|
+
};
|
|
88
|
+
const { NEXT_TUI_SCENARIOS, runNextTuiScenario } = await import('../src/ux-sim/next-tui-seat-scenarios.js');
|
|
89
|
+
const { CLASSIC_TUI_SCENARIOS, runClassicTuiScenario } = await import('../src/ux-sim/classic-tui-seat-scenarios.js');
|
|
90
|
+
const ALL_SEQ: readonly string[] = [...NEXT_TUI_SCENARIOS, ...CLASSIC_TUI_SCENARIOS];
|
|
91
|
+
const scenario = rest.find((a, i) => !a.startsWith('--') && !SEQ_VALUED.has(rest[i - 1] ?? ''));
|
|
92
|
+
if (!scenario || !ALL_SEQ.includes(scenario)) { console.error(`⛔ 시나리오: ${ALL_SEQ.join(' | ')}`); process.exit(2); }
|
|
93
|
+
const root = value('--root');
|
|
94
|
+
if (!root) { console.error('⛔ --root <빈 폴더> 가 필요하다(격리 우주 · 남긴다)'); process.exit(2); }
|
|
95
|
+
const { homedir } = await import('node:os');
|
|
96
|
+
const { join: pjoin, resolve: presolve } = await import('node:path');
|
|
97
|
+
const { realpathSync } = await import('node:fs');
|
|
98
|
+
const installedEntry = pjoin(homedir(), '.local', 'share', 'elanous', 'current', 'node_modules', 'elanous', 'bin', 'elanous.mjs');
|
|
99
|
+
if (rest.includes('--installed') && rest.includes('--entry')) { console.error('⛔ --installed 와 --entry 는 함께 못 준다 — 어느 elanous.mjs 로 낸 원문인지 갈라야 한다'); process.exit(2); }
|
|
100
|
+
let entry: string;
|
|
101
|
+
if (rest.includes('--installed')) {
|
|
102
|
+
try { entry = realpathSync(installedEntry); } catch { console.error(`⛔ 설치본 없음: ${installedEntry}`); process.exit(2); }
|
|
103
|
+
} else entry = presolve(value('--entry') ?? pjoin(import.meta.dir, '..', 'bin', 'elanous.mjs'));
|
|
104
|
+
const executable = value('--executable') ?? process.execPath;
|
|
105
|
+
const expected = value('--expect-sha');
|
|
106
|
+
const pin = expected ? { expectedBinarySha256: expected } : {};
|
|
107
|
+
// classic-* = bare `elanous`(대시보드) · next-* = `--tui next`. 결과 모양은 같다(run · store · logs · checks).
|
|
108
|
+
const result = (CLASSIC_TUI_SCENARIOS as readonly string[]).includes(scenario)
|
|
109
|
+
? await runClassicTuiScenario({ scenario: scenario as (typeof CLASSIC_TUI_SCENARIOS)[number], root, executable, entry, ...pin })
|
|
110
|
+
: await runNextTuiScenario({ scenario: scenario as (typeof NEXT_TUI_SCENARIOS)[number], root, executable, entry, ...pin });
|
|
111
|
+
if (rest.includes('--json')) console.log(JSON.stringify(result, null, 2));
|
|
112
|
+
else {
|
|
113
|
+
console.log(`scenario=${result.scenario} universe=${result.universe}`);
|
|
114
|
+
console.log(`binary=${result.run.executable} sha256=${result.run.binarySha256} entry=${result.run.args[0]} entrySha256=${result.run.entrySha256}`);
|
|
115
|
+
for (const f of result.run.frames) console.log(`===== ${f.label} =====\n${f.screen}\n`);
|
|
116
|
+
console.log(`store=${JSON.stringify(result.store)}`);
|
|
117
|
+
console.log(`logs: ${result.logs.command} (rc=${result.logs.rc})`);
|
|
118
|
+
for (const l of result.logs.lines) console.log(l);
|
|
119
|
+
for (const [k, v] of Object.entries(result.checks)) console.log(`check ${k}=${v}`);
|
|
120
|
+
}
|
|
121
|
+
process.exit(Object.values(result.checks).every(Boolean) ? 0 : 1);
|
|
122
|
+
}
|
|
123
|
+
|
|
71
124
|
// ⛔⭐ 모르는 인자를 «조용히 삼키지» 않는다 — 이름을 대고 거부한다.
|
|
72
125
|
//
|
|
73
126
|
// 🚨 2026-08-27 실측: `--trajectory-list`(오타 · 실제는 `--list-trajectories`)를 쳤더니
|
package/skills/README.md
CHANGED
|
@@ -66,6 +66,7 @@ bun -e '
|
|
|
66
66
|
|---|---|---|
|
|
67
67
|
| [`grill-me`](grill-me/SKILL.md) | 계획·설계를 공감대에 이를 때까지 인터뷰 | ⛔ 아니다(`disable-model-invocation`) — 사람이 부른다 |
|
|
68
68
|
| [`video-builder`](video-builder/SKILL.md) | 영상 파이프라인을 «능력·구현·구간»으로 조립 — 추천 스택·크레딧·구멍 | ⛔ 아니다(`autoTrigger` 미선언) — 슬래시로 «먼저» 연다 |
|
|
69
|
+
| [`floorplan-to-film`](floorplan-to-film/SKILL.md) | 평면도(PDF·이미지·치수) → 2D 수정 도면 → Blender 3D 투시도(Higgsfield Bridge MCP · 미연결 대안 cli-anything-blender) → 워크스루 영상 — 조립·자막·BGM 은 video-builder | O — `autoTrigger` 선언(«평면도로 3D»·«인테리어 영상» 명시 트리거 · 점수 2.0↑ 일 때 자동, 그 전엔 제안) |
|
|
69
70
|
|
|
70
71
|
---
|
|
71
72
|
|
|
@@ -34,7 +34,8 @@
|
|
|
34
34
|
// headless-core guard test asserts the bridge stays TUI-free so
|
|
35
35
|
// Core really can run headless.
|
|
36
36
|
|
|
37
|
-
import type
|
|
37
|
+
import { nextTurnFallbackProvider, resolveDefaultProvider, type LLMMessage, type LLMProvider, type LLMToolSpec, type ContentBlock } from '../llm.js';
|
|
38
|
+
import { readAutohealProviderFallback } from '../self-health/autoheal.js';
|
|
38
39
|
import { debug, redactSecretText } from '../debug/log.js';
|
|
39
40
|
import { CoreTurnAuthRejectedError } from '../core-turn/auth-rejected-notice.js';
|
|
40
41
|
import {
|
|
@@ -208,6 +209,9 @@ export function bridgeCoreTurnToAcp(
|
|
|
208
209
|
deps: CoreTurnBridgeDeps,
|
|
209
210
|
): NonNullable<AcpServerOptions['runTurn']> {
|
|
210
211
|
const pollMs = deps.abortPollMs ?? DEFAULT_BRIDGE_ABORT_POLL_MS;
|
|
212
|
+
// TUI-400-AUTOHEAL-FALLBACK ② — 앞 턴이 «실제로» 마지막에 부른 공급자(턴 안 폴백이 넘겼으면 넘어간 쪽).
|
|
213
|
+
// ② 의 제외 목록에 기본 공급자와 함께 넣는다 — 방금 400 을 낸 쪽을 다시 고르지 않게(r2 리뷰).
|
|
214
|
+
let lastResolvedProvider: string | null = null;
|
|
211
215
|
return async (turnCtx: AcpTurnContext): Promise<void> => {
|
|
212
216
|
const ctrl = new AbortController();
|
|
213
217
|
const poll = setInterval(() => {
|
|
@@ -262,6 +266,25 @@ export function bridgeCoreTurnToAcp(
|
|
|
262
266
|
}
|
|
263
267
|
}
|
|
264
268
|
const modelOverride = deps.resolveModel?.({ sessionId: turnCtx.sessionId, userText: turnCtx.userText });
|
|
269
|
+
// TUI-400-AUTOHEAL-FALLBACK ② — TUI 가 «이 턴은 다음 공급자로» 를 실어 보냈다(같은 턴이 400 을 두 번 받은 뒤).
|
|
270
|
+
// ⛔ 고르는 것은 서버다 — 클라이언트는 표지만 싣고, 공급자는 이 프로세스의 `llm.fallbackChain` 해석으로 정한다.
|
|
271
|
+
// ⛔ in-process TUI(tuiRouting) 만 — 데몬 ACP 는 종전 그대로.
|
|
272
|
+
let autohealProvider: { initialProvider: LLMProvider; skipProviders: readonly string[] } | null = null;
|
|
273
|
+
const autohealStep2 = deps.tuiRouting === true && readAutohealProviderFallback(turnCtx.promptMeta);
|
|
274
|
+
// ② 표지가 없는 프롬프트(새 턴 · ① 재시도)는 «그 턴» 의 시도다 — 앞 턴이 폴백으로 넘긴 공급자를 들고 오지 않는다(r3 리뷰).
|
|
275
|
+
if (!autohealStep2) lastResolvedProvider = null;
|
|
276
|
+
if (autohealStep2) {
|
|
277
|
+
try {
|
|
278
|
+
const failed = [...new Set([resolveDefaultProvider(modelOverride).name, ...(lastResolvedProvider ? [lastResolvedProvider] : [])])];
|
|
279
|
+
const next = nextTurnFallbackProvider(failed);
|
|
280
|
+
debug.log('self-health.autoheal', next ? 'provider-fallback-applied' : 'provider-fallback-none', {
|
|
281
|
+
sessionId: turnCtx.sessionId, from: failed[0], skipped: failed, to: next?.name ?? null,
|
|
282
|
+
}, { level: 'warn' });
|
|
283
|
+
if (next) autohealProvider = { initialProvider: next, skipProviders: failed };
|
|
284
|
+
} catch (error) {
|
|
285
|
+
debug.log('self-health.autoheal', 'provider-fallback-none', { sessionId: turnCtx.sessionId, error: String(error) }, { level: 'warn' });
|
|
286
|
+
}
|
|
287
|
+
}
|
|
265
288
|
// Tier 2 arming(config-gated·2026-07-19 goal-exec → 아크4 전-family) — llm.goalLoop.enabled
|
|
266
289
|
// 면 across-turn goal loop(runGoalLoop)로 감싸 목표 완료(update_goal 증거게이트)까지 지속·
|
|
267
290
|
// continuation 재주입. **family 무관**(runGoalLoop 프롬프트·update_goal 툴 전부 provider-generic·
|
|
@@ -393,7 +416,7 @@ export function bridgeCoreTurnToAcp(
|
|
|
393
416
|
{ reasoning: true },
|
|
394
417
|
);
|
|
395
418
|
});
|
|
396
|
-
const
|
|
419
|
+
const buildCoreTurnContext = (): CoreTurnContext => ({
|
|
397
420
|
sessionId: turnCtx.sessionId,
|
|
398
421
|
...(originSessionId ? { originSessionId } : {}),
|
|
399
422
|
...(turnCtx.userText ? { userText: turnCtx.userText } : {}),
|
|
@@ -402,6 +425,7 @@ export function bridgeCoreTurnToAcp(
|
|
|
402
425
|
dispatchTool,
|
|
403
426
|
signal: ctrl.signal,
|
|
404
427
|
...(modelOverride !== undefined ? { modelOverride } : {}),
|
|
428
|
+
...(autohealProvider ?? {}),
|
|
405
429
|
...(maxToolTurns !== undefined ? { maxToolTurns } : {}),
|
|
406
430
|
...((!factQuestion || explicitMaxToolTurns !== undefined) && deps.budgetGrant !== undefined ? { budgetGrant: deps.budgetGrant } : {}),
|
|
407
431
|
callbacks: {
|
|
@@ -438,7 +462,7 @@ export function bridgeCoreTurnToAcp(
|
|
|
438
462
|
onToolResult: (call) => { void turnCtx.pushToolResult(call); },
|
|
439
463
|
// 실제로 응답한 공급자·모델을 기억한다 — 폴백 체인이 넘기면(예 codex → grok) 턴 모델(turnModel)과 달라진다.
|
|
440
464
|
// streamLLMWithTools 가 스트림을 (다시) 열 때마다 부른다 → 사용량 직전 값 = 그 사용량을 낸 쪽.
|
|
441
|
-
onResolvedProvider: (provider, model) => { resolvedRoute = { provider, model }; },
|
|
465
|
+
onResolvedProvider: (provider, model) => { resolvedRoute = { provider, model }; lastResolvedProvider = provider; },
|
|
442
466
|
// 턴 모델(라우팅 결과)을 실어 보낸다 — 대시보드 턴 지표가 설정 모델로 ctx·단가를 잡지 않게.
|
|
443
467
|
// ⭐ 폴백이면 «넘어간» 모델·공급자를 싣는다(TUI-MODEL-BADGE-ACTUAL · 완료 배지가 읽는다 · 상태줄·/model 은 후속 TUI-MODEL-BADGE-SOURCE).
|
|
444
468
|
onUsage: (usage) => {
|
|
@@ -606,11 +630,29 @@ export function bridgeCoreTurnToAcp(
|
|
|
606
630
|
}
|
|
607
631
|
},
|
|
608
632
|
},
|
|
609
|
-
|
|
610
|
-
|
|
633
|
+
});
|
|
634
|
+
// TUI-SPEECH-STYLE-DAEMON — 자동 수복 1회: 하위 단계가 aborted(수렴 실패)로 끝나면 실패 범위만
|
|
635
|
+
// 좁혀 같은 시드로 «정확히 1회» 다시 돈다. 사용자 중단(isAborted)은 수복 대상이 아니며, 원래
|
|
636
|
+
// 완료 경계(onTurnComplete 1회 지속 · 최종 답 표면화)는 복구된 시도가 그대로 이어받는다.
|
|
637
|
+
let attempt = 0;
|
|
638
|
+
let dispatchResult: unknown;
|
|
639
|
+
let stopReason: unknown;
|
|
640
|
+
for (;;) {
|
|
641
|
+
attempt += 1;
|
|
642
|
+
// 오류·취소로 끝나 onTurnComplete 가 안 불려도 마지막 추론 문단을 내보낸다(#28964 리뷰 FU-1 · 빈 버퍼면 무동작).
|
|
643
|
+
dispatchResult = await runTurnDispatch(buildCoreTurnContext()).finally(() => reasoningThoughts.flush());
|
|
644
|
+
stopReason = (dispatchResult as { stopReason?: unknown } | null | undefined)?.stopReason;
|
|
645
|
+
const userCancelled = ctrl.signal.aborted || turnCtx.isAborted();
|
|
646
|
+
if (stopReason !== 'aborted' || userCancelled || attempt >= 2) break;
|
|
647
|
+
// 첫 시도의 잔류 스트림·보충은 폐기한다 — 복구 시도의 완료 경계가 폐기물로 오염되지 않게.
|
|
648
|
+
streamedTextSum = '';
|
|
649
|
+
finalSupplement = null;
|
|
650
|
+
try {
|
|
651
|
+
debug.log('acp.turn', 'autoheal-retry', { sessionId: turnCtx.sessionId, attempt: attempt + 1 });
|
|
652
|
+
} catch { /* observation cannot interrupt a turn */ }
|
|
653
|
+
}
|
|
611
654
|
// ⭐ 인증 거절은 코어 턴이 «던지지 않고» 돌려준다 — 여기서 안 읽으면 서버는 end_turn 을 내고
|
|
612
655
|
// TUI 엔 «✔ 완료»만 남는다(TUI 결함 #22). 던져서 실패 경로(prompt-failed · 오류 줄)로 보낸다.
|
|
613
|
-
const stopReason = (dispatchResult as { stopReason?: unknown } | null | undefined)?.stopReason;
|
|
614
656
|
if (stopReason === 'auth_rejected') {
|
|
615
657
|
const rawError = (dispatchResult as { errorMessage?: unknown }).errorMessage;
|
|
616
658
|
const error = new CoreTurnAuthRejectedError(typeof rawError === 'string' ? rawError : undefined);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const DELEGATE_HINT = '[delegate] 남은 일 중 서로 독립인 단위나 긴 조사는 Agent 도구로 서브에이전트에 넘겨라(가능하면 동시에 · 긴 일은 run_in_background) — 결과는 자동으로 회수된다. 너는 조율과 마무리를 맡는다.';
|
|
2
|
+
|
|
3
|
+
export function shouldHintDelegate({
|
|
4
|
+
iteration, maxIterations, toolCallsThisIteration, toolBudget, alreadyHinted,
|
|
5
|
+
}: {
|
|
6
|
+
iteration: number;
|
|
7
|
+
maxIterations: number;
|
|
8
|
+
toolCallsThisIteration: number;
|
|
9
|
+
toolBudget: number;
|
|
10
|
+
alreadyHinted: boolean;
|
|
11
|
+
}): boolean {
|
|
12
|
+
return !alreadyHinted && (
|
|
13
|
+
(iteration >= 2 && iteration <= maxIterations)
|
|
14
|
+
|| (toolBudget > 0 && toolCallsThisIteration >= toolBudget * 0.8)
|
|
15
|
+
);
|
|
16
|
+
}
|
package/src/agent/runner.ts
CHANGED
|
@@ -330,6 +330,66 @@ export function filterAgentTools(
|
|
|
330
330
|
return filtered.length > 0 ? filtered : undefined;
|
|
331
331
|
}
|
|
332
332
|
|
|
333
|
+
// ── SUBAGENT-ENCAPSULATION (0.2.36 · 대표 10-22 «서브에이전트 안의 행위는 안에서 해결 · 밖으로는 이상 상황에서만») ──
|
|
334
|
+
//
|
|
335
|
+
// 🚨 실물(n8n wS:p1 · 22:4x): 서브에이전트가 1~2분 만에 «…하지 못했습니다» 로 끝나 메인 대화에 끼어들었다.
|
|
336
|
+
// ⭐ 자식 답이 «못 했다»형이고 이상 사유(막힘·권한·사람 필요·예산)가 없으면 «안에서» 잇는다 — 상한 SUBAGENT_CONTINUE_INSIDE_CAP.
|
|
337
|
+
// 같은 답이 다시 나오면(같은 원인 반복) 그때 밖으로 낸다 = 이상 상황.
|
|
338
|
+
// 세 얼굴: 관측 = agent.encapsulation continue-inside / surfaced{reason} · 인지 = 미완형 ∧ 이상 사유 없음 ·
|
|
339
|
+
// 힐링 = 이어가기 지시 한 턴 · 상한·반복이면 그대로 반환(실패를 숨기지 않는다).
|
|
340
|
+
|
|
341
|
+
export const SUBAGENT_CONTINUE_INSIDE_CAP = 2;
|
|
342
|
+
|
|
343
|
+
export const SUBAGENT_CONTINUE_INSIDE_PROMPT = [
|
|
344
|
+
'[continue inside]',
|
|
345
|
+
'아직 맡은 일이 끝나지 않았다. 부모에게 «못 했다»를 돌려주지 말고 지금 이어서 끝까지 하라 — 막힌 도구는 다른 방법(다른 도구·인자·순서)으로 다시 시도하라.',
|
|
346
|
+
'정말 더 갈 수 없을 때(권한 없음 · 사람이 정해야 함 · 같은 장애 반복)만 «BLOCKED: <사유> · <시도한 것>» 한 줄로 끝내라. 끝났으면 결과와 증거만 짧게.',
|
|
347
|
+
].join('\n');
|
|
348
|
+
|
|
349
|
+
const INCOMPLETE_EXIT = /(?:하지 못했|못했습니다|못 했습니다|완료하지 못|완료되지 않|끝내지 못|보고할 수 없|could not (?:complete|finish)|unable to (?:complete|finish)|not (?:yet )?(?:complete|completed|done|finished))/i;
|
|
350
|
+
const ABNORMAL_EXIT = /(?:BLOCKED:|needs-human|사람이 (?:정해|결정)|권한(?:이)? (?:없|부족)|permission denied|예산(?:을)? (?:소진|초과)|budget exhausted|quota)/i;
|
|
351
|
+
|
|
352
|
+
/** 자식 답을 가른다 — 'done'(밖으로) · 'abnormal'(이상 상황 · 밖으로) · 'incomplete'(안에서 잇는다). 순수. */
|
|
353
|
+
export function classifySubagentExit(text: string): 'done' | 'abnormal' | 'incomplete' {
|
|
354
|
+
if (ABNORMAL_EXIT.test(text)) return 'abnormal';
|
|
355
|
+
return INCOMPLETE_EXIT.test(text) ? 'incomplete' : 'done';
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/** 걸음의 «답» 텍스트(마지막 도구 라운드 뒤)를 붙들어 두는 칸 — 걸음이 끝나 «밖으로 낼 답»으로 판정된 뒤에만
|
|
359
|
+
* 부모에게 흘린다(r1 must-fix). 안에서 이어간 걸음의 답(«…하지 못했습니다»)은 부모 소비자에게 닿지 않는다.
|
|
360
|
+
* 도구 호출 앞 진행 서술은 순서대로 바로 흘린다(이벤트 순서 계약 유지). */
|
|
361
|
+
export interface SubagentStepBuffer {
|
|
362
|
+
/** 새 걸음을 시작한다 — 앞 걸음에 남은 텍스트는 버리고 그 글자 수를 돌려준다. */
|
|
363
|
+
reset(): number;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
async function runEncapsulated(task: AgentTask, runOnce: () => Promise<string>, step: SubagentStepBuffer): Promise<string> {
|
|
367
|
+
step.reset();
|
|
368
|
+
let text = await runOnce();
|
|
369
|
+
const seen = new Set<string>([text.trim()]);
|
|
370
|
+
for (let attempt = 1; attempt <= SUBAGENT_CONTINUE_INSIDE_CAP; attempt++) {
|
|
371
|
+
const kind = classifySubagentExit(text);
|
|
372
|
+
if (kind !== 'incomplete' || task.controller.signal.aborted) {
|
|
373
|
+
// 첫 걸음에서 바로 끝나도 남긴다(should-fix) — 종료 건수를 이 이벤트 하나로 셀 수 있게.
|
|
374
|
+
debug.log('agent.encapsulation', 'surfaced', { taskId: task.id, agent: task.definition.name, reason: kind, attempts: attempt - 1 }, attempt === 1 && kind === 'done' ? { level: 'debug' } : undefined);
|
|
375
|
+
return text;
|
|
376
|
+
}
|
|
377
|
+
const droppedStreamChars = step.reset();
|
|
378
|
+
debug.log('agent.encapsulation', 'continue-inside', { taskId: task.id, agent: task.definition.name, attempt, chars: text.length, droppedStreamChars });
|
|
379
|
+
task.messages.push({ role: 'user', content: SUBAGENT_CONTINUE_INSIDE_PROMPT });
|
|
380
|
+
text = await runOnce();
|
|
381
|
+
const key = text.trim();
|
|
382
|
+
if (seen.has(key)) {
|
|
383
|
+
debug.log('agent.encapsulation', 'surfaced', { taskId: task.id, agent: task.definition.name, reason: 'same-reply', attempts: attempt }, { level: 'warn' });
|
|
384
|
+
return text;
|
|
385
|
+
}
|
|
386
|
+
seen.add(key);
|
|
387
|
+
}
|
|
388
|
+
const final = classifySubagentExit(text);
|
|
389
|
+
debug.log('agent.encapsulation', 'surfaced', { taskId: task.id, agent: task.definition.name, reason: final === 'incomplete' ? 'cap' : final, attempts: SUBAGENT_CONTINUE_INSIDE_CAP }, final === 'incomplete' ? { level: 'warn' } : undefined);
|
|
390
|
+
return text;
|
|
391
|
+
}
|
|
392
|
+
|
|
333
393
|
// ── runAgent ──
|
|
334
394
|
|
|
335
395
|
/** Stream an agent's execution as a sequence of AgentEvent frames.
|
|
@@ -390,7 +450,17 @@ export async function* runAgent(
|
|
|
390
450
|
|
|
391
451
|
// Kick off the LLM call. Callbacks push events to the queue; the
|
|
392
452
|
// promise's resolution/rejection closes the queue.
|
|
393
|
-
|
|
453
|
+
// SUBAGENT-ENCAPSULATION — 한 번의 tool loop 를 «한 걸음»으로 두고, 그 답이 «못 했다»형이면 안에서 잇는다(아래 runEncapsulated).
|
|
454
|
+
// 걸음별 스트림 버퍼 — 판정 전 텍스트는 부모에게 흘리지 않는다(runEncapsulated 가 밖으로 낼 걸음만 flush).
|
|
455
|
+
let stepDeltas: string[] = [];
|
|
456
|
+
const stepBuffer: SubagentStepBuffer = {
|
|
457
|
+
reset: () => { const dropped = stepDeltas.join('').length; stepDeltas = []; return dropped; },
|
|
458
|
+
};
|
|
459
|
+
const flushStep = (): void => {
|
|
460
|
+
for (const delta of stepDeltas) queue.push({ type: 'text', delta });
|
|
461
|
+
stepDeltas = [];
|
|
462
|
+
};
|
|
463
|
+
const runOnce = (): Promise<string> => streamLLMWithTools(
|
|
394
464
|
task.messages,
|
|
395
465
|
{
|
|
396
466
|
// ⛔⭐⭐ 빈 델타는 «에이전트 이벤트»가 아니다 — LLM 층의 «표식»이다.
|
|
@@ -406,8 +476,12 @@ export async function* runAgent(
|
|
|
406
476
|
// 📌 그래서 라이브 소비자는 여전히 «툴 라운드 «전»» 텍스트를 화면에 들고 있고,
|
|
407
477
|
// 최종 `done.text` 는 그것을 «뺀» 값이다(실측: 델타 누적 "checking done" ↔ done.text " done").
|
|
408
478
|
// ⇒ 그건 «별개 결손»이고 이 줄이 고치지 않는다. AgentEvent 에 지움 의미가 생겨야 닫힌다.
|
|
409
|
-
onText: (delta) => { if (delta !== '')
|
|
479
|
+
onText: (delta) => { if (delta !== '') stepDeltas.push(delta); },
|
|
410
480
|
onToolCall: (call) => {
|
|
481
|
+
// 도구 호출 앞 텍스트는 걸음의 «답»이 아니라 진행 서술이다 — 순서를 지켜 바로 흘린다.
|
|
482
|
+
// 붙들어 두는 것은 마지막 도구 라운드 뒤의 텍스트(= 이 걸음의 답)뿐이다.
|
|
483
|
+
flushStep();
|
|
484
|
+
task.toolCallCount = (task.toolCallCount ?? 0) + 1;
|
|
411
485
|
queue.push({ type: 'status', stage: 'tool' });
|
|
412
486
|
queue.push({ type: 'tool_call', id: call.id, name: call.name, args: call.args });
|
|
413
487
|
},
|
|
@@ -416,6 +490,8 @@ export async function* runAgent(
|
|
|
416
490
|
queue.push({ type: 'status', stage: 'thinking' });
|
|
417
491
|
},
|
|
418
492
|
dispatchTool,
|
|
493
|
+
// 이 걸음의 새 메시지(도구 호출·결과·답)를 이력에 이어 둔다 — 안에서 이어갈 때 앞 걸음을 잊지 않게.
|
|
494
|
+
onTurnComplete: (newMessages) => { task.messages.push(...newMessages); },
|
|
419
495
|
},
|
|
420
496
|
{
|
|
421
497
|
model: modelResolution.model,
|
|
@@ -425,9 +501,11 @@ export async function* runAgent(
|
|
|
425
501
|
maxTurns: opts.maxTurns,
|
|
426
502
|
},
|
|
427
503
|
);
|
|
504
|
+
const runPromise = runEncapsulated(task, runOnce, stepBuffer);
|
|
428
505
|
|
|
429
506
|
runPromise.then(
|
|
430
507
|
(text) => {
|
|
508
|
+
flushStep();
|
|
431
509
|
task.result = text;
|
|
432
510
|
task.state = 'done';
|
|
433
511
|
task.finishedAt = Date.now();
|
|
@@ -440,6 +518,8 @@ export async function* runAgent(
|
|
|
440
518
|
try { opts.onTerminal?.(task); } catch { /* registry isolates */ }
|
|
441
519
|
},
|
|
442
520
|
(err) => {
|
|
521
|
+
// 중단·오류 걸음의 부분 텍스트는 예전처럼 흘린다(취소 결과의 output 이 이 누적에 기댄다).
|
|
522
|
+
flushStep();
|
|
443
523
|
task.finishedAt = Date.now();
|
|
444
524
|
if (task.controller.signal.aborted) {
|
|
445
525
|
task.state = 'aborted';
|
|
@@ -30,6 +30,10 @@ import {
|
|
|
30
30
|
import type { AgentTask } from './types.js';
|
|
31
31
|
import { globalAgentFlash } from '../display/agent-flash.js';
|
|
32
32
|
import { debug } from '../debug/log.js';
|
|
33
|
+
import { DATA_DIR } from '../config.js';
|
|
34
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
35
|
+
import { join } from 'node:path';
|
|
36
|
+
import { randomUUID } from 'node:crypto';
|
|
33
37
|
|
|
34
38
|
/** Max chars of the child's final result we echo in the notification.
|
|
35
39
|
* The parent can still fetch the full text via the registry if it
|
|
@@ -49,6 +53,10 @@ export interface PendingTaskNotification {
|
|
|
49
53
|
output: string;
|
|
50
54
|
/** Whether output was truncated (for XML `truncated` attribute). */
|
|
51
55
|
truncated: boolean;
|
|
56
|
+
/** Openable full result when the completion exceeds the inline cap. */
|
|
57
|
+
resultPath?: string;
|
|
58
|
+
/** Why preservation failed; never present on a successful full-result notification. */
|
|
59
|
+
preservationError?: string;
|
|
52
60
|
/** When state === 'error', the error message from runner. */
|
|
53
61
|
errorMessage?: string;
|
|
54
62
|
/** Wall-clock ms from task.startedAt to task.finishedAt. */
|
|
@@ -57,6 +65,11 @@ export interface PendingTaskNotification {
|
|
|
57
65
|
}
|
|
58
66
|
|
|
59
67
|
export class TaskNotificationQueue {
|
|
68
|
+
constructor(
|
|
69
|
+
private readonly resultDir = join(DATA_DIR, 'agent-results'),
|
|
70
|
+
private readonly maxResultChars = 10_000_000,
|
|
71
|
+
) {}
|
|
72
|
+
|
|
60
73
|
private queue: PendingTaskNotification[] = [];
|
|
61
74
|
/** De-dup guard — same task.finishedAt can fire twice if a caller
|
|
62
75
|
* listens to both runner events and a separate `onTaskDone` hook.
|
|
@@ -67,6 +80,13 @@ export class TaskNotificationQueue {
|
|
|
67
80
|
* signal so an idle parent can open the next turn. Opening the turn
|
|
68
81
|
* itself is deliberately NOT wired here (next shard). */
|
|
69
82
|
private wakeListeners = new Set<(n: PendingTaskNotification) => void>();
|
|
83
|
+
private drainListeners = new Set<(items: readonly PendingTaskNotification[]) => void>();
|
|
84
|
+
|
|
85
|
+
/** Register a drain listener for notifications actually delivered to a turn. */
|
|
86
|
+
onDrain(listener: (items: readonly PendingTaskNotification[]) => void): () => void {
|
|
87
|
+
this.drainListeners.add(listener);
|
|
88
|
+
return () => { this.drainListeners.delete(listener); };
|
|
89
|
+
}
|
|
70
90
|
|
|
71
91
|
/** Register a wake listener; returns an unsubscribe function.
|
|
72
92
|
* Listeners survive `clear()` — they belong to the wiring, not the
|
|
@@ -78,12 +98,31 @@ export class TaskNotificationQueue {
|
|
|
78
98
|
|
|
79
99
|
enqueue(n: PendingTaskNotification): void {
|
|
80
100
|
if (this.seen.has(n.taskId)) return;
|
|
101
|
+
let pending = n;
|
|
102
|
+
if (n.output.length > TASK_NOTIFICATION_OUTPUT_CAP) {
|
|
103
|
+
const summary = n.output.slice(0, TASK_NOTIFICATION_OUTPUT_CAP);
|
|
104
|
+
try {
|
|
105
|
+
if (n.output.length > this.maxResultChars) {
|
|
106
|
+
throw new Error(`result length ${n.output.length} exceeds limit ${this.maxResultChars}`);
|
|
107
|
+
}
|
|
108
|
+
mkdirSync(this.resultDir, { recursive: true });
|
|
109
|
+
const resultPath = join(this.resultDir, `${randomUUID()}.txt`);
|
|
110
|
+
writeFileSync(resultPath, n.output, { encoding: 'utf8', flag: 'wx', mode: 0o600 });
|
|
111
|
+
pending = { ...n, output: summary, truncated: true, resultPath };
|
|
112
|
+
debug.log('agent.task-notification', 'result-preserved', { taskId: n.taskId, resultPath, length: n.output.length });
|
|
113
|
+
} catch (error) {
|
|
114
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
115
|
+
pending = { ...n, state: 'error', output: summary, truncated: true,
|
|
116
|
+
preservationError: `full result unavailable: ${reason}`, resultPath: undefined };
|
|
117
|
+
debug.log('agent.task-notification', 'result-preservation-failed', { taskId: n.taskId, reason }, { level: 'warn' });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
81
120
|
this.seen.add(n.taskId);
|
|
82
|
-
this.queue.push(
|
|
121
|
+
this.queue.push(pending);
|
|
83
122
|
debug.log('agent.task-notification', 'wake', { taskId: n.taskId, size: this.queue.length });
|
|
84
123
|
for (const listener of this.wakeListeners) {
|
|
85
124
|
try {
|
|
86
|
-
listener(
|
|
125
|
+
listener(pending);
|
|
87
126
|
} catch (error) {
|
|
88
127
|
// fail-soft — a throwing wake listener must not lose the
|
|
89
128
|
// queued notification or break sibling listeners.
|
|
@@ -106,6 +145,16 @@ export class TaskNotificationQueue {
|
|
|
106
145
|
// time for the same task (rare but possible under races) still
|
|
107
146
|
// can't double-inject. `seen` grows unbounded across a session;
|
|
108
147
|
// acceptable — a session produces O(100) tasks at most.
|
|
148
|
+
if (out.length > 0) {
|
|
149
|
+
for (const listener of this.drainListeners) {
|
|
150
|
+
try { listener(out); }
|
|
151
|
+
catch (error) {
|
|
152
|
+
debug.log('agent.task-notification', 'drain-listener-failed', {
|
|
153
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
154
|
+
}, { level: 'warn' });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
109
158
|
return out;
|
|
110
159
|
}
|
|
111
160
|
|
|
@@ -139,11 +188,7 @@ export const globalTaskNotificationQueue = new TaskNotificationQueue();
|
|
|
139
188
|
function buildPendingFromTask(task: AgentTask): PendingTaskNotification | null {
|
|
140
189
|
const state = task.state;
|
|
141
190
|
if (state !== 'done' && state !== 'error' && state !== 'aborted') return null;
|
|
142
|
-
const
|
|
143
|
-
const truncated = raw.length > TASK_NOTIFICATION_OUTPUT_CAP;
|
|
144
|
-
const output = truncated
|
|
145
|
-
? raw.slice(0, TASK_NOTIFICATION_OUTPUT_CAP) + '…(truncated)'
|
|
146
|
-
: raw;
|
|
191
|
+
const output = task.result ?? '';
|
|
147
192
|
return {
|
|
148
193
|
taskId: task.id,
|
|
149
194
|
agentName: task.definition.name,
|
|
@@ -151,7 +196,7 @@ function buildPendingFromTask(task: AgentTask): PendingTaskNotification | null {
|
|
|
151
196
|
...(task.teamName ? { teamName: task.teamName } : {}),
|
|
152
197
|
state,
|
|
153
198
|
output,
|
|
154
|
-
truncated,
|
|
199
|
+
truncated: false,
|
|
155
200
|
...(task.error ? { errorMessage: task.error } : {}),
|
|
156
201
|
durationMs: (task.finishedAt ?? Date.now()) - (task.startedAt ?? Date.now()),
|
|
157
202
|
finishedAt: task.finishedAt ?? Date.now(),
|
|
@@ -256,12 +301,13 @@ export function renderTaskNotificationsXml(
|
|
|
256
301
|
p.truncated ? `truncated="true"` : null,
|
|
257
302
|
].filter(Boolean).join(' ');
|
|
258
303
|
lines.push(` <task ${attrs}>`);
|
|
259
|
-
if (p.state === 'error' && p.errorMessage) {
|
|
260
|
-
lines.push(` <error>${escapeXml(p.errorMessage)}</error>`);
|
|
304
|
+
if (p.state === 'error' && (p.preservationError || p.errorMessage)) {
|
|
305
|
+
lines.push(` <error>${escapeXml(p.preservationError ?? p.errorMessage!)}</error>`);
|
|
261
306
|
}
|
|
262
307
|
if (p.output) {
|
|
263
308
|
lines.push(` <output>${escapeXml(p.output)}</output>`);
|
|
264
309
|
}
|
|
310
|
+
if (p.resultPath) lines.push(` <result-path>${escapeXml(p.resultPath)}</result-path>`);
|
|
265
311
|
lines.push(` </task>`);
|
|
266
312
|
}
|
|
267
313
|
lines.push('</task-notification>');
|
package/src/agent/types.ts
CHANGED
|
@@ -91,6 +91,10 @@ export interface AgentTask {
|
|
|
91
91
|
/** Full message history as the runner built it — starts with a
|
|
92
92
|
* system message + user prompt and grows with tool rounds. */
|
|
93
93
|
messages: LLMMessage[];
|
|
94
|
+
/** Tool calls the child has made so far, counted live as each call starts.
|
|
95
|
+
* `messages` only grows when a tool loop completes (and never on abort/error),
|
|
96
|
+
* so a roster that counted messages alone showed «0 tools» for a working child. */
|
|
97
|
+
toolCallCount?: number;
|
|
94
98
|
/** Final assistant text once the run completes. */
|
|
95
99
|
result?: string;
|
|
96
100
|
/** Error message when state === 'error'. */
|
|
@@ -36,10 +36,25 @@ export function isScopeRevertMustFix(mustFix: string): boolean {
|
|
|
36
36
|
return scopeSignal && revertSignal;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
/**
|
|
40
|
+
* SCOPE-ESCAPE-AS-REFINE (대표 10-22 «범위 밖 허용도 로직으로») — 범위-되돌림 must-fix 중 강등하지 «않는» 것:
|
|
41
|
+
* 삭제·보호 경로(규칙·자격증명·운영 config)를 되돌리라는 지적. 오케스트레이터 자동 정지 사유(scope-adjacency
|
|
42
|
+
* `ScopeStopReason`)와 같은 선이다 — 상한은 리뷰 문면으로 잴 수 없으니 여기서 다루지 않는다.
|
|
43
|
+
*/
|
|
44
|
+
// ⚠️ 영어 `remove` 는 «되돌려라» 동사로도 흔하다(«unrelated change, remove it») — 삭제 신호는 `delet` 만 본다.
|
|
45
|
+
const SCOPE_REVERT_KEEP_BLOCKER = /삭제|지웠|지운|delet|\.rules\b|credential|secret|auth\.json|\.env\b|config\.json|보호\s*경로|protected/i;
|
|
46
|
+
|
|
47
|
+
/** 범위-되돌림 must-fix 를 shouldFix 로 강등할 대상인가(결정론 · 문자열만). */
|
|
48
|
+
export function isDemotableScopeRevertMustFix(mustFix: string): boolean {
|
|
49
|
+
return isScopeRevertMustFix(mustFix) && !SCOPE_REVERT_KEEP_BLOCKER.test(mustFix);
|
|
50
|
+
}
|
|
51
|
+
|
|
39
52
|
export interface ReviewResult {
|
|
40
53
|
verdict: ReviewVerdict;
|
|
41
54
|
mustFix: string[];
|
|
42
55
|
shouldFix: string[];
|
|
56
|
+
/** SCOPE-ESCAPE-AS-REFINE — 리뷰어가 must-fix 로 냈지만 «범위 밖이니 되돌려라» 라서 shouldFix 로 내린 원문(관측용). */
|
|
57
|
+
scopeRevertDemoted?: string[];
|
|
43
58
|
/** 리뷰어가 판정에 앞서 더 보아야 한다고 관측한 저장소 맥락. 소비·판정에는 아직 쓰지 않는다. */
|
|
44
59
|
requirements?: string[];
|
|
45
60
|
/** 실제 리뷰가 돌았나(LLM 응답 파싱 성공). 미주입/예외로 verdict='pass' 된 경우와 진짜 PASS 구분. */
|
|
@@ -302,7 +317,7 @@ export function planReviewChunks(
|
|
|
302
317
|
*/
|
|
303
318
|
export function foldReviewResults(
|
|
304
319
|
results: readonly ReviewResult[],
|
|
305
|
-
): Pick<ReviewResult, 'verdict' | 'mustFix' | 'shouldFix' | 'requirements' | 'reviewed' | 'failureReason' | 'reviewerFallback'> {
|
|
320
|
+
): Pick<ReviewResult, 'verdict' | 'mustFix' | 'shouldFix' | 'scopeRevertDemoted' | 'requirements' | 'reviewed' | 'failureReason' | 'reviewerFallback'> {
|
|
306
321
|
const dedupe = (values: readonly string[]): string[] => [...new Set(values)];
|
|
307
322
|
const collect = (pick: (r: ReviewResult) => readonly string[] | undefined): string[] =>
|
|
308
323
|
dedupe(results.flatMap((r) => [...(pick(r) ?? [])]));
|
|
@@ -312,12 +327,14 @@ export function foldReviewResults(
|
|
|
312
327
|
const mustFix = collect((r) => r.mustFix).slice(0, 6);
|
|
313
328
|
const shouldFix = collect((r) => r.shouldFix).slice(0, 6);
|
|
314
329
|
const requirements = collect((r) => r.requirements);
|
|
330
|
+
const scopeRevertDemoted = collect((r) => r.scopeRevertDemoted);
|
|
315
331
|
const failed = results.find((r) => r.reviewed !== true);
|
|
316
332
|
const reviewerFallback = results.find((r) => r.reviewerFallback)?.reviewerFallback;
|
|
317
333
|
return {
|
|
318
334
|
verdict,
|
|
319
335
|
mustFix,
|
|
320
336
|
shouldFix,
|
|
337
|
+
...(scopeRevertDemoted.length ? { scopeRevertDemoted } : {}),
|
|
321
338
|
...(requirements.length ? { requirements } : {}),
|
|
322
339
|
reviewed: results.length > 0 && failed === undefined,
|
|
323
340
|
...(failed?.failureReason ? { failureReason: failed.failureReason } : {}),
|
|
@@ -678,6 +695,8 @@ const NO_FINDING_REMARK = new RegExp([
|
|
|
678
695
|
String.raw`^수용\s*기준(?:을|이)?\s*(?:(?:모두|전부)\s*)?충족(?:함|됨|했다|합니다)?[.。]?$`,
|
|
679
696
|
String.raw`^(?:all\s+)?acceptance\s+criteria\s+(?:are\s+)?(?:all\s+)?met\.?$`,
|
|
680
697
|
].join('|'), 'i');
|
|
698
|
+
// Unbracketed free text is more ambiguous; fold only explicit blocker-absence statements.
|
|
699
|
+
const UNBRACKETED_NO_FINDING_REMARK = /^(?:(?:블로커|차단)\s*)?(?:수준의?\s*)?(?:결함|문제|이슈|지적|블로커)(?:은|는|이|가)?\s*(?:발견되지\s*않(?:음|았(?:다|습니다)?)|없(?:음|다|습니다))[.。]?$/i;
|
|
681
700
|
// OP #3173 — 설명은 의미 추정하지 않는다. 실측으로 무소견임을 확인한 문장만 등록한다.
|
|
682
701
|
// 문법 밖 `없음 — 설명`은 실제 결함일 수 있으므로 mustFix에 남긴다.
|
|
683
702
|
const LONG_BRACKETED_SENTINEL = new RegExp(String.raw`^[([(【]\s*(?:[-—–]+\s*)?${NONE_WORD}\s*[—–\-:·]\s*([\s\S]+?)\s*[)\])】]$`, 'i');
|
|
@@ -695,6 +714,20 @@ const KNOWN_POSITIVE_FINDINGS = new Set([
|
|
|
695
714
|
'retro 사실과 tasks cover 집계는 분모 줄이 있든 없든 같다. 시험(`retro-cli.test.ts`)이 이를 고정하고, 임시 폴더는 `finally` 의 `rmSync` 로 지운다.',
|
|
696
715
|
// 이 후속 PR 자체의 ACP r2: 닫힌 무소견 문장.
|
|
697
716
|
'없음 — 막는 결함은 찾지 못했다.',
|
|
717
|
+
// REVIEW-MUSTFIX-NONE-NORMALIZE · 2026-10-22 ACP 저장 결과 #30199/#30188/#30183.
|
|
718
|
+
// 설명을 의미 추정으로 삭제하지 않는다. 원문 전체 일치만 무결함으로 접는다.
|
|
719
|
+
'(없음) #30188(UX)과 #30189(MK)는 서로 다른 파일만 고쳐서 글자 단위로 겹치는 곳이 없습니다. 합친 뒤에 새로 생긴 회귀도 찾지 못했습니다.',
|
|
720
|
+
'없음. 네 고침 모두 지금 저장소 계약과 맞는다. 하나씩 대조했다.',
|
|
721
|
+
'`catalog.yaml:24` kinds 끝에 `classify`가 있다.',
|
|
722
|
+
'`research-loop.yaml`은 노드 26개이고 `entry_node: intake`다.',
|
|
723
|
+
'`self-implement.ts:247`이 `cwd-repository`를 돌려준다.',
|
|
724
|
+
'기본 확장 판정(`scope-adjacency.ts:121`)은 삭제를 `deletion` 정지 사유로 본다.',
|
|
725
|
+
"`tier-split.ts`의 `planTierSplit`은 두 경우를 `kind:'blocked'`로 돌려보냅니다.",
|
|
726
|
+
'device-test 조각 없이 feature 조각만 있는 경우: `device-first-stage-missing`',
|
|
727
|
+
'device-test 조각이 2개 이상이거나, 첫 조각이 아니거나, 그 뒤에 feature가 아닌 조각이 섞인 경우: `device-first-order-invalid`',
|
|
728
|
+
'이 반환은 `tier-split.ts:114`에서 `handTask({ ...hand, tierSplitBlocked: plan.reason })` 한 곳으로만 이어집니다. decomposer의 timeout이나 throw도 같은 blocked 경로를 탑니다.',
|
|
729
|
+
'`task-hand.ts`는 다음 세 줄에서 이 경우를 처리합니다.',
|
|
730
|
+
"`:1066`: 카드 status를 `'failed'`로 정하고, history에 `tier-split-failed: <reason>`을 남깁니다.",
|
|
698
731
|
]);
|
|
699
732
|
function isPositiveNoFinding(text: string): boolean {
|
|
700
733
|
return KNOWN_POSITIVE_FINDINGS.has(text);
|
|
@@ -712,10 +745,13 @@ function isLongNoFindingBracket(text: string): boolean {
|
|
|
712
745
|
* ⭐ export — `parseReviewResultOutput` 가 «같은» 판정으로 저장된 결과의 표지 줄을 다시 접는다(PR-LAND-MUSTFIX-NONE · 복제 금지). */
|
|
713
746
|
export function isNoneSentinelFinding(finding: string): boolean {
|
|
714
747
|
const text = finding.trim();
|
|
715
|
-
if (!text || isBracketedPlaceholder(text)) return true;
|
|
748
|
+
if (!text || text === '[]' || isBracketedPlaceholder(text)) return true;
|
|
716
749
|
if (isPositiveNoFinding(text)) return true;
|
|
750
|
+
if (text === '(없음 — 막는 결함은 찾지 못했다.)') return true;
|
|
717
751
|
if (/^[-—–]+$/.test(text)) return true;
|
|
718
752
|
const markerText = text.replace(/^[—–-]+\s*|\s*[—–-]+$/g, '').trim();
|
|
753
|
+
const unbracketedNone = new RegExp(String.raw`^${NONE_WORD}\s*[—–\-:·]\s*(.+)$`, 'i').exec(markerText);
|
|
754
|
+
if (unbracketedNone && UNBRACKETED_NO_FINDING_REMARK.test(unbracketedNone[1]!.trim())) return true;
|
|
719
755
|
const leadingNone = /^[((]\s*(?:없음|none)\s*[))]\s+(.+)$/i.exec(markerText);
|
|
720
756
|
if (leadingNone && KNOWN_NO_FINDING_REMARKS.has(leadingNone[1]!.trim())) return true;
|
|
721
757
|
if (markerText && (BARE_SENTINEL.test(markerText) || DASH_ONLY_SENTINEL.test(markerText) || DASH_WRAPPED_BRACKETED_SENTINEL.test(markerText))) return true;
|
|
@@ -767,11 +803,27 @@ export function parseReviewResult(text: string): ReviewResult {
|
|
|
767
803
|
const first = shouldFix.shift() ?? fallbackFinding;
|
|
768
804
|
mustFix.push(first ?? 'PR 리뷰 FAIL — 재작업 필요(구체 지적 미파싱).');
|
|
769
805
|
}
|
|
806
|
+
// SCOPE-ESCAPE-AS-REFINE — 골의 대상 경로는 출발점이다: «범위 밖이니 되돌려라/분리하라» 는 블로커가 아니라 비블로커.
|
|
807
|
+
// 삭제·보호 경로 지적은 블로커로 남긴다. 남은 블로커가 없으면 FAIL → WARN(위 «FAIL 인데 must-fix 없음» 승격을 다시 타지 않는다).
|
|
808
|
+
const scopeRevertDemoted = mustFix.filter(isDemotableScopeRevertMustFix);
|
|
809
|
+
let finalVerdict = verdict;
|
|
810
|
+
if (scopeRevertDemoted.length > 0) {
|
|
811
|
+
const kept = mustFix.filter((finding) => !isDemotableScopeRevertMustFix(finding));
|
|
812
|
+
mustFix.splice(0, mustFix.length, ...kept);
|
|
813
|
+
// 리뷰어가 원래 낸 should-fix 를 앞에 둔다 — 아래 상한(6)이 원래 지적을 밀어내지 않게(강등 원문은 scopeRevertDemoted 에 전부 남는다).
|
|
814
|
+
shouldFix.push(...scopeRevertDemoted);
|
|
815
|
+
if (verdict === 'fail' && kept.length === 0) finalVerdict = 'warn';
|
|
816
|
+
try {
|
|
817
|
+
debug.log('review.parse', 'scope-revert-demoted', { count: scopeRevertDemoted.length, verdictBefore: verdict, verdictAfter: finalVerdict,
|
|
818
|
+
remainingMustFix: kept.length, heads: scopeRevertDemoted.map((finding) => safeLogText(finding, 120)) });
|
|
819
|
+
} catch { /* observation must not change parsed review data */ }
|
|
820
|
+
}
|
|
770
821
|
const fallback = text.match(/\n\[reviewer fallback: ([^\r\n]+)\]$/);
|
|
771
822
|
return {
|
|
772
|
-
verdict,
|
|
823
|
+
verdict: finalVerdict,
|
|
773
824
|
mustFix: mustFix.slice(0, 6),
|
|
774
825
|
shouldFix: shouldFix.slice(0, 6),
|
|
826
|
+
...(scopeRevertDemoted.length ? { scopeRevertDemoted } : {}),
|
|
775
827
|
...(fallback ? { reviewerFallback: fallback[1] } : {}),
|
|
776
828
|
...(requirements.length ? { requirements } : {}),
|
|
777
829
|
};
|