elanous 0.2.35 → 0.2.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/chunks/{d06f9160.a3d9062f95de8ad7.js → 053a429e.9a63436527cc751c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +287 -0
- package/apps/pwa/out/_next/static/chunks/{4346.8601952e73bf5803.js → 1201.afbfc5b1c5e5cbe4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +64 -0
- package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +36 -0
- package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +149 -0
- package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3103.0df8da390948bb84.js → 2500.cbc1257b774aae52.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7644.17e37ba6f1d4226e.js → 2683.c9773a0c589b031b.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{4718-17d2af636796a330.js → 275-02ea4c2a33980422.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/2812ca6a.3b9f4a7a08885744.js +1 -0
- package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8714.ff0b7ce3ec3e3ae2.js → 2941.3c3546f96bc6efa7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{9214.63a510d39178e997.js → 2986.45d7652e4f13557e.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3031-85328a92fcce4da6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3136.30aaaa5fa03662a3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3677-4215f826f6aa68e5.js → 3148-98efd4869d660a87.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +226 -0
- package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3324.a09703033abcbd2f.js +34 -0
- package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +8 -0
- package/apps/pwa/out/_next/static/chunks/3410.7f9af5ab77cbe65f.js +115 -0
- package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +32 -0
- package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +286 -0
- package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9512.5a76207a730e0491.js → 3727.7949ccaacaa71242.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8557-e7898769499cd56f.js → 3757-180308bc61021b05.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +74 -0
- package/apps/pwa/out/_next/static/chunks/{359-2250789a2d3499e7.js → 3840-5825d56d46976a92.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{da5176c6.6773b6c5994e1d99.js → 3a3d9966.cc4d4585a2708e7c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4116.a84a92a2492c080e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +104 -0
- package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9952.5daf5f94063a2b3e.js → 4286.b70c4520306817e8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4304.e9b2512834a9e23e.js +23 -0
- package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{938.66ad1ef0e5abae1c.js → 4615.8525eb0add35eba6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +148 -0
- package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +93 -0
- package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6236.e18cced2d5ba6afb.js → 528.38ce20ef8aa251ff.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{3408.21d1570602f4b6c0.js → 552.b7d061ad91eeac51.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5711.957b095705c12560.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1530.0e612369b6fd7ea0.js → 575.d929793a53f27c4b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/599.c39c571b6733f2a2.js +41 -0
- package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +79 -0
- package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6566.926a1d1b7c911442.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +1 -0
- package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +27 -0
- package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6925.562d532110879886.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7385.50a308a477bdfc21.js → 6943.c6b24124853a47b2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{630.fe5a46428d63b013.js → 727.7deb87749b0a343a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2018.a741297bce759490.js → 7481.39f7a4654907bf6e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8444.4c26b379ca2b9596.js → 771.c3cdb6c1f7f47c02.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/7784.1f0ac4a16d190cf4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3589.5444a06bcf6e775c.js → 7891.03f910124a737985.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8037.e254fd797aa224d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +1 -0
- package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{b2f6ba4d.fb56fdbbf798df33.js → 873d6c12.09bd499f57171543.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5101.e32282718f99ed6f.js → 8904.7d51af2dc033965c.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +90 -0
- package/apps/pwa/out/_next/static/chunks/{5637.281e5dec4ea6ecf1.js → 914.8abefd48d579547b.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4705-194e64e47ca0fbdb.js → 9250-072df22eaadaa6b5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +77 -0
- package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8637.47f5b35afcae5e6b.js → 9514.131c52cc75fe6439.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1674.2a65fd5668e1cc5f.js → 9789.60f723d18097ec30.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9f31e478.fefcbcd3c388ebc5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-e7abc34a48a6f71e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-c15958835534404b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{0368f25d-ad84af92fefee68f.js → ccae1c4b-0cf414f5eff1b10d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{cbe38a15.5a032598e39970c6.js → ceba0382.650712b56b85b582.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{b6705a4f-b9a9047de9eecfd0.js → da5ecc5c-b005ad8cac737d57.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{56d372f2.681ab4ec4c998fae.js → f9a61e4d.1fc2c1dbdd49fe46.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +1 -0
- package/apps/pwa/out/_next/static/{T1mBQqmkwKDLGtyisDCOd → uC-N0emedeNOFuaBQFv-I}/_buildManifest.js +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/docs/goal-context/05-authoring-lessons.jsonl +47 -0
- package/docs/goal-context/README.md +3 -0
- package/graphs/default-loop.yaml +6 -1
- package/graphs/implement-loop.yaml +24 -0
- package/graphs/release/recipes.yaml +6 -0
- package/graphs/release/release-loop.yaml +17 -4
- package/graphs/wizard/recipes.yaml +44 -0
- package/graphs/wizard/wizard-loop.yaml +44 -0
- package/graphs/work/research-report.yaml +2 -0
- package/package.json +1 -1
- package/scripts/ci-typecheck-changed.ts +139 -5
- package/scripts/coord-role-pack.ts +1 -1
- package/scripts/first10-gate.ts +416 -0
- package/scripts/fleet/wsl-node-setup.sh +432 -0
- package/scripts/release-loop/docs-node.ts +204 -8
- package/scripts/release-loop/gate-node.ts +249 -53
- package/scripts/release-loop/node-verdict.ts +2 -0
- package/scripts/release-loop/resume-cap.ts +14 -34
- package/scripts/release-loop/resume-release.ts +37 -11
- package/scripts/release-loop/traffic-node.ts +59 -0
- package/scripts/release-loop/traffic-transition.ts +159 -0
- package/scripts/rhythm/daily.ts +137 -3
- package/scripts/ux-sim.ts +53 -0
- package/skills/README.md +1 -0
- package/src/acp/core-turn-bridge.ts +48 -6
- package/src/agent/delegate-hint.ts +16 -0
- package/src/agent/runner.ts +82 -2
- package/src/agent/task-notification.ts +56 -10
- package/src/agent/types.ts +4 -0
- package/src/agent-substrate/pr-reviewer.ts +55 -3
- package/src/agent-substrate/review-intent.ts +29 -2
- package/src/agent-substrate/review-observation.ts +3 -0
- package/src/agent-substrate/self-review-cli.ts +168 -16
- package/src/autopilot/mission-codebase-gate.ts +141 -12
- package/src/autopilot/pr-manager.ts +25 -5
- package/src/boot/daemon-tools/self-implement.ts +1 -0
- package/src/budget/usage-outcomes.ts +8 -4
- package/src/capture/tui-self-report.ts +102 -0
- package/src/chat/goal-continue-verdict.ts +41 -0
- package/src/chat/index.ts +30 -4
- package/src/chat/internal-turn-origin.ts +1 -0
- package/src/chat/paste-fold.ts +86 -0
- package/src/chat/tool-render/block.ts +32 -0
- package/src/chat/tool-render/dispatch.ts +2 -20
- package/src/chat/tool-render/result-text.ts +98 -0
- package/src/chat/turn-typeahead.ts +70 -7
- package/src/cli/config-audit.ts +119 -0
- package/src/cli/doctor-cli.ts +22 -0
- package/src/cli/guardian-cli.ts +10 -0
- package/src/cli/herdr-cli.ts +34 -0
- package/src/cli/light-entry-route.ts +6 -3
- package/src/cli/log-event-names.ts +2 -0
- package/src/cli/make-cli.ts +247 -11
- package/src/cli/msg-cli.ts +117 -3
- package/src/cli/pr-cli.ts +29 -16
- package/src/cli/pr-land-base-read.ts +11 -2
- package/src/cli/pr-land-heavy-remote.ts +6 -3
- package/src/cli/pr-land-overlap-evidence.ts +23 -4
- package/src/cli/pr-land-recovery.ts +117 -1
- package/src/cli/pty-takeover-cli.ts +8 -7
- package/src/cli/release-cli.ts +21 -5
- package/src/cli/release-single-flight.ts +1 -1
- package/src/cli/tasks-card-show.ts +162 -0
- package/src/cli/tasks-cli.ts +574 -356
- package/src/cli/tasks-read-cli.ts +197 -0
- package/src/core-turn/run-core-turn.ts +4 -2
- package/src/core-turn/run-goal-loop.ts +73 -16
- package/src/core-turn/types.ts +6 -1
- package/src/dashboard/context/keys.ts +8 -31
- package/src/dashboard/index.ts +202 -49
- package/src/dashboard/input/agent-wake.ts +7 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +146 -3
- package/src/dashboard/input/chat-main-slash-command.ts +4 -2
- package/src/dashboard/input/goal-continue.ts +210 -0
- package/src/dashboard/input/goal-interim.ts +2 -0
- package/src/dashboard/input/internal-turn.ts +2 -8
- package/src/dashboard/input/seat-autowake.ts +9 -7
- package/src/dashboard/input/turn-autoheal.ts +52 -0
- package/src/dashboard/seat-boot-preamble.ts +132 -5
- package/src/dashboard/slash-runtime/chat-persona.ts +65 -8
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +3 -2
- package/src/dashboard/slash-runtime/model-choices.ts +15 -0
- package/src/dashboard/stale-install-check.ts +3 -99
- package/src/debug/batch-queue.ts +119 -0
- package/src/debug/tui-log-tag.ts +67 -0
- package/src/display/agent-surface.ts +7 -0
- package/src/domains/standalone-log-sink.ts +15 -2
- package/src/esc-abort-gate.ts +69 -0
- package/src/git-fs/worktree.ts +95 -1
- package/src/graph-runner/graph-cli.ts +18 -0
- package/src/graph-runner/runner.ts +20 -11
- package/src/graph-wizard/generate.ts +108 -4
- package/src/graph-wizard/steps.ts +15 -0
- package/src/grounding/proactive-ground.ts +86 -0
- package/src/harness/control-inbox.ts +49 -1
- package/src/harness/harness-cli-command.ts +51 -7
- package/src/harness/harness-incidents.ts +52 -1
- package/src/harness/pod-control-send.ts +33 -5
- package/src/harness/self-send-remote.ts +69 -0
- package/src/harness/self-send-routing-guard.ts +6 -0
- package/src/harness/self-send-target.ts +4 -3
- package/src/index.ts +327 -12
- package/src/input-core/context-key-runtime.ts +21 -0
- package/src/light-cli.ts +6 -1
- package/src/llm-wellformed.ts +70 -0
- package/src/llm.ts +35 -4
- package/src/loops/msg-wake.ts +35 -39
- package/src/loops/orchestrator/inbox.ts +59 -11
- package/src/loops/orchestrator/knowhow-pack.ts +364 -0
- package/src/loops/orchestrator/tick.ts +5 -1
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/models/prompts.ts +17 -2
- package/src/msg/msg-post-office.ts +116 -0
- package/src/mss/logging/log-store.ts +79 -22
- package/src/nexus/api/decisions-route.ts +38 -18
- package/src/nexus/api/graph-wizard-api.ts +20 -2
- package/src/nexus/boot/register-mcp-clients.ts +263 -38
- package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
- package/src/onboarding/first-run.ts +37 -6
- package/src/onboarding/web-first.ts +43 -11
- package/src/ops/overview-collect.ts +12 -6
- package/src/ops/overview.ts +3 -3
- package/src/persona/loader.ts +11 -0
- package/src/persona/types.ts +8 -0
- package/src/prompt-library/session-guidance.ts +14 -0
- package/src/provider-summary.ts +8 -0
- package/src/pty-shell/herdr-agent-report.ts +118 -9
- package/src/pty-shell/herdr-prompt.ts +266 -0
- package/src/pty-shell/pty-control-ipc.ts +151 -8
- package/src/pty-shell/pty-special-keys.ts +42 -2
- package/src/pty-shell/stale-install-check.ts +99 -0
- package/src/pty-shell/tui-run-state.ts +14 -2
- package/src/release-loop/auto-start.ts +20 -2
- package/src/release-loop/checklist.ts +76 -4
- package/src/release-loop/rehearsal.ts +36 -20
- package/src/repl/index.ts +19 -1
- package/src/seat-loop/knowhow-lint.ts +1 -1
- package/src/self-dev/decompose-proposal.ts +172 -20
- package/src/self-dev/decompose.ts +61 -0
- package/src/self-dev/dev-cli.ts +37 -3
- package/src/self-dev/dev-pipeline.ts +8 -2
- package/src/self-dev/draft-triage-rules.ts +31 -0
- package/src/self-dev/glm-credential-guard.ts +77 -0
- package/src/self-dev/graph-journey-nodes.ts +1 -0
- package/src/self-dev/graph-journey-route.ts +12 -2
- package/src/self-dev/orchestrate-cli.ts +68 -3
- package/src/self-dev/orchestrate.ts +116 -17
- package/src/self-dev/run-supervisor.ts +55 -2
- package/src/self-dev/run-types.ts +1 -1
- package/src/self-health/autoheal.ts +153 -0
- package/src/self-health/signatures.ts +6 -0
- package/src/self-implement/device-first.ts +116 -0
- package/src/self-implement/doctor-visit.ts +239 -1
- package/src/self-implement/evidence-command-budget.ts +80 -0
- package/src/self-implement/goal-author-cli.ts +1 -0
- package/src/self-implement/goal-author-decompose.ts +265 -4
- package/src/self-implement/goal-author.ts +33 -8
- package/src/self-implement/goal-elaborate.ts +176 -22
- package/src/self-implement/goal-refine.ts +3 -0
- package/src/self-implement/graph-variant.ts +40 -6
- package/src/self-implement/headless-elanous-driver.ts +19 -3
- package/src/self-implement/off-diff-evidence.ts +58 -6
- package/src/self-implement/orchestrator.ts +222 -21
- package/src/self-implement/pod-warm-pool-profile.ts +1 -0
- package/src/self-implement/pwa-import-graph.ts +1 -1
- package/src/self-implement/rework-policy.ts +30 -0
- package/src/self-implement/run-ledger.ts +108 -0
- package/src/self-implement/run-ttl.ts +38 -24
- package/src/self-implement/scope-adjacency.ts +3 -1
- package/src/self-implement/seams.ts +60 -4
- package/src/self-implement/wiring-check.ts +358 -0
- package/src/shell-env-bootstrap.ts +11 -4
- package/src/skills/runner.ts +4 -2
- package/src/skills/tools/agent.ts +290 -48
- package/src/skills/tools/schedule-wakeup.ts +23 -4
- package/src/skills/tools/shell.ts +61 -6
- package/src/skills/tools/terminal-modal-inject.ts +1 -2
- package/src/skills/tools/terminal-modal.ts +10 -8
- package/src/skills/url-router.ts +41 -1
- package/src/smart-wizard/run.ts +66 -0
- package/src/status/bar.ts +34 -6
- package/src/status/status-provider-info.ts +37 -6
- package/src/steward/rejudge-tick.ts +10 -2
- package/src/steward/ta-repair-event-collect.ts +17 -6
- package/src/task-agent/actions.ts +3 -1
- package/src/task-agent/land-queue.ts +21 -8
- package/src/task-agent/live-moves.ts +22 -6
- package/src/task-agent/mission.ts +30 -0
- package/src/task-agent/rejudge-on-head.ts +15 -0
- package/src/task-agent/repair-cycle.ts +138 -32
- package/src/task-agent/repair-next-move.ts +31 -3
- package/src/task-agent/repair-outcomes.ts +29 -0
- package/src/task-agent/repair-worker.ts +14 -4
- package/src/task-agent/shadow.ts +41 -3
- package/src/task-agent/task-card-prefix.ts +2 -0
- package/src/task-agent/task-hand.ts +477 -22
- package/src/task-agent/task-parent-role-llm.ts +36 -0
- package/src/task-agent/tier-split.ts +78 -9
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +9 -0
- package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +86 -5
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
- package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +11 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +76 -4
- package/src/task-orchestrator/surfaces/pod-provenance.ts +8 -2
- package/src/task-orchestrator/surfaces/pod-repair-commit.ts +18 -3
- package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +16 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +224 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +201 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-provider.ts +444 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-runner.ts +387 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-transport.ts +157 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +4 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +485 -36
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +396 -19
- package/src/task-orchestrator/surfaces/self-implement.ts +42 -2
- package/src/tool-runtime/index.ts +15 -2
- package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
- package/src/tty-foreground.ts +155 -0
- package/src/tui/chat/goal-interim.ts +173 -0
- package/src/tui/chat/log-view.ts +205 -18
- package/src/tui/chat/self-health-status.ts +232 -0
- package/src/tui/entry.ts +370 -81
- package/src/tui/input/composer.ts +8 -1
- package/src/tui/slash/compact-command.ts +7 -0
- package/src/tui/slash/compact.ts +1 -7
- package/src/tui/slash/resume.ts +75 -0
- package/src/tui-client/local-chat-turn.ts +45 -2
- package/src/tui-client/next-dashboard-runtime.ts +8 -0
- package/src/tui-client/next-loop-command.ts +70 -0
- package/src/tui-client/next-wakeup.ts +191 -0
- package/src/tui.ts +37 -0
- package/src/ui/modal-adapter.ts +2 -2
- package/src/ux-sim/classic-tui-seat-scenarios.ts +516 -0
- package/src/ux-sim/cli-config-audit-device.ts +121 -0
- package/src/ux-sim/dashboard-event-loop-stall-monitor-device.ts +238 -0
- package/src/ux-sim/event-monkey.ts +3 -2
- package/src/ux-sim/fake-bin.ts +45 -0
- package/src/ux-sim/fake-herdr.ts +238 -0
- package/src/ux-sim/fake-llm.ts +111 -6
- package/src/ux-sim/fault-glm-no-credential.ts +116 -0
- package/src/ux-sim/fault-nextmove-dispatch.ts +102 -1
- package/src/ux-sim/fault-scope-escape-lift.ts +33 -6
- package/src/ux-sim/fault-tui-400-autoheal.ts +297 -0
- package/src/ux-sim/goal-device.ts +619 -0
- package/src/ux-sim/in-process-cli.ts +22 -5
- package/src/ux-sim/mock-authoring-first-run-child.ts +35 -0
- package/src/ux-sim/mock-authoring-first-run.ts +97 -0
- package/src/ux-sim/mock-seat-pty-frame-child.ts +29 -0
- package/src/ux-sim/mock-seat-pty-frame.ts +297 -0
- package/src/ux-sim/mock-seat-pty-sequence-child.ts +21 -0
- package/src/ux-sim/mock-seat-pty-sequence.ts +206 -0
- package/src/ux-sim/next-tui-seat-scenarios.ts +631 -0
- package/src/ux-sim/onboarding-first-run-device.ts +269 -0
- package/src/ux-sim/pty-key-modifiers-device.ts +85 -0
- package/src/ux-sim/subagent-tools-device.ts +81 -0
- package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +250 -0
- package/src/ux-sim/tty-foreground-steal-child.ts +21 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1165.bad13fc9151a7288.js +0 -1
- package/apps/pwa/out/_next/static/chunks/13.02a07436dec15f89.js +0 -32
- package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +0 -41
- package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +0 -24
- package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +0 -74
- package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1993-c0007b7ad0c0ef41.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1c735de4.f993a30bbd3c57c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1dc5a567.9b092bfae3d7099b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +0 -148
- package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2625.5d870aa999f33db1.js +0 -34
- package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +0 -77
- package/apps/pwa/out/_next/static/chunks/2833-0fe47af99ed13c29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +0 -62
- package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +0 -90
- package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +0 -79
- package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3f7c4ee5.3dde54f01a816613.js +0 -122
- package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4441-875b97f5821ed58a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +0 -24
- package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5154.a118f3957ed14e36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +0 -23
- package/apps/pwa/out/_next/static/chunks/5483-dd5d7697f6bdb106.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5852.db1f7449f4f74612.js +0 -287
- package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +0 -1
- package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +0 -8
- package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +0 -93
- package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6866-79aa5b4e47cac6aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6b89c8bd.24df687a820500b3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +0 -149
- package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +0 -104
- package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8219.baa715d1deee80e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8256.e3ac8421a71f82f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8437-8d5492094b166cfa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +0 -226
- package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +0 -64
- package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +0 -115
- package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/967-2aa39b2d04b4c690.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-406b47745b53f269.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-26e6c18a1a750cf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-47c5d4db587266bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1f5a60f70cb4dd0c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-bac7dee94e5eae4a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-dc0a532f5b9196ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +0 -1
- /package/apps/pwa/out/_next/static/{T1mBQqmkwKDLGtyisDCOd → uC-N0emedeNOFuaBQFv-I}/_ssgManifest.js +0 -0
package/src/cli/make-cli.ts
CHANGED
|
@@ -4,40 +4,276 @@ import { judge } from '../llm/judge-layer.js';
|
|
|
4
4
|
import { runPluginMake } from './plugin-cli.js';
|
|
5
5
|
import { workflowRun } from './workflow.js';
|
|
6
6
|
|
|
7
|
-
type MakeKind = 'plugin' | 'workflow';
|
|
7
|
+
export type MakeKind = 'plugin' | 'workflow';
|
|
8
|
+
|
|
9
|
+
/** A cell the route ruled out, together with the evidence that ruled it out. */
|
|
10
|
+
export type MakeExclusion = { kind: MakeKind; reason: string };
|
|
11
|
+
|
|
12
|
+
/** A classify-judge answer. It only counts when the judge supplied BOTH
|
|
13
|
+
* rationales: a bare `{"kind":"workflow"}` carries no reason and no exclusion
|
|
14
|
+
* ground, so the route treats it as an unanswered (unmeasured) request. */
|
|
15
|
+
export type MakeJudgeVerdict = { kind: MakeKind; reason: string; excluded: string };
|
|
16
|
+
|
|
17
|
+
/** What the production `cli.make/route` path judged for one natural-language request. */
|
|
18
|
+
export type MakeRouteEvidence = {
|
|
19
|
+
request: string;
|
|
20
|
+
/** Selected cell, or null when the request carries no usable evidence. */
|
|
21
|
+
kind: MakeKind | null;
|
|
22
|
+
/** Which arm produced `kind`. */
|
|
23
|
+
decidedBy: 'request-evidence' | 'classify-judge' | 'none';
|
|
24
|
+
/** false means "unmeasured": no rationale existed for any cell. */
|
|
25
|
+
measured: boolean;
|
|
26
|
+
/** Why the selected cell won. Never empty; a judge row quotes the judge's own reason verbatim. */
|
|
27
|
+
reason: string;
|
|
28
|
+
/** Phrases from the request that support the selected cell. A judge-decided row
|
|
29
|
+
* carries a `judge:<kind>` marker instead: the request had no phrases to cite. */
|
|
30
|
+
signals: string[];
|
|
31
|
+
/** Every cell that was not selected, with the reason it was excluded. */
|
|
32
|
+
excluded: MakeExclusion[];
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
type JudgeCall = (args: { prompt: string; provider: string; model: string }) => Promise<{ text: string }>;
|
|
36
|
+
|
|
8
37
|
type MakeDeps = {
|
|
9
|
-
|
|
38
|
+
/** Test-only classify transport: only ever throws, so it can never deliver an answer. */
|
|
39
|
+
judgeCall?: JudgeCall;
|
|
10
40
|
pluginMake?: (request: string) => Promise<void>;
|
|
11
41
|
workflowMake?: (request: string) => Promise<number>;
|
|
12
42
|
};
|
|
13
43
|
|
|
14
|
-
|
|
44
|
+
const CELL_LABEL: Record<MakeKind, string> = { plugin: '플러그인', workflow: '워크플로' };
|
|
45
|
+
|
|
46
|
+
const OTHER_CELL: Record<MakeKind, MakeKind> = { plugin: 'workflow', workflow: 'plugin' };
|
|
47
|
+
|
|
48
|
+
/** A request that names a cell explicitly outranks every softer signal. */
|
|
49
|
+
const NAMED_CELL_WORDS: Record<MakeKind, readonly string[]> = {
|
|
50
|
+
plugin: ['플러그인', 'plugin'],
|
|
51
|
+
workflow: ['워크플로', 'workflow'],
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/** Signal words that must not fire when every occurrence lives inside a longer
|
|
55
|
+
* compound: `메일` inside `이메일` is an email-domain word, not a mailing task,
|
|
56
|
+
* so '이메일 파싱 API' must not reach the workflow cell through it. */
|
|
57
|
+
const COMPOUND_GUARDS: ReadonlyArray<{ word: string; inside: string }> = [
|
|
58
|
+
{ word: '메일', inside: '이메일' },
|
|
59
|
+
{ word: '로드', inside: '업로드' },
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
/** Request phrases that point at each cell. Workflow is the upper cell: a workflow
|
|
63
|
+
* may use a connector, so its signals win over connector signals.
|
|
64
|
+
*
|
|
65
|
+
* 판정 기준(위에서 아래로):
|
|
66
|
+
* 1. 이름 지목 — '플러그인/plugin', '워크플로/workflow' 가 직접 나오면 그 칸.
|
|
67
|
+
* 2. 합성어 가드 — 신호 단어가 더 긴 합성어 안에만 있으면(예: '메일' ⊂ '이메일')
|
|
68
|
+
* 그 단어는 신호로 치지 않는다. '이메일 파싱 API' 는 이메일 도메인 처리
|
|
69
|
+
* 요청이지 메일 발송 워크플로가 아니다.
|
|
70
|
+
* 3. 가드를 통과한 신호가 한쪽에만 있으면 그 칸을 채택한다.
|
|
71
|
+
* 4. 양쪽에 신호가 남아 있으면(충돌) 상위 칸 워크플로가 하위 칸 플러그인을
|
|
72
|
+
* 흡수한다 — 워크플로는 커넥터를 부품으로 쓸 수 있지만 그 반대는 안 된다. */
|
|
73
|
+
const CELL_WORDS: Record<MakeKind, readonly string[]> = {
|
|
74
|
+
plugin: [
|
|
75
|
+
'읽', '파싱', 'parse', '불러', 'load', '로드', '열어', '변환', 'convert', '추출', 'extract',
|
|
76
|
+
'연동', '연결', '커넥터', 'connector', '스킬', 'skill', '도구', 'tool', 'api', '조회',
|
|
77
|
+
'ocr', 'hwp', 'pdf', 'xlsx', 'docx', 'csv', 'json', '이미지', '사진', '엑셀', '워드',
|
|
78
|
+
'번역', 'translate', '검색', 'search',
|
|
79
|
+
],
|
|
80
|
+
workflow: [
|
|
81
|
+
'매일', '매주', '매월', '매년', '매시간', '매번', '정기', '주기적', '스케줄', 'schedule',
|
|
82
|
+
'cron', '크론', '반복', 'daily', 'weekly', 'hourly', 'every ',
|
|
83
|
+
'올려', '올리', '게시', '발행', '포스팅', '업로드', 'upload', '배포', 'deploy', 'publish',
|
|
84
|
+
'보내', '전송', 'send', '알림', 'notify', '메일',
|
|
85
|
+
'하고 나서', '그다음', '순서대로', '단계별', '파이프라인', 'pipeline', '자동화', 'automation',
|
|
86
|
+
'자동으로', '일괄', 'batch', '모아', '수집해서', '시리즈',
|
|
87
|
+
],
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
function countOccurrences(text: string, needle: string): number {
|
|
91
|
+
let count = 0;
|
|
92
|
+
let at = text.indexOf(needle);
|
|
93
|
+
while (at >= 0) {
|
|
94
|
+
count += 1;
|
|
95
|
+
at = text.indexOf(needle, at + needle.length);
|
|
96
|
+
}
|
|
97
|
+
return count;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function matchWords(text: string, words: readonly string[]): string[] {
|
|
101
|
+
const hits: string[] = [];
|
|
102
|
+
for (const word of words) {
|
|
103
|
+
if (!text.includes(word)) continue;
|
|
104
|
+
const guarded = COMPOUND_GUARDS.some(
|
|
105
|
+
g => g.word === word && countOccurrences(text, g.inside) >= countOccurrences(text, word),
|
|
106
|
+
);
|
|
107
|
+
if (!guarded) hits.push(word);
|
|
108
|
+
}
|
|
109
|
+
return hits;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Deterministic judgement over the request text: picks a cell and says why it won
|
|
113
|
+
* and why the sibling cell lost. Runs before any model call, so the route always
|
|
114
|
+
* has a rationale to report. */
|
|
115
|
+
function evidenceFromRequest(request: string): MakeRouteEvidence {
|
|
116
|
+
const text = request.toLowerCase();
|
|
117
|
+
const pluginWords = matchWords(text, CELL_WORDS.plugin);
|
|
118
|
+
const workflowWords = matchWords(text, CELL_WORDS.workflow);
|
|
119
|
+
const namedPlugin = matchWords(text, NAMED_CELL_WORDS.plugin);
|
|
120
|
+
const namedWorkflow = matchWords(text, NAMED_CELL_WORDS.workflow);
|
|
121
|
+
const named: MakeKind | null = namedPlugin.length && !namedWorkflow.length
|
|
122
|
+
? 'plugin'
|
|
123
|
+
: namedWorkflow.length && !namedPlugin.length ? 'workflow' : null;
|
|
124
|
+
|
|
125
|
+
let kind: MakeKind | null = null;
|
|
126
|
+
let reason: string;
|
|
127
|
+
let signals: string[] = [];
|
|
128
|
+
|
|
129
|
+
if (named) {
|
|
130
|
+
kind = named;
|
|
131
|
+
signals = named === 'plugin' ? namedPlugin : namedWorkflow;
|
|
132
|
+
reason = `요청이 ${CELL_LABEL[named]} 칸을 이름으로 지목(${signals.join(', ')}) — 명시 지목이 최상위 근거`;
|
|
133
|
+
} else if (workflowWords.length) {
|
|
134
|
+
kind = 'workflow';
|
|
135
|
+
signals = workflowWords;
|
|
136
|
+
reason = `반복·게시·시퀀스 신호(${workflowWords.join(', ')}) — 상위 칸 워크플로 채택`;
|
|
137
|
+
} else if (pluginWords.length) {
|
|
138
|
+
kind = 'plugin';
|
|
139
|
+
signals = pluginWords;
|
|
140
|
+
reason = `커넥터·역량·형식 신호(${pluginWords.join(', ')}) — 하위 칸 플러그인 채택`;
|
|
141
|
+
} else {
|
|
142
|
+
reason = '필수 근거 없음 — 요청에서 플러그인·워크플로 신호를 찾지 못했다';
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const excluded: MakeExclusion[] = [];
|
|
146
|
+
if (kind === 'workflow') {
|
|
147
|
+
excluded.push({
|
|
148
|
+
kind: 'plugin',
|
|
149
|
+
reason: [
|
|
150
|
+
named === 'workflow'
|
|
151
|
+
? `요청이 워크플로를 이름으로 지목(${namedWorkflow.join(', ')})`
|
|
152
|
+
: `반복·게시·시퀀스 신호(${workflowWords.join(', ')})`,
|
|
153
|
+
pluginWords.length
|
|
154
|
+
? `플러그인 신호(${pluginWords.join(', ')})는 커넥터 단품이라 상위 칸에 흡수`
|
|
155
|
+
: '플러그인 신호 0건',
|
|
156
|
+
].join(' · '),
|
|
157
|
+
});
|
|
158
|
+
} else if (kind === 'plugin') {
|
|
159
|
+
excluded.push({
|
|
160
|
+
kind: 'workflow',
|
|
161
|
+
reason: [
|
|
162
|
+
named === 'plugin'
|
|
163
|
+
? `요청이 플러그인을 이름으로 지목(${namedPlugin.join(', ')})`
|
|
164
|
+
: `커넥터·역량 신호(${pluginWords.join(', ')})`,
|
|
165
|
+
workflowWords.length
|
|
166
|
+
? `워크플로 신호(${workflowWords.join(', ')})가 있으나 단품 칸이 채택`
|
|
167
|
+
: '워크플로 신호 0건',
|
|
168
|
+
].join(' · '),
|
|
169
|
+
});
|
|
170
|
+
} else {
|
|
171
|
+
excluded.push(
|
|
172
|
+
{ kind: 'plugin', reason: '플러그인 신호 0건 — 필수 근거 없음' },
|
|
173
|
+
{ kind: 'workflow', reason: '워크플로 신호 0건 — 필수 근거 없음' },
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return {
|
|
178
|
+
request,
|
|
179
|
+
kind,
|
|
180
|
+
decidedBy: kind ? 'request-evidence' : 'none',
|
|
181
|
+
measured: kind !== null,
|
|
182
|
+
reason,
|
|
183
|
+
signals,
|
|
184
|
+
excluded,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export async function classifyMakeRequest(request: string, call?: JudgeCall): Promise<MakeJudgeVerdict | null> {
|
|
15
189
|
if (!request.trim()) return null;
|
|
16
|
-
const result = await judge<
|
|
190
|
+
const result = await judge<MakeJudgeVerdict>({
|
|
17
191
|
site: 'cli.make',
|
|
18
192
|
...(call ? { call } : {}),
|
|
19
|
-
prompt: `Classify this request for an Elanous creator. Choose "plugin" for a reusable connector, integration, skill, or capability (including reading a file format). Choose "workflow" for a sequence of jobs, recurring schedule, automation, or publishing task, even when it uses a connector.
|
|
193
|
+
prompt: `Classify this request for an Elanous creator. Choose "plugin" for a reusable connector, integration, skill, or capability (including reading a file format). Choose "workflow" for a sequence of jobs, recurring schedule, automation, or publishing task, even when it uses a connector. Respond with JSON only, exactly {"kind":"plugin"|"workflow","reason":"<한 문장: 이 칸을 고른 근거>","excluded":"<한 문장: 다른 칸을 뺀 근거>"}. Return {"kind":"unclear"} when you cannot decide. An answer missing either rationale field is rejected as unmeasured. Do not execute the request.\nRequest: ${JSON.stringify(request)}`,
|
|
20
194
|
schema: value => {
|
|
21
195
|
if (!value || typeof value !== 'object' || Array.isArray(value)) return null;
|
|
22
196
|
const kind = (value as { kind?: unknown }).kind;
|
|
23
|
-
|
|
197
|
+
if (kind !== 'plugin' && kind !== 'workflow') return null;
|
|
198
|
+
const reason = (value as { reason?: unknown }).reason;
|
|
199
|
+
const excluded = (value as { excluded?: unknown }).excluded;
|
|
200
|
+
if (typeof reason !== 'string' || !reason.trim()) return null;
|
|
201
|
+
if (typeof excluded !== 'string' || !excluded.trim()) return null;
|
|
202
|
+
return { kind, reason: reason.trim(), excluded: excluded.trim() };
|
|
24
203
|
},
|
|
25
204
|
});
|
|
26
205
|
return result.ok ? result.value : null;
|
|
27
206
|
}
|
|
28
207
|
|
|
208
|
+
/** Production judgement path for `elanous make`: request evidence first, the
|
|
209
|
+
* classify judge only when the request carries no evidence at all. A judge
|
|
210
|
+
* answer without both rationales is reported as unmeasured, never as success;
|
|
211
|
+
* `skipJudge` leaves the judge uncalled so --route-only dumps stay
|
|
212
|
+
* deterministic (no model call, no dispatch). */
|
|
213
|
+
export async function routeMakeRequest(
|
|
214
|
+
request: string,
|
|
215
|
+
opts: { call?: JudgeCall; skipJudge?: boolean } = {},
|
|
216
|
+
): Promise<MakeRouteEvidence> {
|
|
217
|
+
const evidence = evidenceFromRequest(request);
|
|
218
|
+
if (evidence.measured) return evidence;
|
|
219
|
+
|
|
220
|
+
let verdict: MakeJudgeVerdict | null = null;
|
|
221
|
+
let note: string;
|
|
222
|
+
if (opts.skipJudge) {
|
|
223
|
+
note = '판정기 호출 생략(증거 전용 경로)';
|
|
224
|
+
} else {
|
|
225
|
+
try {
|
|
226
|
+
verdict = await classifyMakeRequest(request, opts.call);
|
|
227
|
+
note = verdict
|
|
228
|
+
? `classify judge 가 ${CELL_LABEL[verdict.kind]} 를 근거와 함께 반환`
|
|
229
|
+
: 'classify judge 가 근거 있는 판정을 반환하지 않음';
|
|
230
|
+
} catch (err) {
|
|
231
|
+
note = `classify judge 호출 실패(${err instanceof Error ? err.message : String(err)})`;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (!verdict) {
|
|
236
|
+
return { ...evidence, decidedBy: 'none', measured: false, reason: `${evidence.reason} · ${note}` };
|
|
237
|
+
}
|
|
238
|
+
const other = OTHER_CELL[verdict.kind];
|
|
239
|
+
return {
|
|
240
|
+
request,
|
|
241
|
+
kind: verdict.kind,
|
|
242
|
+
decidedBy: 'classify-judge',
|
|
243
|
+
measured: true,
|
|
244
|
+
reason: `요청 근거 없음(플러그인·워크플로 신호 0건) → ${note} — ${CELL_LABEL[verdict.kind]} 칸 채택 · 판정기 근거: ${verdict.reason}`,
|
|
245
|
+
signals: [`judge:${verdict.kind}`],
|
|
246
|
+
excluded: [{ kind: other, reason: `요청 근거 없음 · 판정기 배제 근거: ${verdict.excluded}` }],
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
|
|
29
250
|
export function registerMakeCommand(program: Command, deps: MakeDeps = {}): void {
|
|
30
251
|
program.command('make <request>')
|
|
31
252
|
.description('Classify a one-line request and make a plugin or build a workflow')
|
|
32
|
-
.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
253
|
+
.option('--route-only', 'print the cli.make/route evidence JSON and exit — no judge call, no plugin or workflow dispatch')
|
|
254
|
+
.action(async (request: string, opts: { routeOnly?: boolean }) => {
|
|
255
|
+
const evidence = await routeMakeRequest(request, {
|
|
256
|
+
...(deps.judgeCall ? { call: deps.judgeCall } : {}),
|
|
257
|
+
...(opts.routeOnly ? { skipJudge: true } : {}),
|
|
258
|
+
});
|
|
259
|
+
debug.log('cli.make', 'route', evidence);
|
|
260
|
+
if (!evidence.measured) {
|
|
261
|
+
debug.log('cli.make', 'route-unmeasured', {
|
|
262
|
+
request: evidence.request,
|
|
263
|
+
reason: evidence.reason,
|
|
264
|
+
excluded: evidence.excluded,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
if (opts.routeOnly) {
|
|
268
|
+
console.log(JSON.stringify(evidence));
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
if (!evidence.kind) {
|
|
36
272
|
console.log('플러그인(커넥터·스킬)을 만들까요, 워크플로(잡)를 만들까요?');
|
|
37
273
|
process.exitCode = 1;
|
|
38
274
|
return;
|
|
39
275
|
}
|
|
40
|
-
if (kind === 'plugin') await (deps.pluginMake ?? runPluginMake)(request);
|
|
276
|
+
if (evidence.kind === 'plugin') await (deps.pluginMake ?? runPluginMake)(request);
|
|
41
277
|
else process.exitCode = await (deps.workflowMake ?? ((text: string) => workflowRun('build-workflow', text)))(request);
|
|
42
278
|
});
|
|
43
279
|
}
|
package/src/cli/msg-cli.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
2
|
import { ensureAuthToken } from '../auth/acp-token.js';
|
|
3
|
+
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
3
4
|
import { canonicalSeatId, openMsgStore, openMsgStoreReadOnly, type Message, type MsgStore } from '../msg/msg-store.js';
|
|
5
|
+
import { clearPostOffice, ensurePostOffice, writePostOffice } from '../msg/msg-post-office.js';
|
|
4
6
|
import { startMsgSseServer } from '../msg/msg-sse-server.js';
|
|
7
|
+
import type { AgentReplyAddress, AgentReplyInput, AgentReplyResult } from '../loops/agent-reply.js';
|
|
5
8
|
import { messageRouteFor, noReplyBodyNotice, unsupportedLoopAddressNotice } from '../loops/msg-address.js';
|
|
6
9
|
import { resolveWake, wakeRecipient, type WakeDeps, type WakeOutcome } from '../loops/msg-wake.js';
|
|
10
|
+
import type { RoleLlmSpec } from '../user-config.js';
|
|
11
|
+
|
|
12
|
+
/** The loop rows whose reply body is an LLM agent: `--agent-reply` picks one of these. */
|
|
13
|
+
const AGENT_REPLY_ROLES = { COORDINATOR: 'coordinator', GUARDIAN: 'guardian' } as const;
|
|
7
14
|
|
|
8
15
|
export interface MsgCliDeps {
|
|
9
16
|
openStore?: () => MsgStore;
|
|
@@ -21,6 +28,24 @@ export interface MsgCliDeps {
|
|
|
21
28
|
registerLogSink?: () => Promise<unknown>;
|
|
22
29
|
/** Wake the recipient after a durable post; never changes the post outcome. */
|
|
23
30
|
wake?: (address: string, msgId: number, message: { from: string; kind?: string }, deps: WakeDeps) => Promise<WakeOutcome>;
|
|
31
|
+
/**
|
|
32
|
+
* Agent auto-reply producer (`--agent-reply`). The default resolves the selected role LLM, loads its pack,
|
|
33
|
+
* and calls the real `replyWithAgent`; the seams exist so a test still traverses that producer.
|
|
34
|
+
*/
|
|
35
|
+
agentReply?: {
|
|
36
|
+
role?: RoleLlmSpec;
|
|
37
|
+
pack?: string;
|
|
38
|
+
/** Test seam: a fake turn still goes through `replyWithAgent` and its ledger transaction. */
|
|
39
|
+
runAgent?: AgentReplyInput['runAgent'];
|
|
40
|
+
/** Test seam for the role ladder — `undefined` means «역할 LLM 미설정». */
|
|
41
|
+
resolveRole?: (address: AgentReplyAddress) => RoleLlmSpec | undefined;
|
|
42
|
+
observationRoot?: string;
|
|
43
|
+
};
|
|
44
|
+
/** `msg serve --sse` discovery file root (default: the state root). `msg post` restarts a dead service found here. */
|
|
45
|
+
postOfficeStateRoot?: string;
|
|
46
|
+
postOfficeAlive?: (pid: number) => boolean;
|
|
47
|
+
postOfficeProbe?: (url: string) => Promise<boolean>;
|
|
48
|
+
postOfficeLaunch?: (input: { port: number }) => void;
|
|
24
49
|
/** Test seams for the existing self-send transport and the selected task-card ledger. */
|
|
25
50
|
readCard?: typeof import('../task-agent/task-hand.js').readTaskCard;
|
|
26
51
|
podFragmentsForRun?: typeof import('../harness/self-send-target.js').listPodFragmentsForRun;
|
|
@@ -160,16 +185,94 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
160
185
|
if (json) out.log(JSON.stringify(value));
|
|
161
186
|
else human();
|
|
162
187
|
};
|
|
188
|
+
const officeRoot = () => deps.postOfficeStateRoot ?? elanousStateRoot();
|
|
189
|
+
|
|
190
|
+
/** `--agent-reply <address>` — only the loop rows that answer with an LLM body. */
|
|
191
|
+
const agentReplyAddress = (raw: string | undefined): AgentReplyAddress | null => {
|
|
192
|
+
if (raw === undefined) return null;
|
|
193
|
+
const name = raw.trim().toUpperCase();
|
|
194
|
+
if (!Object.hasOwn(AGENT_REPLY_ROLES, name)) throw new Error('--agent-reply must be COORDINATOR or GUARDIAN');
|
|
195
|
+
return name as AgentReplyAddress;
|
|
196
|
+
};
|
|
197
|
+
const requireAgentTarget = (address: AgentReplyAddress, to: string): void => {
|
|
198
|
+
if (address !== to) throw new Error(`--agent-reply ${address} requires --to ${address}`);
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Human-free live conversation: the selected address's LLM body answers the message that was just saved.
|
|
203
|
+
* The durable ledger stays authoritative — `replyWithAgent` owns the one-reply-per-request transaction and
|
|
204
|
+
* its dedupe, so a retry finds the existing link instead of generating again. A failure never changes the
|
|
205
|
+
* post's exit code; it is reported as one line on stderr.
|
|
206
|
+
*/
|
|
207
|
+
const autoReply = async (address: AgentReplyAddress, request: Message, json: boolean | undefined): Promise<void> => {
|
|
208
|
+
const seam = deps.agentReply;
|
|
209
|
+
let role = seam?.role;
|
|
210
|
+
if (role === undefined) {
|
|
211
|
+
if (seam?.resolveRole) role = seam.resolveRole(address);
|
|
212
|
+
else {
|
|
213
|
+
const { resolveConfiguredAgentRoleLlm } = await import('../user-config.js');
|
|
214
|
+
// Only an explicitly selected provider/tier/model starts an agent body; effort alone is not a selection.
|
|
215
|
+
role = resolveConfiguredAgentRoleLlm(AGENT_REPLY_ROLES[address]);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (role === undefined) {
|
|
219
|
+
out.error(`msg: ${address} 역할 LLM 미설정 — 자동 답 없음`);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
let pack = seam?.pack;
|
|
223
|
+
if (pack === undefined) {
|
|
224
|
+
try {
|
|
225
|
+
const { loadAgentRolePack } = await import('../loops/agent-reply.js');
|
|
226
|
+
pack = loadAgentRolePack(AGENT_REPLY_ROLES[address]);
|
|
227
|
+
} catch (error) {
|
|
228
|
+
out.error(`msg: ${address} 역할 팩 없음 — 자동 답 없음: ${error instanceof Error ? error.message : String(error)}`);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
const { replyWithAgent } = await import('../loops/agent-reply.js');
|
|
234
|
+
const store = open();
|
|
235
|
+
let result: AgentReplyResult;
|
|
236
|
+
try {
|
|
237
|
+
result = await replyWithAgent({ address, role, pack, store,
|
|
238
|
+
request: { id: request.id, from: request.from, body: request.body,
|
|
239
|
+
...(request.kind === undefined ? {} : { kind: request.kind }) },
|
|
240
|
+
...(seam?.runAgent ? { runAgent: seam.runAgent } : {}),
|
|
241
|
+
...(seam?.observationRoot ? { observationRoot: seam.observationRoot } : {}) });
|
|
242
|
+
} finally { store.close(); }
|
|
243
|
+
emit({ agentReply: { address, requestId: request.id, ...result } }, json,
|
|
244
|
+
() => out.log(`자동 답 ${result.replyId === null ? '없음' : `#${result.replyId}`} (${address} → ${request.from})${result.posted ? '' : ' — 이미 있음'}`));
|
|
245
|
+
} catch (error) {
|
|
246
|
+
out.error(`msg: 자동 답 실패: ${error instanceof Error ? error.message : String(error)}`);
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Installed post-office supervision: a registered `msg serve --sse` that no longer answers is restarted on
|
|
252
|
+
* its recorded port. Nothing is spawned when no service registered itself, so a plain post is unchanged.
|
|
253
|
+
*/
|
|
254
|
+
const supervisePostOffice = async (): Promise<void> => {
|
|
255
|
+
const result = await ensurePostOffice({ stateRoot: officeRoot(),
|
|
256
|
+
...(deps.postOfficeAlive ? { alive: deps.postOfficeAlive } : {}),
|
|
257
|
+
...(deps.postOfficeProbe ? { probe: deps.postOfficeProbe } : {}),
|
|
258
|
+
...(deps.postOfficeLaunch ? { launch: deps.postOfficeLaunch } : {}) });
|
|
259
|
+
if (result.state === 'restarted')
|
|
260
|
+
out.error(`msg: post office 재시작 (port ${result.port}) — 원장이 정본이라 저장된 글은 다시 밀린다`);
|
|
261
|
+
};
|
|
163
262
|
|
|
164
263
|
msg.command('post [body]').description('Post a message; use - or omit body to read stdin')
|
|
165
264
|
.option('--from <seat>').option('--to <seat>').option('--kind <kind>').option('--body <text>')
|
|
166
265
|
.option('--reply-to <id>', 'point this reply at a question message ID')
|
|
266
|
+
.option('--agent-reply <address>', 'let this address\'s agent body (COORDINATOR · GUARDIAN) answer the saved message once')
|
|
167
267
|
.option('--origin-key <key>', 'deduplicate a channel mirror by coord:<commentId>:<recipient>').option('--json')
|
|
168
|
-
.action((body: string | undefined, opts: CommonOptions & { from?: string; to?: string; kind?: string; body?: string; replyTo?: string; originKey?: string }) => run(async () => {
|
|
268
|
+
.action((body: string | undefined, opts: CommonOptions & { from?: string; to?: string; kind?: string; body?: string; replyTo?: string; originKey?: string; agentReply?: string }) => run(async () => {
|
|
169
269
|
const from = seat(opts.from, '--from');
|
|
170
270
|
const unsupported = opts.to === undefined ? null : unsupportedLoopAddressNotice(opts.to);
|
|
171
271
|
if (unsupported) out.error(unsupported);
|
|
172
272
|
const to = seat(opts.to, '--to');
|
|
273
|
+
// Validate the auto-reply target before saving — a mismatched flag must not leave a stored message behind.
|
|
274
|
+
const agentAddress = agentReplyAddress(opts.agentReply);
|
|
275
|
+
if (agentAddress !== null) requireAgentTarget(agentAddress, to);
|
|
173
276
|
if (body !== undefined && body !== '-' && opts.body !== undefined) throw new Error('provide body once (argument or --body)');
|
|
174
277
|
const text = opts.body ?? (body !== undefined && body !== '-' ? body : await readStdin());
|
|
175
278
|
const envelope = { from, to, body: text,
|
|
@@ -192,10 +295,14 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
192
295
|
new Promise<void>(resolve => { sinkTimer = setTimeout(resolve, 1000); }),
|
|
193
296
|
]).finally(() => clearTimeout(sinkTimer));
|
|
194
297
|
} catch { /* observability is fail-open */ }
|
|
298
|
+
// 설치본을 갈아 끼우면 우편국(SSE)은 조용히 사라진다 — 등록해 둔 서비스가 응답하지 않으면 같은 포트로 다시 띄운다.
|
|
299
|
+
// 재시작도 관측도 post 의 성패를 바꾸지 않는다.
|
|
300
|
+
try { await supervisePostOffice(); } catch { /* post office is fail-open */ }
|
|
195
301
|
try {
|
|
196
302
|
await (deps.wake ?? wakeRecipient)(to, posted.id, { from, ...(opts.kind === undefined ? {} : { kind: opts.kind }) },
|
|
197
303
|
{ ...deps.wakeDeps, warn: noBody ? () => {} : line => out.error(line) });
|
|
198
304
|
} catch { /* the wake outcome is logged by wakeRecipient; the post is already durable */ }
|
|
305
|
+
if (agentAddress !== null) await autoReply(agentAddress, posted, opts.json);
|
|
199
306
|
})());
|
|
200
307
|
|
|
201
308
|
msg.command('route <address>').description('Show how a post to this address is read (replyBody) and woken (wake)')
|
|
@@ -344,11 +451,14 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
344
451
|
|
|
345
452
|
msg.command('ask <recipient> <question>').description('Post a question and wait for its first reply')
|
|
346
453
|
.option('--from <seat>', 'asking seat (required)').option('--wait <seconds>', 'seconds to wait for a reply (default 60)', '60')
|
|
454
|
+
.option('--agent-reply <address>', 'let this address\'s agent body (COORDINATOR · GUARDIAN) answer before waiting')
|
|
347
455
|
.option('--json')
|
|
348
|
-
.action((recipient: string, question: string, opts: CommonOptions & { from?: string; wait?: string }) => run(async () => {
|
|
456
|
+
.action((recipient: string, question: string, opts: CommonOptions & { from?: string; wait?: string; agentReply?: string }) => run(async () => {
|
|
349
457
|
const from = seat(opts.from, '--from');
|
|
350
458
|
const to = canonicalSeatId(recipient);
|
|
351
459
|
const waitSeconds = integer(opts.wait, '--wait', 60, 0, 86400);
|
|
460
|
+
const agentAddress = agentReplyAddress(opts.agentReply);
|
|
461
|
+
if (agentAddress !== null) requireAgentTarget(agentAddress, to);
|
|
352
462
|
const interrupt = deps.signal === undefined ? new AbortController() : undefined;
|
|
353
463
|
const signal = deps.signal ?? interrupt!.signal;
|
|
354
464
|
const onInterrupt = () => interrupt?.abort();
|
|
@@ -362,6 +472,8 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
362
472
|
emit(asked, opts.json, () => out.log(`#${asked.id}`));
|
|
363
473
|
// msg ask uses the same saved-message handler before waiting for its linked reply.
|
|
364
474
|
await handleTaMessage(asked);
|
|
475
|
+
// 사람 없는 live 대화: 답할 몸이 있으면 «기다리기 전»에 답을 원장에 남긴다 — 같은 대기 루프가 그 답을 집는다.
|
|
476
|
+
if (agentAddress !== null) await autoReply(agentAddress, asked, opts.json);
|
|
365
477
|
const deadline = Date.now() + waitSeconds * 1000;
|
|
366
478
|
let reply: Message | undefined;
|
|
367
479
|
store = open();
|
|
@@ -419,8 +531,10 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
|
|
|
419
531
|
try {
|
|
420
532
|
const service = startMsgSseServer({ store, token: (deps.authToken ?? (() => ensureAuthToken().token))(),
|
|
421
533
|
port, hostname: opts.host });
|
|
534
|
+
// 발견 줄 — 설치본을 갈아 끼운 뒤 `msg post` 가 이 줄을 읽어 죽은 서비스를 같은 포트로 다시 띄운다.
|
|
535
|
+
writePostOffice(officeRoot(), { port: service.port });
|
|
422
536
|
out.log(`msg SSE listening on ${opts.host}:${service.port}`);
|
|
423
|
-
const stop = () => { service.stop(); store.close(); };
|
|
537
|
+
const stop = () => { service.stop(); store.close(); clearPostOffice(officeRoot()); };
|
|
424
538
|
process.once('SIGINT', stop);
|
|
425
539
|
process.once('SIGTERM', stop);
|
|
426
540
|
} catch (error) { store.close(); throw error; }
|
package/src/cli/pr-cli.ts
CHANGED
|
@@ -62,8 +62,8 @@ import { admitLandingMerge } from '../self-implement/frozen-merges.js';
|
|
|
62
62
|
import { resolveOverlapEvidencePath, verifyAllSameHeadReviews, verifyAncestorAutoPass, verifyOverlapEvidence, verifyOverlapEvidenceVirtualRebase } from './pr-land-overlap-evidence.js';
|
|
63
63
|
import type { VerifyOverlapEvidenceInput } from './pr-land-overlap-evidence.js';
|
|
64
64
|
import { verifyVirtualRebasePatch } from './pr-land-virtual-rebase.js';
|
|
65
|
-
import { observeDirectPrLandRefusal, observePrLandRefusal } from './pr-land-refusal.js';
|
|
66
|
-
import {
|
|
65
|
+
import { classifyPrLandRefusal, observeDirectPrLandRefusal, observePrLandRefusal } from './pr-land-refusal.js';
|
|
66
|
+
import { bindPrLandRefusalToRecover, PR_LAND_CARD_ID_ENV } from './pr-land-recovery.js';
|
|
67
67
|
import { ensurePrLandHeavyRemote, type HeavyRemoteInput, type HeavyRemoteResult } from './pr-land-heavy-remote.js';
|
|
68
68
|
import { readPrBaseNameWithRetry } from './pr-land-base-read.js';
|
|
69
69
|
import { runHeavyOnPodShadow } from './pr-land-pod-shadow.js';
|
|
@@ -1319,26 +1319,39 @@ export async function runPrLand(opts: PrLandOpts = {}, deps: PrLandDeps = {}): P
|
|
|
1319
1319
|
};
|
|
1320
1320
|
// Observe actual merge refusals, including the measured remote gate and public export leak.
|
|
1321
1321
|
// Option syntax and unmeasured prerequisite errors do not describe a recovery edge.
|
|
1322
|
+
// LAND-REFUSAL-EDGES — a pinned refusal is also bound to the recover@1 edge with its raw line and card.
|
|
1323
|
+
// The card arrives only through the child env set by TA defaultLand — never a shell export.
|
|
1324
|
+
const cardId = process.env[PR_LAND_CARD_ID_ENV]?.trim() || undefined;
|
|
1325
|
+
const bindRecover = (message: string, context: { isDraft?: boolean } = {}) => {
|
|
1326
|
+
const pr = Number(opts.pr);
|
|
1327
|
+
if (!Number.isSafeInteger(pr) || pr <= 0 || !opts.expectedHead) return undefined;
|
|
1328
|
+
try { return bindPrLandRefusalToRecover({ refusal: message, pr, head: opts.expectedHead, isDraft: context.isDraft, cardId }); }
|
|
1329
|
+
catch { return undefined; }
|
|
1330
|
+
};
|
|
1322
1331
|
const refuse = (message: string, context: { isDraft?: boolean } = {}): void => {
|
|
1323
1332
|
out.error(message);
|
|
1324
1333
|
observePrLandRefusal(message, context);
|
|
1325
|
-
const
|
|
1326
|
-
if (
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
// Recovery observation must never replace the original landing refusal.
|
|
1336
|
-
}
|
|
1334
|
+
const plan = bindRecover(message, context);
|
|
1335
|
+
if (!plan) return;
|
|
1336
|
+
try {
|
|
1337
|
+
debug.log('pr.land', 'recover-shadow', {
|
|
1338
|
+
pr: Number(opts.pr), head: opts.expectedHead, label: plan.evidence.label, route: plan.evidence.route,
|
|
1339
|
+
outcome: plan.outcome, action: plan.result.action, reason: plan.result.reason,
|
|
1340
|
+
delayMs: plan.result.delayMs ?? null, execution: 'none',
|
|
1341
|
+
});
|
|
1342
|
+
} catch {
|
|
1343
|
+
// Recovery observation must never replace the original landing refusal.
|
|
1337
1344
|
}
|
|
1338
1345
|
};
|
|
1346
|
+
// A direct failure binds only when today's refusal shape is recognized — the same measured sample
|
|
1347
|
+
// as observeDirectPrLandRefusal (#28939). An unclassified direct error is not a landing refusal.
|
|
1348
|
+
const observeDirect = (message: string): void => {
|
|
1349
|
+
observeDirectPrLandRefusal(message);
|
|
1350
|
+
if (classifyPrLandRefusal(message) !== 'other') bindRecover(message);
|
|
1351
|
+
};
|
|
1339
1352
|
const refuseDirect = (message: string): void => {
|
|
1340
1353
|
out.error(message);
|
|
1341
|
-
|
|
1354
|
+
observeDirect(message);
|
|
1342
1355
|
};
|
|
1343
1356
|
if (opts.title !== undefined && opts.titleFile !== undefined) {
|
|
1344
1357
|
out.error('✗ title: --title과 --title-file은 함께 사용할 수 없습니다.');
|
|
@@ -2043,7 +2056,7 @@ export async function runPrLand(opts: PrLandOpts = {}, deps: PrLandDeps = {}): P
|
|
|
2043
2056
|
nextMdWarning(body ?? '', changedPaths, out);
|
|
2044
2057
|
if (!conflictMarkerBlock(changedPaths, cwd, out)) return 1;
|
|
2045
2058
|
publicLeakWarning(changedPaths, deps.runPublicLeakGate ?? ((files, sink) => runPrLandPublicLeakGate(files, sink, cwd, base)), out);
|
|
2046
|
-
if (!exportLeakBlock(changedPaths, () => (deps.runExportLeakCheck ?? runPrLandExportLeakCheck)(changedPaths ?? [], cwd), opts.allowPublicLeak === true, out, cwd,
|
|
2059
|
+
if (!exportLeakBlock(changedPaths, () => (deps.runExportLeakCheck ?? runPrLandExportLeakCheck)(changedPaths ?? [], cwd), opts.allowPublicLeak === true, out, cwd, observeDirect)) return 1;
|
|
2047
2060
|
if (!await exportImportBlock(changedPaths, () => (deps.runExportImportCheck ?? runPrLandExportImportCheck)(changedPaths ?? [], cwd), out)) return 1;
|
|
2048
2061
|
if (publicDocPaths(changedPaths, () => true).length > 0) {
|
|
2049
2062
|
const top = run('git', ['rev-parse', '--show-toplevel'], { cwd });
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import type { CmdRunner } from '../autopilot/pr-manager.js';
|
|
2
2
|
|
|
3
3
|
export const PR_LAND_BASE_READ_RETRIES = 2;
|
|
4
|
-
|
|
4
|
+
/** Increasing backoff: 1s after the first unreadable read, 3s after the second (OPT #24215). */
|
|
5
|
+
export const PR_LAND_BASE_READ_RETRY_DELAYS_MS = [1_000, 3_000] as const;
|
|
6
|
+
/** Fixed ceiling: no retry sleep ever exceeds the last scheduled delay. */
|
|
7
|
+
export const PR_LAND_BASE_READ_RETRY_DELAY_CAP_MS = 3_000;
|
|
8
|
+
|
|
9
|
+
/** Backoff for the sleep that follows `attempt`; the schedule stops growing at the cap. */
|
|
10
|
+
export function prLandBaseReadRetryDelayMs(attempt: number): number {
|
|
11
|
+
const index = Math.min(Math.max(attempt, 1), PR_LAND_BASE_READ_RETRY_DELAYS_MS.length) - 1;
|
|
12
|
+
return Math.min(PR_LAND_BASE_READ_RETRY_DELAYS_MS[index], PR_LAND_BASE_READ_RETRY_DELAY_CAP_MS);
|
|
13
|
+
}
|
|
5
14
|
|
|
6
15
|
export interface PrBaseReadResult {
|
|
7
16
|
baseRefName: string | null;
|
|
@@ -30,7 +39,7 @@ export async function readPrBaseNameWithRetry(input: {
|
|
|
30
39
|
|
|
31
40
|
if (baseRefName !== null) return { baseRefName, attempts: attempt };
|
|
32
41
|
input.onUnreadable?.(attempt, viewed.err);
|
|
33
|
-
if (attempt <= PR_LAND_BASE_READ_RETRIES) await input.sleep(
|
|
42
|
+
if (attempt <= PR_LAND_BASE_READ_RETRIES) await input.sleep(prLandBaseReadRetryDelayMs(attempt));
|
|
34
43
|
}
|
|
35
44
|
return { baseRefName: null, attempts: PR_LAND_BASE_READ_RETRIES + 1 };
|
|
36
45
|
}
|
|
@@ -8,8 +8,11 @@ import { debug, redactSecretText } from '../debug/log.js';
|
|
|
8
8
|
import { gateRemoteHostCap, realGateRemoteRunner, resolveGateRemoteSettings, runOnRemote, type GateRemoteRunner, type RemoteRunOutcome } from '../self-implement/gate-remote.js';
|
|
9
9
|
|
|
10
10
|
const SHA = /^[0-9a-f]{40}$/i;
|
|
11
|
-
// WSL
|
|
12
|
-
|
|
11
|
+
// WSL still lands last: its gate environment was repaired (WSL-GATE-ENV, 2026-10-17 — baselineWorkspaceRoot in
|
|
12
|
+
// scripts/ci-typecheck-changed.ts now picks the host disk /var/tmp instead of WSL's 20GiB tmpfs), so the host is
|
|
13
|
+
// allowlisted as the third slot while node-b/node-c keep discovery order — the recorded host order stays part of the
|
|
14
|
+
// evidence contract.
|
|
15
|
+
export const PR_LAND_HEAVY_HOSTS = ['node-b', 'node-c', 'host-e-wsl'] as const;
|
|
13
16
|
export const PR_LAND_HEAVY_HOST = PR_LAND_HEAVY_HOSTS[0];
|
|
14
17
|
export type PrLandHeavyHost = typeof PR_LAND_HEAVY_HOSTS[number];
|
|
15
18
|
const allowedHost = (host: string): host is PrLandHeavyHost => PR_LAND_HEAVY_HOSTS.some((candidate) => candidate === host);
|
|
@@ -234,7 +237,7 @@ export function ensurePrLandHeavyRemote(input: HeavyRemoteInput, deps: HeavyRemo
|
|
|
234
237
|
// A completed run or infrastructure failure is a verdict. Only a full host slot asks for another host.
|
|
235
238
|
if (outcome.kind !== 'busy') break wait;
|
|
236
239
|
}
|
|
237
|
-
//
|
|
240
|
+
// Every allowlisted host was busy. Wait the same slotWaitSeconds window as self gate, then retry.
|
|
238
241
|
debug.log('pr.land', 'host-busy', { host: selectedHost, occupied: outcome.occupied ?? null, slotWaitSeconds: settings.slotWaitSeconds });
|
|
239
242
|
const left = deadline - now();
|
|
240
243
|
if (left <= 0) break;
|