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
|
@@ -10,20 +10,33 @@
|
|
|
10
10
|
/**
|
|
11
11
|
* 독립 프로세스에서 logs.db 싱크를 등록한다. 반환된 off 는 process 'exit' 에 자동 배선된다.
|
|
12
12
|
* @param surface 이 프로세스가 남기는 로그의 surface 라벨(예: 'scheduler'·'autopilot').
|
|
13
|
+
* @param opts.wrapSink logs.db 싱크를 감싼다(예: TUI 는 pid·`--name`·세션을 data 에 찍는다 — debug/tui-log-tag.ts).
|
|
13
14
|
*/
|
|
14
|
-
export async function registerStandaloneLogSink(
|
|
15
|
+
export async function registerStandaloneLogSink(
|
|
16
|
+
surface: string,
|
|
17
|
+
opts: { wrapSink?: (sink: import('../mss/logging/sink.js').LogSink) => import('../mss/logging/sink.js').LogSink } = {},
|
|
18
|
+
): Promise<boolean> {
|
|
15
19
|
try {
|
|
16
20
|
const [storeMod, dbgMod, cfgMod] = await Promise.all([
|
|
17
21
|
import('../mss/logging/log-store.js'),
|
|
18
22
|
import('../debug/log.js'),
|
|
19
23
|
import('../user-config.js'),
|
|
20
24
|
]);
|
|
25
|
+
// TUI-LOG-SESSION-TAG — 한 logs.db 를 여러 TUI(클래식·next)가 쓴다: 행마다 pid·`--name`·소유 세션을 data 에 찍는다.
|
|
26
|
+
if (surface === 'tui' && !opts.wrapSink) {
|
|
27
|
+
const tagMod = await import('../debug/tui-log-tag.js');
|
|
28
|
+
const tag = tagMod.processTuiLogTag();
|
|
29
|
+
opts = { ...opts, wrapSink: (s) => tagMod.withTuiLogTag(s, tag) };
|
|
30
|
+
}
|
|
21
31
|
const logsCfg = cfgMod.getUserConfig().logs;
|
|
22
32
|
storeMod.setLogInstanceName(logsCfg.instanceName);
|
|
33
|
+
// TUI-TYPING-LAG — TUI 는 워커 로그 폭주를 덩어리로 나눠 넣는다(키가 drain 전체를 기다리지 않게).
|
|
34
|
+
const drainChunkSize = storeMod.logStoreDrainChunkForSurface(surface);
|
|
23
35
|
const offStore = storeMod.registerLogStoreSink(
|
|
24
|
-
(s) => dbgMod.debug.registerSink(s),
|
|
36
|
+
(s) => dbgMod.debug.registerSink(opts.wrapSink ? opts.wrapSink(s) : s),
|
|
25
37
|
surface,
|
|
26
38
|
logsCfg.retention,
|
|
39
|
+
drainChunkSize !== undefined ? { drainChunkSize } : {},
|
|
27
40
|
);
|
|
28
41
|
if (!offStore) return false;
|
|
29
42
|
process.on('exit', offStore);
|
package/src/esc-abort-gate.ts
CHANGED
|
@@ -145,6 +145,75 @@ export function createHarnessEscHint(pushLine: (line: string) => void): (targets
|
|
|
145
145
|
};
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
+
export interface EscAbortPendingSoftStopRunnerDeps {
|
|
149
|
+
getActiveHarnessSpace: () => string | null;
|
|
150
|
+
pushChatLine: (line: string) => void;
|
|
151
|
+
showHarnessEscHint: (targets: readonly string[]) => boolean;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export interface EscAbortPendingSoftStopOutcomeLike {
|
|
155
|
+
outcome: 'stopped' | 'failed' | 'hint' | 'waiting';
|
|
156
|
+
stoppedHarnessSpace: string | null;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export interface EscAbortPendingGateDeps {
|
|
160
|
+
/**
|
|
161
|
+
* Production soft-stop runner (`runEscAbortPendingSoftStop` in
|
|
162
|
+
* src/dashboard/index.ts): enqueues the durable soft-stop marker,
|
|
163
|
+
* verifies it, and paints the stopped/failure line. Injected (not
|
|
164
|
+
* imported) to keep this module free of a dashboard import cycle.
|
|
165
|
+
*/
|
|
166
|
+
runSoftStop: (targets: readonly string[], deps: EscAbortPendingSoftStopRunnerDeps) => EscAbortPendingSoftStopOutcomeLike;
|
|
167
|
+
formatWaitingTargets: (targets: readonly string[]) => string;
|
|
168
|
+
getActiveHarnessSpace: () => string | null;
|
|
169
|
+
pushChatLine: (line: string) => void;
|
|
170
|
+
showHarnessEscHint: (targets: readonly string[]) => boolean;
|
|
171
|
+
/** Dashboard paint hook (chatScrollOffset reset) after each callback. */
|
|
172
|
+
afterAbortEvent?: () => void;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export interface EscAbortPendingGate {
|
|
176
|
+
onAbortPending(event: { running: number; repeat: number; targets: readonly string[] }): void;
|
|
177
|
+
onAbortRepeat(event: { running: number; repeat: number; targets: readonly string[]; phase: 'confirming' | 'pending' }): void;
|
|
178
|
+
getStoppedHarnessSpace(): string | null;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* ⭐ TUI-ESC-EXIT production seam — the onAbortPending/onAbortRepeat
|
|
183
|
+
* callback pair that `attachChatStreamingKeys` wires into
|
|
184
|
+
* `createEscAbortGate`. Extracted from the dashboard inline closure so the
|
|
185
|
+
* incident test exercises the same function the dashboard executes.
|
|
186
|
+
*
|
|
187
|
+
* ⛔ Preservation rule: `stoppedHarnessSpace` only advances on a successful
|
|
188
|
+
* soft stop (a real stopped space). Later waiting/hint/failed callbacks must
|
|
189
|
+
* NOT clear a previously successful space — `onAbortRepeat` and the
|
|
190
|
+
* teardown `settleEscAbortPendingLines` decision depend on the retained value.
|
|
191
|
+
*/
|
|
192
|
+
export function createEscAbortPendingGate(deps: EscAbortPendingGateDeps): EscAbortPendingGate {
|
|
193
|
+
let stoppedHarnessSpace: string | null = null;
|
|
194
|
+
return {
|
|
195
|
+
onAbortPending({ targets }) {
|
|
196
|
+
const softStop = deps.runSoftStop(targets, {
|
|
197
|
+
getActiveHarnessSpace: deps.getActiveHarnessSpace,
|
|
198
|
+
pushChatLine: deps.pushChatLine,
|
|
199
|
+
showHarnessEscHint: deps.showHarnessEscHint,
|
|
200
|
+
});
|
|
201
|
+
if (softStop.stoppedHarnessSpace) stoppedHarnessSpace = softStop.stoppedHarnessSpace;
|
|
202
|
+
if (softStop.outcome === 'waiting') {
|
|
203
|
+
deps.pushChatLine(` ⏳ 중단 요청됨 — ${deps.formatWaitingTargets(targets)} 종료를 기다리는 중입니다.`);
|
|
204
|
+
}
|
|
205
|
+
deps.afterAbortEvent?.();
|
|
206
|
+
},
|
|
207
|
+
onAbortRepeat({ repeat, targets }) {
|
|
208
|
+
if (!stoppedHarnessSpace && !deps.showHarnessEscHint(targets)) {
|
|
209
|
+
deps.pushChatLine(` ⏳ ESC 재시도 ${repeat}회 — ${deps.formatWaitingTargets(targets)} 종료를 기다리는 중입니다.`);
|
|
210
|
+
}
|
|
211
|
+
deps.afterAbortEvent?.();
|
|
212
|
+
},
|
|
213
|
+
getStoppedHarnessSpace: () => stoppedHarnessSpace,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
|
|
148
217
|
export function createEscAbortGate(deps: EscAbortGateDeps): EscAbortGate {
|
|
149
218
|
let current: ApprovalModalHandle | null = null;
|
|
150
219
|
let currentDispose: (() => void) | null = null;
|
package/src/git-fs/worktree.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
// because elanous's primary surface runs native git.
|
|
11
11
|
|
|
12
12
|
import { spawnSync, execFileSync, type SpawnSyncReturns } from 'node:child_process';
|
|
13
|
-
import { existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, writeFileSync, rmSync, symlinkSync, lstatSync } from 'node:fs';
|
|
13
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, writeFileSync, rmSync, symlinkSync, lstatSync, unlinkSync } from 'node:fs';
|
|
14
14
|
import { homedir } from 'node:os';
|
|
15
15
|
import { basename, dirname, join, resolve } from 'node:path';
|
|
16
16
|
import { findGitDir } from './locate.js';
|
|
@@ -18,6 +18,7 @@ import { isTransientGitError } from './retry.js';
|
|
|
18
18
|
import { runGitCommand } from './runner.js';
|
|
19
19
|
import { debug } from '../debug/log.js';
|
|
20
20
|
import { getUserConfig } from '../user-config.js';
|
|
21
|
+
import { GATE_DEPS_DIR, GATE_DEPS_TREES, projectDepsManifest } from '../task-orchestrator/surfaces/pod-gate-deps.js';
|
|
21
22
|
|
|
22
23
|
const GIT_TIMEOUT_MS = 30_000;
|
|
23
24
|
/** 얕은 클론(Pod `git clone --depth 50` · docker/harness/job.yaml)에서 base 를 가져올 깊이 — 클론과 같은 값.
|
|
@@ -30,6 +31,7 @@ const TRACKED_FILE_COUNT_MAX_BUFFER = 16 * 1024 * 1024;
|
|
|
30
31
|
|
|
31
32
|
export interface WorktreeAddDeps {
|
|
32
33
|
spawn?: (command: string, args: string[], options: { cwd: string; encoding: 'utf8'; timeout: number; maxBuffer: number }) => SpawnSyncReturns<string>;
|
|
34
|
+
installDependencies?: (cwd: string, timeoutMs: number) => { status: number | null; stderr?: string | null; error?: Error };
|
|
33
35
|
countTrackedFiles?: (repoRoot: string, ref?: string) => number | null;
|
|
34
36
|
}
|
|
35
37
|
|
|
@@ -324,6 +326,81 @@ export function linkWorktreeDependencies(
|
|
|
324
326
|
return result;
|
|
325
327
|
}
|
|
326
328
|
|
|
329
|
+
const WORKTREE_DEPENDENCY_INSTALL_TIMEOUT_MS = 600_000;
|
|
330
|
+
|
|
331
|
+
/** A lockfile-bearing child must have dependencies before its tests start. */
|
|
332
|
+
export class WorktreeDependencyPreparationError extends Error {
|
|
333
|
+
readonly code = 'WORKTREE_DEPENDENCIES_UNAVAILABLE';
|
|
334
|
+
constructor(readonly worktreePath: string, readonly dependencyPath: string, readonly reason: string) {
|
|
335
|
+
super(`worktree dependencies unavailable (${dependencyPath}) at ${worktreePath}: ${reason}`);
|
|
336
|
+
this.name = 'WorktreeDependencyPreparationError';
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function bakedDependenciesMatch(repoTree: string, bakedTree: string): boolean {
|
|
341
|
+
try {
|
|
342
|
+
if (!existsSync(join(bakedTree, 'node_modules'))) return false;
|
|
343
|
+
if (!readFileSync(join(repoTree, 'bun.lock')).equals(readFileSync(join(bakedTree, 'bun.lock')))) return false;
|
|
344
|
+
const source = projectDepsManifest(JSON.parse(readFileSync(join(repoTree, 'package.json'), 'utf8')) as Record<string, unknown>);
|
|
345
|
+
const baked = projectDepsManifest(JSON.parse(readFileSync(join(bakedTree, 'package.json'), 'utf8')) as Record<string, unknown>);
|
|
346
|
+
return JSON.stringify(source) === JSON.stringify(baked);
|
|
347
|
+
} catch { return false; }
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function prepareWorktreeDependencies(repoRoot: string, worktreePath: string, opts: CreateWorktreeOpts, deps: WorktreeAddDeps): void {
|
|
351
|
+
const fallbackRoot = opts.dependencyFallbackRoot?.trim() || GATE_DEPS_DIR;
|
|
352
|
+
const timeoutMs = opts.dependencyInstallTimeoutMs ?? WORKTREE_DEPENDENCY_INSTALL_TIMEOUT_MS;
|
|
353
|
+
if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) throw new Error('dependencyInstallTimeoutMs must be a positive integer');
|
|
354
|
+
for (const tree of GATE_DEPS_TREES) {
|
|
355
|
+
const targetTree = join(worktreePath, tree);
|
|
356
|
+
const relativePath = tree === '.' ? 'node_modules' : 'apps/pwa/node_modules';
|
|
357
|
+
const target = join(worktreePath, relativePath);
|
|
358
|
+
const source = join(repoRoot, relativePath);
|
|
359
|
+
const fallbackTree = join(fallbackRoot, tree);
|
|
360
|
+
const fallback = join(fallbackTree, 'node_modules');
|
|
361
|
+
const report = (installed: boolean, ok: boolean, error: string | null, method: string): void => {
|
|
362
|
+
debug.log('git-fs.worktree', 'dependencies.prepared', {
|
|
363
|
+
worktreePath, path: relativePath, source, fallback, installed, ok, error, method,
|
|
364
|
+
}, ok ? undefined : { level: 'warn' });
|
|
365
|
+
};
|
|
366
|
+
if (existsSync(target)) { report(false, true, null, existsSync(source) ? 'source' : 'existing'); continue; }
|
|
367
|
+
try { if (lstatSync(target).isSymbolicLink()) unlinkSync(target); } catch (error) {
|
|
368
|
+
if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;
|
|
369
|
+
}
|
|
370
|
+
// Plain git repositories without a Bun lockfile have no dependency contract.
|
|
371
|
+
if (!existsSync(join(targetTree, 'package.json')) || !existsSync(join(targetTree, 'bun.lock'))) {
|
|
372
|
+
report(false, true, null, 'not-required');
|
|
373
|
+
continue;
|
|
374
|
+
}
|
|
375
|
+
if (bakedDependenciesMatch(targetTree, fallbackTree)) {
|
|
376
|
+
try {
|
|
377
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
378
|
+
symlinkSync(fallback, target, 'dir');
|
|
379
|
+
report(false, true, null, 'fallback');
|
|
380
|
+
continue;
|
|
381
|
+
} catch (error) {
|
|
382
|
+
debug.log('git-fs.worktree', 'dependencies.fallback-failed', { worktreePath, path: relativePath, error: String(error) }, { level: 'warn' });
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
let result: { status: number | null; stderr?: string | null; error?: Error };
|
|
386
|
+
try {
|
|
387
|
+
result = deps.installDependencies
|
|
388
|
+
? deps.installDependencies(targetTree, timeoutMs)
|
|
389
|
+
: spawnSync('bun', ['install', '--frozen-lockfile'], { cwd: targetTree, encoding: 'utf8', timeout: timeoutMs, maxBuffer: 16 * 1024 * 1024 });
|
|
390
|
+
} catch (error) {
|
|
391
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
392
|
+
report(true, false, reason, 'install');
|
|
393
|
+
throw new WorktreeDependencyPreparationError(worktreePath, relativePath, reason);
|
|
394
|
+
}
|
|
395
|
+
if (result.status === 0 && existsSync(target)) { report(true, true, null, 'install'); continue; }
|
|
396
|
+
const reason = (result.error as NodeJS.ErrnoException | undefined)?.code === 'ETIMEDOUT'
|
|
397
|
+
? `install timed out after ${timeoutMs}ms`
|
|
398
|
+
: (result.stderr ?? result.error?.message ?? `install exited ${result.status}`).trim().slice(-4096) || `install exited ${result.status}`;
|
|
399
|
+
report(true, false, reason, 'install');
|
|
400
|
+
throw new WorktreeDependencyPreparationError(worktreePath, relativePath, reason);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
327
404
|
export interface CreateWorktreeOpts {
|
|
328
405
|
/** Absolute repo root (main checkout). */
|
|
329
406
|
repoRoot: string;
|
|
@@ -361,6 +438,12 @@ export interface CreateWorktreeOpts {
|
|
|
361
438
|
* 기록된 owner 와 **정확히 같을 때**만 더티를 재사용 거부 사유로 쓰지 않는다(그 dirt 는 그 런 자신의 산출).
|
|
362
439
|
* ⛔ 생략·공백이면 종전 동작: 더티는 `worktree-dirty` 로 거부한다. */
|
|
363
440
|
currentOwner?: string;
|
|
441
|
+
/** Baked dependency root; defaults to the harness image tree. */
|
|
442
|
+
dependencyFallbackRoot?: string;
|
|
443
|
+
/** Pod child only: require dependencies before its tests. Other callers remain fail-soft. */
|
|
444
|
+
requireDependencies?: boolean;
|
|
445
|
+
/** Maximum install time for each missing dependency tree; default 600 seconds. */
|
|
446
|
+
dependencyInstallTimeoutMs?: number;
|
|
364
447
|
}
|
|
365
448
|
|
|
366
449
|
/** base 를 무엇으로 확정했는지 — **모름과 부재를 값으로 가른다.**
|
|
@@ -715,6 +798,7 @@ export function createWorktree(opts: CreateWorktreeOpts, deps: WorktreeAddDeps =
|
|
|
715
798
|
debug.log('git-fs.worktree', 'add.branch-held-reused', { branch, worktreePath: branchHolder, owner: gate.owner }, { level: 'warn' });
|
|
716
799
|
const reusedLinks = linkWorktreeDependencies(repoRoot, branchHolder);
|
|
717
800
|
debug.log('git-fs.worktree', 'dependencies.linked', { branch, worktreePath: branchHolder, dependencyLinks: reusedLinks });
|
|
801
|
+
if (opts.requireDependencies) prepareWorktreeDependencies(repoRoot, branchHolder, opts, deps);
|
|
718
802
|
const head = spawnSync('git', ['rev-parse', 'HEAD'], { cwd: branchHolder, encoding: 'utf8', timeout: GIT_TIMEOUT_MS });
|
|
719
803
|
const headSha = (head.stdout ?? '').trim();
|
|
720
804
|
if (head.status !== 0 || headSha.length === 0) {
|
|
@@ -809,6 +893,16 @@ export function createWorktree(opts: CreateWorktreeOpts, deps: WorktreeAddDeps =
|
|
|
809
893
|
// idempotent). fail-soft — 링크 실패해도 worktree 자체는 유효(caller 가 필요시 install).
|
|
810
894
|
const dependencyLinks = linkWorktreeDependencies(repoRoot, wtPath);
|
|
811
895
|
debug.log('git-fs.worktree', 'dependencies.linked', { branch, worktreePath: wtPath, dependencyLinks });
|
|
896
|
+
if (opts.requireDependencies) {
|
|
897
|
+
try { prepareWorktreeDependencies(repoRoot, wtPath, opts, deps); }
|
|
898
|
+
catch (error) {
|
|
899
|
+
try { removeWorktree(repoRoot, wtPath, true); }
|
|
900
|
+
catch (cleanupError) {
|
|
901
|
+
debug.log('git-fs.worktree', 'dependencies.cleanup-failed', { worktreePath: wtPath, error: String(cleanupError) }, { level: 'warn' });
|
|
902
|
+
}
|
|
903
|
+
throw error;
|
|
904
|
+
}
|
|
905
|
+
}
|
|
812
906
|
const resolvedBase = spawnSync('git', ['rev-parse', 'HEAD'], {
|
|
813
907
|
cwd: wtPath,
|
|
814
908
|
encoding: 'utf8',
|
|
@@ -28,6 +28,24 @@ function findGraphFile(graphId: string): string | undefined {
|
|
|
28
28
|
|
|
29
29
|
export function registerGraphCommands(program: Command, runsDeps: { root?: string; processStartMs?: (pid: number) => number | null } = {}): void {
|
|
30
30
|
const graph = program.command('graph').description('Run a declared command graph or inspect its latest run');
|
|
31
|
+
graph.command('wizard-run <request>')
|
|
32
|
+
.description('Run one request through the smart wizard graph and stop at its approval gate')
|
|
33
|
+
.option('--json', 'Print run identity and transitions as JSON')
|
|
34
|
+
.action(async (request: string, opts: { json?: boolean }) => {
|
|
35
|
+
try {
|
|
36
|
+
await (await import('../domains/standalone-log-sink.js')).registerStandaloneLogSink('graph');
|
|
37
|
+
const { runWizardRequest } = await import('../smart-wizard/run.js');
|
|
38
|
+
const result = await runWizardRequest(request);
|
|
39
|
+
const summary = { graphId: result.state.graphId, runId: result.runId, status: result.status,
|
|
40
|
+
path: result.path, transitions: result.transitions };
|
|
41
|
+
if (opts.json) await writeStdoutJson(JSON.stringify(summary) + '\n');
|
|
42
|
+
else console.log(`${summary.graphId} ${summary.runId}: ${summary.status} (${summary.path.join(' → ')})`);
|
|
43
|
+
if (result.status !== 'awaiting-approval' && result.status !== 'done') process.exitCode = 1;
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.error(`graph wizard-run: ${error instanceof Error ? error.message : String(error)}`);
|
|
46
|
+
process.exitCode = 1;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
31
49
|
graph.command('run <file>')
|
|
32
50
|
.option('--dry-run', 'Walk the success path without executing commands')
|
|
33
51
|
.option('--json', 'Print run state as JSON')
|
|
@@ -38,6 +38,7 @@ const RELEASE_NODE_COMMANDS: Readonly<Record<string, { recipe: string; command?:
|
|
|
38
38
|
'checklist-gate': { recipe: 'cmd:checklist-gate', command: 'bun scripts/release-loop/checklist-gate-node.ts' },
|
|
39
39
|
prefetch: { recipe: 'cmd:docs', command: 'bun scripts/release-loop/docs-node.ts --json' },
|
|
40
40
|
gate: { recipe: 'cmd:gate', command: 'bun scripts/release-loop/gate-node.ts --json' },
|
|
41
|
+
'traffic-gate-passed': { recipe: 'cmd:traffic-gate-passed', command: 'bun scripts/release-loop/traffic-node.ts traffic-gate-passed' },
|
|
41
42
|
'gate-triage': { recipe: 'cmd:gate-triage', command: 'bun scripts/release-loop/gate-triage-node.ts' },
|
|
42
43
|
'mac-smoke': { recipe: 'cmd:mac-smoke', command: 'bun scripts/release-loop/mac-smoke-node.ts' },
|
|
43
44
|
'export-check': { recipe: 'cmd:export-check', command: 'bun scripts/release-loop/export-check-node.ts' },
|
|
@@ -48,12 +49,15 @@ const RELEASE_NODE_COMMANDS: Readonly<Record<string, { recipe: string; command?:
|
|
|
48
49
|
docs: { recipe: 'cmd:docs', command: 'bun scripts/release-loop/docs-node.ts --json' },
|
|
49
50
|
'known-issues': { recipe: 'cmd:known-issues', command: 'bun scripts/release-loop/known-issues-node.ts' },
|
|
50
51
|
'notes-check': { recipe: 'cmd:notes-check', command: 'bun scripts/announce-loop/check-node.ts --json' },
|
|
52
|
+
'notes-repair': { recipe: 'cmd:docs', command: 'bun scripts/release-loop/docs-node.ts --json' },
|
|
53
|
+
'notes-recheck': { recipe: 'cmd:notes-check', command: 'bun scripts/announce-loop/check-node.ts --json' },
|
|
51
54
|
'auto-approve': { recipe: 'cmd:auto-approve', command: 'bun scripts/release-loop/auto-approve-node.ts' },
|
|
52
55
|
'approve-publish': { recipe: 'approval:publish' },
|
|
53
56
|
publish: { recipe: 'cmd:publish-command', command: 'bun scripts/release-loop/publish-node.ts' },
|
|
54
57
|
'npm-publish': { recipe: 'cmd:npm-publish', command: 'bun scripts/release-loop/npm-publish-node.ts' },
|
|
55
58
|
'docs-land': { recipe: 'cmd:docs-land', command: 'bun scripts/release-loop/docs-land-node.ts' },
|
|
56
59
|
verify: { recipe: 'cmd:verify', command: 'bun scripts/release-loop/verify-node.ts' },
|
|
60
|
+
'traffic-verify-complete': { recipe: 'cmd:traffic-verify-complete', command: 'bun scripts/release-loop/traffic-node.ts traffic-verify-complete' },
|
|
57
61
|
'vault-note': { recipe: 'cmd:vault-note', command: 'bun scripts/release-loop/vault-note-node.ts' },
|
|
58
62
|
'release-story': { recipe: 'cmd:release-story', command: 'bun scripts/release-story/draft.ts --graph' },
|
|
59
63
|
'ops-upgrade': { recipe: 'cmd:ops-upgrade', command: 'bun scripts/release-loop/ops-upgrade-node.ts' },
|
|
@@ -266,6 +270,20 @@ export function verifyReleaseCommandRoot(root: string, cutTip: string, git?: (ar
|
|
|
266
270
|
return commandRoot;
|
|
267
271
|
}
|
|
268
272
|
|
|
273
|
+
/** Reject a checkout whose saved release graph or recipes differ, including before an injected graph runner is called. */
|
|
274
|
+
export function verifyReleaseRecipeSnapshot(commandRoot: string, snapshot?: { graphSha: string; recipesSha: string }): void {
|
|
275
|
+
if (!snapshot) throw new Error('release recipe snapshot missing — cannot pin command source');
|
|
276
|
+
const cutGraph = join(commandRoot, 'graphs', 'release', 'release-loop.yaml');
|
|
277
|
+
const cutRecipes = join(commandRoot, 'graphs', 'release', 'recipes.yaml');
|
|
278
|
+
const hashFile = (file: string): string => {
|
|
279
|
+
try { return createHash('sha256').update(readFileSync(file)).digest('hex'); }
|
|
280
|
+
catch { throw new Error(`release recipe source missing in cut checkout: ${file}`); }
|
|
281
|
+
};
|
|
282
|
+
if (hashFile(cutGraph) !== snapshot.graphSha || hashFile(cutRecipes) !== snapshot.recipesSha) {
|
|
283
|
+
throw new Error('release recipe source differs from the saved graph snapshot at cut tip');
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
269
287
|
function safeSegment(value: string): string {
|
|
270
288
|
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value) || value === '.' || value === '..') {
|
|
271
289
|
throw new Error(`invalid graph run identifier: ${value}`);
|
|
@@ -780,16 +798,7 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
780
798
|
const commandRoot = verifyReleaseCommandRoot(source.root, savedCutTip, source.git);
|
|
781
799
|
// The ledger snapshot must be the recipe that the cut checkout actually carries.
|
|
782
800
|
// HEAD alone does not bind a saved graph to that checkout.
|
|
783
|
-
|
|
784
|
-
const cutGraph = join(commandRoot, 'graphs', 'release', 'release-loop.yaml');
|
|
785
|
-
const cutRecipes = join(commandRoot, 'graphs', 'release', 'recipes.yaml');
|
|
786
|
-
const hashFile = (file: string): string => {
|
|
787
|
-
try { return createHash('sha256').update(readFileSync(file)).digest('hex'); }
|
|
788
|
-
catch { throw new Error(`release recipe source missing in cut checkout: ${file}`); }
|
|
789
|
-
};
|
|
790
|
-
if (hashFile(cutGraph) !== state.graphSnapshot.graphSha || hashFile(cutRecipes) !== state.graphSnapshot.recipesSha) {
|
|
791
|
-
throw new Error('release recipe source differs from the saved graph snapshot at cut tip');
|
|
792
|
-
}
|
|
801
|
+
verifyReleaseRecipeSnapshot(commandRoot, state.graphSnapshot);
|
|
793
802
|
return commandRoot;
|
|
794
803
|
};
|
|
795
804
|
verifyReleaseSource();
|
|
@@ -1070,7 +1079,7 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1070
1079
|
for (const previous of state.nodes) outputs[previous.nodeId] = lastJsonObject(previous.output) ?? previous.output ?? null;
|
|
1071
1080
|
const contextPath = join(`${statePath}.contexts`, `${state.path.length}.json`);
|
|
1072
1081
|
mkdirSync(dirname(contextPath), { recursive: true });
|
|
1073
|
-
writeFileSync(contextPath, JSON.stringify({ graphId, runId, nodeId: current, input: state.input ?? null, outputs }, null, 2) + '\n');
|
|
1082
|
+
writeFileSync(contextPath, JSON.stringify({ graphId, runId, startedAt: state.startedAt, nodeId: current, input: state.input ?? null, outputs }, null, 2) + '\n');
|
|
1074
1083
|
let code: number | null = null;
|
|
1075
1084
|
const redactCredentials = (text: string) => Object.values(credentials).filter(value => value.length > 0)
|
|
1076
1085
|
.reduce((safe, value) => safe.replaceAll(value, '[REDACTED]'), text);
|
|
@@ -16,11 +16,13 @@ import { debug } from '../debug/log.js';
|
|
|
16
16
|
import { listNodeKinds, type GraphKind } from '../graph-kinds/registry.js';
|
|
17
17
|
import { validateGraphYaml } from '../nexus/api/graph-kinds.js';
|
|
18
18
|
import { defaultGraphsDir } from '../self-implement/graph-templates.js';
|
|
19
|
+
import { createGraphVariant, type GraphVariantPlan, type GraphVariantResult } from '../self-implement/graph-variant.js';
|
|
20
|
+
import type { GraphTemplateSpec } from '../self-implement/graph-yaml.js';
|
|
19
21
|
import { WORKFLOW_SYNTH_SYSTEM_PROMPT } from '../workflow-synth/system-prompt.js';
|
|
20
22
|
import { WIZARD_ARCHETYPES } from './archetypes.js';
|
|
21
23
|
import { listInstalledPacks, queryInstalledPack } from '../knowledge/query.js';
|
|
22
24
|
import { parsePackIdString } from '../knowledge/kgs/pack.js';
|
|
23
|
-
import { WIZARD_MAX_RETRIES, WIZARD_STEPS, WIZARD_STEP_IDS, recipesYamlFor, type WizardNodeStep } from './steps.js';
|
|
25
|
+
import { WIZARD_MAX_RETRIES, WIZARD_STEPS, WIZARD_STEP_IDS, recipesSiblingOf, recipesYamlFor, type WizardNodeStep } from './steps.js';
|
|
24
26
|
|
|
25
27
|
export interface GraphWizardTurn { role: 'user' | 'assistant'; text: string }
|
|
26
28
|
|
|
@@ -71,6 +73,104 @@ export interface GraphWizardDeps {
|
|
|
71
73
|
|
|
72
74
|
export const GRAPH_WIZARD_MAX_ATTEMPTS = 3;
|
|
73
75
|
|
|
76
|
+
export interface KnownGraphUnit {
|
|
77
|
+
readonly id: string;
|
|
78
|
+
readonly call: string;
|
|
79
|
+
readonly inputs: readonly string[];
|
|
80
|
+
readonly outputs: readonly string[];
|
|
81
|
+
readonly exits: readonly string[];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Use the same validated template inventory as the wizard; only templates declaring a unit are candidates. */
|
|
85
|
+
export function listKnownGraphUnits(dir = defaultGraphsDir()): KnownGraphUnit[] {
|
|
86
|
+
return listWizardTemplates(dir).flatMap((template) => {
|
|
87
|
+
let raw: { version?: unknown; unit?: { inputs?: unknown; outputs?: unknown; exits?: unknown } };
|
|
88
|
+
try { raw = parseYaml(template.text) as typeof raw; } catch { return []; }
|
|
89
|
+
if (!raw?.unit || !Number.isSafeInteger(raw.version)) return [];
|
|
90
|
+
const { inputs, outputs, exits } = raw.unit;
|
|
91
|
+
if (![inputs, outputs, exits].every((value) => Array.isArray(value) && value.every((item) => typeof item === 'string'))) return [];
|
|
92
|
+
return [{ id: template.id, call: `${template.id}@${raw.version}`, inputs: inputs as string[], outputs: outputs as string[], exits: exits as string[] }];
|
|
93
|
+
}).sort((a, b) => a.call.localeCompare(b.call));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export type GraphVariantDesignResult =
|
|
97
|
+
| { readonly status: 'composed'; readonly plan: GraphVariantPlan; readonly variant: Extract<GraphVariantResult, { ok: true }> }
|
|
98
|
+
| { readonly status: 'fallback-standard'; readonly template: GraphTemplateSpec; readonly reason: string };
|
|
99
|
+
|
|
100
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
101
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** One L2 designer proposal. The model returns only a plan; the existing variant authority decides whether it may run. */
|
|
105
|
+
export async function designGraphVariantPlan(input: {
|
|
106
|
+
readonly goal: string;
|
|
107
|
+
readonly prompt: string;
|
|
108
|
+
readonly template: GraphTemplateSpec;
|
|
109
|
+
readonly knownUnits?: readonly KnownGraphUnit[];
|
|
110
|
+
}, deps: Pick<GraphWizardDeps, 'callLLM' | 'graphsDir'> = {}): Promise<GraphVariantDesignResult> {
|
|
111
|
+
const units = input.knownUnits ?? listKnownGraphUnits(deps.graphsDir);
|
|
112
|
+
const unitCalls = new Set(units.map((unit) => unit.call));
|
|
113
|
+
const lines = [
|
|
114
|
+
'알려진 그래프 유닛(새 노드를 짓기 전에 먼저 찾는다):',
|
|
115
|
+
...units.map((unit) => `- ${unit.call} · inputs=${unit.inputs.join(',')} · outputs=${unit.outputs.join(',')} · exits=${unit.exits.join(',')}`),
|
|
116
|
+
'', '너는 발사 시점 L2 그래프 설계자다. 전체 YAML 대신 GraphVariantPlan JSON 객체 하나만 출력하라. 설명·코드 펜스·추가 키 금지.',
|
|
117
|
+
'허용 키: maxVisits(기존 nodeId→양의 정수), routes([{from,outcome,to}] 기존 조건 간선), growth({node,from,outcome,returnTo}) 한 개.',
|
|
118
|
+
'유닛 추가가 필요하면 growth.node는 kind=subgraph, call=<위 목록의 id@version>, recipe=none, maxVisits=1로 제안하라.',
|
|
119
|
+
'growth.node.contract는 선택한 유닛의 inputs와 outputs를 위 목록에서 순서까지 그대로 복사하고 tools="read-only"로 쓴다. 빈 배열로 바꾸거나 이름을 지어내지 마라.',
|
|
120
|
+
'growth는 기존 from 노드의 비어 있는 outcome에서만 가능하며 returnTo는 기존 노드여야 한다. 삭제·무조건 간선 변경·전체 그래프 생성은 불가하다.',
|
|
121
|
+
`골: ${input.goal}`, `요청: ${input.prompt}`, `기반: ${input.template.graphId}@${input.template.version}`,
|
|
122
|
+
`기존 노드: ${input.template.nodes.map((node) => `${node.nodeId}(${node.kind},maxVisits=${node.maxVisits})`).join(', ')}`,
|
|
123
|
+
`기존 간선: ${input.template.edges.map((edge) => `${edge.from}:${edge.on ?? 'direct'}→${edge.to ?? JSON.stringify(edge.map ?? {})}`).join(', ')}`,
|
|
124
|
+
];
|
|
125
|
+
let raw: unknown;
|
|
126
|
+
try { raw = JSON.parse((await (deps.callLLM ?? defaultCallLLM)(lines.join('\n'))).trim()); }
|
|
127
|
+
catch (error) {
|
|
128
|
+
const reason = `designer-output: ${error instanceof Error ? error.message : String(error)}`;
|
|
129
|
+
debug.log('graph.compose', 'fallback-standard', { goal: input.goal, reason });
|
|
130
|
+
return { status: 'fallback-standard', template: input.template, reason };
|
|
131
|
+
}
|
|
132
|
+
const record = isRecord(raw) ? raw : null;
|
|
133
|
+
const allowed = new Set(['maxVisits', 'routes', 'growth']);
|
|
134
|
+
const maxVisits = record?.maxVisits;
|
|
135
|
+
const routes = record?.routes;
|
|
136
|
+
const growth = record?.growth;
|
|
137
|
+
const growthRecord = isRecord(growth) ? growth : null;
|
|
138
|
+
const growthNode = isRecord(growthRecord?.node) ? growthRecord.node : null;
|
|
139
|
+
const growthContract = isRecord(growthNode?.contract) ? growthNode.contract : null;
|
|
140
|
+
const selectedUnit = typeof growthNode?.call === 'string' ? units.find((unit) => unit.call === growthNode.call) : undefined;
|
|
141
|
+
const valid = record !== null && Object.keys(record).every((key) => allowed.has(key)) &&
|
|
142
|
+
(maxVisits === undefined || (maxVisits !== null && typeof maxVisits === 'object' && !Array.isArray(maxVisits) &&
|
|
143
|
+
Object.values(maxVisits).every((value) => Number.isSafeInteger(value) && (value as number) > 0))) &&
|
|
144
|
+
(routes === undefined || (Array.isArray(routes) && routes.every((route) => route !== null && typeof route === 'object' &&
|
|
145
|
+
!Array.isArray(route) && Object.keys(route).sort().join(',') === 'from,outcome,to' &&
|
|
146
|
+
[route.from, route.outcome, route.to].every((value) => typeof value === 'string')))) &&
|
|
147
|
+
(growth === undefined || (growthRecord !== null &&
|
|
148
|
+
Object.keys(growthRecord).sort().join(',') === 'from,node,outcome,returnTo' &&
|
|
149
|
+
typeof growthRecord.from === 'string' && typeof growthRecord.outcome === 'string' && typeof growthRecord.returnTo === 'string' &&
|
|
150
|
+
growthNode !== null && Object.keys(growthNode).sort().join(',') === 'call,contract,kind,maxVisits,nodeId,recipe' &&
|
|
151
|
+
typeof growthNode.nodeId === 'string' && growthNode.kind === 'subgraph' && growthNode.recipe === 'none' &&
|
|
152
|
+
growthNode.maxVisits === 1 && typeof growthNode.call === 'string' && unitCalls.has(growthNode.call) && selectedUnit !== undefined &&
|
|
153
|
+
growthContract !== null && growthContract.tools === 'read-only' &&
|
|
154
|
+
Array.isArray(growthContract.inputs) && growthContract.inputs.every((value) => typeof value === 'string') &&
|
|
155
|
+
Array.isArray(growthContract.outputs) && growthContract.outputs.every((value) => typeof value === 'string') &&
|
|
156
|
+
JSON.stringify(growthContract.inputs) === JSON.stringify(selectedUnit.inputs) &&
|
|
157
|
+
JSON.stringify(growthContract.outputs) === JSON.stringify(selectedUnit.outputs)));
|
|
158
|
+
if (!valid) {
|
|
159
|
+
const reason = 'designer-output: invalid GraphVariantPlan or unknown unit';
|
|
160
|
+
debug.log('graph.compose', 'fallback-standard', { goal: input.goal, reason });
|
|
161
|
+
return { status: 'fallback-standard', template: input.template, reason };
|
|
162
|
+
}
|
|
163
|
+
const plan = record as GraphVariantPlan;
|
|
164
|
+
const variant = createGraphVariant({ template: input.template, goal: input.goal, plan });
|
|
165
|
+
if (!variant.ok) {
|
|
166
|
+
const reason = `variant-rejected: ${JSON.stringify(variant.rejections)}`;
|
|
167
|
+
debug.log('graph.compose', 'fallback-standard', { goal: input.goal, reason });
|
|
168
|
+
return { status: 'fallback-standard', template: input.template, reason };
|
|
169
|
+
}
|
|
170
|
+
debug.log('graph.compose', 'composed', { goal: input.goal, overlayId: variant.overlay.overlayId, patches: variant.patches.length });
|
|
171
|
+
return { status: 'composed', plan, variant };
|
|
172
|
+
}
|
|
173
|
+
|
|
74
174
|
/** Inventory used by the editor's pack picker and the wizard's validation. */
|
|
75
175
|
export function wizardInstalledPacks(deps: GraphWizardDeps = {}): Array<{ id: string; title: string }> {
|
|
76
176
|
return (deps.packs ?? listInstalledPacks)();
|
|
@@ -80,7 +180,7 @@ export function wizardInstalledPacks(deps: GraphWizardDeps = {}): Array<{ id: st
|
|
|
80
180
|
export class GraphWizardInputError extends Error { override name = 'GraphWizardInputError'; }
|
|
81
181
|
const GRAPH_ID = /^[a-z0-9-]+$/;
|
|
82
182
|
|
|
83
|
-
interface TemplateEntry { id: string; description: string; text: string; runnable: boolean; keywords?: string[] }
|
|
183
|
+
interface TemplateEntry { id: string; description: string; text: string; runnable: boolean; keywords?: string[]; recipes?: string }
|
|
84
184
|
|
|
85
185
|
function walkYaml(dir: string, depth = 0): string[] {
|
|
86
186
|
if (depth > 3 || !existsSync(dir)) return [];
|
|
@@ -123,7 +223,8 @@ export function listWizardTemplates(dir = defaultGraphsDir()): TemplateEntry[] {
|
|
|
123
223
|
const description = [loop.title, loop.description].filter((v): v is string => typeof v === 'string').join(' — ') || raw.graph_id;
|
|
124
224
|
const terminals = Array.isArray(raw.terminal_nodes) ? raw.terminal_nodes : [];
|
|
125
225
|
seen.add(raw.graph_id);
|
|
126
|
-
|
|
226
|
+
const recipes = recipesSiblingOf(file);
|
|
227
|
+
out.push({ id: raw.graph_id, description: description.slice(0, 160), text, runnable: terminals.every((t) => t === 'done' || t === 'failed'), ...(recipes ? { recipes } : {}) });
|
|
127
228
|
}
|
|
128
229
|
return out;
|
|
129
230
|
}
|
|
@@ -521,7 +622,10 @@ function buildPrompt(input: {
|
|
|
521
622
|
];
|
|
522
623
|
if (kind === 'harness' && !editing) {
|
|
523
624
|
lines.push('', '기존 템플릿 목록(id — 설명):', ...templates.filter((t) => t.runnable).slice(0, 30).map((t) => `- ${t.id} — ${t.description}`));
|
|
524
|
-
if (base)
|
|
625
|
+
if (base) {
|
|
626
|
+
lines.push('', `가장 가까운 템플릿(${base.id}) — 구조를 참고하라:`, '```yaml', base.text.trim(), '```');
|
|
627
|
+
if (base.recipes) lines.push('', `같은 템플릿의 recipes.yaml — 같은 단계의 명령·타임아웃·승인 문구를 그대로 재사용하라:`, '```yaml', base.recipes.trim(), '```');
|
|
628
|
+
}
|
|
525
629
|
}
|
|
526
630
|
if (req.history?.length) {
|
|
527
631
|
lines.push('', '지금까지의 대화:', ...req.history.slice(-10).map((t) => `${t.role === 'user' ? '사용자' : '마법사'}: ${t.text.slice(0, 500)}`));
|
|
@@ -76,6 +76,21 @@ export function recipesYamlFor(nodes: ReadonlyArray<{ nodeId: string; recipe: st
|
|
|
76
76
|
return out.length ? `${out.join('\n')}\n` : '{}\n';
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
+
/**
|
|
80
|
+
* 템플릿과 같은 디렉터리의 recipes.yaml — 로더(src/self-implement/graph-yaml.ts)가 템플릿에서
|
|
81
|
+
* 빼는 «명령 카탈로그» 쪽을 읽는다. 그래프의 cmd/approval 노드가 실제로 무엇을 부르는지가 여기 있다.
|
|
82
|
+
*/
|
|
83
|
+
export function recipesSiblingOf(graphFile: string): string | undefined {
|
|
84
|
+
const slash = graphFile.lastIndexOf('/');
|
|
85
|
+
const dir = slash < 0 ? '' : `${graphFile.slice(0, slash + 1)}`;
|
|
86
|
+
for (const name of ['recipes.yaml', 'recipes.yml']) {
|
|
87
|
+
const path = `${dir}${name}`;
|
|
88
|
+
if (!existsSync(path)) continue;
|
|
89
|
+
try { return readFileSync(path, 'utf8'); } catch { return undefined; }
|
|
90
|
+
}
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
|
|
79
94
|
interface GraphContext { graphId?: string; runId?: string; nodeId?: string; input?: unknown; outputs?: Record<string, unknown> }
|
|
80
95
|
|
|
81
96
|
function readContext(): GraphContext {
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// Proactive grounding — one request goes to three indexes (우리가 함 / 남이 함 /
|
|
2
|
+
// 전에 실패함) and only the citable survivors come back.
|
|
3
|
+
//
|
|
4
|
+
// Pure in/out: the three query functions are injected, nothing is read or
|
|
5
|
+
// written here. A hit is citable only when it carries a `ref` (source id ⊕
|
|
6
|
+
// file path), so everything else is dropped; if nothing survives, the caller
|
|
7
|
+
// stays silent instead of inventing a reason.
|
|
8
|
+
|
|
9
|
+
import type { ReferenceCard } from './ref-index.js';
|
|
10
|
+
|
|
11
|
+
/** Which index answered: what we did, what others did, what failed before. */
|
|
12
|
+
export type RefIndexKey = 'ours' | 'others' | 'failed';
|
|
13
|
+
|
|
14
|
+
export interface ReferenceHit {
|
|
15
|
+
/** Source id ⊕ file path. A hit without it cannot be linked, so it is dropped. */
|
|
16
|
+
ref?: string;
|
|
17
|
+
title?: string;
|
|
18
|
+
score?: number;
|
|
19
|
+
/** L0 identity of the source, when the index handed it over. */
|
|
20
|
+
card?: ReferenceCard;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** One index, asked once per request. */
|
|
24
|
+
export type ReferenceQuery = (request: string) => readonly ReferenceHit[];
|
|
25
|
+
|
|
26
|
+
export interface ProactiveReferenceSources {
|
|
27
|
+
ours: ReferenceQuery;
|
|
28
|
+
others: ReferenceQuery;
|
|
29
|
+
failed: ReferenceQuery;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface ProactiveGroundOptions {
|
|
33
|
+
/** Hits scoring under this are dropped. Default 0. */
|
|
34
|
+
minScore?: number;
|
|
35
|
+
/** Max hits kept per index, strongest first. Default 2. */
|
|
36
|
+
perIndex?: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface GroundedReference {
|
|
40
|
+
index: RefIndexKey;
|
|
41
|
+
ref: string;
|
|
42
|
+
title: string;
|
|
43
|
+
score: number;
|
|
44
|
+
card?: ReferenceCard;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface ProactiveReferencesResult {
|
|
48
|
+
refs: GroundedReference[];
|
|
49
|
+
/** Nothing survived every filter — the request grounds to nothing, so stay silent. */
|
|
50
|
+
silent: boolean;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export const DEFAULT_MAX_PER_INDEX = 2;
|
|
54
|
+
export const DEFAULT_MIN_SCORE = 0;
|
|
55
|
+
|
|
56
|
+
/** Asked in this order, so a merged list always reads ours → others → failed. */
|
|
57
|
+
const INDEX_ORDER: readonly RefIndexKey[] = ['ours', 'others', 'failed'];
|
|
58
|
+
|
|
59
|
+
export function proactiveReferences(
|
|
60
|
+
request: string,
|
|
61
|
+
sources: ProactiveReferenceSources,
|
|
62
|
+
opts: ProactiveGroundOptions = {},
|
|
63
|
+
): ProactiveReferencesResult {
|
|
64
|
+
const minScore = opts.minScore ?? DEFAULT_MIN_SCORE;
|
|
65
|
+
const perIndex = Math.max(0, Math.trunc(opts.perIndex ?? DEFAULT_MAX_PER_INDEX));
|
|
66
|
+
|
|
67
|
+
const refs: GroundedReference[] = [];
|
|
68
|
+
for (const index of INDEX_ORDER) {
|
|
69
|
+
const kept = sources[index](request)
|
|
70
|
+
.filter((hit): hit is ReferenceHit & { ref: string } => typeof hit.ref === 'string' && hit.ref.trim() !== '')
|
|
71
|
+
.map((hit) => ({ hit, score: hit.score ?? DEFAULT_MIN_SCORE }))
|
|
72
|
+
.filter(({ score }) => score >= minScore)
|
|
73
|
+
.sort((a, b) => b.score - a.score)
|
|
74
|
+
.slice(0, perIndex)
|
|
75
|
+
.map(({ hit, score }) => ({
|
|
76
|
+
index,
|
|
77
|
+
ref: hit.ref,
|
|
78
|
+
title: hit.title ?? hit.ref,
|
|
79
|
+
score,
|
|
80
|
+
...(hit.card ? { card: hit.card } : {}),
|
|
81
|
+
}));
|
|
82
|
+
refs.push(...kept);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return { refs, silent: refs.length === 0 };
|
|
86
|
+
}
|