ompgui 0.7.8 → 0.7.11
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/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +3 -3
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +5 -5
- package/.next/react-loadable-manifest.json +13 -13
- package/.next/required-server-files.js +3 -2
- package/.next/required-server-files.json +3 -2
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +2 -2
- package/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +3 -3
- package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/agent/[id]/events/route.js +2 -2
- package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/[id]/route.js +1 -1
- package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/new/route.js +1 -1
- package/.next/server/app/api/agent/new/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/running/events/route.js +2 -2
- package/.next/server/app/api/agent/running/events/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/[name]/route.js +1 -1
- package/.next/server/app/api/agents/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/route.js +1 -1
- package/.next/server/app/api/agents/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/unpack/route.js +1 -1
- package/.next/server/app/api/agents/unpack/route.js.nft.json +1 -1
- package/.next/server/app/api/app-update/route.js +1 -1
- package/.next/server/app/api/auth/login/[provider]/route.js +2 -2
- package/.next/server/app/api/auth/login/[provider]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/route.js +3 -3
- package/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/model-roles/route.js +1 -1
- package/.next/server/app/api/model-roles/route.js.nft.json +1 -1
- package/.next/server/app/api/models/route.js +1 -1
- package/.next/server/app/api/models/route.js.nft.json +1 -1
- package/.next/server/app/api/omp-settings/route.js +1 -1
- package/.next/server/app/api/omp-settings/route.js.nft.json +1 -1
- package/.next/server/app/api/omp-update/route.js +2 -2
- package/.next/server/app/api/omp-update/route.js.nft.json +1 -1
- package/.next/server/app/api/providers/enable/route.js +1 -1
- package/.next/server/app/api/providers/enable/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/archive/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/archive/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/auto-name/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/auto-name/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/state/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/state/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/subagents/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/subagents/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route.js +1 -1
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +4 -4
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +1 -1
- package/.next/server/app/login.rsc +4 -4
- package/.next/server/app/login.segments/_full.segment.rsc +4 -4
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/page.js +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/pair/page_client-reference-manifest.js +1 -1
- package/.next/server/app/pair.html +1 -1
- package/.next/server/app/pair.rsc +4 -4
- package/.next/server/app/pair.segments/_full.segment.rsc +4 -4
- package/.next/server/app/pair.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/pair.segments/pair/__PAGE__.segment.rsc +4 -4
- package/.next/server/app-paths-manifest.json +3 -3
- package/.next/server/chunks/3100.js +2 -2
- package/.next/server/chunks/3294.js +1 -1
- package/.next/server/chunks/4008.js +18 -0
- package/.next/server/chunks/4367.js +1 -1
- package/.next/server/chunks/4674.js +1 -1
- package/.next/server/chunks/4980.js +1 -1
- package/.next/server/chunks/6429.js +1 -0
- package/.next/server/chunks/7077.js +1 -1
- package/.next/server/chunks/8015.js +107 -0
- package/.next/server/chunks/8501.js +1 -1
- package/.next/server/chunks/933.js +1 -1
- package/.next/server/chunks/9848.js +1 -0
- package/.next/server/instrumentation.js +1 -1
- package/.next/server/instrumentation.js.nft.json +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/webpack-runtime.js +1 -1
- package/.next/static/chunks/3274.f8f023fd73e607bc.js +2 -0
- package/.next/static/chunks/4315-fad7ccd6e548e08e.js +1 -0
- package/.next/static/chunks/4906-3ebc61b9b2c31745.js +1 -0
- package/.next/static/chunks/4996.c5525823b73ac947.js +1 -0
- package/.next/static/chunks/5806.06789869309659d0.js +1 -0
- package/.next/static/chunks/6268.c8711c205efe98a6.js +17 -0
- package/.next/static/chunks/9668.6c511d3f22a0d3ad.js +1 -0
- package/.next/static/chunks/app/page-66dfb84af2e0fea1.js +59 -0
- package/.next/static/chunks/webpack-7f93c1ded461bdcd.js +1 -0
- package/.next/static/css/d45df4610e8c9637.css +3 -0
- package/README.ja.md +12 -3
- package/README.ko.md +13 -5
- package/README.md +11 -5
- package/README.zh-CN.md +12 -3
- package/next.config.ts +1 -1
- package/package.json +3 -1
- package/.next/server/chunks/6480.js +0 -18
- package/.next/server/chunks/7226.js +0 -107
- package/.next/server/chunks/7779.js +0 -1
- package/.next/static/chunks/1941.66c3a0942c0c3e5d.js +0 -1
- package/.next/static/chunks/3274.487a15bb28a8bf64.js +0 -2
- package/.next/static/chunks/4315-f0bee51727fa8bed.js +0 -1
- package/.next/static/chunks/4318.196416c4ae7baadf.js +0 -17
- package/.next/static/chunks/4906-1472d0151646b3d8.js +0 -1
- package/.next/static/chunks/7488.1403755f69bda581.js +0 -1
- package/.next/static/chunks/9668.b62ea9e45077f781.js +0 -1
- package/.next/static/chunks/app/page-9304c484c09df22f.js +0 -59
- package/.next/static/chunks/webpack-afa1355fdf81dfd5.js +0 -1
- package/.next/static/css/63b622301ba107de.css +0 -3
- /package/.next/static/{PPk0j6NqdLVIbLaafEqjL → RCJWKG4f3VN3XnWbJ4581}/_buildManifest.js +0 -0
- /package/.next/static/{PPk0j6NqdLVIbLaafEqjL → RCJWKG4f3VN3XnWbJ4581}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(()=>{"use strict";var e,t,a,c,d,r,f,b,o,n={},i={};function l(e){var t=i[e];if(void 0!==t)return t.exports;var a=i[e]={exports:{}},c=!0;try{n[e].call(a.exports,a,a.exports,l),c=!1}finally{c&&delete i[e]}return a.exports}l.m=n,e=[],l.O=(t,a,c,d)=>{if(a){d=d||0;for(var r=e.length;r>0&&e[r-1][2]>d;r--)e[r]=e[r-1];e[r]=[a,c,d];return}for(var f=1/0,r=0;r<e.length;r++){for(var[a,c,d]=e[r],b=!0,o=0;o<a.length;o++)(!1&d||f>=d)&&Object.keys(l.O).every(e=>l.O[e](a[o]))?a.splice(o--,1):(b=!1,d<f&&(f=d));if(b){e.splice(r--,1);var n=c();void 0!==n&&(t=n)}}return t},l.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return l.d(t,{a:t}),t},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,l.t=function(e,c){if(1&c&&(e=this(e)),8&c||"object"==typeof e&&e&&(4&c&&e.__esModule||16&c&&"function"==typeof e.then))return e;var d=Object.create(null);l.r(d);var r={};t=t||[null,a({}),a([]),a(a)];for(var f=2&c&&e;"object"==typeof f&&!~t.indexOf(f);f=a(f))Object.getOwnPropertyNames(f).forEach(t=>r[t]=()=>e[t]);return r.default=()=>e,l.d(d,r),d},l.d=(e,t)=>{for(var a in t)l.o(t,a)&&!l.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},l.f={},l.e=e=>Promise.all(Object.keys(l.f).reduce((t,a)=>(l.f[a](e,t),t),[])),l.u=e=>4906===e?"static/chunks/4906-3ebc61b9b2c31745.js":587===e?"static/chunks/587-c973123b3c9a5b80.js":"static/chunks/"+(({988:"993e5495",1048:"db9d41be",7330:"d3ac728e",8133:"1ba63609",8747:"90542734",8924:"da12927c",9425:"bf2ff291"})[e]||e)+"."+({103:"23142a67b02246a8",268:"ec500965c1761e26",370:"8e8f3cf8eb0e29dd",398:"ffa02af9062a3950",484:"761e1ff01f663fb2",869:"7152372b662e31af",918:"6a9bbe564e4a2d0f",934:"9006461bd0548660",973:"9efc01efd9d768a5",988:"598a97aa1337298f",1032:"d9a9179233599785",1048:"27ee8fcc7bf00d70",1063:"775c442bdbeef08b",1133:"bea8503e209b9e2c",1327:"09252bb80616cc3a",1441:"83552e2540b12edf",1708:"c3a1896e4cc9f8d9",1781:"9072b4c9586df549",2081:"47b6e9391094055f",2181:"ba21239d3ac39f81",2201:"46326eb058826eb2",2258:"4defa30121ef44a5",2325:"23caf22075e51aa5",2356:"523277bb8c6bf72a",2418:"b5d9e177e10a686e",2480:"cf27ca02e5b19761",2539:"c5a4f2fd8e421c70",2619:"9431a3f48da8eef4",2695:"b732ef1965253b3f",2703:"495a65ed14b2f094",2821:"934bcf60fbdc28c6",3251:"408c817adb161919",3274:"f8f023fd73e607bc",3308:"8e27b5c43a478f0d",3336:"a76f9485fe7cb762",3688:"77dd9e68a61af45e",3716:"72bf4c9d7325debd",3944:"6215b78f025077b3",3995:"eca0f5bef1fc3ae5",4004:"74b9bcf5478b1663",4202:"8440832386f023c7",4238:"6f102dcbcf2ae339",4405:"7a19458960a1058e",4424:"fd0c93a807a333e1",4473:"c9bdafcdd251e4db",4559:"2e7ed39ea2757280",4854:"b64a1daa15899219",4866:"d1060b4faf2ae1e2",4970:"8a63b4953b0e4946",4996:"c5525823b73ac947",5020:"9ac8d0dc8390bb6e",5137:"f163e94c74a94d01",5242:"7b643c6b3394cac1",5361:"afc00ab2626bacbf",5521:"cfdf2cfc6db31407",5526:"ff46471041fdcb79",5658:"0fe2642c815aea9a",5681:"dd0e66b0de16e54b",5806:"06789869309659d0",6121:"eb9023b1cbc78ee2",6161:"4836cd7d031026bf",6195:"8710aa41b2319dff",6202:"f4317cf0a48876f9",6268:"c8711c205efe98a6",6294:"24f510c0c3e3714c",6604:"4ad489ec0e9e8985",6654:"41440ef667144967",6794:"57bf1aff78682f3a",7256:"e07cf52d87d40252",7268:"2f59c671f26160f3",7330:"7964f816a1ca64e5",7331:"2add3c4e125a2dba",7543:"89f7b805ed0f2901",8133:"b2ae90f43319a29e",8200:"a36b9f8c983c6b9e",8717:"4e20eedf9544e286",8747:"ae439f2382f58c51",8863:"fa0320ea586efb3b",8885:"d9308c756376780b",8901:"e117d206a917bda0",8924:"476aa688a637649c",9365:"a3e0e5ac101ccd02",9425:"244c8a7c1c14966a",9448:"b6c5eb8f1356d5fd",9522:"c7c6e9c330f9ba6b",9614:"3221013d7f0af27f",9668:"6c511d3f22a0d3ad",9698:"4d09a99b9d99f3e5",9705:"40a82b97f214e28b",9754:"d67dec946fc871d4",9764:"2669775c6e107a01",9793:"4567af813117ad25",9974:"9a0f79beca65e8c4",9981:"ba92f0b30bbf53e4"})[e]+".js",l.miniCssF=e=>"static/css/2f46e0db0d4a3aed.css",l.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),l.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),c={},l.l=(e,t,a,d)=>{if(c[e])return void c[e].push(t);if(void 0!==a)for(var r,f,b=document.getElementsByTagName("script"),o=0;o<b.length;o++){var n=b[o];if(n.getAttribute("src")==e||n.getAttribute("data-webpack")=="_N_E:"+a){r=n;break}}r||(f=!0,(r=document.createElement("script")).charset="utf-8",r.timeout=120,l.nc&&r.setAttribute("nonce",l.nc),r.setAttribute("data-webpack","_N_E:"+a),r.src=l.tu(e)),c[e]=[t];var i=(t,a)=>{r.onerror=r.onload=null,clearTimeout(s);var d=c[e];if(delete c[e],r.parentNode&&r.parentNode.removeChild(r),d&&d.forEach(e=>e(a)),t)return t(a)},s=setTimeout(i.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=i.bind(null,r.onerror),r.onload=i.bind(null,r.onload),f&&document.head.appendChild(r)},l.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.tt=()=>(void 0===d&&(d={createScriptURL:e=>e},"u">typeof trustedTypes&&trustedTypes.createPolicy&&(d=trustedTypes.createPolicy("nextjs#bundler",d))),d),l.tu=e=>l.tt().createScriptURL(e),l.p="/_next/",r={8068:0},l.f.miniCss=(e,t)=>{if(r[e])t.push(r[e]);else 0!==r[e]&&({5846:1})[e]&&t.push(r[e]=new Promise((t,a)=>{var c=l.miniCssF(e),d=l.p+c;if(((e,t)=>{for(var a=document.getElementsByTagName("link"),c=0;c<a.length;c++){var d=a[c],r=d.getAttribute("data-href")||d.getAttribute("href");if("stylesheet"===d.rel&&(r===e||r===t))return d}for(var f=document.getElementsByTagName("style"),c=0;c<f.length;c++){var d=f[c],r=d.getAttribute("data-href");if(r===e||r===t)return d}})(c,d))return t();((e,t,a,c)=>{var d=document.createElement("link");d.rel="stylesheet",d.type="text/css",d.onerror=d.onload=r=>{if(d.onerror=d.onload=null,"load"===r.type)a();else{var f=r&&("load"===r.type?"missing":r.type),b=r&&r.target&&r.target.href||t,o=Error("Loading CSS chunk "+e+" failed.\n("+b+")");o.code="CSS_CHUNK_LOAD_FAILED",o.type=f,o.request=b,d.parentNode.removeChild(d),c(o)}},d.href=t;if("function"==typeof _N_E_STYLE_LOAD){var r=d.href,f=d.onload,b=d.onerror;_N_E_STYLE_LOAD(0===r.indexOf(window.location.origin)?new URL(r).pathname:r).then(function(){f&&f.call(d,{type:"load"})},function(){b&&b.call(d,{})})}else document.head.appendChild(d)})(e,d,t,a)}).then(()=>{r[e]=0},t=>{throw delete r[e],t}))},f={8068:0,6577:0},l.f.j=(e,t)=>{var a=l.o(f,e)?f[e]:void 0;if(0!==a)if(a)t.push(a[2]);else if(/^(5846|6577|8068)$/.test(e))f[e]=0;else{var c=new Promise((t,c)=>a=f[e]=[t,c]);t.push(a[2]=c);var d=l.p+l.u(e),r=Error();l.l(d,t=>{if(l.o(f,e)&&(0!==(a=f[e])&&(f[e]=void 0),a)){var c=t&&("load"===t.type?"missing":t.type),d=t&&t.target&&t.target.src;r.message="Loading chunk "+e+" failed.\n("+c+": "+d+")",r.name="ChunkLoadError",r.type=c,r.request=d,a[1](r)}},"chunk-"+e,e)}},l.O.j=e=>0===f[e],b=(e,t)=>{var a,c,[d,r,b]=t,o=0;if(d.some(e=>0!==f[e])){for(a in r)l.o(r,a)&&(l.m[a]=r[a]);if(b)var n=b(l)}for(e&&e(t);o<d.length;o++)c=d[o],l.o(f,c)&&f[c]&&f[c][0](),f[c]=0;return l.O(n)},(o=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(b.bind(null,0)),o.push=b.bind(null,o.push.bind(o)),l.nc=void 0})();
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
@font-face{font-family:Noto Sans Mono;font-style:normal;font-weight:100 900;font-stretch:100%;font-display:swap;src:url(/_next/static/media/1cdd02902f937a18-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:Noto Sans Mono;font-style:normal;font-weight:100 900;font-stretch:100%;font-display:swap;src:url(/_next/static/media/7deddc85b7ffd1dc-s.p.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:Noto Sans Mono;font-style:normal;font-weight:100 900;font-stretch:100%;font-display:swap;src:url(/_next/static/media/1a3dce5cfb5f7760-s.woff2) format("woff2");unicode-range:u+1f??}@font-face{font-family:Noto Sans Mono;font-style:normal;font-weight:100 900;font-stretch:100%;font-display:swap;src:url(/_next/static/media/15605e25b523335c-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:Noto Sans Mono;font-style:normal;font-weight:100 900;font-stretch:100%;font-display:swap;src:url(/_next/static/media/641a7b8a5800ee0e-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:Noto Sans Mono;font-style:normal;font-weight:100 900;font-stretch:100%;font-display:swap;src:url(/_next/static/media/4c4b3b30b6bcb2be-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Noto Sans Mono;font-style:normal;font-weight:100 900;font-stretch:100%;font-display:swap;src:url(/_next/static/media/ec14413c594b3356-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:Noto Sans Mono Fallback;src:local("Arial");ascent-override:79.43%;descent-override:21.77%;line-gap-override:0.00%;size-adjust:134.59%}.__className_66b8ca{font-family:Noto Sans Mono,Noto Sans Mono Fallback;font-style:normal}.__variable_66b8ca{--font-noto-mono:"Noto Sans Mono","Noto Sans Mono Fallback"}@font-face{font-family:Pretendard Variable;font-weight:45 920;font-style:normal;font-display:swap;src:url(/_next/static/media/PretendardVariable.ff840cfe.woff2) format("woff2-variations")}
|
|
2
|
+
|
|
3
|
+
/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-ease:initial}}}@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-lg:1.125rem;--text-xl:1.25rem;--font-weight-medium:500;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-border:var(--border);--color-text:var(--text);--color-text-muted:var(--text-muted);--color-text-dim:var(--text-dim);--color-accent:var(--accent);--color-accent-hover:var(--accent-hover);--color-bg-subtle:var(--bg-subtle)}}@layer base{*,::backdrop,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.isolate{isolation:isolate}.\!container{width:100%!important}@media (min-width:40rem){.\!container{max-width:40rem!important}}@media (min-width:48rem){.\!container{max-width:48rem!important}}@media (min-width:64rem){.\!container{max-width:64rem!important}}@media (min-width:80rem){.\!container{max-width:80rem!important}}@media (min-width:96rem){.\!container{max-width:96rem!important}}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-\[720px\]{height:720px}.h-full{height:100%}.min-h-\[44px\]{min-height:44px}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-\[720px\]{width:720px}.w-full{width:100%}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.truncate{text-overflow:ellipsis;white-space:nowrap}.overflow-hidden,.truncate{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:3.40282e+38px}.border{border-style:var(--tw-border-style);border-width:1px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-solid{--tw-border-style:solid;border-style:solid}.border-border{border-color:var(--color-border)}.bg-accent{background-color:var(--color-accent)}.bg-bg-subtle{background-color:var(--color-bg-subtle)}.px-2{padding-inline:calc(var(--spacing) * 2)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-6{padding-top:calc(var(--spacing) * 6)}.text-center{text-align:center}.text-left{text-align:left}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.break-all{word-break:break-all}.text-accent{color:var(--color-accent)}.text-text{color:var(--color-text)}.text-text-dim{color:var(--color-text-dim)}.text-text-muted{color:var(--color-text-muted)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-\[1px\]{--tw-backdrop-blur:blur(1px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.\[scrollbar-width\:none\]{scrollbar-width:none}@media (hover:hover){.hover\:text-accent-hover:hover{color:var(--color-accent-hover)}.hover\:text-text:hover{color:var(--color-text)}}}:root,html[data-palette=warm]{--bg:#faf9f6;--bg-panel:#f2f0ea;--bg-hover:#eae7df;--bg-selected:#e5e0d4;--border:#e2ddd2;--text:#2b2823;--text-muted:#69635a;--text-dim:#6a6458;--accent:#b03e22;--accent-strong:#b03e22;--accent-hover:#96331b;--user-bg:#f5ede1;--tool-bg:#f6f3ed;--bg-subtle:#3c32230a;--status-error:#b42318;--status-success:#18794e;--status-warning:#8a5a00;--status-modified:#a87b1f;--status-renamed:#2563eb;--on-accent:#fff;--overlay-backdrop:var(--text)}@supports (color:color-mix(in lab,red,red)){:root,html[data-palette=warm]{--overlay-backdrop:color-mix(in srgb,var(--text) 24%,transparent)}}:root,html[data-palette=warm]{--border-muted:#e2ddd2;--border-accent:#b03e22;--focus-ring-color:#b03e22;--custom-message-bg:#f3eee6;--tool-pending-bg:#f3f0ea;--tool-success-bg:#edf3ec;--tool-error-bg:#f7ece8;--source-project:#b03e22;--source-user:#69635a;--source-extension:#6a6458;--switch-track:#e2ddd2;--switch-thumb:#fff;--switch-thumb-shadow:0 1px 2px #3c322338}html.dark:not([data-palette]),html[data-palette=warm].dark{--bg:#1b1916;--bg-panel:#231f1b;--bg-hover:#2b2721;--bg-selected:#332e26;--border:#38322b;--text:#ebe6dc;--text-muted:#a39b8e;--text-dim:#938c81;--accent:#e07b54;--accent-strong:#c2542e;--accent-hover:#e89371;--user-bg:#2c2721;--tool-bg:#26221d;--bg-subtle:#ebe1d20d;--status-error:#ff8a80;--status-success:#69d5a5;--status-warning:#f0c36a;--status-modified:#e0b24d;--status-renamed:#7ca8ff;--on-accent:#fff;--overlay-backdrop:var(--text)}@supports (color:color-mix(in lab,red,red)){html.dark:not([data-palette]),html[data-palette=warm].dark{--overlay-backdrop:color-mix(in srgb,var(--text) 24%,transparent)}}html.dark:not([data-palette]),html[data-palette=warm].dark{--border-muted:#38322b;--border-accent:#e07b54;--focus-ring-color:#e07b54;--custom-message-bg:#2a252f;--tool-pending-bg:#25242a;--tool-success-bg:#202923;--tool-error-bg:#302221;--source-project:#e07b54;--source-user:#a39b8e;--source-extension:#938c81;--switch-track:#38322b;--switch-thumb:#ebe6dc;--switch-thumb-shadow:0 1px 2px #00000073}html[data-palette=omp]{--bg:#f9f7f1;--bg-panel:#f1eee6;--bg-hover:#ebe7dc;--bg-selected:#ede9df;--border:#c8c4b8;--text:#3a3832;--text-muted:#68645c;--text-dim:#746f65;--accent:#608058;--accent-strong:#4a603f;--accent-hover:#526f4b;--user-bg:#f2efe7;--tool-bg:#eef0ed;--bg-subtle:#3a38320b;--status-error:#a8463e;--status-success:#4a713f;--status-warning:#876a20;--status-modified:#876a20;--status-renamed:#456f68;--on-accent:#fff;--overlay-backdrop:var(--text)}@supports (color:color-mix(in lab,red,red)){html[data-palette=omp]{--overlay-backdrop:color-mix(in srgb,var(--text) 24%,transparent)}}html[data-palette=omp]{--border-muted:#d8d3c7;--border-accent:#608058;--focus-ring-color:#608058;--custom-message-bg:#eef5ec;--tool-pending-bg:#eef0ed;--tool-success-bg:#ecf2ea;--tool-error-bg:#f5efed;--source-project:#608058;--source-user:#68645c;--source-extension:#746f65;--switch-track:#c8c4b8;--switch-thumb:#fff;--switch-thumb-shadow:0 1px 2px #3a383238}html[data-palette=omp].dark{--bg:#18181e;--bg-panel:#1e1e24;--bg-hover:#272a31;--bg-selected:#31363f;--border:#3d424a;--text:#e7e8ea;--text-muted:#a0a4ac;--text-dim:#858b96;--accent:#febc38;--accent-strong:#956000;--accent-hover:#ffd06a;--user-bg:#221d1a;--tool-bg:#1d2129;--bg-subtle:#e7e8ea0d;--status-error:#ff6b78;--status-success:#89d281;--status-warning:#e4c00f;--status-modified:#e4c00f;--status-renamed:#64b5d2;--on-accent:#fff;--overlay-backdrop:var(--text)}@supports (color:color-mix(in lab,red,red)){html[data-palette=omp].dark{--overlay-backdrop:color-mix(in srgb,var(--text) 24%,transparent)}}html[data-palette=omp].dark{--border-muted:#3d424a;--border-accent:#febc38;--focus-ring-color:#febc38;--custom-message-bg:#2a2530;--tool-pending-bg:#1d2129;--tool-success-bg:#161a1f;--tool-error-bg:#291d1d;--source-project:#febc38;--source-user:#a0a4ac;--source-extension:#858b96;--switch-track:#3d424a;--switch-thumb:#e7e8ea;--switch-thumb-shadow:0 1px 2px #00000080}:root{--app-viewport-height:100dvh;--app-viewport-offset-top:0px;--radius-control:8px;--radius-card:12px;--radius-modal:16px;--control-height-sm:28px;--control-height:32px;--control-height-lg:36px;--shell-topbar-height:36px;--shell-file-toggle-size:28px;--control-touch:44px;--control-touch-icon:40px;--space-1:2px;--space-2:4px;--space-3:6px;--space-4:8px;--space-5:12px;--space-6:16px;--space-8:24px;--text-xs:12px;--text-sm:12px;--text-md:13px;--text-base:14px;--text-lg:16px;--text-xl:18px;--composer-ring-size:26px;--composer-control-h:var(--control-height-sm);--composer-attachment-w:var(--control-height-sm);--composer-thinking-max-w:66px;--composer-send-size:var(--control-height);--composer-shell-padding:var(--space-5) var(--space-5) var(--space-4) calc(var(--space-5) + var(--space-1));--composer-toolbar-separation:var(--space-2);--sidebar-mobile-width:280px;--accent-subtle:var(--accent)}@supports (color:color-mix(in lab,red,red)){:root{--accent-subtle:color-mix(in srgb,var(--accent) 12%,transparent)}}:root{--status-success-subtle:var(--status-success)}@supports (color:color-mix(in lab,red,red)){:root{--status-success-subtle:color-mix(in srgb,var(--status-success) 12%,transparent)}}:root{--status-warning-subtle:var(--status-warning)}@supports (color:color-mix(in lab,red,red)){:root{--status-warning-subtle:color-mix(in srgb,var(--status-warning) 12%,transparent)}}:root{--code-bg:var(--bg)}@supports (color:color-mix(in lab,red,red)){:root{--code-bg:color-mix(in srgb,var(--bg) 88%,var(--bg-panel))}}:root{--code-font-size:12.5px;--code-line-height:1.62;--code-padding-block:11px;--code-padding-inline:13px;--control-padding-inline:10px;--z-dropdown:50;--z-extension-dialog:90;--z-tooltip:120;--z-sidebar-backdrop:199;--z-sidebar:200;--z-resize-handle:205;--z-file-toggle:300;--z-branch-popover:600;--z-dialog-backdrop:1000;--z-dialog:1001;--z-directory-picker:1002;--z-command-palette:2000;--z-toast:2100;--dur-spin:.8s;--shadow-live-indicator:0 0 4px var(--status-success);--focus-ring:0 0 0 2px var(--focus-ring-color)}@supports (color:color-mix(in lab,red,red)){:root{--focus-ring:0 0 0 2px color-mix(in srgb,var(--focus-ring-color) 22%,transparent)}}:root{--shadow-card:0 1px 2px #3c32230d,0 2px 8px #3c32230f;--shadow-pop:0 2px 6px #3c322312,0 8px 24px #3c32231a;--shadow-modal:0 4px 12px #3c322314,0 16px 48px #3c322324;--ease-out-warm:cubic-bezier(.22,1,.36,1);--dur-fast:.15s;--dur-med:.22s;--dur-slow:.32s;--dur-theme:.45s;--palette-warm-preview-bg:#faf9f6;--palette-warm-preview-panel:#f2f0ea;--palette-warm-preview-accent:#b03e22;--palette-omp-preview-bg:#f9f7f1;--palette-omp-preview-panel:#ebe7dc;--palette-omp-preview-accent:#608058}html.dark{--shadow-card:0 1px 2px #00000059,0 0 0 1px #ebe1d208;--shadow-pop:0 2px 8px #00000073,0 0 0 1px #ebe1d20a;--shadow-modal:0 8px 32px #0000008c,0 0 0 1px #ebe1d20d}::view-transition-old(root){mix-blend-mode:normal;animation:none}::view-transition-new(root){mix-blend-mode:normal;animation:none}::view-transition-old(root){z-index:1}::view-transition-new(root){z-index:2}*{box-sizing:border-box}html{scroll-behavior:smooth}body,html{background:var(--bg);height:100%;color:var(--text);font-family:var(--font-sans);overscroll-behavior:none;margin:0;padding:0;font-size:14px;overflow:hidden}body{height:var(--app-viewport-height,100dvh)}a,button,html,input,select,textarea{touch-action:manipulation;-webkit-tap-highlight-color:transparent}a:active,button:active:not(:disabled){opacity:.85}a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:2px solid var(--focus-ring-color);outline-offset:1px}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--text-dim)}@supports (color:color-mix(in lab,red,red)){::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--text-dim) 45%,transparent)}}::-webkit-scrollbar-thumb{background-clip:content-box;border:2px solid #0000;border-radius:8px}::-webkit-scrollbar-thumb:hover{background:var(--text-dim)}@supports (color:color-mix(in lab,red,red)){::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--text-dim) 75%,transparent)}}::-webkit-scrollbar-thumb:hover{background-clip:content-box}*{scrollbar-width:thin;scrollbar-color:var(--text-dim) transparent}@supports (color:color-mix(in lab,red,red)){*{scrollbar-color:color-mix(in srgb,var(--text-dim) 45%,transparent) transparent}}:focus-visible{outline:2px solid var(--focus-ring-color);outline-offset:2px;border-radius:var(--radius-control)}:focus:not(:focus-visible){outline:none}:root{--font-sans:"Pretendard Variable","Pretendard",-apple-system,BlinkMacSystemFont,system-ui,sans-serif;--font-mono:var(--font-noto-mono),"SFMono-Regular","Consolas",var(--font-sans),monospace;--font-serif:var(--font-sans)}code,pre{font-family:var(--font-mono)}.display-serif{font-family:var(--font-sans);letter-spacing:-.012em;font-weight:600}.markdown-body{font-size:var(--text-base,14px);color:var(--text);word-break:break-word;line-height:1.5}.markdown-body p{margin:0 0 10px}.markdown-body p:last-child{margin-bottom:0}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-family:var(--font-sans);color:var(--text);letter-spacing:.005em;font-weight:600;line-height:1.35}.markdown-body h1{margin:14px 0 8px;font-size:1.2em}.markdown-body h2{margin:12px 0 6px;font-size:1.1em}.markdown-body h3{color:var(--text);margin:10px 0 5px;font-size:1em}@supports (color:color-mix(in lab,red,red)){.markdown-body h3{color:color-mix(in srgb,var(--text) 88%,var(--text-muted))}}.markdown-body ol,.markdown-body ul{margin:6px 0 10px;padding-left:22px;list-style-position:outside}.markdown-body li{margin:2px 0;padding-left:2px}.markdown-body li>ol,.markdown-body li>ul{margin:2px 0 4px}.markdown-body ul>li{list-style-type:disc}.markdown-body ol>li{list-style-type:decimal}.markdown-body li>p{margin:0}.markdown-body li::marker{color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.markdown-body li::marker{color:color-mix(in srgb,var(--accent) 72%,var(--text-muted))}}.markdown-body li::marker{font-weight:600}.markdown-body strong{color:var(--text)}@supports (color:color-mix(in lab,red,red)){.markdown-body strong{color:color-mix(in srgb,var(--text) 88%,var(--accent))}}.markdown-body strong{font-weight:700}.markdown-body em{color:var(--text-muted)}.markdown-body a{color:var(--accent);text-underline-offset:3px;text-decoration:underline;text-decoration-thickness:1px;-webkit-text-decoration-color:var(--accent);text-decoration-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.markdown-body a{-webkit-text-decoration-color:color-mix(in srgb,var(--accent) 45%,transparent);text-decoration-color:color-mix(in srgb,var(--accent) 45%,transparent)}}.markdown-body a:hover{-webkit-text-decoration-color:var(--accent);text-decoration-color:var(--accent)}.markdown-body img{border-radius:var(--radius-control);max-width:100%;height:auto;margin:8px 0;display:block}.markdown-body .markdown-inline-code{background:var(--bg-panel)}@supports (color:color-mix(in lab,red,red)){.markdown-body .markdown-inline-code{background:color-mix(in srgb,var(--bg-panel) 62%,var(--bg))}}.markdown-body .markdown-inline-code{border-radius:calc(var(--radius-control) - var(--space-1));color:var(--text);font-family:var(--font-mono);box-shadow:inset 0 0 0 1px var(--border);padding:1px 5px;font-size:.92em}@supports (color:color-mix(in lab,red,red)){.markdown-body .markdown-inline-code{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--border) 60%,transparent)}}.markdown-body .contains-task-list{padding-left:0;list-style:none}.markdown-body .task-list-item{padding-left:25px;display:block;position:relative}.markdown-body .task-list-item::marker{content:""}.markdown-body .task-list-item>input[type=checkbox],.markdown-body .task-list-item>p:first-child>input[type=checkbox]:first-child{appearance:none;border:1px solid var(--border);background:var(--bg);border-radius:4px;place-content:center;width:14px;height:14px;margin:0;display:inline-grid;position:absolute;top:.35em;left:0}.markdown-body .task-list-item>input[type=checkbox]:checked,.markdown-body .task-list-item>p:first-child>input[type=checkbox]:first-child:checked{border-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.markdown-body .task-list-item>input[type=checkbox]:checked,.markdown-body .task-list-item>p:first-child>input[type=checkbox]:first-child:checked{border-color:color-mix(in srgb,var(--accent) 55%,var(--border))}}.markdown-body .task-list-item>input[type=checkbox]:checked,.markdown-body .task-list-item>p:first-child>input[type=checkbox]:first-child:checked{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.markdown-body .task-list-item>input[type=checkbox]:checked,.markdown-body .task-list-item>p:first-child>input[type=checkbox]:first-child:checked{background:color-mix(in srgb,var(--accent) 10%,var(--bg))}}.markdown-body .task-list-item>input[type=checkbox]:checked:before,.markdown-body .task-list-item>p:first-child>input[type=checkbox]:first-child:checked:before{content:"";border:solid var(--accent);border-width:0 1.5px 1.5px 0;width:4px;height:8px;transform:rotate(45deg)translateY(-1px)}.markdown-body blockquote{border-left:3px solid var(--border)}@supports (color:color-mix(in lab,red,red)){.markdown-body blockquote{border-left:3px solid color-mix(in srgb,var(--border) 75%,var(--text-muted))}}.markdown-body blockquote{border-radius:0 var(--radius-control) var(--radius-control) 0;background:var(--bg-subtle);color:var(--text-muted);margin:6px 0;padding:6px 11px}.markdown-table-wrap{border:1px solid var(--border);border-radius:var(--radius-control);width:100%;margin:8px 0;overflow:auto hidden}.markdown-body table{border-collapse:separate;border-spacing:0;min-width:100%;font-size:var(--text-md)}.markdown-body td,.markdown-body th{border:0;border-bottom:1px solid var(--border);text-align:left;vertical-align:top;padding:6px 10px}.markdown-body tr:last-child td{border-bottom:0}.markdown-body th{background:var(--bg-panel);color:var(--text)}@supports (color:color-mix(in lab,red,red)){.markdown-body th{color:color-mix(in srgb,var(--text) 88%,var(--text-muted))}}.markdown-body th{font-weight:650}.markdown-body tbody tr:nth-child(2n) td{background:var(--bg-subtle)}.markdown-body hr{background:linear-gradient(90deg,transparent,var(--border),transparent);border:none;height:1px;margin:12px 0}.markdown-body .katex-display{margin:.6em 0;padding:2px 0;overflow:auto hidden}.markdown-body .katex{font-size:1.05em}.markdown-user-message p{white-space:pre-wrap}.markdown-custom-message{line-height:1.32}.markdown-custom-message p{margin:0}.markdown-custom-message h1,.markdown-custom-message h2,.markdown-custom-message h3,.markdown-custom-message h4,.markdown-custom-message h5,.markdown-custom-message h6{margin:4px 0 2px;line-height:1.18}.markdown-custom-message ol,.markdown-custom-message ul{margin:2px 0 3px}.markdown-custom-message li{margin:0}.markdown-custom-message blockquote{margin:3px 0;padding:4px 8px}.markdown-custom-message .markdown-code-block,.markdown-custom-message .markdown-table-wrap{margin:4px 0}.markdown-compaction-message{line-height:1.5}.markdown-compaction-message p{margin:0 0 7px}.markdown-compaction-message h1,.markdown-compaction-message h2,.markdown-compaction-message h3,.markdown-compaction-message h4,.markdown-compaction-message h5,.markdown-compaction-message h6{margin:8px 0 3px;line-height:1.25}.markdown-compaction-message ol,.markdown-compaction-message ul{margin:4px 0 8px}.markdown-compaction-message li{margin:2px 0}.markdown-compaction-message .markdown-code-block,.markdown-compaction-message .markdown-table-wrap{margin:6px 0}.markdown-subagent-text{font-size:var(--text-md);line-height:1.55}.markdown-subagent-text p{margin:0 0 6px}.markdown-subagent-text p:last-child{margin-bottom:0}.markdown-subagent-text h1,.markdown-subagent-text h2,.markdown-subagent-text h3,.markdown-subagent-text h4,.markdown-subagent-text h5,.markdown-subagent-text h6{margin:7px 0 3px;line-height:1.25}.markdown-subagent-text ol,.markdown-subagent-text ul{margin:3px 0 6px}.markdown-subagent-text li{margin:1px 0}.markdown-subagent-text blockquote{margin:4px 0;padding:4px 8px}.markdown-subagent-text .markdown-code-block,.markdown-subagent-text .markdown-table-wrap{margin:5px 0}.compaction-file-details{border-top:1px solid var(--border);color:var(--text-muted);font-size:var(--text-sm);margin-top:10px;padding-top:8px}.compaction-file-details summary{cursor:pointer;font-weight:600;line-height:1.4}.compaction-file-section{margin-top:8px}.compaction-file-title{color:var(--text);font-size:var(--text-sm);margin-bottom:4px;font-weight:650}.compaction-file-list{border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg-panel);max-height:180px;font-family:var(--font-mono);font-size:var(--text-sm);margin:0;padding:7px 8px;line-height:1.45;list-style:none;overflow:auto}.compaction-file-list li{overflow-wrap:anywhere}.compaction-file-list li+li{margin-top:3px}.markdown-code-block{border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg);box-shadow:0 1px 0 var(--border);margin:6px 0;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.markdown-code-block{box-shadow:0 1px 0 color-mix(in srgb,var(--border) 42%,transparent)}}.markdown-code-header{background:var(--bg-panel);border-bottom:1px solid var(--border);color:var(--text-dim);font-size:var(--text-sm);justify-content:space-between;align-items:center;gap:8px;padding:5px 10px;display:flex}.markdown-code-lang{color:var(--text-muted);font-family:var(--font-mono);font-weight:650}.markdown-code-actions{align-items:center;gap:6px;display:flex}.markdown-code-action{border:1px solid var(--border);border-radius:calc(var(--radius-control) - var(--space-1));background:var(--bg);color:var(--text-muted);cursor:pointer;font:inherit;font-size:var(--text-sm);padding:2px 7px;line-height:1.25}.markdown-code-action:hover:not(:disabled){color:var(--text);border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.markdown-code-action:hover:not(:disabled){border-color:color-mix(in srgb,var(--border) 70%,var(--text-muted))}}.markdown-code-action:hover:not(:disabled){background:var(--bg-hover)}.markdown-code-action.is-copied{color:var(--status-success);border-color:var(--status-success)}@supports (color:color-mix(in lab,red,red)){.markdown-code-action.is-copied{border-color:color-mix(in srgb,var(--status-success) 45%,var(--border))}}.markdown-code-action.is-copied{background:var(--bg-panel)}.markdown-code-action:disabled{color:var(--text-dim);cursor:not-allowed;opacity:.75}.markdown-code-action.is-active{background:var(--bg-selected);color:var(--text)}.mermaid-block{background:var(--bg);padding:12px;overflow-x:auto}@supports (color:color-mix(in lab,red,red)){.mermaid-block{background:color-mix(in srgb,var(--bg) 92%,var(--bg-panel))}}.mermaid-block svg{max-width:none;display:block}.mermaid-block-loading{min-height:120px;color:var(--text-muted);justify-content:center;align-items:center;gap:8px;font-size:12px;animation:pulse 1.4s ease-in-out infinite;display:flex}.mermaid-block-loading:after{content:"";border:2px solid var(--border);border-top-color:var(--accent);width:14px;height:14px;animation:spin var(--dur-spin) linear infinite;border-radius:50%}.mermaid-block-error{color:var(--text-muted);font-family:var(--font-mono);align-items:center;gap:10px;padding:12px;font-size:12px;display:flex}.mermaid-preview-button{width:100%;color:inherit;cursor:zoom-in;text-align:left;border:0}.mermaid-preview-button:hover{opacity:.85}.mermaid-preview-button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.mermaid-zoom-dialog{background:var(--bg);width:100vw;max-width:none;height:100dvh;max-height:none;color:var(--text);border:0;margin:0;padding:0}.mermaid-zoom-dialog::backdrop{background:var(--overlay-backdrop)}.mermaid-zoom-layout{grid-template-rows:auto minmax(0,1fr);height:100%;display:grid}.mermaid-zoom-toolbar{background:var(--bg-panel);border-bottom:1px solid var(--border);align-items:center;gap:10px;min-height:40px;padding:7px 10px;display:flex}.mermaid-zoom-title{min-width:0;color:var(--text-muted);font-family:var(--font-mono);font-size:var(--text-sm);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.mermaid-zoom-actions{align-items:center;gap:6px;margin-left:auto;display:flex}.mermaid-zoom-stepper{border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg);align-items:center;height:24px;display:flex;overflow:hidden}.mermaid-zoom-icon-button,.mermaid-zoom-stepper button{width:24px;height:24px;color:var(--text-muted);cursor:pointer;touch-action:manipulation;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.mermaid-zoom-stepper button{height:22px}.mermaid-zoom-stepper button+.mermaid-zoom-value,.mermaid-zoom-value+button{border-left:1px solid var(--border)}.mermaid-zoom-icon-button{border:1px solid var(--border);border-radius:var(--radius-control);flex:0 0 24px}.mermaid-zoom-icon-button:hover,.mermaid-zoom-stepper button:hover:not(:disabled){background:var(--bg-hover);color:var(--text)}.mermaid-zoom-stepper button:disabled{opacity:.35;cursor:default}.mermaid-zoom-icon-button:focus-visible,.mermaid-zoom-stepper button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.mermaid-zoom-value{min-width:48px;height:22px;color:var(--text-muted);font-family:var(--font-mono);font-size:var(--text-sm);text-align:center;-webkit-user-select:none;user-select:none;line-height:22px}.mermaid-zoom-viewport{background:var(--bg);-webkit-overflow-scrolling:touch;min-width:0;min-height:0;padding:24px;overflow:auto}.mermaid-zoom-canvas{border:1px solid var(--border);border-radius:var(--radius-card);background:var(--bg-panel);transition:transform var(--dur-fast) var(--ease-out-warm);margin:0 auto;padding:12px}.mermaid-zoom-canvas svg{height:auto;display:block;width:100%!important;max-width:none!important}@media (max-width:480px){.mermaid-zoom-toolbar{padding-inline:8px}.mermaid-zoom-title{font-size:var(--text-sm)}.mermaid-zoom-viewport{padding:12px}}.image-clickable{cursor:zoom-in;background:0 0;border:none;max-width:100%;padding:0;line-height:0;display:inline-block}.markdown-body .image-clickable{width:fit-content;display:block}.image-clickable:hover img{opacity:.85}.image-clickable:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:var(--radius-control)}.image-lightbox-dialog{background:var(--bg);width:100vw;max-width:none;height:100dvh;max-height:none;color:var(--text);border:0;margin:0;padding:0}.image-lightbox-dialog::backdrop{background:var(--overlay-backdrop)}.image-lightbox-layout{grid-template-rows:auto minmax(0,1fr);height:100%;display:grid}.image-lightbox-toolbar{background:var(--bg-panel);border-bottom:1px solid var(--border);align-items:center;gap:10px;min-height:40px;padding:7px 10px;display:flex}.image-lightbox-title{min-width:0;color:var(--text-muted);font-family:var(--font-mono);font-size:var(--text-sm);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.image-lightbox-actions{align-items:center;gap:6px;margin-left:auto;display:flex}.image-lightbox-stepper{border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg);align-items:center;height:24px;display:flex;overflow:hidden}.image-lightbox-icon-button,.image-lightbox-stepper button{width:24px;height:24px;color:var(--text-muted);cursor:pointer;touch-action:manipulation;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.image-lightbox-stepper button{height:22px}.image-lightbox-stepper button+.image-lightbox-zoom-value,.image-lightbox-zoom-value+button{border-left:1px solid var(--border)}.image-lightbox-icon-button{border:1px solid var(--border);border-radius:var(--radius-control);flex:0 0 24px}.image-lightbox-icon-button:hover,.image-lightbox-stepper button:hover:not(:disabled){background:var(--bg-hover);color:var(--text)}.image-lightbox-stepper button:disabled{opacity:.35;cursor:default}.image-lightbox-icon-button:focus-visible,.image-lightbox-stepper button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.image-lightbox-zoom-value{min-width:48px;height:22px;color:var(--text-muted);font-family:var(--font-mono);font-size:var(--text-sm);text-align:center;-webkit-user-select:none;user-select:none;line-height:22px}.image-lightbox-viewport{background:var(--bg);-webkit-overflow-scrolling:touch;min-width:0;min-height:0;padding:24px;display:flex;overflow:auto}.image-lightbox-dialog .image-lightbox-img{max-width:none;height:auto;transition:transform var(--dur-fast) var(--ease-out-warm);margin:auto;display:block}@media (max-width:480px){.image-lightbox-toolbar{padding-inline:8px}.image-lightbox-title{font-size:var(--text-sm)}.image-lightbox-viewport{padding:12px}}.file-viewer-toolbar{min-width:0;min-height:35px}.file-viewer-path{flex:auto;min-width:48px}.file-viewer-meta,.file-viewer-path{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.file-viewer-meta{flex:0 auto;min-width:0}.file-viewer-live-indicator{border-radius:50%;flex:0 0 7px;width:7px;height:7px}.file-viewer-controls{gap:6px}.file-viewer-actions,.file-viewer-controls{flex-shrink:0;align-items:center;display:flex}.file-viewer-actions{order:-1;gap:4px;height:24px}.file-viewer-mode-switch{border:1px solid var(--border);border-radius:var(--radius-control);height:24px;display:flex;overflow:hidden}.file-viewer-mode-button{border:0;border-left:1px solid var(--border);height:22px;font:inherit;font-size:var(--text-sm);letter-spacing:0;cursor:pointer;white-space:nowrap;padding:0 8px;font-weight:500}.file-viewer-mode-button:first-child{border-left:0}.file-viewer-mode-button:hover{filter:brightness(1.08)}.file-viewer-icon-button{box-sizing:border-box;border:1px solid var(--border);border-radius:var(--radius-control);width:24px;height:24px;color:var(--text-muted);cursor:pointer;background:0 0;flex:0 0 24px;justify-content:center;align-items:center;padding:0;text-decoration:none;display:inline-flex}.file-viewer-icon-button:hover{color:var(--text);background:var(--bg-hover)!important}.file-viewer-icon-button:disabled{color:var(--text-dim);cursor:not-allowed;opacity:.55}.file-viewer-icon-button:disabled:hover{color:var(--text-dim);background:0 0!important}.file-viewer-icon-button:focus-visible,.file-viewer-mode-button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.directory-picker-path:focus-visible{box-shadow:0 0 0 3px var(--accent);border-color:var(--accent)!important}@supports (color:color-mix(in lab,red,red)){.directory-picker-path:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 18%,transparent)}}.directory-picker-action:focus-visible,.directory-picker-back:focus-visible,.directory-picker-entry:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.session-item-button{font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;padding:0}.session-item-button:focus-visible,.session-item-icon-button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px;border-radius:var(--radius-control)}.sidebar-new-session:focus-visible,.sidebar-project-action:focus-visible,.sidebar-project-header>button:focus-visible,.sidebar-project-identity:focus-visible,.sidebar-settings-row:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.sidebar-menu-item{text-align:left;cursor:pointer;width:100%;transition:background var(--dur-fast) var(--ease-out-warm);background:0 0;border:none;display:block}.sidebar-menu-item:hover:not(:disabled){background:var(--bg-hover)}.sidebar-menu-item:focus-visible{outline:2px solid var(--accent);outline-offset:-2px;border-radius:var(--radius-control)}.sidebar-project{isolation:isolate;transition:margin var(--dur-med) var(--ease-out-warm);position:relative}.sidebar-project-header{z-index:1;position:relative}.sidebar-project-worktree{animation:sidebar-worktree-in var(--dur-fast) var(--ease-out-warm) both;margin:0 0 0 32px;padding:0 0 2px 6px}.sidebar-project-worktree>div{width:auto!important;margin:0!important}.sidebar-project-worktree button{width:100%!important;max-width:none!important}@keyframes sidebar-worktree-in{0%{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:translateY(0)}}@keyframes sidebar-sessions-in{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.sidebar-project-activity{transition:transform var(--dur-fast) var(--ease-out-warm),opacity var(--dur-fast) var(--ease-out-warm)}.sidebar-project:hover .sidebar-project-activity{transform:translate(-1px)}.chat-input-shell{transition:border-color var(--dur-med) var(--ease-out-warm),box-shadow var(--dur-med) var(--ease-out-warm),transform var(--dur-med) var(--ease-out-warm)}.chat-input-shell:focus-within{transform:none}.composer-control-shelf{animation:ui-slide-up var(--dur-fast) var(--ease-out-warm) both}.composer-control-shelf>button{transition:background var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm),border-color var(--dur-fast) var(--ease-out-warm),transform var(--dur-fast) var(--ease-out-warm)}.composer-control-shelf>button:hover:not(:disabled){transform:none;background:var(--bg-hover)!important;color:var(--text)!important}@media (min-width:641px){.composer-control-shelf{border-top:1px solid var(--border);justify-content:flex-end;max-width:min(100%,760px);padding-top:4px;gap:4px!important}@supports (color:color-mix(in lab,red,red)){.composer-control-shelf{border-top:1px solid color-mix(in srgb,var(--border) 72%,transparent)}}.composer-control-shelf>button{border-radius:var(--radius-control)!important;height:28px!important;font-size:var(--text-sm)!important;padding-inline:8px!important}}@media (max-width:640px){.file-viewer-meta{display:none}}@media (max-width:380px){.file-viewer-toolbar{gap:6px!important;padding-inline:8px!important}.file-viewer-mode-button{padding-inline:6px}}.markdown-file-preview h1{font-size:1.8em}.markdown-file-preview h2{font-size:1.4em}.markdown-file-preview h3{font-size:1.15em}.markdown-file-preview p{margin:0 0 12px}.markdown-file-preview pre{border:1px solid var(--border);border-radius:var(--radius-card);font-size:var(--text-md);margin:12px 0;padding:12px 16px;overflow-x:auto}.markdown-file-preview code,.markdown-file-preview pre{background:var(--bg-panel);font-family:var(--font-mono)}.markdown-file-preview code{border-radius:3px;padding:1px 5px;font-size:.9em}.markdown-file-preview pre code{background:0 0;padding:0}.markdown-body span.linenumber,span.linenumber{color:var(--text-dim)!important;font-style:normal!important}span.token.table{display:inline}@keyframes drop-zone-in{0%{opacity:0;transform:scale(.97)}to{opacity:1;transform:scale(1)}}@keyframes drop-ripple{0%{opacity:.6;transform:scale(0)}to{opacity:0;transform:scale(1)}}.drop-zone-overlay{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.drop-zone-overlay{background:color-mix(in srgb,var(--accent) 6%,transparent)}}.drop-zone-overlay{animation:drop-zone-in var(--dur-fast) var(--ease-out-warm) both}.drop-ripple-ring{border-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.drop-ripple-ring{border-color:color-mix(in srgb,var(--accent) 50%,transparent)}}.drop-ripple-ring{animation:drop-ripple 2.4s var(--ease-out-warm) infinite backwards}.drop-zone-illustration{filter:drop-shadow(0 6px 18px var(--accent))}@supports (color:color-mix(in lab,red,red)){.drop-zone-illustration{filter:drop-shadow(0 6px 18px color-mix(in srgb,var(--accent) 18%,transparent))}}@keyframes spin{to{transform:rotate(1turn)}}.icon-spin{animation:spin var(--dur-spin) linear infinite}@keyframes pulse{50%{opacity:.5}}@keyframes skeleton-shimmer{0%{background-position:-150% 0}to{background-position:150% 0}}.skeleton{background:linear-gradient(90deg,var(--bg-subtle) 0,var(--text-dim) 50%,var(--bg-subtle) 100%)}@supports (color:color-mix(in lab,red,red)){.skeleton{background:linear-gradient(90deg,var(--bg-subtle) 0,color-mix(in srgb,var(--text-dim) 10%,var(--bg-subtle)) 50%,var(--bg-subtle) 100%)}}.skeleton{border-radius:var(--radius-control);background-size:200% 100%;animation:skeleton-shimmer 1.6s ease-in-out infinite}.skeleton-lines{gap:var(--space-4);flex-direction:column;width:100%;display:flex}.skeleton-line{border-radius:var(--radius-control);background:linear-gradient(90deg,var(--bg-subtle) 0,var(--text-dim) 50%,var(--bg-subtle) 100%);height:12px;display:block}@supports (color:color-mix(in lab,red,red)){.skeleton-line{background:linear-gradient(90deg,var(--bg-subtle) 0,color-mix(in srgb,var(--text-dim) 10%,var(--bg-subtle)) 50%,var(--bg-subtle) 100%)}}.skeleton-line{background-size:200% 100%;animation:skeleton-shimmer 1.6s ease-in-out infinite}.skeleton-line:first-child{width:85%}.skeleton-line:nth-child(2){width:65%}.skeleton-line:nth-child(3){width:45%}.skeleton-lines>.skeleton:first-child{width:85%}.skeleton-lines>.skeleton:nth-child(2){width:65%}.skeleton-lines>.skeleton:nth-child(3){width:45%}.chat-input-shell:focus-within{border-color:var(--accent)!important}@supports (color:color-mix(in lab,red,red)){.chat-input-shell:focus-within{border-color:color-mix(in srgb,var(--accent) 45%,transparent)!important}}.chat-input-shell:focus-within{box-shadow:var(--shadow-card),0 0 0 3px var(--accent)!important}@supports (color:color-mix(in lab,red,red)){.chat-input-shell:focus-within{box-shadow:var(--shadow-card),0 0 0 3px color-mix(in srgb,var(--accent) 14%,transparent)!important}}@keyframes ui-fade-in{0%{opacity:0}to{opacity:1}}@keyframes ui-scale-in{0%{opacity:0;transform:scale(.96)translateY(-4px)}to{opacity:1;transform:scale(1)translateY(0)}}@keyframes ui-slide-down{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}@keyframes ui-slide-up{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes ui-sheet-slide-up{0%{opacity:.8;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes ui-sheet-backdrop-in{0%{opacity:0}to{opacity:1}}.animate-fade-in{animation:ui-fade-in var(--dur-fast) var(--ease-out-warm) both}.animate-scale-in{animation:ui-scale-in var(--dur-med) var(--ease-out-warm) both}.animate-slide-down{animation:ui-slide-down var(--dur-med) var(--ease-out-warm) both}.animate-slide-up{animation:ui-slide-up var(--dur-med) var(--ease-out-warm) both}@keyframes dialog-backdrop-in{0%{opacity:0}to{opacity:1}}.dialog-backdrop-animate{animation:dialog-backdrop-in var(--dur-med) var(--ease-out-warm) both;transition:opacity var(--dur-med) var(--ease-out-warm)}.dialog-popup-animate{animation:dialog-pop-in var(--dur-med) var(--ease-out-warm) both;transition:width var(--dur-med) var(--ease-out-warm),height var(--dur-med) var(--ease-out-warm),max-width var(--dur-med) var(--ease-out-warm),max-height var(--dur-med) var(--ease-out-warm),border-radius var(--dur-med) var(--ease-out-warm),box-shadow var(--dur-med) var(--ease-out-warm);will-change:transform,opacity}.accordion-flow{transition:grid-template-rows var(--dur-med) var(--ease-out-warm),opacity var(--dur-med) var(--ease-out-warm);opacity:0;grid-template-rows:0fr;display:grid}.accordion-flow.is-open{opacity:1;grid-template-rows:1fr}.accordion-flow-inner{min-height:0;overflow:hidden}.chevron-smooth{transition:transform var(--dur-med) var(--ease-out-warm)}@keyframes dialog-pop-in{0%{opacity:0;transform:translate(-50%,-46%)scale(.97)}to{opacity:1;transform:translate(-50%,-50%)scale(1)}}.dropdown-surface{background:var(--bg-panel);border:1px solid var(--border);border-radius:var(--radius-control);box-shadow:var(--shadow-pop);color:var(--text);animation:ui-scale-in var(--dur-fast) var(--ease-out-warm) both;overflow:hidden}.dropdown-item{color:var(--text-muted);transition:background-color var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm)}.dropdown-item:focus-visible,.dropdown-item:hover{background:var(--bg-hover);color:var(--text);outline:none}.dropdown-item[aria-current=true],.dropdown-item[aria-selected=true],.dropdown-item[data-active=true]{background:var(--bg-selected);color:var(--text)}.dropdown-surface :is(select,option){color-scheme:light}html.dark .dropdown-surface :is(select,option){color-scheme:dark}@keyframes chat-message-in{0%{opacity:0;transform:translateY(7px)scale(.995)}to{opacity:1;transform:translateY(0)scale(1)}}.chat-message-card{animation:chat-message-in var(--dur-med) var(--ease-out-warm) both;transition:border-color var(--dur-fast) var(--ease-out-warm),transform var(--dur-fast) var(--ease-out-warm)}.chat-message-card:hover{transform:none}.chat-action-row{align-items:center;gap:var(--space-2);min-width:0;display:flex}.chat-action-group{align-items:center;gap:calc(var(--space-3) / 2);display:flex}.chat-action-btn{align-items:center;gap:var(--space-2);padding:calc(var(--space-3) / 2) var(--space-4);height:calc(var(--control-height-sm) - var(--space-2));min-height:calc(var(--control-height-sm) - var(--space-2));border-radius:calc(var(--radius-control) - var(--space-3) / 2);cursor:pointer;color:var(--text-dim);font-size:var(--text-sm);white-space:nowrap;touch-action:manipulation;transition:color var(--dur-fast) var(--ease-out-warm),background-color var(--dur-fast) var(--ease-out-warm),opacity var(--dur-fast) var(--ease-out-warm);background:0 0;border:none;font-weight:400;display:inline-flex}.chat-action-btn:hover{color:var(--accent)}.chat-action-btn:focus-visible{outline:2px solid var(--focus-ring-color);outline-offset:1px;color:var(--accent)}.chat-action-btn[disabled]{cursor:not-allowed;opacity:.6}.chat-action-btn.is-active{color:var(--accent)}@media (hover:hover) and (pointer:fine){.chat-action-group{opacity:0;pointer-events:none;transition:opacity var(--dur-fast) var(--ease-out-warm)}.chat-action-group.is-visible,.chat-action-group:focus-within,.chat-message-container:focus-within .chat-action-group,.chat-message-container:hover .chat-action-group,.chat-message:focus-within .chat-action-group,.chat-message:hover .chat-action-group{opacity:1;pointer-events:auto}}@media (hover:none),(max-width:640px),(pointer:coarse){.chat-action-group{opacity:1!important;pointer-events:auto!important}.chat-action-btn{min-height:var(--control-touch,44px);min-width:var(--control-touch,44px);padding:var(--space-2) var(--space-3);font-size:var(--text-md)}}.chat-message,.chat-message--live{animation:chat-message-in var(--dur-med) var(--ease-out-warm) both}.chat-message--live{position:relative}.chat-message--live:before{content:"";background:var(--accent);opacity:0;width:3px;animation:live-text-pulse 2.4s ease-in-out var(--dur-med) infinite;pointer-events:none;border-radius:2px;position:absolute;top:4px;bottom:4px;left:0}@keyframes live-text-pulse{0%,to{opacity:0}50%{opacity:.3}}@keyframes toast-in{0%{opacity:0;transform:translate(18px,8px)scale(.97)}to{opacity:1;transform:translate(0)scale(1)}}.toast-card{animation:toast-in var(--dur-med) var(--ease-out-warm) both;transition:transform var(--dur-fast) var(--ease-out-warm),border-color var(--dur-fast) var(--ease-out-warm),box-shadow var(--dur-fast) var(--ease-out-warm)}.toast-card:hover{border-color:var(--accent)!important}@supports (color:color-mix(in lab,red,red)){.toast-card:hover{border-color:color-mix(in srgb,var(--accent) 30%,var(--border))!important}}.toast-card:hover{transform:translateY(-2px);box-shadow:var(--shadow-modal)!important}.live-status-dot{isolation:isolate;box-shadow:0 0 0 3px var(--accent);position:relative}@supports (color:color-mix(in lab,red,red)){.live-status-dot{box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 10%,transparent)}}.live-pulse:after{content:"";border:1.5px solid var(--accent);border-radius:9999px;position:absolute;inset:0}@supports (color:color-mix(in lab,red,red)){.live-pulse:after{border:1.5px solid color-mix(in srgb,var(--accent) 55%,transparent)}}.live-pulse:after{animation:live-dot-pulse 1.5s var(--ease-out-warm) infinite;pointer-events:none;will-change:transform,opacity}@keyframes live-dot-pulse{0%{opacity:.9;transform:scale(1)}70%{opacity:0;transform:scale(2.6)}to{opacity:0;transform:scale(2.6)}}.mcp-editor-grid>:first-child{min-width:0}@media (max-width:640px){.mcp-editor-grid{grid-template-columns:1fr!important}.mcp-editor-grid>:first-child{border-bottom:1px solid var(--border);border-right:0!important}.empty-chat-brand{margin-left:0!important;margin-right:0!important}.model-role-row{gap:6px!important}.model-detail-grid-2,.model-role-row{grid-template-columns:1fr!important}.model-detail-grid-4{grid-template-columns:1fr 1fr!important}}.ui-smooth{transition:background-color var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm),border-color var(--dur-fast) var(--ease-out-warm),opacity var(--dur-fast) var(--ease-out-warm),transform var(--dur-fast) var(--ease-out-warm)}.ui-focus-ring:focus-visible{outline-offset:-2px;outline:2px solid var(--accent)!important}.ui-control{min-height:var(--control-height);padding-inline:var(--control-padding-inline);font:inherit}.ui-control,.ui-icon-button{border-radius:var(--radius-control)}.ui-icon-button{width:var(--control-height);height:var(--control-height);flex:0 0 var(--control-height);justify-content:center;align-items:center;padding:0;display:inline-flex}.ui-compact-surface{border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg-panel);color:var(--text-muted)}.shell-toolbar-btn{border-radius:var(--radius-control);width:28px;height:28px;color:var(--text);cursor:pointer;transition:background var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.shell-toolbar-btn:hover:not(:disabled){background:var(--bg-hover);color:var(--text)}.shell-toolbar-btn:disabled{color:var(--text-dim);cursor:default;opacity:.5}.shell-toolbar-btn[aria-pressed=true]:not([data-theme-toggle]){background:var(--bg-selected);color:var(--text)}.shell-toolbar-btn:focus-visible{outline:2px solid var(--accent);outline-offset:-1px}.shell-toolbar-utility{flex:none;order:1}.shell-session-actions,.shell-toolbar-utility{align-items:center;gap:var(--space-2);min-width:0;height:100%;display:flex}.shell-session-actions{flex:auto;order:3;overflow:hidden}.shell-session-actions>*{flex:none;min-width:0}.shell-toolbar-divider{width:1px;height:18px;margin:0 var(--space-4);background:var(--border);flex:none;order:2}.shell-topbar{min-width:0;height:var(--shell-topbar-height);border-bottom:1px solid var(--border);background:var(--bg-panel);padding-right:calc(var(--shell-file-toggle-size) + var(--space-2) + (var(--shell-topbar-height) - var(--shell-file-toggle-size)) / 2);flex-shrink:0}.shell-stats-btn,.shell-topbar{align-items:center;display:flex}.shell-stats-btn{min-width:var(--control-touch-icon);justify-content:center;gap:var(--control-padding-inline);padding:0 var(--control-padding-inline);height:100%;font-size:var(--text-sm);color:var(--text-muted);white-space:nowrap;cursor:pointer;font-variant-numeric:tabular-nums;transition:color var(--dur-fast) var(--ease-out-warm),background var(--dur-fast) var(--ease-out-warm);background:0 0;border:none;flex:none;order:4;overflow:hidden}.shell-stats-btn:hover{background:var(--bg-hover);color:var(--text)}.shell-stats-btn[aria-pressed=true]{background:var(--bg-selected);color:var(--text)}.shell-file-toggle{top:calc((var(--shell-topbar-height) - var(--shell-file-toggle-size)) / 2);right:calc((var(--shell-topbar-height) - var(--shell-file-toggle-size)) / 2);z-index:var(--z-file-toggle);width:var(--shell-file-toggle-size);height:var(--shell-file-toggle-size);position:fixed}@media (max-width:640px){:root{--shell-topbar-height:calc(44px + env(safe-area-inset-top,0px));--shell-file-toggle-size:44px;--composer-ring-size:28px;--composer-control-h:var(--control-height);--composer-thinking-max-w:66px;--control-touch:44px;--control-touch-icon:44px;--composer-shell-padding:var(--space-5) max(var(--space-5),env(safe-area-inset-right,0px)) var(--space-2) max(calc(var(--space-5) + var(--space-1)),env(safe-area-inset-left,0px))}.shell-topbar{height:var(--shell-topbar-height);padding-top:env(safe-area-inset-top,0);padding-left:env(safe-area-inset-left,0);padding-right:calc(var(--shell-file-toggle-size) + var(--space-2) + env(safe-area-inset-right,0px))}.shell-file-toggle{top:env(safe-area-inset-top,0);right:env(safe-area-inset-right,0);min-width:var(--shell-file-toggle-size);min-height:var(--shell-file-toggle-size);width:var(--shell-file-toggle-size);height:var(--shell-file-toggle-size)}.shell-session-actions,.shell-toolbar-utility{gap:var(--space-2)}.shell-stats-btn{padding:0 var(--space-3);order:3;min-width:44px;min-height:44px}.shell-session-actions{order:4}.shell-session-actions button,.shell-toolbar-btn{min-width:44px;min-height:44px}.shell-toolbar-btn{width:44px;height:44px}.shell-toolbar-divider{margin:0 var(--space-2)}.tabbar-scroll{height:44px!important}.tabbar-close,.tabbar-tab{height:44px!important;min-height:44px!important}.tabbar-close{width:44px!important;min-width:44px!important}.chat-input-textarea{font-size:16px!important}}.process-details-toggle{border-radius:var(--radius-control);width:auto;min-height:24px;color:var(--text-muted);cursor:pointer;font:inherit;font-size:var(--text-sm);text-align:left;transition:background var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm);background:0 0;border:none;align-items:center;gap:6px;margin-left:-8px;padding:2px 8px;display:flex}.process-details-toggle:hover{background:var(--bg-hover);color:var(--text)}.process-details-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:0}.process-details-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.tabbar-scroll{border-bottom:1px solid var(--border);scrollbar-width:thin;scrollbar-color:var(--border) transparent}.tabbar-tab{transition:background var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm)}.tabbar-tab[aria-selected=true]{box-shadow:inset 0 1px 0 var(--accent);background:var(--bg-selected)!important;color:var(--text)!important}@supports (color:color-mix(in lab,red,red)){.tabbar-tab[aria-selected=true]{box-shadow:inset 0 1px 0 color-mix(in srgb,var(--accent) 14%,transparent)}}.tabbar-tab:hover:not([aria-selected=true]){background:var(--bg-hover)!important;color:var(--text)!important}.tabbar-close{transition:background var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm)}@keyframes notice-shelf-in{0%{opacity:0;transform:translateY(-6px)scale(.995)}to{opacity:1;transform:translateY(0)}}@keyframes notice-shelf-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-5px)}}@media (prefers-reduced-motion:reduce){.notice-shelf-item{animation-duration:.001ms!important}html{scroll-behavior:auto}*,:after,:before{scroll-behavior:auto!important;transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}.skeleton,.skeleton-line,.skeleton-lines>.skeleton{background:var(--bg-subtle)!important;animation:none!important}.live-pulse:after{display:none!important}.live-pulse:after,.mermaid-block-loading,.mermaid-block-loading:after{animation:none!important}.chat-message--live:before{opacity:.3!important;animation:none!important}}@keyframes saved-pop{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--status-success) 55%,transparent);transform:scale(1)}40%{box-shadow:0 0 0 6px color-mix(in srgb,var(--status-success) 25%,transparent);transform:scale(1.08)}to{box-shadow:0 0 0 0 color-mix(in srgb,var(--status-success) 0%,transparent);transform:scale(1)}}@keyframes saved-check-draw{0%{stroke-dashoffset:18px;opacity:0}to{stroke-dashoffset:0;opacity:1}}@media (min-width:641px){.sidebar-overlay-backdrop{display:none!important}.sidebar-container{--sidebar-width:260px;transition:width var(--dur-med) var(--ease-out-warm),min-width var(--dur-med) var(--ease-out-warm);position:relative;overflow:hidden}.sidebar-container.sidebar-open{width:var(--sidebar-width,260px);min-width:var(--sidebar-width,260px)}.sidebar-container.sidebar-closed{width:0;min-width:0;border-right:none!important}.sidebar-container>*{width:var(--sidebar-width,260px);min-width:var(--sidebar-width,260px)}.sidebar-container.sidebar-resizing{transition:none}.right-panel-container{transition:width var(--dur-med) var(--ease-out-warm),min-width var(--dur-med) var(--ease-out-warm);flex-shrink:0;overflow:hidden}.right-panel-container.right-panel-open{width:var(--right-panel-width);min-width:300px;max-width:calc(100vw - 360px)}.right-panel-container.right-panel-closed{width:0;min-width:0;border-left:none!important}.right-panel-container>*{width:var(--right-panel-width);min-width:300px}.right-panel-container.right-panel-resizing{transition:none}}.composer-attachment{width:var(--composer-attachment-w);height:var(--composer-attachment-w);border-radius:var(--radius-control);color:var(--text-muted);cursor:pointer;transition:background var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.composer-attachment[data-has-attachments=true]{color:var(--accent)}.composer-attachment:hover:not(:disabled){background:var(--bg-hover);color:var(--text)}.composer-attachment[data-has-attachments=true]:hover:not(:disabled){color:var(--accent)}.composer-attachment:disabled{cursor:not-allowed;opacity:.5}.composer-model-button,.composer-thinking-button{align-items:center;gap:var(--space-2,4px);height:var(--composer-control-h,var(--control-height-sm));padding:0 var(--space-4);border-radius:var(--radius-control);color:var(--text-muted);font-size:var(--text-sm);transition:background var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm);border:none;display:flex}.composer-model-button{max-width:190px;overflow:hidden}.composer-model-button:disabled,.composer-thinking-button:disabled{cursor:not-allowed;opacity:.5}.composer-fast-toggle{gap:var(--space-2,4px);height:var(--composer-control-h,var(--control-height-sm));padding:0 var(--space-4);border-radius:var(--radius-control);transition:background var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm);background:0 0}.composer-fast-toggle,.composer-primary-action{align-items:center;font-size:var(--text-md);border:none;font-weight:600;display:flex}.composer-primary-action{justify-content:center;gap:var(--space-3);width:var(--composer-send-size);min-width:var(--composer-send-size);height:var(--composer-send-size);border-radius:50%;padding:0}.composer-primary-label{display:none}.composer-primary-action[data-state=stop]{background:var(--accent-strong);color:var(--on-accent);cursor:pointer;transition:background var(--dur-fast) var(--ease-out-warm)}.composer-primary-action[data-state=run-submit],.composer-primary-action[data-state=send]{background:var(--accent-strong);color:var(--on-accent);cursor:pointer;box-shadow:var(--shadow-card);transition:background var(--dur-fast) var(--ease-out-warm),box-shadow var(--dur-fast) var(--ease-out-warm)}.composer-primary-action[data-state=run-submit]:disabled,.composer-primary-action[data-state=send]:disabled{background:var(--bg-panel);color:var(--text-dim);cursor:not-allowed;box-shadow:none}.composer-context-ring-wrap{width:var(--composer-ring-size);height:var(--composer-ring-size)}.composer-context-ring,.composer-context-ring-wrap{flex-shrink:0;justify-content:center;align-items:center;display:inline-flex;position:relative}.composer-context-ring{width:100%;height:100%;color:inherit;cursor:pointer;font:inherit;background:0 0;border:0;border-radius:9999px;padding:0}.composer-context-ring:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.composer-context-ring-popup{z-index:20;white-space:nowrap;flex-direction:column;gap:5px;min-width:190px;padding:12px 14px;display:flex;position:absolute;bottom:calc(100% + 8px);right:0}.composer-context-ring-popup-title{color:var(--text);font-size:var(--text-base);font-weight:600}.composer-context-ring-popup-used{color:var(--text);font-size:var(--text-md);font-variant-numeric:tabular-nums;font-weight:500}.composer-context-ring-popup-meta{color:var(--text-muted);font-size:var(--text-sm);font-variant-numeric:tabular-nums}.composer-context-ring-label{color:var(--text-muted);font-variant-numeric:tabular-nums;font-size:8px;font-weight:600}.composer-model-name{white-space:nowrap;text-align:left;direction:rtl;unicode-bidi:plaintext;min-width:0;line-height:1.2}.composer-model-name,.model-option-name{text-overflow:ellipsis;overflow:hidden}.composer-queue-action{align-items:center;gap:var(--space-2,4px);height:var(--composer-control-h,var(--control-height-sm));padding:0 var(--space-4,8px);border-radius:var(--radius-control);font-size:var(--text-md,12px);cursor:pointer;transition:background var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm);background:0 0;border:none;flex-shrink:0;font-weight:600;display:inline-flex}.composer-queue-action-steer{color:var(--status-warning);background:var(--status-warning-subtle)}.composer-queue-action-followup{color:var(--accent);background:var(--accent-subtle)}.composer-queue-action:disabled{color:var(--text-dim);cursor:not-allowed;background:0 0}@media (max-width:640px){.chat-stats-center{display:none!important}.model-option-name{white-space:normal;overflow-wrap:anywhere;line-height:1.35}.composer-toolbar{grid-template-columns:var(--composer-attachment-w) minmax(0,1fr) minmax(0,var(--composer-thinking-max-w)) var(--composer-ring-size) var(--composer-send-size);align-items:center;gap:var(--space-3)!important;display:grid!important}.composer-attachment{touch-action:manipulation;order:1;grid-area:1/1;width:var(--composer-attachment-w)!important;height:var(--composer-send-size)!important;min-width:var(--composer-attachment-w)!important;min-height:var(--composer-send-size)!important;border-radius:var(--radius-control)!important}.composer-model-control{order:2;grid-area:1/2;min-width:0}.composer-model-button{touch-action:manipulation;width:100%;max-width:none!important;height:var(--composer-control-h)!important;min-height:var(--composer-control-h)!important;padding-inline:var(--space-4)!important;border-radius:var(--radius-control)!important;font-size:var(--text-md)!important}.composer-thinking-control{min-width:0;max-width:var(--composer-thinking-max-w);order:3;grid-area:1/3}.composer-thinking-button{touch-action:manipulation;justify-content:center;width:100%;min-width:0;overflow:hidden;height:var(--composer-control-h)!important;min-height:var(--composer-control-h)!important;gap:var(--space-1)!important;padding-inline:var(--space-2)!important;border-radius:var(--radius-control)!important;font-size:var(--text-md)!important}.composer-primary-action{touch-action:manipulation;order:5;grid-area:1/5;justify-content:center;width:var(--composer-send-size)!important;min-width:var(--composer-send-size)!important;height:var(--composer-send-size)!important;min-height:var(--composer-send-size)!important;font-size:var(--text-base)!important;border-radius:50%!important;padding-inline:0!important}.composer-primary-label,.composer-queue-action{display:none}.composer-fast-toggle{order:8;grid-area:2/1/auto/span 2;justify-self:start;height:var(--control-height-lg,36px)!important}.composer-toolbar-spacer{display:none}.composer-context-ring-wrap{order:4;grid-area:1/4;justify-self:end}.sidebar-container{width:var(--sidebar-mobile-width);box-sizing:border-box;max-width:85vw;padding-top:env(safe-area-inset-top,0);padding-left:env(safe-area-inset-left,0);padding-bottom:env(safe-area-inset-bottom,0);transition:transform var(--dur-slow) var(--ease-out-warm),box-shadow var(--dur-slow) var(--ease-out-warm);top:0;bottom:0;left:0;position:fixed!important}.sidebar-container.sidebar-open{box-shadow:var(--shadow-modal);transform:translate(0)}.sidebar-container.sidebar-closed{box-shadow:none;transform:translate(-100%)}.right-panel-container{transition:width var(--dur-med) var(--ease-out-warm),min-width var(--dur-med) var(--ease-out-warm);flex-shrink:0;overflow:hidden}.right-panel-container.right-panel-open{box-sizing:border-box;width:100%;min-width:0;padding:env(safe-area-inset-top,0) env(safe-area-inset-right,0) env(safe-area-inset-bottom,0) env(safe-area-inset-left,0)}.right-panel-container.right-panel-closed{border-left:none!important;width:0!important;min-width:0!important;display:none!important}.directory-picker-action,.directory-picker-back,.directory-picker-entry{min-height:44px!important}.directory-picker-back{min-width:44px!important}.directory-picker-footer{flex-wrap:wrap;padding-bottom:max(10px,env(safe-area-inset-bottom))!important}}@media (max-width:420px){.composer-toolbar{grid-template-columns:var(--composer-attachment-w) minmax(0,1fr) minmax(0,var(--composer-thinking-max-w)) var(--composer-ring-size) var(--composer-send-size);gap:var(--space-1,2px)!important}}.sidebar-shell{word-break:keep-all;flex-direction:column;height:100%;display:flex;overflow:hidden}.sidebar-path-label{text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;min-width:0;line-height:1.35;display:block;overflow:hidden}.sidebar-path-label-text{unicode-bidi:plaintext}.sidebar-icon-button{width:calc(var(--control-height-sm) - var(--space-1));height:calc(var(--control-height-sm) - var(--space-1));border-radius:var(--radius-control);color:var(--text-dim);cursor:pointer;transition:background var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm),border-color var(--dur-fast) var(--ease-out-warm);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;line-height:0;display:flex}.sidebar-icon-button:hover:not(:disabled),.sidebar-icon-button[aria-pressed=true]{background:var(--bg-hover);color:var(--accent)}.sidebar-icon-button:disabled{cursor:default;opacity:.5}.sidebar-portal-menu{z-index:var(--z-dialog-backdrop);padding:var(--space-2);border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg-panel);box-shadow:var(--shadow-pop);position:fixed}.sidebar-worktree-menu{overflow:hidden}.sidebar-brand{min-width:6ch;color:var(--text);cursor:pointer;font-family:var(--font-mono);font-size:var(--text-lg);letter-spacing:-.01em;background:0 0;border:none;padding:0;font-weight:700;line-height:1}.sidebar-brand-accent,.sidebar-brand-dynamic[data-version=true]{color:var(--accent)}.sidebar-brand-dynamic[data-version=false],.sidebar-brand-name{color:var(--text)}.sidebar-shell .sidebar-header{gap:var(--space-4);padding:calc(var(--space-5) - var(--space-1)) calc(var(--space-5) - var(--space-1)) var(--space-4);border-bottom:1px solid var(--border);flex-direction:column;flex-shrink:0;display:flex}.sidebar-header-actions,.sidebar-header-row{align-items:center;display:flex}.sidebar-header-row{justify-content:space-between}.sidebar-header-actions{gap:var(--space-1)}.sidebar-import-input{display:none}.sidebar-new-session{width:100%;height:calc(var(--control-height-lg) + var(--space-1));box-sizing:border-box;justify-content:center;align-items:center;gap:calc(var(--space-4) - var(--space-1) / 2);padding:0 var(--space-5);border:1px solid var(--border);border-radius:calc(var(--radius-control) + var(--space-1) / 2);background:var(--bg-hover);color:var(--text);cursor:pointer;font-size:calc(var(--text-base) - var(--space-1) / 4);letter-spacing:-.01em;opacity:1;transition:background var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm),border-color var(--dur-fast) var(--ease-out-warm);font-weight:600;display:flex}.sidebar-new-session:hover:not(:disabled){background:var(--bg-selected);border-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.sidebar-new-session:hover:not(:disabled){border-color:color-mix(in srgb,var(--accent) 30%,transparent)}}.sidebar-new-session:disabled{color:var(--text-dim);cursor:not-allowed;opacity:.65}.sidebar-new-session-icon{color:var(--accent);flex-shrink:0}.sidebar-workspaces-header{align-items:center;gap:var(--space-1);padding:var(--space-2) calc(var(--space-5) - var(--space-1)) var(--space-1);flex-shrink:0;display:flex}.sidebar-section-label{color:var(--text-muted);font-size:var(--text-sm);letter-spacing:.08em;text-transform:uppercase;flex:1;font-weight:600}.sidebar-search-wrap{padding:0 calc(var(--space-5) - var(--space-1)) var(--space-3);flex-shrink:0}.sidebar-search-input{width:100%;height:calc(var(--control-height-sm) - var(--space-1) / 2);box-sizing:border-box;padding:0 calc(var(--space-4) + var(--space-1) / 2);border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg);color:var(--text);font-size:var(--text-md);transition:border-color var(--dur-fast) var(--ease-out-warm),box-shadow var(--dur-fast) var(--ease-out-warm);outline:none;display:block}.sidebar-search-input:focus{border-color:var(--accent);box-shadow:var(--focus-ring)}.sidebar-workspaces-list{min-height:80px;padding:var(--space-1) calc(var(--space-5) - var(--space-1)) var(--space-4);transition:flex var(--dur-med) var(--ease-out-warm);overflow-y:auto}.sidebar-state-message{padding:var(--space-5) var(--space-2);font-size:var(--text-md);line-height:1.5}.sidebar-state-message-muted{color:var(--text-muted)}.sidebar-state-message-error{color:var(--accent)}.sidebar-state-message-dim{color:var(--text-dim);font-size:var(--text-sm)}.sidebar-state-message-empty{padding-block:var(--space-5)}.sidebar-state-message-no-matches{padding-block:calc(var(--space-5) + var(--space-1))}.sidebar-explorer{border-top:1px solid var(--border);min-height:0;transition:flex var(--dur-med) var(--ease-out-warm);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.sidebar-explorer-actions,.sidebar-explorer-header{align-items:center;display:flex}.sidebar-explorer-header{flex-shrink:0}.sidebar-explorer-toggle{align-items:center;gap:var(--space-3);padding:var(--space-3) calc(var(--space-5) - var(--space-1));color:var(--text-muted);cursor:pointer;font-size:var(--text-sm);letter-spacing:.05em;text-align:left;text-transform:uppercase;background:0 0;border:none;flex:1;font-weight:600;display:flex}.sidebar-explorer-chevron{transition:transform var(--dur-med) var(--ease-out-warm);flex-shrink:0}.sidebar-explorer-chevron[data-open=true]{transform:rotate(90deg)}.sidebar-explorer-actions{opacity:1;pointer-events:auto;transition:opacity var(--dur-fast) var(--ease-out-warm)}.sidebar-explorer-actions[data-open=false]{opacity:0;pointer-events:none}.sidebar-explorer-icon-button{width:calc(var(--control-height-sm) - var(--space-1));height:calc(var(--control-height-sm) - var(--space-1));margin-right:var(--space-3);border-radius:var(--radius-control);color:var(--text-dim);cursor:pointer;transition:color var(--dur-fast) var(--ease-out-warm),background var(--dur-fast) var(--ease-out-warm);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;line-height:0;display:flex}.sidebar-explorer-upload{margin-right:0}.sidebar-explorer-icon-button:hover:not(:disabled){background:var(--bg-hover);color:var(--text-muted)}.sidebar-explorer-icon-button:disabled{cursor:default;opacity:.6}.sidebar-explorer-refresh[data-refreshing=true]{color:var(--accent)}.sidebar-explorer-flow{min-height:0}.sidebar-explorer-flow-inner{height:100%;overflow:hidden auto}.sidebar-footer{border-top:1px solid var(--border);flex-shrink:0;display:flex}.sidebar-settings-row{min-width:0;height:var(--control-height-lg);box-sizing:border-box;align-items:center;gap:var(--space-4);padding:0 calc(var(--space-5) - var(--space-1));color:var(--text-muted);cursor:pointer;text-align:left;transition:background var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm);background:0 0;border:none;flex:1;display:flex}.sidebar-settings-row:hover{background:var(--bg-hover);color:var(--text)}.sidebar-footer-icon{color:var(--accent);flex-shrink:0;display:inline-flex;position:relative}.sidebar-update-dot{border:1px solid var(--bg-panel);background:var(--accent);border-radius:50%;width:6px;height:6px;position:absolute;top:-3px;right:-4px}.sidebar-footer-label{min-width:0;color:inherit;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-md);flex:1;font-weight:500;overflow:hidden}.sidebar-footer-chevron{color:var(--text-dim);flex-shrink:0}.sidebar-footer-divider{background:var(--border);align-self:stretch;width:1px}.sidebar-project{margin-bottom:var(--space-5)}.sidebar-project-header{align-items:center;gap:var(--space-1);height:calc(var(--control-height) - var(--space-1));padding:0 var(--space-3) 0 0;border-radius:var(--radius-control);transition:background var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm),border-color var(--dur-fast) var(--ease-out-warm);background:0 0;margin:0;display:flex}.sidebar-project-header:hover{background:var(--bg-hover)}.sidebar-project-identity{align-self:stretch;align-items:center;gap:calc(var(--space-4) - var(--space-1) / 2);min-width:0;padding:0 var(--space-2) 0 calc(var(--space-5) - var(--space-1));color:var(--text-muted);cursor:pointer;text-align:left;background:0 0;border:none;flex:0 auto;display:flex}.sidebar-project-header:hover .sidebar-project-identity{color:var(--text)}.sidebar-project-folder-icon{color:var(--text-dim);transition:color var(--dur-fast) var(--ease-out-warm);flex-shrink:0}.sidebar-project-identity[data-active=true] .sidebar-project-folder-icon{color:var(--accent)}.sidebar-project-header:hover .sidebar-project-folder-icon{color:var(--text-muted)}.sidebar-project-header:hover .sidebar-project-identity[data-active=true] .sidebar-project-folder-icon,.sidebar-project-identity[data-active=true] .sidebar-project-folder-icon{color:var(--accent)}.sidebar-project-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--font-mono);font-size:var(--text-md);letter-spacing:-.01em;font-weight:600;line-height:1.25;overflow:hidden}.sidebar-project-worktree-toggle{align-items:center;gap:calc(var(--space-4) - var(--space-3) / 2);min-width:0;max-width:104px;height:calc(var(--control-height-sm) - var(--space-2));padding:0 var(--space-3);border-radius:var(--radius-control);color:var(--text-dim);cursor:pointer;font-family:var(--font-mono);font-size:calc(var(--text-md) - var(--space-3) / 4);transition:color var(--dur-fast) var(--ease-out-warm),background var(--dur-fast) var(--ease-out-warm);background:0 0;border:none;flex-shrink:0;line-height:1;display:inline-flex}.sidebar-project-header:hover .sidebar-project-worktree-toggle{color:var(--text-muted)}.sidebar-project-worktree-toggle[data-open=true]{background:var(--bg-selected);color:var(--accent)}.sidebar-project-worktree-dot{opacity:.7;flex-shrink:0}.sidebar-project-worktree-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.sidebar-project-spacer{flex:1}.sidebar-project-activity{margin:0 var(--space-1) 0 0;flex-shrink:0;align-items:center;line-height:0;display:flex}.sidebar-project-activity-dot{background:var(--accent);border-radius:50%;width:7px;height:7px}.sidebar-project-activity[data-running=true] .sidebar-project-activity-dot{box-shadow:0 0 0 calc(var(--space-3) / 2) var(--accent)}@supports (color:color-mix(in lab,red,red)){.sidebar-project-activity[data-running=true] .sidebar-project-activity-dot{box-shadow:0 0 0 calc(var(--space-3) / 2) color-mix(in srgb,var(--accent) 13%,transparent)}}.sidebar-project-action-slot{flex-shrink:0}.sidebar-project-action{width:calc(var(--control-height-sm) - var(--space-2));height:calc(var(--control-height-sm) - var(--space-2));border-radius:var(--radius-control);color:var(--text-dim);cursor:pointer;transition:background var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm),border-color var(--dur-fast) var(--ease-out-warm);background:0 0;border:none;justify-content:center;align-items:center;padding:0;line-height:0;display:flex}.sidebar-project-action[data-open=true]{background:var(--bg-selected)}.sidebar-project-action:disabled{cursor:default;opacity:.5}.sidebar-menu-item{padding:var(--space-3) calc(var(--space-4) + var(--space-1) / 2);border-radius:calc(var(--radius-control) - var(--space-1));color:var(--text-muted);font-size:var(--text-sm)}.sidebar-menu-item-danger{color:var(--status-error)}.sidebar-menu-item:disabled{color:var(--text-dim);cursor:not-allowed;opacity:.55}.sidebar-project-remove-item:disabled{color:var(--status-error);cursor:default;opacity:1}.sidebar-project-toggle{width:calc(var(--control-height-sm) - var(--space-3));height:calc(var(--control-height-sm) - var(--space-1));border-radius:var(--radius-control);color:var(--text-dim);cursor:pointer;transition:color var(--dur-fast) var(--ease-out-warm),background var(--dur-fast) var(--ease-out-warm);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;line-height:0;display:flex}.sidebar-project-toggle-icon,.sidebar-show-more-icon{transition:transform var(--dur-fast) var(--ease-out-warm)}.sidebar-project-toggle[data-expanded=true] .sidebar-project-toggle-icon{transform:rotate(90deg)}.sidebar-project-sessions{margin:var(--space-1) 0 0;animation:sidebar-sessions-in var(--dur-med) var(--ease-out-warm) both;transform-origin:top}.sidebar-project-empty{padding:var(--space-3) var(--space-5) var(--space-4) calc(var(--space-8) + var(--space-5) - var(--space-1))}.sidebar-project-empty,.sidebar-show-more{color:var(--text-dim);font-size:var(--text-sm)}.sidebar-show-more{align-items:center;gap:calc(var(--space-4) - var(--space-3) / 2);width:100%;margin:var(--space-1) 0 0;padding:calc(var(--space-3) - var(--space-1) / 2) var(--space-4) calc(var(--space-3) - var(--space-1) / 2) calc(var(--space-8) + var(--space-5) - var(--space-1));border-radius:var(--radius-control);cursor:pointer;font-variant-numeric:tabular-nums;text-align:left;transition:background var(--dur-fast) var(--ease-out-warm),color var(--dur-fast) var(--ease-out-warm);background:0 0;border:none;font-weight:600;display:flex}.sidebar-show-more:hover{background:var(--bg-hover);color:var(--accent)}.sidebar-show-more-icon[data-expanded=true]{transform:rotate(180deg)}.sidebar-worktree-list{max-height:min(40vh,300px);overflow-y:auto}.sidebar-worktree-confirm-row{align-items:center;gap:var(--space-3);padding:calc(var(--space-4) - var(--space-1) / 2) var(--space-5);border-bottom:1px solid var(--border);background:var(--accent);display:flex}@supports (color:color-mix(in lab,red,red)){.sidebar-worktree-confirm-row{background:color-mix(in srgb,var(--accent) 6%,transparent)}}.sidebar-worktree-confirm-text{min-width:0;color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm);flex:1;overflow:hidden}.sidebar-worktree-cancel-button,.sidebar-worktree-force-button{padding:calc(var(--space-1) + 1px) calc(var(--space-4) + var(--space-1) / 2);border-radius:var(--radius-control);cursor:pointer;font-size:var(--text-sm);flex-shrink:0}.sidebar-worktree-force-button{background:var(--accent-strong);color:var(--on-accent);border:none;font-weight:600}.sidebar-worktree-cancel-button{border:1px solid var(--border);background:var(--bg-hover);color:var(--text-muted)}.sidebar-worktree-row{border-bottom:1px solid var(--border);align-items:center;display:flex}.sidebar-worktree-select{align-items:center;gap:calc(var(--space-4) - var(--space-3) / 2);min-width:0;padding:var(--space-4) calc(var(--space-5) - var(--space-1));background:var(--bg);color:var(--text-muted);cursor:pointer;font-family:var(--font-mono);font-size:var(--text-sm);text-align:left;border:none;flex:1;display:flex}.sidebar-worktree-select[aria-pressed=true]{color:var(--text)}.sidebar-worktree-select .sidebar-path-label{flex:1}.sidebar-worktree-check,.sidebar-worktree-check-spacer{flex-shrink:0;width:10px}.sidebar-worktree-check{color:var(--accent)}.sidebar-worktree-main-badge{color:var(--text-dim);font-size:var(--text-xs);flex-shrink:0}.sidebar-worktree-remove{width:calc(var(--control-height-lg) - var(--space-1));height:var(--control-height);margin-right:var(--space-2);border-radius:var(--radius-control);color:var(--text-dim);cursor:pointer;transition:color var(--dur-fast) var(--ease-out-warm),background var(--dur-fast) var(--ease-out-warm);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.sidebar-worktree-remove:hover:not(:disabled){background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.sidebar-worktree-remove:hover:not(:disabled){background:color-mix(in srgb,var(--accent) 8%,transparent)}}.sidebar-worktree-remove:hover:not(:disabled){color:var(--accent)}.sidebar-worktree-new{align-items:center;gap:calc(var(--space-4) - var(--space-3) / 2);width:100%;padding:var(--space-4) calc(var(--space-5) - var(--space-1));color:var(--text-muted);cursor:pointer;font-size:var(--text-sm);text-align:left;background:0 0;border:none;display:flex}.sidebar-worktree-new-icon{flex-shrink:0}.sidebar-worktree-form{padding:var(--space-3) var(--space-4)}.sidebar-worktree-input{box-sizing:border-box;width:100%;padding:calc(var(--space-2) + 1px) var(--space-4);border:1px solid var(--accent);border-radius:var(--radius-control);background:var(--bg);color:var(--text);font-family:var(--font-mono);font-size:var(--text-sm);outline:none;display:block}.sidebar-worktree-form-actions{gap:calc(var(--space-4) - var(--space-3) / 2);margin-top:calc(var(--space-3) - var(--space-1) / 2);display:flex}.sidebar-worktree-create,.sidebar-worktree-form-cancel{padding:var(--space-2) 0;border-radius:var(--radius-control);cursor:pointer;font-size:var(--text-sm);flex:1}.sidebar-worktree-create{background:var(--accent-strong);color:var(--on-accent);border:none;font-weight:600}.sidebar-worktree-form-cancel{border:1px solid var(--border);background:var(--bg-hover);color:var(--text-muted)}.sidebar-worktree-create:disabled{cursor:not-allowed;opacity:.65}.sidebar-worktree-error{padding:var(--space-2) var(--space-5) var(--space-4);overflow-wrap:anywhere;color:var(--accent);font-size:var(--text-sm);line-height:1.35}.sidebar-session-tree-row{position:relative}.sidebar-session-indent-line{pointer-events:none;background:var(--border);width:1px;position:absolute;top:0;bottom:0}.sidebar-session-indicator{color:var(--accent);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.sidebar-session-indicator-svg{display:block}.sidebar-session-row{align-items:center;gap:var(--space-3);width:100%;min-height:calc(var(--control-height) - var(--space-1));margin:calc(var(--space-1) / 2) 0;padding:0 var(--space-4) 0 0;cursor:pointer;transition:background var(--dur-fast) var(--ease-out-warm),opacity var(--dur-fast) var(--ease-out-warm);background:0 0;display:flex;position:relative;overflow:hidden}.sidebar-session-row[data-interactive=true]:hover{background:var(--bg-hover)}.sidebar-session-row[data-interactive=false]{cursor:default}.sidebar-session-row[data-selected=true]{background:var(--bg-selected)}@supports (color:color-mix(in lab,red,red)){.sidebar-session-row[data-selected=true]{background:color-mix(in srgb,var(--bg-selected) 70%,transparent)}}.sidebar-session-row[data-confirming=true]{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.sidebar-session-row[data-confirming=true]{background:color-mix(in srgb,var(--accent) 6%,transparent)}}.sidebar-session-row[data-deleting=true]{opacity:.5}.sidebar-session-selection-indicator{width:var(--space-1);border-radius:calc(var(--space-1) / 2);pointer-events:none;background:var(--accent);position:absolute;top:0;bottom:0}.sidebar-session-confirm-text{min-width:0;color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-md);flex:1;overflow:hidden}.sidebar-session-cancel-button,.sidebar-session-confirm-button{height:var(--control-height);padding:0 var(--space-5);border-radius:var(--radius-control);cursor:pointer;font-size:var(--text-sm)}.sidebar-session-confirm-button{background:var(--accent-strong);color:var(--on-accent);border:none;font-weight:600}.sidebar-session-cancel-button{border:1px solid var(--border);background:var(--bg);color:var(--text-muted)}.sidebar-session-rename-input{height:calc(var(--control-height-sm) - var(--space-3) / 2);padding:calc(var(--space-2) - var(--space-1) / 2) calc(var(--space-3) + var(--space-1) / 2);border:1px solid var(--accent);border-radius:var(--radius-control);background:var(--bg);color:var(--text);font-size:var(--text-md);outline:none;flex:1}.sidebar-session-branch-icon{color:var(--text-dim);flex-shrink:0}.sidebar-session-content{flex:1;align-items:center;min-width:0;display:flex}.sidebar-session-title{min-width:0;color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-size:calc(var(--text-base) - var(--space-1) / 4);letter-spacing:-.005em;font-weight:500;line-height:1.35;overflow:hidden}.sidebar-session-row[data-selected=true] .sidebar-session-title{font-weight:600}.sidebar-session-worktree{align-items:center;gap:var(--space-1);min-width:0;max-width:56px;color:var(--text-dim);font-size:var(--text-xs);flex-shrink:1;display:flex;overflow:hidden}.sidebar-session-worktree-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.sidebar-session-time{min-width:30px;color:var(--text-dim);font-size:var(--text-xs);font-variant-numeric:tabular-nums;text-align:right;flex-shrink:0}.sidebar-session-time[data-selected=true]{color:var(--accent)}.sidebar-session-action,.sidebar-session-collapse{width:calc(var(--control-height-sm) - var(--space-2));height:calc(var(--control-height-sm) - var(--space-2));border-radius:var(--radius-control);color:var(--text-dim);cursor:pointer;background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;line-height:0;display:flex}.sidebar-session-collapse[data-collapsed=true]{transform:rotate(-90deg)}.sidebar-session-collapse{transition:transform var(--dur-fast) var(--ease-out-warm),background var(--dur-fast) var(--ease-out-warm)}.sidebar-session-action-slot{flex-shrink:0;position:relative}.sidebar-session-action[data-open=true]{background:var(--bg-selected);color:var(--text)}@media (max-width:640px){.sidebar-brand,.sidebar-explorer-icon-button,.sidebar-explorer-toggle,.sidebar-icon-button,.sidebar-menu-item,.sidebar-new-session,.sidebar-project-action,.sidebar-project-identity,.sidebar-project-toggle,.sidebar-project-worktree-toggle,.sidebar-search-input,.sidebar-session-action,.sidebar-session-cancel-button,.sidebar-session-collapse,.sidebar-session-confirm-button,.sidebar-session-content,.sidebar-session-rename-input,.sidebar-session-row,.sidebar-settings-row,.sidebar-show-more,.sidebar-worktree-cancel-button,.sidebar-worktree-create,.sidebar-worktree-force-button,.sidebar-worktree-form-cancel,.sidebar-worktree-input,.sidebar-worktree-new,.sidebar-worktree-remove,.sidebar-worktree-select{min-height:var(--control-touch-anchor,var(--control-touch))}.sidebar-explorer-icon-button,.sidebar-icon-button,.sidebar-session-action,.sidebar-session-collapse{min-width:var(--control-touch-icon)}.sidebar-project-header{height:var(--control-touch)}.sidebar-project-worktree-toggle,.sidebar-session-cancel-button,.sidebar-session-confirm-button,.sidebar-worktree-cancel-button,.sidebar-worktree-create,.sidebar-worktree-force-button,.sidebar-worktree-form-cancel{min-height:var(--control-touch)}.subagent-hub-content{gap:var(--space-2)!important;padding:var(--space-3) var(--space-4) var(--space-4)!important}.subagent-hub-activity-line,.subagent-hub-activity-preview,.subagent-hub-detached,.subagent-hub-filters,.subagent-hub-freshness,.subagent-hub-group-label,.subagent-hub-observe-only,[data-subagent-activity-line],[data-subagent-activity-preview],[data-subagent-detached],[data-subagent-filter-row],[data-subagent-freshness],[data-subagent-group-label],[data-subagent-observe-only]{display:none!important}.subagent-hub-nested,[data-subagent-row-wrap][data-subagent-depth]:not([data-subagent-depth="0"]){border-left:none!important;margin-left:0!important;padding-left:0!important}.subagent-hub-row{padding:var(--space-2) var(--space-4)!important;gap:0!important}}.relay-pair-qr{color:#000!important;filter:none!important;opacity:1!important;background:#fff!important}.relay-pair-qr svg{color:#000;width:100%;height:100%;display:block}.relay-pair-qr svg path{fill:#000!important}.relay-pair-qr svg rect{fill:#fff!important}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}
|
package/README.ja.md
CHANGED
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
[English](./README.md) | [한국어](./README.ko.md) | [日本語](./README.ja.md) | [简体中文](./README.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
> **Android APK (Android 12+)** — Kotlin 製のコンパニオンアプリでリモートの ompgui サーバーに接続し、最新セッションの読み取り専用オフラインスナップショットを利用できます。[ompgui Remote v0.7.
|
|
5
|
+
> **Android APK (Android 12+)** — Kotlin 製のコンパニオンアプリでリモートの ompgui サーバーに接続し、最新セッションの読み取り専用オフラインスナップショットを利用できます。[ompgui Remote v0.7.11 をダウンロード](https://github.com/dbc-hbin/ompgui/releases/download/v0.7.11/ompgui-remote-v0.7.11.apk) · [リリースノート](https://github.com/dbc-hbin/ompgui/releases/tag/v0.7.11)
|
|
6
6
|
|
|
7
7
|
> `android/` の実験的なネイティブ Compose クライアントは、認証済みの `/relay` WebSocket を使用し、セッション・履歴の操作、リンク付きメッセージ、オフラインの Mermaid 図とコードの構文強調、画像/PDF/音声/HTML/Markdown/DOCX のインラインプレビューを提供します。ファイルの自動更新は表示中のみ動作し、未保存の編集を保持します。許可された隠しファイルの閲覧とアーカイブ検索にも対応します。モデル・設定には公開 models.dev カタログ、高度な OMP 設定、構成とは別に表示されるセッションごとの実際の MCP 実行状態が含まれます。添付ファイルは端末上で巨大な単一 JSON にまとめず、ストリーミングでステージングします。画像は各 10 MiB で最大 10 件、テキスト添付は独立した枠で各 256 KiB、最大 10 件です。OMP 自体の画像正規化とプロバイダーごとの画像数制限は引き続き適用されます。
|
|
8
8
|
>
|
|
9
|
-
>
|
|
9
|
+
> **現在の設定機能:** Web と Android APK は、スコープ、継承、リセット、検証、保護されたシークレット/管理者操作を含む同一の検索・カテゴリ対応 OMP 設定カタログを使用します。端末ローカルの思考表示設定は会話の描画だけを変え、最終回答は隠しません。
|
|
10
|
+
>
|
|
11
|
+
> このクライアントはホスト型/E2E リレーを追加するものではありません。JDK 21 を使用し、リポジトリのルートで `npm install` を実行してから、`android/` で `./gradlew :app:assembleDebug` を実行します。オフラインアセットはインストール済みの npm 依存パッケージから生成されます。出力先は `android/app/build/outputs/apk/debug/app-debug.apk` です。サーバーで無効化されている更新、ログアウト、保存済み API キーの変更操作は引き続き利用できません。
|
|
10
12
|
|
|
11
13
|
[oh-my-pi (omp) コーディングエージェント](https://github.com/can1357/oh-my-pi)のローカル Web UI です。ompgui はローカルの omp セッションファイルを読み込み、セッションの閲覧、リアルタイムチャット、モデル設定、スキル管理、プロジェクトファイルのプレビューを行えるブラウザワークスペースを提供します。
|
|
12
14
|
|
|
@@ -127,7 +129,7 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompgui
|
|
|
127
129
|
- **ブランチをまたいで作業**: サイドバーから Git ワークツリーを切り替えると、新しいセッションとエクスプローラーが選択したチェックアウトに追従します。
|
|
128
130
|
- **プロジェクトを見ながらチャット**: エージェントの作業中に、左側でファイルを閲覧し、右側でソース、ドキュメント、画像、音声、PDF をプレビューできます。
|
|
129
131
|
- **セッション状態をひと目で把握**: コンテキスト使用量、コスト、コンパクション状態、システムプロンプトの詳細をトップバーで確認できます。
|
|
130
|
-
-
|
|
132
|
+
- **OMP 設定を一貫して管理**: Web と Android が、モデル、エージェント、ツール、安全性、システム動作のための検索・カテゴリ対応カタログを共有し、グローバル/プロジェクト継承、デフォルトへのリセット、高度な値の検証を提供します。
|
|
131
133
|
- **Settings で MCP を管理**: 専用の MCP タブでプロジェクトサーバーの状態(有効 / 無効 / 無効な設定)を表示し、追加、編集、名前変更、検証、削除を行えます。設定エラーはトーストで通知されます。
|
|
132
134
|
- **OMP を最新に保つ**: Settings からインストール済みランタイムを確認・更新し、必要に応じてアクティブなセッションを再起動できます。
|
|
133
135
|
- **完了を見逃さない**: エージェント完了時のブラウザー通知を有効にし、インストール済みスキルの更新を確認できます。
|
|
@@ -146,6 +148,12 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompgui
|
|
|
146
148
|
| `PI_CODING_AGENT_DIR` | 別の omp エージェントディレクトリを指定(デフォルト `~/.omp/agent`) |
|
|
147
149
|
| `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` | サーバーサイドリクエスト用の標準プロキシ変数 |
|
|
148
150
|
|
|
151
|
+
### OMP 設定
|
|
152
|
+
|
|
153
|
+
Web UI と Android APK は同じ共有カタログをカテゴリと検索で表示し、デフォルト値、グローバルまたはプロジェクトのスコープ、継承された有効値、リセットに対応します。グローバル設定は `~/.omp/agent/config.yml` を使用し、`config.yml` が存在せず既存の `config.yaml` がある場合に限り、後者を読み書きのフォールバックとして使用します。プロジェクト設定は、許可されたワークスペースの正規パス `.omp/config.yml` だけを使用します。表示する有効値では、プロジェクト層をグローバル層へ再帰的にマージします。保存時には、構造化レコードが選択した層の該当レコード全体を置換し、順序付き配列は順序を保持します。数値、列挙値、配列、構造化値は最小限の YAML 更新前に検証され、無関係なキーとコメントは保持されます。
|
|
154
|
+
|
|
155
|
+
表示される有効値は保存済みのグローバル/プロジェクト構成を統合したもので、実行中セッションの実値でも、環境変数や CLI による上書きでもありません。変更は新規または再起動したセッションで反映され、保存だけで実行中の RPC セッションが自動再起動することはありません。カタログで確認対象に指定された変更には明示的な確認が必要です。シークレットは書き込み専用で、クライアントには有無だけが返され、置換または削除はできますが保存値は読み取れません。端末ごとの思考表示設定はローカル表示だけに作用し、思考ブロックを隠しても最終回答は隠しません。
|
|
156
|
+
|
|
149
157
|
## アーキテクチャ
|
|
150
158
|
|
|
151
159
|
ompgui は Node 上でホストされる Next.js アプリで、インストール済みの `omp` バイナリを操作します。エージェント自体は同梱していません:
|
|
@@ -153,6 +161,7 @@ ompgui は Node 上でホストされる Next.js アプリで、インストー
|
|
|
153
161
|
- **ライブセッション**: `omp --mode rpc-ui`(stdio 上の NDJSON)を、アクティブなセッションごとに 1 つの子プロセスとして起動します。そのため、エージェントのバージョンは常にインストールされているものと完全に一致します。
|
|
154
162
|
- **セッション閲覧**: omp のセッションファイル(`~/.omp/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`)を直接読み込みます。タイトル変更、アーカイブ、削除は、OMP のライブ書き込みと競合しないよう保護されたネイティブファイルのメンテナンス操作です。
|
|
155
163
|
- **モデルと認証**: omp 子プロセスに対する RPC コマンドを使用します。モデルパネルは omp エージェントディレクトリ内の `models.yml` を編集します。
|
|
164
|
+
- **OMP 設定**: `lib/omp/settings-catalog.ts` が Web と Relay/Android で共有するカタログを定義し、設定サービスがカタログで絞り込んだ各層/有効値を返して、検証済みの最小パッチを適用します。グローバルおよび許可されたプロジェクトへの書き込みは、OMP 互換のプロセス間ロックとアトミック置換を使い、ネイティブ OMP と ompgui が互いのファイル世代を上書きしないようにします。
|
|
156
165
|
- **スキルとプラグイン**: omp のスキルディレクトリ(`~/.omp/agent/skills`、プロジェクトの `.omp/skills`、互換ディレクトリ)をスキャンし、プラグイン管理には `omp plugin` を呼び出します。
|
|
157
166
|
- **ファイルアクセス**: ファイルの閲覧とプレビューは、選択したプロジェクトディレクトリとセッションに現れる作業ディレクトリに限定されます。
|
|
158
167
|
- **フォークとセッション内ブランチの違い**: フォークは新しい `.jsonl` ファイルを作成します。「ここから編集」は同じセッションファイル内に別のブランチを作成します。
|
package/README.ko.md
CHANGED
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
[English](./README.md) | [한국어](./README.ko.md) | [日本語](./README.ja.md) | [简体中文](./README.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
> **Android APK (Android 12+)** — Kotlin 보조 앱으로 원격 ompgui 서버에 연결하고, 최신 세션의 읽기 전용 오프라인 스냅샷을 이용할 수 있습니다. [ompgui Remote v0.7.
|
|
5
|
+
> **Android APK (Android 12+)** — Kotlin 보조 앱으로 원격 ompgui 서버에 연결하고, 최신 세션의 읽기 전용 오프라인 스냅샷을 이용할 수 있습니다. [ompgui Remote v0.7.11 다운로드](https://github.com/dbc-hbin/ompgui/releases/download/v0.7.11/ompgui-remote-v0.7.11.apk) · [릴리스 노트](https://github.com/dbc-hbin/ompgui/releases/tag/v0.7.11)
|
|
6
6
|
|
|
7
7
|
> `android/`의 실험용 네이티브 Compose 클라이언트는 인증된 `/relay` WebSocket을 사용하며, 세션/기록 제어와 링크·도구 호출·결과·오류·미디어 참조를 포함하는 풍부한 온라인 대화 기록, 오프라인 Mermaid 다이어그램 및 코드 구문 강조, 이미지/PDF/오디오/HTML/Markdown/DOCX 인라인 미리보기를 제공합니다. 온라인 기록은 보호된 오프라인 스냅샷과 별개입니다. 크기가 제한된 미리보기에서 `sessions.content`로 전체 텍스트를 나누어 가져오고 미디어 참조도 페이지 단위로 조회하므로 대화 기록을 4,000자로 잘라내지 않습니다. 오프라인 캐시의 개인정보 보호 제한은 그대로 유지됩니다. 파일 자동 새로고침은 화면에 보일 때만 동작하며 저장하지 않은 편집 내용을 보존합니다. 허용된 숨김 파일 탐색과 아카이브 검색도 지원합니다. 모델/설정에서는 공개 models.dev 카탈로그, 고급 OMP 설정, 구성 상태와 구분되는 세션별 실제 MCP 실행 상태를 확인할 수 있습니다. 첨부 파일은 휴대폰에서 하나의 거대한 JSON으로 묶지 않고 스트리밍으로 스테이징하며, 이미지는 개당 10 MiB로 최대 10개, 텍스트 첨부는 별도로 개당 256 KiB로 최대 10개까지 지원합니다. OMP 자체의 이미지 정규화와 제공자별 이미지 개수 제한은 계속 적용됩니다.
|
|
8
8
|
>
|
|
9
|
+
> **현재 설정 기능:** 웹과 Android APK는 범위, 상속, 초기화, 유효성 검사, 보호된 비밀/관리자 제어를 포함하는 동일한 검색·카테고리형 OMP 설정 카탈로그를 사용합니다. 기기 로컬의 추론 표시 설정은 대화 렌더링만 바꾸며 최종 답변은 숨기지 않습니다.
|
|
10
|
+
>
|
|
9
11
|
> 네이티브 인터페이스는 웹 앱의 Warm 및 OMP 색상 팔레트를 따르며, 간결한 프로젝트/세션 트리와 설정/사용량 하단 메뉴, 도구 모음을 한 줄로 정리한 메시지 입력창을 제공합니다. 기록, 세션 정보, 명령 및 런타임 제어는 세션 메뉴에 모았고, 보조 워크스페이스 작업은 더보기 메뉴에 유지했습니다. 런타임 제어는 펼칠 수 있는 트리 카테고리로 구성하고 현재 값을 일정한 열에 맞춰 표시합니다. 설정은 간결한 행 단위 선택 컨트롤을 사용하며, 드롭다운 메뉴는 해당 컨트롤에 붙어 열립니다. Android 네이티브 컨트롤, 파일 선택기, 시트 탐색 방식과 서로 겹치지 않는 최소 48dp 터치 영역을 유지합니다.
|
|
10
12
|
>
|
|
11
|
-
> 이 클라이언트는
|
|
13
|
+
> 이 클라이언트는 호스팅형/E2E 릴레이를 추가하지 않습니다. JDK 21을 사용하여 저장소 루트에서 `npm install`을 실행한 뒤, `android/`에서 `./gradlew :app:assembleDebug`로 빌드합니다. 오프라인 에셋은 설치된 npm 의존성에서 생성되며, 출력 경로는 `android/app/build/outputs/apk/debug/app-debug.apk`입니다. 서버에서 비활성화된 업데이트, 로그아웃, 저장된 API 키 변경 작업은 여전히 사용할 수 없습니다.
|
|
12
14
|
|
|
13
15
|
[oh-my-pi (omp) 코딩 에이전트](https://github.com/can1357/oh-my-pi)를 위한 로컬 웹 UI입니다. ompgui은 로컬 omp 세션 파일을 읽어 브라우저에서 세션 탐색, 실시간 채팅, 모델 설정, 스킬 관리, 프로젝트 파일 미리보기를 제공하는 워크스페이스를 엽니다.
|
|
14
16
|
|
|
@@ -142,7 +144,7 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompgui
|
|
|
142
144
|
- **정확한 Markdown 미리보기**: YAML frontmatter를 요약 카드(제목 및 키/값 행)로 렌더링하고, 수식 펜스를 목록 안에서도 정렬하며, `5~7U` 같은 CJK 범위를 올바르게 표시합니다(GFM에서는 취소선에 이제 `~~`가 필요합니다).
|
|
143
145
|
- **Windows에서 자연스럽게 프로젝트 선택**: 파일 시스템 루트의 드라이브 선택기와 대소문자 무시·심볼릭 링크 인식 프로젝트 식별자로 드라이브와 worktree 사이에서도 사이드바를 안정적으로 유지합니다.
|
|
144
146
|
- **세션 상태 명확히 확인**: 상단 바에서 컨텍스트 사용량, 비용, 압축 상태, 시스템 프롬프트 세부 정보를 확인합니다.
|
|
145
|
-
-
|
|
147
|
+
- **OMP 설정을 일관되게 관리**: 웹과 Android가 모델, 에이전트, 도구, 안전, 시스템 동작을 위한 하나의 검색·카테고리형 설정 카탈로그를 공유하며 전역/프로젝트 상속, 기본값 초기화, 고급 값 검증을 제공합니다.
|
|
146
148
|
- **Settings에서 MCP 관리**: 전용 MCP 탭에서 설치된 프로젝트 서버의 상태(활성화/비활성화/잘못됨)를 확인하고 추가·편집·이름 변경·검증·삭제를 수행하며 설정 오류를 코너 토스트로 표시합니다.
|
|
147
149
|
- **OMP 최신 상태 유지**: Settings에서 설치된 런타임 버전을 확인하고 업데이트하거나 필요할 때 활성 세션을 재시작합니다.
|
|
148
150
|
- **완료 알림 받기**: 에이전트가 작업을 마치면 브라우저 알림을 받도록 선택하고 설치된 스킬의 업데이트를 확인합니다.
|
|
@@ -161,6 +163,12 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompgui
|
|
|
161
163
|
| `PI_CODING_AGENT_DIR` | 다른 omp 에이전트 디렉터리 지정(기본 `~/.omp/agent`) |
|
|
162
164
|
| `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` | 서버 측 요청에 사용하는 표준 프록시 변수 |
|
|
163
165
|
|
|
166
|
+
### OMP 설정
|
|
167
|
+
|
|
168
|
+
웹 UI와 Android APK는 동일한 공유 카탈로그를 카테고리/검색 방식으로 표시하며 기본값, 전역 또는 프로젝트 범위, 상속된 유효 값, 초기화를 지원합니다. 전역 설정은 `~/.omp/agent/config.yml`을 사용하며, `config.yml`이 없고 기존 `config.yaml`이 있을 때만 그 파일을 읽기/쓰기 대체 경로로 사용합니다. 프로젝트 설정은 승인된 워크스페이스의 표준 `.omp/config.yml`만 사용합니다. 화면에 표시되는 유효 값은 프로젝트 계층을 전역 계층 위에 재귀적으로 병합합니다. 저장할 때는 구조화된 레코드가 선택한 계층의 해당 레코드 전체를 대체하고, 순서가 있는 배열은 순서를 유지합니다. 숫자, enum, 배열, 구조화된 값은 최소 YAML 업데이트 전에 검증되고 관련 없는 키와 주석은 보존됩니다.
|
|
169
|
+
|
|
170
|
+
표시되는 유효 값은 저장된 전역/프로젝트 구성의 병합 결과이며, 이미 실행 중인 세션의 실제 값이나 환경 변수/CLI 재정의 값이 아닙니다. 변경은 새 세션 또는 재시작한 세션에서 적용되며 저장만으로 실행 중인 RPC 세션을 자동 재시작하지 않습니다. 카탈로그에서 확인 대상으로 지정한 변경에는 명시적 확인이 필요합니다. 비밀 값은 쓰기 전용이므로 클라이언트에는 존재 여부만 반환되고 교체 또는 삭제만 가능하며 저장된 값은 읽을 수 없습니다. 기기별 추론 표시 설정은 로컬 표현에만 영향을 주어 추론 블록은 숨길 수 있지만 최종 답변은 숨기지 않습니다.
|
|
171
|
+
|
|
164
172
|
## 아키텍처
|
|
165
173
|
|
|
166
174
|
ompgui은 Node가 호스팅하는 Next.js 앱으로, 설치된 `omp` 바이너리를 구동합니다. 에이전트를 내장하지 않습니다.
|
|
@@ -168,7 +176,7 @@ ompgui은 Node가 호스팅하는 Next.js 앱으로, 설치된 `omp` 바이너
|
|
|
168
176
|
- **실시간 세션**: `omp --mode rpc-ui`(stdio 기반 NDJSON)를 실행하며 활성 세션마다 자식 프로세스를 하나씩 사용합니다. 설치된 OMP가 RPC v2를 알리면 v2를 협상하고, 큰 프레임은 제한된 청크 재조립을 사용하며, 구버전은 v1로 폴백합니다. 실행 전 호스트 환경(`PORT`, `NEXT_*`, `NODE_ENV`)을 제거하고 POSIX(프로세스 그룹)와 Windows(`taskkill /t`) 모두 정상 종료를 지원합니다.
|
|
169
177
|
- **세션 탐색**: omp 세션 파일(`~/.omp/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`)을 직접 읽습니다. 제목·보관·삭제는 실시간 OMP 쓰기를 보호하는 제한적인 기본 파일 유지보수 작업입니다. 프로젝트는 안정적인 `projectKey`(Windows 대소문자 무시, 심볼릭 링크 해석)로 묶어 사이드바가 드라이브나 worktree 사이에서 이동하지 않게 합니다.
|
|
170
178
|
- **모델 및 인증**: 엄격한 페이로드 검증(알 수 없는 형태 차단, 안전한 폴백)을 적용한 RPC 명령으로 omp 자식 프로세스와 통신합니다. Models 패널은 omp 에이전트 디렉터리의 `models.yml`을 편집하며 빈 자리 행을 제거하고 모호한 `enabledModels` 항목을 거부합니다.
|
|
171
|
-
-
|
|
179
|
+
- **OMP 설정**: `lib/omp/settings-catalog.ts`가 웹과 Relay/Android가 공유하는 카탈로그를 정의하고, 설정 서비스가 카탈로그로 필터링한 계층별/유효 값을 반환하며 검증된 최소 패치를 적용합니다. 전역 및 승인된 프로젝트 쓰기는 OMP 호환 프로세스 간 잠금과 원자적 교체를 사용해 네이티브 OMP와 ompgui가 서로의 파일 세대를 덮어쓰지 않게 합니다.
|
|
172
180
|
- **스킬 및 플러그인**: omp 스킬 디렉터리(`~/.omp/agent/skills`, 프로젝트 `.omp/skills`, 호환 디렉터리)를 검색하고 플러그인 관리는 `omp plugin`을 호출합니다.
|
|
173
181
|
- **MCP 서버**: 프로젝트 서버는 Git 최상위의 OMP 기본 위치(`.omp/mcp.json`, 이후 호환 파일)를 통해 관리하며 stdio/http/sse 스키마를 검증하고 원자적으로 기록합니다.
|
|
174
182
|
- **파일 접근**: 파일 탐색과 미리보기는 선택한 프로젝트 디렉터리 및 세션에 나타난 작업 디렉터리로 제한됩니다. `isWindowsAbsolutePath`/`samePath` 단일 헬퍼로 경로를 정규화하고 `realpath` 해석 뒤 심볼릭 링크 탈출을 거부합니다. Windows에서는 루트에서 드라이브 목록을 제공하는 디렉터리 선택기를 사용합니다.
|
|
@@ -212,7 +220,7 @@ ompgui은 영어, 중국어 간체(简体中文), 일본어(日本語), 한국
|
|
|
212
220
|
- **접근성**: WCAG AA 준수 — Lighthouse 접근성 점수 100/100, 전면 키보드 탐색, focus-visible 링, ARIA 역할
|
|
213
221
|
- **성능**: 메모이제이션된 목록 컴포넌트, RAF로 제한한 스크롤/마우스 핸들러, 디바운스 검색, 스트리밍 JSONL 리더, ETag 캐시 세션 목록
|
|
214
222
|
- **복원력**: omp 자식 프로세스의 정상 종료(프로세스 그룹 종료), 오류 경계, 원자적 세션 파일 재작성
|
|
215
|
-
- **테스트**: 세션 파싱, 터미널 입력, Markdown 렌더링, 메시지 표시,
|
|
223
|
+
- **테스트**: 세션 파싱, 터미널 입력, Markdown 렌더링, 메시지 표시, OMP 설정, MCP 구성을 다루는 집중 테스트 스위트
|
|
216
224
|
|
|
217
225
|
## 크레딧
|
|
218
226
|
|
package/README.md
CHANGED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
[English](./README.md) | [한국어](./README.ko.md) | [日本語](./README.ja.md) | [简体中文](./README.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
> **Android APK (Android 12+)** — Use the Kotlin companion app to connect to a remote ompgui server, with a read-only offline snapshot of the latest session. [Download ompgui Remote v0.7.
|
|
5
|
+
> **Android APK (Android 12+)** — Use the Kotlin companion app to connect to a remote ompgui server, with a read-only offline snapshot of the latest session. [Download ompgui Remote v0.7.11](https://github.com/dbc-hbin/ompgui/releases/download/v0.7.11/ompgui-remote-v0.7.11.apk) · [Release notes](https://github.com/dbc-hbin/ompgui/releases/tag/v0.7.11)
|
|
6
6
|
|
|
7
7
|
> The Kotlin companion app in `android/` uses authenticated `/relay` WebSockets for session/history controls and rich online transcripts with linked messages, tool calls/results/errors, and media references, plus offline Mermaid diagrams and code highlighting and inline image/PDF/audio/HTML/Markdown/DOCX previews. Online history is independent of the protected offline snapshot: bounded previews fetch full text through `sessions.content` and paginate media references, rather than truncating the transcript at 4,000 characters. Offline cache privacy restrictions remain unchanged. Visible-only file auto-refresh preserves unsaved edits; browsing supports allowed hidden files and archive search. Models/settings include the public models.dev catalog, advanced OMP settings, and actual per-session MCP runtime status shown separately from configuration. Attachments are streamed into staging rather than packed into one giant phone JSON payload: up to 10 images at 10 MiB each and, independently, 10 text attachments at 256 KiB each. OMP's own image normalization and provider-specific image-count limi…
|
|
8
8
|
>
|
|
9
|
-
>
|
|
9
|
+
> **Current settings:** Web and the Android APK now use the same searchable, categorized OMP settings catalog, including scope, inheritance, reset, validation, and guarded secret/admin controls. The device-local thinking-visibility switch only changes transcript rendering; final answers remain visible.
|
|
10
10
|
>
|
|
11
11
|
> Its native interface follows the web app’s Warm and OMP palettes, with a compact project/session tree, a Settings/Usage footer, and a compact composer with a single-row toolbar. History, session information, commands, and runtime controls live in the session menu; secondary workspace actions remain in overflow menus. Runtime controls use expandable tree categories with aligned current values. Settings use compact row selectors, and dropdown menus are anchored to their triggers. Native Android controls, file pickers, sheet navigation, and distinct touch regions of at least 48 dp are retained.
|
|
12
12
|
>
|
|
13
|
-
> This companion client does not
|
|
13
|
+
> This companion client does not add a hosted/E2E relay. To build, use JDK 21, run `npm install` at the repository root, then run `./gradlew :app:assembleDebug` from `android/`; offline assets are generated from the installed npm dependencies. Output: `android/app/build/outputs/apk/debug/app-debug.apk`. Server-disabled update, logout, and stored API-key mutations remain unavailable.
|
|
14
14
|
|
|
15
15
|
Local web UI for the [oh-my-pi (omp) coding agent](https://github.com/can1357/oh-my-pi). ompgui reads your local omp session files and gives you a browser workspace for session browsing, real-time chat, model configuration, skill management, and project file preview.
|
|
16
16
|
|
|
@@ -144,7 +144,7 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompgui
|
|
|
144
144
|
- **Preview markdown faithfully**: YAML frontmatter renders in a summary card (title + key/value rows), math fences stay aligned inside lists, and CJK ranges like `5~7U` are no longer mangled (GFM now requires `~~` for strikethrough).
|
|
145
145
|
- **Pick projects naturally on Windows**: a drive picker at the filesystem root and a case-folded, symlink-aware project identity keep the sidebar stable across drives and worktrees.
|
|
146
146
|
- **See session state clearly**: context usage, cost, compaction state, and system prompt details are visible from the top bar.
|
|
147
|
-
- **Configure
|
|
147
|
+
- **Configure OMP consistently**: web and Android share one searchable, categorized settings catalog for models, agents, tools, safety, and system behavior, with global/project inheritance, reset-to-default controls, and validated advanced values.
|
|
148
148
|
- **MCP management in Settings**: a dedicated MCP tab lists installed project servers with status (enabled / disabled / invalid), supports add/edit/rename/validate/remove, and surfaces configuration failures as corner toasts.
|
|
149
149
|
- **Keep OMP current**: check the installed runtime version, update it, and restart active sessions from Settings when needed.
|
|
150
150
|
- **Stay informed**: opt into browser notifications when an agent finishes, and check installed skills for updates.
|
|
@@ -163,6 +163,12 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompgui
|
|
|
163
163
|
| `PI_CODING_AGENT_DIR` | Point at another omp agent directory (default `~/.omp/agent`) |
|
|
164
164
|
| `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` | Standard proxy variables for server-side requests |
|
|
165
165
|
|
|
166
|
+
### OMP settings
|
|
167
|
+
|
|
168
|
+
The web UI and Android APK render the same shared catalog with category/search navigation, defaults, global or project scope, inherited effective values, and reset. Global settings use `~/.omp/agent/config.yml`; only when it is absent and `config.yaml` already exists is that file used as the read/write fallback. Project settings use only the authorized workspace's canonical `.omp/config.yml`. Displayed effective values recursively merge the project layer over the global layer. On save, a structured record replaces the corresponding record in the selected layer, while ordered arrays retain their order. Numbers, enums, arrays, and structured values are validated before a minimal YAML update; unrelated keys and comments are preserved.
|
|
169
|
+
|
|
170
|
+
The displayed effective value is the saved global/project configuration, not the value of an already-running session and not environment-variable or CLI overrides. Changes are picked up by new or restarted sessions; saving does not automatically restart live RPC sessions. Changes marked by the catalog as confirmation-required require explicit confirmation. Secrets are write-only: clients receive presence status only and can replace or delete them, never read their stored value. The per-device thinking-visibility preference is local presentation only: it can hide thinking blocks without hiding the final answer.
|
|
171
|
+
|
|
166
172
|
## Architecture
|
|
167
173
|
|
|
168
174
|
ompgui is a Node-hosted Next.js app that drives your installed `omp` binary — it does not embed the agent:
|
|
@@ -170,7 +176,7 @@ ompgui is a Node-hosted Next.js app that drives your installed `omp` binary —
|
|
|
170
176
|
- **Live sessions**: spawns `omp --mode rpc-ui` (NDJSON over stdio), one child process per active session, so the agent version is always exactly what you have installed. It negotiates RPC v2 when the installed OMP advertises it, uses bounded chunk reassembly for large frames, and falls back to v1 for older versions. Host env (`PORT`, `NEXT_*`, `NODE_ENV`) is stripped before spawn, and shutdown is graceful on both POSIX (process-group) and Windows (`taskkill /t`).
|
|
171
177
|
- **Session browsing**: reads omp's session files (`~/.omp/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`) directly; title, archive, and delete are narrow native-file maintenance operations guarded against live OMP writes. Projects are grouped by a stable `projectKey` (Windows case-folded, symlink-resolved) so the sidebar doesn't jump between drives or worktrees.
|
|
172
178
|
- **Models and auth**: RPC commands against the omp child process with strict payload validation (unknown-shape guards, safe fallbacks); the Models panel edits `models.yml` in the omp agent directory, dropping blank placeholder rows and rejecting ambiguous `enabledModels` entries.
|
|
173
|
-
- **Native settings**: the
|
|
179
|
+
- **Native settings**: `lib/omp/settings-catalog.ts` defines the catalog shared by the web and Relay/Android clients, while the settings service returns catalog-filtered per-layer and effective values and applies validated minimal patches. Global and authorized project writes use OMP-compatible cross-process locks plus atomic replacement so native OMP and ompgui cannot overwrite one another's generation.
|
|
174
180
|
- **Skills and plugins**: scans omp's skill directories (`~/.omp/agent/skills`, project `.omp/skills`, and compat dirs) and shells out to `omp plugin` for plugin management.
|
|
175
181
|
- **MCP servers**: project servers are managed through OMP's native locations (`.omp/mcp.json`, then compatibility files) at the git top level, validated against the stdio/http/sse schema and written atomically.
|
|
176
182
|
- **File access**: file browsing and preview are scoped to the selected project directory and working directories that appear in sessions; paths are canonicalized via a single `isWindowsAbsolutePath`/`samePath` helper and symlink escapes are rejected after `realpath` resolution. On Windows the directory picker offers a drive list at the root.
|
package/README.zh-CN.md
CHANGED
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
[English](./README.md) | [한국어](./README.ko.md) | [日本語](./README.ja.md) | [简体中文](./README.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
> **Android APK(Android 12+)** — 使用 Kotlin 配套应用连接远程 ompgui 服务器,并查看最新会话的只读离线快照。[下载 ompgui Remote v0.7.
|
|
5
|
+
> **Android APK(Android 12+)** — 使用 Kotlin 配套应用连接远程 ompgui 服务器,并查看最新会话的只读离线快照。[下载 ompgui Remote v0.7.11](https://github.com/dbc-hbin/ompgui/releases/download/v0.7.11/ompgui-remote-v0.7.11.apk) · [发行说明](https://github.com/dbc-hbin/ompgui/releases/tag/v0.7.11)
|
|
6
6
|
|
|
7
7
|
> `android/` 中的实验性原生 Compose 客户端使用经过身份验证的 `/relay` WebSocket,提供会话/历史记录控制、带链接的消息、离线 Mermaid 图表与代码语法高亮,以及图片/PDF/音频/HTML/Markdown/DOCX 内联预览。文件仅在界面可见时自动刷新,并保留未保存的编辑;支持浏览允许访问的隐藏文件和搜索归档。模型与设置包括公开的 models.dev 目录、高级 OMP 设置,以及与配置状态分开显示的各会话实际 MCP 运行状态。附件通过流式传输暂存,而不是在手机端打包成一个巨大的 JSON:图片最多 10 个,每个 10 MiB;文本附件独立计数,最多 10 个,每个 256 KiB。OMP 自身的图像规范化处理和各提供商的图片数量限制仍然适用。
|
|
8
8
|
>
|
|
9
|
-
>
|
|
9
|
+
> **当前设置功能:** Web 与 Android APK 使用同一套可搜索、分类的 OMP 设置目录,包括作用域、继承、重置、校验以及受保护的机密/管理员操作。设备本地的思考可见性开关只改变对话渲染,不会隐藏最终答案。
|
|
10
|
+
>
|
|
11
|
+
> 此客户端不会添加托管式/E2E 中继。构建时使用 JDK 21,先在仓库根目录运行 `npm install`,再在 `android/` 中运行 `./gradlew :app:assembleDebug`;离线资源从已安装的 npm 依赖生成。输出文件为 `android/app/build/outputs/apk/debug/app-debug.apk`。服务器禁用的更新、退出登录以及已存储 API 密钥的修改操作仍不可用。
|
|
10
12
|
|
|
11
13
|
[oh-my-pi (omp) 编程智能体](https://github.com/can1357/oh-my-pi)的本地 Web UI。ompgui 读取本机的 omp 会话文件,在浏览器中提供一个工作区,支持会话浏览、实时对话、模型配置、技能管理和项目文件预览。
|
|
12
14
|
|
|
@@ -127,7 +129,7 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompgui
|
|
|
127
129
|
- **跨分支工作**:在侧边栏切换 Git 工作树,新会话和资源管理器都会跟随你选择的检出。
|
|
128
130
|
- **边看项目边聊天**:左侧浏览文件,右侧预览源码、文档、图片、音频和 PDF,同时智能体继续工作。
|
|
129
131
|
- **清晰掌握会话状态**:上下文用量、费用、压缩上下文状态和系统提示词详情都显示在顶栏。
|
|
130
|
-
-
|
|
132
|
+
- **一致地管理 OMP 设置**:Web 与 Android 共享一套面向模型、智能体、工具、安全和系统行为的可搜索、分类设置目录,并提供全局/项目继承、重置为默认值以及高级值校验。
|
|
131
133
|
- **在设置中管理 MCP**:专用 MCP 标签页显示项目服务器状态(已启用 / 已禁用 / 无效),支持添加、编辑、重命名、校验和删除,并通过角落提示显示配置失败。
|
|
132
134
|
- **保持 OMP 为最新版本**:可在设置中检查已安装运行时、更新它,并按需重启活动会话。
|
|
133
135
|
- **及时获知完成状态**:可选择在智能体完成时接收浏览器通知,并检查已安装技能的更新。
|
|
@@ -146,6 +148,12 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompgui
|
|
|
146
148
|
| `PI_CODING_AGENT_DIR` | 指向其他 omp agent 目录(默认 `~/.omp/agent`) |
|
|
147
149
|
| `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` | 服务器端请求使用的标准代理变量 |
|
|
148
150
|
|
|
151
|
+
### OMP 设置
|
|
152
|
+
|
|
153
|
+
Web UI 与 Android APK 通过分类和搜索呈现同一个共享目录,支持默认值、全局或项目作用域、继承后的有效值以及重置。全局设置使用 `~/.omp/agent/config.yml`;只有在 `config.yml` 不存在且已有 `config.yaml` 时,才将后者作为读写回退。项目设置仅使用已授权工作区中的规范路径 `.omp/config.yml`。界面显示有效值时,会把项目层递归合并到全局层之上;保存时,结构化记录会替换所选层中对应的完整记录,有序数组则保留顺序。数字、枚举、数组和结构化值会在最小化更新 YAML 前接受校验;无关的键和注释会保留。
|
|
154
|
+
|
|
155
|
+
界面显示的有效值是已保存的全局/项目配置合并结果,不是已运行会话中的实际值,也不包含环境变量或 CLI 覆盖。更改由新建或重启后的会话读取;保存不会自动重启正在运行的 RPC 会话。目录中被指定为需要确认的更改必须得到明确确认。机密值为只写:客户端只收到是否已设置的状态,可以替换或删除,但不能读取已保存的值。每台设备的思考可见性设置只影响本地显示:可以隐藏思考块,但不会隐藏最终答案。
|
|
156
|
+
|
|
149
157
|
## 架构
|
|
150
158
|
|
|
151
159
|
ompgui 是一个由 Node 托管的 Next.js 应用,驱动你已安装的 `omp` 二进制文件——它并不内嵌智能体:
|
|
@@ -153,6 +161,7 @@ ompgui 是一个由 Node 托管的 Next.js 应用,驱动你已安装的 `omp`
|
|
|
153
161
|
- **实时会话**:启动 `omp --mode rpc-ui`(基于 stdio 的 NDJSON),每个活动会话对应一个子进程,因此智能体版本始终与你安装的完全一致。
|
|
154
162
|
- **会话浏览**:直接读取 omp 的会话文件(`~/.omp/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`);标题、归档和删除是受保护的原生文件维护操作,不会与 OMP 的实时写入竞争。
|
|
155
163
|
- **模型与认证**:通过 RPC 命令与 omp 子进程交互;模型面板编辑 omp agent 目录中的 `models.yml`。
|
|
164
|
+
- **OMP 设置**:`lib/omp/settings-catalog.ts` 定义 Web 与 Relay/Android 共用的目录;设置服务返回经目录过滤的各层值和有效值,并应用通过校验的最小补丁。全局及已授权项目的写入使用与 OMP 兼容的跨进程锁和原子替换,避免原生 OMP 与 ompgui 相互覆盖文件版本。
|
|
156
165
|
- **技能与插件**:扫描 omp 的技能目录(`~/.omp/agent/skills`、项目内 `.omp/skills` 及兼容目录),并调用 `omp plugin` 进行插件管理。
|
|
157
166
|
- **文件访问**:文件浏览与预览仅限于所选项目目录以及会话中出现过的工作目录。
|
|
158
167
|
- **分叉与会话内分支**:分叉会创建新的 `.jsonl` 文件;“从此处编辑”则在同一会话文件内创建另一个分支。
|
package/next.config.ts
CHANGED
|
@@ -18,7 +18,7 @@ const nextConfig = (phase: string): NextConfig => {
|
|
|
18
18
|
// root, Next can choose a parent lockfile on Windows and traverse protected
|
|
19
19
|
// user-profile junctions while compiling.
|
|
20
20
|
outputFileTracingRoot: process.cwd(),
|
|
21
|
-
serverExternalPackages: ["undici"],
|
|
21
|
+
serverExternalPackages: ["koffi", "undici"],
|
|
22
22
|
webpack(config: Parameters<NonNullable<NextConfig["webpack"]>>[0]) {
|
|
23
23
|
// Next's entrypoint tracer does not automatically reject dynamic paths
|
|
24
24
|
// outside the project root. Add parent/profile patterns to its ignore list
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ompgui",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.11",
|
|
4
4
|
"description": "Web UI & Browser GUI for the oh-my-pi (omp) coding agent",
|
|
5
5
|
"homepage": "https://github.com/dbc-hbin/ompgui#readme",
|
|
6
6
|
"repository": {
|
|
@@ -55,6 +55,7 @@
|
|
|
55
55
|
"@base-ui/react": "^1.6.0",
|
|
56
56
|
"cmdk": "^1.1.1",
|
|
57
57
|
"katex": "^0.16.47",
|
|
58
|
+
"koffi": "3.2.1",
|
|
58
59
|
"lucide-react": "^1.27.0",
|
|
59
60
|
"mammoth": "^1.12.0",
|
|
60
61
|
"mermaid": "^11.14.0",
|
|
@@ -73,6 +74,7 @@
|
|
|
73
74
|
"undici": "8.10.0",
|
|
74
75
|
"unified": "^11.0.5",
|
|
75
76
|
"uqr": "^0.1.3",
|
|
77
|
+
"xxhash-wasm": "1.1.0",
|
|
76
78
|
"yaml": "^2"
|
|
77
79
|
},
|
|
78
80
|
"devDependencies": {
|