elanous 0.2.34 → 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/{abb4b98b.163e0f56e84ae35d.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/1201.afbfc5b1c5e5cbe4.js +1 -0
- 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/2500.cbc1257b774aae52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6086.913a69e6fa3e4a8b.js → 2683.c9773a0c589b031b.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{5576-82d3703636d5c4b9.js → 275-02ea4c2a33980422.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{ffdc3a04.b9c23c1b28dd4a96.js → 2812ca6a.3b9f4a7a08885744.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{9550.d5f76828f972058c.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/{8817.61bb7ffbba502ecb.js → 3136.30aaaa5fa03662a3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9131-fce7256c4180c4a5.js → 3148-98efd4869d660a87.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3498.cf2a15a8a9e5b926.js → 3155.2587a55196ecb394.js} +3 -3
- 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/{3103.84470c8445962f04.js → 3324.a09703033abcbd2f.js} +1 -1
- 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/{3819.163d4777f0a597f6.js → 3538.a445e50bb359d068.js} +2 -2
- 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/{3414.172ad4ca2d9b08e8.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/3757-180308bc61021b05.js +1 -0
- package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +74 -0
- package/apps/pwa/out/_next/static/chunks/3840-5825d56d46976a92.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9b48c871.204d5d13e7809bd0.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/{6740.43de73fc427c9fe2.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/{8548.036c344973968847.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/{3411-f87314c6c66ebc73.js → 5085-bce4904931767ca6.js} +1 -1
- 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/{3110.0a7065f25c841818.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/{1644.35dd25240ae24e4b.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/{3837.722e053fb9f321ad.js → 5711.957b095705c12560.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2124.ed5bf480cea7f85b.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/{7562.948255cbc3e79d33.js → 599.c39c571b6733f2a2.js} +2 -2
- 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/{5446.edf141cff9ef647d.js → 6925.562d532110879886.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7005.1623d2aea78eb85f.js → 6943.c6b24124853a47b2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8368.014caa8de2f5af34.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/{2554.3b5e200f5f5cfcd6.js → 771.c3cdb6c1f7f47c02.js} +16 -16
- 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/{3121.779fafe3e44612c5.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/{9a8cb466.cc9fc9e6e46038aa.js → 873d6c12.09bd499f57171543.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7431.3051e9b8a4372d2d.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/914.8abefd48d579547b.js +94 -0
- package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1895-60ed0e341c658bd4.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/{2547.dd27303624cb4da8.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/9789.60f723d18097ec30.js +1 -0
- 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-4fb31eb476dcbad3.js → page-083747f1d4518f61.js} +1 -1
- 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/{5014f970-22bef0b5210f7d60.js → ccae1c4b-0cf414f5eff1b10d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4fa33ebd.21c1bd5b294496e6.js → ceba0382.650712b56b85b582.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/da5ecc5c-b005ad8cac737d57.js +1 -0
- package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +1 -0
- 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/{L04y73dlwKeTW-GetaTF3 → 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/bin/elanous.mjs +3 -2
- package/catalog/providers/opengateway.yaml +25 -0
- package/docs/goal-context/01-goal-authoring-checks.md +8 -0
- package/docs/goal-context/03-verification-menu.md +24 -0
- package/docs/goal-context/04-mock-scenarios.md +100 -0
- package/docs/goal-context/05-authoring-lessons.jsonl +47 -0
- package/docs/goal-context/README.md +7 -0
- package/graphs/catalog/catalog.yaml +1 -1
- package/graphs/default-loop.yaml +63 -4
- package/graphs/document-loop.yaml +51 -3
- package/graphs/implement-loop.yaml +77 -4
- package/graphs/journey/ta-journey.yaml +11 -1
- package/graphs/journey/units/author-dialogue/author-dialogue.yaml +42 -0
- package/graphs/journey/units/author-dialogue/observe.ts +96 -0
- package/graphs/journey/units/author-dialogue/recipes.yaml +10 -0
- package/graphs/operate-loop.yaml +51 -3
- package/graphs/release/recipes.yaml +6 -0
- package/graphs/release/release-loop.yaml +17 -4
- package/graphs/research-loop.yaml +137 -3
- package/graphs/test-diet/test-diet.yaml +3 -0
- 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 +19 -6
- package/scripts/first10-gate.ts +416 -0
- package/scripts/fleet/wsl-node-setup.sh +432 -0
- package/scripts/hq/standby-snapshot.ts +17 -12
- package/scripts/release-loop/docs-land-node.ts +21 -5
- package/scripts/release-loop/docs-node.ts +204 -8
- package/scripts/release-loop/gate-baseline-receipt.ts +155 -0
- package/scripts/release-loop/gate-node.ts +427 -72
- package/scripts/release-loop/gate-partial.ts +65 -11
- package/scripts/release-loop/gate-radius-live.ts +177 -0
- package/scripts/release-loop/gate-radius-shadow.ts +1 -1
- package/scripts/release-loop/node-verdict.ts +14 -1
- package/scripts/release-loop/npm-publish-node.ts +66 -12
- package/scripts/release-loop/probe-pod-host-dirs-live.ts +5 -0
- package/scripts/release-loop/pwa-remote.ts +166 -0
- package/scripts/release-loop/pwa-scenarios-node.ts +19 -3
- package/scripts/release-loop/resume-cap.ts +14 -34
- package/scripts/release-loop/resume-release.ts +78 -15
- package/scripts/release-loop/traffic-node.ts +59 -0
- package/scripts/release-loop/traffic-transition.ts +159 -0
- package/scripts/release-loop/unattended-release.ts +2 -0
- package/scripts/rhythm/daily.ts +137 -3
- package/scripts/test-diet/lib.ts +6 -1
- package/scripts/test-diet/node.ts +194 -13
- package/scripts/ux-sim.ts +92 -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/self-ambient-cache.ts +8 -0
- package/src/agent/task-notification.ts +56 -10
- package/src/agent/types.ts +4 -0
- package/src/agent-substrate/acp-reviewer.ts +39 -4
- package/src/agent-substrate/pr-reviewer.ts +72 -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 +229 -28
- package/src/autopilot/mission-codebase-gate.ts +141 -12
- package/src/autopilot/pr-manager.ts +240 -41
- package/src/boot/daemon-tools/self-implement.ts +1 -0
- package/src/budget/run-usage-rollup.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 -6
- package/src/chat/internal-turn-origin.ts +1 -0
- package/src/chat/paste-fold.ts +86 -0
- package/src/chat/pickers/modal-runtime.ts +10 -27
- 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/agent-cli.ts +13 -2
- package/src/cli/config-audit.ts +119 -0
- package/src/cli/doctor-cli.ts +26 -1
- package/src/cli/guardian-cli.ts +10 -0
- package/src/cli/herdr-cli.ts +34 -0
- package/src/cli/light-entry-route.ts +50 -7
- 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/pod-cli.ts +77 -3
- package/src/cli/pr-cli.ts +34 -18
- 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-pod-shadow-job.ts +3 -0
- package/src/cli/pr-land-recovery.ts +117 -1
- package/src/cli/pty-takeover-cli.ts +8 -7
- package/src/cli/release-checklist-read-cli.ts +79 -0
- package/src/cli/release-cli.ts +92 -106
- package/src/cli/release-single-flight.ts +1 -1
- package/src/cli/remote-resolve.ts +1 -1
- package/src/cli/root-tui-entry.ts +48 -0
- package/src/cli/sim-cli.ts +22 -0
- package/src/cli/tasks-card-show.ts +162 -0
- package/src/cli/tasks-cli.ts +1065 -338
- package/src/cli/tasks-read-cli.ts +197 -0
- package/src/cli/usage-cli.ts +13 -11
- package/src/clipboard/history.ts +179 -13
- package/src/config.ts +8 -1
- 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/chat/acp-chat.ts +8 -0
- package/src/dashboard/context/keys.ts +8 -31
- package/src/dashboard/index.ts +280 -59
- 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/render/theme-resolver.ts +33 -4
- 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/schedule-registry.ts +16 -2
- package/src/domains/standalone-log-sink.ts +15 -2
- package/src/esc-abort-gate.ts +69 -0
- package/src/git-fs/idle-refresh.ts +76 -0
- package/src/git-fs/index.ts +18 -7
- package/src/git-fs/worktree.ts +137 -5
- package/src/graph-kinds/registry.ts +2 -2
- package/src/graph-runner/graph-cli.ts +18 -0
- package/src/graph-runner/runner.ts +173 -21
- package/src/graph-wizard/generate.ts +108 -4
- package/src/graph-wizard/steps.ts +15 -0
- package/src/grok/credential.ts +10 -3
- package/src/grounding/proactive-ground.ts +86 -0
- package/src/harness/control-inbox.ts +49 -1
- package/src/harness/harness-cli-command.ts +163 -35
- package/src/harness/harness-incidents.ts +85 -1
- package/src/harness/launch-utterance-ledger.ts +208 -0
- 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/impl-discipline/detector.ts +16 -4
- package/src/impl-discipline/system-prompt.ts +11 -0
- package/src/impl-discipline/types.ts +2 -2
- package/src/index.ts +822 -154
- package/src/input-core/context-key-runtime.ts +21 -0
- package/src/intake-plane/already-built-hint.ts +4 -2
- package/src/intake-plane/requirement-funnel.ts +29 -1
- package/src/light-cli.ts +32 -11
- package/src/llm/opengateway-models.ts +11 -0
- package/src/llm/provider-credentials.ts +14 -0
- package/src/llm/provider-detect.ts +8 -1
- package/src/llm/runtime-model-family.ts +2 -1
- package/src/llm-wellformed.ts +70 -0
- package/src/llm.ts +247 -59
- 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/model-tier/llm-tier-map.ts +15 -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/native-tool-catalog.ts +15 -1
- package/src/nexus/api/decisions-route.ts +38 -18
- package/src/nexus/api/graph-wizard-api.ts +20 -2
- package/src/nexus/api/loop-resources.ts +13 -1
- package/src/nexus/boot/register-mcp-clients.ts +263 -38
- package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
- package/src/oauth/codex.ts +7 -0
- package/src/onboarding/first-run.ts +37 -6
- package/src/onboarding/web-first.ts +43 -11
- package/src/ops/overview-collect.ts +30 -9
- package/src/ops/overview.ts +22 -9
- package/src/persona/loader.ts +11 -0
- package/src/persona/types.ts +8 -0
- package/src/pr-tool/census.ts +261 -27
- 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-manifest.ts +7 -0
- 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 +100 -4
- package/src/release-loop/landed-but-yellow.ts +129 -5
- package/src/release-loop/light-rc.ts +1 -0
- package/src/release-loop/rehearsal.ts +37 -21
- package/src/repl/index.ts +192 -17
- package/src/repl/ops-msg-bridge.ts +32 -0
- package/src/seat-loop/knowhow-lint.ts +1 -1
- package/src/self-dev/ask-launch-flow.ts +44 -5
- package/src/self-dev/cli-help-text.ts +17 -0
- package/src/self-dev/decompose-proposal.ts +172 -20
- package/src/self-dev/decompose.ts +61 -0
- package/src/self-dev/dev-cli.ts +48 -12
- package/src/self-dev/dev-pipeline.ts +8 -2
- package/src/self-dev/draft-residue.ts +37 -1
- package/src/self-dev/draft-sweep.ts +137 -11
- package/src/self-dev/draft-triage-rules.ts +138 -0
- package/src/self-dev/fleet-reduce.ts +3 -2
- package/src/self-dev/glm-credential-guard.ts +77 -0
- package/src/self-dev/graph-front-nodes.ts +112 -0
- package/src/self-dev/graph-journey-nodes.ts +2 -0
- package/src/self-dev/graph-journey-route.ts +12 -2
- package/src/self-dev/harness-run-cli.ts +3 -15
- package/src/self-dev/orchestrate-cli-text.ts +10 -0
- package/src/self-dev/orchestrate-cli.ts +68 -3
- package/src/self-dev/orchestrate.ts +116 -17
- package/src/self-dev/review-provider-fallback.ts +35 -1
- package/src/self-dev/run-supervisor.ts +55 -2
- package/src/self-dev/run-types.ts +1 -1
- package/src/self-dev/self-orchestrate-runtime.ts +1 -11
- package/src/self-dev/shard-aggregate.ts +42 -5
- package/src/self-dev/shard-run.ts +8 -1
- package/src/self-health/autoheal.ts +153 -0
- package/src/self-health/signatures.ts +6 -0
- package/src/self-implement/blocked-draft-policy.ts +20 -0
- package/src/self-implement/classify-shadow.ts +3 -7
- package/src/self-implement/device-first.ts +116 -0
- package/src/self-implement/doctor-visit.ts +257 -2
- package/src/self-implement/evidence-command-budget.ts +80 -0
- package/src/self-implement/gate-baseline.ts +56 -17
- package/src/self-implement/gate-cli.ts +1 -0
- package/src/self-implement/gate-remote.ts +31 -20
- package/src/self-implement/goal-author-cli.ts +1 -0
- package/src/self-implement/goal-author-decompose.ts +534 -45
- package/src/self-implement/goal-author.ts +282 -7
- package/src/self-implement/goal-elaborate.ts +449 -0
- package/src/self-implement/goal-refine.ts +273 -0
- package/src/self-implement/graph-overlay-yaml.ts +14 -3
- 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 +370 -62
- 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-budget-judgment.ts +5 -8
- package/src/self-implement/rework-policy.ts +30 -0
- package/src/self-implement/run-ledger.ts +108 -0
- package/src/self-implement/run-stop.ts +10 -1
- package/src/self-implement/run-ttl.ts +38 -24
- package/src/self-implement/running-runs.ts +29 -1
- package/src/self-implement/scope-adjacency.ts +115 -0
- package/src/self-implement/seams.ts +187 -28
- package/src/self-implement/stop-autoheal.ts +87 -1
- package/src/self-implement/wiring-check.ts +358 -0
- package/src/session-runtime/index.ts +1 -1
- package/src/setup/llm-env-detect.ts +5 -0
- package/src/shell-env-bootstrap.ts +11 -4
- package/src/skills/runner.ts +4 -2
- package/src/skills/tools/agent.ts +408 -40
- package/src/skills/tools/msg-ask.ts +100 -0
- package/src/skills/tools/ops-ledger.ts +2 -1
- 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/hold-hygiene.ts +24 -6
- package/src/steward/rejudge-tick.ts +10 -2
- package/src/steward/ta-repair-event-collect.ts +17 -6
- package/src/steward/triage-budget.ts +194 -0
- package/src/steward/triage.ts +20 -3
- package/src/task-agent/actions.ts +72 -2
- package/src/task-agent/green-sweep.ts +4 -0
- package/src/task-agent/land-queue.ts +21 -8
- package/src/task-agent/live-moves.ts +182 -10
- package/src/task-agent/mission.ts +30 -0
- package/src/task-agent/parent-host.ts +123 -3
- 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 +48 -4
- package/src/task-agent/task-card-prefix.ts +2 -0
- package/src/task-agent/task-hand.ts +525 -57
- package/src/task-agent/task-parent-role-llm.ts +36 -0
- package/src/task-agent/tier-split.ts +196 -0
- package/src/task-agent/work-order-build.ts +2 -0
- package/src/task-agent/work-order.ts +3 -2
- package/src/task-orchestrator/generator-prompt.ts +60 -11
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +42 -0
- package/src/task-orchestrator/surfaces/pod-child-providers.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +130 -11
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
- package/src/task-orchestrator/surfaces/pod-image-source.ts +89 -1
- package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
- package/src/task-orchestrator/surfaces/pod-lease.ts +17 -8
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +19 -2
- package/src/task-orchestrator/surfaces/pod-pool.ts +76 -4
- package/src/task-orchestrator/surfaces/pod-provenance.ts +82 -0
- 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-source-receive.ts +18 -0
- package/src/task-orchestrator/surfaces/pod-warm-provenance.ts +81 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +6 -2
- package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +7 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +521 -40
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +759 -50
- package/src/task-orchestrator/surfaces/self-implement.ts +65 -2
- package/src/tool-runtime/index.ts +15 -2
- package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
- package/src/tool-runtime/ops-ledger-runtimes.ts +10 -2
- package/src/tty-foreground.ts +155 -0
- package/src/tui/README.md +2 -0
- package/src/tui/chat/background-job-status.ts +54 -0
- package/src/tui/chat/goal-interim.ts +173 -0
- package/src/tui/chat/log-view.ts +267 -0
- package/src/tui/chat/self-health-status.ts +232 -0
- package/src/tui/entry.ts +695 -0
- package/src/tui/input/composer.ts +151 -0
- package/src/tui/seat-mail-boot.ts +59 -0
- package/src/tui/slash/compact-command.ts +7 -0
- package/src/tui/slash/compact.ts +94 -0
- package/src/tui/slash/new-session.ts +35 -0
- package/src/tui/slash/resume.ts +75 -0
- package/src/tui-client/local-chat-turn.ts +282 -0
- package/src/tui-client/local-harness-command.ts +63 -0
- package/src/tui-client/local-provider-command.ts +184 -0
- 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/user-config.ts +4 -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 +379 -0
- package/src/ux-sim/fake-bin.ts +87 -7
- 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 +367 -0
- package/src/ux-sim/fault-pod-codex-503.ts +211 -0
- package/src/ux-sim/fault-scope-escape-lift.ts +216 -0
- 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/1162.c69abda138c7ce43.js +0 -79
- package/apps/pwa/out/_next/static/chunks/1449-1fede62af84c3e43.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1598-13fc845935e816df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1639.62c5e16fa20d242f.js +0 -94
- package/apps/pwa/out/_next/static/chunks/1661-adb8b2babc9aaf8c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2147.107c0fc6146fb15a.js +0 -23
- package/apps/pwa/out/_next/static/chunks/2202-ef1c9b000c3074fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2247.1e326638ee43e672.js +0 -115
- package/apps/pwa/out/_next/static/chunks/2268.56e1e3d58180abae.js +0 -8
- package/apps/pwa/out/_next/static/chunks/2469-606819c812414021.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2593.e53c1620c0bb3599.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2690.e96671114222676a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2898-79ee1a5cc0cd9d13.js +0 -1
- package/apps/pwa/out/_next/static/chunks/298.26099a9f65e5c8ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2987-30cf9c2eb7b8bdd5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2992.51fc2a7295bd8139.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3001-5a52788c813b6113.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3014-291245fba9df7b5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3068.ee78201f0251a18d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3083.cd399a17e9365f78.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3117-e1c474683fd1f824.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3251-2c17bd5a91f8de2e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/326.3fb32322bb2ddf6d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3421-7ff7fbaa156985a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/381.f55dc63ea87735e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4129-ab0a6189f1778633.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4361.93d14ba594b3a035.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4364.7a7eb19cceb67d2f.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4406.d71f506f7c3ee9d3.js +0 -149
- package/apps/pwa/out/_next/static/chunks/4461.2ad1514180ae7e29.js +0 -148
- package/apps/pwa/out/_next/static/chunks/4479.bd309cbe0e3842ee.js +0 -64
- package/apps/pwa/out/_next/static/chunks/4522-05966f777d66d13b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4543-9a3e9812e845de65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4557.f8f1d84a0d90d590.js +0 -74
- package/apps/pwa/out/_next/static/chunks/4589-79b11542179ef58c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4633-9f8f9f88ffbb8f5c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4831.23af4d10c0697b5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4983.5951b85724f61f2a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5028-f0722e6114c313e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5249.96a848656b582a93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5311.16e0ffbfa5468b80.js +0 -62
- package/apps/pwa/out/_next/static/chunks/5489.ec2dd1b5272a19dc.js +0 -24
- package/apps/pwa/out/_next/static/chunks/559.df87695df637920c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5618-5c88f2f70178c4ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5764.05487bf0b73ddb6b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5930.e678826c3f831aab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5dfb57f7.f2e3305326202474.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6053-d893974de92e6198.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6200-cefd6f33f59d765e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6314-edeba650ae686ac9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6316-bc9a9b74d7842d79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6476-13b9779b73528008.js +0 -1
- package/apps/pwa/out/_next/static/chunks/666-04db3ac4c8e3c66f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/670.682e55106ef915a6.js +0 -77
- package/apps/pwa/out/_next/static/chunks/6816.b7ba9d0a1a4a46a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/690-fbbcc777f189af37.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6989.0d3d4020e5cb3df6.js +0 -90
- package/apps/pwa/out/_next/static/chunks/7193-cf355cca5ba6c5d5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7217-d17393fe7af78fa6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7232.24edbd938a69c8d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7295cd1e.b4b557908888eeee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7323.adb02de21991883c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7386.5d8e7e42e818dfb6.js +0 -287
- package/apps/pwa/out/_next/static/chunks/7448.478958ffbbba0ac0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7537.ba2208c5c656b8a3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7596-962ae6db6cfc9c83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7671.cff51beac212a2ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7883.3916734ee16d3e58.js +0 -27
- package/apps/pwa/out/_next/static/chunks/7952.b192c31b6a0e00cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/801.5b24e81eded22d1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8176.8c9a8613f5a01ac1.js +0 -36
- package/apps/pwa/out/_next/static/chunks/819e78a6.fa3dd7f7da19bf61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8220-78978450c3183d8d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8221-eb60b5bc692a3361.js +0 -1
- package/apps/pwa/out/_next/static/chunks/826.e9a26064f474949e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8459-a351487a4480f584.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8482-75823d513a4ce151.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8488.8da515248cda3f3a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8584.388a1779d9b203af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8637.a55e098e61ffefb8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9207-8e6a12db30373f32.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9263-00ae932c62696a86.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9318.caafc3a130e8769c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/932.da3fb55951882562.js +0 -93
- package/apps/pwa/out/_next/static/chunks/9433.002f8426ac75b6b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9464.dd631a5a14b1d660.js +0 -24
- package/apps/pwa/out/_next/static/chunks/9739.8d5f36ac67a3b236.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9743.beeabb9d5f86abe4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9843-a23d3f32dc43f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/994-28211077c7c587d5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-3b4c947f174e33d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-369d5ce99483f859.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-63c0ed0eb26e5fce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-62802c6003bc85cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ecb41560d4e77be9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-7b65ad8130c93e95.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8755477c15a9060c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-5725447dd972c471.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b979de0591a69375.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-6d0796bf4633751a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-59c31dc0394e67b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-12dfc95f6cc5c718.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-25788244e66aa4dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-a2555dc705466322.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-3b4c947f174e33d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-578729adbeaa40cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a1d20fffbec35205.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-4a558f94516b8004.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-9e3834705b86145e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d7bff0f0905a662c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-cb1c5fe746ea4014.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-9ee320507356582a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66fd183b74835886.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-3272a064a01a9927.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-f281b7a7f6ef2529.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-d45a65f8b7124fcd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-e9c1fe684dd19a66.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-b8322932fc6e34de.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-82c66d9af2290575.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-63c6752009c97b05.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-bb33d42ebc358aec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-7e4c9379197d7214.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-38bf1e9a7001732b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-2e5b752012389d56.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-398c0faa173203f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-002f53a965b6445c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-7f75997f61a26269.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-3b4c947f174e33d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-05631753294f23fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-edd700fd2cc3d7f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-105f83ecb4594365.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-5823e87d2017f19c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-df3445b207ceceab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-b51ca09566c03de7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-8aacd5ded5dbac60.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bae3365a0b3c6a8e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ed52b48ff1aa7fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b6f8cad35fe00946.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6d25ceda500d2457.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-b6401a5f2c962fe8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ebf6cf5e.0d2f887b040e80fb.js +0 -122
- package/apps/pwa/out/_next/static/chunks/f09ec7d7-d29abe23edcbb193.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-9322cb8a56ac081c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-2fbab294e49a1561.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-f36729f56621a8f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-2a62e450b47c6114.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-5e17f7b445f34d43.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-b4263e2190ea7adf.js +0 -1
- /package/apps/pwa/out/_next/static/{L04y73dlwKeTW-GetaTF3 → uC-N0emedeNOFuaBQFv-I}/_ssgManifest.js +0 -0
|
@@ -30,6 +30,7 @@ import { isAbandonedClassification, type AbandonedClassificationResult } from '.
|
|
|
30
30
|
import { createExecution, type Task, type TaskExecution } from '../types.js';
|
|
31
31
|
import type { DispatchContext, DispatchResult } from '../surface-registry.js';
|
|
32
32
|
import { nestedPodResult } from './pod-failure-reason.js';
|
|
33
|
+
import { SCOPE_EXPANSION_CAP, SCOPE_STOP_REASONS, isProtectedScopePath, type ScopeStopReason } from '../../self-implement/scope-adjacency.js';
|
|
33
34
|
|
|
34
35
|
/** Result of one self-implement subprocess. */
|
|
35
36
|
export interface SelfImplementJobDone {
|
|
@@ -107,11 +108,52 @@ export interface PodChildEvidence {
|
|
|
107
108
|
classification?: string;
|
|
108
109
|
scopeEscape?: true;
|
|
109
110
|
outOfScopeEdits?: unknown;
|
|
111
|
+
/** SCOPE-ESCAPE-AS-REFINE — why held out-of-scope edits stop the run (deletion · protected path · cap). Present only with scopeEscape. */
|
|
112
|
+
scopeStopReasons?: ScopeStopReason[];
|
|
113
|
+
/** SCOPE-ESCAPE-AS-REFINE — «구현이 알려준 새 범위», not a failure: held names with no stop reason, or (no held names)
|
|
114
|
+
* the accepted `scopeExpansion` paths of a child that failed later (e.g. gate). Evidence is built only for failed results. */
|
|
115
|
+
newScope?: string[];
|
|
110
116
|
abandonedClassification?: Record<string, unknown>;
|
|
111
117
|
supervisorVerdict?: unknown;
|
|
112
118
|
goalCauseObserved?: true;
|
|
113
119
|
terminationReason?: unknown;
|
|
114
120
|
accountAvailability?: Record<string, unknown>;
|
|
121
|
+
prFailure?: {
|
|
122
|
+
stage: 'pr-open-failed';
|
|
123
|
+
source?: 'child-ledger' | 'terminal-result';
|
|
124
|
+
errorTail: string;
|
|
125
|
+
blockingPrNumber?: number;
|
|
126
|
+
candidateCardId?: string;
|
|
127
|
+
blockingCardId?: string;
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const SCOPE_STOP_REASON_ORDER: readonly ScopeStopReason[] = SCOPE_STOP_REASONS;
|
|
132
|
+
|
|
133
|
+
/** Stop reasons for held out-of-scope edits: the child's own `scopeStopReasons` (orchestrator decideScopeExpansion) plus
|
|
134
|
+
* what the names alone prove (protected path · count over SCOPE_EXPANSION_CAP · incomplete name list). A deletion is
|
|
135
|
+
* only known from the child. Deterministic, fixed order. */
|
|
136
|
+
export function scopeStopReasonsFromResult(o: Record<string, unknown>, outOfScopeEdits: unknown = o.outOfScopeEdits): ScopeStopReason[] {
|
|
137
|
+
const reasons = new Set<ScopeStopReason>();
|
|
138
|
+
if (Array.isArray(o.scopeStopReasons)) {
|
|
139
|
+
for (const reason of o.scopeStopReasons) if ((SCOPE_STOP_REASON_ORDER as readonly unknown[]).includes(reason)) reasons.add(reason as ScopeStopReason);
|
|
140
|
+
}
|
|
141
|
+
const names = Array.isArray(outOfScopeEdits) ? outOfScopeEdits.filter((name): name is string => typeof name === 'string') : [];
|
|
142
|
+
if (names.some(isProtectedScopePath)) reasons.add('protected-path');
|
|
143
|
+
const count = typeof o.outsideCount === 'number' ? Math.max(o.outsideCount, names.length) : names.length;
|
|
144
|
+
if (count > SCOPE_EXPANSION_CAP) reasons.add('over-cap');
|
|
145
|
+
if (o.nameCapReached === true) reasons.add('name-cap');
|
|
146
|
+
return SCOPE_STOP_REASON_ORDER.filter((reason) => reasons.has(reason));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** «구현이 알려준 새 범위» — held names with no stop reason, else the accepted expansion's paths. */
|
|
150
|
+
function newScopeFromResult(outOfScopeEdits: unknown, scopeExpansion: unknown): string[] | undefined {
|
|
151
|
+
const names = Array.isArray(outOfScopeEdits) ? outOfScopeEdits.filter((name): name is string => typeof name === 'string' && name.length > 0) : [];
|
|
152
|
+
if (names.length) return names.slice(0, 40);
|
|
153
|
+
const files = scopeExpansion && typeof scopeExpansion === 'object' ? (scopeExpansion as { files?: unknown }).files : undefined;
|
|
154
|
+
const paths = Array.isArray(files) ? files.map((file) => (file && typeof file === 'object' ? (file as { path?: unknown }).path : undefined))
|
|
155
|
+
.filter((path): path is string => typeof path === 'string' && path.length > 0) : [];
|
|
156
|
+
return paths.length ? paths.slice(0, 40).map((path) => redactSecretText(path)) : undefined;
|
|
115
157
|
}
|
|
116
158
|
|
|
117
159
|
/** Preserve only named terminal facts; the full child detail may contain logs or credentials. */
|
|
@@ -138,8 +180,13 @@ export function podChildEvidenceFromResult(o: Record<string, unknown>): PodChild
|
|
|
138
180
|
const failureExitCode = o.ok === false && typeof o.exitCode === 'number'
|
|
139
181
|
&& Number.isInteger(o.exitCode) && o.exitCode >= 0 && o.exitCode <= 255 ? o.exitCode : undefined;
|
|
140
182
|
const outOfScopeEdits = scrubValue(o.outOfScopeEdits);
|
|
141
|
-
const
|
|
183
|
+
const held = (Array.isArray(outOfScopeEdits) && outOfScopeEdits.length > 0)
|
|
142
184
|
|| (typeof o.detail === 'string' && /^Out-of-scope edits held in the worktree(?:[.;]|$)/i.test(o.detail.trim()));
|
|
185
|
+
// SCOPE-ESCAPE-AS-REFINE (대표 10-22 «범위 밖 허용도 로직으로») — held edits stop the run only for a deletion, a protected
|
|
186
|
+
// path, or a cap; otherwise they are the new scope the implementation found and the exit is classified as if unheld.
|
|
187
|
+
const scopeStopReasons = held ? scopeStopReasonsFromResult(o, outOfScopeEdits) : [];
|
|
188
|
+
const scopeEscape = held && scopeStopReasons.length > 0;
|
|
189
|
+
const newScope = scopeEscape ? undefined : newScopeFromResult(outOfScopeEdits, o.scopeExpansion);
|
|
143
190
|
const classification = scopeEscape ? 'scope-escape'
|
|
144
191
|
: typeof abandoned?.classification === 'string' ? redactSecretText(abandoned.classification)
|
|
145
192
|
: typeof o.failureClassification === 'string' ? redactSecretText(o.failureClassification) : undefined;
|
|
@@ -149,14 +196,30 @@ export function podChildEvidenceFromResult(o: Record<string, unknown>): PodChild
|
|
|
149
196
|
...(failedText(o.stderr) ? { stderr: failedText(o.stderr) } : {}),
|
|
150
197
|
...(failureExitCode !== undefined ? { exitCode: failureExitCode } : {}),
|
|
151
198
|
...(classification ? { classification } : {}),
|
|
152
|
-
...(scopeEscape ? { scopeEscape: true } : {}),
|
|
199
|
+
...(scopeEscape ? { scopeEscape: true, scopeStopReasons } : {}),
|
|
153
200
|
...(outOfScopeEdits !== undefined ? { outOfScopeEdits } : {}),
|
|
201
|
+
...(newScope ? { newScope } : {}),
|
|
154
202
|
...(abandoned ? { abandonedClassification: abandoned } : {}),
|
|
155
203
|
...(o.supervisorVerdict !== undefined ? { supervisorVerdict: scrubValue(o.supervisorVerdict) } : {}),
|
|
156
204
|
...(o.goalCauseObserved === true ? { goalCauseObserved: true } : {}),
|
|
157
205
|
...(o.terminationReason !== undefined ? { terminationReason: scrubValue(o.terminationReason) } : {}),
|
|
158
206
|
...(accountAvailability ? { accountAvailability } : {}),
|
|
159
207
|
};
|
|
208
|
+
if (o.ok === false && typeof o.error === 'string'
|
|
209
|
+
&& /draft PR 생성 실패|PR (?:gh|guard) 실패|same-cell reuse:/u.test(o.error)) {
|
|
210
|
+
const safe = redactSecretText(o.error).replace(/\/home\/[^/\s]+\//gu, '~/');
|
|
211
|
+
const blocker = /(?:blockers=|blockingPr=)\s*#?(\d+)(?::([A-Za-z0-9_-]{1,128}))?/u.exec(safe);
|
|
212
|
+
const number = blocker ? Number(blocker[1]) : null;
|
|
213
|
+
const candidate = /candidateCardId=([A-Za-z0-9_-]{1,128})/u.exec(safe)?.[1];
|
|
214
|
+
const card = blocker?.[2];
|
|
215
|
+
evidence.prFailure = {
|
|
216
|
+
stage: 'pr-open-failed',
|
|
217
|
+
errorTail: (safe.split(/\r\n|\n|\r/u).filter(Boolean).at(-1) ?? safe).slice(-240),
|
|
218
|
+
...(number && Number.isSafeInteger(number) ? { blockingPrNumber: number } : {}),
|
|
219
|
+
...(candidate && candidate !== 'unknown' ? { candidateCardId: candidate } : {}),
|
|
220
|
+
...(card && card !== 'unknown' ? { blockingCardId: card } : {}),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
160
223
|
return Object.keys(evidence).length ? evidence : undefined;
|
|
161
224
|
}
|
|
162
225
|
|
|
@@ -73,11 +73,18 @@ import { bootstrapMcpProxyRuntimes } from './mcp-proxy-bootstrap.js';
|
|
|
73
73
|
import { SELF_COGNITION_RUNTIMES } from './self-cognition-runtimes.js';
|
|
74
74
|
import { ELANOUS_CONTROL_RUNTIMES } from './elanous-control-runtimes.js';
|
|
75
75
|
|
|
76
|
+
export interface RegisterAllDefaultToolRuntimesOpts {
|
|
77
|
+
/** CLASSIC-IDLE-MCP-LAZY — classic TUI 만 켠다. 외부 MCP 프록시를 «첫 도구
|
|
78
|
+
* 호출» 때 띄우고, 그 전엔 지난 부팅의 툴 인덱스로 목록만 알린다.
|
|
79
|
+
* 데몬·`mcp serve` 는 기본값(즉시 기동) 그대로다. */
|
|
80
|
+
mcpLazyBoot?: boolean;
|
|
81
|
+
}
|
|
82
|
+
|
|
76
83
|
/** Register every built-in runtime. Idempotent — safe to call more
|
|
77
84
|
* than once (registry dedupe). Call from the dashboard boot path;
|
|
78
85
|
* skills pick up registrations via side-effect when this module
|
|
79
86
|
* gets imported. */
|
|
80
|
-
export function registerAllDefaultToolRuntimes(): void {
|
|
87
|
+
export function registerAllDefaultToolRuntimes(opts: RegisterAllDefaultToolRuntimesOpts = {}): void {
|
|
81
88
|
for (const rt of PTY_RUNTIMES) registerToolRuntime(rt);
|
|
82
89
|
registerToolRuntime(terminalInjectRuntime);
|
|
83
90
|
registerToolRuntime(bashRuntime);
|
|
@@ -170,7 +177,13 @@ export function registerAllDefaultToolRuntimes(): void {
|
|
|
170
177
|
// External MCP proxies already declare surfaces `['mcp','tui']`, but the
|
|
171
178
|
// TUI process never registered them. Fire-and-forget: handshake must not
|
|
172
179
|
// block TUI startup; failures stay queryable via diagnostics.
|
|
173
|
-
|
|
180
|
+
// CLASSIC-IDLE-MCP-LAZY: classic TUI 는 지연 기동 — 자식 둘(약 267MB)을
|
|
181
|
+
// 기동 때 상주시키지 않고, 첫 도구 호출 때 한 번 띄운다.
|
|
182
|
+
if (opts.mcpLazyBoot === true) {
|
|
183
|
+
bootstrapMcpProxyRuntimes({ lazy: true });
|
|
184
|
+
} else {
|
|
185
|
+
bootstrapMcpProxyRuntimes();
|
|
186
|
+
}
|
|
174
187
|
}
|
|
175
188
|
|
|
176
189
|
export { setTerminalInjectApprover } from './terminal-inject-runtime.js';
|
|
@@ -51,6 +51,10 @@ export interface BootstrapMcpProxyRuntimesOpts {
|
|
|
51
51
|
registerRuntime?: typeof registerToolRuntime;
|
|
52
52
|
logger?: McpBootLogger;
|
|
53
53
|
handshakeTimeoutMs?: number;
|
|
54
|
+
/** CLASSIC-IDLE-MCP-LAZY — classic TUI 만 켠다. MCP 자식을 «첫 도구 호출»
|
|
55
|
+
* 때 띄우고, 그 전엔 지난 부팅의 툴 인덱스로 목록만 알린다. */
|
|
56
|
+
lazy?: boolean;
|
|
57
|
+
toolIndexStore?: RegisterMcpClientsOpts['toolIndexStore'];
|
|
54
58
|
}
|
|
55
59
|
|
|
56
60
|
const IDLE: McpProxyBootstrapSnapshot = {
|
|
@@ -62,6 +66,8 @@ const IDLE: McpProxyBootstrapSnapshot = {
|
|
|
62
66
|
|
|
63
67
|
let testOpts: BootstrapMcpProxyRuntimesOpts | null = null;
|
|
64
68
|
let activeHandle: McpProxyBootstrapHandle | undefined;
|
|
69
|
+
let activeClients: McpClientsHandle | undefined;
|
|
70
|
+
let exitHookInstalled = false;
|
|
65
71
|
let lastSnapshot: McpProxyBootstrapSnapshot = IDLE;
|
|
66
72
|
let bootGeneration = 0;
|
|
67
73
|
|
|
@@ -75,6 +81,7 @@ export function setMcpProxyBootstrapOptsForTest(opts: BootstrapMcpProxyRuntimesO
|
|
|
75
81
|
export function _resetMcpProxyBootstrapForTest(): void {
|
|
76
82
|
bootGeneration += 1;
|
|
77
83
|
activeHandle = undefined;
|
|
84
|
+
activeClients = undefined;
|
|
78
85
|
lastSnapshot = IDLE;
|
|
79
86
|
}
|
|
80
87
|
|
|
@@ -86,6 +93,24 @@ export function getMcpProxyBootstrapHandle(): McpProxyBootstrapHandle | undefine
|
|
|
86
93
|
return activeHandle;
|
|
87
94
|
}
|
|
88
95
|
|
|
96
|
+
/** 프로세스가 «그냥» 죽는 경로(exit 훅)에서도 MCP 자식이 고아로 남지 않게 마지막
|
|
97
|
+
* SIGTERM 을 건다. `process.on('exit')` 은 await 할 수 없으므로 동기 kill 만 쓴다. */
|
|
98
|
+
function installMcpExitHook(): void {
|
|
99
|
+
if (exitHookInstalled) return;
|
|
100
|
+
exitHookInstalled = true;
|
|
101
|
+
process.once('exit', () => {
|
|
102
|
+
const clients = activeClients;
|
|
103
|
+
activeClients = undefined;
|
|
104
|
+
if (!clients) return;
|
|
105
|
+
try {
|
|
106
|
+
const terminated = clients.terminateChildrenSync?.() ?? 0;
|
|
107
|
+
if (terminated > 0) log('exit-terminate', { terminated });
|
|
108
|
+
} catch {
|
|
109
|
+
/* dying process — never throw from an exit hook */
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
89
114
|
function observabilityBootLogger(): McpBootLogger {
|
|
90
115
|
return {
|
|
91
116
|
info: (line) => {
|
|
@@ -183,11 +208,15 @@ export function bootstrapMcpProxyRuntimes(
|
|
|
183
208
|
...(resolved.handshakeTimeoutMs !== undefined
|
|
184
209
|
? { handshakeTimeoutMs: resolved.handshakeTimeoutMs }
|
|
185
210
|
: {}),
|
|
211
|
+
...(resolved.lazy === true ? { lazy: true } : {}),
|
|
212
|
+
...(resolved.toolIndexStore ? { toolIndexStore: resolved.toolIndexStore } : {}),
|
|
186
213
|
});
|
|
187
214
|
if (generation !== bootGeneration) {
|
|
188
215
|
try { await result.shutdown(); } catch { /* abandoned boot */ }
|
|
189
216
|
return current;
|
|
190
217
|
}
|
|
218
|
+
activeClients = result;
|
|
219
|
+
installMcpExitHook();
|
|
191
220
|
const snap = freezeSnapshot({
|
|
192
221
|
status: 'ready',
|
|
193
222
|
registered: result.registered,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// ── Ops-ledger tool runtimes (우편 msg · 판 release checklist) ──
|
|
2
2
|
//
|
|
3
|
-
// Registers the
|
|
3
|
+
// Registers the nine in-process ledger tools with the tool-runtime
|
|
4
4
|
// layer so every surface (skill-runner, TUI) can call them by name:
|
|
5
|
-
// MsgList / MsgPost / MsgAck and ChecklistList / ChecklistAdd /
|
|
5
|
+
// MsgList / MsgPost / MsgAsk / MsgAck and ChecklistList / ChecklistAdd /
|
|
6
6
|
// ChecklistSet / ChecklistEdit / ChecklistMove. Dispatchers live in
|
|
7
7
|
// src/skills/tools/ops-ledger.ts; this file is a thin adapter — the
|
|
8
8
|
// same pattern as team-tool-runtimes.ts. Every call goes through
|
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
observeLedgerCall,
|
|
24
24
|
} from '../skills/tools/ops-ledger.js';
|
|
25
25
|
import type { ToolRuntime } from './types.js';
|
|
26
|
+
import { buildMsgAskTool, dispatchMsgAsk, type MsgAskResult } from '../skills/tools/msg-ask.js';
|
|
26
27
|
|
|
27
28
|
export const msgListRuntime: ToolRuntime<Record<string, unknown>, MsgListResult> = {
|
|
28
29
|
id: 'msg_list',
|
|
@@ -36,6 +37,12 @@ export const msgPostRuntime: ToolRuntime<Record<string, unknown>, MsgPostResult>
|
|
|
36
37
|
async run(req) { return observeLedgerCall('MsgPost', req, () => dispatchMsgPost(req), (a, r) => ({ from: a.from, to: a.to, ...(r ? { id: r.message.id } : {}) })); },
|
|
37
38
|
};
|
|
38
39
|
|
|
40
|
+
export const msgAskRuntime: ToolRuntime<Record<string, unknown>, MsgAskResult> = {
|
|
41
|
+
id: 'msg_ask',
|
|
42
|
+
spec: buildMsgAskTool(),
|
|
43
|
+
async run(req, ctx) { return observeLedgerCall('MsgAsk', req, () => dispatchMsgAsk(req, { signal: ctx.signal }), (a, r) => ({ from: a.from, to: a.to, ...(r ? { id: r.question.id, replied: r.reply !== null } : {}) })); },
|
|
44
|
+
};
|
|
45
|
+
|
|
39
46
|
export const msgAckRuntime: ToolRuntime<Record<string, unknown>, MsgAckResult> = {
|
|
40
47
|
id: 'msg_ack',
|
|
41
48
|
spec: buildMsgAckTool(),
|
|
@@ -75,6 +82,7 @@ export const checklistMoveRuntime: ToolRuntime<Record<string, unknown>, Checklis
|
|
|
75
82
|
export const ALL_OPS_LEDGER_RUNTIMES: ToolRuntime<any, any>[] = [
|
|
76
83
|
msgListRuntime,
|
|
77
84
|
msgPostRuntime,
|
|
85
|
+
msgAskRuntime,
|
|
78
86
|
msgAckRuntime,
|
|
79
87
|
checklistListRuntime,
|
|
80
88
|
checklistAddRuntime,
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// TUI-SIGTTIN-SUSPEND (0.2.36 · 10-23 n8n) — the TUI must not be stopped because a child stole its terminal.
|
|
2
|
+
//
|
|
3
|
+
// Observed: the TUI's process group was no longer the foreground group of its own tty, its next stdin
|
|
4
|
+
// read raised SIGTTIN and zsh printed «suspended (tty input)» (state T). The trigger was an interactive
|
|
5
|
+
// login shell (`$SHELL -l -i -c printenv`, shell-env-bootstrap.ts) that opened /dev/tty for job control,
|
|
6
|
+
// moved the terminal to its own group and never gave it back. The root fix runs that capture with no
|
|
7
|
+
// controlling tty (`detached`). This module is the defence for any other child that does the same:
|
|
8
|
+
//
|
|
9
|
+
// ① every tick, compare tcgetpgrp(stdin) with our own group;
|
|
10
|
+
// ② if the foreground group is gone, or it is led by one of our own descendants (or its leader is
|
|
11
|
+
// dead), it was taken by a child of ours → take it back (SIGTTOU ignored for that one call);
|
|
12
|
+
// ③ if a live process that is NOT ours holds it (the user's shell after a real job-control action),
|
|
13
|
+
// do not fight it — log `tui.lifecycle background-tty` once.
|
|
14
|
+
//
|
|
15
|
+
// Shared by both TUIs: `initTui()` (src/tui.ts) starts it for the classic dashboard and `--tui next`.
|
|
16
|
+
|
|
17
|
+
import { spawnSync } from 'node:child_process';
|
|
18
|
+
import { debug } from './debug/log.js';
|
|
19
|
+
|
|
20
|
+
export interface ForegroundFacts {
|
|
21
|
+
/** Our process group id (getpgrp()). */
|
|
22
|
+
ownPgid: number;
|
|
23
|
+
/** tcgetpgrp(stdin) — -1 when it could not be read (stdin is not our controlling tty). */
|
|
24
|
+
ttyPgid: number;
|
|
25
|
+
/** Some process still exists in ttyPgid (kill(-ttyPgid, 0)). */
|
|
26
|
+
groupAlive: boolean;
|
|
27
|
+
/** The group leader (pid === ttyPgid) still exists. */
|
|
28
|
+
leaderAlive: boolean;
|
|
29
|
+
/** The group leader is one of our descendants. */
|
|
30
|
+
leaderIsDescendant: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type ForegroundVerdict =
|
|
34
|
+
| { action: 'ok' }
|
|
35
|
+
| { action: 'unknown' }
|
|
36
|
+
| { action: 'reclaim'; reason: 'fg-group-gone' | 'fg-leader-gone' | 'fg-held-by-our-child'; ttyPgid: number }
|
|
37
|
+
| { action: 'yield'; ttyPgid: number };
|
|
38
|
+
|
|
39
|
+
/** Pure decision — see the header for the rule. */
|
|
40
|
+
export function decideForeground(f: ForegroundFacts): ForegroundVerdict {
|
|
41
|
+
if (f.ttyPgid < 0 || f.ownPgid < 0) return { action: 'unknown' };
|
|
42
|
+
if (f.ttyPgid === f.ownPgid) return { action: 'ok' };
|
|
43
|
+
if (!f.groupAlive) return { action: 'reclaim', reason: 'fg-group-gone', ttyPgid: f.ttyPgid };
|
|
44
|
+
if (!f.leaderAlive) return { action: 'reclaim', reason: 'fg-leader-gone', ttyPgid: f.ttyPgid };
|
|
45
|
+
if (f.leaderIsDescendant) return { action: 'reclaim', reason: 'fg-held-by-our-child', ttyPgid: f.ttyPgid };
|
|
46
|
+
return { action: 'yield', ttyPgid: f.ttyPgid };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface ForegroundDeps {
|
|
50
|
+
tcgetpgrp(): number;
|
|
51
|
+
getpgrp(): number;
|
|
52
|
+
/** tcsetpgrp(stdin, pgid) with SIGTTOU ignored for the call. Returns true on success. */
|
|
53
|
+
reclaim(pgid: number): boolean;
|
|
54
|
+
alive(pid: number): boolean;
|
|
55
|
+
isDescendant(pid: number): boolean;
|
|
56
|
+
log(event: string, data: Record<string, unknown>): void;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function exists(pid: number): boolean {
|
|
60
|
+
try { process.kill(pid, 0); return true; } catch (e) { return (e as { code?: string }).code === 'EPERM'; }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Walks ppid from `pid` up to 1 and reports whether it passes through us. Only runs on an anomaly. */
|
|
64
|
+
function isOurDescendant(pid: number): boolean {
|
|
65
|
+
let cur = pid;
|
|
66
|
+
for (let i = 0; i < 64 && cur > 1; i++) {
|
|
67
|
+
const r = spawnSync('ps', ['-o', 'ppid=', '-p', String(cur)], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 1000 });
|
|
68
|
+
const ppid = Number.parseInt(String(r.stdout ?? '').trim(), 10);
|
|
69
|
+
if (!Number.isFinite(ppid) || ppid <= 0) return false;
|
|
70
|
+
if (ppid === process.pid) return true;
|
|
71
|
+
cur = ppid;
|
|
72
|
+
}
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
type Libc = { tcgetpgrp(fd: number): number; tcsetpgrp(fd: number, pgid: number): number; getpgrp(): number; signal(sig: number, handler: number | bigint): number | bigint };
|
|
77
|
+
|
|
78
|
+
let libcCache: Libc | null | undefined;
|
|
79
|
+
function libc(): Libc | null {
|
|
80
|
+
if (libcCache !== undefined) return libcCache;
|
|
81
|
+
libcCache = null;
|
|
82
|
+
const path = process.platform === 'darwin' ? '/usr/lib/libSystem.B.dylib' : process.platform === 'linux' ? 'libc.so.6' : null;
|
|
83
|
+
if (!path || typeof (globalThis as { Bun?: unknown }).Bun === 'undefined') return null;
|
|
84
|
+
try {
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
86
|
+
const { dlopen, FFIType } = require('bun:ffi') as typeof import('bun:ffi');
|
|
87
|
+
const lib = dlopen(path, {
|
|
88
|
+
tcgetpgrp: { args: [FFIType.i32], returns: FFIType.i32 },
|
|
89
|
+
tcsetpgrp: { args: [FFIType.i32, FFIType.i32], returns: FFIType.i32 },
|
|
90
|
+
getpgrp: { args: [], returns: FFIType.i32 },
|
|
91
|
+
// sig_t signal(int, sig_t) — the handler is a pointer; i64 carries it in the same register.
|
|
92
|
+
signal: { args: [FFIType.i32, FFIType.i64], returns: FFIType.i64 },
|
|
93
|
+
});
|
|
94
|
+
libcCache = lib.symbols as unknown as Libc;
|
|
95
|
+
} catch {
|
|
96
|
+
libcCache = null;
|
|
97
|
+
}
|
|
98
|
+
return libcCache;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const SIGTTOU = 22; // darwin and linux
|
|
102
|
+
const SIG_IGN = 1;
|
|
103
|
+
|
|
104
|
+
export function defaultForegroundDeps(): ForegroundDeps | null {
|
|
105
|
+
const c = libc();
|
|
106
|
+
if (!c) return null;
|
|
107
|
+
return {
|
|
108
|
+
tcgetpgrp: () => c.tcgetpgrp(0),
|
|
109
|
+
getpgrp: () => c.getpgrp(),
|
|
110
|
+
reclaim: (pgid) => {
|
|
111
|
+
// A background tcsetpgrp raises SIGTTOU unless it is ignored — ignore it for this one call only.
|
|
112
|
+
const prev = c.signal(SIGTTOU, SIG_IGN);
|
|
113
|
+
try { return c.tcsetpgrp(0, pgid) === 0; } finally { c.signal(SIGTTOU, prev); }
|
|
114
|
+
},
|
|
115
|
+
alive: exists,
|
|
116
|
+
isDescendant: isOurDescendant,
|
|
117
|
+
log: (event, data) => debug.log('tui.lifecycle', event, data),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** One check. Exported for tests; the guard calls it on a timer. `state.yieldedTo` keeps the yield log to once per holder. */
|
|
122
|
+
export function checkForeground(deps: ForegroundDeps, state: { yieldedTo: number | null } = { yieldedTo: null }): ForegroundVerdict {
|
|
123
|
+
const ownPgid = deps.getpgrp();
|
|
124
|
+
const ttyPgid = deps.tcgetpgrp();
|
|
125
|
+
if (ttyPgid < 0 || ttyPgid === ownPgid) {
|
|
126
|
+
state.yieldedTo = null;
|
|
127
|
+
return decideForeground({ ownPgid, ttyPgid, groupAlive: true, leaderAlive: true, leaderIsDescendant: false });
|
|
128
|
+
}
|
|
129
|
+
if (state.yieldedTo === ttyPgid) return { action: 'yield', ttyPgid };
|
|
130
|
+
const groupAlive = deps.alive(-ttyPgid);
|
|
131
|
+
const leaderAlive = groupAlive && deps.alive(ttyPgid);
|
|
132
|
+
const leaderIsDescendant = leaderAlive && deps.isDescendant(ttyPgid);
|
|
133
|
+
const verdict = decideForeground({ ownPgid, ttyPgid, groupAlive, leaderAlive, leaderIsDescendant });
|
|
134
|
+
if (verdict.action === 'reclaim') {
|
|
135
|
+
const ok = deps.reclaim(ownPgid);
|
|
136
|
+
deps.log(ok ? 'foreground-reclaimed' : 'foreground-reclaim-failed', { reason: verdict.reason, ttyPgid, ownPgid });
|
|
137
|
+
} else if (verdict.action === 'yield') {
|
|
138
|
+
state.yieldedTo = ttyPgid;
|
|
139
|
+
deps.log('background-tty', { ttyPgid, ownPgid, groupAlive, leaderAlive });
|
|
140
|
+
}
|
|
141
|
+
return verdict;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Starts the guard; returns stop(). No-op (returns a no-op) when libc/FFI is unavailable. */
|
|
145
|
+
export function startForegroundGuard(opts: { intervalMs?: number; deps?: ForegroundDeps | null } = {}): () => void {
|
|
146
|
+
if (process.env.ELANOUS_TTY_FOREGROUND_GUARD === '0') return () => {};
|
|
147
|
+
const deps = opts.deps === undefined ? defaultForegroundDeps() : opts.deps;
|
|
148
|
+
if (!deps) return () => {};
|
|
149
|
+
const state = { yieldedTo: null as number | null };
|
|
150
|
+
const tick = (): void => { try { checkForeground(deps, state); } catch { /* fail-soft */ } };
|
|
151
|
+
tick();
|
|
152
|
+
const timer = setInterval(tick, opts.intervalMs ?? 250);
|
|
153
|
+
(timer as { unref?: () => void }).unref?.();
|
|
154
|
+
return () => clearInterval(timer);
|
|
155
|
+
}
|
package/src/tui/README.md
CHANGED
|
@@ -33,4 +33,6 @@ src/tui/
|
|
|
33
33
|
|
|
34
34
|
## 현황 (M2 착수)
|
|
35
35
|
- ✅ `tui/chat/execution-badge.ts` — 실행모델 뱃지 리졸버 (dashboard/ 에서 이전, shim 유지)
|
|
36
|
+
- ✅ `tui/entry.ts` · `tui/chat/log-view.ts` · `tui/input/composer.ts` — `elanous --tui next` 로 여는 로컬 대화 화면. 공용 inline editor 로 입력·전송하고 공용 REPL 턴 경로를 JSONL stdin 자식으로 호출한다. `--tui classic` 과 기본 진입은 기존 dashboard 를 사용한다.
|
|
37
|
+
- ✅ `tui/size-contract.test.ts` — 이 디렉토리 TypeScript 파일의 4,000줄 상한을 검사한다.
|
|
36
38
|
- ⬜ render · input · rich/* — 후속 슬라이스
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/** Session-scoped, immutable projection of the REPL child's task state. */
|
|
2
|
+
export interface BackgroundJobSnapshot {
|
|
3
|
+
readonly sessionId: string;
|
|
4
|
+
readonly promised: boolean;
|
|
5
|
+
readonly running: number;
|
|
6
|
+
readonly pending: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function nonnegativeCount(value: unknown): value is number {
|
|
10
|
+
return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export class BackgroundJobStatus {
|
|
14
|
+
private sessionId: string | null;
|
|
15
|
+
private current: BackgroundJobSnapshot | null = null;
|
|
16
|
+
|
|
17
|
+
constructor(sessionId: string | null) { this.sessionId = sessionId; }
|
|
18
|
+
|
|
19
|
+
setSessionId(sessionId: string): void {
|
|
20
|
+
if (this.sessionId === sessionId) return;
|
|
21
|
+
this.sessionId = sessionId;
|
|
22
|
+
this.current = null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
accept(json: string): boolean {
|
|
26
|
+
let value: unknown;
|
|
27
|
+
try { value = JSON.parse(json); } catch { return false; }
|
|
28
|
+
if (!value || typeof value !== 'object') return false;
|
|
29
|
+
const frame = value as Record<string, unknown>;
|
|
30
|
+
if (frame.sessionId !== this.sessionId || typeof frame.promised !== 'boolean'
|
|
31
|
+
|| !nonnegativeCount(frame.running) || !nonnegativeCount(frame.pending)) return false;
|
|
32
|
+
this.current = Object.freeze({
|
|
33
|
+
sessionId: frame.sessionId,
|
|
34
|
+
promised: frame.promised,
|
|
35
|
+
running: frame.running,
|
|
36
|
+
pending: frame.pending,
|
|
37
|
+
}) as BackgroundJobSnapshot;
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
snapshot(): BackgroundJobSnapshot | null { return this.current; }
|
|
42
|
+
|
|
43
|
+
clear(): void { this.current = null; }
|
|
44
|
+
|
|
45
|
+
line(): string {
|
|
46
|
+
const state = this.current;
|
|
47
|
+
if (!state) return '';
|
|
48
|
+
const parts: string[] = [];
|
|
49
|
+
if (state.running > 0) parts.push(`⧗ 백그라운드 ${state.running}`);
|
|
50
|
+
if (state.pending > 0) parts.push(`✓ 백그라운드 끝 ${state.pending} · 결과 대기`);
|
|
51
|
+
if (parts.length === 0 && state.promised) parts.push('⚠ 약속한 백그라운드 없음');
|
|
52
|
+
return parts.join(' · ');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// ── 골 중간 답 접기 `goal-interim` (TUI-GOAL-INTERIM-QUIET 조각 2 · 2026-10-22 · 대표 «대화 연결이 이상하다») ──────
|
|
2
|
+
//
|
|
3
|
+
// 🚨 무엇을 푸는가: 골 하나를 도는 동안 작은 단계마다 턴이 끝나고(«…아직 못 했습니다»·«…하겠습니다»),
|
|
4
|
+
// goal-continue / child-complete 내부 턴이 다시 열린다. 그 사이 «못 했다» 문단이 대화에 단계 수만큼 쌓이고
|
|
5
|
+
// (n8n 세션 10-22 22:4x), next TUI 는 내부 턴 입력을 «나: [골 이어가기] …» 로 사람 발화처럼 그렸다.
|
|
6
|
+
// ⭐ 이 모듈은 «그리는 층»의 판정만 한다(순수):
|
|
7
|
+
// ① 내부 턴 입력 글(우리 포매터가 만든 접두)을 알아본다 → 사람 머리(«나:»·«❯») 대신 «↻ 자동 재개(<origin>)».
|
|
8
|
+
// ② 내부 이어가기 턴 «바로 앞» 답이 중간 보고(못 했다·약속)면 한 줄 «· 진행 — <첫 줄> (접힘)» 로 접는다.
|
|
9
|
+
// 마지막 답(골 끝·막힘)은 접지 않는다 → 미완 목록 문단은 한 번만 남는다.
|
|
10
|
+
// ⛔ 세션 기록·모델 입력은 그대로다(화면만 접는다). 판정이 애매하면 접지 않는다(정보를 숨기지 않는 쪽).
|
|
11
|
+
//
|
|
12
|
+
// 세 얼굴:
|
|
13
|
+
// 관측 = debug.log('tui.goal-interim', 'folded' | 'kept', { surface:'classic', origin, reason, lines }) ·
|
|
14
|
+
// next 는 턴 끝마다 접힘 수가 바뀌면 'folded' { surface:'next', folded, internal } (src/tui/entry.ts)
|
|
15
|
+
// 인지 = 다음 턴이 내부 이어가기인가 ∧ 앞 답이 중간 보고 꼴인가 ∧ (classic) 그 줄들이 아직 제자리인가
|
|
16
|
+
// 힐링 = 앞 문단을 한 줄로 접는다 · 줄이 움직였으면(버퍼 잘림·끼워 넣은 에코) 접지 않고 'kept' 사유를 남긴다
|
|
17
|
+
|
|
18
|
+
import { debug } from '../../debug/log.js';
|
|
19
|
+
import { classifyReplyTail, replyTailFromLines } from '../../chat/goal-continue-verdict.js';
|
|
20
|
+
import type { InternalTurnOrigin } from '../../chat/internal-turn-origin.js';
|
|
21
|
+
|
|
22
|
+
/** 내부 턴 입력 접두 — goal-continue.ts `formatGoalContinuePrompt` · agent-wake.ts `formatAgentWakePrompt` ·
|
|
23
|
+
* seat-autowake.ts `formatSeatAutowakePrompt` 와 같아야 한다(goal-interim.test.ts 가 세 포매터를 문다). */
|
|
24
|
+
const INTERNAL_TURN_TEXT_PREFIXES: ReadonlyArray<{ prefix: string; origin: InternalTurnOrigin }> = [
|
|
25
|
+
{ prefix: '[골 이어가기] ', origin: 'goal-continue' },
|
|
26
|
+
{ prefix: '[자동 재개] 위임 끝: ', origin: 'child-complete' },
|
|
27
|
+
{ prefix: '[자동 재개] 남은 일: ', origin: 'autowake' },
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
/** 이 글이 우리가 연 내부 턴의 입력이면 그 출처, 아니면 null(사람 글). */
|
|
31
|
+
export function internalTurnOriginOfText(text: string): InternalTurnOrigin | null {
|
|
32
|
+
const head = text.trimStart();
|
|
33
|
+
for (const { prefix, origin } of INTERNAL_TURN_TEXT_PREFIXES) if (head.startsWith(prefix)) return origin;
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** 앞 답을 접는 이어가기 출처 — 같은 골을 «이어서» 도는 턴만(goal-continue · child-complete).
|
|
38
|
+
* autowake(«남은 일: 우편·큐»)·예약·우편 깨움은 새 일이라 앞 답을 건드리지 않는다(입력 줄 머리만 바꾼다). */
|
|
39
|
+
const FOLDING_ORIGINS: ReadonlySet<InternalTurnOrigin> = new Set(['goal-continue', 'child-complete']);
|
|
40
|
+
function isFoldingOrigin(origin: InternalTurnOrigin | null | undefined): boolean {
|
|
41
|
+
return origin != null && FOLDING_ORIGINS.has(origin);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// eslint-disable-next-line no-control-regex
|
|
45
|
+
const ANSI = /\x1b\[[0-9;?]*[ -/]*[@-~]/g;
|
|
46
|
+
/** 답이 아닌 줄(턴 상태·도구·배너) — goal-continue 의 NON_REPLY 와 같은 뜻. */
|
|
47
|
+
const NON_REPLY_LINE = /^\s*(?:✔ 완료|✘ 실패|응답 완료|응답 중|라우팅:||⚙️|도구:|나:|↻ 자동 재개|⏰|⏸|⏹|❯|[─━]{3,})/u;
|
|
48
|
+
|
|
49
|
+
/** 미완 고백 — «못 했다 / 보고할 수 없다 / 아직 안 됐다» ⊕ 영어. */
|
|
50
|
+
const INCOMPLETE_RE = new RegExp([
|
|
51
|
+
'못\\s?했',
|
|
52
|
+
'하지\\s?못(?:했|함|하였)',
|
|
53
|
+
'(?:완료|끝내|마치|만들|보고하)지\\s?못',
|
|
54
|
+
'보고할\\s?수\\s?없',
|
|
55
|
+
'아직\\s?(?:안\\s?(?:됐|되었|끝)|없습니다|미완)',
|
|
56
|
+
"couldn['’]t",
|
|
57
|
+
'could not',
|
|
58
|
+
"was(?:n['’]t| not) able",
|
|
59
|
+
'unable to',
|
|
60
|
+
'not (?:yet )?(?:done|finished|completed?)\\b',
|
|
61
|
+
].join('|'), 'iu');
|
|
62
|
+
|
|
63
|
+
export type InterimVerdict =
|
|
64
|
+
| { interim: true; reason: 'incomplete' | 'pledge'; summary: string }
|
|
65
|
+
| { interim: false; reason: 'no-reply' | 'final' };
|
|
66
|
+
|
|
67
|
+
/** 답 줄(색 코드 포함 가능)이 «중간 보고»인가 — 미완 고백 또는 약속으로 끝난 답. */
|
|
68
|
+
export function classifyInterimReply(lines: readonly string[]): InterimVerdict {
|
|
69
|
+
const plain = lines.map((l) => l.replace(ANSI, '').trim()).filter((l) => l && !NON_REPLY_LINE.test(l));
|
|
70
|
+
if (plain.length === 0) return { interim: false, reason: 'no-reply' };
|
|
71
|
+
const summary = plain[0]!.replace(/^엘라누스:\s*/u, '');
|
|
72
|
+
// 끝 문장만 본다 — 중간의 «X 는 못 했지만 Y 는 끝냈다» 한 구절로 결과 답을 접지 않는다(goal-continue 와 같은 규칙).
|
|
73
|
+
const tail = replyTailFromLines(lines);
|
|
74
|
+
const last = tail ? (tail.split(/(?<=[.!?。?])\s+/u).filter(Boolean).at(-1) ?? tail) : '';
|
|
75
|
+
if (INCOMPLETE_RE.test(last)) return { interim: true, reason: 'incomplete', summary };
|
|
76
|
+
if (classifyReplyTail(tail).pledge) return { interim: true, reason: 'pledge', summary };
|
|
77
|
+
return { interim: false, reason: 'final' };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const SUMMARY_CHARS = 60;
|
|
81
|
+
/** 접힌 한 줄 — «· 진행 — <첫 줄> (접힘)». */
|
|
82
|
+
export function formatInterimFoldLine(summary: string): string {
|
|
83
|
+
const flat = summary.replace(/\s+/g, ' ').trim();
|
|
84
|
+
const cut = [...flat].length > SUMMARY_CHARS ? `${[...flat].slice(0, SUMMARY_CHARS).join('')}…` : flat;
|
|
85
|
+
return `· 진행 — ${cut} (접힘)`;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// ── next: 세션 메시지 위의 그리기 계획(순수) ─────────────────────────────────────────────
|
|
89
|
+
|
|
90
|
+
export type InterimDisplay =
|
|
91
|
+
| { kind: 'internal-input'; origin: InternalTurnOrigin }
|
|
92
|
+
| { kind: 'folded'; line: string };
|
|
93
|
+
|
|
94
|
+
/** 메시지 인덱스 → 그리기 바꿈. 내부 턴 입력은 출처 한 줄, 그 «바로 앞» 중간 보고 답은 한 줄로 접는다. */
|
|
95
|
+
export function planInterimDisplay(messages: ReadonlyArray<{ role: string; content?: unknown }>): Map<number, InterimDisplay> {
|
|
96
|
+
const plan = new Map<number, InterimDisplay>();
|
|
97
|
+
for (let i = 0; i < messages.length; i++) {
|
|
98
|
+
const m = messages[i]!;
|
|
99
|
+
if (m.role !== 'user' || typeof m.content !== 'string') continue;
|
|
100
|
+
const origin = internalTurnOriginOfText(m.content);
|
|
101
|
+
if (!origin) continue;
|
|
102
|
+
plan.set(i, { kind: 'internal-input', origin });
|
|
103
|
+
if (!isFoldingOrigin(origin)) continue;
|
|
104
|
+
// 앞 사람/내부 입력 뒤의 마지막 답 하나만 — 도구 블록은 그대로 둔다.
|
|
105
|
+
for (let j = i - 1; j >= 0; j--) {
|
|
106
|
+
const prev = messages[j]!;
|
|
107
|
+
if (prev.role === 'user') break;
|
|
108
|
+
if (prev.role !== 'assistant' || typeof prev.content !== 'string') continue;
|
|
109
|
+
const verdict = classifyInterimReply(prev.content.split('\n'));
|
|
110
|
+
if (verdict.interim) plan.set(j, { kind: 'folded', line: formatInterimFoldLine(verdict.summary) });
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return plan;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** 계획의 접힌 답 수 ⊕ 내부 입력 줄 수 — next 관측용. */
|
|
118
|
+
export function countInterimDisplay(plan: ReadonlyMap<number, InterimDisplay>): { folded: number; internal: number } {
|
|
119
|
+
let folded = 0;
|
|
120
|
+
let internal = 0;
|
|
121
|
+
for (const d of plan.values()) { if (d.kind === 'folded') folded += 1; else internal += 1; }
|
|
122
|
+
return { folded, internal };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// ── classic: 화면 줄(chatLines) 위의 접기 상태 ──────────────────────────────────────────
|
|
126
|
+
|
|
127
|
+
export interface ClassicInterimFoldDeps {
|
|
128
|
+
/** 접어도 되는 때인가 — 대시보드는 «끼워 넣은 사람 에코가 없다»를 넘긴다(줄 위치가 확실할 때만). */
|
|
129
|
+
canFold?: () => boolean;
|
|
130
|
+
log?: (category: string, event: string, data: Record<string, unknown>) => void;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export interface ClassicInterimFold {
|
|
134
|
+
/** 턴이 끝났다 — 이번 턴의 «마지막 답 블록» 시작(스트림 applier 의 assistantStart)부터 끝까지를 사본으로 잡는다.
|
|
135
|
+
* 도구·라우팅 줄은 그 앞이라 접히지 않는다(next 가 답 메시지만 접는 것과 같다). */
|
|
136
|
+
noteTurnEnded(chatLines: readonly string[], start: number): void;
|
|
137
|
+
/** 사람이 턴을 열었다 — 잡아 둔 답을 놓는다(사람 턴 앞 답은 접지 않는다). */
|
|
138
|
+
noteHumanTurn(): void;
|
|
139
|
+
/** 내부 이어가기 턴이 막 열린다 — 잡아 둔 앞 답이 중간 보고면 그 자리를 한 줄로 바꾼다. */
|
|
140
|
+
foldBeforeInternalTurn(chatLines: string[], origin: InternalTurnOrigin, style?: (line: string) => string): { folded: boolean; reason: string };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function createClassicInterimFold(deps: ClassicInterimFoldDeps = {}): ClassicInterimFold {
|
|
144
|
+
const log = deps.log ?? ((c, e, d) => debug.log(c, e, d));
|
|
145
|
+
let last: { start: number; lines: string[] } | null = null;
|
|
146
|
+
const kept = (origin: InternalTurnOrigin, reason: string, extra: Record<string, unknown> = {}) => {
|
|
147
|
+
log('tui.goal-interim', 'kept', { surface: 'classic', origin, reason, ...extra });
|
|
148
|
+
return { folded: false, reason };
|
|
149
|
+
};
|
|
150
|
+
return {
|
|
151
|
+
noteTurnEnded(chatLines, start) {
|
|
152
|
+
const from = Math.max(0, Math.min(start, chatLines.length));
|
|
153
|
+
last = { start: from, lines: chatLines.slice(from) };
|
|
154
|
+
},
|
|
155
|
+
noteHumanTurn() { last = null; },
|
|
156
|
+
foldBeforeInternalTurn(chatLines, origin, style = (l) => l) {
|
|
157
|
+
const snap = last;
|
|
158
|
+
last = null;
|
|
159
|
+
if (!isFoldingOrigin(origin)) return kept(origin, 'not-continuation');
|
|
160
|
+
if (!snap || snap.lines.length === 0) return kept(origin, 'no-previous-reply');
|
|
161
|
+
if (deps.canFold && !deps.canFold()) return kept(origin, 'lines-unstable');
|
|
162
|
+
// 그 줄들이 아직 제자리인가 — 버퍼 앞이 잘렸거나 무엇이 끼어들었으면 위치를 믿지 않는다.
|
|
163
|
+
const here = chatLines.slice(snap.start, snap.start + snap.lines.length);
|
|
164
|
+
if (here.length !== snap.lines.length || here.some((line, k) => line !== snap.lines[k])) return kept(origin, 'lines-moved');
|
|
165
|
+
const verdict = classifyInterimReply(snap.lines);
|
|
166
|
+
if (!verdict.interim) return kept(origin, verdict.reason);
|
|
167
|
+
const line = formatInterimFoldLine(verdict.summary);
|
|
168
|
+
chatLines.splice(snap.start, snap.lines.length, style(` ${line}`));
|
|
169
|
+
log('tui.goal-interim', 'folded', { surface: 'classic', origin, reason: verdict.reason, lines: snap.lines.length });
|
|
170
|
+
return { folded: true, reason: verdict.reason };
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|