ompchamber 0.3.0
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/README.md +253 -0
- package/dist/client/apple-touch-icon.png +0 -0
- package/dist/client/icon-192x192.png +0 -0
- package/dist/client/icon-512x512.png +0 -0
- package/dist/client/icon-maskable-512x512.png +0 -0
- package/dist/client/icon.svg +60 -0
- package/dist/client/index.html +41 -0
- package/dist/client/manifest.webmanifest +38 -0
- package/dist/client/static/css/g.f36aa429fa.css +1 -0
- package/dist/client/static/css/index.a0f07455bd.css +2 -0
- package/dist/client/static/css/katex-vendor.ca3a0600e8.css +1 -0
- package/dist/client/static/font/KaTeX_AMS-Regular.1608a09b4a.woff +0 -0
- package/dist/client/static/font/KaTeX_AMS-Regular.4aafdb685c.ttf +0 -0
- package/dist/client/static/font/KaTeX_AMS-Regular.a79f1c3119.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Caligraphic-Bold.b67709187b.woff +0 -0
- package/dist/client/static/font/KaTeX_Caligraphic-Bold.cce5b8ecea.ttf +0 -0
- package/dist/client/static/font/KaTeX_Caligraphic-Bold.ec17d13264.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Caligraphic-Regular.07ef19e7b0.ttf +0 -0
- package/dist/client/static/font/KaTeX_Caligraphic-Regular.55fac25845.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Caligraphic-Regular.dad44a7fc6.woff +0 -0
- package/dist/client/static/font/KaTeX_Fraktur-Bold.9f256b8593.woff +0 -0
- package/dist/client/static/font/KaTeX_Fraktur-Bold.b18f59e1d1.ttf +0 -0
- package/dist/client/static/font/KaTeX_Fraktur-Bold.d42a5579b0.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Fraktur-Regular.7c1871215e.woff +0 -0
- package/dist/client/static/font/KaTeX_Fraktur-Regular.d3c882a649.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Fraktur-Regular.ed38e79f57.ttf +0 -0
- package/dist/client/static/font/KaTeX_Main-Bold.b74a1a8b2c.ttf +0 -0
- package/dist/client/static/font/KaTeX_Main-Bold.c3fb5ac22f.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Main-Bold.d181c4650d.woff +0 -0
- package/dist/client/static/font/KaTeX_Main-BoldItalic.6f2bb1dff2.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Main-BoldItalic.70d8b0a530.ttf +0 -0
- package/dist/client/static/font/KaTeX_Main-BoldItalic.e3f82f9d27.woff +0 -0
- package/dist/client/static/font/KaTeX_Main-Italic.47373d1e51.ttf +0 -0
- package/dist/client/static/font/KaTeX_Main-Italic.8916142bec.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Main-Italic.9024d815ba.woff +0 -0
- package/dist/client/static/font/KaTeX_Main-Regular.0462f03bdf.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Main-Regular.7f51fe0340.woff +0 -0
- package/dist/client/static/font/KaTeX_Main-Regular.b7f8fe9b5f.ttf +0 -0
- package/dist/client/static/font/KaTeX_Math-BoldItalic.572d331f69.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Math-BoldItalic.a879cf8383.ttf +0 -0
- package/dist/client/static/font/KaTeX_Math-BoldItalic.f1035d8d5d.woff +0 -0
- package/dist/client/static/font/KaTeX_Math-Italic.5295ba483a.woff +0 -0
- package/dist/client/static/font/KaTeX_Math-Italic.939bc64440.ttf +0 -0
- package/dist/client/static/font/KaTeX_Math-Italic.f28c23acad.woff2 +0 -0
- package/dist/client/static/font/KaTeX_SansSerif-Bold.8c5b5494b6.woff2 +0 -0
- package/dist/client/static/font/KaTeX_SansSerif-Bold.94e1e8dc5f.ttf +0 -0
- package/dist/client/static/font/KaTeX_SansSerif-Bold.bf59d231c3.woff +0 -0
- package/dist/client/static/font/KaTeX_SansSerif-Italic.3b1e59b3ba.woff2 +0 -0
- package/dist/client/static/font/KaTeX_SansSerif-Italic.7c9bc82b17.woff +0 -0
- package/dist/client/static/font/KaTeX_SansSerif-Italic.b4c20c84d8.ttf +0 -0
- package/dist/client/static/font/KaTeX_SansSerif-Regular.740484788f.woff +0 -0
- package/dist/client/static/font/KaTeX_SansSerif-Regular.ba21ed5f84.woff2 +0 -0
- package/dist/client/static/font/KaTeX_SansSerif-Regular.d4d7ba4804.ttf +0 -0
- package/dist/client/static/font/KaTeX_Script-Regular.03e9641d6f.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Script-Regular.0750571032.woff +0 -0
- package/dist/client/static/font/KaTeX_Script-Regular.fe9cbbe1a0.ttf +0 -0
- package/dist/client/static/font/KaTeX_Size1-Regular.e1e279cbdd.woff +0 -0
- package/dist/client/static/font/KaTeX_Size1-Regular.eae34984b3.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Size1-Regular.fabc004aab.ttf +0 -0
- package/dist/client/static/font/KaTeX_Size2-Regular.577270225e.woff +0 -0
- package/dist/client/static/font/KaTeX_Size2-Regular.5916a24fa3.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Size2-Regular.d6b476ecd3.ttf +0 -0
- package/dist/client/static/font/KaTeX_Size3-Regular.9acaf01c64.woff +0 -0
- package/dist/client/static/font/KaTeX_Size3-Regular.a144ef5840.ttf +0 -0
- package/dist/client/static/font/KaTeX_Size4-Regular.10d95fd3a2.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Size4-Regular.7a996c9da2.woff +0 -0
- package/dist/client/static/font/KaTeX_Size4-Regular.fbccdabe0a.ttf +0 -0
- package/dist/client/static/font/KaTeX_Typewriter-Regular.6258592bdc.woff +0 -0
- package/dist/client/static/font/KaTeX_Typewriter-Regular.a8709e3622.woff2 +0 -0
- package/dist/client/static/font/KaTeX_Typewriter-Regular.d97aaf4a1e.ttf +0 -0
- package/dist/client/static/font/fira-code-cyrillic-400-normal.5971438a4a.woff2 +0 -0
- package/dist/client/static/font/fira-code-cyrillic-400-normal.9bb7bfea9c.woff +0 -0
- package/dist/client/static/font/fira-code-cyrillic-500-normal.5486265b18.woff2 +0 -0
- package/dist/client/static/font/fira-code-cyrillic-500-normal.89f92bfb31.woff +0 -0
- package/dist/client/static/font/fira-code-cyrillic-600-normal.2805b497e5.woff +0 -0
- package/dist/client/static/font/fira-code-cyrillic-600-normal.86e0df22a3.woff2 +0 -0
- package/dist/client/static/font/fira-code-cyrillic-700-normal.505a88f22a.woff +0 -0
- package/dist/client/static/font/fira-code-cyrillic-700-normal.76f5e8d2e2.woff2 +0 -0
- package/dist/client/static/font/fira-code-cyrillic-ext-400-normal.3c4b15e57d.woff2 +0 -0
- package/dist/client/static/font/fira-code-cyrillic-ext-400-normal.61323debaa.woff +0 -0
- package/dist/client/static/font/fira-code-cyrillic-ext-500-normal.0f34210f2a.woff2 +0 -0
- package/dist/client/static/font/fira-code-cyrillic-ext-500-normal.2497cfa1aa.woff +0 -0
- package/dist/client/static/font/fira-code-cyrillic-ext-600-normal.40fce94af9.woff2 +0 -0
- package/dist/client/static/font/fira-code-cyrillic-ext-600-normal.6c8774b829.woff +0 -0
- package/dist/client/static/font/fira-code-cyrillic-ext-700-normal.4b742eb865.woff +0 -0
- package/dist/client/static/font/fira-code-cyrillic-ext-700-normal.e75eb4fccc.woff2 +0 -0
- package/dist/client/static/font/fira-code-greek-400-normal.bb900468b6.woff2 +0 -0
- package/dist/client/static/font/fira-code-greek-400-normal.be76e699ba.woff +0 -0
- package/dist/client/static/font/fira-code-greek-500-normal.176c9fb001.woff2 +0 -0
- package/dist/client/static/font/fira-code-greek-500-normal.d2c596136b.woff +0 -0
- package/dist/client/static/font/fira-code-greek-600-normal.490c3deed7.woff +0 -0
- package/dist/client/static/font/fira-code-greek-600-normal.7df14376d9.woff2 +0 -0
- package/dist/client/static/font/fira-code-greek-700-normal.c82b6072fc.woff2 +0 -0
- package/dist/client/static/font/fira-code-greek-700-normal.d5f2b2917b.woff +0 -0
- package/dist/client/static/font/fira-code-greek-ext-400-normal.4849a79781.woff +0 -0
- package/dist/client/static/font/fira-code-greek-ext-400-normal.7f5bfc4538.woff2 +0 -0
- package/dist/client/static/font/fira-code-greek-ext-500-normal.aaccca4075.woff2 +0 -0
- package/dist/client/static/font/fira-code-greek-ext-500-normal.e383181256.woff +0 -0
- package/dist/client/static/font/fira-code-greek-ext-600-normal.78cb4bff8e.woff +0 -0
- package/dist/client/static/font/fira-code-greek-ext-600-normal.d6c93d54f9.woff2 +0 -0
- package/dist/client/static/font/fira-code-greek-ext-700-normal.57ec7c92d9.woff +0 -0
- package/dist/client/static/font/fira-code-greek-ext-700-normal.8fafdae5e8.woff2 +0 -0
- package/dist/client/static/font/fira-code-latin-400-normal.2655b10c55.woff2 +0 -0
- package/dist/client/static/font/fira-code-latin-400-normal.973295532b.woff +0 -0
- package/dist/client/static/font/fira-code-latin-500-normal.7ae2be8fb8.woff +0 -0
- package/dist/client/static/font/fira-code-latin-500-normal.92a991f204.woff2 +0 -0
- package/dist/client/static/font/fira-code-latin-600-normal.1dbbe5bc27.woff +0 -0
- package/dist/client/static/font/fira-code-latin-600-normal.43788eb7f1.woff2 +0 -0
- package/dist/client/static/font/fira-code-latin-700-normal.2667215d33.woff2 +0 -0
- package/dist/client/static/font/fira-code-latin-700-normal.497a70148b.woff +0 -0
- package/dist/client/static/font/fira-code-latin-ext-400-normal.9dfae29aaf.woff +0 -0
- package/dist/client/static/font/fira-code-latin-ext-400-normal.e534ae46e2.woff2 +0 -0
- package/dist/client/static/font/fira-code-latin-ext-500-normal.24c7b781b0.woff +0 -0
- package/dist/client/static/font/fira-code-latin-ext-500-normal.aad44ab072.woff2 +0 -0
- package/dist/client/static/font/fira-code-latin-ext-600-normal.7bed0f2f7e.woff +0 -0
- package/dist/client/static/font/fira-code-latin-ext-600-normal.c509a7c9f1.woff2 +0 -0
- package/dist/client/static/font/fira-code-latin-ext-700-normal.6c66c8b0a9.woff2 +0 -0
- package/dist/client/static/font/fira-code-latin-ext-700-normal.88f64e2822.woff +0 -0
- package/dist/client/static/font/fira-code-symbols2-400-normal.97d3f4b17c.woff +0 -0
- package/dist/client/static/font/fira-code-symbols2-500-normal.b06f1a06e4.woff +0 -0
- package/dist/client/static/font/fira-code-symbols2-600-normal.304b653b93.woff +0 -0
- package/dist/client/static/font/fira-code-symbols2-700-normal.d8ce0ad586.woff +0 -0
- package/dist/client/static/js/async/0.8e59f2eb5b.js +1 -0
- package/dist/client/static/js/async/0k.5852e6b4fa.js +1 -0
- package/dist/client/static/js/async/0w.9ed36d5860.js +1 -0
- package/dist/client/static/js/async/1.f387c12b63.js +1 -0
- package/dist/client/static/js/async/12.d091f91c99.js +1 -0
- package/dist/client/static/js/async/13.8f810a8a6c.js +1 -0
- package/dist/client/static/js/async/19.6fe909d55a.js +160 -0
- package/dist/client/static/js/async/1b.23f1141a38.js +1 -0
- package/dist/client/static/js/async/1k.544adbf77d.js +2 -0
- package/dist/client/static/js/async/1k.544adbf77d.js.LICENSE.txt +6 -0
- package/dist/client/static/js/async/1p.0d5cddda96.js +1 -0
- package/dist/client/static/js/async/2.b589f1733b.js +1 -0
- package/dist/client/static/js/async/2v.96165101de.js +1 -0
- package/dist/client/static/js/async/3.0cacc08423.js +1 -0
- package/dist/client/static/js/async/37.b28b2f61cd.js +1 -0
- package/dist/client/static/js/async/3d.5085fb913f.js +1 -0
- package/dist/client/static/js/async/3j.a2fcea99be.js +2 -0
- package/dist/client/static/js/async/3j.a2fcea99be.js.LICENSE.txt +11 -0
- package/dist/client/static/js/async/3p.bcf32a0983.js +1 -0
- package/dist/client/static/js/async/3r.3a69e98ee0.js +64 -0
- package/dist/client/static/js/async/3u.1228460e2a.js +1 -0
- package/dist/client/static/js/async/3y.22075aa079.js +198 -0
- package/dist/client/static/js/async/3y.22075aa079.js.LICENSE.txt +5 -0
- package/dist/client/static/js/async/4.9442eeb472.js +1 -0
- package/dist/client/static/js/async/4e.678285ca55.js +1 -0
- package/dist/client/static/js/async/4k.33a0c7eeb4.js +1 -0
- package/dist/client/static/js/async/4q.aad20dab25.js +1 -0
- package/dist/client/static/js/async/5.ebaf8b89cc.js +36 -0
- package/dist/client/static/js/async/51.1938cec320.js +2 -0
- package/dist/client/static/js/async/51.1938cec320.js.LICENSE.txt +6 -0
- package/dist/client/static/js/async/5b.d88304bc13.js +1 -0
- package/dist/client/static/js/async/5j.d6407c4248.js +287 -0
- package/dist/client/static/js/async/5o.88316d4460.js +62 -0
- package/dist/client/static/js/async/6.7929428505.js +1 -0
- package/dist/client/static/js/async/66.5dfa29f957.js +93 -0
- package/dist/client/static/js/async/69.a18a10882f.js +1 -0
- package/dist/client/static/js/async/6o.5b1a06a382.js +1 -0
- package/dist/client/static/js/async/7.e4a9288dd0.js +1 -0
- package/dist/client/static/js/async/73.50280ce58d.js +1 -0
- package/dist/client/static/js/async/7e.a1cc9bfd88.js +1 -0
- package/dist/client/static/js/async/7l.7a6a377ecc.js +1 -0
- package/dist/client/static/js/async/8.5067439d8c.js +1 -0
- package/dist/client/static/js/async/8j.ea110663fb.js +1 -0
- package/dist/client/static/js/async/a.bce4542392.js +1 -0
- package/dist/client/static/js/async/aa.65d3852576.js +1 -0
- package/dist/client/static/js/async/ar.9dc8b1992a.js +2 -0
- package/dist/client/static/js/async/ar.9dc8b1992a.js.LICENSE.txt +6 -0
- package/dist/client/static/js/async/az.d656062b0f.js +1 -0
- package/dist/client/static/js/async/b.b4f6f06515.js +1 -0
- package/dist/client/static/js/async/bi.cbfe8eaa8e.js +1 -0
- package/dist/client/static/js/async/bq.586bc738d1.js +1 -0
- package/dist/client/static/js/async/c.cd45b0ac45.js +1 -0
- package/dist/client/static/js/async/c0.0af1e640d3.js +24 -0
- package/dist/client/static/js/async/ca.8a52cfd447.js +1 -0
- package/dist/client/static/js/async/cf.d34fff5d67.js +1 -0
- package/dist/client/static/js/async/ct.38d9da8a5a.js +1 -0
- package/dist/client/static/js/async/cx.ca5feec570.js +226 -0
- package/dist/client/static/js/async/d.a5fc8fe1b3.js +1 -0
- package/dist/client/static/js/async/da.f62c70f6c8.js +1 -0
- package/dist/client/static/js/async/dp.1725d6432c.js +1 -0
- package/dist/client/static/js/async/e.93214d622b.js +79 -0
- package/dist/client/static/js/async/f.ab50467719.js +19 -0
- package/dist/client/static/js/async/f.ab50467719.js.LICENSE.txt +12 -0
- package/dist/client/static/js/async/f8.bbf0dbae70.js +1 -0
- package/dist/client/static/js/async/fw.fb1a08b92d.js +6 -0
- package/dist/client/static/js/async/fw.fb1a08b92d.js.LICENSE.txt +6 -0
- package/dist/client/static/js/async/h.4e790471e4.js +27 -0
- package/dist/client/static/js/async/h1.e8d5aa8e80.js +1 -0
- package/dist/client/static/js/async/h3.216e9798ab.js +148 -0
- package/dist/client/static/js/async/hd.0da931b622.js +1 -0
- package/dist/client/static/js/async/hk.ba7fb04d41.js +1 -0
- package/dist/client/static/js/async/hn.7568bdb58b.js +1 -0
- package/dist/client/static/js/async/ho.475a5e1ae4.js +1 -0
- package/dist/client/static/js/async/hp.e9fe2e395a.js +2 -0
- package/dist/client/static/js/async/hp.e9fe2e395a.js.LICENSE.txt +17 -0
- package/dist/client/static/js/async/hs.6d480d0ded.js +41 -0
- package/dist/client/static/js/async/i.7c148e8440.js +1 -0
- package/dist/client/static/js/async/id.573df20f29.js +1 -0
- package/dist/client/static/js/async/j.ab925882d8.js +1 -0
- package/dist/client/static/js/async/jd.63886a1f09.js +1 -0
- package/dist/client/static/js/async/jg.69a4beade8.js +86 -0
- package/dist/client/static/js/async/jl.874d352278.js +1 -0
- package/dist/client/static/js/async/jll.11313b455a.js +1 -0
- package/dist/client/static/js/async/js.67182759ef.js +1 -0
- package/dist/client/static/js/async/jsc.23b70d6f40.js +1 -0
- package/dist/client/static/js/async/jse.334588ff5d.js +1 -0
- package/dist/client/static/js/async/jz.72eb929106.js +77 -0
- package/dist/client/static/js/async/k.e878dd350f.js +217 -0
- package/dist/client/static/js/async/ka.c1990ecaa3.js +115 -0
- package/dist/client/static/js/async/ku.29c8a59d0c.js +1 -0
- package/dist/client/static/js/async/ky.8dab1dade0.js +1 -0
- package/dist/client/static/js/async/l.102a97fce6.js +104 -0
- package/dist/client/static/js/async/l6.45f3b62e15.js +1 -0
- package/dist/client/static/js/async/l9.949710adaf.js +83 -0
- package/dist/client/static/js/async/l9.949710adaf.js.LICENSE.txt +13 -0
- package/dist/client/static/js/async/m.3fc017a055.js +28 -0
- package/dist/client/static/js/async/m.3fc017a055.js.LICENSE.txt +6 -0
- package/dist/client/static/js/async/me.8ace414f80.js +23 -0
- package/dist/client/static/js/async/mt.0352e976d8.js +1 -0
- package/dist/client/static/js/async/n.a9f1c51701.js +1 -0
- package/dist/client/static/js/async/na.a36cd532d6.js +1 -0
- package/dist/client/static/js/async/nk.6de011832e.js +1 -0
- package/dist/client/static/js/async/o.36353dfb88.js +1 -0
- package/dist/client/static/js/async/oc.9c060c9779.js +8 -0
- package/dist/client/static/js/async/og.ae7acf03ac.js +193 -0
- package/dist/client/static/js/async/p.48ecfcd14e.js +1 -0
- package/dist/client/static/js/async/px.783b6f91f2.js +1 -0
- package/dist/client/static/js/async/q.0b6fb9bf8d.js +21 -0
- package/dist/client/static/js/async/q.0b6fb9bf8d.js.LICENSE.txt +6 -0
- package/dist/client/static/js/async/q5.e683f7c26e.js +286 -0
- package/dist/client/static/js/async/qs.2a9ddb3c72.js +1 -0
- package/dist/client/static/js/async/r.51010ad87c.js +1 -0
- package/dist/client/static/js/async/rd.b77011ab7f.js +2 -0
- package/dist/client/static/js/async/rd.b77011ab7f.js.LICENSE.txt +4 -0
- package/dist/client/static/js/async/rf.cfbde7f744.js +2 -0
- package/dist/client/static/js/async/rf.cfbde7f744.js.LICENSE.txt +6 -0
- package/dist/client/static/js/async/s.c7d521a8ae.js +2 -0
- package/dist/client/static/js/async/s.c7d521a8ae.js.LICENSE.txt +6 -0
- package/dist/client/static/js/async/sy.7345abcd67.js +94 -0
- package/dist/client/static/js/async/t.0dcb01dfde.js +1 -0
- package/dist/client/static/js/async/t9.d44f57d518.js +1 -0
- package/dist/client/static/js/async/ta.973534bbec.js +1 -0
- package/dist/client/static/js/async/ty.3d93cf5f5f.js +1 -0
- package/dist/client/static/js/async/u.0871ac5b22.js +1 -0
- package/dist/client/static/js/async/up.ea990da0ff.js +32 -0
- package/dist/client/static/js/async/uw.8890abbabc.js +1 -0
- package/dist/client/static/js/async/v.5c7a4b087b.js +1 -0
- package/dist/client/static/js/async/vn.e98e2f3b61.js +309 -0
- package/dist/client/static/js/async/vp.9b13bf8610.js +1 -0
- package/dist/client/static/js/async/vu.311f1d202c.js +34 -0
- package/dist/client/static/js/async/w.08ac210f60.js +1 -0
- package/dist/client/static/js/async/wt.ad92393a90.js +1 -0
- package/dist/client/static/js/async/x.563f72ca6b.js +1 -0
- package/dist/client/static/js/async/x0.475516418f.js +1 -0
- package/dist/client/static/js/async/x1.da8687159b.js +90 -0
- package/dist/client/static/js/async/xl.a3c562a58c.js +1 -0
- package/dist/client/static/js/async/xn.afecebbbd9.js +2 -0
- package/dist/client/static/js/async/xn.afecebbbd9.js.LICENSE.txt +12 -0
- package/dist/client/static/js/async/y.1a9ed7a5d8.js +1 -0
- package/dist/client/static/js/async/y6.43c57defe4.js +1 -0
- package/dist/client/static/js/async/yb.8c1342401d.js +1 -0
- package/dist/client/static/js/async/ybq.4491f2f2dc.js +1 -0
- package/dist/client/static/js/async/yg.9bd4e09ecb.js +149 -0
- package/dist/client/static/js/async/yq.917ddd7ba2.js +1 -0
- package/dist/client/static/js/async/ys.00687cf82d.js +38 -0
- package/dist/client/static/js/async/yv.593a3f7d54.js +1 -0
- package/dist/client/static/js/async/z.56f61a4374.js +1 -0
- package/dist/client/static/js/async/zi.5fdb07b86a.js +24 -0
- package/dist/client/static/js/async/zj.654f37e8ff.js +1 -0
- package/dist/client/static/js/async/zn.966d6f1cc6.js +1 -0
- package/dist/client/static/js/async/zo.26213b40c0.js +1 -0
- package/dist/client/static/js/async/zx.e9f4105e00.js +1 -0
- package/dist/client/static/js/g.124fba0826.js +139 -0
- package/dist/client/static/js/g.124fba0826.js.LICENSE.txt +8 -0
- package/dist/client/static/js/index.907fd4670e.js +68 -0
- package/dist/client/static/js/index.907fd4670e.js.LICENSE.txt +4 -0
- package/dist/client/static/js/katex-vendor.95e48cf65a.js +1 -0
- package/dist/client/static/js/markdown-vendor.9da142c67b.js +144 -0
- package/dist/client/static/js/shiki-vendor.cb8452ddcd.js +1 -0
- package/dist/client/sw.js +15 -0
- package/package.json +75 -0
- package/src/cli/lib/args.js +233 -0
- package/src/cli/lib/commands/logs.js +108 -0
- package/src/cli/lib/commands/restart.js +28 -0
- package/src/cli/lib/commands/serve.js +109 -0
- package/src/cli/lib/commands/status.js +63 -0
- package/src/cli/lib/commands/stop.js +63 -0
- package/src/cli/lib/commands/update.js +120 -0
- package/src/cli/lib/output.js +136 -0
- package/src/cli/lib/path-utils.js +48 -0
- package/src/cli/lib/path-utils.test.js +71 -0
- package/src/cli/lib/paths.js +60 -0
- package/src/cli/lib/process-lifecycle.js +110 -0
- package/src/cli/lib/runtime.js +280 -0
- package/src/cli/ompchamber.js +56 -0
- package/src/client/App.tsx +95 -0
- package/src/client/bootstrap.d.ts +12 -0
- package/src/client/components/common/ComposerPicker.tsx +116 -0
- package/src/client/components/common/ComposerTextarea.tsx +131 -0
- package/src/client/components/common/CopyButton.tsx +73 -0
- package/src/client/components/common/FolderPicker.tsx +270 -0
- package/src/client/components/common/MarkdownRenderer.tsx +107 -0
- package/src/client/components/common/Modal.tsx +75 -0
- package/src/client/components/common/PWAInstallButton.tsx +113 -0
- package/src/client/components/common/StatCard.tsx +52 -0
- package/src/client/components/common/StreamStatusDot.tsx +28 -0
- package/src/client/components/common/SubagentStatusIcon.tsx +27 -0
- package/src/client/components/common/Toast.tsx +79 -0
- package/src/client/components/common/ToastStack.tsx +18 -0
- package/src/client/components/common/ViewportSelector.tsx +206 -0
- package/src/client/components/common/code-editor/index.tsx +343 -0
- package/src/client/components/common/code-surface/index.tsx +75 -0
- package/src/client/components/common/file-icon/brand-paths.ts +62 -0
- package/src/client/components/common/file-icon/index.tsx +127 -0
- package/src/client/components/common/lazy-panels.tsx +80 -0
- package/src/client/components/common/session-state-provider/index.tsx +55 -0
- package/src/client/components/common/sort-menu/index.tsx +63 -0
- package/src/client/components/common/sort-menu/options.ts +24 -0
- package/src/client/components/common/viewport.ts +21 -0
- package/src/client/components/common/workspace-options-menu/index.tsx +84 -0
- package/src/client/components/layout/RightActivityBar.tsx +95 -0
- package/src/client/components/layout/desktop-layout/ResizeHandle.tsx +10 -0
- package/src/client/components/layout/desktop-layout/TopNavbar.tsx +94 -0
- package/src/client/components/layout/desktop-layout/WorkspacePanels.tsx +175 -0
- package/src/client/components/layout/desktop-layout/index.tsx +280 -0
- package/src/client/components/layout/desktop-layout/resizer/index.tsx +344 -0
- package/src/client/components/layout/session-sidebar/CategoryItem.tsx +264 -0
- package/src/client/components/layout/session-sidebar/Footer.tsx +28 -0
- package/src/client/components/layout/session-sidebar/Header.tsx +29 -0
- package/src/client/components/layout/session-sidebar/Modals.tsx +209 -0
- package/src/client/components/layout/session-sidebar/SessionItem.tsx +145 -0
- package/src/client/components/layout/session-sidebar/SessionList.tsx +52 -0
- package/src/client/components/layout/session-sidebar/Skeleton.tsx +36 -0
- package/src/client/components/layout/session-sidebar/SubagentList.tsx +152 -0
- package/src/client/components/layout/session-sidebar/Toolbar.tsx +123 -0
- package/src/client/components/layout/session-sidebar/about-modal/SocialLinks.tsx +43 -0
- package/src/client/components/layout/session-sidebar/about-modal/UpdateSection.tsx +172 -0
- package/src/client/components/layout/session-sidebar/about-modal/index.tsx +63 -0
- package/src/client/components/layout/session-sidebar/index.tsx +174 -0
- package/src/client/components/mobile/LayoutWrapper.tsx +221 -0
- package/src/client/components/mobile/MainView.tsx +68 -0
- package/src/client/components/mobile/RightSidebar.tsx +217 -0
- package/src/client/components/mobile/SessionSidebar.tsx +175 -0
- package/src/client/components/mobile/mobile-main-view/Header.tsx +264 -0
- package/src/client/components/mobile/mobile-right-sidebar/FullDiff.tsx +80 -0
- package/src/client/components/mobile/mobile-right-sidebar/FullEditor.tsx +141 -0
- package/src/client/components/mobile/mobile-right-sidebar/Header.tsx +121 -0
- package/src/client/components/mobile/mobile-session-sidebar/Footer.tsx +69 -0
- package/src/client/components/mobile/mobile-session-sidebar/Header.tsx +34 -0
- package/src/client/components/mobile/mobile-session-sidebar/Item.tsx +168 -0
- package/src/client/components/mobile/mobile-session-sidebar/List.tsx +53 -0
- package/src/client/components/mobile/mobile-session-sidebar/SessionRow.tsx +99 -0
- package/src/client/components/mobile/mobile-session-sidebar/Skeleton.tsx +36 -0
- package/src/client/components/mobile/mobile-session-sidebar/Toolbar.tsx +176 -0
- package/src/client/components/settings/LoadingState.tsx +22 -0
- package/src/client/components/settings/Modal.tsx +277 -0
- package/src/client/components/settings/ProjectSelectorDropdown.tsx +142 -0
- package/src/client/components/settings/SettingsSidebarList.tsx +122 -0
- package/src/client/components/settings/Sidebar.tsx +153 -0
- package/src/client/components/settings/categories/AgentSettings.tsx +84 -0
- package/src/client/components/settings/categories/AppearanceSettings.tsx +50 -0
- package/src/client/components/settings/categories/BehaviorSettings.tsx +73 -0
- package/src/client/components/settings/categories/ChatSettings.tsx +24 -0
- package/src/client/components/settings/categories/CommandSettings.tsx +81 -0
- package/src/client/components/settings/categories/McpSettings.tsx +142 -0
- package/src/client/components/settings/categories/NotificationSettings.tsx +97 -0
- package/src/client/components/settings/categories/OmpSettings.tsx +312 -0
- package/src/client/components/settings/categories/OtherSettings.tsx +16 -0
- package/src/client/components/settings/categories/ProjectSettings.tsx +176 -0
- package/src/client/components/settings/categories/ProviderSettings.tsx +146 -0
- package/src/client/components/settings/categories/SkillCatalogSettings.tsx +309 -0
- package/src/client/components/settings/categories/SkillSettings.tsx +69 -0
- package/src/client/components/settings/categories/TokenUsageSettings.tsx +264 -0
- package/src/client/components/settings/categories/UsageSettings.tsx +77 -0
- package/src/client/components/settings/categories/agent-settings/DetailPane.tsx +333 -0
- package/src/client/components/settings/categories/agent-settings/SidebarList.tsx +42 -0
- package/src/client/components/settings/categories/behavior-settings/Editor.tsx +244 -0
- package/src/client/components/settings/categories/chat-settings/FollowUpSection.tsx +120 -0
- package/src/client/components/settings/categories/chat-settings/KeybindingsSection.tsx +107 -0
- package/src/client/components/settings/categories/chat-settings/TransportSection.tsx +101 -0
- package/src/client/components/settings/categories/command-settings/DetailPane.tsx +292 -0
- package/src/client/components/settings/categories/command-settings/SidebarList.tsx +39 -0
- package/src/client/components/settings/categories/mcp-settings/ConnectionTest.tsx +89 -0
- package/src/client/components/settings/categories/mcp-settings/DetailPane.tsx +311 -0
- package/src/client/components/settings/categories/mcp-settings/ImportModal.tsx +161 -0
- package/src/client/components/settings/categories/mcp-settings/SidebarList.tsx +120 -0
- package/src/client/components/settings/categories/omp-settings/ConfigTabs.tsx +243 -0
- package/src/client/components/settings/categories/omp-settings/ExtensionsPanel.tsx +61 -0
- package/src/client/components/settings/categories/omp-settings/RoleEditor.tsx +66 -0
- package/src/client/components/settings/categories/omp-settings/RowEditor.tsx +337 -0
- package/src/client/components/settings/categories/project-settings/AccentPalette.tsx +76 -0
- package/src/client/components/settings/categories/project-settings/DetailsForm.tsx +71 -0
- package/src/client/components/settings/categories/project-settings/DetailsHeader.tsx +38 -0
- package/src/client/components/settings/categories/project-settings/IconGrid.tsx +152 -0
- package/src/client/components/settings/categories/project-settings/ModelDropdown.tsx +95 -0
- package/src/client/components/settings/categories/project-settings/NameInput.tsx +26 -0
- package/src/client/components/settings/categories/project-settings/SidebarList.tsx +100 -0
- package/src/client/components/settings/categories/provider-settings/AddProviderModal.tsx +201 -0
- package/src/client/components/settings/categories/provider-settings/AuthSection.tsx +121 -0
- package/src/client/components/settings/categories/provider-settings/Header.tsx +22 -0
- package/src/client/components/settings/categories/provider-settings/Icons.tsx +35 -0
- package/src/client/components/settings/categories/provider-settings/LoginModal.tsx +224 -0
- package/src/client/components/settings/categories/provider-settings/ModelCapabilitiesModal.tsx +114 -0
- package/src/client/components/settings/categories/provider-settings/ModelConfigModal.tsx +155 -0
- package/src/client/components/settings/categories/provider-settings/ModelsList.tsx +191 -0
- package/src/client/components/settings/categories/provider-settings/ReconnectModal.tsx +163 -0
- package/src/client/components/settings/categories/provider-settings/SidebarList.tsx +133 -0
- package/src/client/components/settings/categories/skill-catalog/AddSourceModal.tsx +133 -0
- package/src/client/components/settings/categories/skill-settings/DetailPane.tsx +210 -0
- package/src/client/components/settings/categories/skill-settings/SidebarList.tsx +164 -0
- package/src/client/components/settings/categories/token-usage-settings/Breakdown.tsx +127 -0
- package/src/client/components/settings/categories/token-usage-settings/Chart.tsx +74 -0
- package/src/client/components/settings/categories/token-usage-settings/MetricsGrid.tsx +44 -0
- package/src/client/components/settings/categories/usage-settings/DeepSeekCard.tsx +66 -0
- package/src/client/components/settings/categories/usage-settings/KenariCard.tsx +68 -0
- package/src/client/components/settings/categories/usage-settings/ProviderCard.tsx +52 -0
- package/src/client/components/settings/categories/usage-settings/ProviderDetail.tsx +39 -0
- package/src/client/components/settings/categories/usage-settings/QuotaSection.tsx +93 -0
- package/src/client/components/settings/categories/usage-settings/SidebarList.tsx +77 -0
- package/src/client/components/settings/categories/usage-settings/UsageTable.tsx +66 -0
- package/src/client/components/settings/categories/usage-settings/format.ts +63 -0
- package/src/client/components/settings/categories/usage-settings/providers.ts +45 -0
- package/src/client/components/workspace/SearchPanel.tsx +259 -0
- package/src/client/components/workspace/browser-panel/ActivityToasts.tsx +46 -0
- package/src/client/components/workspace/browser-panel/AddressBar.tsx +84 -0
- package/src/client/components/workspace/browser-panel/Screencast.tsx +109 -0
- package/src/client/components/workspace/browser-panel/index.tsx +69 -0
- package/src/client/components/workspace/browser-toolbar/ZoomControls.tsx +48 -0
- package/src/client/components/workspace/browser-toolbar/index.tsx +140 -0
- package/src/client/components/workspace/chat-timeline/AiMessageFooter.tsx +250 -0
- package/src/client/components/workspace/chat-timeline/AttachmentChips.tsx +119 -0
- package/src/client/components/workspace/chat-timeline/ComposerDock.tsx +121 -0
- package/src/client/components/workspace/chat-timeline/EmptyWorkspacePrompt.tsx +220 -0
- package/src/client/components/workspace/chat-timeline/GeneratingIndicator.tsx +94 -0
- package/src/client/components/workspace/chat-timeline/MessageItem.tsx +321 -0
- package/src/client/components/workspace/chat-timeline/MessageList.tsx +122 -0
- package/src/client/components/workspace/chat-timeline/MinimapShortcuts.tsx +47 -0
- package/src/client/components/workspace/chat-timeline/NewChatModal.tsx +69 -0
- package/src/client/components/workspace/chat-timeline/QueueList.tsx +94 -0
- package/src/client/components/workspace/chat-timeline/SessionSkeleton.tsx +89 -0
- package/src/client/components/workspace/chat-timeline/SubagentView.tsx +148 -0
- package/src/client/components/workspace/chat-timeline/SystemNotice.tsx +209 -0
- package/src/client/components/workspace/chat-timeline/TaskResultContent.tsx +175 -0
- package/src/client/components/workspace/chat-timeline/ThinkingSection.tsx +130 -0
- package/src/client/components/workspace/chat-timeline/TimelineBody.tsx +130 -0
- package/src/client/components/workspace/chat-timeline/ToolCallCard.tsx +291 -0
- package/src/client/components/workspace/chat-timeline/ToolCallingSection.tsx +96 -0
- package/src/client/components/workspace/chat-timeline/UndoConfirmModal.tsx +83 -0
- package/src/client/components/workspace/chat-timeline/chat-input/AccessDropdown.tsx +53 -0
- package/src/client/components/workspace/chat-timeline/chat-input/AttachmentToolbar.tsx +63 -0
- package/src/client/components/workspace/chat-timeline/chat-input/ThinkingLevelDropdown.tsx +49 -0
- package/src/client/components/workspace/chat-timeline/chat-input/Toolbar.tsx +108 -0
- package/src/client/components/workspace/chat-timeline/chat-input/access-levels.ts +14 -0
- package/src/client/components/workspace/chat-timeline/chat-input/index.tsx +341 -0
- package/src/client/components/workspace/chat-timeline/index.tsx +290 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/ask-dialog/Footer.tsx +97 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/ask-dialog/Header.tsx +52 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/ask-dialog/Lazy.tsx +24 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/ask-dialog/SelectBody.tsx +110 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/ask-dialog/index.tsx +321 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/hashline-patch/index.tsx +92 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/index.tsx +160 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Ask.tsx +205 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/AstEdit.tsx +202 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Bash.tsx +223 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Checkpoint.tsx +49 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/ContextNotes.tsx +66 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Debug.tsx +91 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Edit.tsx +288 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Eval.tsx +202 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Github.tsx +91 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Goal.tsx +247 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Hub.tsx +273 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Lsp.tsx +276 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/ManageSkill.tsx +93 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Mcp.tsx +143 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Memory.tsx +93 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Read.tsx +246 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Resolve.tsx +96 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/SearchFs.tsx +132 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/SearchTool.tsx +317 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/SecurityScan.tsx +102 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/TaskResult.tsx +240 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Think.tsx +52 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Todo.tsx +141 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/WebSearch.tsx +118 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/DiffView.tsx +150 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/FallbackOutput.tsx +107 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/JsonCodeBlock.tsx +79 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/ToolCardShell.tsx +151 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/read-line-meta.ts +95 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/tool-input.ts +18 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/truncate.ts +18 -0
- package/src/client/components/workspace/context-panel/CostBreakdownPopover.tsx +74 -0
- package/src/client/components/workspace/context-panel/LastMessageCard.tsx +34 -0
- package/src/client/components/workspace/context-panel/RawJsonViewer.tsx +94 -0
- package/src/client/components/workspace/context-panel/RawMessagesList.tsx +293 -0
- package/src/client/components/workspace/context-panel/StatsGrid.tsx +64 -0
- package/src/client/components/workspace/context-panel/TokenDistributionBar.tsx +62 -0
- package/src/client/components/workspace/context-panel/WindowCard.tsx +35 -0
- package/src/client/components/workspace/context-panel/index.tsx +142 -0
- package/src/client/components/workspace/context-panel/raw-messages.ts +54 -0
- package/src/client/components/workspace/diff-panel/SplitView.tsx +165 -0
- package/src/client/components/workspace/diff-panel/Toolbar.tsx +177 -0
- package/src/client/components/workspace/diff-panel/UnifiedView.tsx +117 -0
- package/src/client/components/workspace/diff-panel/index.tsx +213 -0
- package/src/client/components/workspace/editor/Tabs.tsx +149 -0
- package/src/client/components/workspace/editor/Toolbar.tsx +90 -0
- package/src/client/components/workspace/editor/index.tsx +189 -0
- package/src/client/components/workspace/file-explorer/GitRepoDropdown.tsx +143 -0
- package/src/client/components/workspace/file-explorer/Modals.tsx +236 -0
- package/src/client/components/workspace/file-explorer/TreeItem.tsx +289 -0
- package/src/client/components/workspace/file-explorer/index.tsx +193 -0
- package/src/client/components/workspace/git-panel/BranchToolbar.tsx +188 -0
- package/src/client/components/workspace/git-panel/ChangesList.tsx +168 -0
- package/src/client/components/workspace/git-panel/CommitBox.tsx +48 -0
- package/src/client/components/workspace/git-panel/FileItem.tsx +91 -0
- package/src/client/components/workspace/git-panel/Modals.tsx +97 -0
- package/src/client/components/workspace/git-panel/RepoHeader.tsx +137 -0
- package/src/client/components/workspace/git-panel/TreeItem.tsx +186 -0
- package/src/client/components/workspace/git-panel/TreeView.tsx +36 -0
- package/src/client/components/workspace/git-panel/commit-modal/CommitActions.tsx +97 -0
- package/src/client/components/workspace/git-panel/commit-modal/CommitDiffViewer.tsx +205 -0
- package/src/client/components/workspace/git-panel/commit-modal/CommitRow.tsx +179 -0
- package/src/client/components/workspace/git-panel/commit-modal/GraphCanvas.tsx +164 -0
- package/src/client/components/workspace/git-panel/commit-modal/Header.tsx +127 -0
- package/src/client/components/workspace/git-panel/commit-modal/index.tsx +269 -0
- package/src/client/components/workspace/git-panel/index.tsx +326 -0
- package/src/client/components/workspace/model-dropdown/Footer.tsx +21 -0
- package/src/client/components/workspace/model-dropdown/Header.tsx +50 -0
- package/src/client/components/workspace/model-dropdown/Item.tsx +137 -0
- package/src/client/components/workspace/model-dropdown/Panel.tsx +146 -0
- package/src/client/components/workspace/model-dropdown/Section.tsx +87 -0
- package/src/client/components/workspace/model-dropdown/Skeleton.tsx +39 -0
- package/src/client/components/workspace/model-dropdown/SpecsTooltip.tsx +91 -0
- package/src/client/components/workspace/model-dropdown/groups.ts +62 -0
- package/src/client/components/workspace/model-dropdown/index.tsx +245 -0
- package/src/client/components/workspace/model-dropdown/use-catalog.ts +111 -0
- package/src/client/components/workspace/terminal-panel/Header.tsx +50 -0
- package/src/client/components/workspace/terminal-panel/InputBar.tsx +82 -0
- package/src/client/components/workspace/terminal-panel/LogEntry.tsx +70 -0
- package/src/client/components/workspace/terminal-panel/QuickActions.tsx +39 -0
- package/src/client/components/workspace/terminal-panel/RealtimeXtermView.tsx +340 -0
- package/src/client/components/workspace/terminal-panel/index.tsx +110 -0
- package/src/client/components/workspace/usage-panel/ProviderSelect.tsx +208 -0
- package/src/client/components/workspace/usage-panel/index.tsx +98 -0
- package/src/client/components/workspace/user-browser-panel/AddressBar.tsx +134 -0
- package/src/client/components/workspace/user-browser-panel/Frame.tsx +72 -0
- package/src/client/components/workspace/user-browser-panel/index.tsx +87 -0
- package/src/client/data/agent-data/builtin.ts +31 -0
- package/src/client/data/agent-data/index.ts +10 -0
- package/src/client/data/agent-data/orchestrator.ts +113 -0
- package/src/client/data/agent-data/specialist.ts +245 -0
- package/src/client/data/context-data/index.test.ts +88 -0
- package/src/client/data/context-data/index.ts +310 -0
- package/src/client/data/context-data/presets.ts +128 -0
- package/src/client/data/mock/chat.ts +236 -0
- package/src/client/data/mock/git-commits.ts +304 -0
- package/src/client/data/mock/subagents.ts +212 -0
- package/src/client/data/mock/token-usage.ts +129 -0
- package/src/client/data/models/catalog.ts +293 -0
- package/src/client/data/samples/dialogue-session.ts +285 -0
- package/src/client/data/samples/sample-subagents/scout-raw.ts +341 -0
- package/src/client/data/samples/sample-subagents/sleeper-raw.ts +294 -0
- package/src/client/data/samples/sample-tools/built-in-part1.ts +265 -0
- package/src/client/data/samples/sample-tools/built-in-part2.ts +180 -0
- package/src/client/data/samples/sample-tools/other.ts +162 -0
- package/src/client/data/samples/subagent-session.ts +99 -0
- package/src/client/data/samples/tools-session.ts +85 -0
- package/src/client/data/samples/virtual-devices-session.ts +333 -0
- package/src/client/data/settings/behavior.ts +12 -0
- package/src/client/data/settings/command.ts +188 -0
- package/src/client/data/settings/mcp.ts +28 -0
- package/src/client/data/settings/omp-schema.json +1 -0
- package/src/client/data/settings/project.ts +58 -0
- package/src/client/data/settings/provider.ts +185 -0
- package/src/client/data/settings/skill.ts +340 -0
- package/src/client/data/theme/terminal.ts +150 -0
- package/src/client/hooks/browser/use-screencast.ts +178 -0
- package/src/client/hooks/browser/use-user-browser.ts +105 -0
- package/src/client/hooks/chat/composer/index.ts +181 -0
- package/src/client/hooks/chat/composer/items.ts +47 -0
- package/src/client/hooks/chat/omp/index.ts +348 -0
- package/src/client/hooks/chat/omp/revalidation-throttle.ts +71 -0
- package/src/client/hooks/chat/omp/session-list.tsx +148 -0
- package/src/client/hooks/chat/omp/session-sidebar-controller.ts +249 -0
- package/src/client/hooks/chat/omp/session-statuses.ts +83 -0
- package/src/client/hooks/chat/omp/status.ts +31 -0
- package/src/client/hooks/chat/omp/stream-poll.ts +37 -0
- package/src/client/hooks/chat/omp/stream.ts +108 -0
- package/src/client/hooks/chat/stream.ts +228 -0
- package/src/client/hooks/chat/subagent/index.ts +290 -0
- package/src/client/hooks/chat/timeline/actions.ts +322 -0
- package/src/client/hooks/chat/timeline/auto-scroll.ts +58 -0
- package/src/client/hooks/chat/timeline/browser-context.ts +40 -0
- package/src/client/hooks/chat/timeline/extension-dialog.ts +56 -0
- package/src/client/hooks/chat/timeline/index.ts +333 -0
- package/src/client/hooks/chat/timeline/queue.ts +87 -0
- package/src/client/hooks/chat/timeline/scroll.ts +134 -0
- package/src/client/hooks/chat/timeline/send.ts +348 -0
- package/src/client/hooks/chat/timeline/session-load.ts +334 -0
- package/src/client/hooks/chat/timeline/session-title.ts +40 -0
- package/src/client/hooks/chat/timeline/subagent-view.ts +92 -0
- package/src/client/hooks/chat/timeline/undo-confirmation.ts +29 -0
- package/src/client/hooks/editor/use-file-editor.ts +302 -0
- package/src/client/hooks/models/use-model-names.ts +17 -0
- package/src/client/hooks/models/use-models-catalog.ts +45 -0
- package/src/client/hooks/models/use-provider-names.ts +18 -0
- package/src/client/hooks/settings/crud-list.ts +187 -0
- package/src/client/hooks/settings/instruction-file.ts +91 -0
- package/src/client/hooks/settings/providers.ts +295 -0
- package/src/client/hooks/settings/skill-catalog.ts +37 -0
- package/src/client/hooks/settings/use-chamber-setting.ts +12 -0
- package/src/client/hooks/settings/useUsageReport.ts +41 -0
- package/src/client/hooks/ui/clipboard.ts +33 -0
- package/src/client/hooks/ui/copy-flag.ts +27 -0
- package/src/client/hooks/ui/inline-rename.ts +93 -0
- package/src/client/hooks/ui/notification-sound.ts +108 -0
- package/src/client/hooks/ui/on-click-outside.ts +22 -0
- package/src/client/hooks/ui/open-file.ts +42 -0
- package/src/client/hooks/ui/scrollbar-fade.ts +33 -0
- package/src/client/hooks/ui/show-more.ts +23 -0
- package/src/client/hooks/ui/syntax-ready.ts +17 -0
- package/src/client/hooks/ui/theme.ts +76 -0
- package/src/client/hooks/ui/toasts.ts +22 -0
- package/src/client/hooks/ui/updates.ts +108 -0
- package/src/client/hooks/ui/visibility-refresh.ts +66 -0
- package/src/client/hooks/ui/window-event.ts +52 -0
- package/src/client/hooks/workspace/commit-interactions.ts +111 -0
- package/src/client/hooks/workspace/commit-pagination.ts +106 -0
- package/src/client/hooks/workspace/file-tabs.ts +136 -0
- package/src/client/hooks/workspace/git-status.ts +89 -0
- package/src/client/hooks/workspace/git-tree.ts +146 -0
- package/src/client/hooks/workspace/panel-refresh.ts +72 -0
- package/src/client/hooks/workspace/panel-widths.ts +59 -0
- package/src/client/hooks/workspace/search-stream.ts +76 -0
- package/src/client/hooks/workspace/session-state/context.ts +15 -0
- package/src/client/hooks/workspace/session-state/index.ts +62 -0
- package/src/client/hooks/workspace/terminal-output.ts +66 -0
- package/src/client/hooks/workspace/terminal.ts +283 -0
- package/src/client/hooks/workspace/workspace-folder-actions.ts +110 -0
- package/src/client/lib/router/fetcher.ts +100 -0
- package/src/client/lib/router/search-params.ts +82 -0
- package/src/client/main.tsx +23 -0
- package/src/client/tailwind.css +364 -0
- package/src/server/db.server.ts +338 -0
- package/src/server/index.ts +19 -0
- package/src/server/lib/browser/runtime.test.ts +110 -0
- package/src/server/lib/browser/runtime.ts +160 -0
- package/src/server/lib/chat/session-store.server.ts +61 -0
- package/src/server/lib/db/client.ts +55 -0
- package/src/server/lib/db/settings-store.ts +148 -0
- package/src/server/lib/fs/atomic-write.ts +27 -0
- package/src/server/lib/fs/git-diff.ts +116 -0
- package/src/server/lib/fs/git-log.ts +174 -0
- package/src/server/lib/fs/repo-scope.ts +14 -0
- package/src/server/lib/fs/root.ts +77 -0
- package/src/server/lib/fs/shell.ts +71 -0
- package/src/server/lib/fs/terminal-cwd.ts +49 -0
- package/src/server/lib/models/provider-registry.server.ts +269 -0
- package/src/server/lib/omp/config/agents.ts +162 -0
- package/src/server/lib/omp/config/behavior.ts +113 -0
- package/src/server/lib/omp/config/config-cli.ts +94 -0
- package/src/server/lib/omp/config/disabled-providers.ts +68 -0
- package/src/server/lib/omp/config/extensions.ts +90 -0
- package/src/server/lib/omp/config/instructions.ts +81 -0
- package/src/server/lib/omp/config/mcp-test.ts +346 -0
- package/src/server/lib/omp/config/mcp.ts +258 -0
- package/src/server/lib/omp/config/providers.ts +276 -0
- package/src/server/lib/omp/config/roles.ts +46 -0
- package/src/server/lib/omp/config/skills-catalog.ts +93 -0
- package/src/server/lib/omp/config/skills.ts +118 -0
- package/src/server/lib/omp/config/yaml.ts +48 -0
- package/src/server/lib/omp/core/auth-credentials.ts +87 -0
- package/src/server/lib/omp/core/cli.ts +69 -0
- package/src/server/lib/omp/core/paths.ts +154 -0
- package/src/server/lib/omp/core/registry.ts +140 -0
- package/src/server/lib/omp/core/worktree.ts +106 -0
- package/src/server/lib/omp/rpc/constants.ts +185 -0
- package/src/server/lib/omp/rpc/errors.ts +27 -0
- package/src/server/lib/omp/rpc/kill-tree.ts +49 -0
- package/src/server/lib/omp/rpc/lines.ts +38 -0
- package/src/server/lib/omp/rpc/manager.ts +310 -0
- package/src/server/lib/omp/rpc/pending-ui-dialogs.ts +55 -0
- package/src/server/lib/omp/rpc/process-helpers.ts +82 -0
- package/src/server/lib/omp/rpc/process.ts +319 -0
- package/src/server/lib/omp/rpc/session-commands.ts +218 -0
- package/src/server/lib/omp/rpc/session-registry.ts +300 -0
- package/src/server/lib/omp/rpc/utility.ts +199 -0
- package/src/server/lib/omp/rpc/web-state.ts +94 -0
- package/src/server/lib/omp/session/files.ts +282 -0
- package/src/server/lib/omp/session/locator.ts +60 -0
- package/src/server/lib/omp/session/messages.ts +222 -0
- package/src/server/lib/omp/session/reader.ts +150 -0
- package/src/server/lib/omp/session/sidebar-data.server.ts +195 -0
- package/src/server/lib/omp/session/stats.ts +85 -0
- package/src/server/lib/omp/session/subagent-presence.ts +74 -0
- package/src/server/lib/omp/session/telemetry/compute.ts +188 -0
- package/src/server/lib/omp/session/telemetry/format.ts +110 -0
- package/src/server/lib/omp/session/telemetry/index.ts +4 -0
- package/src/server/lib/omp/session/telemetry/scan.ts +21 -0
- package/src/server/lib/omp/session/telemetry-raw.ts +96 -0
- package/src/server/lib/omp/session/telemetry.test.ts +154 -0
- package/src/server/lib/omp/session/title-slot.ts +203 -0
- package/src/server/lib/omp/session/usage.ts +298 -0
- package/src/server/lib/omp/subagent/history/fold.ts +196 -0
- package/src/server/lib/omp/subagent/history/index.ts +110 -0
- package/src/server/lib/omp/subagent/history/paths.ts +29 -0
- package/src/server/lib/omp/subagent/history/transcript.test.ts +87 -0
- package/src/server/lib/omp/subagent/history/transcript.ts +122 -0
- package/src/server/lib/remix-compat.ts +29 -0
- package/src/server/lib/route-adapter.ts +144 -0
- package/src/server/lib/sse.ts +248 -0
- package/src/server/lib/updates/apply.ts +46 -0
- package/src/server/lib/updates/check.ts +41 -0
- package/src/server/lib/updates/github.ts +71 -0
- package/src/server/lib/updates/install-method.ts +73 -0
- package/src/server/lib/updates/install.test.ts +74 -0
- package/src/server/lib/updates/install.ts +294 -0
- package/src/server/lib/updates/omp.ts +86 -0
- package/src/server/lib/usage/deepseek.ts +59 -0
- package/src/server/lib/usage/kenari.ts +251 -0
- package/src/server/lib/usage/provider-key.ts +83 -0
- package/src/server/mock.server.ts +33 -0
- package/src/server/plugins/compress.ts +51 -0
- package/src/server/plugins/dev-assets.ts +49 -0
- package/src/server/plugins/ssr.ts +100 -0
- package/src/server/plugins/static.ts +81 -0
- package/src/server/routes/agent/command.ts +81 -0
- package/src/server/routes/agent/events.ts +56 -0
- package/src/server/routes/agent/index.ts +12 -0
- package/src/server/routes/agent/new.ts +83 -0
- package/src/server/routes/agent/prewarm.ts +27 -0
- package/src/server/routes/agent/ws.ts +168 -0
- package/src/server/routes/browser/index.ts +6 -0
- package/src/server/routes/browser/stream.ts +217 -0
- package/src/server/routes/chat/index.ts +12 -0
- package/src/server/routes/chat/rewind.ts +162 -0
- package/src/server/routes/chat/root.ts +78 -0
- package/src/server/routes/chat/session.ts +339 -0
- package/src/server/routes/chat/stream.ts +111 -0
- package/src/server/routes/files/index.ts +10 -0
- package/src/server/routes/files/root.ts +29 -0
- package/src/server/routes/files/toggle.ts +20 -0
- package/src/server/routes/folders/create.ts +98 -0
- package/src/server/routes/folders/folder.ts +78 -0
- package/src/server/routes/folders/index.ts +16 -0
- package/src/server/routes/fs/action.ts +84 -0
- package/src/server/routes/fs/git.ts +334 -0
- package/src/server/routes/fs/index.ts +19 -0
- package/src/server/routes/fs/read.ts +258 -0
- package/src/server/routes/fs/replace.ts +69 -0
- package/src/server/routes/fs/search.ts +135 -0
- package/src/server/routes/fs/validate.ts +61 -0
- package/src/server/routes/health/index.ts +6 -0
- package/src/server/routes/health/probe.ts +27 -0
- package/src/server/routes/index.ts +38 -0
- package/src/server/routes/models/index.ts +8 -0
- package/src/server/routes/models/roles.ts +31 -0
- package/src/server/routes/models/root.ts +328 -0
- package/src/server/routes/omp/commands.ts +29 -0
- package/src/server/routes/omp/extensions.ts +34 -0
- package/src/server/routes/omp/index.ts +20 -0
- package/src/server/routes/omp/login.ts +112 -0
- package/src/server/routes/omp/plugins.ts +82 -0
- package/src/server/routes/omp/pricing.ts +65 -0
- package/src/server/routes/omp/session-stats.ts +30 -0
- package/src/server/routes/omp/sidebar.ts +40 -0
- package/src/server/routes/omp/state.ts +22 -0
- package/src/server/routes/sessions/folder.ts +16 -0
- package/src/server/routes/sessions/index.ts +25 -0
- package/src/server/routes/sessions/list.ts +23 -0
- package/src/server/routes/sessions/session.ts +331 -0
- package/src/server/routes/sessions/subagents.ts +82 -0
- package/src/server/routes/settings/agents.ts +128 -0
- package/src/server/routes/settings/behavior.ts +125 -0
- package/src/server/routes/settings/commands.ts +89 -0
- package/src/server/routes/settings/index.ts +28 -0
- package/src/server/routes/settings/mcp-test.ts +71 -0
- package/src/server/routes/settings/mcp.ts +261 -0
- package/src/server/routes/settings/omp-config.ts +47 -0
- package/src/server/routes/settings/projects.ts +84 -0
- package/src/server/routes/settings/provider-models.ts +278 -0
- package/src/server/routes/settings/providers.ts +137 -0
- package/src/server/routes/settings/root.ts +40 -0
- package/src/server/routes/settings/skills.ts +175 -0
- package/src/server/routes/settings/usage.ts +81 -0
- package/src/server/routes/telemetry/context.ts +52 -0
- package/src/server/routes/telemetry/index.ts +10 -0
- package/src/server/routes/telemetry/raw-messages.ts +80 -0
- package/src/server/routes/telemetry/tokens.ts +163 -0
- package/src/server/routes/terminal/index.ts +8 -0
- package/src/server/routes/terminal/run.ts +135 -0
- package/src/server/routes/terminal/stream.ts +100 -0
- package/src/server/routes/updates/apply.ts +25 -0
- package/src/server/routes/updates/check.ts +27 -0
- package/src/server/routes/updates/index.ts +8 -0
- package/src/server/routes/well-known/devtools.ts +9 -0
- package/src/server/routes/well-known/index.ts +6 -0
- package/src/shared/lib/browser/activity.ts +115 -0
- package/src/shared/lib/browser/cdp.ts +201 -0
- package/src/shared/lib/browser/connection.ts +81 -0
- package/src/shared/lib/browser/observer.ts +129 -0
- package/src/shared/lib/browser/page-context.ts +20 -0
- package/src/shared/lib/browser/targets.test.ts +45 -0
- package/src/shared/lib/browser/targets.ts +74 -0
- package/src/shared/lib/browser/url.ts +21 -0
- package/src/shared/lib/browser/util.ts +20 -0
- package/src/shared/lib/browser/viewer.ts +303 -0
- package/src/shared/lib/browser/watcher.ts +75 -0
- package/src/shared/lib/chat/attachments.ts +62 -0
- package/src/shared/lib/chat/capitalize.ts +9 -0
- package/src/shared/lib/chat/composer/client.ts +210 -0
- package/src/shared/lib/chat/composer/filter.ts +62 -0
- package/src/shared/lib/chat/composer/translate.ts +103 -0
- package/src/shared/lib/chat/composer/trigger.ts +53 -0
- package/src/shared/lib/chat/detect-format.ts +38 -0
- package/src/shared/lib/chat/duration.ts +82 -0
- package/src/shared/lib/chat/omp/agent-events.test.ts +152 -0
- package/src/shared/lib/chat/omp/agent-events.ts +347 -0
- package/src/shared/lib/chat/omp/file-mutations.ts +42 -0
- package/src/shared/lib/chat/omp/socket.ts +95 -0
- package/src/shared/lib/chat/omp/sse.ts +53 -0
- package/src/shared/lib/chat/omp/status.ts +45 -0
- package/src/shared/lib/chat/omp/transport.ts +50 -0
- package/src/shared/lib/chat/order.ts +40 -0
- package/src/shared/lib/chat/read-sse.ts +99 -0
- package/src/shared/lib/chat/stream-service.ts +273 -0
- package/src/shared/lib/chat/task-result-parser.ts +166 -0
- package/src/shared/lib/chat/timeline/omp-callbacks.ts +293 -0
- package/src/shared/lib/chat/timeline/stream-callbacks.ts +202 -0
- package/src/shared/lib/chat/timeline/stream-raf.ts +59 -0
- package/src/shared/lib/chat/timeline/tool-phrases.ts +224 -0
- package/src/shared/lib/chat/timeline/tool-verbs.ts +160 -0
- package/src/shared/lib/chat/timeline/turns.ts +30 -0
- package/src/shared/lib/chat/title-case.ts +293 -0
- package/src/shared/lib/chat/todo-parser.ts +257 -0
- package/src/shared/lib/chat/tool-status.ts +20 -0
- package/src/shared/lib/code/ansi.ts +24 -0
- package/src/shared/lib/code/editor-utils.ts +16 -0
- package/src/shared/lib/code/format.ts +17 -0
- package/src/shared/lib/code/highlighter.ts +135 -0
- package/src/shared/lib/code/parser.ts +237 -0
- package/src/shared/lib/code/shiki-langs.ts +93 -0
- package/src/shared/lib/code/shiki-themes.ts +14 -0
- package/src/shared/lib/code/syntax-highlight.test.ts +153 -0
- package/src/shared/lib/code/syntax-highlight.ts +290 -0
- package/src/shared/lib/db/transaction.server.ts +20 -0
- package/src/shared/lib/format/number.ts +69 -0
- package/src/shared/lib/format/time.ts +39 -0
- package/src/shared/lib/fs/diff-parser.ts +135 -0
- package/src/shared/lib/fs/file-tree.ts +26 -0
- package/src/shared/lib/fs/git-graph.ts +184 -0
- package/src/shared/lib/fs/git-status.ts +161 -0
- package/src/shared/lib/markdown/marked.ts +228 -0
- package/src/shared/lib/markdown/mermaid.ts +153 -0
- package/src/shared/lib/markdown/sanitize.ts +138 -0
- package/src/shared/lib/models/catalog.ts +88 -0
- package/src/shared/lib/models/client.ts +51 -0
- package/src/shared/lib/models/identity.ts +21 -0
- package/src/shared/lib/models/provider-cleanup.ts +20 -0
- package/src/shared/lib/models/provider-connection.ts +41 -0
- package/src/shared/lib/models/provider-label.ts +40 -0
- package/src/shared/lib/models/provider-models.ts +97 -0
- package/src/shared/lib/models/provider-presets.ts +29 -0
- package/src/shared/lib/models/remote-list.ts +125 -0
- package/src/shared/lib/models/server-cache.ts +27 -0
- package/src/shared/lib/models/thinking-levels.ts +68 -0
- package/src/shared/lib/omp/config/access-mode.server.ts +27 -0
- package/src/shared/lib/omp/config/access-mode.ts +31 -0
- package/src/shared/lib/omp/config/schema-extras.ts +230 -0
- package/src/shared/lib/omp/config/schema-types.ts +49 -0
- package/src/shared/lib/omp/config/schema.ts +81 -0
- package/src/shared/lib/omp/rpc/frame.ts +134 -0
- package/src/shared/lib/omp/session/default-title.test.ts +50 -0
- package/src/shared/lib/omp/session/default-title.ts +51 -0
- package/src/shared/lib/omp/session/hashline-patch.test.ts +89 -0
- package/src/shared/lib/omp/session/hashline-patch.ts +134 -0
- package/src/shared/lib/omp/session/jsonl.ts +197 -0
- package/src/shared/lib/omp/session/mapper.ts +145 -0
- package/src/shared/lib/omp/session/messages-map.ts +179 -0
- package/src/shared/lib/omp/session/messages-parse.ts +69 -0
- package/src/shared/lib/omp/session/parse-message-blocks.ts +223 -0
- package/src/shared/lib/omp/session/prewarm.ts +41 -0
- package/src/shared/lib/omp/session/sidebar.ts +77 -0
- package/src/shared/lib/omp/session/stream-state.server.ts +106 -0
- package/src/shared/lib/omp/session/telemetry-blocks.ts +60 -0
- package/src/shared/lib/omp/session/timestamps.ts +20 -0
- package/src/shared/lib/omp/session/turn-error.ts +40 -0
- package/src/shared/lib/omp/subagent/history/client.ts +76 -0
- package/src/shared/lib/omp/subagent/history/settlement.ts +113 -0
- package/src/shared/lib/omp/subagent/history/status.ts +40 -0
- package/src/shared/lib/omp/subagent/parse.ts +284 -0
- package/src/shared/lib/omp/subagent/result-details.ts +53 -0
- package/src/shared/lib/omp/subagent/transcript-client.ts +178 -0
- package/src/shared/lib/settings/client.test.ts +62 -0
- package/src/shared/lib/settings/client.ts +96 -0
- package/src/shared/lib/updates/semver.ts +34 -0
- package/src/shared/lib/util/guards.ts +14 -0
- package/src/shared/lib/workspace/active-project.ts +42 -0
- package/src/shared/lib/workspace/panel-widths.test.ts +72 -0
- package/src/shared/lib/workspace/panel-widths.ts +79 -0
- package/src/shared/lib/workspace/project-icon.ts +29 -0
- package/src/shared/lib/workspace/project-settings-migration.ts +62 -0
- package/src/shared/lib/workspace/project-settings.ts +139 -0
- package/src/shared/lib/workspace/refresh-cadence.ts +128 -0
- package/src/shared/lib/workspace/relative-time.ts +25 -0
- package/src/shared/lib/workspace/right-panels.ts +51 -0
- package/src/shared/lib/workspace/schema-migrations.ts +19 -0
- package/src/shared/lib/workspace/session-state/store.ts +267 -0
- package/src/shared/lib/workspace/sidebar-expanded.ts +23 -0
- package/src/shared/lib/workspace/sidebar-sort.test.ts +200 -0
- package/src/shared/lib/workspace/sidebar-sort.ts +131 -0
- package/src/shared/types/browser.ts +58 -0
- package/src/shared/types/chat.ts +289 -0
- package/src/shared/types/context.ts +87 -0
- package/src/shared/types/fs.ts +36 -0
- package/src/shared/types/git.ts +60 -0
- package/src/shared/types/index.ts +22 -0
- package/src/shared/types/omp/agent.ts +109 -0
- package/src/shared/types/omp/instructions.ts +38 -0
- package/src/shared/types/omp/session.ts +153 -0
- package/src/shared/types/omp/subagent.ts +176 -0
- package/src/shared/types/settings/agent.ts +16 -0
- package/src/shared/types/settings/command.ts +12 -0
- package/src/shared/types/settings/mcp.ts +22 -0
- package/src/shared/types/settings/project.ts +18 -0
- package/src/shared/types/settings/provider.ts +42 -0
- package/src/shared/types/settings/skill.ts +35 -0
- package/src/shared/types/settings/state.ts +59 -0
- package/src/shared/types/settings/usage.ts +99 -0
- package/src/shared/types/terminal.ts +19 -0
- package/src/shared/types/tokenUsage.ts +44 -0
- package/src/shared/types/updates.ts +38 -0
- package/src/shared/types/workspace.ts +56 -0
- package/tsconfig.json +26 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny dependency-free semantic-version helpers for the update checker.
|
|
3
|
+
* Deliberately lenient: it compares numeric dotted segments only and ignores
|
|
4
|
+
* any pre-release suffix, which is all the GitHub/omp version strings need.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** Strip a leading `v`/`V` and surrounding whitespace. */
|
|
8
|
+
export function normalizeVersion(v: string): string {
|
|
9
|
+
return v.trim().replace(/^[vV]/, '');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function toSegments(v: string): number[] {
|
|
13
|
+
const core = normalizeVersion(v).split('-')[0] ?? '';
|
|
14
|
+
return core.split('.').map((segment) => (/^\d+$/.test(segment) ? Number.parseInt(segment, 10) : 0));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Compare two versions: -1 when a < b, 0 when equal, 1 when a > b. */
|
|
18
|
+
export function compareVersions(a: string, b: string): number {
|
|
19
|
+
const left = toSegments(a);
|
|
20
|
+
const right = toSegments(b);
|
|
21
|
+
const length = Math.max(left.length, right.length);
|
|
22
|
+
for (let i = 0; i < length; i += 1) {
|
|
23
|
+
const x = left[i] ?? 0;
|
|
24
|
+
const y = right[i] ?? 0;
|
|
25
|
+
if (x > y) return 1;
|
|
26
|
+
if (x < y) return -1;
|
|
27
|
+
}
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** True when `latest` is strictly newer than `current`. */
|
|
32
|
+
export function isNewer(latest: string, current: string): boolean {
|
|
33
|
+
return compareVersions(latest, current) > 0;
|
|
34
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Dependency-free runtime guards shared by client and server. Kept free of any
|
|
8
|
+
* `node:`/`bun:` import so both bundles can consume it.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** Narrows an unknown value to a plain object (never arrays or null). */
|
|
12
|
+
export function isRecord(value: unknown): value is Record<string, unknown> {
|
|
13
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
14
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { WorkspaceFolderData } from '@/shared/types';
|
|
2
|
+
|
|
3
|
+
export interface ActiveProjectScope {
|
|
4
|
+
folder: WorkspaceFolderData | null;
|
|
5
|
+
/** Registered project root of the selected session's workspace, or null. */
|
|
6
|
+
projectPath: string | null;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Resolve the workspace folder that owns the currently selected session and,
|
|
11
|
+
* when that folder is bound to an oh-my-pi project (project_path), the project
|
|
12
|
+
* root the right-panel developer tools should be scoped to.
|
|
13
|
+
*/
|
|
14
|
+
export function activeProjectForSession(
|
|
15
|
+
folders: WorkspaceFolderData[],
|
|
16
|
+
sessionId: string | number | null | undefined
|
|
17
|
+
): ActiveProjectScope {
|
|
18
|
+
if (!sessionId) return { folder: null, projectPath: null };
|
|
19
|
+
for (const folder of folders) {
|
|
20
|
+
const ownsSession = (folder.sessions || []).some((s) => String(s.id) === String(sessionId));
|
|
21
|
+
if (ownsSession) return { folder, projectPath: folder.project_path ?? null };
|
|
22
|
+
}
|
|
23
|
+
return { folder: null, projectPath: null };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Resolve the workspace root the composer should scope `@` file mentions to:
|
|
28
|
+
* the active session's bound project first, then the explicitly selected
|
|
29
|
+
* folder, else null (client falls back to the app root).
|
|
30
|
+
*/
|
|
31
|
+
export function composerRootFor(
|
|
32
|
+
folders: WorkspaceFolderData[],
|
|
33
|
+
sessionId: string | number | null | undefined,
|
|
34
|
+
selectedFolderId: number | null
|
|
35
|
+
): string | null {
|
|
36
|
+
const bySession = activeProjectForSession(folders, sessionId).folder;
|
|
37
|
+
const byFolder =
|
|
38
|
+
selectedFolderId != null
|
|
39
|
+
? folders.find((f) => String(f.id) === String(selectedFolderId)) ?? null
|
|
40
|
+
: null;
|
|
41
|
+
return (bySession ?? byFolder)?.project_path ?? null;
|
|
42
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, expect, test } from 'bun:test';
|
|
7
|
+
|
|
8
|
+
import { mergePanelWidths, normalizePanelWidths } from '@/shared/lib/workspace/panel-widths';
|
|
9
|
+
|
|
10
|
+
describe('normalizePanelWidths', () => {
|
|
11
|
+
test('keeps every panel slot from a current blob', () => {
|
|
12
|
+
const raw = {
|
|
13
|
+
left: 342,
|
|
14
|
+
chat: 700,
|
|
15
|
+
editor: 620,
|
|
16
|
+
diff: 900,
|
|
17
|
+
right: { files: 300, browser: 804 },
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
expect(normalizePanelWidths(raw, 'files')).toEqual(raw);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('adopts a legacy shared right width into the view that was open', () => {
|
|
24
|
+
const widths = normalizePanelWidths({ left: 342, editor: 620, right: 1091 }, 'browser');
|
|
25
|
+
|
|
26
|
+
expect(widths.right).toEqual({ browser: 1091 });
|
|
27
|
+
expect(widths.left).toBe(342);
|
|
28
|
+
expect(widths.editor).toBe(620);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('drops unusable entries instead of trusting the blob', () => {
|
|
32
|
+
const widths = normalizePanelWidths(
|
|
33
|
+
{ left: -10, chat: '700', editor: 620.4, diff: null, right: { files: 0, bogus: 300, git: 260 } },
|
|
34
|
+
'files',
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
expect(widths).toEqual({ editor: 620, right: { git: 260 } });
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test('tolerates a missing or malformed blob', () => {
|
|
41
|
+
expect(normalizePanelWidths(undefined, 'files')).toEqual({});
|
|
42
|
+
expect(normalizePanelWidths('nonsense', 'files')).toEqual({});
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
describe('mergePanelWidths', () => {
|
|
47
|
+
test('merging one view keeps every other remembered width', () => {
|
|
48
|
+
const stored = {
|
|
49
|
+
left: 342,
|
|
50
|
+
chat: 700,
|
|
51
|
+
editor: 620,
|
|
52
|
+
diff: 900,
|
|
53
|
+
right: { files: 300, git: 260 },
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const merged = mergePanelWidths(stored, { right: { browser: 804 } });
|
|
57
|
+
|
|
58
|
+
expect(merged.right).toEqual({ files: 300, git: 260, browser: 804 });
|
|
59
|
+
expect(merged.left).toBe(342);
|
|
60
|
+
expect(merged.editor).toBe(620);
|
|
61
|
+
expect(merged.diff).toBe(900);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test('a resized panel replaces only its own slot', () => {
|
|
65
|
+
const merged = mergePanelWidths(
|
|
66
|
+
{ chat: 700, editor: 620, diff: 900, right: { files: 300 } },
|
|
67
|
+
{ editor: 480 },
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
expect(merged).toEqual({ chat: 700, editor: 480, diff: 900, right: { files: 300 } });
|
|
71
|
+
});
|
|
72
|
+
});
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-panel width state for the desktop layout.
|
|
3
|
+
*
|
|
4
|
+
* Every resizable surface remembers its OWN width: the session sidebar, the
|
|
5
|
+
* chat column, the editor panel (source and diff tabs separately, since a diff
|
|
6
|
+
* wants room a file view does not) and each right-panel view. Collapsing those
|
|
7
|
+
* into one slot per group is what made switching a panel look like a reset.
|
|
8
|
+
*
|
|
9
|
+
* Sizes are pixels — the unit the panel constraints are written in — and are
|
|
10
|
+
* persisted as `app_settings.desktopLayoutSizes`.
|
|
11
|
+
*/
|
|
12
|
+
import { isRightPanelType, type RightPanelType } from '@/shared/lib/workspace/right-panels';
|
|
13
|
+
|
|
14
|
+
/** The editor panel keeps a separate width while a diff tab is active. */
|
|
15
|
+
export type EditorWidthMode = 'editor' | 'diff';
|
|
16
|
+
|
|
17
|
+
export interface PanelWidths {
|
|
18
|
+
/** Session sidebar. */
|
|
19
|
+
left?: number;
|
|
20
|
+
/** Chat timeline column, the inner stack's first panel. */
|
|
21
|
+
chat?: number;
|
|
22
|
+
/** Editor panel while a source file tab is active. */
|
|
23
|
+
editor?: number;
|
|
24
|
+
/** Editor panel while a diff tab is active. */
|
|
25
|
+
diff?: number;
|
|
26
|
+
/** Right panel, keyed by the activity-bar view it currently shows. */
|
|
27
|
+
right?: Partial<Record<RightPanelType, number>>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Fallbacks for panels that have never been resized. */
|
|
31
|
+
export const DEFAULT_PANEL_WIDTHS: Record<EditorWidthMode | 'left' | 'chat', number> = {
|
|
32
|
+
left: 268,
|
|
33
|
+
chat: 540,
|
|
34
|
+
editor: 536,
|
|
35
|
+
diff: 536,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
function pixelWidth(value: unknown): number | undefined {
|
|
39
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0 ? Math.round(value) : undefined;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Coerce a stored blob into the current shape. Blobs written before per-view
|
|
44
|
+
* widths held the right panel as a single number shared by every view; that
|
|
45
|
+
* number belongs to whichever view was open when it was written, so it seeds
|
|
46
|
+
* `legacyView` alone instead of being copied onto all eight.
|
|
47
|
+
*/
|
|
48
|
+
export function normalizePanelWidths(raw: unknown, legacyView: RightPanelType): PanelWidths {
|
|
49
|
+
if (!raw || typeof raw !== 'object') return {};
|
|
50
|
+
const source = raw as Record<string, unknown>;
|
|
51
|
+
|
|
52
|
+
const widths: PanelWidths = {};
|
|
53
|
+
for (const key of ['left', 'chat', 'editor', 'diff'] as const) {
|
|
54
|
+
const value = pixelWidth(source[key]);
|
|
55
|
+
if (value !== undefined) widths[key] = value;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const right: Partial<Record<RightPanelType, number>> = {};
|
|
59
|
+
if (source.right && typeof source.right === 'object') {
|
|
60
|
+
for (const [view, value] of Object.entries(source.right as Record<string, unknown>)) {
|
|
61
|
+
if (!isRightPanelType(view)) continue;
|
|
62
|
+
const size = pixelWidth(value);
|
|
63
|
+
if (size !== undefined) right[view] = size;
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
const legacy = pixelWidth(source.right);
|
|
67
|
+
if (legacy !== undefined) right[legacyView] = legacy;
|
|
68
|
+
}
|
|
69
|
+
if (Object.keys(right).length > 0) widths.right = right;
|
|
70
|
+
|
|
71
|
+
return widths;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Fold a freshly measured patch over the stored widths (one level deep for `right`). */
|
|
75
|
+
export function mergePanelWidths(current: PanelWidths, patch: PanelWidths): PanelWidths {
|
|
76
|
+
const next: PanelWidths = { ...current, ...patch };
|
|
77
|
+
if (patch.right) next.right = { ...current.right, ...patch.right };
|
|
78
|
+
return next;
|
|
79
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { BookOpen, Briefcase, Camera, Code2, Database, FlaskConical, Folder, Gamepad2, Globe, Heart, Home, Leaf, Lightbulb, Music, Palette, Rocket, Server, Shield, Smartphone, Terminal } from 'lucide-preact';
|
|
2
|
+
import type { LucideIcon } from 'lucide-preact';
|
|
3
|
+
|
|
4
|
+
const PROJECT_ICON_MAP: Record<string, LucideIcon> = {
|
|
5
|
+
default: Folder,
|
|
6
|
+
code: Code2,
|
|
7
|
+
terminal: Terminal,
|
|
8
|
+
rocket: Rocket,
|
|
9
|
+
flask: FlaskConical,
|
|
10
|
+
gamepad: Gamepad2,
|
|
11
|
+
briefcase: Briefcase,
|
|
12
|
+
home: Home,
|
|
13
|
+
globe: Globe,
|
|
14
|
+
leaf: Leaf,
|
|
15
|
+
shield: Shield,
|
|
16
|
+
palette: Palette,
|
|
17
|
+
server: Server,
|
|
18
|
+
smartphone: Smartphone,
|
|
19
|
+
database: Database,
|
|
20
|
+
lightbulb: Lightbulb,
|
|
21
|
+
music: Music,
|
|
22
|
+
camera: Camera,
|
|
23
|
+
book: BookOpen,
|
|
24
|
+
heart: Heart,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export function getProjectIcon(icon: string | undefined): LucideIcon {
|
|
28
|
+
return PROJECT_ICON_MAP[icon || 'default'] || Folder;
|
|
29
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { DbClient } from '@/server/lib/db/client';
|
|
2
|
+
import { DEFAULT_PROJECTS_LIST } from '@/client/data/settings/project';
|
|
3
|
+
|
|
4
|
+
const MIGRATION_KEY = 'omp_projects_config_migrated';
|
|
5
|
+
|
|
6
|
+
interface LegacyProject {
|
|
7
|
+
name?: unknown;
|
|
8
|
+
path?: unknown;
|
|
9
|
+
model?: unknown;
|
|
10
|
+
accentColor?: unknown;
|
|
11
|
+
icon?: unknown;
|
|
12
|
+
customIconUrl?: unknown;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function isLegacyProject(value: unknown): value is LegacyProject {
|
|
16
|
+
return typeof value === 'object' && value !== null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function migrateLegacyProjectSettings(db: DbClient): Promise<void> {
|
|
20
|
+
const marker = await db.get('SELECT value FROM app_settings WHERE key = ?', [MIGRATION_KEY]);
|
|
21
|
+
if (marker?.value === '1') return;
|
|
22
|
+
|
|
23
|
+
const legacyRow = await db.get('SELECT value FROM app_settings WHERE key = ?', ['omp_projects_config']);
|
|
24
|
+
if (!legacyRow?.value) return;
|
|
25
|
+
|
|
26
|
+
let parsed: unknown;
|
|
27
|
+
try {
|
|
28
|
+
parsed = JSON.parse(legacyRow.value);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const legacyProjects = Array.isArray(parsed)
|
|
34
|
+
? parsed.filter(isLegacyProject)
|
|
35
|
+
: DEFAULT_PROJECTS_LIST;
|
|
36
|
+
const folders = await db.all('SELECT id, name, project_path FROM workspace_folders');
|
|
37
|
+
|
|
38
|
+
for (const project of legacyProjects) {
|
|
39
|
+
const name = typeof project.name === 'string' ? project.name : '';
|
|
40
|
+
const path = typeof project.path === 'string' ? project.path : '';
|
|
41
|
+
const folder = folders.find((candidate) =>
|
|
42
|
+
(path && candidate.project_path === path) ||
|
|
43
|
+
(name && candidate.name.toLowerCase() === name.toLowerCase()),
|
|
44
|
+
);
|
|
45
|
+
if (!folder) continue;
|
|
46
|
+
|
|
47
|
+
await db.run(
|
|
48
|
+
`UPDATE workspace_folders
|
|
49
|
+
SET model = ?, accent_color = ?, icon = ?, custom_icon_url = ?
|
|
50
|
+
WHERE id = ?`,
|
|
51
|
+
[
|
|
52
|
+
typeof project.model === 'string' ? project.model : 'Not selected',
|
|
53
|
+
typeof project.accentColor === 'string' ? project.accentColor : '',
|
|
54
|
+
typeof project.icon === 'string' ? project.icon : 'default',
|
|
55
|
+
typeof project.customIconUrl === 'string' ? project.customIconUrl : null,
|
|
56
|
+
folder.id,
|
|
57
|
+
],
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
await db.run('INSERT OR REPLACE INTO app_settings (key, value) VALUES (?, ?)', [MIGRATION_KEY, '1']);
|
|
62
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { DbClient } from '@/server/lib/db/client';
|
|
2
|
+
import type { ProjectConfigItem } from '@/shared/types';
|
|
3
|
+
import { isRecord } from '@/shared/lib/util/guards';
|
|
4
|
+
|
|
5
|
+
export interface WorkspaceFolderRow {
|
|
6
|
+
id: number;
|
|
7
|
+
name: string;
|
|
8
|
+
project_path?: string | null;
|
|
9
|
+
model?: string | null;
|
|
10
|
+
accent_color?: string | null;
|
|
11
|
+
icon?: string | null;
|
|
12
|
+
custom_icon_url?: string | null;
|
|
13
|
+
is_pinned?: number | null;
|
|
14
|
+
is_expanded?: number | null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface FolderSettingsPatch {
|
|
18
|
+
name?: string;
|
|
19
|
+
projectPath?: string | null;
|
|
20
|
+
model?: string;
|
|
21
|
+
accentColor?: string;
|
|
22
|
+
icon?: string;
|
|
23
|
+
customIconUrl?: string | null;
|
|
24
|
+
isPinned?: boolean;
|
|
25
|
+
isExpanded?: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function projectConfigFromFolder(folder: WorkspaceFolderRow): ProjectConfigItem {
|
|
29
|
+
return {
|
|
30
|
+
id: `folder-${folder.id}`,
|
|
31
|
+
folderId: folder.id,
|
|
32
|
+
name: folder.name,
|
|
33
|
+
path: folder.project_path ?? '',
|
|
34
|
+
model: folder.model || 'Not selected',
|
|
35
|
+
accentColor: folder.accent_color || '',
|
|
36
|
+
icon: folder.icon || 'default',
|
|
37
|
+
customIconUrl: folder.custom_icon_url || undefined,
|
|
38
|
+
isPinned: folder.is_pinned === 1,
|
|
39
|
+
isExpanded: folder.is_expanded === 1,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function readBoolean(value: unknown): boolean | undefined {
|
|
44
|
+
if (typeof value === 'boolean') return value;
|
|
45
|
+
if (value === 'true') return true;
|
|
46
|
+
if (value === 'false') return false;
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function parseFolderSettingsPatch(value: unknown): FolderSettingsPatch {
|
|
51
|
+
if (!isRecord(value)) return {};
|
|
52
|
+
|
|
53
|
+
const patch: FolderSettingsPatch = {};
|
|
54
|
+
if (typeof value.name === 'string') patch.name = value.name.trim();
|
|
55
|
+
if (typeof value.projectPath === 'string') patch.projectPath = value.projectPath.trim() || null;
|
|
56
|
+
if (typeof value.model === 'string') patch.model = value.model;
|
|
57
|
+
if (typeof value.accentColor === 'string') patch.accentColor = value.accentColor;
|
|
58
|
+
if (typeof value.icon === 'string') patch.icon = value.icon;
|
|
59
|
+
if (typeof value.customIconUrl === 'string') patch.customIconUrl = value.customIconUrl;
|
|
60
|
+
if (value.customIconUrl === null) patch.customIconUrl = null;
|
|
61
|
+
|
|
62
|
+
const isPinned = readBoolean(value.isPinned);
|
|
63
|
+
if (isPinned !== undefined) patch.isPinned = isPinned;
|
|
64
|
+
const isExpanded = readBoolean(value.isExpanded);
|
|
65
|
+
if (isExpanded !== undefined) patch.isExpanded = isExpanded;
|
|
66
|
+
|
|
67
|
+
return patch;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export async function updateWorkspaceFolder(
|
|
71
|
+
db: DbClient,
|
|
72
|
+
folderId: string,
|
|
73
|
+
patch: FolderSettingsPatch,
|
|
74
|
+
): Promise<boolean> {
|
|
75
|
+
const assignments: string[] = [];
|
|
76
|
+
const values: Array<string | number | null> = [];
|
|
77
|
+
|
|
78
|
+
if (patch.name !== undefined && patch.name !== '') {
|
|
79
|
+
assignments.push('name = ?');
|
|
80
|
+
values.push(patch.name);
|
|
81
|
+
}
|
|
82
|
+
if (patch.projectPath !== undefined) {
|
|
83
|
+
assignments.push('project_path = ?');
|
|
84
|
+
values.push(patch.projectPath);
|
|
85
|
+
}
|
|
86
|
+
if (patch.model !== undefined) {
|
|
87
|
+
assignments.push('model = ?');
|
|
88
|
+
values.push(patch.model);
|
|
89
|
+
}
|
|
90
|
+
if (patch.accentColor !== undefined) {
|
|
91
|
+
assignments.push('accent_color = ?');
|
|
92
|
+
values.push(patch.accentColor);
|
|
93
|
+
}
|
|
94
|
+
if (patch.icon !== undefined) {
|
|
95
|
+
assignments.push('icon = ?');
|
|
96
|
+
values.push(patch.icon);
|
|
97
|
+
}
|
|
98
|
+
if (patch.customIconUrl !== undefined) {
|
|
99
|
+
assignments.push('custom_icon_url = ?');
|
|
100
|
+
values.push(patch.customIconUrl);
|
|
101
|
+
}
|
|
102
|
+
if (patch.isPinned !== undefined) {
|
|
103
|
+
assignments.push('is_pinned = ?');
|
|
104
|
+
values.push(patch.isPinned ? 1 : 0);
|
|
105
|
+
}
|
|
106
|
+
if (patch.isExpanded !== undefined) {
|
|
107
|
+
assignments.push('is_expanded = ?');
|
|
108
|
+
values.push(patch.isExpanded ? 1 : 0);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (assignments.length === 0) return false;
|
|
112
|
+
|
|
113
|
+
values.push(folderId);
|
|
114
|
+
const result = await db.run(
|
|
115
|
+
`UPDATE workspace_folders SET ${assignments.join(', ')} WHERE id = ?`,
|
|
116
|
+
values,
|
|
117
|
+
);
|
|
118
|
+
return Boolean(result.changes);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export async function deleteWorkspaceFolder(db: DbClient, folderId: string): Promise<boolean> {
|
|
122
|
+
const folder = await db.get('SELECT id, project_path FROM workspace_folders WHERE id = ?', [folderId]);
|
|
123
|
+
if (!folder) return false;
|
|
124
|
+
|
|
125
|
+
if (folder.project_path) {
|
|
126
|
+
await db.run(
|
|
127
|
+
'INSERT OR REPLACE INTO deleted_workspaces (project_path) VALUES (?)',
|
|
128
|
+
[folder.project_path],
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const sessionRows = await db.all('SELECT id FROM sessions WHERE folder_id = ?', [folderId]);
|
|
133
|
+
for (const session of sessionRows) {
|
|
134
|
+
await db.run('DELETE FROM files WHERE session_id = ?', [session.id]);
|
|
135
|
+
}
|
|
136
|
+
await db.run('DELETE FROM sessions WHERE folder_id = ?', [folderId]);
|
|
137
|
+
await db.run('DELETE FROM workspace_folders WHERE id = ?', [folderId]);
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Single source of truth for every refresh/poll cadence in the chamber.
|
|
8
|
+
*
|
|
9
|
+
* These values used to live next to their hooks (sidebar idle, stream poll,
|
|
10
|
+
* revalidation throttle, panel poll, git status, repo discovery, CDP poll,
|
|
11
|
+
* server-side dataset TTL, spawn retry backoff). Scattering them made tuning a
|
|
12
|
+
* cross-file hunt and let related numbers drift apart — the sidebar's 5s poll
|
|
13
|
+
* sitting exactly on the server's 5s TTL was the clearest case: a poll landing
|
|
14
|
+
* on the TTL boundary is a coin flip between a cache hit and a full disk scan.
|
|
15
|
+
*
|
|
16
|
+
* Keep every cadence here so the cost/freshness trade-off can be reasoned
|
|
17
|
+
* about in one place. Imported by client hooks, shared browser modules, and
|
|
18
|
+
* server routes alike — this module must stay free of `node:`/`Bun.*` imports.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Sidebar idle keep-alive. The event paths (`omp:session-updated`) and the
|
|
23
|
+
* stream poll only fire while THIS client is active, so changes made elsewhere
|
|
24
|
+
* — a second tab, a background omp process finishing, an archive from another
|
|
25
|
+
* browser — would never surface. A slow poll closes that gap.
|
|
26
|
+
*
|
|
27
|
+
* 30s: the payload costs a per-session filesystem probe server-side
|
|
28
|
+
* (`sessionHasSubagents`), and idle means the user is not running anything
|
|
29
|
+
* here, so a half-minute of staleness is imperceptible.
|
|
30
|
+
*/
|
|
31
|
+
export const SIDEBAR_IDLE_REFRESH_MS = 30_000;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Sidebar poll while some session is streaming. This is the belt to the
|
|
35
|
+
* `omp:session-updated` suspenders: when a background run finishes while the
|
|
36
|
+
* user sits on another session, no event is dispatched on this client, so only
|
|
37
|
+
* a timer can notice.
|
|
38
|
+
*
|
|
39
|
+
* 8s: the thing being waited for is a one-shot "done" badge, where a few
|
|
40
|
+
* seconds of latency is invisible — 5s was buying nothing.
|
|
41
|
+
*/
|
|
42
|
+
export const SIDEBAR_STREAM_POLL_MS = 8_000;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Coalescing window for sidebar revalidation, applied as a LEADING + TRAILING
|
|
46
|
+
* throttle: the first event revalidates immediately, further events inside the
|
|
47
|
+
* window collapse into one trailing call.
|
|
48
|
+
*
|
|
49
|
+
* Leading-edge matters: `omp:session-updated` arrives in bursts (spawn, JSONL
|
|
50
|
+
* write, agent end), and a pure trailing debounce starves under a sustained
|
|
51
|
+
* burst — a 500ms retry loop would reset the timer forever and the sidebar
|
|
52
|
+
* would never refresh. Capping at one fetch per second keeps a busy run cheap
|
|
53
|
+
* without the starvation.
|
|
54
|
+
*/
|
|
55
|
+
export const SIDEBAR_REVALIDATE_THROTTLE_MS = 1_000;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Right-panel poll cadence (context, usage, files, git). Panels mount only
|
|
59
|
+
* while active and each already has an event-driven companion
|
|
60
|
+
* (`useFileMutationRefresh`) for agent edits, so this poll only covers
|
|
61
|
+
* out-of-band changes — 5s is plenty. The git panel is the expensive one: each
|
|
62
|
+
* tick spawns git status, and at 2s that was the heaviest poll in the app.
|
|
63
|
+
*/
|
|
64
|
+
export const PANEL_REFRESH_MS = 5_000;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Coalescing window after a file-mutating tool completes. Event-driven, not a
|
|
68
|
+
* poll — a burst of quick edits should collapse into one re-read.
|
|
69
|
+
*/
|
|
70
|
+
export const FILE_MUTATION_THROTTLE_MS = 500;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Git-status poll behind the activity-bar / mobile "uncommitted changes"
|
|
74
|
+
* indicator. Already visibility- and focus-gated, and now also refreshed by
|
|
75
|
+
* the `omp:session-updated` / `omp:workspace-updated` events.
|
|
76
|
+
*/
|
|
77
|
+
export const GIT_STATUS_POLL_MS = 15_000;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Coalescing window for the event-driven git-status re-read. A single agent run
|
|
81
|
+
* emits `omp:session-updated` more than once (run start, settled JSONL read,
|
|
82
|
+
* run end) and every `useGitStatus` instance listens, so an uncoalesced trigger
|
|
83
|
+
* would spawn several `git status` processes per run — the exact cost the poll
|
|
84
|
+
* cadence was raised to avoid. Trailing-only on purpose: the tree only settles
|
|
85
|
+
* after the run's writes land, so there is nothing worth reading on the leading
|
|
86
|
+
* edge.
|
|
87
|
+
*/
|
|
88
|
+
export const GIT_STATUS_EVENT_THROTTLE_MS = 1_000;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Nested-repo discovery poll (`?reposOnly=1`). Short-lived: it stops as soon
|
|
92
|
+
* as discovery settles, so a tight cadence only costs a few requests.
|
|
93
|
+
*/
|
|
94
|
+
export const REPO_DISCOVERY_POLL_MS = 1_500;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* CDP state/screencast poll. Latency-sensitive — the browser panel streams a
|
|
98
|
+
* live page, so this one stays tight on purpose.
|
|
99
|
+
*/
|
|
100
|
+
export const BROWSER_POLL_MS = 1_000;
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Keep-alive comment frame for long-lived SSE/WS transports (agent bridge and
|
|
104
|
+
* browser stream). Not a data refresh — it keeps proxies from reaping an idle
|
|
105
|
+
* connection.
|
|
106
|
+
*/
|
|
107
|
+
export const STREAM_HEARTBEAT_MS = 30_000;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* TTL for the server-side sidebar dataset scan (`loadOmpSidebarData`). Kept
|
|
111
|
+
* just UNDER the fastest sidebar poll (8s) so a poll deterministically misses
|
|
112
|
+
* and triggers exactly one scan instead of racing the boundary.
|
|
113
|
+
*/
|
|
114
|
+
export const SIDEBAR_DATA_TTL_MS = 4_000;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Retry backoff (ms) used while waiting for a freshly spawned omp session's
|
|
118
|
+
* JSONL to carry the user turn. Each entry is the delay BEFORE the next
|
|
119
|
+
* attempt; attempt 1 runs immediately, so the total attempt count is
|
|
120
|
+
* `length + 1` and the elapsed budget is the sum (~15.5s over 13 attempts).
|
|
121
|
+
*
|
|
122
|
+
* Front-loaded on purpose: omp usually writes the turn within a second, so the
|
|
123
|
+
* early 250ms probes land the real title fast, while the 2s tail keeps watching
|
|
124
|
+
* a slow spawn without spending 40 requests to do it.
|
|
125
|
+
*/
|
|
126
|
+
export const SESSION_META_RETRY_SCHEDULE_MS: readonly number[] = [
|
|
127
|
+
250, 250, 500, 500, 1_000, 1_000, 2_000, 2_000, 2_000, 2_000, 2_000, 2_000,
|
|
128
|
+
];
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Compact relative age for sidebar rows: `now`, `5m`, `3h`, `2d`, `6w`, or a
|
|
2
|
+
* `DD MMM` date once the timestamp is older than a year. Returns null for a
|
|
3
|
+
* missing/unparseable timestamp so callers can omit the column entirely. */
|
|
4
|
+
export function relativeTimeAgo(value: string | number | null | undefined, now: number = Date.now()): string | null {
|
|
5
|
+
if (value === null || value === undefined || value === '') return null;
|
|
6
|
+
const ms = typeof value === 'number' ? value : Date.parse(value);
|
|
7
|
+
if (Number.isNaN(ms)) return null;
|
|
8
|
+
|
|
9
|
+
const seconds = Math.round((now - ms) / 1000);
|
|
10
|
+
if (seconds < 45) return 'now';
|
|
11
|
+
const minutes = Math.round(seconds / 60);
|
|
12
|
+
if (minutes < 60) return `${minutes}m`;
|
|
13
|
+
const hours = Math.round(minutes / 60);
|
|
14
|
+
if (hours < 24) return `${hours}h`;
|
|
15
|
+
const days = Math.round(hours / 24);
|
|
16
|
+
if (days < 7) return `${days}d`;
|
|
17
|
+
const weeks = Math.round(days / 7);
|
|
18
|
+
if (weeks < 5) return `${weeks}w`;
|
|
19
|
+
|
|
20
|
+
const date = new Date(ms);
|
|
21
|
+
const sameYear = date.getFullYear() === new Date(now).getFullYear();
|
|
22
|
+
const day = date.getDate();
|
|
23
|
+
const month = date.toLocaleString('en-US', { month: 'short' });
|
|
24
|
+
return sameYear ? `${day} ${month}` : `${day} ${month} ${date.getFullYear()}`;
|
|
25
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Right developer panel catalog: the activity-bar views, the width each one
|
|
3
|
+
* opens at, and the floor at which its content starts to clip.
|
|
4
|
+
*
|
|
5
|
+
* The list lives here rather than in the activity bar component so the layout
|
|
6
|
+
* can key one remembered width per view (`panel-widths.ts`) and validate a
|
|
7
|
+
* stored blob without importing UI.
|
|
8
|
+
*/
|
|
9
|
+
export const RIGHT_PANEL_TYPES = [
|
|
10
|
+
'files',
|
|
11
|
+
'search',
|
|
12
|
+
'git',
|
|
13
|
+
'terminal',
|
|
14
|
+
'context',
|
|
15
|
+
'user-browser',
|
|
16
|
+
'browser',
|
|
17
|
+
'usage',
|
|
18
|
+
] as const;
|
|
19
|
+
|
|
20
|
+
export type RightPanelType = (typeof RIGHT_PANEL_TYPES)[number];
|
|
21
|
+
|
|
22
|
+
/** Width (px) a view opens at the first time it is shown. */
|
|
23
|
+
export const DEFAULT_RIGHT_PANEL_WIDTHS: Record<RightPanelType, number> = {
|
|
24
|
+
files: 268,
|
|
25
|
+
search: 268,
|
|
26
|
+
git: 268,
|
|
27
|
+
terminal: 536,
|
|
28
|
+
context: 536,
|
|
29
|
+
'user-browser': 804,
|
|
30
|
+
browser: 804,
|
|
31
|
+
usage: 536,
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/** Minimum width (px) each view needs before its toolbar or list breaks. */
|
|
35
|
+
export const MIN_RIGHT_PANEL_WIDTHS: Record<RightPanelType, number> = {
|
|
36
|
+
files: 200,
|
|
37
|
+
search: 200,
|
|
38
|
+
git: 260,
|
|
39
|
+
terminal: 200,
|
|
40
|
+
context: 420,
|
|
41
|
+
'user-browser': 320,
|
|
42
|
+
browser: 320,
|
|
43
|
+
usage: 420,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export const MAX_RIGHT_PANEL_WIDTH = 1200;
|
|
47
|
+
|
|
48
|
+
/** Guards a persisted or URL-provided view id before it keys a width. */
|
|
49
|
+
export function isRightPanelType(value: unknown): value is RightPanelType {
|
|
50
|
+
return typeof value === 'string' && (RIGHT_PANEL_TYPES as readonly string[]).includes(value);
|
|
51
|
+
}
|