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
|
@@ -7,6 +7,7 @@ import { runBgLaunch, type BgLaunchResult } from '../cli/bg-launch.js';
|
|
|
7
7
|
import { joinRestHealthUrl, runNexusShow, type NexusShowResult } from '../cli/nexus-show.js';
|
|
8
8
|
import { issueSetupLinkToken } from '../auth/setup-link-tokens.js';
|
|
9
9
|
import { debug } from '../debug/log.js';
|
|
10
|
+
import { detectLocale, type Locale } from '../expression/locale.js';
|
|
10
11
|
import { browserUnavailableReason } from '../oauth/browser-availability.js';
|
|
11
12
|
import type { UserConfig } from '../user-config.js';
|
|
12
13
|
|
|
@@ -18,6 +19,8 @@ export interface WebFirstSetupDeps {
|
|
|
18
19
|
/** Bare first run never starts or waits for a missing daemon; explicit setup retains web launch. */
|
|
19
20
|
startIfMissing?: boolean;
|
|
20
21
|
startedAt?: number;
|
|
22
|
+
/** Locale for user-facing wording; defaults to the shared ambient decision (detectLocale). */
|
|
23
|
+
locale?: Locale;
|
|
21
24
|
showNexus?: () => Promise<NexusShowResult>;
|
|
22
25
|
startDaemon?: () => Promise<BgLaunchResult>;
|
|
23
26
|
probeHealth?: (url: string, timeoutMs: number) => Promise<boolean>;
|
|
@@ -37,6 +40,34 @@ export interface WebFirstSetupDeps {
|
|
|
37
40
|
|
|
38
41
|
const STARTUP_TIMEOUT_MS = 12_000;
|
|
39
42
|
|
|
43
|
+
/** User-facing web-first fallback wording, routed by the shared locale decision (detectLocale). */
|
|
44
|
+
const WEB_FIRST_TEXT = {
|
|
45
|
+
ko: {
|
|
46
|
+
unavailable: (reason: string) => `웹 셋업을 사용할 수 없습니다 (${reason}). 터미널 설정으로 전환합니다.`,
|
|
47
|
+
offline: '오프라인 모드',
|
|
48
|
+
startingDaemon: '웹 셋업을 위해 데몬을 시작합니다.',
|
|
49
|
+
continueInBrowser: '브라우저에서 셋업을 이어가세요',
|
|
50
|
+
phoneOnSameWifi: (link: string) => `같은 와이파이의 폰이면: ${link}`,
|
|
51
|
+
linkSingleUse: '이 링크는 10분 안에 한 번만 열 수 있습니다',
|
|
52
|
+
sameWifiRestart: '같은 와이파이에서 열려면 `elanous nexus run` 을 루프백 없이 다시 띄우세요',
|
|
53
|
+
scanTailnet: '같은 와이파이·tailnet 의 폰 카메라로 스캔하세요',
|
|
54
|
+
scanSameWifi: '같은 와이파이의 폰 카메라로 스캔하세요',
|
|
55
|
+
terminalInstead: '터미널에서 하려면: `elanous setup --terminal`',
|
|
56
|
+
},
|
|
57
|
+
en: {
|
|
58
|
+
unavailable: (reason: string) => `web setup is unavailable (${reason}); switching to terminal setup.`,
|
|
59
|
+
offline: 'offline mode',
|
|
60
|
+
startingDaemon: 'starting the daemon for web setup.',
|
|
61
|
+
continueInBrowser: 'continue setup in your browser',
|
|
62
|
+
phoneOnSameWifi: (link: string) => `on a phone on the same wifi: ${link}`,
|
|
63
|
+
linkSingleUse: 'this link can be opened only once within 10 minutes',
|
|
64
|
+
sameWifiRestart: 'to open it from the same wifi, restart `elanous nexus run` without a loopback-only bind',
|
|
65
|
+
scanTailnet: 'scan with a phone camera on the same wifi/tailnet',
|
|
66
|
+
scanSameWifi: 'scan with a phone camera on the same wifi',
|
|
67
|
+
terminalInstead: 'to use the terminal instead: `elanous setup --terminal`',
|
|
68
|
+
},
|
|
69
|
+
} as const;
|
|
70
|
+
|
|
40
71
|
async function probeHealth(url: string, timeoutMs: number): Promise<boolean> {
|
|
41
72
|
try {
|
|
42
73
|
const response = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) });
|
|
@@ -53,12 +84,13 @@ function setupUrl(pwa: string, token: string): string {
|
|
|
53
84
|
export async function runWebFirstSetup(deps: WebFirstSetupDeps): Promise<'link-shown' | 'fallback'> {
|
|
54
85
|
const startedAt = deps.startedAt ?? Date.now();
|
|
55
86
|
const print = deps.print ?? console.log;
|
|
87
|
+
const text = WEB_FIRST_TEXT[(deps.locale ?? detectLocale()) === 'en' ? 'en' : 'ko'];
|
|
56
88
|
const observe = (event: 'link-shown' | 'fallback', reason?: string, qr = false, browserOpened = false, remote: 'loopback' | 'tailnet' = 'loopback', ms?: number, lan?: 'shown' | 'loopback-bind' | 'no-address', ssh?: boolean) => {
|
|
57
89
|
try { debug.log('onboarding.web-first', event, { ...(reason ? { reason } : {}), qr, browserOpened, remote, ...(ms !== undefined ? { ms } : {}), ...(lan ? { lan, ssh } : {}) }); }
|
|
58
90
|
catch { /* Observability must not block onboarding. */ }
|
|
59
91
|
};
|
|
60
92
|
const fallback = (reason: string): 'fallback' => {
|
|
61
|
-
print(
|
|
93
|
+
print(text.unavailable(reason));
|
|
62
94
|
observe('fallback', reason);
|
|
63
95
|
return 'fallback';
|
|
64
96
|
};
|
|
@@ -70,7 +102,7 @@ export async function runWebFirstSetup(deps: WebFirstSetupDeps): Promise<'link-s
|
|
|
70
102
|
try { shown = await show(); } catch { /* A missing daemon may make inspection fail. */ }
|
|
71
103
|
const running = shown?.status === 'unregistered' || (shown?.status === 'registered' && shown.instance?.alive === true);
|
|
72
104
|
if (deps.startIfMissing === false && !running) {
|
|
73
|
-
print(
|
|
105
|
+
print(text.offline);
|
|
74
106
|
observe('fallback', 'offline');
|
|
75
107
|
return 'fallback';
|
|
76
108
|
}
|
|
@@ -85,11 +117,11 @@ export async function runWebFirstSetup(deps: WebFirstSetupDeps): Promise<'link-s
|
|
|
85
117
|
const deadline = Date.now() + STARTUP_TIMEOUT_MS;
|
|
86
118
|
if (!running || !shown?.urls?.pwa.loopback) {
|
|
87
119
|
if (deps.startIfMissing === false) {
|
|
88
|
-
print(
|
|
120
|
+
print(text.offline);
|
|
89
121
|
observe('fallback', 'offline');
|
|
90
122
|
return 'fallback';
|
|
91
123
|
}
|
|
92
|
-
print(
|
|
124
|
+
print(text.startingDaemon);
|
|
93
125
|
let launch: BgLaunchResult;
|
|
94
126
|
try {
|
|
95
127
|
launch = await (deps.startDaemon ?? (() => runBgLaunch({ out: { log: () => {}, error: () => {} } })))();
|
|
@@ -115,7 +147,7 @@ export async function runWebFirstSetup(deps: WebFirstSetupDeps): Promise<'link-s
|
|
|
115
147
|
if (remaining > 0) await Bun.sleep(Math.min(200, remaining));
|
|
116
148
|
}
|
|
117
149
|
if (!healthy && deps.startIfMissing === false) {
|
|
118
|
-
print(
|
|
150
|
+
print(text.offline);
|
|
119
151
|
observe('fallback', 'offline');
|
|
120
152
|
return 'fallback';
|
|
121
153
|
}
|
|
@@ -154,13 +186,13 @@ export async function runWebFirstSetup(deps: WebFirstSetupDeps): Promise<'link-s
|
|
|
154
186
|
const lan: 'shown' | 'loopback-bind' | 'no-address' = !confirmedBind ? 'no-address' : !reachable ? 'loopback-bind' : lanAddress ? 'shown' : 'no-address';
|
|
155
187
|
const lanLink = lanAddress ? setupUrl(`http://${lanAddress}:${port}/app/`, token) : undefined;
|
|
156
188
|
const phoneLink = shown.urls.pwa.tailnet ? setupUrl(shown.urls.pwa.tailnet, token) : lanLink;
|
|
157
|
-
print(
|
|
189
|
+
print(text.continueInBrowser);
|
|
158
190
|
print(link);
|
|
159
191
|
if (lanLink) {
|
|
160
|
-
print(
|
|
161
|
-
print(
|
|
192
|
+
print(text.phoneOnSameWifi(lanLink));
|
|
193
|
+
print(text.linkSingleUse);
|
|
162
194
|
} else if (lan === 'loopback-bind') {
|
|
163
|
-
print(
|
|
195
|
+
print(text.sameWifiRestart);
|
|
164
196
|
}
|
|
165
197
|
const linkShownMs = Date.now() - startedAt;
|
|
166
198
|
let qr = false;
|
|
@@ -172,12 +204,12 @@ export async function runWebFirstSetup(deps: WebFirstSetupDeps): Promise<'link-s
|
|
|
172
204
|
}))(phoneLink);
|
|
173
205
|
if (rendered) {
|
|
174
206
|
print(rendered);
|
|
175
|
-
print(shown.urls.pwa.tailnet ?
|
|
207
|
+
print(shown.urls.pwa.tailnet ? text.scanTailnet : text.scanSameWifi);
|
|
176
208
|
qr = true;
|
|
177
209
|
}
|
|
178
210
|
} catch { /* QR is optional. */ }
|
|
179
211
|
}
|
|
180
|
-
print(
|
|
212
|
+
print(text.terminalInstead);
|
|
181
213
|
let browserOpened = false;
|
|
182
214
|
const env = deps.browserEnv ?? process.env;
|
|
183
215
|
const ssh = !!(env.SSH_CONNECTION || env.SSH_CLIENT || env.SSH_TTY);
|
|
@@ -234,6 +234,16 @@ export interface CollectDeps {
|
|
|
234
234
|
gitLog?: (sinceIso: string) => { lines: string[]; observedAt: string } ;
|
|
235
235
|
}
|
|
236
236
|
|
|
237
|
+
/** Production schedule.run ledger reader; dbPath is explicit so replays never open the operating ledger. */
|
|
238
|
+
export async function readSchedulerExecutionRows(dbPath: string, sinceMs: number, untilMs: number): Promise<SchedulerExecutionObservation[]> {
|
|
239
|
+
const { LogStore } = await import('../mss/logging/log-store.js');
|
|
240
|
+
const store = LogStore.openReadOnly(dbPath);
|
|
241
|
+
try {
|
|
242
|
+
return store.queryAll({ exactCategories: ['schedule.run'], sinceMs, untilMs })
|
|
243
|
+
.map(({ ts_ms, data }) => ({ ts_ms, data }));
|
|
244
|
+
} finally { store.close(); }
|
|
245
|
+
}
|
|
246
|
+
|
|
237
247
|
async function defaultDeps(root: string): Promise<Required<CollectDeps>> {
|
|
238
248
|
const [{ listSchedules }, { listChecklist }, { readReleaseRuns }, { readTaskAgentState, taskAgentStatePath }, { ResourceLedger }, { getUserConfig }] = await Promise.all([
|
|
239
249
|
import('../release-loop/release-schedule.js'), import('../release-loop/checklist.js'), import('../nexus/api/ops-api.js'),
|
|
@@ -242,12 +252,8 @@ async function defaultDeps(root: string): Promise<Required<CollectDeps>> {
|
|
|
242
252
|
return {
|
|
243
253
|
listSchedules: () => listSchedules(),
|
|
244
254
|
readSchedulerRuns: async (sinceMs, untilMs) => {
|
|
245
|
-
const {
|
|
246
|
-
|
|
247
|
-
try {
|
|
248
|
-
return store.queryAll({ exactCategories: ['schedule.run'], sinceMs, untilMs })
|
|
249
|
-
.map(({ ts_ms, data }) => ({ ts_ms, data }));
|
|
250
|
-
} finally { store.close(); }
|
|
255
|
+
const { logsDbPath } = await import('../mss/logging/log-store.js');
|
|
256
|
+
return readSchedulerExecutionRows(logsDbPath(), sinceMs, untilMs);
|
|
251
257
|
},
|
|
252
258
|
listChecklist: (v) => listChecklist(v),
|
|
253
259
|
readRuns: (dir) => readReleaseRuns(null, dir),
|
package/src/ops/overview.ts
CHANGED
|
@@ -141,17 +141,17 @@ export function bindingResource(s: OverviewSnapshot): ResourceBinding | null {
|
|
|
141
141
|
for (const host of s.machines.hosts) {
|
|
142
142
|
const l = host.load.value;
|
|
143
143
|
if (!l) continue;
|
|
144
|
-
if (l.totalGb > 0) {
|
|
144
|
+
if (Number.isFinite(l.freeGb) && Number.isFinite(l.totalGb) && l.totalGb > 0) {
|
|
145
145
|
const remaining = Math.max(0, l.freeGb);
|
|
146
146
|
candidates.push({ kind: 'memory', label: `${host.name} 메모리`, remainingRatio: ratio01(remaining / l.totalGb), remainingText: `${remainingAmount(remaining)}/${l.totalGb.toFixed(0)}GB` });
|
|
147
147
|
}
|
|
148
|
-
if (l.cpuCount > 0) {
|
|
148
|
+
if (Number.isFinite(l.load5) && Number.isFinite(l.cpuCount) && l.cpuCount > 0) {
|
|
149
149
|
const cpuCap = l.cpuCount * LOAD_PER_CORE_PRESSURE;
|
|
150
150
|
const remaining = Math.max(0, cpuCap - l.load5);
|
|
151
151
|
candidates.push({ kind: 'cpu', label: `${host.name} CPU`, remainingRatio: ratio01(remaining / cpuCap), remainingText: `${remainingAmount(remaining)}/${cpuCap.toFixed(0)}코어(압박선 ${LOAD_PER_CORE_PRESSURE}/코어)` });
|
|
152
152
|
}
|
|
153
153
|
const io = l.ioPressure;
|
|
154
|
-
if (io) {
|
|
154
|
+
if (io && Number.isFinite(io.someAvg10) && Number.isFinite(io.fullAvg10)) {
|
|
155
155
|
const remaining = Math.max(0, 100 - io.someAvg10);
|
|
156
156
|
candidates.push({ kind: 'io', label: `${host.name} I/O`, remainingRatio: ratio01(remaining / 100), remainingText: `${remainingAmount(remaining)}/100(압박 ${remainingAmount(io.someAvg10)}% · full ${remainingAmount(io.fullAvg10)}% · 10초 평균)` });
|
|
157
157
|
}
|
package/src/persona/loader.ts
CHANGED
|
@@ -154,6 +154,16 @@ export function validatePersonaShape(
|
|
|
154
154
|
todo = obj['todo'];
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
+
// 🗣️ 말투(speech style) — TUI-SPEECH-STYLE-CHARACTER. ⛔ 위 `actionHosts` 주석이
|
|
158
|
+
// 못 박은 그 이유로 ***여기에 명시로 옮긴다*** — 타입에만 더하면 YAML 의 그 줄은 영영 안 읽힌다.
|
|
159
|
+
let speechStyle: string | undefined;
|
|
160
|
+
if (Object.hasOwn(obj, 'speechStyle')) {
|
|
161
|
+
if (typeof obj['speechStyle'] !== 'string' || !obj['speechStyle'].trim()) {
|
|
162
|
+
return err(path, 'speechStyle must be a non-empty string');
|
|
163
|
+
}
|
|
164
|
+
speechStyle = obj['speechStyle'];
|
|
165
|
+
}
|
|
166
|
+
|
|
157
167
|
let mentionPatterns: readonly string[] | undefined;
|
|
158
168
|
if (obj['mentionPatterns'] !== undefined) {
|
|
159
169
|
if (!Array.isArray(obj['mentionPatterns'])
|
|
@@ -169,6 +179,7 @@ export function validatePersonaShape(
|
|
|
169
179
|
...(todo !== undefined ? { todo } : {}),
|
|
170
180
|
...(description.value !== undefined ? { description: description.value } : {}),
|
|
171
181
|
...(systemPrompt.value !== undefined ? { systemPrompt: systemPrompt.value } : {}),
|
|
182
|
+
...(speechStyle !== undefined ? { speechStyle } : {}),
|
|
172
183
|
...(brand !== undefined ? { brand } : {}),
|
|
173
184
|
...(models !== undefined ? { models } : {}),
|
|
174
185
|
...(mentionPatterns !== undefined ? { mentionPatterns } : {}),
|
package/src/persona/types.ts
CHANGED
|
@@ -30,6 +30,14 @@ export interface PersonaProfile {
|
|
|
30
30
|
* v1 = no resolution, raw passthrough). */
|
|
31
31
|
readonly systemPrompt?: string;
|
|
32
32
|
|
|
33
|
+
/**
|
|
34
|
+
* 🗣️ **말투(speech style)** — 이 페르소나가 «어떻게» 말하는가(TUI-SPEECH-STYLE-CHARACTER).
|
|
35
|
+
*
|
|
36
|
+
* ⛔ 안 적으면 «없다» — 기본 말투를 조용히 채우지 않는다(`actionHosts`·`capabilities`
|
|
37
|
+
* 와 같은 규율: 관측이 「선언이 없다」고 말한다).
|
|
38
|
+
*/
|
|
39
|
+
readonly speechStyle?: string;
|
|
40
|
+
|
|
33
41
|
/**
|
|
34
42
|
* 🚧 **이 봇이 «손을 쓸 수 있는» 호스트들** — 되돌릴 수 없는 브라우저 조작의 «경계».
|
|
35
43
|
*
|
|
@@ -33,6 +33,11 @@ function hasTool(enabled: ReadonlySet<string>, ...names: string[]): boolean {
|
|
|
33
33
|
return false;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
/** One working tab per site: each one-shot `aside repl "<js>"` call starts a new REPL
|
|
37
|
+
* session, so `page` from the previous call is gone — reattach, don't reopen. */
|
|
38
|
+
export const ASIDE_BROWSER_GUIDANCE =
|
|
39
|
+
'When you drive a browser with `aside repl "<js>"`: each call is a new REPL session, so reuse ONE working tab instead of opening a new one per step (extra tabs of the same app trigger «open in another tab» locks and lost connections). Start every script by reattaching: `const t1=(await listBrowserTabs()).find(t=>t.url.startsWith(\'<origin+path>\')); if (t1) await attachBrowserTab(t1.targetId); else await openTab(\'<url>\');` then use `page`. Call `openTab()` only when no matching tab exists or the user asks for a new page. Always pass the script as the argument — a bare `aside repl` waits for input until the shell timeout. A REPL call may run up to 120s, so give long browser steps a shell timeout above that (e.g. 150000 ms) and split very long flows into several calls.';
|
|
40
|
+
|
|
36
41
|
/** Build the session guidance addendum. Returns 0 or 1 system message
|
|
37
42
|
* containing per-tool one-liner directives, gated on what's active.
|
|
38
43
|
* When `enabledTools` is undefined or every relevant tool is absent,
|
|
@@ -114,6 +119,15 @@ export function buildSessionGuidanceAddendum(
|
|
|
114
119
|
);
|
|
115
120
|
}
|
|
116
121
|
|
|
122
|
+
// Browser via Aside (ASIDE-TAB-REUSE · 10-22). Observed in the n8n lecture
|
|
123
|
+
// session: every step ran `aside repl "var p=await openTab('<same url>')…"`.
|
|
124
|
+
// A one-shot `aside repl` is a fresh REPL session, so each call opened another
|
|
125
|
+
// tab → n8n «Editing in another tab» lock → lost connection → the step repeated.
|
|
126
|
+
// A bare `aside repl` (no script) also hung until the shell timeout.
|
|
127
|
+
if (hasTool(active, 'Bash', 'bash', 'RunShell', 'run_shell', 'aside.repl', 'aside_repl')) {
|
|
128
|
+
items.push(ASIDE_BROWSER_GUIDANCE);
|
|
129
|
+
}
|
|
130
|
+
|
|
117
131
|
if (items.length === 0) return [];
|
|
118
132
|
// B4 — 파일 수 규칙. 명령을 실제로 돌릴 도구(Bash·PtyShellStart·WebTerminal*)가 있을 때만 `git ls-files` 로 세라고 하고,
|
|
119
133
|
// Read 만 켜진 세션에선 셀 수 없으니 추측하지 말고 확인 불가라고 답하게 한다(EVAL q09 «959» vs 실측 778 · 리뷰 3라운드 must-fix).
|
package/src/provider-summary.ts
CHANGED
|
@@ -17,6 +17,7 @@ import { loadTokens, isExpiringSoon } from './oauth/store.js';
|
|
|
17
17
|
import { CODEX_REFRESH_BUFFER_MS } from './oauth/codex.js';
|
|
18
18
|
import { findCodexModel } from './codex/models.js';
|
|
19
19
|
import { getLocalLLMUrl } from './config.js';
|
|
20
|
+
import { zaiCodingPlanAvailable } from './llm/zai-coding-plan.js';
|
|
20
21
|
|
|
21
22
|
export type AuthKind = 'oauth' | 'apikey' | 'local' | 'none';
|
|
22
23
|
|
|
@@ -105,6 +106,13 @@ function authDetailForDecision(
|
|
|
105
106
|
? llm.apiKey ? 'API key (config)' : 'API key (~/.cache/openrouter_api_key · env OPENROUTER_API_KEY)'
|
|
106
107
|
: 'not configured — bash scripts/add-api-key.sh OPENROUTER_API_KEY';
|
|
107
108
|
}
|
|
109
|
+
// GLM-NO-CREDENTIAL-FALLBACK (OP #28375 · 🩸 run-6c85c69f) — 종전엔 glm 칸이 없어 자격이 «있어도» 아래 일반 문면
|
|
110
|
+
// 「no provider configured」가 찍혔고(자식 PTY 첫 줄), 부검이 그 줄을 «자격 결손» 원인으로 읽었다. 판정은 glm 직결이 서는 조건 그 함수다.
|
|
111
|
+
if (provider === 'glm') {
|
|
112
|
+
return zaiCodingPlanAvailable()
|
|
113
|
+
? 'GLM Coding Plan 키 (~/.cache/zai_api_key · env ZAI_API_KEY)'
|
|
114
|
+
: 'not configured — ZAI_API_KEY 없음 (~/.cache/zai_api_key · env ZAI_API_KEY)';
|
|
115
|
+
}
|
|
108
116
|
if (provider === 'local') {
|
|
109
117
|
const url = llm.baseUrl || getLocalLLMUrl();
|
|
110
118
|
return auth === 'local' && url ? `OpenAI-compat endpoint — ${url}` : 'not configured — set llm.baseUrl';
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
// `herdr agent list` 에 안 잡힌다 — pane CLI 로 생애·세션을 직접 알린다.
|
|
4
4
|
//
|
|
5
5
|
// 활성은 HERDR_ENV=1 ⊕ HERDR_PANE_ID ⊕ 킬스위치가 아닐 때뿐.
|
|
6
|
-
// 실패(rc≠0·
|
|
6
|
+
// 실패(rc≠0·spawn·ENOENT·오류 봉투)는 던지지 않고 한 번 로그한 뒤 그 신고기를 끈다.
|
|
7
|
+
// 단 turn 신고의 timeout 은 끄지 않는다(TUI-HERDR-STATUS-STALE · 10-22 n8n): herdr 가 바쁜 한 번의 2s 초과로
|
|
8
|
+
// 신고기가 꺼져 턴 끝 idle 이 영영 안 나가 herdr 가 1.9h 동안 working 을 보였다. timeout 은 «결과 모름»이라
|
|
9
|
+
// 마지막 턴 상태를 잠시 뒤 다시 신고하고(새 seq · 더 새 턴이 오면 그만) 이후 턴 신고도 그대로 보낸다.
|
|
7
10
|
//
|
|
8
11
|
// herdr 는 같은 pane·source 에서 «직전보다 큰 seq» 만 받는다(작으면 rc0 인데 무시).
|
|
9
12
|
// 같은 pane 에서 TUI 를 다시 띄워도 신고가 살도록 seq 는 max(직전+1 · 시각 · pane 기록+1) 이다.
|
|
@@ -15,6 +18,8 @@
|
|
|
15
18
|
// 실패로 꺼지는 것은 «이후 turn» 뿐이다. release(권한 반납)는 start 실패가 «확인»됐을 때만 건너뛴다.
|
|
16
19
|
// start 의 비동기 신고가 아직 안 끝났으면(결과 모름) 반납을 미루지 않고 바로 동기로 시도한다(관측 `release-start-pending`) —
|
|
17
20
|
// 종료 경로에서 미루면 exit 뒤 반납이 영영 안 나간다. 반납 실패(rc≠0 등)는 `release-failed` 로 늘 남긴다.
|
|
21
|
+
// 그때 반납 직전에 더 큰 seq 로 동기 재등록한다(TUI-HERDR-EXIT-RACE) — 미등록 반납은 seq 를 안 남겨
|
|
22
|
+
// 늦게 닿은 비동기 등록이 유령이 되던 경합을 «동기 재등록 → 동기 반납» 순서로 닫는다.
|
|
18
23
|
|
|
19
24
|
import { spawn, spawnSync } from 'node:child_process';
|
|
20
25
|
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
@@ -29,6 +34,8 @@ export type HerdrTurn = 'busy' | 'idle';
|
|
|
29
34
|
export interface HerdrRunResult {
|
|
30
35
|
readonly ok: boolean;
|
|
31
36
|
readonly stderr?: string;
|
|
37
|
+
/** 시간 안에 답을 못 받았다 — herdr 가 이미 적용했을 수도 있는 «결과 모름»(TUI-HERDR-STATUS-STALE). */
|
|
38
|
+
readonly timedOut?: boolean;
|
|
32
39
|
}
|
|
33
40
|
|
|
34
41
|
export interface HerdrRunOpts {
|
|
@@ -50,8 +57,15 @@ export interface HerdrAgentReporterDeps {
|
|
|
50
57
|
readonly now?: () => number;
|
|
51
58
|
/** pane 별 마지막 seq 기록. 기본 = tmpdir 파일(`createFileSeqStore`). */
|
|
52
59
|
readonly seqStore?: HerdrSeqStore;
|
|
60
|
+
/** 재신고 타이머 — 기본 setTimeout(unref). 시험이 가짜 시계를 준다. */
|
|
61
|
+
readonly schedule?: (fn: () => void, ms: number) => void;
|
|
53
62
|
}
|
|
54
63
|
|
|
64
|
+
const defaultSchedule = (fn: () => void, ms: number): void => {
|
|
65
|
+
const t = setTimeout(fn, ms);
|
|
66
|
+
(t as unknown as { unref?: () => void }).unref?.();
|
|
67
|
+
};
|
|
68
|
+
|
|
55
69
|
/** 같은 pane 에서 마지막으로 낸 seq — 프로세스 사이 단조를 잇는다. 실패는 던져도 된다(신고기가 삼킨다). */
|
|
56
70
|
export interface HerdrSeqStore {
|
|
57
71
|
read(): number | undefined;
|
|
@@ -89,6 +103,10 @@ export interface HerdrAgentReporterLike {
|
|
|
89
103
|
}
|
|
90
104
|
|
|
91
105
|
const ASYNC_TIMEOUT_MS = 2000;
|
|
106
|
+
/** turn 신고가 timeout 이면 이만큼 뒤에 마지막 상태를 다시 신고한다. */
|
|
107
|
+
export const HERDR_TURN_RETRY_DELAY_MS = 3000;
|
|
108
|
+
/** 같은 턴 상태의 재신고 상한 — 넘으면 `report-gave-up` 을 남기고 다음 턴 신고를 기다린다(신고기는 켜 둔다). */
|
|
109
|
+
export const HERDR_TURN_RETRY_MAX = 3;
|
|
92
110
|
const SYNC_TIMEOUT_MS = 300;
|
|
93
111
|
const STDERR_HEAD = 240;
|
|
94
112
|
const STDOUT_CAP = 4096;
|
|
@@ -149,7 +167,10 @@ export function defaultHerdrRunner(env: NodeJS.ProcessEnv): HerdrRunner {
|
|
|
149
167
|
if (opts.sync) {
|
|
150
168
|
try {
|
|
151
169
|
const r = spawnSync(bin, argv, { timeout: cap, encoding: 'utf8', windowsHide: true });
|
|
152
|
-
if (r.error)
|
|
170
|
+
if (r.error) {
|
|
171
|
+
const timedOut = (r.error as NodeJS.ErrnoException).code === 'ETIMEDOUT';
|
|
172
|
+
return { ok: false, stderr: r.error.message, ...(timedOut ? { timedOut: true } : {}) };
|
|
173
|
+
}
|
|
153
174
|
const out = typeof r.stdout === 'string' ? r.stdout : '';
|
|
154
175
|
const overflow = Buffer.byteLength(out, 'utf8') > STDOUT_CAP;
|
|
155
176
|
return judgeHerdr(r.status, overflow ? '' : out, typeof r.stderr === 'string' ? r.stderr : '', overflow);
|
|
@@ -178,7 +199,7 @@ export function defaultHerdrRunner(env: NodeJS.ProcessEnv): HerdrRunner {
|
|
|
178
199
|
};
|
|
179
200
|
const timer = setTimeout(() => {
|
|
180
201
|
try { child.kill(); } catch { /* already gone */ }
|
|
181
|
-
finish({ ok: false, stderr: stderr || 'timeout' });
|
|
202
|
+
finish({ ok: false, stderr: stderr || 'timeout', timedOut: true });
|
|
182
203
|
}, cap);
|
|
183
204
|
child.stderr?.on('data', (chunk: Buffer | string) => {
|
|
184
205
|
if (stderr.length < STDERR_HEAD) stderr += String(chunk);
|
|
@@ -201,6 +222,43 @@ export function defaultHerdrRunner(env: NodeJS.ProcessEnv): HerdrRunner {
|
|
|
201
222
|
};
|
|
202
223
|
}
|
|
203
224
|
|
|
225
|
+
/** 신호 지킴이가 쓰는 process 의 좁은 면 — 시험이 가짜를 준다. */
|
|
226
|
+
export interface HerdrSignalTarget {
|
|
227
|
+
readonly pid: number;
|
|
228
|
+
on(sig: NodeJS.Signals, fn: (sig: NodeJS.Signals) => void): unknown;
|
|
229
|
+
removeListener(sig: NodeJS.Signals, fn: (sig: NodeJS.Signals) => void): unknown;
|
|
230
|
+
listenerCount(sig: NodeJS.Signals): number;
|
|
231
|
+
kill(pid: number, sig?: string | number): unknown;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const RELEASE_SIGNALS: readonly NodeJS.Signals[] = ['SIGINT', 'SIGTERM'];
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* SIGINT·SIGTERM 기본 죽음에도 반납한다(TUI-HERDR-EXIT-RACE).
|
|
238
|
+
* 대시보드가 raw 모드에 들기 «전»의 ctrl+c 는 SIGINT 기본 동작으로 프로세스를 죽여(rc130) 'exit' 훅이 안 돈다 —
|
|
239
|
+
* 10-22 격리 세션 실측: 반납 0 · `agent list` 에 elanous idle 이 남았다.
|
|
240
|
+
* 신호가 오면 반납(동기) → 자기 리스너를 걷고, 이제 아무도 안 들으면 같은 신호를 다시 올려 기본 죽음을 지킨다.
|
|
241
|
+
* 다른 리스너가 있으면 그쪽이 같은 신호를 이미 받았다 — 다시 올리지 않는다.
|
|
242
|
+
* @returns 해제(정상 종료 경로에서 부른다).
|
|
243
|
+
*/
|
|
244
|
+
export function guardHerdrReleaseOnSignal(release: () => void, proc: HerdrSignalTarget = process): () => void {
|
|
245
|
+
let off = false;
|
|
246
|
+
const remove = (): void => {
|
|
247
|
+
if (off) return;
|
|
248
|
+
off = true;
|
|
249
|
+
for (const sig of RELEASE_SIGNALS) { try { proc.removeListener(sig, onSignal); } catch { /* 종료 경로를 깨지 않는다 */ } }
|
|
250
|
+
};
|
|
251
|
+
function onSignal(sig: NodeJS.Signals): void {
|
|
252
|
+
try { release(); } catch { /* 신호 경로를 깨지 않는다 */ }
|
|
253
|
+
remove();
|
|
254
|
+
let alone = true;
|
|
255
|
+
try { alone = proc.listenerCount(sig) === 0; } catch { alone = true; }
|
|
256
|
+
if (alone) { try { proc.kill(proc.pid, sig); } catch { /* 이미 끝나는 중 */ } }
|
|
257
|
+
}
|
|
258
|
+
for (const sig of RELEASE_SIGNALS) proc.on(sig, onSignal);
|
|
259
|
+
return remove;
|
|
260
|
+
}
|
|
261
|
+
|
|
204
262
|
/**
|
|
205
263
|
* herdr pane 안에서만 신고기. 비활성이면 null (skipped 로그 한 번).
|
|
206
264
|
* 반환 메서드는 실패해도 던지지 않는다.
|
|
@@ -219,7 +277,7 @@ export function createHerdrAgentReporter(deps: HerdrAgentReporterDeps = {}): Her
|
|
|
219
277
|
}
|
|
220
278
|
const run = deps.run ?? defaultHerdrRunner(env);
|
|
221
279
|
const sessionId = deps.sessionId ?? '';
|
|
222
|
-
return new Reporter(paneId, sessionId, run, log, deps.now ?? Date.now, deps.seqStore ?? createFileSeqStore(paneId));
|
|
280
|
+
return new Reporter(paneId, sessionId, run, log, deps.now ?? Date.now, deps.seqStore ?? createFileSeqStore(paneId), deps.schedule ?? defaultSchedule);
|
|
223
281
|
}
|
|
224
282
|
|
|
225
283
|
type IssueResult = boolean | Promise<boolean>;
|
|
@@ -256,8 +314,14 @@ class Reporter implements HerdrAgentReporterLike {
|
|
|
256
314
|
private readonly log: (event: string, data: Record<string, unknown>) => void,
|
|
257
315
|
private readonly now: () => number,
|
|
258
316
|
private readonly seqStore: HerdrSeqStore,
|
|
317
|
+
private readonly schedule: (fn: () => void, ms: number) => void,
|
|
259
318
|
) {}
|
|
260
319
|
|
|
320
|
+
/** 마지막으로 요청된 턴 상태와 그 세대 — 재신고는 세대가 그대로일 때만(더 새 턴이 오면 그만). */
|
|
321
|
+
private lastTurn: HerdrTurn | null = null;
|
|
322
|
+
private turnGen = 0;
|
|
323
|
+
private turnRetries = 0;
|
|
324
|
+
|
|
261
325
|
start(): void {
|
|
262
326
|
if (this.startState !== 'none') return;
|
|
263
327
|
try { this.storedSeq = this.seqStore.read(); } catch (error) { this.seqStoreFail(error); }
|
|
@@ -314,6 +378,13 @@ class Reporter implements HerdrAgentReporterLike {
|
|
|
314
378
|
turn(t: HerdrTurn): void {
|
|
315
379
|
// 반납 뒤 신고는 반납한 에이전트를 더 큰 seq 로 다시 등록한다 — 막는다.
|
|
316
380
|
if (this.disabled || this.released) return;
|
|
381
|
+
this.lastTurn = t;
|
|
382
|
+
this.turnGen += 1;
|
|
383
|
+
this.turnRetries = 0;
|
|
384
|
+
this.issueTurn(t);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
private issueTurn(t: HerdrTurn): void {
|
|
317
388
|
const state = t === 'busy' ? 'working' : 'idle';
|
|
318
389
|
this.issue([
|
|
319
390
|
'pane', 'report-agent',
|
|
@@ -328,11 +399,24 @@ class Reporter implements HerdrAgentReporterLike {
|
|
|
328
399
|
if (this.released) return;
|
|
329
400
|
// idle 등록 실패가 확인됐거나 start 전이면 건너뛴다. pending = 결과 모름 → 반납을 시도한다.
|
|
330
401
|
if (this.startState === 'none' || this.startState === 'failed' || this.idleFailed) return;
|
|
402
|
+
this.released = true;
|
|
331
403
|
if (this.startState === 'pending') {
|
|
332
404
|
this.log('release-start-pending', {});
|
|
333
405
|
this.releasedWhilePending = true;
|
|
406
|
+
// 즉시 종료 경합(TUI-HERDR-EXIT-RACE): 비동기 idle 등록은 herdr 자식 프로세스라 부모가 죽어도 간다.
|
|
407
|
+
// herdr 0.9.1 실측 — 미등록 에이전트 반납은 rc0 인데 seq 를 안 남긴다 ⇒ 반납 «뒤에» 닿은 작은 seq 등록이
|
|
408
|
+
// 유령으로 남는다(10-22 격리 세션 tf-exit-race). 기다릴 수 없으니(동기 ≤300ms) 순서를 동기로 고정한다:
|
|
409
|
+
// 더 큰 seq 로 동기 재등록 → 동기 반납. 반납이 «등록된» 에이전트를 지우며 seq 를 남기므로
|
|
410
|
+
// 늦게 닿는 앞 등록(작은 seq)은 herdr 가 버린다. 재등록 실패여도 반납은 그대로 시도한다(결과 모름).
|
|
411
|
+
this.issue([
|
|
412
|
+
'pane', 'report-agent',
|
|
413
|
+
'--source', HERDR_SOURCE, '--agent', HERDR_AGENT,
|
|
414
|
+
'--state', 'idle',
|
|
415
|
+
'--agent-session-id', this.sessionId,
|
|
416
|
+
'--seq', this.nextSeq(),
|
|
417
|
+
this.paneId,
|
|
418
|
+
], true, 'release');
|
|
334
419
|
}
|
|
335
|
-
this.released = true;
|
|
336
420
|
const seq = this.nextSeq();
|
|
337
421
|
// pane 기록 쓰기는 여기(동기 종료 경로)뿐이다.
|
|
338
422
|
try { this.seqStore.write(this.seq); } catch (error) { this.seqStoreFail(error); }
|
|
@@ -346,6 +430,27 @@ class Reporter implements HerdrAgentReporterLike {
|
|
|
346
430
|
], true, 'release');
|
|
347
431
|
}
|
|
348
432
|
|
|
433
|
+
/**
|
|
434
|
+
* turn 신고 timeout — 신고기를 끄지 않고 마지막 턴 상태를 잠시 뒤 다시 신고한다(TUI-HERDR-STATUS-STALE).
|
|
435
|
+
* herdr 가 그 신고를 이미 적용했어도(답만 늦었다) 다시 보내는 것은 무해하다 — 더 큰 seq 의 같은 상태다.
|
|
436
|
+
*/
|
|
437
|
+
private retryTurnAfterTimeout(argv: string[], stderr: string | undefined): void {
|
|
438
|
+
const gen = this.turnGen;
|
|
439
|
+
const state = this.lastTurn;
|
|
440
|
+
const attempt = this.turnRetries + 1;
|
|
441
|
+
if (state === null) return;
|
|
442
|
+
if (attempt > HERDR_TURN_RETRY_MAX) {
|
|
443
|
+
this.log('report-gave-up', { cmd: argv[1] ?? '', state: state === 'busy' ? 'working' : 'idle', attempts: HERDR_TURN_RETRY_MAX, stderrHead: stderrHead(stderr) });
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
this.turnRetries = attempt;
|
|
447
|
+
this.log('report-timeout-retry', { cmd: argv[1] ?? '', state: state === 'busy' ? 'working' : 'idle', attempt, delayMs: HERDR_TURN_RETRY_DELAY_MS, stderrHead: stderrHead(stderr) });
|
|
448
|
+
this.schedule(() => {
|
|
449
|
+
if (this.disabled || this.released || this.turnGen !== gen) return;
|
|
450
|
+
this.issueTurn(state);
|
|
451
|
+
}, HERDR_TURN_RETRY_DELAY_MS);
|
|
452
|
+
}
|
|
453
|
+
|
|
349
454
|
private seqStoreFail(error: unknown): void {
|
|
350
455
|
if (this.seqStoreFailed) return;
|
|
351
456
|
this.seqStoreFailed = true;
|
|
@@ -388,7 +493,7 @@ class Reporter implements HerdrAgentReporterLike {
|
|
|
388
493
|
const judged = (result as Promise<HerdrRunResult>).then(
|
|
389
494
|
(r) => {
|
|
390
495
|
if (r.ok) return true;
|
|
391
|
-
this.fail(argv, phase, r.stderr);
|
|
496
|
+
this.fail(argv, phase, r.stderr, r.timedOut === true);
|
|
392
497
|
return false;
|
|
393
498
|
},
|
|
394
499
|
(error: unknown) => {
|
|
@@ -401,7 +506,7 @@ class Reporter implements HerdrAgentReporterLike {
|
|
|
401
506
|
}
|
|
402
507
|
const syncResult = result as HerdrRunResult;
|
|
403
508
|
if (!syncResult.ok) {
|
|
404
|
-
this.fail(argv, phase, syncResult.stderr);
|
|
509
|
+
this.fail(argv, phase, syncResult.stderr, syncResult.timedOut === true);
|
|
405
510
|
return false;
|
|
406
511
|
}
|
|
407
512
|
return true;
|
|
@@ -419,7 +524,7 @@ class Reporter implements HerdrAgentReporterLike {
|
|
|
419
524
|
try {
|
|
420
525
|
const r = await this.run(argv, opts);
|
|
421
526
|
if (r.ok) return true;
|
|
422
|
-
this.fail(argv, phase, r.stderr);
|
|
527
|
+
this.fail(argv, phase, r.stderr, r.timedOut === true);
|
|
423
528
|
return false;
|
|
424
529
|
} catch (error) {
|
|
425
530
|
this.fail(argv, phase, error instanceof Error ? error.message : String(error));
|
|
@@ -427,7 +532,11 @@ class Reporter implements HerdrAgentReporterLike {
|
|
|
427
532
|
}
|
|
428
533
|
}
|
|
429
534
|
|
|
430
|
-
private fail(argv: string[], phase: 'start' | 'session' | 'turn' | 'release', stderr: string | undefined): void {
|
|
535
|
+
private fail(argv: string[], phase: 'start' | 'session' | 'turn' | 'release', stderr: string | undefined, timedOut = false): void {
|
|
536
|
+
if (phase === 'turn' && timedOut && !this.disabled) {
|
|
537
|
+
this.retryTurnAfterTimeout(argv, stderr);
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
431
540
|
if (phase === 'start') this.idleFailed = true;
|
|
432
541
|
// 반납 실패는 신고기가 이미 꺼졌어도 늘 남긴다(종료 경로의 유일한 흔적).
|
|
433
542
|
if (phase === 'release') {
|