@amd-gaia/agent-ui 0.25.3 → 0.25.4-rc.2
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/dist/assets/AdvancedSettings-B4MY5XPH.js +1 -0
- package/dist/assets/ConnectorsPane-B71QL-Kl.js +1 -0
- package/dist/assets/DocumentLibrary-CM6o8j2T.css +1 -0
- package/dist/assets/DocumentLibrary-c78Y6arz.js +4 -0
- package/dist/assets/FileBrowser-Cna3BsT7.css +1 -0
- package/dist/assets/FileBrowser-DwEPODjV.js +4 -0
- package/dist/assets/MemoryDashboard-BQhg3t2B.js +1 -0
- package/dist/assets/{MemoryDashboard-Mo721-BI.css → MemoryDashboard-Dt6zI60b.css} +1 -1
- package/dist/assets/MobileAccessModal-RI4HtcYe.js +2 -0
- package/dist/assets/ScheduleManager-tcyjbGY9.js +2 -0
- package/dist/assets/apiBase-DRtaTd8u.js +1 -0
- package/dist/assets/index-C9zLn8zo.css +1 -0
- package/dist/assets/index-CKOG_8jk.js +78 -0
- package/dist/assets/{zap-BogJn9oN.js → zap-BdhDcjhB.js} +1 -1
- package/dist/index.html +3 -3
- package/package.json +4 -3
- package/services/agent-seeder.cjs +22 -13
- package/services/backend-installer.cjs +2 -2
- package/dist/assets/AdvancedSettings-DERzP9Jc.js +0 -1
- package/dist/assets/ConnectorsPane-s0fFxmus.js +0 -1
- package/dist/assets/DocumentLibrary-CIKp6qld.css +0 -1
- package/dist/assets/DocumentLibrary-DqapN_Tr.js +0 -4
- package/dist/assets/FileBrowser-Dil1lZJ4.css +0 -1
- package/dist/assets/FileBrowser-vAJV41RT.js +0 -4
- package/dist/assets/MemoryDashboard-CP5wVWkY.js +0 -1
- package/dist/assets/MobileAccessModal-B31mPs50.js +0 -2
- package/dist/assets/ScheduleManager-b0gTAf2R.js +0 -2
- package/dist/assets/apiBase-CS6zLsJY.js +0 -1
- package/dist/assets/index-C-EM_5yl.css +0 -1
- package/dist/assets/index-Cae5Fje-.js +0 -78
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{S as t,T as n,i as r,n as i,r as a}from"./apiBase-DRtaTd8u.js";import{G as o,It as s,Y as c,Zt as l,_t as u,a as d,at as f,gn as p,gt as m,ht as h,it as g,lt as _,mn as v,nt as y,o as b,r as x,rt as S,tt as C}from"./index-CKOG_8jk.js";var w=e(n(),1);function T(){let[e,t]=(0,w.useState)(null),[n,o]=(0,w.useState)(null),[s,c]=(0,w.useState)(``),[u,f]=(0,w.useState)(``),[m,g]=(0,w.useState)(!1),[_,v]=(0,w.useState)(null),[y,b]=(0,w.useState)(!1);(0,w.useEffect)(()=>{C().then(e=>{t(e),c(e.saved_base_url??e.base_url??``)}).catch(e=>o(e instanceof Error?e.message:String(e)))},[]);let x=(0,w.useCallback)(async e=>{g(!0),v(null);try{let n=await h(e);t(n),f(``),b(!1)}catch(e){b(d(e)),v(e instanceof Error?e.message:String(e))}finally{g(!1)}},[]),S=()=>void x({mode:`external`,base_url:s.trim(),api_key:u.trim()||void 0});if(n)return r(`section`,{className:`settings-section`,children:[a(`h4`,{children:`Model server`}),r(`div`,{className:`model-warning`,role:`alert`,children:[a(p,{size:14}),r(`div`,{className:`model-warning-content`,children:[a(`strong`,{children:`Could not read which model server GAIA uses`}),a(`p`,{children:n})]})]})]});if(!e)return null;let T=e.mode===`external`;return r(`section`,{className:`settings-section`,"aria-label":`Model server`,children:[a(`h4`,{children:`Model server`}),a(`p`,{className:`model-override-desc`,role:`status`,children:e.source===`env`?r(i.Fragment,{children:[`GAIA uses the Lemonade Server at `,a(`code`,{children:e.base_url}),`, set by `,a(`code`,{children:`LEMONADE_BASE_URL`}),`.`]}):T?r(i.Fragment,{children:[`GAIA uses your Lemonade Server at `,a(`code`,{children:e.base_url}),`.`]}):a(i.Fragment,{children:`GAIA uses its own Lemonade Server.`})}),e.source===`env`?r(`p`,{className:`model-status-hint`,children:[`Unset `,a(`code`,{children:`LEMONADE_BASE_URL`}),` and restart GAIA to change this here.`]}):r(i.Fragment,{children:[r(`p`,{className:`model-status-hint`,children:[`Already run Lemonade? Use it, so this PC keeps one server and one copy of each model.`,` `,e.what_gaia_does]}),r(`form`,{className:`model-input-row`,onSubmit:e=>{e.preventDefault(),S()},children:[a(`input`,{type:`text`,className:`model-input`,placeholder:`http://localhost:13305`,value:s,onChange:e=>{c(e.target.value),v(null)},disabled:m,spellCheck:!1,autoCapitalize:`off`,autoCorrect:`off`,"aria-label":`Lemonade Server address`}),a(`input`,{type:`password`,className:`model-input`,autoComplete:`off`,placeholder:e.api_key_stored?`API key (blank keeps the saved one)`:`API key, if it needs one`,value:u,onChange:e=>f(e.target.value),disabled:m,"aria-label":`Lemonade API key`}),a(`div`,{className:`model-btn-group`,children:a(`button`,{type:`submit`,className:`btn-model-save`,disabled:m||!s.trim(),children:m?r(i.Fragment,{children:[a(l,{size:13,className:`btn-spinner`}),` Checking…`]}):`Use this server`})})]}),T&&a(`div`,{className:`setting-actions`,children:a(`button`,{type:`button`,className:`btn-secondary`,disabled:m,onClick:()=>void x({mode:`gaia`}),children:`Use GAIA’s own`})}),_&&r(`div`,{className:`model-warning`,role:`alert`,children:[a(p,{size:14}),r(`div`,{className:`model-warning-content`,children:[a(`strong`,{children:y?`Needs the API key`:`Not switched`}),a(`p`,{children:_})]})]})]})]})}var E={vulkan:`Vulkan`,rocm:`ROCm`,metal:`Metal`,cpu:`CPU`,npu:`NPU`,remote:`Remote (cloud)`},D={gaia:`GAIA's own Lemonade`,user:`Your Lemonade`,remote:`Lemonade on another machine`};function O(e){return e?E[e]??e:`unknown`}function k(e){if(!e)return`unknown`;let t=O(e.backend);return e.backend_source===`lemonade_default`?`${t} (Lemonade's default)`:t}function A(e){return e?`${Math.round(e/1024)}K tokens`:`unknown`}var j={asr:`Speech recognition`,embedding:`Embedding`,image:`Image`,llm:`Language`,rerank:`Reranker`,reranking:`Reranker`,stt:`Speech recognition`,transcription:`Speech recognition`,tts:`Speech`,vision:`Vision`,"3d":`3D`};function M(e){if(!e.model_type)return`Loaded model`;let t=e.model_type.toLowerCase();return`${j[t]??`${t.charAt(0).toUpperCase()}${t.slice(1)}`} model`}function N(e){let t=[e.name?c(e.name):`Unknown model`,k(e)];return e.backend!==`remote`&&e.ctx_size&&t.push(A(e.ctx_size)),t.join(` · `)}function P({label:e,value:t,title:n}){return r(`div`,{className:`status-row`,children:[a(`span`,{className:`status-label`,children:e}),a(`span`,{className:`status-value model-server-value`,title:n??t,children:t})]})}function F(){let e=s(e=>e.openSettings),[t,n]=(0,w.useState)(null),[o,u]=(0,w.useState)(null),[d,f]=(0,w.useState)(null),[p,h]=(0,w.useState)(null),[g,v]=(0,w.useState)(!1);(0,w.useEffect)(()=>{S().then(n).catch(e=>u(e instanceof Error?e.message:String(e)))},[]);let y=(0,w.useCallback)(async e=>{f(e),h(null);try{let t=await m(e);n(t),h({ok:!0,text:`Saved. It applies the next time the chat model loads.`})}catch(e){h({ok:!1,text:e instanceof Error?e.message:String(e)})}finally{f(null)}},[]),b=t?.chat_model??null,x=(0,w.useCallback)(async()=>{if(b?.name){v(!0);try{if(!await _(b.name,b.ctx_size??void 0))return;h({ok:!0,text:`Reloading ${b.name}. Reopen this panel in a moment to see its backend.`})}catch(e){h({ok:!1,text:e instanceof Error?e.message:String(e)})}finally{v(!1)}}},[b]),C=a(`button`,{type:`button`,className:`btn-secondary`,onClick:()=>e(`model`),children:`Change model`});if(o)return r(`section`,{className:`settings-section`,"aria-label":`Model server`,children:[a(`h4`,{children:`Model server`}),a(`p`,{className:`settings-error`,role:`alert`,children:o})]});if(!t)return r(`section`,{className:`settings-section`,"aria-label":`Model server`,children:[a(`h4`,{children:`Model server`}),a(`p`,{className:`loading-text`,children:`Checking the model server…`})]});if(!t.reachable)return r(`section`,{className:`settings-section`,"aria-label":`Model server`,children:[a(`h4`,{children:`Model server`}),a(`p`,{className:`settings-error`,role:`alert`,children:t.error}),C]});let T=t.available_backends??[],E=t.preferred_backend??null,j=[`auto`,...T.map(e=>e.name)];E&&!j.includes(E)&&j.push(E);let F=E??`auto`,I=T.filter(e=>e.state===`installable`).map(e=>O(e.name)),L=!!b?.name&&b.recipe===`llamacpp`;return r(`section`,{className:`settings-section`,"aria-label":`Model server`,children:[a(`h4`,{children:`Model server`}),r(`div`,{className:`status-grid`,children:[a(P,{label:`Server`,value:`${D[t.owner]??t.owner}${t.version?` v${t.version}`:``}`}),a(P,{label:`Address`,value:t.base_url}),a(P,{label:`Chat model`,value:b?.name?c(b.name):`None loaded`,title:b?.name??void 0}),b&&a(P,{label:`Runs on`,value:k(b)}),b&&b.backend!==`remote`&&a(P,{label:`Context window`,value:A(b.ctx_size)}),a(P,{label:`Embedding model`,value:t.embedding_model?.name?`${t.embedding_model.name} · ${k(t.embedding_model)}`:`None loaded`}),(t.loaded_models??[]).map((e,t)=>a(P,{label:M(e),value:N(e),title:e.name??void 0},`${e.name??`unknown`}-${t}`))]}),t.embedding_note&&a(`p`,{className:`settings-hint`,children:t.embedding_note}),t.system_info_error&&a(`p`,{className:`settings-hint`,children:t.system_info_error}),r(`div`,{className:`settings-field model-server-backend`,children:[a(`span`,{className:`settings-label`,children:`llama.cpp backend for chat models`}),T.length===0&&!E?a(`span`,{className:`settings-hint`,children:`This Lemonade does not report which backends this PC can run, so there is nothing to choose. Update Lemonade to pick one here.`}):r(i.Fragment,{children:[a(`div`,{className:`segmented`,role:`radiogroup`,"aria-label":`llama.cpp backend`,children:j.map(e=>r(`button`,{type:`button`,role:`radio`,"aria-checked":F===e,className:F===e?`is-active`:``,disabled:d!==null,onClick:()=>{e!==F&&y(e)},children:[d===e?a(l,{size:12,className:`spin`}):null,e===`auto`?`Auto${t.default_backend?` (${O(t.default_backend)})`:``}`:O(e)]},e))}),r(`span`,{className:`settings-hint`,children:[`Applies the next time a chat model loads. The embedding model keeps its own backend.`,I.length>0&&` ${I.join(`, `)} downloads on first use.`]})]}),p&&a(`p`,{className:p.ok?`settings-ok`:`settings-error`,role:p.ok?`status`:`alert`,children:p.text})]}),r(`div`,{className:`settings-row`,children:[C,L&&r(`button`,{type:`button`,className:`btn-secondary`,onClick:()=>void x(),disabled:g,children:[g?a(l,{size:13,className:`spin`}):null,`Reload chat model now`]})]})]})}function I(){let[e,n]=(0,w.useState)(null),[s,c]=(0,w.useState)(!0),[d,m]=(0,w.useState)([]),[h,_]=(0,w.useState)(``),[S,C]=(0,w.useState)(``),[E,D]=(0,w.useState)(!1),[O,k]=(0,w.useState)(!1),[A,j]=(0,w.useState)(null),[M,N]=(0,w.useState)(!1),P=(0,w.useRef)(null),[I,R]=(0,w.useState)(!1),[z,B]=(0,w.useState)(!1),[V,H]=(0,w.useState)(!1),[U,W]=(0,w.useState)(null);(0,w.useEffect)(()=>{t.system.info(`Checking system status...`);let e=t.system.time();f().then(r=>{n(r),t.system.timed(`System status received`,e,{lemonade:r.lemonade_running?`running`:`stopped`,model:r.model_loaded||`none`,embedding:r.embedding_model_loaded?`yes`:`no`,disk:`${r.disk_space_gb}GB free`,memory:r.memory_available_gb==null?`unknown`:`${r.memory_available_gb}GB available`}),r.lemonade_running||t.system.warn(`Lemonade Server is NOT running.`)}).catch(e=>{t.system.error(`Failed to get system status`,e),n(null)}).finally(()=>c(!1)),y().then(e=>m(e.servers)).catch(()=>{}),g().then(e=>{let t=e.custom_model??``;_(t),C(t),R(e.dynamic_tools),B(e.dynamic_tools_locked)}).catch(e=>{t.system.error(`Failed to load settings`,e)}).finally(()=>D(!0))},[]),(0,w.useEffect)(()=>()=>{P.current&&clearTimeout(P.current)},[]);let G=(0,w.useCallback)(async()=>{let e=h.trim(),n=e.length>0?e:``;k(!0),j(null),N(!1);try{t.system.info(`Saving custom_model override`,{custom_model:n});let e=(await u({custom_model:n})).custom_model??``;_(e),C(e),N(!0),P.current&&clearTimeout(P.current),P.current=setTimeout(()=>N(!1),2200)}catch(e){let n=e instanceof Error?e.message:String(e);t.system.error(`Failed to save custom_model`,e),j(n)}finally{k(!1)}},[h]),K=(0,w.useCallback)(async()=>{if(z||V)return;let e=I,n=!e;R(n),H(!0),W(null);try{t.system.info(`Saving dynamic_tools setting`,{dynamic_tools:n});let e=await u({dynamic_tools:n});R(e.dynamic_tools),B(e.dynamic_tools_locked)}catch(n){let r=n instanceof Error?n.message:String(n);t.system.error(`Failed to save dynamic_tools`,n),R(e),W(r)}finally{H(!1)}},[I,z,V]),q=h.trim()!==S.trim(),J=e?e.default_model_name:o,{isLoadingModel:Y,isDownloadingModel:X,loadModel:ee,downloadModel:Z}=x(J??void 0),Q=!!e?.default_model_is_cloud,$=!Q&&!!(e?.lemonade_running&&e.model_loaded&&e.expected_model_loaded===!1),te=!Q&&!!(e?.lemonade_running&&e.model_loaded&&e.context_size_sufficient===!1),ne=!Q&&!(!e?.lemonade_running||e.model_loaded||e.model_downloaded!==!1),re=($||te)&&J!==null;return r(`div`,{className:`settings-pane`,children:[a(`h2`,{className:`settings-pane-title`,children:`Advanced`}),a(F,{}),r(`section`,{className:`settings-section`,children:[a(`h4`,{children:`Local model server`}),s?a(`p`,{className:`loading-text`,children:`Checking system...`}):e?r(i.Fragment,{children:[r(`div`,{className:`status-grid`,children:[a(L,{label:`Model server`,value:e.lemonade_running?`Running${e.lemonade_version?` v${e.lemonade_version}`:``}`:e.lemonade_error?`Status unavailable`:`Not Running`,ok:e.lemonade_running,hint:e.lemonade_running?void 0:e.lemonade_error?`Could not query it: ${e.lemonade_error}`:e.start_command?`Run: ${e.start_command}`:e.start_instruction??`Not running.`}),a(L,{label:`Model`,value:e.model_loaded||`None loaded`,ok:!!e.model_loaded&&(Q||e.expected_model_loaded!==!1),hint:e.model_loaded?!Q&&e.expected_model_loaded===!1?`Expected: ${J}`:void 0:`None loaded yet — it loads with the first message.`}),e.model_size_gb!=null&&a(L,{label:`Model Size`,value:`${e.model_size_gb} GB`,ok:!0}),e.model_device&&!Q&&a(L,{label:`Device`,value:e.model_device.toUpperCase(),ok:e.model_device!==`cpu`}),e.model_context_size!=null&&a(L,{label:`Context Window`,value:`${(e.model_context_size/1024).toFixed(0)}K tokens`,ok:e.context_size_sufficient}),e.model_labels&&e.model_labels.length>0&&a(L,{label:`Capabilities`,value:e.model_labels.join(`, `),ok:!0}),a(L,{label:`Embedding Model`,value:e.embedding_model_loaded?`Available`:`Not loaded`,ok:e.embedding_model_loaded}),e.gpu_name&&a(L,{label:`GPU`,value:`${e.gpu_name}${e.gpu_vram_gb?` (${b(e.gpu_vram_gb)})`:``}`,ok:!0}),a(L,{label:`Disk Space`,value:`${e.disk_space_gb} GB free`,ok:e.disk_space_gb>5,hint:!e.model_loaded&&e.disk_space_gb<30?`Local models need about 6 GB — only ${e.disk_space_gb} GB free`:void 0}),a(L,{label:`Memory`,value:e.memory_available_gb==null?`unknown`:`${e.memory_available_gb} GB available`,ok:e.memory_available_gb!=null&&e.memory_available_gb>2}),e.processor_name&&a(L,{label:`Processor`,value:e.processor_name,ok:!0})]}),ne&&r(`div`,{className:`model-action-row model-action-row--download`,children:[r(`div`,{className:`model-action-info`,children:[a(`span`,{className:`model-action-label`,children:`Model not downloaded.`}),r(`span`,{className:`model-action-desc`,children:[a(`strong`,{children:J}),` is GAIA’s default local model (about 6 GB).`]})]}),a(`button`,{className:`btn-model-action btn-model-action--download`,onClick:()=>Z(!1),disabled:X,children:X?r(i.Fragment,{children:[a(l,{size:13,className:`btn-spinner`}),` Downloading…`]}):`Download`})]}),re&&r(`div`,{className:`model-action-row model-action-row--load`,children:[r(`div`,{className:`model-action-info`,children:[a(`span`,{className:`model-action-label`,children:$?`Wrong model loaded.`:`Context window too small.`}),r(`span`,{className:`model-action-desc`,children:[`Load `,a(`strong`,{children:J}),` with `,32 .toFixed(0),`K token context.`]})]}),a(`button`,{className:`btn-model-action btn-model-action--load`,onClick:()=>ee(),disabled:Y,children:Y?r(i.Fragment,{children:[a(l,{size:13,className:`btn-spinner`}),` Loading…`]}):`Load Model`})]}),e.lemonade_running&&J!==null&&!Q&&r(`div`,{className:`force-redownload-row`,children:[a(`span`,{className:`force-redownload-label`,children:`If the model file is corrupted:`}),a(`button`,{className:`btn-force-redownload`,onClick:()=>Z(!0),disabled:X,children:X?r(i.Fragment,{children:[a(l,{size:12,className:`btn-spinner`}),` Downloading…`]}):`Force Re-download`})]})]}):a(`div`,{className:`status-error`,children:a(`p`,{children:`Could not reach GAIA. Check that it is still running.`})})]}),a(T,{}),r(`section`,{className:`settings-section`,children:[a(`h4`,{children:`Custom model ID`}),a(`p`,{className:`model-override-desc`,children:`Run any model the local server knows by its ID. Leave empty to use the model chosen under Model.`}),r(`div`,{className:`model-input-row`,children:[a(`input`,{type:`text`,className:`model-input${S?` has-override`:``}`,placeholder:`Use the model chosen under Model`,value:h,onChange:e=>{_(e.target.value),j(null),N(!1)},onKeyDown:e=>{e.key===`Enter`&&!O&&q&&E&&(e.preventDefault(),G())},disabled:!E||O,spellCheck:!1,autoCapitalize:`off`,autoCorrect:`off`,"aria-label":`Custom model override`}),a(`div`,{className:`model-btn-group`,children:a(`button`,{className:`btn-model-save${M?` saved`:``}`,onClick:()=>{G()},disabled:!E||O||!q&&!M,"aria-label":`Save custom model`,children:O?r(i.Fragment,{children:[a(l,{size:13,className:`btn-spinner`}),` Saving…`]}):M?r(i.Fragment,{children:[a(v,{size:13}),` Saved`]}):`Save`})})]}),r(`p`,{className:`model-status-hint`,children:[`Accepts a Lemonade model ID (e.g. `,a(`code`,{children:`Qwen3-4B-Instruct-2507-GGUF`}),`)`,` `,`or a HuggingFace ID (e.g. `,a(`code`,{children:`unsloth/Qwen3-4B-GGUF`}),`).`]}),A&&r(`div`,{className:`model-warning`,role:`alert`,children:[a(p,{size:14}),r(`div`,{className:`model-warning-content`,children:[a(`strong`,{children:`Could not save`}),a(`p`,{children:A})]})]})]}),r(`section`,{className:`settings-section`,children:[r(`h4`,{children:[`Dynamic Tools `,a(`span`,{className:`beta-badge`,children:`BETA`})]}),a(`p`,{className:`model-override-desc`,children:`Trim each turn’s tool list to a semantically-matched subset to speed up the first response. It does not apply to the GAIA agent yet.`}),r(`label`,{className:`setting-row`,children:[a(`span`,{children:`Enable dynamic tool loading`}),r(`span`,{className:`toggle-switch`,children:[a(`input`,{type:`checkbox`,checked:I,onChange:()=>void K(),disabled:!E||V||z,"aria-label":I?`Disable dynamic tools`:`Enable dynamic tools`}),a(`span`,{className:`toggle-track`})]})]}),z&&r(`p`,{className:`model-status-hint`,children:[`Controlled by `,a(`code`,{children:`GAIA_DYNAMIC_TOOLS`}),` — unset that environment variable to change this here.`]}),U&&r(`div`,{className:`model-warning`,role:`alert`,children:[a(p,{size:14}),r(`div`,{className:`model-warning-content`,children:[a(`strong`,{children:`Could not save`}),a(`p`,{children:U})]})]})]}),d.length>0&&r(`section`,{className:`settings-section`,children:[a(`h4`,{children:`MCP Servers`}),a(`div`,{className:`status-grid`,children:d.map(e=>r(`div`,{className:`status-row`,children:[a(`span`,{className:`status-label`,children:e.name}),a(`div`,{className:`status-value-wrap`,children:e.connected?r(`span`,{className:`status-value ok mcp-status-connected`,children:[a(v,{size:12}),e.tool_count,` tool`,e.tool_count===1?``:`s`]}):r(`span`,{className:`status-value warn mcp-status-failed`,title:e.error??void 0,children:[a(p,{size:12}),`Failed`]})})]},e.name))})]}),r(`section`,{className:`settings-section`,children:[a(`h4`,{children:`About`}),r(`div`,{className:`about-info`,children:[r(`p`,{children:[`GAIA v`,`0.25.4rc2`,` `,a(`span`,{className:`beta-badge`,children:`BETA`})]}),a(`p`,{className:`about-sub`,children:`Privacy-first AI chat for AMD Ryzen AI PCs.`})]})]})]})}function L({label:e,value:t,ok:n,hint:i}){return r(`div`,{className:`status-row${i?` status-row--has-hint`:``}`,children:[a(`span`,{className:`status-label`,children:e}),r(`div`,{className:`status-value-wrap`,children:[a(`span`,{className:`status-value ${n?`ok`:`warn`}`,children:t}),i&&a(`span`,{className:`status-hint`,children:a(`code`,{children:i})})]})]})}export{I as AdvancedSettings};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{S as t,T as n,i as r,n as i,r as a,t as o}from"./apiBase-DRtaTd8u.js";import{At as s,Ct as c,Dt as l,Et as u,Ft as d,It as f,Mt as p,Nt as m,Ot as h,Pt as g,St as _,Tt as v,Zt as y,_n as b,bt as x,gn as S,jt as C,kt as w,mn as T,on as E,sn as D,wt as O,xt as k,yn as A}from"./index-CKOG_8jk.js";var j=e(n(),1),M=t.api;function N(e){switch(e){case`connector.configured`:return`configured`;case`connector.disconnected`:return`disconnected`;case`connection.revoked`:return`disconnected`;case`connector.oauth.completed`:return`oauth_completed`;case`connection.connected`:return`oauth_completed`;case`connector.oauth.error`:return`oauth_error`;case`connector.tested`:return`tested`;case`connector.enabled`:return`enabled`;case`connector.disabled`:return`disabled`;case`connector.grant.changed`:return`grant_changed`;case`connector.activation.changed`:return`activation_changed`;default:return null}}function P(e){let t=(0,j.useRef)(e);(0,j.useEffect)(()=>{t.current=e},[e]),(0,j.useEffect)(()=>{let e=`${o()}/connectors/events`,n=null,r=1e3,i=null,a=!1,s=()=>{a||(n=new EventSource(e),n.onopen=()=>{r=1e3},n.onmessage=e=>{try{let n=JSON.parse(e.data),r=N(n.type);if(r===null){M.debug(`connectors-sse: ignoring event`,n.type);return}let i=n.payload??{},a=i.connector_id??i.provider??null;t.current({connectorId:a,reason:r,payload:i})}catch(e){M.warn(`connectors-sse: malformed event`,e)}},n.onerror=()=>{n?.close(),n=null,!a&&(i=setTimeout(s,r),r=Math.min(r*2,3e4))})};return s(),()=>{a=!0,i&&clearTimeout(i),n?.close()}},[])}function F(e){return e.type===`mcp_server`&&e.configured}function I({connector:e,onChanged:t}){let[n,i]=(0,j.useState)(!1),[o,s]=(0,j.useState)(!1),[c,f]=(0,j.useState)(null),[p,m]=(0,j.useState)(null),h=(0,j.useRef)(null),g=(0,j.useRef)(null);(0,j.useEffect)(()=>{if(!n)return;let e=e=>{let t=e.target;h.current&&!h.current.contains(t)&&g.current&&!g.current.contains(t)&&i(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[n]);let _=(0,j.useCallback)(()=>i(!1),[]);if(d(n,_),(0,j.useEffect)(()=>{if(!n)return;let e=()=>{if(!h.current)return;let e=h.current.getBoundingClientRect();m({top:e.bottom+4,right:window.innerWidth-e.right})};return window.addEventListener(`resize`,e),window.addEventListener(`scroll`,e,!0),()=>{window.removeEventListener(`resize`,e),window.removeEventListener(`scroll`,e,!0)}},[n]),!F(e))return null;let y=e=>{e.stopPropagation(),e.preventDefault()},b=e=>{if(y(e),!n&&h.current){let e=h.current.getBoundingClientRect();m({top:e.bottom+4,right:window.innerWidth-e.right})}i(e=>!e)},x=async e=>{s(!0),f(null);try{await e(),i(!1),t()}catch(e){f(e instanceof Error?e.message:String(e))}finally{s(!1)}};return r(`div`,{className:`connector-tile-menu`,onClick:y,onKeyDown:y,children:[a(`button`,{ref:h,type:`button`,className:`connector-tile-menu-trigger`,"aria-haspopup":`menu`,"aria-expanded":n,"aria-label":`Connector actions`,onClick:b,disabled:o,children:a(D,{size:14})}),n&&p&&r(`div`,{ref:g,role:`menu`,className:`connector-tile-menu-popup`,style:{position:`fixed`,top:p.top,right:p.right},children:[e.enabled?a(`button`,{role:`menuitem`,type:`button`,className:`connector-tile-menu-item`,onClick:()=>void x(()=>v(e.id)),disabled:o,children:`Disable`}):a(`button`,{role:`menuitem`,type:`button`,className:`connector-tile-menu-item`,onClick:()=>void x(()=>l(e.id)),disabled:o,children:`Enable`}),a(`div`,{className:`connector-tile-menu-divider`}),a(`button`,{role:`menuitem`,type:`button`,className:`connector-tile-menu-item connector-tile-menu-item--danger`,onClick:()=>void x(()=>u(e.id)),disabled:o,children:`Disconnect`}),c&&a(`div`,{className:`connector-tile-menu-error`,children:c})]})]})}var L={"https://www.googleapis.com/auth/gmail.readonly":`Read emails`,"https://www.googleapis.com/auth/gmail.modify":`Organize emails (archive, label, trash)`,"https://www.googleapis.com/auth/gmail.send":`Send emails on your behalf`,"https://www.googleapis.com/auth/gmail.compose":`Compose emails`,"https://www.googleapis.com/auth/calendar.readonly":`View calendar events`,"https://www.googleapis.com/auth/calendar.events":`Create & respond to calendar events`,"https://www.googleapis.com/auth/drive.readonly":`Read Google Drive files`,"https://www.googleapis.com/auth/drive.file":`Manage Drive files created by this app`,"https://www.googleapis.com/auth/spreadsheets.readonly":`Read Google Sheets`,"https://www.googleapis.com/auth/spreadsheets":`Edit Google Sheets`,openid:`Identify you`,email:`See your email address`,profile:`See your basic profile info`,"https://graph.microsoft.com/Mail.ReadWrite":`Read & organize Outlook mail (archive, label, trash)`,"https://graph.microsoft.com/Mail.Send":`Send Outlook mail on your behalf`,"https://graph.microsoft.com/Calendars.ReadWrite":`Create & respond to Outlook calendar events`,"https://graph.microsoft.com/Calendars.Read":`View Outlook calendar events`,"https://graph.microsoft.com/User.Read":`Read your basic Microsoft profile`};function R(e){return L[e]??e.split(/[/.:]/).pop()??e}var z=[`use`];function B(e){return!(`revoke_supported`in e)||e.revoke_supported&&e.revoked_remotely?null:e.revoke_supported&&!e.revoked_remotely?`Disconnected locally, but the provider did not confirm the revoke (${String(e.revoke_error??`unknown error`)}). It may still show as connected in your account's app permissions.`:e.revoke_error?`Disconnected locally. ${String(e.revoke_error)}`:`Disconnected locally. This provider has no API to revoke access remotely — remove GAIA from your account's connected-apps page if you want to fully revoke it.`}function V(){let[e,t]=(0,j.useState)([]),[n,o]=(0,j.useState)([]),[c,l]=(0,j.useState)(!0),[u,d]=(0,j.useState)(null),[f,p]=(0,j.useState)(null),[g,_]=(0,j.useState)(null),v=(0,j.useCallback)(async()=>{try{let[{connectors:e},{agent_mcps:n}]=await Promise.all([m(),s()]);t(e),o(n),d(null)}catch(e){d(e instanceof Error?e.message:String(e))}finally{l(!1)}},[]);(0,j.useEffect)(()=>{v()},[v]);let b=e=>_(t=>t===e?null:e),x=(0,j.useCallback)(async e=>{try{let n=await h(e);t(t=>t.map(t=>t.id===e?n:t))}catch{v()}},[v]);return P((0,j.useCallback)(e=>{e.reason===`disconnected`&&p(B(e.payload)),e.connectorId?x(e.connectorId):v()},[x,v])),r(`section`,{className:`connectors-section`,"aria-label":`Connectors`,children:[a(`p`,{className:`settings-help`,children:`Connect accounts and MCP servers so GAIA can use them on your behalf. Choose what GAIA may do with each one.`}),u&&r(`div`,{className:`error-banner`,children:[a(S,{size:14}),a(`span`,{children:u})]}),f&&r(`div`,{className:`error-banner`,role:`status`,onClick:()=>p(null),children:[a(S,{size:14}),a(`span`,{children:f})]}),c?a(`div`,{className:`connectors-loading`,children:a(y,{size:16,className:`spin`})}):r(i.Fragment,{children:[a(`div`,{className:`connectors-list`,children:e.map(e=>a(H,{connector:e,expanded:g===e.id,onToggle:()=>b(e.id),onChanged:()=>void x(e.id)},e.id))}),n.length>0&&a(q,{servers:n,expanded:g,onToggle:b})]})]})}function H({connector:e,expanded:t,onToggle:n,onChanged:i}){return r(`div`,{className:`connector-tile${t?` connector-tile--open`:``}`,children:[r(`button`,{className:`connector-tile-header`,onClick:n,"aria-expanded":t,children:[a(`span`,{className:`connector-tile-name`,children:e.display_name}),a(`span`,{className:`connector-tile-type`,children:e.type===`oauth_pkce`?`OAuth`:`MCP`}),e.configured?e.type===`mcp_server`&&e.enabled===!1?a(`span`,{className:`connector-status disabled`,children:`Disabled`}):r(`span`,{className:`connector-status ok`,children:[a(T,{size:12}),e.account_id??`Configured`]}):a(`span`,{className:`connector-status idle`,children:`Not configured`}),a(I,{connector:e,onChanged:i}),a(`span`,{className:`connector-tile-chevron`,children:a(t?b:A,{size:14})})]}),t&&r(`div`,{className:`connector-detail`,children:[e.type===`oauth_pkce`?a(U,{connector:e,onChanged:i}):a(G,{connector:e,onChanged:i}),e.configured&&a(Y,{connectorId:e.id,connectorType:e.type})]})]})}function U({connector:e,onChanged:t}){let[n,o]=(0,j.useState)(!1),[s,l]=(0,j.useState)(null),[d,p]=(0,j.useState)({}),[m,h]=(0,j.useState)(null),{agents:g}=f(),v=g.filter(t=>t.namespaced_agent_id&&t.required_connections?.some(t=>t.connector_id===e.id)),b=v.map(e=>e.namespaced_agent_id).join(`,`),[x,C]=(0,j.useState)(()=>new Set);(0,j.useEffect)(()=>{C(new Set(v.map(e=>e.namespaced_agent_id)))},[b]);let w=e=>C(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),T=()=>[...x];(0,j.useEffect)(()=>{let e=()=>{t()};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[t]);let D=e=>{let t=window;t.gaia?.openExternal?t.gaia.openExternal(e):window.open(e,`_blank`,`noopener`)},O=async()=>{o(!0),l(null);try{let t=await k(e.id,e.available_scopes?.length?e.available_scopes:e.default_scopes,T());D(t.authorization_url)}catch(e){l(e instanceof Error?e.message:String(e))}finally{o(!1)}},A=async()=>{o(!0),l(null),h(null);try{let t=await _(e.id,e.available_scopes?.length?e.available_scopes:e.default_scopes,T());h(t)}catch(e){l(e instanceof Error?e.message:String(e))}finally{o(!1)}};(0,j.useEffect)(()=>{e.configured&&h(null)},[e.configured]),P((0,j.useCallback)(t=>{t.connectorId===e.id&&(t.reason===`oauth_error`?(l(String(t.payload.error??`Device sign-in failed.`)),h(null)):t.reason===`oauth_completed`&&h(null))},[e.id]));let M=async()=>{o(!0),l(null);try{await u(e.id),t()}catch(e){l(e instanceof Error?e.message:String(e))}finally{o(!1)}},N=async()=>{let n=(e.oauth_setup_fields??[]).filter(e=>e.required!==!1&&!d[e.key]?.trim()).map(e=>e.label);if(n.length)l(`Required: ${n.join(`, `)}`);else{o(!0),l(null);try{let n=e.available_scopes?.length?e.available_scopes:e.default_scopes,r=await c(e.id,{...d,scopes:n,grant_agents:T()}),i=typeof r.authorization_url==`string`?r.authorization_url:null;i&&D(i),t()}catch(e){l(e instanceof Error?e.message:String(e))}finally{o(!1)}}},F=e.oauth_setup_fields??[],I=e.configurable===!1&&!e.configured&&F.length>0;return r(`div`,{className:`configure-body`,children:[e.description&&a(`p`,{className:`connector-desc`,children:e.description}),I&&r(`div`,{className:`oauth-setup-form`,children:[a(`p`,{className:`connector-desc`,children:`First-time setup — provide your OAuth client credentials below. They’re stored encrypted in your OS keyring and reused for future connections.`}),F.map(e=>r(`label`,{className:`oauth-setup-field`,children:[a(`span`,{className:`oauth-setup-label`,children:e.label}),a(`input`,{type:e.kind===`secret`?`password`:`text`,className:`oauth-setup-input`,placeholder:e.placeholder,value:d[e.key]??``,onChange:t=>p(n=>({...n,[e.key]:t.target.value})),autoComplete:`off`,spellCheck:!1}),e.help_md&&a(`span`,{className:`oauth-setup-help`,children:e.help_md})]},e.key))]}),!e.configured&&v.length>0&&r(`div`,{className:`oauth-grant-onconnect`,children:[a(`p`,{className:`oauth-grant-onconnect-label`,children:`Grant access to these agents when you connect:`}),v.map(e=>r(`label`,{className:`oauth-grant-onconnect-item`,children:[a(`input`,{type:`checkbox`,checked:x.has(e.namespaced_agent_id),onChange:()=>w(e.namespaced_agent_id)}),a(`span`,{children:e.name})]},e.namespaced_agent_id)),a(`p`,{className:`oauth-grant-onconnect-help`,children:`You can change these any time under Per-agent grants below.`})]}),!I&&a(W,{connector:e,onChanged:t}),s&&r(`div`,{className:`configure-error`,children:[a(S,{size:12}),` `,s]}),r(`div`,{className:`configure-actions`,children:[e.configured?a(`button`,{className:`btn-secondary`,disabled:n,onClick:()=>void M(),children:n?a(y,{size:12,className:`spin`}):`Disconnect`}):I?a(`button`,{className:`btn-primary`,disabled:n,onClick:()=>void N(),children:n?a(y,{size:12,className:`spin`}):r(i.Fragment,{children:[a(E,{size:12}),` Save & Connect`]})}):e.configurable===!1?a(`span`,{className:`connector-setup-required`,title:e.config_error??void 0,children:`Setup required`}):r(i.Fragment,{children:[a(`button`,{className:`btn-primary`,disabled:n||m!==null,onClick:()=>void O(),children:n?a(y,{size:12,className:`spin`}):r(i.Fragment,{children:[a(E,{size:12}),` Connect`]})}),e.supports_device_code&&a(`button`,{className:`btn-secondary`,disabled:n||m!==null,onClick:()=>void A(),title:`Enter a short code at a URL — no browser redirect or app registration needed`,children:`Sign in with a code`})]}),(e.docs_url||e.product_url)&&r(`a`,{href:e.docs_url||e.product_url||`#`,target:`_blank`,rel:`noopener noreferrer`,className:`connector-product-link`,children:[`Learn more `,a(E,{size:11})]})]}),m&&!e.configured&&r(`div`,{className:`device-code-block`,children:[r(`p`,{className:`device-code-instructions`,children:[`Go to`,` `,a(`a`,{href:m.verification_uri,target:`_blank`,rel:`noopener noreferrer`,onClick:e=>{e.preventDefault(),D(m.verification_uri)},children:m.verification_uri}),` `,`and enter this code:`]}),r(`div`,{className:`device-code-value`,children:[a(`code`,{children:m.user_code}),a(`button`,{type:`button`,className:`btn-secondary`,onClick:()=>void navigator.clipboard?.writeText(m.user_code),title:`Copy code`,children:`Copy`})]}),r(`p`,{className:`device-code-waiting`,children:[a(y,{size:12,className:`spin`}),` Waiting for sign-in…`]}),a(`button`,{type:`button`,className:`btn-secondary`,onClick:()=>h(null),children:`Cancel`})]})]})}function W({connector:e,onChanged:t}){let[n,o]=(0,j.useState)(!1),[s,l]=(0,j.useState)({}),[u,d]=(0,j.useState)(!1),[f,p]=(0,j.useState)(!1),[m,h]=(0,j.useState)(null),g=e.oauth_setup_fields??[];if(g.length===0)return null;let _=e.oauth_client,v=_?.source===`keyring`?`Saved client: ${_.client_id}`:_?.source===`env`?`From environment: ${_.client_id}`:`No OAuth client configured`,x=async()=>{if(!s.client_id?.trim())h(`Client ID is required.`);else{d(!0),h(null),p(!1);try{await c(e.id,{...Object.fromEntries(Object.entries(s).map(([e,t])=>[e,t.trim()])),save_only:!0}),p(!0),l({}),t(),setTimeout(()=>p(!1),2200)}catch(e){h(e instanceof Error?e.message:String(e))}finally{d(!1)}}};return r(`div`,{className:`oauth-client-editor`,children:[r(`button`,{type:`button`,className:`oauth-client-editor__toggle`,onClick:()=>o(e=>!e),"aria-expanded":n,children:[a(n?b:A,{size:12}),a(`span`,{children:`OAuth client`}),a(`span`,{className:`oauth-client-editor__status`,children:v})]}),n&&r(`div`,{className:`oauth-setup-form`,children:[r(`p`,{className:`connector-desc`,children:[`Bring your own OAuth client — saved encrypted in your OS keyring (same store as`,` `,a(`code`,{children:`gaia connectors configure`}),`) and reused for future connections. Environment variables are only used when no saved client exists.`]}),g.map(e=>r(`label`,{className:`oauth-setup-field`,children:[a(`span`,{className:`oauth-setup-label`,children:e.label}),a(`input`,{type:e.kind===`secret`?`password`:`text`,className:`oauth-setup-input`,placeholder:e.kind===`secret`&&_?.source===`keyring`&&_.has_secret?`••••••••`:e.placeholder,value:s[e.key]??``,onChange:t=>l(n=>({...n,[e.key]:t.target.value})),autoComplete:`off`,spellCheck:!1}),e.help_md&&a(`span`,{className:`oauth-setup-help`,children:e.help_md})]},e.key)),m&&r(`div`,{className:`configure-error`,children:[a(S,{size:12}),` `,m]}),a(`div`,{className:`configure-actions`,children:a(`button`,{className:`btn-model-save${f?` saved`:``}`,disabled:u||!s.client_id?.trim(),onClick:()=>void x(),children:u?a(y,{size:12,className:`spin`}):f?r(i.Fragment,{children:[a(T,{size:12}),` Saved`]}):`Save client`})})]})]})}function G({connector:e,onChanged:t}){let[n,o]=(0,j.useState)(()=>Object.fromEntries(e.mcp_env_keys.map(e=>[e,``]))),[s,d]=(0,j.useState)(!1),[f,p]=(0,j.useState)(!1),[m,h]=(0,j.useState)(null);(0,j.useEffect)(()=>{o(Object.fromEntries(e.mcp_env_keys.map(e=>[e,``])))},[e.mcp_env_keys.join(`,`)]);let g=e.mcp_env_keys.length===0,_=Object.values(n).every(e=>e.trim()===``),b=async()=>{let r=Object.fromEntries(Object.entries(n).filter(([,e])=>e.trim()!==``));if(g||Object.keys(r).length!==0){d(!0),h(null),p(!1);try{await c(e.id,r),p(!0),t(),setTimeout(()=>p(!1),2200)}catch(e){h(e instanceof Error?e.message:String(e))}finally{d(!1)}}},x=async()=>{d(!0),h(null);try{await u(e.id),o(Object.fromEntries(e.mcp_env_keys.map(e=>[e,``]))),t()}catch(e){h(e instanceof Error?e.message:String(e))}finally{d(!1)}},C=async()=>{d(!0),h(null);try{e.enabled?await v(e.id):await l(e.id),t()}catch(e){h(e instanceof Error?e.message:String(e))}finally{d(!1)}};return r(`div`,{className:`configure-body`,children:[e.description&&a(`p`,{className:`connector-desc`,children:e.description}),m&&r(`div`,{className:`configure-error`,children:[a(S,{size:12}),` `,m]}),e.configured&&r(`div`,{className:`connector-toggle-row`,children:[a(`span`,{className:`connector-toggle-label`,children:`Active`}),r(`span`,{className:`toggle-switch`,children:[a(`input`,{type:`checkbox`,checked:e.enabled!==!1,onChange:()=>void C(),disabled:s,"aria-label":e.enabled?`Disable this MCP server`:`Enable this MCP server`}),a(`span`,{className:`toggle-track`})]})]}),e.configured&&e.enabled===!1&&a(`p`,{className:`connector-toggle-help`,children:`Credentials and per-agent grants are preserved. Re-enable to make this server's tools available again.`}),e.mcp_env_keys.map(t=>r(`div`,{className:`mcp-key-row`,children:[a(`label`,{className:`mcp-key-label`,children:t}),a(`input`,{type:`password`,className:`mcp-key-input`,placeholder:e.configured?`••••••••`:`Enter value`,value:n[t]??``,onChange:e=>o(n=>({...n,[t]:e.target.value})),spellCheck:!1,autoComplete:`off`})]},t)),r(`div`,{className:`configure-actions`,children:[!(g&&e.configured)&&a(`button`,{className:`btn-model-save${f?` saved`:``}`,disabled:s||!g&&_,onClick:()=>void b(),children:s?a(y,{size:12,className:`spin`}):f?r(i.Fragment,{children:[a(T,{size:12}),` Saved`]}):g?`Connect`:`Save`}),e.configured&&a(`button`,{className:`btn-secondary`,disabled:s,onClick:()=>void x(),children:`Disconnect`}),e.product_url&&r(`a`,{href:e.product_url,target:`_blank`,rel:`noopener noreferrer`,className:`connector-product-link`,children:[`Docs `,a(E,{size:11})]})]})]})}function K({agent:e,connectorId:t,grantedScopes:n,onChanged:i}){let o=e.required_connections?.find(e=>e.connector_id===t),s=e.namespaced_agent_id;if(!o||!s)return null;let[c,l]=(0,j.useState)(()=>new Set(n)),[u,d]=(0,j.useState)(null),[f,p]=(0,j.useState)(null);(0,j.useEffect)(()=>{l(new Set(n))},[n.join(`,`)]);let m=async e=>{if(u!==null)return;let r=new Set(c);r.has(e)?r.delete(e):r.add(e),l(r),d(e),p(null);try{r.size===0?await g(t,s):await w(t,s,[...r]),i()}catch(e){l(new Set(n)),p(e instanceof Error?e.message:String(e))}finally{d(null)}};return r(`div`,{className:`grant-agent-card`,children:[a(`div`,{className:`grant-agent-card-name`,children:e.name}),a(`div`,{className:`grant-scope-list`,children:o.scopes.map(e=>r(`label`,{className:`grant-scope-item`,children:[a(`span`,{className:`grant-scope-label`,children:R(e)}),r(`span`,{className:`toggle-switch`,children:[a(`input`,{type:`checkbox`,checked:c.has(e),onChange:()=>void m(e),disabled:u!==null}),a(`span`,{className:`toggle-track`})]})]},e))}),f&&r(`div`,{className:`grant-scope-warning grant-scope-warning--error`,children:[a(S,{size:11}),` `,f]})]})}function q({servers:e,expanded:t,onToggle:n}){return r(`div`,{className:`agent-mcps-section`,children:[a(`div`,{className:`agent-mcps-section-header`,children:`Custom agent servers`}),a(`div`,{className:`connectors-list`,children:e.map(e=>{let r=`${e.agent_id}::${e.server_name}`;return a(J,{server:e,expanded:t===r,onToggle:()=>n(r)},r)})})]})}function J({server:e,expanded:t,onToggle:n}){let i=[e.command,...e.args].join(` `);return r(`div`,{className:`agent-mcp-tile${t?` agent-mcp-tile--open`:``}`,children:[r(`button`,{type:`button`,className:`agent-mcp-tile-header`,onClick:n,"aria-expanded":t,children:[a(`span`,{className:`agent-mcp-server-name`,children:e.server_name}),r(`span`,{className:`agent-mcp-agent-label`,children:[`via `,e.agent_name]}),e.disabled?a(`span`,{className:`agent-mcp-status disabled`,children:`Disabled`}):r(`span`,{className:`agent-mcp-status enabled`,children:[a(T,{size:11}),` Active`]}),a(`span`,{className:`agent-mcp-readonly-badge`,children:`read-only`}),a(`span`,{className:`agent-mcp-chevron`,children:a(t?b:A,{size:14})})]}),t&&r(`div`,{className:`agent-mcp-detail`,children:[i&&a(`div`,{className:`agent-mcp-command-row`,children:i}),a(`div`,{className:`agent-mcp-config-path`,children:e.config_path}),r(`div`,{className:`agent-mcp-config-hint`,children:[`Edit the agent's `,a(`code`,{children:`mcp_servers.json`}),` to change this server.`]})]})]})}function Y({connectorId:e,connectorType:t}){let{agents:n}=f(),[o,s]=(0,j.useState)({}),[c,l]=(0,j.useState)({}),[u,d]=(0,j.useState)(!0),m=(0,j.useCallback)(async()=>{try{let[{grants:t},{activations:n}]=await Promise.all([p(e),C(e)]);s(t),l(n)}catch{s({}),l({})}finally{d(!1)}},[e]);if((0,j.useEffect)(()=>{m()},[m]),P((0,j.useCallback)(t=>{t.connectorId===e&&(t.reason===`grant_changed`||t.reason===`activation_changed`||t.reason===`disconnected`)&&m()},[e,m])),u)return null;let h=n.filter(t=>t.namespaced_agent_id&&t.required_connections?.some(t=>t.connector_id===e)),g=t===`mcp_server`?n.filter(t=>t.namespaced_agent_id&&(t.consumes_mcp_servers||t.required_connections?.some(t=>t.connector_id===e))):[];return r(`div`,{className:`connection-grants`,children:[a(`div`,{className:`grants-header`,children:`Per-agent grants`}),h.length===0?a(`div`,{className:`grants-empty`,children:`No agents require access to this connector.`}):h.map(t=>a(K,{agent:t,connectorId:e,grantedScopes:o[t.namespaced_agent_id]??[],onChanged:()=>void m()},t.namespaced_agent_id)),g.length>0&&r(i.Fragment,{children:[a(`div`,{className:`grants-header grants-header--activations`,children:`Active for`}),a(`div`,{className:`grants-help`,children:`Activations gate which agents see this connector's tools. Activating without a prior grant auto-creates one.`}),g.map(t=>a(X,{agent:t,connectorId:e,active:!!c[t.namespaced_agent_id],grantedScopes:o[t.namespaced_agent_id]??[],onChanged:()=>void m()},`activation-${t.namespaced_agent_id}`))]})]})}function X({agent:e,connectorId:t,active:n,grantedScopes:i,onChanged:o}){let s=e.required_connections?.find(e=>e.connector_id===t),c=e.namespaced_agent_id;if(!c)return null;let[l,u]=(0,j.useState)(n),[d,f]=(0,j.useState)(!1),[p,m]=(0,j.useState)(null);(0,j.useEffect)(()=>{u(n)},[n]);let h=async()=>{if(d)return;let e=!l;u(e),f(!0),m(null);try{if(e){let e=i.length===0?s?[...s.scopes]:[...z]:void 0;await x(t,c,e)}else await O(t,c);o()}catch(e){u(n),m(e instanceof Error?e.message:String(e))}finally{f(!1)}};return r(`div`,{className:`grant-agent-card`,children:[a(`div`,{className:`grant-agent-card-name`,children:e.name}),a(`div`,{className:`grant-scope-list`,children:r(`label`,{className:`grant-scope-item`,children:[a(`span`,{className:`grant-scope-label`,children:l?`Tools visible to this agent`:`Tools hidden from this agent`}),r(`span`,{className:`toggle-switch`,children:[a(`input`,{type:`checkbox`,checked:l,onChange:()=>void h(),disabled:d}),a(`span`,{className:`toggle-track`})]})]})}),p&&r(`div`,{className:`grant-scope-warning grant-scope-warning--error`,children:[a(S,{size:11}),` `,p]})]})}function Z(){return r(`div`,{className:`settings-pane`,children:[a(`h2`,{className:`settings-pane-title`,children:`Connectors`}),a(V,{})]})}export{Z as ConnectorsPane};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.index-progress{flex-direction:column;gap:4px;min-inline-size:0;margin-block-start:4px;display:flex}.index-progress-track{border-radius:var(--radius-full);background:var(--bg-tertiary);block-size:4px;position:relative;overflow:hidden}.index-progress-fill{border-radius:inherit;background:var(--accent-solid);block-size:100%;inline-size:0;transition:inline-size var(--duration) var(--ease)}.index-progress.is-running .index-progress-track.is-indeterminate .index-progress-fill{inline-size:35%;animation:indexProgressSweep var(--duration-shimmer) var(--ease-in-out) infinite}.index-progress.is-running .index-progress-track.is-indeterminate:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)) .index-progress-fill{animation-name:indexProgressSweepRtl}@keyframes indexProgressSweep{0%{transform:translate(-100%)}to{transform:translate(300%)}}@keyframes indexProgressSweepRtl{0%{transform:translate(100%)}to{transform:translate(-300%)}}@media (prefers-reduced-motion:reduce){.index-progress.is-running .index-progress-track.is-indeterminate .index-progress-fill{opacity:.4;inline-size:100%;animation:none}}.index-progress-label{color:var(--text-muted);font-variant-numeric:tabular-nums;font-size:12px}.doc-modal{width:640px}.doc-target{color:var(--text-secondary);flex-direction:column;gap:4px;margin-bottom:14px;font-size:13px;display:flex}.doc-target-choice{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.doc-target-choice select{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-primary);max-width:100%;color:var(--text-primary);cursor:pointer;padding:4px 8px;font-size:13px}.doc-target-choice select:focus-visible{border-color:var(--accent);outline:none}.doc-target-hint{color:var(--text-muted);font-size:12px}.doc-target-notice{color:var(--text-secondary);margin:-6px 0 12px;font-size:12.5px}.drop-zone{border:2px dashed var(--border);border-radius:var(--radius-lg);text-align:center;cursor:pointer;color:var(--text-secondary);transition:all var(--duration) var(--ease);flex-direction:column;justify-content:center;align-items:center;margin-bottom:18px;padding:36px;display:flex}.drop-zone:hover,.drop-zone.drag-over{border-color:var(--accent);background:var(--accent-dim2);color:var(--accent);transform:translateY(-1px)}.drop-zone.uploading{border-color:var(--accent);cursor:default}.drop-zone p{font-size:14px;font-weight:500;font-family:var(--font-sans);margin-top:10px}.drop-hint{color:var(--text-muted);font-size:12px;font-family:var(--font-sans);margin-top:4px}.upload-spinner{border:3px solid var(--border);border-top-color:var(--accent);width:28px;height:28px;animation:spin var(--duration-spin) var(--ease-linear) infinite;border-radius:50%}.path-input-form{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:16px;display:flex}.path-icon{color:var(--text-muted);flex-shrink:0}.path-input{border:1px solid var(--border);border-radius:var(--radius-md);min-inline-size:0;font-size:13px;font-family:var(--font-mono);transition:border-color var(--duration) var(--ease), box-shadow var(--duration) var(--ease);outline:none;flex:200px;padding:9px 14px}.path-input:focus{border-color:var(--accent)}.path-input::placeholder{color:var(--text-muted)}.doc-stats{color:var(--text-muted);align-items:center;gap:8px;margin-bottom:12px;padding:0 2px;font-size:12px;display:flex}.doc-list{flex-direction:column;gap:4px;display:flex}.doc-row{border:1px solid var(--border-light);border-radius:var(--radius-md);transition:border-color var(--duration) var(--ease), background var(--duration) var(--ease);justify-content:space-between;align-items:center;padding:12px 14px;display:flex}.doc-row:hover{border-color:var(--accent-light);background:var(--tint-subtle)}.doc-info{flex:1;min-width:0}.doc-name{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;display:block;overflow:hidden}.doc-meta{color:var(--text-muted);font-size:12px}.doc-timestamp{border-inline-start:1px solid var(--border-light);color:var(--text-muted);cursor:default;align-items:center;gap:3px;margin-inline-start:6px;padding-inline-start:6px;font-size:11px;display:inline-flex}.doc-timestamp svg{opacity:.6;flex-shrink:0}.doc-status-badge{font-size:var(--fs-caption);border-radius:var(--radius-sm);font-family:var(--font-sans);align-items:center;gap:4px;padding:2px 8px;display:inline-flex}.doc-status-failed{color:var(--danger);background:var(--danger-dim)}.doc-status-cancelled{color:var(--text-muted);background:color-mix(in srgb, var(--text-muted) 8%, transparent)}.doc-status-missing{color:var(--accent-yellow);background:var(--accent-yellow-dim)}.doc-row-actions{opacity:0;transition:opacity var(--duration-fast) var(--ease);flex-shrink:0;align-items:center;gap:2px;display:flex}.doc-row:hover .doc-row-actions{opacity:1}.doc-open-folder{color:var(--text-muted)}.doc-open-folder:hover{color:var(--accent-blue)}.doc-delete{color:var(--text-muted)}.doc-delete:hover{color:var(--danger)}.empty-docs{color:var(--text-muted);text-align:center;flex-direction:column;align-items:center;padding:32px;display:flex}.empty-docs p{margin-top:8px;font-size:14px}.empty-docs span{margin-top:4px;font-size:12px}.btn-cancel{align-items:center;gap:4px;display:inline-flex}.doc-indexing-status{align-items:center;gap:8px;display:inline-flex}.btn-retry{color:var(--text-muted);cursor:pointer;transition:background var(--duration-fast) var(--ease), color var(--duration-fast) var(--ease);background:0 0;border:none;border-radius:4px;align-items:center;gap:4px;padding:2px 6px;font-size:11px;display:inline-flex}.btn-retry:hover{background:var(--danger-dim);color:var(--danger)}.btn-retry:disabled{opacity:.6;cursor:default;color:var(--text-muted);background:0 0}.doc-failure{flex-direction:column;gap:4px;min-width:0;display:flex}.doc-failure-hint,.doc-failure-reason{overflow-wrap:anywhere;margin:0;font-size:12px;line-height:1.4}.doc-failure-hint{color:var(--text-secondary)}.doc-failure-reason{color:var(--text-muted)}.doc-failure-reason summary{cursor:pointer}.doc-failure-reason p{white-space:pre-line;margin:4px 0 0}.btn-retry-quiet{opacity:.8;font-size:10px}.doc-folder-notice{color:var(--text-secondary);background:var(--bg-secondary);border-radius:6px;align-items:flex-start;gap:8px;margin:8px 0;padding:8px 10px;font-size:12px;line-height:1.4;display:flex}.doc-folder-notice>span{overflow-wrap:anywhere;flex:1;min-width:0}.doc-indexing-status .index-progress{flex:220px;max-inline-size:320px}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{S as t,T as n,i as r,n as i,r as a,w as o}from"./apiBase-DRtaTd8u.js";import{$ as s,$t as c,B as ee,Ft as te,Gt as ne,H as re,Ht as ie,It as l,J as u,Lt as d,Q as ae,U as oe,V as se,W as ce,X as f,ct as p,et as le,fn as ue,gn as m,hn as de,in as fe,nn as h,pt as pe,q as me,st as he,t as g,ut as ge,vt as _e,yt as ve,zt as ye}from"./index-CKOG_8jk.js";var _={name:`circle-stop`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`rect`,{x:`9`,y:`9`,width:`6`,height:`6`,rx:`1`,key:`1ssd4o`}]],aliases:[`stop-circle`]};_.node;var v=o(_),y={name:`loader`,size:24,node:[[`path`,{d:`M12 2v4`,key:`3427ic`}],[`path`,{d:`m16.2 7.8 2.9-2.9`,key:`r700ao`}],[`path`,{d:`M18 12h4`,key:`wj9ykh`}],[`path`,{d:`m16.2 16.2 2.9 2.9`,key:`1bxg5t`}],[`path`,{d:`M12 18v4`,key:`jadmvz`}],[`path`,{d:`m4.9 19.1 2.9-2.9`,key:`bwix9q`}],[`path`,{d:`M2 12h4`,key:`j09sii`}],[`path`,{d:`m4.9 4.9 2.9 2.9`,key:`giyufr`}]]};y.node;var be=o(y),b={name:`refresh-ccw`,size:24,node:[[`path`,{d:`M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`14sxne`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16`,key:`1hlbsb`}],[`path`,{d:`M16 16h5v5`,key:`ccwih5`}]]};b.node;var xe=o(b),x=e(n(),1),S=e=>e.toLocaleString(`en-US`);function C(e,t){let n=S(e.done);return e.phase===`reading`?e.total==null?t(`docs.progress.readingCount`,{done:n}):t(`docs.progress.reading`,{done:n,total:S(e.total)}):e.total==null?t(`docs.progress.embeddingCount`,{done:n}):t(`docs.progress.embedding`,{done:n,total:S(e.total)})}function w(e){return e.total==null||e.total<=0?null:Math.min(100,Math.floor(e.done/e.total*100))}function Se({progress:e}){let t=C(e,u()),n=w(e);return r(`div`,{className:`index-progress is-running`,children:[a(`div`,{className:`index-progress-track${n==null?` is-indeterminate`:``}`,role:`progressbar`,"aria-label":t,"aria-valuemin":n==null?void 0:0,"aria-valuemax":n==null?void 0:100,"aria-valuenow":n??void 0,children:a(`div`,{className:`index-progress-fill`,style:n==null?void 0:{inlineSize:`${n}%`}})}),r(`span`,{className:`index-progress-label`,children:[t,n!=null&&r(`span`,{className:`index-progress-pct`,children:[` · `,n,`%`]})]})]})}function Ce(e){let[t,...n]=e.replace(/^RAG indexing failed for [^:]+:\s*/,``).trim().split(`
|
|
2
|
+
`);return{summary:t.trim(),more:n.join(`
|
|
3
|
+
`).trim()}}function we(e,t){let n=t.skipped??0,r=[];if(t.indexed>0?r.push(`Indexed ${t.indexed} file${t.indexed===1?``:`s`} from "${e}".`):t.failed===0&&r.push(`"${e}" has no documents GAIA can index.`),n>0&&r.push(`Skipped ${n} file${n===1?``:`s`} of a type GAIA doesn't index.`),t.failed>0){let e=t.errors[0]?` ${t.errors[0].split(`
|
|
4
|
+
`)[0]}`:``;r.push(`${t.failed} file${t.failed===1?``:`s`} couldn't be indexed.${e}`)}return r.push(`Subfolders aren't included.`),r.join(` `)}var Te=1e3;function T(e,t,n){if(n)return{...e,[t]:n};if(!(t in e))return e;let{[t]:r,...i}=e;return i}function Ee(e){let t=Math.floor((Date.now()-e)/1e3);return t<60?`${t}s`:`${Math.floor(t/60)}m ${t%60}s`}function De(e,t){try{let n=new Date(e);if(isNaN(n.getTime()))return``;let r=new Date().getTime()-n.getTime(),i=Math.floor(r/1e3),a=Math.floor(i/60),o=Math.floor(a/60),s=Math.floor(o/24);return i<60?t(`time.justNow`):a<60?t(`time.minutesAgo`,{n:a}):o<24?t(`time.hoursAgo`,{n:o}):s===1?t(`time.yesterday`):s<7?t(`time.daysAgo`,{n:s}):n.toLocaleDateString(void 0,{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`})}catch{return``}}function Oe(e){try{let t=new Date(e);return isNaN(t.getTime())?``:t.toLocaleString(void 0,{year:`numeric`,month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`,second:`2-digit`})}catch{return``}}function E(){let e=u(),{documents:n,setDocuments:o,setShowDocLibrary:_,setShowFileBrowser:y,currentSessionId:b,sessions:S,updateSessionInList:C,draftDocumentIds:w,addDraftDocuments:E,removeDraftDocument:D}=l(),O=S.find(e=>e.id===b)??null,[k,ke]=(0,x.useState)(b?`chat`:`next`),A=k===`chat`?b:null,j=`“${O?.title||e(`docs.untitledChat`)}”`,[M,N]=(0,x.useState)(``),Ae=(0,x.useCallback)(()=>_(!1),[_]);te(!0,Ae);let P=(0,x.useRef)(null);ce(P,!0);let[je,F]=(0,x.useState)(!1),[I,L]=(0,x.useState)(!1),[Me,R]=(0,x.useState)(``),[z,B]=(0,x.useState)(``),[V,H]=(0,x.useState)(null),[U,W]=(0,x.useState)(null),[G,K]=(0,x.useState)(new Set),[Ne,q]=(0,x.useState)({}),J=(0,x.useRef)(new Map),[,Pe]=(0,x.useState)(0);(0,x.useEffect)(()=>{t.doc.info(`Loading document library...`);let e=t.doc.time();p().then(n=>{let r=n.documents||[];o(r),t.doc.timed(`Loaded ${r.length} document(s), ${n.total_chunks||0} chunks, ${n.total_size_bytes||0} bytes total`,e)}).catch(e=>{t.doc.error(`Failed to load documents`,e),o([])})},[o]);let Y=n.some(e=>e.indexing_status===`indexing`||e.indexing_status===`pending`);(0,x.useEffect)(()=>{if(!Y)return;let e=l.getState().documents;for(let t of e)(t.indexing_status===`indexing`||t.indexing_status===`pending`)&&!J.current.has(t.id)&&J.current.set(t.id,Date.now());let n=!1,r=setInterval(async()=>{if(Pe(e=>e+1),!n){n=!0;try{let e=l.getState().documents.filter(e=>e.indexing_status===`indexing`||e.indexing_status===`pending`);for(let n of e)try{let e=await le(n.id);if(q(t=>T(t,n.id,e.progress)),e.indexing_status!==`indexing`&&e.indexing_status!==`pending`){J.current.delete(n.id);let e=await p();o(e.documents||[]);break}}catch(e){t.doc.warn(`Indexing status for ${n.filename} unavailable`,e)}}finally{n=!1}}},Te);return()=>clearInterval(r)},[Y,o]),(0,x.useEffect)(()=>{let e=new Set(n.filter(e=>e.indexing_status===`indexing`||e.indexing_status===`pending`).map(e=>e.id));for(let t of J.current.keys())e.has(t)||J.current.delete(t);q(t=>Object.keys(t).reduce((t,n)=>e.has(n)?t:T(t,n,null),t))},[n]),(0,x.useEffect)(()=>{let e=setInterval(async()=>{try{let e=(await p()).documents||[],n=l.getState().documents;(e.length!==n.length||e.some((e,t)=>{let r=n.find(t=>t.id===e.id);return!r||r.indexing_status!==e.indexing_status||r.indexed_at!==e.indexed_at||r.chunk_count!==e.chunk_count}))&&(o(e),t.doc.debug(`Document list refreshed (server-side changes detected)`))}catch{}},15e3);return()=>clearInterval(e)},[o]);let Fe=n.reduce((e,t)=>e+t.file_size,0),Ie=n.reduce((e,t)=>e+t.chunk_count,0),X=(0,x.useCallback)(async(n,r)=>{if(!A){E([n]),N(e(`docs.willAttach`,{name:r})),t.doc.info(`"${r}" will be attached to the next new chat`);return}await f(A,n);let i=l.getState().sessions.find(e=>e.id===A)?.document_ids??[];i.includes(n)||C(A,{document_ids:[...i,n]}),N(e(`docs.attached`,{name:r,chat:j})),t.doc.info(`Attached "${r}" to session ${A}`)},[A,j,C,E,e]),Z=(0,x.useCallback)(async(e,n)=>{if(e.length===0)return;if(!A){E(e),t.doc.info(`"${n}" will be attached to the next new chat`);return}let r=[];for(let n of e)try{await f(A,n),r.push(n)}catch(e){t.doc.warn(`Could not attach document to session: ${e}`)}let i=l.getState().sessions.find(e=>e.id===A)?.document_ids??[],a=r.filter(e=>!i.includes(e));a.length>0&&C(A,{document_ids:[...i,...a]}),t.doc.info(`Attached "${n}" to session ${A}`)},[A,C,E]),Q=(0,x.useCallback)(async(n,r,i)=>{let a=n.includes(`.`)?`.`+n.split(`.`).pop()?.toLowerCase():``,s=a&&!oe(a)?re(a)?.message??`The file type "${a}" is not supported for indexing.`:null;if(s&&!i){t.doc.warn(`Unsupported file type: ${n} (${a})`),H({filename:n,error:s});return}t.doc.info(`Indexing document: ${n}`);let c=t.doc.time();L(!0),R(e(`docs.indexingFile`,{name:n})),H(null),W(null),N(``);try{let e=await r();if(t.doc.timed(`Indexed "${n}": ${e?.chunk_count||`?`} chunks`,c),e?.id)try{await X(e.id,e.filename||n)}catch(e){t.doc.error(`Could not attach "${n}" to ${j}`,e),H({filename:n,error:`Indexed, but not attached to ${j}: ${e instanceof Error?e.message:e}`})}let i=await p();o(i.documents||[]),R(``)}catch(e){let{httpStatus:r,reason:a}=e??{};if(a===`is_folder`&&i){await i();return}t.doc.error(`Failed to index "${n}"`,e);let o=r===400&&s?s:e instanceof Error?e.message:`Upload failed`;H({filename:n,error:o,status:r,kind:a}),R(``)}finally{L(!1)}},[X,j,o,e]),Le=(0,x.useCallback)(async(n,r)=>{t.doc.info(`"${n}" is a folder; indexing its documents`),R(e(`docs.indexingFolder`,{name:r}));try{let e=await he(n,!1);await Z(e.documents.map(e=>e.id).filter(Boolean),r),W(we(r,e));let t=await p();o(t.documents||[])}catch(e){t.doc.error(`Failed to index folder "${n}"`,e);let i=e instanceof Error?e.message:`Folder indexing failed`,{httpStatus:a}=e??{};H({filename:r,error:i,status:a})}finally{R(``)}},[Z,o,e]),Re=(0,x.useCallback)(async(e,t)=>{await Q(t,()=>ve(e),()=>Le(e,t))},[Q,Le]),$=(0,x.useCallback)(async e=>{await Q(e.name,()=>_e(e))},[Q]),ze=(0,x.useCallback)(async e=>{e.preventDefault(),F(!1);let n=Array.from(e.dataTransfer.files);t.doc.info(`Dropped ${n.length} file(s) into Document Library`);for(let e of n)await $(e)},[$]),Be=(0,x.useCallback)(async e=>{let r=n.find(t=>t.id===e);t.doc.info(`Deleting document: ${r?.filename||e}`);try{await s(e),J.current.delete(e),D(e),o(n.filter(t=>t.id!==e)),t.doc.info(`Deleted document: ${r?.filename||e}`)}catch(n){t.doc.error(`Failed to delete document: ${r?.filename||e}`,n)}},[n,o,D]),Ve=(0,x.useCallback)(async(e,n)=>{t.doc.info(`Opening folder for: ${e}`);try{await ge(e,!0)}catch(e){t.doc.error(`Failed to open folder for: ${n}`,e)}},[]),He=(0,x.useCallback)(async e=>{let r=n.find(t=>t.id===e);t.doc.info(`Cancelling indexing for: ${r?.filename||e}`);try{await ae(e),J.current.delete(e);let n=await p();o(n.documents||[]),t.doc.info(`Cancelled indexing for: ${r?.filename||e}`)}catch(n){t.doc.error(`Failed to cancel indexing: ${r?.filename||e}`,n)}},[n,o]),Ue=(0,x.useCallback)(async e=>{if(G.has(e))return;let r=n.find(t=>t.id===e);t.doc.info(`Reindexing document: ${r?.filename||e}`),K(t=>new Set(t).add(e));try{await pe(e),t.doc.info(`Reindex complete for: ${r?.filename||e}`)}catch(n){let i=n instanceof Error?n.message:String(n);t.doc.error(`Reindex failed for: ${r?.filename||e}`,n),H({filename:r?.filename||e,error:i})}finally{try{let e=await p();o(e.documents||[])}catch(e){t.doc.error(`Failed to refresh documents after reindex`,e)}K(t=>{let n=new Set(t);return n.delete(e),n})}},[n,o,G]),We=(0,x.useCallback)(async e=>{let r=n.find(t=>t.id===e)?.filename||e;N(``);try{await X(e,r)}catch(e){t.doc.error(`Failed to attach ${r} to ${j}`,e),H({filename:r,error:`Not attached to ${j}: ${e instanceof Error?e.message:e}`})}},[n,X,j]),Ge=(0,x.useCallback)(async e=>{if(e.preventDefault(),!z.trim())return;let n=z.trim();t.doc.info(`Indexing from path input: ${n}`),await Re(n,n.replace(/[\\/]+$/,``).split(/[\\/]/).pop()||`file`),B(``)},[z,Re]),Ke=t=>{let n=t.indexing_status||`complete`,i=J.current.get(t.id),o=t.indexed_at?De(t.indexed_at,e):``,s=t.indexed_at?Oe(t.indexed_at):``;switch(n){case`indexing`:case`pending`:{let n=Ne[t.id];return r(`div`,{className:`doc-indexing-status`,children:[n?a(Se,{progress:n}):r(`div`,{className:`doc-indexing-bar`,children:[a(`div`,{className:`doc-indexing-bar-track`,children:a(`div`,{className:`doc-indexing-bar-fill`})}),r(`span`,{className:`doc-indexing-label`,children:[a(be,{size:12,className:`doc-spin`}),i?e.hint(e(`docs.indexingLabel`),Ee(i)):e(`docs.indexing`)]})]}),r(`button`,{className:`btn-cancel`,onClick:e=>{e.stopPropagation(),He(t.id)},title:e(`docs.cancelIndexing`),"aria-label":e(`docs.cancelIndexingAria`,{name:t.filename}),children:[a(v,{size:14}),e(`docs.cancel`)]})]})}case`failed`:{let n=t.error_kind?ee[t.error_kind]:void 0,i=t.last_error?Ce(t.last_error):null;return r(`div`,{className:`doc-failure`,children:[r(`div`,{className:`doc-indexing-status`,children:[r(`span`,{className:`doc-status-badge doc-status-failed`,title:t.last_error||void 0,"aria-label":t.last_error?e(`docs.failedAria`,{error:t.last_error}):e(`docs.indexingFailed`),children:[a(m,{size:12}),` `,e(n?`docs.cantRead`:`docs.failed`)]}),r(`button`,{className:n?`btn-retry btn-retry-quiet`:`btn-retry`,onClick:e=>{e.stopPropagation(),Ue(t.id)},title:e(n?`docs.retryTitleFix`:`docs.retryTitle`),"aria-label":e(`docs.retryAria`,{name:t.filename}),disabled:G.has(t.id),children:[a(xe,{size:n?12:14}),G.has(t.id)?e(`docs.retrying`):e(`docs.retry`)]})]}),n&&a(`p`,{className:`doc-failure-hint`,children:n}),i&&(i.more?r(`details`,{className:`doc-failure-reason`,children:[a(`summary`,{children:i.summary}),a(`p`,{children:i.more})]}):a(`p`,{className:`doc-failure-reason`,children:i.summary})),!i&&!n&&a(`p`,{className:`doc-failure-reason`,children:e(`docs.noReason`)})]})}case`cancelled`:return r(`span`,{className:`doc-status-badge doc-status-cancelled`,children:[a(v,{size:12}),` `,e(`docs.cancelled`)]});case`missing`:return r(`span`,{className:`doc-status-badge doc-status-missing`,children:[a(m,{size:12}),` `,e(`docs.missing`)]});default:return r(`span`,{className:`doc-meta`,children:[a(`bdi`,{dir:`ltr`,children:g(t.file_size)}),` · `,e.plural(`docs.chunks`,t.chunk_count),o&&r(`span`,{className:`doc-timestamp`,title:e(`docs.indexedAt`,{time:s}),children:[a(ue,{size:10}),o]})]})}};return a(`div`,{ref:P,className:`modal-overlay`,onClick:()=>_(!1),role:`dialog`,"aria-modal":`true`,"aria-label":e(`docs.title`),children:r(`div`,{className:`modal-panel doc-modal`,onClick:e=>e.stopPropagation(),children:[r(`div`,{className:`modal-header`,children:[a(`h3`,{children:e(`docs.title`)}),a(`button`,{className:`btn-icon`,onClick:()=>_(!1),"aria-label":e(`docs.close`),children:a(d,{size:18})})]}),r(`div`,{className:`modal-body`,children:[r(`div`,{className:`doc-target`,children:[b?r(`label`,{className:`doc-target-choice`,children:[e(`docs.addTo`),r(`select`,{value:k,onChange:e=>{ke(e.target.value),N(``)},children:[a(`option`,{value:`chat`,children:e(`docs.thisChat`,{chat:j})}),a(`option`,{value:`next`,children:e(`docs.nextChat`)})]})]}):a(`span`,{children:e(`docs.nextChatOnly`)}),a(`span`,{className:`doc-target-hint`,children:e(`docs.hint`)})]}),a(`div`,{className:`drop-zone ${je?`drag-over`:``} ${I?`uploading`:``}`,onDragOver:e=>{e.preventDefault(),F(!0)},onDragLeave:()=>F(!1),onDrop:ze,children:I?r(i.Fragment,{children:[a(`div`,{className:`upload-spinner`}),a(`p`,{children:Me})]}):r(i.Fragment,{children:[a(ye,{size:32,strokeWidth:1.5}),a(`p`,{children:e(`docs.drop`)}),a(`span`,{className:`drop-hint`,children:e(`docs.dropHint`)})]})}),r(`form`,{className:`path-input-form`,onSubmit:Ge,children:[a(h,{size:16,className:`path-icon`}),a(`input`,{type:`text`,className:`path-input`,value:z,onChange:e=>B(e.target.value),placeholder:e(`docs.pathPlaceholder`,{example:me()}),"aria-label":e(`docs.pathAria`),dir:`auto`}),a(`button`,{type:`submit`,className:`btn-secondary`,disabled:!z.trim()||I,children:e(`docs.index`)}),r(`button`,{type:`button`,className:`btn-secondary`,onClick:()=>{_(!1),y(!0)},title:e(`docs.browseTitle`),children:[a(ne,{size:14}),e(`docs.browse`)]})]}),M&&a(`p`,{className:`doc-target-notice`,role:`status`,children:M}),V&&a(se,{filename:V.filename,error:V.error,status:V.status,kind:V.kind,onDismiss:()=>H(null)}),U&&r(`div`,{className:`doc-folder-notice`,role:`status`,children:[a(de,{size:14}),a(`span`,{children:U}),a(`button`,{className:`btn-icon-sm`,onClick:()=>W(null),"aria-label":e(`docs.dismissFolder`),children:a(d,{size:12})})]}),n.length>0&&r(`div`,{className:`doc-stats`,children:[a(`span`,{children:e.plural(`docs.count`,n.length)}),a(`span`,{children:`·`}),a(`span`,{children:e.plural(`docs.chunks`,Ie)}),a(`span`,{children:`·`}),a(`bdi`,{dir:`ltr`,children:g(Fe)})]}),r(`div`,{className:`doc-list`,children:[n.length===0&&!I&&r(`div`,{className:`empty-docs`,children:[a(fe,{size:32,strokeWidth:1}),a(`p`,{children:e(`docs.empty`)}),a(`span`,{children:e(`docs.emptyHint`)})]}),n.map(t=>r(`div`,{className:`doc-row ${t.indexing_status===`indexing`?`doc-row-indexing`:``}`,children:[r(`div`,{className:`doc-info`,children:[a(`span`,{className:`doc-name`,dir:`auto`,children:t.filename}),Ke(t)]}),r(`div`,{className:`doc-row-actions`,children:[t.filepath&&a(`button`,{className:`btn-icon-sm doc-open-folder`,onClick:()=>Ve(t.filepath,t.filename),title:e(`docs.openFolder`,{path:t.filepath}),"aria-label":e(`docs.openFolderAria`,{name:t.filename}),children:a(h,{size:14})}),t.indexing_status===`complete`&&!(A?O?.document_ids?.includes(t.id):w.includes(t.id))&&a(`button`,{className:`btn-icon-sm doc-attach`,onClick:()=>We(t.id),title:A?e(`docs.useIn`,{chat:j}):e(`docs.useNext`),"aria-label":A?e(`docs.attachAria`,{name:t.filename,chat:j}):e(`docs.attachNextAria`,{name:t.filename}),children:a(c,{size:14})}),t.indexing_status!==`indexing`&&t.indexing_status!==`pending`&&a(`button`,{className:`btn-icon-sm doc-delete`,onClick:()=>Be(t.id),title:e(`docs.remove`),"aria-label":e(`docs.removeAria`,{name:t.filename}),children:a(ie,{size:14})})]})]},t.id))]})]})]})})}export{E as DocumentLibrary};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.file-browser-modal{flex-direction:column;width:min(95vw,1000px);max-height:85vh;display:flex}.file-browser-modal.has-preview{width:min(95vw,1200px)}.file-browser-body{flex-direction:column;flex:1;gap:10px;padding:0 16px 16px;display:flex;overflow:hidden}.fb-quick-links{flex-wrap:wrap;gap:6px;padding:4px 0;display:flex}.fb-quick-link{border-radius:var(--radius-sm);border:1px solid var(--border-light);background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;transition:all var(--duration) var(--ease);align-items:center;gap:5px;padding:5px 10px;font-size:12px;display:flex}.fb-quick-link:hover{background:var(--bg-hover);color:var(--text-primary);border-color:var(--border)}.fb-search-bar{align-items:center;gap:8px;display:flex}.fb-search-input-wrap{flex:1;align-items:center;display:flex;position:relative}.fb-search-icon{color:var(--text-muted);pointer-events:none;position:absolute;inset-inline-start:10px}.fb-search-input{border-radius:var(--radius-md);border:1px solid var(--border);background:var(--bg-input);width:100%;color:var(--text-primary);font-size:13px;font-family:var(--font-sans);transition:border-color var(--duration) var(--ease), box-shadow var(--duration) var(--ease);outline:none;padding:8px 30px 8px 32px}.fb-search-input:focus{border-color:color-mix(in srgb, var(--accent) 40%, transparent)}.fb-search-clear{color:var(--text-muted);cursor:pointer;background:0 0;border:none;padding:2px;display:flex;position:absolute;inset-inline-end:8px}.fb-type-filter{border-radius:var(--radius-md);border:1px solid var(--border);background:var(--bg-input);color:var(--text-primary);font-size:12px;font-family:var(--font-sans);outline:none;min-width:110px;padding:8px}.fb-type-filter:focus-visible{border-color:color-mix(in srgb, var(--accent) 40%, transparent)}.fb-search-btn{border-radius:var(--radius-md);border:1px solid var(--accent-fill);background:var(--accent-fill);color:var(--accent-fill-text);font-size:var(--fs-label);font-weight:600;font-family:var(--font-sans);cursor:pointer;white-space:nowrap;transition:all var(--duration) var(--ease);padding:8px 14px}.fb-search-btn:hover{background:var(--accent-fill-hover)}.fb-search-btn:disabled{opacity:.4;cursor:not-allowed;box-shadow:none}.fb-pathbar{align-items:center;gap:12px;display:flex}.fb-pathbar .fb-breadcrumb{flex:1;min-width:0}.fb-hidden-toggle{color:var(--text-secondary);cursor:pointer;flex-shrink:0;align-items:center;gap:6px;font-size:12px;display:flex}.fb-breadcrumb{color:var(--text-secondary);flex-wrap:nowrap;align-items:center;gap:2px;padding:4px 0;font-size:12px;display:flex;overflow-x:auto}.fb-crumb{color:var(--text-secondary);cursor:pointer;border-radius:var(--radius-sm);white-space:nowrap;transition:all var(--duration) var(--ease);background:0 0;border:none;padding:2px 4px;font-size:12px}.fb-crumb:hover{background:var(--bg-hover);color:var(--text-primary)}.fb-crumb-item{align-items:center;display:flex}.fb-crumb-sep{color:var(--text-muted);flex-shrink:0}.fb-up-btn{border:1px solid var(--border);color:var(--text-secondary);cursor:pointer;border-radius:var(--radius-sm);transition:all var(--duration) var(--ease);background:0 0;align-items:center;margin-inline-start:auto;padding:3px 6px;display:flex}.fb-up-btn:hover{background:var(--bg-hover);border-color:var(--accent);color:var(--accent)}.fb-search-header{color:var(--text-secondary);justify-content:space-between;align-items:center;gap:12px;padding:4px 0;font-size:12px;display:flex}.fb-search-summary{flex-direction:column;gap:3px;min-width:0;display:flex}.fb-search-scope{color:var(--text-muted);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.fb-search-scope code{color:var(--text-secondary);font-family:var(--font-mono)}.fb-back-btn{color:var(--accent);cursor:pointer;transition:color var(--duration) var(--ease);background:0 0;border:none;font-size:12px}.fb-back-btn:hover{color:var(--accent-light)}.fb-content{flex:1;gap:12px;min-height:300px;display:flex;overflow:hidden}.fb-file-list{border:1px solid var(--border);border-radius:var(--radius-lg);scrollbar-width:thin;scrollbar-color:var(--border) transparent;flex:1;min-width:250px;overflow-y:auto}.fb-file-list::-webkit-scrollbar{width:5px}.fb-file-list::-webkit-scrollbar-track{background:0 0}.fb-file-list::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}.fb-file-list::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.fb-entry{cursor:pointer;border-bottom:1px solid var(--border-light);transition:background var(--duration-fast) var(--ease);font-size:13px;font-family:var(--font-sans);align-items:center;gap:8px;padding:8px 10px;display:flex}.fb-entry:hover{background:var(--bg-hover)}.fb-entry.selected{background:var(--accent-dim2);border-color:color-mix(in srgb, var(--accent) 12%, transparent)}.fb-entry.folder .fb-entry-icon{color:var(--text-secondary)}.fb-entry .fb-entry-icon{color:var(--text-muted);flex-shrink:0}.fb-entry-name{text-overflow:ellipsis;white-space:nowrap;color:var(--text-primary);flex:1;overflow:hidden}.fb-entry.folder .fb-entry-name{font-weight:500}.fb-entry-size,.fb-entry-date{font-size:var(--fs-caption);color:var(--text-muted);white-space:nowrap;font-family:var(--font-sans);font-variant-numeric:tabular-nums;flex-shrink:0}.fb-entry-size{text-align:end;min-width:55px}.fb-entry-date{text-align:end;min-width:65px}.fb-entry-checkbox{cursor:pointer;width:16px;min-width:16px;height:16px;min-height:16px;accent-color:var(--accent);flex-shrink:0}.fb-entry-preview-btn{width:24px;min-width:24px;height:24px;color:var(--text-muted);cursor:pointer;border-radius:var(--radius-sm);opacity:0;transition:opacity var(--duration-fast) var(--ease), color var(--duration-fast) var(--ease), background var(--duration-fast) var(--ease);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.fb-entry:hover .fb-entry-preview-btn,.fb-entry.selected .fb-entry-preview-btn{opacity:1}.fb-entry-preview-btn:hover{color:var(--text-primary);background:var(--bg-hover)}.fb-entry-preview-btn:focus-visible{opacity:1;outline:2px solid var(--accent);outline-offset:1px}.fb-preview{border:1px solid var(--border);border-radius:var(--radius-lg);flex-direction:column;flex-shrink:0;width:280px;display:flex;overflow:hidden}.fb-preview-header{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;padding:8px 12px;display:flex}.fb-preview-name{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:600;overflow:hidden}.fb-preview-meta{font-size:var(--fs-caption);color:var(--text-muted);border-bottom:1px solid var(--border-light);font-family:var(--font-sans);font-variant-numeric:tabular-nums;gap:10px;padding:6px 12px;display:flex}.fb-preview-columns{color:var(--text-secondary);border-bottom:1px solid var(--border-light);word-break:break-word;padding:6px 12px;font-size:11px}.fb-preview-content{font-size:11px;font-family:var(--font-mono);color:var(--text-code);white-space:pre-wrap;word-break:break-all;background:var(--bg-code);scrollbar-width:thin;scrollbar-color:var(--border-code) transparent;flex:1;margin:0;padding:10px 12px;line-height:1.5;overflow:auto}.fb-preview-content::-webkit-scrollbar{width:5px;height:5px}.fb-preview-content::-webkit-scrollbar-track{background:0 0}.fb-preview-content::-webkit-scrollbar-thumb{background:var(--border-code);border-radius:var(--radius-full)}.fb-preview-content::-webkit-scrollbar-thumb:hover{background:var(--text-code-dim)}.fb-preview-loading,.fb-preview-binary{text-align:center;color:var(--text-muted);padding:20px;font-size:12px}.fb-actions{border-top:1px solid var(--border);align-items:center;gap:10px;padding-top:12px;display:flex}.fb-selection-info{color:var(--text-muted);flex:1;font-size:12px}.fb-index-status{font-size:var(--fs-caption);color:var(--accent);font-family:var(--font-sans)}.fb-action-btns{gap:8px;display:flex}.fb-action-btn{border-radius:var(--radius-md);font-size:12px;font-weight:500;font-family:var(--font-sans);cursor:pointer;transition:all var(--duration) var(--ease);align-items:center;gap:5px;padding:8px 16px;display:flex}.fb-action-btn.secondary{border:1px solid var(--border);color:var(--text-primary);background:0 0}.fb-action-btn.secondary:hover{background:var(--bg-hover);border-color:var(--text-muted)}.fb-action-btn.primary{border:1px solid var(--accent-fill);background:var(--accent-fill);color:var(--accent-fill-text)}.fb-action-btn.primary:hover{background:var(--accent-fill-hover)}.fb-action-btn:disabled{opacity:.4;cursor:not-allowed}.fb-loading,.fb-empty,.fb-error{text-align:center;color:var(--text-muted);padding:30px;font-size:13px}.fb-error{color:var(--danger);background:var(--danger-dim2);border-radius:var(--radius-md);padding:10px}@media (width<=768px){.file-browser-modal{border-radius:0;width:100vw;max-height:100vh}.fb-preview{display:none}.fb-search-bar{flex-wrap:wrap}.fb-type-filter{min-width:100%}}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{S as t,T as n,i as r,r as i,w as a}from"./apiBase-DRtaTd8u.js";import{Ft as o,Gt as s,H as c,It as l,Lt as u,Sn as d,U as f,V as p,W as ee,X as m,Xt as h,Z as te,an as ne,cn as re,ct as g,en as ie,ft as ae,in as _,mt as oe,nn as se,rn as v,st as y,t as ce,tn as b,vn as le,xn as ue,yt as x,zt as de}from"./index-CKOG_8jk.js";var S={name:`code`,size:24,node:[[`path`,{d:`m16 18 6-6-6-6`,key:`eg8j8`}],[`path`,{d:`m8 6-6 6 6 6`,key:`ppft3o`}]]};S.node;var C=a(S),w={name:`house`,size:24,node:[[`path`,{d:`M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8`,key:`5wwlr5`}],[`path`,{d:`M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z`,key:`r6nss1`}]],aliases:[`home`]};w.node;var T=a(w),E={name:`table`,size:24,node:[[`path`,{d:`M12 3v18`,key:`108xh3`}],[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M3 9h18`,key:`1pudct`}],[`path`,{d:`M3 15h18`,key:`5xshup`}]]};E.node;var D=a(E),O=e(n(),1);function fe(e){if(e.type===`folder`)return i(b,{size:16});let t=(e.extension||``).toLowerCase();return[`.csv`,`.xlsx`,`.xls`,`.tsv`].includes(t)?i(D,{size:16}):[`.py`,`.js`,`.ts`,`.java`,`.c`,`.cpp`,`.go`,`.rs`].includes(t)?i(C,{size:16}):[`.pdf`,`.doc`,`.docx`,`.txt`,`.md`].includes(t)?i(_,{size:16}):i(v,{size:16})}function pe(e){if(!e)return``;let t=new Date(e),n=new Date,r=n.getTime()-t.getTime(),i=Math.floor(r/36e5);if(i<1)return`Just now`;if(i<24)return`${i}h ago`;let a=Math.floor(i/24);return a<7?`${a}d ago`:t.toLocaleDateString(void 0,{month:`short`,day:`numeric`,year:t.getFullYear()===n.getFullYear()?void 0:`numeric`})}function me(e){if(e.length===0)return``;let[t,...n]=e;return n.length>0?`${t} (+${n.length} more)`:t}function he(e){switch(e){case`home`:return i(T,{size:14});case`desktop`:return i(h,{size:14});case`documents`:return i(_,{size:14});case`download`:return i(re,{size:14});default:return i(b,{size:14})}}var ge=[{label:`All Files`,value:``},{label:`Documents`,value:`pdf,doc,docx,txt,md`},{label:`Spreadsheets`,value:`csv,xlsx,xls,tsv`},{label:`Code`,value:`py,js,ts,java,c,cpp,go,rs,rb,sh`},{label:`Data`,value:`json,xml,yaml,yml,csv,tsv`}];async function _e(e,n,r,i){let a=[],o=[];for(let t of e){let e=t.includes(`.`)?`.`+t.split(`.`).pop()?.toLowerCase():``;e&&!f(e)?o.push(t):a.push(t)}let s=[],c=[],u=0,d=``,p=new Set(n.filter(e=>e.type===`folder`).map(e=>e.path));for(let e of a)try{if(p.has(e)){let t=await y(e),n=[];t.documents.forEach(e=>{e.id&&n.push(e.id)}),n.length>0&&(n.forEach(e=>s.push(e)),c.push(e))}else{let t=await x(e);t?.id&&(s.push(t.id),c.push(e))}}catch(e){u++,d=e instanceof Error?e.message:`Unknown error`}if(r&&s.length>0){let e=[];for(let n of s)try{await m(r,n),e.push(n)}catch(e){t.doc.warn(`Could not attach document to session: ${e}`)}let n=l.getState().sessions.find(e=>e.id===r)?.document_ids??[],a=e.filter(e=>!n.includes(e));a.length>0&&i(r,{document_ids:[...n,...a]})}else s.length>0&&l.getState().addDraftDocuments(s);if(s.length>0)try{let e=await g();l.getState().setDocuments(e.documents||[])}catch(e){t.doc.error(`Could not refresh the document list after indexing`,e)}return{docIds:s,supported:a,succeededFiles:c,unsupported:o,failed:u,lastError:d}}var k=e=>e.startsWith(`.`);function A({onStartChat:e}){let{setShowFileBrowser:n,currentSessionId:a,updateSessionInList:m,setPendingPrompt:h}=l(),re=(0,O.useCallback)(()=>n(!1),[n]);o(!0,re);let g=(0,O.useRef)(null);ee(g,!0);let[_,v]=(0,O.useState)(``),[y,b]=(0,O.useState)(null),[x,S]=(0,O.useState)([]),[C,w]=(0,O.useState)([]),[T,E]=(0,O.useState)(!1),[D,A]=(0,O.useState)(null),[j,ve]=(0,O.useState)(!1),[M,N]=(0,O.useState)(``),[P,F]=(0,O.useState)(null),[I,L]=(0,O.useState)([]),[ye,be]=(0,O.useState)(!1),[R,z]=(0,O.useState)(!1),[B,xe]=(0,O.useState)(``),[V,H]=(0,O.useState)(new Set),[U,W]=(0,O.useState)(null),[Se,G]=(0,O.useState)(!1),[Ce,K]=(0,O.useState)(new Set),[we,q]=(0,O.useState)(null),J=(0,O.useRef)(null),[Y,X]=(0,O.useState)(null),Z=(0,O.useCallback)(async e=>{E(!0),A(null),F(null),N(``),L([]);try{let n=await te(e);v(n.current_path),b(n.parent_path),S(n.entries),n.quick_links.length>0&&w(n.quick_links),t.ui.info(`Browsing: ${n.current_path} (${n.entries.length} items)`)}catch(e){let n=e instanceof Error?e.message:`Failed to load directory`;A(n),t.ui.error(`Browse failed`,e)}finally{E(!1)}},[]);(0,O.useEffect)(()=>{Z()},[Z]),(0,O.useEffect)(()=>()=>{J.current&&clearTimeout(J.current)},[]);let Te=(0,O.useCallback)(async()=>{if(!M.trim())F(null),L([]);else{z(!0),A(null);try{let e=await oe(M.trim(),B||void 0,30);F(e.results),L(e.searched_locations??[]),be(e.truncated===!0),t.ui.info(`Search "${M}": ${e.total} results`)}catch(e){let n=e instanceof Error?e.message:`Search failed`;A(n),t.ui.error(`Search failed`,e)}finally{z(!1)}}},[M,B]),Ee=e=>{e.key===`Enter`&&Te()},De=(0,O.useCallback)(e=>{e.type===`folder`&&(Z(e.path),H(new Set),W(null))},[Z]),Oe=(0,O.useCallback)(async e=>{G(!0);try{let t=await ae(e);W(t)}catch(e){t.ui.error(`Preview failed`,e)}finally{G(!1)}},[]),ke=(0,O.useCallback)(e=>{H(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),Ae=(0,O.useCallback)(async()=>{if(V.size===0)return;let e=Array.from(V);if(X(null),!e.some(e=>{let t=e.includes(`.`)?`.`+e.split(`.`).pop()?.toLowerCase():``;return!t||f(t)})){let t=e[0],n=t.lastIndexOf(`.`),r=n>0?t.slice(n).toLowerCase():``,i=c(r);X({filename:e.length===1?t.split(/[\\/]/).pop()||t:`${e.length} files`,error:i?i.message:`File type "${r}" is not supported for indexing.`})}else{K(new Set(e)),q(`Indexing ${e.length} file(s)...`);try{let t=await _e(e,x,a,m);if(t.failed>0)q(`Done: ${t.docIds.length} indexed, ${t.failed} failed`),X({filename:`${t.failed} file(s)`,error:t.lastError||`Indexing failed for some files`});else{let e=t.unsupported.length>0?` (${t.unsupported.length} skipped — unsupported type)`:``;q(`Successfully indexed ${t.docIds.length} file(s)${e}`)}J.current&&clearTimeout(J.current),J.current=setTimeout(()=>q(null),5e3),H(new Set)}catch(n){t.doc.error(`Index selected failed`,n),X({filename:e.length===1?e[0].split(/[\\/]/).pop()||e[0]:`${e.length} files`,error:n instanceof Error?n.message:`An unexpected error occurred.`})}finally{K(new Set)}}},[V,a,m,x]),Q=(0,O.useRef)(!1),je=(0,O.useCallback)(async()=>{if(V.size===0||Q.current)return;Q.current=!0;let r=Array.from(V);X(null),K(new Set(r)),q(`Indexing ${r.length} file(s) for analysis...`);try{let t=await _e(r,x,a,m);if(t.supported.length===0){let e=r[0].lastIndexOf(`.`),t=e>0?r[0].slice(e).toLowerCase():``,n=c(t);X({filename:r.length===1?r[0].split(/[\\/]/).pop()||r[0]:`${r.length} files`,error:n?.message??`File type "${t}" is not supported for indexing.`});return}if(t.docIds.length===0){X({filename:t.supported.length===1?t.supported[0].split(/[\\/]/).pop()||t.supported[0]:`${t.supported.length} files`,error:`Failed to index selected file(s). Please try again.`});return}t.failed>0&&q(`Warning: ${t.failed} file(s) failed to index and will be excluded.`);let i=(t.succeededFiles.length>0?t.succeededFiles:t.supported).map(e=>e.split(/[\\/]/).pop()||e),o=i.length===1?`Please analyze this document for me: ${i[0]}`:`Please analyze these documents for me:\n${i.map(e=>`- ${e}`).join(`
|
|
2
|
+
`)}`;a?h({sessionId:a,text:o}):await e(o),n(!1),H(new Set)}catch(e){t.doc.error(`Ask Agent failed`,e),X({filename:r.length===1?r[0].split(/[\\/]/).pop()||r[0]:`${r.length} files`,error:e instanceof Error?e.message:`An unexpected error occurred.`})}finally{Q.current=!1,K(new Set),q(null)}},[V,a,m,x,h,n,e]),$=_?_.replace(/\\/g,`/`).split(`/`).filter(Boolean):[],Me=$.map((e,t)=>({label:e,path:$.slice(0,t+1).join(`/`)+(t===0&&e.includes(`:`)?`/`:``)})),Ne=me(I),Pe=x.filter(e=>!k(e.name)),Fe=P?P.map(e=>({name:e.name,path:e.path,type:`file`,size:e.size,extension:e.extension||``,modified:e.modified||``})):j?x:Pe,Ie=x.length-Pe.length;return(0,O.useEffect)(()=>{j||P||H(e=>{let t=[...e].filter(e=>!k(e.split(/[\\/]/).pop()??``));return t.length===e.size?e:new Set(t)})},[j,P]),i(`div`,{ref:g,className:`modal-overlay`,onClick:()=>n(!1),role:`dialog`,"aria-modal":`true`,"aria-label":`File browser`,children:r(`div`,{className:`modal-panel file-browser-modal ${U?`has-preview`:``}`,onClick:e=>e.stopPropagation(),children:[r(`div`,{className:`modal-header`,children:[r(`h3`,{children:[i(se,{size:18}),` File browser`]}),i(`button`,{className:`btn-icon`,onClick:()=>n(!1),"aria-label":`Close`,children:i(u,{size:18})})]}),r(`div`,{className:`file-browser-body`,children:[i(`div`,{className:`fb-quick-links`,children:C.map(e=>r(`button`,{className:`fb-quick-link`,onClick:()=>Z(e.path),title:e.path,children:[he(e.icon),i(`span`,{children:e.name})]},e.path))}),r(`div`,{className:`fb-search-bar`,children:[r(`div`,{className:`fb-search-input-wrap`,children:[i(s,{size:14,className:`fb-search-icon`}),i(`input`,{type:`text`,className:`fb-search-input`,placeholder:`Search files on your PC...`,value:M,onChange:e=>N(e.target.value),onKeyDown:Ee,"aria-label":`Search files`}),M&&i(`button`,{className:`fb-search-clear`,onClick:()=>{N(``),F(null),L([])},"aria-label":`Clear search`,children:i(u,{size:12})})]}),i(`select`,{className:`fb-type-filter`,value:B,onChange:e=>xe(e.target.value),"aria-label":`File type filter`,children:ge.map(e=>i(`option`,{value:e.value,children:e.label},e.value))}),i(`button`,{className:`fb-search-btn`,onClick:Te,disabled:!M.trim()||R,children:R?`Searching...`:`Search`})]}),!P&&r(`div`,{className:`fb-pathbar`,children:[r(`div`,{className:`fb-breadcrumb`,children:[i(`button`,{className:`fb-crumb`,onClick:()=>Z(`/`),children:i(ie,{size:12})}),Me.map((e,t)=>r(`span`,{className:`fb-crumb-item`,children:[i(le,{size:12,className:`fb-crumb-sep`}),i(`button`,{className:`fb-crumb`,onClick:()=>Z(e.path),children:e.label})]},t)),y&&i(`button`,{className:`fb-up-btn`,onClick:()=>Z(y),title:`Go up`,children:i(d,{size:14})})]}),r(`label`,{className:`fb-hidden-toggle`,children:[i(`input`,{type:`checkbox`,checked:j,onChange:e=>ve(e.target.checked)}),`Show hidden`]})]}),P&&r(`div`,{className:`fb-search-header`,children:[r(`div`,{className:`fb-search-summary`,children:[r(`span`,{children:[`Found `,P.length,` result(s) for "`,M,`"`]}),Ne&&r(`span`,{className:`fb-search-scope`,title:I.join(`
|
|
3
|
+
`),children:[`Searching in: `,i(`code`,{children:Ne})]}),ye&&i(`span`,{children:`Search stopped early, so some matches may be missing. Try a more specific name.`})]}),i(`button`,{className:`fb-back-btn`,onClick:()=>{F(null),N(``),L([])},children:`Back to browsing`})]}),D&&i(`div`,{className:`fb-error`,children:D}),r(`div`,{className:`fb-content`,children:[r(`div`,{className:`fb-file-list`,children:[T&&i(`div`,{className:`fb-loading`,children:`Loading...`}),!T&&Fe.length===0&&i(`div`,{className:`fb-empty`,children:P?`No files found`:Ie>0?`Only hidden items here. Turn on Show hidden to see them.`:`This folder is empty`}),!T&&Fe.map(e=>{let t=e.extension||(e.name.includes(`.`)?`.`+e.name.split(`.`).pop()?.toLowerCase():``),n=e.type===`file`&&t&&!f(t),a=n?c(t):null;return r(`div`,{className:`fb-entry ${e.type} ${V.has(e.path)?`selected`:``} ${n?`unsupported`:``}`,onClick:()=>e.type===`folder`?De(e):ke(e.path),onDoubleClick:()=>e.type===`folder`?De(e):void 0,title:n?`${a?.label||`This`} file type cannot be indexed`:e.path,children:[i(`input`,{type:`checkbox`,className:`fb-entry-checkbox`,checked:V.has(e.path),onChange:()=>ke(e.path),onClick:e=>e.stopPropagation(),"aria-label":`Select ${e.name}`}),i(`span`,{className:`fb-entry-icon`,children:fe(e)}),i(`span`,{className:`fb-entry-name`,title:e.path,children:e.name}),n&&i(`span`,{className:`fb-unsupported-badge`,children:`Not indexable`}),e.type===`file`&&i(`button`,{type:`button`,className:`fb-entry-preview-btn`,onClick:t=>{t.stopPropagation(),Oe(e.path)},"aria-label":`Preview ${e.name}`,title:`Preview file`,children:i(ne,{size:14})}),i(`span`,{className:`fb-entry-size`,children:e.type===`file`?ce(e.size):``}),i(`span`,{className:`fb-entry-date`,children:pe(e.modified)})]},e.path)})]}),U&&r(`div`,{className:`fb-preview`,children:[r(`div`,{className:`fb-preview-header`,children:[i(`span`,{className:`fb-preview-name`,children:U.name}),i(`button`,{className:`btn-icon-sm`,onClick:()=>W(null),"aria-label":`Close preview`,children:i(u,{size:14})})]}),r(`div`,{className:`fb-preview-meta`,children:[i(`span`,{children:U.size_display}),U.total_lines&&r(`span`,{children:[U.total_lines,` lines`]}),U.columns&&r(`span`,{children:[U.columns.length,` columns`]}),U.row_count!==null&&r(`span`,{children:[U.row_count,` rows`]})]}),U.columns&&r(`div`,{className:`fb-preview-columns`,children:[i(`strong`,{children:`Columns:`}),` `,U.columns.join(`, `)]}),Se?i(`div`,{className:`fb-preview-loading`,children:`Loading preview...`}):U.is_text&&U.preview_lines.length>0?i(`pre`,{className:`fb-preview-content`,children:U.preview_lines.slice(0,30).join(`
|
|
4
|
+
`)}):i(`div`,{className:`fb-preview-binary`,children:`Binary file - no preview available`})]})]}),Y&&i(p,{filename:Y.filename,error:Y.error,onDismiss:()=>X(null)}),r(`div`,{className:`fb-actions`,children:[i(`div`,{className:`fb-selection-info`,children:V.size>0?`${V.size} item(s) selected`:`Select files to index or analyze`}),we&&i(`span`,{className:`fb-index-status`,children:we}),r(`div`,{className:`fb-action-btns`,children:[r(`button`,{className:`fb-action-btn secondary`,onClick:Ae,disabled:V.size===0||Ce.size>0,title:`Index selected files for RAG search`,children:[i(de,{size:14}),`Index Selected`]}),r(`button`,{className:`fb-action-btn primary`,onClick:je,disabled:V.size===0||Ce.size>0,title:`Index and send selected files to the chat agent for analysis`,children:[i(ue,{size:14}),`Ask Agent`]})]})]})]})]})})}export{A as FileBrowser};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{S as t,T as n,i as r,n as i,r as a,w as o}from"./apiBase-DRtaTd8u.js";import{n as s,t as c}from"./zap-BdhDcjhB.js";import{A as ee,Bt as te,C as ne,D as re,E as ie,F as ae,Ft as l,Gt as u,Ht as oe,I as se,It as ce,Jt as le,Kt as ue,L as de,Lt as fe,M as pe,N as me,O as he,P as ge,Qt as _e,R as d,Rt as f,S as ve,T as p,Ut as ye,Vt as be,W as xe,_ as Se,an as Ce,b as we,c as Te,d as Ee,dn as De,f as Oe,fn as ke,g as Ae,h as je,hn as m,j as Me,k as Ne,l as Pe,ln as Fe,m as Ie,p as Le,pn as Re,qt as ze,s as Be,t as Ve,u as He,un as Ue,v as We,vn as Ge,w as Ke,x as qe,xn as Je,y as Ye,yn as Xe,z as h}from"./index-CKOG_8jk.js";var g={name:`arrow-left`,size:24,node:[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]};g.node;var Ze=o(g),Qe={name:`chevron-left`,size:24,node:[[`path`,{d:`m15 18-6-6 6-6`,key:`1wnfg3`}]]};Qe.node;var $e=o(Qe),_={name:`git-merge`,size:24,node:[[`circle`,{cx:`18`,cy:`18`,r:`3`,key:`1xkwt0`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`path`,{d:`M6 21V9a9 9 0 0 0 9 9`,key:`7kw0sc`}]]};_.node;var et=o(_),tt={name:`shield-off`,size:24,node:[[`path`,{d:`m2 2 20 20`,key:`1ooewy`}],[`path`,{d:`M5 5a1 1 0 0 0-1 1v7c0 5 3.5 7.5 7.67 8.94a1 1 0 0 0 .67.01c2.35-.82 4.48-1.97 5.9-3.71`,key:`1jlk70`}],[`path`,{d:`M9.309 3.652A12.252 12.252 0 0 0 11.24 2.28a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1v7a9.784 9.784 0 0 1-.08 1.264`,key:`18rp1v`}]]};tt.node;var nt=o(tt),v={name:`shield`,size:24,node:[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}]]};v.node;var rt=o(v),it={name:`target`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`circle`,{cx:`12`,cy:`12`,r:`6`,key:`1vlfrh`}],[`circle`,{cx:`12`,cy:`12`,r:`2`,key:`1c9p78`}]]};it.node;var at=o(it),ot={name:`trending-up`,size:24,node:[[`path`,{d:`M16 7h6v6`,key:`box55l`}],[`path`,{d:`m22 7-8.5 8.5-5-5L2 17`,key:`1t1m79`}]]};ot.node;var st=o(ot),ct={name:`user`,size:24,node:[[`path`,{d:`M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2`,key:`975kel`}],[`circle`,{cx:`12`,cy:`7`,r:`4`,key:`17ys0d`}]]};ct.node;var lt=o(ct),y=e(n(),1),ut=[{title:`Preferences`,categories:[`preference`]},{title:`About you`,categories:[`fact`,`profile`,`skill`]},{title:`Reminders`,categories:[`reminder`]},{title:`Notes`,categories:[`note`]}];function dt(e){switch(e){case`user`:return`You added this`;case`tool`:return`You asked GAIA to remember this`;case`llm_extract`:return`Picked up in a chat`;case`consolidation`:return`From an older chat`;case`inferred`:return`From your profile setup`;case`discovery`:return`Found on this PC during profile setup`;default:return`Saved`}}function ft(e){let t=new Date(e);if(Number.isNaN(t.getTime()))return``;let n=Math.floor((Date.now()-t.getTime())/864e5);return n<=0?`today`:n===1?`yesterday`:n<30?`${n} days ago`:t.toLocaleDateString(void 0,{month:`short`,day:`numeric`,year:`numeric`})}function pt(e,t=new Date){let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e),r=n?new Date(+n[1],n[2]-1,+n[3]):new Date(e);if(Number.isNaN(r.getTime()))return null;let i=r.getHours()===0&&r.getMinutes()===0&&r.getSeconds()===0,a=new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime(),o=i?r.getTime()<a:r.getTime()<t.getTime(),s=r.toLocaleString(void 0,{weekday:`short`,month:`short`,day:`numeric`,...r.getFullYear()===t.getFullYear()?{}:{year:`numeric`},...i?{}:{hour:`numeric`,minute:`2-digit`}});return{text:`${o?`Was due`:`Due`} ${s}`,past:o}}function mt({memoryEnabled:e,reloadKey:n,onChanged:o,onOpenAdvanced:s,showToast:c}){let[ee,ne]=(0,y.useState)(null),[re,ie]=(0,y.useState)(null),[ae,l]=(0,y.useState)(null),[u,se]=(0,y.useState)(``),[ce,ue]=(0,y.useState)([]),[de,fe]=(0,y.useState)(new Set),[pe,me]=(0,y.useState)(``),[he,ge]=(0,y.useState)(`fact`),[_e,d]=(0,y.useState)(null),f=(0,y.useRef)(0),p=(0,y.useCallback)(async()=>{let e=++f.current;try{let t=await ve({about_user:!0,include_sensitive:!0,sort_by:`updated_at`,order:`desc`,limit:200});if(e!==f.current)return;ne(t.items),ie(null)}catch(n){if(e!==f.current)return;t.system.warn(`Failed to load what GAIA knows about the user`,n),ie(n instanceof Error?n.message:String(n))}},[]);(0,y.useEffect)(()=>{p()},[p,n]);let ye=(0,y.useCallback)(async e=>{let n=u.trim();if(!n||n===e.content)l(null);else{d(e.id);try{await Se(e.id,{content:n}),l(null),c(`Updated`,`success`),await p(),o()}catch(e){t.system.error(`Failed to edit memory`,e),c(`Couldn't save the change: ${e instanceof Error?e.message:e}`,`error`)}finally{d(null)}}},[u,p,o,c]),be=(0,y.useCallback)(async e=>{d(e.id);try{await Ae(e.id),f.current++,ne(t=>(t??[]).filter(t=>t.id!==e.id)),ue(t=>[e,...t]),o()}catch(e){t.system.error(`Failed to forget memory`,e),c(`Couldn't forget that: ${e instanceof Error?e.message:e}`,`error`)}finally{d(null)}},[o,c]),xe=(0,y.useCallback)(async e=>{d(e.id);try{await Ie({content:e.content,category:e.category,domain:e.domain??void 0,context:e.context,entity:e.entity??void 0,sensitive:e.sensitive,due_at:e.due_at??void 0}),ue(t=>t.filter(t=>t.id!==e.id)),await p(),o()}catch(e){t.system.error(`Failed to restore memory`,e),c(`Couldn't restore it: ${e instanceof Error?e.message:e}`,`error`)}finally{d(null)}},[p,o,c]),we=(0,y.useCallback)(async()=>{let e=pe.trim();if(e){d(`new`);try{await Ie({content:e,category:he}),me(``),c(`Saved`,`success`),await p(),o()}catch(e){t.system.error(`Failed to add memory`,e),c(`Couldn't save it: ${e instanceof Error?e.message:e}`,`error`)}finally{d(null)}}},[pe,he,p,o,c]);if(!e)return r(`div`,{className:`mem-about`,children:[a(`h2`,{className:`mem-about-title`,children:`What GAIA knows about you`}),r(`div`,{className:`mem-about-empty`,children:[a(`p`,{children:`Memory is off, so GAIA isn't saving anything about you.`}),a(`button`,{className:`btn-secondary`,onClick:s,children:`Turn it on in Advanced`})]})]});let Te=ut.map(e=>({...e,rows:(ee??[]).filter(t=>e.categories.includes(t.category))})).filter(e=>e.rows.length>0);return r(`div`,{className:`mem-about`,children:[a(`h2`,{className:`mem-about-title`,children:`What GAIA knows about you`}),a(`p`,{className:`mem-about-intro`,children:`GAIA uses these in every chat. Edit anything that's wrong, or forget it so GAIA stops using it.`}),r(`form`,{className:`mem-about-add`,onSubmit:e=>{e.preventDefault(),we()},children:[a(`input`,{className:`mem-input`,placeholder:`Tell GAIA something about you, e.g. “I prefer short answers”`,"aria-label":`Something GAIA should know about you`,value:pe,onChange:e=>me(e.target.value)}),r(`select`,{className:`mem-select`,"aria-label":`Kind`,value:he,onChange:e=>ge(e.target.value),children:[a(`option`,{value:`fact`,children:`About you`}),a(`option`,{value:`preference`,children:`Preference`}),a(`option`,{value:`reminder`,children:`Reminder`}),a(`option`,{value:`note`,children:`Note`})]}),r(`button`,{className:`btn-primary`,type:`submit`,disabled:!pe.trim()||_e===`new`,children:[a(ze,{size:14}),` Add`]})]}),ce.map(e=>r(`div`,{className:`mem-about-forgotten`,role:`status`,children:[r(`span`,{children:[`Forgotten: `,e.sensitive?`a sensitive memory`:`“${e.content}”`,` — GAIA won't learn it again from old chats.`]}),r(`button`,{className:`mem-about-link`,disabled:_e===e.id,onClick:()=>xe(e),children:[a(te,{size:12}),` Undo`]})]},e.id)),re?r(`div`,{className:`mem-about-empty`,children:[r(`p`,{children:[`Couldn't load your memories: `,re]}),a(`button`,{className:`btn-secondary`,onClick:p,children:`Try again`})]}):ee===null?r(`div`,{className:`mem-loading`,children:[a(`div`,{className:`mem-spinner`}),` Loading…`]}):Te.length===0?r(`div`,{className:`mem-about-empty`,children:[a(`p`,{children:`GAIA hasn't saved anything about you yet.`}),a(`p`,{className:`mem-about-hint`,children:`Tell it in a chat (“remember that I live in Calgary”) or add something above.`})]}):Te.map(e=>r(`section`,{className:`mem-about-group`,"aria-label":e.title,children:[a(`h3`,{className:`mem-about-group-title`,children:e.title}),a(`ul`,{className:`mem-about-list`,children:e.rows.map(e=>{let t=e.sensitive&&!de.has(e.id),n=e.due_at?pt(e.due_at):null;return a(`li`,{className:`mem-about-item`,children:ae===e.id?r(`form`,{className:`mem-about-edit`,onSubmit:t=>{t.preventDefault(),ye(e)},children:[a(`textarea`,{className:`mem-input`,"aria-label":`Edit memory`,rows:2,autoFocus:!0,value:u,onChange:e=>se(e.target.value),onKeyDown:t=>{t.key===`Escape`&&(t.stopPropagation(),l(null)),t.key===`Enter`&&!t.shiftKey&&(t.preventDefault(),ye(e))}}),r(`div`,{className:`mem-about-edit-actions`,children:[a(`button`,{className:`btn-primary`,type:`submit`,disabled:_e===e.id,children:`Save`}),a(`button`,{className:`btn-secondary`,type:`button`,onClick:()=>l(null),children:`Cancel`})]})]}):r(i.Fragment,{children:[r(`div`,{className:`mem-about-text`,children:[t?r(`button`,{className:`mem-about-link`,onClick:()=>fe(t=>new Set(t).add(e.id)),children:[a(Ce,{size:12}),` Sensitive — show`]}):e.content,n&&a(`span`,{className:`mem-about-due${n.past?` is-overdue`:``}`,children:n.text}),r(`span`,{className:`mem-about-meta`,children:[dt(e.source),` · `,ft(e.updated_at)]})]}),r(`div`,{className:`mem-about-actions`,children:[a(`button`,{className:`mem-about-btn`,"aria-label":`Edit: ${t?`sensitive memory`:e.content}`,title:`Edit`,onClick:()=>{l(e.id),se(e.content)},children:a(le,{size:14})}),r(`button`,{className:`mem-about-btn mem-about-btn-remove`,"aria-label":`Forget: ${t?`sensitive memory`:e.content}`,title:`Forget`,disabled:_e===e.id,onClick:()=>be(e),children:[a(oe,{size:14}),` Forget`]})]})]})},e.id)})})]},e.title))]})}function b(e){if(!e)return`—`;try{let t=new Date(e);if(isNaN(t.getTime()))return`—`;let n={month:`short`,day:`numeric`};return t.getFullYear()!==new Date().getFullYear()&&(n.year=`numeric`),t.toLocaleDateString(void 0,n)}catch{return`—`}}function x(e){if(!e)return``;try{let t=new Date(e);return isNaN(t.getTime())?``:t.toLocaleString(void 0,{year:`numeric`,month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`})}catch{return``}}function S(e){if(!e)return`—`;try{let t=new Date(e);if(isNaN(t.getTime()))return`—`;let n=Date.now(),r=t.getTime()-n,i=Math.abs(r),a=Math.floor(i/1e3),o=Math.floor(i/6e4),s=Math.floor(i/36e5),c=Math.floor(i/864e5);return r<0?a<5?`just now`:a<60?`${a}s ago`:s===0?`${o}m ago`:c===0?`${s}h ago`:c===1?`yesterday`:c<30?`${c}d ago`:x(e):a<5?`now`:a<60?`in ${a}s`:s===0?`in ${o}m`:c===0?`in ${s}h`:c===1?`tomorrow`:c<30?`in ${c}d`:x(e)}catch{return`—`}}function ht(e){return e<1e3?`${Math.round(e)}ms`:`${(e/1e3).toFixed(1)}s`}function gt(e){try{return new Date(e).getTime()<Date.now()}catch{return!1}}function _t(e){return e>=.7?`high`:e>=.4?`medium`:`low`}function vt(e){return e>=.9?`high`:e>=.7?`medium`:`low`}function yt(e,t){let n=b(e),r=b(t);return n===`—`&&r===`—`?``:n===r?n:`${n} \u2013 ${r}`}function bt(e){if(e.length===0)return 0;let t=new Date().toISOString().slice(0,10),n=e.find(e=>e.date===t);return n?n.knowledge_added:0}var xt=[`fact`,`preference`,`error`,`skill`,`note`,`reminder`],St={work:`blue`,technical:`purple`,personal:`green`,general:`gray`};function Ct(){let{setShowMemoryDashboard:e,sessions:n,setCurrentSession:o}=ce(),te=(0,y.useMemo)(()=>new Map(n.map(e=>[e.id,e.title])),[n]),Ce=e=>te.get(e)||`${e.slice(0,8)}...`,[g,Qe]=(0,y.useState)(null),[_,tt]=(0,y.useState)([]),[v,it]=(0,y.useState)(null),[ot,ct]=(0,y.useState)([]),[ut,dt]=(0,y.useState)([]),[ft,pt]=(0,y.useState)([]),[b,Ct]=(0,y.useState)(null),[wt,Tt]=(0,y.useState)([]),[Et,Dt]=(0,y.useState)(!0),[Ot,kt]=(0,y.useState)(null),[At,jt]=(0,y.useState)(null),[Mt,C]=(0,y.useState)(!1),[Nt,Pt]=(0,y.useState)(null),[Ft,It]=(0,y.useState)([]),Lt=(0,y.useRef)(0),[w,Rt]=(0,y.useState)([]),[zt,Bt]=(0,y.useState)(``),[Vt,Ht]=(0,y.useState)(``),[Ut,Wt]=(0,y.useState)(``),[T,Gt]=(0,y.useState)(`updated_at`),[Kt,qt]=(0,y.useState)(`desc`),[E,D]=(0,y.useState)(0),[Jt,Yt]=(0,y.useState)(!1),[Xt,Zt]=(0,y.useState)(``),[Qt,$t]=(0,y.useState)(null),en=(0,y.useRef)(null),[O,tn]=(0,y.useState)(null),[nn,rn]=(0,y.useState)(!1),[k,an]=(0,y.useState)(null),[A,j]=(0,y.useState)({content:``,category:`fact`,domain:``,context:`global`,entity:``,sensitive:!1,due_at:``}),[on,sn]=(0,y.useState)(new Set),[M,cn]=(0,y.useState)(!1),[ln,un]=(0,y.useState)(!1),[dn,fn]=(0,y.useState)(!1),[N,P]=(0,y.useState)(!1),[pn,mn]=(0,y.useState)(!1),[F,hn]=(0,y.useState)(null),[gn,_n]=(0,y.useState)(!1),[I,L]=(0,y.useState)(null),[R,vn]=(0,y.useState)(`about`),[yn,bn]=(0,y.useState)(0),[xn,Sn]=(0,y.useState)([]),[Cn,wn]=(0,y.useState)(null),[Tn,En]=(0,y.useState)(!1),[Dn,On]=(0,y.useState)(null),[kn,An]=(0,y.useState)(null),[jn,Mn]=(0,y.useState)(!1),[Nn,Pn]=(0,y.useState)({title:``,description:``,priority:`medium`}),[z,B]=(0,y.useState)(`idle`),[Fn,V]=(0,y.useState)([]),[H,U]=(0,y.useState)([]),[In,Ln]=(0,y.useState)(null),Rn=(0,y.useRef)(null),zn=(0,y.useRef)(null),[W,G]=(0,y.useState)(`idle`),[Bn,K]=(0,y.useState)([]),[q,J]=(0,y.useState)([]),[Vn,Hn]=(0,y.useState)(null),[Un,Wn]=(0,y.useState)(!1),Gn=(0,y.useRef)(null),Kn=(0,y.useRef)(null),[qn,Jn]=(0,y.useState)(30),[Yn,Xn]=(0,y.useState)(!1),[Zn,Qn]=(0,y.useState)(!1),[$n,er]=(0,y.useState)(!1),[tr,nr]=(0,y.useState)(!1),[rr,ir]=(0,y.useState)(!1),[ar,or]=(0,y.useState)(!1),sr=(0,y.useRef)(null),cr=(0,y.useRef)(null),lr=(0,y.useRef)(null),Y=(0,y.useCallback)((e,t=`info`)=>{let n=++Lt.current;It(r=>[...r,{id:n,text:e,type:t}]),setTimeout(()=>{It(e=>e.filter(e=>e.id!==n))},4e3)},[]);(0,y.useEffect)(()=>{if(!Mt)return;let e=e=>{cr.current&&!cr.current.contains(e.target)&&C(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[Mt]),l(!0,()=>{I?L(null):pn?mn(!1):gn?_n(!1):O?tn(null):Mt?C(!1):nn||k?(rn(!1),an(null)):Nt?Pt(null):e(!1)}),xe(lr,!!I),(0,y.useEffect)(()=>{if(!I)return;let e=lr.current;if(!e)return;let t=document.activeElement;return e.focus(),()=>{t?.focus()}},[I]);let ur=(0,y.useCallback)(async()=>{try{let e=await ie();Qe(e)}catch(e){t.system.warn(`Failed to load memory stats`,e)}},[]),dr=(0,y.useCallback)(async()=>{try{let e=await ne(qn);tt(e)}catch(e){t.system.warn(`Failed to load memory activity`,e)}},[qn]),X=(0,y.useCallback)(async()=>{try{let e=await ve({category:w.length>0?w:void 0,context:zt||void 0,entity:Vt||void 0,search:Ut||void 0,sort_by:T,order:Kt,offset:E,limit:15,include_sensitive:!0,include_superseded:Jt});it(e)}catch(e){t.system.warn(`Failed to load knowledge`,e)}},[w,zt,Vt,Ut,T,Kt,E,Jt]),fr=(0,y.useCallback)(async()=>{try{let e=await re();ct(e)}catch(e){t.system.warn(`Failed to load tool summary`,e)}},[]),pr=(0,y.useCallback)(async()=>{try{let e=await Ke(20);dt(e)}catch(e){t.system.warn(`Failed to load conversations`,e)}},[]),mr=(0,y.useCallback)(async()=>{try{let e=await he(7);pt(e)}catch(e){t.system.warn(`Failed to load upcoming items`,e)}},[]),Z=(0,y.useCallback)(async()=>{try{let e=await Ye();Ct(e)}catch(e){t.system.warn(`Failed to load embedding coverage`,e)}},[]),hr=(0,y.useCallback)(async()=>{try{let e=await we();Tt(e||[])}catch(e){t.system.warn(`Failed to load entities`,e)}},[]),gr=(0,y.useCallback)(async()=>{try{let e=await p();un(e.mcp_memory_enabled),cn(e.memory_enabled),fn(e.system_discovery_consent)}catch(e){t.system.warn(`Failed to load memory settings`,e)}},[]),_r=(0,y.useCallback)(async()=>{En(!0);try{let[e,t]=await Promise.all([Ne(),qe()]);Sn(e.goals),wn(t)}catch(e){t.system.warn(`Failed to load goals`,e)}finally{En(!1)}},[]),vr=(0,y.useCallback)(async(e,n)=>{try{await e()}catch(e){t.system.error(n,e),Y(`${n}: ${e instanceof Error?e.message:e}`,`error`);return}_r()},[_r,Y]);(0,y.useEffect)(()=>{if(!kn)return;let e=setTimeout(()=>An(null),3e3);return()=>clearTimeout(e)},[kn]);let Q=(0,y.useCallback)(async()=>{Dt(!0),kt(null);try{await Promise.all([ur(),dr(),X(),fr(),pr(),mr(),Z(),hr(),gr(),_r()]),bn(e=>e+1)}catch(e){kt(`Failed to load memory data. Is the backend running?`),t.system.error(`Memory dashboard load failed`,e)}finally{Dt(!1)}},[ur,dr,X,fr,pr,mr,Z,hr,gr,_r]);(0,y.useEffect)(()=>{Q()},[Q]),(0,y.useEffect)(()=>{X()},[X]);let yr=(0,y.useRef)(!0);(0,y.useEffect)(()=>{yr.current?yr.current=!1:dr()},[dr]);let br=(0,y.useCallback)(e=>{Wt(e),or(!0),sr.current&&clearTimeout(sr.current),sr.current=setTimeout(()=>{D(0),or(!1)},300)},[]),xr=(0,y.useCallback)(()=>{X(),ur(),Z(),mr(),hr()},[X,ur,Z,mr,hr]),$=(0,y.useCallback)(()=>{xr(),bn(e=>e+1)},[xr]),Sr=(0,y.useCallback)(async()=>{if(A.content.trim())try{let e=await Ie({content:A.content,category:A.category,domain:A.domain||void 0,context:A.context,entity:A.entity||void 0,sensitive:A.sensitive,due_at:A.due_at||void 0});rn(!1),j({content:``,category:`fact`,domain:``,context:`global`,entity:``,sensitive:!1,due_at:``}),$(),t.ui.info(`Created new knowledge entry`),e?.embedded===!1?Y(e.embed_error??`Saved, but not embedded`,`error`):Y(`Memory created successfully`,`success`)}catch(e){t.system.error(`Failed to create knowledge`,e),Y(`Failed to create memory`,`error`)}},[A,$,Y]),Cr=(0,y.useCallback)(async()=>{if(k&&A.content.trim())try{let e=await Se(k,{content:A.content,category:A.category,domain:A.domain||void 0,context:A.context,entity:A.entity||void 0,sensitive:A.sensitive,due_at:A.due_at||void 0});an(null),j({content:``,category:`fact`,domain:``,context:`global`,entity:``,sensitive:!1,due_at:``}),$(),t.ui.info(`Updated knowledge ${k}`),e?.embedded===!1?Y(e.embed_error??`Saved, but not embedded`,`error`):Y(`Memory updated`,`success`)}catch(e){t.system.error(`Failed to update knowledge`,e),Y(`Failed to update memory`,`error`)}},[k,A,$,Y]),wr=(0,y.useCallback)(async e=>{if(F!==e)hn(e);else{hn(null);try{await Ae(e),$(),t.ui.info(`Deleted knowledge ${e}`),Y(`Memory deleted`,`info`)}catch(e){t.system.error(`Failed to delete knowledge`,e),Y(`Failed to delete memory`,`error`)}}},[F,$,Y]);(0,y.useEffect)(()=>{if(!F)return;let e=setTimeout(()=>hn(null),3e3);return()=>clearTimeout(e)},[F]);let Tr=(0,y.useCallback)(async e=>{try{await Se(e.id,{sensitive:!e.sensitive}),X(),t.ui.info(`Toggled sensitive for ${e.id}: ${!e.sensitive}`),Y(e.sensitive?`Unmarked as sensitive`:`Marked as sensitive`,`info`)}catch(e){t.system.error(`Failed to toggle sensitive`,e),Y(`Failed to toggle sensitive flag`,`error`)}},[X,Y]),Er=(0,y.useCallback)(e=>{an(e.id),rn(!1),j({content:e.content,category:e.category,domain:e.domain||``,context:e.context,entity:e.entity||``,sensitive:e.sensitive,due_at:e.due_at||``})},[]),Dr=(0,y.useCallback)(e=>{navigator.clipboard.writeText(e).catch(()=>{}),t.ui.info(`Copied knowledge ID: ${e}`),Y(`ID copied to clipboard`,`info`)},[Y]),Or=(0,y.useCallback)(e=>{Zt(e),en.current&&clearTimeout(en.current),e.trim()?en.current=setTimeout(async()=>{try{let t=await d(e.trim(),20);$t(t)}catch(e){t.system.warn(`Conversation search failed`,e)}},300):$t(null)},[]),kr=(0,y.useCallback)(async e=>{try{let t=await We(e);tn({sessionId:e,turns:t})}catch(e){t.system.error(`Failed to load conversation detail`,e)}},[]),Ar=(0,y.useCallback)(e=>{Rt(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e]),D(0)},[]),jr=(0,y.useCallback)(e=>{T===e?qt(e=>e===`desc`?`asc`:`desc`):(Gt(e),qt(`desc`)),D(0)},[T]),Mr=(0,y.useCallback)(async()=>{Xn(!0),C(!1);try{let e=await Oe();await Q(),Y(`Consolidated ${e.consolidated??0} sessions, extracted ${e.extracted_items??0} items`,`success`)}catch(e){t.system.error(`Failed to consolidate sessions`,e),Y(`Failed to consolidate sessions`,`error`)}finally{Xn(!1)}},[Q,Y]),Nr=(0,y.useCallback)(async()=>{Qn(!0),C(!1);try{let e=await pe();await Z(),Y(`Backfilled ${e.backfilled??0} embeddings${e.total_without?` (${e.total_without} were missing)`:``}`,`success`)}catch(e){t.system.error(`Failed to rebuild embeddings`,e),Y(`Failed to rebuild embeddings`,`error`)}finally{Qn(!1)}},[Z,Y]),Pr=(0,y.useCallback)(async()=>{er(!0),C(!1);try{let e=await ge();await Q(),Y(`Checked ${e.pairs_checked??0} pairs: ${e.reinforced??0} reinforced, ${e.contradicted??0} contradicted`,`success`)}catch(e){t.system.error(`Failed to reconcile memory`,e),Y(`Failed to reconcile memory`,`error`)}finally{er(!1)}},[Q,Y]),Fr=(0,y.useCallback)(async()=>{nr(!0),C(!1);try{await me(),await Q(),Y(`FTS indexes rebuilt successfully`,`success`)}catch(e){t.system.error(`Failed to rebuild FTS index`,e),Y(`Failed to rebuild FTS indexes`,`error`)}finally{nr(!1)}},[Q,Y]),Ir=(0,y.useCallback)(async()=>{ir(!0),C(!1);try{let e=await ae();await Q(),e.skipped?Y(`System context collection is disabled — enable it in settings`,`error`):Y(`System context refreshed: ${e.stored} facts updated`,`success`)}catch(e){t.system.error(`Failed to refresh system context`,e),Y(`Failed to refresh system context`,`error`)}finally{ir(!1)}},[Q,Y]),Lr=Yn||Zn||$n||tr||rr,Rr=(0,y.useCallback)(()=>{B(`running`),V([]),U([]),Ln(null);let e=ee();zn.current=e,e.onmessage=t=>{try{let n=JSON.parse(t.data);if(n.type===`log`)V(e=>[...e,{text:n.message,kind:`log`}]);else if(n.type===`finding`){let e=n.item;V(t=>[...t,{text:` Found: ${e.content}`,kind:`finding`}]),U(t=>[...t,{...e,_checked:!0}])}else n.type===`error`?V(e=>[...e,{text:` Error: ${n.message}`,kind:`error`}]):n.type===`done`&&(e.close(),zn.current=null,V(e=>[...e,{text:`Done. ${n.total??0} items discovered.`,kind:`log`}]),B(`review`))}catch{V(e=>[...e,{text:`Failed to parse event data.`,kind:`error`}])}},e.onerror=()=>{e.close(),zn.current=null,V(e=>[...e,{text:`Connection error. Is the GAIA server running?`,kind:`error`}]),U(e=>(B(e.length>0?`review`:`idle`),e))}},[]),zr=(0,y.useCallback)(async()=>{let e=H.filter(e=>e._checked);if(e.length!==0){B(`saving`);try{let t=e.map(({_checked:e,...t})=>t),n=await He(t);Ln(n.stored),B(`done`),$(),Y(`Saved ${n.stored} items to memory`,`success`)}catch(e){t.system.error(`Failed to commit discovery items`,e),Y(`Failed to save discovery items`,`error`),B(`review`)}}},[H,$,Y]),Br=(0,y.useCallback)(()=>{G(`running`),K([]),J([]),Hn(null);let e=Me(Un);Kn.current=e,e.onmessage=t=>{try{let n=JSON.parse(t.data);if(n.type===`log`)K(e=>[...e,{text:n.message,kind:`log`}]);else if(n.type===`insight`){let e=n.item;K(t=>[...t,{text:` Insight: ${e.content}`,kind:`finding`}]),J(t=>[...t,{...e,_checked:!0}])}else n.type===`error`?K(e=>[...e,{text:` Error: ${n.message}`,kind:`error`}]):n.type===`done`&&(e.close(),Kn.current=null,K(e=>[...e,{text:`Done. ${n.total??0} insights generated.`,kind:`log`}]),G(`review`))}catch{K(e=>[...e,{text:`Failed to parse event data.`,kind:`error`}])}},e.onerror=()=>{e.close(),Kn.current=null,K(e=>[...e,{text:`Connection error. Is Lemonade Server running?`,kind:`error`}]),J(e=>(G(e.length>0?`review`:`idle`),e))}},[Un]),Vr=(0,y.useCallback)(async()=>{let e=q.filter(e=>e._checked);if(e.length!==0){G(`saving`);try{let t=e.map(({_checked:e,...t})=>t),n=await Ee(t);Hn(n.stored),G(`done`),$(),Y(`Saved ${n.stored} insights to memory`,`success`)}catch(e){t.system.error(`Failed to commit inference insights`,e),Y(`Failed to save inference insights`,`error`),G(`review`)}}},[q,$,Y]);(0,y.useEffect)(()=>{Rn.current&&(Rn.current.scrollTop=Rn.current.scrollHeight)},[Fn]),(0,y.useEffect)(()=>{Gn.current&&(Gn.current.scrollTop=Gn.current.scrollHeight)},[Bn]),(0,y.useEffect)(()=>()=>{zn.current&&=(zn.current.close(),null),Kn.current&&=(Kn.current.close(),null)},[]);let Hr=e=>T===e?a(`span`,{className:`mem-sort-arrow`,children:Kt===`desc`?`↓`:`↑`}):null,Ur=Math.max(1,..._.map(e=>e.conversations+e.tool_calls+e.knowledge_added+e.errors)),Wr=g?.knowledge?.by_context?Object.keys(g.knowledge.by_context):[];return r(`div`,{className:`memory-dashboard-page`,children:[r(`div`,{className:`memory-dashboard-header`,children:[r(`div`,{className:`memory-dashboard-header-left`,children:[a(`button`,{className:`btn-icon settings-back-btn`,onClick:()=>e(!1),"aria-label":`Back`,children:a(Ze,{size:18})}),r(`h1`,{children:[`Memory `,a(`span`,{style:{fontSize:11,fontWeight:600,color:`var(--accent-yellow)`,background:`var(--accent-yellow-dim)`,padding:`2px 8px`,borderRadius:4,marginLeft:8,verticalAlign:`middle`,letterSpacing:`0.5px`},children:`BETA`})]})]}),r(`div`,{className:`memory-dashboard-header-actions`,children:[R===`advanced`&&r(i.Fragment,{children:[b&&b.total_items>0&&r(`div`,{className:`mem-embedding-coverage`,title:`${b.with_embedding} of ${b.total_items} entries embedded`,children:[a(`div`,{className:`mem-embedding-bar`,children:a(`div`,{className:`mem-embedding-fill`,style:{width:`${Math.round(b.coverage_pct)}%`}})}),r(`span`,{className:`mem-embedding-label`,children:[Math.round(b.coverage_pct),`% embedded`]})]}),r(`div`,{className:`mem-maintenance-wrap`,ref:cr,children:[r(`button`,{className:`btn-icon ${Lr?`mem-spinning`:``}`,onClick:()=>C(e=>!e),title:`Maintenance actions`,"aria-label":`Maintenance actions`,"aria-expanded":Mt,children:[Lr?a(`div`,{className:`mem-spinner-sm`}):a(Fe,{size:16}),a(Xe,{size:10,style:{marginLeft:2}})]}),Mt&&r(`div`,{className:`mem-maintenance-menu`,role:`menu`,children:[r(`button`,{className:`mem-maintenance-item`,onClick:Mr,disabled:Yn,role:`menuitem`,children:[a(et,{size:14}),Yn?`Consolidating...`:`Consolidate Sessions`]}),r(`button`,{className:`mem-maintenance-item`,onClick:Nr,disabled:Zn,role:`menuitem`,children:[a(c,{size:14}),Zn?`Rebuilding...`:`Rebuild Embeddings`]}),r(`button`,{className:`mem-maintenance-item`,onClick:Pr,disabled:$n,role:`menuitem`,children:[a(m,{size:14}),$n?`Reconciling...`:`Reconcile Memory`]}),a(`div`,{className:`mem-maintenance-divider`}),r(`button`,{className:`mem-maintenance-item`,onClick:Ir,disabled:rr,role:`menuitem`,children:[a(ue,{size:14}),rr?`Refreshing...`:`Refresh System Context`]}),a(`div`,{className:`mem-maintenance-divider`}),r(`button`,{className:`mem-maintenance-item`,onClick:Fr,disabled:tr,role:`menuitem`,children:[a(u,{size:14}),tr?`Rebuilding...`:`Rebuild FTS Indexes`]})]})]})]}),a(`button`,{className:`btn-icon`,onClick:Q,title:`Refresh`,"aria-label":`Refresh dashboard`,children:a(ue,{size:16})})]})]}),r(`div`,{className:`mem-tab-bar`,role:`tablist`,children:[r(`button`,{className:`mem-tab-btn${R===`about`?` mem-tab-active`:``}`,onClick:()=>vn(`about`),role:`tab`,"aria-selected":R===`about`,children:[a(lt,{size:14}),` About you`]}),r(`button`,{className:`mem-tab-btn${R===`goals`?` mem-tab-active`:``}`,onClick:()=>{vn(`goals`),_r()},role:`tab`,"aria-selected":R===`goals`,children:[a(at,{size:14}),` Goals`,Cn&&(Cn.goals.pending_approval??0)>0&&a(`span`,{className:`mem-tab-badge`,children:Cn.goals.pending_approval})]}),r(`button`,{className:`mem-tab-btn${R===`profile`?` mem-tab-active`:``}`,onClick:()=>vn(`profile`),role:`tab`,"aria-selected":R===`profile`,children:[a(ye,{size:14}),` Profile setup`]}),r(`button`,{className:`mem-tab-btn${R===`advanced`?` mem-tab-active`:``}`,onClick:()=>vn(`advanced`),role:`tab`,"aria-selected":R===`advanced`,children:[a(Je,{size:14}),` Advanced`]})]}),r(`div`,{className:`memory-dashboard-body`,children:[R===`about`&&a(mt,{memoryEnabled:M,reloadKey:yn,onChanged:xr,onOpenAdvanced:()=>vn(`advanced`),showToast:Y}),R===`advanced`&&a(i.Fragment,{children:Et&&!g?r(`div`,{className:`mem-loading`,children:[a(`div`,{className:`mem-spinner`}),`Loading memory data...`]}):Ot?r(`div`,{className:`mem-empty`,children:[a(`div`,{className:`mem-empty-icon`,children:a(be,{size:32})}),a(`p`,{children:Ot}),r(`button`,{className:`btn-secondary`,onClick:Q,style:{marginTop:12},children:[a(ue,{size:14}),` Retry`]})]}):r(i.Fragment,{children:[!M&&r(`div`,{className:`mem-empty-state`,style:{margin:`40px 0`},children:[a(`div`,{className:`mem-empty-icon`,style:{opacity:.5},children:a(rt,{size:32})}),a(`p`,{style:{color:`var(--text-secondary)`,fontSize:14},children:`Memory is off. Turn it on in Settings below to let GAIA remember what you tell it.`})]}),M&&r(i.Fragment,{children:[g?.embedding_error&&r(`div`,{className:`mem-advanced-error`,role:`alert`,children:[a(be,{size:14}),` `,g.embedding_error]}),r(`div`,{className:`mem-stat-cards`,children:[r(`div`,{className:`mem-stat-card`,"data-accent":`purple`,children:[a(`div`,{className:`mem-stat-value`,children:g?.knowledge?.total??0}),a(`div`,{className:`mem-stat-label`,children:`Stored`}),a(`div`,{className:`mem-stat-sub`,children:(()=>{let e=bt(_);return e>0?`+${e} today`:g?.knowledge?.by_category?Object.entries(g.knowledge.by_category).slice(0,3).map(([e,t])=>`${t} ${e}${t===1?``:`s`}`).join(`, `):`No entries`})()})]}),r(`div`,{className:`mem-stat-card`,"data-accent":`gold`,children:[a(`div`,{className:`mem-stat-value`,children:g?.knowledge?.total_retrievals??0}),a(`div`,{className:`mem-stat-label`,children:`Retrieved`}),a(`div`,{className:`mem-stat-sub`,children:g?.knowledge?.total&&g?.knowledge?.total_retrievals?`avg ${(g.knowledge.total_retrievals/g.knowledge.total).toFixed(1)}x per memory`:`No recalls yet`})]}),r(`div`,{className:`mem-stat-card`,"data-accent":`blue`,children:[a(`div`,{className:`mem-stat-value`,children:g?.conversations?.total_sessions??0}),a(`div`,{className:`mem-stat-label`,children:`Sessions`}),a(`div`,{className:`mem-stat-sub`,children:yt(g?.conversations?.first_session??null,g?.conversations?.last_session??null)||`${g?.conversations?.total_turns??0} total turns`})]}),r(`div`,{className:`mem-stat-card`,"data-accent":`green`,children:[a(`div`,{className:`mem-stat-value`,children:g?.tools?.total_calls??0}),a(`div`,{className:`mem-stat-label`,children:`Tool Calls`}),r(`div`,{className:`mem-stat-sub`,title:`Memory tools (remember, recall, ...) are not logged`,children:[g?.tools?.unique_tools??0,` tools, excl. memory`]})]}),r(`div`,{className:`mem-stat-card`,"data-accent":`red`,children:[a(`div`,{className:`mem-stat-value`,children:g?.tools?.overall_success_rate!=null&&(g.tools.total_calls??0)>0?`${Math.round(g.tools.overall_success_rate*100)}%`:`—`}),a(`div`,{className:`mem-stat-label`,children:`Success Rate`}),a(`div`,{className:`mem-stat-sub`,children:(g?.tools?.total_calls??0)>0?`${g?.tools?.total_errors??0} errors`:`No tool calls yet`})]})]}),r(`div`,{className:`mem-section`,children:[r(`div`,{className:`mem-section-title mem-section-title-row`,children:[r(`span`,{className:`mem-section-title-left`,children:[a(st,{size:14}),` Activity`]}),a(`div`,{className:`mem-range-tabs`,role:`group`,"aria-label":`Activity range`,children:[1,7,30].map(e=>a(`button`,{className:`mem-range-tab${qn===e?` active`:``}`,onClick:()=>Jn(e),children:e===1?`1D`:e===7?`7D`:`30D`},e))})]}),_.length>0?r(i.Fragment,{children:[a(`div`,{className:`mem-activity-chart`,children:_.map((e,t)=>{let n=e.conversations+e.tool_calls+e.knowledge_added+e.errors,o=t===0||t===_.length-1||t%7==0,s=new Date(e.date+`T00:00:00`).toLocaleDateString(void 0,{month:`short`,day:`numeric`});return r(`div`,{className:`mem-activity-bar-group`,onMouseEnter:()=>jt(t),onMouseLeave:()=>jt(null),children:[e.errors>0&&a(`div`,{className:`mem-activity-bar errors`,style:{height:`${e.errors/Ur*100}%`}}),e.knowledge_added>0&&a(`div`,{className:`mem-activity-bar knowledge`,style:{height:`${e.knowledge_added/Ur*100}%`}}),e.tool_calls>0&&a(`div`,{className:`mem-activity-bar tool_calls`,style:{height:`${e.tool_calls/Ur*100}%`}}),e.conversations>0&&a(`div`,{className:`mem-activity-bar conversations`,style:{height:`${e.conversations/Ur*100}%`}}),o&&a(`span`,{className:`mem-activity-date-label`,children:s}),At===t&&n>0&&r(`div`,{className:`mem-activity-tooltip`,children:[a(`strong`,{children:s}),a(`br`,{}),e.conversations>0&&r(i.Fragment,{children:[e.conversations,` conversations`,a(`br`,{})]}),e.tool_calls>0&&r(i.Fragment,{children:[e.tool_calls,` tool calls`,a(`br`,{})]}),e.knowledge_added>0&&r(i.Fragment,{children:[e.knowledge_added,` learned`,a(`br`,{})]}),e.errors>0&&r(i.Fragment,{children:[e.errors,` errors`]})]})]},e.date)})}),r(`div`,{className:`mem-activity-legend`,children:[r(`span`,{className:`mem-activity-legend-item`,children:[a(`span`,{className:`mem-activity-legend-dot conversations`}),` Conversations`]}),r(`span`,{className:`mem-activity-legend-item`,children:[a(`span`,{className:`mem-activity-legend-dot tool_calls`}),` Tool Calls`]}),r(`span`,{className:`mem-activity-legend-item`,children:[a(`span`,{className:`mem-activity-legend-dot knowledge`}),` Knowledge`]}),r(`span`,{className:`mem-activity-legend-item`,children:[a(`span`,{className:`mem-activity-legend-dot errors`}),` Errors`]})]})]}):r(`div`,{className:`mem-empty`,children:[a(`div`,{className:`mem-empty-icon`,children:a(st,{size:28})}),a(`p`,{children:`No activity data yet`})]})]}),r(`div`,{className:`mem-section`,children:[r(`div`,{className:`mem-section-title mem-section-title-row`,children:[r(`span`,{className:`mem-section-title-left`,children:[a(Je,{size:14}),` Knowledge Browser`,v&&v.total>0&&a(`span`,{className:`mem-section-count`,children:v.total})]}),!nn&&!k&&r(`button`,{className:`mem-section-add-btn`,onClick:()=>rn(!0),title:`Add a memory entry`,children:[a(ze,{size:13}),` Add`]})]}),r(`div`,{className:`mem-filters`,children:[r(`div`,{className:`mem-category-pills`,role:`group`,"aria-label":`Filter by category`,children:[xt.map(e=>a(`button`,{className:`mem-category-pill ${e}${w.includes(e)?` active`:``}`,onClick:()=>Ar(e),"aria-pressed":w.includes(e),children:e},e)),w.length>0&&a(`button`,{className:`mem-category-pill clear`,onClick:()=>{Rt([]),D(0)},"aria-label":`Clear category filters`,children:`✕ Clear`})]}),r(`select`,{className:`mem-filter-select`,value:zt,onChange:e=>{Bt(e.target.value),D(0)},"aria-label":`Filter by context`,children:[a(`option`,{value:``,children:`All Contexts`}),Wr.map(e=>a(`option`,{value:e,children:e},e))]}),r(`select`,{className:`mem-filter-select`,value:Vt,onChange:e=>{Ht(e.target.value),D(0)},"aria-label":`Filter by entity`,children:[a(`option`,{value:``,children:`All Entities`}),wt.map(e=>r(`option`,{value:e.entity,children:[e.entity,` (`,e.count,`)`]},e.entity))]}),r(`div`,{className:`mem-filter-search-wrap`,children:[ar?a(`div`,{className:`mem-spinner-sm search-icon`,style:{width:12,height:12,borderWidth:1.5}}):a(u,{size:13,className:`search-icon`}),a(`input`,{className:`mem-filter-search`,type:`text`,placeholder:`Search memories...`,value:Ut,onChange:e=>br(e.target.value),"aria-label":`Search memories`})]}),r(`label`,{className:`mem-filter-toggle`,title:`Show entries that have been superseded by newer versions`,children:[a(`input`,{type:`checkbox`,checked:Jt,onChange:e=>Yt(e.target.checked)}),a(`span`,{children:`Superseded`})]})]}),(nn||k)&&r(`div`,{className:`mem-inline-form`,children:[r(`div`,{className:`mem-inline-form-row`,children:[a(`label`,{children:`Content`}),a(`textarea`,{value:A.content,onChange:e=>j(t=>({...t,content:e.target.value})),placeholder:`What should the agent remember?`})]}),r(`div`,{className:`mem-inline-form-row`,children:[a(`label`,{children:`Category`}),a(`select`,{value:A.category,onChange:e=>j(t=>({...t,category:e.target.value})),children:xt.map(e=>a(`option`,{value:e,children:e.charAt(0).toUpperCase()+e.slice(1)},e))})]}),r(`div`,{className:`mem-inline-form-row`,children:[a(`label`,{children:`Context`}),a(`input`,{type:`text`,value:A.context,onChange:e=>j(t=>({...t,context:e.target.value})),placeholder:`global`})]}),r(`div`,{className:`mem-inline-form-row`,children:[a(`label`,{children:`Domain`}),a(`input`,{type:`text`,value:A.domain,onChange:e=>j(t=>({...t,domain:e.target.value})),placeholder:`e.g., python, frontend`})]}),r(`div`,{className:`mem-inline-form-row`,children:[a(`label`,{children:`Entity`}),a(`input`,{type:`text`,value:A.entity,onChange:e=>j(t=>({...t,entity:e.target.value})),placeholder:`e.g., person:sarah_chen`})]}),r(`div`,{className:`mem-inline-form-row`,children:[a(`label`,{children:`Due At`}),a(`input`,{type:`text`,value:A.due_at,onChange:e=>j(t=>({...t,due_at:e.target.value})),placeholder:`ISO 8601 (e.g., 2026-03-25T09:00:00-07:00)`})]}),r(`div`,{className:`mem-inline-form-row`,children:[a(`label`,{children:`Sensitive`}),r(`label`,{style:{display:`flex`,alignItems:`center`,gap:6,cursor:`pointer`,fontSize:12},children:[a(`input`,{type:`checkbox`,checked:A.sensitive,onChange:e=>j(t=>({...t,sensitive:e.target.checked}))}),`Mark as sensitive (excluded from system prompt)`]})]}),r(`div`,{className:`mem-inline-form-actions`,children:[a(`button`,{className:`btn-secondary`,onClick:()=>{rn(!1),an(null)},children:`Cancel`}),a(`button`,{className:`btn-primary`,onClick:k?Cr:Sr,style:{padding:`8px 20px`,fontSize:13},children:k?`Update`:`Save`})]})]}),v&&v.items.length>0?r(i.Fragment,{children:[a(`div`,{style:{overflowX:`auto`},children:r(`table`,{className:`mem-knowledge-table`,children:[a(`thead`,{children:r(`tr`,{children:[r(`th`,{onClick:()=>jr(`category`),className:T===`category`?`sorted`:``,children:[`Category`,Hr(`category`)]}),a(`th`,{children:`Content`}),r(`th`,{onClick:()=>jr(`context`),className:T===`context`?`sorted`:``,children:[`Context`,Hr(`context`)]}),a(`th`,{children:`Entity`}),r(`th`,{onClick:()=>jr(`confidence`),className:T===`confidence`?`sorted`:``,children:[`Confidence`,Hr(`confidence`)]}),a(`th`,{children:`Source`}),r(`th`,{onClick:()=>jr(`updated_at`),className:T===`updated_at`?`sorted`:``,children:[`Updated`,Hr(`updated_at`)]}),r(`th`,{onClick:()=>jr(`created_at`),className:T===`created_at`?`sorted`:``,children:[`Created`,Hr(`created_at`)]}),a(`th`,{children:`Due`}),a(`th`,{className:`mem-actions-cell`})]})}),a(`tbody`,{children:v.items.map(e=>{let t=Nt===e.id,n=e.has_embedding;return r(y.Fragment,{children:[r(`tr`,{className:`${e.superseded_by?`mem-superseded-row`:``} ${t?`mem-expanded-row`:``}`,onClick:()=>Pt(t?null:e.id),onKeyDown:n=>{(n.key===`Enter`||n.key===` `)&&(n.preventDefault(),Pt(t?null:e.id))},tabIndex:0,role:`row`,"aria-expanded":t,style:{cursor:`pointer`},children:[a(`td`,{children:a(`span`,{className:`mem-cat-badge ${e.category}`,children:e.category})}),a(`td`,{children:r(`div`,{className:`mem-content-cell`,title:e.content,children:[n!==void 0&&a(`span`,{className:`mem-embed-dot ${n?`embedded`:`missing`}`,title:n?`Embedded`:`Embedding missing`,children:a(Re,{size:6,fill:`currentColor`})}),e.sensitive&&a(`span`,{className:`mem-sensitive-badge`,title:`Sensitive`,children:a(rt,{size:11})}),a(`span`,{className:e.sensitive&&!on.has(e.id)?`mem-sensitive-blur`:e.superseded_by?`mem-superseded-text`:``,onClick:t=>{e.sensitive&&(t.stopPropagation(),sn(t=>{let n=new Set(t);return n.has(e.id)?n.delete(e.id):n.add(e.id),n}))},children:e.content})]})}),a(`td`,{children:a(`span`,{className:`mem-date-cell`,children:e.context})}),a(`td`,{children:e.entity?a(`span`,{className:`mem-entity-link`,onClick:t=>{t.stopPropagation(),Ht(e.entity),D(0)},title:`Filter by ${e.entity}`,children:e.entity}):a(`span`,{className:`mem-date-cell`,children:`—`})}),a(`td`,{children:r(`div`,{className:`mem-confidence`,children:[a(`div`,{className:`mem-confidence-bar`,children:a(`div`,{className:`mem-confidence-fill ${_t(e.confidence)}`,style:{width:`${e.confidence*100}%`}})}),e.confidence.toFixed(2)]})}),a(`td`,{children:a(`span`,{className:`mem-date-cell`,children:e.source||`—`})}),a(`td`,{children:a(`span`,{className:`mem-date-cell`,title:x(e.updated_at),children:S(e.updated_at)})}),a(`td`,{children:a(`span`,{className:`mem-date-cell`,title:x(e.created_at),children:S(e.created_at)})}),a(`td`,{children:e.due_at?a(`span`,{className:`mem-due-badge ${gt(e.due_at)?`overdue`:`upcoming`}`,title:x(e.due_at),children:S(e.due_at)}):a(`span`,{className:`mem-due-badge none`,children:`—`})}),a(`td`,{className:`mem-actions-cell`,children:r(`div`,{className:`mem-row-actions`,onClick:e=>e.stopPropagation(),children:[a(`button`,{className:`mem-row-action-btn`,onClick:()=>Er(e),title:`Edit`,children:a(le,{size:13})}),a(`button`,{className:`mem-row-action-btn`,onClick:()=>Tr(e),title:e.sensitive?`Unmark sensitive`:`Mark sensitive`,children:e.sensitive?a(nt,{size:13}):a(rt,{size:13})}),a(`button`,{className:`mem-row-action-btn`,onClick:()=>Dr(e.id),title:`Copy ID`,children:a(De,{size:13})}),a(`button`,{className:`mem-row-action-btn delete${F===e.id?` is-confirm`:``}`,onClick:()=>wr(e.id),title:F===e.id?`Click again to delete`:`Delete`,"aria-label":F===e.id?`Confirm delete memory`:`Delete memory`,children:F===e.id?a(`span`,{className:`mem-row-delete-label`,children:`Delete?`}):a(oe,{size:13})})]})})]}),t&&a(`tr`,{className:`mem-detail-row`,children:a(`td`,{colSpan:10,children:r(`div`,{className:`mem-detail-panel`,children:[r(`div`,{className:`mem-detail-grid`,children:[r(`div`,{className:`mem-detail-field`,children:[a(`span`,{className:`mem-detail-label`,children:`ID`}),a(`span`,{className:`mem-detail-value`,children:e.id})]}),r(`div`,{className:`mem-detail-field`,children:[a(`span`,{className:`mem-detail-label`,children:`Domain`}),a(`span`,{className:`mem-detail-value`,children:e.domain||`—`})]}),r(`div`,{className:`mem-detail-field`,children:[a(`span`,{className:`mem-detail-label`,children:`Source`}),a(`span`,{className:`mem-detail-value`,children:e.source||`—`})]}),r(`div`,{className:`mem-detail-field`,children:[a(`span`,{className:`mem-detail-label`,children:`Use Count`}),a(`span`,{className:`mem-detail-value`,children:e.use_count??0})]}),r(`div`,{className:`mem-detail-field`,children:[a(`span`,{className:`mem-detail-label`,children:`Created`}),a(`span`,{className:`mem-detail-value`,children:x(e.created_at)})]}),r(`div`,{className:`mem-detail-field`,children:[a(`span`,{className:`mem-detail-label`,children:`Updated`}),a(`span`,{className:`mem-detail-value`,children:x(e.updated_at)})]}),r(`div`,{className:`mem-detail-field`,children:[a(`span`,{className:`mem-detail-label`,children:`Last Used`}),a(`span`,{className:`mem-detail-value`,children:x(e.last_used)})]}),r(`div`,{className:`mem-detail-field`,children:[a(`span`,{className:`mem-detail-label`,children:`Reminded At`}),a(`span`,{className:`mem-detail-value`,children:x(e.reminded_at)})]}),e.superseded_by&&r(`div`,{className:`mem-detail-field`,children:[a(`span`,{className:`mem-detail-label`,children:`Superseded By`}),a(`span`,{className:`mem-detail-value mem-detail-chain`,children:e.superseded_by})]}),e.metadata&&r(`div`,{className:`mem-detail-field mem-detail-full`,children:[a(`span`,{className:`mem-detail-label`,children:`Metadata`}),a(`span`,{className:`mem-detail-value`,children:typeof e.metadata==`object`?JSON.stringify(e.metadata,null,2):e.metadata})]})]}),r(`div`,{className:`mem-detail-content-full`,children:[a(`span`,{className:`mem-detail-label`,children:`Full Content`}),a(`div`,{className:`mem-detail-content-text`,children:e.content})]})]})})})]},e.id)})})]})}),r(`div`,{className:`mem-pagination`,children:[r(`span`,{children:[E+1,`–`,Math.min(E+15,v.total),` of `,v.total]}),r(`div`,{className:`mem-pagination-btns`,children:[a(`button`,{type:`button`,className:`mem-page-btn`,"aria-label":`Previous page`,disabled:E===0,onClick:()=>D(Math.max(0,E-15)),children:a($e,{size:14})}),a(`button`,{type:`button`,className:`mem-page-btn`,"aria-label":`Next page`,disabled:E+15>=v.total,onClick:()=>D(E+15),children:a(Ge,{size:14})})]})]})]}):r(`div`,{className:`mem-empty`,children:[a(`div`,{className:`mem-empty-icon`,children:a(Je,{size:28})}),a(`p`,{children:Ut||w.length>0||zt||Vt?`No matching memories`:`No memories stored yet`})]})]}),r(`div`,{className:`mem-two-col`,children:[r(`div`,{className:`mem-section`,children:[r(`div`,{className:`mem-section-title`,children:[a(f,{size:14}),` Tool Performance`,a(`span`,{className:`mem-section-note`,title:`remember, recall, update_memory, forget and search_past_conversations are not logged`,children:`excludes memory tools`})]}),ot.length>0?a(`div`,{style:{overflowX:`auto`},children:r(`table`,{className:`mem-tool-table`,children:[a(`thead`,{children:r(`tr`,{children:[a(`th`,{children:`Tool`}),a(`th`,{children:`Calls`}),a(`th`,{children:`Success`}),a(`th`,{children:`Denied`}),a(`th`,{children:`Avg Time`}),a(`th`,{children:`Last Used`}),a(`th`,{children:`Last Error`})]})}),a(`tbody`,{children:ot.map(e=>r(`tr`,{children:[a(`td`,{children:a(`span`,{className:`mem-tool-name`,children:e.tool_name})}),a(`td`,{children:e.total_calls}),a(`td`,{children:r(`div`,{className:`mem-confidence`,children:[a(`div`,{className:`mem-confidence-bar`,style:{width:40},children:a(`div`,{className:`mem-confidence-fill ${vt(e.success_rate)}`,style:{width:`${e.success_rate*100}%`}})}),r(`span`,{className:`mem-success-rate ${vt(e.success_rate)}`,children:[Math.round(e.success_rate*100),`%`]})]})}),a(`td`,{children:e.denied_count??0}),a(`td`,{children:ht(e.avg_duration_ms)}),a(`td`,{children:a(`span`,{className:`mem-date-cell`,title:x(e.last_used),children:S(e.last_used)})}),a(`td`,{children:a(`span`,{className:`mem-tool-error`,title:e.last_error||``,children:e.last_error||`—`})})]},e.tool_name))})]})}):r(`div`,{className:`mem-empty`,children:[a(`div`,{className:`mem-empty-icon`,children:a(f,{size:28})}),a(`p`,{children:`No tool calls recorded yet`})]})]}),r(`div`,{className:`mem-section`,children:[r(`div`,{className:`mem-section-title`,children:[a(ke,{size:14}),` Upcoming & Overdue`]}),ft.length>0?a(`div`,{className:`mem-temporal-list`,children:ft.map(e=>{let t=gt(e.due_at);return r(`div`,{className:`mem-temporal-item ${t?`overdue`:`upcoming`}`,children:[a(`span`,{className:`mem-temporal-icon`,children:a(t?be:ke,{size:16})}),r(`div`,{className:`mem-temporal-content`,children:[a(`div`,{className:`mem-temporal-text`,children:e.content}),r(`div`,{className:`mem-temporal-date`,children:[t?`OVERDUE`:`Due`,`: `,S(e.due_at),e.context!==`global`&&` \u00B7 ${e.context}`]})]})]},e.id)})}):r(`div`,{className:`mem-empty`,children:[a(`div`,{className:`mem-empty-icon`,children:a(m,{size:28})}),a(`p`,{children:`Nothing upcoming or overdue`})]})]})]}),r(`div`,{className:`mem-section`,children:[r(`div`,{className:`mem-section-title`,children:[a(s,{size:14}),` Conversation History`]}),r(`div`,{className:`mem-conv-search`,children:[a(u,{size:13,className:`search-icon`}),a(`input`,{type:`text`,placeholder:`Search conversations...`,value:Xt,onChange:e=>Or(e.target.value),"aria-label":`Search conversations`}),Xt&&a(`button`,{className:`mem-search-clear`,onClick:()=>{Zt(``),$t(null)},"aria-label":`Clear search`,children:a(fe,{size:12})})]}),Qt===null?ut.length>0?a(`div`,{className:`mem-conv-list`,children:ut.map(e=>r(`div`,{className:`mem-conv-item`,onClick:()=>kr(e.session_id),children:[r(`div`,{className:`mem-conv-info`,children:[r(`div`,{className:`mem-conv-session-id`,children:[Ce(e.session_id),e.consolidated&&a(`span`,{className:`mem-consolidated-badge`,title:`Consolidated`,children:a(et,{size:11})})]}),e.first_message&&a(`div`,{className:`mem-conv-preview`,children:e.first_message})]}),r(`div`,{className:`mem-conv-meta`,children:[r(`span`,{children:[e.turn_count,` turns`]}),a(`span`,{children:S(e.last_activity)})]})]},e.session_id))}):r(`div`,{className:`mem-empty`,children:[a(`div`,{className:`mem-empty-icon`,children:a(s,{size:28})}),a(`p`,{children:`No conversation history in memory`})]}):Qt.length>0?a(`div`,{className:`mem-conv-list`,children:Qt.map(e=>r(`div`,{className:`mem-conv-item`,onClick:()=>kr(e.session_id),children:[r(`div`,{className:`mem-conv-info`,children:[r(`div`,{className:`mem-conv-session-id`,children:[a(`span`,{className:`mem-conv-turn-role ${e.role}`,children:e.role}),` `,Ce(e.session_id)]}),a(`div`,{className:`mem-conv-preview`,children:e.content})]}),a(`div`,{className:`mem-conv-meta`,children:a(`span`,{children:S(e.timestamp)})})]},e.id))}):a(`div`,{className:`mem-empty`,children:r(`p`,{children:[`No conversations match “`,Xt,`”`]})})]}),O&&r(`div`,{className:`mem-conv-detail-overlay`,children:[r(`div`,{className:`mem-conv-detail-header`,children:[a(`h2`,{children:Ce(O.sessionId)}),r(`div`,{className:`mem-conv-detail-actions`,children:[te.has(O.sessionId)&&a(`button`,{className:`btn-secondary`,onClick:()=>o(O.sessionId),children:`Open chat`}),a(`button`,{className:`btn-icon`,onClick:()=>tn(null),"aria-label":`Close conversation`,children:a(fe,{size:16})})]})]}),r(`div`,{className:`mem-conv-detail-body`,children:[O.turns.map(e=>r(`div`,{className:`mem-conv-turn`,children:[r(`div`,{className:`mem-conv-turn-header`,children:[a(`div`,{className:`mem-conv-turn-role ${e.role}`,children:e.role}),a(`span`,{className:`mem-conv-turn-time`,title:x(e.timestamp),children:S(e.timestamp)})]}),a(`div`,{className:`mem-conv-turn-content`,children:e.content})]},e.id)),O.turns.length===0&&a(`div`,{className:`mem-empty`,children:`No turns found`})]})]})]}),r(`div`,{className:`mem-section`,children:[r(`div`,{className:`mem-section-title`,children:[a(rt,{size:14}),` Settings `,a(`span`,{style:{fontSize:10,fontWeight:600,color:`var(--accent-yellow)`,background:`var(--accent-yellow-dim)`,padding:`1px 6px`,borderRadius:4,marginLeft:6,verticalAlign:`middle`,letterSpacing:`0.5px`},children:`BETA`})]}),r(`div`,{className:`mem-setting-row`,children:[r(`div`,{className:`mem-setting-info`,children:[a(`span`,{className:`mem-setting-label`,children:`Memory enabled`}),a(`span`,{className:`mem-setting-desc`,children:`When disabled, no knowledge or conversation data is stored during any session (global incognito).`})]}),a(`button`,{className:`mem-toggle${M?` mem-toggle-on`:``}`,disabled:N,onClick:async()=>{if(!M)L(`memory`);else{P(!0);try{let e=await h({memory_enabled:!1});cn(e.memory_enabled)}catch(e){t.system.warn(`Failed to disable memory`,e)}finally{P(!1)}}},"aria-pressed":M,"aria-label":`Memory is ${M?`enabled`:`disabled`}`,children:M?`On`:`Off`})]}),I&&(()=>{let e={memory:{title:`Enable Agent Memory?`,description:`Agent memory is a work-in-progress. By enabling it:`,bullets:[[`Conversations and facts are stored `,`locally on this machine`],[`Stored data `,`may be lost`,` during updates`],[`You can disable it at any time from this settings panel`]],buttonLabel:`Enable Memory`,onConfirm:async()=>{let e=await h({memory_enabled:!0});cn(e.memory_enabled),Y(`Memory enabled`,`info`)}},mcp:{title:`Enable MCP Memory Access?`,description:`This exposes memory data to external MCP clients:`,bullets:[[`MCP clients can `,`read your stored memories`,` (read-only)`],[`Requires an `,`MCP server restart`,` to take effect`],[`Intended for debugging and troubleshooting only`]],buttonLabel:`Enable MCP Access`,onConfirm:async()=>{let e=await h({mcp_memory_enabled:!0});un(e.mcp_memory_enabled),Y(`MCP memory access enabled`,`info`)}},discovery:{title:`Enable System Discovery?`,description:`This scans your system to personalize responses:`,bullets:[[`Collects `,`hardware, software, and environment`,` information`],[`Scans files, git repos, browser history, and SSH config`],[`All data stays `,`local on this machine`]],buttonLabel:`Enable Discovery`,onConfirm:async()=>{let e=await h({system_discovery_consent:!0});if(fn(e.system_discovery_consent),e.system_context_error)Y(`System discovery enabled but scan failed: ${e.system_context_error}`,`error`);else{let t=e.system_context_refresh?.stored??0;Y(`System discovery enabled — ${t} system facts collected`,`info`)}Q()}}}[I];return r(i.Fragment,{children:[a(`div`,{"aria-hidden":`true`,style:{position:`fixed`,inset:0,background:`var(--bg-modal-overlay)`,zIndex:9998,backdropFilter:`blur(4px)`},onClick:()=>L(null)}),r(`div`,{ref:lr,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`mem-beta-confirm-title`,"aria-describedby":`mem-beta-confirm-desc`,tabIndex:-1,style:{position:`fixed`,top:`50%`,left:`50%`,transform:`translate(-50%, -50%)`,zIndex:9999,background:`var(--bg-card)`,border:`1px solid var(--border)`,borderRadius:12,padding:`28px 32px`,maxWidth:420,width:`90vw`,boxShadow:`var(--shadow-lg)`},children:[r(`div`,{style:{display:`flex`,alignItems:`center`,gap:10,marginBottom:16},children:[a(`span`,{style:{fontSize:11,fontWeight:700,color:`var(--accent-yellow)`,background:`var(--accent-yellow-dim)`,padding:`3px 10px`,borderRadius:4,letterSpacing:`0.5px`},children:`BETA`}),a(`h2`,{id:`mem-beta-confirm-title`,style:{fontSize:16,fontWeight:600,color:`var(--text-primary)`},children:e.title})]}),a(`p`,{id:`mem-beta-confirm-desc`,style:{fontSize:13,lineHeight:1.6,color:`var(--text-secondary)`,margin:`0 0 8px`},children:e.description}),a(`ul`,{style:{fontSize:13,lineHeight:1.7,color:`var(--text-secondary)`,margin:`0 0 24px`,paddingLeft:20},children:e.bullets.map((e,t)=>a(`li`,{children:e.map((e,t)=>t%2==1?a(`strong`,{style:{color:`var(--text-primary)`},children:e},t):a(`span`,{children:e},t))},t))}),r(`div`,{style:{display:`flex`,justifyContent:`flex-end`,gap:10},children:[a(`button`,{className:`btn-secondary`,onClick:()=>L(null),style:{padding:`8px 20px`,fontSize:13,borderRadius:6},children:`Cancel`}),a(`button`,{disabled:N,onClick:async()=>{P(!0);try{await e.onConfirm()}catch(e){t.system.warn(`Failed to update setting`,e),Y(`Failed to update setting. Please try again.`,`error`)}finally{P(!1),L(null)}},style:{padding:`8px 24px`,fontSize:13,fontWeight:600,borderRadius:6,border:`none`,cursor:`pointer`,background:`var(--accent-fill)`,color:`var(--accent-fill-text)`},children:e.buttonLabel})]})]})]})})(),r(`div`,{className:`mem-setting-row`,children:[r(`div`,{className:`mem-setting-info`,children:[a(`span`,{className:`mem-setting-label`,children:`MCP memory access`}),a(`span`,{className:`mem-setting-desc`,children:`Expose read-only memory tools to MCP clients (for debug/troubleshooting). Requires MCP server restart.`})]}),a(`button`,{className:`mem-toggle${ln?` mem-toggle-on`:``}`,disabled:N,onClick:async()=>{if(!ln)L(`mcp`);else{P(!0);try{let e=await h({mcp_memory_enabled:!1});un(e.mcp_memory_enabled)}catch(e){t.system.warn(`Failed to update memory settings`,e)}finally{P(!1)}}},"aria-label":`Toggle MCP memory access`,"aria-pressed":ln,children:ln?`On`:`Off`})]}),r(`div`,{className:`mem-setting-row`,children:[r(`div`,{className:`mem-setting-info`,children:[a(`span`,{className:`mem-setting-label`,children:`System discovery`}),a(`span`,{className:`mem-setting-desc`,children:`Allow GAIA to scan your system for hardware, software, and environment information to personalize responses.`})]}),a(`button`,{className:`mem-toggle${dn?` mem-toggle-on`:``}`,disabled:N,onClick:async()=>{if(!dn)L(`discovery`);else{P(!0);try{let e=await h({system_discovery_consent:!1});fn(e.system_discovery_consent)}catch(e){t.system.warn(`Failed to update system discovery setting`,e)}finally{P(!1)}}},"aria-label":`Toggle system discovery`,"aria-pressed":dn,children:dn?`On`:`Off`})]}),r(`div`,{className:`mem-setting-row mem-setting-row-danger`,children:[r(`div`,{className:`mem-setting-info`,children:[a(`span`,{className:`mem-setting-label`,children:`Re-initialize memory`}),a(`span`,{className:`mem-setting-desc`,children:`Wipe all memories, conversations, and tool logs, then re-collect system information. This cannot be undone.`})]}),gn?r(`div`,{className:`mem-delete-confirm`,children:[a(`span`,{className:`mem-delete-confirm-label`,children:`Are you sure?`}),a(`button`,{className:`mem-btn-danger`,disabled:N,onClick:async()=>{P(!0);try{let e=await se();e.system_context.error?Y(e.system_context.error,`error`):Y(`Re-initialized: cleared ${e.cleared.knowledge} entries, restored ${e.system_context.stored} system facts`,`info`),Q()}catch(e){t.system.warn(`Failed to reinitialize memory`,e),Y(`Failed to re-initialize memory`,`error`)}finally{P(!1),_n(!1)}},children:`Yes, re-initialize`}),a(`button`,{className:`btn-secondary`,onClick:()=>_n(!1),style:{padding:`6px 14px`,fontSize:12},children:`Cancel`})]}):a(`button`,{className:`mem-btn-danger`,disabled:N,onClick:()=>_n(!0),children:`Re-initialize`})]}),r(`div`,{className:`mem-setting-row mem-setting-row-danger`,children:[r(`div`,{className:`mem-setting-info`,children:[a(`span`,{className:`mem-setting-label`,children:`Delete all memories`}),a(`span`,{className:`mem-setting-desc`,children:`Permanently wipe all knowledge entries, conversation history, and tool logs. This cannot be undone.`})]}),pn?r(`div`,{className:`mem-delete-confirm`,children:[a(`span`,{className:`mem-delete-confirm-label`,children:`Are you sure?`}),a(`button`,{className:`mem-btn-danger`,disabled:N,onClick:async()=>{P(!0);try{let e=await Pe();Y(`Deleted ${e.knowledge} knowledge entries, ${e.conversations} conversations`,`info`),Q()}catch(e){t.system.warn(`Failed to clear memory`,e),Y(`Failed to clear memory`,`error`)}finally{P(!1),mn(!1)}},children:`Yes, delete all`}),a(`button`,{className:`btn-secondary`,onClick:()=>mn(!1),style:{padding:`6px 14px`,fontSize:12},children:`Cancel`})]}):a(`button`,{className:`mem-btn-danger`,disabled:N,onClick:()=>mn(!0),children:`Delete All`})]})]}),g&&r(`div`,{className:`mem-db-footer`,children:[r(`span`,{children:[`Database: `,Ve(g.db_size_bytes),g.knowledge?.avg_confidence!=null&&` \u00B7 Avg confidence: ${g.knowledge.avg_confidence.toFixed(2)}`]}),r(`div`,{style:{display:`flex`,alignItems:`center`,gap:8},children:[g.knowledge?.entity_count!=null&&g.knowledge.entity_count>0&&r(`span`,{children:[g.knowledge.entity_count,` entities`]}),g.knowledge?.sensitive_count!=null&&g.knowledge.sensitive_count>0&&r(`span`,{children:[a(rt,{size:10}),` `,g.knowledge.sensitive_count,` sensitive`]})]})]})]})}),R===`profile`&&r(`div`,{className:`mem-profile-grid`,children:[r(`div`,{className:`mem-profile-card`,children:[r(`div`,{className:`mem-profile-card-title`,children:[a(Ue,{size:16}),` System Discovery`]}),a(`p`,{className:`mem-profile-desc`,children:`Scan your system to discover apps, projects, and usage patterns.`}),a(`button`,{className:`btn-primary mem-profile-run-btn`,disabled:z===`running`||z===`saving`,onClick:Rr,children:z===`running`?r(i.Fragment,{children:[a(`div`,{className:`mem-spinner-sm`}),` Running...`]}):`Run Discovery`}),Fn.length>0&&a(`div`,{className:`mem-log`,ref:Rn,children:Fn.map((e,t)=>a(`div`,{className:`mem-log-line ${e.kind}`,children:e.text},t))}),(z===`review`||z===`saving`||z===`done`)&&H.length>0&&r(`div`,{className:`mem-review-section`,children:[a(`div`,{className:`mem-review-header`,children:`Review & Save`}),a(`div`,{className:`mem-review-list`,children:H.map((e,t)=>r(`label`,{className:`mem-review-item`,children:[a(`input`,{type:`checkbox`,checked:e._checked,disabled:z===`saving`||z===`done`,onChange:()=>{U(e=>e.map((e,n)=>n===t?{...e,_checked:!e._checked}:e))}}),a(`span`,{className:`mem-review-content`,children:e.content}),a(`span`,{className:`mem-source-badge`,children:e._source_name||e.category}),r(`span`,{className:`mem-conf-badge`,children:[Math.round(e.confidence*100),`%`]})]},t))}),r(`div`,{className:`mem-review-actions`,children:[a(`button`,{className:`btn-primary`,disabled:z===`saving`||z===`done`||H.filter(e=>e._checked).length===0,onClick:zr,children:z===`saving`?r(i.Fragment,{children:[a(`div`,{className:`mem-spinner-sm`}),` Saving...`]}):`Save Selected (${H.filter(e=>e._checked).length})`}),r(`span`,{className:`mem-review-select-links`,children:[a(`button`,{type:`button`,className:`mem-link-btn`,onClick:()=>U(e=>e.map(e=>({...e,_checked:!0}))),children:`Select All`}),` / `,a(`button`,{type:`button`,className:`mem-link-btn`,onClick:()=>U(e=>e.map(e=>({...e,_checked:!1}))),children:`None`})]})]})]}),z===`done`&&In!==null&&r(`div`,{className:`mem-profile-success`,children:[a(m,{size:14}),` Saved `,In,` items to memory`]}),z===`review`&&H.length===0&&a(`div`,{className:`mem-profile-empty`,children:`No items discovered.`})]}),r(`div`,{className:`mem-profile-card`,children:[r(`div`,{className:`mem-profile-card-title`,children:[a(ye,{size:16}),` AI Profile Inference`]}),a(`p`,{className:`mem-profile-desc`,children:`Use the local LLM to generate profile insights from your data.`}),a(`p`,{className:`mem-profile-note`,children:`Requires Lemonade Server running.`}),r(`label`,{className:`mem-profile-checkbox`,children:[a(`input`,{type:`checkbox`,checked:Un,onChange:e=>Wn(e.target.checked),disabled:W===`running`||W===`saving`}),`Include browser history`]}),a(`button`,{className:`btn-primary mem-profile-run-btn`,disabled:W===`running`||W===`saving`,onClick:Br,children:W===`running`?r(i.Fragment,{children:[a(`div`,{className:`mem-spinner-sm`}),` Running...`]}):`Run Inference`}),Bn.length>0&&a(`div`,{className:`mem-log`,ref:Gn,children:Bn.map((e,t)=>a(`div`,{className:`mem-log-line ${e.kind}`,children:e.text},t))}),(W===`review`||W===`saving`||W===`done`)&&q.length>0&&r(`div`,{className:`mem-review-section`,children:[a(`div`,{className:`mem-review-header`,children:`Review & Save`}),a(`div`,{className:`mem-review-list`,children:q.map((e,t)=>r(`label`,{className:`mem-review-item`,children:[a(`input`,{type:`checkbox`,checked:e._checked,disabled:W===`saving`||W===`done`,onChange:()=>{J(e=>e.map((e,n)=>n===t?{...e,_checked:!e._checked}:e))}}),a(`span`,{className:`mem-review-content`,children:e.content}),a(`span`,{className:`mem-domain-badge ${St[e.domain]||`gray`}`,children:e.domain}),r(`span`,{className:`mem-conf-badge`,children:[Math.round(e.confidence*100),`%`]})]},t))}),r(`div`,{className:`mem-review-actions`,children:[a(`button`,{className:`btn-primary`,disabled:W===`saving`||W===`done`||q.filter(e=>e._checked).length===0,onClick:Vr,children:W===`saving`?r(i.Fragment,{children:[a(`div`,{className:`mem-spinner-sm`}),` Saving...`]}):`Save Selected (${q.filter(e=>e._checked).length})`}),r(`span`,{className:`mem-review-select-links`,children:[a(`button`,{type:`button`,className:`mem-link-btn`,onClick:()=>J(e=>e.map(e=>({...e,_checked:!0}))),children:`Select All`}),` / `,a(`button`,{type:`button`,className:`mem-link-btn`,onClick:()=>J(e=>e.map(e=>({...e,_checked:!1}))),children:`None`})]})]})]}),W===`done`&&Vn!==null&&r(`div`,{className:`mem-profile-success`,children:[a(m,{size:14}),` Saved `,Vn,` insights to memory`]}),W===`review`&&q.length===0&&a(`div`,{className:`mem-profile-empty`,children:`No insights generated.`})]})]}),R===`goals`&&r(`div`,{className:`mem-goals-tab`,children:[a(`div`,{className:`mem-goals-stats-row`,children:[`queued`,`in_progress`,`completed`,`failed`].map(e=>r(`div`,{className:`mem-goals-stat-pill mem-goal-status-${e.replace(`_`,`-`)}`,children:[a(`span`,{className:`mem-goals-stat-n`,children:Cn?.goals[e]??0}),a(`span`,{className:`mem-goals-stat-label`,children:e.replace(`_`,` `)})]},e))}),xn.filter(e=>e.status===`pending_approval`).length>0&&r(`div`,{className:`mem-goals-approval-banner`,children:[r(`div`,{className:`mem-goals-approval-title`,children:[a(c,{size:14}),` Agent suggested `,xn.filter(e=>e.status===`pending_approval`).length,` goal(s) — review before execution`]}),xn.filter(e=>e.status===`pending_approval`).map(e=>r(`div`,{className:`mem-goals-approval-item`,children:[r(`div`,{className:`mem-goals-approval-text`,children:[a(`strong`,{children:e.title}),a(`span`,{children:e.description})]}),r(`div`,{className:`mem-goals-approval-actions`,children:[a(`button`,{className:`btn-danger-sm`,onClick:()=>vr(()=>de(e.id),`Couldn't reject the goal`),children:`Reject`}),a(`button`,{className:`btn-secondary`,onClick:()=>vr(()=>Be(e.id),`Couldn't accept the goal`),children:`Accept`})]})]},e.id))]}),a(`div`,{className:`mem-goals-toolbar`,children:r(`button`,{className:`btn-primary`,onClick:()=>Mn(e=>!e),children:[a(ze,{size:14}),` New Goal`]})}),jn&&r(`div`,{className:`mem-goals-add-form`,children:[a(`input`,{className:`mem-input`,placeholder:`Goal title`,value:Nn.title,onChange:e=>Pn(t=>({...t,title:e.target.value}))}),a(`textarea`,{className:`mem-input`,placeholder:`Description — what should the agent work toward?`,rows:2,value:Nn.description,onChange:e=>Pn(t=>({...t,description:e.target.value}))}),r(`div`,{className:`mem-goals-form-row`,children:[r(`select`,{className:`mem-select`,value:Nn.priority,onChange:e=>Pn(t=>({...t,priority:e.target.value})),children:[a(`option`,{value:`low`,children:`Low priority`}),a(`option`,{value:`medium`,children:`Medium priority`}),a(`option`,{value:`high`,children:`High priority`})]}),a(`button`,{className:`btn-primary`,onClick:()=>{Nn.title.trim()&&vr(async()=>{await Le(Nn),Pn({title:``,description:``,priority:`medium`}),Mn(!1)},`Couldn't create the goal`)},children:`Create`}),a(`button`,{className:`btn-secondary`,onClick:()=>Mn(!1),children:`Cancel`})]})]}),Tn?r(`div`,{className:`mem-loading`,children:[a(`div`,{className:`mem-spinner`}),` Loading goals...`]}):xn.filter(e=>e.status!==`pending_approval`&&e.status!==`rejected`).length===0?r(`div`,{className:`mem-empty`,children:[a(`div`,{className:`mem-empty-icon`,children:a(at,{size:32})}),a(`p`,{children:`No goals yet. Create one or let the agent suggest goals in autonomous mode.`})]}):a(`div`,{className:`mem-goals-list`,children:xn.filter(e=>e.status!==`pending_approval`&&e.status!==`rejected`).map(e=>r(`div`,{className:`mem-goal-card mem-goal-status-${e.status.replace(`_`,`-`)}`,children:[r(`div`,{className:`mem-goal-header`,role:`button`,tabIndex:0,"aria-expanded":Dn===e.id,onClick:()=>On(t=>t===e.id?null:e.id),onKeyDown:t=>{t.target===t.currentTarget&&(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),On(t=>t===e.id?null:e.id))},children:[r(`div`,{className:`mem-goal-header-left`,children:[a(`span`,{className:`mem-goal-status-dot status-${e.status.replace(`_`,`-`)}`}),a(`span`,{className:`mem-goal-title`,children:e.title}),a(`span`,{className:`mem-goal-priority mem-priority-${e.priority}`,children:e.priority}),e.source!==`user`&&r(`span`,{className:`mem-goal-source-badge`,children:[a(c,{size:10}),` `,e.source.replace(`_`,` `)]})]}),r(`div`,{className:`mem-goal-header-right`,children:[r(`span`,{className:`mem-goal-task-count`,children:[a(_e,{size:12}),e.tasks.filter(e=>e.status===`completed`).length,`/`,e.tasks.length]}),e.status===`queued`&&a(`button`,{className:`mem-goal-action-btn mem-goal-cancel-btn`,onClick:t=>{t.stopPropagation(),vr(()=>Te(e.id),`Couldn't cancel the goal`)},children:`Cancel`}),kn===e.id?a(`button`,{className:`mem-goal-action-btn mem-goal-delete-btn mem-goal-delete-confirm`,onClick:t=>{t.stopPropagation(),An(null),vr(()=>je(e.id),`Couldn't delete the goal`)},children:`Delete?`}):a(`button`,{className:`mem-goal-action-btn mem-goal-delete-btn`,"aria-label":`Delete goal ${e.title}`,onClick:t=>{t.stopPropagation(),An(e.id)},children:a(oe,{size:12})}),a(Xe,{size:14,className:Dn===e.id?`mem-chevron-open`:``})]})]}),Dn===e.id&&r(`div`,{className:`mem-goal-body`,children:[e.description&&a(`p`,{className:`mem-goal-desc`,children:e.description}),e.progress_notes&&a(`p`,{className:`mem-goal-progress`,children:e.progress_notes}),e.tasks.length>0?a(`div`,{className:`mem-task-list`,children:e.tasks.map(e=>r(`div`,{className:`mem-task-row mem-task-status-${e.status}`,children:[a(`span`,{className:`mem-task-dot status-${e.status}`}),a(`span`,{className:`mem-task-desc`,children:e.description}),a(`span`,{className:`mem-task-status-label`,children:e.status}),e.result&&a(`span`,{className:`mem-task-result`,children:e.result})]},e.id))}):a(`p`,{className:`mem-goal-no-tasks`,children:`No tasks yet — the agent will break this down when it starts.`})]})]},e.id))})]})]}),Ft.length>0&&a(`div`,{className:`mem-toast-container`,"aria-live":`polite`,children:Ft.map(e=>r(`div`,{className:`mem-toast mem-toast-${e.type}`,role:`status`,children:[e.type===`success`&&a(m,{size:14}),e.type===`error`&&a(be,{size:14}),e.type===`info`&&a(Je,{size:14}),a(`span`,{children:e.text})]},e.id))})]})}export{Ct as MemoryDashboard};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.memory-dashboard-page{background:var(--bg-primary);flex-direction:column;height:100%;display:flex;overflow:hidden}.memory-dashboard-header{border-bottom:1px solid var(--border-light);flex-shrink:0;justify-content:space-between;align-items:center;padding:16px 24px;display:flex}.memory-dashboard-header-left{align-items:center;gap:12px;display:flex}.memory-dashboard-header h1{font-size:15px;font-weight:600;font-family:var(--font-sans);color:var(--text-primary)}.memory-dashboard-header-actions{align-items:center;gap:6px;display:flex}.memory-dashboard-body{scrollbar-width:thin;scrollbar-color:var(--border) transparent;flex:1;padding:24px;overflow-y:auto;container-type:inline-size}.memory-dashboard-body::-webkit-scrollbar{width:5px}.memory-dashboard-body::-webkit-scrollbar-track{background:0 0}.memory-dashboard-body::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}.mem-section{margin-bottom:28px}.mem-section:last-child{margin-bottom:0}.mem-section-title{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:2px;color:var(--text-muted);align-items:center;gap:8px;margin-bottom:14px;display:flex}.mem-section-title-row{justify-content:space-between}.mem-section-title-left{align-items:center;gap:8px;display:flex}.mem-section-note{letter-spacing:.5px;text-transform:none;opacity:.8;margin-left:8px;font-weight:400}.mem-section-count{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-full);min-width:20px;height:18px;color:var(--text-muted);letter-spacing:0;font-size:10px;font-weight:700;font-family:var(--font-mono);justify-content:center;align-items:center;padding:0 6px;display:inline-flex}.mem-section-add-btn{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.5px;border-radius:var(--radius-md);border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;transition:all var(--duration) var(--ease);align-items:center;gap:5px;padding:4px 10px;display:inline-flex}.mem-section-add-btn:hover{border-color:var(--accent);color:var(--accent);background:var(--accent-dim)}.mem-range-tabs{border:1px solid var(--border);border-radius:var(--radius-md);display:flex;overflow:hidden}.mem-range-tab{font-size:10px;font-weight:700;font-family:var(--font-mono);letter-spacing:.5px;color:var(--text-muted);cursor:pointer;transition:all var(--duration) var(--ease);background:0 0;border:none;padding:3px 10px}.mem-range-tab+.mem-range-tab{border-left:1px solid var(--border)}.mem-range-tab:hover{color:var(--text-primary);background:var(--bg-hover)}.mem-range-tab.active{background:var(--accent-fill);color:var(--accent-fill-text)}.mem-disabled-banner{background:color-mix(in srgb, var(--accent) 8%, transparent);border:1px solid color-mix(in srgb, var(--accent) 25%, transparent);border-radius:var(--radius-md);color:var(--accent);font-size:12px;font-family:var(--font-sans);align-items:center;gap:10px;margin-bottom:20px;padding:10px 16px;display:flex}.mem-disabled-banner svg{flex-shrink:0}.mem-disabled-banner span{flex:1}.mem-disabled-banner-action{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.5px;border-radius:var(--radius-md);border:1px solid color-mix(in srgb, var(--accent) 40%, transparent);color:var(--accent);cursor:pointer;transition:all var(--duration) var(--ease);background:0 0;flex-shrink:0;padding:4px 12px}.mem-disabled-banner-action:hover{background:color-mix(in srgb, var(--accent) 15%, transparent);border-color:var(--accent)}.mem-stat-cards{grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin-bottom:28px;display:grid}.mem-stat-card{background:var(--bg-secondary);border:1px solid var(--border-light);border-radius:var(--radius-lg);transition:border-color var(--duration) var(--ease), transform var(--duration) var(--ease);padding:18px 20px}.mem-stat-card:hover{border-color:var(--border);transform:translateY(-1px)}.mem-stat-value{font-size:28px;font-weight:700;font-family:var(--font-display);color:var(--text-primary);line-height:1.1}.mem-stat-label{color:var(--text-secondary);font-size:12px;font-weight:500;font-family:var(--font-sans);margin-top:4px}.mem-stat-sub{color:var(--text-muted);font-size:11px;font-family:var(--font-mono);margin-top:2px}.mem-stat-card[data-accent=purple] .mem-stat-value{color:var(--accent-purple)}.mem-stat-card[data-accent=blue] .mem-stat-value{color:var(--accent-blue)}.mem-stat-card[data-accent=green] .mem-stat-value{color:var(--accent-green)}.mem-stat-card[data-accent=red] .mem-stat-value{color:var(--accent)}.mem-stat-card[data-accent=gold] .mem-stat-value{color:var(--accent-yellow)}.mem-activity-chart{background:var(--bg-secondary);border:1px solid var(--border-light);border-radius:var(--radius-lg);align-items:flex-end;gap:2px;height:120px;padding:14px 10px 28px;display:flex;position:relative;overflow:hidden}.mem-activity-bar-group{cursor:default;flex-direction:column;flex:1;justify-content:flex-end;align-items:center;gap:1px;height:100%;display:flex;position:relative}.mem-activity-bar{width:100%;min-height:0;transition:opacity var(--duration-fast) var(--ease);border-radius:2px 2px 0 0}.mem-activity-bar.conversations{background:var(--accent-blue);opacity:.85}.mem-activity-bar.tool_calls{background:var(--accent-green);opacity:.85}.mem-activity-bar.knowledge{background:var(--accent-purple);opacity:.85}.mem-activity-bar.errors{background:var(--danger);opacity:.85}.mem-activity-bar-group:hover .mem-activity-bar{opacity:1}.mem-activity-date-label{color:var(--text-muted);font-size:9px;font-family:var(--font-mono);white-space:nowrap;position:absolute;bottom:-22px}.mem-activity-legend{font-size:11px;font-family:var(--font-mono);color:var(--text-secondary);gap:16px;margin-top:10px;display:flex}.mem-activity-legend-item{align-items:center;gap:5px;display:flex}.mem-activity-legend-dot{border-radius:2px;width:8px;height:8px}.mem-activity-legend-dot.conversations{background:var(--accent-blue)}.mem-activity-legend-dot.tool_calls{background:var(--accent-green)}.mem-activity-legend-dot.knowledge{background:var(--accent-purple)}.mem-activity-legend-dot.errors{background:var(--danger)}.mem-activity-tooltip{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:11px;font-family:var(--font-mono);color:var(--text-primary);white-space:nowrap;pointer-events:none;z-index:10;box-shadow:var(--shadow-md);padding:6px 10px;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%)}.mem-filters{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:12px;display:flex}.mem-filter-select{font-size:12px;font-family:var(--font-mono);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-input);color:var(--text-primary);cursor:pointer;transition:border-color var(--duration) var(--ease);appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%239898b0' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");background-position:right 8px center;background-repeat:no-repeat;outline:none;padding:7px 28px 7px 12px}.mem-filter-select:focus{border-color:var(--accent)}.mem-category-pills{flex-wrap:wrap;align-items:center;gap:5px;display:flex}.mem-category-pill{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.5px;border-radius:var(--radius-full);border:1px solid var(--border);color:var(--text-muted);cursor:pointer;transition:all var(--duration) var(--ease);white-space:nowrap;background:0 0;padding:4px 11px;line-height:1.4}.mem-category-pill:hover{border-color:var(--text-secondary);color:var(--text-primary);background:var(--bg-hover)}.mem-category-pill:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.mem-category-pill.fact.active{background:color-mix(in srgb, var(--accent-blue) 12%, transparent);border-color:var(--accent-blue);color:var(--accent-blue)}.mem-category-pill.preference.active{background:color-mix(in srgb, var(--accent-purple) 12%, transparent);border-color:var(--accent-purple);color:var(--accent-purple)}.mem-category-pill.error.active{background:var(--danger-dim);border-color:var(--danger);color:var(--danger)}.mem-category-pill.skill.active{background:var(--accent-green-dim);border-color:var(--accent-green);color:var(--accent-green)}.mem-category-pill.note.active{background:color-mix(in srgb, var(--accent-yellow) 12%, transparent);border-color:var(--accent-yellow);color:var(--accent-yellow)}.mem-category-pill.reminder.active{background:color-mix(in srgb, var(--accent) 10%, transparent);border-color:var(--accent);color:var(--accent)}.mem-category-pill.clear{border-style:dashed}.mem-category-pill.clear:hover{border-color:var(--danger);color:var(--danger);background:var(--danger-dim);border-style:solid}.mem-filter-search{box-sizing:border-box;width:100%;min-width:180px;font-size:12px;font-family:var(--font-mono);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-input);color:var(--text-primary);transition:border-color var(--duration) var(--ease);outline:none;flex:1;padding:7px 12px 7px 32px}.mem-filter-search:focus{border-color:var(--accent)}.mem-filter-search::placeholder{color:var(--text-muted)}.mem-filter-search-wrap{flex:1;min-width:180px;position:relative}.mem-filter-search-wrap .search-icon{color:var(--text-muted);pointer-events:none;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.mem-knowledge-table{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}.mem-knowledge-table th{text-align:left;font-size:10px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1.5px;color:var(--text-muted);border-bottom:1px solid var(--border);white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;transition:color var(--duration) var(--ease);padding:8px 12px}.mem-knowledge-table th:hover{color:var(--text-primary)}.mem-knowledge-table th.sorted{color:var(--accent)}.mem-sort-arrow{margin-left:4px;font-size:10px}.mem-knowledge-table td{border-bottom:1px solid var(--border-light);vertical-align:top;font-family:var(--font-sans);padding:10px 12px}.mem-knowledge-table tbody tr{transition:background var(--duration-fast) var(--ease)}.mem-knowledge-table tbody tr:hover{background:var(--tint-subtle)}.mem-cat-badge{font-size:10px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.5px;border-radius:var(--radius-full);white-space:nowrap;padding:2px 8px;display:inline-block}.mem-cat-badge.fact{background:color-mix(in srgb, var(--accent-blue) 12%, transparent);color:var(--accent-blue)}.mem-cat-badge.preference{background:color-mix(in srgb, var(--accent-purple) 12%, transparent);color:var(--accent-purple)}.mem-cat-badge.error{background:var(--danger-dim);color:var(--danger)}.mem-cat-badge.skill{background:var(--accent-green-dim);color:var(--accent-green)}.mem-confidence{font-family:var(--font-mono);color:var(--text-secondary);align-items:center;gap:6px;font-size:12px;display:flex}.mem-confidence-bar{background:var(--border);border-radius:var(--radius-full);width:48px;height:4px;overflow:hidden}.mem-confidence-fill{border-radius:var(--radius-full);height:100%;transition:width var(--duration-slow) var(--ease)}.mem-confidence-fill.high{background:var(--accent-green)}.mem-confidence-fill.medium{background:var(--accent-yellow)}.mem-confidence-fill.low{background:var(--text-muted)}.mem-content-cell{text-overflow:ellipsis;white-space:nowrap;max-width:320px;overflow:hidden}.mem-sensitive-blur{filter:blur(4px);cursor:pointer;transition:filter var(--duration) var(--ease);-webkit-user-select:none;user-select:none}.mem-sensitive-blur:hover,.mem-sensitive-blur.revealed{filter:none}.mem-sensitive-badge{align-items:center;gap:3px;margin-right:4px;font-size:11px;display:inline-flex}.mem-entity-link{color:var(--accent-blue);cursor:pointer;font-size:11px;font-family:var(--font-mono);align-items:center;gap:3px;display:inline-flex}.mem-entity-link:hover{text-decoration:underline}.mem-due-badge{font-size:11px;font-family:var(--font-mono);white-space:nowrap}.mem-due-badge.overdue{color:var(--danger)}.mem-due-badge.upcoming{color:var(--accent-yellow)}.mem-due-badge.none{color:var(--text-muted)}.mem-date-cell{font-size:12px;font-family:var(--font-mono);color:var(--text-secondary);white-space:nowrap}.mem-row-actions{opacity:0;transition:opacity var(--duration-fast) var(--ease);gap:2px;display:flex}.mem-knowledge-table tbody tr:hover .mem-row-actions,.mem-knowledge-table tbody tr:focus-within .mem-row-actions{opacity:1}.mem-row-actions:has(.is-confirm){opacity:1}.mem-knowledge-table .mem-actions-cell{background:var(--bg-primary);position:sticky;right:0;box-shadow:-8px 0 8px -8px #00000059}.mem-knowledge-table tbody tr:hover .mem-actions-cell,.mem-knowledge-table .mem-expanded-row .mem-actions-cell{background:color-mix(in srgb, var(--text-primary) 3%, var(--bg-primary))}.mem-row-action-btn{border-radius:var(--radius-sm);width:26px;height:26px;color:var(--text-muted);transition:all var(--duration-fast) var(--ease);justify-content:center;align-items:center;display:flex}.mem-row-action-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.mem-row-action-btn.delete:hover,.mem-row-action-btn.delete.is-confirm{color:var(--danger)}.mem-row-action-btn.is-confirm{width:auto;padding:0 6px}.mem-row-delete-label{font-size:11px;font-weight:600}.mem-pagination{font-size:12px;font-family:var(--font-mono);color:var(--text-muted);justify-content:space-between;align-items:center;margin-top:12px;display:flex}.mem-pagination-btns{gap:4px;display:flex}.mem-page-btn{border:1px solid var(--border);border-radius:var(--radius-sm);font-size:12px;font-family:var(--font-mono);color:var(--text-secondary);transition:all var(--duration) var(--ease);padding:4px 12px}.mem-page-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}.mem-page-btn:disabled{opacity:.3;cursor:not-allowed}.mem-add-btn{border:1px dashed var(--border);border-radius:var(--radius-md);font-size:12px;font-family:var(--font-mono);color:var(--text-secondary);transition:all var(--duration) var(--ease);align-items:center;gap:6px;margin-top:8px;padding:7px 16px;display:inline-flex}.mem-add-btn:hover{border-color:var(--accent);color:var(--accent);border-style:solid}.mem-tool-table{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}.mem-tool-table th{text-align:left;font-size:10px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1.5px;color:var(--text-muted);border-bottom:1px solid var(--border);white-space:nowrap;padding:8px 12px}.mem-tool-table td{border-bottom:1px solid var(--border-light);font-family:var(--font-mono);padding:10px 12px;font-size:12px}.mem-tool-table tbody tr{transition:background var(--duration-fast) var(--ease);cursor:default}.mem-tool-table tbody tr:hover{background:var(--tint-subtle)}.mem-tool-name{color:var(--text-primary);font-weight:500}.mem-success-rate{font-weight:600}.mem-success-rate.high{color:var(--accent-green)}.mem-success-rate.medium{color:var(--accent-yellow)}.mem-success-rate.low{color:var(--danger)}.mem-tool-error{vertical-align:top;text-overflow:ellipsis;white-space:nowrap;max-width:260px;color:var(--text-muted);font-size:11px;display:inline-block;overflow:hidden}.mem-conv-search{margin-bottom:12px;position:relative}.mem-conv-search .search-icon{color:var(--text-muted);pointer-events:none;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.mem-conv-search input{width:100%;font-size:12px;font-family:var(--font-mono);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-input);color:var(--text-primary);transition:border-color var(--duration) var(--ease);outline:none;padding:8px 12px 8px 32px}.mem-conv-search input:focus{border-color:var(--accent)}.mem-conv-search input{padding-right:32px}.mem-search-clear{border-radius:var(--radius-full);background:var(--bg-tertiary);width:20px;height:20px;color:var(--text-muted);cursor:pointer;transition:all var(--duration) var(--ease);border:none;justify-content:center;align-items:center;display:flex;position:absolute;top:50%;right:8px;transform:translateY(-50%)}.mem-search-clear:hover{background:var(--border);color:var(--text-primary)}.mem-delete-confirm{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.mem-delete-confirm-label{color:var(--danger);font-size:12px;font-weight:600;font-family:var(--font-mono);white-space:nowrap}.mem-conv-list{flex-direction:column;gap:4px;display:flex}.mem-conv-item{border:1px solid var(--border-light);border-radius:var(--radius-md);transition:border-color var(--duration) var(--ease), background var(--duration) var(--ease);cursor:pointer;justify-content:space-between;align-items:center;padding:10px 14px;display:flex}.mem-conv-item:hover{border-color:var(--border);background:var(--tint-subtle)}.mem-conv-info{flex:1;min-width:0}.mem-conv-session-id{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:500;overflow:hidden}.mem-conv-preview{color:var(--text-muted);text-overflow:ellipsis;white-space:nowrap;margin-top:2px;font-size:12px;overflow:hidden}.mem-conv-meta{font-size:11px;font-family:var(--font-mono);color:var(--text-muted);flex-shrink:0;gap:12px;margin-left:12px;display:flex}.mem-conv-detail-overlay{background:var(--bg-card);z-index:5;border-radius:var(--radius-xl);flex-direction:column;display:flex;position:absolute;inset:0}.mem-conv-detail-header{border-bottom:1px solid var(--border);flex-shrink:0;justify-content:space-between;align-items:center;padding:14px 20px;display:flex}.mem-conv-detail-header h2{color:var(--text-secondary);font-size:12px}.mem-conv-detail-actions{align-items:center;gap:8px;display:flex}.mem-conv-detail-body{flex:1;padding:16px 20px;overflow-y:auto}.mem-conv-turn{border-bottom:1px solid var(--border-light);padding:8px 0}.mem-conv-turn:last-child{border-bottom:none}.mem-conv-turn-header{justify-content:space-between;align-items:center;margin-bottom:4px;display:flex}.mem-conv-turn-time{color:var(--text-muted);font-size:10px;font-family:var(--font-mono);flex-shrink:0}.mem-conv-turn-role{font-size:10px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1px;margin-bottom:4px}.mem-conv-turn-role.user{color:var(--accent-blue)}.mem-conv-turn-role.assistant{color:var(--accent-green)}.mem-conv-turn-content{color:var(--text-primary);white-space:pre-wrap;word-break:break-word;font-size:13px;line-height:1.6}.mem-temporal-list{flex-direction:column;gap:6px;display:flex}.mem-temporal-item{border:1px solid var(--border-light);border-radius:var(--radius-md);transition:border-color var(--duration) var(--ease);align-items:flex-start;gap:10px;padding:10px 14px;font-size:13px;display:flex}.mem-temporal-item:hover{border-color:var(--border)}.mem-temporal-item.overdue{border-left:3px solid var(--danger)}.mem-temporal-item.upcoming{border-left:3px solid var(--accent-yellow)}.mem-temporal-icon{flex-shrink:0;margin-top:1px;font-size:16px;line-height:1}.mem-temporal-content{flex:1;min-width:0}.mem-temporal-text{font-family:var(--font-sans);color:var(--text-primary)}.mem-temporal-date{font-size:11px;font-family:var(--font-mono);color:var(--text-muted);margin-top:2px}.mem-two-col{grid-template-columns:repeat(2,minmax(0,1fr));gap:24px;display:grid}.mem-two-col>*{min-width:0}@container (width<=860px){.mem-two-col{grid-template-columns:minmax(0,1fr)}}@container (width<=640px){.mem-stat-cards{grid-template-columns:repeat(2,minmax(0,1fr))}}.mem-empty{text-align:center;color:var(--text-muted);font-size:13px;font-family:var(--font-sans);padding:32px 20px}.mem-empty-icon{opacity:.4;margin-bottom:8px;font-size:32px}.mem-loading{color:var(--text-muted);font-size:13px;font-family:var(--font-mono);justify-content:center;align-items:center;gap:10px;padding:40px;display:flex}.mem-spinner{border:2px solid var(--border);border-top-color:var(--accent);width:18px;height:18px;animation:spin var(--duration-spin) var(--ease-linear) infinite;border-radius:50%}.mem-inline-form{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-lg);flex-direction:column;gap:10px;margin-bottom:12px;padding:16px;display:flex}.mem-inline-form-row{align-items:center;gap:8px;display:flex}.mem-inline-form-row label{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1px;color:var(--text-muted);flex-shrink:0;width:80px}.mem-inline-form-row input,.mem-inline-form-row select,.mem-inline-form-row textarea{font-size:12px;font-family:var(--font-mono);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-input);color:var(--text-primary);transition:border-color var(--duration) var(--ease);outline:none;flex:1;padding:7px 12px}.mem-inline-form-row input:focus,.mem-inline-form-row select:focus,.mem-inline-form-row textarea:focus{border-color:var(--accent)}.mem-inline-form-row textarea{resize:vertical;min-height:60px}.mem-inline-form-actions{justify-content:flex-end;gap:8px;display:flex}.mem-expanded-row{background:var(--tint-subtle)!important}.mem-detail-row td{border-bottom:1px solid var(--border)!important;padding:0!important}.mem-detail-panel{background:var(--bg-secondary);border-top:1px solid var(--border-light);animation:detailExpand var(--duration) var(--ease);padding:14px 20px 16px}@keyframes detailExpand{0%{opacity:0;max-height:0}to{opacity:1;max-height:500px}}.mem-detail-grid{grid-template-columns:repeat(4,1fr);gap:10px 20px;margin-bottom:10px;display:grid}.mem-detail-field{flex-direction:column;gap:2px;display:flex}.mem-detail-field.mem-detail-full{grid-column:1/-1}.mem-detail-label{font-size:10px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1px;color:var(--text-muted)}.mem-detail-value{font-size:12px;font-family:var(--font-mono);color:var(--text-primary);word-break:break-all}.mem-detail-chain{color:var(--accent-blue)}.mem-detail-content-full{border-top:1px solid var(--border-light);margin-top:8px;padding-top:8px}.mem-detail-content-text{font-size:13px;font-family:var(--font-sans);color:var(--text-primary);white-space:pre-wrap;word-break:break-word;max-height:200px;margin-top:4px;line-height:1.6;overflow-y:auto}.mem-embedding-coverage{align-items:center;gap:8px;padding:0 8px;display:flex}.mem-embedding-bar{background:var(--border);border-radius:var(--radius-full);width:60px;height:5px;overflow:hidden}.mem-embedding-fill{background:var(--accent-green);border-radius:var(--radius-full);height:100%;transition:width var(--duration-slow) var(--ease)}.mem-embedding-label{font-size:11px;font-family:var(--font-mono);color:var(--text-secondary);white-space:nowrap}.mem-maintenance-wrap{position:relative}.mem-maintenance-wrap .btn-icon{align-items:center;gap:0;display:flex}.mem-maintenance-menu{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-lg);min-width:220px;box-shadow:var(--shadow-lg);z-index:20;animation:modalPanelIn var(--duration-fast) var(--ease);padding:4px;position:absolute;top:calc(100% + 6px);right:0}.mem-maintenance-item{width:100%;font-size:12px;font-family:var(--font-mono);color:var(--text-primary);border-radius:var(--radius-md);transition:background var(--duration-fast) var(--ease);text-align:left;align-items:center;gap:10px;padding:9px 14px;display:flex}.mem-maintenance-item:hover:not(:disabled){background:var(--tint-subtle)}.mem-maintenance-item:disabled{opacity:.5;cursor:not-allowed}.mem-maintenance-divider{background:var(--border-light);height:1px;margin:4px 8px}.mem-spinner-sm{border:2px solid var(--border);border-top-color:var(--accent);width:14px;height:14px;animation:spin var(--duration-spin) var(--ease-linear) infinite;border-radius:50%}.mem-embed-dot{vertical-align:middle;align-items:center;margin-right:5px;display:inline-flex}.mem-embed-dot.embedded{color:var(--accent-green)}.mem-embed-dot.missing{color:var(--danger);opacity:.6}.mem-superseded-row{opacity:.55}.mem-superseded-text{color:var(--text-muted);text-decoration:line-through}.mem-filter-toggle{font-size:11px;font-family:var(--font-mono);color:var(--text-secondary);cursor:pointer;white-space:nowrap;border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--duration) var(--ease);align-items:center;gap:5px;padding:7px 10px;display:flex}.mem-filter-toggle:hover{border-color:var(--border)}.mem-filter-toggle input{cursor:pointer;margin:0}.mem-consolidated-badge{color:var(--accent-green);opacity:.7;vertical-align:middle;align-items:center;margin-left:6px;display:inline-flex}.mem-cat-badge.note{background:color-mix(in srgb, var(--accent-yellow) 12%, transparent);color:var(--accent-yellow)}.mem-cat-badge.reminder{background:color-mix(in srgb, var(--danger) 12%, transparent);color:var(--danger)}.mem-toast-container{z-index:200;pointer-events:none;flex-direction:column;gap:8px;display:flex;position:fixed;bottom:24px;right:24px}.mem-toast{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);font-size:12px;font-family:var(--font-mono);color:var(--text-primary);animation:toastIn var(--duration) var(--ease);pointer-events:auto;align-items:center;gap:8px;padding:10px 18px;display:flex}.mem-toast-success{border-left:3px solid var(--accent-green)}.mem-toast-error{border-left:3px solid var(--danger)}.mem-toast-info{border-left:3px solid var(--accent-blue)}@keyframes toastIn{0%{opacity:0;transform:translateY(10px)scale(.96)}to{opacity:1;transform:none}}.mem-settings-row{justify-content:space-between;align-items:center;gap:16px;padding:10px 0;display:flex}.mem-settings-label{color:var(--text-primary);flex-direction:column;gap:3px;font-size:13px;display:flex}.mem-settings-hint{color:var(--text-muted);max-width:480px;font-size:11px}.mem-toggle{background:var(--border);cursor:pointer;width:40px;height:22px;transition:background var(--duration) var(--ease);border:none;border-radius:11px;flex-shrink:0;padding:0;position:relative}.mem-toggle:disabled{opacity:.5;cursor:not-allowed}.mem-toggle-on{background:var(--accent-green)}.mem-toggle-knob{background:var(--switch-knob);width:16px;height:16px;transition:transform var(--duration) var(--ease);border-radius:50%;position:absolute;top:3px;left:3px}.mem-toggle-on .mem-toggle-knob{transform:translate(18px)}.mem-setting-row{border-bottom:1px solid var(--border-light);justify-content:space-between;align-items:center;gap:16px;padding:10px 0;display:flex}.mem-setting-row:last-child{border-bottom:none}.mem-setting-info{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.mem-setting-label{color:var(--text-primary);font-size:12px;font-weight:600}.mem-setting-desc{color:var(--text-muted);font-size:11px;line-height:1.4}.mem-setting-row-danger .mem-setting-label{color:var(--danger)}.mem-btn-danger{border:1px solid var(--danger);color:var(--danger);cursor:pointer;transition:background var(--duration) var(--ease), color var(--duration) var(--ease);white-space:nowrap;background:0 0;border-radius:6px;flex-shrink:0;padding:5px 12px;font-size:11px;font-weight:600}.mem-btn-danger:hover:not(:disabled){background:var(--danger);color:var(--text-inverse)}.mem-btn-danger:disabled{opacity:.5;cursor:not-allowed}.mem-db-footer{border-top:1px solid var(--border-light);font-size:11px;font-family:var(--font-mono);color:var(--text-muted);justify-content:space-between;align-items:center;margin-top:20px;padding-top:14px;display:flex}.mem-tab-bar{border-bottom:1px solid var(--border);background:var(--bg-card);flex-shrink:0;gap:0;padding:0 24px;display:flex}.mem-tab-btn{font-size:12px;font-weight:500;font-family:var(--font-mono);letter-spacing:.5px;color:var(--text-muted);cursor:pointer;transition:color var(--duration) var(--ease), border-color var(--duration) var(--ease);background:0 0;border:none;border-bottom:2px solid #0000;align-items:center;gap:6px;margin-bottom:-1px;padding:10px 18px;display:flex}.mem-tab-btn:hover{color:var(--text-secondary)}.mem-tab-active{color:var(--text-primary);border-bottom-color:var(--accent)}.mem-profile-grid{grid-template-columns:1fr 1fr;gap:20px;display:grid}.mem-profile-card{background:var(--bg-secondary);border:1px solid var(--border-light);border-radius:var(--radius-lg);flex-direction:column;gap:10px;padding:20px;display:flex}.mem-profile-card-title{font-size:13px;font-weight:600;font-family:var(--font-mono);color:var(--text-primary);align-items:center;gap:8px;display:flex}.mem-profile-desc{color:var(--text-secondary);margin:0;font-size:12px;line-height:1.5}.mem-profile-note{color:var(--text-muted);margin:0;font-size:11px;font-style:italic}.mem-profile-checkbox{font-size:12px;font-family:var(--font-mono);color:var(--text-secondary);cursor:pointer;align-items:center;gap:6px;display:flex}.mem-profile-checkbox input{cursor:pointer;margin:0}.mem-profile-run-btn{align-self:flex-start;align-items:center;gap:6px;padding:8px 18px;font-size:12px;display:flex}.mem-log{background:var(--bg-code);border:1px solid var(--border-code);border-radius:var(--radius-md);max-height:200px;font-family:var(--font-mono);scrollbar-width:thin;scrollbar-color:var(--border-code) transparent;padding:8px;font-size:12px;line-height:1.6;overflow-y:auto}.mem-log::-webkit-scrollbar{width:4px}.mem-log::-webkit-scrollbar-track{background:0 0}.mem-log::-webkit-scrollbar-thumb{background:var(--border-code);border-radius:2px}.mem-log-line{white-space:pre-wrap;word-break:break-word;color:var(--text-code)}.mem-log-line.finding{color:var(--code-warning)}.mem-log-line.error{color:var(--code-danger)}.mem-review-section{flex-direction:column;gap:8px;display:flex}.mem-review-header{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1.5px;color:var(--text-muted)}.mem-review-list{scrollbar-width:thin;scrollbar-color:var(--border) transparent;flex-direction:column;gap:4px;max-height:240px;display:flex;overflow-y:auto}.mem-review-list::-webkit-scrollbar{width:4px}.mem-review-list::-webkit-scrollbar-track{background:0 0}.mem-review-list::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}.mem-review-item{background:var(--bg-card);border:1px solid var(--border-light);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--duration) var(--ease);align-items:center;gap:8px;padding:6px 8px;display:flex}.mem-review-item:hover{border-color:var(--border)}.mem-review-item input{cursor:pointer;flex-shrink:0;margin:0}.mem-review-content{min-width:0;color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:12px;overflow:hidden}.mem-conf-badge{font-size:10px;font-family:var(--font-mono);border-radius:var(--radius-sm);background:color-mix(in srgb, var(--text-muted) 12%, transparent);color:var(--text-muted);flex-shrink:0;padding:2px 6px}.mem-source-badge{font-size:10px;font-family:var(--font-mono);border-radius:var(--radius-sm);background:color-mix(in srgb, var(--text-muted) 12%, transparent);color:var(--text-secondary);flex-shrink:0;padding:2px 6px}.mem-domain-badge{font-size:10px;font-family:var(--font-mono);border-radius:var(--radius-sm);flex-shrink:0;padding:2px 8px;font-weight:600}.mem-domain-badge.blue{background:color-mix(in srgb, var(--accent-blue) 15%, transparent);color:var(--accent-blue)}.mem-domain-badge.purple{background:color-mix(in srgb, var(--accent-purple) 15%, transparent);color:var(--accent-purple)}.mem-domain-badge.green{background:color-mix(in srgb, var(--accent-green) 15%, transparent);color:var(--accent-green)}.mem-domain-badge.gray{background:color-mix(in srgb, var(--text-muted) 12%, transparent);color:var(--text-muted)}.mem-review-actions{align-items:center;gap:12px;margin-top:4px;display:flex}.mem-review-actions .btn-primary{align-items:center;gap:6px;padding:7px 16px;font-size:12px;display:flex}.mem-review-select-links{font-size:11px;font-family:var(--font-mono);color:var(--text-muted)}.mem-link-btn{font:inherit;color:var(--accent-blue);cursor:pointer;background:0 0;border:none;padding:0}.mem-link-btn:hover,.mem-link-btn:focus-visible{text-decoration:underline}.mem-profile-success{background:color-mix(in srgb, var(--accent-green) 10%, transparent);border:1px solid color-mix(in srgb, var(--accent-green) 25%, transparent);border-radius:var(--radius-md);font-size:12px;font-family:var(--font-mono);color:var(--accent-green);align-items:center;gap:6px;padding:8px 12px;display:flex}.mem-profile-empty{text-align:center;color:var(--text-muted);font-size:12px;font-family:var(--font-mono);padding:12px}@media (width<=768px){.memory-dashboard-header{padding-left:var(--sidebar-toggle-clearance)}}@media (width<=900px){.mem-stat-cards{grid-template-columns:repeat(2,1fr)}.mem-two-col{grid-template-columns:1fr}.mem-embedding-coverage{display:none}.mem-detail-grid{grid-template-columns:repeat(2,1fr)}.mem-profile-grid{grid-template-columns:1fr}}@media (width<=600px){.mem-stat-cards{grid-template-columns:1fr}.memory-dashboard-page{height:100%}.mem-knowledge-table{font-size:12px}.mem-filters{flex-direction:column}.mem-toast-container{bottom:12px;left:12px;right:12px}}.mem-goals-tab{flex-direction:column;gap:14px;padding:16px;display:flex}.mem-goals-stats-row{flex-wrap:wrap;gap:10px;display:flex}.mem-goals-stat-pill{background:var(--bg-hover);border:1px solid var(--border);border-radius:20px;align-items:center;gap:6px;padding:5px 12px;font-size:12px;font-weight:500;display:flex}.mem-goals-stat-n{font-size:16px;font-weight:700}.mem-goals-stat-label{opacity:.7;text-transform:capitalize}.mem-goal-status-queued{border-color:var(--accent-blue)!important}.mem-goal-status-in-progress{border-color:var(--accent-yellow)!important}.mem-goal-status-completed{border-color:var(--accent-green)!important}.mem-goal-status-failed{border-color:var(--danger)!important}.mem-goal-status-cancelled{opacity:.6;border-color:var(--border)!important}.mem-goals-approval-banner{background:color-mix(in srgb, var(--accent-yellow) 10%, transparent);border:1px solid color-mix(in srgb, var(--accent-yellow) 40%, transparent);border-radius:var(--radius-lg);flex-direction:column;gap:10px;padding:12px 14px;display:flex}.mem-goals-approval-title{opacity:.85;align-items:center;gap:6px;font-size:12px;font-weight:600;display:flex}.mem-goals-approval-item{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-md);justify-content:space-between;align-items:flex-start;gap:12px;padding:8px 10px;display:flex}.mem-goals-approval-text{flex-direction:column;gap:3px;font-size:13px;display:flex}.mem-goals-approval-text strong{font-weight:600}.mem-goals-approval-text span{opacity:.7;font-size:12px}.mem-goals-approval-actions{flex-shrink:0;gap:6px;display:flex}.btn-danger-sm{border-radius:var(--radius-md);background:color-mix(in srgb, var(--danger) 15%, transparent);border:1px solid color-mix(in srgb, var(--danger) 40%, transparent);color:var(--text-primary);cursor:pointer;padding:4px 10px;font-size:12px}.btn-danger-sm:hover{background:color-mix(in srgb, var(--danger) 25%, transparent)}.mem-goals-toolbar{gap:8px;display:flex}.mem-goals-add-form{background:var(--bg-hover);border:1px solid var(--border);border-radius:var(--radius-lg);flex-direction:column;gap:8px;padding:12px;display:flex}.mem-goals-form-row{align-items:center;gap:8px;display:flex}.mem-select{border-radius:var(--radius-md);background:var(--bg-card);border:1px solid var(--border);color:var(--text-primary);cursor:pointer;padding:6px 10px;font-size:13px}.mem-goals-list{flex-direction:column;gap:8px;display:flex}.mem-goal-card{border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-card);transition:border-color var(--duration-fast) var(--ease);overflow:hidden}.mem-goal-header{cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;gap:8px;padding:10px 14px;display:flex}.mem-goal-header:hover{background:var(--bg-hover)}.mem-goal-header-left{flex:1;align-items:center;gap:8px;min-width:0;display:flex}.mem-goal-header-right{flex-shrink:0;align-items:center;gap:8px;display:flex}.mem-goal-status-dot{background:var(--text-muted);border-radius:50%;flex-shrink:0;width:8px;height:8px}.mem-goal-status-dot.status-queued{background:var(--accent-blue)}.mem-goal-status-dot.status-in-progress{background:var(--accent-yellow)}.mem-goal-status-dot.status-completed{background:var(--accent-green)}.mem-goal-status-dot.status-failed{background:var(--danger)}.mem-goal-title{white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:600;overflow:hidden}.mem-goal-priority{border-radius:10px;flex-shrink:0;padding:1px 6px;font-size:11px;font-weight:500}.mem-priority-high{background:color-mix(in srgb, var(--danger) 15%, transparent)}.mem-priority-medium{background:color-mix(in srgb, var(--accent-yellow) 15%, transparent)}.mem-priority-low{background:color-mix(in srgb, var(--accent-blue) 15%, transparent)}.mem-goal-source-badge{background:color-mix(in srgb, var(--accent-purple) 15%, transparent);border-radius:10px;flex-shrink:0;align-items:center;gap:3px;padding:1px 6px;font-size:10px;display:flex}.mem-goal-task-count{opacity:.6;align-items:center;gap:4px;font-size:12px;display:flex}.mem-goal-action-btn{border-radius:var(--radius-md);background:var(--bg-hover);border:1px solid var(--border);color:var(--text-primary);cursor:pointer;align-items:center;gap:4px;padding:3px 8px;font-size:11px;display:flex}.mem-goal-action-btn:hover{background:var(--bg-active)}.mem-goal-delete-btn:hover{background:color-mix(in srgb, var(--danger) 15%, transparent);border-color:color-mix(in srgb, var(--danger) 40%, transparent)}.mem-chevron-open{transition:transform var(--duration-fast) var(--ease);transform:rotate(180deg)}.mem-goal-body{border-top:1px solid var(--border);flex-direction:column;gap:8px;padding:0 14px 12px;display:flex}.mem-goal-desc{opacity:.7;margin:8px 0 0;font-size:12px}.mem-goal-progress{background:var(--bg-hover);border-radius:var(--radius-md);opacity:.8;padding:6px 8px;font-size:12px}.mem-goal-no-tasks{opacity:.5;font-size:12px;font-style:italic}.mem-task-list{flex-direction:column;gap:4px;margin-top:4px;display:flex}.mem-task-row{border-radius:var(--radius-md);align-items:flex-start;gap:8px;padding:5px 8px;font-size:12px;display:flex}.mem-task-row:hover{background:var(--bg-hover)}.mem-task-dot{background:var(--text-muted);border-radius:50%;flex-shrink:0;width:7px;height:7px;margin-top:3px}.mem-task-dot.status-in-progress{background:var(--accent-yellow)}.mem-task-dot.status-completed{background:var(--accent-green)}.mem-task-dot.status-failed{background:var(--danger)}.mem-task-dot.status-blocked{background:var(--accent-purple)}.mem-task-desc{flex:1}.mem-task-status-label{opacity:.5;text-transform:capitalize;flex-shrink:0;font-size:10px}.mem-task-result{opacity:.6;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0;max-width:200px;font-size:11px;overflow:hidden}.mem-tab-badge{background:var(--accent-yellow);min-width:16px;height:16px;color:var(--text-inverse);border-radius:8px;justify-content:center;align-items:center;margin-left:2px;padding:0 4px;font-size:10px;font-weight:700;display:inline-flex}.mem-goal-header:focus-visible{outline:2px solid var(--accent-blue);outline-offset:-2px}.mem-goal-delete-confirm{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 40%, transparent)}.mem-advanced-error{border-radius:var(--radius-md);border:1px solid color-mix(in srgb, var(--danger) 40%, transparent);background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--text-primary);align-items:center;gap:8px;margin-bottom:16px;padding:10px 14px;font-size:13px;display:flex}.mem-about{max-width:760px;margin:0 auto}.mem-about-title{color:var(--text-primary);margin:4px 0 6px;font-size:20px;font-weight:600}.mem-about-intro{color:var(--text-secondary);margin:0 0 18px;font-size:14px}.mem-about-add{gap:8px;margin-bottom:20px;display:flex}.mem-about-add .mem-input{flex:1;min-width:0}.mem-about-group{margin-bottom:22px}.mem-about-group-title{text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted);margin:0 0 8px;font-size:12px;font-weight:600}.mem-about-list{border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-secondary);margin:0;padding:0;list-style:none}.mem-about-item{align-items:flex-start;gap:12px;padding:12px 14px;display:flex}.mem-about-item+.mem-about-item{border-top:1px solid var(--border)}.mem-about-text{min-width:0;color:var(--text-primary);overflow-wrap:anywhere;flex:1;font-size:14px;line-height:1.45}.mem-about-meta{color:var(--text-muted);margin-top:2px;font-size:12px;display:block}.mem-about-due{color:var(--text-secondary);margin-top:2px;font-size:12px;font-weight:500;display:block}.mem-about-due.is-overdue{color:var(--danger)}.mem-about-actions{flex-shrink:0;gap:6px;display:flex}.mem-about-btn{border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text-secondary);cursor:pointer;background:0 0;align-items:center;gap:4px;padding:4px 8px;font-size:12px;display:inline-flex}.mem-about-btn:hover,.mem-about-btn:focus-visible{color:var(--text-primary);background:var(--bg-hover)}.mem-about-btn-remove:hover,.mem-about-btn-remove:focus-visible{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 40%, transparent)}.mem-about-edit{flex-direction:column;flex:1;gap:8px;display:flex}.mem-about-edit-actions{gap:8px;display:flex}.mem-about-forgotten{border-radius:var(--radius-md);background:var(--bg-tertiary);color:var(--text-secondary);justify-content:space-between;align-items:center;gap:12px;margin-bottom:10px;padding:8px 12px;font-size:13px;display:flex}.mem-about-link{font:inherit;color:var(--accent-blue);cursor:pointer;white-space:nowrap;background:0 0;border:none;align-items:center;gap:4px;padding:0;display:inline-flex}.mem-about-link:hover,.mem-about-link:focus-visible{text-decoration:underline}.mem-about-empty{text-align:center;color:var(--text-secondary);padding:32px 16px;font-size:14px}.mem-about-hint{color:var(--text-muted);font-size:13px}@media (width<=600px){.mem-about-add{flex-wrap:wrap}.mem-about-add .mem-input{flex-basis:100%}.mem-about-add .mem-select{flex:1}.mem-about-item{flex-direction:column}.mem-tab-bar{padding:0 12px;overflow-x:auto}.mem-tab-btn{white-space:nowrap;flex-shrink:0;padding:10px 12px}}
|
|
1
|
+
.memory-dashboard-page{background:var(--bg-primary);flex-direction:column;height:100%;display:flex;overflow:hidden}.memory-dashboard-header{border-bottom:1px solid var(--border-light);flex-shrink:0;justify-content:space-between;align-items:center;padding:16px 24px;display:flex}.memory-dashboard-header-left{align-items:center;gap:12px;display:flex}.memory-dashboard-header h1{font-size:15px;font-weight:600;font-family:var(--font-sans);color:var(--text-primary)}.memory-dashboard-header-actions{align-items:center;gap:6px;display:flex}.memory-dashboard-body{scrollbar-width:thin;scrollbar-color:var(--border) transparent;flex:1;padding:24px;overflow-y:auto;container-type:inline-size}.memory-dashboard-body::-webkit-scrollbar{width:5px}.memory-dashboard-body::-webkit-scrollbar-track{background:0 0}.memory-dashboard-body::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-full)}.mem-section{margin-bottom:28px}.mem-section:last-child{margin-bottom:0}.mem-section-title{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:2px;color:var(--text-muted);align-items:center;gap:8px;margin-bottom:14px;display:flex}.mem-section-title-row{justify-content:space-between}.mem-section-title-left{align-items:center;gap:8px;display:flex}.mem-section-note{letter-spacing:.5px;text-transform:none;opacity:.8;margin-left:8px;font-weight:400}.mem-section-count{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-full);min-width:20px;height:18px;color:var(--text-muted);letter-spacing:0;font-size:10px;font-weight:700;font-family:var(--font-mono);justify-content:center;align-items:center;padding:0 6px;display:inline-flex}.mem-section-add-btn{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.5px;border-radius:var(--radius-md);border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;transition:all var(--duration) var(--ease);align-items:center;gap:5px;padding:4px 10px;display:inline-flex}.mem-section-add-btn:hover{border-color:var(--accent);color:var(--accent);background:var(--accent-dim)}.mem-range-tabs{border:1px solid var(--border);border-radius:var(--radius-md);display:flex;overflow:hidden}.mem-range-tab{font-size:10px;font-weight:700;font-family:var(--font-mono);letter-spacing:.5px;color:var(--text-muted);cursor:pointer;transition:all var(--duration) var(--ease);background:0 0;border:none;padding:3px 10px}.mem-range-tab+.mem-range-tab{border-left:1px solid var(--border)}.mem-range-tab:hover{color:var(--text-primary);background:var(--bg-hover)}.mem-range-tab.active{background:var(--accent-fill);color:var(--accent-fill-text)}.mem-disabled-banner{background:color-mix(in srgb, var(--accent) 8%, transparent);border:1px solid color-mix(in srgb, var(--accent) 25%, transparent);border-radius:var(--radius-md);color:var(--accent);font-size:12px;font-family:var(--font-sans);align-items:center;gap:10px;margin-bottom:20px;padding:10px 16px;display:flex}.mem-disabled-banner svg{flex-shrink:0}.mem-disabled-banner span{flex:1}.mem-disabled-banner-action{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.5px;border-radius:var(--radius-md);border:1px solid color-mix(in srgb, var(--accent) 40%, transparent);color:var(--accent);cursor:pointer;transition:all var(--duration) var(--ease);background:0 0;flex-shrink:0;padding:4px 12px}.mem-disabled-banner-action:hover{background:color-mix(in srgb, var(--accent) 15%, transparent);border-color:var(--accent)}.mem-stat-cards{grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin-bottom:28px;display:grid}.mem-stat-card{background:var(--bg-secondary);border:1px solid var(--border-light);border-radius:var(--radius-lg);transition:border-color var(--duration) var(--ease), transform var(--duration) var(--ease);padding:18px 20px}.mem-stat-card:hover{border-color:var(--border);transform:translateY(-1px)}.mem-stat-value{font-size:28px;font-weight:700;font-family:var(--font-display);color:var(--text-primary);line-height:1.1}.mem-stat-label{color:var(--text-secondary);font-size:12px;font-weight:500;font-family:var(--font-sans);margin-top:4px}.mem-stat-sub{color:var(--text-muted);font-size:11px;font-family:var(--font-mono);margin-top:2px}.mem-stat-card[data-accent=purple] .mem-stat-value{color:var(--accent-purple)}.mem-stat-card[data-accent=blue] .mem-stat-value{color:var(--accent-blue)}.mem-stat-card[data-accent=green] .mem-stat-value{color:var(--accent-green)}.mem-stat-card[data-accent=red] .mem-stat-value{color:var(--accent)}.mem-stat-card[data-accent=gold] .mem-stat-value{color:var(--accent-yellow)}.mem-activity-chart{background:var(--bg-secondary);border:1px solid var(--border-light);border-radius:var(--radius-lg);align-items:flex-end;gap:2px;height:120px;padding:14px 10px 28px;display:flex;position:relative;overflow:hidden}.mem-activity-bar-group{cursor:default;flex-direction:column;flex:1;justify-content:flex-end;align-items:center;gap:1px;height:100%;display:flex;position:relative}.mem-activity-bar{width:100%;min-height:0;transition:opacity var(--duration-fast) var(--ease);border-radius:2px 2px 0 0}.mem-activity-bar.conversations{background:var(--accent-blue);opacity:.85}.mem-activity-bar.tool_calls{background:var(--accent-green);opacity:.85}.mem-activity-bar.knowledge{background:var(--accent-purple);opacity:.85}.mem-activity-bar.errors{background:var(--danger);opacity:.85}.mem-activity-bar-group:hover .mem-activity-bar{opacity:1}.mem-activity-date-label{color:var(--text-muted);font-size:9px;font-family:var(--font-mono);white-space:nowrap;position:absolute;bottom:-22px}.mem-activity-legend{font-size:11px;font-family:var(--font-mono);color:var(--text-secondary);gap:16px;margin-top:10px;display:flex}.mem-activity-legend-item{align-items:center;gap:5px;display:flex}.mem-activity-legend-dot{border-radius:2px;width:8px;height:8px}.mem-activity-legend-dot.conversations{background:var(--accent-blue)}.mem-activity-legend-dot.tool_calls{background:var(--accent-green)}.mem-activity-legend-dot.knowledge{background:var(--accent-purple)}.mem-activity-legend-dot.errors{background:var(--danger)}.mem-activity-tooltip{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:11px;font-family:var(--font-mono);color:var(--text-primary);white-space:nowrap;pointer-events:none;z-index:10;box-shadow:var(--shadow-md);padding:6px 10px;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%)}.mem-filters{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:12px;display:flex}.mem-filter-select{font-size:12px;font-family:var(--font-mono);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-input);color:var(--text-primary);cursor:pointer;transition:border-color var(--duration) var(--ease);appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%239898b0' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");background-position:right 8px center;background-repeat:no-repeat;outline:none;padding:7px 28px 7px 12px}.mem-filter-select:focus{border-color:var(--accent)}.mem-category-pills{flex-wrap:wrap;align-items:center;gap:5px;display:flex}.mem-category-pill{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.5px;border-radius:var(--radius-full);border:1px solid var(--border);color:var(--text-muted);cursor:pointer;transition:all var(--duration) var(--ease);white-space:nowrap;background:0 0;padding:4px 11px;line-height:1.4}.mem-category-pill:hover{border-color:var(--text-secondary);color:var(--text-primary);background:var(--bg-hover)}.mem-category-pill:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.mem-category-pill.fact.active{background:color-mix(in srgb, var(--accent-blue) 12%, transparent);border-color:var(--accent-blue);color:var(--accent-blue)}.mem-category-pill.preference.active{background:color-mix(in srgb, var(--accent-purple) 12%, transparent);border-color:var(--accent-purple);color:var(--accent-purple)}.mem-category-pill.error.active{background:var(--danger-dim);border-color:var(--danger);color:var(--danger)}.mem-category-pill.skill.active{background:var(--accent-green-dim);border-color:var(--accent-green);color:var(--accent-green)}.mem-category-pill.note.active{background:color-mix(in srgb, var(--accent-yellow) 12%, transparent);border-color:var(--accent-yellow);color:var(--accent-yellow)}.mem-category-pill.reminder.active{background:color-mix(in srgb, var(--accent) 10%, transparent);border-color:var(--accent);color:var(--accent)}.mem-category-pill.clear{border-style:dashed}.mem-category-pill.clear:hover{border-color:var(--danger);color:var(--danger);background:var(--danger-dim);border-style:solid}.mem-filter-search{box-sizing:border-box;width:100%;min-width:180px;font-size:12px;font-family:var(--font-mono);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-input);color:var(--text-primary);transition:border-color var(--duration) var(--ease);outline:none;flex:1;padding:7px 12px 7px 32px}.mem-filter-search:focus{border-color:var(--accent)}.mem-filter-search::placeholder{color:var(--text-muted)}.mem-filter-search-wrap{flex:1;min-width:180px;position:relative}.mem-filter-search-wrap .search-icon{color:var(--text-muted);pointer-events:none;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.mem-knowledge-table{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}.mem-knowledge-table th{text-align:left;font-size:10px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1.5px;color:var(--text-muted);border-bottom:1px solid var(--border);white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;transition:color var(--duration) var(--ease);padding:8px 12px}.mem-knowledge-table th:hover{color:var(--text-primary)}.mem-knowledge-table th.sorted{color:var(--accent)}.mem-sort-arrow{margin-left:4px;font-size:10px}.mem-knowledge-table td{border-bottom:1px solid var(--border-light);vertical-align:top;font-family:var(--font-sans);padding:10px 12px}.mem-knowledge-table tbody tr{transition:background var(--duration-fast) var(--ease)}.mem-knowledge-table tbody tr:hover{background:var(--tint-subtle)}.mem-cat-badge{font-size:10px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.5px;border-radius:var(--radius-full);white-space:nowrap;padding:2px 8px;display:inline-block}.mem-cat-badge.fact{background:color-mix(in srgb, var(--accent-blue) 12%, transparent);color:var(--accent-blue)}.mem-cat-badge.preference{background:color-mix(in srgb, var(--accent-purple) 12%, transparent);color:var(--accent-purple)}.mem-cat-badge.error{background:var(--danger-dim);color:var(--danger)}.mem-cat-badge.skill{background:var(--accent-green-dim);color:var(--accent-green)}.mem-confidence{font-family:var(--font-mono);color:var(--text-secondary);align-items:center;gap:6px;font-size:12px;display:flex}.mem-confidence-bar{background:var(--border);border-radius:var(--radius-full);width:48px;height:4px;overflow:hidden}.mem-confidence-fill{border-radius:var(--radius-full);height:100%;transition:width var(--duration-slow) var(--ease)}.mem-confidence-fill.high{background:var(--accent-green)}.mem-confidence-fill.medium{background:var(--accent-yellow)}.mem-confidence-fill.low{background:var(--text-muted)}.mem-content-cell{text-overflow:ellipsis;white-space:nowrap;max-width:320px;overflow:hidden}.mem-sensitive-blur{filter:blur(4px);cursor:pointer;transition:filter var(--duration) var(--ease);-webkit-user-select:none;user-select:none}.mem-sensitive-blur:hover,.mem-sensitive-blur.revealed{filter:none}.mem-sensitive-badge{align-items:center;gap:3px;margin-right:4px;font-size:11px;display:inline-flex}.mem-entity-link{color:var(--accent-blue);cursor:pointer;font-size:11px;font-family:var(--font-mono);align-items:center;gap:3px;display:inline-flex}.mem-entity-link:hover{text-decoration:underline}.mem-due-badge{font-size:11px;font-family:var(--font-mono);white-space:nowrap}.mem-due-badge.overdue{color:var(--danger)}.mem-due-badge.upcoming{color:var(--accent-yellow)}.mem-due-badge.none{color:var(--text-muted)}.mem-date-cell{font-size:12px;font-family:var(--font-mono);color:var(--text-secondary);white-space:nowrap}.mem-row-actions{opacity:0;transition:opacity var(--duration-fast) var(--ease);gap:2px;display:flex}.mem-knowledge-table tbody tr:hover .mem-row-actions,.mem-knowledge-table tbody tr:focus-within .mem-row-actions{opacity:1}.mem-row-actions:has(.is-confirm){opacity:1}.mem-knowledge-table .mem-actions-cell{background:var(--bg-primary);position:sticky;right:0;box-shadow:-8px 0 8px -8px #00000059}.mem-knowledge-table tbody tr:hover .mem-actions-cell,.mem-knowledge-table .mem-expanded-row .mem-actions-cell{background:color-mix(in srgb, var(--text-primary) 3%, var(--bg-primary))}.mem-row-action-btn{border-radius:var(--radius-sm);width:26px;height:26px;color:var(--text-muted);transition:all var(--duration-fast) var(--ease);justify-content:center;align-items:center;display:flex}.mem-row-action-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.mem-row-action-btn.delete:hover,.mem-row-action-btn.delete.is-confirm{color:var(--danger)}.mem-row-action-btn.is-confirm{width:auto;padding:0 6px}.mem-row-delete-label{font-size:11px;font-weight:600}.mem-pagination{font-size:12px;font-family:var(--font-mono);color:var(--text-muted);justify-content:space-between;align-items:center;margin-top:12px;display:flex}.mem-pagination-btns{gap:4px;display:flex}.mem-page-btn{border:1px solid var(--border);border-radius:var(--radius-sm);font-size:12px;font-family:var(--font-mono);color:var(--text-secondary);transition:all var(--duration) var(--ease);padding:4px 12px}.mem-page-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}.mem-page-btn:disabled{opacity:.3;cursor:not-allowed}.mem-add-btn{border:1px dashed var(--border);border-radius:var(--radius-md);font-size:12px;font-family:var(--font-mono);color:var(--text-secondary);transition:all var(--duration) var(--ease);align-items:center;gap:6px;margin-top:8px;padding:7px 16px;display:inline-flex}.mem-add-btn:hover{border-color:var(--accent);color:var(--accent);border-style:solid}.mem-tool-table{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}.mem-tool-table th{text-align:left;font-size:10px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1.5px;color:var(--text-muted);border-bottom:1px solid var(--border);white-space:nowrap;padding:8px 12px}.mem-tool-table td{border-bottom:1px solid var(--border-light);font-family:var(--font-mono);padding:10px 12px;font-size:12px}.mem-tool-table tbody tr{transition:background var(--duration-fast) var(--ease);cursor:default}.mem-tool-table tbody tr:hover{background:var(--tint-subtle)}.mem-tool-name{color:var(--text-primary);font-weight:500}.mem-success-rate{font-weight:600}.mem-success-rate.high{color:var(--accent-green)}.mem-success-rate.medium{color:var(--accent-yellow)}.mem-success-rate.low{color:var(--danger)}.mem-tool-error{vertical-align:top;text-overflow:ellipsis;white-space:nowrap;max-width:260px;color:var(--text-muted);font-size:11px;display:inline-block;overflow:hidden}.mem-conv-search{margin-bottom:12px;position:relative}.mem-conv-search .search-icon{color:var(--text-muted);pointer-events:none;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.mem-conv-search input{width:100%;font-size:12px;font-family:var(--font-mono);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-input);color:var(--text-primary);transition:border-color var(--duration) var(--ease);outline:none;padding:8px 12px 8px 32px}.mem-conv-search input:focus{border-color:var(--accent)}.mem-conv-search input{padding-right:32px}.mem-search-clear{border-radius:var(--radius-full);background:var(--bg-tertiary);width:20px;height:20px;color:var(--text-muted);cursor:pointer;transition:all var(--duration) var(--ease);border:none;justify-content:center;align-items:center;display:flex;position:absolute;top:50%;right:8px;transform:translateY(-50%)}.mem-search-clear:hover{background:var(--border);color:var(--text-primary)}.mem-delete-confirm{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.mem-delete-confirm-label{color:var(--danger);font-size:12px;font-weight:600;font-family:var(--font-mono);white-space:nowrap}.mem-conv-list{flex-direction:column;gap:4px;display:flex}.mem-conv-item{border:1px solid var(--border-light);border-radius:var(--radius-md);transition:border-color var(--duration) var(--ease), background var(--duration) var(--ease);cursor:pointer;justify-content:space-between;align-items:center;padding:10px 14px;display:flex}.mem-conv-item:hover{border-color:var(--border);background:var(--tint-subtle)}.mem-conv-info{flex:1;min-width:0}.mem-conv-session-id{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:500;overflow:hidden}.mem-conv-preview{color:var(--text-muted);text-overflow:ellipsis;white-space:nowrap;margin-top:2px;font-size:12px;overflow:hidden}.mem-conv-meta{font-size:11px;font-family:var(--font-mono);color:var(--text-muted);flex-shrink:0;gap:12px;margin-left:12px;display:flex}.mem-conv-detail-overlay{background:var(--bg-card);z-index:5;border-radius:var(--radius-xl);flex-direction:column;display:flex;position:absolute;inset:0}.mem-conv-detail-header{border-bottom:1px solid var(--border);flex-shrink:0;justify-content:space-between;align-items:center;padding:14px 20px;display:flex}.mem-conv-detail-header h2{color:var(--text-secondary);font-size:12px}.mem-conv-detail-actions{align-items:center;gap:8px;display:flex}.mem-conv-detail-body{flex:1;padding:16px 20px;overflow-y:auto}.mem-conv-turn{border-bottom:1px solid var(--border-light);padding:8px 0}.mem-conv-turn:last-child{border-bottom:none}.mem-conv-turn-header{justify-content:space-between;align-items:center;margin-bottom:4px;display:flex}.mem-conv-turn-time{color:var(--text-muted);font-size:10px;font-family:var(--font-mono);flex-shrink:0}.mem-conv-turn-role{font-size:10px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1px;margin-bottom:4px}.mem-conv-turn-role.user{color:var(--accent-blue)}.mem-conv-turn-role.assistant{color:var(--accent-green)}.mem-conv-turn-content{color:var(--text-primary);white-space:pre-wrap;word-break:break-word;font-size:13px;line-height:1.6}.mem-temporal-list{flex-direction:column;gap:6px;display:flex}.mem-temporal-item{border:1px solid var(--border-light);border-radius:var(--radius-md);transition:border-color var(--duration) var(--ease);align-items:flex-start;gap:10px;padding:10px 14px;font-size:13px;display:flex}.mem-temporal-item:hover{border-color:var(--border)}.mem-temporal-item.overdue{border-left:3px solid var(--danger)}.mem-temporal-item.upcoming{border-left:3px solid var(--accent-yellow)}.mem-temporal-icon{flex-shrink:0;margin-top:1px;font-size:16px;line-height:1}.mem-temporal-content{flex:1;min-width:0}.mem-temporal-text{font-family:var(--font-sans);color:var(--text-primary)}.mem-temporal-date{font-size:11px;font-family:var(--font-mono);color:var(--text-muted);margin-top:2px}.mem-two-col{grid-template-columns:repeat(2,minmax(0,1fr));gap:24px;display:grid}.mem-two-col>*{min-width:0}@container (width<=860px){.mem-two-col{grid-template-columns:minmax(0,1fr)}}@container (width<=640px){.mem-stat-cards{grid-template-columns:repeat(2,minmax(0,1fr))}}.mem-empty{text-align:center;color:var(--text-muted);font-size:13px;font-family:var(--font-sans);padding:32px 20px}.mem-empty-icon{opacity:.4;margin-bottom:8px;font-size:32px}.mem-loading{color:var(--text-muted);font-size:13px;font-family:var(--font-mono);justify-content:center;align-items:center;gap:10px;padding:40px;display:flex}.mem-spinner{border:2px solid var(--border);border-top-color:var(--accent);width:18px;height:18px;animation:spin var(--duration-spin) var(--ease-linear) infinite;border-radius:50%}.mem-inline-form{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-lg);flex-direction:column;gap:10px;margin-bottom:12px;padding:16px;display:flex}.mem-inline-form-row{align-items:center;gap:8px;display:flex}.mem-inline-form-row label{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1px;color:var(--text-muted);flex-shrink:0;width:80px}.mem-inline-form-row input,.mem-inline-form-row select,.mem-inline-form-row textarea{font-size:12px;font-family:var(--font-mono);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-input);color:var(--text-primary);transition:border-color var(--duration) var(--ease);outline:none;flex:1;padding:7px 12px}.mem-inline-form-row input:focus,.mem-inline-form-row select:focus,.mem-inline-form-row textarea:focus{border-color:var(--accent)}.mem-inline-form-row textarea{resize:vertical;min-height:60px}.mem-inline-form-actions{justify-content:flex-end;gap:8px;display:flex}.mem-expanded-row{background:var(--tint-subtle)!important}.mem-detail-row td{border-bottom:1px solid var(--border)!important;padding:0!important}.mem-detail-panel{background:var(--bg-secondary);border-top:1px solid var(--border-light);animation:detailExpand var(--duration) var(--ease);padding:14px 20px 16px}@keyframes detailExpand{0%{opacity:0;max-height:0}to{opacity:1;max-height:500px}}.mem-detail-grid{grid-template-columns:repeat(4,1fr);gap:10px 20px;margin-bottom:10px;display:grid}.mem-detail-field{flex-direction:column;gap:2px;display:flex}.mem-detail-field.mem-detail-full{grid-column:1/-1}.mem-detail-label{font-size:10px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1px;color:var(--text-muted)}.mem-detail-value{font-size:12px;font-family:var(--font-mono);color:var(--text-primary);word-break:break-all}.mem-detail-chain{color:var(--accent-blue)}.mem-detail-content-full{border-top:1px solid var(--border-light);margin-top:8px;padding-top:8px}.mem-detail-content-text{font-size:13px;font-family:var(--font-sans);color:var(--text-primary);white-space:pre-wrap;word-break:break-word;max-height:200px;margin-top:4px;line-height:1.6;overflow-y:auto}.mem-embedding-coverage{align-items:center;gap:8px;padding:0 8px;display:flex}.mem-embedding-bar{background:var(--border);border-radius:var(--radius-full);width:60px;height:5px;overflow:hidden}.mem-embedding-fill{background:var(--accent-green);border-radius:var(--radius-full);height:100%;transition:width var(--duration-slow) var(--ease)}.mem-embedding-label{font-size:11px;font-family:var(--font-mono);color:var(--text-secondary);white-space:nowrap}.mem-maintenance-wrap{position:relative}.mem-maintenance-wrap .btn-icon{align-items:center;gap:0;display:flex}.mem-maintenance-menu{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-lg);min-width:220px;box-shadow:var(--shadow-lg);z-index:20;animation:modalPanelIn var(--duration-fast) var(--ease);padding:4px;position:absolute;top:calc(100% + 6px);right:0}.mem-maintenance-item{width:100%;font-size:12px;font-family:var(--font-mono);color:var(--text-primary);border-radius:var(--radius-md);transition:background var(--duration-fast) var(--ease);text-align:left;align-items:center;gap:10px;padding:9px 14px;display:flex}.mem-maintenance-item:hover:not(:disabled){background:var(--tint-subtle)}.mem-maintenance-item:disabled{opacity:.5;cursor:not-allowed}.mem-maintenance-divider{background:var(--border-light);height:1px;margin:4px 8px}.mem-spinner-sm{border:2px solid var(--border);border-top-color:var(--accent);width:14px;height:14px;animation:spin var(--duration-spin) var(--ease-linear) infinite;border-radius:50%}.mem-embed-dot{vertical-align:middle;align-items:center;margin-right:5px;display:inline-flex}.mem-embed-dot.embedded{color:var(--accent-green)}.mem-embed-dot.missing{color:var(--danger);opacity:.6}.mem-superseded-row{opacity:.55}.mem-superseded-text{color:var(--text-muted);text-decoration:line-through}.mem-filter-toggle{font-size:11px;font-family:var(--font-mono);color:var(--text-secondary);cursor:pointer;white-space:nowrap;border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--duration) var(--ease);align-items:center;gap:5px;padding:7px 10px;display:flex}.mem-filter-toggle:hover{border-color:var(--border)}.mem-filter-toggle input{cursor:pointer;margin:0}.mem-consolidated-badge{color:var(--accent-green);opacity:.7;vertical-align:middle;align-items:center;margin-left:6px;display:inline-flex}.mem-cat-badge.note{background:color-mix(in srgb, var(--accent-yellow) 12%, transparent);color:var(--accent-yellow)}.mem-cat-badge.reminder{background:color-mix(in srgb, var(--danger) 12%, transparent);color:var(--danger)}.mem-toast-container{z-index:200;pointer-events:none;flex-direction:column;gap:8px;display:flex;position:fixed;bottom:24px;right:24px}.mem-toast{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);font-size:12px;font-family:var(--font-mono);color:var(--text-primary);animation:toastIn var(--duration) var(--ease);pointer-events:auto;align-items:center;gap:8px;padding:10px 18px;display:flex}.mem-toast-success{border-left:3px solid var(--accent-green)}.mem-toast-error{border-left:3px solid var(--danger)}.mem-toast-info{border-left:3px solid var(--accent-blue)}@keyframes toastIn{0%{opacity:0;transform:translateY(10px)scale(.96)}to{opacity:1;transform:none}}.mem-settings-row{justify-content:space-between;align-items:center;gap:16px;padding:10px 0;display:flex}.mem-settings-label{color:var(--text-primary);flex-direction:column;gap:3px;font-size:13px;display:flex}.mem-settings-hint{color:var(--text-muted);max-width:480px;font-size:11px}.mem-toggle{background:var(--border);cursor:pointer;width:40px;height:22px;transition:background var(--duration) var(--ease);border:none;border-radius:11px;flex-shrink:0;padding:0;position:relative}.mem-toggle:disabled{opacity:.5;cursor:not-allowed}.mem-toggle-on{background:var(--accent-green)}.mem-toggle-knob{background:var(--switch-knob);width:16px;height:16px;transition:transform var(--duration) var(--ease);border-radius:50%;position:absolute;top:3px;left:3px}.mem-toggle-on .mem-toggle-knob{transform:translate(18px)}.mem-setting-row{border-bottom:1px solid var(--border-light);justify-content:space-between;align-items:center;gap:16px;padding:10px 0;display:flex}.mem-setting-row:last-child{border-bottom:none}.mem-setting-info{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.mem-setting-label{color:var(--text-primary);font-size:12px;font-weight:600}.mem-setting-desc{color:var(--text-muted);font-size:11px;line-height:1.4}.mem-setting-row-danger .mem-setting-label{color:var(--danger)}.mem-btn-danger{border:1px solid var(--danger);color:var(--danger);cursor:pointer;transition:background var(--duration) var(--ease), color var(--duration) var(--ease);white-space:nowrap;background:0 0;border-radius:6px;flex-shrink:0;padding:5px 12px;font-size:11px;font-weight:600}.mem-btn-danger:hover:not(:disabled){background:var(--danger);color:var(--text-inverse)}.mem-btn-danger:disabled{opacity:.5;cursor:not-allowed}.mem-db-footer{border-top:1px solid var(--border-light);font-size:11px;font-family:var(--font-mono);color:var(--text-muted);justify-content:space-between;align-items:center;margin-top:20px;padding-top:14px;display:flex}.mem-tab-bar{border-bottom:1px solid var(--border);background:var(--bg-card);flex-shrink:0;gap:0;padding:0 24px;display:flex}.mem-tab-btn{font-size:12px;font-weight:500;font-family:var(--font-mono);letter-spacing:.5px;color:var(--text-muted);cursor:pointer;transition:color var(--duration) var(--ease), border-color var(--duration) var(--ease);background:0 0;border:none;border-bottom:2px solid #0000;align-items:center;gap:6px;margin-bottom:-1px;padding:10px 18px;display:flex}.mem-tab-btn:hover{color:var(--text-secondary)}.mem-tab-active{color:var(--text-primary);border-bottom-color:var(--accent)}.mem-profile-grid{grid-template-columns:1fr 1fr;gap:20px;display:grid}.mem-profile-card{background:var(--bg-secondary);border:1px solid var(--border-light);border-radius:var(--radius-lg);flex-direction:column;gap:10px;padding:20px;display:flex}.mem-profile-card-title{font-size:13px;font-weight:600;font-family:var(--font-mono);color:var(--text-primary);align-items:center;gap:8px;display:flex}.mem-profile-desc{color:var(--text-secondary);margin:0;font-size:12px;line-height:1.5}.mem-profile-note{color:var(--text-muted);margin:0;font-size:11px;font-style:italic}.mem-profile-checkbox{font-size:12px;font-family:var(--font-mono);color:var(--text-secondary);cursor:pointer;align-items:center;gap:6px;display:flex}.mem-profile-checkbox input{cursor:pointer;margin:0}.mem-profile-run-btn{align-self:flex-start;align-items:center;gap:6px;padding:8px 18px;font-size:12px;display:flex}.mem-log{background:var(--bg-code);border:1px solid var(--border-code);border-radius:var(--radius-md);max-height:200px;font-family:var(--font-mono);scrollbar-width:thin;scrollbar-color:var(--border-code) transparent;padding:8px;font-size:12px;line-height:1.6;overflow-y:auto}.mem-log::-webkit-scrollbar{width:4px}.mem-log::-webkit-scrollbar-track{background:0 0}.mem-log::-webkit-scrollbar-thumb{background:var(--border-code);border-radius:2px}.mem-log-line{white-space:pre-wrap;word-break:break-word;color:var(--text-code)}.mem-log-line.finding{color:var(--code-warning)}.mem-log-line.error{color:var(--code-danger)}.mem-review-section{flex-direction:column;gap:8px;display:flex}.mem-review-header{font-size:11px;font-weight:600;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:1.5px;color:var(--text-muted)}.mem-review-list{scrollbar-width:thin;scrollbar-color:var(--border) transparent;flex-direction:column;gap:4px;max-height:240px;display:flex;overflow-y:auto}.mem-review-list::-webkit-scrollbar{width:4px}.mem-review-list::-webkit-scrollbar-track{background:0 0}.mem-review-list::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}.mem-review-item{background:var(--bg-card);border:1px solid var(--border-light);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--duration) var(--ease);align-items:center;gap:8px;padding:6px 8px;display:flex}.mem-review-item:hover{border-color:var(--border)}.mem-review-item input{cursor:pointer;flex-shrink:0;margin:0}.mem-review-content{min-width:0;color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:12px;overflow:hidden}.mem-conf-badge{font-size:10px;font-family:var(--font-mono);border-radius:var(--radius-sm);background:color-mix(in srgb, var(--text-muted) 12%, transparent);color:var(--text-muted);flex-shrink:0;padding:2px 6px}.mem-source-badge{font-size:10px;font-family:var(--font-mono);border-radius:var(--radius-sm);background:color-mix(in srgb, var(--text-muted) 12%, transparent);color:var(--text-secondary);flex-shrink:0;padding:2px 6px}.mem-domain-badge{font-size:10px;font-family:var(--font-mono);border-radius:var(--radius-sm);flex-shrink:0;padding:2px 8px;font-weight:600}.mem-domain-badge.blue{background:color-mix(in srgb, var(--accent-blue) 15%, transparent);color:var(--accent-blue)}.mem-domain-badge.purple{background:color-mix(in srgb, var(--accent-purple) 15%, transparent);color:var(--accent-purple)}.mem-domain-badge.green{background:color-mix(in srgb, var(--accent-green) 15%, transparent);color:var(--accent-green)}.mem-domain-badge.gray{background:color-mix(in srgb, var(--text-muted) 12%, transparent);color:var(--text-muted)}.mem-review-actions{align-items:center;gap:12px;margin-top:4px;display:flex}.mem-review-actions .btn-primary{align-items:center;gap:6px;padding:7px 16px;font-size:12px;display:flex}.mem-review-select-links{font-size:11px;font-family:var(--font-mono);color:var(--text-muted)}.mem-link-btn{font:inherit;color:var(--accent-blue);cursor:pointer;background:0 0;border:none;padding:0}.mem-link-btn:hover,.mem-link-btn:focus-visible{text-decoration:underline}.mem-profile-success{background:color-mix(in srgb, var(--accent-green) 10%, transparent);border:1px solid color-mix(in srgb, var(--accent-green) 25%, transparent);border-radius:var(--radius-md);font-size:12px;font-family:var(--font-mono);color:var(--accent-green);align-items:center;gap:6px;padding:8px 12px;display:flex}.mem-profile-empty{text-align:center;color:var(--text-muted);font-size:12px;font-family:var(--font-mono);padding:12px}@media (width<=768px){.memory-dashboard-header{padding-inline-start:var(--sidebar-toggle-clearance)}}@media (width<=900px){.mem-stat-cards{grid-template-columns:repeat(2,1fr)}.mem-two-col{grid-template-columns:1fr}.mem-embedding-coverage{display:none}.mem-detail-grid{grid-template-columns:repeat(2,1fr)}.mem-profile-grid{grid-template-columns:1fr}}@media (width<=600px){.mem-stat-cards{grid-template-columns:1fr}.memory-dashboard-page{height:100%}.mem-knowledge-table{font-size:12px}.mem-filters{flex-direction:column}.mem-toast-container{bottom:12px;left:12px;right:12px}}.mem-goals-tab{flex-direction:column;gap:14px;padding:16px;display:flex}.mem-goals-stats-row{flex-wrap:wrap;gap:10px;display:flex}.mem-goals-stat-pill{background:var(--bg-hover);border:1px solid var(--border);border-radius:20px;align-items:center;gap:6px;padding:5px 12px;font-size:12px;font-weight:500;display:flex}.mem-goals-stat-n{font-size:16px;font-weight:700}.mem-goals-stat-label{opacity:.7;text-transform:capitalize}.mem-goal-status-queued{border-color:var(--accent-blue)!important}.mem-goal-status-in-progress{border-color:var(--accent-yellow)!important}.mem-goal-status-completed{border-color:var(--accent-green)!important}.mem-goal-status-failed{border-color:var(--danger)!important}.mem-goal-status-cancelled{opacity:.6;border-color:var(--border)!important}.mem-goals-approval-banner{background:color-mix(in srgb, var(--accent-yellow) 10%, transparent);border:1px solid color-mix(in srgb, var(--accent-yellow) 40%, transparent);border-radius:var(--radius-lg);flex-direction:column;gap:10px;padding:12px 14px;display:flex}.mem-goals-approval-title{opacity:.85;align-items:center;gap:6px;font-size:12px;font-weight:600;display:flex}.mem-goals-approval-item{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-md);justify-content:space-between;align-items:flex-start;gap:12px;padding:8px 10px;display:flex}.mem-goals-approval-text{flex-direction:column;gap:3px;font-size:13px;display:flex}.mem-goals-approval-text strong{font-weight:600}.mem-goals-approval-text span{opacity:.7;font-size:12px}.mem-goals-approval-actions{flex-shrink:0;gap:6px;display:flex}.btn-danger-sm{border-radius:var(--radius-md);background:color-mix(in srgb, var(--danger) 15%, transparent);border:1px solid color-mix(in srgb, var(--danger) 40%, transparent);color:var(--text-primary);cursor:pointer;padding:4px 10px;font-size:12px}.btn-danger-sm:hover{background:color-mix(in srgb, var(--danger) 25%, transparent)}.mem-goals-toolbar{gap:8px;display:flex}.mem-goals-add-form{background:var(--bg-hover);border:1px solid var(--border);border-radius:var(--radius-lg);flex-direction:column;gap:8px;padding:12px;display:flex}.mem-goals-form-row{align-items:center;gap:8px;display:flex}.mem-select{border-radius:var(--radius-md);background:var(--bg-card);border:1px solid var(--border);color:var(--text-primary);cursor:pointer;padding:6px 10px;font-size:13px}.mem-goals-list{flex-direction:column;gap:8px;display:flex}.mem-goal-card{border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-card);transition:border-color var(--duration-fast) var(--ease);overflow:hidden}.mem-goal-header{cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;gap:8px;padding:10px 14px;display:flex}.mem-goal-header:hover{background:var(--bg-hover)}.mem-goal-header-left{flex:1;align-items:center;gap:8px;min-width:0;display:flex}.mem-goal-header-right{flex-shrink:0;align-items:center;gap:8px;display:flex}.mem-goal-status-dot{background:var(--text-muted);border-radius:50%;flex-shrink:0;width:8px;height:8px}.mem-goal-status-dot.status-queued{background:var(--accent-blue)}.mem-goal-status-dot.status-in-progress{background:var(--accent-yellow)}.mem-goal-status-dot.status-completed{background:var(--accent-green)}.mem-goal-status-dot.status-failed{background:var(--danger)}.mem-goal-title{white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:600;overflow:hidden}.mem-goal-priority{border-radius:10px;flex-shrink:0;padding:1px 6px;font-size:11px;font-weight:500}.mem-priority-high{background:color-mix(in srgb, var(--danger) 15%, transparent)}.mem-priority-medium{background:color-mix(in srgb, var(--accent-yellow) 15%, transparent)}.mem-priority-low{background:color-mix(in srgb, var(--accent-blue) 15%, transparent)}.mem-goal-source-badge{background:color-mix(in srgb, var(--accent-purple) 15%, transparent);border-radius:10px;flex-shrink:0;align-items:center;gap:3px;padding:1px 6px;font-size:10px;display:flex}.mem-goal-task-count{opacity:.6;align-items:center;gap:4px;font-size:12px;display:flex}.mem-goal-action-btn{border-radius:var(--radius-md);background:var(--bg-hover);border:1px solid var(--border);color:var(--text-primary);cursor:pointer;align-items:center;gap:4px;padding:3px 8px;font-size:11px;display:flex}.mem-goal-action-btn:hover{background:var(--bg-active)}.mem-goal-delete-btn:hover{background:color-mix(in srgb, var(--danger) 15%, transparent);border-color:color-mix(in srgb, var(--danger) 40%, transparent)}.mem-chevron-open{transition:transform var(--duration-fast) var(--ease);transform:rotate(180deg)}.mem-goal-body{border-top:1px solid var(--border);flex-direction:column;gap:8px;padding:0 14px 12px;display:flex}.mem-goal-desc{opacity:.7;margin:8px 0 0;font-size:12px}.mem-goal-progress{background:var(--bg-hover);border-radius:var(--radius-md);opacity:.8;padding:6px 8px;font-size:12px}.mem-goal-no-tasks{opacity:.5;font-size:12px;font-style:italic}.mem-task-list{flex-direction:column;gap:4px;margin-top:4px;display:flex}.mem-task-row{border-radius:var(--radius-md);align-items:flex-start;gap:8px;padding:5px 8px;font-size:12px;display:flex}.mem-task-row:hover{background:var(--bg-hover)}.mem-task-dot{background:var(--text-muted);border-radius:50%;flex-shrink:0;width:7px;height:7px;margin-top:3px}.mem-task-dot.status-in-progress{background:var(--accent-yellow)}.mem-task-dot.status-completed{background:var(--accent-green)}.mem-task-dot.status-failed{background:var(--danger)}.mem-task-dot.status-blocked{background:var(--accent-purple)}.mem-task-desc{flex:1}.mem-task-status-label{opacity:.5;text-transform:capitalize;flex-shrink:0;font-size:10px}.mem-task-result{opacity:.6;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0;max-width:200px;font-size:11px;overflow:hidden}.mem-tab-badge{background:var(--accent-yellow);min-width:16px;height:16px;color:var(--text-inverse);border-radius:8px;justify-content:center;align-items:center;margin-left:2px;padding:0 4px;font-size:10px;font-weight:700;display:inline-flex}.mem-goal-header:focus-visible{outline:2px solid var(--accent-blue);outline-offset:-2px}.mem-goal-delete-confirm{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 40%, transparent)}.mem-advanced-error{border-radius:var(--radius-md);border:1px solid color-mix(in srgb, var(--danger) 40%, transparent);background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--text-primary);align-items:center;gap:8px;margin-bottom:16px;padding:10px 14px;font-size:13px;display:flex}.mem-about{max-width:760px;margin:0 auto}.mem-about-title{color:var(--text-primary);margin:4px 0 6px;font-size:20px;font-weight:600}.mem-about-intro{color:var(--text-secondary);margin:0 0 18px;font-size:14px}.mem-about-add{gap:8px;margin-bottom:20px;display:flex}.mem-about-add .mem-input{flex:1;min-width:0}.mem-about-group{margin-bottom:22px}.mem-about-group-title{text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted);margin:0 0 8px;font-size:12px;font-weight:600}.mem-about-list{border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-secondary);margin:0;padding:0;list-style:none}.mem-about-item{align-items:flex-start;gap:12px;padding:12px 14px;display:flex}.mem-about-item+.mem-about-item{border-top:1px solid var(--border)}.mem-about-text{min-width:0;color:var(--text-primary);overflow-wrap:anywhere;flex:1;font-size:14px;line-height:1.45}.mem-about-meta{color:var(--text-muted);margin-top:2px;font-size:12px;display:block}.mem-about-due{color:var(--text-secondary);margin-top:2px;font-size:12px;font-weight:500;display:block}.mem-about-due.is-overdue{color:var(--danger)}.mem-about-actions{flex-shrink:0;gap:6px;display:flex}.mem-about-btn{border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text-secondary);cursor:pointer;background:0 0;align-items:center;gap:4px;padding:4px 8px;font-size:12px;display:inline-flex}.mem-about-btn:hover,.mem-about-btn:focus-visible{color:var(--text-primary);background:var(--bg-hover)}.mem-about-btn-remove:hover,.mem-about-btn-remove:focus-visible{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 40%, transparent)}.mem-about-edit{flex-direction:column;flex:1;gap:8px;display:flex}.mem-about-edit-actions{gap:8px;display:flex}.mem-about-forgotten{border-radius:var(--radius-md);background:var(--bg-tertiary);color:var(--text-secondary);justify-content:space-between;align-items:center;gap:12px;margin-bottom:10px;padding:8px 12px;font-size:13px;display:flex}.mem-about-link{font:inherit;color:var(--accent-blue);cursor:pointer;white-space:nowrap;background:0 0;border:none;align-items:center;gap:4px;padding:0;display:inline-flex}.mem-about-link:hover,.mem-about-link:focus-visible{text-decoration:underline}.mem-about-empty{text-align:center;color:var(--text-secondary);padding:32px 16px;font-size:14px}.mem-about-hint{color:var(--text-muted);font-size:13px}@media (width<=600px){.mem-about-add{flex-wrap:wrap}.mem-about-add .mem-input{flex-basis:100%}.mem-about-add .mem-select{flex:1}.mem-about-item{flex-direction:column}.mem-tab-bar{padding:0 12px;overflow-x:auto}.mem-tab-btn{white-space:nowrap;flex-shrink:0;padding:10px 12px}}
|