elanous 0.2.34 → 0.2.35
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/{L04y73dlwKeTW-GetaTF3 → T1mBQqmkwKDLGtyisDCOd}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{5014f970-22bef0b5210f7d60.js → 0368f25d-ad84af92fefee68f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1165.bad13fc9151a7288.js +1 -0
- package/apps/pwa/out/_next/static/chunks/13.02a07436dec15f89.js +32 -0
- package/apps/pwa/out/_next/static/chunks/{2124.ed5bf480cea7f85b.js → 1530.0e612369b6fd7ea0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +41 -0
- package/apps/pwa/out/_next/static/chunks/1674.2a65fd5668e1cc5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +24 -0
- package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +74 -0
- package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1993-c0007b7ad0c0ef41.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1c735de4.f993a30bbd3c57c4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1dc5a567.9b092bfae3d7099b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8368.014caa8de2f5af34.js → 2018.a741297bce759490.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +148 -0
- package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2625.5d870aa999f33db1.js +34 -0
- package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +77 -0
- package/apps/pwa/out/_next/static/chunks/2833-0fe47af99ed13c29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +62 -0
- package/apps/pwa/out/_next/static/chunks/3103.0df8da390948bb84.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +90 -0
- package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1644.35dd25240ae24e4b.js → 3408.21d1570602f4b6c0.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3121.779fafe3e44612c5.js → 3589.5444a06bcf6e775c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/359-2250789a2d3499e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +36 -0
- package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9131-fce7256c4180c4a5.js → 3677-4215f826f6aa68e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +79 -0
- package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3f7c4ee5.3dde54f01a816613.js +122 -0
- package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4346.8601952e73bf5803.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6053-d893974de92e6198.js → 4441-875b97f5821ed58a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +286 -0
- package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{1895-60ed0e341c658bd4.js → 4705-194e64e47ca0fbdb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5576-82d3703636d5c4b9.js → 4718-17d2af636796a330.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7431.3051e9b8a4372d2d.js → 5101.e32282718f99ed6f.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5154.a118f3957ed14e36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +23 -0
- package/apps/pwa/out/_next/static/chunks/{2987-30cf9c2eb7b8bdd5.js → 5483-dd5d7697f6bdb106.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5637.281e5dec4ea6ecf1.js +94 -0
- package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +1 -0
- package/apps/pwa/out/_next/static/chunks/56d372f2.681ab4ec4c998fae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7386.5d8e7e42e818dfb6.js → 5852.db1f7449f4f74612.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +1 -0
- package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3110.0a7065f25c841818.js → 6236.e18cced2d5ba6afb.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +8 -0
- package/apps/pwa/out/_next/static/chunks/630.fe5a46428d63b013.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +27 -0
- package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +93 -0
- package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6866-79aa5b4e47cac6aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6b89c8bd.24df687a820500b3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +149 -0
- package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{7005.1623d2aea78eb85f.js → 7385.50a308a477bdfc21.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6086.913a69e6fa3e4a8b.js → 7644.17e37ba6f1d4226e.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8219.baa715d1deee80e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8256.e3ac8421a71f82f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7193-cf355cca5ba6c5d5.js → 8437-8d5492094b166cfa.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2554.3b5e200f5f5cfcd6.js → 8444.4c26b379ca2b9596.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +226 -0
- package/apps/pwa/out/_next/static/chunks/8557-e7898769499cd56f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +64 -0
- package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2547.dd27303624cb4da8.js → 8637.47f5b35afcae5e6b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8714.ff0b7ce3ec3e3ae2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9550.d5f76828f972058c.js → 9214.63a510d39178e997.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +115 -0
- package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8548.036c344973968847.js → 938.66ad1ef0e5abae1c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3414.172ad4ca2d9b08e8.js → 9512.5a76207a730e0491.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/967-2aa39b2d04b4c690.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6740.43de73fc427c9fe2.js → 9952.5daf5f94063a2b3e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-406b47745b53f269.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/{page-d7bff0f0905a662c.js → page-26e6c18a1a750cf6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-47c5d4db587266bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1f5a60f70cb4dd0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-bac7dee94e5eae4a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-df3445b207ceceab.js → page-dc0a532f5b9196ec.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9a8cb466.cc9fc9e6e46038aa.js → b2f6ba4d.fb56fdbbf798df33.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/b6705a4f-b9a9047de9eecfd0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4fa33ebd.21c1bd5b294496e6.js → cbe38a15.5a032598e39970c6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{abb4b98b.163e0f56e84ae35d.js → d06f9160.a3d9062f95de8ad7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9b48c871.204d5d13e7809bd0.js → da5176c6.6773b6c5994e1d99.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +1 -0
- 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/README.md +4 -0
- package/graphs/catalog/catalog.yaml +1 -1
- package/graphs/default-loop.yaml +57 -3
- package/graphs/document-loop.yaml +51 -3
- package/graphs/implement-loop.yaml +53 -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/research-loop.yaml +137 -3
- package/graphs/test-diet/test-diet.yaml +3 -0
- package/package.json +1 -1
- package/scripts/coord-role-pack.ts +19 -6
- package/scripts/hq/standby-snapshot.ts +17 -12
- package/scripts/release-loop/docs-land-node.ts +21 -5
- package/scripts/release-loop/gate-baseline-receipt.ts +155 -0
- package/scripts/release-loop/gate-node.ts +181 -22
- 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 +12 -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-release.ts +41 -4
- package/scripts/release-loop/unattended-release.ts +2 -0
- package/scripts/test-diet/lib.ts +6 -1
- package/scripts/test-diet/node.ts +194 -13
- package/scripts/ux-sim.ts +39 -0
- package/src/agent/self-ambient-cache.ts +8 -0
- package/src/agent-substrate/acp-reviewer.ts +39 -4
- package/src/agent-substrate/pr-reviewer.ts +17 -0
- package/src/agent-substrate/self-review-cli.ts +62 -13
- package/src/autopilot/pr-manager.ts +215 -36
- package/src/budget/run-usage-rollup.ts +1 -0
- package/src/chat/index.ts +0 -2
- package/src/chat/pickers/modal-runtime.ts +10 -27
- package/src/cli/agent-cli.ts +13 -2
- package/src/cli/doctor-cli.ts +4 -1
- package/src/cli/light-entry-route.ts +46 -6
- package/src/cli/pod-cli.ts +77 -3
- package/src/cli/pr-cli.ts +5 -2
- package/src/cli/pr-land-pod-shadow-job.ts +3 -0
- package/src/cli/release-checklist-read-cli.ts +79 -0
- package/src/cli/release-cli.ts +72 -102
- 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-cli.ts +540 -31
- package/src/cli/usage-cli.ts +13 -11
- package/src/clipboard/history.ts +179 -13
- package/src/config.ts +8 -1
- package/src/dashboard/chat/acp-chat.ts +8 -0
- package/src/dashboard/index.ts +78 -10
- package/src/dashboard/render/theme-resolver.ts +33 -4
- package/src/domains/schedule-registry.ts +16 -2
- package/src/git-fs/idle-refresh.ts +76 -0
- package/src/git-fs/index.ts +18 -7
- package/src/git-fs/worktree.ts +42 -4
- package/src/graph-kinds/registry.ts +2 -2
- package/src/graph-runner/runner.ts +153 -10
- package/src/grok/credential.ts +10 -3
- package/src/harness/harness-cli-command.ts +112 -28
- package/src/harness/harness-incidents.ts +33 -0
- package/src/harness/launch-utterance-ledger.ts +208 -0
- 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 +496 -143
- package/src/intake-plane/already-built-hint.ts +4 -2
- package/src/intake-plane/requirement-funnel.ts +29 -1
- package/src/light-cli.ts +27 -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.ts +213 -56
- package/src/model-tier/llm-tier-map.ts +15 -1
- package/src/native-tool-catalog.ts +15 -1
- package/src/nexus/api/loop-resources.ts +13 -1
- package/src/oauth/codex.ts +7 -0
- package/src/ops/overview-collect.ts +18 -3
- package/src/ops/overview.ts +20 -7
- package/src/pr-tool/census.ts +261 -27
- package/src/pty-shell/pty-manifest.ts +7 -0
- package/src/release-loop/checklist.ts +24 -0
- 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 +2 -2
- package/src/repl/index.ts +174 -17
- package/src/repl/ops-msg-bridge.ts +32 -0
- package/src/self-dev/ask-launch-flow.ts +44 -5
- package/src/self-dev/cli-help-text.ts +17 -0
- package/src/self-dev/dev-cli.ts +11 -9
- 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 +107 -0
- package/src/self-dev/fleet-reduce.ts +3 -2
- package/src/self-dev/graph-front-nodes.ts +112 -0
- package/src/self-dev/graph-journey-nodes.ts +1 -0
- package/src/self-dev/harness-run-cli.ts +3 -15
- package/src/self-dev/orchestrate-cli-text.ts +10 -0
- package/src/self-dev/review-provider-fallback.ts +35 -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-implement/blocked-draft-policy.ts +20 -0
- package/src/self-implement/classify-shadow.ts +3 -7
- package/src/self-implement/doctor-visit.ts +18 -1
- 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-decompose.ts +275 -47
- package/src/self-implement/goal-author.ts +250 -0
- package/src/self-implement/goal-elaborate.ts +295 -0
- package/src/self-implement/goal-refine.ts +270 -0
- package/src/self-implement/graph-overlay-yaml.ts +14 -3
- package/src/self-implement/orchestrator.ts +152 -45
- package/src/self-implement/rework-budget-judgment.ts +5 -8
- package/src/self-implement/run-stop.ts +10 -1
- package/src/self-implement/running-runs.ts +29 -1
- package/src/self-implement/scope-adjacency.ts +113 -0
- package/src/self-implement/seams.ts +127 -24
- package/src/self-implement/stop-autoheal.ts +87 -1
- package/src/session-runtime/index.ts +1 -1
- package/src/setup/llm-env-detect.ts +5 -0
- package/src/skills/tools/agent.ts +140 -14
- package/src/skills/tools/msg-ask.ts +100 -0
- package/src/skills/tools/ops-ledger.ts +2 -1
- package/src/steward/hold-hygiene.ts +24 -6
- package/src/steward/triage-budget.ts +194 -0
- package/src/steward/triage.ts +20 -3
- package/src/task-agent/actions.ts +69 -1
- package/src/task-agent/green-sweep.ts +4 -0
- package/src/task-agent/live-moves.ts +160 -4
- package/src/task-agent/parent-host.ts +123 -3
- package/src/task-agent/shadow.ts +7 -1
- package/src/task-agent/task-hand.ts +54 -41
- package/src/task-agent/tier-split.ts +127 -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 +33 -0
- package/src/task-orchestrator/surfaces/pod-child-providers.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-command-job.ts +45 -7
- package/src/task-orchestrator/surfaces/pod-image-source.ts +89 -1
- package/src/task-orchestrator/surfaces/pod-lease.ts +17 -8
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +8 -2
- package/src/task-orchestrator/surfaces/pod-provenance.ts +76 -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 +3 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +37 -5
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +368 -36
- package/src/task-orchestrator/surfaces/self-implement.ts +23 -0
- package/src/tool-runtime/ops-ledger-runtimes.ts +10 -2
- package/src/tui/README.md +2 -0
- package/src/tui/chat/background-job-status.ts +54 -0
- package/src/tui/chat/log-view.ts +80 -0
- package/src/tui/entry.ts +406 -0
- package/src/tui/input/composer.ts +144 -0
- package/src/tui/seat-mail-boot.ts +59 -0
- package/src/tui/slash/compact.ts +100 -0
- package/src/tui/slash/new-session.ts +35 -0
- package/src/tui-client/local-chat-turn.ts +239 -0
- package/src/tui-client/local-harness-command.ts +63 -0
- package/src/tui-client/local-provider-command.ts +184 -0
- package/src/user-config.ts +4 -2
- package/src/ux-sim/event-monkey.ts +378 -0
- package/src/ux-sim/fake-bin.ts +42 -7
- package/src/ux-sim/fault-nextmove-dispatch.ts +266 -0
- package/src/ux-sim/fault-pod-codex-503.ts +211 -0
- package/src/ux-sim/fault-scope-escape-lift.ts +189 -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/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/3103.84470c8445962f04.js +0 -34
- 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/3411-f87314c6c66ebc73.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3421-7ff7fbaa156985a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3498.cf2a15a8a9e5b926.js +0 -226
- package/apps/pwa/out/_next/static/chunks/381.f55dc63ea87735e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3819.163d4777f0a597f6.js +0 -32
- package/apps/pwa/out/_next/static/chunks/3837.722e053fb9f321ad.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/5446.edf141cff9ef647d.js +0 -1
- 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/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/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/7448.478958ffbbba0ac0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7537.ba2208c5c656b8a3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7562.948255cbc3e79d33.js +0 -41
- 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/8817.61bb7ffbba502ecb.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/field/page-4fb31eb476dcbad3.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/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/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/ffdc3a04.b9c23c1b28dd4a96.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 → T1mBQqmkwKDLGtyisDCOd}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import type { Key } from '../../tui.js';
|
|
2
|
+
import { applyInlineEditorKey } from '../../input-core/inline-editor-key.js';
|
|
3
|
+
import { createInlineEditorState, type InlineEditorState } from '../../input-core/inline-editor.js';
|
|
4
|
+
import { safeLogText } from '../chat/log-view.js';
|
|
5
|
+
|
|
6
|
+
const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
|
|
7
|
+
|
|
8
|
+
export type ComposerAction = 'edit' | 'submit' | 'cancel' | 'quit' | 'none';
|
|
9
|
+
|
|
10
|
+
export interface ComposerResult {
|
|
11
|
+
readonly state: InlineEditorState;
|
|
12
|
+
readonly action: ComposerAction;
|
|
13
|
+
readonly submitted?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function emptyComposer(): InlineEditorState {
|
|
17
|
+
return createInlineEditorState();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Keep the edit cursor and the newest text visible in one terminal row. */
|
|
21
|
+
export function composerViewport(state: InlineEditorState, columns: number): { line: string; cursorCol: number } {
|
|
22
|
+
const text = safeLogText(state.text).replace(/\n/g, '↵');
|
|
23
|
+
const before = safeLogText(state.text.slice(0, state.cursor)).replace(/\n/g, '↵');
|
|
24
|
+
const graphemes = Array.from(segmenter.segment(text), ({ segment }) => segment);
|
|
25
|
+
const cursorAt = Math.min(graphemes.length, Array.from(segmenter.segment(before)).length);
|
|
26
|
+
// Reserve one cell for the visible cursor after the prompt and text.
|
|
27
|
+
const available = Math.max(1, columns - 3);
|
|
28
|
+
let start = cursorAt;
|
|
29
|
+
let beforeWidth = 0;
|
|
30
|
+
while (start > 0) {
|
|
31
|
+
const cells = Bun.stringWidth(graphemes[start - 1]!);
|
|
32
|
+
if (beforeWidth + cells > available) break;
|
|
33
|
+
beforeWidth += cells;
|
|
34
|
+
start--;
|
|
35
|
+
}
|
|
36
|
+
let used = 0;
|
|
37
|
+
let end = start;
|
|
38
|
+
while (end < graphemes.length) {
|
|
39
|
+
const cells = Bun.stringWidth(graphemes[end]!);
|
|
40
|
+
if (used + cells > available) break;
|
|
41
|
+
used += cells;
|
|
42
|
+
end++;
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
line: `❯ ${graphemes.slice(start, end).join('')}`,
|
|
46
|
+
cursorCol: Math.min(columns, 3 + beforeWidth),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export type WheelDirection = 'up' | 'down';
|
|
51
|
+
|
|
52
|
+
/** Wheel notch carried by a parsed SGR mouse key; null for every other key. */
|
|
53
|
+
export function wheelDirection(key: Key): WheelDirection | null {
|
|
54
|
+
if (key.name !== 'mouse') return null;
|
|
55
|
+
if (key.mouse?.type === 'scroll-up') return 'up';
|
|
56
|
+
if (key.mouse?.type === 'scroll-down') return 'down';
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Longest pause allowed *inside* a held SGR tail. The tail itself may come any
|
|
62
|
+
* time after the lone ESC (the guard stays armed until the next key decides),
|
|
63
|
+
* but once characters are held, a pause this long releases them as typing.
|
|
64
|
+
*/
|
|
65
|
+
export const MOUSE_RESIDUE_WINDOW_MS = 500;
|
|
66
|
+
const SGR_MOUSE_TAIL = /^\[<(\d+);(\d+);(\d+)([Mm])$/;
|
|
67
|
+
const SGR_MOUSE_TAIL_PREFIX = /^\[(?:<(?:\d+(?:;(?:\d*|\d+;\d*))?)?)?$/;
|
|
68
|
+
|
|
69
|
+
export type MouseResidueStep =
|
|
70
|
+
| { readonly kind: 'pass' }
|
|
71
|
+
| { readonly kind: 'hold' }
|
|
72
|
+
| { readonly kind: 'release'; readonly keys: readonly Key[] }
|
|
73
|
+
| { readonly kind: 'mouse'; readonly wheel: WheelDirection | null };
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* When the ESC of an SGR mouse report reaches us apart from its tail (slow link,
|
|
77
|
+
* split write), the key parser's quiet window turns the ESC into Escape and the
|
|
78
|
+
* tail `[<65;10;5M` into typed characters. The guard is armed by that lone ESC;
|
|
79
|
+
* it holds the following characters while they still spell an SGR mouse tail,
|
|
80
|
+
* swallows a complete one (reporting its wheel notch), and releases anything
|
|
81
|
+
* else unchanged and in order.
|
|
82
|
+
*/
|
|
83
|
+
export class MouseResidueGuard {
|
|
84
|
+
private armedAt: number | null = null;
|
|
85
|
+
private held: Key[] = [];
|
|
86
|
+
private text = '';
|
|
87
|
+
|
|
88
|
+
arm(now: number): void {
|
|
89
|
+
this.armedAt = now;
|
|
90
|
+
this.held = [];
|
|
91
|
+
this.text = '';
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
accept(key: Key, now: number): MouseResidueStep {
|
|
95
|
+
if (this.armedAt === null) return { kind: 'pass' };
|
|
96
|
+
const ch = key.ctrl || key.alt || key.meta ? null : (key.raw ?? key.name);
|
|
97
|
+
const inTime = this.held.length === 0 || now - this.armedAt <= MOUSE_RESIDUE_WINDOW_MS;
|
|
98
|
+
const candidate = ch !== null && ch.length === 1 && inTime ? this.text + ch : null;
|
|
99
|
+
if (candidate !== null) {
|
|
100
|
+
const full = candidate.match(SGR_MOUSE_TAIL);
|
|
101
|
+
if (full) {
|
|
102
|
+
this.reset();
|
|
103
|
+
const button = Number(full[1]) & ~(4 | 8 | 16);
|
|
104
|
+
const pressed = full[4] === 'M';
|
|
105
|
+
return { kind: 'mouse', wheel: pressed && button === 64 ? 'up' : pressed && button === 65 ? 'down' : null };
|
|
106
|
+
}
|
|
107
|
+
if (SGR_MOUSE_TAIL_PREFIX.test(candidate)) {
|
|
108
|
+
this.held.push(key);
|
|
109
|
+
this.text = candidate;
|
|
110
|
+
this.armedAt = now; // the pause limit counts from the last held character
|
|
111
|
+
return { kind: 'hold' };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const held = this.held;
|
|
115
|
+
this.reset();
|
|
116
|
+
return held.length === 0 ? { kind: 'pass' } : { kind: 'release', keys: [...held, key] };
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private reset(): void {
|
|
120
|
+
this.armedAt = null;
|
|
121
|
+
this.held = [];
|
|
122
|
+
this.text = '';
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Reuse the shared editor contract; only TUI submit/cancel keys live here. */
|
|
127
|
+
export function applyComposerKey(state: InlineEditorState, key: Key): ComposerResult {
|
|
128
|
+
const name = key.name.toLowerCase();
|
|
129
|
+
// Mouse reports (wheel, click, drag) never edit the prompt.
|
|
130
|
+
if (name === 'mouse') return { state, action: 'none' };
|
|
131
|
+
if (name === 'escape' && !state.text) return { state, action: 'none' };
|
|
132
|
+
if ((key.ctrl && (name === 'd' || name === 'c')) || name === 'escape') {
|
|
133
|
+
if (state.text && !(key.ctrl && name === 'd')) return { state: emptyComposer(), action: 'cancel' };
|
|
134
|
+
return { state, action: 'quit' };
|
|
135
|
+
}
|
|
136
|
+
if ((name === 'enter' || name === 'return') && !key.shift) {
|
|
137
|
+
const submitted = state.text.trim();
|
|
138
|
+
return submitted
|
|
139
|
+
? { state: emptyComposer(), action: 'submit', submitted }
|
|
140
|
+
: { state, action: 'none' };
|
|
141
|
+
}
|
|
142
|
+
const edited = applyInlineEditorKey(state, key, { shiftEnter: 'newline', tab: null });
|
|
143
|
+
return edited ? { state: edited, action: 'edit' } : { state, action: 'none' };
|
|
144
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { statSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
5
|
+
import type { MsgStore } from '../msg/msg-store.js';
|
|
6
|
+
|
|
7
|
+
export interface SeatMailSnapshot {
|
|
8
|
+
seat: string;
|
|
9
|
+
unread: number | null;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const SEAT_IN_PATH = /(?:^|\/)seats\/([A-Za-z][A-Za-z0-9_-]{0,63})(?:\/|$)/;
|
|
13
|
+
const SEAT_ID = /^[A-Z][A-Z0-9_-]{0,63}$/;
|
|
14
|
+
|
|
15
|
+
/** A small, read-only snapshot for the next TUI's first frame. */
|
|
16
|
+
export function readSeatMailSnapshot(
|
|
17
|
+
cwd: string,
|
|
18
|
+
deps: {
|
|
19
|
+
home?: string;
|
|
20
|
+
env?: NodeJS.ProcessEnv;
|
|
21
|
+
msgPath?: string;
|
|
22
|
+
} = {},
|
|
23
|
+
): SeatMailSnapshot | null {
|
|
24
|
+
const env = deps.env ?? process.env;
|
|
25
|
+
const seat = (SEAT_IN_PATH.exec(cwd)?.[1] ?? env.COORD_ID ?? '').trim().toUpperCase();
|
|
26
|
+
if (!SEAT_ID.test(seat)) return null;
|
|
27
|
+
const seatDir = join(deps.home ?? homedir(), 'elanous-hq', 'seat-state', seat);
|
|
28
|
+
try {
|
|
29
|
+
if (!statSync(seatDir).isDirectory()) return null;
|
|
30
|
+
} catch (error) {
|
|
31
|
+
const code = (error as NodeJS.ErrnoException).code;
|
|
32
|
+
if (code === 'ENOENT' || code === 'ENOTDIR') return null;
|
|
33
|
+
return { seat, unread: null };
|
|
34
|
+
}
|
|
35
|
+
const msgPath = deps.msgPath ?? join(elanousStateRoot(), 'msg', 'messages.db');
|
|
36
|
+
try {
|
|
37
|
+
statSync(msgPath);
|
|
38
|
+
} catch (error) {
|
|
39
|
+
const code = (error as NodeJS.ErrnoException).code;
|
|
40
|
+
return { seat, unread: code === 'ENOENT' ? 0 : null };
|
|
41
|
+
}
|
|
42
|
+
// Loading MsgStore is only needed when there is an existing ledger to read.
|
|
43
|
+
// A damaged or inaccessible ledger must not prevent the TUI from booting.
|
|
44
|
+
try {
|
|
45
|
+
const msg = require('../msg/msg-store.js') as typeof import('../msg/msg-store.js');
|
|
46
|
+
const store: MsgStore = new msg.MsgStore(msgPath, { readOnly: true });
|
|
47
|
+
try {
|
|
48
|
+
return { seat, unread: store.unreadCount(seat) };
|
|
49
|
+
} finally {
|
|
50
|
+
store.close();
|
|
51
|
+
}
|
|
52
|
+
} catch {
|
|
53
|
+
return { seat, unread: null };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function seatMailLine(snapshot: SeatMailSnapshot | null): string | null {
|
|
58
|
+
return snapshot ? `${snapshot.seat} · 우편 ${snapshot.unread ?? '확인 불가'}` : null;
|
|
59
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// TUI-NEXT-COMPACT — next TUI context compaction (auto before a turn · `/compact` now).
|
|
2
|
+
// Wiring only: the threshold (shouldAutoCompact) and the pipeline (runCompactPipeline) run inside the
|
|
3
|
+
// shared session bridge `compactSessionHistory` (src/session/compact-session.ts), the same seam the
|
|
4
|
+
// continuation loop and `elanous session compact` use. Thresholds and anchor counts are the shared
|
|
5
|
+
// `chat.autoCompact` defaults. The REPL child reloads the session file every turn (session/chat.ts
|
|
6
|
+
// runTurn → loadSession), so rewriting the store between turns is what the next model call sees.
|
|
7
|
+
import { debug } from '../../debug/log.js';
|
|
8
|
+
import { compactSessionHistory } from '../../session/compact-session.js';
|
|
9
|
+
import type { CompactProvider } from '../../compact/provider.js';
|
|
10
|
+
import type { ChatAutoCompactConfig } from '../../user-config.js';
|
|
11
|
+
|
|
12
|
+
export const COMPACT_BUSY_STATUS = '응답 중에는 /compact 를 받지 않습니다 · 완료(또는 Esc 취소) 뒤 다시';
|
|
13
|
+
export const COMPACT_NO_SESSION_STATUS = '압축할 대화가 없습니다';
|
|
14
|
+
|
|
15
|
+
export function isCompactCommand(text: string): boolean {
|
|
16
|
+
return text.trim() === '/compact';
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Test/embedding seams. Production passes none of these. */
|
|
20
|
+
export interface NextTuiCompactDeps {
|
|
21
|
+
readonly provider?: CompactProvider;
|
|
22
|
+
readonly config?: ChatAutoCompactConfig;
|
|
23
|
+
readonly modelId?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface NextTuiCompactOutcome {
|
|
27
|
+
readonly fired: boolean;
|
|
28
|
+
readonly reason: string;
|
|
29
|
+
readonly before: number;
|
|
30
|
+
readonly after: number;
|
|
31
|
+
readonly ms: number;
|
|
32
|
+
/** Status-line text, or null when an auto check stays silent (under threshold). */
|
|
33
|
+
readonly status: string | null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function compactStatus(before: number, after: number): string {
|
|
37
|
+
return `압축 ${before}→${after} 메시지`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async function defaultConfig(): Promise<ChatAutoCompactConfig> {
|
|
41
|
+
const { getUserConfig } = await import('../../user-config.js');
|
|
42
|
+
return getUserConfig().chat.autoCompact;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Same resolution order as the continuation runner (dispatch/continuation-turn-runner.ts). */
|
|
46
|
+
async function defaultModelId(): Promise<string | undefined> {
|
|
47
|
+
try {
|
|
48
|
+
const { getUserConfig } = await import('../../user-config.js');
|
|
49
|
+
const cfg = getUserConfig();
|
|
50
|
+
if (cfg.llm?.model) return cfg.llm.model;
|
|
51
|
+
const { getProviderForConfig } = await import('../../llm.js');
|
|
52
|
+
return getProviderForConfig(cfg).defaultModel;
|
|
53
|
+
} catch {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Compact the next-TUI session once. `force:false` = the pre-turn auto check (fires only over the
|
|
60
|
+
* shared threshold); `force:true` = `/compact` (bypasses the threshold). Never throws: a failure is
|
|
61
|
+
* observed and reported as not fired, so the caller sends its turn uncompacted.
|
|
62
|
+
*/
|
|
63
|
+
export async function compactNextTuiSession(
|
|
64
|
+
sessionId: string,
|
|
65
|
+
input: { readonly force: boolean; readonly modelId?: string | null },
|
|
66
|
+
deps: NextTuiCompactDeps = {},
|
|
67
|
+
): Promise<NextTuiCompactOutcome> {
|
|
68
|
+
const auto = !input.force;
|
|
69
|
+
const started = Date.now();
|
|
70
|
+
try {
|
|
71
|
+
const config = deps.config ?? await defaultConfig();
|
|
72
|
+
if (auto && !config.enabled) return { fired: false, reason: 'disabled', before: 0, after: 0, ms: 0, status: null };
|
|
73
|
+
const modelId = input.modelId ?? deps.modelId ?? await defaultModelId();
|
|
74
|
+
const result = await compactSessionHistory(sessionId, {
|
|
75
|
+
config,
|
|
76
|
+
force: input.force,
|
|
77
|
+
...(modelId ? { modelId } : {}),
|
|
78
|
+
...(deps.provider ? { provider: deps.provider } : {}),
|
|
79
|
+
});
|
|
80
|
+
const ms = Date.now() - started;
|
|
81
|
+
if (result.fired) {
|
|
82
|
+
debug.log('tui.next', 'compact', { auto, before: result.before, after: result.after, ms });
|
|
83
|
+
return { fired: true, reason: result.reason, before: result.before, after: result.after, ms, status: compactStatus(result.before, result.after) };
|
|
84
|
+
}
|
|
85
|
+
if (!auto) debug.log('tui.next', 'compact-skipped', { auto, reason: result.reason, before: result.before, ms });
|
|
86
|
+
return {
|
|
87
|
+
fired: false,
|
|
88
|
+
reason: result.reason,
|
|
89
|
+
before: result.before,
|
|
90
|
+
after: result.after,
|
|
91
|
+
ms,
|
|
92
|
+
status: auto ? null : `압축할 내용 없음 · ${result.before} 메시지`,
|
|
93
|
+
};
|
|
94
|
+
} catch (error) {
|
|
95
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
96
|
+
const ms = Date.now() - started;
|
|
97
|
+
debug.log('tui.next', 'compact-failed', { auto, ms, error: message }, { level: 'warn' });
|
|
98
|
+
return { fired: false, reason: 'error', before: 0, after: 0, ms, status: auto ? null : `압축 실패: ${message}` };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// `/new` (alias `/session new`) — leave a session that outgrew its context without quitting next TUI.
|
|
2
|
+
// The old session is never deleted; only the active marker moves.
|
|
3
|
+
import { debug } from '../../debug/log.js';
|
|
4
|
+
import { createSession, setActiveSessionId } from '../../session/index.js';
|
|
5
|
+
|
|
6
|
+
export const NEW_SESSION_BUSY_STATUS = '응답 중에는 /new 를 받지 않습니다 · 완료(또는 Esc 취소) 뒤 다시';
|
|
7
|
+
|
|
8
|
+
/** Store placeholder for an untitled session (session/index.ts createSession). */
|
|
9
|
+
const UNTITLED = '(new session)';
|
|
10
|
+
|
|
11
|
+
export function isNewSessionCommand(text: string): boolean {
|
|
12
|
+
const normalized = text.trim().split(/\s+/).join(' ');
|
|
13
|
+
return normalized === '/new' || normalized === '/session new';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function nextTuiTitle(meta: { readonly title?: string } | null | undefined): string {
|
|
17
|
+
const title = meta?.title?.split('\n')[0]?.trim() ?? '';
|
|
18
|
+
return !title || title === UNTITLED ? '새 대화' : title;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type NewTuiSessionResult =
|
|
22
|
+
| { readonly kind: 'started'; readonly id: string; readonly status: string }
|
|
23
|
+
| { readonly kind: 'rejected'; readonly status: string };
|
|
24
|
+
|
|
25
|
+
export function requestNewTuiSession(input: { readonly busy: boolean; readonly from: string | null }): NewTuiSessionResult {
|
|
26
|
+
const { busy, from } = input;
|
|
27
|
+
if (busy) {
|
|
28
|
+
debug.log('tui.next', 'session-new-rejected', { from, reason: 'busy' });
|
|
29
|
+
return { kind: 'rejected', status: NEW_SESSION_BUSY_STATUS };
|
|
30
|
+
}
|
|
31
|
+
const id = createSession({ source: 'tui' }).id;
|
|
32
|
+
setActiveSessionId(id);
|
|
33
|
+
debug.log('tui.next', 'session-new', { from, to: id });
|
|
34
|
+
return { kind: 'started', id, status: `새 대화 · 이전 = ${from ? from.slice(0, 8) : '없음'}` };
|
|
35
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/** Keep one REPL child per session so background tasks and their completion queue survive turns. */
|
|
2
|
+
import type { NextTuiCompactDeps, NextTuiCompactOutcome } from '../tui/slash/compact.js';
|
|
3
|
+
|
|
4
|
+
const STATUS_PREFIX = 'ELANOUS_TUI_BG_STATUS\t';
|
|
5
|
+
|
|
6
|
+
interface TurnResult {
|
|
7
|
+
event?: string | null;
|
|
8
|
+
turnId?: string | null;
|
|
9
|
+
text?: string;
|
|
10
|
+
error?: string;
|
|
11
|
+
provider?: string;
|
|
12
|
+
model?: string | null;
|
|
13
|
+
}
|
|
14
|
+
interface WaitingTurn {
|
|
15
|
+
turnId: string;
|
|
16
|
+
onDelta?: (text: string) => void;
|
|
17
|
+
resolve: (result: TurnResult) => void;
|
|
18
|
+
reject: (error: Error) => void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
class LocalChatSession {
|
|
22
|
+
readonly child: ReturnType<typeof Bun.spawn>;
|
|
23
|
+
readonly exited: Promise<number>;
|
|
24
|
+
private readonly writeInput: (payload: string) => Promise<void>;
|
|
25
|
+
private waiting: WaitingTurn | null = null;
|
|
26
|
+
private stderrTail = '';
|
|
27
|
+
private closed = false;
|
|
28
|
+
private closing: Promise<void> | null = null;
|
|
29
|
+
private invalidated = false;
|
|
30
|
+
private turnCount = 0;
|
|
31
|
+
|
|
32
|
+
constructor(private readonly sessionId: string, cli: string) {
|
|
33
|
+
this.child = Bun.spawn({
|
|
34
|
+
cmd: [process.execPath, cli, 'repl', '--session', sessionId, '--json', '--stdin-jsonl'],
|
|
35
|
+
stdin: 'pipe', stdout: 'pipe', stderr: 'pipe',
|
|
36
|
+
env: { ...process.env, ELANOUS_NEXT_TUI_BG_STATUS: '1', ELANOUS_NEXT_TUI_STREAM: '1' },
|
|
37
|
+
});
|
|
38
|
+
const input = this.child.stdin;
|
|
39
|
+
const output = this.child.stdout;
|
|
40
|
+
const errors = this.child.stderr;
|
|
41
|
+
if (!input || typeof input === 'number' || !output || typeof output === 'number'
|
|
42
|
+
|| !errors || typeof errors === 'number') throw new Error('REPL pipe unavailable');
|
|
43
|
+
this.writeInput = async (payload) => { input.write(payload); await input.flush(); };
|
|
44
|
+
this.exited = this.child.exited;
|
|
45
|
+
void this.readLines(output, (line) => {
|
|
46
|
+
if (!line.trim()) return;
|
|
47
|
+
let result: TurnResult;
|
|
48
|
+
try { result = JSON.parse(line) as TurnResult; }
|
|
49
|
+
catch { this.fail(new Error('invalid REPL JSONL response')); return; }
|
|
50
|
+
const waiting = this.waiting;
|
|
51
|
+
if (!waiting) return;
|
|
52
|
+
if ('turnId' in result && result.turnId !== waiting.turnId) return;
|
|
53
|
+
if (result.event === 'delta') {
|
|
54
|
+
if (result.turnId !== waiting.turnId) return;
|
|
55
|
+
if (typeof result.text === 'string') {
|
|
56
|
+
try { waiting.onDelta?.(result.text); } catch { /* renderer cannot break the turn */ }
|
|
57
|
+
}
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Future side-channel events cannot complete a turn. Legacy final
|
|
61
|
+
// frames have no event; typed final frames use event=result.
|
|
62
|
+
if ('event' in result && result.event !== 'result') return;
|
|
63
|
+
this.waiting = null;
|
|
64
|
+
waiting.resolve(result);
|
|
65
|
+
}, () => {
|
|
66
|
+
this.invalidate();
|
|
67
|
+
this.fail(new Error('REPL stdout closed'));
|
|
68
|
+
void this.close();
|
|
69
|
+
});
|
|
70
|
+
void this.readLines(errors, (line) => {
|
|
71
|
+
if (line.startsWith(STATUS_PREFIX)) {
|
|
72
|
+
for (const listener of statusListeners.get(sessionId) ?? []) {
|
|
73
|
+
try { listener(line.slice(STATUS_PREFIX.length)); } catch { /* status observers cannot break the turn */ }
|
|
74
|
+
}
|
|
75
|
+
} else if (line.trim()) {
|
|
76
|
+
this.stderrTail = line.trim();
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
void this.exited.then((code) => {
|
|
80
|
+
this.closed = true;
|
|
81
|
+
this.invalidate();
|
|
82
|
+
if (sessions.get(sessionId) === this) sessions.delete(sessionId);
|
|
83
|
+
this.fail(new Error(this.stderrTail || `chat exit ${code}`));
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
private async readLines(stream: ReadableStream<Uint8Array>, receive: (line: string) => void, onEnd?: () => void): Promise<void> {
|
|
88
|
+
const reader = stream.getReader();
|
|
89
|
+
const decoder = new TextDecoder();
|
|
90
|
+
let buffer = '';
|
|
91
|
+
try {
|
|
92
|
+
while (true) {
|
|
93
|
+
const { value, done } = await reader.read();
|
|
94
|
+
if (done) break;
|
|
95
|
+
buffer += decoder.decode(value, { stream: true });
|
|
96
|
+
let newline: number;
|
|
97
|
+
while ((newline = buffer.indexOf('\n')) >= 0) {
|
|
98
|
+
receive(buffer.slice(0, newline));
|
|
99
|
+
buffer = buffer.slice(newline + 1);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
buffer += decoder.decode();
|
|
103
|
+
if (buffer) receive(buffer);
|
|
104
|
+
} catch (error) {
|
|
105
|
+
this.fail(error instanceof Error ? error : new Error(String(error)));
|
|
106
|
+
} finally {
|
|
107
|
+
reader.releaseLock();
|
|
108
|
+
onEnd?.();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
private fail(error: Error): void {
|
|
113
|
+
const waiting = this.waiting;
|
|
114
|
+
this.waiting = null;
|
|
115
|
+
waiting?.reject(error);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private invalidate(): void {
|
|
119
|
+
if (this.invalidated) return;
|
|
120
|
+
this.invalidated = true;
|
|
121
|
+
for (const listener of statusListeners.get(this.sessionId) ?? []) {
|
|
122
|
+
try { listener(null); } catch { /* status observers cannot break teardown */ }
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async turn(prompt: string, writePrompt?: (payload: string) => Promise<void>, onDelta?: (text: string) => void): Promise<TurnResult> {
|
|
127
|
+
if (this.closed) throw new Error('REPL child exited');
|
|
128
|
+
if (this.waiting) throw new Error('REPL turn already running');
|
|
129
|
+
const turnId = `tui-${++this.turnCount}`;
|
|
130
|
+
const payload = `${JSON.stringify({ prompt, id: turnId })}\n`;
|
|
131
|
+
const response = new Promise<TurnResult>((resolve, reject) => { this.waiting = { turnId, onDelta, resolve, reject }; });
|
|
132
|
+
try {
|
|
133
|
+
if (writePrompt) await writePrompt(payload);
|
|
134
|
+
else await this.writeInput(payload);
|
|
135
|
+
} catch (error) {
|
|
136
|
+
this.fail(error instanceof Error ? error : new Error(String(error)));
|
|
137
|
+
}
|
|
138
|
+
return response;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async close(): Promise<void> {
|
|
142
|
+
if (!this.closing) {
|
|
143
|
+
this.closing = (async () => {
|
|
144
|
+
if (!this.closed) {
|
|
145
|
+
this.closed = true;
|
|
146
|
+
this.invalidate();
|
|
147
|
+
try { this.child.kill(); } catch { /* already exited */ }
|
|
148
|
+
}
|
|
149
|
+
await this.exited;
|
|
150
|
+
})();
|
|
151
|
+
}
|
|
152
|
+
await this.closing;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const sessions = new Map<string, LocalChatSession>();
|
|
157
|
+
/** Model the child last answered with, per session — sizes the next pre-turn compaction check. */
|
|
158
|
+
const lastModels = new Map<string, string>();
|
|
159
|
+
|
|
160
|
+
export function localChatModel(sessionId: string): string | null {
|
|
161
|
+
return lastModels.get(sessionId) ?? null;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** TUI-NEXT-COMPACT — pre-turn auto compaction hook (deps are test seams; production passes none). */
|
|
165
|
+
export interface LocalChatTurnCompact {
|
|
166
|
+
readonly deps?: NextTuiCompactDeps;
|
|
167
|
+
readonly onCompact?: (outcome: NextTuiCompactOutcome) => void;
|
|
168
|
+
}
|
|
169
|
+
const statusListeners = new Map<string, Set<(json: string | null) => void>>();
|
|
170
|
+
|
|
171
|
+
export function onLocalChatBackgroundStatus(sessionId: string, listener: (json: string | null) => void): () => void {
|
|
172
|
+
const listeners = statusListeners.get(sessionId) ?? new Set();
|
|
173
|
+
listeners.add(listener);
|
|
174
|
+
statusListeners.set(sessionId, listeners);
|
|
175
|
+
return () => {
|
|
176
|
+
listeners.delete(listener);
|
|
177
|
+
if (listeners.size === 0) statusListeners.delete(sessionId);
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export async function closeLocalChatSession(sessionId: string): Promise<void> {
|
|
182
|
+
const session = sessions.get(sessionId);
|
|
183
|
+
sessions.delete(sessionId);
|
|
184
|
+
lastModels.delete(sessionId);
|
|
185
|
+
await session?.close();
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/** Run one turn while retaining the child for the next turn. */
|
|
189
|
+
export async function runLocalChatTurn(
|
|
190
|
+
sessionId: string,
|
|
191
|
+
text: string,
|
|
192
|
+
signal: AbortSignal,
|
|
193
|
+
cli = process.argv[1],
|
|
194
|
+
writePrompt?: (payload: string) => Promise<void>,
|
|
195
|
+
onDelta?: (text: string) => void,
|
|
196
|
+
compact: LocalChatTurnCompact = {},
|
|
197
|
+
): Promise<void> {
|
|
198
|
+
if (signal.aborted) throw new Error('응답을 취소했습니다');
|
|
199
|
+
if (!cli) throw new Error('elanous CLI entry is unavailable');
|
|
200
|
+
// The REPL child reloads the session store each turn, so compacting the store here is what this
|
|
201
|
+
// turn's model call sees. Over the shared threshold only; a failure leaves the turn uncompacted.
|
|
202
|
+
// Lazy like this module itself: the compaction path pulls in the LLM router, so next TUI boot stays light.
|
|
203
|
+
const { compactNextTuiSession } = await import('../tui/slash/compact.js');
|
|
204
|
+
const compacted = await compactNextTuiSession(sessionId, { force: false, modelId: localChatModel(sessionId) }, compact.deps);
|
|
205
|
+
if (compacted.fired) {
|
|
206
|
+
try { compact.onCompact?.(compacted); } catch { /* status observers cannot break the turn */ }
|
|
207
|
+
}
|
|
208
|
+
if (signal.aborted) throw new Error('응답을 취소했습니다');
|
|
209
|
+
const session = sessions.get(sessionId) ?? new LocalChatSession(sessionId, cli);
|
|
210
|
+
sessions.set(sessionId, session);
|
|
211
|
+
const abort = (): void => { void closeLocalChatSession(sessionId); };
|
|
212
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
213
|
+
if (signal.aborted) abort();
|
|
214
|
+
let result: TurnResult;
|
|
215
|
+
try {
|
|
216
|
+
result = await session.turn(text, writePrompt, (delta) => {
|
|
217
|
+
if (!signal.aborted) onDelta?.(delta);
|
|
218
|
+
});
|
|
219
|
+
} catch (error) {
|
|
220
|
+
if (signal.aborted) throw new Error('응답을 취소했습니다');
|
|
221
|
+
await closeLocalChatSession(sessionId);
|
|
222
|
+
throw error;
|
|
223
|
+
} finally {
|
|
224
|
+
signal.removeEventListener('abort', abort);
|
|
225
|
+
}
|
|
226
|
+
if (signal.aborted) throw new Error('응답을 취소했습니다');
|
|
227
|
+
// A completed JSONL error frame is a turn failure, not a transport failure:
|
|
228
|
+
// the child still owns live tasks and buffered notifications for retry.
|
|
229
|
+
if (result.error) throw new Error(result.error);
|
|
230
|
+
if (result.model) lastModels.set(sessionId, result.model);
|
|
231
|
+
if (result.provider) {
|
|
232
|
+
try {
|
|
233
|
+
const { debug } = await import('../debug/log.js');
|
|
234
|
+
debug.log('llm.route-decision', 'local-chat-executed', {
|
|
235
|
+
surface: 'tui-local', sessionId, provider: result.provider, model: result.model ?? null,
|
|
236
|
+
});
|
|
237
|
+
} catch { /* observation must not fail a completed turn */ }
|
|
238
|
+
}
|
|
239
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** Run the existing harness CLI outside the TUI import graph and stream its result. */
|
|
2
|
+
export async function runLocalHarnessCommand(
|
|
3
|
+
command: 'ask' | 'runs',
|
|
4
|
+
goal: string,
|
|
5
|
+
signal: AbortSignal,
|
|
6
|
+
onLine: (line: string) => void,
|
|
7
|
+
cli = process.argv[1],
|
|
8
|
+
): Promise<void> {
|
|
9
|
+
if (signal.aborted) throw new Error('하니스 호출을 취소했습니다');
|
|
10
|
+
if (!cli) throw new Error('elanous CLI entry is unavailable');
|
|
11
|
+
const dryRun = command === 'ask' && goal.startsWith('--dry-run ');
|
|
12
|
+
const objective = dryRun ? goal.slice('--dry-run '.length).trim() : goal;
|
|
13
|
+
if (command === 'ask' && !objective) throw new Error('하니스 목표가 비었습니다');
|
|
14
|
+
const cmd = command === 'runs'
|
|
15
|
+
? [process.execPath, cli, 'harness', 'progress']
|
|
16
|
+
: [process.execPath, cli, 'harness', 'say', '--no-auto-merge', ...(dryRun ? ['--dry-run'] : []), objective];
|
|
17
|
+
const child = Bun.spawn({ cmd, stdin: 'ignore', stdout: 'pipe', stderr: 'pipe', env: process.env });
|
|
18
|
+
let omittedRunRows = 0;
|
|
19
|
+
let shownRunRows = 0;
|
|
20
|
+
const emit = (line: string): void => {
|
|
21
|
+
if (command === 'runs' && shownRunRows >= 16) { omittedRunRows++; return; }
|
|
22
|
+
shownRunRows++;
|
|
23
|
+
onLine(line);
|
|
24
|
+
};
|
|
25
|
+
const abort = (): void => { child.kill(); };
|
|
26
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
27
|
+
if (signal.aborted) abort();
|
|
28
|
+
const readLines = async (stream: ReadableStream<Uint8Array>): Promise<string> => {
|
|
29
|
+
const reader = stream.getReader();
|
|
30
|
+
const decoder = new TextDecoder();
|
|
31
|
+
let pending = '';
|
|
32
|
+
let last = '';
|
|
33
|
+
while (true) {
|
|
34
|
+
const { done, value } = await reader.read();
|
|
35
|
+
pending += decoder.decode(value, { stream: !done });
|
|
36
|
+
let newline = pending.indexOf('\n');
|
|
37
|
+
while (newline >= 0) {
|
|
38
|
+
const line = pending.slice(0, newline).replace(/\r$/, '');
|
|
39
|
+
if (line.trim()) { emit(line); last = line; }
|
|
40
|
+
pending = pending.slice(newline + 1);
|
|
41
|
+
newline = pending.indexOf('\n');
|
|
42
|
+
}
|
|
43
|
+
if (done) break;
|
|
44
|
+
}
|
|
45
|
+
if (pending.trim()) { emit(pending); last = pending; }
|
|
46
|
+
return last;
|
|
47
|
+
};
|
|
48
|
+
try {
|
|
49
|
+
const [outLast, errLast, code] = await Promise.all([
|
|
50
|
+
readLines(child.stdout), readLines(child.stderr), child.exited,
|
|
51
|
+
]);
|
|
52
|
+
if (signal.aborted) throw new Error('하니스 호출을 취소했습니다');
|
|
53
|
+
if (code !== 0) throw new Error(errLast || outLast || `harness exit ${code}`);
|
|
54
|
+
if (omittedRunRows > 0) onLine(`추가 ${omittedRunRows}행 생략 · 전체: eln harness progress`);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
try { child.kill(); } catch { /* already exited */ }
|
|
57
|
+
await child.exited;
|
|
58
|
+
if (signal.aborted) throw new Error('하니스 호출을 취소했습니다');
|
|
59
|
+
throw error;
|
|
60
|
+
} finally {
|
|
61
|
+
signal.removeEventListener('abort', abort);
|
|
62
|
+
}
|
|
63
|
+
}
|