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
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
// L2 mock stage (ux-sim) for TUI-TYPING-LAG: a streaming scenario where a worker
|
|
2
|
+
// floods the log plane while the user types, run through the PRODUCTION
|
|
3
|
+
// StoreSink (src/mss/logging/log-store.ts · chunked drain via DebugLogBatchQueue
|
|
4
|
+
// from src/debug/batch-queue.ts) and the PRODUCTION event-loop stall monitor
|
|
5
|
+
// (src/dashboard/event-loop-stall-monitor.ts · `tui.event-loop` `stall`).
|
|
6
|
+
//
|
|
7
|
+
// The stage is a deterministic event loop on a fake clock. Main-thread cost is
|
|
8
|
+
// charged explicitly (the clock only moves when work happens), so the thresholds
|
|
9
|
+
// hold on fast and slow machines:
|
|
10
|
+
// • every StoreSink.emit charges `enqueueCostMs` (the worker burst's own task)
|
|
11
|
+
// • every row the fake store inserts charges `insertCostMs` (sqlite insert)
|
|
12
|
+
// • every key paint charges `renderCostMs`
|
|
13
|
+
// One loop iteration runs only the tasks that were due BEFORE it started — a task
|
|
14
|
+
// scheduled during the iteration waits for the next one, exactly like a chained
|
|
15
|
+
// setImmediate — and a key that arrived meanwhile is delivered between iterations.
|
|
16
|
+
//
|
|
17
|
+
// mode 'batched' — the sink is built exactly as the TUI builds it
|
|
18
|
+
// (`logStoreDrainChunkForSurface('tui')`): each drain tick inserts one
|
|
19
|
+
// bounded chunk, so a key waits for at most one chunk.
|
|
20
|
+
// mode 'inline' — the default/CLI sink (pre-fix): one tick inserts the whole burst.
|
|
21
|
+
import type { DebugBatchScheduler } from '../debug/batch-queue.js';
|
|
22
|
+
import { LogStore, StoreSink, logStoreDrainChunkForSurface } from '../mss/logging/log-store.js';
|
|
23
|
+
import type { LogRecord } from '../mss/logging/record.js';
|
|
24
|
+
import { startEventLoopStallMonitor } from '../dashboard/event-loop-stall-monitor.js';
|
|
25
|
+
|
|
26
|
+
export interface StageClock extends DebugBatchScheduler {
|
|
27
|
+
now(): number;
|
|
28
|
+
advance(ms: number): void;
|
|
29
|
+
/** Run every task that is due now, oldest first, including tasks they schedule. */
|
|
30
|
+
runDue(): number;
|
|
31
|
+
/** One event-loop iteration: run only the tasks due at its start. */
|
|
32
|
+
runIteration(): number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
interface StageTimer {
|
|
36
|
+
handle: number;
|
|
37
|
+
dueAt: number;
|
|
38
|
+
run: () => void;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function createStageClock(startMs = 1_000_000): StageClock {
|
|
42
|
+
let current = startMs;
|
|
43
|
+
let nextHandle = 1;
|
|
44
|
+
let timers: StageTimer[] = [];
|
|
45
|
+
const dueNow = (): StageTimer[] => timers
|
|
46
|
+
.filter((timer) => timer.dueAt <= current)
|
|
47
|
+
.sort((a, b) => a.dueAt - b.dueAt || a.handle - b.handle);
|
|
48
|
+
const runOne = (timer: StageTimer): boolean => {
|
|
49
|
+
if (!timers.some((t) => t.handle === timer.handle)) return false;
|
|
50
|
+
timers = timers.filter((t) => t.handle !== timer.handle);
|
|
51
|
+
timer.run();
|
|
52
|
+
return true;
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
now: () => current,
|
|
56
|
+
advance(ms) {
|
|
57
|
+
if (!Number.isFinite(ms) || ms < 0) throw new Error('stage clock advance must be a nonnegative finite number');
|
|
58
|
+
current += ms;
|
|
59
|
+
},
|
|
60
|
+
schedule(run, delayMs) {
|
|
61
|
+
const handle = nextHandle++;
|
|
62
|
+
timers = [...timers, { handle, dueAt: current + Math.max(0, delayMs), run }];
|
|
63
|
+
return handle;
|
|
64
|
+
},
|
|
65
|
+
cancel(handle) {
|
|
66
|
+
timers = timers.filter((timer) => timer.handle !== handle);
|
|
67
|
+
},
|
|
68
|
+
runDue() {
|
|
69
|
+
let ran = 0;
|
|
70
|
+
for (;;) {
|
|
71
|
+
const due = dueNow()[0];
|
|
72
|
+
if (!due) return ran;
|
|
73
|
+
if (runOne(due)) ran += 1;
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
runIteration() {
|
|
77
|
+
let ran = 0;
|
|
78
|
+
for (const timer of dueNow()) if (runOne(timer)) ran += 1;
|
|
79
|
+
return ran;
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export interface StreamingStageOptions {
|
|
85
|
+
keypresses?: number;
|
|
86
|
+
workerEventsPerKey?: number;
|
|
87
|
+
insertCostMs?: number;
|
|
88
|
+
enqueueCostMs?: number;
|
|
89
|
+
renderCostMs?: number;
|
|
90
|
+
idleBetweenKeysMs?: number;
|
|
91
|
+
flushBatchSize?: number;
|
|
92
|
+
stallThresholdMs?: number;
|
|
93
|
+
mode?: 'batched' | 'inline';
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface KeypressLagSample {
|
|
97
|
+
key: string;
|
|
98
|
+
index: number;
|
|
99
|
+
lagMs: number;
|
|
100
|
+
workerEvents: number;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export interface StreamingStageResult {
|
|
104
|
+
mode: 'batched' | 'inline';
|
|
105
|
+
samples: KeypressLagSample[];
|
|
106
|
+
maxLagMs: number;
|
|
107
|
+
/** Production `tui.event-loop` `stall` events (lag ≥ stallThresholdMs). */
|
|
108
|
+
stallCount: number;
|
|
109
|
+
stallLagsMs: number[];
|
|
110
|
+
stallThresholdMs: number;
|
|
111
|
+
workerEvents: number;
|
|
112
|
+
insertedRows: number;
|
|
113
|
+
insertBatches: number;
|
|
114
|
+
pendingEvents: number;
|
|
115
|
+
insertedSeqOrder: number[];
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export interface DashboardStreamingStage {
|
|
119
|
+
pressKey(key: string): KeypressLagSample;
|
|
120
|
+
run(): StreamingStageResult;
|
|
121
|
+
result(): StreamingStageResult;
|
|
122
|
+
dispose(): void;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const DEFAULTS: Required<StreamingStageOptions> = {
|
|
126
|
+
keypresses: 12,
|
|
127
|
+
workerEventsPerKey: 800,
|
|
128
|
+
insertCostMs: 0.5,
|
|
129
|
+
enqueueCostMs: 0.01,
|
|
130
|
+
renderCostMs: 3,
|
|
131
|
+
idleBetweenKeysMs: 150,
|
|
132
|
+
flushBatchSize: 64,
|
|
133
|
+
stallThresholdMs: 250,
|
|
134
|
+
mode: 'batched',
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
export function createDashboardStreamingStage(options: StreamingStageOptions = {}): DashboardStreamingStage {
|
|
138
|
+
const config = { ...DEFAULTS, ...options };
|
|
139
|
+
const clock = createStageClock();
|
|
140
|
+
const insertedSeqOrder: number[] = [];
|
|
141
|
+
const samples: KeypressLagSample[] = [];
|
|
142
|
+
const stallLagsMs: number[] = [];
|
|
143
|
+
let workerEvents = 0;
|
|
144
|
+
let insertBatches = 0;
|
|
145
|
+
|
|
146
|
+
// Fake LogStore: the only surface StoreSink touches on the drain path is insertBatch.
|
|
147
|
+
const fakeStore = {
|
|
148
|
+
insertBatch(rows: Array<{ rec: LogRecord; surface: string }>): void {
|
|
149
|
+
insertBatches += 1;
|
|
150
|
+
for (const row of rows) {
|
|
151
|
+
insertedSeqOrder.push(Number((row.rec.data as { seq?: number } | undefined)?.seq ?? -1));
|
|
152
|
+
clock.advance(config.insertCostMs);
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
} as unknown as LogStore;
|
|
156
|
+
|
|
157
|
+
const drainChunkSize = config.mode === 'batched' ? logStoreDrainChunkForSurface('tui') : undefined;
|
|
158
|
+
const sink = new StoreSink(fakeStore, 'tui', {
|
|
159
|
+
flushBatchSize: config.flushBatchSize,
|
|
160
|
+
flushIntervalMs: 200,
|
|
161
|
+
installExitHandlers: false,
|
|
162
|
+
scheduler: clock,
|
|
163
|
+
...(drainChunkSize !== undefined ? { drainChunkSize } : {}),
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
const disposeMonitor = startEventLoopStallMonitor({
|
|
167
|
+
thresholdMs: config.stallThresholdMs,
|
|
168
|
+
now: () => clock.now(),
|
|
169
|
+
setIntervalFn: (callback, intervalMs) => {
|
|
170
|
+
const tick = (): void => { callback(); clock.schedule(tick, intervalMs); };
|
|
171
|
+
clock.schedule(tick, intervalMs);
|
|
172
|
+
return {};
|
|
173
|
+
},
|
|
174
|
+
clearIntervalFn: () => {},
|
|
175
|
+
getContext: () => ({ streamingInFlight: true, thinkingMessage: 'Streaming' }),
|
|
176
|
+
log: (category, event, data) => {
|
|
177
|
+
if (category === 'tui.event-loop' && event === 'stall') stallLagsMs.push(Number(data.lagMs));
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
function pressKey(key: string): KeypressLagSample {
|
|
182
|
+
const index = samples.length;
|
|
183
|
+
// Worker burst — one task on the main thread emits N log records.
|
|
184
|
+
for (let seq = 0; seq < config.workerEventsPerKey; seq += 1) {
|
|
185
|
+
const globalSeq = index * config.workerEventsPerKey + seq;
|
|
186
|
+
sink.emit({ ts: new Date(clock.now()).toISOString(), category: 'worker', event: 'stream-chunk', data: { seq: globalSeq } });
|
|
187
|
+
workerEvents += 1;
|
|
188
|
+
clock.advance(config.enqueueCostMs);
|
|
189
|
+
}
|
|
190
|
+
// The key arrives now; the loop finishes the iteration already queued, then delivers it.
|
|
191
|
+
const arrivedAt = clock.now();
|
|
192
|
+
clock.runIteration();
|
|
193
|
+
clock.advance(config.renderCostMs);
|
|
194
|
+
const sample: KeypressLagSample = { key, index, lagMs: clock.now() - arrivedAt, workerEvents: config.workerEventsPerKey };
|
|
195
|
+
samples.push(sample);
|
|
196
|
+
// Drain the rest of the burst iteration by iteration, then idle until the next key.
|
|
197
|
+
while (clock.runIteration() > 0) { /* next iteration */ }
|
|
198
|
+
clock.advance(config.idleBetweenKeysMs);
|
|
199
|
+
clock.runDue();
|
|
200
|
+
return sample;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function result(): StreamingStageResult {
|
|
204
|
+
return {
|
|
205
|
+
mode: config.mode,
|
|
206
|
+
samples: [...samples],
|
|
207
|
+
maxLagMs: samples.reduce((max, sample) => Math.max(max, sample.lagMs), 0),
|
|
208
|
+
stallCount: stallLagsMs.length,
|
|
209
|
+
stallLagsMs: [...stallLagsMs],
|
|
210
|
+
stallThresholdMs: config.stallThresholdMs,
|
|
211
|
+
workerEvents,
|
|
212
|
+
insertedRows: insertedSeqOrder.length,
|
|
213
|
+
insertBatches,
|
|
214
|
+
pendingEvents: sink.pending,
|
|
215
|
+
insertedSeqOrder: [...insertedSeqOrder],
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return {
|
|
220
|
+
pressKey,
|
|
221
|
+
result,
|
|
222
|
+
dispose: () => { disposeMonitor(); },
|
|
223
|
+
run() {
|
|
224
|
+
for (let index = 0; index < config.keypresses; index += 1) pressKey(`key-${index}`);
|
|
225
|
+
sink.flush();
|
|
226
|
+
return result();
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export function runDashboardStreamingScenario(options: StreamingStageOptions = {}): StreamingStageResult {
|
|
232
|
+
const stage = createDashboardStreamingStage(options);
|
|
233
|
+
try {
|
|
234
|
+
return stage.run();
|
|
235
|
+
} finally {
|
|
236
|
+
stage.dispose();
|
|
237
|
+
}
|
|
238
|
+
}
|
|
@@ -264,10 +264,11 @@ export function emitInjectedEvent(options: EmitInjectedEventOptions): EmitInject
|
|
|
264
264
|
}
|
|
265
265
|
case 'scope-escape-held': {
|
|
266
266
|
const outOfScopeEdits = ['src/index.ts', 'src/cli/tasks-cli.ts', 'docs/_index.md'];
|
|
267
|
+
// SCOPE-ESCAPE-AS-REFINE — a held edit now always carries its stop reason (orchestrator decideScopeExpansion); without one it is new scope.
|
|
267
268
|
ledger.write('execution-scope-held', { outOfScopeEdits, nameCapReached: false, outsideCount: outOfScopeEdits.length,
|
|
268
|
-
worktreePath: `/tmp/elanous-sim/${job}`, branch, disposition: 'in-scope-only' });
|
|
269
|
+
worktreePath: `/tmp/elanous-sim/${job}`, branch, disposition: 'in-scope-only', stopReasons: ['deletion'], deleted: ['docs/_index.md'] });
|
|
269
270
|
podChildRun();
|
|
270
|
-
childEvidence({ ok: false, exitCode: 1, outOfScopeEdits, detail: 'Out-of-scope edits held in the worktree; gate and publication skipped.' });
|
|
271
|
+
childEvidence({ ok: false, exitCode: 1, outOfScopeEdits, scopeStopReasons: ['deletion'], detail: 'Out-of-scope edits held in the worktree; gate and publication skipped.' });
|
|
271
272
|
emit('self-implement.pod', 'child-error', { job, stage: 'soft-stopped', error: 'Out-of-scope edits held in the worktree' });
|
|
272
273
|
break;
|
|
273
274
|
}
|
package/src/ux-sim/fake-bin.ts
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
// ⛔ This is not a simulator of the real tool: a spec only fixes stdout · stderr ·
|
|
14
14
|
// exit code · lifetime, and records argv. Behaviour of the real tool stays with
|
|
15
15
|
// tests that run where the tool exists.
|
|
16
|
+
import { spawnSync } from 'node:child_process';
|
|
16
17
|
import { chmodSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
17
18
|
import { tmpdir } from 'node:os';
|
|
18
19
|
import { delimiter, isAbsolute, join } from 'node:path';
|
|
@@ -37,6 +38,14 @@ export interface FakeBinSpec {
|
|
|
37
38
|
* a «died without a word» failure (`status` null · `signal` set). `exitCode` is then never reached.
|
|
38
39
|
*/
|
|
39
40
|
readonly killSignal?: 'KILL' | 'TERM' | 'INT' | 'HUP' | 'ABRT' | 'SEGV';
|
|
41
|
+
/**
|
|
42
|
+
* Be the util-linux `script -q -e -c` PTY allocator itself: record the call, then `exec` the real
|
|
43
|
+
* util-linux `script` with the same argv. A test that spawns `sh -c 'script -q -e -c "$1" …'`
|
|
44
|
+
* then gets a real TTY (so `process.stdin.isTTY` is true inside the child) and the recording proves
|
|
45
|
+
* the PTY came from util-linux, not from a hand-rolled shim. Requires util-linux on PATH
|
|
46
|
+
* (`utilLinuxScript()`); incompatible with the output-faking fields below.
|
|
47
|
+
*/
|
|
48
|
+
readonly pty?: boolean;
|
|
40
49
|
}
|
|
41
50
|
|
|
42
51
|
export interface FakeBinCall {
|
|
@@ -67,6 +76,29 @@ function shellQuote(value: string): string {
|
|
|
67
76
|
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
68
77
|
}
|
|
69
78
|
|
|
79
|
+
let utilLinuxScriptCache: string | null | undefined;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Absolute path of the util-linux `script` on PATH, or `null` when this host has none
|
|
83
|
+
* (macOS ships BSD `script`, whose `-q -e -c` flags differ — see `firstRunPtySupport()`).
|
|
84
|
+
* Probed once per process: `<path>/script --version` must answer `util-linux`.
|
|
85
|
+
*/
|
|
86
|
+
export function utilLinuxScript(): string | null {
|
|
87
|
+
if (utilLinuxScriptCache !== undefined) return utilLinuxScriptCache;
|
|
88
|
+
utilLinuxScriptCache = null;
|
|
89
|
+
for (const dir of (process.env.PATH ?? '').split(delimiter)) {
|
|
90
|
+
if (!dir) continue;
|
|
91
|
+
const candidate = join(dir, 'script');
|
|
92
|
+
if (!existsSync(candidate)) continue;
|
|
93
|
+
const probe = spawnSync(candidate, ['--version'], { encoding: 'utf8', timeout: 5_000 });
|
|
94
|
+
if (probe.status === 0 && `${probe.stdout ?? ''}${probe.stderr ?? ''}`.includes('util-linux')) {
|
|
95
|
+
utilLinuxScriptCache = candidate;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return utilLinuxScriptCache;
|
|
100
|
+
}
|
|
101
|
+
|
|
70
102
|
function script(name: string, spec: FakeBinSpec, dataDir: string, logPath: string): string {
|
|
71
103
|
const lines = ['#!/bin/sh'];
|
|
72
104
|
// One record per call: name and each argv entry NUL-terminated (one printf), then an ASCII record
|
|
@@ -76,6 +108,11 @@ function script(name: string, spec: FakeBinSpec, dataDir: string, logPath: strin
|
|
|
76
108
|
// for recorder and payload reads so a fake of one of those names cannot recursively call itself.
|
|
77
109
|
lines.push(`rec=$(command -p mktemp ${shellQuote(join(dataDir, 'rec.XXXXXX'))})`);
|
|
78
110
|
lines.push(`{ printf '%s\\0' ${shellQuote(name)} "$@"; printf '\\036'; } > "$rec"; command -p cat "$rec" >> ${shellQuote(logPath)}; command -p rm -f "$rec"`);
|
|
111
|
+
if (spec.pty === true) {
|
|
112
|
+
// Recorded already: exec the real util-linux script so the caller gets a genuine TTY.
|
|
113
|
+
lines.push(`exec ${shellQuote(utilLinuxScript()!)} "$@"`);
|
|
114
|
+
return `${lines.join('\n')}\n`;
|
|
115
|
+
}
|
|
79
116
|
if (spec.whenArgsStartWith !== undefined && spec.otherwise !== undefined) {
|
|
80
117
|
const words = spec.whenArgsStartWith;
|
|
81
118
|
const tests = [`[ "$#" -ge ${words.length} ]`, ...words.map((word, index) => `[ "$${index + 1}" = ${shellQuote(word)} ]`)];
|
|
@@ -118,6 +155,14 @@ export function createFakeBins(specs: Readonly<Record<string, FakeBinSpec>>): Fa
|
|
|
118
155
|
} else if (spec.otherwise !== undefined) {
|
|
119
156
|
throw new Error(`fake-bin: ${name}: otherwise is only used with whenArgsStartWith`);
|
|
120
157
|
}
|
|
158
|
+
if (spec.pty === true) {
|
|
159
|
+
if (spec.stdout !== undefined || spec.stderr !== undefined || spec.exitCode !== undefined
|
|
160
|
+
|| spec.sleepSeconds !== undefined || spec.killSignal !== undefined
|
|
161
|
+
|| spec.whenArgsStartWith !== undefined || spec.otherwise !== undefined) {
|
|
162
|
+
throw new Error(`fake-bin: ${name}: pty is a pass-through PTY allocator and takes no output/fake fields`);
|
|
163
|
+
}
|
|
164
|
+
if (utilLinuxScript() === null) throw new Error(`fake-bin: ${name}: pty needs the util-linux \`script\` on PATH (this host has none)`);
|
|
165
|
+
}
|
|
121
166
|
}
|
|
122
167
|
const root = mkdtempSync(join(tmpdir(), 'ux-sim-fake-bin-'));
|
|
123
168
|
const dir = join(root, 'bin');
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
// Fake herdr server for tests of code that drives the `herdr` CLI (TUI-HERDR-NAMED-AGENT).
|
|
2
|
+
//
|
|
3
|
+
// The real herdr 0.9.1 needs a live server socket and a terminal pane; a gate Pod has neither.
|
|
4
|
+
// This device answers the few agent/pane calls `herdr-prompt.ts` makes, as a `HerdrCliRunner`
|
|
5
|
+
// (argv in → rc · stdout · stderr out), from an in-memory pane table:
|
|
6
|
+
// agent get <target> → {"result":{"agent":{…}}} · agent_not_found (rc1)
|
|
7
|
+
// agent wait <target> [--until S]… [--timeout MS] → returns at once when the status already matches,
|
|
8
|
+
// otherwise on the next matching transition · timeout (rc1)
|
|
9
|
+
// pane run <pane> <text> → records the submission · calls `onRun` (the test's «TUI»)
|
|
10
|
+
// pane report-agent <pane>… --source S --agent A --state X --seq N
|
|
11
|
+
// → self-reported agent (herdr «Integrate your own agent»)
|
|
12
|
+
// pane release-agent <pane> --source S --agent A --seq N → releases it
|
|
13
|
+
// pane report-agent-session … → rc0 · no-op (measured: neither registers nor moves the state seq)
|
|
14
|
+
// agent list → reported agents (`reportedAgents()` is the same list)
|
|
15
|
+
// Report faults (`reportFault`, TUI-HERDR-STATUS-STALE): a `pane report-agent` can answer as a client
|
|
16
|
+
// timeout — `applied-then-timeout` (the server took it, the answer came too late: the 10-22 n8n shape)
|
|
17
|
+
// or `timeout` (never applied). The answer is `{code:null, stderr:'timeout', timedOut:true}`.
|
|
18
|
+
// Report/release seq rule measured on herdr 0.9.1 (10-22 · isolated session `tf-exit-race`):
|
|
19
|
+
// a report/release is applied only when its seq is above the last applied seq of that pane·source
|
|
20
|
+
// (smaller is rc0 and ignored); a release of an agent that is not registered is rc0 and does NOT
|
|
21
|
+
// record its seq — so a smaller-seq report arriving after it still registers (the exit-race ghost).
|
|
22
|
+
// Error envelopes follow the shape measured on herdr 0.9.1 (10-22 · isolated session `tf-herdr-e4`):
|
|
23
|
+
// {"error":{"code":"…","message":"…"},"id":"cli:agent:get"} on stderr, exit 1.
|
|
24
|
+
//
|
|
25
|
+
// ⛔ This is not a herdr simulator: it fixes only those answers and the «matches now → return now»
|
|
26
|
+
// wait rule from the herdr agent-automation doc. Real herdr behaviour stays with the isolated-session E4.
|
|
27
|
+
|
|
28
|
+
export type FakeHerdrStatus = 'idle' | 'working' | 'blocked' | 'done' | 'unknown';
|
|
29
|
+
|
|
30
|
+
export interface FakeHerdrPane {
|
|
31
|
+
readonly paneId: string;
|
|
32
|
+
/** Reported or detected agent label (`elanous`, `codex`, …). */
|
|
33
|
+
agent: string;
|
|
34
|
+
name?: string;
|
|
35
|
+
status: FakeHerdrStatus;
|
|
36
|
+
stateChangeSeq: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface FakeHerdrRunResult {
|
|
40
|
+
readonly code: number | null;
|
|
41
|
+
readonly stdout: string;
|
|
42
|
+
readonly stderr: string;
|
|
43
|
+
/** Set only by `reportFault` — the client gave up waiting (the report may or may not have been applied). */
|
|
44
|
+
readonly timedOut?: boolean;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** How one `pane report-agent` call fails (see `FakeHerdrOpts.reportFault`). */
|
|
48
|
+
export type FakeHerdrReportFault = 'applied-then-timeout' | 'timeout';
|
|
49
|
+
|
|
50
|
+
export interface FakeHerdrSubmission {
|
|
51
|
+
readonly paneId: string;
|
|
52
|
+
readonly text: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface FakeHerdr {
|
|
56
|
+
/** The `HerdrCliRunner` the code under test receives. */
|
|
57
|
+
run(argv: readonly string[], timeoutMs: number): Promise<FakeHerdrRunResult>;
|
|
58
|
+
/** Move a pane to a new status (bumps `state_change_seq`, wakes matching waits). */
|
|
59
|
+
setStatus(paneId: string, status: FakeHerdrStatus): void;
|
|
60
|
+
pane(paneId: string): FakeHerdrPane | undefined;
|
|
61
|
+
/** Every `pane run` submission, in order. */
|
|
62
|
+
submissions(): FakeHerdrSubmission[];
|
|
63
|
+
/** Every argv the runner saw, in order. */
|
|
64
|
+
calls(): string[][];
|
|
65
|
+
/**
|
|
66
|
+
* The same answers as `run` for the commands that never wait (report-agent · release-agent ·
|
|
67
|
+
* report-agent-session · agent list) — for code whose runner is synchronous (the TUI exit path).
|
|
68
|
+
*/
|
|
69
|
+
runSync(argv: readonly string[]): FakeHerdrRunResult;
|
|
70
|
+
/** Agents registered through `pane report-agent` and not released (what `agent list` shows). */
|
|
71
|
+
reportedAgents(): FakeHerdrReportedAgent[];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface FakeHerdrReportedAgent {
|
|
75
|
+
readonly paneId: string;
|
|
76
|
+
readonly source: string;
|
|
77
|
+
readonly agent: string;
|
|
78
|
+
readonly state: string;
|
|
79
|
+
readonly seq: number;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface FakeHerdrOpts {
|
|
83
|
+
readonly panes: ReadonlyArray<{ paneId: string; agent: string; name?: string; status: FakeHerdrStatus }>;
|
|
84
|
+
/** Called after a `pane run` is recorded — the test's TUI reacts here (e.g. working → idle). */
|
|
85
|
+
readonly onRun?: (submission: FakeHerdrSubmission, herdr: FakeHerdr) => void;
|
|
86
|
+
/**
|
|
87
|
+
* Fault for the n-th `pane report-agent` call (0-based, counted across run/runSync) — undefined answers normally.
|
|
88
|
+
* `applied-then-timeout` applies the report and then answers as a timeout; `timeout` answers without applying.
|
|
89
|
+
*/
|
|
90
|
+
readonly reportFault?: (argv: readonly string[], index: number) => FakeHerdrReportFault | undefined;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const SETTLED: readonly FakeHerdrStatus[] = ['idle', 'done', 'blocked'];
|
|
94
|
+
|
|
95
|
+
function errorBody(id: string, code: string, message: string): FakeHerdrRunResult {
|
|
96
|
+
return { code: 1, stdout: '', stderr: `${JSON.stringify({ error: { code, message }, id })}\n` };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function agentInfo(p: FakeHerdrPane): Record<string, unknown> {
|
|
100
|
+
return {
|
|
101
|
+
agent: p.agent,
|
|
102
|
+
agent_status: p.status,
|
|
103
|
+
pane_id: p.paneId,
|
|
104
|
+
state_change_seq: p.stateChangeSeq,
|
|
105
|
+
...(p.name !== undefined ? { name: p.name } : {}),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function createFakeHerdr(opts: FakeHerdrOpts): FakeHerdr {
|
|
110
|
+
const panes = new Map<string, FakeHerdrPane>();
|
|
111
|
+
for (const p of opts.panes) panes.set(p.paneId, { ...p, stateChangeSeq: 1 });
|
|
112
|
+
const subs: FakeHerdrSubmission[] = [];
|
|
113
|
+
const argvLog: string[][] = [];
|
|
114
|
+
const waiters = new Set<{ paneId: string; until: readonly FakeHerdrStatus[]; resolve: () => void }>();
|
|
115
|
+
|
|
116
|
+
/** pane·source → registered agent · last applied seq (kept after release). */
|
|
117
|
+
const reported = new Map<string, FakeHerdrReportedAgent>();
|
|
118
|
+
const lastSeq = new Map<string, number>();
|
|
119
|
+
const optsOf = (args: readonly string[]): { pane?: string; flags: Map<string, string> } => {
|
|
120
|
+
const flags = new Map<string, string>();
|
|
121
|
+
let pane: string | undefined;
|
|
122
|
+
for (let i = 0; i < args.length; i++) {
|
|
123
|
+
const a = args[i]!;
|
|
124
|
+
if (a.startsWith('--')) flags.set(a.slice(2), args[++i] ?? '');
|
|
125
|
+
else if (pane === undefined) pane = a;
|
|
126
|
+
}
|
|
127
|
+
return { pane, flags };
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
let reportIndex = 0;
|
|
131
|
+
const TIMEOUT: FakeHerdrRunResult = { code: null, stdout: '', stderr: 'timeout', timedOut: true };
|
|
132
|
+
/** `applyReport` with the scripted fault for `pane report-agent`. */
|
|
133
|
+
const answerReport = (argv: readonly string[]): FakeHerdrRunResult | undefined => {
|
|
134
|
+
if (argv[0] !== 'pane' || argv[1] !== 'report-agent') return applyReport(argv);
|
|
135
|
+
const fault = opts.reportFault?.(argv, reportIndex++);
|
|
136
|
+
if (fault === 'timeout') return TIMEOUT;
|
|
137
|
+
const r = applyReport(argv);
|
|
138
|
+
return fault === 'applied-then-timeout' ? TIMEOUT : r;
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
/** report-agent · release-agent · report-agent-session · agent list — answered at once (no waits). */
|
|
142
|
+
const applyReport = (argv: readonly string[]): FakeHerdrRunResult | undefined => {
|
|
143
|
+
const [group, cmd] = argv;
|
|
144
|
+
if (group === 'pane' && cmd === 'report-agent-session') return { code: 0, stdout: '', stderr: '' };
|
|
145
|
+
if (group === 'pane' && (cmd === 'report-agent' || cmd === 'release-agent')) {
|
|
146
|
+
const { pane, flags } = optsOf(argv.slice(2));
|
|
147
|
+
const source = flags.get('source') ?? '';
|
|
148
|
+
const seq = Number(flags.get('seq'));
|
|
149
|
+
if (pane === undefined || !source || !Number.isSafeInteger(seq)) {
|
|
150
|
+
return { code: 2, stdout: '', stderr: `fake-herdr: ${cmd} needs <pane> --source --seq\n` };
|
|
151
|
+
}
|
|
152
|
+
const key = `${pane}\u0000${source}`;
|
|
153
|
+
const prev = lastSeq.get(key);
|
|
154
|
+
if (prev !== undefined && seq <= prev) return { code: 0, stdout: '', stderr: '' };
|
|
155
|
+
if (cmd === 'release-agent') {
|
|
156
|
+
if (!reported.has(key)) return { code: 0, stdout: '', stderr: '' };
|
|
157
|
+
reported.delete(key);
|
|
158
|
+
lastSeq.set(key, seq);
|
|
159
|
+
return { code: 0, stdout: '', stderr: '' };
|
|
160
|
+
}
|
|
161
|
+
reported.set(key, { paneId: pane, source, agent: flags.get('agent') ?? '', state: flags.get('state') ?? reported.get(key)?.state ?? 'unknown', seq });
|
|
162
|
+
lastSeq.set(key, seq);
|
|
163
|
+
return { code: 0, stdout: '', stderr: '' };
|
|
164
|
+
}
|
|
165
|
+
if (group === 'agent' && cmd === 'list') {
|
|
166
|
+
const agents = [...reported.values()].map((a) => ({ agent: a.agent, agent_status: a.state, pane_id: a.paneId }));
|
|
167
|
+
return { code: 0, stdout: `${JSON.stringify({ id: 'cli:agent:list', result: { agents, type: 'agent_list' } })}\n`, stderr: '' };
|
|
168
|
+
}
|
|
169
|
+
return undefined;
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
const resolveTarget = (target: string): FakeHerdrPane | undefined =>
|
|
173
|
+
panes.get(target) ?? [...panes.values()].find((p) => p.name === target);
|
|
174
|
+
|
|
175
|
+
const herdr: FakeHerdr = {
|
|
176
|
+
async run(argv, timeoutMs) {
|
|
177
|
+
argvLog.push([...argv]);
|
|
178
|
+
const [group, cmd, target, ...rest] = argv;
|
|
179
|
+
if (group === 'agent' && cmd === 'get' && target !== undefined) {
|
|
180
|
+
const p = resolveTarget(target);
|
|
181
|
+
if (!p) return errorBody('cli:agent:get', 'agent_not_found', `agent target ${target} not found`);
|
|
182
|
+
return { code: 0, stdout: `${JSON.stringify({ id: 'cli:agent:get', result: { agent: agentInfo(p), type: 'agent_info' } })}\n`, stderr: '' };
|
|
183
|
+
}
|
|
184
|
+
if (group === 'agent' && cmd === 'wait' && target !== undefined) {
|
|
185
|
+
const p = resolveTarget(target);
|
|
186
|
+
if (!p) return errorBody('cli:agent:wait', 'agent_not_found', `agent target ${target} not found`);
|
|
187
|
+
const until: FakeHerdrStatus[] = [];
|
|
188
|
+
let waitTimeout: number | undefined;
|
|
189
|
+
for (let i = 0; i < rest.length; i++) {
|
|
190
|
+
if (rest[i] === '--until') until.push(rest[++i] as FakeHerdrStatus);
|
|
191
|
+
else if (rest[i] === '--timeout') waitTimeout = Number(rest[++i]);
|
|
192
|
+
}
|
|
193
|
+
const want = until.length > 0 ? until : SETTLED;
|
|
194
|
+
const ok = (): FakeHerdrRunResult => ({ code: 0, stdout: `${JSON.stringify({ id: 'cli:agent:wait', result: { agent: agentInfo(p), type: 'agent_info' } })}\n`, stderr: '' });
|
|
195
|
+
if (want.includes(p.status)) return ok();
|
|
196
|
+
const limit = Math.min(waitTimeout ?? Number.POSITIVE_INFINITY, timeoutMs);
|
|
197
|
+
return new Promise<FakeHerdrRunResult>((resolve) => {
|
|
198
|
+
const waiter = {
|
|
199
|
+
paneId: p.paneId,
|
|
200
|
+
until: want,
|
|
201
|
+
resolve: () => { clearTimeout(timer); waiters.delete(waiter); resolve(ok()); },
|
|
202
|
+
};
|
|
203
|
+
const timer = Number.isFinite(limit)
|
|
204
|
+
? setTimeout(() => { waiters.delete(waiter); resolve(errorBody('cli:agent:wait', 'timeout', `timed out waiting for agent ${target}`)); }, limit)
|
|
205
|
+
: undefined;
|
|
206
|
+
waiters.add(waiter);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
if (group === 'pane' && cmd === 'run' && target !== undefined) {
|
|
210
|
+
const p = panes.get(target);
|
|
211
|
+
if (!p) return errorBody('cli:pane:run', 'pane_not_found', `pane ${target} not found`);
|
|
212
|
+
const submission = { paneId: p.paneId, text: rest[0] ?? '' };
|
|
213
|
+
subs.push(submission);
|
|
214
|
+
opts.onRun?.(submission, herdr);
|
|
215
|
+
return { code: 0, stdout: '', stderr: '' };
|
|
216
|
+
}
|
|
217
|
+
const reportedResult = answerReport(argv);
|
|
218
|
+
if (reportedResult) return reportedResult;
|
|
219
|
+
return { code: 2, stdout: '', stderr: `fake-herdr: unsupported argv ${argv.join(' ')}\n` };
|
|
220
|
+
},
|
|
221
|
+
setStatus(paneId, status) {
|
|
222
|
+
const p = panes.get(paneId);
|
|
223
|
+
if (!p) throw new Error(`fake-herdr: no pane ${paneId}`);
|
|
224
|
+
p.status = status;
|
|
225
|
+
p.stateChangeSeq += 1;
|
|
226
|
+
for (const w of [...waiters]) if (w.paneId === paneId && w.until.includes(status)) w.resolve();
|
|
227
|
+
},
|
|
228
|
+
pane: (paneId) => panes.get(paneId),
|
|
229
|
+
submissions: () => [...subs],
|
|
230
|
+
runSync(argv) {
|
|
231
|
+
argvLog.push([...argv]);
|
|
232
|
+
return answerReport(argv) ?? { code: 2, stdout: '', stderr: `fake-herdr: runSync supports report/release/agent list only — ${argv.join(' ')}\n` };
|
|
233
|
+
},
|
|
234
|
+
calls: () => argvLog.map((a) => [...a]),
|
|
235
|
+
reportedAgents: () => [...reported.values()],
|
|
236
|
+
};
|
|
237
|
+
return herdr;
|
|
238
|
+
}
|