@amd-gaia/agent-ui 0.25.4-rc.3 → 0.25.4-rc.6
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/bin/gaia-ui.cjs +2 -23
- package/dist/assets/AdvancedSettings-3RM8Obyx.js +1 -0
- package/dist/assets/ConnectorsPane-C2ErbEHk.js +1 -0
- package/dist/assets/ConnectorsPane-CzLYXGMl.css +1 -0
- package/dist/assets/DocumentLibrary-BUUeUqKi.js +4 -0
- package/dist/assets/FileBrowser-BGVQQMFv.js +4 -0
- package/dist/assets/MemoryDashboard-DkvaokBj.js +1 -0
- package/dist/assets/MemoryDashboard-DwrWAXi6.css +1 -0
- package/dist/assets/MobileAccessModal-BkVDm3YG.css +1 -0
- package/dist/assets/MobileAccessModal-C8L7ZA2z.js +2 -0
- package/dist/assets/ScheduleManager-CjHJ4NbD.css +1 -0
- package/dist/assets/ScheduleManager-FRIPnQnw.js +1 -0
- package/dist/assets/api-By968363.js +4 -0
- package/dist/assets/apiBase-DSN0u9ls.js +3 -0
- package/dist/assets/index-8uiHNHOH.js +78 -0
- package/dist/assets/index-CNhwlnjv.css +1 -0
- package/dist/assets/{zap-BdhDcjhB.js → zap-B97NJZKh.js} +1 -1
- package/dist/icons/apple-touch-icon.png +0 -0
- package/dist/icons/icon-192.png +0 -0
- package/dist/icons/icon-512.png +0 -0
- package/dist/icons/icon-maskable-192.png +0 -0
- package/dist/icons/icon-maskable-512.png +0 -0
- package/dist/index.html +8 -3
- package/dist/manifest.json +16 -0
- package/dist/sw.js +49 -0
- package/main-safety-net.cjs +106 -8
- package/main.cjs +139 -159
- package/package.json +2 -1
- package/preload.cjs +19 -9
- package/services/auto-updater.cjs +780 -216
- package/services/backend-installer.cjs +349 -351
- package/services/engine-install.cjs +214 -0
- package/services/index-query.cjs +7 -1
- package/services/lock-holders.cjs +200 -0
- package/services/quit-guard.cjs +10 -3
- package/services/tray-manager.cjs +12 -7
- package/dist/assets/AdvancedSettings-CHxpG8nH.js +0 -1
- package/dist/assets/ConnectorsPane-CLQK0rsX.js +0 -1
- package/dist/assets/ConnectorsPane-Dzu2DRTc.css +0 -1
- package/dist/assets/DocumentLibrary-hSat3aHA.js +0 -4
- package/dist/assets/FileBrowser-BneKS6fe.js +0 -4
- package/dist/assets/MemoryDashboard-D5NugQoq.js +0 -1
- package/dist/assets/MemoryDashboard-Dt6zI60b.css +0 -1
- package/dist/assets/MobileAccessModal-Cl7eErMB.js +0 -2
- package/dist/assets/MobileAccessModal-DuVy9F1u.css +0 -1
- package/dist/assets/ScheduleManager-CkYWygZG.js +0 -2
- package/dist/assets/ScheduleManager-D5c4gVIt.css +0 -1
- package/dist/assets/apiBase-DRtaTd8u.js +0 -1
- package/dist/assets/index-BxdoiGm5.js +0 -78
- package/dist/assets/index-C9zLn8zo.css +0 -1
- package/services/backend-installer-progress-dialog.cjs +0 -510
package/bin/gaia-ui.cjs
CHANGED
|
@@ -281,26 +281,6 @@ async function serveFrontend(port) {
|
|
|
281
281
|
return server;
|
|
282
282
|
}
|
|
283
283
|
|
|
284
|
-
/**
|
|
285
|
-
* First install found a Lemonade already running: ask on the terminal.
|
|
286
|
-
* Null without a terminal; `gaia init` then installs GAIA's own and says how to switch.
|
|
287
|
-
*/
|
|
288
|
-
function chooseLemonadeOnTerminal(found, { input = process.stdin, output = process.stdout } = {}) {
|
|
289
|
-
if (!input.isTTY) return Promise.resolve(null);
|
|
290
|
-
const readline = require("readline");
|
|
291
|
-
const rl = readline.createInterface({ input, output });
|
|
292
|
-
const question =
|
|
293
|
-
`\nA Lemonade Server (v${found.version}) is already running at ${found.url}.\n` +
|
|
294
|
-
"Use it instead of installing GAIA's own? This avoids running two servers " +
|
|
295
|
-
"and keeping two copies of each model. [Y/n] ";
|
|
296
|
-
return new Promise((resolve) => {
|
|
297
|
-
rl.question(question, (answer) => {
|
|
298
|
-
rl.close();
|
|
299
|
-
resolve(/^n(o)?$/i.test(answer.trim()) ? "gaia" : "external");
|
|
300
|
-
});
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
|
|
304
284
|
// ── Main ──────────────────────────────────────────────────────────────────────
|
|
305
285
|
|
|
306
286
|
async function main() {
|
|
@@ -341,11 +321,10 @@ async function main() {
|
|
|
341
321
|
try {
|
|
342
322
|
gaiaBin = await installer.ensureBackend({
|
|
343
323
|
version: GAIA_VERSION_OVERRIDE || undefined,
|
|
344
|
-
chooseLemonade: chooseLemonadeOnTerminal,
|
|
345
324
|
onProgress: (stage, percent, message) => {
|
|
346
325
|
// Simple CLI progress formatting
|
|
347
326
|
process.stdout.write(
|
|
348
|
-
` [${stage}] ${percent}% ${message}\n`
|
|
327
|
+
` [${stage}] ${percent === null ? "" : `${percent}% `}${message}\n`
|
|
349
328
|
);
|
|
350
329
|
},
|
|
351
330
|
});
|
|
@@ -415,4 +394,4 @@ if (require.main === module) {
|
|
|
415
394
|
});
|
|
416
395
|
}
|
|
417
396
|
|
|
418
|
-
module.exports = { npmDistTag, helpText, startBackend
|
|
397
|
+
module.exports = { npmDistTag, helpText, startBackend };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{K as t,P as n,i as r,n as i,o as a,r as o}from"./apiBase-DSN0u9ls.js";import{At as s,Bt as c,I as l,R as u,V as d,Y as f,jt as p,q as m,ut as h}from"./api-By968363.js";import{Lt as g,Ut as _,X as v,a as y,bt as b,c as x,d as S,l as C,nt as w,o as T,r as E,s as D,tt as O,u as k,zt as A}from"./index-8uiHNHOH.js";var j=e(t(),1);function M(){let e=O(),[t,n]=(0,j.useState)(null),[a,c]=(0,j.useState)(null),[u,d]=(0,j.useState)(``),[f,p]=(0,j.useState)(``),[m,h]=(0,j.useState)(!1),[g,_]=(0,j.useState)(null),[v,y]=(0,j.useState)(!1);(0,j.useEffect)(()=>{l().then(e=>{n(e),d(e.saved_base_url??e.base_url??``)}).catch(e=>c(e instanceof Error?e.message:String(e)))},[]);let x=(0,j.useCallback)(async e=>{h(!0),_(null);try{let t=await s(e);n(t),p(``),y(!1)}catch(e){y(k(e)),_(e instanceof Error?e.message:String(e))}finally{h(!1)}},[]),S=()=>void x({mode:`external`,base_url:u.trim(),api_key:f.trim()||void 0});if(a)return r(`section`,{className:`settings-section`,children:[o(`h4`,{children:e(`settings.advanced.modelServer`)}),r(`div`,{className:`model-warning`,role:`alert`,children:[o(A,{size:14}),r(`div`,{className:`model-warning-content`,children:[o(`strong`,{children:e(`settings.server.readFailed`)}),o(`p`,{children:a})]})]})]});if(!t)return null;let C=t.mode===`external`;return r(`section`,{className:`settings-section`,"aria-label":e(`settings.advanced.modelServer`),children:[o(`h4`,{children:e(`settings.advanced.modelServer`)}),o(`p`,{className:`model-override-desc`,role:`status`,children:t.source===`env`?e(`settings.server.usesEnv`,{url:t.base_url??``}):C?e(`settings.server.usesYours`,{url:t.base_url??``}):e(`settings.server.usesOwn`)}),t.source===`env`?o(`p`,{className:`model-status-hint`,children:e(`settings.server.unsetEnv`)}):r(i.Fragment,{children:[r(`p`,{className:`model-status-hint`,children:[e(`settings.server.useYours`),` `,o(`bdi`,{children:t.what_gaia_does})]}),r(`form`,{className:`model-input-row`,onSubmit:e=>{e.preventDefault(),S()},children:[o(`input`,{type:`text`,className:`model-input`,placeholder:`http://localhost:13305`,value:u,onChange:e=>{d(e.target.value),_(null)},disabled:m,spellCheck:!1,autoCapitalize:`off`,autoCorrect:`off`,"aria-label":e(`settings.server.address`)}),o(`input`,{type:`password`,className:`model-input`,autoComplete:`off`,placeholder:t.api_key_stored?e.bare(`settings.server.keySaved`):e.bare(`settings.server.keyOptional`),value:f,onChange:e=>p(e.target.value),disabled:m,"aria-label":e(`settings.server.key`)}),o(`div`,{className:`model-btn-group`,children:o(`button`,{type:`submit`,className:`btn-model-save`,disabled:m||!u.trim(),children:m?r(i.Fragment,{children:[o(b,{size:13,className:`btn-spinner`}),` `,e(`settings.server.checking`)]}):e(`settings.server.use`)})})]}),C&&o(`div`,{className:`setting-actions`,children:o(`button`,{type:`button`,className:`btn-secondary`,disabled:m,onClick:()=>void x({mode:`gaia`}),children:e(`settings.server.useOwn`)})}),g&&r(`div`,{className:`model-warning`,role:`alert`,children:[o(A,{size:14}),r(`div`,{className:`model-warning-content`,children:[o(`strong`,{children:e(v?`settings.server.needsKey`:`settings.server.notSwitched`)}),o(`p`,{children:g})]})]})]})]})}var N={vulkan:`Vulkan`,rocm:`ROCm`,metal:`Metal`,cpu:`CPU`,npu:`NPU`,remote:`Remote (cloud)`},P={gaia:`settings.server.ownerGaia`,user:`settings.server.ownerUser`,remote:`settings.server.ownerRemote`};function F(e){return e?N[e]??e:`unknown`}function I(e){if(!e)return`unknown`;let t=F(e.backend);return e.backend_source===`lemonade_default`?`${t} (Lemonade's default)`:t}function L(e){return e?`${Math.round(e/1024)}K tokens`:`unknown`}var R={asr:`settings.server.kind.speechRecognition`,embedding:`settings.server.kind.embedding`,image:`settings.server.kind.image`,llm:`settings.server.kind.language`,rerank:`settings.server.kind.reranker`,reranking:`settings.server.kind.reranker`,stt:`settings.server.kind.speechRecognition`,transcription:`settings.server.kind.speechRecognition`,tts:`settings.server.kind.speech`,vision:`settings.server.kind.vision`,"3d":`settings.server.kind.threeD`};function z(e,t){if(!e.model_type)return t(`settings.server.loadedModel`);let n=e.model_type.toLowerCase(),r=R[n];return r?t(r):t(`settings.server.kindOther`,{kind:`${n.charAt(0).toUpperCase()}${n.slice(1)}`})}function B(e,t){let n=[e.name?w(e.name):t.bare(`settings.server.unknownModel`),I(e)];return e.backend!==`remote`&&e.ctx_size&&n.push(L(e.ctx_size)),n.join(` · `)}function V({label:e,value:t,title:n}){return r(`div`,{className:`status-row`,children:[o(`span`,{className:`status-label`,children:e}),o(`span`,{className:`status-value model-server-value`,dir:`auto`,title:n??t,children:t})]})}function ee(){let e=O(),t=a(e=>e.openSettings),[n,s]=(0,j.useState)(null),[c,l]=(0,j.useState)(null),[u,f]=(0,j.useState)(null),[m,g]=(0,j.useState)(null),[_,v]=(0,j.useState)(!1);(0,j.useEffect)(()=>{d().then(s).catch(e=>l(e instanceof Error?e.message:String(e)))},[]);let x=(0,j.useCallback)(async t=>{f(t),g(null);try{let n=await p(t);s(n),g({ok:!0,text:e(`settings.server.savedBackend`)})}catch(e){g({ok:!1,text:e instanceof Error?e.message:String(e)})}finally{f(null)}},[e]),S=n?.chat_model??null,C=(0,j.useCallback)(async()=>{if(S?.name){v(!0);try{if(!await h(S.name,S.ctx_size??void 0))return;g({ok:!0,text:e(`settings.server.reloading`,{name:S.name})})}catch(e){g({ok:!1,text:e instanceof Error?e.message:String(e)})}finally{v(!1)}}},[S,e]),T=o(`button`,{type:`button`,className:`btn-secondary`,onClick:()=>t(`model`),children:e(`settings.server.changeModel`)});if(c)return r(`section`,{className:`settings-section`,"aria-label":e(`settings.advanced.modelServer`),children:[o(`h4`,{children:e(`settings.advanced.modelServer`)}),o(y,{message:c})]});if(!n)return r(`section`,{className:`settings-section`,"aria-label":e(`settings.advanced.modelServer`),children:[o(`h4`,{children:e(`settings.advanced.modelServer`)}),o(`p`,{className:`loading-text`,children:e(`settings.server.checkingServer`)})]});if(!n.reachable)return r(`section`,{className:`settings-section`,"aria-label":e(`settings.advanced.modelServer`),children:[o(`h4`,{children:e(`settings.advanced.modelServer`)}),o(y,{message:n.error??e(`settings.errors.serverDownTitle`)}),T]});let E=n.available_backends??[],D=n.preferred_backend??null,k=E.map(e=>e.name);D&&!k.includes(D)&&k.push(D);let A=D??n.default_backend??null,M=E.filter(e=>e.state===`installable`).map(e=>F(e.name)),N=!!S?.name&&S.recipe===`llamacpp`;return r(`section`,{className:`settings-section`,"aria-label":e(`settings.advanced.modelServer`),children:[o(`h4`,{children:e(`settings.advanced.modelServer`)}),r(`div`,{className:`status-grid`,children:[o(V,{label:e(`settings.server.server`),value:`${P[n.owner]?e(P[n.owner]):n.owner}${n.version?` v${n.version}`:``}`}),o(V,{label:e(`settings.server.addressShort`),value:n.base_url}),o(V,{label:e(`settings.server.chatModel`),value:S?.name?w(S.name):e(`settings.advanced.noneLoaded`),title:S?.name??void 0}),S&&o(V,{label:e(`settings.server.runsOn`),value:I(S)}),S&&S.backend!==`remote`&&o(V,{label:e(`settings.advanced.context`),value:L(S.ctx_size)}),o(V,{label:e(`settings.advanced.embedding`),value:n.embedding_model?.name?`${n.embedding_model.name} · ${I(n.embedding_model)}`:e(`settings.advanced.noneLoaded`)}),(n.loaded_models??[]).map((t,n)=>o(V,{label:z(t,e),value:B(t,e),title:t.name??void 0},`${t.name??`unknown`}-${n}`))]}),n.embedding_note&&o(`p`,{className:`settings-hint`,children:o(`bdi`,{children:n.embedding_note})}),n.system_info_error&&o(`p`,{className:`settings-hint`,children:o(`bdi`,{children:n.system_info_error})}),r(`div`,{className:`settings-field model-server-backend`,children:[o(`span`,{className:`settings-label`,children:e(`settings.server.backend`)}),E.length===0&&!D?o(`span`,{className:`settings-hint`,children:e(`settings.server.noBackends`)}):r(i.Fragment,{children:[o(`div`,{className:`segmented`,role:`radiogroup`,"aria-label":e(`settings.server.backendShort`),children:k.map(e=>r(`button`,{type:`button`,role:`radio`,"aria-checked":A===e,className:A===e?`is-active`:``,disabled:u!==null,onClick:()=>{e!==A&&x(e)},children:[u===e?o(b,{size:12,className:`spin`}):null,F(e)]},e))}),r(`span`,{className:`settings-hint`,children:[e(`settings.server.backendHint`),M.length>0&&` ${e(`settings.server.installable`,{names:M.join(`, `)})}`]})]}),m?.ok&&o(`p`,{className:`settings-ok`,role:`status`,children:m.text}),m&&!m.ok&&o(y,{message:m.text})]}),r(`div`,{className:`settings-row`,children:[T,N&&r(`button`,{type:`button`,className:`btn-secondary`,onClick:()=>void C(),disabled:_,children:[_?o(b,{size:13,className:`spin`}):null,e(`settings.server.reload`)]})]})]})}function H(){let e=O(),[t,a]=(0,j.useState)(null),[s,l]=(0,j.useState)(!0),[d,p]=(0,j.useState)([]),[h,w]=(0,j.useState)(``),[k,N]=(0,j.useState)(``),[P,F]=(0,j.useState)(!1),[I,L]=(0,j.useState)(!1),[R,z]=(0,j.useState)(null),[B,V]=(0,j.useState)(!1),H=(0,j.useRef)(null),[W,G]=(0,j.useState)(!1),[K,q]=(0,j.useState)(!1),[J,ne]=(0,j.useState)(!1),[re,ie]=(0,j.useState)(null);(0,j.useEffect)(()=>{n.system.info(`Checking system status...`);let e=n.system.time();f().then(t=>{a(t),n.system.timed(`System status received`,e,{lemonade:t.lemonade_running?`running`:`stopped`,model:t.model_loaded||`none`,embedding:t.embedding_model_loaded?`yes`:`no`,disk:`${t.disk_space_gb}GB free`,memory:t.memory_available_gb==null?`unknown`:`${t.memory_available_gb}GB available`}),t.lemonade_running||n.system.warn(`Lemonade Server is NOT running.`)}).catch(e=>{n.system.error(`Failed to get system status`,e),a(null)}).finally(()=>l(!1)),u().then(e=>p(e.servers)).catch(()=>{}),m().then(e=>{let t=e.custom_model??``;w(t),N(t),G(e.dynamic_tools),q(e.dynamic_tools_locked)}).catch(e=>{n.system.error(`Failed to load settings`,e)}).finally(()=>F(!0))},[]),(0,j.useEffect)(()=>()=>{H.current&&clearTimeout(H.current)},[]);let ae=(0,j.useCallback)(async()=>{let e=h.trim(),t=e.length>0?e:``;L(!0),z(null),V(!1);try{n.system.info(`Saving custom_model override`,{custom_model:t});let e=(await c({custom_model:t})).custom_model??``;w(e),N(e),V(!0),H.current&&clearTimeout(H.current),H.current=setTimeout(()=>V(!1),2200)}catch(e){let t=e instanceof Error?e.message:String(e);n.system.error(`Failed to save custom_model`,e),z(t)}finally{L(!1)}},[h]),oe=(0,j.useCallback)(async()=>{if(K||J)return;let e=W,t=!e;G(t),ne(!0),ie(null);try{n.system.info(`Saving dynamic_tools setting`,{dynamic_tools:t});let e=await c({dynamic_tools:t});G(e.dynamic_tools),q(e.dynamic_tools_locked)}catch(t){let r=t instanceof Error?t.message:String(t);n.system.error(`Failed to save dynamic_tools`,t),G(e),ie(r)}finally{ne(!1)}},[W,K,J]),se=h.trim()!==k.trim(),Y=t?t.default_model_name:v,{isLoadingModel:ce,isDownloadingModel:X,downloadError:Z,loadModel:le,downloadModel:ue}=E(Y??void 0),Q=!!t?.default_model_is_cloud,de=!Q&&!!(t?.lemonade_running&&t.model_loaded&&t.expected_model_loaded===!1),fe=!Q&&!!(t?.lemonade_running&&t.model_loaded&&t.context_size_sufficient===!1),$=!Q&&!(!t?.lemonade_running||t.model_loaded||t.model_downloaded!==!1),pe=(de||fe)&&Y!==null,me=d.some(e=>!e.connected);return r(`div`,{className:`settings-pane`,children:[o(`h2`,{className:`settings-pane-title`,children:e(`settings.section.advanced`)}),o(`section`,{className:`settings-card`,"aria-label":e(`settings.advanced.status`),children:s?o(`p`,{className:`loading-text`,children:e(`settings.advanced.checking`)}):t?r(i.Fragment,{children:[r(`div`,{className:`status-grid`,children:[o(U,{label:e(`settings.advanced.modelServer`),value:t.lemonade_running?t.lemonade_version?e(`settings.advanced.runningAt`,{version:t.lemonade_version}):e(`settings.advanced.running`):x(t)?e(`settings.advanced.notInstalled`):t.lemonade_error?e(`settings.advanced.unavailable`):e(`settings.advanced.notRunning`),ok:t.lemonade_running,hint:t.lemonade_running?void 0:x(t)?e(`settings.advanced.notInstalledHint`):t.lemonade_error?e(`settings.advanced.queryFailed`,{reason:t.lemonade_error}):t.start_instruction&&!D(t.start_instruction)?t.start_instruction:e(`settings.advanced.notRunningHint`)}),x(t)&&o(T,{className:`btn-primary`}),o(U,{label:e(`settings.section.model`),value:t.model_loaded||e(`settings.advanced.noneLoaded`),ok:!!t.model_loaded&&(Q||t.expected_model_loaded!==!1),hint:t.model_loaded?!Q&&t.expected_model_loaded===!1?e(`settings.advanced.expected`,{name:Y??``}):void 0:e(`settings.advanced.loadsFirst`)}),o(U,{label:e(`settings.advanced.disk`),value:r(`bdi`,{dir:`ltr`,children:[t.disk_space_gb,` GB`]}),ok:t.disk_space_gb>5,hint:!t.model_loaded&&t.disk_space_gb<30?e(`settings.advanced.diskLow`,{need:`6 GB`,size:`${t.disk_space_gb} GB`}):void 0})]}),$&&r(`div`,{className:`model-action-row model-action-row--download`,children:[r(`div`,{className:`model-action-info`,children:[o(`span`,{className:`model-action-label`,children:e(`settings.advanced.notDownloaded`)}),o(`span`,{className:`model-action-desc`,children:e(`settings.advanced.notDownloadedHint`,{name:Y??``,need:`6 GB`})})]}),o(`button`,{className:`btn-model-action btn-model-action--download`,onClick:()=>ue(!1),disabled:X,children:X?r(i.Fragment,{children:[o(b,{size:13,className:`btn-spinner`}),` `,e(`settings.advanced.downloading`)]}):e(`settings.model.download`)})]}),$&&Z&&o(y,{message:Z}),pe&&r(`div`,{className:`model-action-row model-action-row--load`,children:[r(`div`,{className:`model-action-info`,children:[o(`span`,{className:`model-action-label`,children:e(de?`settings.advanced.wrongModel`:`settings.advanced.smallContext`)}),o(`span`,{className:`model-action-desc`,children:e(`settings.advanced.loadHint`,{name:Y??``,size:`${32 .toFixed(0)}K`})})]}),o(`button`,{className:`btn-model-action btn-model-action--load`,onClick:()=>le(),disabled:ce,children:ce?r(i.Fragment,{children:[o(b,{size:13,className:`btn-spinner`}),` `,e(`settings.advanced.loading`)]}):e(`settings.advanced.load`)})]}),r(`details`,{className:`settings-more`,children:[r(`summary`,{children:[o(_,{size:13,className:`settings-disclosure-chevron`,"aria-hidden":`true`}),` `,e(`settings.advanced.details`)]}),r(`div`,{className:`status-grid`,children:[t.model_size_gb!=null&&o(U,{label:e(`settings.advanced.modelSize`),value:r(`bdi`,{dir:`ltr`,children:[t.model_size_gb,` GB`]}),ok:!0}),t.model_device&&!Q&&o(U,{label:e(`settings.advanced.device`),value:t.model_device.toUpperCase(),ok:t.model_device!==`cpu`}),t.model_context_size!=null&&o(U,{label:e(`settings.advanced.context`),value:e(`settings.ctx.tokens`,{size:`${(t.model_context_size/1024).toFixed(0)}K`}),ok:t.context_size_sufficient}),t.model_labels&&t.model_labels.length>0&&o(U,{label:e(`settings.advanced.capabilities`),value:t.model_labels.join(`, `),ok:!0}),o(U,{label:e(`settings.advanced.embedding`),value:t.embedding_model_loaded?e(`settings.advanced.available`):e(`settings.advanced.notLoaded`),ok:t.embedding_model_loaded}),t.gpu_name&&o(U,{label:`GPU`,value:o(`bdi`,{children:`${t.gpu_name}${t.gpu_vram_gb?` (${S(t.gpu_vram_gb)})`:``}`}),ok:!0}),o(U,{label:e(`settings.advanced.memory`),value:t.memory_available_gb==null?e(`settings.advanced.unknown`):r(`bdi`,{dir:`ltr`,children:[t.memory_available_gb,` GB`]}),ok:t.memory_available_gb!=null&&t.memory_available_gb>2}),t.processor_name&&o(U,{label:e(`settings.advanced.processor`),value:o(`bdi`,{children:t.processor_name}),ok:!0})]}),t.lemonade_running&&Y!==null&&!Q&&r(`div`,{className:`force-redownload-row`,children:[o(`span`,{className:`force-redownload-label`,children:e(`settings.advanced.corrupted`)}),o(`button`,{className:`btn-force-redownload`,onClick:()=>ue(!0),disabled:X,children:X?r(i.Fragment,{children:[o(b,{size:12,className:`btn-spinner`}),` `,e(`settings.advanced.downloading`)]}):e(`settings.advanced.redownload`)})]}),!$&&Z&&o(y,{message:Z})]})]}):o(`div`,{className:`status-error`,children:o(`p`,{children:e(`settings.advanced.unreachable`)})})}),r(C,{title:e(`settings.advanced.serverTitle`),hint:e(`settings.advanced.serverHint`),children:[o(ee,{}),o(M,{})]}),r(C,{title:e(`settings.advanced.customTitle`),hint:k||e(`settings.advanced.customHint`),children:[o(`p`,{className:`model-override-desc`,children:e(`settings.advanced.customDesc`)}),r(`div`,{className:`model-input-row`,children:[o(`input`,{type:`text`,className:`model-input${k?` has-override`:``}`,placeholder:e.bare(`settings.advanced.customPlaceholder`),value:h,onChange:e=>{w(e.target.value),z(null),V(!1)},onKeyDown:e=>{e.key===`Enter`&&!I&&se&&P&&(e.preventDefault(),ae())},disabled:!P||I,spellCheck:!1,autoCapitalize:`off`,autoCorrect:`off`,"aria-label":e(`settings.advanced.customAria`)}),o(`div`,{className:`model-btn-group`,children:o(`button`,{className:`btn-model-save${B?` saved`:``}`,onClick:()=>{ae()},disabled:!P||I||!se&&!B,"aria-label":e(`settings.advanced.customSave`),children:I?r(i.Fragment,{children:[o(b,{size:13,className:`btn-spinner`}),` `,e(`settings.models.applying`)]}):B?r(i.Fragment,{children:[o(g,{size:13}),` `,e(`settings.advanced.saved`)]}):e(`settings.advanced.save`)})})]}),o(`p`,{className:`model-status-hint`,children:e(`settings.advanced.customIds`)}),R&&o(te,{message:R})]}),r(C,{title:e(`settings.advanced.dynamicTitle`),children:[o(`p`,{className:`model-override-desc`,children:e(`settings.advanced.dynamicDesc`)}),r(`label`,{className:`setting-row`,children:[o(`span`,{children:e(`settings.advanced.dynamicEnable`)}),r(`span`,{className:`toggle-switch`,children:[o(`input`,{type:`checkbox`,checked:W,onChange:()=>void oe(),disabled:!P||J||K,"aria-label":e(W?`settings.advanced.dynamicOff`:`settings.advanced.dynamicOn`)}),o(`span`,{className:`toggle-track`})]})]}),K&&o(`p`,{className:`model-status-hint`,children:e(`settings.advanced.dynamicLocked`)}),re&&o(te,{message:re})]}),d.length>0&&o(C,{title:e(`settings.advanced.mcp`),count:d.length,defaultOpen:me,children:o(`div`,{className:`status-grid`,children:d.map(t=>r(`div`,{className:`status-row`,children:[o(`bdi`,{className:`status-label`,children:t.name}),o(`div`,{className:`status-value-wrap`,children:t.connected?r(`span`,{className:`status-value ok mcp-status-connected`,children:[o(g,{size:12}),e.plural(`settings.advanced.tools`,t.tool_count)]}):r(`span`,{className:`status-value warn mcp-status-failed`,title:t.error??void 0,children:[o(A,{size:12}),e(`settings.custom.failed`)]})})]},t.name))})}),r(`div`,{className:`about-info`,children:[r(`p`,{children:[r(`bdi`,{dir:`ltr`,children:[`GAIA v`,`0.25.4rc6`]}),` `,o(`span`,{className:`beta-badge`,children:`BETA`})]}),o(`p`,{className:`about-sub`,children:e(`settings.advanced.about`)})]})]})}function te({message:e}){let t=O();return r(`div`,{className:`model-warning`,role:`alert`,children:[o(A,{size:14}),r(`div`,{className:`model-warning-content`,children:[o(`strong`,{children:t(`settings.advanced.saveFailed`)}),o(`p`,{children:e})]})]})}function U({label:e,value:t,ok:n,hint:i}){return r(`div`,{className:`status-row${i?` status-row--has-hint`:``}`,children:[o(`span`,{className:`status-label`,children:e}),r(`div`,{className:`status-value-wrap`,children:[o(`span`,{className:`status-value ${n?`ok`:`warn`}`,children:t}),i&&o(`span`,{className:`status-hint`,children:i})]})]})}export{H as AdvancedSettings};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{K as t,P as n,i as r,n as i,o as a,r as o,t as s}from"./apiBase-DSN0u9ls.js";import{_n as c,bn as l,cn as u,dn as d,fn as f,gn as p,hn as m,ln as h,mn as g,on as _,pn as v,sn as y,un as b,vn as x,yn as S}from"./api-By968363.js";import{At as C,Bt as w,Lt as T,Ut as E,bt as D,it as O,kt as k,l as A,tt as j,zt as M}from"./index-8uiHNHOH.js";var N=e(t(),1),P=n.api;function F(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 I(e){let t=(0,N.useRef)(e);(0,N.useEffect)(()=>{t.current=e},[e]),(0,N.useEffect)(()=>{let e=`${s()}/connectors/events`,n=null,r=1e3,i=null,a=!1,o=()=>{a||(n=new EventSource(e),n.onopen=()=>{r=1e3},n.onmessage=e=>{try{let n=JSON.parse(e.data),r=F(n.type);if(r===null){P.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){P.warn(`connectors-sse: malformed event`,e)}},n.onerror=()=>{n?.close(),n=null,!a&&(i=setTimeout(o,r),r=Math.min(r*2,3e4))})};return o(),()=>{a=!0,i&&clearTimeout(i),n?.close()}},[])}function L(e){return e.type===`mcp_server`&&e.configured}function R({connector:e,onChanged:t}){let n=j(),[i,a]=(0,N.useState)(!1),[s,c]=(0,N.useState)(!1),[l,u]=(0,N.useState)(null),[p,m]=(0,N.useState)(null),h=(0,N.useRef)(null),g=(0,N.useRef)(null);(0,N.useEffect)(()=>{if(!i)return;let e=e=>{let t=e.target;h.current&&!h.current.contains(t)&&g.current&&!g.current.contains(t)&&a(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[i]);let _=(0,N.useCallback)(()=>a(!1),[]);if(O(i,_),(0,N.useEffect)(()=>{if(!i)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)}},[i]),!L(e))return null;let y=e=>{e.stopPropagation(),e.preventDefault()},b=e=>{if(y(e),!i&&h.current){let e=h.current.getBoundingClientRect();m({top:e.bottom+4,right:window.innerWidth-e.right})}a(e=>!e)},x=async e=>{c(!0),u(null);try{await e(),a(!1),t()}catch(e){u(e instanceof Error?e.message:String(e))}finally{c(!1)}};return r(`div`,{className:`connector-tile-menu`,onClick:y,onKeyDown:y,children:[o(`button`,{ref:h,type:`button`,className:`connector-tile-menu-trigger`,"aria-haspopup":`menu`,"aria-expanded":i,"aria-label":n(`settings.connectors.actions`),onClick:b,disabled:s,children:o(C,{size:14})}),i&&p&&r(`div`,{ref:g,role:`menu`,className:`connector-tile-menu-popup`,style:{position:`fixed`,top:p.top,right:p.right},children:[e.enabled?o(`button`,{role:`menuitem`,type:`button`,className:`connector-tile-menu-item`,onClick:()=>void x(()=>d(e.id)),disabled:s,children:n(`settings.connectors.disable`)}):o(`button`,{role:`menuitem`,type:`button`,className:`connector-tile-menu-item`,onClick:()=>void x(()=>v(e.id)),disabled:s,children:n(`settings.connectors.enable`)}),o(`div`,{className:`connector-tile-menu-divider`}),o(`button`,{role:`menuitem`,type:`button`,className:`connector-tile-menu-item connector-tile-menu-item--danger`,onClick:()=>void x(()=>f(e.id)),disabled:s,children:n(`settings.connectors.disconnect`)}),l&&o(`div`,{className:`connector-tile-menu-error`,children:l})]})]})}var z={"https://www.googleapis.com/auth/gmail.readonly":`settings.connectors.scope.gmailRead`,"https://www.googleapis.com/auth/gmail.modify":`settings.connectors.scope.gmailModify`,"https://www.googleapis.com/auth/gmail.send":`settings.connectors.scope.gmailSend`,"https://www.googleapis.com/auth/gmail.compose":`settings.connectors.scope.gmailCompose`,"https://www.googleapis.com/auth/calendar.readonly":`settings.connectors.scope.calendarRead`,"https://www.googleapis.com/auth/calendar.events":`settings.connectors.scope.calendarEvents`,"https://www.googleapis.com/auth/drive.readonly":`settings.connectors.scope.driveRead`,"https://www.googleapis.com/auth/drive.file":`settings.connectors.scope.driveFile`,"https://www.googleapis.com/auth/spreadsheets.readonly":`settings.connectors.scope.sheetsRead`,"https://www.googleapis.com/auth/spreadsheets":`settings.connectors.scope.sheets`,openid:`settings.connectors.scope.openid`,"https://www.googleapis.com/auth/userinfo.email":`settings.connectors.scope.email`,email:`settings.connectors.scope.email`,profile:`settings.connectors.scope.profile`,"https://graph.microsoft.com/Mail.ReadWrite":`settings.connectors.scope.outlookMail`,"https://graph.microsoft.com/Mail.Send":`settings.connectors.scope.outlookSend`,"https://graph.microsoft.com/Calendars.ReadWrite":`settings.connectors.scope.outlookCalendar`,"https://graph.microsoft.com/Calendars.Read":`settings.connectors.scope.outlookCalendarRead`,"https://graph.microsoft.com/User.Read":`settings.connectors.scope.microsoftProfile`};function B(e,t){let n=z[e];return n?t(n):e.split(/[/.:]/).pop()??e}var V=6,H=[`use`];function U(e,t){return!(`revoke_supported`in e)||e.revoke_supported&&e.revoked_remotely?null:e.revoke_supported&&!e.revoked_remotely?t(`settings.connectors.notRevoked`,{reason:String(e.revoke_error??t.bare(`settings.advanced.unknown`))}):e.revoke_error?t(`settings.connectors.localOnly`,{reason:String(e.revoke_error)}):t(`settings.connectors.noRevokeApi`)}function W(){let e=j(),[t,n]=(0,N.useState)([]),[a,s]=(0,N.useState)([]),[c,l]=(0,N.useState)(!0),[u,d]=(0,N.useState)(null),[f,m]=(0,N.useState)(null),[h,_]=(0,N.useState)(null),[v,y]=(0,N.useState)(``),b=(0,N.useCallback)(async()=>{try{let[{connectors:e},{agent_mcps:t}]=await Promise.all([S(),p()]);n(e),s(t),d(null)}catch(e){d(e instanceof Error?e.message:String(e))}finally{l(!1)}},[]);(0,N.useEffect)(()=>{b()},[b]);let x=e=>_(t=>t===e?null:e),C=(0,N.useCallback)(async e=>{try{let t=await g(e);n(n=>n.map(n=>n.id===e?t:n))}catch{b()}},[b]);I((0,N.useCallback)(t=>{t.reason===`disconnected`&&m(U(t.payload,e)),t.connectorId?C(t.connectorId):b()},[C,b,e]));let w=v.trim().toLowerCase(),T=t.filter(e=>!w||e.display_name.toLowerCase().includes(w)||e.description.toLowerCase().includes(w)),E=T.filter(e=>e.configured),O=T.filter(e=>!e.configured&&e.type===`oauth_pkce`),k=T.filter(e=>!e.configured&&e.type!==`oauth_pkce`),P=!t.some(e=>e.configured),F=e=>o(`div`,{className:`connectors-list`,children:e.map(e=>o(G,{connector:e,expanded:h===e.id,onToggle:()=>x(e.id),onChanged:()=>void C(e.id)},e.id))});return r(`section`,{className:`connectors-section`,"aria-label":e(`settings.section.connectors`),children:[o(`p`,{className:`settings-pane-lede`,children:e(`settings.connectors.lede`)}),u&&r(`div`,{className:`error-banner`,children:[o(M,{size:14}),o(`span`,{children:u})]}),f&&r(`div`,{className:`error-banner`,role:`status`,onClick:()=>m(null),children:[o(M,{size:14}),o(`span`,{children:f})]}),c?o(`div`,{className:`connectors-loading`,children:o(D,{size:16,className:`spin`})}):r(i.Fragment,{children:[t.length>V&&o(`input`,{className:`settings-input`,type:`search`,value:v,onChange:e=>y(e.target.value),placeholder:e(`settings.connectors.search`),"aria-label":e(`settings.connectors.search`)}),t.length===0&&!u&&o(`p`,{className:`settings-hint`,children:e(`settings.connectors.none`)}),w&&T.length===0&&o(`p`,{className:`settings-hint`,children:e(`settings.connectors.noMatch`)}),E.length>0&&o(A,{title:e(`settings.connectors.connected`),count:E.length,defaultOpen:!0,forceOpen:!!w,children:F(E)}),O.length>0&&o(A,{title:e(`settings.connectors.accounts`),hint:e(`settings.connectors.accountsHint`),count:O.length,defaultOpen:P,forceOpen:!!w,children:F(O)}),k.length>0&&o(A,{title:e(`settings.connectors.servers`),hint:e(`settings.connectors.serversHint`),count:k.length,forceOpen:!!w,children:F(k)}),a.length>0&&!w&&o(A,{title:e(`settings.connectors.agentServers`),count:a.length,children:o(X,{servers:a,expanded:h,onToggle:x})})]})]})}function G({connector:e,expanded:t,onToggle:n,onChanged:i}){let a=j();return r(`div`,{className:`connector-tile${t?` connector-tile--open`:``}`,children:[r(`div`,{className:`connector-tile-row`,children:[r(`button`,{type:`button`,className:`connector-tile-header`,onClick:n,"aria-expanded":t,children:[o(`bdi`,{className:`connector-tile-name`,children:e.display_name}),e.configured&&o(`span`,{className:`connector-tile-type`,children:e.type===`oauth_pkce`?`OAuth`:`MCP`}),e.configured?e.type===`mcp_server`&&e.enabled===!1?o(`span`,{className:`connector-status disabled`,children:a(`settings.connectors.disabled`)}):r(`span`,{className:`connector-status ok`,children:[o(T,{size:12}),e.account_id?o(`bdi`,{dir:`ltr`,children:e.account_id}):a(`settings.connectors.configured`)]}):e.configurable===!1?o(`span`,{className:`connector-status idle`,children:a(`settings.connectors.setupRequired`)}):null,o(`span`,{className:`connector-tile-chevron`,children:o(t?w:E,{size:14})})]}),o(R,{connector:e,onChanged:i})]}),t&&r(`div`,{className:`connector-detail`,children:[e.type===`oauth_pkce`?o(K,{connector:e,onChanged:i}):o(J,{connector:e,onChanged:i}),e.configured&&o(Q,{connectorId:e.id,connectorType:e.type})]})]})}function K({connector:e,onChanged:t}){let n=j(),[s,c]=(0,N.useState)(!1),[l,d]=(0,N.useState)(null),[p,m]=(0,N.useState)({}),[g,_]=(0,N.useState)(null),{agents:v}=a(),b=v.filter(t=>t.namespaced_agent_id&&t.required_connections?.some(t=>t.connector_id===e.id)),x=b.map(e=>e.namespaced_agent_id).join(`,`),[S,C]=(0,N.useState)(()=>new Set);(0,N.useEffect)(()=>{C(new Set(b.map(e=>e.namespaced_agent_id)))},[x]);let w=e=>C(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),T=()=>[...S];(0,N.useEffect)(()=>{let e=()=>{t()};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[t]);let E=e=>{let t=window;t.gaia?.openExternal?t.gaia.openExternal(e):window.open(e,`_blank`,`noopener`)},O=async()=>{c(!0),d(null);try{let t=await y(e.id,e.available_scopes?.length?e.available_scopes:e.default_scopes,T());E(t.authorization_url)}catch(e){d(e instanceof Error?e.message:String(e))}finally{c(!1)}},A=async()=>{c(!0),d(null),_(null);try{let t=await u(e.id,e.available_scopes?.length?e.available_scopes:e.default_scopes,T());_(t)}catch(e){d(e instanceof Error?e.message:String(e))}finally{c(!1)}};(0,N.useEffect)(()=>{e.configured&&_(null)},[e.configured]),I((0,N.useCallback)(t=>{t.connectorId===e.id&&(t.reason===`oauth_error`?(d(String(t.payload.error??n(`settings.connectors.deviceFailed`))),_(null)):t.reason===`oauth_completed`&&_(null))},[e.id,n]));let P=async()=>{c(!0),d(null);try{await f(e.id),t()}catch(e){d(e instanceof Error?e.message:String(e))}finally{c(!1)}},F=async()=>{let r=(e.oauth_setup_fields??[]).filter(e=>e.required!==!1&&!p[e.key]?.trim()).map(e=>e.label);if(r.length)d(n(`settings.connectors.required`,{fields:r.join(`, `)}));else{c(!0),d(null);try{let n=e.available_scopes?.length?e.available_scopes:e.default_scopes,r=await h(e.id,{...p,scopes:n,grant_agents:T()}),i=typeof r.authorization_url==`string`?r.authorization_url:null;i&&E(i),t()}catch(e){d(e instanceof Error?e.message:String(e))}finally{c(!1)}}},L=e.oauth_setup_fields??[],R=e.configurable===!1&&!e.configured&&L.length>0;return r(`div`,{className:`configure-body`,children:[e.description&&o(`p`,{className:`connector-desc`,children:o(`bdi`,{children:e.description})}),R&&r(`div`,{className:`oauth-setup-form`,children:[o(`p`,{className:`connector-desc`,children:n(`settings.connectors.firstSetup`)}),L.map(e=>r(`label`,{className:`oauth-setup-field`,children:[o(`span`,{className:`oauth-setup-label`,children:e.label}),o(`input`,{type:e.kind===`secret`?`password`:`text`,className:`oauth-setup-input`,placeholder:e.placeholder,value:p[e.key]??``,onChange:t=>m(n=>({...n,[e.key]:t.target.value})),autoComplete:`off`,spellCheck:!1}),e.help_md&&o(`span`,{className:`oauth-setup-help`,children:o(`bdi`,{children:e.help_md})})]},e.key))]}),!e.configured&&b.length>0&&r(`div`,{className:`oauth-grant-onconnect`,children:[o(`p`,{className:`oauth-grant-onconnect-label`,children:n(`settings.connectors.grantOnConnect`)}),b.map(e=>r(`label`,{className:`oauth-grant-onconnect-item`,children:[o(`input`,{type:`checkbox`,checked:S.has(e.namespaced_agent_id),onChange:()=>w(e.namespaced_agent_id)}),o(`span`,{children:e.name})]},e.namespaced_agent_id)),o(`p`,{className:`oauth-grant-onconnect-help`,children:n(`settings.connectors.grantLater`)})]}),!R&&o(q,{connector:e,onChanged:t}),l&&r(`div`,{className:`configure-error`,children:[o(M,{size:12}),` `,l]}),r(`div`,{className:`configure-actions`,children:[e.configured?o(`button`,{className:`btn-secondary`,disabled:s,onClick:()=>void P(),children:s?o(D,{size:12,className:`spin`}):n(`settings.connectors.disconnect`)}):R?o(`button`,{className:`btn-primary`,disabled:s,onClick:()=>void F(),children:s?o(D,{size:12,className:`spin`}):r(i.Fragment,{children:[o(k,{size:12}),` `,n(`settings.connectors.saveConnect`)]})}):e.configurable===!1?o(`span`,{className:`connector-setup-required`,title:e.config_error??void 0,children:n(`settings.connectors.setupRequired`)}):r(i.Fragment,{children:[o(`button`,{className:`btn-primary`,disabled:s||g!==null,onClick:()=>void O(),children:s?o(D,{size:12,className:`spin`}):r(i.Fragment,{children:[o(k,{size:12}),` `,n(`settings.key.connect`)]})}),e.supports_device_code&&o(`button`,{className:`btn-secondary`,disabled:s||g!==null,onClick:()=>void A(),title:n(`settings.connectors.codeTitle`),children:n(`settings.connectors.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:[n(`settings.connectors.learnMore`),` `,o(k,{size:11})]})]}),g&&!e.configured&&r(`div`,{className:`device-code-block`,children:[r(`p`,{className:`device-code-instructions`,children:[n(`settings.connectors.goTo`),` `,o(`a`,{href:g.verification_uri,target:`_blank`,rel:`noopener noreferrer`,onClick:e=>{e.preventDefault(),E(g.verification_uri)},children:g.verification_uri})]}),r(`div`,{className:`device-code-value`,children:[o(`code`,{children:g.user_code}),o(`button`,{type:`button`,className:`btn-secondary`,onClick:()=>void navigator.clipboard?.writeText(g.user_code),title:n(`settings.connectors.copyCode`),children:n(`gpu.copy`)})]}),r(`p`,{className:`device-code-waiting`,children:[o(D,{size:12,className:`spin`}),` `,n(`settings.connectors.waiting`)]}),o(`button`,{type:`button`,className:`btn-secondary`,onClick:()=>_(null),children:n(`settings.key.cancel`)})]})]})}function q({connector:e,onChanged:t}){let n=j(),[a,s]=(0,N.useState)(!1),[c,l]=(0,N.useState)({}),[u,d]=(0,N.useState)(!1),[f,p]=(0,N.useState)(!1),[m,g]=(0,N.useState)(null),_=e.oauth_setup_fields??[];if(_.length===0)return null;let v=e.oauth_client,y=v?.source===`keyring`?n(`settings.connectors.savedClient`,{id:v.client_id??``}):v?.source===`env`?n(`settings.connectors.envClient`,{id:v.client_id??``}):n(`settings.connectors.noClient`),b=async()=>{if(!c.client_id?.trim())g(n(`settings.connectors.clientRequired`));else{d(!0),g(null),p(!1);try{await h(e.id,{...Object.fromEntries(Object.entries(c).map(([e,t])=>[e,t.trim()])),save_only:!0}),p(!0),l({}),t(),setTimeout(()=>p(!1),2200)}catch(e){g(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:()=>s(e=>!e),"aria-expanded":a,children:[o(a?w:E,{size:12}),o(`span`,{children:n(`settings.connectors.client`)}),o(`span`,{className:`oauth-client-editor__status`,children:y})]}),a&&r(`div`,{className:`oauth-setup-form`,children:[o(`p`,{className:`connector-desc`,children:n(`settings.connectors.clientHelp`)}),_.map(e=>r(`label`,{className:`oauth-setup-field`,children:[o(`span`,{className:`oauth-setup-label`,children:e.label}),o(`input`,{type:e.kind===`secret`?`password`:`text`,className:`oauth-setup-input`,placeholder:e.kind===`secret`&&v?.source===`keyring`&&v.has_secret?`••••••••`:e.placeholder,value:c[e.key]??``,onChange:t=>l(n=>({...n,[e.key]:t.target.value})),autoComplete:`off`,spellCheck:!1}),e.help_md&&o(`span`,{className:`oauth-setup-help`,children:o(`bdi`,{children:e.help_md})})]},e.key)),m&&r(`div`,{className:`configure-error`,children:[o(M,{size:12}),` `,m]}),o(`div`,{className:`configure-actions`,children:o(`button`,{className:`btn-model-save${f?` saved`:``}`,disabled:u||!c.client_id?.trim(),onClick:()=>void b(),children:u?o(D,{size:12,className:`spin`}):f?r(i.Fragment,{children:[o(T,{size:12}),` `,n(`settings.advanced.saved`)]}):n(`settings.connectors.saveClient`)})})]})]})}function J({connector:e,onChanged:t}){let n=j(),[a,s]=(0,N.useState)(()=>Object.fromEntries(e.mcp_env_keys.map(e=>[e,``]))),[c,l]=(0,N.useState)(!1),[u,p]=(0,N.useState)(!1),[m,g]=(0,N.useState)(null);(0,N.useEffect)(()=>{s(Object.fromEntries(e.mcp_env_keys.map(e=>[e,``])))},[e.mcp_env_keys.join(`,`)]);let _=e.mcp_env_keys.length===0,y=Object.values(a).every(e=>e.trim()===``),b=async()=>{let n=Object.fromEntries(Object.entries(a).filter(([,e])=>e.trim()!==``));if(_||Object.keys(n).length!==0){l(!0),g(null),p(!1);try{await h(e.id,n),p(!0),t(),setTimeout(()=>p(!1),2200)}catch(e){g(e instanceof Error?e.message:String(e))}finally{l(!1)}}},x=async()=>{l(!0),g(null);try{await f(e.id),s(Object.fromEntries(e.mcp_env_keys.map(e=>[e,``]))),t()}catch(e){g(e instanceof Error?e.message:String(e))}finally{l(!1)}},S=async()=>{l(!0),g(null);try{e.enabled?await d(e.id):await v(e.id),t()}catch(e){g(e instanceof Error?e.message:String(e))}finally{l(!1)}};return r(`div`,{className:`configure-body`,children:[e.description&&o(`p`,{className:`connector-desc`,children:o(`bdi`,{children:e.description})}),m&&r(`div`,{className:`configure-error`,children:[o(M,{size:12}),` `,m]}),e.configured&&r(`div`,{className:`connector-toggle-row`,children:[o(`span`,{className:`connector-toggle-label`,children:n(`settings.connectors.active`)}),r(`span`,{className:`toggle-switch`,children:[o(`input`,{type:`checkbox`,checked:e.enabled!==!1,onChange:()=>void S(),disabled:c,"aria-label":e.enabled?n(`settings.connectors.disableServer`):n(`settings.connectors.enableServer`)}),o(`span`,{className:`toggle-track`})]})]}),e.configured&&e.enabled===!1&&o(`p`,{className:`connector-toggle-help`,children:n(`settings.connectors.disabledHelp`)}),e.mcp_env_keys.map(t=>r(`div`,{className:`mcp-key-row`,children:[o(`label`,{className:`mcp-key-label`,children:t}),o(`input`,{type:`password`,className:`mcp-key-input`,placeholder:e.configured?`••••••••`:n.bare(`settings.connectors.enterValue`),value:a[t]??``,onChange:e=>s(n=>({...n,[t]:e.target.value})),spellCheck:!1,autoComplete:`off`})]},t)),r(`div`,{className:`configure-actions`,children:[!(_&&e.configured)&&o(`button`,{className:`btn-model-save${u?` saved`:``}`,disabled:c||!_&&y,onClick:()=>void b(),children:c?o(D,{size:12,className:`spin`}):u?r(i.Fragment,{children:[o(T,{size:12}),` `,n(`settings.advanced.saved`)]}):n(_?`settings.key.connect`:`settings.advanced.save`)}),e.configured&&o(`button`,{className:`btn-secondary`,disabled:c,onClick:()=>void x(),children:n(`settings.connectors.disconnect`)}),e.product_url&&r(`a`,{href:e.product_url,target:`_blank`,rel:`noopener noreferrer`,className:`connector-product-link`,children:[n(`settings.connectors.docs`),` `,o(k,{size:11})]})]})]})}function Y({agent:e,connectorId:t,grantedScopes:n,onChanged:i}){let a=j(),s=e.required_connections?.find(e=>e.connector_id===t),c=e.namespaced_agent_id;if(!s||!c)return null;let[u,d]=(0,N.useState)(()=>new Set(n)),[f,p]=(0,N.useState)(null),[h,g]=(0,N.useState)(null);(0,N.useEffect)(()=>{d(new Set(n))},[n.join(`,`)]);let _=async e=>{if(f!==null)return;let r=new Set(u);r.has(e)?r.delete(e):r.add(e),d(r),p(e),g(null);try{r.size===0?await l(t,c):await m(t,c,[...r]),i()}catch(e){d(new Set(n)),g(e instanceof Error?e.message:String(e))}finally{p(null)}};return r(`div`,{className:`grant-agent-card`,children:[o(`bdi`,{className:`grant-agent-card-name`,children:e.name}),o(`div`,{className:`grant-scope-list`,children:s.scopes.map(e=>r(`label`,{className:`grant-scope-item`,children:[o(`span`,{className:`grant-scope-label`,children:B(e,a)}),r(`span`,{className:`toggle-switch`,children:[o(`input`,{type:`checkbox`,checked:u.has(e),onChange:()=>void _(e),disabled:f!==null}),o(`span`,{className:`toggle-track`})]})]},e))}),h&&r(`div`,{className:`grant-scope-warning grant-scope-warning--error`,children:[o(M,{size:11}),` `,h]})]})}function X({servers:e,expanded:t,onToggle:n}){return o(`div`,{className:`agent-mcps-section`,children:o(`div`,{className:`connectors-list`,children:e.map(e=>{let r=`${e.agent_id}::${e.server_name}`;return o(Z,{server:e,expanded:t===r,onToggle:()=>n(r)},r)})})})}function Z({server:e,expanded:t,onToggle:n}){let i=j(),a=[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:[o(`span`,{className:`agent-mcp-server-name`,children:e.server_name}),o(`span`,{className:`agent-mcp-agent-label`,children:i(`settings.connectors.via`,{name:e.agent_name})}),e.disabled?o(`span`,{className:`agent-mcp-status disabled`,children:i(`settings.connectors.disabled`)}):r(`span`,{className:`agent-mcp-status enabled`,children:[o(T,{size:11}),` `,i(`settings.connectors.active`)]}),o(`span`,{className:`agent-mcp-readonly-badge`,children:i(`settings.connectors.readOnly`)}),o(`span`,{className:`agent-mcp-chevron`,children:o(t?w:E,{size:14})})]}),t&&r(`div`,{className:`agent-mcp-detail`,children:[a&&o(`bdi`,{dir:`ltr`,className:`agent-mcp-command-row`,children:a}),o(`bdi`,{dir:`ltr`,className:`agent-mcp-config-path`,children:e.config_path}),o(`div`,{className:`agent-mcp-config-hint`,children:i(`settings.connectors.editConfig`)})]})]})}function Q({connectorId:e,connectorType:t}){let n=j(),{agents:s}=a(),[l,u]=(0,N.useState)({}),[d,f]=(0,N.useState)({}),[p,m]=(0,N.useState)(!0),h=(0,N.useCallback)(async()=>{try{let[{grants:t},{activations:n}]=await Promise.all([x(e),c(e)]);u(t),f(n)}catch{u({}),f({})}finally{m(!1)}},[e]);if((0,N.useEffect)(()=>{h()},[h]),I((0,N.useCallback)(t=>{t.connectorId===e&&(t.reason===`grant_changed`||t.reason===`activation_changed`||t.reason===`disconnected`)&&h()},[e,h])),p)return null;let g=s.filter(t=>t.namespaced_agent_id&&t.required_connections?.some(t=>t.connector_id===e)),_=t===`mcp_server`?s.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:[o(`div`,{className:`grants-header`,children:n(`settings.connectors.grants`)}),g.length===0?o(`div`,{className:`grants-empty`,children:n(`settings.connectors.noGrants`)}):g.map(t=>o(Y,{agent:t,connectorId:e,grantedScopes:l[t.namespaced_agent_id]??[],onChanged:()=>void h()},t.namespaced_agent_id)),_.length>0&&r(i.Fragment,{children:[o(`div`,{className:`grants-header grants-header--activations`,children:n(`settings.connectors.activeFor`)}),o(`div`,{className:`grants-help`,children:n(`settings.connectors.activationHelp`)}),_.map(t=>o($,{agent:t,connectorId:e,active:!!d[t.namespaced_agent_id],grantedScopes:l[t.namespaced_agent_id]??[],onChanged:()=>void h()},`activation-${t.namespaced_agent_id}`))]})]})}function $({agent:e,connectorId:t,active:n,grantedScopes:i,onChanged:a}){let s=j(),c=e.required_connections?.find(e=>e.connector_id===t),l=e.namespaced_agent_id;if(!l)return null;let[u,d]=(0,N.useState)(n),[f,p]=(0,N.useState)(!1),[m,h]=(0,N.useState)(null);(0,N.useEffect)(()=>{d(n)},[n]);let g=async()=>{if(f)return;let e=!u;d(e),p(!0),h(null);try{if(e){let e=i.length===0?c?[...c.scopes]:[...H]:void 0;await _(t,l,e)}else await b(t,l);a()}catch(e){d(n),h(e instanceof Error?e.message:String(e))}finally{p(!1)}};return r(`div`,{className:`grant-agent-card`,children:[o(`bdi`,{className:`grant-agent-card-name`,children:e.name}),o(`div`,{className:`grant-scope-list`,children:r(`label`,{className:`grant-scope-item`,children:[o(`span`,{className:`grant-scope-label`,children:s(u?`settings.connectors.toolsVisible`:`settings.connectors.toolsHidden`)}),r(`span`,{className:`toggle-switch`,children:[o(`input`,{type:`checkbox`,checked:u,onChange:()=>void g(),disabled:f}),o(`span`,{className:`toggle-track`})]})]})}),m&&r(`div`,{className:`grant-scope-warning grant-scope-warning--error`,children:[o(M,{size:11}),` `,m]})]})}function ee(){let e=j();return r(`div`,{className:`settings-pane`,children:[o(`h2`,{className:`settings-pane-title`,children:e(`settings.section.connectors`)}),o(W,{})]})}export{ee as ConnectorsPane};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.connectors-section .settings-help{color:var(--text-secondary);font-size:13px;line-height:1.5;font-family:var(--font-sans);margin-bottom:12px}.connectors-loading{color:var(--text-muted);justify-content:center;padding:20px;display:flex}.connectors-list{flex-direction:column;gap:6px;display:flex}.connector-tile{border:1px solid var(--border-light);border-radius:var(--radius-md);background:var(--bg-secondary);transition:border-color var(--duration) var(--ease);overflow:hidden}.connector-tile:hover,.connector-tile--open{border-color:var(--border)}@media (width<=768px){.connector-tile-header{flex-wrap:wrap}.connector-status.ok{overflow-wrap:anywhere;flex-basis:100%;order:3;min-width:0}}.connector-tile-row{align-items:center;display:flex}.connector-tile-row .connector-tile-menu{flex-shrink:0;margin-inline-end:8px}.connectors-section{flex-direction:column;gap:12px;display:flex}.connector-tile-header{cursor:pointer;text-align:start;min-width:0;font-family:var(--font-sans);color:var(--text-primary);background:0 0;border:none;flex:1;align-items:center;gap:10px;padding:12px 16px;display:flex}.connector-tile-header:hover{background:var(--bg-hover)}[data-theme=dark] .connector-tile-header:hover{background:color-mix(in srgb, var(--text-primary) 4%, transparent)}.connector-tile-name{font-size:13px;font-weight:600}.connector-tile-type{font-size:var(--fs-caption);font-family:var(--font-sans);color:var(--text-muted);background:var(--bg-tertiary);border:1px solid var(--border-light);border-radius:999px;flex-shrink:0;padding:1px 6px}.connector-status{font-size:12px;font-family:var(--font-sans);align-items:center;gap:4px;display:inline-flex}.connector-status.ok{color:var(--accent-green)}.connector-status.idle{color:var(--text-muted)}.connector-status.disabled{color:var(--text-muted);background:var(--bg-tertiary);border:1px solid var(--border-light);border-radius:999px;padding:1px 8px;font-size:11px}.connector-tile-chevron{color:var(--text-muted);flex-shrink:0;margin-inline-start:auto}.connector-detail{border-top:1px solid var(--border-light);padding:16px 18px}.connector-desc{color:var(--text-secondary);font-size:12px;line-height:1.5;font-family:var(--font-sans);margin-bottom:12px}.configure-error{color:var(--danger);background:color-mix(in srgb, var(--danger) 8%, transparent);border:1px solid color-mix(in srgb, var(--danger) 20%, transparent);border-radius:var(--radius-sm);font-size:12px;font-family:var(--font-sans);align-items:center;gap:6px;margin-bottom:10px;padding:6px 10px;display:flex}.configure-info{color:var(--text-secondary);background:var(--bg-tertiary);border:1px solid var(--border-light);border-radius:var(--radius-sm);font-size:12px;font-family:var(--font-sans);align-items:flex-start;gap:6px;margin-bottom:10px;padding:6px 10px;line-height:1.4;display:flex}.configure-info svg{color:var(--text-muted);flex-shrink:0;margin-top:2px}.connector-setup-required{font-size:12px;font-family:var(--font-sans);color:var(--text-muted);background:var(--bg-tertiary);border:1px solid var(--border-light);cursor:default;border-radius:999px;align-items:center;gap:4px;padding:3px 10px;display:inline-flex}.configure-actions{align-items:center;gap:8px;margin-top:10px;display:flex}.oauth-setup-form{background:var(--bg-tertiary);border:1px solid var(--border-light);border-radius:6px;flex-direction:column;gap:12px;margin:8px 0 4px;padding:12px;display:flex}.oauth-setup-field{font-size:12px;font-family:var(--font-sans);flex-direction:column;gap:4px;display:flex}.oauth-setup-label{color:var(--text-primary);font-weight:500}.oauth-setup-input{border:1px solid var(--border-light);background:var(--bg-primary);color:var(--text-primary);font-family:var(--font-mono);border-radius:4px;padding:6px 8px;font-size:12px}.oauth-setup-input:focus{border-color:var(--accent);outline:none}.oauth-setup-help{color:var(--text-secondary);font-size:11px;line-height:1.4}.oauth-grant-onconnect{background:var(--bg-tertiary);border:1px solid var(--border-light);border-radius:6px;flex-direction:column;gap:6px;margin:8px 0 4px;padding:10px 12px;display:flex}.oauth-grant-onconnect-label{color:var(--text-primary);margin:0;font-size:12px;font-weight:500}.oauth-grant-onconnect-item{color:var(--text-primary);cursor:pointer;align-items:center;gap:8px;font-size:12px;display:flex}.oauth-grant-onconnect-help{color:var(--text-secondary);margin:2px 0 0;font-size:11px;line-height:1.4}.connector-product-link{color:var(--text-secondary);font-size:12px;font-family:var(--font-sans);align-items:center;gap:3px;margin-inline-start:auto;text-decoration:none;display:inline-flex}.connector-product-link:hover{color:var(--accent);text-decoration:underline}.mcp-key-row{flex-direction:column;gap:4px;margin-bottom:10px;display:flex}.mcp-key-label{font-size:var(--fs-label);font-family:var(--font-sans);color:var(--text-secondary)}.mcp-key-input{font-size:13px;font-family:var(--font-mono);background:var(--bg-primary);border:1px solid var(--border-light);border-radius:var(--radius-md);color:var(--text-primary);transition:border-color var(--duration) var(--ease);outline:none;padding:7px 10px}.mcp-key-input:focus{border-color:var(--accent)}.connection-grants{border-top:1px dashed var(--border-light);margin-top:12px;padding-top:12px}.grants-header{font-size:var(--fs-label);font-weight:600;font-family:var(--font-sans);color:var(--text-muted);margin-bottom:8px}.grants-empty{color:var(--text-muted);font-size:12px;font-family:var(--font-sans);font-style:italic}.grant-agent-card{border:1px solid var(--border-light);border-radius:var(--radius-sm);background:var(--bg-secondary);margin-top:6px;padding:10px 14px}.grant-agent-card-name{font-size:12px;font-weight:600;font-family:var(--font-sans);color:var(--text-primary);margin-bottom:10px}.grant-scope-list{border-top:1px solid var(--border-light);flex-direction:column;gap:2px;padding-top:8px;display:flex}.grant-scope-item{cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;gap:12px;padding:5px 0;display:flex}.grant-scope-label{font-size:12px;font-family:var(--font-sans);color:var(--text-secondary);flex:1;line-height:1.3}.grant-scope-warning{font-size:11px;font-family:var(--font-sans);color:var(--text-muted);align-items:center;gap:5px;margin-top:7px;display:flex}.grant-scope-warning--error{color:var(--danger)}.error-banner{background:color-mix(in srgb, var(--danger) 8%, transparent);color:var(--danger);border-radius:var(--radius-md);border:1px solid color-mix(in srgb, var(--danger) 20%, transparent);font-size:12px;font-family:var(--font-sans);align-items:center;gap:6px;margin-bottom:10px;padding:8px 12px;display:flex}.spin{animation:spin var(--duration-spin) var(--ease-linear) infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.connector-toggle-row{background:var(--bg-secondary);border:1px solid var(--border-light);border-radius:6px;align-items:center;gap:12px;margin-bottom:10px;padding:10px 14px;display:flex}.connector-toggle-label{font-size:12px;font-family:var(--font-sans);color:var(--text-primary);flex:1}.connector-toggle-help{color:var(--text-muted);margin:-4px 0 10px 14px;font-size:11px;font-style:italic}.connector-tile-menu{flex-shrink:0;align-items:center;display:inline-flex;position:relative}.connector-tile-menu-trigger{color:var(--text-muted);cursor:pointer;background:0 0;border:none;border-radius:4px;padding:4px;line-height:0}.connector-tile-menu-trigger:hover{background:var(--bg-tertiary);color:var(--text-primary)}.connector-tile-menu-trigger:focus-visible{outline:2px solid var(--accent-blue);outline-offset:1px}.connector-tile-menu-trigger:disabled{opacity:.4;cursor:not-allowed}.connector-tile-menu-popup{z-index:1000;background:var(--bg-primary);border:1px solid var(--border);text-align:start;border-radius:4px;flex-direction:column;min-width:160px;padding:4px;display:flex;box-shadow:0 4px 12px #0000002e}.connector-tile-menu-item{font-size:12px;font-family:var(--font-sans);color:var(--text-primary);text-align:start;cursor:pointer;background:0 0;border:none;border-radius:3px;padding:6px 10px;line-height:1.4}.connector-tile-menu-item:hover{background:var(--bg-secondary)}.connector-tile-menu-item:disabled{opacity:.4;cursor:not-allowed}.connector-tile-menu-item--danger{color:var(--danger)}.connector-tile-menu-divider{background:var(--border-light);height:1px;margin:4px 0}.agent-mcps-section{margin-top:20px}.agent-mcps-section-header{font-size:var(--fs-label);font-weight:600;font-family:var(--font-sans);color:var(--text-muted);margin-bottom:8px}.agent-mcp-tile{border:1px solid var(--border-light);border-radius:var(--radius-md);background:var(--bg-secondary);transition:border-color var(--duration) var(--ease);overflow:hidden}.agent-mcp-tile:hover,.agent-mcp-tile--open{border-color:var(--border)}.agent-mcp-tile-header{cursor:pointer;text-align:start;width:100%;font-family:var(--font-sans);color:var(--text-primary);background:0 0;border:none;align-items:center;gap:10px;padding:10px 14px;display:flex}.agent-mcp-tile-header:hover{background:var(--bg-hover)}[data-theme=dark] .agent-mcp-tile-header:hover{background:color-mix(in srgb, var(--text-primary) 4%, transparent)}.agent-mcp-server-name{font-size:13px;font-weight:600}.agent-mcp-agent-label{font-size:11px;font-family:var(--font-sans);color:var(--text-muted);flex:1}.agent-mcp-status{font-size:11px;font-family:var(--font-sans);align-items:center;gap:4px;display:inline-flex}.agent-mcp-status.enabled{color:var(--accent-green)}.agent-mcp-status.disabled{color:var(--text-muted);background:var(--bg-tertiary);border:1px solid var(--border-light);border-radius:999px;padding:1px 8px}.agent-mcp-readonly-badge{font-size:var(--fs-caption);font-family:var(--font-sans);color:var(--text-muted);background:var(--bg-tertiary);border:1px solid var(--border-light);border-radius:999px;flex-shrink:0;padding:1px 6px}.agent-mcp-chevron{color:var(--text-muted);flex-shrink:0}.agent-mcp-detail{border-top:1px solid var(--border-light);padding:12px 16px}.agent-mcp-command-row{font-size:12px;font-family:var(--font-mono);color:var(--text-secondary);background:var(--bg-tertiary);border:1px solid var(--border-light);border-radius:var(--radius-sm);word-break:break-all;margin-bottom:8px;padding:6px 10px}.agent-mcp-config-path{font-size:11px;font-family:var(--font-mono);color:var(--text-muted);word-break:break-all;margin-bottom:4px}.agent-mcp-config-hint{font-size:11px;font-family:var(--font-sans);color:var(--text-muted);font-style:italic}.connector-tile-menu-error{color:var(--danger);border-top:1px solid var(--border-light);margin-top:4px;padding:6px 10px;font-size:11px}.oauth-client-editor{border:1px solid var(--border-light);border-radius:var(--radius-sm);margin:6px 0 8px}.oauth-client-editor__toggle{width:100%;color:var(--text-primary);cursor:pointer;text-align:start;background:0 0;border:none;align-items:center;gap:6px;padding:6px 8px;font-size:12px;display:flex}.oauth-client-editor__status{color:var(--text-muted);text-overflow:ellipsis;white-space:nowrap;max-width:60%;margin-inline-start:auto;font-size:11px;overflow:hidden}.oauth-client-editor .oauth-setup-form{padding:0 8px 8px}.device-code-block{border:1px solid var(--border);background:var(--bg-secondary);border-radius:8px;margin-top:10px;padding:12px}.device-code-instructions{color:var(--text-primary);margin:0 0 8px;font-size:12px}.device-code-value{align-items:center;gap:8px;margin-bottom:8px;display:flex}.device-code-value code{letter-spacing:2px;background:var(--bg-tertiary);color:var(--text-primary);-webkit-user-select:all;user-select:all;border-radius:6px;padding:4px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:18px;font-weight:600}.device-code-waiting{color:var(--text-muted);align-items:center;gap:6px;margin:0 0 8px;font-size:12px;display:flex}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{G as t,K as n,P as r,i,n as a,o,r as s}from"./apiBase-DSN0u9ls.js";import{Ht as c,N as ee,Ut as te,_ as ne,et as re,pt as ie,rt as l,s as u,u as ae,vt as oe}from"./api-By968363.js";import{Dt as se,Ft as ce,G as le,J as ue,K as de,Q as fe,Rt as pe,St as me,Tt as d,Y as he,at as f,it as ge,pt as _e,q as ve,rt as ye,st as be,t as p,tt as m,ut as xe,zt as h}from"./index-8uiHNHOH.js";var g={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`]};g.node;var _=t(g),v={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`}]]};v.node;var Se=t(v),y={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`}]]};y.node;var Ce=t(y),b=e(n(),1),x=e=>e.toLocaleString(`en-US`);function S(e,t){let n=x(e.done);return e.phase===`reading`?e.total==null?t(`docs.progress.readingCount`,{done:n}):t(`docs.progress.reading`,{done:n,total:x(e.total)}):e.total==null?t(`docs.progress.embeddingCount`,{done:n}):t(`docs.progress.embedding`,{done:n,total:x(e.total)})}function C(e){return e.total==null||e.total<=0?null:Math.min(100,Math.floor(e.done/e.total*100))}function we({progress:e}){let t=S(e,m()),n=C(e);return i(`div`,{className:`index-progress is-running`,children:[s(`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:s(`div`,{className:`index-progress-fill`,style:n==null?void 0:{inlineSize:`${n}%`}})}),i(`span`,{className:`index-progress-label`,children:[t,n!=null&&i(`span`,{className:`index-progress-pct`,children:[` · `,n,`%`]})]})]})}function Te(e){let[t,...n]=e.replace(/^RAG indexing failed for [^:]+:\s*/,``).trim().split(`
|
|
2
|
+
`);return{summary:t.trim(),more:n.join(`
|
|
3
|
+
`).trim()}}function Ee(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 De=1e3;function w(e,t,n){if(n)return{...e,[t]:n};if(!(t in e))return e;let{[t]:r,...i}=e;return i}function Oe(e){let t=Math.floor((Date.now()-e)/1e3);return t<60?`${t}s`:`${Math.floor(t/60)}m ${t%60}s`}function ke(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 Ae(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 T(){let e=m(),{documents:t,setDocuments:n,setShowDocLibrary:g,setShowFileBrowser:v,currentSessionId:y,sessions:x,updateSessionInList:S,draftDocumentIds:C,addDraftDocuments:T,removeDraftDocument:E}=o(),D=x.find(e=>e.id===y)??null,[O,je]=(0,b.useState)(y?`chat`:`next`),k=O===`chat`?y:null,A=`“${D?.title||e(`docs.untitledChat`)}”`,[j,M]=(0,b.useState)(``),Me=(0,b.useCallback)(()=>g(!1),[g]);ge(!0,Me);let N=(0,b.useRef)(null);he(N,!0);let[Ne,P]=(0,b.useState)(!1),[F,I]=(0,b.useState)(!1),[Pe,L]=(0,b.useState)(``),[R,z]=(0,b.useState)(``),[B,V]=(0,b.useState)(null),[H,U]=(0,b.useState)(null),[W,G]=(0,b.useState)(new Set),[Fe,K]=(0,b.useState)({}),q=(0,b.useRef)(new Map),[,Ie]=(0,b.useState)(0);(0,b.useEffect)(()=>{r.doc.info(`Loading document library...`);let e=r.doc.time();l().then(t=>{let i=t.documents||[];n(i),r.doc.timed(`Loaded ${i.length} document(s), ${t.total_chunks||0} chunks, ${t.total_size_bytes||0} bytes total`,e)}).catch(e=>{r.doc.error(`Failed to load documents`,e),n([])})},[n]);let J=t.some(e=>e.indexing_status===`indexing`||e.indexing_status===`pending`);(0,b.useEffect)(()=>{if(!J)return;let e=o.getState().documents;for(let t of e)(t.indexing_status===`indexing`||t.indexing_status===`pending`)&&!q.current.has(t.id)&&q.current.set(t.id,Date.now());let t=!1,i=setInterval(async()=>{if(Ie(e=>e+1),!t){t=!0;try{let e=o.getState().documents.filter(e=>e.indexing_status===`indexing`||e.indexing_status===`pending`);for(let t of e)try{let e=await ee(t.id);if(K(n=>w(n,t.id,e.progress)),e.indexing_status!==`indexing`&&e.indexing_status!==`pending`){q.current.delete(t.id);let e=await l();n(e.documents||[]);break}}catch(e){r.doc.warn(`Indexing status for ${t.filename} unavailable`,e)}}finally{t=!1}}},De);return()=>clearInterval(i)},[J,n]),(0,b.useEffect)(()=>{let e=new Set(t.filter(e=>e.indexing_status===`indexing`||e.indexing_status===`pending`).map(e=>e.id));for(let t of q.current.keys())e.has(t)||q.current.delete(t);K(t=>Object.keys(t).reduce((t,n)=>e.has(n)?t:w(t,n,null),t))},[t]),(0,b.useEffect)(()=>{let e=setInterval(async()=>{try{let e=(await l()).documents||[],t=o.getState().documents;(e.length!==t.length||e.some((e,n)=>{let r=t.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}))&&(n(e),r.doc.debug(`Document list refreshed (server-side changes detected)`))}catch{}},15e3);return()=>clearInterval(e)},[n]);let Le=t.reduce((e,t)=>e+t.file_size,0),Re=t.reduce((e,t)=>e+t.chunk_count,0),Y=(0,b.useCallback)(async(t,n)=>{if(!k){T([t]),M(e(`docs.willAttach`,{name:n})),r.doc.info(`"${n}" will be attached to the next new chat`);return}await u(k,t);let i=o.getState().sessions.find(e=>e.id===k)?.document_ids??[];i.includes(t)||S(k,{document_ids:[...i,t]}),M(e(`docs.attached`,{name:n,chat:A})),r.doc.info(`Attached "${n}" to session ${k}`)},[k,A,S,T,e]),X=(0,b.useCallback)(async(e,t)=>{if(e.length===0)return;if(!k){T(e),r.doc.info(`"${t}" will be attached to the next new chat`);return}let n=[];for(let t of e)try{await u(k,t),n.push(t)}catch(e){r.doc.warn(`Could not attach document to session: ${e}`)}let i=o.getState().sessions.find(e=>e.id===k)?.document_ids??[],a=n.filter(e=>!i.includes(e));a.length>0&&S(k,{document_ids:[...i,...a]}),r.doc.info(`Attached "${t}" to session ${k}`)},[k,S,T]),Z=(0,b.useCallback)(async(t,i,a)=>{if(!await ye(`embedding`))return;let o=t.includes(`.`)?`.`+t.split(`.`).pop()?.toLowerCase():``,s=o&&!ue(o)?ve(o)?.message??`The file type "${o}" is not supported for indexing.`:null;if(s&&!a){r.doc.warn(`Unsupported file type: ${t} (${o})`),V({filename:t,error:s});return}r.doc.info(`Indexing document: ${t}`);let c=r.doc.time();I(!0),L(e(`docs.indexingFile`,{name:t})),V(null),U(null),M(``);try{let e=await i();if(r.doc.timed(`Indexed "${t}": ${e?.chunk_count||`?`} chunks`,c),e?.id)try{await Y(e.id,e.filename||t)}catch(e){r.doc.error(`Could not attach "${t}" to ${A}`,e),V({filename:t,error:`Indexed, but not attached to ${A}: ${e instanceof Error?e.message:e}`})}let a=await l();n(a.documents||[]),L(``)}catch(e){let{httpStatus:n,reason:i}=e??{};if(i===`is_folder`&&a){await a();return}r.doc.error(`Failed to index "${t}"`,e);let o=n===400&&s?s:e instanceof Error?e.message:`Upload failed`;V({filename:t,error:o,status:n,kind:i}),L(``)}finally{I(!1)}},[Y,A,n,e]),Q=(0,b.useCallback)(async(t,i)=>{r.doc.info(`"${t}" is a folder; indexing its documents`),L(e(`docs.indexingFolder`,{name:i}));try{let e=await re(t,!1);await X(e.documents.map(e=>e.id).filter(Boolean),i),U(Ee(i,e));let r=await l();n(r.documents||[])}catch(e){r.doc.error(`Failed to index folder "${t}"`,e);let n=e instanceof Error?e.message:`Folder indexing failed`,{httpStatus:a}=e??{};V({filename:i,error:n,status:a})}finally{L(``)}},[X,n,e]),ze=(0,b.useCallback)(async(e,t)=>{await Z(t,()=>te(e),()=>Q(e,t))},[Z,Q]),$=(0,b.useCallback)(async e=>{await Z(e.name,()=>c(e))},[Z]),Be=(0,b.useCallback)(async e=>{e.preventDefault(),P(!1);let t=Array.from(e.dataTransfer.files);r.doc.info(`Dropped ${t.length} file(s) into Document Library`);for(let e of t)await $(e)},[$]),Ve=(0,b.useCallback)(async e=>{let i=t.find(t=>t.id===e);r.doc.info(`Deleting document: ${i?.filename||e}`);try{await ne(e),q.current.delete(e),E(e),n(t.filter(t=>t.id!==e)),r.doc.info(`Deleted document: ${i?.filename||e}`)}catch(t){r.doc.error(`Failed to delete document: ${i?.filename||e}`,t)}},[t,n,E]),He=(0,b.useCallback)(async(e,t)=>{r.doc.info(`Opening folder for: ${e}`);try{await ie(e,!0)}catch(e){r.doc.error(`Failed to open folder for: ${t}`,e)}},[]),Ue=(0,b.useCallback)(async e=>{let i=t.find(t=>t.id===e);r.doc.info(`Cancelling indexing for: ${i?.filename||e}`);try{await ae(e),q.current.delete(e);let t=await l();n(t.documents||[]),r.doc.info(`Cancelled indexing for: ${i?.filename||e}`)}catch(t){r.doc.error(`Failed to cancel indexing: ${i?.filename||e}`,t)}},[t,n]),We=(0,b.useCallback)(async e=>{if(W.has(e))return;let i=t.find(t=>t.id===e);r.doc.info(`Reindexing document: ${i?.filename||e}`),G(t=>new Set(t).add(e));try{await oe(e),r.doc.info(`Reindex complete for: ${i?.filename||e}`)}catch(t){let n=t instanceof Error?t.message:String(t);r.doc.error(`Reindex failed for: ${i?.filename||e}`,t),V({filename:i?.filename||e,error:n})}finally{try{let e=await l();n(e.documents||[])}catch(e){r.doc.error(`Failed to refresh documents after reindex`,e)}G(t=>{let n=new Set(t);return n.delete(e),n})}},[t,n,W]),Ge=(0,b.useCallback)(async e=>{let n=t.find(t=>t.id===e)?.filename||e;M(``);try{await Y(e,n)}catch(e){r.doc.error(`Failed to attach ${n} to ${A}`,e),V({filename:n,error:`Not attached to ${A}: ${e instanceof Error?e.message:e}`})}},[t,Y,A]),Ke=(0,b.useCallback)(async e=>{if(e.preventDefault(),!R.trim())return;let t=R.trim();r.doc.info(`Indexing from path input: ${t}`),await ze(t,t.replace(/[\\/]+$/,``).split(/[\\/]/).pop()||`file`),z(``)},[R,ze]),qe=t=>{let n=t.indexing_status||`complete`,r=q.current.get(t.id),a=t.indexed_at?ke(t.indexed_at,e):``,o=t.indexed_at?Ae(t.indexed_at):``;switch(n){case`indexing`:case`pending`:{let n=Fe[t.id];return i(`div`,{className:`doc-indexing-status`,children:[n?s(we,{progress:n}):i(`div`,{className:`doc-indexing-bar`,children:[s(`div`,{className:`doc-indexing-bar-track`,children:s(`div`,{className:`doc-indexing-bar-fill`})}),i(`span`,{className:`doc-indexing-label`,children:[s(Se,{size:12,className:`doc-spin`}),r?e.hint(e(`docs.indexingLabel`),Oe(r)):e(`docs.indexing`)]})]}),i(`button`,{className:`btn-cancel`,onClick:e=>{e.stopPropagation(),Ue(t.id)},title:e(`docs.cancelIndexing`),"aria-label":e(`docs.cancelIndexingAria`,{name:t.filename}),children:[s(_,{size:14}),e(`docs.cancel`)]})]})}case`failed`:{let n=t.error_kind?le[t.error_kind]:void 0,r=t.last_error?Te(t.last_error):null;return i(`div`,{className:`doc-failure`,children:[i(`div`,{className:`doc-indexing-status`,children:[i(`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:[s(h,{size:12}),` `,e(n?`docs.cantRead`:`docs.failed`)]}),i(`button`,{className:n?`btn-retry btn-retry-quiet`:`btn-retry`,onClick:e=>{e.stopPropagation(),We(t.id)},title:e(n?`docs.retryTitleFix`:`docs.retryTitle`),"aria-label":e(`docs.retryAria`,{name:t.filename}),disabled:W.has(t.id),children:[s(Ce,{size:n?12:14}),W.has(t.id)?e(`docs.retrying`):e(`docs.retry`)]})]}),n&&s(`p`,{className:`doc-failure-hint`,children:n}),r&&(r.more?i(`details`,{className:`doc-failure-reason`,children:[s(`summary`,{children:r.summary}),s(`p`,{children:r.more})]}):s(`p`,{className:`doc-failure-reason`,children:r.summary})),!r&&!n&&s(`p`,{className:`doc-failure-reason`,children:e(`docs.noReason`)})]})}case`cancelled`:return i(`span`,{className:`doc-status-badge doc-status-cancelled`,children:[s(_,{size:12}),` `,e(`docs.cancelled`)]});case`missing`:return i(`span`,{className:`doc-status-badge doc-status-missing`,children:[s(h,{size:12}),` `,e(`docs.missing`)]});default:return i(`span`,{className:`doc-meta`,children:[s(`bdi`,{dir:`ltr`,children:p(t.file_size)}),` · `,e.plural(`docs.chunks`,t.chunk_count),a&&i(`span`,{className:`doc-timestamp`,title:e(`docs.indexedAt`,{time:o}),children:[s(ce,{size:10}),a]})]})}};return s(`div`,{ref:N,className:`modal-overlay`,onClick:()=>g(!1),role:`dialog`,"aria-modal":`true`,"aria-label":e(`docs.title`),children:i(`div`,{className:`modal-panel doc-modal`,onClick:e=>e.stopPropagation(),children:[i(`div`,{className:`modal-header`,children:[s(`h3`,{children:e(`docs.title`)}),s(`button`,{className:`btn-icon`,onClick:()=>g(!1),"aria-label":e(`docs.close`),children:s(f,{size:18})})]}),i(`div`,{className:`modal-body`,children:[i(`div`,{className:`doc-target`,children:[y?i(`label`,{className:`doc-target-choice`,children:[e(`docs.addTo`),i(`select`,{value:O,onChange:e=>{je(e.target.value),M(``)},children:[s(`option`,{value:`chat`,children:e(`docs.thisChat`,{chat:A})}),s(`option`,{value:`next`,children:e(`docs.nextChat`)})]})]}):s(`span`,{children:e(`docs.nextChatOnly`)}),s(`span`,{className:`doc-target-hint`,children:e(`docs.hint`)})]}),s(`div`,{className:`drop-zone ${Ne?`drag-over`:``} ${F?`uploading`:``}`,onDragOver:e=>{e.preventDefault(),P(!0)},onDragLeave:()=>P(!1),onDrop:Be,children:F?i(a.Fragment,{children:[s(`div`,{className:`upload-spinner`}),s(`p`,{children:Pe})]}):i(a.Fragment,{children:[s(be,{size:32,strokeWidth:1.5}),s(`p`,{children:e(`docs.drop`)}),s(`span`,{className:`drop-hint`,children:e(`docs.dropHint`)})]})}),i(`form`,{className:`path-input-form`,onSubmit:Ke,children:[s(d,{size:16,className:`path-icon`}),s(`input`,{type:`text`,className:`path-input`,value:R,onChange:e=>z(e.target.value),placeholder:e(`docs.pathPlaceholder`,{example:fe()}),"aria-label":e(`docs.pathAria`),dir:`auto`}),s(`button`,{type:`submit`,className:`btn-secondary`,disabled:!R.trim()||F,children:e(`docs.index`)}),i(`button`,{type:`button`,className:`btn-secondary`,onClick:()=>{g(!1),v(!0)},title:e(`docs.browseTitle`),children:[s(_e,{size:14}),e(`docs.browse`)]})]}),j&&s(`p`,{className:`doc-target-notice`,role:`status`,children:j}),B&&s(de,{filename:B.filename,error:B.error,status:B.status,kind:B.kind,onDismiss:()=>V(null)}),H&&i(`div`,{className:`doc-folder-notice`,role:`status`,children:[s(pe,{size:14}),s(`span`,{children:H}),s(`button`,{className:`btn-icon-sm`,onClick:()=>U(null),"aria-label":e(`docs.dismissFolder`),children:s(f,{size:12})})]}),t.length>0&&i(`div`,{className:`doc-stats`,children:[s(`span`,{children:e.plural(`docs.count`,t.length)}),s(`span`,{children:`·`}),s(`span`,{children:e.plural(`docs.chunks`,Re)}),s(`span`,{children:`·`}),s(`bdi`,{dir:`ltr`,children:p(Le)})]}),i(`div`,{className:`doc-list`,children:[t.length===0&&!F&&i(`div`,{className:`empty-docs`,children:[s(se,{size:32,strokeWidth:1}),s(`p`,{children:e(`docs.empty`)}),s(`span`,{children:e(`docs.emptyHint`)})]}),t.map(t=>i(`div`,{className:`doc-row ${t.indexing_status===`indexing`?`doc-row-indexing`:``}`,children:[i(`div`,{className:`doc-info`,children:[s(`span`,{className:`doc-name`,dir:`auto`,children:t.filename}),qe(t)]}),i(`div`,{className:`doc-row-actions`,children:[t.filepath&&s(`button`,{className:`btn-icon-sm doc-open-folder`,onClick:()=>He(t.filepath,t.filename),title:e(`docs.openFolder`,{path:t.filepath}),"aria-label":e(`docs.openFolderAria`,{name:t.filename}),children:s(d,{size:14})}),t.indexing_status===`complete`&&!(k?D?.document_ids?.includes(t.id):C.includes(t.id))&&s(`button`,{className:`btn-icon-sm doc-attach`,onClick:()=>Ge(t.id),title:k?e(`docs.useIn`,{chat:A}):e(`docs.useNext`),"aria-label":k?e(`docs.attachAria`,{name:t.filename,chat:A}):e(`docs.attachNextAria`,{name:t.filename}),children:s(me,{size:14})}),t.indexing_status!==`indexing`&&t.indexing_status!==`pending`&&s(`button`,{className:`btn-icon-sm doc-delete`,onClick:()=>Ve(t.id),title:e(`docs.remove`),"aria-label":e(`docs.removeAria`,{name:t.filename}),children:s(xe,{size:14})})]})]},t.id))]})]})]})})}export{T as DocumentLibrary};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{G as t,K as n,P as r,i,o as a,r as o}from"./apiBase-DSN0u9ls.js";import{Ut as s,_t as c,et as l,l as u,rt as d,s as f,wt as p}from"./api-By968363.js";import{Ct as m,Dt as h,Et as g,Gt as ee,J as _,K as te,Kt as ne,Ot as re,Tt as ie,Vt as ae,Y as oe,at as v,it as se,jt as y,pt as ce,q as b,rt as x,st as le,t as ue,wt as S,yt as C}from"./index-8uiHNHOH.js";var w={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`}]]};w.node;var de=t(w),T={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`]};T.node;var E=t(T),D={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`}]]};D.node;var O=t(D),k=e(n(),1);function fe(e){if(e.type===`folder`)return o(S,{size:16});let t=(e.extension||``).toLowerCase();return[`.csv`,`.xlsx`,`.xls`,`.tsv`].includes(t)?o(O,{size:16}):[`.py`,`.js`,`.ts`,`.java`,`.c`,`.cpp`,`.go`,`.rs`].includes(t)?o(de,{size:16}):[`.pdf`,`.doc`,`.docx`,`.txt`,`.md`].includes(t)?o(h,{size:16}):o(g,{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 o(E,{size:14});case`desktop`:return o(C,{size:14});case`documents`:return o(h,{size:14});case`download`:return o(y,{size:14});default:return o(S,{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 A(e,t,n,i){let o=[],c=[];for(let t of e){let e=t.includes(`.`)?`.`+t.split(`.`).pop()?.toLowerCase():``;e&&!_(e)?c.push(t):o.push(t)}let u=[],p=[],m=0,h=``,g=new Set(t.filter(e=>e.type===`folder`).map(e=>e.path));for(let e of o)try{if(g.has(e)){let t=await l(e),n=[];t.documents.forEach(e=>{e.id&&n.push(e.id)}),n.length>0&&(n.forEach(e=>u.push(e)),p.push(e))}else{if(!await x(`embedding`))break;let t=await s(e);t?.id&&(u.push(t.id),p.push(e))}}catch(e){m++,h=e instanceof Error?e.message:`Unknown error`}if(n&&u.length>0){let e=[];for(let t of u)try{await f(n,t),e.push(t)}catch(e){r.doc.warn(`Could not attach document to session: ${e}`)}let t=a.getState().sessions.find(e=>e.id===n)?.document_ids??[],o=e.filter(e=>!t.includes(e));o.length>0&&i(n,{document_ids:[...t,...o]})}else u.length>0&&a.getState().addDraftDocuments(u);if(u.length>0)try{let e=await d();a.getState().setDocuments(e.documents||[])}catch(e){r.doc.error(`Could not refresh the document list after indexing`,e)}return{docIds:u,supported:o,succeededFiles:p,unsupported:c,failed:m,lastError:h}}var j=e=>e.startsWith(`.`);function M({onStartChat:e}){let{setShowFileBrowser:t,currentSessionId:n,updateSessionInList:s,setPendingPrompt:l}=a(),d=(0,k.useCallback)(()=>t(!1),[t]);se(!0,d);let f=(0,k.useRef)(null);oe(f,!0);let[h,g]=(0,k.useState)(``),[y,x]=(0,k.useState)(null),[S,C]=(0,k.useState)([]),[w,de]=(0,k.useState)([]),[T,E]=(0,k.useState)(!1),[D,O]=(0,k.useState)(null),[M,_e]=(0,k.useState)(!1),[N,P]=(0,k.useState)(``),[F,I]=(0,k.useState)(null),[L,R]=(0,k.useState)([]),[ve,ye]=(0,k.useState)(!1),[z,B]=(0,k.useState)(!1),[V,be]=(0,k.useState)(``),[H,U]=(0,k.useState)(new Set),[W,G]=(0,k.useState)(null),[xe,Se]=(0,k.useState)(!1),[Ce,K]=(0,k.useState)(new Set),[we,q]=(0,k.useState)(null),J=(0,k.useRef)(null),[Y,X]=(0,k.useState)(null),Z=(0,k.useCallback)(async e=>{E(!0),O(null),I(null),P(``),R([]);try{let t=await u(e);g(t.current_path),x(t.parent_path),C(t.entries),t.quick_links.length>0&&de(t.quick_links),r.ui.info(`Browsing: ${t.current_path} (${t.entries.length} items)`)}catch(e){let t=e instanceof Error?e.message:`Failed to load directory`;O(t),r.ui.error(`Browse failed`,e)}finally{E(!1)}},[]);(0,k.useEffect)(()=>{Z()},[Z]),(0,k.useEffect)(()=>()=>{J.current&&clearTimeout(J.current)},[]);let Q=(0,k.useCallback)(async()=>{if(!N.trim())I(null),R([]);else{B(!0),O(null);try{let e=await p(N.trim(),V||void 0,30);I(e.results),R(e.searched_locations??[]),ye(e.truncated===!0),r.ui.info(`Search "${N}": ${e.total} results`)}catch(e){let t=e instanceof Error?e.message:`Search failed`;O(t),r.ui.error(`Search failed`,e)}finally{B(!1)}}},[N,V]),Te=e=>{e.key===`Enter`&&Q()},Ee=(0,k.useCallback)(e=>{e.type===`folder`&&(Z(e.path),U(new Set),G(null))},[Z]),De=(0,k.useCallback)(async e=>{Se(!0);try{let t=await c(e);G(t)}catch(e){r.ui.error(`Preview failed`,e)}finally{Se(!1)}},[]),Oe=(0,k.useCallback)(e=>{U(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),ke=(0,k.useCallback)(async()=>{if(H.size===0)return;let e=Array.from(H);if(X(null),!e.some(e=>{let t=e.includes(`.`)?`.`+e.split(`.`).pop()?.toLowerCase():``;return!t||_(t)})){let t=e[0],n=t.lastIndexOf(`.`),r=n>0?t.slice(n).toLowerCase():``,i=b(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 A(e,S,n,s);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),U(new Set)}catch(t){r.doc.error(`Index selected failed`,t),X({filename:e.length===1?e[0].split(/[\\/]/).pop()||e[0]:`${e.length} files`,error:t instanceof Error?t.message:`An unexpected error occurred.`})}finally{K(new Set)}}},[H,n,s,S]),$=(0,k.useRef)(!1),Ae=(0,k.useCallback)(async()=>{if(H.size===0||$.current)return;$.current=!0;let i=Array.from(H);X(null),K(new Set(i)),q(`Indexing ${i.length} file(s) for analysis...`);try{let r=await A(i,S,n,s);if(r.supported.length===0){let e=i[0].lastIndexOf(`.`),t=e>0?i[0].slice(e).toLowerCase():``,n=b(t);X({filename:i.length===1?i[0].split(/[\\/]/).pop()||i[0]:`${i.length} files`,error:n?.message??`File type "${t}" is not supported for indexing.`});return}if(r.docIds.length===0){X({filename:r.supported.length===1?r.supported[0].split(/[\\/]/).pop()||r.supported[0]:`${r.supported.length} files`,error:`Failed to index selected file(s). Please try again.`});return}r.failed>0&&q(`Warning: ${r.failed} file(s) failed to index and will be excluded.`);let a=(r.succeededFiles.length>0?r.succeededFiles:r.supported).map(e=>e.split(/[\\/]/).pop()||e),o=a.length===1?`Please analyze this document for me: ${a[0]}`:`Please analyze these documents for me:\n${a.map(e=>`- ${e}`).join(`
|
|
2
|
+
`)}`;n?l({sessionId:n,text:o}):await e(o),t(!1),U(new Set)}catch(e){r.doc.error(`Ask Agent failed`,e),X({filename:i.length===1?i[0].split(/[\\/]/).pop()||i[0]:`${i.length} files`,error:e instanceof Error?e.message:`An unexpected error occurred.`})}finally{$.current=!1,K(new Set),q(null)}},[H,n,s,S,l,t,e]),je=h?h.replace(/\\/g,`/`).split(`/`).filter(Boolean):[],Me=je.map((e,t)=>({label:e,path:je.slice(0,t+1).join(`/`)+(t===0&&e.includes(`:`)?`/`:``)})),Ne=me(L),Pe=S.filter(e=>!j(e.name)),Fe=F?F.map(e=>({name:e.name,path:e.path,type:`file`,size:e.size,extension:e.extension||``,modified:e.modified||``})):M?S:Pe,Ie=S.length-Pe.length;return(0,k.useEffect)(()=>{M||F||U(e=>{let t=[...e].filter(e=>!j(e.split(/[\\/]/).pop()??``));return t.length===e.size?e:new Set(t)})},[M,F]),o(`div`,{ref:f,className:`modal-overlay`,onClick:()=>t(!1),role:`dialog`,"aria-modal":`true`,"aria-label":`File browser`,children:i(`div`,{className:`modal-panel file-browser-modal ${W?`has-preview`:``}`,onClick:e=>e.stopPropagation(),children:[i(`div`,{className:`modal-header`,children:[i(`h3`,{children:[o(ie,{size:18}),` File browser`]}),o(`button`,{className:`btn-icon`,onClick:()=>t(!1),"aria-label":`Close`,children:o(v,{size:18})})]}),i(`div`,{className:`file-browser-body`,children:[o(`div`,{className:`fb-quick-links`,children:w.map(e=>i(`button`,{className:`fb-quick-link`,onClick:()=>Z(e.path),title:e.path,children:[he(e.icon),o(`span`,{children:e.name})]},e.path))}),i(`div`,{className:`fb-search-bar`,children:[i(`div`,{className:`fb-search-input-wrap`,children:[o(ce,{size:14,className:`fb-search-icon`}),o(`input`,{type:`text`,className:`fb-search-input`,placeholder:`Search files on your PC...`,value:N,onChange:e=>P(e.target.value),onKeyDown:Te,"aria-label":`Search files`}),N&&o(`button`,{className:`fb-search-clear`,onClick:()=>{P(``),I(null),R([])},"aria-label":`Clear search`,children:o(v,{size:12})})]}),o(`select`,{className:`fb-type-filter`,value:V,onChange:e=>be(e.target.value),"aria-label":`File type filter`,children:ge.map(e=>o(`option`,{value:e.value,children:e.label},e.value))}),o(`button`,{className:`fb-search-btn`,onClick:Q,disabled:!N.trim()||z,children:z?`Searching...`:`Search`})]}),!F&&i(`div`,{className:`fb-pathbar`,children:[i(`div`,{className:`fb-breadcrumb`,children:[o(`button`,{className:`fb-crumb`,onClick:()=>Z(`/`),children:o(m,{size:12})}),Me.map((e,t)=>i(`span`,{className:`fb-crumb-item`,children:[o(ae,{size:12,className:`fb-crumb-sep`}),o(`button`,{className:`fb-crumb`,onClick:()=>Z(e.path),children:e.label})]},t)),y&&o(`button`,{className:`fb-up-btn`,onClick:()=>Z(y),title:`Go up`,children:o(ne,{size:14})})]}),i(`label`,{className:`fb-hidden-toggle`,children:[o(`input`,{type:`checkbox`,checked:M,onChange:e=>_e(e.target.checked)}),`Show hidden`]})]}),F&&i(`div`,{className:`fb-search-header`,children:[i(`div`,{className:`fb-search-summary`,children:[i(`span`,{children:[`Found `,F.length,` result(s) for "`,N,`"`]}),Ne&&i(`span`,{className:`fb-search-scope`,title:L.join(`
|
|
3
|
+
`),children:[`Searching in: `,o(`code`,{children:Ne})]}),ve&&o(`span`,{children:`Search stopped early, so some matches may be missing. Try a more specific name.`})]}),o(`button`,{className:`fb-back-btn`,onClick:()=>{I(null),P(``),R([])},children:`Back to browsing`})]}),D&&o(`div`,{className:`fb-error`,children:D}),i(`div`,{className:`fb-content`,children:[i(`div`,{className:`fb-file-list`,children:[T&&o(`div`,{className:`fb-loading`,children:`Loading...`}),!T&&Fe.length===0&&o(`div`,{className:`fb-empty`,children:F?`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&&!_(t),r=n?b(t):null;return i(`div`,{className:`fb-entry ${e.type} ${H.has(e.path)?`selected`:``} ${n?`unsupported`:``}`,onClick:()=>e.type===`folder`?Ee(e):Oe(e.path),onDoubleClick:()=>e.type===`folder`?Ee(e):void 0,title:n?`${r?.label||`This`} file type cannot be indexed`:e.path,children:[o(`input`,{type:`checkbox`,className:`fb-entry-checkbox`,checked:H.has(e.path),onChange:()=>Oe(e.path),onClick:e=>e.stopPropagation(),"aria-label":`Select ${e.name}`}),o(`span`,{className:`fb-entry-icon`,children:fe(e)}),o(`span`,{className:`fb-entry-name`,title:e.path,children:e.name}),n&&o(`span`,{className:`fb-unsupported-badge`,children:`Not indexable`}),e.type===`file`&&o(`button`,{type:`button`,className:`fb-entry-preview-btn`,onClick:t=>{t.stopPropagation(),De(e.path)},"aria-label":`Preview ${e.name}`,title:`Preview file`,children:o(re,{size:14})}),o(`span`,{className:`fb-entry-size`,children:e.type===`file`?ue(e.size):``}),o(`span`,{className:`fb-entry-date`,children:pe(e.modified)})]},e.path)})]}),W&&i(`div`,{className:`fb-preview`,children:[i(`div`,{className:`fb-preview-header`,children:[o(`span`,{className:`fb-preview-name`,children:W.name}),o(`button`,{className:`btn-icon-sm`,onClick:()=>G(null),"aria-label":`Close preview`,children:o(v,{size:14})})]}),i(`div`,{className:`fb-preview-meta`,children:[o(`span`,{children:W.size_display}),W.total_lines&&i(`span`,{children:[W.total_lines,` lines`]}),W.columns&&i(`span`,{children:[W.columns.length,` columns`]}),W.row_count!==null&&i(`span`,{children:[W.row_count,` rows`]})]}),W.columns&&i(`div`,{className:`fb-preview-columns`,children:[o(`strong`,{children:`Columns:`}),` `,W.columns.join(`, `)]}),xe?o(`div`,{className:`fb-preview-loading`,children:`Loading preview...`}):W.is_text&&W.preview_lines.length>0?o(`pre`,{className:`fb-preview-content`,children:W.preview_lines.slice(0,30).join(`
|
|
4
|
+
`)}):o(`div`,{className:`fb-preview-binary`,children:`Binary file - no preview available`})]})]}),Y&&o(te,{filename:Y.filename,error:Y.error,onDismiss:()=>X(null)}),i(`div`,{className:`fb-actions`,children:[o(`div`,{className:`fb-selection-info`,children:H.size>0?`${H.size} item(s) selected`:`Select files to index or analyze`}),we&&o(`span`,{className:`fb-index-status`,children:we}),i(`div`,{className:`fb-action-btns`,children:[i(`button`,{className:`fb-action-btn secondary`,onClick:ke,disabled:H.size===0||Ce.size>0,title:`Index selected files for RAG search`,children:[o(le,{size:14}),`Index Selected`]}),i(`button`,{className:`fb-action-btn primary`,onClick:Ae,disabled:H.size===0||Ce.size>0,title:`Index and send selected files to the chat agent for analysis`,children:[o(ee,{size:14}),`Ask Agent`]})]})]})]})]})})}export{M as FileBrowser};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{G as t,K as n,P as r,i,k as a,n as o,o as s,r as c}from"./apiBase-DSN0u9ls.js";import{n as l,t as u}from"./zap-B97NJZKh.js";import{$ as d,A as ee,B as te,C as ne,D as re,E as ie,F as f,Ft as ae,Gt as oe,H as se,Ht as ce,I as le,It as ue,L as de,M as fe,Mt as pe,N as me,Nt as he,O as p,Ot as ge,P as _e,Pt as m,R as ve,Rt as ye,S as be,T as xe,U as Se,Ut as Ce,V as we,Vt as Te,W as h,Y as Ee,_ as De,_t as Oe,at as ke,b as Ae,ct as je,dt as Me,et as Ne,f as Pe,g as Fe,gt as Ie,h as Le,ht as Re,it as ze,j as Be,k as Ve,lt as He,m as Ue,ot as We,p as Ge,pt as Ke,t as qe,tt as Je,ut as Ye,v as Xe,w as Ze,x as Qe,xt as $e,y as et,z as tt}from"./index-8uiHNHOH.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 nt=t(g),rt={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`}]]};rt.node;var it=t(rt),_={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`}]]};_.node;var at=t(_),ot={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`}]]};ot.node;var st=t(ot),v={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`}]]};v.node;var ct=t(v),lt={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`}]]};lt.node;var ut=t(lt),dt={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`}]]};dt.node;var ft=t(dt),y=e(n(),1),pt=[{title:`mem.about.group.preferences`,categories:[`preference`]},{title:`mem.about.group.about`,categories:[`fact`,`profile`,`skill`]},{title:`mem.about.group.reminders`,categories:[`reminder`]},{title:`mem.about.group.notes`,categories:[`note`]}],mt={user:`mem.source.user`,tool:`mem.source.tool`,llm_extract:`mem.source.llm_extract`,consolidation:`mem.source.consolidation`,inferred:`mem.source.inferred`,discovery:`mem.source.discovery`};function ht(e){return mt[e]??`mem.source.other`}function gt(e,t){let n=new Date(e);if(Number.isNaN(n.getTime()))return null;let r=Math.floor((Date.now()-n.getTime())/864e5);return r<=0?a(`mem.day.today`):r===1?a(`mem.day.yesterday`):r<30?a(`mem.day.daysAgo`,{n:r}):n.toLocaleDateString(d(t),{month:`short`,day:`numeric`,year:`numeric`})}function _t(e,t=new Date,n=Ne){let r=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e),i=r?new Date(+r[1],r[2]-1,+r[3]):new Date(e);if(Number.isNaN(i.getTime()))return null;let a=i.getHours()===0&&i.getMinutes()===0&&i.getSeconds()===0,o=new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime(),s=a?i.getTime()<o:i.getTime()<t.getTime(),c=i.toLocaleString(d(n),{weekday:`short`,month:`short`,day:`numeric`,...i.getFullYear()===t.getFullYear()?{}:{year:`numeric`},...a?{}:{hour:`numeric`,minute:`2-digit`}});return{text:n(s?`mem.due.past`:`mem.due.upcoming`,{when:c}),past:s}}function vt({memoryEnabled:e,reloadKey:t,onChanged:n,onOpenAdvanced:s,showToast:l}){let u=Je(),[d,ee]=(0,y.useState)(null),[te,ne]=(0,y.useState)(null),[ie,f]=(0,y.useState)(null),[ae,oe]=(0,y.useState)(``),[se,ce]=(0,y.useState)([]),[le,ue]=(0,y.useState)(new Set),[de,fe]=(0,y.useState)(``),[pe,me]=(0,y.useState)(`fact`),[he,p]=(0,y.useState)(null),_e=(0,y.useRef)(0),m=(0,y.useCallback)(async()=>{let e=++_e.current;try{let t=await re({about_user:!0,include_sensitive:!0,sort_by:`updated_at`,order:`desc`,limit:200});if(e!==_e.current)return;ee(t.items),ne(null)}catch(t){if(e!==_e.current)return;r.system.warn(`Failed to load what GAIA knows about the user`,t),ne(t instanceof Error?t.message:String(t))}},[]);(0,y.useEffect)(()=>{m()},[m,t]);let ve=(0,y.useCallback)(async e=>{let t=ae.trim();if(!t||t===e.content)f(null);else{p(e.id);try{await be(e.id,{content:t}),f(null),l(u(`mem.about.updated`),`success`),await m(),n()}catch(e){r.system.error(`Failed to edit memory`,e),l(u(`mem.about.editFailed`,{error:b(e)}),`error`)}finally{p(null)}}},[ae,m,n,l,u]),ye=(0,y.useCallback)(async e=>{p(e.id);try{await Qe(e.id),_e.current++,ee(t=>(t??[]).filter(t=>t.id!==e.id)),ce(t=>[e,...t]),n()}catch(e){r.system.error(`Failed to forget memory`,e),l(u(`mem.about.forgetFailed`,{error:b(e)}),`error`)}finally{p(null)}},[n,l,u]),xe=(0,y.useCallback)(async e=>{p(e.id);try{await et({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}),ce(t=>t.filter(t=>t.id!==e.id)),await m(),n()}catch(e){r.system.error(`Failed to restore memory`,e),l(u(`mem.about.restoreFailed`,{error:b(e)}),`error`)}finally{p(null)}},[m,n,l,u]),Se=(0,y.useCallback)(async()=>{let e=de.trim();if(e){p(`new`);try{await et({content:e,category:pe}),fe(``),l(u(`mem.about.saved`),`success`),await m(),n()}catch(e){r.system.error(`Failed to add memory`,e),l(u(`mem.about.addFailed`,{error:b(e)}),`error`)}finally{p(null)}}},[de,pe,m,n,l,u]);if(!e)return i(`div`,{className:`mem-about`,children:[c(`h2`,{className:`mem-about-title`,children:u(`mem.about.title`)}),i(`div`,{className:`mem-about-empty`,children:[c(`p`,{children:u(`mem.about.off`)}),c(`button`,{className:`btn-secondary`,onClick:s,children:u(`mem.about.turnOn`)})]})]});let Ce=pt.map(e=>({...e,rows:(d??[]).filter(t=>e.categories.includes(t.category))})).filter(e=>e.rows.length>0);return i(`div`,{className:`mem-about`,children:[c(`h2`,{className:`mem-about-title`,children:u(`mem.about.title`)}),c(`p`,{className:`mem-about-intro`,children:u(`mem.about.intro`)}),i(`form`,{className:`mem-about-add`,onSubmit:e=>{e.preventDefault(),Se()},children:[c(`input`,{className:`mem-input`,placeholder:u(`mem.about.addPlaceholder`),"aria-label":u(`mem.about.addLabel`),value:de,onChange:e=>fe(e.target.value)}),i(`select`,{className:`mem-select`,"aria-label":u(`mem.about.kind`),value:pe,onChange:e=>me(e.target.value),children:[c(`option`,{value:`fact`,children:u(`mem.about.group.about`)}),c(`option`,{value:`preference`,children:u(`mem.about.kind.preference`)}),c(`option`,{value:`reminder`,children:u(`mem.about.kind.reminder`)}),c(`option`,{value:`note`,children:u(`mem.about.kind.note`)})]}),i(`button`,{className:`btn-primary`,type:`submit`,disabled:!de.trim()||he===`new`,children:[c(Ie,{size:14}),` `,u(`mem.about.add`)]})]}),se.map(e=>i(`div`,{className:`mem-about-forgotten`,role:`status`,children:[c(`span`,{children:e.sensitive?u(`mem.about.forgottenSensitive`):u(`mem.about.forgotten`,{content:e.content})}),i(`button`,{className:`mem-about-link`,disabled:he===e.id,onClick:()=>xe(e),children:[c(je,{size:12}),` `,u(`mem.about.undo`)]})]},e.id)),te?i(`div`,{className:`mem-about-empty`,children:[c(`p`,{children:u(`mem.about.loadFailed`,{error:te})}),c(`button`,{className:`btn-secondary`,onClick:m,children:u(`mem.about.retry`)})]}):d===null?i(`div`,{className:`mem-loading`,children:[c(`div`,{className:`mem-spinner`}),` `,u(`mem.loading`)]}):Ce.length===0?i(`div`,{className:`mem-about-empty`,children:[c(`p`,{children:u(`mem.about.empty`)}),c(`p`,{className:`mem-about-hint`,children:u(`mem.about.emptyHint`)})]}):Ce.map(e=>i(`section`,{className:`mem-about-group`,"aria-label":u(e.title),children:[c(`h3`,{className:`mem-about-group-title`,children:u(e.title)}),c(`ul`,{className:`mem-about-list`,children:e.rows.map(e=>{let t=e.sensitive&&!le.has(e.id),n=e.due_at?_t(e.due_at,new Date,u):null,r=gt(e.updated_at,u),s=t?a(`mem.about.sensitiveMemory`):e.content;return c(`li`,{className:`mem-about-item`,children:ie===e.id?i(`form`,{className:`mem-about-edit`,onSubmit:t=>{t.preventDefault(),ve(e)},children:[c(`textarea`,{className:`mem-input`,"aria-label":u(`mem.about.editLabel`),rows:2,autoFocus:!0,value:ae,onChange:e=>oe(e.target.value),onKeyDown:t=>{t.key===`Escape`&&(t.stopPropagation(),f(null)),t.key===`Enter`&&!t.shiftKey&&(t.preventDefault(),ve(e))}}),i(`div`,{className:`mem-about-edit-actions`,children:[c(`button`,{className:`btn-primary`,type:`submit`,disabled:he===e.id,children:u(`mem.about.save`)}),c(`button`,{className:`btn-secondary`,type:`button`,onClick:()=>f(null),children:u(`mem.about.cancel`)})]})]}):i(o.Fragment,{children:[i(`div`,{className:`mem-about-text`,children:[t?i(`button`,{className:`mem-about-link`,onClick:()=>ue(t=>new Set(t).add(e.id)),children:[c(ge,{size:12}),` `,u(`mem.about.showSensitive`)]}):c(`bdi`,{children:e.content}),n&&c(`span`,{className:`mem-about-due${n.past?` is-overdue`:``}`,children:n.text}),c(`span`,{className:`mem-about-meta`,children:r===null?u(ht(e.source)):u(`mem.about.meta`,{source:a(ht(e.source)),when:r})})]}),i(`div`,{className:`mem-about-actions`,children:[c(`button`,{className:`mem-about-btn`,"aria-label":u(`mem.about.editAria`,{name:s}),title:u(`mem.about.edit`),onClick:()=>{f(e.id),oe(e.content)},children:c(Oe,{size:14})}),i(`button`,{className:`mem-about-btn mem-about-btn-remove`,"aria-label":u(`mem.about.forgetAria`,{name:s}),title:u(`mem.about.forget`),disabled:he===e.id,onClick:()=>ye(e),children:[c(Ye,{size:14}),` `,u(`mem.about.forget`)]})]})]})},e.id)})})]},e.title))]})}function b(e){return e instanceof Error?e.message:String(e)}function yt(e,t){if(!e)return`—`;try{let n=new Date(e);if(isNaN(n.getTime()))return`—`;let r={month:`short`,day:`numeric`};return n.getFullYear()!==new Date().getFullYear()&&(r.year=`numeric`),n.toLocaleDateString(t,r)}catch{return`—`}}function x(e,t){if(!e)return``;try{let n=new Date(e);return isNaN(n.getTime())?``:n.toLocaleString(t,{year:`numeric`,month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`})}catch{return``}}function S(e,t){if(!e)return`—`;try{let n=new Date(e);if(isNaN(n.getTime()))return`—`;let r=Date.now(),i=n.getTime()-r,a=Math.abs(i),o=Math.floor(a/1e3),s=Math.floor(a/6e4),c=Math.floor(a/36e5),l=Math.floor(a/864e5);return i<0?o<5?t(`time.justNow`):o<60?t(`mem.rel.secondsAgo`,{n:o}):c===0?t(`time.minutesAgo`,{n:s}):l===0?t(`time.hoursAgo`,{n:c}):l===1?t(`time.yesterday`):l<30?t(`time.daysAgo`,{n:l}):x(e,d(t)):o<5?t(`mem.rel.now`):o<60?t(`mem.rel.inSeconds`,{n:o}):c===0?t(`mem.rel.inMinutes`,{n:s}):l===0?t(`mem.rel.inHours`,{n:c}):l===1?t(`mem.rel.tomorrow`):l<30?t(`mem.rel.inDays`,{n:l}):x(e,d(t))}catch{return`—`}}function bt(e){return e<1e3?`${Math.round(e)}ms`:`${(e/1e3).toFixed(1)}s`}function xt(e){try{return new Date(e).getTime()<Date.now()}catch{return!1}}function St(e){return e>=.7?`high`:e>=.4?`medium`:`low`}function Ct(e){return e>=.9?`high`:e>=.7?`medium`:`low`}function wt(e,t,n){let r=yt(e,n),i=yt(t,n);return r===`—`&&i===`—`?``:r===i?r:`${r} \u2013 ${i}`}function Tt(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 Et=[`fact`,`preference`,`error`,`skill`,`note`,`reminder`],C={fact:`mem.cat.fact`,preference:`mem.cat.preference`,error:`mem.cat.error`,skill:`mem.cat.skill`,note:`mem.cat.note`,reminder:`mem.cat.reminder`},Dt={pending_approval:`mem.status.pending_approval`,queued:`mem.status.queued`,in_progress:`mem.status.in_progress`,completed:`mem.status.completed`,failed:`mem.status.failed`,rejected:`mem.status.rejected`,cancelled:`mem.status.cancelled`,blocked:`mem.status.blocked`},Ot={low:`mem.priority.low`,medium:`mem.priority.medium`,high:`mem.priority.high`},kt={agent_inferred:`mem.goals.source.agent_inferred`,agent_scheduled:`mem.goals.source.agent_scheduled`},At={user:`mem.role.user`,assistant:`mem.role.assistant`},jt={work:`mem.domain.work`,technical:`mem.domain.technical`,personal:`mem.domain.personal`,general:`mem.domain.general`};function w({value:e,keys:t}){let n=Je(),r=t[e];return r?c(o.Fragment,{children:n(r)}):c(`bdi`,{children:e})}function T(e){return e instanceof Error?e.message:String(e)}var Mt={work:`blue`,technical:`purple`,personal:`green`,general:`gray`};function Nt(){let e=Je(),{setShowMemoryDashboard:t,sessions:n,setCurrentSession:ge}=s(),je=(0,y.useMemo)(()=>new Map(n.map(e=>[e.id,e.title])),[n]),Ne=e=>je.get(e)||`${e.slice(0,8)}...`,[g,rt]=(0,y.useState)(null),[_,ot]=(0,y.useState)([]),[v,lt]=(0,y.useState)(null),[dt,pt]=(0,y.useState)([]),[mt,ht]=(0,y.useState)([]),[gt,_t]=(0,y.useState)([]),[b,yt]=(0,y.useState)(null),[Nt,Pt]=(0,y.useState)([]),[Ft,It]=(0,y.useState)(!0),[Lt,Rt]=(0,y.useState)(!1),[zt,Bt]=(0,y.useState)(null),[Vt,E]=(0,y.useState)(!1),[Ht,Ut]=(0,y.useState)(null),[Wt,Gt]=(0,y.useState)([]),Kt=(0,y.useRef)(0),[D,qt]=(0,y.useState)([]),[Jt,Yt]=(0,y.useState)(``),[Xt,Zt]=(0,y.useState)(``),[Qt,$t]=(0,y.useState)(``),[O,en]=(0,y.useState)(`updated_at`),[tn,nn]=(0,y.useState)(`desc`),[k,A]=(0,y.useState)(0),[rn,an]=(0,y.useState)(!1),[on,sn]=(0,y.useState)(``),[cn,ln]=(0,y.useState)(null),un=(0,y.useRef)(null),[j,dn]=(0,y.useState)(null),[fn,pn]=(0,y.useState)(!1),[M,mn]=(0,y.useState)(null),[N,P]=(0,y.useState)({content:``,category:`fact`,domain:``,context:`global`,entity:``,sensitive:!1,due_at:``}),[hn,gn]=(0,y.useState)(new Set),[F,_n]=(0,y.useState)(!1),[vn,yn]=(0,y.useState)(!1),[bn,xn]=(0,y.useState)(!1),[I,L]=(0,y.useState)(!1),[Sn,Cn]=(0,y.useState)(!1),[R,wn]=(0,y.useState)(null),[Tn,En]=(0,y.useState)(!1),[Dn,z]=(0,y.useState)(null),[B,On]=(0,y.useState)(`about`),[kn,An]=(0,y.useState)(0),[jn,Mn]=(0,y.useState)([]),[Nn,Pn]=(0,y.useState)(null),[Fn,In]=(0,y.useState)(!1),[Ln,Rn]=(0,y.useState)(null),[zn,Bn]=(0,y.useState)(null),[Vn,Hn]=(0,y.useState)(!1),[Un,Wn]=(0,y.useState)({title:``,description:``,priority:`medium`}),[V,H]=(0,y.useState)(`idle`),[Gn,U]=(0,y.useState)([]),[W,G]=(0,y.useState)([]),[Kn,qn]=(0,y.useState)(null),Jn=(0,y.useRef)(null),Yn=(0,y.useRef)(null),[K,q]=(0,y.useState)(`idle`),[Xn,J]=(0,y.useState)([]),[Y,Zn]=(0,y.useState)([]),[Qn,$n]=(0,y.useState)(null),[er,tr]=(0,y.useState)(!1),nr=(0,y.useRef)(null),rr=(0,y.useRef)(null),[ir,ar]=(0,y.useState)(30),[or,sr]=(0,y.useState)(!1),[cr,lr]=(0,y.useState)(!1),[ur,dr]=(0,y.useState)(!1),[fr,pr]=(0,y.useState)(!1),[mr,hr]=(0,y.useState)(!1),[gr,_r]=(0,y.useState)(!1),vr=(0,y.useRef)(null),yr=(0,y.useRef)(null),br=(0,y.useRef)(null),X=(0,y.useCallback)((e,t=`info`)=>{let n=++Kt.current;Gt(r=>[...r,{id:n,text:e,type:t}]),setTimeout(()=>{Gt(e=>e.filter(e=>e.id!==n))},4e3)},[]);(0,y.useEffect)(()=>{if(!Vt)return;let e=e=>{yr.current&&!yr.current.contains(e.target)&&E(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[Vt]),ze(!0,()=>{Dn?z(null):Sn?Cn(!1):Tn?En(!1):j?dn(null):Vt?E(!1):fn||M?(pn(!1),mn(null)):Ht?Ut(null):t(!1)}),Ee(br,!!Dn),(0,y.useEffect)(()=>{if(!Dn)return;let e=br.current;if(!e)return;let t=document.activeElement;return e.focus(),()=>{t?.focus()}},[Dn]);let xr=(0,y.useCallback)(async()=>{try{let e=await Be();rt(e)}catch(e){r.system.warn(`Failed to load memory stats`,e)}},[]),Sr=(0,y.useCallback)(async()=>{try{let e=await p(ir);ot(e)}catch(e){r.system.warn(`Failed to load memory activity`,e)}},[ir]),Z=(0,y.useCallback)(async()=>{try{let e=await re({category:D.length>0?D:void 0,context:Jt||void 0,entity:Xt||void 0,search:Qt||void 0,sort_by:O,order:tn,offset:k,limit:15,include_sensitive:!0,include_superseded:rn});lt(e)}catch(e){r.system.warn(`Failed to load knowledge`,e)}},[D,Jt,Xt,Qt,O,tn,k,rn]),Cr=(0,y.useCallback)(async()=>{try{let e=await fe();pt(e)}catch(e){r.system.warn(`Failed to load tool summary`,e)}},[]),wr=(0,y.useCallback)(async()=>{try{let e=await Ve(20);ht(e)}catch(e){r.system.warn(`Failed to load conversations`,e)}},[]),Tr=(0,y.useCallback)(async()=>{try{let e=await me(7);_t(e)}catch(e){r.system.warn(`Failed to load upcoming items`,e)}},[]),Er=(0,y.useCallback)(async()=>{try{let e=await Ze();yt(e)}catch(e){r.system.warn(`Failed to load embedding coverage`,e)}},[]),Dr=(0,y.useCallback)(async()=>{try{let e=await xe();Pt(e||[])}catch(e){r.system.warn(`Failed to load entities`,e)}},[]),Or=(0,y.useCallback)(async()=>{try{let e=await ee();yn(e.mcp_memory_enabled),_n(e.memory_enabled),xn(e.system_discovery_consent)}catch(e){r.system.warn(`Failed to load memory settings`,e)}},[]),kr=(0,y.useCallback)(async()=>{In(!0);try{let[e,t]=await Promise.all([_e(),ie()]);Mn(e.goals),Pn(t)}catch(e){r.system.warn(`Failed to load goals`,e)}finally{In(!1)}},[]),Ar=(0,y.useCallback)(async(t,n)=>{try{await t()}catch(t){r.system.error(`Goal action failed (${n})`,t),X(e(`mem.goals.failed`,{what:a(n),error:T(t)}),`error`);return}kr()},[kr,X,e]);(0,y.useEffect)(()=>{if(!zn)return;let e=setTimeout(()=>Bn(null),3e3);return()=>clearTimeout(e)},[zn]);let Q=(0,y.useCallback)(async()=>{It(!0),Rt(!1);try{await Promise.all([xr(),Sr(),Z(),Cr(),wr(),Tr(),Er(),Dr(),Or(),kr()]),An(e=>e+1)}catch(e){Rt(!0),r.system.error(`Memory dashboard load failed`,e)}finally{It(!1)}},[xr,Sr,Z,Cr,wr,Tr,Er,Dr,Or,kr]);(0,y.useEffect)(()=>{Q()},[Q]),(0,y.useEffect)(()=>{Z()},[Z]);let jr=(0,y.useRef)(!0);(0,y.useEffect)(()=>{jr.current?jr.current=!1:Sr()},[Sr]);let Mr=(0,y.useCallback)(e=>{$t(e),_r(!0),vr.current&&clearTimeout(vr.current),vr.current=setTimeout(()=>{A(0),_r(!1)},300)},[]),Nr=(0,y.useCallback)(()=>{Z(),xr(),Er(),Tr(),Dr()},[Z,xr,Er,Tr,Dr]),$=(0,y.useCallback)(()=>{Nr(),An(e=>e+1)},[Nr]),Pr=(0,y.useCallback)(async()=>{if(N.content.trim())try{let t=await et({content:N.content,category:N.category,domain:N.domain||void 0,context:N.context,entity:N.entity||void 0,sensitive:N.sensitive,due_at:N.due_at||void 0});pn(!1),P({content:``,category:`fact`,domain:``,context:`global`,entity:``,sensitive:!1,due_at:``}),$(),r.ui.info(`Created new knowledge entry`),t?.embedded===!1?X(t.embed_error?e(`mem.toast.server`,{message:t.embed_error}):e(`mem.toast.notEmbedded`),`error`):X(e(`mem.toast.created`),`success`)}catch(t){r.system.error(`Failed to create knowledge`,t),X(e(`mem.toast.createFailed`,{error:T(t)}),`error`)}},[N,$,X,e]),Fr=(0,y.useCallback)(async()=>{if(M&&N.content.trim())try{let t=await be(M,{content:N.content,category:N.category,domain:N.domain||void 0,context:N.context,entity:N.entity||void 0,sensitive:N.sensitive,due_at:N.due_at||void 0});mn(null),P({content:``,category:`fact`,domain:``,context:`global`,entity:``,sensitive:!1,due_at:``}),$(),r.ui.info(`Updated knowledge ${M}`),t?.embedded===!1?X(t.embed_error?e(`mem.toast.server`,{message:t.embed_error}):e(`mem.toast.notEmbedded`),`error`):X(e(`mem.toast.updated`),`success`)}catch(t){r.system.error(`Failed to update knowledge`,t),X(e(`mem.toast.updateFailed`,{error:T(t)}),`error`)}},[M,N,$,X,e]),Ir=(0,y.useCallback)(async t=>{if(R!==t)wn(t);else{wn(null);try{await Qe(t),$(),r.ui.info(`Deleted knowledge ${t}`),X(e(`mem.toast.deleted`),`info`)}catch(t){r.system.error(`Failed to delete knowledge`,t),X(e(`mem.toast.deleteFailed`,{error:T(t)}),`error`)}}},[R,$,X,e]);(0,y.useEffect)(()=>{if(!R)return;let e=setTimeout(()=>wn(null),3e3);return()=>clearTimeout(e)},[R]);let Lr=(0,y.useCallback)(async t=>{try{await be(t.id,{sensitive:!t.sensitive}),Z(),r.ui.info(`Toggled sensitive for ${t.id}: ${!t.sensitive}`),X(e(t.sensitive?`mem.toast.unmarkedSensitive`:`mem.toast.markedSensitive`),`info`)}catch(t){r.system.error(`Failed to toggle sensitive`,t),X(e(`mem.toast.sensitiveFailed`,{error:T(t)}),`error`)}},[Z,X,e]),Rr=(0,y.useCallback)(e=>{mn(e.id),pn(!1),P({content:e.content,category:e.category,domain:e.domain||``,context:e.context,entity:e.entity||``,sensitive:e.sensitive,due_at:e.due_at||``})},[]),zr=(0,y.useCallback)(t=>{navigator.clipboard.writeText(t).then(()=>X(e(`mem.toast.idCopied`),`info`),n=>{r.ui.warn(`Couldn't copy knowledge ID ${t}`,n),X(e(`mem.toast.copyFailed`,{error:T(n)}),`error`)})},[X,e]),Br=(0,y.useCallback)(e=>{sn(e),un.current&&clearTimeout(un.current),e.trim()?un.current=setTimeout(async()=>{try{let t=await Se(e.trim(),20);ln(t)}catch(e){r.system.warn(`Conversation search failed`,e)}},300):ln(null)},[]),Vr=(0,y.useCallback)(async e=>{try{let t=await ne(e);dn({sessionId:e,turns:t})}catch(e){r.system.error(`Failed to load conversation detail`,e)}},[]),Hr=(0,y.useCallback)(e=>{qt(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e]),A(0)},[]),Ur=(0,y.useCallback)(e=>{O===e?nn(e=>e===`desc`?`asc`:`desc`):(en(e),nn(`desc`)),A(0)},[O]),Wr=(0,y.useCallback)(async()=>{sr(!0),E(!1);try{let t=await De();await Q(),X(e(`mem.toast.consolidated`,{sessions:t.consolidated??0,items:t.extracted_items??0}),`success`)}catch(t){r.system.error(`Failed to consolidate sessions`,t),X(e(`mem.toast.consolidateFailed`,{error:T(t)}),`error`)}finally{sr(!1)}},[Q,X,e]),Gr=(0,y.useCallback)(async()=>{lr(!0),E(!1);try{let t=await de();await Er(),X(t.total_without?e(`mem.toast.backfilledMissing`,{n:t.backfilled??0,missing:t.total_without}):e(`mem.toast.backfilled`,{n:t.backfilled??0}),`success`)}catch(t){r.system.error(`Failed to rebuild embeddings`,t),X(e(`mem.toast.rebuildFailed`,{error:T(t)}),`error`)}finally{lr(!1)}},[Er,X,e]),Kr=(0,y.useCallback)(async()=>{dr(!0),E(!1);try{let t=await tt();await Q(),X(e(`mem.toast.reconciled`,{pairs:t.pairs_checked??0,reinforced:t.reinforced??0,contradicted:t.contradicted??0}),`success`)}catch(t){r.system.error(`Failed to reconcile memory`,t),X(e(`mem.toast.reconcileFailed`,{error:T(t)}),`error`)}finally{dr(!1)}},[Q,X,e]),qr=(0,y.useCallback)(async()=>{pr(!0),E(!1);try{await ve(),await Q(),X(e(`mem.toast.ftsRebuilt`),`success`)}catch(t){r.system.error(`Failed to rebuild FTS index`,t),X(e(`mem.toast.ftsFailed`,{error:T(t)}),`error`)}finally{pr(!1)}},[Q,X,e]),Jr=(0,y.useCallback)(async()=>{hr(!0),E(!1);try{let t=await te();await Q(),t.skipped?X(e(`mem.toast.systemDisabled`),`error`):X(e(`mem.toast.systemRefreshed`,{n:t.stored}),`success`)}catch(t){r.system.error(`Failed to refresh system context`,t),X(e(`mem.toast.systemFailed`,{error:T(t)}),`error`)}finally{hr(!1)}},[Q,X,e]),Yr=or||cr||ur||fr||mr,Xr=(0,y.useCallback)(()=>{H(`running`),U([]),G([]),qn(null);let t=f();Yn.current=t,t.onmessage=n=>{try{let r=JSON.parse(n.data);if(r.type===`log`)U(e=>[...e,{text:r.message,kind:`log`,server:!0}]);else if(r.type===`finding`){let t=r.item;U(n=>[...n,{text:e.bare(`mem.log.found`,{content:t.content}),kind:`finding`}]),G(e=>[...e,{...t,_checked:!0}])}else r.type===`error`?U(t=>[...t,{text:e.bare(`mem.log.error`,{message:r.message}),kind:`error`}]):r.type===`done`&&(t.close(),Yn.current=null,U(t=>[...t,{text:e(`mem.log.discoveryDone`,{n:r.total??0}),kind:`log`}]),H(`review`))}catch(t){r.system.warn(`Unreadable discovery event`,t),U(t=>[...t,{text:e(`mem.log.parseFailed`),kind:`error`}])}},t.onerror=()=>{t.close(),Yn.current=null,U(t=>[...t,{text:e(`mem.log.discoveryConnection`),kind:`error`}]),G(e=>(H(e.length>0?`review`:`idle`),e))}},[e]),Zr=(0,y.useCallback)(async()=>{let t=W.filter(e=>e._checked);if(t.length!==0){H(`saving`);try{let n=t.map(({_checked:e,...t})=>t),r=await Le(n);qn(r.stored),H(`done`),$(),X(e(`mem.disc.saved`,{n:r.stored}),`success`)}catch(t){r.system.error(`Failed to commit discovery items`,t),X(e(`mem.disc.saveFailed`,{error:T(t)}),`error`),H(`review`)}}},[W,$,X,e]),Qr=(0,y.useCallback)(()=>{q(`running`),J([]),Zn([]),$n(null);let t=le(er);rr.current=t,t.onmessage=n=>{try{let r=JSON.parse(n.data);if(r.type===`log`)J(e=>[...e,{text:r.message,kind:`log`,server:!0}]);else if(r.type===`insight`){let t=r.item;J(n=>[...n,{text:e.bare(`mem.log.insight`,{content:t.content}),kind:`finding`}]),Zn(e=>[...e,{...t,_checked:!0}])}else r.type===`error`?J(t=>[...t,{text:e.bare(`mem.log.error`,{message:r.message}),kind:`error`}]):r.type===`done`&&(t.close(),rr.current=null,J(t=>[...t,{text:e(`mem.log.inferenceDone`,{n:r.total??0}),kind:`log`}]),q(`review`))}catch(t){r.system.warn(`Unreadable inference event`,t),J(t=>[...t,{text:e(`mem.log.parseFailed`),kind:`error`}])}},t.onerror=()=>{t.close(),rr.current=null,J(t=>[...t,{text:e(`mem.log.inferenceConnection`),kind:`error`}]),Zn(e=>(q(e.length>0?`review`:`idle`),e))}},[er,e]),$r=(0,y.useCallback)(async()=>{let t=Y.filter(e=>e._checked);if(t.length!==0){q(`saving`);try{let n=t.map(({_checked:e,...t})=>t),r=await Fe(n);$n(r.stored),q(`done`),$(),X(e(`mem.inf.saved`,{n:r.stored}),`success`)}catch(t){r.system.error(`Failed to commit inference insights`,t),X(e(`mem.inf.saveFailed`,{error:T(t)}),`error`),q(`review`)}}},[Y,$,X,e]);(0,y.useEffect)(()=>{Jn.current&&(Jn.current.scrollTop=Jn.current.scrollHeight)},[Gn]),(0,y.useEffect)(()=>{nr.current&&(nr.current.scrollTop=nr.current.scrollHeight)},[Xn]),(0,y.useEffect)(()=>()=>{Yn.current&&=(Yn.current.close(),null),rr.current&&=(rr.current.close(),null)},[]);let ei=e=>O===e?c(`span`,{className:`mem-sort-arrow`,children:tn===`desc`?`↓`:`↑`}):null,ti=Math.max(1,..._.map(e=>e.conversations+e.tool_calls+e.knowledge_added+e.errors)),ni=g?.knowledge?.by_context?Object.keys(g.knowledge.by_context):[];return i(`div`,{className:`memory-dashboard-page`,children:[i(`div`,{className:`memory-dashboard-header`,children:[i(`div`,{className:`memory-dashboard-header-left`,children:[c(`button`,{className:`btn-icon settings-back-btn`,onClick:()=>t(!1),"aria-label":e(`mem.back`),children:c(nt,{size:18})}),i(`h1`,{children:[e(`mem.title`),` `,c(`span`,{className:`mem-beta`,style:{fontSize:11,fontWeight:600,color:`var(--accent-yellow)`,background:`var(--accent-yellow-dim)`,padding:`2px 8px`,borderRadius:4,marginInlineStart:8,verticalAlign:`middle`,whiteSpace:`nowrap`},children:e(`mem.beta`)})]})]}),i(`div`,{className:`memory-dashboard-header-actions`,children:[B===`advanced`&&i(o.Fragment,{children:[b&&b.total_items>0&&i(`div`,{className:`mem-embedding-coverage`,title:e(`mem.coverage.title`,{n:b.with_embedding,total:b.total_items}),children:[c(`div`,{className:`mem-embedding-bar`,children:c(`div`,{className:`mem-embedding-fill`,style:{width:`${Math.round(b.coverage_pct)}%`}})}),c(`span`,{className:`mem-embedding-label`,children:e(`mem.coverage.label`,{pct:`${Math.round(b.coverage_pct)}%`})})]}),i(`div`,{className:`mem-maintenance-wrap`,ref:yr,children:[i(`button`,{className:`btn-icon ${Yr?`mem-spinning`:``}`,onClick:()=>E(e=>!e),title:e(`mem.maint.label`),"aria-label":e(`mem.maint.label`),"aria-expanded":Vt,children:[Yr?c(`div`,{className:`mem-spinner-sm`}):c(pe,{size:16}),c(Ce,{size:10,style:{marginInlineStart:2}})]}),Vt&&i(`div`,{className:`mem-maintenance-menu`,role:`menu`,children:[i(`button`,{className:`mem-maintenance-item`,onClick:Wr,disabled:or,role:`menuitem`,children:[c(it,{size:14}),e(or?`mem.maint.consolidating`:`mem.maint.consolidate`)]}),i(`button`,{className:`mem-maintenance-item`,onClick:Gr,disabled:cr,role:`menuitem`,children:[c(u,{size:14}),e(cr?`mem.maint.rebuilding`:`mem.maint.rebuildEmbeddings`)]}),i(`button`,{className:`mem-maintenance-item`,onClick:Kr,disabled:ur,role:`menuitem`,children:[c(ye,{size:14}),e(ur?`mem.maint.reconciling`:`mem.maint.reconcile`)]}),c(`div`,{className:`mem-maintenance-divider`}),i(`button`,{className:`mem-maintenance-item`,onClick:Jr,disabled:mr,role:`menuitem`,children:[c(Re,{size:14}),e(mr?`mem.maint.refreshing`:`mem.maint.refreshSystem`)]}),c(`div`,{className:`mem-maintenance-divider`}),i(`button`,{className:`mem-maintenance-item`,onClick:qr,disabled:fr,role:`menuitem`,children:[c(Ke,{size:14}),e(fr?`mem.maint.rebuilding`:`mem.maint.rebuildFts`)]})]})]})]}),c(`button`,{className:`btn-icon`,onClick:Q,title:e(`mem.refresh`),"aria-label":e(`mem.refreshAria`),children:c(Re,{size:16})})]})]}),i(`div`,{className:`mem-tab-bar`,role:`tablist`,children:[i(`button`,{className:`mem-tab-btn${B===`about`?` mem-tab-active`:``}`,onClick:()=>On(`about`),role:`tab`,"aria-selected":B===`about`,children:[c(ft,{size:14}),` `,e(`mem.tab.about`)]}),i(`button`,{className:`mem-tab-btn${B===`goals`?` mem-tab-active`:``}`,onClick:()=>{On(`goals`),kr()},role:`tab`,"aria-selected":B===`goals`,children:[c(ct,{size:14}),` `,e(`mem.tab.goals`),Nn&&(Nn.goals.pending_approval??0)>0&&c(`span`,{className:`mem-tab-badge`,children:Nn.goals.pending_approval})]}),i(`button`,{className:`mem-tab-btn${B===`profile`?` mem-tab-active`:``}`,onClick:()=>On(`profile`),role:`tab`,"aria-selected":B===`profile`,children:[c(Me,{size:14}),` `,e(`mem.tab.profile`)]}),i(`button`,{className:`mem-tab-btn${B===`advanced`?` mem-tab-active`:``}`,onClick:()=>On(`advanced`),role:`tab`,"aria-selected":B===`advanced`,children:[c(oe,{size:14}),` `,e(`mem.tab.advanced`)]})]}),i(`div`,{className:`memory-dashboard-body`,children:[B===`about`&&c(vt,{memoryEnabled:F,reloadKey:kn,onChanged:Nr,onOpenAdvanced:()=>On(`advanced`),showToast:X}),B===`advanced`&&c(o.Fragment,{children:Ft&&!g?i(`div`,{className:`mem-loading`,children:[c(`div`,{className:`mem-spinner`}),e(`mem.loadingData`)]}):Lt?i(`div`,{className:`mem-empty`,children:[c(`div`,{className:`mem-empty-icon`,children:c(He,{size:32})}),c(`p`,{children:e(`mem.loadFailed`)}),i(`button`,{className:`btn-secondary`,onClick:Q,style:{marginTop:12},children:[c(Re,{size:14}),` `,e(`mem.retry`)]})]}):i(o.Fragment,{children:[!F&&i(`div`,{className:`mem-empty-state`,style:{margin:`40px 0`},children:[c(`div`,{className:`mem-empty-icon`,style:{opacity:.5},children:c(st,{size:32})}),c(`p`,{style:{color:`var(--text-secondary)`,fontSize:14},children:e(`mem.offAdvanced`)})]}),F&&i(o.Fragment,{children:[g?.embedding_error&&i(`div`,{className:`mem-advanced-error`,role:`alert`,children:[c(He,{size:14}),` `,c(`bdi`,{children:g.embedding_error})]}),i(`div`,{className:`mem-stat-cards`,children:[i(`div`,{className:`mem-stat-card`,"data-accent":`purple`,children:[c(`div`,{className:`mem-stat-value`,children:g?.knowledge?.total??0}),c(`div`,{className:`mem-stat-label`,children:e(`mem.stat.stored`)}),c(`div`,{className:`mem-stat-sub`,children:(()=>{let t=Tt(_);return t>0?e(`mem.stat.addedToday`,{n:t}):g?.knowledge?.by_category?e.compose(e=>Object.entries(g.knowledge.by_category).slice(0,3).map(([t,n])=>e(`mem.stat.categoryCount`,{category:C[t]?a(C[t]):t,n})).join(e(`mem.listSeparator`))):e(`mem.stat.noEntries`)})()})]}),i(`div`,{className:`mem-stat-card`,"data-accent":`gold`,children:[c(`div`,{className:`mem-stat-value`,children:g?.knowledge?.total_retrievals??0}),c(`div`,{className:`mem-stat-label`,children:e(`mem.stat.retrieved`)}),c(`div`,{className:`mem-stat-sub`,children:g?.knowledge?.total&&g?.knowledge?.total_retrievals?e(`mem.stat.avgRecall`,{n:(g.knowledge.total_retrievals/g.knowledge.total).toFixed(1)}):e(`mem.stat.noRecalls`)})]}),i(`div`,{className:`mem-stat-card`,"data-accent":`blue`,children:[c(`div`,{className:`mem-stat-value`,children:g?.conversations?.total_sessions??0}),c(`div`,{className:`mem-stat-label`,children:e(`mem.stat.sessions`)}),c(`div`,{className:`mem-stat-sub`,children:wt(g?.conversations?.first_session??null,g?.conversations?.last_session??null,d(e))||e(`mem.stat.totalTurns`,{n:g?.conversations?.total_turns??0})})]}),i(`div`,{className:`mem-stat-card`,"data-accent":`green`,children:[c(`div`,{className:`mem-stat-value`,children:g?.tools?.total_calls??0}),c(`div`,{className:`mem-stat-label`,children:e(`mem.stat.toolCalls`)}),c(`div`,{className:`mem-stat-sub`,title:e(`mem.stat.toolsNotLogged`),children:e(`mem.stat.toolsExclMemory`,{n:g?.tools?.unique_tools??0})})]}),i(`div`,{className:`mem-stat-card`,"data-accent":`red`,children:[c(`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)}%`:`—`}),c(`div`,{className:`mem-stat-label`,children:e(`mem.stat.successRate`)}),c(`div`,{className:`mem-stat-sub`,children:(g?.tools?.total_calls??0)>0?e(`mem.stat.errors`,{n:g?.tools?.total_errors??0}):e(`mem.stat.noToolCalls`)})]})]}),i(`div`,{className:`mem-section`,children:[i(`div`,{className:`mem-section-title mem-section-title-row`,children:[i(`span`,{className:`mem-section-title-left`,children:[c(ut,{size:14}),` `,e(`mem.activity.title`)]}),c(`div`,{className:`mem-range-tabs`,role:`group`,"aria-label":e(`mem.activity.range`),children:[1,7,30].map(t=>c(`button`,{className:`mem-range-tab${ir===t?` active`:``}`,onClick:()=>ar(t),children:e(t===1?`mem.activity.day1`:t===7?`mem.activity.days7`:`mem.activity.days30`)},t))})]}),_.length>0?i(o.Fragment,{children:[c(`div`,{className:`mem-activity-chart`,children:_.map((t,n)=>{let r=t.conversations+t.tool_calls+t.knowledge_added+t.errors,a=n===0||n===_.length-1||n%7==0,s=new Date(t.date+`T00:00:00`).toLocaleDateString(d(e),{month:`short`,day:`numeric`});return i(`div`,{className:`mem-activity-bar-group`,onMouseEnter:()=>Bt(n),onMouseLeave:()=>Bt(null),children:[t.errors>0&&c(`div`,{className:`mem-activity-bar errors`,style:{height:`${t.errors/ti*100}%`}}),t.knowledge_added>0&&c(`div`,{className:`mem-activity-bar knowledge`,style:{height:`${t.knowledge_added/ti*100}%`}}),t.tool_calls>0&&c(`div`,{className:`mem-activity-bar tool_calls`,style:{height:`${t.tool_calls/ti*100}%`}}),t.conversations>0&&c(`div`,{className:`mem-activity-bar conversations`,style:{height:`${t.conversations/ti*100}%`}}),a&&c(`span`,{className:`mem-activity-date-label`,children:s}),zt===n&&r>0&&i(`div`,{className:`mem-activity-tooltip`,children:[c(`strong`,{children:s}),c(`br`,{}),t.conversations>0&&i(o.Fragment,{children:[e(`mem.activity.conversations`,{n:t.conversations}),c(`br`,{})]}),t.tool_calls>0&&i(o.Fragment,{children:[e(`mem.activity.toolCalls`,{n:t.tool_calls}),c(`br`,{})]}),t.knowledge_added>0&&i(o.Fragment,{children:[e(`mem.activity.learned`,{n:t.knowledge_added}),c(`br`,{})]}),t.errors>0&&c(o.Fragment,{children:e(`mem.stat.errors`,{n:t.errors})})]})]},t.date)})}),i(`div`,{className:`mem-activity-legend`,children:[i(`span`,{className:`mem-activity-legend-item`,children:[c(`span`,{className:`mem-activity-legend-dot conversations`}),` `,e(`mem.legend.conversations`)]}),i(`span`,{className:`mem-activity-legend-item`,children:[c(`span`,{className:`mem-activity-legend-dot tool_calls`}),` `,e(`mem.stat.toolCalls`)]}),i(`span`,{className:`mem-activity-legend-item`,children:[c(`span`,{className:`mem-activity-legend-dot knowledge`}),` `,e(`mem.legend.knowledge`)]}),i(`span`,{className:`mem-activity-legend-item`,children:[c(`span`,{className:`mem-activity-legend-dot errors`}),` `,e(`mem.legend.errors`)]})]})]}):i(`div`,{className:`mem-empty`,children:[c(`div`,{className:`mem-empty-icon`,children:c(ut,{size:28})}),c(`p`,{children:e(`mem.activity.empty`)})]})]}),i(`div`,{className:`mem-section`,children:[i(`div`,{className:`mem-section-title mem-section-title-row`,children:[i(`span`,{className:`mem-section-title-left`,children:[c(oe,{size:14}),` `,e(`mem.knowledge.title`),v&&v.total>0&&c(`span`,{className:`mem-section-count`,children:v.total})]}),!fn&&!M&&i(`button`,{className:`mem-section-add-btn`,onClick:()=>pn(!0),title:e(`mem.knowledge.addTitle`),children:[c(Ie,{size:13}),` `,e(`mem.knowledge.add`)]})]}),i(`div`,{className:`mem-filters`,children:[i(`div`,{className:`mem-category-pills`,role:`group`,"aria-label":e(`mem.knowledge.filterCategory`),children:[Et.map(t=>c(`button`,{className:`mem-category-pill ${t}${D.includes(t)?` active`:``}`,onClick:()=>Hr(t),"aria-pressed":D.includes(t),children:e(C[t])},t)),D.length>0&&i(`button`,{className:`mem-category-pill clear`,onClick:()=>{qt([]),A(0)},"aria-label":e(`mem.knowledge.clearAria`),children:[`✕ `,e(`mem.knowledge.clear`)]})]}),i(`select`,{className:`mem-filter-select`,value:Jt,onChange:e=>{Yt(e.target.value),A(0)},"aria-label":e(`mem.knowledge.filterContext`),children:[c(`option`,{value:``,children:e(`mem.knowledge.allContexts`)}),ni.map(e=>c(`option`,{value:e,children:e},e))]}),i(`select`,{className:`mem-filter-select`,value:Xt,onChange:e=>{Zt(e.target.value),A(0)},"aria-label":e(`mem.knowledge.filterEntity`),children:[c(`option`,{value:``,children:e(`mem.knowledge.allEntities`)}),Nt.map(e=>i(`option`,{value:e.entity,children:[e.entity,` (`,e.count,`)`]},e.entity))]}),i(`div`,{className:`mem-filter-search-wrap`,children:[gr?c(`div`,{className:`mem-spinner-sm search-icon`,style:{width:12,height:12,borderWidth:1.5}}):c(Ke,{size:13,className:`search-icon`}),c(`input`,{className:`mem-filter-search`,type:`text`,placeholder:e(`mem.knowledge.searchPlaceholder`),value:Qt,onChange:e=>Mr(e.target.value),"aria-label":e(`mem.knowledge.search`)})]}),i(`label`,{className:`mem-filter-toggle`,title:e(`mem.knowledge.supersededTitle`),children:[c(`input`,{type:`checkbox`,checked:rn,onChange:e=>an(e.target.checked)}),c(`span`,{children:e(`mem.knowledge.superseded`)})]})]}),(fn||M)&&i(`div`,{className:`mem-inline-form`,children:[i(`div`,{className:`mem-inline-form-row`,children:[c(`label`,{children:e(`mem.col.content`)}),c(`textarea`,{value:N.content,onChange:e=>P(t=>({...t,content:e.target.value})),placeholder:e(`mem.form.contentPlaceholder`)})]}),i(`div`,{className:`mem-inline-form-row`,children:[c(`label`,{children:e(`mem.col.category`)}),c(`select`,{value:N.category,onChange:e=>P(t=>({...t,category:e.target.value})),children:Et.map(t=>c(`option`,{value:t,children:e(C[t])},t))})]}),i(`div`,{className:`mem-inline-form-row`,children:[c(`label`,{children:e(`mem.col.context`)}),c(`input`,{type:`text`,value:N.context,onChange:e=>P(t=>({...t,context:e.target.value})),placeholder:`global`})]}),i(`div`,{className:`mem-inline-form-row`,children:[c(`label`,{children:e(`mem.detail.domain`)}),c(`input`,{type:`text`,value:N.domain,onChange:e=>P(t=>({...t,domain:e.target.value})),placeholder:e(`mem.form.domainPlaceholder`)})]}),i(`div`,{className:`mem-inline-form-row`,children:[c(`label`,{children:e(`mem.col.entity`)}),c(`input`,{type:`text`,value:N.entity,onChange:e=>P(t=>({...t,entity:e.target.value})),placeholder:e(`mem.form.entityPlaceholder`)})]}),i(`div`,{className:`mem-inline-form-row`,children:[c(`label`,{children:e(`mem.form.dueAt`)}),c(`input`,{type:`text`,value:N.due_at,onChange:e=>P(t=>({...t,due_at:e.target.value})),placeholder:e(`mem.form.dueAtPlaceholder`)})]}),i(`div`,{className:`mem-inline-form-row`,children:[c(`label`,{children:e(`mem.form.sensitive`)}),i(`label`,{style:{display:`flex`,alignItems:`center`,gap:6,cursor:`pointer`,fontSize:12},children:[c(`input`,{type:`checkbox`,checked:N.sensitive,onChange:e=>P(t=>({...t,sensitive:e.target.checked}))}),e(`mem.form.sensitiveHint`)]})]}),i(`div`,{className:`mem-inline-form-actions`,children:[c(`button`,{className:`btn-secondary`,onClick:()=>{pn(!1),mn(null)},children:e(`mem.cancel`)}),c(`button`,{className:`btn-primary`,onClick:M?Fr:Pr,style:{padding:`8px 20px`,fontSize:13},children:e(M?`mem.form.update`:`mem.form.save`)})]})]}),v&&v.items.length>0?i(o.Fragment,{children:[c(`div`,{style:{overflowX:`auto`},children:i(`table`,{className:`mem-knowledge-table`,children:[c(`thead`,{children:i(`tr`,{children:[i(`th`,{onClick:()=>Ur(`category`),className:O===`category`?`sorted`:``,children:[e(`mem.col.category`),ei(`category`)]}),c(`th`,{children:e(`mem.col.content`)}),i(`th`,{onClick:()=>Ur(`context`),className:O===`context`?`sorted`:``,children:[e(`mem.col.context`),ei(`context`)]}),c(`th`,{children:e(`mem.col.entity`)}),i(`th`,{onClick:()=>Ur(`confidence`),className:O===`confidence`?`sorted`:``,children:[e(`mem.col.confidence`),ei(`confidence`)]}),c(`th`,{children:e(`mem.col.source`)}),i(`th`,{onClick:()=>Ur(`updated_at`),className:O===`updated_at`?`sorted`:``,children:[e(`mem.col.updated`),ei(`updated_at`)]}),i(`th`,{onClick:()=>Ur(`created_at`),className:O===`created_at`?`sorted`:``,children:[e(`mem.col.created`),ei(`created_at`)]}),c(`th`,{children:e(`mem.col.due`)}),c(`th`,{className:`mem-actions-cell`})]})}),c(`tbody`,{children:v.items.map(t=>{let n=Ht===t.id,r=t.has_embedding;return i(y.Fragment,{children:[i(`tr`,{className:`${t.superseded_by?`mem-superseded-row`:``} ${n?`mem-expanded-row`:``}`,onClick:()=>Ut(n?null:t.id),onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),Ut(n?null:t.id))},tabIndex:0,role:`row`,"aria-expanded":n,style:{cursor:`pointer`},children:[c(`td`,{children:c(`span`,{className:`mem-cat-badge ${t.category}`,children:c(w,{value:t.category,keys:C})})}),c(`td`,{children:i(`div`,{className:`mem-content-cell`,title:t.content,children:[r!==void 0&&c(`span`,{className:`mem-embed-dot ${r?`embedded`:`missing`}`,title:e(r?`mem.knowledge.embedded`:`mem.knowledge.embedMissing`),children:c(ue,{size:6,fill:`currentColor`})}),t.sensitive&&c(`span`,{className:`mem-sensitive-badge`,title:e(`mem.form.sensitive`),children:c(st,{size:11})}),c(`span`,{className:t.sensitive&&!hn.has(t.id)?`mem-sensitive-blur`:t.superseded_by?`mem-superseded-text`:``,onClick:e=>{t.sensitive&&(e.stopPropagation(),gn(e=>{let n=new Set(e);return n.has(t.id)?n.delete(t.id):n.add(t.id),n}))},children:c(`bdi`,{children:t.content})})]})}),c(`td`,{children:c(`bdi`,{className:`mem-date-cell`,children:t.context})}),c(`td`,{children:t.entity?c(`span`,{className:`mem-entity-link`,onClick:e=>{e.stopPropagation(),Zt(t.entity),A(0)},title:e(`mem.knowledge.filterBy`,{entity:t.entity}),children:c(`bdi`,{children:t.entity})}):c(`span`,{className:`mem-date-cell`,children:`—`})}),c(`td`,{children:i(`div`,{className:`mem-confidence`,children:[c(`div`,{className:`mem-confidence-bar`,children:c(`div`,{className:`mem-confidence-fill ${St(t.confidence)}`,style:{width:`${t.confidence*100}%`}})}),t.confidence.toFixed(2)]})}),c(`td`,{children:c(`bdi`,{className:`mem-date-cell`,children:t.source||`—`})}),c(`td`,{children:c(`span`,{className:`mem-date-cell`,title:x(t.updated_at,d(e)),children:S(t.updated_at,e)})}),c(`td`,{children:c(`span`,{className:`mem-date-cell`,title:x(t.created_at,d(e)),children:S(t.created_at,e)})}),c(`td`,{children:t.due_at?c(`span`,{className:`mem-due-badge ${xt(t.due_at)?`overdue`:`upcoming`}`,title:x(t.due_at,d(e)),children:S(t.due_at,e)}):c(`span`,{className:`mem-due-badge none`,children:`—`})}),c(`td`,{className:`mem-actions-cell`,children:i(`div`,{className:`mem-row-actions`,onClick:e=>e.stopPropagation(),children:[c(`button`,{className:`mem-row-action-btn`,onClick:()=>Rr(t),title:e(`mem.row.edit`),children:c(Oe,{size:13})}),c(`button`,{className:`mem-row-action-btn`,onClick:()=>Lr(t),title:e(t.sensitive?`mem.row.unmarkSensitive`:`mem.row.markSensitive`),children:t.sensitive?c(at,{size:13}):c(st,{size:13})}),c(`button`,{className:`mem-row-action-btn`,onClick:()=>zr(t.id),title:e(`mem.row.copyId`),children:c(m,{size:13})}),c(`button`,{className:`mem-row-action-btn delete${R===t.id?` is-confirm`:``}`,onClick:()=>Ir(t.id),title:e(R===t.id?`mem.row.clickAgain`:`mem.row.delete`),"aria-label":e(R===t.id?`mem.row.confirmDeleteAria`:`mem.row.deleteAria`),children:R===t.id?c(`span`,{className:`mem-row-delete-label`,children:e(`mem.row.deleteConfirm`)}):c(Ye,{size:13})})]})})]}),n&&c(`tr`,{className:`mem-detail-row`,children:c(`td`,{colSpan:10,children:i(`div`,{className:`mem-detail-panel`,children:[i(`div`,{className:`mem-detail-grid`,children:[i(`div`,{className:`mem-detail-field`,children:[c(`span`,{className:`mem-detail-label`,children:e(`mem.detail.id`)}),c(`span`,{className:`mem-detail-value`,children:t.id})]}),i(`div`,{className:`mem-detail-field`,children:[c(`span`,{className:`mem-detail-label`,children:e(`mem.detail.domain`)}),c(`bdi`,{className:`mem-detail-value`,children:t.domain||`—`})]}),i(`div`,{className:`mem-detail-field`,children:[c(`span`,{className:`mem-detail-label`,children:e(`mem.col.source`)}),c(`bdi`,{className:`mem-detail-value`,children:t.source||`—`})]}),i(`div`,{className:`mem-detail-field`,children:[c(`span`,{className:`mem-detail-label`,children:e(`mem.detail.useCount`)}),c(`span`,{className:`mem-detail-value`,children:t.use_count??0})]}),i(`div`,{className:`mem-detail-field`,children:[c(`span`,{className:`mem-detail-label`,children:e(`mem.col.created`)}),c(`span`,{className:`mem-detail-value`,children:x(t.created_at,d(e))})]}),i(`div`,{className:`mem-detail-field`,children:[c(`span`,{className:`mem-detail-label`,children:e(`mem.col.updated`)}),c(`span`,{className:`mem-detail-value`,children:x(t.updated_at,d(e))})]}),i(`div`,{className:`mem-detail-field`,children:[c(`span`,{className:`mem-detail-label`,children:e(`mem.detail.lastUsed`)}),c(`span`,{className:`mem-detail-value`,children:x(t.last_used,d(e))})]}),i(`div`,{className:`mem-detail-field`,children:[c(`span`,{className:`mem-detail-label`,children:e(`mem.detail.remindedAt`)}),c(`span`,{className:`mem-detail-value`,children:x(t.reminded_at,d(e))})]}),t.superseded_by&&i(`div`,{className:`mem-detail-field`,children:[c(`span`,{className:`mem-detail-label`,children:e(`mem.detail.supersededBy`)}),c(`span`,{className:`mem-detail-value mem-detail-chain`,children:t.superseded_by})]}),t.metadata&&i(`div`,{className:`mem-detail-field mem-detail-full`,children:[c(`span`,{className:`mem-detail-label`,children:e(`mem.detail.metadata`)}),c(`span`,{className:`mem-detail-value`,children:c(`bdi`,{dir:`ltr`,children:typeof t.metadata==`object`?JSON.stringify(t.metadata,null,2):t.metadata})})]})]}),i(`div`,{className:`mem-detail-content-full`,children:[c(`span`,{className:`mem-detail-label`,children:e(`mem.detail.fullContent`)}),c(`div`,{className:`mem-detail-content-text`,children:c(`bdi`,{children:t.content})})]})]})})})]},t.id)})})]})}),i(`div`,{className:`mem-pagination`,children:[c(`span`,{children:e(`mem.page.range`,{from:k+1,to:Math.min(k+15,v.total),total:v.total})}),i(`div`,{className:`mem-pagination-btns`,children:[c(`button`,{type:`button`,className:`mem-page-btn`,"aria-label":e(`mem.page.previous`),disabled:k===0,onClick:()=>A(Math.max(0,k-15)),children:c(ce,{size:14})}),c(`button`,{type:`button`,className:`mem-page-btn`,"aria-label":e(`mem.page.next`),disabled:k+15>=v.total,onClick:()=>A(k+15),children:c(Te,{size:14})})]})]})]}):i(`div`,{className:`mem-empty`,children:[c(`div`,{className:`mem-empty-icon`,children:c(oe,{size:28})}),c(`p`,{children:e(Qt||D.length>0||Jt||Xt?`mem.knowledge.noMatch`:`mem.knowledge.empty`)})]})]}),i(`div`,{className:`mem-two-col`,children:[i(`div`,{className:`mem-section`,children:[i(`div`,{className:`mem-section-title`,children:[c(We,{size:14}),` `,e(`mem.tools.title`),c(`span`,{className:`mem-section-note`,title:e(`mem.tools.noteTitle`),children:e(`mem.tools.note`)})]}),dt.length>0?c(`div`,{style:{overflowX:`auto`},children:i(`table`,{className:`mem-tool-table`,children:[c(`thead`,{children:i(`tr`,{children:[c(`th`,{children:e(`mem.tools.tool`)}),c(`th`,{children:e(`mem.tools.calls`)}),c(`th`,{children:e(`mem.tools.success`)}),c(`th`,{children:e(`mem.tools.denied`)}),c(`th`,{children:e(`mem.tools.avgTime`)}),c(`th`,{children:e(`mem.detail.lastUsed`)}),c(`th`,{children:e(`mem.tools.lastError`)})]})}),c(`tbody`,{children:dt.map(t=>i(`tr`,{children:[c(`td`,{children:c(`bdi`,{className:`mem-tool-name`,children:t.tool_name})}),c(`td`,{children:t.total_calls}),c(`td`,{children:i(`div`,{className:`mem-confidence`,children:[c(`div`,{className:`mem-confidence-bar`,style:{width:40},children:c(`div`,{className:`mem-confidence-fill ${Ct(t.success_rate)}`,style:{width:`${t.success_rate*100}%`}})}),i(`span`,{className:`mem-success-rate ${Ct(t.success_rate)}`,children:[Math.round(t.success_rate*100),`%`]})]})}),c(`td`,{children:t.denied_count??0}),c(`td`,{children:c(`bdi`,{dir:`ltr`,children:bt(t.avg_duration_ms)})}),c(`td`,{children:c(`span`,{className:`mem-date-cell`,title:x(t.last_used,d(e)),children:S(t.last_used,e)})}),c(`td`,{children:c(`bdi`,{className:`mem-tool-error`,title:t.last_error||``,children:t.last_error||`—`})})]},t.tool_name))})]})}):i(`div`,{className:`mem-empty`,children:[c(`div`,{className:`mem-empty-icon`,children:c(We,{size:28})}),c(`p`,{children:e(`mem.tools.empty`)})]})]}),i(`div`,{className:`mem-section`,children:[i(`div`,{className:`mem-section-title`,children:[c(ae,{size:14}),` `,e(`mem.upcoming.title`)]}),gt.length>0?c(`div`,{className:`mem-temporal-list`,children:gt.map(t=>{let n=xt(t.due_at);return i(`div`,{className:`mem-temporal-item ${n?`overdue`:`upcoming`}`,children:[c(`span`,{className:`mem-temporal-icon`,children:c(n?He:ae,{size:16})}),i(`div`,{className:`mem-temporal-content`,children:[c(`div`,{className:`mem-temporal-text`,children:c(`bdi`,{children:t.content})}),i(`div`,{className:`mem-temporal-date`,children:[e(n?`mem.upcoming.overdue`:`mem.upcoming.due`,{when:S(t.due_at,e)}),t.context!==`global`&&i(o.Fragment,{children:[` `,`·`,` `,c(`bdi`,{children:t.context})]})]})]})]},t.id)})}):i(`div`,{className:`mem-empty`,children:[c(`div`,{className:`mem-empty-icon`,children:c(ye,{size:28})}),c(`p`,{children:e(`mem.upcoming.empty`)})]})]})]}),i(`div`,{className:`mem-section`,children:[i(`div`,{className:`mem-section-title`,children:[c(l,{size:14}),` `,e(`mem.conv.title`)]}),i(`div`,{className:`mem-conv-search`,children:[c(Ke,{size:13,className:`search-icon`}),c(`input`,{type:`text`,placeholder:e(`mem.conv.searchPlaceholder`),value:on,onChange:e=>Br(e.target.value),"aria-label":e(`mem.conv.search`)}),on&&c(`button`,{className:`mem-search-clear`,onClick:()=>{sn(``),ln(null)},"aria-label":e(`mem.conv.clearSearch`),children:c(ke,{size:12})})]}),cn===null?mt.length>0?c(`div`,{className:`mem-conv-list`,children:mt.map(t=>i(`div`,{className:`mem-conv-item`,onClick:()=>Vr(t.session_id),children:[i(`div`,{className:`mem-conv-info`,children:[i(`div`,{className:`mem-conv-session-id`,children:[c(`bdi`,{children:Ne(t.session_id)}),t.consolidated&&c(`span`,{className:`mem-consolidated-badge`,title:e(`mem.conv.consolidated`),children:c(it,{size:11})})]}),t.first_message&&c(`div`,{className:`mem-conv-preview`,children:c(`bdi`,{children:t.first_message})})]}),i(`div`,{className:`mem-conv-meta`,children:[c(`span`,{children:e.plural(`mem.conv.turns`,t.turn_count)}),c(`span`,{children:S(t.last_activity,e)})]})]},t.session_id))}):i(`div`,{className:`mem-empty`,children:[c(`div`,{className:`mem-empty-icon`,children:c(l,{size:28})}),c(`p`,{children:e(`mem.conv.empty`)})]}):cn.length>0?c(`div`,{className:`mem-conv-list`,children:cn.map(t=>i(`div`,{className:`mem-conv-item`,onClick:()=>Vr(t.session_id),children:[i(`div`,{className:`mem-conv-info`,children:[i(`div`,{className:`mem-conv-session-id`,children:[c(`span`,{className:`mem-conv-turn-role ${t.role}`,children:c(w,{value:t.role,keys:At})}),` `,c(`bdi`,{children:Ne(t.session_id)})]}),c(`div`,{className:`mem-conv-preview`,children:c(`bdi`,{children:t.content})})]}),c(`div`,{className:`mem-conv-meta`,children:c(`span`,{children:S(t.timestamp,e)})})]},t.id))}):c(`div`,{className:`mem-empty`,children:c(`p`,{children:e(`mem.conv.noMatch`,{query:on})})})]}),j&&i(`div`,{className:`mem-conv-detail-overlay`,children:[i(`div`,{className:`mem-conv-detail-header`,children:[c(`h2`,{children:c(`bdi`,{children:Ne(j.sessionId)})}),i(`div`,{className:`mem-conv-detail-actions`,children:[je.has(j.sessionId)&&c(`button`,{className:`btn-secondary`,onClick:()=>ge(j.sessionId),children:e(`mem.conv.openChat`)}),c(`button`,{className:`btn-icon`,onClick:()=>dn(null),"aria-label":e(`mem.conv.close`),children:c(ke,{size:16})})]})]}),i(`div`,{className:`mem-conv-detail-body`,children:[j.turns.map(t=>i(`div`,{className:`mem-conv-turn`,children:[i(`div`,{className:`mem-conv-turn-header`,children:[c(`div`,{className:`mem-conv-turn-role ${t.role}`,children:c(w,{value:t.role,keys:At})}),c(`span`,{className:`mem-conv-turn-time`,title:x(t.timestamp,d(e)),children:S(t.timestamp,e)})]}),c(`div`,{className:`mem-conv-turn-content`,children:c(`bdi`,{children:t.content})})]},t.id)),j.turns.length===0&&c(`div`,{className:`mem-empty`,children:e(`mem.conv.noTurns`)})]})]})]}),i(`div`,{className:`mem-section`,children:[i(`div`,{className:`mem-section-title`,children:[c(st,{size:14}),` `,e(`mem.settings.title`),` `,c(`span`,{className:`mem-beta`,style:{fontSize:10,fontWeight:600,color:`var(--accent-yellow)`,background:`var(--accent-yellow-dim)`,padding:`1px 6px`,borderRadius:4,marginInlineStart:6,verticalAlign:`middle`},children:e(`mem.beta`)})]}),i(`div`,{className:`mem-setting-row`,children:[i(`div`,{className:`mem-setting-info`,children:[c(`span`,{className:`mem-setting-label`,children:e(`mem.settings.memory`)}),c(`span`,{className:`mem-setting-desc`,children:e(`mem.settings.memoryDesc`)})]}),c(`button`,{className:`mem-toggle${F?` mem-toggle-on`:``}`,disabled:I,onClick:async()=>{if(!F)z(`memory`);else{L(!0);try{let e=await h({memory_enabled:!1});_n(e.memory_enabled)}catch(t){r.system.warn(`Failed to disable memory`,t),X(e(`mem.toast.settingFailed`,{error:T(t)}),`error`)}finally{L(!1)}}},"aria-pressed":F,"aria-label":e(F?`mem.settings.memoryOn`:`mem.settings.memoryOff`),children:e.bare(F?`mem.on`:`mem.off`)})]}),Dn&&(()=>{let t={memory:{title:`mem.beta.memory.title`,description:`mem.beta.memory.desc`,bullets:[`mem.beta.memory.local`,`mem.beta.memory.lost`,`mem.beta.memory.disable`],buttonLabel:`mem.beta.memory.confirm`,onConfirm:async()=>{let t=await h({memory_enabled:!0});_n(t.memory_enabled),X(e(`mem.toast.memoryEnabled`),`info`)}},mcp:{title:`mem.beta.mcp.title`,description:`mem.beta.mcp.desc`,bullets:[`mem.beta.mcp.read`,`mem.beta.mcp.restart`,`mem.beta.mcp.debug`],buttonLabel:`mem.beta.mcp.confirm`,onConfirm:async()=>{let t=await h({mcp_memory_enabled:!0});yn(t.mcp_memory_enabled),X(e(`mem.toast.mcpEnabled`),`info`)}},discovery:{title:`mem.beta.discovery.title`,description:`mem.beta.discovery.desc`,bullets:[`mem.beta.discovery.collects`,`mem.beta.discovery.scans`,`mem.beta.discovery.local`],buttonLabel:`mem.beta.discovery.confirm`,onConfirm:async()=>{let t=await h({system_discovery_consent:!0});if(xn(t.system_discovery_consent),t.system_context_error)X(e(`mem.toast.discoveryScanFailed`,{error:t.system_context_error}),`error`);else{let n=t.system_context_refresh?.stored??0;X(e(`mem.toast.discoveryEnabled`,{n}),`info`)}Q()}}}[Dn];return i(o.Fragment,{children:[c(`div`,{"aria-hidden":`true`,style:{position:`fixed`,inset:0,background:`var(--bg-modal-overlay)`,zIndex:9998,backdropFilter:`blur(4px)`},onClick:()=>z(null)}),i(`div`,{ref:br,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:[i(`div`,{style:{display:`flex`,alignItems:`center`,gap:10,marginBottom:16},children:[c(`span`,{className:`mem-beta`,style:{fontSize:11,fontWeight:700,color:`var(--accent-yellow)`,background:`var(--accent-yellow-dim)`,padding:`3px 10px`,borderRadius:4},children:e(`mem.beta`)}),c(`h2`,{id:`mem-beta-confirm-title`,style:{fontSize:16,fontWeight:600,color:`var(--text-primary)`},children:e(t.title)})]}),c(`p`,{id:`mem-beta-confirm-desc`,style:{fontSize:13,lineHeight:1.6,color:`var(--text-secondary)`,margin:`0 0 8px`},children:e(t.description)}),c(`ul`,{style:{fontSize:13,lineHeight:1.7,color:`var(--text-secondary)`,margin:`0 0 24px`,paddingInlineStart:20},children:t.bullets.map(t=>c(`li`,{children:e(t)},t))}),i(`div`,{style:{display:`flex`,justifyContent:`flex-end`,gap:10},children:[c(`button`,{className:`btn-secondary`,onClick:()=>z(null),style:{padding:`8px 20px`,fontSize:13,borderRadius:6},children:e(`mem.cancel`)}),c(`button`,{disabled:I,onClick:async()=>{L(!0);try{await t.onConfirm()}catch(t){r.system.warn(`Failed to update setting`,t),X(e(`mem.toast.settingFailed`,{error:T(t)}),`error`)}finally{L(!1),z(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(t.buttonLabel)})]})]})]})})(),i(`div`,{className:`mem-setting-row`,children:[i(`div`,{className:`mem-setting-info`,children:[c(`span`,{className:`mem-setting-label`,children:e(`mem.settings.mcp`)}),c(`span`,{className:`mem-setting-desc`,children:e(`mem.settings.mcpDesc`)})]}),c(`button`,{className:`mem-toggle${vn?` mem-toggle-on`:``}`,disabled:I,onClick:async()=>{if(!vn)z(`mcp`);else{L(!0);try{let e=await h({mcp_memory_enabled:!1});yn(e.mcp_memory_enabled)}catch(t){r.system.warn(`Failed to update memory settings`,t),X(e(`mem.toast.settingFailed`,{error:T(t)}),`error`)}finally{L(!1)}}},"aria-label":e(`mem.settings.mcpToggle`),"aria-pressed":vn,children:e.bare(vn?`mem.on`:`mem.off`)})]}),i(`div`,{className:`mem-setting-row`,children:[i(`div`,{className:`mem-setting-info`,children:[c(`span`,{className:`mem-setting-label`,children:e(`mem.settings.discovery`)}),c(`span`,{className:`mem-setting-desc`,children:e(`mem.settings.discoveryDesc`)})]}),c(`button`,{className:`mem-toggle${bn?` mem-toggle-on`:``}`,disabled:I,onClick:async()=>{if(!bn)z(`discovery`);else{L(!0);try{let e=await h({system_discovery_consent:!1});xn(e.system_discovery_consent)}catch(t){r.system.warn(`Failed to update system discovery setting`,t),X(e(`mem.toast.settingFailed`,{error:T(t)}),`error`)}finally{L(!1)}}},"aria-label":e(`mem.settings.discoveryToggle`),"aria-pressed":bn,children:e.bare(bn?`mem.on`:`mem.off`)})]}),i(`div`,{className:`mem-setting-row mem-setting-row-danger`,children:[i(`div`,{className:`mem-setting-info`,children:[c(`span`,{className:`mem-setting-label`,children:e(`mem.settings.reinit`)}),c(`span`,{className:`mem-setting-desc`,children:e(`mem.settings.reinitDesc`)})]}),Tn?i(`div`,{className:`mem-delete-confirm`,children:[c(`span`,{className:`mem-delete-confirm-label`,children:e(`mem.settings.sure`)}),c(`button`,{className:`mem-btn-danger`,disabled:I,onClick:async()=>{L(!0);try{let t=await we();t.system_context.error?X(e(`mem.toast.server`,{message:t.system_context.error}),`error`):X(e(`mem.toast.reinitialized`,{cleared:t.cleared.knowledge,stored:t.system_context.stored}),`info`),Q()}catch(t){r.system.warn(`Failed to reinitialize memory`,t),X(e(`mem.toast.reinitFailed`,{error:T(t)}),`error`)}finally{L(!1),En(!1)}},children:e(`mem.settings.reinitConfirm`)}),c(`button`,{className:`btn-secondary`,onClick:()=>En(!1),style:{padding:`6px 14px`,fontSize:12},children:e(`mem.cancel`)})]}):c(`button`,{className:`mem-btn-danger`,disabled:I,onClick:()=>En(!0),children:e(`mem.settings.reinitButton`)})]}),i(`div`,{className:`mem-setting-row mem-setting-row-danger`,children:[i(`div`,{className:`mem-setting-info`,children:[c(`span`,{className:`mem-setting-label`,children:e(`mem.settings.deleteAll`)}),c(`span`,{className:`mem-setting-desc`,children:e(`mem.settings.deleteAllDesc`)})]}),Sn?i(`div`,{className:`mem-delete-confirm`,children:[c(`span`,{className:`mem-delete-confirm-label`,children:e(`mem.settings.sure`)}),c(`button`,{className:`mem-btn-danger`,disabled:I,onClick:async()=>{L(!0);try{let t=await Ue();X(e(`mem.toast.cleared`,{knowledge:t.knowledge,conversations:t.conversations}),`info`),Q()}catch(t){r.system.warn(`Failed to clear memory`,t),X(e(`mem.toast.clearFailed`,{error:T(t)}),`error`)}finally{L(!1),Cn(!1)}},children:e(`mem.settings.deleteConfirm`)}),c(`button`,{className:`btn-secondary`,onClick:()=>Cn(!1),style:{padding:`6px 14px`,fontSize:12},children:e(`mem.cancel`)})]}):c(`button`,{className:`mem-btn-danger`,disabled:I,onClick:()=>Cn(!0),children:e(`mem.settings.deleteButton`)})]})]}),g&&i(`div`,{className:`mem-db-footer`,children:[i(`span`,{children:[e(`mem.footer.database`),`: `,c(`bdi`,{dir:`ltr`,children:qe(g.db_size_bytes)}),g.knowledge?.avg_confidence!=null&&i(o.Fragment,{children:[` · `,e(`mem.footer.avgConfidence`,{n:g.knowledge.avg_confidence.toFixed(2)})]})]}),i(`div`,{style:{display:`flex`,alignItems:`center`,gap:8},children:[g.knowledge?.entity_count!=null&&g.knowledge.entity_count>0&&c(`span`,{children:e(`mem.footer.entities`,{n:g.knowledge.entity_count})}),g.knowledge?.sensitive_count!=null&&g.knowledge.sensitive_count>0&&i(`span`,{children:[c(st,{size:10}),` `,e(`mem.footer.sensitive`,{n:g.knowledge.sensitive_count})]})]})]})]})}),B===`profile`&&i(`div`,{className:`mem-profile-grid`,children:[i(`div`,{className:`mem-profile-card`,children:[i(`div`,{className:`mem-profile-card-title`,children:[c(he,{size:16}),` `,e(`mem.disc.title`)]}),c(`p`,{className:`mem-profile-desc`,children:e(`mem.disc.desc`)}),c(`button`,{className:`btn-primary mem-profile-run-btn`,disabled:V===`running`||V===`saving`,onClick:Xr,children:V===`running`?i(o.Fragment,{children:[c(`div`,{className:`mem-spinner-sm`}),` `,e(`mem.running`)]}):e(`mem.disc.run`)}),Gn.length>0&&c(`div`,{className:`mem-log`,ref:Jn,children:Gn.map((e,t)=>c(`div`,{className:`mem-log-line ${e.kind}`,children:e.server?c(`bdi`,{children:e.text}):e.text},t))}),(V===`review`||V===`saving`||V===`done`)&&W.length>0&&i(`div`,{className:`mem-review-section`,children:[c(`div`,{className:`mem-review-header`,children:e(`mem.review.title`)}),c(`div`,{className:`mem-review-list`,children:W.map((e,t)=>i(`label`,{className:`mem-review-item`,children:[c(`input`,{type:`checkbox`,checked:e._checked,disabled:V===`saving`||V===`done`,onChange:()=>{G(e=>e.map((e,n)=>n===t?{...e,_checked:!e._checked}:e))}}),c(`bdi`,{className:`mem-review-content`,children:e.content}),c(`span`,{className:`mem-source-badge`,children:e._source_name?c(`bdi`,{children:e._source_name}):c(w,{value:e.category,keys:C})}),i(`span`,{className:`mem-conf-badge`,children:[Math.round(e.confidence*100),`%`]})]},t))}),i(`div`,{className:`mem-review-actions`,children:[c(`button`,{className:`btn-primary`,disabled:V===`saving`||V===`done`||W.filter(e=>e._checked).length===0,onClick:Zr,children:V===`saving`?i(o.Fragment,{children:[c(`div`,{className:`mem-spinner-sm`}),` `,e(`mem.saving`)]}):e(`mem.review.saveSelected`,{n:W.filter(e=>e._checked).length})}),i(`span`,{className:`mem-review-select-links`,children:[c(`button`,{type:`button`,className:`mem-link-btn`,onClick:()=>G(e=>e.map(e=>({...e,_checked:!0}))),children:e(`mem.review.selectAll`)}),` / `,c(`button`,{type:`button`,className:`mem-link-btn`,onClick:()=>G(e=>e.map(e=>({...e,_checked:!1}))),children:e(`mem.review.none`)})]})]})]}),V===`done`&&Kn!==null&&i(`div`,{className:`mem-profile-success`,children:[c(ye,{size:14}),` `,e(`mem.disc.saved`,{n:Kn})]}),V===`review`&&W.length===0&&c(`div`,{className:`mem-profile-empty`,children:e(`mem.disc.empty`)})]}),i(`div`,{className:`mem-profile-card`,children:[i(`div`,{className:`mem-profile-card-title`,children:[c(Me,{size:16}),` `,e(`mem.inf.title`)]}),c(`p`,{className:`mem-profile-desc`,children:e(`mem.inf.desc`)}),c(`p`,{className:`mem-profile-note`,children:e(`mem.inf.note`)}),i(`label`,{className:`mem-profile-checkbox`,children:[c(`input`,{type:`checkbox`,checked:er,onChange:e=>tr(e.target.checked),disabled:K===`running`||K===`saving`}),e(`mem.inf.browser`)]}),c(`button`,{className:`btn-primary mem-profile-run-btn`,disabled:K===`running`||K===`saving`,onClick:Qr,children:K===`running`?i(o.Fragment,{children:[c(`div`,{className:`mem-spinner-sm`}),` `,e(`mem.running`)]}):e(`mem.inf.run`)}),Xn.length>0&&c(`div`,{className:`mem-log`,ref:nr,children:Xn.map((e,t)=>c(`div`,{className:`mem-log-line ${e.kind}`,children:e.server?c(`bdi`,{children:e.text}):e.text},t))}),(K===`review`||K===`saving`||K===`done`)&&Y.length>0&&i(`div`,{className:`mem-review-section`,children:[c(`div`,{className:`mem-review-header`,children:e(`mem.review.title`)}),c(`div`,{className:`mem-review-list`,children:Y.map((e,t)=>i(`label`,{className:`mem-review-item`,children:[c(`input`,{type:`checkbox`,checked:e._checked,disabled:K===`saving`||K===`done`,onChange:()=>{Zn(e=>e.map((e,n)=>n===t?{...e,_checked:!e._checked}:e))}}),c(`bdi`,{className:`mem-review-content`,children:e.content}),c(`span`,{className:`mem-domain-badge ${Mt[e.domain]||`gray`}`,children:c(w,{value:e.domain,keys:jt})}),i(`span`,{className:`mem-conf-badge`,children:[Math.round(e.confidence*100),`%`]})]},t))}),i(`div`,{className:`mem-review-actions`,children:[c(`button`,{className:`btn-primary`,disabled:K===`saving`||K===`done`||Y.filter(e=>e._checked).length===0,onClick:$r,children:K===`saving`?i(o.Fragment,{children:[c(`div`,{className:`mem-spinner-sm`}),` `,e(`mem.saving`)]}):e(`mem.review.saveSelected`,{n:Y.filter(e=>e._checked).length})}),i(`span`,{className:`mem-review-select-links`,children:[c(`button`,{type:`button`,className:`mem-link-btn`,onClick:()=>Zn(e=>e.map(e=>({...e,_checked:!0}))),children:e(`mem.review.selectAll`)}),` / `,c(`button`,{type:`button`,className:`mem-link-btn`,onClick:()=>Zn(e=>e.map(e=>({...e,_checked:!1}))),children:e(`mem.review.none`)})]})]})]}),K===`done`&&Qn!==null&&i(`div`,{className:`mem-profile-success`,children:[c(ye,{size:14}),` `,e(`mem.inf.saved`,{n:Qn})]}),K===`review`&&Y.length===0&&c(`div`,{className:`mem-profile-empty`,children:e(`mem.inf.empty`)})]})]}),B===`goals`&&i(`div`,{className:`mem-goals-tab`,children:[c(`div`,{className:`mem-goals-stats-row`,children:[`queued`,`in_progress`,`completed`,`failed`].map(t=>i(`div`,{className:`mem-goals-stat-pill mem-goal-status-${t.replace(`_`,`-`)}`,children:[c(`span`,{className:`mem-goals-stat-n`,children:Nn?.goals[t]??0}),c(`span`,{className:`mem-goals-stat-label`,children:e(Dt[t])})]},t))}),jn.filter(e=>e.status===`pending_approval`).length>0&&i(`div`,{className:`mem-goals-approval-banner`,children:[i(`div`,{className:`mem-goals-approval-title`,children:[c(u,{size:14}),` `,e(`mem.goals.suggested`,{n:jn.filter(e=>e.status===`pending_approval`).length})]}),jn.filter(e=>e.status===`pending_approval`).map(t=>i(`div`,{className:`mem-goals-approval-item`,children:[i(`div`,{className:`mem-goals-approval-text`,children:[c(`strong`,{children:c(`bdi`,{children:t.title})}),c(`bdi`,{children:t.description})]}),i(`div`,{className:`mem-goals-approval-actions`,children:[c(`button`,{className:`btn-danger-sm`,onClick:()=>Ar(()=>se(t.id),`mem.goals.rejectFailed`),children:e(`mem.goals.reject`)}),c(`button`,{className:`btn-secondary`,onClick:()=>Ar(()=>Pe(t.id),`mem.goals.acceptFailed`),children:e(`mem.goals.accept`)})]})]},t.id))]}),c(`div`,{className:`mem-goals-toolbar`,children:i(`button`,{className:`btn-primary`,onClick:()=>Hn(e=>!e),children:[c(Ie,{size:14}),` `,e(`mem.goals.new`)]})}),Vn&&i(`div`,{className:`mem-goals-add-form`,children:[c(`input`,{className:`mem-input`,placeholder:e(`mem.goals.titlePlaceholder`),value:Un.title,onChange:e=>Wn(t=>({...t,title:e.target.value}))}),c(`textarea`,{className:`mem-input`,placeholder:e(`mem.goals.descPlaceholder`),rows:2,value:Un.description,onChange:e=>Wn(t=>({...t,description:e.target.value}))}),i(`div`,{className:`mem-goals-form-row`,children:[i(`select`,{className:`mem-select`,value:Un.priority,onChange:e=>Wn(t=>({...t,priority:e.target.value})),children:[c(`option`,{value:`low`,children:e(`mem.goals.priorityLow`)}),c(`option`,{value:`medium`,children:e(`mem.goals.priorityMedium`)}),c(`option`,{value:`high`,children:e(`mem.goals.priorityHigh`)})]}),c(`button`,{className:`btn-primary`,onClick:()=>{Un.title.trim()&&Ar(async()=>{await Xe(Un),Wn({title:``,description:``,priority:`medium`}),Hn(!1)},`mem.goals.createFailed`)},children:e(`mem.goals.create`)}),c(`button`,{className:`btn-secondary`,onClick:()=>Hn(!1),children:e(`mem.cancel`)})]})]}),Fn?i(`div`,{className:`mem-loading`,children:[c(`div`,{className:`mem-spinner`}),` `,e(`mem.goals.loading`)]}):jn.filter(e=>e.status!==`pending_approval`&&e.status!==`rejected`).length===0?i(`div`,{className:`mem-empty`,children:[c(`div`,{className:`mem-empty-icon`,children:c(ct,{size:32})}),c(`p`,{children:e(`mem.goals.empty`)})]}):c(`div`,{className:`mem-goals-list`,children:jn.filter(e=>e.status!==`pending_approval`&&e.status!==`rejected`).map(t=>i(`div`,{className:`mem-goal-card mem-goal-status-${t.status.replace(`_`,`-`)}`,children:[i(`div`,{className:`mem-goal-header`,role:`button`,tabIndex:0,"aria-expanded":Ln===t.id,onClick:()=>Rn(e=>e===t.id?null:t.id),onKeyDown:e=>{e.target===e.currentTarget&&(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),Rn(e=>e===t.id?null:t.id))},children:[i(`div`,{className:`mem-goal-header-left`,children:[c(`span`,{className:`mem-goal-status-dot status-${t.status.replace(`_`,`-`)}`}),c(`bdi`,{className:`mem-goal-title`,children:t.title}),c(`span`,{className:`mem-goal-priority mem-priority-${t.priority}`,children:c(w,{value:t.priority,keys:Ot})}),t.source!==`user`&&i(`span`,{className:`mem-goal-source-badge`,children:[c(u,{size:10}),` `,c(w,{value:t.source,keys:kt})]})]}),i(`div`,{className:`mem-goal-header-right`,children:[i(`span`,{className:`mem-goal-task-count`,children:[c($e,{size:12}),i(`bdi`,{dir:`ltr`,children:[t.tasks.filter(e=>e.status===`completed`).length,`/`,t.tasks.length]})]}),t.status===`queued`&&c(`button`,{className:`mem-goal-action-btn mem-goal-cancel-btn`,onClick:e=>{e.stopPropagation(),Ar(()=>Ge(t.id),`mem.goals.cancelFailed`)},children:e(`mem.cancel`)}),zn===t.id?c(`button`,{className:`mem-goal-action-btn mem-goal-delete-btn mem-goal-delete-confirm`,onClick:e=>{e.stopPropagation(),Bn(null),Ar(()=>Ae(t.id),`mem.goals.deleteFailed`)},children:e(`mem.row.deleteConfirm`)}):c(`button`,{className:`mem-goal-action-btn mem-goal-delete-btn`,"aria-label":e(`mem.goals.deleteAria`,{title:t.title}),onClick:e=>{e.stopPropagation(),Bn(t.id)},children:c(Ye,{size:12})}),c(Ce,{size:14,className:Ln===t.id?`mem-chevron-open`:``})]})]}),Ln===t.id&&i(`div`,{className:`mem-goal-body`,children:[t.description&&c(`p`,{className:`mem-goal-desc`,children:c(`bdi`,{children:t.description})}),t.progress_notes&&c(`p`,{className:`mem-goal-progress`,children:c(`bdi`,{children:t.progress_notes})}),t.tasks.length>0?c(`div`,{className:`mem-task-list`,children:t.tasks.map(e=>i(`div`,{className:`mem-task-row mem-task-status-${e.status}`,children:[c(`span`,{className:`mem-task-dot status-${e.status}`}),c(`bdi`,{className:`mem-task-desc`,children:e.description}),c(`span`,{className:`mem-task-status-label`,children:c(w,{value:e.status,keys:Dt})}),e.result&&c(`bdi`,{className:`mem-task-result`,children:e.result})]},e.id))}):c(`p`,{className:`mem-goal-no-tasks`,children:e(`mem.goals.noTasks`)})]})]},t.id))})]})]}),Wt.length>0&&c(`div`,{className:`mem-toast-container`,"aria-live":`polite`,children:Wt.map(e=>i(`div`,{className:`mem-toast mem-toast-${e.type}`,role:`status`,children:[e.type===`success`&&c(ye,{size:14}),e.type===`error`&&c(He,{size:14}),e.type===`info`&&c(oe,{size:14}),c(`span`,{children:e.text})]},e.id))})]})}export{Nt as MemoryDashboard};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.memory-dashboard-page{background:var(--bg-primary);flex-direction:column;height:100%;display:flex;overflow:hidden}.mem-beta{letter-spacing:.5px}.memory-dashboard-page .i18n-gloss.i18n-gloss{font-size:min(1em,max(.8em,11px))}.memory-dashboard-page bdi:is(.mem-review-content,.mem-task-desc,.mem-detail-value,.mem-goal-title){text-align:left}:root[dir=rtl] .memory-dashboard-page bdi:is(.mem-review-content,.mem-task-desc,.mem-detail-value,.mem-goal-title){text-align:right}.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-inline-start: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-inline-start: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;padding:7px 12px;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-inline-end:28px}.mem-filter-select: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)){background-position:8px}.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-block:7px;padding-inline:32px 12px}.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{inset-inline-start:10px;color:var(--text-muted);pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.mem-knowledge-table{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}.mem-knowledge-table th{text-align:start;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-inline-start: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-inline-end: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;inset-inline-end:0;box-shadow:-8px 0 8px -8px #00000059}.mem-knowledge-table .mem-actions-cell: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)){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:start;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{inset-inline-start:10px;color:var(--text-muted);pointer-events:none;position:absolute;top:50%;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-block:8px;padding-inline:32px 12px}.mem-conv-search input:focus{border-color:var(--accent)}.mem-conv-search input{padding-inline-end:32px}.mem-search-clear{inset-inline-end:8px;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%;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-inline-start: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-inline-start:3px solid var(--danger)}.mem-temporal-item.upcoming{border-inline-start: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{top:calc(100% + 6px);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;inset-inline-end: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:start;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-inline-end: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-inline-start: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{bottom:24px;z-index:200;pointer-events:none;flex-direction:column;gap:8px;display:flex;position:fixed;inset-inline-end: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-inline-start:3px solid var(--accent-green)}.mem-toast-error{border-inline-start:3px solid var(--danger)}.mem-toast-info{border-inline-start: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{min-inline-size:40px;background:var(--border);cursor:pointer;height:22px;transition:background var(--duration) var(--ease);border:none;border-radius:11px;flex-shrink:0;padding:0 8px;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{inset-inline:12px;bottom: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-inline-start: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}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.mobile-modal{width:420px}.mobile-modal-body{flex-direction:column;gap:16px;display:flex}.tunnel-status{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);align-items:center;gap:10px;padding:12px 16px;font-size:13px;font-weight:500;display:flex}.tunnel-status .status-dot{border-radius:50%;flex-shrink:0;width:8px;height:8px}.tunnel-status .status-dot.active{background:var(--accent-green)}.tunnel-status .status-dot.starting{background:var(--accent-yellow);animation:pulse-dot var(--duration-pulse) var(--ease-in-out) infinite}.tunnel-status .status-dot.error{background:var(--danger)}.tunnel-status .status-dot.setup,.tunnel-status .status-dot.inactive{background:var(--text-muted)}.tunnel-status .tunnel-spinner{border:2px solid var(--border);border-top-color:var(--accent);width:16px;height:16px;animation:spin var(--duration-spin) var(--ease-linear) infinite;border-radius:50%;margin-left:auto}@keyframes pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.85)}}.tunnel-error{background:color-mix(in srgb, var(--danger) 8%, transparent);border:1px solid color-mix(in srgb, var(--danger) 25%, transparent);border-radius:var(--radius-sm);color:var(--danger);word-break:break-word;white-space:pre-line;padding:12px 16px;font-size:13px;line-height:1.5}.tunnel-error a{color:var(--danger);text-decoration:underline}.tunnel-setup{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-secondary);flex-direction:column;gap:10px;padding:12px 16px;font-size:13px;line-height:1.5;display:flex}.tunnel-setup p{margin:0}.tunnel-setup-title{color:var(--text-primary);font-weight:600}.tunnel-setup-command input{font-family:var(--font-mono)}.tunnel-setup-link{color:var(--accent);font-size:var(--fs-label);align-items:center;gap:4px;display:inline-flex}.qr-code-area{flex-direction:column;align-items:center;gap:12px;display:flex}.qr-code-area canvas{border-radius:var(--radius-md);border:2px solid var(--border);box-shadow:var(--shadow-sm)}.qr-placeholder{background:var(--bg-secondary);border:2px dashed var(--border);border-radius:var(--radius-md);width:200px;height:200px;color:var(--text-muted);flex-direction:column;justify-content:center;align-items:center;gap:12px;font-size:14px;display:flex}.qr-placeholder.error{border-color:color-mix(in srgb, var(--danger) 30%, transparent);color:var(--danger)}.qr-placeholder .placeholder-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%}.tunnel-url-area{flex-direction:column;gap:6px;display:flex}.tunnel-url-area label{font-size:var(--fs-label);color:var(--text-muted);font-weight:600}.tunnel-url-row{align-items:center;gap:8px;display:flex}.tunnel-url-row input{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);font-family:var(--font-mono);color:var(--text-primary);outline:none;flex:1;padding:8px 12px;font-size:12px}.tunnel-url-row input:focus{border-color:var(--accent)}button.copy-url-btn{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);white-space:nowrap;transition:all var(--duration) var(--ease);align-items:center;gap:6px;padding:8px 14px;font-size:12px;font-weight:500;display:flex}button.copy-url-btn:hover{background:var(--bg-hover);border-color:var(--accent);color:var(--accent)}button.copy-url-btn.copied{color:var(--accent-green);border-color:var(--accent-green)}.tunnel-password-hint{background:color-mix(in srgb, var(--accent-yellow) 6%, transparent);border:1px solid color-mix(in srgb, var(--accent-yellow) 20%, transparent);border-radius:var(--radius-sm);text-align:center;padding:14px 16px}.tunnel-password-hint label{font-size:var(--fs-label);color:var(--accent-yellow);margin-bottom:6px;font-weight:700;display:block}.tunnel-password-value{font-size:22px;font-family:var(--font-mono);color:var(--text-primary);letter-spacing:1px;-webkit-user-select:all;user-select:all;cursor:text;margin-bottom:4px;font-weight:700}.tunnel-password-note{color:var(--text-muted);font-size:11px}.mobile-instructions{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-secondary);padding:14px 16px;font-size:13px;line-height:1.6}.mobile-instructions ol{margin:0;padding-left:20px}.mobile-instructions li{margin-bottom:4px}.mobile-instructions li:last-child{margin-bottom:0}.mobile-install-hint{border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-secondary);padding:14px 16px;font-size:13px;line-height:1.6}.mobile-install-hint-title{font-size:var(--fs-label);color:var(--text-primary);margin-bottom:4px;font-weight:700}.mobile-install-hint p{margin:0 0 6px}.mobile-install-hint p:last-child{margin-bottom:0}.mobile-access-actions{justify-content:flex-end;gap:8px;padding-top:4px;display:flex}@media (width<=480px){.mobile-modal{width:100%}.qr-code-area canvas{width:160px!important;height:160px!important}.qr-placeholder{width:160px;height:160px}}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./browser-KnDALPx_.js","./rolldown-runtime-XKyaHtl9.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{K as t,P as n,i as r,n as i,r as a}from"./apiBase-DSN0u9ls.js";import{X as o}from"./api-By968363.js";import{Pt as s,Wt as c,Y as l,at as u,ft as d,i as f,it as p,kt as m,mt as h,tt as g}from"./index-8uiHNHOH.js";var _=e(t(),1),v=null,y=`https://ngrok.com/download`;function b({isOpen:t,onClose:b,onStop:x,error:S,setupCommands:C,onRetry:w}){let[T,E]=(0,_.useState)(null),[D,O]=(0,_.useState)(!1),[k,A]=(0,_.useState)(null),j=g(),M=Array.isArray(C),N=!!S||M,[P,F]=(0,_.useState)(null),I=(0,_.useRef)(null);p(t,b);let L=(0,_.useRef)(null);l(L,t);let R=(0,_.useCallback)(async()=>{try{let e=await o();return E(e),e}catch(e){return n.system.error(`Failed to fetch tunnel status`,e),null}},[]);(0,_.useEffect)(()=>{if(!t||N)return;R();let e=setInterval(async()=>{let t=await R();t?.active&&t?.url&&clearInterval(e)},2e3);return()=>clearInterval(e)},[t,N,R]),(0,_.useEffect)(()=>{if(!T?.active||!T.url||!T.token||!I.current)return;let t=`${T.url}/?token=${T.token}`;n.system.info(`Generating QR code for: ${t}`),(async()=>{if(F(null),!v)try{let t=await f(()=>import(`./browser-KnDALPx_.js`).then(t=>e(t.default,1)),__vite__mapDeps([0,1]),import.meta.url);v=t.default||t}catch{n.system.error(`QR code library not available - install with: npm install qrcode`),F(`QR code unavailable on this build. Use the link below instead.`);return}let r=getComputedStyle(document.documentElement),i=r.getPropertyValue(`--text-primary`).trim(),a=r.getPropertyValue(`--bg-primary`).trim();if(!i||!a)n.system.error(`QR code skipped: --text-primary/--bg-primary did not resolve. styles/index.css must be loaded before this modal renders.`),F(`QR code unavailable — the theme did not load. Use the link below instead.`);else try{await v.toCanvas(I.current,t,{width:200,margin:2,color:{dark:i,light:a}})}catch(e){n.system.error(`QR code generation failed`,e),F(`QR code could not be drawn. Use the link below instead.`)}})()},[T?.active,T?.url,T?.token]);let z=(0,_.useRef)(null),B=(0,_.useCallback)(()=>{if(!T?.url||!T?.token)return;let e=`${T.url}/?token=${T.token}`;navigator.clipboard.writeText(e).then(()=>{O(!0),z.current&&clearTimeout(z.current),z.current=setTimeout(()=>O(!1),2e3)})},[T]),V=(0,_.useCallback)(e=>{navigator.clipboard.writeText(e).then(()=>{A(e),z.current&&clearTimeout(z.current),z.current=setTimeout(()=>A(null),2e3)}).catch(e=>n.system.error(`Could not copy the ngrok install command`,e))},[]);if((0,_.useEffect)(()=>()=>{z.current&&clearTimeout(z.current)},[]),!t)return null;let H=T?.active&&T?.url&&T?.token?`${T.url}/?token=${T.token}`:``;return a(`div`,{ref:L,className:`modal-overlay`,onClick:b,role:`dialog`,"aria-modal":`true`,"aria-label":`Mobile access`,children:r(`div`,{className:`modal-panel mobile-modal`,onClick:e=>e.stopPropagation(),children:[r(`div`,{className:`modal-header`,children:[r(`h3`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[a(d,{size:18}),`Mobile access`]}),a(`button`,{className:`btn-icon`,onClick:b,"aria-label":`Close`,children:a(u,{size:18})})]}),r(`div`,{className:`modal-body mobile-modal-body`,children:[r(`div`,{className:`tunnel-status`,children:[a(`span`,{className:`status-dot ${T?.active?`active`:M?`setup`:S?`error`:`starting`}`}),a(`span`,{children:T?.active?`Tunnel active`:M?j(`mobile.ngrokRequired`):S?`Couldn't start mobile access`:`Starting tunnel...`}),!T?.active&&!N&&a(`span`,{className:`tunnel-spinner`})]}),M&&r(`div`,{className:`tunnel-setup`,children:[a(`div`,{className:`tunnel-setup-title`,children:j(`mobile.setupTitle`)}),r(`p`,{children:[j(`mobile.setupIntro`),` `,C.length>0?j(`mobile.setupInstall`):j(`mobile.setupDownload`)]}),C.map(e=>r(`div`,{className:`tunnel-url-row tunnel-setup-command`,children:[a(`input`,{type:`text`,readOnly:!0,dir:`ltr`,value:e,"aria-label":j(`mobile.installCommand`)}),r(`button`,{className:`copy-url-btn ${k===e?`copied`:``}`,onClick:()=>V(e),title:j(`mobile.copyCommand`),children:[a(k===e?c:s,{size:13}),j(k===e?`mobile.copied`:`mobile.copy`)]})]},e)),r(`a`,{href:y,target:`_blank`,rel:`noopener noreferrer`,className:`tunnel-setup-link`,children:[j(`mobile.downloadPage`),` `,a(m,{size:11})]})]}),S&&!M&&a(`div`,{className:`tunnel-error`,children:S}),!N&&a(`div`,{className:`qr-code-area`,children:T?.active?r(i.Fragment,{children:[a(`canvas`,{ref:I,hidden:!!P}),P&&a(`div`,{className:`qr-placeholder error`,children:P})]}):r(`div`,{className:`qr-placeholder`,children:[a(`div`,{className:`placeholder-spinner`}),a(`span`,{children:`Connecting...`})]})}),T?.active&&H&&r(`div`,{className:`tunnel-url-area`,children:[a(`label`,{children:`Mobile URL`}),r(`div`,{className:`tunnel-url-row`,children:[a(`input`,{type:`text`,readOnly:!0,value:H}),r(`button`,{className:`copy-url-btn ${D?`copied`:``}`,onClick:B,title:`Copy URL`,children:[a(D?c:s,{size:13}),D?`Copied`:`Copy`]})]})]}),T?.active&&T?.publicIp&&T?.url&&!T.url.includes(`ngrok-free.app`)&&r(`div`,{className:`tunnel-password-hint`,children:[a(`label`,{children:`Tunnel password`}),a(`div`,{className:`tunnel-password-value`,children:T.publicIp}),a(`span`,{className:`tunnel-password-note`,children:`Enter this when the tunnel page asks for a password`})]}),!N&&a(`div`,{className:`mobile-instructions`,children:r(`ol`,{children:[a(`li`,{children:P?`Open the mobile URL above on your phone`:`Scan the QR code with your phone's camera`}),T?.url&&!T.url.includes(`ngrok-free.app`)&&a(`li`,{children:`Enter the tunnel password shown above when prompted`}),a(`li`,{children:`Chat with GAIA from your mobile device`}),a(`li`,{children:`Your data stays secure via encrypted tunnel`})]})}),T?.active&&!S&&r(`div`,{className:`mobile-install-hint`,children:[a(`div`,{className:`mobile-install-hint-title`,children:j(`mobileAccess.installTitle`)}),a(`p`,{children:j(`mobileAccess.installSteps`)}),a(`p`,{children:j(`mobileAccess.linkLifetime`)})]}),r(`div`,{className:`mobile-access-actions`,children:[T?.active&&x&&a(`button`,{className:`btn-danger`,onClick:x,title:`Close the tunnel and revoke the mobile URL`,children:`Stop tunnel`}),M&&w&&r(`button`,{className:`btn-primary`,onClick:w,children:[a(h,{size:13}),` `,j(`mobile.retry`)]}),a(`button`,{className:`btn-secondary`,onClick:b,children:`Close`})]})]})]})})}export{b as MobileAccessModal};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.schedule-modal{flex-direction:column;width:640px;max-height:80vh;display:flex}.schedule-modal .modal-body{flex:1;overflow-y:auto}.schedule-create-form{flex-direction:column;gap:10px;margin-bottom:20px;display:flex}.schedule-field{flex-direction:column;gap:4px;display:flex}.schedule-field-label{font-size:var(--fs-label);color:var(--text-secondary);font-weight:600}.schedule-form-row{gap:8px;display:flex}.schedule-form-row input{border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-input);color:var(--text-primary);font-size:13px;font-family:var(--font-sans);flex:1;padding:8px 12px}.schedule-form-row input:focus{border-color:var(--accent);outline:none}.schedule-form-row input::placeholder{color:var(--text-muted)}.schedule-prompt-input{border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-input);width:100%;color:var(--text-primary);font-size:13px;font-family:var(--font-sans);resize:vertical;min-height:60px;padding:8px 12px}.schedule-prompt-input:focus{border-color:var(--accent);outline:none}.schedule-prompt-input::placeholder{color:var(--text-muted)}.schedule-create-actions{justify-content:flex-end;gap:8px;display:flex}.schedule-form-error{color:var(--accent);margin-top:-4px;font-size:12px}.schedule-action-error{border-inline-start:2px solid var(--danger);background:color-mix(in srgb, var(--danger) 8%, transparent);color:var(--text-primary);overflow-wrap:anywhere;justify-content:space-between;align-items:flex-start;gap:8px;margin-bottom:8px;padding:6px 8px;font-size:12px;display:flex}.schedule-section{margin-bottom:20px}.schedule-section:last-child{margin-bottom:0}.schedule-section h4{font-size:var(--fs-label);color:var(--text-muted);margin-bottom:10px;font-weight:700}.schedule-empty{color:var(--text-muted);text-align:center;padding:24px 12px;font-size:13px}.schedule-list{flex-direction:column;gap:6px;display:flex}.schedule-card{border-radius:var(--radius-sm);background:var(--bg-secondary);border:1px solid var(--border-light);cursor:pointer;transition:background var(--duration-fast) var(--ease);flex-direction:column;padding:10px 12px;display:flex}.schedule-card:hover{background:var(--bg-hover)}.schedule-card.selected{border-color:var(--accent);background:var(--bg-hover)}.schedule-card.just-ran{animation:schedule-flash var(--duration-pulse) var(--ease)}@keyframes schedule-flash{0%{border-color:var(--accent-green)}to{border-color:var(--border-light)}}.schedule-card-header{justify-content:space-between;align-items:center;gap:8px;display:flex}.schedule-card-name{text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;font-weight:600;overflow:hidden}.schedule-card-status{font-size:var(--fs-caption);text-transform:capitalize;border-radius:var(--radius-sm);padding:2px 8px;font-weight:600}.schedule-card-status.active{color:var(--accent-green);background:color-mix(in srgb, var(--accent-green) 10%, transparent)}.schedule-card-status.paused{color:var(--accent-yellow);background:color-mix(in srgb, var(--accent-yellow) 10%, transparent)}.schedule-card-status.cancelled{color:var(--text-muted);background:var(--bg-tertiary)}.schedule-card-meta{color:var(--text-secondary);align-items:center;gap:12px;margin-top:6px;font-size:12px;display:flex}.schedule-card-error{border-inline-start:2px solid var(--danger);background:color-mix(in srgb, var(--danger) 8%, transparent);color:var(--text-primary);white-space:pre-wrap;overflow-wrap:anywhere;margin-top:6px;padding:6px 8px;font-size:12px}.schedule-card-prompt{color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap;margin-top:4px;font-size:12px;overflow:hidden}.schedule-card-actions{gap:4px;margin-top:8px;display:flex}.schedule-card-actions .btn-sm{border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--bg-tertiary);color:var(--text-primary);cursor:pointer;transition:background var(--duration-fast) var(--ease);align-items:center;gap:4px;padding:3px 10px;font-size:11px;display:inline-flex}.schedule-card-actions .btn-sm:hover{background:var(--bg-active)}.schedule-card-actions .btn-sm.chat{color:var(--accent-blue);border-color:var(--accent-blue)}.schedule-card-actions .btn-sm.chat:hover{background:color-mix(in srgb, var(--accent-blue) 10%, transparent)}.schedule-card-actions .btn-sm.danger{color:var(--accent);border-color:var(--accent)}.schedule-card-actions .btn-sm.danger:hover{background:color-mix(in srgb, var(--danger) 10%, transparent)}.schedule-results{border-top:1px solid var(--border);margin-top:16px;padding-top:14px}.schedule-results h4{font-size:var(--fs-label);color:var(--text-muted);margin-bottom:10px;font-weight:700}.schedule-results-list{flex-direction:column;gap:6px;max-height:200px;display:flex;overflow-y:auto}.schedule-result-item{border-radius:var(--radius-sm);background:var(--bg-tertiary);padding:8px 10px;font-size:12px}.schedule-result-time{color:var(--text-muted);font-family:var(--font-sans);font-size:var(--fs-caption);font-variant-numeric:tabular-nums;margin-bottom:4px}.schedule-result-content{color:var(--text-primary);white-space:pre-wrap;word-break:break-word;max-height:60px;overflow-y:auto}.schedule-result-error{color:var(--accent)}.schedule-results-empty{color:var(--text-muted);text-align:center;padding:12px;font-size:12px}.schedule-nl-input{border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-input);width:100%;color:var(--text-primary);font-size:13px;font-family:var(--font-sans);resize:vertical;min-height:50px;padding:10px 12px}.schedule-nl-input:focus{border-color:var(--accent);outline:none}.schedule-nl-input::placeholder{color:var(--text-muted)}.schedule-parsed-preview{border-radius:var(--radius-sm);border:1px solid var(--border-light);background:var(--bg-tertiary);padding:10px 12px;font-size:12px}.schedule-parsed-preview.valid{border-color:var(--accent-green);background:color-mix(in srgb, var(--accent-green) 5%, transparent)}.schedule-parsed-preview.invalid{border-color:var(--accent);background:color-mix(in srgb, var(--danger) 5%, transparent)}.schedule-parsed-loading{color:var(--text-muted);font-style:italic}.schedule-parsed-description{color:var(--text-primary);margin-bottom:4px;font-weight:600}.schedule-parsed-hint{color:var(--text-secondary);margin-bottom:4px}.schedule-parsed-next{color:var(--text-secondary);margin-bottom:6px;font-size:11px}.schedule-parsed-details{flex-wrap:wrap;gap:8px;display:flex}.schedule-parsed-tag{border-radius:var(--radius-sm);background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);align-items:center;gap:4px;padding:2px 8px;font-size:11px;display:inline-flex}.schedule-field-missing{box-shadow:0 0 0 1px color-mix(in srgb, var(--accent-yellow) 30%, transparent);border-color:var(--accent-yellow)!important}
|