mulmoclaude 2.4.0 → 2.4.1
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/client/assets/{index-ijQN8Kty.js → index-CkmW0yWc.js} +11 -11
- package/client/assets/{marp-DbrRRh1n.js → marp-OXXg-yyV.js} +1 -1
- package/client/index.html +1 -1
- package/package.json +2 -2
- package/server/agent/index.ts +5 -3
- package/server/agent/prompt.ts +6 -3
- package/server/agent/promptWorkspacePaths.ts +12 -0
- package/server/build/mcp-server.mjs +604 -604
- package/server/index.ts +7 -22
- package/server/prompts/system/system.md +1 -2
- package/server/workspace/journal/index.ts +3 -0
- package/server/workspace/journal/memoryExtractor.ts +6 -0
- package/server/workspace/memory/legacy-fold.ts +34 -0
- package/server/workspace/memory/legacy-migration-gate.ts +27 -0
- package/server/workspace/memory/llm-classifier.ts +4 -22
- package/server/workspace/memory/migrate.ts +52 -21
- package/server/workspace/memory/run.ts +32 -28
- package/server/workspace/memory/seed-topic-layout-run.ts +50 -0
- package/server/workspace/memory/seed-topic-layout.ts +34 -0
- package/server/workspace/memory/startup.ts +29 -0
- package/server/workspace/memory/topic-migrate.ts +78 -9
- package/server/workspace/memory/topic-run.ts +14 -9
- package/server/workspace/memory/topic-swap.ts +4 -6
- package/server/workspace/workspace.ts +4 -7
- package/src/config/systemFileDescriptors.ts +1 -1
- package/src/lang/de.ts +5 -4
- package/src/lang/en.ts +5 -4
- package/src/lang/es.ts +5 -4
- package/src/lang/fr.ts +5 -4
- package/src/lang/ja.ts +6 -4
- package/src/lang/ko.ts +6 -4
- package/src/lang/pt-BR.ts +5 -4
- package/src/lang/zh.ts +6 -4
- package/server/workspace/billing-migration.ts +0 -69
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/mermaid.core-Ck4FoAPC.js","assets/preload-helper-BLdHbfdN.js","assets/purify.es-B0LuI4JX.js","assets/chunk-Y2CYZVJY-DsF7k-Jl.js","assets/src-tZFcq4Tp.js","assets/vue.runtime.esm-bundler-C6akXk9q.js","assets/chunk-VPRB5NB3-CYQe0pjV.js","assets/chunk-3YJQHVM4-B_LDijS0.js","assets/dist-DovUe4bX.js","assets/chunk-HJ2JQQFS-CdiwUyEn.js","assets/chunk-E2ZNV5FY-CRk3Pfq3.js","assets/chunk-DUW6YSOI-Dgx8z5s3.js","assets/chunk-4EA7E6EY-DB8ZoOxD.js","assets/chunk-XC4XBNZT-Crw0ZTTY.js","assets/chunk-J5ZVWO5B-oDCd-gWO.js","assets/rough.esm-Dy-Kn_BL.js","assets/chunk-DBDB3WZW-CfsLqRL8.js","assets/chunk-2BW5OAIV-BmsIcsho.js","assets/line-CHud_SQT.js","assets/path-fybaL0A-.js","assets/array-BifhSqXX.js","assets/chunk-NTY3LDVX-DJFUMgKq.js","assets/marp-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/mermaid.core-Ck4FoAPC.js","assets/preload-helper-BLdHbfdN.js","assets/purify.es-B0LuI4JX.js","assets/chunk-Y2CYZVJY-DsF7k-Jl.js","assets/src-tZFcq4Tp.js","assets/vue.runtime.esm-bundler-C6akXk9q.js","assets/chunk-VPRB5NB3-CYQe0pjV.js","assets/chunk-3YJQHVM4-B_LDijS0.js","assets/dist-DovUe4bX.js","assets/chunk-HJ2JQQFS-CdiwUyEn.js","assets/chunk-E2ZNV5FY-CRk3Pfq3.js","assets/chunk-DUW6YSOI-Dgx8z5s3.js","assets/chunk-4EA7E6EY-DB8ZoOxD.js","assets/chunk-XC4XBNZT-Crw0ZTTY.js","assets/chunk-J5ZVWO5B-oDCd-gWO.js","assets/rough.esm-Dy-Kn_BL.js","assets/chunk-DBDB3WZW-CfsLqRL8.js","assets/chunk-2BW5OAIV-BmsIcsho.js","assets/line-CHud_SQT.js","assets/path-fybaL0A-.js","assets/array-BifhSqXX.js","assets/chunk-NTY3LDVX-DJFUMgKq.js","assets/marp-OXXg-yyV.js","assets/__vite-browser-external-0OnNcCAs.js","assets/mathjax-B2LxS74s.js","assets/PrioritizedList-kZ7_WZX-.js","assets/liteAdaptor-BcJ0akeI.js","assets/Options-DmQY5iBM.js","assets/Element-Cv7I_0yC.js","assets/Entities-C8-4eSNA.js","assets/Styles-B53-i2nc.js","assets/html-CR7kQNkU.js","assets/InputJax-DgXeQ-Ah.js","assets/FunctionList-vF4juMGB.js","assets/OutputJax-CAQGaq8b.js","assets/MathItem-Detxmt2G.js","assets/MmlFactory-CIQ3138s.js","assets/mo-C-TLAbzI.js","assets/TeXAtom-Dwnbvu2N.js","assets/tex-ClbW-kMH.js","assets/BaseConfiguration-D3cG9hNe.js","assets/lengths-BWBolkW1.js","assets/AllPackages-Dw2RXFr1.js","assets/svg-DmHVKe1q.js","assets/assistive-mml-BBZjDstH.js","assets/manifold-DUBpAdN8.js","assets/html2canvas-D0m9Y8pD-y1tDAhR3.js","assets/style-CCV5GAnU-D55tgtzm.js","assets/index.es-HSMDtZ_a-CYtNwG_G.js","assets/typeof-CcP5rTWg-B5XbjTb1.js","assets/heic2any-B4wtRmxS.js","assets/JsonEditor-ZvNJuqs_.js","assets/vue-i18n-BbRMUmOW.js","assets/_plugin-vue_export-helper-BDNMzG2s.js","assets/JsonEditor-CPJfn76E.css"])))=>i.map(i=>d[i]);
|
|
2
2
|
import{$ as e,$n as t,Ar as n,At as r,C as i,Cr as a,Ct as o,D as s,Dr as c,E as l,En as u,Er as d,Fn as f,Fr as p,G as m,Gn as h,Hn as g,Ht as _,In as v,Ir as y,J as b,Jn as x,K as S,Kt as C,Lt as w,Mr as T,Nr as E,P as D,Pr as O,Pt as k,Qt as A,R as j,Rn as M,Rr as N,Rt as P,S as F,Sr as I,T as L,Tr as R,Wn as z,Wt as B,Xn as V,Xt as H,Y as U,Yn as ee,Zn as te,Zt as ne,_r as re,a as ie,b as ae,bn as oe,br as W,cn as se,cr as ce,d as le,dn as ue,dr as de,en as fe,fn as G,fr as pe,ft as me,gr as he,h as ge,hr as _e,ht as ve,it as K,jr as ye,jt as be,kr as xe,kt as Se,lr as Ce,mr as we,n as Te,nr as Ee,nt as De,or as q,pr as Oe,q as ke,rt as Ae,sr as je,tr as Me,tt as J,ur as Ne,vr as Pe,w as Fe,wn as Ie,wr as Le,wt as Re,x as ze,xr as Be,yn as Ve,yr as He,zr as Ue}from"./vue.runtime.esm-bundler-C6akXk9q.js";import{n as We,t as Ge}from"./vue-i18n-BbRMUmOW.js";import{a as Ke,i as qe,n as Je,t as Ye}from"./vue-C_VSdwOG.js";import{t as Xe}from"./preload-helper-BLdHbfdN.js";import{t as Ze}from"./purify.es-B0LuI4JX.js";import{t as Qe}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as $e}from"./style-CCV5GAnU-D55tgtzm.js";import{t as et}from"./typeof-CcP5rTWg-B5XbjTb1.js";import{t as tt}from"./v4-DDdyfk2q.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})(),Object.freeze({min:0,max:65535});function nt(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function rt(e){return typeof e==`object`&&!!e}function it(e){return Array.isArray(e)}function at(e,t){return nt(e)&&typeof e[t]==`string`}function ot(e,t){return e instanceof Error?e.message:at(e,`details`)&&e.details?e.details:at(e,`message`)&&e.message?e.message:t===void 0?String(e):t}var st=new Map([[`&`,`&`],[`<`,`<`],[`>`,`>`],[`"`,`"`],[`'`,`'`]]);function ct(e){return e.replace(/[&<>"']/g,e=>st.get(e)??e)}var lt=e=>typeof e==`string`||typeof e==`number`||typeof e==`boolean`||e instanceof Date;function ut(e){return e==null||!lt(e)?null:e instanceof Date?Number.isNaN(e.getTime())?null:e.toISOString():String(e)}function dt(e,t=``){return ut(e)??t}var ft=new Set([`derived`,`embed`,`backlinks`,`rollup`,`toggle`,`flag`]);function pt(e,t){return e.type===`embed`?e.id?e.id:e.idField&&t?dt(t[e.idField]):``:``}var mt=8;function ht(e,t,n=mt){let r=t();for(let i=0;i<n&&e.has(r);i++)r=t();return r}function gt(e,t,n,r=mt){return ht(new Set(e.map(e=>dt(e[t]))),n,r)}var _t=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{9}Z$/,vt=1e3,yt=1e6,bt=e=>{if(typeof e!=`string`||!_t.test(e)||e.startsWith(`0000-`))return!1;let t=Date.parse(`${e.slice(0,19)}Z`);return!Number.isNaN(t)&&new Date(t).toISOString().slice(0,19)===e.slice(0,19)};function xt(e){if(!bt(e))return null;let t=Date.parse(`${e.slice(0,19)}Z`);if(Number.isNaN(t))return null;let n=Number(e.slice(20,29));return{seconds:Math.floor(t/vt),nanoseconds:n}}function St(e){let t=xt(e);return t===null?null:t.seconds*vt+Math.floor(t.nanoseconds/yt)}var Ct={violet:`bg-violet-50 text-violet-700`,indigo:`bg-indigo-50 text-indigo-700`,sky:`bg-sky-50 text-sky-700`,teal:`bg-teal-50 text-teal-700`,emerald:`bg-emerald-50 text-emerald-700`,lime:`bg-lime-50 text-lime-700`,fuchsia:`bg-fuchsia-50 text-fuchsia-700`};function wt(e){return typeof e==`string`&&Object.hasOwn(Ct,e)}function Tt(e){return wt(e)?Ct[e]:null}var Et=864e5,Dt=/^(\d{4})-(\d{2})-(\d{2})$/,Ot=/^\d{2}$/,kt=/(\d{1,2}):(\d{2})/g,At=/[-–—~〜~]/,jt=1440;function Mt(e){return String(e).padStart(2,`0`)}function Nt(e){return`${String(e.year).padStart(4,`0`)}-${Mt(e.month)}-${Mt(e.day)}`}function Pt(e){if(typeof e!=`string`)return null;let t=Dt.exec(e.trim());if(!t)return null;let n=Number(t[1]),r=Number(t[2]),i=Number(t[3]),a=new Date(Date.UTC(n,r-1,i));return a.getUTCFullYear()!==n||a.getUTCMonth()!==r-1||a.getUTCDate()!==i?null:{year:n,month:r,day:i}}function Ft(e,t){return e<0||e>23||t<0||t>59?null:e*60+t}function It(e){if(typeof e!=`string`)return null;let t=e.trim(),n=t.indexOf(`T`);if(n===-1)return null;let r=Pt(t.slice(0,n));if(!r)return null;let i=t.slice(n+1).split(`:`);if(i.length<2||i.length>3||!i.every(e=>Ot.test(e)))return null;let a=Ft(Number(i[0]),Number(i[1]));return a===null?null:{ymd:r,minutes:a}}function Lt(e){let t=St(e);if(t===null)return null;let n=new Date(t);return{ymd:{year:n.getFullYear(),month:n.getMonth()+1,day:n.getDate()},minutes:n.getHours()*60+n.getMinutes()}}function Rt(e){return Pt(e)??It(e)?.ymd??Lt(e)?.ymd??null}function zt(e){return It(e)?.minutes??Lt(e)?.minutes??null}function Bt(e){if(typeof e!=`string`)return null;let t=e.trim();if(!t)return null;let n=[...t.matchAll(kt)];if(n.length===0)return null;let r=e=>Ft(Number(e[1]),Number(e[2]));if(!At.test(t)){let[e]=n,t=e?r(e):null;return t===null?null:{startMin:t,endMin:null}}let i=t.search(At),a=null,o=null;for(let e of n)(e.index??0)<i?a=r(e):o=r(e);return a===null?null:{startMin:a,endMin:o}}function Vt(e){return Date.UTC(e.year,e.month-1,e.day)}function Ht(e){let t=new Date(e);return{year:t.getUTCFullYear(),month:t.getUTCMonth()+1,day:t.getUTCDate()}}function Ut(e,t){return Vt(e)-Vt(t)}function Wt(e,t){return Ut(e.start,t)<=0&&Ut(t,e.end)<=0}function Gt(e,t,n=0){let r=(new Date(Date.UTC(e,t-1,1)).getUTCDay()-n+7)%7,i=Date.UTC(e,t-1,1)-r*Et,a=[];for(let n=0;n<42;n++){let r=Ht(i+n*Et);a.push({ymd:r,inMonth:r.year===e&&r.month===t,key:Nt(r)})}return a}function Kt(e,t,n,r,i={}){let a=Zt(e,t,n);return a?Qt(i.endExclusive&&n!==void 0?Xt(a,e[n]):a,r?e[r]:void 0):null}function qt(e,t){return{endExclusive:(t===void 0?void 0:e.googleCalendar?.map[t])===`end`}}var Jt=/T00:00(?::00)?$/;function Yt(e){return Pt(e)!==null||typeof e==`string`&&It(e)!==null&&Jt.test(e.trim())}function Xt(e,t){if(!Yt(t)||Ut(e.end,e.start)<=0)return e;let n=Ht(Vt(e.end)-Et),r=e.endMin===0||e.startMin!==null;return{...e,end:n,endMin:r?jt:null}}function Zt(e,t,n){let r=e[t],i=Rt(r);if(!i)return null;let a=n?e[n]:void 0,o=Rt(a),s=o!==null&&Ut(o,i)>=0?o:null;return{item:e,start:i,end:s??i,startMin:zt(r),endMin:s?zt(a):null}}function Qt(e,t){if(e.startMin!==null||e.endMin!==null)return e;let n=Bt(t);return n?{...e,startMin:n.startMin,endMin:n.endMin}:e}function $t(e,t,n,r,i={}){let a=[],o=[];for(let s of e){let e=Kt(s,t,n,r,i);e?a.push(e):o.push(s)}return a.sort((e,t)=>Ut(e.start,t.start)),{spans:a,noDate:o}}function en(e,t){if(!Wt(e,t))return null;let{startMin:n,endMin:r}=e;if(n===null&&r===null)return{kind:`allDay`,startMin:0,endMin:jt,bleedsBefore:!1,bleedsAfter:!1};let i=Ut(e.start,e.end)===0,a=Ut(t,e.start)===0,o=Ut(t,e.end)===0;if(i&&n!==null&&r===null)return{kind:`line`,startMin:n,endMin:n,bleedsBefore:!1,bleedsAfter:!1};let s=a&&n!==null?n:0,c=o&&r!==null?r:jt;return i&&c<=s?{kind:`line`,startMin:s,endMin:s,bleedsBefore:!1,bleedsAfter:!1}:{kind:`block`,startMin:s,endMin:c,bleedsBefore:!a,bleedsAfter:!o}}function tn(e){return[...e.entries()].map(([e,t])=>({index:e,span:t})).sort((e,t)=>e.span.startMin-t.span.startMin||e.span.endMin-t.span.endMin)}function nn(e){let t=e.reduce((e,t)=>e.current.length>0&&t.span.startMin>=e.end?(e.done.push(e.current),{done:e.done,current:[t],end:t.span.endMin}):(e.current.push(t),{done:e.done,current:e.current,end:Math.max(e.end,t.span.endMin)}),{done:[],current:[],end:-1/0});return t.current.length>0&&t.done.push(t.current),t.done}function rn(e){let t=[];return e.map(({index:e,span:n})=>{let r=t.findIndex(e=>e<=n.startMin),i=r===-1?t.length:r;return t[i]=n.endMin,{index:e,lane:i}}).map(({index:e,lane:n})=>[e,{lane:n,lanes:t.length}])}function an(e){let t=nn(tn(e)),n=new Map(t.flatMap(rn));return e.map((e,t)=>n.get(t)??{lane:0,lanes:1})}function on(){return crypto.randomUUID().replace(/-/g,``)}function sn(e){return e.type!==`enum`||e.default===void 0?null:e.values.includes(e.default)?e.default:null}function cn(e,t){if(!e)return!0;let n=ut(t[e.field]);return n!==null&&e.in.includes(n)}function ln(e,t){return cn(e.when??e.require,t)}function un(e,t){return t===void 0?`collection/${e}`:`item/${t}/${e}`}function dn(e,t){return cn(e.when,t)}function fn(e,t,n){if(Object.hasOwn(t,e))return ut(t[e])===n;let r=e.indexOf(`.`);if(r===-1)return!1;let i=e.slice(0,r),a=e.slice(r+1),o=t[i];return it(o)?o.some(e=>nt(e)&&ut(e[a])===n):!1}function pn(e,t,n){return t?n.filter(n=>fn(e.via,n,t)&&cn(e.filter,n)):[]}function mn(e){return typeof e==`number`?e:typeof e==`string`&&e.trim()!==``?Number(e):NaN}function hn(e,t,n){let r=pn(e,t,n);if(e.op===`count`)return r.length;let i=0;for(let t of r){let n=mn(e.column===void 0?void 0:t[e.column]);Number.isFinite(n)&&(i+=n)}return i}function gn(e){let t=new Set,n=e=>{for(let r of Object.values(e))r.type===`ref`&&typeof r.to==`string`&&r.to.length>0&&t.add(r.to),r.type===`table`&&r.of&&n(r.of)};return n(e.fields),[...t]}function _n(e){let t=new Set;for(let n of Object.values(e.fields))n.type===`embed`&&typeof n.to==`string`&&n.to.length>0&&t.add(n.to);return[...t]}function vn(e){let t=new Set;for(let n of Object.values(e.fields))(n.type===`backlinks`||n.type===`rollup`)&&n.from.length>0&&t.add(n.from);return[...t]}function yn(e){return e==null}function bn(e,t){return Object.hasOwn(e,t)?e[t]:void 0}function xn(e,t,n){if(!e.valueFrom)return e.value;let{record:r,field:i}=e.valueFrom,a=r===void 0?t:bn(n,r),o=a===void 0?void 0:bn(a,i);return yn(o)?void 0:String(o)}function Sn(e,t,n){return e===`gt`?t>n:e===`gte`?t>=n:e===`lt`?t<n:t<=n}function Cn(e){return e.trim()===``?NaN:Number(e)}function wn(e,t,n){if(Array.isArray(n))return!1;let r=Cn(t),i=Cn(n);return Number.isNaN(r)||Number.isNaN(i)?!1:Sn(e,r,i)}function Tn(e,t,n){switch(e){case`eq`:return t===String(n);case`ne`:return t!==String(n);case`in`:return Array.isArray(n)&&n.includes(t);case`contains`:return t.includes(String(n));case`gt`:case`gte`:case`lt`:case`lte`:return wn(e,t,n);default:return!1}}function En(e,t,n){let r=bn(t,e.field);if(yn(r))return e.op===`ne`;let i=xn(e,t,n);return i!==void 0&&Tn(e.op,String(r),i)}function Dn(e,t,n={}){return e.every(e=>En(e,t,n))}function On(e,t){let{completionField:n,completionDoneValues:r}=e;if(!n)return!1;let i=e.fields?.[n];if(i?.type===`flag`&&i.where)return Dn(i.where,t);if(!r)return!1;let a=ut(t[n]);return a!==null&&r.includes(a)}function kn(e){let{completionField:t,completionDoneValues:n}=e;if(n?.length!==1)return!1;let[r]=n;return e.fields[t??``]?.type===`boolean`?r===`true`:Object.values(e.fields).some(e=>e.type===`toggle`&&e.field===t&&e.onValue===r)}function An(e,t){return t.type===`toggle`&&dt(e[t.field])===t.onValue}function jn(e,t){return e[t]===!0}function Mn(e,t,n,r){if(e.synthetic)return On(t,n);let i=t.fields[e.key];return i?.type===`toggle`?An(n,i):i?.type===`boolean`?n[e.key]===!0:jn(r(n),e.key)}function Nn(e,t){let n;try{n=Bn(e)}catch{return null}let r=new Gn(n),i;try{if(i=r.parseExpr(),!r.atEnd())return null}catch{return null}let a=Kn(i,t);return Number.isFinite(a)?a:null}var Pn=[`(`,`)`,`+`,`-`,`*`,`/`,`.`];function Fn(e){return Pn.some(t=>t===e)}function In(e){let t=e.input[e.index];return t===` `||t===` `||t===`
|
|
3
3
|
`?(e.index++,!0):!1}function Ln(e){let t=e.input[e.index]??``,n=e.input[e.index+1]??``;if(!Vn(t)&&!(t===`.`&&Vn(n)))return null;let r=``;for(;e.index<e.input.length;){let t=e.input[e.index]??``;if(!Vn(t)&&t!==`.`)break;r+=t,e.index++}let i=Number(r);if(!Number.isFinite(i))throw Error(`bad number`);return{kind:`number`,value:i}}function Rn(e){if(!Hn(e.input[e.index]??``))return null;let t=``;for(;e.index<e.input.length&&Un(e.input[e.index]??``);)t+=e.input[e.index],e.index++;return{kind:`ident`,value:t}}function zn(e){let t=e.input[e.index]??``;return t===`[`&&e.input[e.index+1]===`]`?(e.index+=2,{kind:`[]`}):Fn(t)?(e.index++,{kind:t}):null}function Bn(e){let t=[],n={input:e,index:0};for(;n.index<e.length;){if(In(n))continue;let r=Ln(n);if(r){t.push(r);continue}let i=zn(n);if(i){t.push(i);continue}let a=Rn(n);if(a)t.push(a);else throw Error(`unexpected char ${e[n.index]}`)}return t}function Vn(e){return e>=`0`&&e<=`9`}function Hn(e){return e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e===`_`}function Un(e){return Hn(e)||Vn(e)}function eee(e){return e===`+`||e===`-`?e:null}function Wn(e){return e===`*`||e===`/`?e:null}var Gn=class{tokens;cursor=0;constructor(e){this.tokens=e}atEnd(){return this.cursor>=this.tokens.length}peek(){return this.tokens[this.cursor]}consume(){let e=this.tokens[this.cursor++];if(!e)throw Error(`unexpected end of input`);return e}expectPunct(e){let t=this.consume();if(t.kind!==e)throw Error(`expected ${e}, got ${t.kind}`)}expectIdent(){let e=this.consume();if(e.kind!==`ident`)throw Error(`expected ident, got ${e.kind}`);return e.value}takeOperator(e){let t=e(this.peek()?.kind);return t&&this.consume(),t}*operatorRun(e){for(;;){let t=this.takeOperator(e);if(!t)return;yield t}}parseChain(e,t){let n=t(),r=[];for(let n of this.operatorRun(e))r.push({operator:n,right:t()});return r.reduce((e,{operator:t,right:n})=>({kind:`binop`,operator:t,left:e,right:n}),n)}parseExpr(){return this.parseChain(eee,()=>this.parseTerm())}parseTerm(){return this.parseChain(Wn,()=>this.parseFactor())}parseFactor(){let e=this.peek();if(!e)throw Error(`unexpected end in factor`);if(e.kind===`number`)return this.consume(),{kind:`num`,value:e.value};if(e.kind===`(`){this.consume();let e=this.parseExpr();return this.expectPunct(`)`),e}if(e.kind===`ident`)return this.parseIdentFactor(e.value);throw Error(`unexpected token ${e.kind} in factor`)}parseIdentFactor(e){if(e===`sum`&&this.tokens[this.cursor+1]?.kind===`(`){this.consume(),this.expectPunct(`(`);let e=this.parseSumArg();return this.expectPunct(`)`),{kind:`sum`,arg:e}}return this.consume(),this.peek()?.kind===`.`?(this.consume(),{kind:`ref`,field:e,col:this.expectIdent()}):{kind:`ident`,name:e}}parseSumArg(){let e=[this.parseTableCol()],t=[];for(let n of this.operatorRun(Wn))t.push(n),e.push(this.parseTableCol());return{factors:e,operators:t}}parseTableCol(){let e=this.expectIdent();return this.expectPunct(`[]`),this.expectPunct(`.`),{table:e,col:this.expectIdent()}}};function Kn(e,t){let n=[{kind:`visit`,node:e}],r=[];for(let e=n.pop();e;e=n.pop())if(e.kind===`apply`)r.push(tee(e.operator,r));else if(e.node.kind===`binop`){let{operator:t,left:r,right:i}=e.node;n.push({kind:`apply`,operator:t},{kind:`visit`,node:i},{kind:`visit`,node:r})}else r.push(nee(e.node,t));let i=r.pop();return i!==void 0&&r.length===0?i:NaN}function tee(e,t){let n=t.pop(),r=t.pop();return r===void 0||n===void 0?NaN:qn(e,r,n)}function nee(e,t){if(e.kind===`num`)return e.value;if(e.kind===`ident`)return Zn(t.record[e.name]);if(e.kind===`ref`){let n=t.refs?.[e.field]??null;return n?Zn(n[e.col]):NaN}return Jn(e.arg,t)}function qn(e,t,n){return!Number.isFinite(t)||!Number.isFinite(n)?NaN:e===`+`?t+n:e===`-`?t-n:e===`*`?t*n:n===0?NaN:t/n}function Jn(e,t){let n=e.factors.at(0);if(!n)return 0;if(e.factors.some(e=>e.table!==n.table))return NaN;let r=t.record[n.table];return it(r)?r.filter(rt).reduce((t,n)=>t+Yn(n,e),0):0}function Yn(e,{factors:t,operators:n}){let[r,...i]=t;return r?i.reduce((t,r,i)=>{let a=n[i];return a?qn(a,t,Xn(e,r.col)):NaN},Xn(e,r.col)):NaN}function Xn(e,t){return nt(e)?Zn(e[t]):NaN}function Zn(e){if(typeof e==`number`)return Number.isFinite(e)?e:NaN;if(typeof e==`string`&&e.length>0){let t=Number(e);return Number.isFinite(t)?t:NaN}return NaN}function Qn(e,t){return Object.hasOwn(e,t)?e[t]:void 0}function $n(e,t,n){let r={};for(let[i,a]of Object.entries(e.fields)){if(a.type!==`ref`||!a.to)continue;let e=t[i],o=Qn(n,a.to);r[i]=typeof e==`string`&&o?Qn(o,e)??null:null}return r}function er(e){return e.type===`derived`||e.type===`flag`}function tr(e,t,n){if(e.type===`derived`&&e.formula)return Nn(e.formula,{record:t,refs:n});if(e.type===`flag`&&e.where)return Dn(e.where,t)}function nr(e,t,n){let r=new Set(Object.entries(e.fields).filter(([,e])=>er(e)).map(([e])=>e)),i=Object.fromEntries(Object.entries(t).filter(([e])=>!r.has(e))),a=$n(e,t,n);for(let t=0;t<r.size;t++){let t=!1;for(let[n,r]of Object.entries(e.fields)){let e=tr(r,i,a);e!=null&&i[n]!==e&&(i[n]=e,t=!0)}if(!t)break}return i}var rr=200;function ir(e){return e.replace(/[<>]/g,``).replace(/`/g,`'`).replace(/\$\{/g,`$ {`).replace(/\s+/g,` `).slice(0,rr)}var ar=/^[a-z0-9_]+$/;function or(e){try{let t=new Intl.Segmenter(void 0,{granularity:`grapheme`});for(let{segment:n}of t.segment(e))return n;return e}catch{return[...e][0]??e}}function sr(e,t){let n=(e??``).trim()||t.trim()||`dataset`;return ar.test(n)?{kind:`symbol`,name:n}:{kind:`glyph`,text:or(n)}}function cr(e,t){return e instanceof Error?e:Error(t??ot(e))}var lr=`presentCollection`;function ur(e){return e.scope===void 0?e.collectionSlug:`${e.scope}\u0000${e.collectionSlug}`}var dr={type:`function`,name:lr,description:"Display a schema-driven collection inline in the chat as an interactive, editable card. Shows the collection's list of records. Pass `itemId` to open one specific record on mount.",parameters:{type:`object`,properties:{collectionSlug:{type:`string`,description:`The slug of the collection to display (e.g. 'clients', 'invoices', 'contacts').`},itemId:{type:`string`,description:`Optional primary-key value of a single record to open in detail view on mount. Omit to show the full list.`}},required:[`collectionSlug`]},prompt:`After making changes to schema-driven collections, use ${lr} to present either the collection or the item`},fr=e=>typeof e==`string`&&e.trim().length>0?e.trim():void 0,pr=e=>{let t=fr(e?.collectionSlug);if(!t)return null;let n=fr(e.itemId);return{collectionSlug:t,...n?{itemId:n}:{}}},mr=async(e,t)=>{let n=pr(t);if(!n)return{message:`presentCollection error: collectionSlug is required`,instructions:`Tell the user you couldn't display the collection because no collection was specified, and ask which collection they mean.`};let{collectionSlug:r,itemId:i}=n;return{message:`Presented collection ${i?`${r} / ${i}`:r}`,data:n,jsonData:n,instructions:`The collection has been presented to the user as an interactive card. They can browse and open records directly; on a writable collection they can also edit, create, and delete (a read-only dataSource collection shows no edit controls — its records change by editing the backing data file). No further action is needed unless they ask.`}},hr=[{card:`border-indigo-200 bg-indigo-50 text-indigo-600 hover:bg-indigo-100`,dot:`bg-indigo-500`,badge:`bg-indigo-100 text-indigo-700`,border:`border-indigo-200`},{card:`border-sky-200 bg-sky-50 text-sky-600 hover:bg-sky-100`,dot:`bg-sky-500`,badge:`bg-sky-100 text-sky-700`,border:`border-sky-200`},{card:`border-cyan-200 bg-cyan-50 text-cyan-600 hover:bg-cyan-100`,dot:`bg-cyan-500`,badge:`bg-cyan-100 text-cyan-700`,border:`border-cyan-200`},{card:`border-teal-200 bg-teal-50 text-teal-600 hover:bg-teal-100`,dot:`bg-teal-500`,badge:`bg-teal-100 text-teal-700`,border:`border-teal-200`},{card:`border-emerald-200 bg-emerald-50 text-emerald-600 hover:bg-emerald-100`,dot:`bg-emerald-500`,badge:`bg-emerald-100 text-emerald-700`,border:`border-emerald-200`},{card:`border-lime-200 bg-lime-50 text-lime-600 hover:bg-lime-100`,dot:`bg-lime-500`,badge:`bg-lime-100 text-lime-700`,border:`border-lime-200`},{card:`border-violet-200 bg-violet-50 text-violet-600 hover:bg-violet-100`,dot:`bg-violet-500`,badge:`bg-violet-100 text-violet-700`,border:`border-violet-200`},{card:`border-fuchsia-200 bg-fuchsia-50 text-fuchsia-600 hover:bg-fuchsia-100`,dot:`bg-fuchsia-500`,badge:`bg-fuchsia-100 text-fuchsia-700`,border:`border-fuchsia-200`}],gr={card:`border-slate-200 bg-slate-50 text-slate-500 hover:bg-slate-100`,dot:`bg-slate-300`,badge:`bg-slate-100 text-slate-500`,border:`border-slate-200`},_r={card:`border-red-200 bg-red-50 text-red-600 hover:bg-red-100`,dot:`bg-red-500`,badge:`bg-red-100 text-red-700`,border:`border-red-200`},vr={card:`border-amber-200 bg-amber-50 text-amber-600 hover:bg-amber-100`,dot:`bg-amber-500`,badge:`bg-amber-100 text-amber-700`,border:`border-amber-200`};function yr(e){return e<0?gr:hr[e%hr.length]??gr}function br(e,t){let n=ut(t);return n===null||n===``?-1:e?.indexOf(n)??-1}function xr(e,t){let n=e.notifyWhen;return n&&n.field===t?n.in:void 0}function Sr(e,t,n){let r=xr(e,t);if(r){let e=dt(n),t=r.indexOf(e);return t<0?gr:t===0?_r:vr}let i=e.fields[t];return yr(br(i?.type===`enum`?i.values:void 0,n))}function Cr(e,t){let n={},r={},i={},a={};for(let[o,s]of Object.entries(e)){let e=t(o);s.type===`boolean`?(r[o]=e===!0,i[o]=typeof e==`boolean`,a[o]=!1):n[o]=dt(e)}return{text:n,bool:r,boolOriginallyPresent:i,boolTouched:a}}function wr(e){return Cr(e,()=>void 0)}function Tr(e,t){return Cr(t,t=>e[t])}function Er(e,t){return Object.hasOwn(e,t)&&e[t]===!0}function Dr(e,t,n){return Er(e.boolOriginallyPresent,t)||Er(e.boolTouched,t)||!!n.required}function Or(e,t){if(e!==void 0&&e!==``){if(t===`number`||t===`money`){let t=Number(e);return Number.isFinite(t)?t:e}return e}}function kr(e,t){let n={};for(let[r,i]of Object.entries(t)){if(i.type===`boolean`){let t=Er(e.bool,r);(Er(e.boolOriginallyPresent,r)||Er(e.boolTouched,r)||t||i.required)&&(n[r]=t);continue}let t=Or(e.text[r],i.type);t!==void 0&&(n[r]=t)}return n}function Ar(e,t){let n=[];for(let[r,i]of Object.entries(t.fields)){if(ft.has(i.type))continue;if(i.type===`boolean`){Dr(e,r,i)&&n.push([r,Er(e.bool,r)]);continue}if(i.type===`table`&&i.of){let t=i.of;n.push([r,(e.table[r]??[]).map(e=>kr(e,t))]);continue}let t=Or(e.text[r],i.type);t!==void 0&&n.push([r,t])}return Object.fromEntries(n)}function jr(e,t){return e.type===`boolean`?t===!0:t===``?void 0:t}function Mr(e,t,n){if(n===void 0){let{[t]:n,...r}=e;return r}return{...e,[t]:n}}function Nr(e){return e==null||e===``}function Pr(e,t){if(e.type!==`table`||!t)return null;for(let[n,r]of t.entries())for(let[t,i]of Object.entries(e.of))if(i.required&&i.type!==`boolean`&&Nr(r.text[t]))return`${e.label} #${n+1}: ${i.label}`;return null}var Fr=new Set([`boolean`,...ft]);function Ir(e,t,n,r){if(!dn(t,r))return null;if(t.type===`table`&&t.of){let r=n.table[e];return t.required&&(!r||r.length===0)?t.label:Pr(t,r)}return!t.required||n.mode===`create`&&t.primary===!0||Fr.has(t.type)?null:Nr(n.text[e])?t.label:null}function Lr(e,t){let n=Ar(e,t);for(let[r,i]of Object.entries(t.fields)){let t=Ir(r,i,e,n);if(t)return t}return null}function Rr(e){return e.allowSendChat===!0}function zr(e,t,n){return n?`/${e} id=${n} ${t}`:`/${e} ${t}`}function Br(e,t){return{slug:e.slug,title:e.title,icon:e.icon&&e.icon.length>0?e.icon:t,...e.color===void 0?{}:{color:e.color}}}var Vr={empty:!0},Hr=new Set([`markdown`,`table`,`image`,`file`,`embed`,`backlinks`,`rollup`]);function Ur(e){return!Hr.has(e.type)}function Wr(e){return e===null?`asc`:e===`asc`?`desc`:null}function Gr(e){if(e==null||e===``)return Vr;let t=typeof e==`number`?e:Number(e);return Number.isFinite(t)?{empty:!1,num:t}:Vr}function Kr(e){let t=ut(e);return t===null||t.trim()===``?Vr:{empty:!1,str:t}}function qr(e){let t=Pt(e);return t===null?Date.parse(e):new Date(t.year,t.month-1,t.day).getTime()}function Jr(e){let t=ut(e);if(t===null||t===``)return Vr;let n=qr(t);return Number.isNaN(n)?Kr(e):{empty:!1,num:n}}function ree(e,t){let n=ut(t);if(n===null||n===``)return Vr;let r=e?e.indexOf(n):-1;return r<0?Vr:{empty:!1,num:r}}function Yr(e){return{empty:!1,num:+!!e}}function iee(e,t){if(e.num!==void 0&&t.num!==void 0)return e.num-t.num;let n=e.str??String(e.num??``),r=t.str??String(t.num??``);return n.localeCompare(r)}function aee(e,t,n){let r=t===`asc`?1:-1;return e.map((e,t)=>({item:e,index:t,sv:n(e)})).sort((e,t)=>{if(e.sv.empty||t.sv.empty)return e.sv.empty&&t.sv.empty?e.index-t.index:e.sv.empty?1:-1;let n=iee(e.sv,t.sv);return n===0?e.index-t.index:n*r}).map(e=>e.item)}function oee(e,t,n){switch(e.type){case`number`:case`money`:return Gr(t);case`date`:case`datetime`:return Jr(t);case`enum`:return ree(e.values,t);case`boolean`:return Yr(t===!0);case`ref`:return e.to&&typeof t==`string`&&t?Kr(n(e.to,t)):Kr(t);default:return Kr(t)}}function see(e,t,n,r){let i=e.type===`derived`?e.display:void 0;if(i===void 0||i===`number`||i===`money`)return Gr(r.evaluateDerived(e,t,n));let a=r.deriveRecord(n);return i===`date`?Jr(a[t]):Kr(a[t])}function cee(e,t,n,r){return e.type===`toggle`?Yr(r.toggleChecked(n,e)):e.type===`flag`?Yr(r.flagValueOf(t,n)):e.type===`derived`?see(e,t,n,r):oee(e,n[t],r.resolveRefDisplay)}function Xr(e,t){return t===``||Object.values(e).some(e=>{let n=ut(e);return n!==null&&n.toLowerCase().includes(t)})}function Zr(e,t){return`${e}:${t}`}function Qr(e,t){return e?dt(t[e]):``}function $r(e,t){let n=new Set,r=Object.entries(e.fields).filter(([,e])=>e.type===`enum`).map(([e])=>e);if(r.length===0)return n;for(let i of t){let t=dt(i[e.primaryKey]);for(let e of r)(i[e]==null||i[e]===``)&&n.add(Zr(t,e))}return n}var lee=new Set([`string`,`text`,`markdown`,`email`]);function ei(e){if(e.displayField)return e.displayField;for(let[t,n]of Object.entries(e.fields))if(t!==e.primaryKey&&lee.has(n.type))return t;return null}function ti(e,t){return dt(e[t.primaryKey])}function ni(e,t,n){if(n){let t=e[n];if(typeof t==`string`||typeof t==`number`||typeof t==`boolean`){let e=String(t);if(e.length>0)return e}}return ti(e,t)}var ri=e=>e===`ref`||e===`embed`,uee=(e,t,n)=>{let r=e.find(e=>e.kind===`ref`&&e.from===n.to&&e.to===t&&(n.via===void 0||e.field===n.via));r?r.reverseFields=[...r.reverseFields??[],n.field]:e.push({from:n.to,to:t,field:n.field,kind:n.kind})},ii=e=>{let t=[];for(let n of e)for(let e of n.relations)ri(e.kind)&&t.push({from:n.slug,to:e.to,field:e.field,kind:e.kind});for(let n of e)for(let e of n.relations)ri(e.kind)||uee(t,n.slug,e);return t},ai=(e,t)=>{let n=new Set;for(let r of e)t.has(r.from)||n.add(r.from),t.has(r.to)||n.add(r.to);return[...n].sort()},oi=e=>{let t=ii(e),n=new Set(e.map(e=>e.slug)),r=e.map(({slug:e,title:t,icon:n,recordCount:r})=>({slug:e,title:t,icon:n,recordCount:r}));for(let e of ai(t,n))r.push({slug:e,title:e,icon:``,recordCount:0,missing:!0});return{nodes:r,edges:t}};M(),o();var dee=e=>Ge({legacy:!1,locale:`en`,fallbackLocale:`en`,messages:e}),si=e=>{let t={wired:!1};return()=>{t.wired||=(e(),!0)}};function ci(e,t){let n=dee(e),r=f(!0),i=si(()=>{r.run(()=>{oe(()=>{n.global.locale.value=t()})})});return()=>(i(),{t:n.global.t,locale:n.global.locale})}var li=Symbol(`NOT_RESOLVED`);function ui(e,t){return{tagName:e,nodeKind:`scalar`,implicit:t.implicit??!1,matchByTagPrefix:t.matchByTagPrefix??!1,implicitFirstChars:t.implicitFirstChars??null,resolve:t.resolve,identify:t.identify,represent:t.represent??(e=>String(e)),representTagName:t.representTagName??(()=>e)}}function di(e,t){let n=t.finalize===void 0;return{tagName:e,nodeKind:`sequence`,implicit:!1,matchByTagPrefix:t.matchByTagPrefix??!1,create:t.create,addItem:t.addItem,finalize:t.finalize??(e=>e),carrierIsResult:n,identify:t.identify,represent:t.represent??(e=>e),representTagName:t.representTagName??(()=>e)}}function fi(e,t){let n=t.finalize===void 0;return{tagName:e,nodeKind:`mapping`,implicit:!1,matchByTagPrefix:t.matchByTagPrefix??!1,create:t.create,addPair:t.addPair,has:t.has,keys:t.keys,get:t.get,finalize:t.finalize??(e=>e),carrierIsResult:n,identify:t.identify,represent:t.represent??(e=>e),representTagName:t.representTagName??(()=>e)}}var pi=ui(`tag:yaml.org,2002:str`,{resolve:e=>e,identify:e=>typeof e==`string`}),mi=[``,`~`,`null`,`Null`,`NULL`],hi=ui(`tag:yaml.org,2002:null`,{implicit:!0,implicitFirstChars:[``,`~`,`n`,`N`],resolve:e=>mi.indexOf(e)===-1?li:null,identify:e=>e===null,represent:()=>`null`}),fee=ui(`tag:yaml.org,2002:null`,{implicit:!0,implicitFirstChars:[`n`],resolve:(e,t)=>e===`null`||t&&e===``?null:li,identify:e=>e===null,represent:()=>`null`}),gi=[``,`~`,`null`,`Null`,`NULL`],_i=ui(`tag:yaml.org,2002:null`,{implicit:!0,implicitFirstChars:[``,`~`,`n`,`N`],resolve:e=>gi.indexOf(e)===-1?li:null,identify:e=>e===null,represent:()=>`null`}),vi=[`true`,`True`,`TRUE`],yi=[`false`,`False`,`FALSE`],bi=ui(`tag:yaml.org,2002:bool`,{implicit:!0,implicitFirstChars:[`t`,`T`,`f`,`F`],resolve:e=>vi.indexOf(e)!==-1||yi.indexOf(e)===-1&&li,identify:e=>Object.prototype.toString.call(e)===`[object Boolean]`,represent:e=>e?`true`:`false`}),pee=[`true`],xi=[`false`],mee=ui(`tag:yaml.org,2002:bool`,{implicit:!0,implicitFirstChars:[`t`,`f`],resolve:e=>pee.indexOf(e)!==-1||xi.indexOf(e)===-1&&li,identify:e=>Object.prototype.toString.call(e)===`[object Boolean]`,represent:e=>e?`true`:`false`}),hee=[`true`,`True`,`TRUE`,`y`,`Y`,`yes`,`Yes`,`YES`,`on`,`On`,`ON`],gee=[`false`,`False`,`FALSE`,`n`,`N`,`no`,`No`,`NO`,`off`,`Off`,`OFF`],_ee=ui(`tag:yaml.org,2002:bool`,{implicit:!0,implicitFirstChars:[`y`,`Y`,`n`,`N`,`t`,`T`,`f`,`F`,`o`,`O`],resolve:e=>hee.indexOf(e)!==-1||gee.indexOf(e)===-1&&li,identify:e=>Object.prototype.toString.call(e)===`[object Boolean]`,represent:e=>e?`true`:`false`}),vee=RegExp(`^(?:0o[0-7]+|0x[0-9a-fA-F]+|[-+]?[0-9]+)$`),yee=RegExp(`^(?:[-+]?0b[0-1]+|[-+]?0o[0-7]+|[-+]?0x[0-9a-fA-F]+|[-+]?[0-9]+)$`);function Si(e){let t=e,n=1;return(t[0]===`-`||t[0]===`+`)&&(t[0]===`-`&&(n=-1),t=t.slice(1)),t.startsWith(`0b`)?n*parseInt(t.slice(2),2):t.startsWith(`0o`)?n*parseInt(t.slice(2),8):t.startsWith(`0x`)?n*parseInt(t.slice(2),16):n*parseInt(t,10)}function Ci(e,t){if(t){if(!yee.test(e))return li}else if(!vee.test(e))return li;let n=Si(e);return Number.isFinite(n)?n:li}var wi=ui(`tag:yaml.org,2002:int`,{implicit:!0,implicitFirstChars:[`-`,`+`,...`0123456789`],resolve:Ci,identify:e=>Number.isInteger(e)&&!Object.is(e,-0)&&e.toString(10).indexOf(`e`)<0,represent:e=>e.toString(10)}),bee=RegExp(`^-?(?:0|[1-9][0-9]*)$`),Ti=RegExp(`^(?:[-+]?0b[0-1]+|[-+]?0o[0-7]+|[-+]?0x[0-9a-fA-F]+|[-+]?[0-9]+)$`);function xee(e){let t=e,n=1;return(t[0]===`-`||t[0]===`+`)&&(t[0]===`-`&&(n=-1),t=t.slice(1)),t.startsWith(`0b`)?n*parseInt(t.slice(2),2):t.startsWith(`0o`)?n*parseInt(t.slice(2),8):t.startsWith(`0x`)?n*parseInt(t.slice(2),16):n*parseInt(t,10)}function See(e,t){if(t){if(!Ti.test(e))return li}else if(!bee.test(e))return li;let n=xee(e);return Number.isFinite(n)?n:li}var Cee=ui(`tag:yaml.org,2002:int`,{implicit:!0,implicitFirstChars:[`-`,...`0123456789`],resolve:See,identify:e=>Number.isInteger(e)&&!Object.is(e,-0)&&e.toString(10).indexOf(`e`)<0,represent:e=>e.toString(10)}),wee=RegExp(`^(?:[-+]?0b[0-1_]+|[-+]?0[0-7_]+|[-+]?0x[0-9a-fA-F_]+|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+|[-+]?(?:0|[1-9][0-9_]*))$`);function Tee(e){let t=e.replace(/_/g,``),n=1;if((t[0]===`-`||t[0]===`+`)&&(t[0]===`-`&&(n=-1),t=t.slice(1)),t.startsWith(`0b`))return n*parseInt(t.slice(2),2);if(t.startsWith(`0x`))return n*parseInt(t.slice(2),16);if(t.includes(`:`)){let e=0;for(let n of t.split(`:`))e=e*60+Number(n);return n*e}return t!==`0`&&t[0]===`0`?n*parseInt(t,8):n*parseInt(t,10)}function Eee(e){if(!wee.test(e))return li;let t=Tee(e);return Number.isFinite(t)?t:li}var Ei=ui(`tag:yaml.org,2002:int`,{implicit:!0,implicitFirstChars:[`-`,`+`,...`0123456789`],resolve:Eee,identify:e=>Number.isInteger(e)&&!Object.is(e,-0)&&e.toString(10).indexOf(`e`)<0,represent:e=>e.toString(10)}),Dee=RegExp(`^(?:[-+]?[0-9]+(?:\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?|[-+]?\\.[0-9]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$`),Oee=RegExp(`^(?:[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$`);function kee(e){if(!Dee.test(e))return li;let t=e.toLowerCase(),n=t[0]===`-`?-1:1;if(`+-`.includes(t[0])&&(t=t.slice(1)),t===`.inf`)return n===1?1/0:-1/0;if(t===`.nan`)return NaN;let r=n*parseFloat(t);return Number.isFinite(r)||Oee.test(e)?r:li}function Aee(e){if(isNaN(e))return`.nan`;if(e===1/0)return`.inf`;if(e===-1/0)return`-.inf`;if(Object.is(e,-0))return`-0.0`;let t=e.toString(10);return/^[-+]?[0-9]+e/.test(t)?t.replace(`e`,`.e`):t}var jee=ui(`tag:yaml.org,2002:float`,{implicit:!0,implicitFirstChars:[`-`,`+`,`.`,...`0123456789`],resolve:kee,identify:e=>typeof e==`number`&&(!Number.isInteger(e)||Object.is(e,-0)||e.toString(10).indexOf(`e`)>=0),represent:Aee}),Mee=RegExp(`^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$`),Nee=RegExp(`^(?:[-+]?[0-9]+(?:\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?|[-+]?\\.[0-9]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$`);function Pee(e,t){if(t){if(!Nee.test(e))return li;let t=e.toLowerCase(),n=t[0]===`-`?-1:1;if(`+-`.includes(t[0])&&(t=t.slice(1)),t===`.inf`)return n===1?1/0:-1/0;if(t===`.nan`)return NaN;let r=n*parseFloat(t);return Number.isFinite(r)?r:li}if(!Mee.test(e))return li;let n=Number(e);return Number.isFinite(n)?n:li}function Fee(e){if(isNaN(e))return`.nan`;if(e===1/0)return`.inf`;if(e===-1/0)return`-.inf`;if(Object.is(e,-0))return`-0.0`;let t=e.toString(10);return/^[-+]?[0-9]+e/.test(t)?t.replace(`e`,`.e`):t}var Iee=ui(`tag:yaml.org,2002:float`,{implicit:!0,implicitFirstChars:[`-`,...`0123456789`],resolve:Pee,identify:e=>typeof e==`number`&&(!Number.isInteger(e)||Object.is(e,-0)||e.toString(10).indexOf(`e`)>=0),represent:Fee}),Lee=RegExp(`^(?:[-+]?(?:(?:[0-9][0-9_]*)?\\.[0-9_]*)(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$`),Ree=RegExp(`^(?:[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$`);function zee(e){if(!Lee.test(e))return li;let t=e.toLowerCase().replace(/_/g,``),n=t[0]===`-`?-1:1;if(`+-`.includes(t[0])&&(t=t.slice(1)),t===`.inf`)return n===1?1/0:-1/0;if(t===`.nan`)return NaN;let r=0;if(t.includes(`:`)){for(let e of t.split(`:`))r=r*60+Number(e);r*=n}else r=n*parseFloat(t);return Number.isFinite(r)||Ree.test(e)?r:li}function Bee(e){if(isNaN(e))return`.nan`;if(e===1/0)return`.inf`;if(e===-1/0)return`-.inf`;if(Object.is(e,-0))return`-0.0`;let t=e.toString(10);return/^[-+]?[0-9]+e/.test(t)?t.replace(`e`,`.e`):t}var Di=ui(`tag:yaml.org,2002:float`,{implicit:!0,implicitFirstChars:[`-`,`+`,`.`,...`0123456789`],resolve:zee,identify:e=>typeof e==`number`&&(!Number.isInteger(e)||Object.is(e,-0)||e.toString(10).indexOf(`e`)>=0),represent:Bee}),Vee=ui(`tag:yaml.org,2002:merge`,{implicit:!0,implicitFirstChars:[`<`],resolve:(e,t)=>e===`<<`||t&&e===``?`<<`:li,identify:()=>!1}),Hee=/^[A-Za-z0-9+/]*={0,2}$/;function Uee(e){let t=e.replace(/\s/g,``);if(t.length%4!=0||!Hee.test(t))return li;let n=atob(t),r=new Uint8Array(n.length);for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);return r}function Wee(e){let t=``;for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return btoa(t)}var Gee=ui(`tag:yaml.org,2002:binary`,{resolve:Uee,identify:e=>Object.prototype.toString.call(e)===`[object Uint8Array]`,represent:Wee}),Kee=RegExp(`^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$`),qee=RegExp(`^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$`);function Jee(e,t,n,r=0,i=0,a=0,o=0){let s=new Date(Date.UTC(e,t,n,r,i,a,o));return s.setUTCFullYear(e,t,n),s}function Yee(e){let t=Kee.exec(e);if(t===null&&(t=qee.exec(e)),t===null)return li;let n=+t[1],r=t[2]-1,i=+t[3];if(!t[4]){let e=Jee(n,r,i);return e.getUTCFullYear()!==n||e.getUTCMonth()!==r||e.getUTCDate()!==i?li:e}let a=+t[4],o=+t[5],s=+t[6],c=0;if(a>23||o>59||s>59)return li;if(t[7]){let e=t[7].slice(0,3);for(;e.length<3;)e+=`0`;c=+e}let l=Jee(n,r,i,a,o,s,c);if(l.getUTCFullYear()!==n||l.getUTCMonth()!==r||l.getUTCDate()!==i)return li;if(t[9]){let e=+t[10],n=+(t[11]||0);if(e>23||n>59)return li;let r=(e*60+n)*6e4;l.setTime(l.getTime()-(t[9]===`-`?-r:r))}return l}var Xee=ui(`tag:yaml.org,2002:timestamp`,{implicit:!0,implicitFirstChars:[...`0123456789`],resolve:Yee,identify:e=>e instanceof Date,represent:e=>e.toISOString()}),Zee=di(`tag:yaml.org,2002:seq`,{create:()=>[],addItem:(e,t)=>{e.push(t)},identify:Array.isArray});function Oi(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}function ki(e,t){let n={};for(let r of t)e[r]!==void 0&&(n[r]=e[r]);return n}var Qee=di(`tag:yaml.org,2002:omap`,{create:()=>({list:[],seen:new Set}),addItem:(e,t)=>{let n;if(t instanceof Map){if(t.size!==1)return`cannot resolve an ordered map item`;n=t.keys().next().value}else if(Oi(t)){let e=Object.keys(t);if(e.length!==1)return`cannot resolve an ordered map item`;n=e[0]}else return`cannot resolve an ordered map item`;return e.seen.has(n)?`duplicate key in ordered map`:(e.seen.add(n),e.list.push(t),``)},finalize:e=>e.list,identify:()=>!1}),$ee=di(`tag:yaml.org,2002:pairs`,{create:()=>[],addItem:(e,t)=>{if(t instanceof Map)return t.size===1?(e.push(t.entries().next().value),``):`cannot resolve a pairs item`;if(Object.prototype.toString.call(t)!==`[object Object]`)return`cannot resolve a pairs item`;let n=t,r=Object.keys(n);return r.length===1?(e.push([r[0],n[r[0]]]),``):`cannot resolve a pairs item`},identify:()=>!1}),ete=fi(`tag:yaml.org,2002:map`,{create:()=>({}),identify:Oi,represent:e=>{let t=new Map;for(let n of Object.keys(e))t.set(n,e[n]);return t},addPair:(e,t,n)=>{if(typeof t==`object`&&t)return`object-based map does not support complex keys`;let r=String(t);return r===`__proto__`?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n,``},has:(e,t)=>typeof t==`object`&&t?!1:Object.prototype.hasOwnProperty.call(e,String(t)),keys:e=>Object.keys(e),get:(e,t)=>{let n=String(t);return Object.prototype.hasOwnProperty.call(e,n)?e[n]:null}}),tte=fi(`tag:yaml.org,2002:set`,{create:()=>new Set,identify:e=>e instanceof Set,represent:e=>{let t=new Map;for(let n of e)t.set(n,null);return t},addPair:(e,t,n)=>n===null?(e.add(t),``):`cannot resolve a set item`,has:(e,t)=>e.has(t),keys:e=>e.keys(),get:()=>null});function nte(){return{scalar:Object.create(null),sequence:Object.create(null),mapping:Object.create(null)}}function rte(){return{scalar:[],sequence:[],mapping:[]}}function ite(e){let t=[];for(let n of e){let e=t.length;for(let r=0;r<t.length;r++){let i=t[r];if(i.nodeKind===n.nodeKind&&i.tagName===n.tagName&&i.matchByTagPrefix===n.matchByTagPrefix){e=r;break}}t[e]=n}return t}var Ai=class e{tags;implicitScalarTags;implicitScalarByFirstChar;implicitScalarAnyFirstChar;defaultScalarTag;defaultSequenceTag;defaultMappingTag;exact;prefix;constructor(e){let t=ite(e),n=[],r=nte(),i=rte();for(let e of t){if(e.nodeKind===`scalar`&&e.implicit){if(e.matchByTagPrefix)throw Error(`Implicit scalar tags cannot match by tag prefix`);n.push(e)}switch(e.nodeKind){case`scalar`:e.matchByTagPrefix?i.scalar.push(e):r.scalar[e.tagName]=e;break;case`sequence`:e.matchByTagPrefix?i.sequence.push(e):r.sequence[e.tagName]=e;break;case`mapping`:e.matchByTagPrefix?i.mapping.push(e):r.mapping[e.tagName]=e}}let a=n.filter(e=>e.implicitFirstChars===null),o=new Set;for(let e of n)if(e.implicitFirstChars!==null)for(let t of e.implicitFirstChars)o.add(t);let s=new Map;for(let e of o)s.set(e,n.filter(t=>t.implicitFirstChars===null||t.implicitFirstChars.indexOf(e)!==-1));let c=r.scalar[`tag:yaml.org,2002:str`];if(!c)throw Error(`schema does not define the default scalar tag (tag:yaml.org,2002:str)`);this.tags=t,this.implicitScalarTags=n,this.implicitScalarByFirstChar=s,this.implicitScalarAnyFirstChar=a,this.defaultScalarTag=c,this.defaultSequenceTag=r.sequence[`tag:yaml.org,2002:seq`],this.defaultMappingTag=r.mapping[`tag:yaml.org,2002:map`],this.exact=r,this.prefix=i}lookupScalarTag(e){let t=this.exact.scalar[e];if(t)return t;for(let t of this.prefix.scalar)if(e.startsWith(t.tagName))return t}lookupSequenceTag(e){let t=this.exact.sequence[e];if(t)return t;for(let t of this.prefix.sequence)if(e.startsWith(t.tagName))return t}lookupMappingTag(e){let t=this.exact.mapping[e];if(t)return t;for(let t of this.prefix.mapping)if(e.startsWith(t.tagName))return t}resolveImplicitScalarTag(e){let t=this.implicitScalarByFirstChar.get(e.charAt(0))??this.implicitScalarAnyFirstChar;for(let n of t){let t=n.resolve(e,!1,n.tagName);if(t!==li)return{value:t,tag:n}}let n=this.defaultScalarTag;return{value:n.resolve(e,!1,n.tagName),tag:n}}withTags(...t){let n=[];for(let e of t)n=n.concat(e);return new e([...this.tags,...n])}},ji=new Ai([pi,Zee,ete]);new Ai([...ji.tags,fee,mee,Cee,Iee]);var ate=new Ai([...ji.tags,hi,bi,wi,jee]),ote=new Ai([...ji.tags,_i,_ee,Ei,Di,Xee,Vee,Gee,Qee,$ee,tte]).withTags({...Ei,resolve:(e,t,n)=>{let r=Ei.resolve(e,t,n);return r===li?wi.resolve(e,t,n):r}},{...Di,resolve:(e,t,n)=>{let r=Di.resolve(e,t,n);return r===li?jee.resolve(e,t,n):r}});fi(`tag:yaml.org,2002:map`,{create:()=>new Map,addPair:(e,t,n)=>(e.set(t,n),``),has:(e,t)=>e.has(t),keys:e=>e.keys(),get:(e,t)=>e.get(t),identify:e=>e instanceof Map||Oi(e),represent:e=>{if(e instanceof Map)return e;let t=new Map,n=e;for(let e of Object.keys(n))t.set(e,n[e]);return t}});function ste(e){if(Array.isArray(e)){let t=Array.prototype.slice.call(e);for(let e=0;e<t.length;e++){if(Array.isArray(t[e]))return null;typeof t[e]==`object`&&Object.prototype.toString.call(t[e])===`[object Object]`&&(t[e]=`[object Object]`)}return String(t)}return typeof e==`object`&&Object.prototype.toString.call(e)===`[object Object]`?`[object Object]`:String(e)}fi(`tag:yaml.org,2002:map`,{create:()=>({}),identify:Oi,represent:e=>{let t=new Map;for(let n of Object.keys(e))t.set(n,e[n]);return t},addPair:(e,t,n)=>{let r=ste(t);return r===null?`nested arrays are not supported inside keys`:(r===`__proto__`?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n,``)},has:(e,t)=>{let n=ste(t);return n!==null&&Object.prototype.hasOwnProperty.call(e,n)},keys:e=>Object.keys(e),get:(e,t)=>{let n=String(t);return Object.prototype.hasOwnProperty.call(e,n)?e[n]:null}});var cte={maxLength:79,indent:1,linesBefore:3,linesAfter:2};function Mi(e,t,n,r,i){let a=``,o=``,s=Math.floor(i/2)-1;return r-t>s&&(a=` ... `,t=r-s+a.length),n-r>s&&(o=` ...`,n=r+s-o.length),{str:a+e.slice(t,n).replace(/\t/g,`→`)+o,pos:r-t+a.length}}function Ni(e,t){return` `.repeat(Math.max(t-e.length,0))+e}function lte(e,t){if(!e.buffer)return null;let n={...cte,...t},r=/\r?\n|\r|\0/g,i=[0],a=[],o,s=-1;for(;o=r.exec(e.buffer);)a.push(o.index),i.push(o.index+o[0].length),e.position<=o.index&&s<0&&(s=i.length-2);s<0&&(s=i.length-1);let c=``,l=Math.min(e.line+n.linesAfter,a.length).toString().length,u=n.maxLength-(n.indent+l+3);for(let t=1;t<=n.linesBefore&&!(s-t<0);t++){let r=Mi(e.buffer,i[s-t],a[s-t],e.position-(i[s]-i[s-t]),u);c=`${` `.repeat(n.indent)}${Ni((e.line-t+1).toString(),l)} | ${r.str}\n${c}`}let d=Mi(e.buffer,i[s],a[s],e.position,u);c+=`${` `.repeat(n.indent)}${Ni((e.line+1).toString(),l)} | ${d.str}\n`,c+=`${`-`.repeat(n.indent+l+3+d.pos)}^\n`;for(let t=1;t<=n.linesAfter&&!(s+t>=a.length);t++){let r=Mi(e.buffer,i[s+t],a[s+t],e.position-(i[s]-i[s+t]),u);c+=`${` `.repeat(n.indent)}${Ni((e.line+t+1).toString(),l)} | ${r.str}\n`}return c.replace(/\n$/,``)}function ute(e,t){let n=``;return e.mark?(e.mark.name&&(n+=`in "${e.mark.name}" `),n+=`(${e.mark.line+1}:${e.mark.column+1})`,!t&&e.mark.snippet&&(n+=`\n\n${e.mark.snippet}`),`${e.reason} ${n}`):e.reason}var Pi=class e extends Error{reason;mark;constructor(e,t){super(),this.name=`YAMLException`,this.reason=e,this.mark=t,this.message=ute(this,!1),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}toString(e){return`${this.name}: ${ute(this,e)}`}static throwAt(t,n,r,i=``){let a=0,o=0;for(let e=0;e<n;e++){let n=t.charCodeAt(e);n===10?(a++,o=e+1):n===13&&(a++,t.charCodeAt(e+1)===10&&e++,o=e+1)}let s={name:i,buffer:t,position:n,line:a,column:n-o};throw s.snippet=lte(s),new e(r,s)}},Fi={DOCUMENT:1,SEQUENCE:2,MAPPING:3,SCALAR:4,ALIAS:5,POP:6},Ii={PLAIN:1,SINGLE_QUOTED:2,DOUBLE_QUOTED:3,LITERAL_BLOCK:4,FOLDED_BLOCK:5},Li={BLOCK:1,FLOW:2},Ri={CLIP:1,STRIP:2,KEEP:3},dte=-1;function fte(e){switch(e){case 48:return`\0`;case 97:return`\x07`;case 98:return`\b`;case 116:return` `;case 9:return` `;case 110:return`
|
|
4
4
|
`;case 118:return`\v`;case 102:return`\f`;case 114:return`\r`;case 101:return`\x1B`;case 32:return` `;case 34:return`"`;case 47:return`/`;case 92:return`\\`;case 78:return`
`;case 95:return`\xA0`;case 76:return`\u2028`;case 80:return`\u2029`;default:return``}}var pte=Array(256),mte=Array(256);for(let e=0;e<256;e++)pte[e]=+!!fte(e),mte[e]=fte(e);function hte(e){return e<=65535?String.fromCharCode(e):String.fromCharCode((e-65536>>10)+55296,(e-65536&1023)+56320)}function gte(e){return e>=48&&e<=57?e-48:(e|32)-97+10}function _te(e){return e===120?2:e===117?4:8}function zi(e,t,n){let r=0;for(;t<n;){let n=e.charCodeAt(t);if(n===10)r++,t++;else if(n===13)r++,t++,e.charCodeAt(t)===10&&t++;else if(n===32||n===9)t++;else break}return{position:t,breaks:r}}function Bi(e){return e===1?` `:`
|
|
@@ -217,49 +217,49 @@ When asked to create a story:
|
|
|
217
217
|
|
|
218
218
|
{preview}
|
|
219
219
|
|
|
220
|
-
This cannot be undone.`},notificationBell:{notifications:`Notifications`,activeSection:`Active`,historySection:`History`,noActive:`No active notifications`,noHistory:`No recent activity`,clearAll:`Clear`,dismiss:`Dismiss`,cancel:`Cancel`,showMore:`Show more ({count})`,showLess:`Show less`,openTarget:`Open`,expandDetails:`Expand details`},pluginDiagnostics:{title:`Plugin configuration issue`,hostBody:`Plugin "{plugin}" tried to register the {label} key "{key}" but it is reserved by the host. The plugin's entry has been dropped.`,intraBody:`Plugins "{first}" and "{second}" both register {dimension} "{key}". "{first}" claimed it first, so "{second}"'s registration is ignored.`},shadowedEnv:{title:`Shell env is overriding .env`,body:`Set in both your shell and .env: {keys}. The shell value wins, so .env is ignored. If you edited .env, update or unset the shell value and restart.`},optionalDeps:{title:`Optional dependency unavailable`,titleNotFound:`{command} not installed`,titleNotResponding:`{command} not running`,notFound:`{command} not found — related features are disabled. Install {command} and restart MulmoClaude to enable them.`,notResponding:`{command} is installed but not running — related features are disabled. Start {command} and restart MulmoClaude to enable them.`},billingMigration:{title:`Invoicing moved to on-demand setup`,body:`The bundled clients, worklog, invoice, and profile collections were removed from your dashboard, but your data is safe and untouched. Ask to set up client & time tracking, then invoicing, to recreate them — your existing records will reappear.`},backendOffline:{title:`Can't reach the backend`,body:`The MulmoClaude server may not be running. Check the dev server, then retry.`,retry:`Retry`},pluginErrorBoundary:{title:`Plugin {pkg} crashed`,subtitle:`The plugin failed to render. The error has been logged to the console.`,showDetails:`Show details`,hideDetails:`Hide details`,retry:`Retry`},remoteHostOffline:{title:`Remote host disconnected`,body:`Your phone can't send to this device until you reconnect.`,reconnect:`Reconnect`},authTokenStale:{title:`This page needs a reload`,body:`The server refused this page's token and a new one could not be fetched. Reload to continue.`,reload:`Reload`},remoteHost:{title:`Remote host`,online:`Remote host online`,offline:`Remote host offline`,uid:`uid {uid}`,signIn:`Sign in with Google`,connecting:`Connecting…`,disconnect:`Disconnect`,disconnecting:`Disconnecting…`,noToken:`Google sign-in returned no idToken`,connectFailed:`Connect failed`,disconnectFailed:`Disconnect failed`,signInFailed:`Google sign-in failed`,statusFailed:`Failed to load status`,description:`Remote access lets a mobile device connect to this MulmoClaude's collections and feeds.`,howTo:`On your phone, open {url} and sign in with the same Google account.`,customViewHint:`For a mobile-friendly view, ask Claude to build a {keyword} (not a regular custom view).`,qrHint:`Or scan this QR code with your phone's camera.`},sessionModelChip:{tooltip:`Model this session is running on: {model}`,tooltipOverride:`Model for this chat: {model} (overriding the role / app-wide choice)`,ariaLabel:`Model for this chat`,clear:`Back to the default`,unknown:`unknown`,inherited:`{model} (inherited)`},sidebarHeader:{newMessages:`New messages`,home:`Go to latest chat`,toolCallHistory:`Tool call history`,settings:`Settings`,settingsGeminiMissing:`Settings — Gemini API key missing`,todayJournal:`Today's journal`,todayJournalNotFound:`No journal summary yet — chat for a while and the journal will generate one.`,todayJournalLoadFailed:`Failed to load journal (status {status}): {error}`,copyMarkdown:`Copy chat as Markdown`,copiedMarkdown:`Copied!`},rightSidebar:{permalink:`Selected message permalink`,copyPermalink:`Copy permalink to selected message`,copiedPermalink:`Copied!`,toggleSystemPrompt:`Toggle system prompt`,systemPrompt:`System Prompt`,availableTools:`Available Tools`,toggleToolDescription:`Toggle tool description`,toolCallHistory:`Tool Call History`,copyHistory:`Copy tool call history`,copiedHistory:`Copied!`,noToolCalls:`No tool calls yet`,arguments:`Arguments`,error:`Error`,result:`Result`,running:`Running...`,mcpHint:{title:e=>`${e.named(`server`)} setup hint`,requiredKeys:`Required keys`,setupGuide:`Open setup guide`}},fileTreePane:{sort:`Sort:`,sortByName:`Sort by name`,name:`Name`,sortByRecent:`Sort by modified date (newest first)`,recent:`Recent`,reference:`Reference`,readOnlyBadge:`RO`,showSystemFiles:`Show system files`,showSystemFilesTitle:`Show agent-internal top-level dirs (conversations/, feeds/, etc.) in addition to your user content (data/, artifacts/, config/).`},fileTree:{dropHint:`Drop files here to save them in this folder`,upload:{progress:`Uploading {done} of {total}…`,done:`Saved {count} file(s)`,failed:`{count} file(s) couldn't be saved`},workspace:`(workspace)`,recentlyChanged:`Recently changed`,newFileMenuItem:`New file`,newFileInputAria:`New file name`,newFilePlaceholder:{wikiPage:`page-slug`,summary:`summary-name`,document:`document-name`,html:`page-name`,story:`story-name`},newFileError:{empty:`Filename can't be empty.`,unsafe:`Filename contains invalid characters.`,exists:`A file named {filename} already exists here.`,saveFailed:`Couldn't create the file. Please try again.`}},lockStatusPopup:{sandboxEnabledTooltip:`Sandbox enabled (Docker)`,noSandboxTooltip:`No sandbox (Docker not found)`,sandboxEnabledLabel:`Sandbox enabled:`,sandboxEnabledBody:`Docker is running. Filesystem access is isolated.`,noSandboxLabel:`No sandbox:`,noSandboxBodyPrefix:`Claude can access all files on your machine. Install`,noSandboxBodySuffix:`to enable filesystem isolation.`,dockerDesktop:`Docker Desktop`,hostCredentials:`Host credentials attached:`,credsLoading:`loading…`,sshAgent:`SSH agent:`,forwarded:`forwarded`,notForwarded:`not forwarded`,mountedConfigs:`Mounted configs:`,none:`none`,testIsolation:`Test sandbox isolation:`},settingsModal:{title:`Settings`,version:`MulmoClaude v{version}`,tabs:{gemini:`Gemini API Key`,tools:`Allowed Tools`,mcp:`MCP Servers`,dirs:`Directories`,refs:`Reference Dirs`,map:`Map`,photos:`Photos`,google:`Google`,model:`Model`,voice:`Voice`,chatIndex:`Chat index`,journal:`Journal`,notifications:`Web Push`,skills:`Skills`,roles:`Roles`,quit:`Quit`},groups:{llm:`LLM`,servers:`Servers`,workspace:`Workspace`,notifications:`Notifications`,plugins:`Plugins`,management:`Management`,server:`Server`},navAriaLabel:`Settings sections`,googleTab:{description:`Link your Google account so this machine can call Google APIs (Calendar first). The refresh token is stored only on this machine and is never sent to any server other than Google.`,statusLinked:`Linked`,statusNotLinked:`Not linked`,statusPending:`Waiting for the browser consent to finish…`,connect:`Link Google account`,unlink:`Unlink`,unlinkConfirm:`Unlink the Google account? The saved token is revoked and deleted from this machine.`,clientSecretAmbiguous:`Multiple client_secret_*.json files were found in ~/.secrets/. Keep exactly one so the stored token stays paired with the right OAuth client.`,loadError:`Failed to load the Google link status.`,connectError:`Failed to start the Google authorization flow.`,unlinkError:`Failed to unlink the Google account.`},geminiTab:{required:`Image generation needs {envKey}. Paste the key below and save it.`,apiKeyLabel:`Gemini API key`,apiKeyPlaceholder:`AIza…`,helperText:`Create or copy a key from {studioLink}.`,storageNote:`Stored on this machine only, outside the workspace, readable by you alone. It takes effect right away — no restart.`,storedHere:`Saved in the app`,storedInEnvironment:`Coming from the environment`,notConfigured:`Not configured`,clear:`Clear`,fromEnvironment:`This key comes from the shell that started the app, or from {envFile}. A key saved here takes precedence.`,loadError:`Failed to load the key status`,saveError:`Failed to save the key`,clearError:`Failed to clear the key`},mapTab:{description:`Set the Google Maps API key used by the map plugin. The key is stored locally and never transmitted anywhere except to Google Maps.`,apiKeyLabel:`Google Maps API key`,apiKeyPlaceholder:`AIza…`,helperText:`Create or copy a key from {consoleLink}.`,requiredApis:`Enable: Maps JavaScript API, Geocoding API, Places API (New), Directions API.`,configured:`Configured`,notConfigured:`Not configured`,clear:`Clear`,loadError:`Failed to load settings`,saveError:`Failed to save`},photosTab:{description:`Privacy controls for photos uploaded via chat or a connected bridge. EXIF location data is sensitive — uncheck the box to opt out of automatic capture.`,autoCaptureLabel:`Auto-capture photo location data`,autoCaptureHint:`When on, every uploaded image with EXIF GPS gets a location sidecar at data/locations/. Off: nothing is captured automatically; the LLM can still extract EXIF on demand.`,statusOn:`Auto-capture is ON`,statusOff:`Auto-capture is OFF`,loadError:`Failed to load settings`,saveError:`Failed to save`},quitTab:{description:`Stop the MulmoClaude server running on this machine. Started from the icon, it keeps running after you close this tab — this is how you stop it without a terminal.`,restartHint:()=>"To start it again, double-click the MulmoClaude icon (or run `npx mulmoclaude@latest`).",quitLabel:`Quit MulmoClaude`,confirmBody:`The server stops and this page stops working. Anything still running is interrupted.`,confirmLabel:`Quit`,stopping:`Stopping…`,stoppedTitle:`MulmoClaude has stopped`,stoppedBody:`You can close this tab. Double-click the icon to start it again.`,error:`Failed to stop the server`},notificationsTab:{description:`Get a push on your registered devices when a task you started here finishes — handy when you ask something, step away, and want to know the moment the answer is ready.`,enableLabel:`Send a Web Push when a task finishes`,enableHint:`Fires when a chat you started here completes. Scheduled and background tasks don't trigger it.`,remoteHostNote:`Requires the RemoteHost connection (it supplies the sign-in) and at least one registered device. With either missing, this does nothing.`,macosRemindersLabel:`Create a macOS Reminder when a task finishes`,macosRemindersHint:`Adds the finished task to your default Reminders list. iCloud sync then mirrors it to your iPhone, which is what delivers the notification.`,macosRemindersForcedOff:`Turned off at startup by --disable-macos-reminders or DISABLE_MACOS_REMINDER_NOTIFICATIONS. Remove the flag or unset the variable, then restart, to control it from here.`,statusOn:`Web Push is ON`,statusOff:`Web Push is OFF`,loadError:`Failed to load settings`,saveError:`Failed to save`},modelTab:{description:`Choose the model and the reasoning effort Claude Code uses for each turn. Leave either unset to keep Claude's own resolution.`,modelLabel:`Model`,modelUnset:`(unset — follow ~/.claude/settings.json)`,modelHelperText:`Unset means the model comes from ~/.claude/settings.json, which other Claude Code clients (VS Code, Cursor) also write their /model pick to — so a switch made there changes MulmoClaude too. Aliases follow the latest generation of each family.`,modelConfigured:`Model: {model}`,modelNotConfigured:`Not set (shared)`,effortLabel:`Reasoning effort`,effortUnset:`(unset — use Claude's default)`,helperText:`Higher levels allow more thinking time but increase latency and token usage.`,configured:`Effort: {level}`,notConfigured:`Not set`,userSettingsLabel:`Load Claude Code's user settings and plugins`,userSettingsHint:`Reads skills, plugins and hooks from ~/.claude, the same ones Claude Code uses. Turn this off if your installed plugins carry so many skills that every request gets heavy; the workspace's own skills keep working. Takes effect from the next message. When off, an unset model no longer follows ~/.claude/settings.json either.`,skillListingSummary:`Skills listed on the last turn: {count}.`,skillListingPlugins:`From plugins: {plugins}.`,skillListingHeavy:`That many skills make every request heavy; turning this off drops the ones from ~/.claude.`,loadError:`Failed to load settings`,saveError:`Failed to save`},voiceTab:{description:`Dictate chat messages with your voice. Audio is transcribed locally on the machine running MulmoClaude — nothing is sent to any external service.`,requirements:`Available on macOS only. It requires the whisper.cpp server — build it with yarn build:whisper (see the README, Local Voice Input section).`,unsupported:`Voice input requires macOS with the whisper.cpp server installed. It is not available on this machine.`,enableLabel:`Enable voice input`,enableHint:`Turning this on downloads the speech model (1–3 GB) once. A mic button then appears in the chat input.`,modelLabel:`Speech model`,downloading:`Downloading model… {percent}%`,ready:`Model ready`,downloadError:`Model download failed.`,retry:`Retry`,loadError:`Failed to load settings`,saveError:`Failed to save`},chatIndexTab:{description:`Background AI titles + summaries for your chat history. Off by default — automation sessions (scheduler / system workers) are always skipped even when on, and human sessions only pay one summarizer call each when a turn ends.`,modeLabel:`Chat index model`,helperText:`Haiku is cheaper; Sonnet gives sharper titles for long, topic-shifting sessions.`,mode:{off:`Off`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Indexing is OFF`,haiku:`Indexing with Haiku`,sonnet:`Indexing with Sonnet`},loadError:`Failed to load settings`,saveError:`Failed to save`},journalTab:{description:`Automated daily journal — summarises recent chat sessions into journal/*.md and extracts durable memory notes. Off by default. Automation sessions (scheduler / system workers) are always excluded regardless of this setting.`,modeLabel:`Journal model`,helperText:`Haiku is cheaper; Sonnet produces richer daily / topic summaries. The hourly pass runs only when this is set.`,mode:{off:`Off`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Journal is OFF`,haiku:`Journal running with Haiku`,sonnet:`Journal running with Sonnet`},loadError:`Failed to load settings`,saveError:`Failed to save`},geminiAskButton:`Ask Claude`,geminiAskMessage:`What is the role of the Gemini API key in this app?`,toolNamesLabel:`Tool names`,invalidToolNamesPrefix:`These look non-standard (expected prefix`,invalidToolNamesSuffix:`):`,mcpToolsError:`⚠ Could not fetch MCP tool status: {error}. Showing all tools regardless of enablement.`,changesHint:`Changes apply on the next message. No restart needed.`,cannotSaveTooltip:`Cannot save until settings load successfully`,saving:`Saving…`,loadingLabel:`Loading…`,unsavedMarker:`●`,unsavedToolsConfirm:`Allowed Tools has unsaved changes. Close anyway?`,unsavedMcpDraftConfirm:`An MCP server draft is still open. Close anyway?`,mcpSaveFailed:`Failed to save MCP server changes.`},canvasViewToggle:{stackViewTooltip:`Stack view · click to switch to Single`,singleViewTooltip:`Single view · click to switch to Stack`,switchToSingle:`Switch to Single view`,switchToStack:`Switch to Stack view`},sessionHistoryToggle:{showTooltip:`Show session history panel on the left`,hideTooltip:`Hide session history panel`,show:`Show session history`,hide:`Hide session history`},sessionHistoryExpand:{expandTooltip:`Expand session history panel to full width`,collapseTooltip:`Collapse session history panel`,expand:`Expand session history`,collapse:`Collapse session history`},settingsWorkspaceDirs:{explanation:`Custom directories for organizing files under {dataDir} and {artifactsDir}. Claude uses these to route file saves.`,noEntries:`No custom directories configured.`,addDirTitle:`Add directory`,pathPlaceholder:`data/clients or artifacts/reports`,descPlaceholder:`Description (what goes in this folder)`,errPathRequired:`Path required`,errMustStartWith:`Must start with data/ or artifacts/`,errAlreadyExists:`Already exists`},settingsReferenceDirs:{explanation:`External directories Claude can read but not modify. In Docker mode, these are mounted read-only. Useful for referencing Obsidian vaults, project code, or document folders.`,noEntries:`No reference directories configured.`,addDirTitle:`Add reference directory`,pathPlaceholder:`/Users/me/ObsidianVault or ~/Documents/notes`,labelPlaceholder:`Label (optional — defaults to folder name)`,readOnlyBadge:`read-only`,errPathRequired:`Path required`,errMustBeAbsolute:`Must be an absolute path or start with ~/`,errAlreadyExists:`Already exists`,errLabelConflict:`Label "{label}" already exists`},dashboard:{empty:`No favorite collections yet.`,emptyHint:`Pin a collection (★) to see it here.`,viewTable:`Table`,viewCalendar:`Calendar`,viewKanban:`Kanban`,viewPickerLabel:`Choose view`,openFull:`Double-click to open full view`,dragHint:`Drag to reorder`,resizeHint:`Drag to resize`},pluginLauncher:{chat:{label:`Chat`},dashboard:{label:`Dashboard`},automations:{label:`Actions`},wiki:{label:`Wiki`},collections:{label:`Collections`},feeds:{label:`Feeds`},accounting:{label:`Accounting`},files:{label:`Files`}},shortcuts:{pin:`Pin to launcher`,unpin:`Unpin from launcher`,zoneAriaLabel:`Pinned shortcuts`,reorder:{open:`Reorder shortcuts`,title:`Reorder`,moveUp:`Move up`,moveDown:`Move down`}},fileContentHeader:{showRendered:`Show rendered Markdown`,showRaw:`Show raw source`,rendered:`Rendered`,raw:`Raw`,closeFile:`Close file`,revealInOs:`Show in folder`,revealInOsFailed:`Failed to show in folder`},fileContentRenderer:{download:`ZIP`,downloadZip:`Download as a self-contained zip (assets bundled)`,downloadError:`Download failed`,selectFile:`Select a file`,htmlPreview:`HTML preview`,pdfPreview:`PDF preview`,parseError:`parse error`,editJson:`Edit JSON`,jsonEditorLabel:`JSON editor`,invalidJson:`Invalid JSON`,undo:`Undo`,redo:`Redo`,editMarp:`Edit slide source`,marpEditorLabel:`Marp slide source`,openInOs:`Open in OS`,openingInOs:`Opening…`,openInOsFailed:`Failed to open in OS`,downloadFile:`Download`,downloadingFile:`Downloading…`},filesView:{chatPlaceholder:`Ask about this file…`},systemFiles:{schemaLabel:`Schema`,showDetails:`Show details`,hideDetails:`Hide details`,editPolicy:{"agent-managed-but-hand-editable":`Agent-managed (hand-edit OK)`,"user-editable":`User-editable`,"agent-managed":`Agent-managed`,"fragile-format":`Fragile format`,ephemeral:`Ephemeral`},mcp:{title:`MCP servers`,summary:`External Model Context Protocol servers attached to the agent. Add HTTP or stdio servers to expand the agent's tool surface.`},settings:{title:`App settings`,summary:`User-editable behavioural preferences for the app — Gemini API key, allowed tools, sandbox config, and similar.`},schedulerTasks:{title:`Scheduler tasks`,summary:`Recurring agent automations that fire on a schedule. Managed via the Automations UI; this file is the on-disk source of truth.`},schedulerOverrides:{title:`Scheduler overrides`,summary:`Per-task time / interval overrides applied on top of the system schedule. The agent edits this when you ask to change a recurring task's timing.`},schedulerItems:{title:`Scheduler items queue`,summary:`Active scheduled invocations ready to fire. Agent-managed; do not hand-edit unless you know exactly what each field means.`},wikiIndex:{title:`Wiki index`,summary:`Auto-generated index of every wiki page. Refreshed on each wiki edit; do not hand-edit (your changes will be overwritten).`},wikiLog:{title:`Wiki edit log`,summary:`Activity log of wiki page creates and edits. Agent-managed and append-only; useful as a recent-changes feed.`},wikiSummary:{title:`Wiki summary`,summary:`Auto-generated overview of the wiki — topic clusters, page counts, recent activity. Refreshed by the agent.`},wikiSchema:{title:`Wiki schema`,summary:`The format spec the agent reads to keep wiki pages consistent. Fragile — the agent expects a specific structure, so prefer agent-driven edits.`},memory:{title:`Memory`,summary:`Distilled facts about you, always loaded as context for new conversations. The journal extractor appends here automatically; you can also hand-edit.`},summariesIndex:{title:`Summaries index`,summary:`Browseable index linking the daily and topic summaries the journal generates. Agent-managed; refreshed on each journal pass.`},rolesJson:{title:`Role definition (JSON)`,summary:`Role configuration — model choice, MCP servers, allowed plugins, query suggestions. User-editable; restart not required.`},rolesMd:{title:`Role description (Markdown)`,summary:`The role's persona and system-prompt prose, loaded as context when this role is active. User-editable; changes apply on the next message.`},journalDaily:{title:`Daily journal summary`,summary:`Auto-generated recap of your activity for one calendar day, distilled from chat sessions by the journal pass.`},journalTopic:{title:`Topic journal`,summary:`Long-running notes for one specific topic, accumulated and revised as you keep talking about it. Agent-managed.`}},settingsMcpTab:{explanation:`Add external MCP servers. HTTP servers work in every mode. Stdio servers use the sandbox image's {npx} / {node} / {tsx}; paths must live under the workspace when Docker is enabled.`,localhostRewrite:`In Docker mode {localhost} is rewritten to {hostDockerInternal}.`,noServers:`No MCP servers configured yet.`,enabled:`enabled`,urlLabel:`URL:`,commandLabel:`Command:`,dockerStdioUnsupported:`⚠ Won't run while the Docker sandbox is enabled.`,dockerStdioHostExecActive:`⚠ Runs on the host — this server escapes the Docker sandbox.`,dockerStdioHostExecOptIn:`Run on the host anyway (advanced). This server runs outside the Docker sandbox via a local HTTP gateway and can access your machine.`,learnMore:`Learn more`,addServerButton:`+ Add MCP Server`,nameLabel:`Name`,namePlaceholder:`my-server`,typeHttp:`HTTP`,typeStdio:`Stdio (command)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`Command`,argsLabel:`Arguments (one per line)`,argsPlaceholder:()=>`-y
|
|
220
|
+
This cannot be undone.`},notificationBell:{notifications:`Notifications`,activeSection:`Active`,historySection:`History`,noActive:`No active notifications`,noHistory:`No recent activity`,clearAll:`Clear`,dismiss:`Dismiss`,cancel:`Cancel`,showMore:`Show more ({count})`,showLess:`Show less`,openTarget:`Open`,expandDetails:`Expand details`},pluginDiagnostics:{title:`Plugin configuration issue`,hostBody:`Plugin "{plugin}" tried to register the {label} key "{key}" but it is reserved by the host. The plugin's entry has been dropped.`,intraBody:`Plugins "{first}" and "{second}" both register {dimension} "{key}". "{first}" claimed it first, so "{second}"'s registration is ignored.`},shadowedEnv:{title:`Shell env is overriding .env`,body:`Set in both your shell and .env: {keys}. The shell value wins, so .env is ignored. If you edited .env, update or unset the shell value and restart.`},optionalDeps:{title:`Optional dependency unavailable`,titleNotFound:`{command} not installed`,titleNotResponding:`{command} not running`,notFound:`{command} not found — related features are disabled. Install {command} and restart MulmoClaude to enable them.`,notResponding:`{command} is installed but not running — related features are disabled. Start {command} and restart MulmoClaude to enable them.`},billingMigration:{title:`Invoicing moved to on-demand setup`,body:`The bundled clients, worklog, invoice, and profile collections were removed from your dashboard, but your data is safe and untouched. Ask to set up client & time tracking, then invoicing, to recreate them — your existing records will reappear.`},backendOffline:{title:`Can't reach the backend`,body:`The MulmoClaude server may not be running. Check the dev server, then retry.`,retry:`Retry`},pluginErrorBoundary:{title:`Plugin {pkg} crashed`,subtitle:`The plugin failed to render. The error has been logged to the console.`,showDetails:`Show details`,hideDetails:`Hide details`,retry:`Retry`},remoteHostOffline:{title:`Remote host disconnected`,body:`Your phone can't send to this device until you reconnect.`,reconnect:`Reconnect`},authTokenStale:{title:`This page needs a reload`,body:`The server refused this page's token and a new one could not be fetched. Reload to continue.`,reload:`Reload`},remoteHost:{title:`Remote host`,online:`Remote host online`,offline:`Remote host offline`,uid:`uid {uid}`,signIn:`Sign in with Google`,connecting:`Connecting…`,disconnect:`Disconnect`,disconnecting:`Disconnecting…`,noToken:`Google sign-in returned no idToken`,connectFailed:`Connect failed`,disconnectFailed:`Disconnect failed`,signInFailed:`Google sign-in failed`,statusFailed:`Failed to load status`,description:`Remote access lets a mobile device connect to this MulmoClaude's collections and feeds.`,howTo:`On your phone, open {url} and sign in with the same Google account.`,customViewHint:`For a mobile-friendly view, ask Claude to build a {keyword} (not a regular custom view).`,qrHint:`Or scan this QR code with your phone's camera.`},sessionModelChip:{tooltip:`Model this session is running on: {model}`,tooltipOverride:`Model for this chat: {model} (overriding the role / app-wide choice)`,ariaLabel:`Model for this chat`,clear:`Back to the default`,unknown:`unknown`,inherited:`{model} (inherited)`},sidebarHeader:{newMessages:`New messages`,home:`Go to latest chat`,toolCallHistory:`Tool call history`,settings:`Settings`,settingsGeminiMissing:`Settings — Gemini API key missing`,todayJournal:`Today's journal`,todayJournalNotFound:`No journal summary yet — chat for a while and the journal will generate one.`,todayJournalLoadFailed:`Failed to load journal (status {status}): {error}`,copyMarkdown:`Copy chat as Markdown`,copiedMarkdown:`Copied!`},rightSidebar:{permalink:`Selected message permalink`,copyPermalink:`Copy permalink to selected message`,copiedPermalink:`Copied!`,toggleSystemPrompt:`Toggle system prompt`,systemPrompt:`System Prompt`,availableTools:`Available Tools`,toggleToolDescription:`Toggle tool description`,toolCallHistory:`Tool Call History`,copyHistory:`Copy tool call history`,copiedHistory:`Copied!`,noToolCalls:`No tool calls yet`,arguments:`Arguments`,error:`Error`,result:`Result`,running:`Running...`,mcpHint:{title:e=>`${e.named(`server`)} setup hint`,requiredKeys:`Required keys`,setupGuide:`Open setup guide`}},fileTreePane:{sort:`Sort:`,sortByName:`Sort by name`,name:`Name`,sortByRecent:`Sort by modified date (newest first)`,recent:`Recent`,reference:`Reference`,readOnlyBadge:`RO`,showSystemFiles:`Show system files`,showSystemFilesTitle:`Show agent-internal top-level dirs (conversations/, feeds/, etc.) in addition to your user content (data/, artifacts/, config/).`},fileTree:{dropHint:`Drop files here to save them in this folder`,upload:{progress:`Uploading {done} of {total}…`,done:`Saved {count} file(s)`,failed:`{count} file(s) couldn't be saved`},workspace:`(workspace)`,recentlyChanged:`Recently changed`,newFileMenuItem:`New file`,newFileInputAria:`New file name`,newFilePlaceholder:{wikiPage:`page-slug`,summary:`summary-name`,document:`document-name`,html:`page-name`,story:`story-name`},newFileError:{empty:`Filename can't be empty.`,unsafe:`Filename contains invalid characters.`,exists:`A file named {filename} already exists here.`,saveFailed:`Couldn't create the file. Please try again.`}},lockStatusPopup:{sandboxEnabledTooltip:`Sandbox enabled (Docker)`,noSandboxTooltip:`No sandbox (Docker not found)`,sandboxEnabledLabel:`Sandbox enabled:`,sandboxEnabledBody:`Docker is running. Filesystem access is isolated.`,noSandboxLabel:`No sandbox:`,noSandboxBodyPrefix:`Claude can access all files on your machine. Install`,noSandboxBodySuffix:`to enable filesystem isolation.`,dockerDesktop:`Docker Desktop`,hostCredentials:`Host credentials attached:`,credsLoading:`loading…`,sshAgent:`SSH agent:`,forwarded:`forwarded`,notForwarded:`not forwarded`,mountedConfigs:`Mounted configs:`,none:`none`,testIsolation:`Test sandbox isolation:`},settingsModal:{title:`Settings`,version:`MulmoClaude v{version}`,tabs:{gemini:`Gemini API Key`,tools:`Allowed Tools`,mcp:`MCP Servers`,dirs:`Directories`,refs:`Reference Dirs`,map:`Map`,photos:`Photos`,google:`Google`,model:`Model`,voice:`Voice`,chatIndex:`Chat index`,journal:`Journal`,notifications:`Web Push`,skills:`Skills`,roles:`Roles`,quit:`Quit`},groups:{llm:`LLM`,servers:`Servers`,workspace:`Workspace`,notifications:`Notifications`,plugins:`Plugins`,management:`Management`,server:`Server`},navAriaLabel:`Settings sections`,googleTab:{description:`Link your Google account so this machine can call Google APIs (Calendar first). The refresh token is stored only on this machine and is never sent to any server other than Google.`,statusLinked:`Linked`,statusNotLinked:`Not linked`,statusPending:`Waiting for the browser consent to finish…`,connect:`Link Google account`,unlink:`Unlink`,unlinkConfirm:`Unlink the Google account? The saved token is revoked and deleted from this machine.`,clientSecretAmbiguous:`Multiple client_secret_*.json files were found in ~/.secrets/. Keep exactly one so the stored token stays paired with the right OAuth client.`,loadError:`Failed to load the Google link status.`,connectError:`Failed to start the Google authorization flow.`,unlinkError:`Failed to unlink the Google account.`},geminiTab:{required:`Image generation needs {envKey}. Paste the key below and save it.`,apiKeyLabel:`Gemini API key`,apiKeyPlaceholder:`AIza…`,helperText:`Create or copy a key from {studioLink}.`,storageNote:`Stored on this machine only, outside the workspace, readable by you alone. It takes effect right away — no restart.`,storedHere:`Saved in the app`,storedInEnvironment:`Coming from the environment`,notConfigured:`Not configured`,clear:`Clear`,fromEnvironment:`This key comes from the shell that started the app, or from {envFile}. A key saved here takes precedence.`,loadError:`Failed to load the key status`,saveError:`Failed to save the key`,clearError:`Failed to clear the key`},mapTab:{description:`Set the Google Maps API key used by the map plugin. The key is stored locally and never transmitted anywhere except to Google Maps.`,apiKeyLabel:`Google Maps API key`,apiKeyPlaceholder:`AIza…`,helperText:`Create or copy a key from {consoleLink}.`,requiredApis:`Enable: Maps JavaScript API, Geocoding API, Places API (New), Directions API.`,configured:`Configured`,notConfigured:`Not configured`,clear:`Clear`,loadError:`Failed to load settings`,saveError:`Failed to save`},photosTab:{description:`Privacy controls for photos uploaded via chat or a connected bridge. EXIF location data is sensitive — uncheck the box to opt out of automatic capture.`,autoCaptureLabel:`Auto-capture photo location data`,autoCaptureHint:`When on, every uploaded image with EXIF GPS gets a location sidecar at data/locations/. Off: nothing is captured automatically; the LLM can still extract EXIF on demand.`,statusOn:`Auto-capture is ON`,statusOff:`Auto-capture is OFF`,loadError:`Failed to load settings`,saveError:`Failed to save`},quitTab:{description:`Stop the MulmoClaude server running on this machine. Started from the icon, it keeps running after you close this tab — this is how you stop it without a terminal.`,restartHint:()=>"To start it again, double-click the MulmoClaude icon (or run `npx mulmoclaude@latest`).",quitLabel:`Quit MulmoClaude`,confirmBody:`The server stops and this page stops working. Anything still running is interrupted.`,confirmLabel:`Quit`,stopping:`Stopping…`,stoppedTitle:`MulmoClaude has stopped`,stoppedBody:`You can close this tab. Double-click the icon to start it again.`,error:`Failed to stop the server`},notificationsTab:{description:`Get a push on your registered devices when a task you started here finishes — handy when you ask something, step away, and want to know the moment the answer is ready.`,enableLabel:`Send a Web Push when a task finishes`,enableHint:`Fires when a chat you started here completes. Scheduled and background tasks don't trigger it.`,remoteHostNote:`Requires the RemoteHost connection (it supplies the sign-in) and at least one registered device. With either missing, this does nothing.`,macosRemindersLabel:`Create a macOS Reminder when a task finishes`,macosRemindersHint:`Adds the finished task to your default Reminders list. iCloud sync then mirrors it to your iPhone, which is what delivers the notification.`,macosRemindersForcedOff:`Turned off at startup by --disable-macos-reminders or DISABLE_MACOS_REMINDER_NOTIFICATIONS. Remove the flag or unset the variable, then restart, to control it from here.`,statusOn:`Web Push is ON`,statusOff:`Web Push is OFF`,loadError:`Failed to load settings`,saveError:`Failed to save`},modelTab:{description:`Choose the model and the reasoning effort Claude Code uses for each turn. Leave either unset to keep Claude's own resolution.`,modelLabel:`Model`,modelUnset:`(unset — follow ~/.claude/settings.json)`,modelHelperText:`Unset means the model comes from ~/.claude/settings.json, which other Claude Code clients (VS Code, Cursor) also write their /model pick to — so a switch made there changes MulmoClaude too. Aliases follow the latest generation of each family.`,modelConfigured:`Model: {model}`,modelNotConfigured:`Not set (shared)`,effortLabel:`Reasoning effort`,effortUnset:`(unset — use Claude's default)`,helperText:`Higher levels allow more thinking time but increase latency and token usage.`,configured:`Effort: {level}`,notConfigured:`Not set`,userSettingsLabel:`Load Claude Code's user settings and plugins`,userSettingsHint:`Reads skills, plugins and hooks from ~/.claude, the same ones Claude Code uses. Turn this off if your installed plugins carry so many skills that every request gets heavy; the workspace's own skills keep working. Takes effect from the next message. When off, an unset model no longer follows ~/.claude/settings.json either.`,skillListingSummary:`Skills listed on the last turn: {count}.`,skillListingPlugins:`From plugins: {plugins}.`,skillListingHeavy:`That many skills make every request heavy; turning this off drops the ones from ~/.claude.`,loadError:`Failed to load settings`,saveError:`Failed to save`},voiceTab:{description:`Dictate chat messages with your voice. Audio is transcribed locally on the machine running MulmoClaude — nothing is sent to any external service.`,requirements:`Available on macOS only. It requires the whisper.cpp server — build it with yarn build:whisper (see the README, Local Voice Input section).`,unsupported:`Voice input requires macOS with the whisper.cpp server installed. It is not available on this machine.`,enableLabel:`Enable voice input`,enableHint:`Turning this on downloads the speech model (1–3 GB) once. A mic button then appears in the chat input.`,modelLabel:`Speech model`,downloading:`Downloading model… {percent}%`,ready:`Model ready`,downloadError:`Model download failed.`,retry:`Retry`,loadError:`Failed to load settings`,saveError:`Failed to save`},chatIndexTab:{description:`Background AI titles + summaries for your chat history. Off by default — automation sessions (scheduler / system workers) are always skipped even when on, and human sessions only pay one summarizer call each when a turn ends.`,modeLabel:`Chat index model`,helperText:`Haiku is cheaper; Sonnet gives sharper titles for long, topic-shifting sessions.`,mode:{off:`Off`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Indexing is OFF`,haiku:`Indexing with Haiku`,sonnet:`Indexing with Sonnet`},loadError:`Failed to load settings`,saveError:`Failed to save`},journalTab:{description:`Automated daily journal — summarises recent chat sessions into journal/*.md and extracts durable memory notes. Off by default. Automation sessions (scheduler / system workers) are always excluded regardless of this setting.`,modeLabel:`Journal model`,helperText:`Haiku is cheaper; Sonnet produces richer daily / topic summaries. The hourly pass runs only when this is set.`,mode:{off:`Off`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Journal is OFF`,haiku:`Journal running with Haiku`,sonnet:`Journal running with Sonnet`},loadError:`Failed to load settings`,saveError:`Failed to save`},geminiAskButton:`Ask Claude`,geminiAskMessage:`What is the role of the Gemini API key in this app?`,toolNamesLabel:`Tool names`,invalidToolNamesPrefix:`These look non-standard (expected prefix`,invalidToolNamesSuffix:`):`,mcpToolsError:`⚠ Could not fetch MCP tool status: {error}. Showing all tools regardless of enablement.`,changesHint:`Changes apply on the next message. No restart needed.`,cannotSaveTooltip:`Cannot save until settings load successfully`,saving:`Saving…`,loadingLabel:`Loading…`,unsavedMarker:`●`,unsavedToolsConfirm:`Allowed Tools has unsaved changes. Close anyway?`,unsavedMcpDraftConfirm:`An MCP server draft is still open. Close anyway?`,mcpSaveFailed:`Failed to save MCP server changes.`},canvasViewToggle:{stackViewTooltip:`Stack view · click to switch to Single`,singleViewTooltip:`Single view · click to switch to Stack`,switchToSingle:`Switch to Single view`,switchToStack:`Switch to Stack view`},sessionHistoryToggle:{showTooltip:`Show session history panel on the left`,hideTooltip:`Hide session history panel`,show:`Show session history`,hide:`Hide session history`},sessionHistoryExpand:{expandTooltip:`Expand session history panel to full width`,collapseTooltip:`Collapse session history panel`,expand:`Expand session history`,collapse:`Collapse session history`},settingsWorkspaceDirs:{explanation:`Custom directories for organizing files under {dataDir} and {artifactsDir}. Claude uses these to route file saves.`,noEntries:`No custom directories configured.`,addDirTitle:`Add directory`,pathPlaceholder:`data/clients or artifacts/reports`,descPlaceholder:`Description (what goes in this folder)`,errPathRequired:`Path required`,errMustStartWith:`Must start with data/ or artifacts/`,errAlreadyExists:`Already exists`},settingsReferenceDirs:{explanation:`External directories Claude can read but not modify. In Docker mode, these are mounted read-only. Useful for referencing Obsidian vaults, project code, or document folders.`,noEntries:`No reference directories configured.`,addDirTitle:`Add reference directory`,pathPlaceholder:`/Users/me/ObsidianVault or ~/Documents/notes`,labelPlaceholder:`Label (optional — defaults to folder name)`,readOnlyBadge:`read-only`,errPathRequired:`Path required`,errMustBeAbsolute:`Must be an absolute path or start with ~/`,errAlreadyExists:`Already exists`,errLabelConflict:`Label "{label}" already exists`},dashboard:{empty:`No favorite collections yet.`,emptyHint:`Pin a collection (★) to see it here.`,viewTable:`Table`,viewCalendar:`Calendar`,viewKanban:`Kanban`,viewPickerLabel:`Choose view`,openFull:`Double-click to open full view`,dragHint:`Drag to reorder`,resizeHint:`Drag to resize`},pluginLauncher:{chat:{label:`Chat`},dashboard:{label:`Dashboard`},automations:{label:`Actions`},wiki:{label:`Wiki`},collections:{label:`Collections`},feeds:{label:`Feeds`},accounting:{label:`Accounting`},files:{label:`Files`}},shortcuts:{pin:`Pin to launcher`,unpin:`Unpin from launcher`,zoneAriaLabel:`Pinned shortcuts`,reorder:{open:`Reorder shortcuts`,title:`Reorder`,moveUp:`Move up`,moveDown:`Move down`}},fileContentHeader:{showRendered:`Show rendered Markdown`,showRaw:`Show raw source`,rendered:`Rendered`,raw:`Raw`,closeFile:`Close file`,revealInOs:`Show in folder`,revealInOsFailed:`Failed to show in folder`},fileContentRenderer:{download:`ZIP`,downloadZip:`Download as a self-contained zip (assets bundled)`,downloadError:`Download failed`,selectFile:`Select a file`,htmlPreview:`HTML preview`,pdfPreview:`PDF preview`,parseError:`parse error`,editJson:`Edit JSON`,jsonEditorLabel:`JSON editor`,invalidJson:`Invalid JSON`,undo:`Undo`,redo:`Redo`,editMarp:`Edit slide source`,marpEditorLabel:`Marp slide source`,openInOs:`Open in OS`,openingInOs:`Opening…`,openInOsFailed:`Failed to open in OS`,downloadFile:`Download`,downloadingFile:`Downloading…`},filesView:{chatPlaceholder:`Ask about this file…`},systemFiles:{schemaLabel:`Schema`,showDetails:`Show details`,hideDetails:`Hide details`,editPolicy:{"agent-managed-but-hand-editable":`Agent-managed (hand-edit OK)`,"user-editable":`User-editable`,"agent-managed":`Agent-managed`,"fragile-format":`Fragile format`,ephemeral:`Ephemeral`},mcp:{title:`MCP servers`,summary:`External Model Context Protocol servers attached to the agent. Add HTTP or stdio servers to expand the agent's tool surface.`},settings:{title:`App settings`,summary:`User-editable behavioural preferences for the app — Gemini API key, allowed tools, sandbox config, and similar.`},schedulerTasks:{title:`Scheduler tasks`,summary:`Recurring agent automations that fire on a schedule. Managed via the Automations UI; this file is the on-disk source of truth.`},schedulerOverrides:{title:`Scheduler overrides`,summary:`Per-task time / interval overrides applied on top of the system schedule. The agent edits this when you ask to change a recurring task's timing.`},schedulerItems:{title:`Legacy calendar items`,summary:`Calendar items from the removed Calendar view. The app no longer shows them and nothing runs them on a schedule; only the legacy /api/scheduler actions still read and write this file. Scheduled tasks live in config/scheduler/tasks.json.`},wikiIndex:{title:`Wiki index`,summary:`Auto-generated index of every wiki page. Refreshed on each wiki edit; do not hand-edit (your changes will be overwritten).`},wikiLog:{title:`Wiki edit log`,summary:`Activity log of wiki page creates and edits. Agent-managed and append-only; useful as a recent-changes feed.`},wikiSummary:{title:`Wiki summary`,summary:`Auto-generated overview of the wiki — topic clusters, page counts, recent activity. Refreshed by the agent.`},wikiSchema:{title:`Wiki schema`,summary:`The format spec the agent reads to keep wiki pages consistent. Fragile — the agent expects a specific structure, so prefer agent-driven edits.`},memory:{title:`Memory (legacy file)`,summary:`The older single-file memory. Only workspaces still on the older memory format read it; current workspaces keep facts as topic files under conversations/memory/<type>/<topic>.md and ignore this file, so editing it has no effect there.`},summariesIndex:{title:`Summaries index`,summary:`Browseable index linking the daily and topic summaries the journal generates. Agent-managed; refreshed on each journal pass.`},rolesJson:{title:`Role definition (JSON)`,summary:`Role configuration — model choice, MCP servers, allowed plugins, query suggestions. User-editable; restart not required.`},rolesMd:{title:`Role description (Markdown)`,summary:`The role's persona and system-prompt prose, loaded as context when this role is active. User-editable; changes apply on the next message.`},journalDaily:{title:`Daily journal summary`,summary:`Auto-generated recap of your activity for one calendar day, distilled from chat sessions by the journal pass.`},journalTopic:{title:`Topic journal`,summary:`Long-running notes for one specific topic, accumulated and revised as you keep talking about it. Agent-managed.`}},settingsMcpTab:{explanation:`Add external MCP servers. HTTP servers work in every mode. Stdio servers use the sandbox image's {npx} / {node} / {tsx}; paths must live under the workspace when Docker is enabled.`,localhostRewrite:`In Docker mode {localhost} is rewritten to {hostDockerInternal}.`,noServers:`No MCP servers configured yet.`,enabled:`enabled`,urlLabel:`URL:`,commandLabel:`Command:`,dockerStdioUnsupported:`⚠ Won't run while the Docker sandbox is enabled.`,dockerStdioHostExecActive:`⚠ Runs on the host — this server escapes the Docker sandbox.`,dockerStdioHostExecOptIn:`Run on the host anyway (advanced). This server runs outside the Docker sandbox via a local HTTP gateway and can access your machine.`,learnMore:`Learn more`,addServerButton:`+ Add MCP Server`,nameLabel:`Name`,namePlaceholder:`my-server`,typeHttp:`HTTP`,typeStdio:`Stdio (command)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`Command`,argsLabel:`Arguments (one per line)`,argsPlaceholder:()=>`-y
|
|
221
221
|
@modelcontextprotocol/server-filesystem
|
|
222
222
|
/workspace/path`,errNoName:`Please provide a Name, or enter a URL / args we can derive one from.`,errBadName:`Name must start with a lowercase letter and contain only [a-z0-9_-].`,errIdExists:`Server id "{id}" already exists.`,errBadHttpUrl:`HTTP URL must start with http:// or https://`,pendingEntryWarning:`Finish or cancel the pending MCP server entry first.`,customHeading:`Custom servers`,catalog:{heading:`Pre-configured MCP servers`,audience:{general:`🟢 General`,developer:`🔵 Developer`},risk:{low:`low`,medium:`medium`,high:`high`},upstream:`📦 Source`,setupGuide:`📚 Setup`,entry:{memory:{displayName:`Memory`,description:`Lets Claude remember conversation context across sessions.`},sequentialThinking:{displayName:`Sequential Thinking`,description:`Helps Claude work through multi-step problems by thinking step by step.`},context7:{displayName:`Context7 (library docs)`,description:`Up-to-date documentation for popular libraries — beats the model's training-cutoff memory.`},deepwiki:{displayName:`DeepWiki (GitHub repo wiki)`,description:`Ask questions about any GitHub repository and get a structured wiki-style answer.`},notion:{displayName:`Notion`,description:`Read and write your Notion workspace — pages, databases, and search.`,field:{apiKey:{label:`Notion integration token`,help:`Create a Notion integration and copy the Internal Integration Secret. Click 🔑 to open the integrations page.`}}},slack:{displayName:`Slack`,description:`List channels, post messages, and search history in your Slack workspace.`,field:{botToken:{label:`Bot token`,help:`Slack app → OAuth & Permissions → Bot User OAuth Token. Starts with xoxb-.`},teamId:{label:`Team / workspace ID`,help:`Run team.info or check the workspace URL — looks like T01ABC23DEF.`}}},googleMaps:{displayName:`Google Maps`,description:`Search places, get directions, and look up location details.`,field:{apiKey:{label:`Google Maps API key`,help:`Google Cloud Console → APIs & Services → Credentials → Create API key. Enable Places + Directions.`}}},appleNative:{displayName:`Apple Native Apps (macOS)`,description:`Read and write Reminders, Calendar, Notes, Mail and Maps via AppleScript. macOS only — no credentials needed.`},gmail:{displayName:`Gmail`,description:`Read, send, and label your Gmail. Uses a Google OAuth client you create in your own Google Cloud project (no app verification needed).`,field:{credentials:{label:`Path to credentials.json`,help:`Google Cloud Console → APIs & Services → Credentials → OAuth client ID (Desktop app). Download credentials.json and paste its absolute path.`}}},googleCalendar:{displayName:`Google Calendar`,description:`Read and create Google Calendar events. Same BYO Google OAuth credentials.json pattern as Gmail.`,field:{credentials:{label:`Path to credentials.json`,help:`Same Google Cloud OAuth client as Gmail. Reuse the file or create a separate Calendar-scoped one.`}}},googleDrive:{displayName:`Google Drive`,description:`Search and read Google Drive files. BYO Google OAuth credentials — token is cached locally next to the file.`,field:{credentials:{label:`Path to credentials.json`,help:`Google Cloud Console → APIs & Services → Credentials → OAuth client ID (Desktop app). Enable the Google Drive API in the same project.`}}},github:{displayName:`GitHub`,description:"Read repos, issues, PRs and run searches with a Personal Access Token. Scope the token narrowly — write scopes (e.g. `repo`) let the agent push to any repo you can access.",field:{token:{label:`Personal Access Token`,help:`GitHub → Settings → Developer settings → Personal access tokens. Prefer fine-grained tokens limited to the repos you want the agent to touch.`}}},linear:{displayName:`Linear`,description:`Read and update Linear issues, projects and cycles via a personal API key.`,field:{apiKey:{label:`Linear API key`,help:`Linear → Settings → API → Personal API keys. Click 🔑 to open the page and click Create key.`}}},weatherOpenMeteo:{displayName:`Weather (Open-Meteo)`,description:`Free weather forecasts and current conditions worldwide — no API key needed.`},spotify:{displayName:`Spotify`,description:`Search tracks, manage playlists, control playback. BYO Spotify developer app — Client ID only (PKCE flow, no client secret).`,field:{clientId:{label:`Client ID`,help:"Spotify Developer Dashboard → Create app, set Redirect URI to http://127.0.0.1:8888/callback, copy the Client ID. Then run `SPOTIFY_CLIENT_ID=<id> npx spotify-mcp@latest auth` once in your terminal to log in (refresh token is cached at ~/.spotify-mcp/tokens.json)."}}},youtubeTranscript:{displayName:`YouTube transcript`,description:`Fetch the captions for any public YouTube video by URL. No credentials needed.`}},config:{howToGet:`How to get this`,install:`Install`,errMissingRequired:`Required field(s) missing: {fields}`,requiredMarker:`*`,requiredAria:`required`}}},pluginScheduler:{previewIcon:`📅`,previewAutomations:`{count} automation | {count} automations`,previewMore:`+ {count} more…`},pluginSchedulerTasks:{recommendedFrequencies:`Recommended Frequencies`,tableTaskType:`Task type`,tableSuggestedSchedule:`Suggested schedule`,noTasks:`No scheduled tasks`,runNow:`Run now`,enable:`Enable`,disable:`Disable`,delete:`Delete`,nextRun:`Next: {time}`,originSystem:`System`,originUser:`User`,originSkill:`Skill`,runFailed:`Run failed: {error}`,toggleFailed:`Toggle failed: {error}`,deleteFailed:`Delete failed: {error}`,detailsToggle:`Show details`,promptLabel:`Prompt`,roleLabel:`Role`,confirmDelete:`Delete the task "{name}"? This cannot be undone.`,hintNewsRss:`News / RSS fetch`,hintJournal:`Journal daily pass`,hintWiki:`Wiki maintenance`,hintMemory:`Memory extraction`,hintCalendar:`Calendar / contact sync`},pluginCanvas:{undo:`Undo`,redo:`Redo`,clear:`Clear`,styleLabel:`Style:`,stylePromptWithPath:"Turn the image at `{path}` into a {style} style image.",stylePromptNoPath:`Turn my drawing on the canvas into a {style} style image.`,saveFailed:`Not saved`},pluginWiki:{backToIndex:`Back to index`,pdf:`PDF`,pdfFailed:`⚠ PDF failed`,tabIndex:`Index`,tabLog:`Log`,tabLint:`Lint`,tabGraph:`Graph`,graphEmpty:`No links to graph yet.`,linkedReferences:`Linked references`,empty:`Wiki is empty. Ask the Wiki Manager to ingest a source.`,previewMore:`+ {count} more…`,chatPlaceholder:`Ask about this page…`,emptyPage:`The page "{title}" does not exist yet.`,emptyContent:`The page "{title}" exists but has no content.`,createPage:`Request creation of this wiki page`,updatePage:`Request update of this wiki page`,tagFilterAll:`All`,noMatches:`No pages tagged #{tag}`,lintChat:`Lint My Wiki`,taskCountMismatch:`Wiki source and rendered output disagree on the number of tasks. Refusing to toggle to avoid corruption.`,metadataCreated:`Created`,metadataUpdated:`Updated`,metadataEditor:`Editor`,pageEditHeader:`Wiki edit`,snapshotExpired:`Snapshot expired — showing current page`,snapshotLoadError:`Couldn't load the snapshot — the page may still exist. Try refreshing.`,pageDeleted:`Page deleted`,history:{tabContent:`Content`,tabHistory:`History`,empty:`No history yet — edit this page and the first version will appear here.`,loading:`Loading history…`,backToList:`Back to history`,restoreButton:`Restore this version`,restoreConfirmTitle:`Restore this version?`,restoreConfirmBody:`Restore page to the version from {ts} by {editor}? Current page will be replaced. Existing history is preserved.`,restoreConfirmAction:`Restore`,restoreConfirmCancel:`Cancel`,restoreSuccessToast:`Page restored.`,restoreFailureBanner:`Restore failed: {error}`,compareCurrent:`Compare with current page`,comparePrevious:`Compare with previous version`,diffNoPrevious:`No previous version to compare against.`,diffNoChanges:`No content changes between this version and the comparison.`,editorBadgeUser:`User`,editorBadgeLLM:`LLM`,editorBadgeSystem:`System`,hiddenLines:`{count} unchanged lines hidden`,expandHidden:`Show`}},pluginPresentForm:{fallbackTitle:`Form`,fieldCount:`{count} field | {count} fields`,submitted:`Submitted`,errorSummary:`Please fix the following errors`,requiredMarker:`*`,selectOption:`Select an option`,charactersCount:`{current} / {max} characters`,charactersCountNoMax:`{current} characters`,submit:`Submit`,progress:`{filled} of {total} required fields completed`},pluginPresentSvg:{saveAsPng:`Download as PNG`,png:`PNG`,saveAsPdf:`Save as PDF (opens print dialog)`,pdf:`PDF`,untitled:`SVG Drawing`,editSource:`Edit SVG Source`,cancel:`Cancel`,applyChanges:`Apply Changes`,saving:`Saving...`,saveError:`⚠ Save failed: {error}`,exportError:`⚠ Export failed: {error}`,loadingSource:`Loading source…`,sourceError:`Failed to load source: {error}`},photoLocations:{title:`Photo locations`,summary:`{total} captured · {withGps} with GPS`,mapHint:`Ask Claude "show these on a map" to plot them with the Google Map plugin.`,loading:`Loading…`,empty:`No photo locations captured yet. Send a geotagged photo via chat or a connected bridge to get started.`,noGps:`No GPS data`},pluginManageSkills:{deleteProjectSkill:`Delete this project-scope skill`,unstarPresetSkill:`Unstar this preset — moves it back to the catalog`,heading:`Skills`,previewCount:`{count} skill | {count} skills`,previewMore:`+{count} more`,subheading:({named:e})=>`${e(`count`)} available · click one to view · "Run" invokes it as /<name>`,emptyWithPath:`No skills found. Add skill folders under {path}.`,emptySkillPath:`~/.claude/skills/`,selectHint:`Select a skill on the left to view its SKILL.md.`,loading:`Loading…`,fieldDescription:`Description`,fieldBody:`Body (Markdown)`,emptyBody:`(empty body)`,btnEdit:`Edit`,btnDelete:`Delete`,btnUnstar:`Unstar`,errListFailed:`Failed to load skills: {error}`,errDetailFailed:`Failed to load skill: {error}`,errSaveFailed:`Save failed: {error}`,errDeleteFailed:`Failed to delete`,confirmDelete:`Delete skill "{name}"? This removes ~/mulmoclaude/.claude/skills/{name}/SKILL.md.`,confirmUnstar:`Move "{name}" back to the catalog? It will stop loading into the prompt, but the catalog copy stays — you can re-star it any time.`,sectionActive:`Active`,sectionCatalog:`Catalog`,sectionLegendActive:`Skills Claude can use right now. Claude calls them automatically in the flow of a conversation, or you can invoke one by typing its name. {system} System (mc- bundled) / {project} Project (editable, this workspace only) / {user} User (skills in ~/.claude/skills/) / {claudePlugin} Plugin (from an installed Claude Code plugin, read-only).`,sectionLegendCatalog:`Catalog: skills that become Active when you mark them with {star}. Removing {star} from an Active skill sends it back to Catalog — Claude stops using it (the skill is not deleted).`,catalogEmpty:`No preset skills available.`,catalogPresetHeading:`Presets`,catalogStar:`Star`,catalogStarred:`Starred`,sourceUserTitle:`User skill (~/.claude/skills/, available in every workspace)`,sourceClaudePluginTitle:`Plugin skill (installed Claude Code plugin — read-only, updated by the plugin)`,sourceSystemTitle:`System skill (bundled, mc- prefix — read-only, overwritten by the launcher)`,sourceProjectTitle:`Project skill (workspace .claude/skills/, this workspace only)`,sourcePresetTitle:`Preset catalog — click Star to activate in this workspace`,errCatalogListFailed:`Failed to load catalog: {error}`,errCatalogStarFailed:`Failed to star skill: {error}`,errCatalogPreviewFailed:`Failed to load skill preview: {error}`,catalogAddRepo:`Add skill repository`,catalogAddRepoTitle:`Add a skill repository`,catalogRepoUrlLabel:`GitHub URL`,catalogRepoUrlPlaceholder:`https://github.com/owner/repo`,catalogRepoSubpathLabel:`Subpath (optional)`,catalogRepoSubpathPlaceholder:`skills`,catalogAddRepoSubmit:`Install`,catalogAddRepoSuggestions:`Suggested repositories`,catalogUninstallRepo:`Uninstall repository`,catalogUpdateRepo:`Update repository (re-fetch latest)`,catalogRepoOpenLink:`Open repository on GitHub (new tab)`,catalogUninstallConfirm:`Uninstall this repository? Skills you already starred stay in your active list.`,catalogRepoInstalling:`Installing…`,catalogRepoEmpty:`No skills found in this repository.`,sourceExternalTitle:`External skill (installed from a GitHub repo — click Star to activate)`,errCatalogRepoListFailed:`Failed to load installed repositories: {error}`,errCatalogRepoInstallFailed:`Failed to install repository: {error}`,errCatalogRepoUninstallFailed:`Failed to uninstall repository: {error}`,errCatalogRepoInvalidUrl:`Enter a GitHub repository URL.`},pluginManageRoles:{heading:`Custom Roles`,roleCount:`{count} role | {count} roles`,addButton:`+ Add`,createPanel:`Create new role`,fieldId:`ID`,fieldName:`Name`,fieldIcon:`Icon`,fieldPrompt:`Prompt`,fieldPlugins:`Plugins`,fieldModel:`Model`,modelUnset:`(unset — follow the app-wide setting)`,modelHelp:`Sessions started with this role run on this model. Useful for keeping a routine role off your top model's weekly limit. Built-in roles always follow the app-wide setting.`,fieldStarterQueries:`Starter queries`,onePerLine:`(one per line)`,helpLink:`?`,idFormatted:`({id})`,missingEnv:`(missing {env})`,requiresEnv:`Requires {env} in .env`,collapse:`Collapse`,expand:`Expand`,idPlaceholder:`unique-id`,creating:`Creating…`,create:`Create`,updating:`Updating…`,update:`Update`,cancel:`Cancel`,delete:`Delete`,emptyHint:`No custom roles yet. Click "+ Add" or ask Claude to create one.`,errIdRequired:`ID is required.`,errIdInvalid:`ID may only contain letters, numbers, '-' and '_'.`,errNameRequired:`Name is required.`,errIdDuplicate:`A role with ID '{id}' already exists.`,errCreateFailed:`Create failed`,errSaveFailed:`Save failed`,errDeleteFailed:`Delete failed`,errNetworkError:`Network error`,errServerError:`Server error: {status}`,errRefreshFailed:`Saved, but the list failed to refresh.`,confirmDelete:`Delete the role "{name}"? This cannot be undone.`},pluginUiImage:{promptLabel:`{label}:`},markdownCodeCopy:{copyLabel:`Copy code`,copiedLabel:`Copied`},markdownMermaid:{loadFailed:`⚠ Mermaid failed to load: {error}`,renderFailed:`⚠ Mermaid render failed: {error}`},pluginTextResponse:{pdf:`PDF`,pdfFailed:`⚠ PDF failed`,editContent:`Edit Text Content`,applyChanges:`Apply Changes`,copyLabel:`Copy`,speakerSystem:`System`,speakerUser:`You`,speakerAssistant:`Assistant`,copiedLabel:`Copied!`,cancel:`Cancel`,seededByPlugin:`from {pkg}`,seededByPluginTooltip:`This message was seeded by the {pkg} plugin, not sent by you.`,truncatedForRender:`This message is unusually long ({total} chars total). Only the first portion is rendered — {omitted} chars hidden to keep the tab responsive. Use Copy for the full raw text.`},pluginSkill:{noDescription:`(no description)`},pluginSpreadsheet:{previewUntitled:`Spreadsheet`,previewSheets:`{count} sheet | {count} sheets`,untitled:`Spreadsheet`,excel:`Excel`,valuePlaceholder:`Value`,valueOrFormulaPlaceholder:`Value or Formula (e.g., 100 or SUM(B2:B11))`,formatPlaceholder:`Format (e.g., $#,##0.00)`,loading:`Loading spreadsheet...`,noData:`No spreadsheet data available`,editData:`Edit Spreadsheet Data`,applyChanges:`Apply Changes`,dataMustBeArray:`Data must be an array of sheets`,loadFailed:`Failed to load spreadsheet: {error}`,invalidJsonAlert:`Invalid JSON format: {error}`,unknownError:`Unknown error`,update:`Update`,stringType:`String`,formulaType:`Formula`},app:{startConversation:`Start a conversation`,thinking:`Thinking…`},suggestionsPanel:{suggestions:`Suggestions`,skills:`Skills`,tooltip:`Suggestions and Skills`,emptySuggestions:`No suggestions.`,emptySkills:`No skills installed.`,skillsError:`Failed to load skills: {error}`,sendEditHint:`click to send · shift+click to edit`},settingsToolsTab:{explanation:`Extra tool names to pass to Claude via {allowedTools}. One per line. Useful for built-in Claude Code MCP servers like Gmail / Google Calendar after you have authenticated via {claudeMcp}.`,connectorsSectionTitle:`Connected connectors`,connectorsEmpty:`No connectors found.`,connectorConnected:`Connected`,connectorDisconnected:`Not connected`,connectorsGuide:`Connectors like Slack and Gmail let Claude access your accounts. Add or remove connectors from Claude Desktop, or configure them {configLink}. (Opens claude.ai)`,connectorsConfigLinkText:`here`},confirmModal:{defaultTitle:`Confirm`,defaultConfirm:`Confirm`,defaultCancel:`Cancel`}},Plt={common:{downloadZip:`ZIP`,downloadFailed:`ダウンロードに失敗しました`,save:`保存`,cancel:`キャンセル`,loading:`読み込み中...`,close:`閉じる`,dismiss:`閉じる`,add:`追加`,remove:`削除`,yes:`はい`,no:`いいえ`,saving:`保存中...`,saved:`保存しました`,noResultsYet:`まだ結果はありません`,noImageYet:`画像はまだありません`,sendChat:`新しいチャットを開始`},sessionTabBar:{newSession:`新しいセッション`,activeSessions:`{count} 件のアクティブセッション(エージェント実行中)`,unreadReplies:`{count} 件の未読返信`,unreadDot:`新しい返信`,origin:{scheduler:`スケジューラから開始`,skill:`スキルから開始`,bridge:`ブリッジから開始`}},chatInput:{placeholder:`Claude にメッセージ…`,send:`送信`,stop:`停止`,runningPlaceholder:`実行中… Enter で後で送るキューに追加`,removeBuffered:`キューのメッセージを削除`,attachFile:`ファイルを添付`,fileTooLarge:`ファイルが大きすぎます({sizeMB} MB)。上限は 30 MB です。`,fileOnlyAttachment:`内容は読み込めません(ファイルとして渡します)`,readFileFailed:`ファイルを読み込めませんでした。`,attachImageFailed:`画像の添付に失敗しました: {error}`,stopFailed:`処理の停止に失敗しました: {error}`,dropHint:`ファイルをドロップして添付`,tooManyFiles:`一度に添付できるのは {max} 件までです。`,removeAttachment:`{name} を削除`,attachmentFallbackName:`添付ファイル`,voice:{start:`音声入力を開始`,stop:`音声入力を停止`}},cspViolation:{notice:`⚠ ビューが {host} を読み込もうとしましたが、コンテンツセキュリティポリシー({directive})でブロックされました。許可するには config/csp.json にこのホストを追加してください(信頼できる場合のみ)。`,dismiss:`閉じる`},sessionHistoryPanel:{filters:{all:`すべて`,unread:`未読`,bookmarked:`ブックマーク`,longRunning:`長期 (24h+)`,human:`手動`,scheduler:`スケジューラ`,skill:`スキル`,bridge:`ブリッジ`},failedToRefresh:`⚠ 更新に失敗: {error}`,showingLastKnown:` — 前回取得の一覧を表示しています。`,noSessions:`セッションはまだありません。`,noMatching:`該当するセッションはありません。`,running:`実行中`,noMessages:`(メッセージなし)`,openRowAria:`セッションを開く: {preview}`,rowMenuAria:`セッションの操作`,bookmark:`ブックマーク`,unbookmark:`ブックマーク解除`,delete:`削除`,deleteConfirm:`このセッションを削除しますか?
|
|
223
223
|
|
|
224
224
|
{preview}
|
|
225
225
|
|
|
226
|
-
この操作は取り消せません。`},notificationBell:{notifications:`通知`,activeSection:`アクティブ`,historySection:`履歴`,noActive:`アクティブな通知はありません`,noHistory:`最近のアクティビティはありません`,clearAll:`すべてクリア`,dismiss:`閉じる`,cancel:`キャンセル`,showMore:`もっと見る ({count})`,showLess:`閉じる`,openTarget:`開く`,expandDetails:`詳細を展開`},pluginDiagnostics:{title:`プラグイン設定の問題`,hostBody:`プラグイン「{plugin}」が {label} キー「{key}」を登録しようとしましたが、ホスト予約のため拒否されました。プラグインのエントリは破棄されました。`,intraBody:`プラグイン「{first}」と「{second}」が同じ {dimension}「{key}」を登録しています。「{first}」が先に確保したため、「{second}」の登録は無視されます。`},shadowedEnv:{title:`シェルの環境変数が .env を上書きしています`,body:`シェルと .env の両方に設定されています: {keys}。シェル側の値が使われるため .env は無視されます。.env を編集した場合は、シェル側の値を更新するか解除して再起動してください。`},optionalDeps:{title:`任意の依存コマンドを利用できません`,titleNotFound:`{command} がインストールされていません`,titleNotResponding:`{command} が起動していません`,notFound:`{command} がインストールされていないため、関連機能を停止しています。{command} をインストールしてから MulmoClaude を再起動してください。`,notResponding:`{command} が起動していないため、関連機能を停止しています。{command} を起動してから MulmoClaude を再起動してください。`},billingMigration:{title:`請求書機能はオンデマンド設定に移行しました`,body:`同梱されていた clients・worklog・invoice・profile のコレクションはダッシュボードから削除されましたが、データは安全でそのまま保持されています。クライアントと作業時間の記録、続いて請求書の設定を依頼すると再作成され、既存のレコードが再び表示されます。`},backendOffline:{title:`バックエンドに接続できません`,body:`MulmoClaude サーバが起動していない可能性があります。dev サーバを確認してから再試行してください。`,retry:`再試行`},pluginErrorBoundary:{title:`プラグイン {pkg} がクラッシュしました`,subtitle:`プラグインのレンダリングに失敗しました。エラーはコンソールに記録されています。`,showDetails:`詳細を表示`,hideDetails:`詳細を隠す`,retry:`再試行`},remoteHostOffline:{title:`リモートホストが切断されました`,body:`再接続するまで、スマホからの送信はこの端末に届きません。`,reconnect:`再接続`},authTokenStale:{title:`ページの再読み込みが必要です`,body:`サーバーがこのページのトークンを拒否し、新しいトークンを取得できませんでした。続けるには再読み込みしてください。`,reload:`再読み込み`},remoteHost:{title:`リモートホスト`,online:`リモートホスト: オンライン`,offline:`リモートホスト: オフライン`,uid:`uid {uid}`,signIn:`Google でサインイン`,connecting:`接続中…`,disconnect:`切断`,disconnecting:`切断中…`,noToken:`Google サインインで idToken が取得できませんでした`,connectFailed:`接続に失敗しました`,disconnectFailed:`切断に失敗しました`,signInFailed:`Google サインインに失敗しました`,statusFailed:`状態の取得に失敗しました`,description:`リモートアクセスを有効にすると、モバイルデバイスからこの MulmoClaude のコレクションとフィードに接続できます。`,howTo:`モバイルから {url} を開き、同じ Google アカウントでサインインしてください。`,customViewHint:`モバイル向けのビューが必要な場合は、通常の custom view ではなく {keyword} を作るように Claude に依頼してください。`,qrHint:`スマートフォンのカメラでこの QR コードを読み取っても開けます。`},sessionModelChip:{tooltip:`このセッションが使っているモデル: {model}`,tooltipOverride:`このチャットのモデル: {model}(ロール/全体設定を上書き中)`,ariaLabel:`このチャットのモデル`,clear:`既定に戻す`,unknown:`不明`,inherited:`{model}(継承)`},sidebarHeader:{newMessages:`新着`,home:`最新のチャットに移動`,toolCallHistory:`ツール呼び出し履歴`,settings:`設定`,settingsGeminiMissing:`設定 — Gemini API キー未設定`,todayJournal:`今日のまとめ`,todayJournalNotFound:`まだまとめがありません — しばらく会話するとjournalが生成します。`,todayJournalLoadFailed:`journal の読み込みに失敗しました (status {status}): {error}`,copyMarkdown:`チャットを Markdown としてコピー`,copiedMarkdown:`コピーしました`},rightSidebar:{permalink:`選択中メッセージへのリンク`,copyPermalink:`選択中メッセージへのリンクをコピー`,copiedPermalink:`コピーしました!`,toggleSystemPrompt:`システムプロンプトの表示切替`,systemPrompt:`システムプロンプト`,availableTools:`利用可能ツール`,toggleToolDescription:`ツール説明の表示切替`,toolCallHistory:`ツール呼び出し履歴`,copyHistory:`ツール呼び出し履歴をコピー`,copiedHistory:`コピーしました!`,noToolCalls:`ツール呼び出しはまだありません`,arguments:`引数`,error:`エラー`,result:`結果`,running:`実行中...`,mcpHint:{title:e=>`${e.named(`server`)} のセットアップヒント`,requiredKeys:`必要なキー`,setupGuide:`セットアップガイドを開く`}},fileTreePane:{sort:`並び順:`,sortByName:`名前順`,name:`名前`,sortByRecent:`更新日順(新しい順)`,recent:`最近`,reference:`参照`,readOnlyBadge:`RO`,showSystemFiles:`システムファイルを表示`,showSystemFilesTitle:`エージェント内部の top-level ディレクトリ (conversations/ や feeds/ など) をユーザーデータ (data/ artifacts/ config/) と合わせて表示します。`},fileTree:{dropHint:`ここにファイルをドロップするとこのフォルダに保存されます`,upload:{progress:`アップロード中 {done}/{total}…`,done:`{count} 件のファイルを保存しました`,failed:`{count} 件のファイルを保存できませんでした`},workspace:`(ワークスペース)`,recentlyChanged:`最近変更されました`,newFileMenuItem:`新規ファイル`,newFileInputAria:`新規ファイル名`,newFilePlaceholder:{wikiPage:`ページのスラッグ`,summary:`サマリー名`,document:`ドキュメント名`,html:`ページ名`,story:`ストーリー名`},newFileError:{empty:`ファイル名を入力してください。`,unsafe:`ファイル名に使用できない文字が含まれています。`,exists:`{filename} は既に存在します。`,saveFailed:`ファイルを作成できませんでした。もう一度お試しください。`}},lockStatusPopup:{sandboxEnabledTooltip:`サンドボックス有効 (Docker)`,noSandboxTooltip:`サンドボックスなし (Docker 未検出)`,sandboxEnabledLabel:`サンドボックス有効:`,sandboxEnabledBody:`Docker が動作中です。ファイルシステムアクセスは隔離されています。`,noSandboxLabel:`サンドボックスなし:`,noSandboxBodyPrefix:`Claude はこのマシンの全ファイルにアクセスできます。`,noSandboxBodySuffix:`をインストールしてファイルシステムを隔離してください。`,dockerDesktop:`Docker Desktop`,hostCredentials:`ホスト認証情報の接続状況:`,credsLoading:`読み込み中…`,sshAgent:`SSH エージェント:`,forwarded:`転送中`,notForwarded:`転送なし`,mountedConfigs:`マウント設定:`,none:`なし`,testIsolation:`サンドボックス隔離をテスト:`},settingsModal:{title:`設定`,version:`MulmoClaude v{version}`,tabs:{gemini:`Gemini API キー`,tools:`許可ツール`,mcp:`MCP サーバ`,dirs:`ディレクトリ`,refs:`参照ディレクトリ`,map:`地図`,photos:`写真`,google:`Google`,model:`モデル`,voice:`音声`,chatIndex:`チャットインデックス`,journal:`ジャーナル`,notifications:`Web Push`,skills:`スキル`,roles:`ロール`,quit:`終了`},groups:{llm:`LLM`,servers:`サーバ`,workspace:`ワークスペース`,notifications:`通知`,plugins:`プラグイン`,management:`管理`,server:`サーバー`},navAriaLabel:`設定セクション`,googleTab:{description:`Google アカウントを連携すると、このマシンから Google API(まずはカレンダー)を直接呼び出せます。リフレッシュトークンはこのマシンにのみ保存され、Google 以外には送信されません。`,statusLinked:`連携済み`,statusNotLinked:`未連携`,statusPending:`ブラウザでの同意完了を待っています…`,connect:`Google アカウントを連携`,unlink:`連携を解除`,unlinkConfirm:`Google アカウントの連携を解除しますか?保存済みトークンは無効化され、このマシンから削除されます。`,clientSecretAmbiguous:`~/.secrets/ に client_secret_*.json が複数見つかりました。保存済みトークンと OAuth クライアントの組み合わせがずれないよう、1つだけ残してください。`,loadError:`Google 連携状態の取得に失敗しました。`,connectError:`Google 認可フローの開始に失敗しました。`,unlinkError:`Google 連携の解除に失敗しました。`},geminiTab:{required:`画像生成には {envKey} が必要です。下の欄に貼り付けて保存してください。`,apiKeyLabel:`Gemini API キー`,apiKeyPlaceholder:`AIza…`,helperText:`{studioLink} でキーを作成するか、既存のキーをコピーしてください。`,storageNote:`このマシンにだけ、ワークスペースの外に保存します。読めるのは本人だけです。保存した時点で有効になり、再起動は要りません。`,storedHere:`このアプリに保存済み`,storedInEnvironment:`環境変数から読み込み中`,notConfigured:`未設定`,clear:`消去`,fromEnvironment:`いまのキーは、アプリを起動したシェルか {envFile} から来ています。ここで保存すると、そちらより優先されます。`,loadError:`キーの状態を読み込めませんでした`,saveError:`キーを保存できませんでした`,clearError:`キーを消去できませんでした`},mapTab:{description:`地図プラグインで使う Google Maps API キーを設定します。キーはローカルに保存され、Google Maps への通信以外で送信されることはありません。`,apiKeyLabel:`Google Maps API キー`,apiKeyPlaceholder:`AIza…`,helperText:`{consoleLink} でキーを作成またはコピーしてください。`,requiredApis:`有効化が必要な API: Maps JavaScript API / Geocoding API / Places API (New) / Directions API`,configured:`設定済み`,notConfigured:`未設定`,clear:`クリア`,loadError:`設定の読み込みに失敗しました`,saveError:`保存に失敗しました`},photosTab:{description:`チャットや bridge 経由で受け取った写真のプライバシー設定。EXIF の位置情報は機微なため、自動取得を停止したい場合はチェックを外してください。`,autoCaptureLabel:`写真の位置情報を自動取得`,autoCaptureHint:`ON のとき、EXIF に GPS を持つ画像をアップロードすると data/locations/ に sidecar が自動生成されます。OFF にすると自動取得は停止しますが、必要なときに LLM が手動で EXIF を読むことは可能です。`,statusOn:`自動取得は ON`,statusOff:`自動取得は OFF`,loadError:`設定の読み込みに失敗しました`,saveError:`保存に失敗しました`},quitTab:{description:`このマシンで動いている MulmoClaude サーバーを終了します。アイコンから起動した場合、このタブを閉じてもサーバーは動き続けます。ターミナルを使わずに止める手段がここです。`,restartHint:()=>"もう一度起動するには、MulmoClaude のアイコンをダブルクリックしてください(または `npx mulmoclaude@latest`)。",quitLabel:`MulmoClaude を終了`,confirmBody:`サーバーが停止し、このページは動かなくなります。実行中の処理は中断されます。`,confirmLabel:`終了する`,stopping:`終了しています…`,stoppedTitle:`MulmoClaude を終了しました`,stoppedBody:`このタブは閉じて構いません。もう一度使うにはアイコンをダブルクリックしてください。`,error:`サーバーの終了に失敗しました`},notificationsTab:{description:`ここで開始したタスクが完了したときに、登録済みのデバイスへプッシュ通知を送ります。質問して席を外し、答えができた瞬間を知りたいときに便利です。`,enableLabel:`タスク完了時に Web Push を送る`,enableHint:`ここで開始したチャットが完了したときに発火します。スケジュール実行やバックグラウンドのタスクでは発火しません。`,remoteHostNote:`RemoteHost 接続(サインインを供給)と、登録済みデバイスが1台以上必要です。どちらかが欠けている場合は何も起きません。`,macosRemindersLabel:`タスク完了時に macOS のリマインダーを作成する`,macosRemindersHint:`完了したタスクを既定のリマインダーリストに追加します。iCloud 同期が iPhone に反映し、そこで通知が届きます。`,macosRemindersForcedOff:`起動時に --disable-macos-reminders または DISABLE_MACOS_REMINDER_NOTIFICATIONS で無効化されています。フラグを外すか環境変数を解除して再起動すると、ここから操作できます。`,statusOn:`Web Push は ON`,statusOff:`Web Push は OFF`,loadError:`設定の読み込みに失敗しました`,saveError:`保存に失敗しました`},modelTab:{description:`Claude Code が各ターンで使うモデルと推論 effort を設定します。未設定の場合は Claude 側の解決に従います。`,modelLabel:`モデル`,modelUnset:`(未設定 — ~/.claude/settings.json に従う)`,modelHelperText:`未設定のときは ~/.claude/settings.json のモデルが使われます。このファイルは VS Code や Cursor の Claude Code 拡張が /model の選択を保存する先でもあるため、そちらで切り替えると MulmoClaude のモデルも変わります。エイリアスは各ファミリーの最新世代に追随します。`,modelConfigured:`モデル: {model}`,modelNotConfigured:`未設定 (共有設定に従う)`,effortLabel:`推論 effort`,effortUnset:`(未設定 — Claude のデフォルトを使用)`,helperText:`高いレベルほど思考時間が長くなりますが、レイテンシとトークン消費も増えます。`,configured:`Effort: {level}`,notConfigured:`未設定`,userSettingsLabel:`Claude Code のユーザー設定とプラグインを読み込む`,userSettingsHint:`~/.claude にある、Claude Code と共通のスキル・プラグイン・フックを読み込みます。インストールしたプラグインのスキルが多く、毎回の依頼が重くなるときはオフにしてください。ワークスペースのスキルはそのまま使えます。次のメッセージから反映されます。オフのときは、モデルが未設定でも ~/.claude/settings.json のモデル指定は使われません。`,skillListingSummary:`前回のターンで読み込まれたスキル: {count} 個。`,skillListingPlugins:`プラグイン: {plugins}。`,skillListingHeavy:`スキルが多いため、毎回の依頼が重くなっています。オフにすると ~/.claude の分が外れます。`,loadError:`設定の読み込みに失敗しました`,saveError:`保存に失敗しました`},voiceTab:{description:`チャットメッセージを音声で入力できます。音声は MulmoClaude を実行しているマシン上でローカルに文字起こしされ、外部サービスには一切送信されません。`,requirements:`macOS でのみ利用できます。whisper.cpp サーバーが必要です。yarn build:whisper でビルドしてください(README の Local Voice Input セクションを参照)。`,unsupported:`音声入力には whisper.cpp サーバーがインストールされた macOS が必要です。このマシンでは利用できません。`,enableLabel:`音声入力を有効にする`,enableHint:`オンにすると音声モデル(1〜3 GB)を一度だけダウンロードします。その後、チャット入力欄にマイクボタンが表示されます。`,modelLabel:`音声モデル`,downloading:`モデルをダウンロード中… {percent}%`,ready:`モデルの準備が完了しました`,downloadError:`モデルのダウンロードに失敗しました。`,retry:`再試行`,loadError:`設定の読み込みに失敗しました`,saveError:`保存に失敗しました`},chatIndexTab:{description:`チャット履歴の AI タイトル/サマリー自動生成の設定です。デフォルトは off で、自動化系のセッション(scheduler / system worker)は on にしても常に除外されます。人間のセッションのみターン終了時に 1 回要約が走ります。`,modeLabel:`チャットインデックスのモデル`,helperText:`Haiku は安価。Sonnet は長く話題が移るセッションでタイトル品質が高くなります。`,mode:{off:`オフ`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`インデックス作成: オフ`,haiku:`Haiku でインデックス作成中`,sonnet:`Sonnet でインデックス作成中`},loadError:`設定の読み込みに失敗しました`,saveError:`保存に失敗しました`},journalTab:{description:`ジャーナル日次パスの設定です。最近のチャットセッションを journal/*.md に要約し、恒久メモリ(memory.md)を抽出します。デフォルトは off。自動化系セッション(scheduler / system worker)はこの設定に関わらず常に除外されます。`,modeLabel:`ジャーナルのモデル`,helperText:`Haiku は安価。Sonnet は日次/トピックまとめの質が高くなります。毎時のパスはここが on の時のみ実行されます。`,mode:{off:`オフ`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`ジャーナル: オフ`,haiku:`Haiku でジャーナル実行中`,sonnet:`Sonnet でジャーナル実行中`},loadError:`設定の読み込みに失敗しました`,saveError:`保存に失敗しました`},geminiAskButton:`Claude に質問`,geminiAskMessage:`このアプリにおける Gemini API キーの役割は何ですか?`,toolNamesLabel:`ツール名`,invalidToolNamesPrefix:`次の項目は標準的ではないようです(期待される接頭辞`,invalidToolNamesSuffix:`):`,mcpToolsError:`⚠ MCP ツール状態の取得に失敗しました: {error}。有効/無効にかかわらず全ツールを表示しています。`,changesHint:`次回のメッセージから反映されます。再起動は不要です。`,cannotSaveTooltip:`設定の読み込みに成功するまで保存できません`,saving:`保存中…`,loadingLabel:`読み込み中…`,unsavedMarker:`●`,unsavedToolsConfirm:`許可ツールに未保存の変更があります。閉じてもよろしいですか?`,unsavedMcpDraftConfirm:`MCP サーバーの下書きが残っています。閉じてもよろしいですか?`,mcpSaveFailed:`MCP サーバーの変更を保存できませんでした。`},canvasViewToggle:{stackViewTooltip:`スタック表示・クリックで Single に切替`,singleViewTooltip:`Single 表示・クリックで Stack に切替`,switchToSingle:`Single 表示に切替`,switchToStack:`Stack 表示に切替`},sessionHistoryToggle:{showTooltip:`左側にセッション履歴パネルを表示`,hideTooltip:`セッション履歴パネルを閉じる`,show:`セッション履歴を表示`,hide:`セッション履歴を閉じる`},sessionHistoryExpand:{expandTooltip:`セッション履歴パネルを全画面表示`,collapseTooltip:`セッション履歴パネルを元のサイズに戻す`,expand:`セッション履歴を拡大`,collapse:`セッション履歴を縮小`},settingsWorkspaceDirs:{explanation:`{dataDir} および {artifactsDir} 配下でファイルを整理するためのカスタムディレクトリ。Claude がファイル保存先を振り分けるために使用します。`,noEntries:`カスタムディレクトリは未設定です。`,addDirTitle:`ディレクトリを追加`,pathPlaceholder:`data/clients または artifacts/reports`,descPlaceholder:`説明(このフォルダに入れるもの)`,errPathRequired:`パスを入力してください`,errMustStartWith:`data/ または artifacts/ で始める必要があります`,errAlreadyExists:`既に登録されています`},settingsReferenceDirs:{explanation:`Claude が読み取れるが変更できない外部ディレクトリ。Docker モードでは読み取り専用でマウントされます。Obsidian vault、プロジェクトコード、ドキュメントフォルダなどの参照に便利です。`,noEntries:`参照ディレクトリは未設定です。`,addDirTitle:`参照ディレクトリを追加`,pathPlaceholder:`/Users/me/ObsidianVault または ~/Documents/notes`,labelPlaceholder:`ラベル(省略時はフォルダ名)`,readOnlyBadge:`読み取り専用`,errPathRequired:`パスを入力してください`,errMustBeAbsolute:`絶対パスまたは ~/ で始まる必要があります`,errAlreadyExists:`既に登録されています`,errLabelConflict:`ラベル「{label}」は既に使用されています`},dashboard:{empty:`お気に入りのコレクションはまだありません。`,emptyHint:`コレクションをピン留め(★)するとここに表示されます。`,viewTable:`テーブル`,viewCalendar:`カレンダー`,viewKanban:`カンバン`,viewPickerLabel:`表示を選択`,openFull:`ダブルクリックで全体表示を開く`,dragHint:`ドラッグして並べ替え`,resizeHint:`ドラッグして高さを変更`},pluginLauncher:{chat:{label:`チャット`},dashboard:{label:`ダッシュボード`},automations:{label:`自動化`},wiki:{label:`Wiki`},collections:{label:`コレクション`},feeds:{label:`フィード`},accounting:{label:`会計`},files:{label:`ファイル`}},shortcuts:{pin:`ランチャーに固定`,unpin:`ランチャーから外す`,zoneAriaLabel:`固定したショートカット`,reorder:{open:`ショートカットを並び替え`,title:`並び替え`,moveUp:`上へ`,moveDown:`下へ`}},fileContentHeader:{showRendered:`レンダリング表示`,showRaw:`ソース表示`,rendered:`レンダリング`,raw:`ソース`,closeFile:`ファイルを閉じる`,revealInOs:`ファイルの場所を開く`,revealInOsFailed:`フォルダを開けませんでした`},fileContentRenderer:{download:`ZIP`,downloadZip:`自己完結zipでダウンロード(アセット同梱)`,downloadError:`ダウンロードに失敗しました`,selectFile:`ファイルを選択してください`,htmlPreview:`HTML プレビュー`,pdfPreview:`PDF プレビュー`,parseError:`パースエラー`,editJson:`JSON を編集`,jsonEditorLabel:`JSON エディタ`,invalidJson:`不正な JSON`,undo:`元に戻す`,redo:`やり直し`,editMarp:`スライドソースを編集`,marpEditorLabel:`Marp スライドソース`,openInOs:`OS で開く`,openingInOs:`開いています…`,openInOsFailed:`OS で開けませんでした`,downloadFile:`ダウンロード`,downloadingFile:`ダウンロード中…`},filesView:{chatPlaceholder:`このファイルについて質問…`},systemFiles:{schemaLabel:`スキーマ`,showDetails:`詳細を表示`,hideDetails:`詳細を隠す`,editPolicy:{"agent-managed-but-hand-editable":`エージェント管理(手動編集可)`,"user-editable":`ユーザー編集可`,"agent-managed":`エージェント管理`,"fragile-format":`壊れやすい書式`,ephemeral:`一時ファイル`},mcp:{title:`MCP サーバ`,summary:`エージェントに接続される外部の Model Context Protocol サーバ。HTTP / stdio サーバを追加してツールを拡張できます。`},settings:{title:`アプリ設定`,summary:`ユーザー編集可能な動作設定 — Gemini API キー、許可ツール、サンドボックス設定など。`},schedulerTasks:{title:`スケジューラタスク`,summary:`定期実行されるエージェント自動化。Automations UI から管理し、このファイルがディスク上の正本です。`},schedulerOverrides:{title:`スケジューラオーバーライド`,summary:`システム既定スケジュールに上書きするタスクごとの時刻 / 間隔の上書き。会話で「このタスクの時刻を変えて」と頼むとエージェントが書き換えます。`},schedulerItems:{title:`スケジューラアイテムキュー`,summary:`発火待ちの予約済み実行キュー。エージェント管理 — 各フィールドの意味を理解していなければ手動編集しないでください。`},wikiIndex:{title:`Wiki インデックス`,summary:`全 Wiki ページの自動生成インデックス。Wiki 編集ごとに更新されます — 手動編集すると上書きされます。`},wikiLog:{title:`Wiki 編集ログ`,summary:`Wiki ページ作成・編集の活動ログ。エージェント管理の追記専用 — 直近変更フィードとして便利です。`},wikiSummary:{title:`Wiki サマリ`,summary:`Wiki の自動生成概要 — トピッククラスタ、ページ数、最近の活動。エージェントが定期的に更新します。`},wikiSchema:{title:`Wiki スキーマ`,summary:`Wiki ページの一貫性を保つためにエージェントが参照する書式仕様。壊れやすい — 特定の構造を期待するため、エージェント主導の編集を推奨します。`},memory:{title:`メモリ`,summary:`新しい会話のコンテキストとして常に読み込まれる、あなたに関する蒸留された事実。journal の抽出器が自動追記し、手動編集も可能です。`},summariesIndex:{title:`サマリインデックス`,summary:`journal が生成する日次・トピックサマリへのリンク集。エージェント管理 — journal 実行ごとに更新されます。`},rolesJson:{title:`ロール定義 (JSON)`,summary:`ロール設定 — モデル選択、MCP サーバ、利用可能プラグイン、クエリ候補。ユーザー編集可、再起動不要。`},rolesMd:{title:`ロール説明 (Markdown)`,summary:`ロールのペルソナとシステムプロンプト本文。このロール選択時にコンテキストとして読み込まれます。次のメッセージから反映されます。`},journalDaily:{title:`日次 journal まとめ`,summary:`1日分のあなたの活動を、journal パスがチャットセッションから蒸留して自動生成した要約です。`},journalTopic:{title:`トピック journal`,summary:`1つの特定トピックに関する長期的なメモ。話題が継続するたびに蓄積・更新されます。エージェント管理。`}},settingsMcpTab:{explanation:`外部 MCP サーバを追加します。HTTP サーバはすべてのモードで動作します。Stdio サーバはサンドボックスイメージの {npx} / {node} / {tsx} を使用します。Docker 有効時はパスはワークスペース内である必要があります。`,localhostRewrite:`Docker モードでは {localhost} は {hostDockerInternal} に書き換えられます。`,noServers:`MCP サーバは未設定です。`,enabled:`有効`,urlLabel:`URL:`,commandLabel:`コマンド:`,dockerStdioUnsupported:`⚠ Docker サンドボックス有効時は起動しません。`,dockerStdioHostExecActive:`⚠ ホストで実行されます — このサーバーは Docker サンドボックスの外で動作します。`,dockerStdioHostExecOptIn:`それでもホストで実行する(上級者向け)。このサーバーはローカル HTTP ゲートウェイ経由で Docker サンドボックスの外で動作し、マシンにアクセスできます。`,learnMore:`詳細`,addServerButton:`+ MCP サーバを追加`,nameLabel:`名前`,namePlaceholder:`my-server`,typeHttp:`HTTP`,typeStdio:`Stdio (コマンド)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`コマンド`,argsLabel:`引数(1行につき1つ)`,argsPlaceholder:()=>`-y
|
|
226
|
+
この操作は取り消せません。`},notificationBell:{notifications:`通知`,activeSection:`アクティブ`,historySection:`履歴`,noActive:`アクティブな通知はありません`,noHistory:`最近のアクティビティはありません`,clearAll:`すべてクリア`,dismiss:`閉じる`,cancel:`キャンセル`,showMore:`もっと見る ({count})`,showLess:`閉じる`,openTarget:`開く`,expandDetails:`詳細を展開`},pluginDiagnostics:{title:`プラグイン設定の問題`,hostBody:`プラグイン「{plugin}」が {label} キー「{key}」を登録しようとしましたが、ホスト予約のため拒否されました。プラグインのエントリは破棄されました。`,intraBody:`プラグイン「{first}」と「{second}」が同じ {dimension}「{key}」を登録しています。「{first}」が先に確保したため、「{second}」の登録は無視されます。`},shadowedEnv:{title:`シェルの環境変数が .env を上書きしています`,body:`シェルと .env の両方に設定されています: {keys}。シェル側の値が使われるため .env は無視されます。.env を編集した場合は、シェル側の値を更新するか解除して再起動してください。`},optionalDeps:{title:`任意の依存コマンドを利用できません`,titleNotFound:`{command} がインストールされていません`,titleNotResponding:`{command} が起動していません`,notFound:`{command} がインストールされていないため、関連機能を停止しています。{command} をインストールしてから MulmoClaude を再起動してください。`,notResponding:`{command} が起動していないため、関連機能を停止しています。{command} を起動してから MulmoClaude を再起動してください。`},billingMigration:{title:`請求書機能はオンデマンド設定に移行しました`,body:`同梱されていた clients・worklog・invoice・profile のコレクションはダッシュボードから削除されましたが、データは安全でそのまま保持されています。クライアントと作業時間の記録、続いて請求書の設定を依頼すると再作成され、既存のレコードが再び表示されます。`},backendOffline:{title:`バックエンドに接続できません`,body:`MulmoClaude サーバが起動していない可能性があります。dev サーバを確認してから再試行してください。`,retry:`再試行`},pluginErrorBoundary:{title:`プラグイン {pkg} がクラッシュしました`,subtitle:`プラグインのレンダリングに失敗しました。エラーはコンソールに記録されています。`,showDetails:`詳細を表示`,hideDetails:`詳細を隠す`,retry:`再試行`},remoteHostOffline:{title:`リモートホストが切断されました`,body:`再接続するまで、スマホからの送信はこの端末に届きません。`,reconnect:`再接続`},authTokenStale:{title:`ページの再読み込みが必要です`,body:`サーバーがこのページのトークンを拒否し、新しいトークンを取得できませんでした。続けるには再読み込みしてください。`,reload:`再読み込み`},remoteHost:{title:`リモートホスト`,online:`リモートホスト: オンライン`,offline:`リモートホスト: オフライン`,uid:`uid {uid}`,signIn:`Google でサインイン`,connecting:`接続中…`,disconnect:`切断`,disconnecting:`切断中…`,noToken:`Google サインインで idToken が取得できませんでした`,connectFailed:`接続に失敗しました`,disconnectFailed:`切断に失敗しました`,signInFailed:`Google サインインに失敗しました`,statusFailed:`状態の取得に失敗しました`,description:`リモートアクセスを有効にすると、モバイルデバイスからこの MulmoClaude のコレクションとフィードに接続できます。`,howTo:`モバイルから {url} を開き、同じ Google アカウントでサインインしてください。`,customViewHint:`モバイル向けのビューが必要な場合は、通常の custom view ではなく {keyword} を作るように Claude に依頼してください。`,qrHint:`スマートフォンのカメラでこの QR コードを読み取っても開けます。`},sessionModelChip:{tooltip:`このセッションが使っているモデル: {model}`,tooltipOverride:`このチャットのモデル: {model}(ロール/全体設定を上書き中)`,ariaLabel:`このチャットのモデル`,clear:`既定に戻す`,unknown:`不明`,inherited:`{model}(継承)`},sidebarHeader:{newMessages:`新着`,home:`最新のチャットに移動`,toolCallHistory:`ツール呼び出し履歴`,settings:`設定`,settingsGeminiMissing:`設定 — Gemini API キー未設定`,todayJournal:`今日のまとめ`,todayJournalNotFound:`まだまとめがありません — しばらく会話するとjournalが生成します。`,todayJournalLoadFailed:`journal の読み込みに失敗しました (status {status}): {error}`,copyMarkdown:`チャットを Markdown としてコピー`,copiedMarkdown:`コピーしました`},rightSidebar:{permalink:`選択中メッセージへのリンク`,copyPermalink:`選択中メッセージへのリンクをコピー`,copiedPermalink:`コピーしました!`,toggleSystemPrompt:`システムプロンプトの表示切替`,systemPrompt:`システムプロンプト`,availableTools:`利用可能ツール`,toggleToolDescription:`ツール説明の表示切替`,toolCallHistory:`ツール呼び出し履歴`,copyHistory:`ツール呼び出し履歴をコピー`,copiedHistory:`コピーしました!`,noToolCalls:`ツール呼び出しはまだありません`,arguments:`引数`,error:`エラー`,result:`結果`,running:`実行中...`,mcpHint:{title:e=>`${e.named(`server`)} のセットアップヒント`,requiredKeys:`必要なキー`,setupGuide:`セットアップガイドを開く`}},fileTreePane:{sort:`並び順:`,sortByName:`名前順`,name:`名前`,sortByRecent:`更新日順(新しい順)`,recent:`最近`,reference:`参照`,readOnlyBadge:`RO`,showSystemFiles:`システムファイルを表示`,showSystemFilesTitle:`エージェント内部の top-level ディレクトリ (conversations/ や feeds/ など) をユーザーデータ (data/ artifacts/ config/) と合わせて表示します。`},fileTree:{dropHint:`ここにファイルをドロップするとこのフォルダに保存されます`,upload:{progress:`アップロード中 {done}/{total}…`,done:`{count} 件のファイルを保存しました`,failed:`{count} 件のファイルを保存できませんでした`},workspace:`(ワークスペース)`,recentlyChanged:`最近変更されました`,newFileMenuItem:`新規ファイル`,newFileInputAria:`新規ファイル名`,newFilePlaceholder:{wikiPage:`ページのスラッグ`,summary:`サマリー名`,document:`ドキュメント名`,html:`ページ名`,story:`ストーリー名`},newFileError:{empty:`ファイル名を入力してください。`,unsafe:`ファイル名に使用できない文字が含まれています。`,exists:`{filename} は既に存在します。`,saveFailed:`ファイルを作成できませんでした。もう一度お試しください。`}},lockStatusPopup:{sandboxEnabledTooltip:`サンドボックス有効 (Docker)`,noSandboxTooltip:`サンドボックスなし (Docker 未検出)`,sandboxEnabledLabel:`サンドボックス有効:`,sandboxEnabledBody:`Docker が動作中です。ファイルシステムアクセスは隔離されています。`,noSandboxLabel:`サンドボックスなし:`,noSandboxBodyPrefix:`Claude はこのマシンの全ファイルにアクセスできます。`,noSandboxBodySuffix:`をインストールしてファイルシステムを隔離してください。`,dockerDesktop:`Docker Desktop`,hostCredentials:`ホスト認証情報の接続状況:`,credsLoading:`読み込み中…`,sshAgent:`SSH エージェント:`,forwarded:`転送中`,notForwarded:`転送なし`,mountedConfigs:`マウント設定:`,none:`なし`,testIsolation:`サンドボックス隔離をテスト:`},settingsModal:{title:`設定`,version:`MulmoClaude v{version}`,tabs:{gemini:`Gemini API キー`,tools:`許可ツール`,mcp:`MCP サーバ`,dirs:`ディレクトリ`,refs:`参照ディレクトリ`,map:`地図`,photos:`写真`,google:`Google`,model:`モデル`,voice:`音声`,chatIndex:`チャットインデックス`,journal:`ジャーナル`,notifications:`Web Push`,skills:`スキル`,roles:`ロール`,quit:`終了`},groups:{llm:`LLM`,servers:`サーバ`,workspace:`ワークスペース`,notifications:`通知`,plugins:`プラグイン`,management:`管理`,server:`サーバー`},navAriaLabel:`設定セクション`,googleTab:{description:`Google アカウントを連携すると、このマシンから Google API(まずはカレンダー)を直接呼び出せます。リフレッシュトークンはこのマシンにのみ保存され、Google 以外には送信されません。`,statusLinked:`連携済み`,statusNotLinked:`未連携`,statusPending:`ブラウザでの同意完了を待っています…`,connect:`Google アカウントを連携`,unlink:`連携を解除`,unlinkConfirm:`Google アカウントの連携を解除しますか?保存済みトークンは無効化され、このマシンから削除されます。`,clientSecretAmbiguous:`~/.secrets/ に client_secret_*.json が複数見つかりました。保存済みトークンと OAuth クライアントの組み合わせがずれないよう、1つだけ残してください。`,loadError:`Google 連携状態の取得に失敗しました。`,connectError:`Google 認可フローの開始に失敗しました。`,unlinkError:`Google 連携の解除に失敗しました。`},geminiTab:{required:`画像生成には {envKey} が必要です。下の欄に貼り付けて保存してください。`,apiKeyLabel:`Gemini API キー`,apiKeyPlaceholder:`AIza…`,helperText:`{studioLink} でキーを作成するか、既存のキーをコピーしてください。`,storageNote:`このマシンにだけ、ワークスペースの外に保存します。読めるのは本人だけです。保存した時点で有効になり、再起動は要りません。`,storedHere:`このアプリに保存済み`,storedInEnvironment:`環境変数から読み込み中`,notConfigured:`未設定`,clear:`消去`,fromEnvironment:`いまのキーは、アプリを起動したシェルか {envFile} から来ています。ここで保存すると、そちらより優先されます。`,loadError:`キーの状態を読み込めませんでした`,saveError:`キーを保存できませんでした`,clearError:`キーを消去できませんでした`},mapTab:{description:`地図プラグインで使う Google Maps API キーを設定します。キーはローカルに保存され、Google Maps への通信以外で送信されることはありません。`,apiKeyLabel:`Google Maps API キー`,apiKeyPlaceholder:`AIza…`,helperText:`{consoleLink} でキーを作成またはコピーしてください。`,requiredApis:`有効化が必要な API: Maps JavaScript API / Geocoding API / Places API (New) / Directions API`,configured:`設定済み`,notConfigured:`未設定`,clear:`クリア`,loadError:`設定の読み込みに失敗しました`,saveError:`保存に失敗しました`},photosTab:{description:`チャットや bridge 経由で受け取った写真のプライバシー設定。EXIF の位置情報は機微なため、自動取得を停止したい場合はチェックを外してください。`,autoCaptureLabel:`写真の位置情報を自動取得`,autoCaptureHint:`ON のとき、EXIF に GPS を持つ画像をアップロードすると data/locations/ に sidecar が自動生成されます。OFF にすると自動取得は停止しますが、必要なときに LLM が手動で EXIF を読むことは可能です。`,statusOn:`自動取得は ON`,statusOff:`自動取得は OFF`,loadError:`設定の読み込みに失敗しました`,saveError:`保存に失敗しました`},quitTab:{description:`このマシンで動いている MulmoClaude サーバーを終了します。アイコンから起動した場合、このタブを閉じてもサーバーは動き続けます。ターミナルを使わずに止める手段がここです。`,restartHint:()=>"もう一度起動するには、MulmoClaude のアイコンをダブルクリックしてください(または `npx mulmoclaude@latest`)。",quitLabel:`MulmoClaude を終了`,confirmBody:`サーバーが停止し、このページは動かなくなります。実行中の処理は中断されます。`,confirmLabel:`終了する`,stopping:`終了しています…`,stoppedTitle:`MulmoClaude を終了しました`,stoppedBody:`このタブは閉じて構いません。もう一度使うにはアイコンをダブルクリックしてください。`,error:`サーバーの終了に失敗しました`},notificationsTab:{description:`ここで開始したタスクが完了したときに、登録済みのデバイスへプッシュ通知を送ります。質問して席を外し、答えができた瞬間を知りたいときに便利です。`,enableLabel:`タスク完了時に Web Push を送る`,enableHint:`ここで開始したチャットが完了したときに発火します。スケジュール実行やバックグラウンドのタスクでは発火しません。`,remoteHostNote:`RemoteHost 接続(サインインを供給)と、登録済みデバイスが1台以上必要です。どちらかが欠けている場合は何も起きません。`,macosRemindersLabel:`タスク完了時に macOS のリマインダーを作成する`,macosRemindersHint:`完了したタスクを既定のリマインダーリストに追加します。iCloud 同期が iPhone に反映し、そこで通知が届きます。`,macosRemindersForcedOff:`起動時に --disable-macos-reminders または DISABLE_MACOS_REMINDER_NOTIFICATIONS で無効化されています。フラグを外すか環境変数を解除して再起動すると、ここから操作できます。`,statusOn:`Web Push は ON`,statusOff:`Web Push は OFF`,loadError:`設定の読み込みに失敗しました`,saveError:`保存に失敗しました`},modelTab:{description:`Claude Code が各ターンで使うモデルと推論 effort を設定します。未設定の場合は Claude 側の解決に従います。`,modelLabel:`モデル`,modelUnset:`(未設定 — ~/.claude/settings.json に従う)`,modelHelperText:`未設定のときは ~/.claude/settings.json のモデルが使われます。このファイルは VS Code や Cursor の Claude Code 拡張が /model の選択を保存する先でもあるため、そちらで切り替えると MulmoClaude のモデルも変わります。エイリアスは各ファミリーの最新世代に追随します。`,modelConfigured:`モデル: {model}`,modelNotConfigured:`未設定 (共有設定に従う)`,effortLabel:`推論 effort`,effortUnset:`(未設定 — Claude のデフォルトを使用)`,helperText:`高いレベルほど思考時間が長くなりますが、レイテンシとトークン消費も増えます。`,configured:`Effort: {level}`,notConfigured:`未設定`,userSettingsLabel:`Claude Code のユーザー設定とプラグインを読み込む`,userSettingsHint:`~/.claude にある、Claude Code と共通のスキル・プラグイン・フックを読み込みます。インストールしたプラグインのスキルが多く、毎回の依頼が重くなるときはオフにしてください。ワークスペースのスキルはそのまま使えます。次のメッセージから反映されます。オフのときは、モデルが未設定でも ~/.claude/settings.json のモデル指定は使われません。`,skillListingSummary:`前回のターンで読み込まれたスキル: {count} 個。`,skillListingPlugins:`プラグイン: {plugins}。`,skillListingHeavy:`スキルが多いため、毎回の依頼が重くなっています。オフにすると ~/.claude の分が外れます。`,loadError:`設定の読み込みに失敗しました`,saveError:`保存に失敗しました`},voiceTab:{description:`チャットメッセージを音声で入力できます。音声は MulmoClaude を実行しているマシン上でローカルに文字起こしされ、外部サービスには一切送信されません。`,requirements:`macOS でのみ利用できます。whisper.cpp サーバーが必要です。yarn build:whisper でビルドしてください(README の Local Voice Input セクションを参照)。`,unsupported:`音声入力には whisper.cpp サーバーがインストールされた macOS が必要です。このマシンでは利用できません。`,enableLabel:`音声入力を有効にする`,enableHint:`オンにすると音声モデル(1〜3 GB)を一度だけダウンロードします。その後、チャット入力欄にマイクボタンが表示されます。`,modelLabel:`音声モデル`,downloading:`モデルをダウンロード中… {percent}%`,ready:`モデルの準備が完了しました`,downloadError:`モデルのダウンロードに失敗しました。`,retry:`再試行`,loadError:`設定の読み込みに失敗しました`,saveError:`保存に失敗しました`},chatIndexTab:{description:`チャット履歴の AI タイトル/サマリー自動生成の設定です。デフォルトは off で、自動化系のセッション(scheduler / system worker)は on にしても常に除外されます。人間のセッションのみターン終了時に 1 回要約が走ります。`,modeLabel:`チャットインデックスのモデル`,helperText:`Haiku は安価。Sonnet は長く話題が移るセッションでタイトル品質が高くなります。`,mode:{off:`オフ`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`インデックス作成: オフ`,haiku:`Haiku でインデックス作成中`,sonnet:`Sonnet でインデックス作成中`},loadError:`設定の読み込みに失敗しました`,saveError:`保存に失敗しました`},journalTab:{description:`ジャーナル日次パスの設定です。最近のチャットセッションを journal/*.md に要約し、恒久メモリ(memory.md)を抽出します。デフォルトは off。自動化系セッション(scheduler / system worker)はこの設定に関わらず常に除外されます。`,modeLabel:`ジャーナルのモデル`,helperText:`Haiku は安価。Sonnet は日次/トピックまとめの質が高くなります。毎時のパスはここが on の時のみ実行されます。`,mode:{off:`オフ`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`ジャーナル: オフ`,haiku:`Haiku でジャーナル実行中`,sonnet:`Sonnet でジャーナル実行中`},loadError:`設定の読み込みに失敗しました`,saveError:`保存に失敗しました`},geminiAskButton:`Claude に質問`,geminiAskMessage:`このアプリにおける Gemini API キーの役割は何ですか?`,toolNamesLabel:`ツール名`,invalidToolNamesPrefix:`次の項目は標準的ではないようです(期待される接頭辞`,invalidToolNamesSuffix:`):`,mcpToolsError:`⚠ MCP ツール状態の取得に失敗しました: {error}。有効/無効にかかわらず全ツールを表示しています。`,changesHint:`次回のメッセージから反映されます。再起動は不要です。`,cannotSaveTooltip:`設定の読み込みに成功するまで保存できません`,saving:`保存中…`,loadingLabel:`読み込み中…`,unsavedMarker:`●`,unsavedToolsConfirm:`許可ツールに未保存の変更があります。閉じてもよろしいですか?`,unsavedMcpDraftConfirm:`MCP サーバーの下書きが残っています。閉じてもよろしいですか?`,mcpSaveFailed:`MCP サーバーの変更を保存できませんでした。`},canvasViewToggle:{stackViewTooltip:`スタック表示・クリックで Single に切替`,singleViewTooltip:`Single 表示・クリックで Stack に切替`,switchToSingle:`Single 表示に切替`,switchToStack:`Stack 表示に切替`},sessionHistoryToggle:{showTooltip:`左側にセッション履歴パネルを表示`,hideTooltip:`セッション履歴パネルを閉じる`,show:`セッション履歴を表示`,hide:`セッション履歴を閉じる`},sessionHistoryExpand:{expandTooltip:`セッション履歴パネルを全画面表示`,collapseTooltip:`セッション履歴パネルを元のサイズに戻す`,expand:`セッション履歴を拡大`,collapse:`セッション履歴を縮小`},settingsWorkspaceDirs:{explanation:`{dataDir} および {artifactsDir} 配下でファイルを整理するためのカスタムディレクトリ。Claude がファイル保存先を振り分けるために使用します。`,noEntries:`カスタムディレクトリは未設定です。`,addDirTitle:`ディレクトリを追加`,pathPlaceholder:`data/clients または artifacts/reports`,descPlaceholder:`説明(このフォルダに入れるもの)`,errPathRequired:`パスを入力してください`,errMustStartWith:`data/ または artifacts/ で始める必要があります`,errAlreadyExists:`既に登録されています`},settingsReferenceDirs:{explanation:`Claude が読み取れるが変更できない外部ディレクトリ。Docker モードでは読み取り専用でマウントされます。Obsidian vault、プロジェクトコード、ドキュメントフォルダなどの参照に便利です。`,noEntries:`参照ディレクトリは未設定です。`,addDirTitle:`参照ディレクトリを追加`,pathPlaceholder:`/Users/me/ObsidianVault または ~/Documents/notes`,labelPlaceholder:`ラベル(省略時はフォルダ名)`,readOnlyBadge:`読み取り専用`,errPathRequired:`パスを入力してください`,errMustBeAbsolute:`絶対パスまたは ~/ で始まる必要があります`,errAlreadyExists:`既に登録されています`,errLabelConflict:`ラベル「{label}」は既に使用されています`},dashboard:{empty:`お気に入りのコレクションはまだありません。`,emptyHint:`コレクションをピン留め(★)するとここに表示されます。`,viewTable:`テーブル`,viewCalendar:`カレンダー`,viewKanban:`カンバン`,viewPickerLabel:`表示を選択`,openFull:`ダブルクリックで全体表示を開く`,dragHint:`ドラッグして並べ替え`,resizeHint:`ドラッグして高さを変更`},pluginLauncher:{chat:{label:`チャット`},dashboard:{label:`ダッシュボード`},automations:{label:`自動化`},wiki:{label:`Wiki`},collections:{label:`コレクション`},feeds:{label:`フィード`},accounting:{label:`会計`},files:{label:`ファイル`}},shortcuts:{pin:`ランチャーに固定`,unpin:`ランチャーから外す`,zoneAriaLabel:`固定したショートカット`,reorder:{open:`ショートカットを並び替え`,title:`並び替え`,moveUp:`上へ`,moveDown:`下へ`}},fileContentHeader:{showRendered:`レンダリング表示`,showRaw:`ソース表示`,rendered:`レンダリング`,raw:`ソース`,closeFile:`ファイルを閉じる`,revealInOs:`ファイルの場所を開く`,revealInOsFailed:`フォルダを開けませんでした`},fileContentRenderer:{download:`ZIP`,downloadZip:`自己完結zipでダウンロード(アセット同梱)`,downloadError:`ダウンロードに失敗しました`,selectFile:`ファイルを選択してください`,htmlPreview:`HTML プレビュー`,pdfPreview:`PDF プレビュー`,parseError:`パースエラー`,editJson:`JSON を編集`,jsonEditorLabel:`JSON エディタ`,invalidJson:`不正な JSON`,undo:`元に戻す`,redo:`やり直し`,editMarp:`スライドソースを編集`,marpEditorLabel:`Marp スライドソース`,openInOs:`OS で開く`,openingInOs:`開いています…`,openInOsFailed:`OS で開けませんでした`,downloadFile:`ダウンロード`,downloadingFile:`ダウンロード中…`},filesView:{chatPlaceholder:`このファイルについて質問…`},systemFiles:{schemaLabel:`スキーマ`,showDetails:`詳細を表示`,hideDetails:`詳細を隠す`,editPolicy:{"agent-managed-but-hand-editable":`エージェント管理(手動編集可)`,"user-editable":`ユーザー編集可`,"agent-managed":`エージェント管理`,"fragile-format":`壊れやすい書式`,ephemeral:`一時ファイル`},mcp:{title:`MCP サーバ`,summary:`エージェントに接続される外部の Model Context Protocol サーバ。HTTP / stdio サーバを追加してツールを拡張できます。`},settings:{title:`アプリ設定`,summary:`ユーザー編集可能な動作設定 — Gemini API キー、許可ツール、サンドボックス設定など。`},schedulerTasks:{title:`スケジューラタスク`,summary:`定期実行されるエージェント自動化。Automations UI から管理し、このファイルがディスク上の正本です。`},schedulerOverrides:{title:`スケジューラオーバーライド`,summary:`システム既定スケジュールに上書きするタスクごとの時刻 / 間隔の上書き。会話で「このタスクの時刻を変えて」と頼むとエージェントが書き換えます。`},schedulerItems:{title:`旧カレンダー項目`,summary:`削除済みのカレンダー画面の項目。アプリには表示されず、予定どおりに実行されることもありません。このファイルを読み書きするのは旧来の /api/scheduler の操作だけです。予定タスクは config/scheduler/tasks.json にあります。`},wikiIndex:{title:`Wiki インデックス`,summary:`全 Wiki ページの自動生成インデックス。Wiki 編集ごとに更新されます — 手動編集すると上書きされます。`},wikiLog:{title:`Wiki 編集ログ`,summary:`Wiki ページ作成・編集の活動ログ。エージェント管理の追記専用 — 直近変更フィードとして便利です。`},wikiSummary:{title:`Wiki サマリ`,summary:`Wiki の自動生成概要 — トピッククラスタ、ページ数、最近の活動。エージェントが定期的に更新します。`},wikiSchema:{title:`Wiki スキーマ`,summary:`Wiki ページの一貫性を保つためにエージェントが参照する書式仕様。壊れやすい — 特定の構造を期待するため、エージェント主導の編集を推奨します。`},memory:{title:`メモリ(旧ファイル)`,summary:`以前の 1 ファイル形式のメモリ。旧形式のワークスペースだけが読み込みます。現在のワークスペースは事実を conversations/memory/<type>/<topic>.md の topic ファイルに保存し、このファイルは読まないため、編集しても反映されません。`},summariesIndex:{title:`サマリインデックス`,summary:`journal が生成する日次・トピックサマリへのリンク集。エージェント管理 — journal 実行ごとに更新されます。`},rolesJson:{title:`ロール定義 (JSON)`,summary:`ロール設定 — モデル選択、MCP サーバ、利用可能プラグイン、クエリ候補。ユーザー編集可、再起動不要。`},rolesMd:{title:`ロール説明 (Markdown)`,summary:`ロールのペルソナとシステムプロンプト本文。このロール選択時にコンテキストとして読み込まれます。次のメッセージから反映されます。`},journalDaily:{title:`日次 journal まとめ`,summary:`1日分のあなたの活動を、journal パスがチャットセッションから蒸留して自動生成した要約です。`},journalTopic:{title:`トピック journal`,summary:`1つの特定トピックに関する長期的なメモ。話題が継続するたびに蓄積・更新されます。エージェント管理。`}},settingsMcpTab:{explanation:`外部 MCP サーバを追加します。HTTP サーバはすべてのモードで動作します。Stdio サーバはサンドボックスイメージの {npx} / {node} / {tsx} を使用します。Docker 有効時はパスはワークスペース内である必要があります。`,localhostRewrite:`Docker モードでは {localhost} は {hostDockerInternal} に書き換えられます。`,noServers:`MCP サーバは未設定です。`,enabled:`有効`,urlLabel:`URL:`,commandLabel:`コマンド:`,dockerStdioUnsupported:`⚠ Docker サンドボックス有効時は起動しません。`,dockerStdioHostExecActive:`⚠ ホストで実行されます — このサーバーは Docker サンドボックスの外で動作します。`,dockerStdioHostExecOptIn:`それでもホストで実行する(上級者向け)。このサーバーはローカル HTTP ゲートウェイ経由で Docker サンドボックスの外で動作し、マシンにアクセスできます。`,learnMore:`詳細`,addServerButton:`+ MCP サーバを追加`,nameLabel:`名前`,namePlaceholder:`my-server`,typeHttp:`HTTP`,typeStdio:`Stdio (コマンド)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`コマンド`,argsLabel:`引数(1行につき1つ)`,argsPlaceholder:()=>`-y
|
|
227
227
|
@modelcontextprotocol/server-filesystem
|
|
228
228
|
/workspace/path`,errNoName:`名前を入力するか、URL / 引数から推論できる値を入力してください。`,errBadName:`名前は小文字で始まり、[a-z0-9_-] のみ使用できます。`,errIdExists:`サーバ ID「{id}」は既に存在します。`,errBadHttpUrl:`HTTP URL は http:// または https:// で始める必要があります`,pendingEntryWarning:`保留中の MCP サーバ設定を確定またはキャンセルしてください。`,customHeading:`カスタムサーバ`,catalog:{heading:`登録済み MCP サーバ`,audience:{general:`🟢 一般用途`,developer:`🔵 開発者向け`},risk:{low:`低`,medium:`中`,high:`高`},upstream:`📦 ソース`,setupGuide:`📚 セットアップ`,entry:{memory:{displayName:`メモリ`,description:`セッションを跨いで会話の内容を覚えます。`},sequentialThinking:{displayName:`順序立てた思考`,description:`複雑な問題を段階的に考える支援。`},context7:{displayName:`Context7(ライブラリドキュメント)`,description:`主要ライブラリの最新ドキュメントを取得 — モデルの学習データ時点を超える情報源。`},deepwiki:{displayName:`DeepWiki(GitHub リポジトリ Wiki)`,description:`GitHub リポジトリについて質問すると、Wiki スタイルの構造化された回答が返ります。`},notion:{displayName:`Notion`,description:`Notion ワークスペースを読み書き — ページ・データベース・検索に対応。`,field:{apiKey:{label:`Notion インテグレーショントークン`,help:`Notion インテグレーションを作成し Internal Integration Secret をコピーしてください。🔑 でインテグレーション設定ページを開けます。`}}},slack:{displayName:`Slack`,description:`Slack ワークスペースのチャンネル一覧、メッセージ送信、履歴検索。`,field:{botToken:{label:`Bot トークン`,help:`Slack App → OAuth & Permissions → Bot User OAuth Token。xoxb- で始まります。`},teamId:{label:`チーム / ワークスペース ID`,help:`team.info を呼び出すかワークスペース URL から確認 — T01ABC23DEF のような形式です。`}}},googleMaps:{displayName:`Google Maps`,description:`場所の検索、ルート案内、位置情報の詳細取得。`,field:{apiKey:{label:`Google Maps API キー`,help:`Google Cloud Console → APIs & Services → Credentials → API キー作成。Places + Directions を有効化してください。`}}},appleNative:{displayName:`Apple ネイティブアプリ(macOS)`,description:`AppleScript 経由で リマインダー / カレンダー / メモ / メール / マップ を読み書き。macOS 限定 — 認証情報不要。`},gmail:{displayName:`Gmail`,description:`Gmail の読み取り・送信・ラベル付け。自身の Google Cloud プロジェクトで OAuth クライアントを発行して利用(アプリ審査不要)。`,field:{credentials:{label:`credentials.json のパス`,help:`Google Cloud Console → APIs & Services → Credentials → OAuth クライアント ID(Desktop app)。credentials.json をダウンロードして絶対パスを貼ってください。`}}},googleCalendar:{displayName:`Google カレンダー`,description:`Google カレンダーの読み取り・予定作成。Gmail と同じ BYO 方式の credentials.json を使います。`,field:{credentials:{label:`credentials.json のパス`,help:`Gmail と同じ Google Cloud OAuth クライアントを使い回すか、Calendar 専用に別途作成してください。`}}},googleDrive:{displayName:`Google ドライブ`,description:`Google ドライブのファイル検索・読み取り。BYO Google OAuth credentials を使い、リフレッシュトークンはローカルに保存されます。`,field:{credentials:{label:`credentials.json のパス`,help:`Google Cloud Console → APIs & Services → Credentials → OAuth クライアント ID(Desktop app)。同じプロジェクトで Google Drive API を有効化してください。`}}},github:{displayName:`GitHub`,description:"Personal Access Token でリポジトリ / Issue / PR / 検索にアクセス。スコープは絞ってください — 書き込み権限(`repo` 等)を渡すとアクセス可能な全リポジトリに push できてしまいます。",field:{token:{label:`Personal Access Token`,help:`GitHub → Settings → Developer settings → Personal access tokens。エージェントに触らせたいリポジトリだけ指定する fine-grained token を推奨。`}}},linear:{displayName:`Linear`,description:`Personal API key で Linear の Issue / プロジェクト / サイクルを読み書き。`,field:{apiKey:{label:`Linear API キー`,help:`Linear → Settings → API → Personal API keys。🔑 から発行ページを開き Create key を押してください。`}}},weatherOpenMeteo:{displayName:`天気予報(Open-Meteo)`,description:`世界各地の天気予報と現在の気象情報 — API キー不要で無料利用可能。`},spotify:{displayName:`Spotify`,description:`曲の検索、プレイリスト管理、再生操作。BYO Spotify Developer アプリ — Client ID のみ(PKCE フローのため Client Secret 不要)。`,field:{clientId:{label:`Client ID`,help:"Spotify Developer Dashboard → Create app、Redirect URI に http://127.0.0.1:8888/callback を設定、Client ID をコピー。その後ターミナルで一度 `SPOTIFY_CLIENT_ID=<id> npx spotify-mcp@latest auth` を実行してログイン(リフレッシュトークンは ~/.spotify-mcp/tokens.json にキャッシュ)。"}}},youtubeTranscript:{displayName:`YouTube 字幕`,description:`公開 YouTube 動画の URL から字幕を取得。認証情報不要。`}},config:{howToGet:`取得方法`,install:`インストール`,errMissingRequired:`必須項目が未入力です: {fields}`,requiredMarker:`*`,requiredAria:`必須`}}},pluginScheduler:{previewIcon:`📅`,previewAutomations:`オートメーション {count} 件`,previewMore:`+ {count} 件…`},pluginSchedulerTasks:{recommendedFrequencies:`推奨頻度`,tableTaskType:`タスク種別`,tableSuggestedSchedule:`推奨スケジュール`,noTasks:`スケジュール済みタスクはありません`,runNow:`今すぐ実行`,enable:`有効化`,disable:`無効化`,delete:`削除`,nextRun:`次回: {time}`,originSystem:`システム`,originUser:`ユーザー`,originSkill:`スキル`,runFailed:`実行失敗: {error}`,toggleFailed:`切替失敗: {error}`,deleteFailed:`削除失敗: {error}`,detailsToggle:`詳細を表示`,promptLabel:`プロンプト`,roleLabel:`ロール`,confirmDelete:`タスク「{name}」を削除しますか?この操作は取り消せません。`,hintNewsRss:`ニュース / RSS 取得`,hintJournal:`日次ジャーナル処理`,hintWiki:`Wiki メンテナンス`,hintMemory:`メモリー抽出`,hintCalendar:`カレンダー / 連絡先の同期`},pluginCanvas:{undo:`元に戻す`,redo:`やり直し`,clear:`クリア`,styleLabel:`スタイル:`,stylePromptWithPath:"`{path}` の画像を {style} スタイルの画像に変換してください。",stylePromptNoPath:`キャンバスに描いた絵を {style} スタイルの画像に変換してください。`,saveFailed:`未保存`},pluginWiki:{backToIndex:`インデックスに戻る`,pdf:`PDF`,pdfFailed:`⚠ PDF 失敗`,tabIndex:`インデックス`,tabLog:`ログ`,tabLint:`Lint`,tabGraph:`グラフ`,graphEmpty:`まだグラフ化できるリンクがありません。`,linkedReferences:`リンク元`,empty:`Wiki は空です。Wiki Manager にソースの取り込みを依頼してください。`,previewMore:`+ {count} 件…`,chatPlaceholder:`このページについて質問…`,emptyPage:`「{title}」のページはまだありません。`,emptyContent:`「{title}」のページは存在しますが、内容がありません。`,createPage:`この Wiki ページの作成をお願いする`,updatePage:`この Wiki ページの更新をお願いする`,tagFilterAll:`すべて`,noMatches:`#{tag} タグのページがありません`,lintChat:`Wiki を Lint`,taskCountMismatch:`Wiki ソースと描画結果でタスク数が一致しないため、ファイル破損を避けるためトグル操作を中止しました。`,metadataCreated:`作成`,metadataUpdated:`更新`,metadataEditor:`編集者`,pageEditHeader:`Wiki編集`,snapshotExpired:`スナップショットが期限切れ — 現在のページを表示中`,snapshotLoadError:`スナップショットを読み込めませんでした — ページは存在する可能性があります。再読み込みしてください。`,pageDeleted:`ページが削除されました`,history:{tabContent:`本文`,tabHistory:`履歴`,empty:`履歴はまだありません — このページを編集すると最初のバージョンが記録されます。`,loading:`履歴を読み込み中…`,backToList:`履歴一覧に戻る`,restoreButton:`このバージョンに戻す`,restoreConfirmTitle:`このバージョンに戻しますか?`,restoreConfirmBody:`{editor} が {ts} に保存したバージョンに戻します。現在のページは置き換えられますが、既存の履歴は残ります。`,restoreConfirmAction:`戻す`,restoreConfirmCancel:`キャンセル`,restoreSuccessToast:`ページを復元しました。`,restoreFailureBanner:`復元に失敗しました: {error}`,compareCurrent:`現在のページと比較`,comparePrevious:`1つ前のバージョンと比較`,diffNoPrevious:`比較できる過去バージョンがありません。`,diffNoChanges:`このバージョンと比較対象の間に内容差分はありません。`,editorBadgeUser:`ユーザー`,editorBadgeLLM:`LLM`,editorBadgeSystem:`システム`,hiddenLines:`変更なし {count} 行を非表示`,expandHidden:`表示`}},pluginPresentForm:{fallbackTitle:`フォーム`,fieldCount:`{count} 項目`,submitted:`送信済み`,errorSummary:`次のエラーを修正してください`,requiredMarker:`*`,selectOption:`選択してください`,charactersCount:`{current} / {max} 文字`,charactersCountNoMax:`{current} 文字`,submit:`送信`,progress:`必須項目 {total} 件中 {filled} 件入力済み`},pluginPresentSvg:{saveAsPng:`PNG としてダウンロード`,png:`PNG`,saveAsPdf:`PDF として保存(印刷ダイアログを開きます)`,pdf:`PDF`,untitled:`SVG 図形`,editSource:`SVG ソースを編集`,cancel:`キャンセル`,applyChanges:`変更を適用`,saving:`保存中...`,saveError:`⚠ 保存に失敗しました: {error}`,exportError:`⚠ エクスポートに失敗しました: {error}`,loadingSource:`ソースを読み込み中…`,sourceError:`ソースの読み込みに失敗しました: {error}`},photoLocations:{title:`写真の位置情報`,summary:`{total} 件取得済 · {withGps} 件 GPS あり`,mapHint:`Claude に「地図に表示して」と依頼すると、Google Map プラグインで一括表示できます。`,loading:`読み込み中…`,empty:`まだ写真の位置情報がありません。GPS タグ付きの写真をチャットまたは接続済 bridge 経由で送ると蓄積が始まります。`,noGps:`GPS データなし`},pluginManageSkills:{deleteProjectSkill:`このプロジェクト限定スキルを削除`,unstarPresetSkill:`このプリセットのスターを外す — カタログに戻る`,heading:`スキル`,previewCount:`{count} スキル`,previewMore:`他 {count} 件`,subheading:({named:e})=>`${e(`count`)} 件利用可能 · クリックで表示 · 「Run」で /<name> として呼び出し`,emptyWithPath:`スキルが見つかりません。{path} にスキルフォルダを追加してください。`,emptySkillPath:`~/.claude/skills/`,selectHint:`左側のスキルを選択して SKILL.md を表示します。`,loading:`読み込み中…`,fieldDescription:`説明`,fieldBody:`本文 (Markdown)`,emptyBody:`(本文なし)`,btnEdit:`編集`,btnDelete:`削除`,btnUnstar:`スターを外す`,errListFailed:`スキル一覧の読み込みに失敗: {error}`,errDetailFailed:`スキルの読み込みに失敗: {error}`,errSaveFailed:`保存失敗: {error}`,errDeleteFailed:`削除に失敗しました`,confirmDelete:`スキル「{name}」を削除しますか? ~/mulmoclaude/.claude/skills/{name}/SKILL.md が削除されます。`,confirmUnstar:`「{name}」をカタログに戻しますか? アクティブから外れてプロンプトに読み込まれなくなりますが、カタログには残るのでいつでも再有効化できます。`,sectionActive:`アクティブ`,sectionCatalog:`カタログ`,sectionLegendActive:`Claude がいま使えるスキル。会話の流れで Claude が自動的に使うほか、スキル名を指定して呼び出すこともできます。{system} システム(同梱 mc-) / {project} プロジェクト(編集可。このワークスペース専用) / {user} ユーザー(~/.claude/skills/ のスキル) / {claudePlugin} プラグイン(インストール済みの Claude Code プラグイン。読み取り専用)。`,sectionLegendCatalog:`カタログ: {star} を付けるとアクティブになるスキル。アクティブから {star} を外せばカタログに戻り、Claude は使わなくなります (削除はされません)。`,catalogEmpty:`利用できるプリセットスキルがありません。`,catalogPresetHeading:`プリセット`,catalogStar:`スター`,catalogStarred:`スター済み`,sourceUserTitle:`ユーザースキル (~/.claude/skills/、全ワークスペース共通)`,sourceClaudePluginTitle:`プラグインスキル (インストール済みの Claude Code プラグイン — 読み取り専用、プラグイン側で更新)`,sourceSystemTitle:`システムスキル (同梱、mc- 接頭辞 — 読み取り専用、launcher 起動時に上書き)`,sourceProjectTitle:`プロジェクトスキル (ワークスペース直下の .claude/skills/、このワークスペースのみ)`,sourcePresetTitle:`プリセットカタログ — スターでこのワークスペースに有効化`,errCatalogListFailed:`カタログの読み込みに失敗しました: {error}`,errCatalogStarFailed:`スキルのスター追加に失敗しました: {error}`,errCatalogPreviewFailed:`スキルプレビューの読み込みに失敗しました: {error}`,catalogAddRepo:`スキルリポジトリを追加`,catalogAddRepoTitle:`スキルリポジトリを追加`,catalogRepoUrlLabel:`GitHub URL`,catalogRepoUrlPlaceholder:`https://github.com/owner/repo`,catalogRepoSubpathLabel:`サブパス(任意)`,catalogRepoSubpathPlaceholder:`skills`,catalogAddRepoSubmit:`インストール`,catalogAddRepoSuggestions:`おすすめリポジトリ`,catalogUninstallRepo:`リポジトリをアンインストール`,catalogUpdateRepo:`リポジトリを更新(最新を再取得)`,catalogRepoOpenLink:`GitHub でリポジトリを開く(新しいタブ)`,catalogUninstallConfirm:`このリポジトリをアンインストールしますか? すでに★したスキルはアクティブ一覧に残ります。`,catalogRepoInstalling:`インストール中…`,catalogRepoEmpty:`このリポジトリにスキルが見つかりません。`,sourceExternalTitle:`外部スキル(GitHub リポジトリからインストール — ★ で有効化)`,errCatalogRepoListFailed:`インストール済みリポジトリの読み込みに失敗しました: {error}`,errCatalogRepoInstallFailed:`リポジトリのインストールに失敗しました: {error}`,errCatalogRepoUninstallFailed:`リポジトリのアンインストールに失敗しました: {error}`,errCatalogRepoInvalidUrl:`GitHub リポジトリの URL を入力してください。`},pluginManageRoles:{heading:`カスタムロール`,roleCount:`{count} 件`,addButton:`+ 追加`,createPanel:`新しいロールを作成`,fieldId:`ID`,fieldName:`名前`,fieldIcon:`アイコン`,fieldPrompt:`プロンプト`,fieldPlugins:`プラグイン`,fieldModel:`モデル`,modelUnset:`(未設定 — 全体設定に従う)`,modelHelp:`このロールで始めたセッションはこのモデルで動きます。常駐のルーチンを最上位モデルの週次上限から外しておくのに使えます。組み込みロールは常に全体設定に従います。`,fieldStarterQueries:`スターター質問`,onePerLine:`(1行につき1つ)`,helpLink:`?`,idFormatted:`({id})`,missingEnv:`({env} 未設定)`,requiresEnv:`.env に {env} が必要`,collapse:`折りたたむ`,expand:`展開`,idPlaceholder:`unique-id`,creating:`作成中…`,create:`作成`,updating:`更新中…`,update:`更新`,cancel:`キャンセル`,delete:`削除`,emptyHint:`カスタムロールはまだありません。「+ 追加」をクリックするか、Claude に作成を依頼してください。`,errIdRequired:`ID を入力してください。`,errIdInvalid:`ID は英数字と '-' '_' のみ使用できます。`,errNameRequired:`名前を入力してください。`,errIdDuplicate:`ID '{id}' のロールは既に存在します。`,errCreateFailed:`作成失敗`,errSaveFailed:`保存失敗`,errDeleteFailed:`削除失敗`,errNetworkError:`ネットワークエラー`,errServerError:`サーバエラー: {status}`,errRefreshFailed:`保存しましたが、一覧の更新に失敗しました。`,confirmDelete:`ロール「{name}」を削除しますか?この操作は取り消せません。`},pluginUiImage:{promptLabel:`{label}:`},markdownCodeCopy:{copyLabel:`コードをコピー`,copiedLabel:`コピーしました`},markdownMermaid:{loadFailed:`⚠ Mermaid の読み込みに失敗しました: {error}`,renderFailed:`⚠ Mermaid の描画に失敗しました: {error}`},pluginTextResponse:{pdf:`PDF`,pdfFailed:`⚠ PDF 失敗`,editContent:`テキストを編集`,applyChanges:`変更を適用`,copyLabel:`コピー`,speakerSystem:`システム`,speakerUser:`あなた`,speakerAssistant:`アシスタント`,copiedLabel:`コピーしました!`,cancel:`キャンセル`,seededByPlugin:`{pkg} から`,seededByPluginTooltip:`このメッセージは {pkg} プラグインによって作成されたもので、あなたが送信したものではありません。`,truncatedForRender:`このメッセージは非常に長いため(全 {total} 文字)、描画のフリーズを防ぐため先頭のみ表示しています({omitted} 文字を省略)。全文はコピーボタンから取得できます。`},pluginSkill:{noDescription:`(説明なし)`},pluginSpreadsheet:{previewUntitled:`スプレッドシート`,previewSheets:`{count} シート`,untitled:`スプレッドシート`,excel:`Excel`,valuePlaceholder:`値`,valueOrFormulaPlaceholder:`値または数式(例: 100, SUM(B2:B11))`,formatPlaceholder:`書式(例: $#,##0.00)`,loading:`スプレッドシート読み込み中...`,noData:`スプレッドシートのデータがありません`,editData:`スプレッドシートデータを編集`,applyChanges:`変更を適用`,dataMustBeArray:`データはシートの配列である必要があります`,loadFailed:`スプレッドシートの読み込みに失敗: {error}`,invalidJsonAlert:`不正な JSON 形式です: {error}`,unknownError:`不明なエラー`,update:`更新`,stringType:`文字列`,formulaType:`数式`},app:{startConversation:`会話を開始してください`,thinking:`考え中…`},suggestionsPanel:{suggestions:`候補`,skills:`スキル`,tooltip:`候補とスキル`,emptySuggestions:`候補はありません。`,emptySkills:`スキルがインストールされていません。`,skillsError:`スキルの読み込みに失敗しました: {error}`,sendEditHint:`クリックで送信 · Shift+クリックで編集`},settingsToolsTab:{explanation:`{allowedTools} を介して Claude に渡す追加ツール名。1行につき1つ。Gmail / Google Calendar などの Claude Code 組み込み MCP サーバを、{claudeMcp} で認証した後に利用する場合に便利です。`,connectorsSectionTitle:`接続済みコネクタ`,connectorsEmpty:`コネクタが見つかりません。`,connectorConnected:`接続済み`,connectorDisconnected:`未接続`,connectorsGuide:`Slack や Gmail 等のコネクタで Claude がアカウントにアクセスできるようになります。追加・削除は Claude Desktop から、または、{configLink}からも設定できます。(Web 版 claude.ai に移動します)`,connectorsConfigLinkText:`こちら`},confirmModal:{defaultTitle:`確認`,defaultConfirm:`実行`,defaultCancel:`キャンセル`}},Flt={common:{downloadZip:`ZIP`,downloadFailed:`下载失败`,save:`保存`,cancel:`取消`,loading:`加载中...`,close:`关闭`,dismiss:`关闭`,add:`添加`,remove:`移除`,yes:`是`,no:`否`,saving:`保存中...`,saved:`已保存`,noResultsYet:`暂无结果`,noImageYet:`暂无图片`,sendChat:`开启新对话`},sessionTabBar:{newSession:`新建会话`,activeSessions:`{count} 个活动会话(代理运行中)`,unreadReplies:`{count} 条未读回复`,unreadDot:`新回复`,origin:{scheduler:`由调度器启动`,skill:`由技能启动`,bridge:`由桥接启动`}},chatInput:{placeholder:`向 Claude 发送消息…`,send:`发送`,stop:`停止`,runningPlaceholder:`运行中… 按 Enter 加入队列`,removeBuffered:`移除排队的消息`,attachFile:`附加文件`,fileTooLarge:`文件过大({sizeMB} MB)。上限为 30 MB。`,fileOnlyAttachment:`无法读取内容(以文件形式传递)`,readFileFailed:`无法读取文件。`,attachImageFailed:`附加图片失败:{error}`,stopFailed:`停止处理失败:{error}`,dropHint:`拖放文件以附加`,tooManyFiles:`一次最多可附加 {max} 个文件。`,removeAttachment:`移除 {name}`,attachmentFallbackName:`附件`,voice:{start:`开始语音输入`,stop:`停止语音输入`}},cspViolation:{notice:`⚠ 某视图尝试加载 {host},但内容安全策略已将其拦截({directive})。如需允许,请将该主机添加到 config/csp.json(仅在你信任它时)。`,dismiss:`关闭`},sessionHistoryPanel:{filters:{all:`全部`,unread:`未读`,bookmarked:`已收藏`,longRunning:`长期 (24h+)`,human:`人工`,scheduler:`调度器`,skill:`技能`,bridge:`桥接`},failedToRefresh:`⚠ 刷新失败: {error}`,showingLastKnown:` — 正在显示上一次成功加载的列表。`,noSessions:`暂无会话。`,noMatching:`没有匹配的会话。`,running:`运行中`,noMessages:`(无消息)`,openRowAria:`打开会话: {preview}`,rowMenuAria:`会话操作`,bookmark:`添加收藏`,unbookmark:`取消收藏`,delete:`删除`,deleteConfirm:`确定要删除该会话吗?
|
|
229
229
|
|
|
230
230
|
{preview}
|
|
231
231
|
|
|
232
|
-
此操作无法撤销。`},notificationBell:{notifications:`通知`,activeSection:`进行中`,historySection:`历史`,noActive:`暂无活跃通知`,noHistory:`暂无近期记录`,clearAll:`全部清除`,dismiss:`关闭`,cancel:`取消`,showMore:`显示更多 ({count})`,showLess:`收起`,openTarget:`打开`,expandDetails:`展开详情`},pluginDiagnostics:{title:`插件配置问题`,hostBody:`插件 "{plugin}" 尝试注册 {label} 键 "{key}",但该键由宿主保留。该插件条目已被丢弃。`,intraBody:`插件 "{first}" 和 "{second}" 都注册了 {dimension} "{key}"。"{first}" 先注册,因此 "{second}" 的注册被忽略。`},shadowedEnv:{title:`Shell 环境变量正在覆盖 .env`,body:`以下变量同时设置在 Shell 和 .env 中:{keys}。实际生效的是 Shell 中的值,因此 .env 被忽略。如果你修改了 .env,请更新或取消 Shell 中的值后重启。`},optionalDeps:{title:`可选依赖不可用`,titleNotFound:`未安装 {command}`,titleNotResponding:`{command} 未运行`,notFound:`未找到 {command} — 相关功能已被禁用。请安装 {command} 后重启 MulmoClaude 以启用。`,notResponding:`{command} 已安装但未运行 — 相关功能已被禁用。请启动 {command} 后重启 MulmoClaude 以启用。`},billingMigration:{title:`开票功能已改为按需设置`,body:`内置的 clients、worklog、invoice 和 profile 集合已从仪表盘中移除,但你的数据安全无损。请求设置客户与工时记录,然后设置开票,即可重新创建它们,你现有的记录会重新出现。`},backendOffline:{title:`无法连接到后端`,body:`MulmoClaude 服务器可能未运行。请检查开发服务器后再重试。`,retry:`重试`},pluginErrorBoundary:{title:`插件 {pkg} 已崩溃`,subtitle:`插件渲染失败。错误已记录到控制台。`,showDetails:`显示详情`,hideDetails:`隐藏详情`,retry:`重试`},remoteHostOffline:{title:`远程主机已断开`,body:`重新连接之前,手机将无法发送到此设备。`,reconnect:`重新连接`},authTokenStale:{title:`此页面需要重新加载`,body:`服务器拒绝了此页面的令牌,且无法获取新令牌。请重新加载以继续。`,reload:`重新加载`},remoteHost:{title:`远程主机`,online:`远程主机在线`,offline:`远程主机离线`,uid:`uid {uid}`,signIn:`使用 Google 登录`,connecting:`连接中…`,disconnect:`断开连接`,disconnecting:`断开中…`,noToken:`Google 登录未返回 idToken`,connectFailed:`连接失败`,disconnectFailed:`断开连接失败`,signInFailed:`Google 登录失败`,statusFailed:`加载状态失败`,description:`远程访问允许移动设备连接到此 MulmoClaude 的收藏与消息流。`,howTo:`在手机上打开 {url},用同一个 Google 账号登录。`,customViewHint:`如需移动端优化的视图,请让 Claude 创建 {keyword}(而不是普通的 custom view)。`,qrHint:`也可以用手机相机扫描此二维码打开。`},sessionModelChip:{tooltip:`此会话正在使用的模型:{model}`,tooltipOverride:`此对话的模型:{model}(覆盖角色/全局设置)`,ariaLabel:`此对话的模型`,clear:`恢复默认`,unknown:`未知`,inherited:`{model}(继承)`},sidebarHeader:{newMessages:`新消息`,home:`前往最新对话`,toolCallHistory:`工具调用历史`,settings:`设置`,settingsGeminiMissing:`设置 — 缺少 Gemini API 密钥`,todayJournal:`今日总结`,todayJournalNotFound:`暂无总结 — 多聊一会儿,journal 会自动生成。`,todayJournalLoadFailed:`加载 journal 失败 (status {status}): {error}`,copyMarkdown:`将对话复制为 Markdown`,copiedMarkdown:`已复制`},rightSidebar:{permalink:`选中消息的固定链接`,copyPermalink:`复制选中消息的固定链接`,copiedPermalink:`已复制!`,toggleSystemPrompt:`切换系统提示词`,systemPrompt:`系统提示词`,availableTools:`可用工具`,toggleToolDescription:`切换工具说明`,toolCallHistory:`工具调用历史`,copyHistory:`复制工具调用历史`,copiedHistory:`已复制!`,noToolCalls:`还没有工具调用`,arguments:`参数`,error:`错误`,result:`结果`,running:`运行中...`,mcpHint:{title:e=>`${e.named(`server`)} 配置提示`,requiredKeys:`必填字段`,setupGuide:`打开配置指南`}},fileTreePane:{sort:`排序:`,sortByName:`按名称排序`,name:`名称`,sortByRecent:`按修改日期排序(最新在前)`,recent:`最近`,reference:`引用`,readOnlyBadge:`RO`,showSystemFiles:`显示系统文件`,showSystemFilesTitle:`在用户内容(data/、artifacts/、config/)之外同时显示代理内部的顶层目录(conversations/、feeds/ 等)。`},fileTree:{dropHint:`将文件拖放到此处以保存到该文件夹`,upload:{progress:`正在上传 {done}/{total}…`,done:`已保存 {count} 个文件`,failed:`{count} 个文件保存失败`},workspace:`(工作区)`,recentlyChanged:`最近修改`,newFileMenuItem:`新建文件`,newFileInputAria:`新文件名`,newFilePlaceholder:{wikiPage:`页面 slug`,summary:`摘要名称`,document:`文档名称`,html:`页面名称`,story:`故事名称`},newFileError:{empty:`文件名不能为空。`,unsafe:`文件名包含无效字符。`,exists:`此处已存在名为 {filename} 的文件。`,saveFailed:`无法创建文件,请重试。`}},lockStatusPopup:{sandboxEnabledTooltip:`沙箱已启用 (Docker)`,noSandboxTooltip:`未启用沙箱 (未找到 Docker)`,sandboxEnabledLabel:`沙箱已启用:`,sandboxEnabledBody:`Docker 正在运行。文件系统访问已隔离。`,noSandboxLabel:`未启用沙箱:`,noSandboxBodyPrefix:`Claude 可以访问你计算机上的所有文件。请安装`,noSandboxBodySuffix:`以启用文件系统隔离。`,dockerDesktop:`Docker Desktop`,hostCredentials:`已附加的宿主凭据:`,credsLoading:`加载中…`,sshAgent:`SSH 代理:`,forwarded:`已转发`,notForwarded:`未转发`,mountedConfigs:`挂载的配置:`,none:`无`,testIsolation:`测试沙箱隔离:`},settingsModal:{title:`设置`,version:`MulmoClaude v{version}`,tabs:{gemini:`Gemini API 密钥`,tools:`允许的工具`,mcp:`MCP 服务器`,dirs:`目录`,refs:`引用目录`,map:`地图`,photos:`照片`,google:`Google`,model:`模型`,voice:`语音`,chatIndex:`聊天索引`,journal:`日志`,notifications:`Web Push`,skills:`技能`,roles:`角色`,quit:`退出`},groups:{llm:`LLM`,servers:`服务器`,workspace:`工作区`,notifications:`通知`,plugins:`插件`,management:`管理`,server:`服务器`},navAriaLabel:`设置分区`,googleTab:{description:`关联 Google 账号后,这台机器即可直接调用 Google API(首先是日历)。刷新令牌仅保存在本机,除 Google 外不会发送到任何服务器。`,statusLinked:`已关联`,statusNotLinked:`未关联`,statusPending:`正在等待浏览器中的授权完成…`,connect:`关联 Google 账号`,unlink:`解除关联`,unlinkConfirm:`要解除 Google 账号的关联吗?已保存的令牌将被吊销并从本机删除。`,clientSecretAmbiguous:`在 ~/.secrets/ 中找到多个 client_secret_*.json。请只保留一个,以免已保存的令牌与 OAuth 客户端不匹配。`,loadError:`获取 Google 关联状态失败。`,connectError:`启动 Google 授权流程失败。`,unlinkError:`解除 Google 关联失败。`},geminiTab:{required:`图像生成需要 {envKey}。请在下方粘贴密钥并保存。`,apiKeyLabel:`Gemini API 密钥`,apiKeyPlaceholder:`AIza…`,helperText:`在 {studioLink} 创建或复制密钥。`,storageNote:`仅保存在本机、工作区之外,且只有你能读取。保存后立即生效,无需重启。`,storedHere:`已保存在应用中`,storedInEnvironment:`来自环境变量`,notConfigured:`未配置`,clear:`清除`,fromEnvironment:`当前密钥来自启动应用的 shell 或 {envFile}。在此保存的密钥优先生效。`,loadError:`无法读取密钥状态`,saveError:`保存密钥失败`,clearError:`清除密钥失败`},mapTab:{description:`设置地图插件使用的 Google Maps API 密钥。密钥仅存储在本地,除发送到 Google Maps 外不会传输到任何地方。`,apiKeyLabel:`Google Maps API 密钥`,apiKeyPlaceholder:`AIza…`,helperText:`在 {consoleLink} 创建或复制密钥。`,requiredApis:`需要启用:Maps JavaScript API、Geocoding API、Places API (New)、Directions API。`,configured:`已配置`,notConfigured:`未配置`,clear:`清除`,loadError:`加载设置失败`,saveError:`保存失败`},photosTab:{description:`通过聊天或已连接的 bridge 收到的照片的隐私设置。EXIF 位置数据敏感 — 取消勾选可关闭自动捕获。`,autoCaptureLabel:`自动捕获照片位置数据`,autoCaptureHint:`开启时,所有带 EXIF GPS 的上传图片会在 data/locations/ 生成位置 sidecar。关闭后不再自动捕获,但 LLM 仍可在需要时手动读取 EXIF。`,statusOn:`自动捕获已开启`,statusOff:`自动捕获已关闭`,loadError:`加载设置失败`,saveError:`保存失败`},quitTab:{description:`停止本机上运行的 MulmoClaude 服务器。从图标启动时,即使关闭此标签页服务器仍会继续运行——这里就是无需终端即可停止它的入口。`,restartHint:()=>"要再次启动,请双击 MulmoClaude 图标(或运行 `npx mulmoclaude@latest`)。",quitLabel:`退出 MulmoClaude`,confirmBody:`服务器将停止,此页面将无法继续使用。正在进行的处理会被中断。`,confirmLabel:`退出`,stopping:`正在停止…`,stoppedTitle:`MulmoClaude 已停止`,stoppedBody:`可以关闭此标签页。双击图标即可重新启动。`,error:`停止服务器失败`},notificationsTab:{description:`当你在此处发起的任务完成时,向你已注册的设备发送推送通知——当你提出问题后离开、想在答案就绪的那一刻收到提醒时很有用。`,enableLabel:`任务完成时发送 Web Push`,enableHint:`在你于此处发起的对话完成时触发。定时任务和后台任务不会触发它。`,remoteHostNote:`需要 RemoteHost 连接(用于提供登录)以及至少一台已注册的设备。缺少任一项时不会有任何操作。`,macosRemindersLabel:`任务完成时创建 macOS 提醒事项`,macosRemindersHint:`将已完成的任务添加到默认的提醒事项列表。iCloud 同步会将其镜像到 iPhone,通知由此送达。`,macosRemindersForcedOff:`启动时已通过 --disable-macos-reminders 或 DISABLE_MACOS_REMINDER_NOTIFICATIONS 关闭。移除该参数或取消该环境变量后重启,即可在此处控制。`,statusOn:`Web Push 已开启`,statusOff:`Web Push 已关闭`,loadError:`加载设置失败`,saveError:`保存失败`},modelTab:{description:`设置 Claude Code 每个回合使用的模型和推理强度。留空则沿用 Claude 自身的解析结果。`,modelLabel:`模型`,modelUnset:`(未设置 — 沿用 ~/.claude/settings.json)`,modelHelperText:`未设置时模型来自 ~/.claude/settings.json。VS Code、Cursor 的 Claude Code 扩展也会把 /model 的选择写入该文件,因此在那里切换会连带改变 MulmoClaude。别名会自动跟随各系列的最新一代。`,modelConfigured:`模型:{model}`,modelNotConfigured:`未设置(共享)`,effortLabel:`推理强度`,effortUnset:`(未设置 — 使用 Claude 的默认值)`,helperText:`更高的等级会带来更多思考时间,但也会增加延迟和 token 消耗。`,configured:`推理强度:{level}`,notConfigured:`未设置`,userSettingsLabel:`加载 Claude Code 的用户设置和插件`,userSettingsHint:`读取 ~/.claude 中与 Claude Code 共用的技能、插件和钩子。如果已安装插件的技能太多、导致每次请求都很重,请关闭此项;工作区自己的技能仍可使用。从下一条消息开始生效。关闭时,即使未设置模型,也不会再使用 ~/.claude/settings.json 中的模型。`,skillListingSummary:`上一轮加载的技能:{count} 个。`,skillListingPlugins:`来自插件:{plugins}。`,skillListingHeavy:`技能太多会让每次请求都变重;关闭此项可去掉来自 ~/.claude 的技能。`,loadError:`加载设置失败`,saveError:`保存失败`},voiceTab:{description:`用语音口述聊天消息。音频在运行 MulmoClaude 的机器上本地转录,不会发送到任何外部服务。`,requirements:`仅在 macOS 上可用。需要 whisper.cpp 服务器,请使用 yarn build:whisper 进行构建(参见 README 的 Local Voice Input 部分)。`,unsupported:`语音输入需要已安装 whisper.cpp 服务器的 macOS。本机不支持此功能。`,enableLabel:`启用语音输入`,enableHint:`开启后会一次性下载语音模型(1–3 GB)。随后聊天输入框中会出现麦克风按钮。`,modelLabel:`语音模型`,downloading:`正在下载模型… {percent}%`,ready:`模型已就绪`,downloadError:`模型下载失败。`,retry:`重试`,loadError:`加载设置失败`,saveError:`保存失败`},chatIndexTab:{description:`为聊天历史自动生成 AI 标题/摘要。默认关闭。开启后自动化会话(scheduler / 系统 worker)仍会始终跳过;只有人类会话在每次轮次结束时才会调用一次摘要。`,modeLabel:`聊天索引模型`,helperText:`Haiku 更便宜;Sonnet 在长且话题多变的会话中标题更精准。`,mode:{off:`关闭`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`索引已关闭`,haiku:`使用 Haiku 建立索引中`,sonnet:`使用 Sonnet 建立索引中`},loadError:`加载设置失败`,saveError:`保存失败`},journalTab:{description:`自动化每日日志 — 将近期聊天会话摘要为 journal/*.md,并抽取持久化记忆笔记。默认关闭。自动化会话(scheduler / 系统 worker)无论此设置如何都会始终排除。`,modeLabel:`日志模型`,helperText:`Haiku 更便宜;Sonnet 生成的每日/主题摘要更丰富。仅在此设置开启时每小时的轮次才会运行。`,mode:{off:`关闭`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`日志已关闭`,haiku:`使用 Haiku 运行日志中`,sonnet:`使用 Sonnet 运行日志中`},loadError:`加载设置失败`,saveError:`保存失败`},geminiAskButton:`询问 Claude`,geminiAskMessage:`Gemini API 密钥在这个应用中起什么作用?`,toolNamesLabel:`工具名称`,invalidToolNamesPrefix:`以下工具名看起来不符合规范(预期前缀`,invalidToolNamesSuffix:`):`,mcpToolsError:`⚠ 无法获取 MCP 工具状态: {error}。无论是否启用,均显示所有工具。`,changesHint:`修改在下一次发送消息时生效,无需重启。`,cannotSaveTooltip:`设置加载失败前无法保存`,saving:`保存中…`,loadingLabel:`加载中…`,unsavedMarker:`●`,unsavedToolsConfirm:`允许的工具有未保存的更改,仍要关闭吗?`,unsavedMcpDraftConfirm:`MCP 服务器草稿尚未完成,仍要关闭吗?`,mcpSaveFailed:`保存 MCP 服务器更改失败。`},canvasViewToggle:{stackViewTooltip:`堆叠视图 · 点击切换到单一视图`,singleViewTooltip:`单一视图 · 点击切换到堆叠视图`,switchToSingle:`切换到单一视图`,switchToStack:`切换到堆叠视图`},sessionHistoryToggle:{showTooltip:`在左侧显示会话历史面板`,hideTooltip:`隐藏会话历史面板`,show:`显示会话历史`,hide:`隐藏会话历史`},sessionHistoryExpand:{expandTooltip:`将会话历史面板展开为全宽`,collapseTooltip:`收起会话历史面板`,expand:`展开会话历史`,collapse:`收起会话历史`},settingsWorkspaceDirs:{explanation:`自定义用于在 {dataDir} 和 {artifactsDir} 下组织文件的目录。Claude 会参照这些来决定文件保存路径。`,noEntries:`未配置自定义目录。`,addDirTitle:`添加目录`,pathPlaceholder:`data/clients 或 artifacts/reports`,descPlaceholder:`说明(这个文件夹里放什么)`,errPathRequired:`路径不能为空`,errMustStartWith:`必须以 data/ 或 artifacts/ 开头`,errAlreadyExists:`已存在`},settingsReferenceDirs:{explanation:`Claude 可读取但不能修改的外部目录。Docker 模式下以只读方式挂载。适合引用 Obsidian 仓库、项目代码或文档文件夹。`,noEntries:`未配置引用目录。`,addDirTitle:`添加引用目录`,pathPlaceholder:`/Users/me/ObsidianVault 或 ~/Documents/notes`,labelPlaceholder:`标签(可选 — 默认为文件夹名)`,readOnlyBadge:`只读`,errPathRequired:`路径不能为空`,errMustBeAbsolute:`必须为绝对路径或以 ~/ 开头`,errAlreadyExists:`已存在`,errLabelConflict:`标签 "{label}" 已存在`},dashboard:{empty:`暂无收藏的集合。`,emptyHint:`将集合固定(★)后会显示在这里。`,viewTable:`表格`,viewCalendar:`日历`,viewKanban:`看板`,viewPickerLabel:`选择视图`,openFull:`双击打开完整视图`,dragHint:`拖动以重新排序`,resizeHint:`拖动以调整高度`},pluginLauncher:{chat:{label:`聊天`},dashboard:{label:`仪表板`},automations:{label:`自动化`},wiki:{label:`百科`},collections:{label:`集合`},feeds:{label:`订阅源`},accounting:{label:`会计`},files:{label:`文件`}},shortcuts:{pin:`固定到启动栏`,unpin:`从启动栏取消固定`,zoneAriaLabel:`已固定的快捷方式`,reorder:{open:`重新排序快捷方式`,title:`重新排序`,moveUp:`上移`,moveDown:`下移`}},fileContentHeader:{showRendered:`显示渲染后的 Markdown`,showRaw:`显示原始源代码`,rendered:`已渲染`,raw:`原始`,closeFile:`关闭文件`,revealInOs:`在文件夹中显示`,revealInOsFailed:`无法在文件夹中显示`},fileContentRenderer:{download:`ZIP`,downloadZip:`下载为自包含 zip(含资源)`,downloadError:`下载失败`,selectFile:`请选择一个文件`,htmlPreview:`HTML 预览`,pdfPreview:`PDF 预览`,parseError:`解析错误`,editJson:`编辑 JSON`,jsonEditorLabel:`JSON 编辑器`,invalidJson:`无效的 JSON`,undo:`撤销`,redo:`重做`,editMarp:`编辑幻灯片源代码`,marpEditorLabel:`Marp 幻灯片源代码`,openInOs:`在系统中打开`,openingInOs:`正在打开…`,openInOsFailed:`无法在系统中打开`,downloadFile:`下载`,downloadingFile:`正在下载…`},filesView:{chatPlaceholder:`询问关于此文件的问题…`},systemFiles:{schemaLabel:`架构`,showDetails:`显示详情`,hideDetails:`隐藏详情`,editPolicy:{"agent-managed-but-hand-editable":`代理管理(可手动编辑)`,"user-editable":`用户可编辑`,"agent-managed":`代理管理`,"fragile-format":`脆弱格式`,ephemeral:`临时文件`},mcp:{title:`MCP 服务器`,summary:`附加到代理的外部 Model Context Protocol 服务器。添加 HTTP 或 stdio 服务器以扩展代理工具。`},settings:{title:`应用设置`,summary:`用户可编辑的行为偏好 — Gemini API 密钥、允许的工具、沙箱配置等。`},schedulerTasks:{title:`调度器任务`,summary:`按计划触发的定期代理自动化。通过 Automations UI 管理,本文件是磁盘上的权威来源。`},schedulerOverrides:{title:`调度器覆盖`,summary:`在系统调度之上叠加的每任务时间 / 间隔覆盖。当你要求修改某个定期任务的时间时,代理会写入此文件。`},schedulerItems:{title:`调度器条目队列`,summary:`等待触发的预定调用队列。代理管理;除非你清楚每个字段的含义,否则不要手动编辑。`},wikiIndex:{title:`Wiki 索引`,summary:`所有 Wiki 页面的自动生成索引。每次 Wiki 编辑后刷新;请勿手动编辑(更改会被覆盖)。`},wikiLog:{title:`Wiki 编辑日志`,summary:`Wiki 页面创建与编辑的活动日志。代理管理且仅追加;适合作为最近变更动态。`},wikiSummary:{title:`Wiki 总览`,summary:`Wiki 的自动生成概览 — 主题聚类、页面数量、近期活动。由代理刷新。`},wikiSchema:{title:`Wiki 架构`,summary:`代理用于保持 Wiki 页面一致性的格式规范。脆弱 — 代理期望特定结构,建议交由代理编辑。`},memory:{title:`记忆`,summary:`关于你的精炼事实,作为新对话的上下文始终加载。journal 提取器会自动追加,也可手动编辑。`},summariesIndex:{title:`总结索引`,summary:`可浏览的索引,链接 journal 生成的日次与主题总结。代理管理;每次 journal 运行时刷新。`},rolesJson:{title:`角色定义 (JSON)`,summary:`角色配置 — 模型选择、MCP 服务器、允许的插件、查询建议。用户可编辑,无需重启。`},rolesMd:{title:`角色描述 (Markdown)`,summary:`角色的人设与系统提示正文,激活该角色时作为上下文加载。用户可编辑,下一条消息生效。`},journalDaily:{title:`日次 journal 总结`,summary:`由 journal 流程从聊天会话中提炼出的当日活动自动生成回顾。`},journalTopic:{title:`主题 journal`,summary:`围绕某个特定主题的长期笔记,随该主题的持续讨论而累积和修订。代理管理。`}},settingsMcpTab:{explanation:`添加外部 MCP 服务器。HTTP 服务器在所有模式下都可用。Stdio 服务器使用沙箱镜像中的 {npx} / {node} / {tsx};启用 Docker 时,路径必须位于工作区内。`,localhostRewrite:`Docker 模式下 {localhost} 会被改写为 {hostDockerInternal}。`,noServers:`尚未配置 MCP 服务器。`,enabled:`已启用`,urlLabel:`URL:`,commandLabel:`命令:`,dockerStdioUnsupported:`⚠ 启用 Docker 沙箱时不会运行。`,dockerStdioHostExecActive:`⚠ 在主机上运行 — 此服务器会脱离 Docker 沙箱。`,dockerStdioHostExecOptIn:`仍在主机上运行(高级)。此服务器通过本地 HTTP 网关在 Docker 沙箱之外运行,可访问您的计算机。`,learnMore:`了解更多`,addServerButton:`+ 添加 MCP 服务器`,nameLabel:`名称`,namePlaceholder:`my-server`,typeHttp:`HTTP`,typeStdio:`Stdio(命令)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`命令`,argsLabel:`参数(每行一个)`,argsPlaceholder:()=>`-y
|
|
232
|
+
此操作无法撤销。`},notificationBell:{notifications:`通知`,activeSection:`进行中`,historySection:`历史`,noActive:`暂无活跃通知`,noHistory:`暂无近期记录`,clearAll:`全部清除`,dismiss:`关闭`,cancel:`取消`,showMore:`显示更多 ({count})`,showLess:`收起`,openTarget:`打开`,expandDetails:`展开详情`},pluginDiagnostics:{title:`插件配置问题`,hostBody:`插件 "{plugin}" 尝试注册 {label} 键 "{key}",但该键由宿主保留。该插件条目已被丢弃。`,intraBody:`插件 "{first}" 和 "{second}" 都注册了 {dimension} "{key}"。"{first}" 先注册,因此 "{second}" 的注册被忽略。`},shadowedEnv:{title:`Shell 环境变量正在覆盖 .env`,body:`以下变量同时设置在 Shell 和 .env 中:{keys}。实际生效的是 Shell 中的值,因此 .env 被忽略。如果你修改了 .env,请更新或取消 Shell 中的值后重启。`},optionalDeps:{title:`可选依赖不可用`,titleNotFound:`未安装 {command}`,titleNotResponding:`{command} 未运行`,notFound:`未找到 {command} — 相关功能已被禁用。请安装 {command} 后重启 MulmoClaude 以启用。`,notResponding:`{command} 已安装但未运行 — 相关功能已被禁用。请启动 {command} 后重启 MulmoClaude 以启用。`},billingMigration:{title:`开票功能已改为按需设置`,body:`内置的 clients、worklog、invoice 和 profile 集合已从仪表盘中移除,但你的数据安全无损。请求设置客户与工时记录,然后设置开票,即可重新创建它们,你现有的记录会重新出现。`},backendOffline:{title:`无法连接到后端`,body:`MulmoClaude 服务器可能未运行。请检查开发服务器后再重试。`,retry:`重试`},pluginErrorBoundary:{title:`插件 {pkg} 已崩溃`,subtitle:`插件渲染失败。错误已记录到控制台。`,showDetails:`显示详情`,hideDetails:`隐藏详情`,retry:`重试`},remoteHostOffline:{title:`远程主机已断开`,body:`重新连接之前,手机将无法发送到此设备。`,reconnect:`重新连接`},authTokenStale:{title:`此页面需要重新加载`,body:`服务器拒绝了此页面的令牌,且无法获取新令牌。请重新加载以继续。`,reload:`重新加载`},remoteHost:{title:`远程主机`,online:`远程主机在线`,offline:`远程主机离线`,uid:`uid {uid}`,signIn:`使用 Google 登录`,connecting:`连接中…`,disconnect:`断开连接`,disconnecting:`断开中…`,noToken:`Google 登录未返回 idToken`,connectFailed:`连接失败`,disconnectFailed:`断开连接失败`,signInFailed:`Google 登录失败`,statusFailed:`加载状态失败`,description:`远程访问允许移动设备连接到此 MulmoClaude 的收藏与消息流。`,howTo:`在手机上打开 {url},用同一个 Google 账号登录。`,customViewHint:`如需移动端优化的视图,请让 Claude 创建 {keyword}(而不是普通的 custom view)。`,qrHint:`也可以用手机相机扫描此二维码打开。`},sessionModelChip:{tooltip:`此会话正在使用的模型:{model}`,tooltipOverride:`此对话的模型:{model}(覆盖角色/全局设置)`,ariaLabel:`此对话的模型`,clear:`恢复默认`,unknown:`未知`,inherited:`{model}(继承)`},sidebarHeader:{newMessages:`新消息`,home:`前往最新对话`,toolCallHistory:`工具调用历史`,settings:`设置`,settingsGeminiMissing:`设置 — 缺少 Gemini API 密钥`,todayJournal:`今日总结`,todayJournalNotFound:`暂无总结 — 多聊一会儿,journal 会自动生成。`,todayJournalLoadFailed:`加载 journal 失败 (status {status}): {error}`,copyMarkdown:`将对话复制为 Markdown`,copiedMarkdown:`已复制`},rightSidebar:{permalink:`选中消息的固定链接`,copyPermalink:`复制选中消息的固定链接`,copiedPermalink:`已复制!`,toggleSystemPrompt:`切换系统提示词`,systemPrompt:`系统提示词`,availableTools:`可用工具`,toggleToolDescription:`切换工具说明`,toolCallHistory:`工具调用历史`,copyHistory:`复制工具调用历史`,copiedHistory:`已复制!`,noToolCalls:`还没有工具调用`,arguments:`参数`,error:`错误`,result:`结果`,running:`运行中...`,mcpHint:{title:e=>`${e.named(`server`)} 配置提示`,requiredKeys:`必填字段`,setupGuide:`打开配置指南`}},fileTreePane:{sort:`排序:`,sortByName:`按名称排序`,name:`名称`,sortByRecent:`按修改日期排序(最新在前)`,recent:`最近`,reference:`引用`,readOnlyBadge:`RO`,showSystemFiles:`显示系统文件`,showSystemFilesTitle:`在用户内容(data/、artifacts/、config/)之外同时显示代理内部的顶层目录(conversations/、feeds/ 等)。`},fileTree:{dropHint:`将文件拖放到此处以保存到该文件夹`,upload:{progress:`正在上传 {done}/{total}…`,done:`已保存 {count} 个文件`,failed:`{count} 个文件保存失败`},workspace:`(工作区)`,recentlyChanged:`最近修改`,newFileMenuItem:`新建文件`,newFileInputAria:`新文件名`,newFilePlaceholder:{wikiPage:`页面 slug`,summary:`摘要名称`,document:`文档名称`,html:`页面名称`,story:`故事名称`},newFileError:{empty:`文件名不能为空。`,unsafe:`文件名包含无效字符。`,exists:`此处已存在名为 {filename} 的文件。`,saveFailed:`无法创建文件,请重试。`}},lockStatusPopup:{sandboxEnabledTooltip:`沙箱已启用 (Docker)`,noSandboxTooltip:`未启用沙箱 (未找到 Docker)`,sandboxEnabledLabel:`沙箱已启用:`,sandboxEnabledBody:`Docker 正在运行。文件系统访问已隔离。`,noSandboxLabel:`未启用沙箱:`,noSandboxBodyPrefix:`Claude 可以访问你计算机上的所有文件。请安装`,noSandboxBodySuffix:`以启用文件系统隔离。`,dockerDesktop:`Docker Desktop`,hostCredentials:`已附加的宿主凭据:`,credsLoading:`加载中…`,sshAgent:`SSH 代理:`,forwarded:`已转发`,notForwarded:`未转发`,mountedConfigs:`挂载的配置:`,none:`无`,testIsolation:`测试沙箱隔离:`},settingsModal:{title:`设置`,version:`MulmoClaude v{version}`,tabs:{gemini:`Gemini API 密钥`,tools:`允许的工具`,mcp:`MCP 服务器`,dirs:`目录`,refs:`引用目录`,map:`地图`,photos:`照片`,google:`Google`,model:`模型`,voice:`语音`,chatIndex:`聊天索引`,journal:`日志`,notifications:`Web Push`,skills:`技能`,roles:`角色`,quit:`退出`},groups:{llm:`LLM`,servers:`服务器`,workspace:`工作区`,notifications:`通知`,plugins:`插件`,management:`管理`,server:`服务器`},navAriaLabel:`设置分区`,googleTab:{description:`关联 Google 账号后,这台机器即可直接调用 Google API(首先是日历)。刷新令牌仅保存在本机,除 Google 外不会发送到任何服务器。`,statusLinked:`已关联`,statusNotLinked:`未关联`,statusPending:`正在等待浏览器中的授权完成…`,connect:`关联 Google 账号`,unlink:`解除关联`,unlinkConfirm:`要解除 Google 账号的关联吗?已保存的令牌将被吊销并从本机删除。`,clientSecretAmbiguous:`在 ~/.secrets/ 中找到多个 client_secret_*.json。请只保留一个,以免已保存的令牌与 OAuth 客户端不匹配。`,loadError:`获取 Google 关联状态失败。`,connectError:`启动 Google 授权流程失败。`,unlinkError:`解除 Google 关联失败。`},geminiTab:{required:`图像生成需要 {envKey}。请在下方粘贴密钥并保存。`,apiKeyLabel:`Gemini API 密钥`,apiKeyPlaceholder:`AIza…`,helperText:`在 {studioLink} 创建或复制密钥。`,storageNote:`仅保存在本机、工作区之外,且只有你能读取。保存后立即生效,无需重启。`,storedHere:`已保存在应用中`,storedInEnvironment:`来自环境变量`,notConfigured:`未配置`,clear:`清除`,fromEnvironment:`当前密钥来自启动应用的 shell 或 {envFile}。在此保存的密钥优先生效。`,loadError:`无法读取密钥状态`,saveError:`保存密钥失败`,clearError:`清除密钥失败`},mapTab:{description:`设置地图插件使用的 Google Maps API 密钥。密钥仅存储在本地,除发送到 Google Maps 外不会传输到任何地方。`,apiKeyLabel:`Google Maps API 密钥`,apiKeyPlaceholder:`AIza…`,helperText:`在 {consoleLink} 创建或复制密钥。`,requiredApis:`需要启用:Maps JavaScript API、Geocoding API、Places API (New)、Directions API。`,configured:`已配置`,notConfigured:`未配置`,clear:`清除`,loadError:`加载设置失败`,saveError:`保存失败`},photosTab:{description:`通过聊天或已连接的 bridge 收到的照片的隐私设置。EXIF 位置数据敏感 — 取消勾选可关闭自动捕获。`,autoCaptureLabel:`自动捕获照片位置数据`,autoCaptureHint:`开启时,所有带 EXIF GPS 的上传图片会在 data/locations/ 生成位置 sidecar。关闭后不再自动捕获,但 LLM 仍可在需要时手动读取 EXIF。`,statusOn:`自动捕获已开启`,statusOff:`自动捕获已关闭`,loadError:`加载设置失败`,saveError:`保存失败`},quitTab:{description:`停止本机上运行的 MulmoClaude 服务器。从图标启动时,即使关闭此标签页服务器仍会继续运行——这里就是无需终端即可停止它的入口。`,restartHint:()=>"要再次启动,请双击 MulmoClaude 图标(或运行 `npx mulmoclaude@latest`)。",quitLabel:`退出 MulmoClaude`,confirmBody:`服务器将停止,此页面将无法继续使用。正在进行的处理会被中断。`,confirmLabel:`退出`,stopping:`正在停止…`,stoppedTitle:`MulmoClaude 已停止`,stoppedBody:`可以关闭此标签页。双击图标即可重新启动。`,error:`停止服务器失败`},notificationsTab:{description:`当你在此处发起的任务完成时,向你已注册的设备发送推送通知——当你提出问题后离开、想在答案就绪的那一刻收到提醒时很有用。`,enableLabel:`任务完成时发送 Web Push`,enableHint:`在你于此处发起的对话完成时触发。定时任务和后台任务不会触发它。`,remoteHostNote:`需要 RemoteHost 连接(用于提供登录)以及至少一台已注册的设备。缺少任一项时不会有任何操作。`,macosRemindersLabel:`任务完成时创建 macOS 提醒事项`,macosRemindersHint:`将已完成的任务添加到默认的提醒事项列表。iCloud 同步会将其镜像到 iPhone,通知由此送达。`,macosRemindersForcedOff:`启动时已通过 --disable-macos-reminders 或 DISABLE_MACOS_REMINDER_NOTIFICATIONS 关闭。移除该参数或取消该环境变量后重启,即可在此处控制。`,statusOn:`Web Push 已开启`,statusOff:`Web Push 已关闭`,loadError:`加载设置失败`,saveError:`保存失败`},modelTab:{description:`设置 Claude Code 每个回合使用的模型和推理强度。留空则沿用 Claude 自身的解析结果。`,modelLabel:`模型`,modelUnset:`(未设置 — 沿用 ~/.claude/settings.json)`,modelHelperText:`未设置时模型来自 ~/.claude/settings.json。VS Code、Cursor 的 Claude Code 扩展也会把 /model 的选择写入该文件,因此在那里切换会连带改变 MulmoClaude。别名会自动跟随各系列的最新一代。`,modelConfigured:`模型:{model}`,modelNotConfigured:`未设置(共享)`,effortLabel:`推理强度`,effortUnset:`(未设置 — 使用 Claude 的默认值)`,helperText:`更高的等级会带来更多思考时间,但也会增加延迟和 token 消耗。`,configured:`推理强度:{level}`,notConfigured:`未设置`,userSettingsLabel:`加载 Claude Code 的用户设置和插件`,userSettingsHint:`读取 ~/.claude 中与 Claude Code 共用的技能、插件和钩子。如果已安装插件的技能太多、导致每次请求都很重,请关闭此项;工作区自己的技能仍可使用。从下一条消息开始生效。关闭时,即使未设置模型,也不会再使用 ~/.claude/settings.json 中的模型。`,skillListingSummary:`上一轮加载的技能:{count} 个。`,skillListingPlugins:`来自插件:{plugins}。`,skillListingHeavy:`技能太多会让每次请求都变重;关闭此项可去掉来自 ~/.claude 的技能。`,loadError:`加载设置失败`,saveError:`保存失败`},voiceTab:{description:`用语音口述聊天消息。音频在运行 MulmoClaude 的机器上本地转录,不会发送到任何外部服务。`,requirements:`仅在 macOS 上可用。需要 whisper.cpp 服务器,请使用 yarn build:whisper 进行构建(参见 README 的 Local Voice Input 部分)。`,unsupported:`语音输入需要已安装 whisper.cpp 服务器的 macOS。本机不支持此功能。`,enableLabel:`启用语音输入`,enableHint:`开启后会一次性下载语音模型(1–3 GB)。随后聊天输入框中会出现麦克风按钮。`,modelLabel:`语音模型`,downloading:`正在下载模型… {percent}%`,ready:`模型已就绪`,downloadError:`模型下载失败。`,retry:`重试`,loadError:`加载设置失败`,saveError:`保存失败`},chatIndexTab:{description:`为聊天历史自动生成 AI 标题/摘要。默认关闭。开启后自动化会话(scheduler / 系统 worker)仍会始终跳过;只有人类会话在每次轮次结束时才会调用一次摘要。`,modeLabel:`聊天索引模型`,helperText:`Haiku 更便宜;Sonnet 在长且话题多变的会话中标题更精准。`,mode:{off:`关闭`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`索引已关闭`,haiku:`使用 Haiku 建立索引中`,sonnet:`使用 Sonnet 建立索引中`},loadError:`加载设置失败`,saveError:`保存失败`},journalTab:{description:`自动化每日日志 — 将近期聊天会话摘要为 journal/*.md,并抽取持久化记忆笔记。默认关闭。自动化会话(scheduler / 系统 worker)无论此设置如何都会始终排除。`,modeLabel:`日志模型`,helperText:`Haiku 更便宜;Sonnet 生成的每日/主题摘要更丰富。仅在此设置开启时每小时的轮次才会运行。`,mode:{off:`关闭`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`日志已关闭`,haiku:`使用 Haiku 运行日志中`,sonnet:`使用 Sonnet 运行日志中`},loadError:`加载设置失败`,saveError:`保存失败`},geminiAskButton:`询问 Claude`,geminiAskMessage:`Gemini API 密钥在这个应用中起什么作用?`,toolNamesLabel:`工具名称`,invalidToolNamesPrefix:`以下工具名看起来不符合规范(预期前缀`,invalidToolNamesSuffix:`):`,mcpToolsError:`⚠ 无法获取 MCP 工具状态: {error}。无论是否启用,均显示所有工具。`,changesHint:`修改在下一次发送消息时生效,无需重启。`,cannotSaveTooltip:`设置加载失败前无法保存`,saving:`保存中…`,loadingLabel:`加载中…`,unsavedMarker:`●`,unsavedToolsConfirm:`允许的工具有未保存的更改,仍要关闭吗?`,unsavedMcpDraftConfirm:`MCP 服务器草稿尚未完成,仍要关闭吗?`,mcpSaveFailed:`保存 MCP 服务器更改失败。`},canvasViewToggle:{stackViewTooltip:`堆叠视图 · 点击切换到单一视图`,singleViewTooltip:`单一视图 · 点击切换到堆叠视图`,switchToSingle:`切换到单一视图`,switchToStack:`切换到堆叠视图`},sessionHistoryToggle:{showTooltip:`在左侧显示会话历史面板`,hideTooltip:`隐藏会话历史面板`,show:`显示会话历史`,hide:`隐藏会话历史`},sessionHistoryExpand:{expandTooltip:`将会话历史面板展开为全宽`,collapseTooltip:`收起会话历史面板`,expand:`展开会话历史`,collapse:`收起会话历史`},settingsWorkspaceDirs:{explanation:`自定义用于在 {dataDir} 和 {artifactsDir} 下组织文件的目录。Claude 会参照这些来决定文件保存路径。`,noEntries:`未配置自定义目录。`,addDirTitle:`添加目录`,pathPlaceholder:`data/clients 或 artifacts/reports`,descPlaceholder:`说明(这个文件夹里放什么)`,errPathRequired:`路径不能为空`,errMustStartWith:`必须以 data/ 或 artifacts/ 开头`,errAlreadyExists:`已存在`},settingsReferenceDirs:{explanation:`Claude 可读取但不能修改的外部目录。Docker 模式下以只读方式挂载。适合引用 Obsidian 仓库、项目代码或文档文件夹。`,noEntries:`未配置引用目录。`,addDirTitle:`添加引用目录`,pathPlaceholder:`/Users/me/ObsidianVault 或 ~/Documents/notes`,labelPlaceholder:`标签(可选 — 默认为文件夹名)`,readOnlyBadge:`只读`,errPathRequired:`路径不能为空`,errMustBeAbsolute:`必须为绝对路径或以 ~/ 开头`,errAlreadyExists:`已存在`,errLabelConflict:`标签 "{label}" 已存在`},dashboard:{empty:`暂无收藏的集合。`,emptyHint:`将集合固定(★)后会显示在这里。`,viewTable:`表格`,viewCalendar:`日历`,viewKanban:`看板`,viewPickerLabel:`选择视图`,openFull:`双击打开完整视图`,dragHint:`拖动以重新排序`,resizeHint:`拖动以调整高度`},pluginLauncher:{chat:{label:`聊天`},dashboard:{label:`仪表板`},automations:{label:`自动化`},wiki:{label:`百科`},collections:{label:`集合`},feeds:{label:`订阅源`},accounting:{label:`会计`},files:{label:`文件`}},shortcuts:{pin:`固定到启动栏`,unpin:`从启动栏取消固定`,zoneAriaLabel:`已固定的快捷方式`,reorder:{open:`重新排序快捷方式`,title:`重新排序`,moveUp:`上移`,moveDown:`下移`}},fileContentHeader:{showRendered:`显示渲染后的 Markdown`,showRaw:`显示原始源代码`,rendered:`已渲染`,raw:`原始`,closeFile:`关闭文件`,revealInOs:`在文件夹中显示`,revealInOsFailed:`无法在文件夹中显示`},fileContentRenderer:{download:`ZIP`,downloadZip:`下载为自包含 zip(含资源)`,downloadError:`下载失败`,selectFile:`请选择一个文件`,htmlPreview:`HTML 预览`,pdfPreview:`PDF 预览`,parseError:`解析错误`,editJson:`编辑 JSON`,jsonEditorLabel:`JSON 编辑器`,invalidJson:`无效的 JSON`,undo:`撤销`,redo:`重做`,editMarp:`编辑幻灯片源代码`,marpEditorLabel:`Marp 幻灯片源代码`,openInOs:`在系统中打开`,openingInOs:`正在打开…`,openInOsFailed:`无法在系统中打开`,downloadFile:`下载`,downloadingFile:`正在下载…`},filesView:{chatPlaceholder:`询问关于此文件的问题…`},systemFiles:{schemaLabel:`架构`,showDetails:`显示详情`,hideDetails:`隐藏详情`,editPolicy:{"agent-managed-but-hand-editable":`代理管理(可手动编辑)`,"user-editable":`用户可编辑`,"agent-managed":`代理管理`,"fragile-format":`脆弱格式`,ephemeral:`临时文件`},mcp:{title:`MCP 服务器`,summary:`附加到代理的外部 Model Context Protocol 服务器。添加 HTTP 或 stdio 服务器以扩展代理工具。`},settings:{title:`应用设置`,summary:`用户可编辑的行为偏好 — Gemini API 密钥、允许的工具、沙箱配置等。`},schedulerTasks:{title:`调度器任务`,summary:`按计划触发的定期代理自动化。通过 Automations UI 管理,本文件是磁盘上的权威来源。`},schedulerOverrides:{title:`调度器覆盖`,summary:`在系统调度之上叠加的每任务时间 / 间隔覆盖。当你要求修改某个定期任务的时间时,代理会写入此文件。`},schedulerItems:{title:`旧日历条目`,summary:`已删除的日历视图中的条目。应用不再显示它们,也不会按计划执行它们;只有旧的 /api/scheduler 操作仍会读写此文件。计划任务位于 config/scheduler/tasks.json。`},wikiIndex:{title:`Wiki 索引`,summary:`所有 Wiki 页面的自动生成索引。每次 Wiki 编辑后刷新;请勿手动编辑(更改会被覆盖)。`},wikiLog:{title:`Wiki 编辑日志`,summary:`Wiki 页面创建与编辑的活动日志。代理管理且仅追加;适合作为最近变更动态。`},wikiSummary:{title:`Wiki 总览`,summary:`Wiki 的自动生成概览 — 主题聚类、页面数量、近期活动。由代理刷新。`},wikiSchema:{title:`Wiki 架构`,summary:`代理用于保持 Wiki 页面一致性的格式规范。脆弱 — 代理期望特定结构,建议交由代理编辑。`},memory:{title:`记忆(旧文件)`,summary:`旧的单文件记忆。只有仍使用旧格式的工作区会读取它;当前工作区把事实保存为 conversations/memory/<type>/<topic>.md 下的主题文件,并忽略此文件,因此编辑它不会生效。`},summariesIndex:{title:`总结索引`,summary:`可浏览的索引,链接 journal 生成的日次与主题总结。代理管理;每次 journal 运行时刷新。`},rolesJson:{title:`角色定义 (JSON)`,summary:`角色配置 — 模型选择、MCP 服务器、允许的插件、查询建议。用户可编辑,无需重启。`},rolesMd:{title:`角色描述 (Markdown)`,summary:`角色的人设与系统提示正文,激活该角色时作为上下文加载。用户可编辑,下一条消息生效。`},journalDaily:{title:`日次 journal 总结`,summary:`由 journal 流程从聊天会话中提炼出的当日活动自动生成回顾。`},journalTopic:{title:`主题 journal`,summary:`围绕某个特定主题的长期笔记,随该主题的持续讨论而累积和修订。代理管理。`}},settingsMcpTab:{explanation:`添加外部 MCP 服务器。HTTP 服务器在所有模式下都可用。Stdio 服务器使用沙箱镜像中的 {npx} / {node} / {tsx};启用 Docker 时,路径必须位于工作区内。`,localhostRewrite:`Docker 模式下 {localhost} 会被改写为 {hostDockerInternal}。`,noServers:`尚未配置 MCP 服务器。`,enabled:`已启用`,urlLabel:`URL:`,commandLabel:`命令:`,dockerStdioUnsupported:`⚠ 启用 Docker 沙箱时不会运行。`,dockerStdioHostExecActive:`⚠ 在主机上运行 — 此服务器会脱离 Docker 沙箱。`,dockerStdioHostExecOptIn:`仍在主机上运行(高级)。此服务器通过本地 HTTP 网关在 Docker 沙箱之外运行,可访问您的计算机。`,learnMore:`了解更多`,addServerButton:`+ 添加 MCP 服务器`,nameLabel:`名称`,namePlaceholder:`my-server`,typeHttp:`HTTP`,typeStdio:`Stdio(命令)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`命令`,argsLabel:`参数(每行一个)`,argsPlaceholder:()=>`-y
|
|
233
233
|
@modelcontextprotocol/server-filesystem
|
|
234
234
|
/workspace/path`,errNoName:`请填写名称,或输入可用于推断名称的 URL / 参数。`,errBadName:`名称必须以小写字母开头,且仅包含 [a-z0-9_-]。`,errIdExists:`服务器 id "{id}" 已存在。`,errBadHttpUrl:`HTTP URL 必须以 http:// 或 https:// 开头`,pendingEntryWarning:`请先完成或取消待处理的 MCP 服务器条目。`,customHeading:`自定义服务器`,catalog:{heading:`预设 MCP 服务器`,audience:{general:`🟢 通用`,developer:`🔵 开发者`},risk:{low:`低`,medium:`中`,high:`高`},upstream:`📦 源`,setupGuide:`📚 设置`,entry:{memory:{displayName:`记忆`,description:`让 Claude 在会话之间记住对话内容。`},sequentialThinking:{displayName:`顺序思考`,description:`帮助 Claude 一步一步地解决复杂问题。`},context7:{displayName:`Context7(库文档)`,description:`获取主流库的最新文档 — 超越模型训练截止日期的信息源。`},deepwiki:{displayName:`DeepWiki(GitHub 仓库 Wiki)`,description:`向任意 GitHub 仓库提问,获得 Wiki 风格的结构化答案。`},notion:{displayName:`Notion`,description:`读写 Notion 工作区 — 支持页面、数据库与搜索。`,field:{apiKey:{label:`Notion 集成令牌`,help:`创建一个 Notion 集成并复制 Internal Integration Secret。点击 🔑 打开集成页面。`}}},slack:{displayName:`Slack`,description:`列出频道、发送消息、搜索 Slack 工作区历史。`,field:{botToken:{label:`Bot 令牌`,help:`Slack 应用 → OAuth & Permissions → Bot User OAuth Token。以 xoxb- 开头。`},teamId:{label:`团队 / 工作区 ID`,help:`运行 team.info 或查看工作区 URL — 形如 T01ABC23DEF。`}}},googleMaps:{displayName:`Google Maps`,description:`搜索地点、查询路线、获取位置详情。`,field:{apiKey:{label:`Google Maps API 密钥`,help:`Google Cloud Console → APIs & Services → Credentials → 创建 API 密钥。启用 Places + Directions。`}}},appleNative:{displayName:`Apple 原生应用(macOS)`,description:`通过 AppleScript 读写 提醒事项 / 日历 / 备忘录 / 邮件 / 地图。仅限 macOS — 无需凭证。`},gmail:{displayName:`Gmail`,description:`读取、发送和标记 Gmail 邮件。使用您自己 Google Cloud 项目中创建的 OAuth 客户端(无需应用审核)。`,field:{credentials:{label:`credentials.json 路径`,help:`Google Cloud Console → APIs & Services → Credentials → OAuth 客户端 ID(Desktop app)。下载 credentials.json 并粘贴其绝对路径。`}}},googleCalendar:{displayName:`Google 日历`,description:`读取和创建 Google 日历事件。与 Gmail 相同的 BYO credentials.json 模式。`,field:{credentials:{label:`credentials.json 路径`,help:`可复用与 Gmail 相同的 Google Cloud OAuth 客户端,或单独创建一个仅供 Calendar 使用的客户端。`}}},googleDrive:{displayName:`Google 云端硬盘`,description:`搜索和读取 Google 云端硬盘文件。BYO Google OAuth 凭证 — 令牌缓存在本地凭证文件旁。`,field:{credentials:{label:`credentials.json 路径`,help:`Google Cloud Console → APIs & Services → Credentials → OAuth 客户端 ID(Desktop app)。在同一项目中启用 Google Drive API。`}}},github:{displayName:`GitHub`,description:"通过 Personal Access Token 读取仓库 / Issues / PRs 并执行搜索。请窄化 token 权限 — 写权限(如 `repo`)允许 agent 推送到任何可访问的仓库。",field:{token:{label:`Personal Access Token`,help:`GitHub → Settings → Developer settings → Personal access tokens。建议使用 fine-grained token 仅限于希望 agent 操作的仓库。`}}},linear:{displayName:`Linear`,description:`通过 Personal API key 读写 Linear 的 Issue / 项目 / 周期。`,field:{apiKey:{label:`Linear API 密钥`,help:`Linear → Settings → API → Personal API keys。点击 🔑 打开页面并点击 Create key。`}}},weatherOpenMeteo:{displayName:`天气(Open-Meteo)`,description:`全球免费天气预报和当前气象 — 无需 API 密钥。`},spotify:{displayName:`Spotify`,description:`搜索曲目、管理播放列表、控制播放。BYO Spotify 开发者应用 — 仅需 Client ID(PKCE 流程,不需要 Client Secret)。`,field:{clientId:{label:`Client ID`,help:"Spotify Developer Dashboard → Create app,将 Redirect URI 设为 http://127.0.0.1:8888/callback,复制 Client ID。然后在终端运行一次 `SPOTIFY_CLIENT_ID=<id> npx spotify-mcp@latest auth` 登录(刷新令牌缓存在 ~/.spotify-mcp/tokens.json)。"}}},youtubeTranscript:{displayName:`YouTube 字幕`,description:`通过 URL 获取任意公开 YouTube 视频的字幕。无需凭证。`}},config:{howToGet:`获取方式`,install:`安装`,errMissingRequired:`缺少必填字段:{fields}`,requiredMarker:`*`,requiredAria:`必填`}}},pluginScheduler:{previewIcon:`📅`,previewAutomations:`{count} 个自动化`,previewMore:`+ 还有 {count} 个…`},pluginSchedulerTasks:{recommendedFrequencies:`推荐频率`,tableTaskType:`任务类型`,tableSuggestedSchedule:`建议的计划`,noTasks:`没有计划任务`,runNow:`立即运行`,enable:`启用`,disable:`停用`,delete:`删除`,nextRun:`下次: {time}`,originSystem:`系统`,originUser:`用户`,originSkill:`技能`,runFailed:`运行失败: {error}`,toggleFailed:`切换失败: {error}`,deleteFailed:`删除失败: {error}`,detailsToggle:`显示详情`,promptLabel:`提示词`,roleLabel:`角色`,confirmDelete:`删除任务「{name}」?此操作无法撤销。`,hintNewsRss:`新闻 / RSS 抓取`,hintJournal:`每日日志处理`,hintWiki:`Wiki 维护`,hintMemory:`记忆提取`,hintCalendar:`日历 / 联系人同步`},pluginCanvas:{undo:`撤销`,redo:`重做`,clear:`清除`,styleLabel:`样式:`,stylePromptWithPath:"将 `{path}` 处的图像转换为 {style} 风格的图像。",stylePromptNoPath:`将我在画布上的绘图转换为 {style} 风格的图像。`,saveFailed:`未保存`},pluginWiki:{backToIndex:`返回目录`,pdf:`PDF`,pdfFailed:`⚠ PDF 失败`,tabIndex:`目录`,tabLog:`日志`,tabLint:`Lint`,tabGraph:`图谱`,graphEmpty:`暂无可绘制的链接。`,linkedReferences:`反向链接`,empty:`Wiki 为空。请让 Wiki 管理器采集一个数据源。`,previewMore:`+ 还有 {count} 项…`,chatPlaceholder:`就本页提问…`,emptyPage:`页面「{title}」尚不存在。`,emptyContent:`页面「{title}」已存在,但没有内容。`,createPage:`请求创建此 Wiki 页面`,updatePage:`请求更新此 Wiki 页面`,tagFilterAll:`全部`,noMatches:`没有带 #{tag} 标签的页面`,lintChat:`检查 Wiki`,taskCountMismatch:`Wiki 源与渲染输出的任务数不一致,为避免文件损坏,已拒绝切换。`,metadataCreated:`创建`,metadataUpdated:`更新`,metadataEditor:`编辑者`,pageEditHeader:`Wiki 编辑`,snapshotExpired:`快照已过期 — 显示当前页面`,snapshotLoadError:`无法加载快照 — 页面可能仍然存在。请尝试刷新。`,pageDeleted:`页面已删除`,history:{tabContent:`正文`,tabHistory:`历史`,empty:`暂无历史记录 — 编辑此页面后,第一个版本将记录在此。`,loading:`正在加载历史…`,backToList:`返回历史列表`,restoreButton:`恢复此版本`,restoreConfirmTitle:`恢复此版本?`,restoreConfirmBody:`将页面恢复为 {editor} 于 {ts} 保存的版本。当前页面将被替换,但现有历史将保留。`,restoreConfirmAction:`恢复`,restoreConfirmCancel:`取消`,restoreSuccessToast:`页面已恢复。`,restoreFailureBanner:`恢复失败: {error}`,compareCurrent:`与当前页面比较`,comparePrevious:`与上一版本比较`,diffNoPrevious:`没有可比较的上一版本。`,diffNoChanges:`此版本与比较对象之间没有内容差异。`,editorBadgeUser:`用户`,editorBadgeLLM:`LLM`,editorBadgeSystem:`系统`,hiddenLines:`已隐藏 {count} 行未变更内容`,expandHidden:`显示`}},pluginPresentForm:{fallbackTitle:`表单`,fieldCount:`{count} 个字段`,submitted:`已提交`,errorSummary:`请修正以下错误`,requiredMarker:`*`,selectOption:`请选择`,charactersCount:`{current} / {max} 字符`,charactersCountNoMax:`{current} 字符`,submit:`提交`,progress:`已填写 {filled} / {total} 个必填字段`},pluginPresentSvg:{saveAsPng:`下载为 PNG`,png:`PNG`,saveAsPdf:`另存为 PDF(打开打印对话框)`,pdf:`PDF`,untitled:`SVG 矢量图`,editSource:`编辑 SVG 源代码`,cancel:`取消`,applyChanges:`应用更改`,saving:`保存中...`,saveError:`⚠ 保存失败:{error}`,exportError:`⚠ 导出失败:{error}`,loadingSource:`正在加载源代码…`,sourceError:`加载源代码失败:{error}`},photoLocations:{title:`照片位置信息`,summary:`{total} 张已捕获 · {withGps} 张含 GPS`,mapHint:`向 Claude 说「在地图上显示」即可使用 Google Map 插件一并标注。`,loading:`加载中…`,empty:`尚未捕获任何照片位置。通过聊天或已连接的 bridge 发送带 GPS 标签的照片即可开始累积。`,noGps:`无 GPS 数据`},pluginManageSkills:{deleteProjectSkill:`删除此项目级技能`,unstarPresetSkill:`取消收藏此预设 — 将移回目录`,heading:`技能`,previewCount:`{count} 个技能`,previewMore:`+还有 {count} 个`,subheading:({named:e})=>`${e(`count`)} 个可用 · 点击查看 · "Run" 会以 /<name> 的形式调用`,emptyWithPath:`未找到技能。请在 {path} 下添加技能文件夹。`,emptySkillPath:`~/.claude/skills/`,selectHint:`在左侧选择一个技能以查看其 SKILL.md。`,loading:`加载中…`,fieldDescription:`说明`,fieldBody:`正文 (Markdown)`,emptyBody:`(正文为空)`,btnEdit:`编辑`,btnDelete:`删除`,btnUnstar:`取消收藏`,errListFailed:`加载技能列表失败: {error}`,errDetailFailed:`加载技能详情失败: {error}`,errSaveFailed:`保存失败: {error}`,errDeleteFailed:`删除失败`,confirmDelete:`要删除技能 "{name}" 吗?将会移除 ~/mulmoclaude/.claude/skills/{name}/SKILL.md。`,confirmUnstar:`将 "{name}" 移回目录? 它将不再被载入提示词,但目录中的副本会保留 — 你可以随时重新收藏它。`,sectionActive:`活动`,sectionCatalog:`目录`,sectionLegendActive:`Claude 现在可以使用的技能。在对话过程中 Claude 会自动调用,你也可以输入技能名来调用。{system} 系统(自带 mc-) / {project} 项目(可编辑,仅此工作区) / {user} 用户(~/.claude/skills/ 中的技能) / {claudePlugin} 插件(来自已安装的 Claude Code 插件,只读)。`,sectionLegendCatalog:`目录: 标记 {star} 后会成为活动的技能。从活动中取消 {star} 会回到目录 — Claude 将不再使用 (技能不会被删除)。`,catalogEmpty:`没有可用的预设技能。`,catalogPresetHeading:`预设`,catalogStar:`收藏`,catalogStarred:`已收藏`,sourceUserTitle:`用户技能 (~/.claude/skills/,所有工作区通用)`,sourceClaudePluginTitle:`插件技能 (已安装的 Claude Code 插件 — 只读,由插件更新)`,sourceSystemTitle:`系统技能 (随附,mc- 前缀 — 只读,启动器启动时覆盖)`,sourceProjectTitle:`项目技能 (工作区的 .claude/skills/,仅当前工作区可用)`,sourcePresetTitle:`预设目录 — 点击收藏在当前工作区启用`,errCatalogListFailed:`加载目录失败: {error}`,errCatalogStarFailed:`收藏技能失败: {error}`,errCatalogPreviewFailed:`加载技能预览失败: {error}`,catalogAddRepo:`添加技能仓库`,catalogAddRepoTitle:`添加技能仓库`,catalogRepoUrlLabel:`GitHub URL`,catalogRepoUrlPlaceholder:`https://github.com/owner/repo`,catalogRepoSubpathLabel:`子路径(可选)`,catalogRepoSubpathPlaceholder:`skills`,catalogAddRepoSubmit:`安装`,catalogAddRepoSuggestions:`推荐仓库`,catalogUninstallRepo:`卸载仓库`,catalogUpdateRepo:`更新仓库(重新获取最新)`,catalogRepoOpenLink:`在 GitHub 打开仓库(新标签页)`,catalogUninstallConfirm:`卸载此仓库?已加星的技能仍保留在活动列表中。`,catalogRepoInstalling:`安装中…`,catalogRepoEmpty:`此仓库中未找到技能。`,sourceExternalTitle:`外部技能(从 GitHub 仓库安装 — 点击星标以激活)`,errCatalogRepoListFailed:`加载已安装仓库失败:{error}`,errCatalogRepoInstallFailed:`安装仓库失败:{error}`,errCatalogRepoUninstallFailed:`卸载仓库失败:{error}`,errCatalogRepoInvalidUrl:`请输入 GitHub 仓库 URL。`},pluginManageRoles:{heading:`自定义角色`,roleCount:`{count} 个角色`,addButton:`+ 添加`,createPanel:`创建新角色`,fieldId:`ID`,fieldName:`名称`,fieldIcon:`图标`,fieldPrompt:`提示词`,fieldPlugins:`插件`,fieldModel:`模型`,modelUnset:`(未设置 — 沿用全局设置)`,modelHelp:`以此角色开始的会话将使用该模型。适合让常驻的例行角色避开顶级模型的每周上限。内置角色始终沿用全局设置。`,fieldStarterQueries:`启动提问`,onePerLine:`(每行一个)`,helpLink:`?`,idFormatted:`({id})`,missingEnv:`(缺少 {env})`,requiresEnv:`需要在 .env 中设置 {env}`,collapse:`折叠`,expand:`展开`,idPlaceholder:`unique-id`,creating:`创建中…`,create:`创建`,updating:`更新中…`,update:`更新`,cancel:`取消`,delete:`删除`,emptyHint:`还没有自定义角色。点击 "+ 添加" 或让 Claude 帮你创建一个。`,errIdRequired:`ID 不能为空。`,errIdInvalid:`ID 只能包含字母、数字、'-' 和 '_'。`,errNameRequired:`名称不能为空。`,errIdDuplicate:`已存在 ID 为 '{id}' 的角色。`,errCreateFailed:`创建失败`,errSaveFailed:`保存失败`,errDeleteFailed:`删除失败`,errNetworkError:`网络错误`,errServerError:`服务器错误: {status}`,errRefreshFailed:`已保存,但列表刷新失败。`,confirmDelete:`删除角色「{name}」?此操作无法撤销。`},pluginUiImage:{promptLabel:`{label}:`},markdownCodeCopy:{copyLabel:`复制代码`,copiedLabel:`已复制`},markdownMermaid:{loadFailed:`⚠ Mermaid 加载失败: {error}`,renderFailed:`⚠ Mermaid 渲染失败: {error}`},pluginTextResponse:{pdf:`PDF`,pdfFailed:`⚠ PDF 失败`,editContent:`编辑文本内容`,applyChanges:`应用更改`,copyLabel:`复制`,speakerSystem:`系统`,speakerUser:`你`,speakerAssistant:`助手`,copiedLabel:`已复制!`,cancel:`取消`,seededByPlugin:`来自 {pkg}`,seededByPluginTooltip:`此消息由 {pkg} 插件生成,并非您发送。`,truncatedForRender:`该消息异常长(共 {total} 个字符)。为保持标签页响应,仅渲染开头部分 — 隐藏了 {omitted} 个字符。使用复制按钮获取完整原文。`},pluginSkill:{noDescription:`(无描述)`},pluginSpreadsheet:{previewUntitled:`电子表格`,previewSheets:`{count} 个工作表`,untitled:`电子表格`,excel:`Excel`,valuePlaceholder:`值`,valueOrFormulaPlaceholder:`值或公式(例如 100 或 SUM(B2:B11))`,formatPlaceholder:`格式(例如 $#,##0.00)`,loading:`正在加载电子表格...`,noData:`没有可用的电子表格数据`,editData:`编辑电子表格数据`,applyChanges:`应用更改`,dataMustBeArray:`数据必须是工作表数组`,loadFailed:`加载电子表格失败: {error}`,invalidJsonAlert:`无效的 JSON 格式: {error}`,unknownError:`未知错误`,update:`更新`,stringType:`字符串`,formulaType:`公式`},app:{startConversation:`开始对话`,thinking:`思考中…`},suggestionsPanel:{suggestions:`建议`,skills:`技能`,tooltip:`建议和技能`,emptySuggestions:`没有建议。`,emptySkills:`未安装任何技能。`,skillsError:`加载技能失败:{error}`,sendEditHint:`点击发送 · shift+点击可编辑`},settingsToolsTab:{explanation:`要通过 {allowedTools} 传递给 Claude 的额外工具名。每行一个。适用于在 {claudeMcp} 完成授权后,调用 Claude Code 内置的 MCP 服务器(如 Gmail / Google 日历)。`,connectorsSectionTitle:`已连接的连接器`,connectorsEmpty:`未找到连接器。`,connectorConnected:`已连接`,connectorDisconnected:`未连接`,connectorsGuide:`Slack、Gmail 等连接器让 Claude 可以访问您的账户。请在 Claude Desktop 中添加或移除连接器,也可以在{configLink}进行配置。(将打开 claude.ai)`,connectorsConfigLinkText:`此处`},confirmModal:{defaultTitle:`确认`,defaultConfirm:`确定`,defaultCancel:`取消`}},Ilt={common:{downloadZip:`ZIP`,downloadFailed:`다운로드 실패`,save:`저장`,cancel:`취소`,loading:`불러오는 중...`,close:`닫기`,dismiss:`닫기`,add:`추가`,remove:`삭제`,yes:`예`,no:`아니오`,saving:`저장 중...`,saved:`저장됨`,noResultsYet:`아직 결과가 없습니다`,noImageYet:`아직 이미지가 없습니다`,sendChat:`새 채팅 시작`},sessionTabBar:{newSession:`새 세션`,activeSessions:`활성 세션 {count}개 (에이전트 실행 중)`,unreadReplies:`읽지 않은 답장 {count}개`,unreadDot:`새 답장`,origin:{scheduler:`스케줄러에서 시작됨`,skill:`스킬에서 시작됨`,bridge:`브리지에서 시작됨`}},chatInput:{placeholder:`Claude에게 메시지…`,send:`전송`,stop:`중지`,runningPlaceholder:`실행 중… Enter로 대기열에 추가`,removeBuffered:`대기열 메시지 제거`,attachFile:`파일 첨부`,fileTooLarge:`파일이 너무 큽니다 ({sizeMB} MB). 최대 30 MB 까지 가능합니다.`,fileOnlyAttachment:`내용을 읽을 수 없습니다 (파일로 전달됩니다)`,readFileFailed:`파일을 읽을 수 없습니다.`,attachImageFailed:`이미지를 첨부하지 못했습니다: {error}`,stopFailed:`처리를 중지하지 못했습니다: {error}`,dropHint:`파일을 놓아서 첨부`,tooManyFiles:`한 번에 최대 {max}개까지 첨부할 수 있습니다.`,removeAttachment:`{name} 제거`,attachmentFallbackName:`첨부파일`,voice:{start:`음성 입력 시작`,stop:`음성 입력 중지`}},cspViolation:{notice:`⚠ 뷰가 {host}를 불러오려 했지만 콘텐츠 보안 정책({directive})이 차단했습니다. 허용하려면 신뢰하는 경우에만 config/csp.json에 호스트를 추가하세요.`,dismiss:`닫기`},sessionHistoryPanel:{filters:{all:`전체`,unread:`읽지 않음`,bookmarked:`북마크`,longRunning:`장기 (24h+)`,human:`사람`,scheduler:`스케줄러`,skill:`스킬`,bridge:`브리지`},failedToRefresh:`⚠ 새로고침 실패: {error}`,showingLastKnown:` — 마지막으로 불러온 목록을 표시하고 있습니다.`,noSessions:`아직 세션이 없습니다.`,noMatching:`일치하는 세션이 없습니다.`,running:`실행 중`,noMessages:`(메시지 없음)`,openRowAria:`세션 열기: {preview}`,rowMenuAria:`세션 작업`,bookmark:`북마크 추가`,unbookmark:`북마크 해제`,delete:`삭제`,deleteConfirm:`이 세션을 삭제하시겠습니까?
|
|
235
235
|
|
|
236
236
|
{preview}
|
|
237
237
|
|
|
238
|
-
이 작업은 되돌릴 수 없습니다.`},notificationBell:{notifications:`알림`,activeSection:`진행 중`,historySection:`기록`,noActive:`활성 알림이 없습니다`,noHistory:`최근 활동이 없습니다`,clearAll:`모두 지우기`,dismiss:`닫기`,cancel:`취소`,showMore:`더 보기 ({count})`,showLess:`접기`,openTarget:`열기`,expandDetails:`상세 보기`},pluginDiagnostics:{title:`플러그인 구성 문제`,hostBody:`플러그인 "{plugin}"이(가) {label} 키 "{key}"을(를) 등록하려고 했으나 호스트에서 예약된 키이므로 거부되었습니다. 플러그인의 항목이 삭제되었습니다.`,intraBody:`플러그인 "{first}"과(와) "{second}"이(가) 동일한 {dimension} "{key}"을(를) 등록합니다. "{first}"이(가) 먼저 등록했으므로 "{second}"의 등록은 무시됩니다.`},shadowedEnv:{title:`셸 환경 변수가 .env를 덮어쓰고 있습니다`,body:`셸과 .env 양쪽에 모두 설정되어 있습니다: {keys}. 셸의 값이 우선하므로 .env는 무시됩니다. .env를 수정했다면 셸의 값을 갱신하거나 해제한 뒤 다시 시작하세요.`},optionalDeps:{title:`선택적 의존성을 사용할 수 없습니다`,titleNotFound:`{command}이(가) 설치되어 있지 않습니다`,titleNotResponding:`{command}이(가) 실행 중이 아닙니다`,notFound:`{command}을(를) 찾을 수 없습니다 — 관련 기능이 비활성화되었습니다. {command}을(를) 설치한 후 MulmoClaude를 재시작하면 활성화됩니다.`,notResponding:`{command}은(는) 설치되어 있지만 실행 중이 아닙니다 — 관련 기능이 비활성화되었습니다. {command}을(를) 시작한 후 MulmoClaude를 재시작하면 활성화됩니다.`},billingMigration:{title:`인보이스 기능이 온디맨드 설정으로 이동했습니다`,body:`번들로 제공되던 clients, worklog, invoice, profile 컬렉션이 대시보드에서 제거되었지만 데이터는 안전하게 그대로 유지됩니다. 클라이언트 및 작업 시간 기록을 설정한 다음 인보이스를 설정하도록 요청하면 다시 만들어지고 기존 레코드가 다시 표시됩니다.`},backendOffline:{title:`백엔드에 연결할 수 없습니다`,body:`MulmoClaude 서버가 실행 중이 아닐 수 있습니다. 개발 서버를 확인한 후 다시 시도하세요.`,retry:`다시 시도`},pluginErrorBoundary:{title:`플러그인 {pkg}이(가) 충돌했습니다`,subtitle:`플러그인 렌더링에 실패했습니다. 오류가 콘솔에 기록되었습니다.`,showDetails:`세부 정보 표시`,hideDetails:`세부 정보 숨기기`,retry:`다시 시도`},remoteHostOffline:{title:`원격 호스트 연결 끊김`,body:`다시 연결하기 전에는 휴대폰에서 이 기기로 보낼 수 없습니다.`,reconnect:`다시 연결`},authTokenStale:{title:`페이지를 새로 고쳐야 합니다`,body:`서버가 이 페이지의 토큰을 거부했고 새 토큰을 가져오지 못했습니다. 계속하려면 새로 고침하세요.`,reload:`새로 고침`},remoteHost:{title:`원격 호스트`,online:`원격 호스트 온라인`,offline:`원격 호스트 오프라인`,uid:`uid {uid}`,signIn:`Google로 로그인`,connecting:`연결 중…`,disconnect:`연결 해제`,disconnecting:`연결 해제 중…`,noToken:`Google 로그인에서 idToken을 반환하지 않았습니다`,connectFailed:`연결 실패`,disconnectFailed:`연결 해제 실패`,signInFailed:`Google 로그인 실패`,statusFailed:`상태를 불러오지 못했습니다`,description:`원격 액세스를 사용하면 모바일 기기에서 이 MulmoClaude의 컬렉션과 피드에 연결할 수 있습니다.`,howTo:`휴대폰에서 {url} 을(를) 열고 같은 Google 계정으로 로그인하세요.`,customViewHint:`모바일에 최적화된 뷰가 필요하다면, 일반 custom view가 아닌 {keyword} 를(을) 만들어 달라고 Claude에게 요청하세요.`,qrHint:`휴대폰 카메라로 이 QR 코드를 스캔해도 열 수 있습니다.`},sessionModelChip:{tooltip:`이 세션이 사용 중인 모델: {model}`,tooltipOverride:`이 대화의 모델: {model} (역할/전체 설정을 덮어씀)`,ariaLabel:`이 대화의 모델`,clear:`기본값으로 되돌리기`,unknown:`알 수 없음`,inherited:`{model} (상속)`},sidebarHeader:{newMessages:`새 메시지`,home:`최신 채팅으로 이동`,toolCallHistory:`도구 호출 기록`,settings:`설정`,settingsGeminiMissing:`설정 — Gemini API 키 없음`,todayJournal:`오늘의 요약`,todayJournalNotFound:`아직 요약이 없습니다 — 잠시 대화하면 journal이 생성합니다.`,todayJournalLoadFailed:`journal 로드에 실패했습니다 (status {status}): {error}`,copyMarkdown:`대화를 Markdown으로 복사`,copiedMarkdown:`복사됨`},rightSidebar:{permalink:`선택된 메시지의 고유 링크`,copyPermalink:`선택된 메시지의 고유 링크 복사`,copiedPermalink:`복사됨!`,toggleSystemPrompt:`시스템 프롬프트 토글`,systemPrompt:`시스템 프롬프트`,availableTools:`사용 가능한 도구`,toggleToolDescription:`도구 설명 토글`,toolCallHistory:`도구 호출 기록`,copyHistory:`도구 호출 기록 복사`,copiedHistory:`복사됨!`,noToolCalls:`아직 도구 호출이 없습니다`,arguments:`인자`,error:`오류`,result:`결과`,running:`실행 중...`,mcpHint:{title:e=>`${e.named(`server`)} 설정 도움말`,requiredKeys:`필수 키`,setupGuide:`설정 가이드 열기`}},fileTreePane:{sort:`정렬:`,sortByName:`이름순 정렬`,name:`이름`,sortByRecent:`수정일순 정렬 (최신순)`,recent:`최근`,reference:`참조`,readOnlyBadge:`RO`,showSystemFiles:`시스템 파일 표시`,showSystemFilesTitle:`사용자 콘텐츠(data/, artifacts/, config/)에 더해 에이전트 내부 최상위 디렉터리(conversations/, feeds/ 등)까지 표시합니다.`},fileTree:{dropHint:`여기에 파일을 놓으면 이 폴더에 저장됩니다`,upload:{progress:`업로드 중 {done}/{total}…`,done:`파일 {count}개를 저장했습니다`,failed:`파일 {count}개를 저장하지 못했습니다`},workspace:`(워크스페이스)`,recentlyChanged:`최근 변경됨`,newFileMenuItem:`새 파일`,newFileInputAria:`새 파일 이름`,newFilePlaceholder:{wikiPage:`페이지 slug`,summary:`요약 이름`,document:`문서 이름`,html:`페이지 이름`,story:`스토리 이름`},newFileError:{empty:`파일 이름을 입력하세요.`,unsafe:`파일 이름에 사용할 수 없는 문자가 포함되어 있습니다.`,exists:`{filename} 파일이 이미 존재합니다.`,saveFailed:`파일을 생성할 수 없습니다. 다시 시도해 주세요.`}},lockStatusPopup:{sandboxEnabledTooltip:`샌드박스 활성화 (Docker)`,noSandboxTooltip:`샌드박스 없음 (Docker 미발견)`,sandboxEnabledLabel:`샌드박스 활성화:`,sandboxEnabledBody:`Docker 가 실행 중입니다. 파일 시스템 접근이 격리됩니다.`,noSandboxLabel:`샌드박스 없음:`,noSandboxBodyPrefix:`Claude 가 이 컴퓨터의 모든 파일에 접근할 수 있습니다. 파일 시스템 격리를 활성화하려면`,noSandboxBodySuffix:`을(를) 설치하세요.`,dockerDesktop:`Docker Desktop`,hostCredentials:`연결된 호스트 인증 정보:`,credsLoading:`불러오는 중…`,sshAgent:`SSH 에이전트:`,forwarded:`전달됨`,notForwarded:`전달되지 않음`,mountedConfigs:`마운트된 설정:`,none:`없음`,testIsolation:`샌드박스 격리 테스트:`},settingsModal:{title:`설정`,version:`MulmoClaude v{version}`,tabs:{gemini:`Gemini API 키`,tools:`허용된 도구`,mcp:`MCP 서버`,dirs:`디렉터리`,refs:`참조 디렉터리`,map:`지도`,photos:`사진`,google:`Google`,model:`모델`,voice:`음성`,chatIndex:`채팅 인덱스`,journal:`저널`,notifications:`Web Push`,skills:`스킬`,roles:`역할`,quit:`종료`},groups:{llm:`LLM`,servers:`서버`,workspace:`워크스페이스`,notifications:`알림`,plugins:`플러그인`,management:`관리`,server:`서버`},navAriaLabel:`설정 섹션`,googleTab:{description:`Google 계정을 연결하면 이 컴퓨터에서 Google API(우선 캘린더)를 직접 호출할 수 있습니다. 리프레시 토큰은 이 컴퓨터에만 저장되며 Google 이외에는 전송되지 않습니다.`,statusLinked:`연결됨`,statusNotLinked:`연결되지 않음`,statusPending:`브라우저에서 동의가 완료되기를 기다리는 중…`,connect:`Google 계정 연결`,unlink:`연결 해제`,unlinkConfirm:`Google 계정 연결을 해제할까요? 저장된 토큰은 취소되고 이 컴퓨터에서 삭제됩니다.`,clientSecretAmbiguous:`~/.secrets/에서 client_secret_*.json 파일이 여러 개 발견되었습니다. 저장된 토큰과 OAuth 클라이언트가 어긋나지 않도록 하나만 남겨 주세요.`,loadError:`Google 연결 상태를 불러오지 못했습니다.`,connectError:`Google 인증 절차를 시작하지 못했습니다.`,unlinkError:`Google 연결 해제에 실패했습니다.`},geminiTab:{required:`이미지 생성에는 {envKey} 가 필요합니다. 아래 칸에 키를 붙여넣고 저장해주세요.`,apiKeyLabel:`Gemini API 키`,apiKeyPlaceholder:`AIza…`,helperText:`{studioLink} 에서 키를 만들거나 복사해주세요.`,storageNote:`이 컴퓨터에만, 워크스페이스 밖에 저장되며 본인만 읽을 수 있습니다. 저장하면 바로 적용되고 재시작은 필요하지 않습니다.`,storedHere:`앱에 저장됨`,storedInEnvironment:`환경 변수에서 가져옴`,notConfigured:`설정되지 않음`,clear:`지우기`,fromEnvironment:`지금의 키는 앱을 실행한 셸이나 {envFile} 에서 옵니다. 여기에 저장한 키가 우선합니다.`,loadError:`키 상태를 불러오지 못했습니다`,saveError:`키를 저장하지 못했습니다`,clearError:`키를 지우지 못했습니다`},mapTab:{description:`지도 플러그인에서 사용하는 Google Maps API 키를 설정합니다. 키는 로컬에 저장되며 Google Maps 외부로는 전송되지 않습니다.`,apiKeyLabel:`Google Maps API 키`,apiKeyPlaceholder:`AIza…`,helperText:`{consoleLink}에서 키를 만들거나 복사하세요.`,requiredApis:`활성화 필요: Maps JavaScript API, Geocoding API, Places API (New), Directions API.`,configured:`구성됨`,notConfigured:`구성되지 않음`,clear:`지우기`,loadError:`설정을 불러오지 못했습니다`,saveError:`저장에 실패했습니다`},photosTab:{description:`채팅 또는 연결된 bridge로 받은 사진의 개인정보 설정입니다. EXIF 위치 데이터는 민감하므로, 자동 수집을 원하지 않으면 체크박스를 해제하세요.`,autoCaptureLabel:`사진 위치 데이터 자동 수집`,autoCaptureHint:`켜진 경우, EXIF GPS가 있는 업로드된 이미지마다 data/locations/에 위치 sidecar가 생성됩니다. 끄면 자동 수집이 중단되지만 필요할 때 LLM이 EXIF를 수동으로 읽을 수 있습니다.`,statusOn:`자동 수집 켜짐`,statusOff:`자동 수집 꺼짐`,loadError:`설정을 불러오지 못했습니다`,saveError:`저장에 실패했습니다`},quitTab:{description:`이 컴퓨터에서 실행 중인 MulmoClaude 서버를 종료합니다. 아이콘으로 시작한 경우 이 탭을 닫아도 서버는 계속 실행됩니다. 터미널 없이 종료하는 방법이 여기입니다.`,restartHint:()=>"다시 시작하려면 MulmoClaude 아이콘을 두 번 클릭하세요(또는 `npx mulmoclaude@latest`).",quitLabel:`MulmoClaude 종료`,confirmBody:`서버가 멈추고 이 페이지는 동작하지 않게 됩니다. 진행 중인 작업은 중단됩니다.`,confirmLabel:`종료`,stopping:`종료하는 중…`,stoppedTitle:`MulmoClaude가 종료되었습니다`,stoppedBody:`이 탭을 닫아도 됩니다. 다시 시작하려면 아이콘을 두 번 클릭하세요.`,error:`서버를 종료하지 못했습니다`},notificationsTab:{description:`여기서 시작한 작업이 완료되면 등록된 기기로 푸시 알림을 보냅니다. 질문을 남기고 자리를 비운 뒤 답변이 준비되는 순간을 알고 싶을 때 유용합니다.`,enableLabel:`작업 완료 시 Web Push 보내기`,enableHint:`여기서 시작한 채팅이 완료되면 실행됩니다. 예약 작업이나 백그라운드 작업에서는 실행되지 않습니다.`,remoteHostNote:`RemoteHost 연결(로그인 제공)과 등록된 기기가 하나 이상 필요합니다. 둘 중 하나라도 없으면 아무 동작도 하지 않습니다.`,macosRemindersLabel:`작업 완료 시 macOS 미리 알림 만들기`,macosRemindersHint:`완료된 작업을 기본 미리 알림 목록에 추가합니다. iCloud를 통해 iPhone에 동기화되며, iPhone에서 알림이 전달됩니다.`,macosRemindersForcedOff:`시작할 때 --disable-macos-reminders 또는 DISABLE_MACOS_REMINDER_NOTIFICATIONS로 꺼졌습니다. 플래그를 제거하거나 환경 변수를 해제한 뒤 다시 시작하면 여기서 제어할 수 있습니다.`,statusOn:`Web Push 켜짐`,statusOff:`Web Push 꺼짐`,loadError:`설정을 불러오지 못했습니다`,saveError:`저장에 실패했습니다`},modelTab:{description:`Claude Code가 각 턴에 사용하는 모델과 추론 effort를 설정합니다. 설정하지 않으면 Claude 쪽 해석을 따릅니다.`,modelLabel:`모델`,modelUnset:`(미설정 — ~/.claude/settings.json 따르기)`,modelHelperText:`미설정이면 모델은 ~/.claude/settings.json에서 결정됩니다. VS Code나 Cursor의 Claude Code 확장도 /model 선택을 이 파일에 저장하므로, 그쪽에서 바꾸면 MulmoClaude의 모델도 함께 바뀝니다. 별칭은 각 패밀리의 최신 세대를 따라갑니다.`,modelConfigured:`모델: {model}`,modelNotConfigured:`미설정 (공유)`,effortLabel:`추론 effort`,effortUnset:`(미설정 — Claude 기본값 사용)`,helperText:`레벨이 높을수록 사고 시간이 늘어나지만 지연 시간과 토큰 사용량도 증가합니다.`,configured:`Effort: {level}`,notConfigured:`미설정`,userSettingsLabel:`Claude Code 사용자 설정과 플러그인 불러오기`,userSettingsHint:`~/.claude에 있는, Claude Code와 공유하는 스킬·플러그인·훅을 불러옵니다. 설치한 플러그인의 스킬이 너무 많아 요청마다 무거워진다면 끄세요. 워크스페이스 자체 스킬은 그대로 사용할 수 있습니다. 다음 메시지부터 적용됩니다. 끄면 모델이 미설정이어도 ~/.claude/settings.json의 모델 지정을 따르지 않습니다.`,skillListingSummary:`지난 턴에 불러온 스킬: {count}개.`,skillListingPlugins:`플러그인: {plugins}.`,skillListingHeavy:`스킬이 많아 요청마다 무거워지고 있습니다. 끄면 ~/.claude의 스킬이 빠집니다.`,loadError:`설정을 불러오지 못했습니다`,saveError:`저장에 실패했습니다`},voiceTab:{description:`음성으로 채팅 메시지를 입력합니다. 오디오는 MulmoClaude를 실행하는 컴퓨터에서 로컬로 전사되며 외부 서비스로 전송되지 않습니다.`,requirements:`macOS에서만 사용할 수 있습니다. whisper.cpp 서버가 필요하며 yarn build:whisper 로 빌드하세요 (README의 Local Voice Input 섹션 참조).`,unsupported:`음성 입력에는 whisper.cpp 서버가 설치된 macOS가 필요합니다. 이 컴퓨터에서는 사용할 수 없습니다.`,enableLabel:`음성 입력 활성화`,enableHint:`켜면 음성 모델(1–3 GB)을 한 번 다운로드합니다. 이후 채팅 입력란에 마이크 버튼이 표시됩니다.`,modelLabel:`음성 모델`,downloading:`모델 다운로드 중… {percent}%`,ready:`모델 준비 완료`,downloadError:`모델 다운로드에 실패했습니다.`,retry:`다시 시도`,loadError:`설정을 불러오지 못했습니다`,saveError:`저장에 실패했습니다`},chatIndexTab:{description:`채팅 기록의 AI 제목/요약 자동 생성을 설정합니다. 기본값은 off 이며, 자동화 계열 세션(scheduler / 시스템 워커)은 on 상태여도 항상 제외됩니다. 사람 세션만 턴 종료 시 요약이 한 번 실행됩니다.`,modeLabel:`채팅 인덱스 모델`,helperText:`Haiku 가 더 저렴하고, Sonnet 은 길고 주제가 바뀌는 세션에서 더 정확한 제목을 만듭니다.`,mode:{off:`꺼짐`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`인덱싱: 꺼짐`,haiku:`Haiku 로 인덱싱 중`,sonnet:`Sonnet 으로 인덱싱 중`},loadError:`설정을 불러오지 못했습니다`,saveError:`저장에 실패했습니다`},journalTab:{description:`일일 저널 자동 생성 설정입니다. 최근 채팅 세션을 journal/*.md 로 요약하고 지속 메모(memory.md)를 추출합니다. 기본값은 off. 자동화 세션(scheduler / 시스템 워커)은 이 설정과 무관하게 항상 제외됩니다.`,modeLabel:`저널 모델`,helperText:`Haiku 가 더 저렴하고, Sonnet 은 일일/주제 요약 품질이 더 좋습니다. 매시 실행은 이 설정이 켜져 있을 때만 동작합니다.`,mode:{off:`꺼짐`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`저널: 꺼짐`,haiku:`Haiku 로 저널 실행 중`,sonnet:`Sonnet 으로 저널 실행 중`},loadError:`설정을 불러오지 못했습니다`,saveError:`저장에 실패했습니다`},geminiAskButton:`Claude 에게 질문`,geminiAskMessage:`이 앱에서 Gemini API 키는 어떤 역할을 하나요?`,toolNamesLabel:`도구 이름`,invalidToolNamesPrefix:`다음은 비표준으로 보입니다 (예상 접두사`,invalidToolNamesSuffix:`):`,mcpToolsError:`⚠ MCP 도구 상태를 가져올 수 없습니다: {error}. 활성화 여부와 무관하게 모든 도구를 표시합니다.`,changesHint:`변경 사항은 다음 메시지부터 적용됩니다. 재시작은 필요하지 않습니다.`,cannotSaveTooltip:`설정을 성공적으로 불러오기 전에는 저장할 수 없습니다`,saving:`저장 중…`,loadingLabel:`불러오는 중…`,unsavedMarker:`●`,unsavedToolsConfirm:`허용된 도구에 저장되지 않은 변경 사항이 있습니다. 계속 닫으시겠습니까?`,unsavedMcpDraftConfirm:`MCP 서버 초안이 아직 열려 있습니다. 계속 닫으시겠습니까?`,mcpSaveFailed:`MCP 서버 변경 사항을 저장하지 못했습니다.`},canvasViewToggle:{stackViewTooltip:`스택 보기 · 클릭하여 단일 보기로 전환`,singleViewTooltip:`단일 보기 · 클릭하여 스택 보기로 전환`,switchToSingle:`단일 보기로 전환`,switchToStack:`스택 보기로 전환`},sessionHistoryToggle:{showTooltip:`왼쪽에 세션 기록 패널 표시`,hideTooltip:`세션 기록 패널 숨기기`,show:`세션 기록 표시`,hide:`세션 기록 숨기기`},sessionHistoryExpand:{expandTooltip:`세션 기록 패널을 전체 너비로 확장`,collapseTooltip:`세션 기록 패널 축소`,expand:`세션 기록 확장`,collapse:`세션 기록 축소`},settingsWorkspaceDirs:{explanation:`{dataDir} 와 {artifactsDir} 아래에서 파일을 정리하기 위한 커스텀 디렉터리입니다. Claude 는 이를 참조해 파일 저장 위치를 결정합니다.`,noEntries:`설정된 커스텀 디렉터리가 없습니다.`,addDirTitle:`디렉터리 추가`,pathPlaceholder:`data/clients 또는 artifacts/reports`,descPlaceholder:`설명 (이 폴더에 무엇을 보관할지)`,errPathRequired:`경로를 입력하세요`,errMustStartWith:`data/ 또는 artifacts/ 로 시작해야 합니다`,errAlreadyExists:`이미 존재합니다`},settingsReferenceDirs:{explanation:`Claude 가 읽을 수는 있지만 수정할 수 없는 외부 디렉터리입니다. Docker 모드에서는 읽기 전용으로 마운트됩니다. Obsidian 볼트, 프로젝트 코드, 문서 폴더를 참조할 때 유용합니다.`,noEntries:`설정된 참조 디렉터리가 없습니다.`,addDirTitle:`참조 디렉터리 추가`,pathPlaceholder:`/Users/me/ObsidianVault 또는 ~/Documents/notes`,labelPlaceholder:`라벨 (선택 — 기본값은 폴더 이름)`,readOnlyBadge:`읽기 전용`,errPathRequired:`경로를 입력하세요`,errMustBeAbsolute:`절대 경로이거나 ~/ 로 시작해야 합니다`,errAlreadyExists:`이미 존재합니다`,errLabelConflict:`라벨 "{label}" 은(는) 이미 사용 중입니다`},dashboard:{empty:`즐겨찾는 컬렉션이 아직 없습니다.`,emptyHint:`컬렉션을 고정(★)하면 여기에 표시됩니다.`,viewTable:`테이블`,viewCalendar:`캘린더`,viewKanban:`칸반`,viewPickerLabel:`보기 선택`,openFull:`더블클릭하여 전체 보기 열기`,dragHint:`드래그하여 순서 변경`,resizeHint:`드래그하여 높이 조절`},pluginLauncher:{chat:{label:`채팅`},dashboard:{label:`대시보드`},automations:{label:`자동화`},wiki:{label:`위키`},collections:{label:`컬렉션`},feeds:{label:`피드`},accounting:{label:`회계`},files:{label:`파일`}},shortcuts:{pin:`런처에 고정`,unpin:`런처에서 고정 해제`,zoneAriaLabel:`고정된 바로가기`,reorder:{open:`바로가기 순서 변경`,title:`순서 변경`,moveUp:`위로`,moveDown:`아래로`}},fileContentHeader:{showRendered:`렌더링된 Markdown 표시`,showRaw:`원본 표시`,rendered:`렌더링`,raw:`원본`,closeFile:`파일 닫기`,revealInOs:`폴더에서 보기`,revealInOsFailed:`폴더를 열 수 없습니다`},fileContentRenderer:{download:`ZIP`,downloadZip:`자체 포함 zip으로 다운로드(에셋 포함)`,downloadError:`다운로드 실패`,selectFile:`파일을 선택하세요`,htmlPreview:`HTML 미리보기`,pdfPreview:`PDF 미리보기`,parseError:`파싱 오류`,editJson:`JSON 편집`,jsonEditorLabel:`JSON 편집기`,invalidJson:`잘못된 JSON`,undo:`실행 취소`,redo:`다시 실행`,editMarp:`슬라이드 소스 편집`,marpEditorLabel:`Marp 슬라이드 소스`,openInOs:`OS에서 열기`,openingInOs:`여는 중…`,openInOsFailed:`OS에서 열 수 없습니다`,downloadFile:`다운로드`,downloadingFile:`다운로드 중…`},filesView:{chatPlaceholder:`이 파일에 대해 질문하세요…`},systemFiles:{schemaLabel:`스키마`,showDetails:`자세히 보기`,hideDetails:`자세히 숨기기`,editPolicy:{"agent-managed-but-hand-editable":`에이전트 관리 (수동 편집 가능)`,"user-editable":`사용자 편집 가능`,"agent-managed":`에이전트 관리`,"fragile-format":`취약한 형식`,ephemeral:`임시 파일`},mcp:{title:`MCP 서버`,summary:`에이전트에 연결된 외부 Model Context Protocol 서버. HTTP 또는 stdio 서버를 추가하여 도구를 확장할 수 있습니다.`},settings:{title:`앱 설정`,summary:`사용자 편집 가능한 동작 환경설정 — Gemini API 키, 허용된 도구, 샌드박스 설정 등.`},schedulerTasks:{title:`스케줄러 작업`,summary:`일정에 따라 실행되는 반복 에이전트 자동화. Automations UI 에서 관리하며, 이 파일이 디스크상의 정본입니다.`},schedulerOverrides:{title:`스케줄러 오버라이드`,summary:`시스템 기본 일정 위에 덮어쓰는 작업별 시간 / 간격 오버라이드. 반복 작업 시간을 변경해 달라고 요청하면 에이전트가 여기에 기록합니다.`},schedulerItems:{title:`스케줄러 아이템 큐`,summary:`발화 대기 중인 예약 호출 큐. 에이전트 관리 — 각 필드의 의미를 정확히 알지 않으면 수동 편집하지 마세요.`},wikiIndex:{title:`위키 인덱스`,summary:`모든 위키 페이지의 자동 생성 인덱스. 위키 편집 시마다 새로 갱신되므로 수동 편집하면 덮어써집니다.`},wikiLog:{title:`위키 편집 로그`,summary:`위키 페이지 생성 및 편집 활동 로그. 에이전트 관리이며 추가만 가능 — 최근 변경 피드로 유용합니다.`},wikiSummary:{title:`위키 요약`,summary:`위키의 자동 생성 개요 — 주제 클러스터, 페이지 수, 최근 활동. 에이전트가 새로 갱신합니다.`},wikiSchema:{title:`위키 스키마`,summary:`에이전트가 위키 페이지 일관성을 유지하기 위해 참조하는 형식 명세. 취약 — 특정 구조를 기대하므로 에이전트 주도 편집을 권장합니다.`},memory:{title:`메모리`,summary:`당신에 관한 정제된 사실로, 새 대화의 컨텍스트로 항상 로드됩니다. journal 추출기가 자동으로 추가하며 수동 편집도 가능합니다.`},summariesIndex:{title:`요약 인덱스`,summary:`journal 이 생성하는 일별 및 주제별 요약 링크 모음. 에이전트 관리 — journal 실행 시마다 새로 갱신됩니다.`},rolesJson:{title:`역할 정의 (JSON)`,summary:`역할 설정 — 모델 선택, MCP 서버, 허용 플러그인, 쿼리 제안. 사용자 편집 가능, 재시작 불필요.`},rolesMd:{title:`역할 설명 (Markdown)`,summary:`역할의 페르소나와 시스템 프롬프트 본문. 이 역할이 활성화되면 컨텍스트로 로드됩니다. 사용자 편집 가능, 다음 메시지부터 적용.`},journalDaily:{title:`일별 journal 요약`,summary:`journal 패스가 채팅 세션에서 추출한 하루치 활동의 자동 생성 요약입니다.`},journalTopic:{title:`주제별 journal`,summary:`특정 주제에 대한 장기 메모로, 해당 주제에 대한 대화가 이어질수록 누적되고 갱신됩니다. 에이전트 관리.`}},settingsMcpTab:{explanation:`외부 MCP 서버를 추가합니다. HTTP 서버는 모든 모드에서 동작합니다. Stdio 서버는 샌드박스 이미지의 {npx} / {node} / {tsx} 를 사용하며, Docker 가 활성화된 경우 경로는 워크스페이스 안에 있어야 합니다.`,localhostRewrite:`Docker 모드에서는 {localhost} 가 {hostDockerInternal} 로 재작성됩니다.`,noServers:`아직 구성된 MCP 서버가 없습니다.`,enabled:`활성화됨`,urlLabel:`URL:`,commandLabel:`명령:`,dockerStdioUnsupported:`⚠ Docker 샌드박스가 켜져 있는 동안에는 실행되지 않습니다.`,dockerStdioHostExecActive:`⚠ 호스트에서 실행됩니다 — 이 서버는 Docker 샌드박스를 벗어납니다.`,dockerStdioHostExecOptIn:`그래도 호스트에서 실행(고급). 이 서버는 로컬 HTTP 게이트웨이를 통해 Docker 샌드박스 밖에서 실행되며 컴퓨터에 접근할 수 있습니다.`,learnMore:`자세히 보기`,addServerButton:`+ MCP 서버 추가`,nameLabel:`이름`,namePlaceholder:`my-server`,typeHttp:`HTTP`,typeStdio:`Stdio (명령)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`명령`,argsLabel:`인자 (한 줄에 하나)`,argsPlaceholder:()=>`-y
|
|
238
|
+
이 작업은 되돌릴 수 없습니다.`},notificationBell:{notifications:`알림`,activeSection:`진행 중`,historySection:`기록`,noActive:`활성 알림이 없습니다`,noHistory:`최근 활동이 없습니다`,clearAll:`모두 지우기`,dismiss:`닫기`,cancel:`취소`,showMore:`더 보기 ({count})`,showLess:`접기`,openTarget:`열기`,expandDetails:`상세 보기`},pluginDiagnostics:{title:`플러그인 구성 문제`,hostBody:`플러그인 "{plugin}"이(가) {label} 키 "{key}"을(를) 등록하려고 했으나 호스트에서 예약된 키이므로 거부되었습니다. 플러그인의 항목이 삭제되었습니다.`,intraBody:`플러그인 "{first}"과(와) "{second}"이(가) 동일한 {dimension} "{key}"을(를) 등록합니다. "{first}"이(가) 먼저 등록했으므로 "{second}"의 등록은 무시됩니다.`},shadowedEnv:{title:`셸 환경 변수가 .env를 덮어쓰고 있습니다`,body:`셸과 .env 양쪽에 모두 설정되어 있습니다: {keys}. 셸의 값이 우선하므로 .env는 무시됩니다. .env를 수정했다면 셸의 값을 갱신하거나 해제한 뒤 다시 시작하세요.`},optionalDeps:{title:`선택적 의존성을 사용할 수 없습니다`,titleNotFound:`{command}이(가) 설치되어 있지 않습니다`,titleNotResponding:`{command}이(가) 실행 중이 아닙니다`,notFound:`{command}을(를) 찾을 수 없습니다 — 관련 기능이 비활성화되었습니다. {command}을(를) 설치한 후 MulmoClaude를 재시작하면 활성화됩니다.`,notResponding:`{command}은(는) 설치되어 있지만 실행 중이 아닙니다 — 관련 기능이 비활성화되었습니다. {command}을(를) 시작한 후 MulmoClaude를 재시작하면 활성화됩니다.`},billingMigration:{title:`인보이스 기능이 온디맨드 설정으로 이동했습니다`,body:`번들로 제공되던 clients, worklog, invoice, profile 컬렉션이 대시보드에서 제거되었지만 데이터는 안전하게 그대로 유지됩니다. 클라이언트 및 작업 시간 기록을 설정한 다음 인보이스를 설정하도록 요청하면 다시 만들어지고 기존 레코드가 다시 표시됩니다.`},backendOffline:{title:`백엔드에 연결할 수 없습니다`,body:`MulmoClaude 서버가 실행 중이 아닐 수 있습니다. 개발 서버를 확인한 후 다시 시도하세요.`,retry:`다시 시도`},pluginErrorBoundary:{title:`플러그인 {pkg}이(가) 충돌했습니다`,subtitle:`플러그인 렌더링에 실패했습니다. 오류가 콘솔에 기록되었습니다.`,showDetails:`세부 정보 표시`,hideDetails:`세부 정보 숨기기`,retry:`다시 시도`},remoteHostOffline:{title:`원격 호스트 연결 끊김`,body:`다시 연결하기 전에는 휴대폰에서 이 기기로 보낼 수 없습니다.`,reconnect:`다시 연결`},authTokenStale:{title:`페이지를 새로 고쳐야 합니다`,body:`서버가 이 페이지의 토큰을 거부했고 새 토큰을 가져오지 못했습니다. 계속하려면 새로 고침하세요.`,reload:`새로 고침`},remoteHost:{title:`원격 호스트`,online:`원격 호스트 온라인`,offline:`원격 호스트 오프라인`,uid:`uid {uid}`,signIn:`Google로 로그인`,connecting:`연결 중…`,disconnect:`연결 해제`,disconnecting:`연결 해제 중…`,noToken:`Google 로그인에서 idToken을 반환하지 않았습니다`,connectFailed:`연결 실패`,disconnectFailed:`연결 해제 실패`,signInFailed:`Google 로그인 실패`,statusFailed:`상태를 불러오지 못했습니다`,description:`원격 액세스를 사용하면 모바일 기기에서 이 MulmoClaude의 컬렉션과 피드에 연결할 수 있습니다.`,howTo:`휴대폰에서 {url} 을(를) 열고 같은 Google 계정으로 로그인하세요.`,customViewHint:`모바일에 최적화된 뷰가 필요하다면, 일반 custom view가 아닌 {keyword} 를(을) 만들어 달라고 Claude에게 요청하세요.`,qrHint:`휴대폰 카메라로 이 QR 코드를 스캔해도 열 수 있습니다.`},sessionModelChip:{tooltip:`이 세션이 사용 중인 모델: {model}`,tooltipOverride:`이 대화의 모델: {model} (역할/전체 설정을 덮어씀)`,ariaLabel:`이 대화의 모델`,clear:`기본값으로 되돌리기`,unknown:`알 수 없음`,inherited:`{model} (상속)`},sidebarHeader:{newMessages:`새 메시지`,home:`최신 채팅으로 이동`,toolCallHistory:`도구 호출 기록`,settings:`설정`,settingsGeminiMissing:`설정 — Gemini API 키 없음`,todayJournal:`오늘의 요약`,todayJournalNotFound:`아직 요약이 없습니다 — 잠시 대화하면 journal이 생성합니다.`,todayJournalLoadFailed:`journal 로드에 실패했습니다 (status {status}): {error}`,copyMarkdown:`대화를 Markdown으로 복사`,copiedMarkdown:`복사됨`},rightSidebar:{permalink:`선택된 메시지의 고유 링크`,copyPermalink:`선택된 메시지의 고유 링크 복사`,copiedPermalink:`복사됨!`,toggleSystemPrompt:`시스템 프롬프트 토글`,systemPrompt:`시스템 프롬프트`,availableTools:`사용 가능한 도구`,toggleToolDescription:`도구 설명 토글`,toolCallHistory:`도구 호출 기록`,copyHistory:`도구 호출 기록 복사`,copiedHistory:`복사됨!`,noToolCalls:`아직 도구 호출이 없습니다`,arguments:`인자`,error:`오류`,result:`결과`,running:`실행 중...`,mcpHint:{title:e=>`${e.named(`server`)} 설정 도움말`,requiredKeys:`필수 키`,setupGuide:`설정 가이드 열기`}},fileTreePane:{sort:`정렬:`,sortByName:`이름순 정렬`,name:`이름`,sortByRecent:`수정일순 정렬 (최신순)`,recent:`최근`,reference:`참조`,readOnlyBadge:`RO`,showSystemFiles:`시스템 파일 표시`,showSystemFilesTitle:`사용자 콘텐츠(data/, artifacts/, config/)에 더해 에이전트 내부 최상위 디렉터리(conversations/, feeds/ 등)까지 표시합니다.`},fileTree:{dropHint:`여기에 파일을 놓으면 이 폴더에 저장됩니다`,upload:{progress:`업로드 중 {done}/{total}…`,done:`파일 {count}개를 저장했습니다`,failed:`파일 {count}개를 저장하지 못했습니다`},workspace:`(워크스페이스)`,recentlyChanged:`최근 변경됨`,newFileMenuItem:`새 파일`,newFileInputAria:`새 파일 이름`,newFilePlaceholder:{wikiPage:`페이지 slug`,summary:`요약 이름`,document:`문서 이름`,html:`페이지 이름`,story:`스토리 이름`},newFileError:{empty:`파일 이름을 입력하세요.`,unsafe:`파일 이름에 사용할 수 없는 문자가 포함되어 있습니다.`,exists:`{filename} 파일이 이미 존재합니다.`,saveFailed:`파일을 생성할 수 없습니다. 다시 시도해 주세요.`}},lockStatusPopup:{sandboxEnabledTooltip:`샌드박스 활성화 (Docker)`,noSandboxTooltip:`샌드박스 없음 (Docker 미발견)`,sandboxEnabledLabel:`샌드박스 활성화:`,sandboxEnabledBody:`Docker 가 실행 중입니다. 파일 시스템 접근이 격리됩니다.`,noSandboxLabel:`샌드박스 없음:`,noSandboxBodyPrefix:`Claude 가 이 컴퓨터의 모든 파일에 접근할 수 있습니다. 파일 시스템 격리를 활성화하려면`,noSandboxBodySuffix:`을(를) 설치하세요.`,dockerDesktop:`Docker Desktop`,hostCredentials:`연결된 호스트 인증 정보:`,credsLoading:`불러오는 중…`,sshAgent:`SSH 에이전트:`,forwarded:`전달됨`,notForwarded:`전달되지 않음`,mountedConfigs:`마운트된 설정:`,none:`없음`,testIsolation:`샌드박스 격리 테스트:`},settingsModal:{title:`설정`,version:`MulmoClaude v{version}`,tabs:{gemini:`Gemini API 키`,tools:`허용된 도구`,mcp:`MCP 서버`,dirs:`디렉터리`,refs:`참조 디렉터리`,map:`지도`,photos:`사진`,google:`Google`,model:`모델`,voice:`음성`,chatIndex:`채팅 인덱스`,journal:`저널`,notifications:`Web Push`,skills:`스킬`,roles:`역할`,quit:`종료`},groups:{llm:`LLM`,servers:`서버`,workspace:`워크스페이스`,notifications:`알림`,plugins:`플러그인`,management:`관리`,server:`서버`},navAriaLabel:`설정 섹션`,googleTab:{description:`Google 계정을 연결하면 이 컴퓨터에서 Google API(우선 캘린더)를 직접 호출할 수 있습니다. 리프레시 토큰은 이 컴퓨터에만 저장되며 Google 이외에는 전송되지 않습니다.`,statusLinked:`연결됨`,statusNotLinked:`연결되지 않음`,statusPending:`브라우저에서 동의가 완료되기를 기다리는 중…`,connect:`Google 계정 연결`,unlink:`연결 해제`,unlinkConfirm:`Google 계정 연결을 해제할까요? 저장된 토큰은 취소되고 이 컴퓨터에서 삭제됩니다.`,clientSecretAmbiguous:`~/.secrets/에서 client_secret_*.json 파일이 여러 개 발견되었습니다. 저장된 토큰과 OAuth 클라이언트가 어긋나지 않도록 하나만 남겨 주세요.`,loadError:`Google 연결 상태를 불러오지 못했습니다.`,connectError:`Google 인증 절차를 시작하지 못했습니다.`,unlinkError:`Google 연결 해제에 실패했습니다.`},geminiTab:{required:`이미지 생성에는 {envKey} 가 필요합니다. 아래 칸에 키를 붙여넣고 저장해주세요.`,apiKeyLabel:`Gemini API 키`,apiKeyPlaceholder:`AIza…`,helperText:`{studioLink} 에서 키를 만들거나 복사해주세요.`,storageNote:`이 컴퓨터에만, 워크스페이스 밖에 저장되며 본인만 읽을 수 있습니다. 저장하면 바로 적용되고 재시작은 필요하지 않습니다.`,storedHere:`앱에 저장됨`,storedInEnvironment:`환경 변수에서 가져옴`,notConfigured:`설정되지 않음`,clear:`지우기`,fromEnvironment:`지금의 키는 앱을 실행한 셸이나 {envFile} 에서 옵니다. 여기에 저장한 키가 우선합니다.`,loadError:`키 상태를 불러오지 못했습니다`,saveError:`키를 저장하지 못했습니다`,clearError:`키를 지우지 못했습니다`},mapTab:{description:`지도 플러그인에서 사용하는 Google Maps API 키를 설정합니다. 키는 로컬에 저장되며 Google Maps 외부로는 전송되지 않습니다.`,apiKeyLabel:`Google Maps API 키`,apiKeyPlaceholder:`AIza…`,helperText:`{consoleLink}에서 키를 만들거나 복사하세요.`,requiredApis:`활성화 필요: Maps JavaScript API, Geocoding API, Places API (New), Directions API.`,configured:`구성됨`,notConfigured:`구성되지 않음`,clear:`지우기`,loadError:`설정을 불러오지 못했습니다`,saveError:`저장에 실패했습니다`},photosTab:{description:`채팅 또는 연결된 bridge로 받은 사진의 개인정보 설정입니다. EXIF 위치 데이터는 민감하므로, 자동 수집을 원하지 않으면 체크박스를 해제하세요.`,autoCaptureLabel:`사진 위치 데이터 자동 수집`,autoCaptureHint:`켜진 경우, EXIF GPS가 있는 업로드된 이미지마다 data/locations/에 위치 sidecar가 생성됩니다. 끄면 자동 수집이 중단되지만 필요할 때 LLM이 EXIF를 수동으로 읽을 수 있습니다.`,statusOn:`자동 수집 켜짐`,statusOff:`자동 수집 꺼짐`,loadError:`설정을 불러오지 못했습니다`,saveError:`저장에 실패했습니다`},quitTab:{description:`이 컴퓨터에서 실행 중인 MulmoClaude 서버를 종료합니다. 아이콘으로 시작한 경우 이 탭을 닫아도 서버는 계속 실행됩니다. 터미널 없이 종료하는 방법이 여기입니다.`,restartHint:()=>"다시 시작하려면 MulmoClaude 아이콘을 두 번 클릭하세요(또는 `npx mulmoclaude@latest`).",quitLabel:`MulmoClaude 종료`,confirmBody:`서버가 멈추고 이 페이지는 동작하지 않게 됩니다. 진행 중인 작업은 중단됩니다.`,confirmLabel:`종료`,stopping:`종료하는 중…`,stoppedTitle:`MulmoClaude가 종료되었습니다`,stoppedBody:`이 탭을 닫아도 됩니다. 다시 시작하려면 아이콘을 두 번 클릭하세요.`,error:`서버를 종료하지 못했습니다`},notificationsTab:{description:`여기서 시작한 작업이 완료되면 등록된 기기로 푸시 알림을 보냅니다. 질문을 남기고 자리를 비운 뒤 답변이 준비되는 순간을 알고 싶을 때 유용합니다.`,enableLabel:`작업 완료 시 Web Push 보내기`,enableHint:`여기서 시작한 채팅이 완료되면 실행됩니다. 예약 작업이나 백그라운드 작업에서는 실행되지 않습니다.`,remoteHostNote:`RemoteHost 연결(로그인 제공)과 등록된 기기가 하나 이상 필요합니다. 둘 중 하나라도 없으면 아무 동작도 하지 않습니다.`,macosRemindersLabel:`작업 완료 시 macOS 미리 알림 만들기`,macosRemindersHint:`완료된 작업을 기본 미리 알림 목록에 추가합니다. iCloud를 통해 iPhone에 동기화되며, iPhone에서 알림이 전달됩니다.`,macosRemindersForcedOff:`시작할 때 --disable-macos-reminders 또는 DISABLE_MACOS_REMINDER_NOTIFICATIONS로 꺼졌습니다. 플래그를 제거하거나 환경 변수를 해제한 뒤 다시 시작하면 여기서 제어할 수 있습니다.`,statusOn:`Web Push 켜짐`,statusOff:`Web Push 꺼짐`,loadError:`설정을 불러오지 못했습니다`,saveError:`저장에 실패했습니다`},modelTab:{description:`Claude Code가 각 턴에 사용하는 모델과 추론 effort를 설정합니다. 설정하지 않으면 Claude 쪽 해석을 따릅니다.`,modelLabel:`모델`,modelUnset:`(미설정 — ~/.claude/settings.json 따르기)`,modelHelperText:`미설정이면 모델은 ~/.claude/settings.json에서 결정됩니다. VS Code나 Cursor의 Claude Code 확장도 /model 선택을 이 파일에 저장하므로, 그쪽에서 바꾸면 MulmoClaude의 모델도 함께 바뀝니다. 별칭은 각 패밀리의 최신 세대를 따라갑니다.`,modelConfigured:`모델: {model}`,modelNotConfigured:`미설정 (공유)`,effortLabel:`추론 effort`,effortUnset:`(미설정 — Claude 기본값 사용)`,helperText:`레벨이 높을수록 사고 시간이 늘어나지만 지연 시간과 토큰 사용량도 증가합니다.`,configured:`Effort: {level}`,notConfigured:`미설정`,userSettingsLabel:`Claude Code 사용자 설정과 플러그인 불러오기`,userSettingsHint:`~/.claude에 있는, Claude Code와 공유하는 스킬·플러그인·훅을 불러옵니다. 설치한 플러그인의 스킬이 너무 많아 요청마다 무거워진다면 끄세요. 워크스페이스 자체 스킬은 그대로 사용할 수 있습니다. 다음 메시지부터 적용됩니다. 끄면 모델이 미설정이어도 ~/.claude/settings.json의 모델 지정을 따르지 않습니다.`,skillListingSummary:`지난 턴에 불러온 스킬: {count}개.`,skillListingPlugins:`플러그인: {plugins}.`,skillListingHeavy:`스킬이 많아 요청마다 무거워지고 있습니다. 끄면 ~/.claude의 스킬이 빠집니다.`,loadError:`설정을 불러오지 못했습니다`,saveError:`저장에 실패했습니다`},voiceTab:{description:`음성으로 채팅 메시지를 입력합니다. 오디오는 MulmoClaude를 실행하는 컴퓨터에서 로컬로 전사되며 외부 서비스로 전송되지 않습니다.`,requirements:`macOS에서만 사용할 수 있습니다. whisper.cpp 서버가 필요하며 yarn build:whisper 로 빌드하세요 (README의 Local Voice Input 섹션 참조).`,unsupported:`음성 입력에는 whisper.cpp 서버가 설치된 macOS가 필요합니다. 이 컴퓨터에서는 사용할 수 없습니다.`,enableLabel:`음성 입력 활성화`,enableHint:`켜면 음성 모델(1–3 GB)을 한 번 다운로드합니다. 이후 채팅 입력란에 마이크 버튼이 표시됩니다.`,modelLabel:`음성 모델`,downloading:`모델 다운로드 중… {percent}%`,ready:`모델 준비 완료`,downloadError:`모델 다운로드에 실패했습니다.`,retry:`다시 시도`,loadError:`설정을 불러오지 못했습니다`,saveError:`저장에 실패했습니다`},chatIndexTab:{description:`채팅 기록의 AI 제목/요약 자동 생성을 설정합니다. 기본값은 off 이며, 자동화 계열 세션(scheduler / 시스템 워커)은 on 상태여도 항상 제외됩니다. 사람 세션만 턴 종료 시 요약이 한 번 실행됩니다.`,modeLabel:`채팅 인덱스 모델`,helperText:`Haiku 가 더 저렴하고, Sonnet 은 길고 주제가 바뀌는 세션에서 더 정확한 제목을 만듭니다.`,mode:{off:`꺼짐`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`인덱싱: 꺼짐`,haiku:`Haiku 로 인덱싱 중`,sonnet:`Sonnet 으로 인덱싱 중`},loadError:`설정을 불러오지 못했습니다`,saveError:`저장에 실패했습니다`},journalTab:{description:`일일 저널 자동 생성 설정입니다. 최근 채팅 세션을 journal/*.md 로 요약하고 지속 메모(memory.md)를 추출합니다. 기본값은 off. 자동화 세션(scheduler / 시스템 워커)은 이 설정과 무관하게 항상 제외됩니다.`,modeLabel:`저널 모델`,helperText:`Haiku 가 더 저렴하고, Sonnet 은 일일/주제 요약 품질이 더 좋습니다. 매시 실행은 이 설정이 켜져 있을 때만 동작합니다.`,mode:{off:`꺼짐`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`저널: 꺼짐`,haiku:`Haiku 로 저널 실행 중`,sonnet:`Sonnet 으로 저널 실행 중`},loadError:`설정을 불러오지 못했습니다`,saveError:`저장에 실패했습니다`},geminiAskButton:`Claude 에게 질문`,geminiAskMessage:`이 앱에서 Gemini API 키는 어떤 역할을 하나요?`,toolNamesLabel:`도구 이름`,invalidToolNamesPrefix:`다음은 비표준으로 보입니다 (예상 접두사`,invalidToolNamesSuffix:`):`,mcpToolsError:`⚠ MCP 도구 상태를 가져올 수 없습니다: {error}. 활성화 여부와 무관하게 모든 도구를 표시합니다.`,changesHint:`변경 사항은 다음 메시지부터 적용됩니다. 재시작은 필요하지 않습니다.`,cannotSaveTooltip:`설정을 성공적으로 불러오기 전에는 저장할 수 없습니다`,saving:`저장 중…`,loadingLabel:`불러오는 중…`,unsavedMarker:`●`,unsavedToolsConfirm:`허용된 도구에 저장되지 않은 변경 사항이 있습니다. 계속 닫으시겠습니까?`,unsavedMcpDraftConfirm:`MCP 서버 초안이 아직 열려 있습니다. 계속 닫으시겠습니까?`,mcpSaveFailed:`MCP 서버 변경 사항을 저장하지 못했습니다.`},canvasViewToggle:{stackViewTooltip:`스택 보기 · 클릭하여 단일 보기로 전환`,singleViewTooltip:`단일 보기 · 클릭하여 스택 보기로 전환`,switchToSingle:`단일 보기로 전환`,switchToStack:`스택 보기로 전환`},sessionHistoryToggle:{showTooltip:`왼쪽에 세션 기록 패널 표시`,hideTooltip:`세션 기록 패널 숨기기`,show:`세션 기록 표시`,hide:`세션 기록 숨기기`},sessionHistoryExpand:{expandTooltip:`세션 기록 패널을 전체 너비로 확장`,collapseTooltip:`세션 기록 패널 축소`,expand:`세션 기록 확장`,collapse:`세션 기록 축소`},settingsWorkspaceDirs:{explanation:`{dataDir} 와 {artifactsDir} 아래에서 파일을 정리하기 위한 커스텀 디렉터리입니다. Claude 는 이를 참조해 파일 저장 위치를 결정합니다.`,noEntries:`설정된 커스텀 디렉터리가 없습니다.`,addDirTitle:`디렉터리 추가`,pathPlaceholder:`data/clients 또는 artifacts/reports`,descPlaceholder:`설명 (이 폴더에 무엇을 보관할지)`,errPathRequired:`경로를 입력하세요`,errMustStartWith:`data/ 또는 artifacts/ 로 시작해야 합니다`,errAlreadyExists:`이미 존재합니다`},settingsReferenceDirs:{explanation:`Claude 가 읽을 수는 있지만 수정할 수 없는 외부 디렉터리입니다. Docker 모드에서는 읽기 전용으로 마운트됩니다. Obsidian 볼트, 프로젝트 코드, 문서 폴더를 참조할 때 유용합니다.`,noEntries:`설정된 참조 디렉터리가 없습니다.`,addDirTitle:`참조 디렉터리 추가`,pathPlaceholder:`/Users/me/ObsidianVault 또는 ~/Documents/notes`,labelPlaceholder:`라벨 (선택 — 기본값은 폴더 이름)`,readOnlyBadge:`읽기 전용`,errPathRequired:`경로를 입력하세요`,errMustBeAbsolute:`절대 경로이거나 ~/ 로 시작해야 합니다`,errAlreadyExists:`이미 존재합니다`,errLabelConflict:`라벨 "{label}" 은(는) 이미 사용 중입니다`},dashboard:{empty:`즐겨찾는 컬렉션이 아직 없습니다.`,emptyHint:`컬렉션을 고정(★)하면 여기에 표시됩니다.`,viewTable:`테이블`,viewCalendar:`캘린더`,viewKanban:`칸반`,viewPickerLabel:`보기 선택`,openFull:`더블클릭하여 전체 보기 열기`,dragHint:`드래그하여 순서 변경`,resizeHint:`드래그하여 높이 조절`},pluginLauncher:{chat:{label:`채팅`},dashboard:{label:`대시보드`},automations:{label:`자동화`},wiki:{label:`위키`},collections:{label:`컬렉션`},feeds:{label:`피드`},accounting:{label:`회계`},files:{label:`파일`}},shortcuts:{pin:`런처에 고정`,unpin:`런처에서 고정 해제`,zoneAriaLabel:`고정된 바로가기`,reorder:{open:`바로가기 순서 변경`,title:`순서 변경`,moveUp:`위로`,moveDown:`아래로`}},fileContentHeader:{showRendered:`렌더링된 Markdown 표시`,showRaw:`원본 표시`,rendered:`렌더링`,raw:`원본`,closeFile:`파일 닫기`,revealInOs:`폴더에서 보기`,revealInOsFailed:`폴더를 열 수 없습니다`},fileContentRenderer:{download:`ZIP`,downloadZip:`자체 포함 zip으로 다운로드(에셋 포함)`,downloadError:`다운로드 실패`,selectFile:`파일을 선택하세요`,htmlPreview:`HTML 미리보기`,pdfPreview:`PDF 미리보기`,parseError:`파싱 오류`,editJson:`JSON 편집`,jsonEditorLabel:`JSON 편집기`,invalidJson:`잘못된 JSON`,undo:`실행 취소`,redo:`다시 실행`,editMarp:`슬라이드 소스 편집`,marpEditorLabel:`Marp 슬라이드 소스`,openInOs:`OS에서 열기`,openingInOs:`여는 중…`,openInOsFailed:`OS에서 열 수 없습니다`,downloadFile:`다운로드`,downloadingFile:`다운로드 중…`},filesView:{chatPlaceholder:`이 파일에 대해 질문하세요…`},systemFiles:{schemaLabel:`스키마`,showDetails:`자세히 보기`,hideDetails:`자세히 숨기기`,editPolicy:{"agent-managed-but-hand-editable":`에이전트 관리 (수동 편집 가능)`,"user-editable":`사용자 편집 가능`,"agent-managed":`에이전트 관리`,"fragile-format":`취약한 형식`,ephemeral:`임시 파일`},mcp:{title:`MCP 서버`,summary:`에이전트에 연결된 외부 Model Context Protocol 서버. HTTP 또는 stdio 서버를 추가하여 도구를 확장할 수 있습니다.`},settings:{title:`앱 설정`,summary:`사용자 편집 가능한 동작 환경설정 — Gemini API 키, 허용된 도구, 샌드박스 설정 등.`},schedulerTasks:{title:`스케줄러 작업`,summary:`일정에 따라 실행되는 반복 에이전트 자동화. Automations UI 에서 관리하며, 이 파일이 디스크상의 정본입니다.`},schedulerOverrides:{title:`스케줄러 오버라이드`,summary:`시스템 기본 일정 위에 덮어쓰는 작업별 시간 / 간격 오버라이드. 반복 작업 시간을 변경해 달라고 요청하면 에이전트가 여기에 기록합니다.`},schedulerItems:{title:`이전 캘린더 항목`,summary:`삭제된 캘린더 화면의 항목입니다. 앱에 표시되지 않으며 일정에 따라 실행되지도 않습니다. 이 파일을 읽고 쓰는 것은 이전 /api/scheduler 작업뿐입니다. 예약 작업은 config/scheduler/tasks.json에 있습니다.`},wikiIndex:{title:`위키 인덱스`,summary:`모든 위키 페이지의 자동 생성 인덱스. 위키 편집 시마다 새로 갱신되므로 수동 편집하면 덮어써집니다.`},wikiLog:{title:`위키 편집 로그`,summary:`위키 페이지 생성 및 편집 활동 로그. 에이전트 관리이며 추가만 가능 — 최근 변경 피드로 유용합니다.`},wikiSummary:{title:`위키 요약`,summary:`위키의 자동 생성 개요 — 주제 클러스터, 페이지 수, 최근 활동. 에이전트가 새로 갱신합니다.`},wikiSchema:{title:`위키 스키마`,summary:`에이전트가 위키 페이지 일관성을 유지하기 위해 참조하는 형식 명세. 취약 — 특정 구조를 기대하므로 에이전트 주도 편집을 권장합니다.`},memory:{title:`메모리(이전 파일)`,summary:`예전의 단일 파일 메모리입니다. 이전 형식의 워크스페이스만 읽습니다. 현재 워크스페이스는 사실을 conversations/memory/<type>/<topic>.md 토픽 파일에 저장하고 이 파일은 읽지 않으므로, 편집해도 반영되지 않습니다.`},summariesIndex:{title:`요약 인덱스`,summary:`journal 이 생성하는 일별 및 주제별 요약 링크 모음. 에이전트 관리 — journal 실행 시마다 새로 갱신됩니다.`},rolesJson:{title:`역할 정의 (JSON)`,summary:`역할 설정 — 모델 선택, MCP 서버, 허용 플러그인, 쿼리 제안. 사용자 편집 가능, 재시작 불필요.`},rolesMd:{title:`역할 설명 (Markdown)`,summary:`역할의 페르소나와 시스템 프롬프트 본문. 이 역할이 활성화되면 컨텍스트로 로드됩니다. 사용자 편집 가능, 다음 메시지부터 적용.`},journalDaily:{title:`일별 journal 요약`,summary:`journal 패스가 채팅 세션에서 추출한 하루치 활동의 자동 생성 요약입니다.`},journalTopic:{title:`주제별 journal`,summary:`특정 주제에 대한 장기 메모로, 해당 주제에 대한 대화가 이어질수록 누적되고 갱신됩니다. 에이전트 관리.`}},settingsMcpTab:{explanation:`외부 MCP 서버를 추가합니다. HTTP 서버는 모든 모드에서 동작합니다. Stdio 서버는 샌드박스 이미지의 {npx} / {node} / {tsx} 를 사용하며, Docker 가 활성화된 경우 경로는 워크스페이스 안에 있어야 합니다.`,localhostRewrite:`Docker 모드에서는 {localhost} 가 {hostDockerInternal} 로 재작성됩니다.`,noServers:`아직 구성된 MCP 서버가 없습니다.`,enabled:`활성화됨`,urlLabel:`URL:`,commandLabel:`명령:`,dockerStdioUnsupported:`⚠ Docker 샌드박스가 켜져 있는 동안에는 실행되지 않습니다.`,dockerStdioHostExecActive:`⚠ 호스트에서 실행됩니다 — 이 서버는 Docker 샌드박스를 벗어납니다.`,dockerStdioHostExecOptIn:`그래도 호스트에서 실행(고급). 이 서버는 로컬 HTTP 게이트웨이를 통해 Docker 샌드박스 밖에서 실행되며 컴퓨터에 접근할 수 있습니다.`,learnMore:`자세히 보기`,addServerButton:`+ MCP 서버 추가`,nameLabel:`이름`,namePlaceholder:`my-server`,typeHttp:`HTTP`,typeStdio:`Stdio (명령)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`명령`,argsLabel:`인자 (한 줄에 하나)`,argsPlaceholder:()=>`-y
|
|
239
239
|
@modelcontextprotocol/server-filesystem
|
|
240
240
|
/workspace/path`,errNoName:`이름을 입력하거나, 이름을 유추할 수 있는 URL / 인자를 입력하세요.`,errBadName:`이름은 소문자로 시작해야 하며 [a-z0-9_-] 만 포함할 수 있습니다.`,errIdExists:`서버 id "{id}" 는 이미 존재합니다.`,errBadHttpUrl:`HTTP URL 은 http:// 또는 https:// 로 시작해야 합니다`,pendingEntryWarning:`대기 중인 MCP 서버 항목을 완료하거나 취소하세요.`,customHeading:`사용자 정의 서버`,catalog:{heading:`사전 설정된 MCP 서버`,audience:{general:`🟢 일반`,developer:`🔵 개발자`},risk:{low:`낮음`,medium:`중간`,high:`높음`},upstream:`📦 소스`,setupGuide:`📚 설정`,entry:{memory:{displayName:`메모리`,description:`Claude 가 세션을 넘어 대화 내용을 기억합니다.`},sequentialThinking:{displayName:`단계별 사고`,description:`복잡한 문제를 단계별로 해결하도록 돕습니다.`},context7:{displayName:`Context7 (라이브러리 문서)`,description:`주요 라이브러리의 최신 문서를 가져옵니다 — 모델의 학습 시점을 넘어선 정보원.`},deepwiki:{displayName:`DeepWiki (GitHub 저장소 위키)`,description:`임의의 GitHub 저장소에 질문하여 위키 스타일의 구조화된 답변을 받습니다.`},notion:{displayName:`Notion`,description:`Notion 워크스페이스 읽기·쓰기 — 페이지, 데이터베이스, 검색 지원.`,field:{apiKey:{label:`Notion 통합 토큰`,help:`Notion 통합을 만들고 Internal Integration Secret 을 복사하세요. 🔑 로 통합 페이지를 열 수 있습니다.`}}},slack:{displayName:`Slack`,description:`Slack 워크스페이스 채널 목록, 메시지 전송, 기록 검색.`,field:{botToken:{label:`Bot 토큰`,help:`Slack 앱 → OAuth & Permissions → Bot User OAuth Token. xoxb- 로 시작합니다.`},teamId:{label:`팀 / 워크스페이스 ID`,help:`team.info 호출 또는 워크스페이스 URL 에서 확인 — T01ABC23DEF 형식입니다.`}}},googleMaps:{displayName:`Google Maps`,description:`장소 검색, 경로 안내, 위치 정보 조회.`,field:{apiKey:{label:`Google Maps API 키`,help:`Google Cloud Console → APIs & Services → Credentials → API 키 만들기. Places + Directions 활성화.`}}},appleNative:{displayName:`Apple 네이티브 앱 (macOS)`,description:`AppleScript로 미리 알림 / 캘린더 / 메모 / 메일 / 지도 읽기·쓰기. macOS 전용 — 자격 증명 불필요.`},gmail:{displayName:`Gmail`,description:`Gmail 읽기·전송·라벨 지정. 사용자 본인의 Google Cloud 프로젝트에서 발급한 OAuth 클라이언트를 사용 (앱 검수 불필요).`,field:{credentials:{label:`credentials.json 경로`,help:`Google Cloud Console → APIs & Services → Credentials → OAuth 클라이언트 ID (Desktop app). credentials.json을 다운로드하여 절대 경로를 입력하세요.`}}},googleCalendar:{displayName:`Google 캘린더`,description:`Google 캘린더 일정 읽기·생성. Gmail과 동일한 BYO credentials.json 방식.`,field:{credentials:{label:`credentials.json 경로`,help:`Gmail과 동일한 Google Cloud OAuth 클라이언트를 재사용하거나, 캘린더 전용으로 별도 생성하세요.`}}},googleDrive:{displayName:`Google 드라이브`,description:`Google 드라이브 파일 검색·읽기. BYO Google OAuth 자격 증명 — 토큰은 로컬에 캐시됩니다.`,field:{credentials:{label:`credentials.json 경로`,help:`Google Cloud Console → APIs & Services → Credentials → OAuth 클라이언트 ID (Desktop app). 동일 프로젝트에서 Google Drive API를 활성화하세요.`}}},github:{displayName:`GitHub`,description:"Personal Access Token으로 리포지토리 / 이슈 / PR / 검색 액세스. 토큰 범위를 좁게 설정하세요 — 쓰기 범위(`repo` 등)를 부여하면 에이전트가 접근 가능한 모든 리포지토리에 push할 수 있습니다.",field:{token:{label:`Personal Access Token`,help:`GitHub → Settings → Developer settings → Personal access tokens. 에이전트가 다룰 리포지토리만 지정하는 fine-grained token을 권장합니다.`}}},linear:{displayName:`Linear`,description:`Personal API key로 Linear의 이슈 / 프로젝트 / 사이클 읽기·쓰기.`,field:{apiKey:{label:`Linear API 키`,help:`Linear → Settings → API → Personal API keys. 🔑 를 눌러 페이지를 열고 Create key 를 클릭하세요.`}}},weatherOpenMeteo:{displayName:`날씨 (Open-Meteo)`,description:`전 세계 무료 일기예보와 현재 기상 정보 — API 키 불필요.`},spotify:{displayName:`Spotify`,description:`트랙 검색, 플레이리스트 관리, 재생 제어. BYO Spotify 개발자 앱 — Client ID만 (PKCE 플로우, Client Secret 불필요).`,field:{clientId:{label:`Client ID`,help:"Spotify Developer Dashboard → Create app, Redirect URI를 http://127.0.0.1:8888/callback 으로 설정, Client ID 복사. 그 다음 터미널에서 한 번만 `SPOTIFY_CLIENT_ID=<id> npx spotify-mcp@latest auth` 실행해 로그인하세요 (리프레시 토큰은 ~/.spotify-mcp/tokens.json 에 캐시)."}}},youtubeTranscript:{displayName:`YouTube 자막`,description:`공개된 YouTube 동영상의 URL로 자막을 가져옵니다. 자격 증명 불필요.`}},config:{howToGet:`발급 방법`,install:`설치`,errMissingRequired:`필수 항목 누락: {fields}`,requiredMarker:`*`,requiredAria:`필수`}}},pluginScheduler:{previewIcon:`📅`,previewAutomations:`자동화 {count}개`,previewMore:`+ {count}개 더…`},pluginSchedulerTasks:{recommendedFrequencies:`권장 주기`,tableTaskType:`작업 유형`,tableSuggestedSchedule:`권장 일정`,noTasks:`예약된 작업이 없습니다`,runNow:`지금 실행`,enable:`활성화`,disable:`비활성화`,delete:`삭제`,nextRun:`다음 실행: {time}`,originSystem:`시스템`,originUser:`사용자`,originSkill:`스킬`,runFailed:`실행 실패: {error}`,toggleFailed:`토글 실패: {error}`,deleteFailed:`삭제 실패: {error}`,detailsToggle:`상세 보기`,promptLabel:`프롬프트`,roleLabel:`역할`,confirmDelete:`작업 「{name}」을(를) 삭제하시겠습니까? 되돌릴 수 없습니다.`,hintNewsRss:`뉴스 / RSS 가져오기`,hintJournal:`일일 저널 처리`,hintWiki:`위키 유지 관리`,hintMemory:`메모리 추출`,hintCalendar:`캘린더 / 연락처 동기화`},pluginCanvas:{undo:`실행 취소`,redo:`다시 실행`,clear:`지우기`,styleLabel:`스타일:`,stylePromptWithPath:"`{path}`의 이미지를 {style} 스타일 이미지로 변환해 주세요.",stylePromptNoPath:`캔버스에 그린 그림을 {style} 스타일 이미지로 변환해 주세요.`,saveFailed:`저장 안 됨`},pluginWiki:{backToIndex:`목차로 돌아가기`,pdf:`PDF`,pdfFailed:`⚠ PDF 실패`,tabIndex:`목차`,tabLog:`로그`,tabLint:`Lint`,tabGraph:`그래프`,graphEmpty:`아직 그래프로 표시할 링크가 없습니다.`,linkedReferences:`역링크`,empty:`Wiki 가 비어 있습니다. Wiki Manager 에게 소스를 수집하도록 요청하세요.`,previewMore:`+ {count}개 더…`,chatPlaceholder:`이 페이지에 대해 질문…`,emptyPage:`「{title}」 페이지가 아직 없습니다.`,emptyContent:`「{title}」 페이지는 존재하지만 내용이 없습니다.`,createPage:`이 Wiki 페이지 작성 요청`,updatePage:`이 Wiki 페이지 업데이트 요청`,tagFilterAll:`전체`,noMatches:`#{tag} 태그가 달린 페이지가 없습니다`,lintChat:`Wiki 점검`,taskCountMismatch:`Wiki 원본과 렌더링 결과의 작업 수가 일치하지 않아, 파일 손상을 방지하기 위해 토글이 거부되었습니다.`,metadataCreated:`생성`,metadataUpdated:`업데이트`,metadataEditor:`편집자`,pageEditHeader:`Wiki 편집`,snapshotExpired:`스냅샷 만료됨 — 현재 페이지 표시 중`,snapshotLoadError:`스냅샷을 불러오지 못했습니다 — 페이지가 여전히 존재할 수 있습니다. 새로고침해 보세요.`,pageDeleted:`페이지가 삭제되었습니다`,history:{tabContent:`본문`,tabHistory:`기록`,empty:`아직 기록이 없습니다 — 이 페이지를 편집하면 첫 번째 버전이 여기에 기록됩니다.`,loading:`기록을 불러오는 중…`,backToList:`기록 목록으로 돌아가기`,restoreButton:`이 버전으로 복원`,restoreConfirmTitle:`이 버전으로 복원하시겠습니까?`,restoreConfirmBody:`{editor}이(가) {ts}에 저장한 버전으로 페이지를 복원합니다. 현재 페이지는 교체되지만 기존 기록은 유지됩니다.`,restoreConfirmAction:`복원`,restoreConfirmCancel:`취소`,restoreSuccessToast:`페이지를 복원했습니다.`,restoreFailureBanner:`복원에 실패했습니다: {error}`,compareCurrent:`현재 페이지와 비교`,comparePrevious:`이전 버전과 비교`,diffNoPrevious:`비교할 이전 버전이 없습니다.`,diffNoChanges:`이 버전과 비교 대상 사이에 내용 차이가 없습니다.`,editorBadgeUser:`사용자`,editorBadgeLLM:`LLM`,editorBadgeSystem:`시스템`,hiddenLines:`변경되지 않은 {count}줄 숨김`,expandHidden:`표시`}},pluginPresentForm:{fallbackTitle:`양식`,fieldCount:`{count}개 항목`,submitted:`제출됨`,errorSummary:`다음 오류를 수정해주세요`,requiredMarker:`*`,selectOption:`선택하세요`,charactersCount:`{current} / {max} 자`,charactersCountNoMax:`{current} 자`,submit:`제출`,progress:`필수 항목 {total}개 중 {filled}개 입력됨`},pluginPresentSvg:{saveAsPng:`PNG 로 다운로드`,png:`PNG`,saveAsPdf:`PDF 로 저장 (인쇄 대화 상자 열기)`,pdf:`PDF`,untitled:`SVG 도형`,editSource:`SVG 소스 편집`,cancel:`취소`,applyChanges:`변경 사항 적용`,saving:`저장 중...`,saveError:`⚠ 저장 실패: {error}`,exportError:`⚠ 내보내기 실패: {error}`,loadingSource:`소스를 불러오는 중…`,sourceError:`소스 로드 실패: {error}`},photoLocations:{title:`사진 위치 정보`,summary:`{total}개 캡처됨 · {withGps}개 GPS 포함`,mapHint:`Claude에게 "지도에 표시해줘"라고 요청하면 Google Map 플러그인으로 일괄 표시됩니다.`,loading:`로드 중…`,empty:`아직 캡처된 사진 위치가 없습니다. GPS 태그가 있는 사진을 채팅이나 연결된 bridge로 보내면 누적되기 시작합니다.`,noGps:`GPS 데이터 없음`},pluginManageSkills:{deleteProjectSkill:`이 프로젝트 스킬 삭제`,unstarPresetSkill:`이 프리셋 별표 해제 — 카탈로그로 돌아갑니다`,heading:`스킬`,previewCount:`{count}개 스킬`,previewMore:`+{count}개 더`,subheading:({named:e})=>`${e(`count`)}개 사용 가능 · 클릭해서 보기 · "Run" 은 /<name> 형식으로 호출합니다`,emptyWithPath:`스킬을 찾을 수 없습니다. {path} 아래에 스킬 폴더를 추가하세요.`,emptySkillPath:`~/.claude/skills/`,selectHint:`왼쪽에서 스킬을 선택해 SKILL.md 를 확인하세요.`,loading:`불러오는 중…`,fieldDescription:`설명`,fieldBody:`본문 (Markdown)`,emptyBody:`(본문 비어 있음)`,btnEdit:`편집`,btnDelete:`삭제`,btnUnstar:`별표 해제`,errListFailed:`스킬 목록 불러오기 실패: {error}`,errDetailFailed:`스킬 상세 불러오기 실패: {error}`,errSaveFailed:`저장 실패: {error}`,errDeleteFailed:`삭제 실패`,confirmDelete:`스킬 "{name}" 을(를) 삭제할까요? ~/mulmoclaude/.claude/skills/{name}/SKILL.md 가 제거됩니다.`,confirmUnstar:`"{name}" 을(를) 카탈로그로 되돌릴까요? 프롬프트에는 더 이상 로드되지 않지만, 카탈로그의 복사본은 남아 있어 언제든 다시 별표할 수 있습니다.`,sectionActive:`활성`,sectionCatalog:`카탈로그`,sectionLegendActive:`Claude가 지금 사용할 수 있는 스킬. 대화 흐름에서 Claude가 자동으로 사용하거나, 스킬 이름을 입력해 호출할 수 있습니다. {system} 시스템(동봉 mc-) / {project} 프로젝트(편집 가능, 이 워크스페이스 전용) / {user} 사용자(~/.claude/skills/ 의 스킬) / {claudePlugin} 플러그인(설치된 Claude Code 플러그인. 읽기 전용).`,sectionLegendCatalog:`카탈로그: {star}를 누르면 활성이 되는 스킬. 활성에서 {star}를 해제하면 카탈로그로 돌아가고 Claude는 사용하지 않게 됩니다 (스킬은 삭제되지 않습니다).`,catalogEmpty:`사용 가능한 프리셋 스킬이 없습니다.`,catalogPresetHeading:`프리셋`,catalogStar:`별 표시`,catalogStarred:`별 표시됨`,sourceUserTitle:`사용자 스킬 (~/.claude/skills/, 모든 워크스페이스 공통)`,sourceClaudePluginTitle:`플러그인 스킬 (설치된 Claude Code 플러그인 — 읽기 전용, 플러그인에서 갱신)`,sourceSystemTitle:`시스템 스킬 (동봉, mc- 접두사 — 읽기 전용, 런처 부팅 시 덮어씀)`,sourceProjectTitle:`프로젝트 스킬 (워크스페이스 .claude/skills/, 이 워크스페이스 전용)`,sourcePresetTitle:`프리셋 카탈로그 — 별 표시를 눌러 이 워크스페이스에 활성화`,errCatalogListFailed:`카탈로그를 불러오지 못했습니다: {error}`,errCatalogStarFailed:`스킬에 별 표시를 추가하지 못했습니다: {error}`,errCatalogPreviewFailed:`스킬 미리보기를 불러오지 못했습니다: {error}`,catalogAddRepo:`스킬 저장소 추가`,catalogAddRepoTitle:`스킬 저장소 추가`,catalogRepoUrlLabel:`GitHub URL`,catalogRepoUrlPlaceholder:`https://github.com/owner/repo`,catalogRepoSubpathLabel:`하위 경로 (선택)`,catalogRepoSubpathPlaceholder:`skills`,catalogAddRepoSubmit:`설치`,catalogAddRepoSuggestions:`추천 저장소`,catalogUninstallRepo:`저장소 제거`,catalogUpdateRepo:`저장소 업데이트(최신 다시 가져오기)`,catalogRepoOpenLink:`GitHub에서 저장소 열기(새 탭)`,catalogUninstallConfirm:`이 저장소를 제거할까요? 이미 별표한 스킬은 활성 목록에 남습니다.`,catalogRepoInstalling:`설치 중…`,catalogRepoEmpty:`이 저장소에서 스킬을 찾을 수 없습니다.`,sourceExternalTitle:`외부 스킬 (GitHub 저장소에서 설치 — 별표로 활성화)`,errCatalogRepoListFailed:`설치된 저장소를 불러오지 못했습니다: {error}`,errCatalogRepoInstallFailed:`저장소 설치에 실패했습니다: {error}`,errCatalogRepoUninstallFailed:`저장소 제거에 실패했습니다: {error}`,errCatalogRepoInvalidUrl:`GitHub 저장소 URL을 입력하세요.`},pluginManageRoles:{heading:`커스텀 역할`,roleCount:`{count}개 역할`,addButton:`+ 추가`,createPanel:`새 역할 만들기`,fieldId:`ID`,fieldName:`이름`,fieldIcon:`아이콘`,fieldPrompt:`프롬프트`,fieldPlugins:`플러그인`,fieldModel:`모델`,modelUnset:`(미설정 — 전체 설정 따르기)`,modelHelp:`이 역할로 시작한 세션은 이 모델로 동작합니다. 상주하는 루틴 역할을 최상위 모델의 주간 한도에서 빼두는 데 쓸 수 있습니다. 내장 역할은 항상 전체 설정을 따릅니다.`,fieldStarterQueries:`시작 질문`,onePerLine:`(한 줄에 하나)`,helpLink:`?`,idFormatted:`({id})`,missingEnv:`({env} 누락)`,requiresEnv:`.env 에 {env} 가 필요합니다`,collapse:`접기`,expand:`펼치기`,idPlaceholder:`unique-id`,creating:`생성 중…`,create:`생성`,updating:`업데이트 중…`,update:`업데이트`,cancel:`취소`,delete:`삭제`,emptyHint:`아직 커스텀 역할이 없습니다. "+ 추가" 를 누르거나 Claude 에게 만들어달라고 요청하세요.`,errIdRequired:`ID 는 필수입니다.`,errIdInvalid:`ID 는 영문, 숫자, '-', '_' 만 포함할 수 있습니다.`,errNameRequired:`이름은 필수입니다.`,errIdDuplicate:`ID 가 '{id}' 인 역할이 이미 존재합니다.`,errCreateFailed:`생성 실패`,errSaveFailed:`저장 실패`,errDeleteFailed:`삭제 실패`,errNetworkError:`네트워크 오류`,errServerError:`서버 오류: {status}`,errRefreshFailed:`저장했지만 목록을 새로고침하지 못했습니다.`,confirmDelete:`역할 「{name}」을(를) 삭제하시겠습니까? 되돌릴 수 없습니다.`},pluginUiImage:{promptLabel:`{label}:`},markdownCodeCopy:{copyLabel:`코드 복사`,copiedLabel:`복사됨`},markdownMermaid:{loadFailed:`⚠ Mermaid 로드 실패: {error}`,renderFailed:`⚠ Mermaid 렌더링 실패: {error}`},pluginTextResponse:{pdf:`PDF`,pdfFailed:`⚠ PDF 실패`,editContent:`텍스트 내용 편집`,applyChanges:`변경 사항 적용`,copyLabel:`복사`,speakerSystem:`시스템`,speakerUser:`나`,speakerAssistant:`어시스턴트`,copiedLabel:`복사됨!`,cancel:`취소`,seededByPlugin:`{pkg}에서`,seededByPluginTooltip:`이 메시지는 사용자가 보낸 것이 아니라 {pkg} 플러그인에서 작성한 것입니다.`,truncatedForRender:`이 메시지는 매우 깁니다(총 {total}자). 탭이 멈추지 않도록 앞부분만 표시됩니다 — {omitted}자 숨김. 전체 원문은 복사 버튼으로 가져올 수 있습니다.`},pluginSkill:{noDescription:`(설명 없음)`},pluginSpreadsheet:{previewUntitled:`스프레드시트`,previewSheets:`{count}개 시트`,untitled:`스프레드시트`,excel:`Excel`,valuePlaceholder:`값`,valueOrFormulaPlaceholder:`값 또는 수식 (예: 100 또는 SUM(B2:B11))`,formatPlaceholder:`형식 (예: $#,##0.00)`,loading:`스프레드시트를 불러오는 중...`,noData:`사용 가능한 스프레드시트 데이터가 없습니다`,editData:`스프레드시트 데이터 편집`,applyChanges:`변경 사항 적용`,dataMustBeArray:`데이터는 시트 배열이어야 합니다`,loadFailed:`스프레드시트 불러오기 실패: {error}`,invalidJsonAlert:`잘못된 JSON 형식: {error}`,unknownError:`알 수 없는 오류`,update:`업데이트`,stringType:`문자열`,formulaType:`수식`},app:{startConversation:`대화 시작`,thinking:`생각 중…`},suggestionsPanel:{suggestions:`추천`,skills:`스킬`,tooltip:`추천 및 스킬`,emptySuggestions:`추천이 없습니다.`,emptySkills:`설치된 스킬이 없습니다.`,skillsError:`스킬을 불러오지 못했습니다: {error}`,sendEditHint:`클릭하여 전송 · shift+클릭 으로 편집`},settingsToolsTab:{explanation:`{allowedTools} 를 통해 Claude 에 전달할 추가 도구 이름. 한 줄에 하나씩. {claudeMcp} 로 인증을 완료한 후 Claude Code 내장 MCP 서버 (Gmail / Google 캘린더 등) 를 사용할 때 유용합니다.`,connectorsSectionTitle:`연결된 커넥터`,connectorsEmpty:`커넥터를 찾을 수 없습니다.`,connectorConnected:`연결됨`,connectorDisconnected:`연결 안 됨`,connectorsGuide:`Slack, Gmail 등의 커넥터로 Claude가 계정에 접근할 수 있습니다. 커넥터 추가 및 제거는 Claude Desktop 또는 {configLink}에서 할 수 있습니다. (claude.ai로 이동합니다)`,connectorsConfigLinkText:`여기`},confirmModal:{defaultTitle:`확인`,defaultConfirm:`확인`,defaultCancel:`취소`}},Llt={common:{downloadZip:`ZIP`,downloadFailed:`Error al descargar`,save:`Guardar`,cancel:`Cancelar`,loading:`Cargando...`,close:`Cerrar`,dismiss:`Descartar`,add:`Añadir`,remove:`Quitar`,yes:`Sí`,no:`No`,saving:`Guardando...`,saved:`Guardado`,noResultsYet:`Aún no hay resultados`,noImageYet:`Aún no hay imagen`,sendChat:`Iniciar un chat nuevo`},sessionTabBar:{newSession:`Nueva sesión`,activeSessions:`{count} sesión activa (agente en ejecución) | {count} sesiones activas (agente en ejecución)`,unreadReplies:`{count} respuesta sin leer | {count} respuestas sin leer`,unreadDot:`Nueva respuesta`,origin:{scheduler:`Iniciada por el programador`,skill:`Iniciada por una skill`,bridge:`Iniciada por un bridge`}},chatInput:{placeholder:`Mensaje para Claude…`,send:`Enviar`,stop:`Detener`,runningPlaceholder:`En ejecución… pulsa Enter para poner en cola`,removeBuffered:`Eliminar mensaje en cola`,attachFile:`Adjuntar archivo`,fileTooLarge:`El archivo es demasiado grande ({sizeMB} MB). El máximo es 30 MB.`,fileOnlyAttachment:`No se puede leer el contenido: se pasa como archivo`,readFileFailed:`No se pudo leer el archivo.`,attachImageFailed:`No se pudo adjuntar la imagen: {error}`,stopFailed:`No se pudo detener la ejecución: {error}`,dropHint:`Suelta el archivo para adjuntar`,tooManyFiles:`Puedes adjuntar hasta {max} archivos a la vez.`,removeAttachment:`Quitar {name}`,attachmentFallbackName:`archivo adjunto`,voice:{start:`Iniciar entrada de voz`,stop:`Detener entrada de voz`}},cspViolation:{notice:`⚠ Una vista intentó cargar {host}, pero la política de seguridad de contenido lo bloqueó ({directive}). Para permitirlo, añade el host a config/csp.json, solo si confías en él.`,dismiss:`Descartar`},sessionHistoryPanel:{filters:{all:`Todas`,unread:`No leídas`,bookmarked:`Marcadas`,longRunning:`De larga duración (24h+)`,human:`Persona`,scheduler:`Programador`,skill:`Skill`,bridge:`Bridge`},failedToRefresh:`⚠ Error al actualizar: {error}`,showingLastKnown:` — mostrando la última lista conocida.`,noSessions:`Aún no hay sesiones.`,noMatching:`No hay sesiones coincidentes.`,running:`En ejecución`,noMessages:`(sin mensajes)`,openRowAria:`Abrir sesión: {preview}`,rowMenuAria:`Acciones de sesión`,bookmark:`Marcar`,unbookmark:`Quitar marcador`,delete:`Eliminar`,deleteConfirm:`¿Eliminar esta sesión?
|
|
241
241
|
|
|
242
242
|
{preview}
|
|
243
243
|
|
|
244
|
-
Esta acción no se puede deshacer.`},notificationBell:{notifications:`Notificaciones`,activeSection:`Activas`,historySection:`Historial`,noActive:`Sin notificaciones activas`,noHistory:`Sin actividad reciente`,clearAll:`Borrar`,dismiss:`Descartar`,cancel:`Cancelar`,showMore:`Mostrar más ({count})`,showLess:`Mostrar menos`,openTarget:`Abrir`,expandDetails:`Expandir detalles`},pluginDiagnostics:{title:`Problema de configuración del plugin`,hostBody:`El plugin "{plugin}" intentó registrar la clave {label} "{key}", pero está reservada por el host. La entrada del plugin se ha descartado.`,intraBody:`Los plugins "{first}" y "{second}" registran ambos el {dimension} "{key}". "{first}" lo reclamó primero, por lo que el registro de "{second}" se ignora.`},shadowedEnv:{title:`El shell está anulando .env`,body:`Definido tanto en el shell como en .env: {keys}. Prevalece el valor del shell, por lo que .env se ignora. Si editaste .env, actualiza o elimina el valor del shell y reinicia.`},optionalDeps:{title:`Dependencia opcional no disponible`,titleNotFound:`{command} no está instalado`,titleNotResponding:`{command} no está en ejecución`,notFound:`No se encontró {command} — las funciones relacionadas se han desactivado. Instala {command} y reinicia MulmoClaude para habilitarlas.`,notResponding:`{command} está instalado pero no se está ejecutando — las funciones relacionadas se han desactivado. Inicia {command} y reinicia MulmoClaude para habilitarlas.`},billingMigration:{title:`La facturación pasó a configurarse bajo demanda`,body:`Las colecciones incluidas clients, worklog, invoice y profile se eliminaron de tu panel, pero tus datos están seguros e intactos. Pide configurar el seguimiento de clientes y horas y, luego, la facturación para volver a crearlas; tus registros existentes reaparecerán.`},backendOffline:{title:`No se puede conectar con el backend`,body:`Es posible que el servidor de MulmoClaude no esté en ejecución. Comprueba el servidor de desarrollo y vuelve a intentarlo.`,retry:`Reintentar`},pluginErrorBoundary:{title:`El plugin {pkg} se ha bloqueado`,subtitle:`El plugin no se pudo renderizar. El error se ha registrado en la consola.`,showDetails:`Mostrar detalles`,hideDetails:`Ocultar detalles`,retry:`Reintentar`},remoteHostOffline:{title:`Host remoto desconectado`,body:`Tu teléfono no podrá enviar a este dispositivo hasta que vuelvas a conectarte.`,reconnect:`Reconectar`},authTokenStale:{title:`Esta página necesita recargarse`,body:`El servidor rechazó el token de esta página y no se pudo obtener uno nuevo. Recarga para continuar.`,reload:`Recargar`},remoteHost:{title:`Host remoto`,online:`Host remoto en línea`,offline:`Host remoto sin conexión`,uid:`uid {uid}`,signIn:`Iniciar sesión con Google`,connecting:`Conectando…`,disconnect:`Desconectar`,disconnecting:`Desconectando…`,noToken:`El inicio de sesión de Google no devolvió idToken`,connectFailed:`Error al conectar`,disconnectFailed:`Error al desconectar`,signInFailed:`Error al iniciar sesión con Google`,statusFailed:`Error al cargar el estado`,description:`El acceso remoto permite que un dispositivo móvil se conecte a las colecciones y feeds de este MulmoClaude.`,howTo:`En tu teléfono, abre {url} e inicia sesión con la misma cuenta de Google.`,customViewHint:`Para una vista compatible con móviles, pide a Claude que cree una {keyword} (no una custom view normal).`,qrHint:`O escanea este código QR con la cámara de tu teléfono.`},sessionModelChip:{tooltip:`Modelo que usa esta sesión: {model}`,tooltipOverride:`Modelo de este chat: {model} (anula el rol / ajuste global)`,ariaLabel:`Modelo de este chat`,clear:`Volver al valor por defecto`,unknown:`desconocido`,inherited:`{model} (heredado)`},sidebarHeader:{newMessages:`Mensajes nuevos`,home:`Ir al chat más reciente`,toolCallHistory:`Historial de llamadas a herramientas`,settings:`Ajustes`,settingsGeminiMissing:`Ajustes — Falta la clave API de Gemini`,todayJournal:`Resumen de hoy`,todayJournalNotFound:`Aún no hay resumen — chatea un rato y el journal lo generará.`,todayJournalLoadFailed:`Error al cargar el journal (status {status}): {error}`,copyMarkdown:`Copiar la conversación como Markdown`,copiedMarkdown:`¡Copiado!`},rightSidebar:{permalink:`Enlace al mensaje seleccionado`,copyPermalink:`Copiar enlace al mensaje seleccionado`,copiedPermalink:`¡Copiado!`,toggleSystemPrompt:`Alternar system prompt`,systemPrompt:`System Prompt`,availableTools:`Herramientas disponibles`,toggleToolDescription:`Alternar descripción de la herramienta`,toolCallHistory:`Historial de llamadas a herramientas`,copyHistory:`Copiar historial de llamadas a herramientas`,copiedHistory:`¡Copiado!`,noToolCalls:`Aún no hay llamadas a herramientas`,arguments:`Argumentos`,error:`Error`,result:`Resultado`,running:`Ejecutando...`,mcpHint:{title:e=>`Ayuda de configuración: ${e.named(`server`)}`,requiredKeys:`Claves requeridas`,setupGuide:`Abrir guía de configuración`}},fileTreePane:{sort:`Orden:`,sortByName:`Ordenar por nombre`,name:`Nombre`,sortByRecent:`Ordenar por fecha de modificación (más recientes primero)`,recent:`Reciente`,reference:`Referencia`,readOnlyBadge:`RO`,showSystemFiles:`Mostrar archivos del sistema`,showSystemFilesTitle:`Muestra los directorios raíz internos del agente (conversations/, feeds/, etc.) además del contenido del usuario (data/, artifacts/, config/).`},fileTree:{dropHint:`Suelta archivos aquí para guardarlos en esta carpeta`,upload:{progress:`Subiendo {done} de {total}…`,done:`Se guardaron {count} archivo(s)`,failed:`No se pudieron guardar {count} archivo(s)`},workspace:`(área de trabajo)`,recentlyChanged:`Modificados recientemente`,newFileMenuItem:`Nuevo archivo`,newFileInputAria:`Nombre del nuevo archivo`,newFilePlaceholder:{wikiPage:`slug-de-página`,summary:`nombre-de-resumen`,document:`nombre-de-documento`,html:`nombre-de-página`,story:`nombre-de-historia`},newFileError:{empty:`El nombre del archivo no puede estar vacío.`,unsafe:`El nombre del archivo contiene caracteres no válidos.`,exists:`Ya existe un archivo llamado {filename} aquí.`,saveFailed:`No se pudo crear el archivo. Inténtalo de nuevo.`}},lockStatusPopup:{sandboxEnabledTooltip:`Sandbox activado (Docker)`,noSandboxTooltip:`Sin sandbox (Docker no encontrado)`,sandboxEnabledLabel:`Sandbox activado:`,sandboxEnabledBody:`Docker está en ejecución. El acceso al sistema de archivos está aislado.`,noSandboxLabel:`Sin sandbox:`,noSandboxBodyPrefix:`Claude puede acceder a todos los archivos del equipo. Instala`,noSandboxBodySuffix:`para activar el aislamiento del sistema de archivos.`,dockerDesktop:`Docker Desktop`,hostCredentials:`Credenciales del host adjuntas:`,credsLoading:`cargando…`,sshAgent:`Agente SSH:`,forwarded:`reenviado`,notForwarded:`no reenviado`,mountedConfigs:`Configuraciones montadas:`,none:`ninguna`,testIsolation:`Probar el aislamiento del sandbox:`},settingsModal:{title:`Ajustes`,version:`MulmoClaude v{version}`,tabs:{gemini:`Clave API de Gemini`,tools:`Herramientas permitidas`,mcp:`Servidores MCP`,dirs:`Directorios`,refs:`Directorios de referencia`,map:`Mapa`,photos:`Fotos`,google:`Google`,model:`Modelo`,voice:`Voz`,chatIndex:`Índice de chat`,journal:`Diario`,notifications:`Web Push`,skills:`Skills`,roles:`Roles`,quit:`Salir`},groups:{llm:`LLM`,servers:`Servidores`,workspace:`Espacio de trabajo`,notifications:`Notificaciones`,plugins:`Plugins`,management:`Gestión`,server:`Servidor`},navAriaLabel:`Secciones de ajustes`,googleTab:{description:`Vincula tu cuenta de Google para que esta máquina pueda llamar a las API de Google (primero Calendar). El token de actualización se guarda solo en esta máquina y nunca se envía a ningún servidor que no sea Google.`,statusLinked:`Vinculada`,statusNotLinked:`No vinculada`,statusPending:`Esperando a que termine el consentimiento en el navegador…`,connect:`Vincular cuenta de Google`,unlink:`Desvincular`,unlinkConfirm:`¿Desvincular la cuenta de Google? El token guardado se revocará y se eliminará de esta máquina.`,clientSecretAmbiguous:`Se encontraron varios archivos client_secret_*.json en ~/.secrets/. Conserva solo uno para que el token guardado siga emparejado con el cliente OAuth correcto.`,loadError:`No se pudo cargar el estado de la vinculación con Google.`,connectError:`No se pudo iniciar el flujo de autorización de Google.`,unlinkError:`No se pudo desvincular la cuenta de Google.`},geminiTab:{required:`La generación de imágenes requiere {envKey}. Pega la clave abajo y guárdala.`,apiKeyLabel:`Clave de API de Gemini`,apiKeyPlaceholder:`AIza…`,helperText:`Crea o copia una clave en {studioLink}.`,storageNote:`Se guarda solo en este equipo, fuera del espacio de trabajo, y solo tú puedes leerla. Se aplica al instante: no hace falta reiniciar.`,storedHere:`Guardada en la app`,storedInEnvironment:`Procede del entorno`,notConfigured:`Sin configurar`,clear:`Borrar`,fromEnvironment:`Esta clave viene del shell que inició la app o de {envFile}. Una clave guardada aquí tiene prioridad.`,loadError:`No se pudo cargar el estado de la clave`,saveError:`No se pudo guardar la clave`,clearError:`No se pudo borrar la clave`},mapTab:{description:`Configura la clave de la API de Google Maps que usa el plugin de mapas. La clave se guarda localmente y solo se envía a Google Maps.`,apiKeyLabel:`Clave API de Google Maps`,apiKeyPlaceholder:`AIza…`,helperText:`Crea o copia una clave en {consoleLink}.`,requiredApis:`APIs necesarias: Maps JavaScript API, Geocoding API, Places API (New), Directions API.`,configured:`Configurada`,notConfigured:`Sin configurar`,clear:`Borrar`,loadError:`Error al cargar los ajustes`,saveError:`Error al guardar`},photosTab:{description:`Controles de privacidad para las fotos recibidas por chat o por un bridge conectado. Los datos de ubicación EXIF son sensibles — desmarca para desactivar la captura automática.`,autoCaptureLabel:`Capturar automáticamente la ubicación de las fotos`,autoCaptureHint:`Activado: cada imagen subida con GPS en EXIF genera un sidecar de ubicación en data/locations/. Desactivado: no se captura nada automáticamente; el LLM aún puede extraer EXIF manualmente.`,statusOn:`Captura automática ACTIVADA`,statusOff:`Captura automática DESACTIVADA`,loadError:`Error al cargar los ajustes`,saveError:`Error al guardar`},quitTab:{description:`Detén el servidor de MulmoClaude que se ejecuta en este equipo. Si lo abriste desde el icono, sigue funcionando aunque cierres esta pestaña: así se detiene sin usar una terminal.`,restartHint:()=>"Para volver a iniciarlo, haz doble clic en el icono de MulmoClaude (o ejecuta `npx mulmoclaude@latest`).",quitLabel:`Salir de MulmoClaude`,confirmBody:`El servidor se detiene y esta página deja de funcionar. Se interrumpe todo lo que esté en curso.`,confirmLabel:`Salir`,stopping:`Deteniendo…`,stoppedTitle:`MulmoClaude se ha detenido`,stoppedBody:`Puedes cerrar esta pestaña. Haz doble clic en el icono para volver a iniciarlo.`,error:`No se pudo detener el servidor`},notificationsTab:{description:`Recibe una notificación push en tus dispositivos registrados cuando termina una tarea que iniciaste aquí — útil cuando preguntas algo, te alejas y quieres saber en cuanto la respuesta esté lista.`,enableLabel:`Enviar una Web Push cuando termine una tarea`,enableHint:`Se activa cuando se completa un chat que iniciaste aquí. Las tareas programadas y en segundo plano no lo activan.`,remoteHostNote:`Requiere la conexión RemoteHost (que proporciona el inicio de sesión) y al menos un dispositivo registrado. Si falta alguno, no hace nada.`,macosRemindersLabel:`Crear un recordatorio de macOS al terminar una tarea`,macosRemindersHint:`Añade la tarea terminada a tu lista de Recordatorios predeterminada. La sincronización de iCloud la refleja en tu iPhone, que es quien entrega la notificación.`,macosRemindersForcedOff:`Desactivado al iniciar con --disable-macos-reminders o DISABLE_MACOS_REMINDER_NOTIFICATIONS. Quita la opción o anula la variable de entorno y reinicia para controlarlo desde aquí.`,statusOn:`Web Push está ACTIVADO`,statusOff:`Web Push está DESACTIVADO`,loadError:`Error al cargar los ajustes`,saveError:`Error al guardar`},modelTab:{description:`Elige el modelo y el esfuerzo de razonamiento que Claude Code usa en cada turno. Deja cualquiera sin configurar para mantener la resolución propia de Claude.`,modelLabel:`Modelo`,modelUnset:`(sin configurar — seguir ~/.claude/settings.json)`,modelHelperText:`Sin configurar, el modelo viene de ~/.claude/settings.json, el mismo archivo donde otros clientes de Claude Code (VS Code, Cursor) guardan su elección de /model, así que un cambio allí también afecta a MulmoClaude. Los alias siguen la última generación de cada familia.`,modelConfigured:`Modelo: {model}`,modelNotConfigured:`Sin configurar (compartido)`,effortLabel:`Esfuerzo de razonamiento`,effortUnset:`(sin configurar — usar valor por defecto de Claude)`,helperText:`Niveles más altos permiten más tiempo de pensamiento pero aumentan la latencia y el uso de tokens.`,configured:`Esfuerzo: {level}`,notConfigured:`Sin configurar`,userSettingsLabel:`Cargar los ajustes de usuario y los plugins de Claude Code`,userSettingsHint:`Lee las skills, los plugins y los hooks de ~/.claude, los mismos que usa Claude Code. Desactívalo si los plugins instalados traen tantas skills que cada petición se vuelve pesada; las skills del propio espacio de trabajo siguen funcionando. Se aplica desde el siguiente mensaje. Si está desactivado, un modelo sin configurar ya no sigue ~/.claude/settings.json.`,skillListingSummary:`Skills cargadas en el último turno: {count}.`,skillListingPlugins:`De los plugins: {plugins}.`,skillListingHeavy:`Con tantas skills cada petición pesa más; al desactivarlo se quitan las de ~/.claude.`,loadError:`Error al cargar los ajustes`,saveError:`Error al guardar`},voiceTab:{description:`Dicta mensajes de chat con tu voz. El audio se transcribe localmente en la máquina que ejecuta MulmoClaude; no se envía nada a ningún servicio externo.`,requirements:`Disponible solo en macOS. Requiere el servidor whisper.cpp: compílalo con yarn build:whisper (consulta la sección Local Voice Input del README).`,unsupported:`La entrada de voz requiere macOS con el servidor whisper.cpp instalado. No está disponible en esta máquina.`,enableLabel:`Activar entrada de voz`,enableHint:`Al activarlo se descarga una vez el modelo de voz (1–3 GB). Luego aparece un botón de micrófono en la entrada de chat.`,modelLabel:`Modelo de voz`,downloading:`Descargando modelo… {percent}%`,ready:`Modelo listo`,downloadError:`Error al descargar el modelo.`,retry:`Reintentar`,loadError:`Error al cargar los ajustes`,saveError:`Error al guardar`},chatIndexTab:{description:`Títulos y resúmenes automáticos generados por IA para tu historial de chat. Sale desactivado por defecto — las sesiones de automatización (scheduler / trabajadores del sistema) siempre se omiten aunque esté activado; las sesiones humanas solo pagan una llamada al resumidor al terminar cada turno.`,modeLabel:`Modelo del índice de chat`,helperText:`Haiku es más económico; Sonnet ofrece títulos más precisos en sesiones largas con cambios de tema.`,mode:{off:`Desactivado`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`La indexación está DESACTIVADA`,haiku:`Indexando con Haiku`,sonnet:`Indexando con Sonnet`},loadError:`Error al cargar los ajustes`,saveError:`Error al guardar`},journalTab:{description:`Diario automático — resume las sesiones de chat recientes en journal/*.md y extrae notas de memoria duradera. Sale desactivado. Las sesiones de automatización (scheduler / trabajadores del sistema) se excluyen siempre, independientemente de esta configuración.`,modeLabel:`Modelo del diario`,helperText:`Haiku es más económico; Sonnet produce resúmenes diarios y por tema más ricos. El pase horario solo se ejecuta cuando esto está activado.`,mode:{off:`Desactivado`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`El diario está DESACTIVADO`,haiku:`Diario en ejecución con Haiku`,sonnet:`Diario en ejecución con Sonnet`},loadError:`Error al cargar los ajustes`,saveError:`Error al guardar`},geminiAskButton:`Preguntar a Claude`,geminiAskMessage:`¿Cuál es el rol de la clave API de Gemini en esta app?`,toolNamesLabel:`Nombres de herramientas`,invalidToolNamesPrefix:`Estas parecen no estándar (prefijo esperado`,invalidToolNamesSuffix:`):`,mcpToolsError:`⚠ No se pudo obtener el estado de las herramientas MCP: {error}. Mostrando todas las herramientas sin importar si están habilitadas.`,changesHint:`Los cambios se aplican en el siguiente mensaje. No hace falta reiniciar.`,cannotSaveTooltip:`No se puede guardar hasta que los ajustes se carguen correctamente`,saving:`Guardando…`,loadingLabel:`Cargando…`,unsavedMarker:`●`,unsavedToolsConfirm:`Allowed Tools tiene cambios sin guardar. ¿Cerrar de todos modos?`,unsavedMcpDraftConfirm:`Hay un borrador de servidor MCP abierto. ¿Cerrar de todos modos?`,mcpSaveFailed:`No se pudieron guardar los cambios de los servidores MCP.`},canvasViewToggle:{stackViewTooltip:`Vista apilada · haz clic para cambiar a vista única`,singleViewTooltip:`Vista única · haz clic para cambiar a vista apilada`,switchToSingle:`Cambiar a vista única`,switchToStack:`Cambiar a vista apilada`},sessionHistoryToggle:{showTooltip:`Mostrar el panel de historial de sesiones a la izquierda`,hideTooltip:`Ocultar el panel de historial de sesiones`,show:`Mostrar historial de sesiones`,hide:`Ocultar historial de sesiones`},sessionHistoryExpand:{expandTooltip:`Expandir el panel de historial de sesiones a ancho completo`,collapseTooltip:`Contraer el panel de historial de sesiones`,expand:`Expandir historial de sesiones`,collapse:`Contraer historial de sesiones`},settingsWorkspaceDirs:{explanation:`Directorios personalizados para organizar archivos dentro de {dataDir} y {artifactsDir}. Claude los utiliza para decidir dónde guardar los archivos.`,noEntries:`No hay directorios personalizados configurados.`,addDirTitle:`Añadir directorio`,pathPlaceholder:`data/clientes o artifacts/informes`,descPlaceholder:`Descripción (qué va en esta carpeta)`,errPathRequired:`La ruta es obligatoria`,errMustStartWith:`Debe comenzar con data/ o artifacts/`,errAlreadyExists:`Ya existe`},settingsReferenceDirs:{explanation:`Directorios externos que Claude puede leer pero no modificar. En modo Docker se montan como solo lectura. Útiles para consultar bóvedas de Obsidian, código de proyectos o carpetas de documentos.`,noEntries:`No hay directorios de referencia configurados.`,addDirTitle:`Añadir directorio de referencia`,pathPlaceholder:`/Users/yo/ObsidianVault o ~/Documentos/notas`,labelPlaceholder:`Etiqueta (opcional — por defecto el nombre de la carpeta)`,readOnlyBadge:`solo lectura`,errPathRequired:`La ruta es obligatoria`,errMustBeAbsolute:`Debe ser una ruta absoluta o comenzar con ~/`,errAlreadyExists:`Ya existe`,errLabelConflict:`La etiqueta "{label}" ya existe`},dashboard:{empty:`Aún no hay colecciones favoritas.`,emptyHint:`Fija una colección (★) para verla aquí.`,viewTable:`Tabla`,viewCalendar:`Calendario`,viewKanban:`Kanban`,viewPickerLabel:`Elegir vista`,openFull:`Doble clic para abrir la vista completa`,dragHint:`Arrastra para reordenar`,resizeHint:`Arrastra para cambiar el tamaño`},pluginLauncher:{chat:{label:`Chat`},dashboard:{label:`Panel`},automations:{label:`Acciones`},wiki:{label:`Wiki`},collections:{label:`Colecciones`},feeds:{label:`Feeds`},accounting:{label:`Contabilidad`},files:{label:`Archivos`}},shortcuts:{pin:`Fijar en el lanzador`,unpin:`Quitar del lanzador`,zoneAriaLabel:`Accesos directos fijados`,reorder:{open:`Reordenar accesos directos`,title:`Reordenar`,moveUp:`Subir`,moveDown:`Bajar`}},fileContentHeader:{showRendered:`Mostrar Markdown renderizado`,showRaw:`Mostrar código fuente`,rendered:`Renderizado`,raw:`Fuente`,closeFile:`Cerrar archivo`,revealInOs:`Mostrar en la carpeta`,revealInOsFailed:`No se pudo mostrar en la carpeta`},fileContentRenderer:{download:`ZIP`,downloadZip:`Descargar como zip autónomo (recursos incluidos)`,downloadError:`Error al descargar`,selectFile:`Selecciona un archivo`,htmlPreview:`Vista previa HTML`,pdfPreview:`Vista previa PDF`,parseError:`error al analizar`,editJson:`Editar JSON`,jsonEditorLabel:`Editor JSON`,invalidJson:`JSON no válido`,undo:`Deshacer`,redo:`Rehacer`,editMarp:`Editar fuente de la diapositiva`,marpEditorLabel:`Fuente de diapositivas Marp`,openInOs:`Abrir en el SO`,openingInOs:`Abriendo…`,openInOsFailed:`No se pudo abrir en el SO`,downloadFile:`Descargar`,downloadingFile:`Descargando…`},filesView:{chatPlaceholder:`Pregunta sobre este archivo…`},systemFiles:{schemaLabel:`Esquema`,showDetails:`Mostrar detalles`,hideDetails:`Ocultar detalles`,editPolicy:{"agent-managed-but-hand-editable":`Gestionado por el agente (edición manual permitida)`,"user-editable":`Editable por el usuario`,"agent-managed":`Gestionado por el agente`,"fragile-format":`Formato frágil`,ephemeral:`Efímero`},mcp:{title:`Servidores MCP`,summary:`Servidores externos del Model Context Protocol conectados al agente. Añade servidores HTTP o stdio para ampliar las herramientas disponibles.`},settings:{title:`Ajustes de la app`,summary:`Preferencias de comportamiento editables — clave API de Gemini, herramientas permitidas, configuración del sandbox, etc.`},schedulerTasks:{title:`Tareas del programador`,summary:`Automatizaciones recurrentes del agente que se disparan en un horario. Se gestionan desde la UI Automations; este archivo es la fuente en disco.`},schedulerOverrides:{title:`Sobrescrituras del programador`,summary:`Sobrescrituras de hora / intervalo por tarea aplicadas sobre el horario del sistema. El agente las edita cuando pides cambiar la franja de una tarea recurrente.`},schedulerItems:{title:`Cola de elementos del programador`,summary:`Invocaciones programadas listas para dispararse. Gestionado por el agente; no edites a mano salvo que entiendas cada campo.`},wikiIndex:{title:`Índice de la wiki`,summary:`Índice autogenerado de cada página de la wiki. Se refresca con cada edición — no edites a mano (tus cambios serán sobrescritos).`},wikiLog:{title:`Registro de edición de la wiki`,summary:`Registro de actividades de creación y edición de páginas. Gestionado por el agente y solo añade — útil como feed de cambios recientes.`},wikiSummary:{title:`Resumen de la wiki`,summary:`Visión general autogenerada de la wiki — clústeres temáticos, recuento de páginas, actividad reciente. Refrescado por el agente.`},wikiSchema:{title:`Esquema de la wiki`,summary:`Especificación de formato que el agente lee para mantener las páginas consistentes. Frágil — espera una estructura concreta; prefiere ediciones del agente.`},memory:{title:`Memoria`,summary:`Hechos destilados sobre ti, cargados siempre como contexto en conversaciones nuevas. El extractor del journal añade automáticamente; también puedes editar a mano.`},summariesIndex:{title:`Índice de resúmenes`,summary:`Índice navegable que enlaza los resúmenes diarios y por tema generados por el journal. Gestionado por el agente; refrescado en cada pasada.`},rolesJson:{title:`Definición del rol (JSON)`,summary:`Configuración del rol — elección de modelo, servidores MCP, plugins permitidos, sugerencias de consulta. Editable, sin reinicio.`},rolesMd:{title:`Descripción del rol (Markdown)`,summary:`Persona y system prompt del rol, cargado como contexto cuando este rol está activo. Editable; los cambios aplican en el siguiente mensaje.`},journalDaily:{title:`Resumen diario del journal`,summary:`Recapitulación autogenerada de tu actividad para un día natural, destilada por el journal a partir de las sesiones de chat.`},journalTopic:{title:`Journal por tema`,summary:`Notas a largo plazo sobre un tema concreto, acumuladas y revisadas conforme sigues hablando de él. Gestionado por el agente.`}},settingsMcpTab:{explanation:`Añade servidores MCP externos. Los servidores HTTP funcionan en todos los modos. Los servidores Stdio usan el {npx} / {node} / {tsx} de la imagen del sandbox; cuando Docker está activo las rutas deben estar dentro del área de trabajo.`,localhostRewrite:`En modo Docker {localhost} se reescribe como {hostDockerInternal}.`,noServers:`Aún no hay servidores MCP configurados.`,enabled:`activado`,urlLabel:`URL:`,commandLabel:`Comando:`,dockerStdioUnsupported:`⚠ No se ejecutará mientras el sandbox de Docker esté activado.`,dockerStdioHostExecActive:`⚠ Se ejecuta en el host: este servidor sale del sandbox de Docker.`,dockerStdioHostExecOptIn:`Ejecutar en el host de todos modos (avanzado). Este servidor se ejecuta fuera del sandbox de Docker mediante una pasarela HTTP local y puede acceder a tu equipo.`,learnMore:`Más información`,addServerButton:`+ Añadir servidor MCP`,nameLabel:`Nombre`,namePlaceholder:`mi-servidor`,typeHttp:`HTTP`,typeStdio:`Stdio (comando)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`Comando`,argsLabel:`Argumentos (uno por línea)`,argsPlaceholder:()=>`-y
|
|
244
|
+
Esta acción no se puede deshacer.`},notificationBell:{notifications:`Notificaciones`,activeSection:`Activas`,historySection:`Historial`,noActive:`Sin notificaciones activas`,noHistory:`Sin actividad reciente`,clearAll:`Borrar`,dismiss:`Descartar`,cancel:`Cancelar`,showMore:`Mostrar más ({count})`,showLess:`Mostrar menos`,openTarget:`Abrir`,expandDetails:`Expandir detalles`},pluginDiagnostics:{title:`Problema de configuración del plugin`,hostBody:`El plugin "{plugin}" intentó registrar la clave {label} "{key}", pero está reservada por el host. La entrada del plugin se ha descartado.`,intraBody:`Los plugins "{first}" y "{second}" registran ambos el {dimension} "{key}". "{first}" lo reclamó primero, por lo que el registro de "{second}" se ignora.`},shadowedEnv:{title:`El shell está anulando .env`,body:`Definido tanto en el shell como en .env: {keys}. Prevalece el valor del shell, por lo que .env se ignora. Si editaste .env, actualiza o elimina el valor del shell y reinicia.`},optionalDeps:{title:`Dependencia opcional no disponible`,titleNotFound:`{command} no está instalado`,titleNotResponding:`{command} no está en ejecución`,notFound:`No se encontró {command} — las funciones relacionadas se han desactivado. Instala {command} y reinicia MulmoClaude para habilitarlas.`,notResponding:`{command} está instalado pero no se está ejecutando — las funciones relacionadas se han desactivado. Inicia {command} y reinicia MulmoClaude para habilitarlas.`},billingMigration:{title:`La facturación pasó a configurarse bajo demanda`,body:`Las colecciones incluidas clients, worklog, invoice y profile se eliminaron de tu panel, pero tus datos están seguros e intactos. Pide configurar el seguimiento de clientes y horas y, luego, la facturación para volver a crearlas; tus registros existentes reaparecerán.`},backendOffline:{title:`No se puede conectar con el backend`,body:`Es posible que el servidor de MulmoClaude no esté en ejecución. Comprueba el servidor de desarrollo y vuelve a intentarlo.`,retry:`Reintentar`},pluginErrorBoundary:{title:`El plugin {pkg} se ha bloqueado`,subtitle:`El plugin no se pudo renderizar. El error se ha registrado en la consola.`,showDetails:`Mostrar detalles`,hideDetails:`Ocultar detalles`,retry:`Reintentar`},remoteHostOffline:{title:`Host remoto desconectado`,body:`Tu teléfono no podrá enviar a este dispositivo hasta que vuelvas a conectarte.`,reconnect:`Reconectar`},authTokenStale:{title:`Esta página necesita recargarse`,body:`El servidor rechazó el token de esta página y no se pudo obtener uno nuevo. Recarga para continuar.`,reload:`Recargar`},remoteHost:{title:`Host remoto`,online:`Host remoto en línea`,offline:`Host remoto sin conexión`,uid:`uid {uid}`,signIn:`Iniciar sesión con Google`,connecting:`Conectando…`,disconnect:`Desconectar`,disconnecting:`Desconectando…`,noToken:`El inicio de sesión de Google no devolvió idToken`,connectFailed:`Error al conectar`,disconnectFailed:`Error al desconectar`,signInFailed:`Error al iniciar sesión con Google`,statusFailed:`Error al cargar el estado`,description:`El acceso remoto permite que un dispositivo móvil se conecte a las colecciones y feeds de este MulmoClaude.`,howTo:`En tu teléfono, abre {url} e inicia sesión con la misma cuenta de Google.`,customViewHint:`Para una vista compatible con móviles, pide a Claude que cree una {keyword} (no una custom view normal).`,qrHint:`O escanea este código QR con la cámara de tu teléfono.`},sessionModelChip:{tooltip:`Modelo que usa esta sesión: {model}`,tooltipOverride:`Modelo de este chat: {model} (anula el rol / ajuste global)`,ariaLabel:`Modelo de este chat`,clear:`Volver al valor por defecto`,unknown:`desconocido`,inherited:`{model} (heredado)`},sidebarHeader:{newMessages:`Mensajes nuevos`,home:`Ir al chat más reciente`,toolCallHistory:`Historial de llamadas a herramientas`,settings:`Ajustes`,settingsGeminiMissing:`Ajustes — Falta la clave API de Gemini`,todayJournal:`Resumen de hoy`,todayJournalNotFound:`Aún no hay resumen — chatea un rato y el journal lo generará.`,todayJournalLoadFailed:`Error al cargar el journal (status {status}): {error}`,copyMarkdown:`Copiar la conversación como Markdown`,copiedMarkdown:`¡Copiado!`},rightSidebar:{permalink:`Enlace al mensaje seleccionado`,copyPermalink:`Copiar enlace al mensaje seleccionado`,copiedPermalink:`¡Copiado!`,toggleSystemPrompt:`Alternar system prompt`,systemPrompt:`System Prompt`,availableTools:`Herramientas disponibles`,toggleToolDescription:`Alternar descripción de la herramienta`,toolCallHistory:`Historial de llamadas a herramientas`,copyHistory:`Copiar historial de llamadas a herramientas`,copiedHistory:`¡Copiado!`,noToolCalls:`Aún no hay llamadas a herramientas`,arguments:`Argumentos`,error:`Error`,result:`Resultado`,running:`Ejecutando...`,mcpHint:{title:e=>`Ayuda de configuración: ${e.named(`server`)}`,requiredKeys:`Claves requeridas`,setupGuide:`Abrir guía de configuración`}},fileTreePane:{sort:`Orden:`,sortByName:`Ordenar por nombre`,name:`Nombre`,sortByRecent:`Ordenar por fecha de modificación (más recientes primero)`,recent:`Reciente`,reference:`Referencia`,readOnlyBadge:`RO`,showSystemFiles:`Mostrar archivos del sistema`,showSystemFilesTitle:`Muestra los directorios raíz internos del agente (conversations/, feeds/, etc.) además del contenido del usuario (data/, artifacts/, config/).`},fileTree:{dropHint:`Suelta archivos aquí para guardarlos en esta carpeta`,upload:{progress:`Subiendo {done} de {total}…`,done:`Se guardaron {count} archivo(s)`,failed:`No se pudieron guardar {count} archivo(s)`},workspace:`(área de trabajo)`,recentlyChanged:`Modificados recientemente`,newFileMenuItem:`Nuevo archivo`,newFileInputAria:`Nombre del nuevo archivo`,newFilePlaceholder:{wikiPage:`slug-de-página`,summary:`nombre-de-resumen`,document:`nombre-de-documento`,html:`nombre-de-página`,story:`nombre-de-historia`},newFileError:{empty:`El nombre del archivo no puede estar vacío.`,unsafe:`El nombre del archivo contiene caracteres no válidos.`,exists:`Ya existe un archivo llamado {filename} aquí.`,saveFailed:`No se pudo crear el archivo. Inténtalo de nuevo.`}},lockStatusPopup:{sandboxEnabledTooltip:`Sandbox activado (Docker)`,noSandboxTooltip:`Sin sandbox (Docker no encontrado)`,sandboxEnabledLabel:`Sandbox activado:`,sandboxEnabledBody:`Docker está en ejecución. El acceso al sistema de archivos está aislado.`,noSandboxLabel:`Sin sandbox:`,noSandboxBodyPrefix:`Claude puede acceder a todos los archivos del equipo. Instala`,noSandboxBodySuffix:`para activar el aislamiento del sistema de archivos.`,dockerDesktop:`Docker Desktop`,hostCredentials:`Credenciales del host adjuntas:`,credsLoading:`cargando…`,sshAgent:`Agente SSH:`,forwarded:`reenviado`,notForwarded:`no reenviado`,mountedConfigs:`Configuraciones montadas:`,none:`ninguna`,testIsolation:`Probar el aislamiento del sandbox:`},settingsModal:{title:`Ajustes`,version:`MulmoClaude v{version}`,tabs:{gemini:`Clave API de Gemini`,tools:`Herramientas permitidas`,mcp:`Servidores MCP`,dirs:`Directorios`,refs:`Directorios de referencia`,map:`Mapa`,photos:`Fotos`,google:`Google`,model:`Modelo`,voice:`Voz`,chatIndex:`Índice de chat`,journal:`Diario`,notifications:`Web Push`,skills:`Skills`,roles:`Roles`,quit:`Salir`},groups:{llm:`LLM`,servers:`Servidores`,workspace:`Espacio de trabajo`,notifications:`Notificaciones`,plugins:`Plugins`,management:`Gestión`,server:`Servidor`},navAriaLabel:`Secciones de ajustes`,googleTab:{description:`Vincula tu cuenta de Google para que esta máquina pueda llamar a las API de Google (primero Calendar). El token de actualización se guarda solo en esta máquina y nunca se envía a ningún servidor que no sea Google.`,statusLinked:`Vinculada`,statusNotLinked:`No vinculada`,statusPending:`Esperando a que termine el consentimiento en el navegador…`,connect:`Vincular cuenta de Google`,unlink:`Desvincular`,unlinkConfirm:`¿Desvincular la cuenta de Google? El token guardado se revocará y se eliminará de esta máquina.`,clientSecretAmbiguous:`Se encontraron varios archivos client_secret_*.json en ~/.secrets/. Conserva solo uno para que el token guardado siga emparejado con el cliente OAuth correcto.`,loadError:`No se pudo cargar el estado de la vinculación con Google.`,connectError:`No se pudo iniciar el flujo de autorización de Google.`,unlinkError:`No se pudo desvincular la cuenta de Google.`},geminiTab:{required:`La generación de imágenes requiere {envKey}. Pega la clave abajo y guárdala.`,apiKeyLabel:`Clave de API de Gemini`,apiKeyPlaceholder:`AIza…`,helperText:`Crea o copia una clave en {studioLink}.`,storageNote:`Se guarda solo en este equipo, fuera del espacio de trabajo, y solo tú puedes leerla. Se aplica al instante: no hace falta reiniciar.`,storedHere:`Guardada en la app`,storedInEnvironment:`Procede del entorno`,notConfigured:`Sin configurar`,clear:`Borrar`,fromEnvironment:`Esta clave viene del shell que inició la app o de {envFile}. Una clave guardada aquí tiene prioridad.`,loadError:`No se pudo cargar el estado de la clave`,saveError:`No se pudo guardar la clave`,clearError:`No se pudo borrar la clave`},mapTab:{description:`Configura la clave de la API de Google Maps que usa el plugin de mapas. La clave se guarda localmente y solo se envía a Google Maps.`,apiKeyLabel:`Clave API de Google Maps`,apiKeyPlaceholder:`AIza…`,helperText:`Crea o copia una clave en {consoleLink}.`,requiredApis:`APIs necesarias: Maps JavaScript API, Geocoding API, Places API (New), Directions API.`,configured:`Configurada`,notConfigured:`Sin configurar`,clear:`Borrar`,loadError:`Error al cargar los ajustes`,saveError:`Error al guardar`},photosTab:{description:`Controles de privacidad para las fotos recibidas por chat o por un bridge conectado. Los datos de ubicación EXIF son sensibles — desmarca para desactivar la captura automática.`,autoCaptureLabel:`Capturar automáticamente la ubicación de las fotos`,autoCaptureHint:`Activado: cada imagen subida con GPS en EXIF genera un sidecar de ubicación en data/locations/. Desactivado: no se captura nada automáticamente; el LLM aún puede extraer EXIF manualmente.`,statusOn:`Captura automática ACTIVADA`,statusOff:`Captura automática DESACTIVADA`,loadError:`Error al cargar los ajustes`,saveError:`Error al guardar`},quitTab:{description:`Detén el servidor de MulmoClaude que se ejecuta en este equipo. Si lo abriste desde el icono, sigue funcionando aunque cierres esta pestaña: así se detiene sin usar una terminal.`,restartHint:()=>"Para volver a iniciarlo, haz doble clic en el icono de MulmoClaude (o ejecuta `npx mulmoclaude@latest`).",quitLabel:`Salir de MulmoClaude`,confirmBody:`El servidor se detiene y esta página deja de funcionar. Se interrumpe todo lo que esté en curso.`,confirmLabel:`Salir`,stopping:`Deteniendo…`,stoppedTitle:`MulmoClaude se ha detenido`,stoppedBody:`Puedes cerrar esta pestaña. Haz doble clic en el icono para volver a iniciarlo.`,error:`No se pudo detener el servidor`},notificationsTab:{description:`Recibe una notificación push en tus dispositivos registrados cuando termina una tarea que iniciaste aquí — útil cuando preguntas algo, te alejas y quieres saber en cuanto la respuesta esté lista.`,enableLabel:`Enviar una Web Push cuando termine una tarea`,enableHint:`Se activa cuando se completa un chat que iniciaste aquí. Las tareas programadas y en segundo plano no lo activan.`,remoteHostNote:`Requiere la conexión RemoteHost (que proporciona el inicio de sesión) y al menos un dispositivo registrado. Si falta alguno, no hace nada.`,macosRemindersLabel:`Crear un recordatorio de macOS al terminar una tarea`,macosRemindersHint:`Añade la tarea terminada a tu lista de Recordatorios predeterminada. La sincronización de iCloud la refleja en tu iPhone, que es quien entrega la notificación.`,macosRemindersForcedOff:`Desactivado al iniciar con --disable-macos-reminders o DISABLE_MACOS_REMINDER_NOTIFICATIONS. Quita la opción o anula la variable de entorno y reinicia para controlarlo desde aquí.`,statusOn:`Web Push está ACTIVADO`,statusOff:`Web Push está DESACTIVADO`,loadError:`Error al cargar los ajustes`,saveError:`Error al guardar`},modelTab:{description:`Elige el modelo y el esfuerzo de razonamiento que Claude Code usa en cada turno. Deja cualquiera sin configurar para mantener la resolución propia de Claude.`,modelLabel:`Modelo`,modelUnset:`(sin configurar — seguir ~/.claude/settings.json)`,modelHelperText:`Sin configurar, el modelo viene de ~/.claude/settings.json, el mismo archivo donde otros clientes de Claude Code (VS Code, Cursor) guardan su elección de /model, así que un cambio allí también afecta a MulmoClaude. Los alias siguen la última generación de cada familia.`,modelConfigured:`Modelo: {model}`,modelNotConfigured:`Sin configurar (compartido)`,effortLabel:`Esfuerzo de razonamiento`,effortUnset:`(sin configurar — usar valor por defecto de Claude)`,helperText:`Niveles más altos permiten más tiempo de pensamiento pero aumentan la latencia y el uso de tokens.`,configured:`Esfuerzo: {level}`,notConfigured:`Sin configurar`,userSettingsLabel:`Cargar los ajustes de usuario y los plugins de Claude Code`,userSettingsHint:`Lee las skills, los plugins y los hooks de ~/.claude, los mismos que usa Claude Code. Desactívalo si los plugins instalados traen tantas skills que cada petición se vuelve pesada; las skills del propio espacio de trabajo siguen funcionando. Se aplica desde el siguiente mensaje. Si está desactivado, un modelo sin configurar ya no sigue ~/.claude/settings.json.`,skillListingSummary:`Skills cargadas en el último turno: {count}.`,skillListingPlugins:`De los plugins: {plugins}.`,skillListingHeavy:`Con tantas skills cada petición pesa más; al desactivarlo se quitan las de ~/.claude.`,loadError:`Error al cargar los ajustes`,saveError:`Error al guardar`},voiceTab:{description:`Dicta mensajes de chat con tu voz. El audio se transcribe localmente en la máquina que ejecuta MulmoClaude; no se envía nada a ningún servicio externo.`,requirements:`Disponible solo en macOS. Requiere el servidor whisper.cpp: compílalo con yarn build:whisper (consulta la sección Local Voice Input del README).`,unsupported:`La entrada de voz requiere macOS con el servidor whisper.cpp instalado. No está disponible en esta máquina.`,enableLabel:`Activar entrada de voz`,enableHint:`Al activarlo se descarga una vez el modelo de voz (1–3 GB). Luego aparece un botón de micrófono en la entrada de chat.`,modelLabel:`Modelo de voz`,downloading:`Descargando modelo… {percent}%`,ready:`Modelo listo`,downloadError:`Error al descargar el modelo.`,retry:`Reintentar`,loadError:`Error al cargar los ajustes`,saveError:`Error al guardar`},chatIndexTab:{description:`Títulos y resúmenes automáticos generados por IA para tu historial de chat. Sale desactivado por defecto — las sesiones de automatización (scheduler / trabajadores del sistema) siempre se omiten aunque esté activado; las sesiones humanas solo pagan una llamada al resumidor al terminar cada turno.`,modeLabel:`Modelo del índice de chat`,helperText:`Haiku es más económico; Sonnet ofrece títulos más precisos en sesiones largas con cambios de tema.`,mode:{off:`Desactivado`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`La indexación está DESACTIVADA`,haiku:`Indexando con Haiku`,sonnet:`Indexando con Sonnet`},loadError:`Error al cargar los ajustes`,saveError:`Error al guardar`},journalTab:{description:`Diario automático — resume las sesiones de chat recientes en journal/*.md y extrae notas de memoria duradera. Sale desactivado. Las sesiones de automatización (scheduler / trabajadores del sistema) se excluyen siempre, independientemente de esta configuración.`,modeLabel:`Modelo del diario`,helperText:`Haiku es más económico; Sonnet produce resúmenes diarios y por tema más ricos. El pase horario solo se ejecuta cuando esto está activado.`,mode:{off:`Desactivado`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`El diario está DESACTIVADO`,haiku:`Diario en ejecución con Haiku`,sonnet:`Diario en ejecución con Sonnet`},loadError:`Error al cargar los ajustes`,saveError:`Error al guardar`},geminiAskButton:`Preguntar a Claude`,geminiAskMessage:`¿Cuál es el rol de la clave API de Gemini en esta app?`,toolNamesLabel:`Nombres de herramientas`,invalidToolNamesPrefix:`Estas parecen no estándar (prefijo esperado`,invalidToolNamesSuffix:`):`,mcpToolsError:`⚠ No se pudo obtener el estado de las herramientas MCP: {error}. Mostrando todas las herramientas sin importar si están habilitadas.`,changesHint:`Los cambios se aplican en el siguiente mensaje. No hace falta reiniciar.`,cannotSaveTooltip:`No se puede guardar hasta que los ajustes se carguen correctamente`,saving:`Guardando…`,loadingLabel:`Cargando…`,unsavedMarker:`●`,unsavedToolsConfirm:`Allowed Tools tiene cambios sin guardar. ¿Cerrar de todos modos?`,unsavedMcpDraftConfirm:`Hay un borrador de servidor MCP abierto. ¿Cerrar de todos modos?`,mcpSaveFailed:`No se pudieron guardar los cambios de los servidores MCP.`},canvasViewToggle:{stackViewTooltip:`Vista apilada · haz clic para cambiar a vista única`,singleViewTooltip:`Vista única · haz clic para cambiar a vista apilada`,switchToSingle:`Cambiar a vista única`,switchToStack:`Cambiar a vista apilada`},sessionHistoryToggle:{showTooltip:`Mostrar el panel de historial de sesiones a la izquierda`,hideTooltip:`Ocultar el panel de historial de sesiones`,show:`Mostrar historial de sesiones`,hide:`Ocultar historial de sesiones`},sessionHistoryExpand:{expandTooltip:`Expandir el panel de historial de sesiones a ancho completo`,collapseTooltip:`Contraer el panel de historial de sesiones`,expand:`Expandir historial de sesiones`,collapse:`Contraer historial de sesiones`},settingsWorkspaceDirs:{explanation:`Directorios personalizados para organizar archivos dentro de {dataDir} y {artifactsDir}. Claude los utiliza para decidir dónde guardar los archivos.`,noEntries:`No hay directorios personalizados configurados.`,addDirTitle:`Añadir directorio`,pathPlaceholder:`data/clientes o artifacts/informes`,descPlaceholder:`Descripción (qué va en esta carpeta)`,errPathRequired:`La ruta es obligatoria`,errMustStartWith:`Debe comenzar con data/ o artifacts/`,errAlreadyExists:`Ya existe`},settingsReferenceDirs:{explanation:`Directorios externos que Claude puede leer pero no modificar. En modo Docker se montan como solo lectura. Útiles para consultar bóvedas de Obsidian, código de proyectos o carpetas de documentos.`,noEntries:`No hay directorios de referencia configurados.`,addDirTitle:`Añadir directorio de referencia`,pathPlaceholder:`/Users/yo/ObsidianVault o ~/Documentos/notas`,labelPlaceholder:`Etiqueta (opcional — por defecto el nombre de la carpeta)`,readOnlyBadge:`solo lectura`,errPathRequired:`La ruta es obligatoria`,errMustBeAbsolute:`Debe ser una ruta absoluta o comenzar con ~/`,errAlreadyExists:`Ya existe`,errLabelConflict:`La etiqueta "{label}" ya existe`},dashboard:{empty:`Aún no hay colecciones favoritas.`,emptyHint:`Fija una colección (★) para verla aquí.`,viewTable:`Tabla`,viewCalendar:`Calendario`,viewKanban:`Kanban`,viewPickerLabel:`Elegir vista`,openFull:`Doble clic para abrir la vista completa`,dragHint:`Arrastra para reordenar`,resizeHint:`Arrastra para cambiar el tamaño`},pluginLauncher:{chat:{label:`Chat`},dashboard:{label:`Panel`},automations:{label:`Acciones`},wiki:{label:`Wiki`},collections:{label:`Colecciones`},feeds:{label:`Feeds`},accounting:{label:`Contabilidad`},files:{label:`Archivos`}},shortcuts:{pin:`Fijar en el lanzador`,unpin:`Quitar del lanzador`,zoneAriaLabel:`Accesos directos fijados`,reorder:{open:`Reordenar accesos directos`,title:`Reordenar`,moveUp:`Subir`,moveDown:`Bajar`}},fileContentHeader:{showRendered:`Mostrar Markdown renderizado`,showRaw:`Mostrar código fuente`,rendered:`Renderizado`,raw:`Fuente`,closeFile:`Cerrar archivo`,revealInOs:`Mostrar en la carpeta`,revealInOsFailed:`No se pudo mostrar en la carpeta`},fileContentRenderer:{download:`ZIP`,downloadZip:`Descargar como zip autónomo (recursos incluidos)`,downloadError:`Error al descargar`,selectFile:`Selecciona un archivo`,htmlPreview:`Vista previa HTML`,pdfPreview:`Vista previa PDF`,parseError:`error al analizar`,editJson:`Editar JSON`,jsonEditorLabel:`Editor JSON`,invalidJson:`JSON no válido`,undo:`Deshacer`,redo:`Rehacer`,editMarp:`Editar fuente de la diapositiva`,marpEditorLabel:`Fuente de diapositivas Marp`,openInOs:`Abrir en el SO`,openingInOs:`Abriendo…`,openInOsFailed:`No se pudo abrir en el SO`,downloadFile:`Descargar`,downloadingFile:`Descargando…`},filesView:{chatPlaceholder:`Pregunta sobre este archivo…`},systemFiles:{schemaLabel:`Esquema`,showDetails:`Mostrar detalles`,hideDetails:`Ocultar detalles`,editPolicy:{"agent-managed-but-hand-editable":`Gestionado por el agente (edición manual permitida)`,"user-editable":`Editable por el usuario`,"agent-managed":`Gestionado por el agente`,"fragile-format":`Formato frágil`,ephemeral:`Efímero`},mcp:{title:`Servidores MCP`,summary:`Servidores externos del Model Context Protocol conectados al agente. Añade servidores HTTP o stdio para ampliar las herramientas disponibles.`},settings:{title:`Ajustes de la app`,summary:`Preferencias de comportamiento editables — clave API de Gemini, herramientas permitidas, configuración del sandbox, etc.`},schedulerTasks:{title:`Tareas del programador`,summary:`Automatizaciones recurrentes del agente que se disparan en un horario. Se gestionan desde la UI Automations; este archivo es la fuente en disco.`},schedulerOverrides:{title:`Sobrescrituras del programador`,summary:`Sobrescrituras de hora / intervalo por tarea aplicadas sobre el horario del sistema. El agente las edita cuando pides cambiar la franja de una tarea recurrente.`},schedulerItems:{title:`Elementos de calendario antiguos`,summary:`Elementos de la vista de Calendario eliminada. La app ya no los muestra y nada los ejecuta según una programación; solo las acciones antiguas de /api/scheduler siguen leyendo y escribiendo este archivo. Las tareas programadas están en config/scheduler/tasks.json.`},wikiIndex:{title:`Índice de la wiki`,summary:`Índice autogenerado de cada página de la wiki. Se refresca con cada edición — no edites a mano (tus cambios serán sobrescritos).`},wikiLog:{title:`Registro de edición de la wiki`,summary:`Registro de actividades de creación y edición de páginas. Gestionado por el agente y solo añade — útil como feed de cambios recientes.`},wikiSummary:{title:`Resumen de la wiki`,summary:`Visión general autogenerada de la wiki — clústeres temáticos, recuento de páginas, actividad reciente. Refrescado por el agente.`},wikiSchema:{title:`Esquema de la wiki`,summary:`Especificación de formato que el agente lee para mantener las páginas consistentes. Frágil — espera una estructura concreta; prefiere ediciones del agente.`},memory:{title:`Memoria (archivo antiguo)`,summary:`La memoria antigua de un solo archivo. Solo la leen los espacios de trabajo con el formato antiguo; los actuales guardan los hechos como archivos de tema en conversations/memory/<type>/<topic>.md e ignoran este archivo, así que editarlo no tiene efecto en ellos.`},summariesIndex:{title:`Índice de resúmenes`,summary:`Índice navegable que enlaza los resúmenes diarios y por tema generados por el journal. Gestionado por el agente; refrescado en cada pasada.`},rolesJson:{title:`Definición del rol (JSON)`,summary:`Configuración del rol — elección de modelo, servidores MCP, plugins permitidos, sugerencias de consulta. Editable, sin reinicio.`},rolesMd:{title:`Descripción del rol (Markdown)`,summary:`Persona y system prompt del rol, cargado como contexto cuando este rol está activo. Editable; los cambios aplican en el siguiente mensaje.`},journalDaily:{title:`Resumen diario del journal`,summary:`Recapitulación autogenerada de tu actividad para un día natural, destilada por el journal a partir de las sesiones de chat.`},journalTopic:{title:`Journal por tema`,summary:`Notas a largo plazo sobre un tema concreto, acumuladas y revisadas conforme sigues hablando de él. Gestionado por el agente.`}},settingsMcpTab:{explanation:`Añade servidores MCP externos. Los servidores HTTP funcionan en todos los modos. Los servidores Stdio usan el {npx} / {node} / {tsx} de la imagen del sandbox; cuando Docker está activo las rutas deben estar dentro del área de trabajo.`,localhostRewrite:`En modo Docker {localhost} se reescribe como {hostDockerInternal}.`,noServers:`Aún no hay servidores MCP configurados.`,enabled:`activado`,urlLabel:`URL:`,commandLabel:`Comando:`,dockerStdioUnsupported:`⚠ No se ejecutará mientras el sandbox de Docker esté activado.`,dockerStdioHostExecActive:`⚠ Se ejecuta en el host: este servidor sale del sandbox de Docker.`,dockerStdioHostExecOptIn:`Ejecutar en el host de todos modos (avanzado). Este servidor se ejecuta fuera del sandbox de Docker mediante una pasarela HTTP local y puede acceder a tu equipo.`,learnMore:`Más información`,addServerButton:`+ Añadir servidor MCP`,nameLabel:`Nombre`,namePlaceholder:`mi-servidor`,typeHttp:`HTTP`,typeStdio:`Stdio (comando)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`Comando`,argsLabel:`Argumentos (uno por línea)`,argsPlaceholder:()=>`-y
|
|
245
245
|
@modelcontextprotocol/server-filesystem
|
|
246
246
|
/workspace/path`,errNoName:`Indica un Nombre, o introduce una URL / argumentos de los que podamos deducirlo.`,errBadName:`El nombre debe comenzar con una letra minúscula y contener solo [a-z0-9_-].`,errIdExists:`El id de servidor "{id}" ya existe.`,errBadHttpUrl:`La URL HTTP debe comenzar con http:// o https://`,pendingEntryWarning:`Finaliza o cancela primero la entrada de servidor MCP pendiente.`,customHeading:`Servidores personalizados`,catalog:{heading:`Servidores MCP preconfigurados`,audience:{general:`🟢 General`,developer:`🔵 Desarrollador`},risk:{low:`bajo`,medium:`medio`,high:`alto`},upstream:`📦 Fuente`,setupGuide:`📚 Configuración`,entry:{memory:{displayName:`Memoria`,description:`Permite que Claude recuerde el contexto entre sesiones.`},sequentialThinking:{displayName:`Pensamiento secuencial`,description:`Ayuda a Claude a abordar problemas complejos paso a paso.`},context7:{displayName:`Context7 (documentación de librerías)`,description:`Documentación al día de librerías populares — supera el corte de entrenamiento del modelo.`},deepwiki:{displayName:`DeepWiki (wiki de repos de GitHub)`,description:`Pregunta sobre cualquier repositorio de GitHub y obtén una respuesta estructurada estilo wiki.`},notion:{displayName:`Notion`,description:`Lee y escribe en tu workspace de Notion — páginas, bases de datos y búsqueda.`,field:{apiKey:{label:`Token de integración de Notion`,help:`Crea una integración en Notion y copia el Internal Integration Secret. Pulsa 🔑 para abrir la página de integraciones.`}}},slack:{displayName:`Slack`,description:`Lista canales, envía mensajes y busca en el historial de tu workspace de Slack.`,field:{botToken:{label:`Token de bot`,help:`App de Slack → OAuth & Permissions → Bot User OAuth Token. Empieza por xoxb-.`},teamId:{label:`ID del equipo / workspace`,help:`Ejecuta team.info o consulta la URL del workspace — algo como T01ABC23DEF.`}}},googleMaps:{displayName:`Google Maps`,description:`Buscar lugares, obtener rutas y consultar detalles de ubicación.`,field:{apiKey:{label:`Clave API de Google Maps`,help:`Google Cloud Console → APIs & Services → Credentials → Crear clave API. Habilita Places + Directions.`}}},appleNative:{displayName:`Apps nativas de Apple (macOS)`,description:`Lee y escribe Recordatorios, Calendario, Notas, Mail y Mapas vía AppleScript. Solo macOS — sin credenciales.`},gmail:{displayName:`Gmail`,description:`Lee, envía y etiqueta tu Gmail. Usa un cliente OAuth de Google que tú mismo creas en tu propio proyecto de Google Cloud (sin verificación de app).`,field:{credentials:{label:`Ruta a credentials.json`,help:`Google Cloud Console → APIs & Services → Credentials → ID de cliente OAuth (Desktop app). Descarga credentials.json y pega su ruta absoluta.`}}},googleCalendar:{displayName:`Google Calendar`,description:`Lee y crea eventos en Google Calendar. Mismo patrón BYO credentials.json que Gmail.`,field:{credentials:{label:`Ruta a credentials.json`,help:`Reutiliza el mismo cliente OAuth de Google Cloud que Gmail, o crea uno separado para Calendar.`}}},googleDrive:{displayName:`Google Drive`,description:`Busca y lee archivos de Google Drive. BYO credenciales OAuth de Google — el token se guarda localmente junto al archivo.`,field:{credentials:{label:`Ruta a credentials.json`,help:`Google Cloud Console → APIs & Services → Credentials → ID de cliente OAuth (Desktop app). Habilita la API de Google Drive en el mismo proyecto.`}}},github:{displayName:`GitHub`,description:"Lee repos, issues, PRs y ejecuta búsquedas con un Personal Access Token. Limita el alcance del token — los permisos de escritura (`repo`) dejan al agente hacer push a cualquier repo accesible.",field:{token:{label:`Personal Access Token`,help:`GitHub → Settings → Developer settings → Personal access tokens. Se recomienda usar fine-grained tokens limitados a los repos donde quieras que el agente actúe.`}}},linear:{displayName:`Linear`,description:`Lee y actualiza issues, proyectos y ciclos de Linear con una clave API personal.`,field:{apiKey:{label:`Clave API de Linear`,help:`Linear → Settings → API → Personal API keys. Pulsa 🔑 para abrir la página y haz clic en Create key.`}}},weatherOpenMeteo:{displayName:`Clima (Open-Meteo)`,description:`Pronósticos meteorológicos gratuitos y condiciones actuales en todo el mundo — sin clave API.`},spotify:{displayName:`Spotify`,description:`Busca canciones, gestiona playlists y controla la reproducción. BYO app de desarrollador de Spotify — solo Client ID (flujo PKCE, sin client secret).`,field:{clientId:{label:`Client ID`,help:"Spotify Developer Dashboard → Create app, configura la Redirect URI como http://127.0.0.1:8888/callback, copia el Client ID. Luego ejecuta una vez en la terminal `SPOTIFY_CLIENT_ID=<id> npx spotify-mcp@latest auth` para iniciar sesión (el refresh token se guarda en ~/.spotify-mcp/tokens.json)."}}},youtubeTranscript:{displayName:`Transcripción de YouTube`,description:`Obtén los subtítulos de cualquier vídeo público de YouTube por URL. Sin credenciales.`}},config:{howToGet:`Cómo obtenerlo`,install:`Instalar`,errMissingRequired:`Faltan campos obligatorios: {fields}`,requiredMarker:`*`,requiredAria:`obligatorio`}}},pluginScheduler:{previewIcon:`📅`,previewAutomations:`{count} automatización | {count} automatizaciones`,previewMore:`+ {count} más…`},pluginSchedulerTasks:{recommendedFrequencies:`Frecuencias recomendadas`,tableTaskType:`Tipo de tarea`,tableSuggestedSchedule:`Programación sugerida`,noTasks:`No hay tareas programadas`,runNow:`Ejecutar ahora`,enable:`Activar`,disable:`Desactivar`,delete:`Eliminar`,nextRun:`Próxima: {time}`,originSystem:`Sistema`,originUser:`Usuario`,originSkill:`Skill`,runFailed:`Error al ejecutar: {error}`,toggleFailed:`Error al alternar: {error}`,deleteFailed:`Error al eliminar: {error}`,detailsToggle:`Mostrar detalles`,promptLabel:`Prompt`,roleLabel:`Rol`,confirmDelete:`¿Eliminar la tarea « {name} »? Esta acción no se puede deshacer.`,hintNewsRss:`Obtención de noticias / RSS`,hintJournal:`Pase diario del diario`,hintWiki:`Mantenimiento del wiki`,hintMemory:`Extracción de memoria`,hintCalendar:`Sincronización de calendario / contactos`},pluginCanvas:{undo:`Deshacer`,redo:`Rehacer`,clear:`Limpiar`,styleLabel:`Estilo:`,stylePromptWithPath:"Convierte la imagen en `{path}` en una imagen de estilo {style}.",stylePromptNoPath:`Convierte mi dibujo en el lienzo en una imagen de estilo {style}.`,saveFailed:`Sin guardar`},pluginWiki:{backToIndex:`Volver al índice`,pdf:`PDF`,pdfFailed:`⚠ Error de PDF`,tabIndex:`Índice`,tabLog:`Registro`,tabLint:`Lint`,tabGraph:`Grafo`,graphEmpty:`Aún no hay enlaces para graficar.`,linkedReferences:`Referencias entrantes`,empty:`El wiki está vacío. Pide al Wiki Manager que ingiera una fuente.`,previewMore:`+ {count} más…`,chatPlaceholder:`Pregunta sobre esta página…`,emptyPage:`La página "{title}" aún no existe.`,emptyContent:`La página "{title}" existe pero no tiene contenido.`,createPage:`Solicitar la creación de esta página wiki`,updatePage:`Solicitar la actualización de esta página wiki`,tagFilterAll:`Todas`,noMatches:`No hay páginas con la etiqueta #{tag}`,lintChat:`Revisar mi wiki`,taskCountMismatch:`La fuente del wiki y la salida renderizada difieren en el número de tareas. Se rechazó el cambio para evitar dañar el archivo.`,metadataCreated:`Creado`,metadataUpdated:`Actualizado`,metadataEditor:`Editor`,pageEditHeader:`Edición de wiki`,snapshotExpired:`Instantánea expirada — mostrando la página actual`,snapshotLoadError:`No se pudo cargar la instantánea — es posible que la página aún exista. Actualiza la página.`,pageDeleted:`Página eliminada`,history:{tabContent:`Contenido`,tabHistory:`Historial`,empty:`Aún no hay historial — edita esta página y la primera versión aparecerá aquí.`,loading:`Cargando historial…`,backToList:`Volver al historial`,restoreButton:`Restaurar esta versión`,restoreConfirmTitle:`¿Restaurar esta versión?`,restoreConfirmBody:`Restaurar la página a la versión del {ts} por {editor}. La página actual será reemplazada. El historial existente se conserva.`,restoreConfirmAction:`Restaurar`,restoreConfirmCancel:`Cancelar`,restoreSuccessToast:`Página restaurada.`,restoreFailureBanner:`Error al restaurar: {error}`,compareCurrent:`Comparar con la página actual`,comparePrevious:`Comparar con la versión anterior`,diffNoPrevious:`No hay versión anterior con la que comparar.`,diffNoChanges:`No hay diferencias de contenido entre esta versión y el objeto de comparación.`,editorBadgeUser:`Usuario`,editorBadgeLLM:`LLM`,editorBadgeSystem:`Sistema`,hiddenLines:`{count} líneas sin cambios ocultas`,expandHidden:`Mostrar`}},pluginPresentForm:{fallbackTitle:`Formulario`,fieldCount:`{count} campo | {count} campos`,submitted:`Enviado`,errorSummary:`Por favor, corrija los siguientes errores`,requiredMarker:`*`,selectOption:`Seleccione una opción`,charactersCount:`{current} / {max} caracteres`,charactersCountNoMax:`{current} caracteres`,submit:`Enviar`,progress:`{filled} de {total} campos obligatorios completados`},pluginPresentSvg:{saveAsPng:`Descargar como PNG`,png:`PNG`,saveAsPdf:`Guardar como PDF (abre el diálogo de impresión)`,pdf:`PDF`,untitled:`Dibujo SVG`,editSource:`Editar código SVG`,cancel:`Cancelar`,applyChanges:`Aplicar cambios`,saving:`Guardando...`,saveError:`⚠ Error al guardar: {error}`,exportError:`⚠ Error al exportar: {error}`,loadingSource:`Cargando código…`,sourceError:`Error al cargar el código: {error}`},photoLocations:{title:`Ubicaciones de fotos`,summary:`{total} capturadas · {withGps} con GPS`,mapHint:`Pide a Claude "muéstralas en el mapa" para trazarlas con el plugin de Google Map.`,loading:`Cargando…`,empty:`Aún no se ha capturado ninguna ubicación. Envía una foto con etiqueta GPS por el chat o un bridge conectado para empezar.`,noGps:`Sin datos GPS`},pluginManageSkills:{deleteProjectSkill:`Eliminar esta skill de proyecto`,unstarPresetSkill:`Quitar la estrella de este preset — vuelve al catálogo`,heading:`Skills`,previewCount:`{count} skill | {count} skills`,previewMore:`+{count} más`,subheading:({named:e})=>`${e(`count`)} disponibles · haz clic para ver · "Run" la invoca como /<name>`,emptyWithPath:`No se encontraron skills. Añade carpetas de skills en {path}.`,emptySkillPath:`~/.claude/skills/`,selectHint:`Selecciona una skill a la izquierda para ver su SKILL.md.`,loading:`Cargando…`,fieldDescription:`Descripción`,fieldBody:`Cuerpo (Markdown)`,emptyBody:`(cuerpo vacío)`,btnEdit:`Editar`,btnDelete:`Eliminar`,btnUnstar:`Quitar estrella`,errListFailed:`Error al cargar las skills: {error}`,errDetailFailed:`Error al cargar la skill: {error}`,errSaveFailed:`Error al guardar: {error}`,errDeleteFailed:`Error al eliminar`,confirmDelete:`¿Eliminar la skill "{name}"? Esto borrará ~/mulmoclaude/.claude/skills/{name}/SKILL.md.`,confirmUnstar:`¿Devolver "{name}" al catálogo? Dejará de cargarse en el prompt, pero la copia del catálogo permanece — puedes volver a destacarla cuando quieras.`,sectionActive:`Activas`,sectionCatalog:`Catálogo`,sectionLegendActive:`Skills que Claude puede usar ahora mismo. Claude las usa automáticamente en el flujo de la conversación, o puedes invocar una escribiendo su nombre. {system} Sistema (mc- incluida) / {project} Proyecto (editable, solo en este workspace) / {user} Usuario (skills en ~/.claude/skills/) / {claudePlugin} Plugin (de un plugin de Claude Code instalado, solo lectura).`,sectionLegendCatalog:`Catálogo: skills que pasan a Activas al marcarlas con {star}. Quitar {star} desde Activas devuelve la skill al Catálogo — Claude deja de usarla (la skill no se elimina).`,catalogEmpty:`No hay skills de preajuste disponibles.`,catalogPresetHeading:`Preajustes`,catalogStar:`Destacar`,catalogStarred:`Destacada`,sourceUserTitle:`Skill de usuario (~/.claude/skills/, disponible en todos los espacios)`,sourceClaudePluginTitle:`Skill de plugin (plugin de Claude Code instalado — solo lectura, lo actualiza el plugin)`,sourceSystemTitle:`Skill de sistema (incluida, prefijo mc- — solo lectura, sobrescrita por el launcher)`,sourceProjectTitle:`Skill del proyecto (.claude/skills/ del workspace, solo este espacio)`,sourcePresetTitle:`Catálogo de preajustes — pulsa Destacar para activarla en este espacio`,errCatalogListFailed:`Error al cargar el catálogo: {error}`,errCatalogStarFailed:`Error al destacar la skill: {error}`,errCatalogPreviewFailed:`Error al cargar la vista previa de la skill: {error}`,catalogAddRepo:`Añadir repositorio de skills`,catalogAddRepoTitle:`Añadir un repositorio de skills`,catalogRepoUrlLabel:`URL de GitHub`,catalogRepoUrlPlaceholder:`https://github.com/owner/repo`,catalogRepoSubpathLabel:`Subruta (opcional)`,catalogRepoSubpathPlaceholder:`skills`,catalogAddRepoSubmit:`Instalar`,catalogAddRepoSuggestions:`Repositorios sugeridos`,catalogUninstallRepo:`Desinstalar repositorio`,catalogUpdateRepo:`Actualizar repositorio (volver a obtener lo último)`,catalogRepoOpenLink:`Abrir el repositorio en GitHub (nueva pestaña)`,catalogUninstallConfirm:`¿Desinstalar este repositorio? Las skills que ya marcaste con estrella permanecen en tu lista activa.`,catalogRepoInstalling:`Instalando…`,catalogRepoEmpty:`No se encontraron skills en este repositorio.`,sourceExternalTitle:`Skill externa (instalada desde un repositorio de GitHub — pulsa la estrella para activar)`,errCatalogRepoListFailed:`No se pudieron cargar los repositorios instalados: {error}`,errCatalogRepoInstallFailed:`No se pudo instalar el repositorio: {error}`,errCatalogRepoUninstallFailed:`No se pudo desinstalar el repositorio: {error}`,errCatalogRepoInvalidUrl:`Introduce una URL de repositorio de GitHub.`},pluginManageRoles:{heading:`Roles personalizados`,roleCount:`{count} rol | {count} roles`,addButton:`+ Añadir`,createPanel:`Crear nuevo rol`,fieldId:`ID`,fieldName:`Nombre`,fieldIcon:`Icono`,fieldPrompt:`Prompt`,fieldPlugins:`Plugins`,fieldModel:`Modelo`,modelUnset:`(sin configurar — seguir el ajuste global)`,modelHelp:`Las sesiones iniciadas con este rol usan este modelo. Útil para mantener un rol rutinario fuera del límite semanal de tu modelo principal. Los roles integrados siempre siguen el ajuste global.`,fieldStarterQueries:`Preguntas iniciales`,onePerLine:`(una por línea)`,helpLink:`?`,idFormatted:`({id})`,missingEnv:`(falta {env})`,requiresEnv:`Requiere {env} en .env`,collapse:`Contraer`,expand:`Expandir`,idPlaceholder:`id-unico`,creating:`Creando…`,create:`Crear`,updating:`Actualizando…`,update:`Actualizar`,cancel:`Cancelar`,delete:`Eliminar`,emptyHint:`Aún no hay roles personalizados. Haz clic en "+ Añadir" o pide a Claude que cree uno.`,errIdRequired:`El ID es obligatorio.`,errIdInvalid:`El ID solo puede contener letras, números, '-' y '_'.`,errNameRequired:`El nombre es obligatorio.`,errIdDuplicate:`Ya existe un rol con el ID '{id}'.`,errCreateFailed:`Error al crear`,errSaveFailed:`Error al guardar`,errDeleteFailed:`Error al eliminar`,errNetworkError:`Error de red`,errServerError:`Error del servidor: {status}`,errRefreshFailed:`Guardado, pero no se pudo actualizar la lista.`,confirmDelete:`¿Eliminar el rol « {name} »? Esta acción no se puede deshacer.`},pluginUiImage:{promptLabel:`{label}:`},markdownCodeCopy:{copyLabel:`Copiar código`,copiedLabel:`Copiado`},markdownMermaid:{loadFailed:`⚠ Error al cargar Mermaid: {error}`,renderFailed:`⚠ Error al renderizar Mermaid: {error}`},pluginTextResponse:{pdf:`PDF`,pdfFailed:`⚠ Error de PDF`,editContent:`Editar contenido de texto`,applyChanges:`Aplicar cambios`,copyLabel:`Copiar`,speakerSystem:`Sistema`,speakerUser:`Tú`,speakerAssistant:`Asistente`,copiedLabel:`¡Copiado!`,cancel:`Cancelar`,seededByPlugin:`desde {pkg}`,seededByPluginTooltip:`Este mensaje fue generado por el plugin {pkg}, no enviado por ti.`,truncatedForRender:`Este mensaje es inusualmente largo ({total} caracteres en total). Solo se muestra la primera parte — {omitted} caracteres ocultos para mantener la pestaña receptiva. Usa Copiar para obtener el texto completo.`},pluginSkill:{noDescription:`(sin descripción)`},pluginSpreadsheet:{previewUntitled:`Hoja de cálculo`,previewSheets:`{count} hoja | {count} hojas`,untitled:`Hoja de cálculo`,excel:`Excel`,valuePlaceholder:`Valor`,valueOrFormulaPlaceholder:`Valor o Fórmula (ej. 100 o SUM(B2:B11))`,formatPlaceholder:`Formato (ej. $#,##0.00)`,loading:`Cargando la hoja de cálculo...`,noData:`No hay datos de hoja de cálculo disponibles`,editData:`Editar datos de la hoja de cálculo`,applyChanges:`Aplicar cambios`,dataMustBeArray:`Los datos deben ser una matriz de hojas`,loadFailed:`Error al cargar la hoja de cálculo: {error}`,invalidJsonAlert:`Formato JSON no válido: {error}`,unknownError:`Error desconocido`,update:`Actualizar`,stringType:`Texto`,formulaType:`Fórmula`},app:{startConversation:`Inicia una conversación`,thinking:`Pensando…`},suggestionsPanel:{suggestions:`Sugerencias`,skills:`Habilidades`,tooltip:`Sugerencias y habilidades`,emptySuggestions:`No hay sugerencias.`,emptySkills:`No hay habilidades instaladas.`,skillsError:`Error al cargar las habilidades: {error}`,sendEditHint:`clic para enviar · shift+clic para editar`},settingsToolsTab:{explanation:`Nombres adicionales de herramientas que pasar a Claude mediante {allowedTools}. Uno por línea. Útil para servidores MCP integrados en Claude Code como Gmail / Google Calendar tras autenticarte mediante {claudeMcp}.`,connectorsSectionTitle:`Conectores conectados`,connectorsEmpty:`No se encontraron conectores.`,connectorConnected:`Conectado`,connectorDisconnected:`No conectado`,connectorsGuide:`Los conectores como Slack y Gmail permiten a Claude acceder a tus cuentas. Agrega o elimina conectores desde Claude Desktop o configúralos {configLink}. (Abre claude.ai)`,connectorsConfigLinkText:`aquí`},confirmModal:{defaultTitle:`Confirmar`,defaultConfirm:`Aceptar`,defaultCancel:`Cancelar`}},Rlt={common:{downloadZip:`ZIP`,downloadFailed:`Falha no download`,save:`Salvar`,cancel:`Cancelar`,loading:`Carregando...`,close:`Fechar`,dismiss:`Dispensar`,add:`Adicionar`,remove:`Remover`,yes:`Sim`,no:`Não`,saving:`Salvando...`,saved:`Salvo`,noResultsYet:`Ainda não há resultados`,noImageYet:`Ainda não há imagem`,sendChat:`Iniciar um novo chat`},sessionTabBar:{newSession:`Nova sessão`,activeSessions:`{count} sessão ativa (agente em execução) | {count} sessões ativas (agente em execução)`,unreadReplies:`{count} resposta não lida | {count} respostas não lidas`,unreadDot:`Nova resposta`,origin:{scheduler:`Iniciada pelo agendador`,skill:`Iniciada por uma skill`,bridge:`Iniciada por um bridge`}},chatInput:{placeholder:`Mensagem para Claude…`,send:`Enviar`,stop:`Parar`,runningPlaceholder:`Em execução… pressione Enter para enfileirar`,removeBuffered:`Remover mensagem da fila`,attachFile:`Anexar arquivo`,fileTooLarge:`Arquivo muito grande ({sizeMB} MB). O limite é 30 MB.`,fileOnlyAttachment:`Não é possível ler o conteúdo — enviado como arquivo`,readFileFailed:`Não foi possível ler o arquivo.`,attachImageFailed:`Falha ao anexar a imagem: {error}`,stopFailed:`Falha ao parar a execução: {error}`,dropHint:`Solte o arquivo para anexar`,tooManyFiles:`Você pode anexar no máximo {max} arquivos por vez.`,removeAttachment:`Remover {name}`,attachmentFallbackName:`anexo`,voice:{start:`Iniciar entrada de voz`,stop:`Parar entrada de voz`}},cspViolation:{notice:`⚠ Uma visualização tentou carregar {host}, mas a política de segurança de conteúdo bloqueou ({directive}). Para permitir, adicione o host a config/csp.json — somente se você confiar nele.`,dismiss:`Dispensar`},sessionHistoryPanel:{filters:{all:`Todas`,unread:`Não lidas`,bookmarked:`Favoritas`,longRunning:`De longa duração (24h+)`,human:`Pessoa`,scheduler:`Agendador`,skill:`Skill`,bridge:`Bridge`},failedToRefresh:`⚠ Falha ao atualizar: {error}`,showingLastKnown:` — exibindo a última lista conhecida.`,noSessions:`Ainda não há sessões.`,noMatching:`Nenhuma sessão correspondente.`,running:`Em execução`,noMessages:`(sem mensagens)`,openRowAria:`Abrir sessão: {preview}`,rowMenuAria:`Ações da sessão`,bookmark:`Favoritar`,unbookmark:`Remover favorito`,delete:`Excluir`,deleteConfirm:`Excluir esta sessão?
|
|
247
247
|
|
|
248
248
|
{preview}
|
|
249
249
|
|
|
250
|
-
Esta ação não pode ser desfeita.`},notificationBell:{notifications:`Notificações`,activeSection:`Ativas`,historySection:`Histórico`,noActive:`Sem notificações ativas`,noHistory:`Sem atividade recente`,clearAll:`Limpar`,dismiss:`Dispensar`,cancel:`Cancelar`,showMore:`Mostrar mais ({count})`,showLess:`Mostrar menos`,openTarget:`Abrir`,expandDetails:`Expandir detalhes`},pluginDiagnostics:{title:`Problema de configuração do plugin`,hostBody:`O plugin "{plugin}" tentou registrar a chave {label} "{key}", mas ela está reservada para o host. A entrada do plugin foi descartada.`,intraBody:`Os plugins "{first}" e "{second}" registram o mesmo {dimension} "{key}". "{first}" o reivindicou primeiro, portanto o registro de "{second}" é ignorado.`},shadowedEnv:{title:`O shell está sobrepondo o .env`,body:`Definido tanto no shell quanto no .env: {keys}. O valor do shell prevalece, portanto o .env é ignorado. Se você editou o .env, atualize ou remova o valor do shell e reinicie.`},optionalDeps:{title:`Dependência opcional indisponível`,titleNotFound:`{command} não está instalado`,titleNotResponding:`{command} não está em execução`,notFound:`{command} não encontrado — recursos relacionados foram desativados. Instale {command} e reinicie o MulmoClaude para habilitá-los.`,notResponding:`{command} está instalado mas não está em execução — recursos relacionados foram desativados. Inicie {command} e reinicie o MulmoClaude para habilitá-los.`},billingMigration:{title:`O faturamento passou a ser configurado sob demanda`,body:`As coleções incluídas clients, worklog, invoice e profile foram removidas do seu painel, mas seus dados estão seguros e intactos. Peça para configurar o controle de clientes e horas e, em seguida, o faturamento para recriá-las; seus registros existentes reaparecerão.`},backendOffline:{title:`Não foi possível conectar ao backend`,body:`O servidor do MulmoClaude pode não estar em execução. Verifique o servidor de desenvolvimento e tente novamente.`,retry:`Tentar novamente`},pluginErrorBoundary:{title:`O plugin {pkg} travou`,subtitle:`O plugin falhou ao renderizar. O erro foi registrado no console.`,showDetails:`Mostrar detalhes`,hideDetails:`Ocultar detalhes`,retry:`Tentar novamente`},remoteHostOffline:{title:`Host remoto desconectado`,body:`Seu telefone não conseguirá enviar para este dispositivo até você reconectar.`,reconnect:`Reconectar`},authTokenStale:{title:`Esta página precisa ser recarregada`,body:`O servidor recusou o token desta página e não foi possível obter um novo. Recarregue para continuar.`,reload:`Recarregar`},remoteHost:{title:`Host remoto`,online:`Host remoto on-line`,offline:`Host remoto off-line`,uid:`uid {uid}`,signIn:`Entrar com o Google`,connecting:`Conectando…`,disconnect:`Desconectar`,disconnecting:`Desconectando…`,noToken:`O login do Google não retornou idToken`,connectFailed:`Falha ao conectar`,disconnectFailed:`Falha ao desconectar`,signInFailed:`Falha ao entrar com o Google`,statusFailed:`Falha ao carregar o status`,description:`O acesso remoto permite que um dispositivo móvel se conecte às coleções e feeds deste MulmoClaude.`,howTo:`No seu telefone, abra {url} e entre com a mesma conta do Google.`,customViewHint:`Para uma visualização adaptada ao celular, peça ao Claude para criar uma {keyword} (não uma custom view comum).`,qrHint:`Ou escaneie este código QR com a câmera do seu celular.`},sessionModelChip:{tooltip:`Modelo que esta sessão está usando: {model}`,tooltipOverride:`Modelo deste chat: {model} (sobrepõe o papel / configuração global)`,ariaLabel:`Modelo deste chat`,clear:`Voltar ao padrão`,unknown:`desconhecido`,inherited:`{model} (herdado)`},sidebarHeader:{newMessages:`Novas mensagens`,home:`Ir para o chat mais recente`,toolCallHistory:`Histórico de chamadas de ferramentas`,settings:`Configurações`,settingsGeminiMissing:`Configurações — Chave da API Gemini ausente`,todayJournal:`Resumo de hoje`,todayJournalNotFound:`Ainda sem resumo — converse um pouco e o journal será gerado.`,todayJournalLoadFailed:`Falha ao carregar o journal (status {status}): {error}`,copyMarkdown:`Copiar conversa como Markdown`,copiedMarkdown:`Copiado!`},rightSidebar:{permalink:`Link para a mensagem selecionada`,copyPermalink:`Copiar link para a mensagem selecionada`,copiedPermalink:`Copiado!`,toggleSystemPrompt:`Alternar system prompt`,systemPrompt:`System Prompt`,availableTools:`Ferramentas disponíveis`,toggleToolDescription:`Alternar descrição da ferramenta`,toolCallHistory:`Histórico de chamadas de ferramentas`,copyHistory:`Copiar histórico de chamadas de ferramentas`,copiedHistory:`Copiado!`,noToolCalls:`Ainda não há chamadas de ferramentas`,arguments:`Argumentos`,error:`Erro`,result:`Resultado`,running:`Executando...`,mcpHint:{title:e=>`Dica de configuração: ${e.named(`server`)}`,requiredKeys:`Chaves obrigatórias`,setupGuide:`Abrir guia de configuração`}},fileTreePane:{sort:`Ordenar:`,sortByName:`Ordenar por nome`,name:`Nome`,sortByRecent:`Ordenar por data de modificação (mais recentes primeiro)`,recent:`Recente`,reference:`Referência`,readOnlyBadge:`RO`,showSystemFiles:`Exibir arquivos do sistema`,showSystemFilesTitle:`Mostra os diretórios raiz internos do agente (conversations/, feeds/ etc.) além do conteúdo do usuário (data/, artifacts/, config/).`},fileTree:{dropHint:`Solte arquivos aqui para salvá-los nesta pasta`,upload:{progress:`Enviando {done} de {total}…`,done:`{count} arquivo(s) salvo(s)`,failed:`Não foi possível salvar {count} arquivo(s)`},workspace:`(workspace)`,recentlyChanged:`Alterados recentemente`,newFileMenuItem:`Novo arquivo`,newFileInputAria:`Nome do novo arquivo`,newFilePlaceholder:{wikiPage:`slug-da-página`,summary:`nome-do-resumo`,document:`nome-do-documento`,html:`nome-da-página`,story:`nome-da-história`},newFileError:{empty:`O nome do arquivo não pode ficar vazio.`,unsafe:`O nome do arquivo contém caracteres inválidos.`,exists:`Já existe um arquivo chamado {filename} aqui.`,saveFailed:`Não foi possível criar o arquivo. Tente novamente.`}},lockStatusPopup:{sandboxEnabledTooltip:`Sandbox habilitado (Docker)`,noSandboxTooltip:`Sem sandbox (Docker não encontrado)`,sandboxEnabledLabel:`Sandbox habilitado:`,sandboxEnabledBody:`Docker está em execução. O acesso ao sistema de arquivos está isolado.`,noSandboxLabel:`Sem sandbox:`,noSandboxBodyPrefix:`O Claude pode acessar todos os arquivos da sua máquina. Instale o`,noSandboxBodySuffix:`para habilitar o isolamento do sistema de arquivos.`,dockerDesktop:`Docker Desktop`,hostCredentials:`Credenciais do host anexadas:`,credsLoading:`carregando…`,sshAgent:`Agente SSH:`,forwarded:`encaminhado`,notForwarded:`não encaminhado`,mountedConfigs:`Configurações montadas:`,none:`nenhuma`,testIsolation:`Testar isolamento do sandbox:`},settingsModal:{title:`Configurações`,version:`MulmoClaude v{version}`,tabs:{gemini:`Chave API do Gemini`,tools:`Ferramentas permitidas`,mcp:`Servidores MCP`,dirs:`Diretórios`,refs:`Diretórios de referência`,map:`Mapa`,photos:`Fotos`,google:`Google`,model:`Modelo`,voice:`Voz`,chatIndex:`Índice de chat`,journal:`Diário`,notifications:`Web Push`,skills:`Skills`,roles:`Papéis`,quit:`Encerrar`},groups:{llm:`LLM`,servers:`Servidores`,workspace:`Espaço de trabalho`,notifications:`Notificações`,plugins:`Plugins`,management:`Gerenciamento`,server:`Servidor`},navAriaLabel:`Seções de configurações`,googleTab:{description:`Vincule sua conta do Google para que esta máquina possa chamar as APIs do Google (Calendar primeiro). O token de atualização fica salvo apenas nesta máquina e nunca é enviado a nenhum servidor além do Google.`,statusLinked:`Vinculada`,statusNotLinked:`Não vinculada`,statusPending:`Aguardando a conclusão do consentimento no navegador…`,connect:`Vincular conta do Google`,unlink:`Desvincular`,unlinkConfirm:`Desvincular a conta do Google? O token salvo será revogado e excluído desta máquina.`,clientSecretAmbiguous:`Vários arquivos client_secret_*.json foram encontrados em ~/.secrets/. Mantenha apenas um para que o token salvo continue pareado com o cliente OAuth correto.`,loadError:`Falha ao carregar o estado da vinculação com o Google.`,connectError:`Falha ao iniciar o fluxo de autorização do Google.`,unlinkError:`Falha ao desvincular a conta do Google.`},geminiTab:{required:`A geração de imagens requer {envKey}. Cole a chave abaixo e salve.`,apiKeyLabel:`Chave de API do Gemini`,apiKeyPlaceholder:`AIza…`,helperText:`Crie ou copie uma chave em {studioLink}.`,storageNote:`Fica salva apenas neste computador, fora do workspace, e somente você pode ler. Passa a valer na hora — sem reiniciar.`,storedHere:`Salva no app`,storedInEnvironment:`Vem do ambiente`,notConfigured:`Não configurada`,clear:`Limpar`,fromEnvironment:`Esta chave vem do shell que iniciou o app ou de {envFile}. Uma chave salva aqui tem prioridade.`,loadError:`Falha ao carregar o estado da chave`,saveError:`Falha ao salvar a chave`,clearError:`Falha ao limpar a chave`},mapTab:{description:`Define a chave da API do Google Maps usada pelo plugin de mapa. A chave fica salva localmente e só é enviada para o Google Maps.`,apiKeyLabel:`Chave API do Google Maps`,apiKeyPlaceholder:`AIza…`,helperText:`Crie ou copie uma chave em {consoleLink}.`,requiredApis:`APIs necessárias: Maps JavaScript API, Geocoding API, Places API (New), Directions API.`,configured:`Configurada`,notConfigured:`Não configurada`,clear:`Limpar`,loadError:`Falha ao carregar as configurações`,saveError:`Falha ao salvar`},photosTab:{description:`Controles de privacidade para fotos recebidas pelo chat ou por um bridge conectado. Os dados de localização EXIF são sensíveis — desmarque para desativar a captura automática.`,autoCaptureLabel:`Capturar automaticamente a localização das fotos`,autoCaptureHint:`Ativado: cada imagem enviada com GPS no EXIF gera um sidecar de localização em data/locations/. Desativado: nada é capturado automaticamente; o LLM ainda pode extrair EXIF manualmente.`,statusOn:`Captura automática ATIVADA`,statusOff:`Captura automática DESATIVADA`,loadError:`Falha ao carregar as configurações`,saveError:`Falha ao salvar`},quitTab:{description:`Encerra o servidor do MulmoClaude em execução nesta máquina. Iniciado pelo ícone, ele continua rodando mesmo se você fechar esta aba — é assim que se encerra sem um terminal.`,restartHint:()=>"Para iniciar de novo, dê um duplo clique no ícone do MulmoClaude (ou rode `npx mulmoclaude@latest`).",quitLabel:`Encerrar o MulmoClaude`,confirmBody:`O servidor para e esta página deixa de funcionar. O que estiver em andamento é interrompido.`,confirmLabel:`Encerrar`,stopping:`Encerrando…`,stoppedTitle:`O MulmoClaude foi encerrado`,stoppedBody:`Você pode fechar esta aba. Dê um duplo clique no ícone para iniciar de novo.`,error:`Falha ao encerrar o servidor`},notificationsTab:{description:`Receba uma notificação push nos seus dispositivos registrados quando uma tarefa que você iniciou aqui terminar — útil quando você pergunta algo, se afasta e quer saber assim que a resposta estiver pronta.`,enableLabel:`Enviar um Web Push quando uma tarefa terminar`,enableHint:`Dispara quando um chat que você iniciou aqui é concluído. Tarefas agendadas e em segundo plano não o acionam.`,remoteHostNote:`Requer a conexão RemoteHost (que fornece o login) e pelo menos um dispositivo registrado. Se algum faltar, não faz nada.`,macosRemindersLabel:`Criar um lembrete do macOS quando uma tarefa terminar`,macosRemindersHint:`Adiciona a tarefa concluída à sua lista padrão de Lembretes. A sincronização do iCloud espelha no seu iPhone, que é quem entrega a notificação.`,macosRemindersForcedOff:`Desativado na inicialização por --disable-macos-reminders ou DISABLE_MACOS_REMINDER_NOTIFICATIONS. Remova a flag ou limpe a variável de ambiente e reinicie para controlar por aqui.`,statusOn:`Web Push está ATIVADO`,statusOff:`Web Push está DESATIVADO`,loadError:`Falha ao carregar as configurações`,saveError:`Falha ao salvar`},modelTab:{description:`Escolha o modelo e o esforço de raciocínio que o Claude Code usa em cada turno. Deixe qualquer um sem configurar para manter a resolução do próprio Claude.`,modelLabel:`Modelo`,modelUnset:`(sem configurar — seguir ~/.claude/settings.json)`,modelHelperText:`Sem configurar, o modelo vem de ~/.claude/settings.json, o mesmo arquivo onde outros clientes do Claude Code (VS Code, Cursor) salvam a escolha do /model, então uma troca lá também muda o MulmoClaude. Os aliases acompanham a geração mais recente de cada família.`,modelConfigured:`Modelo: {model}`,modelNotConfigured:`Sem configurar (compartilhado)`,effortLabel:`Esforço de raciocínio`,effortUnset:`(sem configurar — usar padrão do Claude)`,helperText:`Níveis mais altos permitem mais tempo de pensamento mas aumentam latência e uso de tokens.`,configured:`Esforço: {level}`,notConfigured:`Sem configurar`,userSettingsLabel:`Carregar as configurações de usuário e os plugins do Claude Code`,userSettingsHint:`Lê as skills, os plugins e os hooks de ~/.claude, os mesmos que o Claude Code usa. Desative se os plugins instalados trazem tantas skills que toda solicitação fica pesada; as skills do próprio workspace continuam funcionando. Vale a partir da próxima mensagem. Desativado, um modelo não definido também deixa de seguir ~/.claude/settings.json.`,skillListingSummary:`Skills carregadas no último turno: {count}.`,skillListingPlugins:`Dos plugins: {plugins}.`,skillListingHeavy:`Com tantas skills toda solicitação fica pesada; ao desativar, as de ~/.claude saem.`,loadError:`Falha ao carregar as configurações`,saveError:`Falha ao salvar`},voiceTab:{description:`Dite mensagens de chat com sua voz. O áudio é transcrito localmente na máquina que executa o MulmoClaude — nada é enviado para nenhum serviço externo.`,requirements:`Disponível apenas no macOS. Requer o servidor whisper.cpp — compile-o com yarn build:whisper (veja a seção Local Voice Input no README).`,unsupported:`A entrada de voz requer macOS com o servidor whisper.cpp instalado. Não está disponível nesta máquina.`,enableLabel:`Ativar entrada de voz`,enableHint:`Ao ativar, o modelo de voz (1–3 GB) é baixado uma vez. Em seguida, um botão de microfone aparece na entrada de chat.`,modelLabel:`Modelo de voz`,downloading:`Baixando modelo… {percent}%`,ready:`Modelo pronto`,downloadError:`Falha ao baixar o modelo.`,retry:`Tentar novamente`,loadError:`Falha ao carregar as configurações`,saveError:`Falha ao salvar`},chatIndexTab:{description:`Títulos e resumos gerados por IA para o histórico do chat. Sai desativado por padrão — sessões de automação (scheduler / workers do sistema) sempre são ignoradas mesmo quando ativado; sessões humanas pagam apenas uma chamada ao sumarizador ao terminar cada turno.`,modeLabel:`Modelo do índice de chat`,helperText:`Haiku é mais barato; Sonnet dá títulos mais precisos em sessões longas que mudam de assunto.`,mode:{off:`Desativado`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Indexação DESATIVADA`,haiku:`Indexando com Haiku`,sonnet:`Indexando com Sonnet`},loadError:`Falha ao carregar as configurações`,saveError:`Falha ao salvar`},journalTab:{description:`Diário diário automatizado — resume sessões recentes de chat em journal/*.md e extrai notas de memória duradoura. Sai desativado por padrão. Sessões de automação (scheduler / workers do sistema) são sempre excluídas, independentemente desta configuração.`,modeLabel:`Modelo do diário`,helperText:`Haiku é mais barato; Sonnet produz resumos diários / por tópico mais ricos. A passagem horária só é executada quando isto está ativado.`,mode:{off:`Desativado`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Diário DESATIVADO`,haiku:`Diário em execução com Haiku`,sonnet:`Diário em execução com Sonnet`},loadError:`Falha ao carregar as configurações`,saveError:`Falha ao salvar`},geminiAskButton:`Perguntar ao Claude`,geminiAskMessage:`Qual é o papel da chave API do Gemini neste app?`,toolNamesLabel:`Nomes de ferramentas`,invalidToolNamesPrefix:`Estes parecem não padrão (prefixo esperado`,invalidToolNamesSuffix:`):`,mcpToolsError:`⚠ Não foi possível obter o status das ferramentas MCP: {error}. Exibindo todas as ferramentas independentemente de estarem habilitadas.`,changesHint:`As alterações se aplicam na próxima mensagem. Não é preciso reiniciar.`,cannotSaveTooltip:`Não é possível salvar até as configurações carregarem com sucesso`,saving:`Salvando…`,loadingLabel:`Carregando…`,unsavedMarker:`●`,unsavedToolsConfirm:`Allowed Tools tem alterações não salvas. Fechar mesmo assim?`,unsavedMcpDraftConfirm:`Há um rascunho de servidor MCP aberto. Fechar mesmo assim?`,mcpSaveFailed:`Não foi possível salvar as alterações dos servidores MCP.`},canvasViewToggle:{stackViewTooltip:`Visão em pilha · clique para alternar para visão única`,singleViewTooltip:`Visão única · clique para alternar para visão em pilha`,switchToSingle:`Alternar para visão única`,switchToStack:`Alternar para visão em pilha`},sessionHistoryToggle:{showTooltip:`Mostrar o painel de histórico de sessões à esquerda`,hideTooltip:`Ocultar o painel de histórico de sessões`,show:`Mostrar histórico de sessões`,hide:`Ocultar histórico de sessões`},sessionHistoryExpand:{expandTooltip:`Expandir o painel de histórico de sessões para largura total`,collapseTooltip:`Recolher o painel de histórico de sessões`,expand:`Expandir histórico de sessões`,collapse:`Recolher histórico de sessões`},settingsWorkspaceDirs:{explanation:`Diretórios personalizados para organizar arquivos em {dataDir} e {artifactsDir}. O Claude os usa para decidir onde salvar arquivos.`,noEntries:`Nenhum diretório personalizado configurado.`,addDirTitle:`Adicionar diretório`,pathPlaceholder:`data/clientes ou artifacts/relatorios`,descPlaceholder:`Descrição (o que vai nesta pasta)`,errPathRequired:`Caminho é obrigatório`,errMustStartWith:`Deve começar com data/ ou artifacts/`,errAlreadyExists:`Já existe`},settingsReferenceDirs:{explanation:`Diretórios externos que o Claude pode ler, mas não modificar. No modo Docker, são montados como somente leitura. Úteis para referenciar vaults do Obsidian, código de projetos ou pastas de documentos.`,noEntries:`Nenhum diretório de referência configurado.`,addDirTitle:`Adicionar diretório de referência`,pathPlaceholder:`/Users/eu/ObsidianVault ou ~/Documentos/notas`,labelPlaceholder:`Rótulo (opcional — padrão é o nome da pasta)`,readOnlyBadge:`somente leitura`,errPathRequired:`Caminho é obrigatório`,errMustBeAbsolute:`Deve ser um caminho absoluto ou começar com ~/`,errAlreadyExists:`Já existe`,errLabelConflict:`Rótulo "{label}" já existe`},dashboard:{empty:`Ainda não há coleções favoritas.`,emptyHint:`Fixe uma coleção (★) para vê-la aqui.`,viewTable:`Tabela`,viewCalendar:`Calendário`,viewKanban:`Kanban`,viewPickerLabel:`Escolher visualização`,openFull:`Clique duplo para abrir a visualização completa`,dragHint:`Arraste para reordenar`,resizeHint:`Arraste para redimensionar a altura`},pluginLauncher:{chat:{label:`Chat`},dashboard:{label:`Painel`},automations:{label:`Ações`},wiki:{label:`Wiki`},collections:{label:`Coleções`},feeds:{label:`Feeds`},accounting:{label:`Contabilidade`},files:{label:`Arquivos`}},shortcuts:{pin:`Fixar no iniciador`,unpin:`Desafixar do iniciador`,zoneAriaLabel:`Atalhos fixados`,reorder:{open:`Reordenar atalhos`,title:`Reordenar`,moveUp:`Mover para cima`,moveDown:`Mover para baixo`}},fileContentHeader:{showRendered:`Mostrar Markdown renderizado`,showRaw:`Mostrar código-fonte`,rendered:`Renderizado`,raw:`Fonte`,closeFile:`Fechar arquivo`,revealInOs:`Mostrar na pasta`,revealInOsFailed:`Falha ao mostrar na pasta`},fileContentRenderer:{download:`ZIP`,downloadZip:`Baixar como zip autônomo (recursos incluídos)`,downloadError:`Falha no download`,selectFile:`Selecione um arquivo`,htmlPreview:`Pré-visualização HTML`,pdfPreview:`Pré-visualização PDF`,parseError:`erro de análise`,editJson:`Editar JSON`,jsonEditorLabel:`Editor JSON`,invalidJson:`JSON inválido`,undo:`Desfazer`,redo:`Refazer`,editMarp:`Editar código do slide`,marpEditorLabel:`Código do slide Marp`,openInOs:`Abrir no SO`,openingInOs:`Abrindo…`,openInOsFailed:`Falha ao abrir no SO`,downloadFile:`Baixar`,downloadingFile:`Baixando…`},filesView:{chatPlaceholder:`Pergunte sobre este arquivo…`},systemFiles:{schemaLabel:`Esquema`,showDetails:`Mostrar detalhes`,hideDetails:`Ocultar detalhes`,editPolicy:{"agent-managed-but-hand-editable":`Gerenciado pelo agente (edição manual permitida)`,"user-editable":`Editável pelo usuário`,"agent-managed":`Gerenciado pelo agente`,"fragile-format":`Formato frágil`,ephemeral:`Efêmero`},mcp:{title:`Servidores MCP`,summary:`Servidores externos do Model Context Protocol conectados ao agente. Adicione servidores HTTP ou stdio para expandir as ferramentas.`},settings:{title:`Configurações do app`,summary:`Preferências de comportamento editáveis — chave da API Gemini, ferramentas permitidas, configuração do sandbox etc.`},schedulerTasks:{title:`Tarefas do agendador`,summary:`Automações recorrentes do agente que disparam em horário definido. Gerenciadas pela UI Automations; este arquivo é a fonte em disco.`},schedulerOverrides:{title:`Sobrescritas do agendador`,summary:`Sobrescritas por tarefa de horário / intervalo aplicadas sobre o agendamento do sistema. O agente edita quando você pede para mudar o horário de uma tarefa.`},schedulerItems:{title:`Fila de itens do agendador`,summary:`Invocações agendadas prontas para disparar. Gerenciado pelo agente; não edite manualmente sem entender cada campo.`},wikiIndex:{title:`Índice da wiki`,summary:`Índice autogerado de todas as páginas da wiki. Atualizado a cada edição — não edite manualmente (suas alterações serão sobrescritas).`},wikiLog:{title:`Log de edição da wiki`,summary:`Log de atividade de criação e edição de páginas. Gerenciado pelo agente e somente acréscimos — útil como feed de mudanças recentes.`},wikiSummary:{title:`Resumo da wiki`,summary:`Visão geral autogerada da wiki — clusters de tópicos, contagem de páginas, atividade recente. Atualizado pelo agente.`},wikiSchema:{title:`Esquema da wiki`,summary:`Especificação de formato que o agente lê para manter as páginas da wiki consistentes. Frágil — espera uma estrutura específica; prefira edições via agente.`},memory:{title:`Memória`,summary:`Fatos destilados sobre você, sempre carregados como contexto em novas conversas. O extrator do journal adiciona automaticamente; você também pode editar manualmente.`},summariesIndex:{title:`Índice de resumos`,summary:`Índice navegável com links para os resumos diários e por tópico gerados pelo journal. Gerenciado pelo agente; atualizado a cada execução do journal.`},rolesJson:{title:`Definição da role (JSON)`,summary:`Configuração da role — escolha de modelo, servidores MCP, plugins permitidos, sugestões de query. Editável, sem reinício.`},rolesMd:{title:`Descrição da role (Markdown)`,summary:`Persona e system prompt da role, carregada como contexto quando esta role está ativa. Editável; mudanças aplicam na próxima mensagem.`},journalDaily:{title:`Resumo diário do journal`,summary:`Retrospectiva autogerada da sua atividade em um dia, destilada pelo journal a partir das sessões de chat.`},journalTopic:{title:`Journal por tópico`,summary:`Notas de longo prazo sobre um tópico específico, acumuladas e revisadas conforme você continua falando dele. Gerenciado pelo agente.`}},settingsMcpTab:{explanation:`Adicione servidores MCP externos. Servidores HTTP funcionam em todos os modos. Servidores Stdio usam o {npx} / {node} / {tsx} da imagem do sandbox; quando o Docker está habilitado, os caminhos devem ficar dentro do workspace.`,localhostRewrite:`No modo Docker, {localhost} é reescrito para {hostDockerInternal}.`,noServers:`Ainda não há servidores MCP configurados.`,enabled:`habilitado`,urlLabel:`URL:`,commandLabel:`Comando:`,dockerStdioUnsupported:`⚠ Não será executado enquanto o sandbox do Docker estiver ativado.`,dockerStdioHostExecActive:`⚠ Executa no host: este servidor sai do sandbox do Docker.`,dockerStdioHostExecOptIn:`Executar no host mesmo assim (avançado). Este servidor é executado fora do sandbox do Docker por meio de um gateway HTTP local e pode acessar sua máquina.`,learnMore:`Saiba mais`,addServerButton:`+ Adicionar servidor MCP`,nameLabel:`Nome`,namePlaceholder:`meu-servidor`,typeHttp:`HTTP`,typeStdio:`Stdio (comando)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`Comando`,argsLabel:`Argumentos (um por linha)`,argsPlaceholder:()=>`-y
|
|
250
|
+
Esta ação não pode ser desfeita.`},notificationBell:{notifications:`Notificações`,activeSection:`Ativas`,historySection:`Histórico`,noActive:`Sem notificações ativas`,noHistory:`Sem atividade recente`,clearAll:`Limpar`,dismiss:`Dispensar`,cancel:`Cancelar`,showMore:`Mostrar mais ({count})`,showLess:`Mostrar menos`,openTarget:`Abrir`,expandDetails:`Expandir detalhes`},pluginDiagnostics:{title:`Problema de configuração do plugin`,hostBody:`O plugin "{plugin}" tentou registrar a chave {label} "{key}", mas ela está reservada para o host. A entrada do plugin foi descartada.`,intraBody:`Os plugins "{first}" e "{second}" registram o mesmo {dimension} "{key}". "{first}" o reivindicou primeiro, portanto o registro de "{second}" é ignorado.`},shadowedEnv:{title:`O shell está sobrepondo o .env`,body:`Definido tanto no shell quanto no .env: {keys}. O valor do shell prevalece, portanto o .env é ignorado. Se você editou o .env, atualize ou remova o valor do shell e reinicie.`},optionalDeps:{title:`Dependência opcional indisponível`,titleNotFound:`{command} não está instalado`,titleNotResponding:`{command} não está em execução`,notFound:`{command} não encontrado — recursos relacionados foram desativados. Instale {command} e reinicie o MulmoClaude para habilitá-los.`,notResponding:`{command} está instalado mas não está em execução — recursos relacionados foram desativados. Inicie {command} e reinicie o MulmoClaude para habilitá-los.`},billingMigration:{title:`O faturamento passou a ser configurado sob demanda`,body:`As coleções incluídas clients, worklog, invoice e profile foram removidas do seu painel, mas seus dados estão seguros e intactos. Peça para configurar o controle de clientes e horas e, em seguida, o faturamento para recriá-las; seus registros existentes reaparecerão.`},backendOffline:{title:`Não foi possível conectar ao backend`,body:`O servidor do MulmoClaude pode não estar em execução. Verifique o servidor de desenvolvimento e tente novamente.`,retry:`Tentar novamente`},pluginErrorBoundary:{title:`O plugin {pkg} travou`,subtitle:`O plugin falhou ao renderizar. O erro foi registrado no console.`,showDetails:`Mostrar detalhes`,hideDetails:`Ocultar detalhes`,retry:`Tentar novamente`},remoteHostOffline:{title:`Host remoto desconectado`,body:`Seu telefone não conseguirá enviar para este dispositivo até você reconectar.`,reconnect:`Reconectar`},authTokenStale:{title:`Esta página precisa ser recarregada`,body:`O servidor recusou o token desta página e não foi possível obter um novo. Recarregue para continuar.`,reload:`Recarregar`},remoteHost:{title:`Host remoto`,online:`Host remoto on-line`,offline:`Host remoto off-line`,uid:`uid {uid}`,signIn:`Entrar com o Google`,connecting:`Conectando…`,disconnect:`Desconectar`,disconnecting:`Desconectando…`,noToken:`O login do Google não retornou idToken`,connectFailed:`Falha ao conectar`,disconnectFailed:`Falha ao desconectar`,signInFailed:`Falha ao entrar com o Google`,statusFailed:`Falha ao carregar o status`,description:`O acesso remoto permite que um dispositivo móvel se conecte às coleções e feeds deste MulmoClaude.`,howTo:`No seu telefone, abra {url} e entre com a mesma conta do Google.`,customViewHint:`Para uma visualização adaptada ao celular, peça ao Claude para criar uma {keyword} (não uma custom view comum).`,qrHint:`Ou escaneie este código QR com a câmera do seu celular.`},sessionModelChip:{tooltip:`Modelo que esta sessão está usando: {model}`,tooltipOverride:`Modelo deste chat: {model} (sobrepõe o papel / configuração global)`,ariaLabel:`Modelo deste chat`,clear:`Voltar ao padrão`,unknown:`desconhecido`,inherited:`{model} (herdado)`},sidebarHeader:{newMessages:`Novas mensagens`,home:`Ir para o chat mais recente`,toolCallHistory:`Histórico de chamadas de ferramentas`,settings:`Configurações`,settingsGeminiMissing:`Configurações — Chave da API Gemini ausente`,todayJournal:`Resumo de hoje`,todayJournalNotFound:`Ainda sem resumo — converse um pouco e o journal será gerado.`,todayJournalLoadFailed:`Falha ao carregar o journal (status {status}): {error}`,copyMarkdown:`Copiar conversa como Markdown`,copiedMarkdown:`Copiado!`},rightSidebar:{permalink:`Link para a mensagem selecionada`,copyPermalink:`Copiar link para a mensagem selecionada`,copiedPermalink:`Copiado!`,toggleSystemPrompt:`Alternar system prompt`,systemPrompt:`System Prompt`,availableTools:`Ferramentas disponíveis`,toggleToolDescription:`Alternar descrição da ferramenta`,toolCallHistory:`Histórico de chamadas de ferramentas`,copyHistory:`Copiar histórico de chamadas de ferramentas`,copiedHistory:`Copiado!`,noToolCalls:`Ainda não há chamadas de ferramentas`,arguments:`Argumentos`,error:`Erro`,result:`Resultado`,running:`Executando...`,mcpHint:{title:e=>`Dica de configuração: ${e.named(`server`)}`,requiredKeys:`Chaves obrigatórias`,setupGuide:`Abrir guia de configuração`}},fileTreePane:{sort:`Ordenar:`,sortByName:`Ordenar por nome`,name:`Nome`,sortByRecent:`Ordenar por data de modificação (mais recentes primeiro)`,recent:`Recente`,reference:`Referência`,readOnlyBadge:`RO`,showSystemFiles:`Exibir arquivos do sistema`,showSystemFilesTitle:`Mostra os diretórios raiz internos do agente (conversations/, feeds/ etc.) além do conteúdo do usuário (data/, artifacts/, config/).`},fileTree:{dropHint:`Solte arquivos aqui para salvá-los nesta pasta`,upload:{progress:`Enviando {done} de {total}…`,done:`{count} arquivo(s) salvo(s)`,failed:`Não foi possível salvar {count} arquivo(s)`},workspace:`(workspace)`,recentlyChanged:`Alterados recentemente`,newFileMenuItem:`Novo arquivo`,newFileInputAria:`Nome do novo arquivo`,newFilePlaceholder:{wikiPage:`slug-da-página`,summary:`nome-do-resumo`,document:`nome-do-documento`,html:`nome-da-página`,story:`nome-da-história`},newFileError:{empty:`O nome do arquivo não pode ficar vazio.`,unsafe:`O nome do arquivo contém caracteres inválidos.`,exists:`Já existe um arquivo chamado {filename} aqui.`,saveFailed:`Não foi possível criar o arquivo. Tente novamente.`}},lockStatusPopup:{sandboxEnabledTooltip:`Sandbox habilitado (Docker)`,noSandboxTooltip:`Sem sandbox (Docker não encontrado)`,sandboxEnabledLabel:`Sandbox habilitado:`,sandboxEnabledBody:`Docker está em execução. O acesso ao sistema de arquivos está isolado.`,noSandboxLabel:`Sem sandbox:`,noSandboxBodyPrefix:`O Claude pode acessar todos os arquivos da sua máquina. Instale o`,noSandboxBodySuffix:`para habilitar o isolamento do sistema de arquivos.`,dockerDesktop:`Docker Desktop`,hostCredentials:`Credenciais do host anexadas:`,credsLoading:`carregando…`,sshAgent:`Agente SSH:`,forwarded:`encaminhado`,notForwarded:`não encaminhado`,mountedConfigs:`Configurações montadas:`,none:`nenhuma`,testIsolation:`Testar isolamento do sandbox:`},settingsModal:{title:`Configurações`,version:`MulmoClaude v{version}`,tabs:{gemini:`Chave API do Gemini`,tools:`Ferramentas permitidas`,mcp:`Servidores MCP`,dirs:`Diretórios`,refs:`Diretórios de referência`,map:`Mapa`,photos:`Fotos`,google:`Google`,model:`Modelo`,voice:`Voz`,chatIndex:`Índice de chat`,journal:`Diário`,notifications:`Web Push`,skills:`Skills`,roles:`Papéis`,quit:`Encerrar`},groups:{llm:`LLM`,servers:`Servidores`,workspace:`Espaço de trabalho`,notifications:`Notificações`,plugins:`Plugins`,management:`Gerenciamento`,server:`Servidor`},navAriaLabel:`Seções de configurações`,googleTab:{description:`Vincule sua conta do Google para que esta máquina possa chamar as APIs do Google (Calendar primeiro). O token de atualização fica salvo apenas nesta máquina e nunca é enviado a nenhum servidor além do Google.`,statusLinked:`Vinculada`,statusNotLinked:`Não vinculada`,statusPending:`Aguardando a conclusão do consentimento no navegador…`,connect:`Vincular conta do Google`,unlink:`Desvincular`,unlinkConfirm:`Desvincular a conta do Google? O token salvo será revogado e excluído desta máquina.`,clientSecretAmbiguous:`Vários arquivos client_secret_*.json foram encontrados em ~/.secrets/. Mantenha apenas um para que o token salvo continue pareado com o cliente OAuth correto.`,loadError:`Falha ao carregar o estado da vinculação com o Google.`,connectError:`Falha ao iniciar o fluxo de autorização do Google.`,unlinkError:`Falha ao desvincular a conta do Google.`},geminiTab:{required:`A geração de imagens requer {envKey}. Cole a chave abaixo e salve.`,apiKeyLabel:`Chave de API do Gemini`,apiKeyPlaceholder:`AIza…`,helperText:`Crie ou copie uma chave em {studioLink}.`,storageNote:`Fica salva apenas neste computador, fora do workspace, e somente você pode ler. Passa a valer na hora — sem reiniciar.`,storedHere:`Salva no app`,storedInEnvironment:`Vem do ambiente`,notConfigured:`Não configurada`,clear:`Limpar`,fromEnvironment:`Esta chave vem do shell que iniciou o app ou de {envFile}. Uma chave salva aqui tem prioridade.`,loadError:`Falha ao carregar o estado da chave`,saveError:`Falha ao salvar a chave`,clearError:`Falha ao limpar a chave`},mapTab:{description:`Define a chave da API do Google Maps usada pelo plugin de mapa. A chave fica salva localmente e só é enviada para o Google Maps.`,apiKeyLabel:`Chave API do Google Maps`,apiKeyPlaceholder:`AIza…`,helperText:`Crie ou copie uma chave em {consoleLink}.`,requiredApis:`APIs necessárias: Maps JavaScript API, Geocoding API, Places API (New), Directions API.`,configured:`Configurada`,notConfigured:`Não configurada`,clear:`Limpar`,loadError:`Falha ao carregar as configurações`,saveError:`Falha ao salvar`},photosTab:{description:`Controles de privacidade para fotos recebidas pelo chat ou por um bridge conectado. Os dados de localização EXIF são sensíveis — desmarque para desativar a captura automática.`,autoCaptureLabel:`Capturar automaticamente a localização das fotos`,autoCaptureHint:`Ativado: cada imagem enviada com GPS no EXIF gera um sidecar de localização em data/locations/. Desativado: nada é capturado automaticamente; o LLM ainda pode extrair EXIF manualmente.`,statusOn:`Captura automática ATIVADA`,statusOff:`Captura automática DESATIVADA`,loadError:`Falha ao carregar as configurações`,saveError:`Falha ao salvar`},quitTab:{description:`Encerra o servidor do MulmoClaude em execução nesta máquina. Iniciado pelo ícone, ele continua rodando mesmo se você fechar esta aba — é assim que se encerra sem um terminal.`,restartHint:()=>"Para iniciar de novo, dê um duplo clique no ícone do MulmoClaude (ou rode `npx mulmoclaude@latest`).",quitLabel:`Encerrar o MulmoClaude`,confirmBody:`O servidor para e esta página deixa de funcionar. O que estiver em andamento é interrompido.`,confirmLabel:`Encerrar`,stopping:`Encerrando…`,stoppedTitle:`O MulmoClaude foi encerrado`,stoppedBody:`Você pode fechar esta aba. Dê um duplo clique no ícone para iniciar de novo.`,error:`Falha ao encerrar o servidor`},notificationsTab:{description:`Receba uma notificação push nos seus dispositivos registrados quando uma tarefa que você iniciou aqui terminar — útil quando você pergunta algo, se afasta e quer saber assim que a resposta estiver pronta.`,enableLabel:`Enviar um Web Push quando uma tarefa terminar`,enableHint:`Dispara quando um chat que você iniciou aqui é concluído. Tarefas agendadas e em segundo plano não o acionam.`,remoteHostNote:`Requer a conexão RemoteHost (que fornece o login) e pelo menos um dispositivo registrado. Se algum faltar, não faz nada.`,macosRemindersLabel:`Criar um lembrete do macOS quando uma tarefa terminar`,macosRemindersHint:`Adiciona a tarefa concluída à sua lista padrão de Lembretes. A sincronização do iCloud espelha no seu iPhone, que é quem entrega a notificação.`,macosRemindersForcedOff:`Desativado na inicialização por --disable-macos-reminders ou DISABLE_MACOS_REMINDER_NOTIFICATIONS. Remova a flag ou limpe a variável de ambiente e reinicie para controlar por aqui.`,statusOn:`Web Push está ATIVADO`,statusOff:`Web Push está DESATIVADO`,loadError:`Falha ao carregar as configurações`,saveError:`Falha ao salvar`},modelTab:{description:`Escolha o modelo e o esforço de raciocínio que o Claude Code usa em cada turno. Deixe qualquer um sem configurar para manter a resolução do próprio Claude.`,modelLabel:`Modelo`,modelUnset:`(sem configurar — seguir ~/.claude/settings.json)`,modelHelperText:`Sem configurar, o modelo vem de ~/.claude/settings.json, o mesmo arquivo onde outros clientes do Claude Code (VS Code, Cursor) salvam a escolha do /model, então uma troca lá também muda o MulmoClaude. Os aliases acompanham a geração mais recente de cada família.`,modelConfigured:`Modelo: {model}`,modelNotConfigured:`Sem configurar (compartilhado)`,effortLabel:`Esforço de raciocínio`,effortUnset:`(sem configurar — usar padrão do Claude)`,helperText:`Níveis mais altos permitem mais tempo de pensamento mas aumentam latência e uso de tokens.`,configured:`Esforço: {level}`,notConfigured:`Sem configurar`,userSettingsLabel:`Carregar as configurações de usuário e os plugins do Claude Code`,userSettingsHint:`Lê as skills, os plugins e os hooks de ~/.claude, os mesmos que o Claude Code usa. Desative se os plugins instalados trazem tantas skills que toda solicitação fica pesada; as skills do próprio workspace continuam funcionando. Vale a partir da próxima mensagem. Desativado, um modelo não definido também deixa de seguir ~/.claude/settings.json.`,skillListingSummary:`Skills carregadas no último turno: {count}.`,skillListingPlugins:`Dos plugins: {plugins}.`,skillListingHeavy:`Com tantas skills toda solicitação fica pesada; ao desativar, as de ~/.claude saem.`,loadError:`Falha ao carregar as configurações`,saveError:`Falha ao salvar`},voiceTab:{description:`Dite mensagens de chat com sua voz. O áudio é transcrito localmente na máquina que executa o MulmoClaude — nada é enviado para nenhum serviço externo.`,requirements:`Disponível apenas no macOS. Requer o servidor whisper.cpp — compile-o com yarn build:whisper (veja a seção Local Voice Input no README).`,unsupported:`A entrada de voz requer macOS com o servidor whisper.cpp instalado. Não está disponível nesta máquina.`,enableLabel:`Ativar entrada de voz`,enableHint:`Ao ativar, o modelo de voz (1–3 GB) é baixado uma vez. Em seguida, um botão de microfone aparece na entrada de chat.`,modelLabel:`Modelo de voz`,downloading:`Baixando modelo… {percent}%`,ready:`Modelo pronto`,downloadError:`Falha ao baixar o modelo.`,retry:`Tentar novamente`,loadError:`Falha ao carregar as configurações`,saveError:`Falha ao salvar`},chatIndexTab:{description:`Títulos e resumos gerados por IA para o histórico do chat. Sai desativado por padrão — sessões de automação (scheduler / workers do sistema) sempre são ignoradas mesmo quando ativado; sessões humanas pagam apenas uma chamada ao sumarizador ao terminar cada turno.`,modeLabel:`Modelo do índice de chat`,helperText:`Haiku é mais barato; Sonnet dá títulos mais precisos em sessões longas que mudam de assunto.`,mode:{off:`Desativado`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Indexação DESATIVADA`,haiku:`Indexando com Haiku`,sonnet:`Indexando com Sonnet`},loadError:`Falha ao carregar as configurações`,saveError:`Falha ao salvar`},journalTab:{description:`Diário diário automatizado — resume sessões recentes de chat em journal/*.md e extrai notas de memória duradoura. Sai desativado por padrão. Sessões de automação (scheduler / workers do sistema) são sempre excluídas, independentemente desta configuração.`,modeLabel:`Modelo do diário`,helperText:`Haiku é mais barato; Sonnet produz resumos diários / por tópico mais ricos. A passagem horária só é executada quando isto está ativado.`,mode:{off:`Desativado`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Diário DESATIVADO`,haiku:`Diário em execução com Haiku`,sonnet:`Diário em execução com Sonnet`},loadError:`Falha ao carregar as configurações`,saveError:`Falha ao salvar`},geminiAskButton:`Perguntar ao Claude`,geminiAskMessage:`Qual é o papel da chave API do Gemini neste app?`,toolNamesLabel:`Nomes de ferramentas`,invalidToolNamesPrefix:`Estes parecem não padrão (prefixo esperado`,invalidToolNamesSuffix:`):`,mcpToolsError:`⚠ Não foi possível obter o status das ferramentas MCP: {error}. Exibindo todas as ferramentas independentemente de estarem habilitadas.`,changesHint:`As alterações se aplicam na próxima mensagem. Não é preciso reiniciar.`,cannotSaveTooltip:`Não é possível salvar até as configurações carregarem com sucesso`,saving:`Salvando…`,loadingLabel:`Carregando…`,unsavedMarker:`●`,unsavedToolsConfirm:`Allowed Tools tem alterações não salvas. Fechar mesmo assim?`,unsavedMcpDraftConfirm:`Há um rascunho de servidor MCP aberto. Fechar mesmo assim?`,mcpSaveFailed:`Não foi possível salvar as alterações dos servidores MCP.`},canvasViewToggle:{stackViewTooltip:`Visão em pilha · clique para alternar para visão única`,singleViewTooltip:`Visão única · clique para alternar para visão em pilha`,switchToSingle:`Alternar para visão única`,switchToStack:`Alternar para visão em pilha`},sessionHistoryToggle:{showTooltip:`Mostrar o painel de histórico de sessões à esquerda`,hideTooltip:`Ocultar o painel de histórico de sessões`,show:`Mostrar histórico de sessões`,hide:`Ocultar histórico de sessões`},sessionHistoryExpand:{expandTooltip:`Expandir o painel de histórico de sessões para largura total`,collapseTooltip:`Recolher o painel de histórico de sessões`,expand:`Expandir histórico de sessões`,collapse:`Recolher histórico de sessões`},settingsWorkspaceDirs:{explanation:`Diretórios personalizados para organizar arquivos em {dataDir} e {artifactsDir}. O Claude os usa para decidir onde salvar arquivos.`,noEntries:`Nenhum diretório personalizado configurado.`,addDirTitle:`Adicionar diretório`,pathPlaceholder:`data/clientes ou artifacts/relatorios`,descPlaceholder:`Descrição (o que vai nesta pasta)`,errPathRequired:`Caminho é obrigatório`,errMustStartWith:`Deve começar com data/ ou artifacts/`,errAlreadyExists:`Já existe`},settingsReferenceDirs:{explanation:`Diretórios externos que o Claude pode ler, mas não modificar. No modo Docker, são montados como somente leitura. Úteis para referenciar vaults do Obsidian, código de projetos ou pastas de documentos.`,noEntries:`Nenhum diretório de referência configurado.`,addDirTitle:`Adicionar diretório de referência`,pathPlaceholder:`/Users/eu/ObsidianVault ou ~/Documentos/notas`,labelPlaceholder:`Rótulo (opcional — padrão é o nome da pasta)`,readOnlyBadge:`somente leitura`,errPathRequired:`Caminho é obrigatório`,errMustBeAbsolute:`Deve ser um caminho absoluto ou começar com ~/`,errAlreadyExists:`Já existe`,errLabelConflict:`Rótulo "{label}" já existe`},dashboard:{empty:`Ainda não há coleções favoritas.`,emptyHint:`Fixe uma coleção (★) para vê-la aqui.`,viewTable:`Tabela`,viewCalendar:`Calendário`,viewKanban:`Kanban`,viewPickerLabel:`Escolher visualização`,openFull:`Clique duplo para abrir a visualização completa`,dragHint:`Arraste para reordenar`,resizeHint:`Arraste para redimensionar a altura`},pluginLauncher:{chat:{label:`Chat`},dashboard:{label:`Painel`},automations:{label:`Ações`},wiki:{label:`Wiki`},collections:{label:`Coleções`},feeds:{label:`Feeds`},accounting:{label:`Contabilidade`},files:{label:`Arquivos`}},shortcuts:{pin:`Fixar no iniciador`,unpin:`Desafixar do iniciador`,zoneAriaLabel:`Atalhos fixados`,reorder:{open:`Reordenar atalhos`,title:`Reordenar`,moveUp:`Mover para cima`,moveDown:`Mover para baixo`}},fileContentHeader:{showRendered:`Mostrar Markdown renderizado`,showRaw:`Mostrar código-fonte`,rendered:`Renderizado`,raw:`Fonte`,closeFile:`Fechar arquivo`,revealInOs:`Mostrar na pasta`,revealInOsFailed:`Falha ao mostrar na pasta`},fileContentRenderer:{download:`ZIP`,downloadZip:`Baixar como zip autônomo (recursos incluídos)`,downloadError:`Falha no download`,selectFile:`Selecione um arquivo`,htmlPreview:`Pré-visualização HTML`,pdfPreview:`Pré-visualização PDF`,parseError:`erro de análise`,editJson:`Editar JSON`,jsonEditorLabel:`Editor JSON`,invalidJson:`JSON inválido`,undo:`Desfazer`,redo:`Refazer`,editMarp:`Editar código do slide`,marpEditorLabel:`Código do slide Marp`,openInOs:`Abrir no SO`,openingInOs:`Abrindo…`,openInOsFailed:`Falha ao abrir no SO`,downloadFile:`Baixar`,downloadingFile:`Baixando…`},filesView:{chatPlaceholder:`Pergunte sobre este arquivo…`},systemFiles:{schemaLabel:`Esquema`,showDetails:`Mostrar detalhes`,hideDetails:`Ocultar detalhes`,editPolicy:{"agent-managed-but-hand-editable":`Gerenciado pelo agente (edição manual permitida)`,"user-editable":`Editável pelo usuário`,"agent-managed":`Gerenciado pelo agente`,"fragile-format":`Formato frágil`,ephemeral:`Efêmero`},mcp:{title:`Servidores MCP`,summary:`Servidores externos do Model Context Protocol conectados ao agente. Adicione servidores HTTP ou stdio para expandir as ferramentas.`},settings:{title:`Configurações do app`,summary:`Preferências de comportamento editáveis — chave da API Gemini, ferramentas permitidas, configuração do sandbox etc.`},schedulerTasks:{title:`Tarefas do agendador`,summary:`Automações recorrentes do agente que disparam em horário definido. Gerenciadas pela UI Automations; este arquivo é a fonte em disco.`},schedulerOverrides:{title:`Sobrescritas do agendador`,summary:`Sobrescritas por tarefa de horário / intervalo aplicadas sobre o agendamento do sistema. O agente edita quando você pede para mudar o horário de uma tarefa.`},schedulerItems:{title:`Itens de calendário antigos`,summary:`Itens da visualização de Calendário removida. O app não os mostra mais e nada os executa por agendamento; só as ações antigas de /api/scheduler ainda leem e gravam este arquivo. As tarefas agendadas ficam em config/scheduler/tasks.json.`},wikiIndex:{title:`Índice da wiki`,summary:`Índice autogerado de todas as páginas da wiki. Atualizado a cada edição — não edite manualmente (suas alterações serão sobrescritas).`},wikiLog:{title:`Log de edição da wiki`,summary:`Log de atividade de criação e edição de páginas. Gerenciado pelo agente e somente acréscimos — útil como feed de mudanças recentes.`},wikiSummary:{title:`Resumo da wiki`,summary:`Visão geral autogerada da wiki — clusters de tópicos, contagem de páginas, atividade recente. Atualizado pelo agente.`},wikiSchema:{title:`Esquema da wiki`,summary:`Especificação de formato que o agente lê para manter as páginas da wiki consistentes. Frágil — espera uma estrutura específica; prefira edições via agente.`},memory:{title:`Memória (arquivo antigo)`,summary:`A memória antiga em um único arquivo. Só os espaços de trabalho no formato antigo a leem; os atuais guardam os fatos como arquivos de tópico em conversations/memory/<type>/<topic>.md e ignoram este arquivo, então editá-lo não tem efeito neles.`},summariesIndex:{title:`Índice de resumos`,summary:`Índice navegável com links para os resumos diários e por tópico gerados pelo journal. Gerenciado pelo agente; atualizado a cada execução do journal.`},rolesJson:{title:`Definição da role (JSON)`,summary:`Configuração da role — escolha de modelo, servidores MCP, plugins permitidos, sugestões de query. Editável, sem reinício.`},rolesMd:{title:`Descrição da role (Markdown)`,summary:`Persona e system prompt da role, carregada como contexto quando esta role está ativa. Editável; mudanças aplicam na próxima mensagem.`},journalDaily:{title:`Resumo diário do journal`,summary:`Retrospectiva autogerada da sua atividade em um dia, destilada pelo journal a partir das sessões de chat.`},journalTopic:{title:`Journal por tópico`,summary:`Notas de longo prazo sobre um tópico específico, acumuladas e revisadas conforme você continua falando dele. Gerenciado pelo agente.`}},settingsMcpTab:{explanation:`Adicione servidores MCP externos. Servidores HTTP funcionam em todos os modos. Servidores Stdio usam o {npx} / {node} / {tsx} da imagem do sandbox; quando o Docker está habilitado, os caminhos devem ficar dentro do workspace.`,localhostRewrite:`No modo Docker, {localhost} é reescrito para {hostDockerInternal}.`,noServers:`Ainda não há servidores MCP configurados.`,enabled:`habilitado`,urlLabel:`URL:`,commandLabel:`Comando:`,dockerStdioUnsupported:`⚠ Não será executado enquanto o sandbox do Docker estiver ativado.`,dockerStdioHostExecActive:`⚠ Executa no host: este servidor sai do sandbox do Docker.`,dockerStdioHostExecOptIn:`Executar no host mesmo assim (avançado). Este servidor é executado fora do sandbox do Docker por meio de um gateway HTTP local e pode acessar sua máquina.`,learnMore:`Saiba mais`,addServerButton:`+ Adicionar servidor MCP`,nameLabel:`Nome`,namePlaceholder:`meu-servidor`,typeHttp:`HTTP`,typeStdio:`Stdio (comando)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`Comando`,argsLabel:`Argumentos (um por linha)`,argsPlaceholder:()=>`-y
|
|
251
251
|
@modelcontextprotocol/server-filesystem
|
|
252
252
|
/workspace/path`,errNoName:`Informe um Nome, ou forneça uma URL / argumentos dos quais possamos derivá-lo.`,errBadName:`O nome deve começar com letra minúscula e conter apenas [a-z0-9_-].`,errIdExists:`O id de servidor "{id}" já existe.`,errBadHttpUrl:`A URL HTTP deve começar com http:// ou https://`,pendingEntryWarning:`Conclua ou cancele primeiro a entrada de servidor MCP pendente.`,customHeading:`Servidores personalizados`,catalog:{heading:`Servidores MCP pré-configurados`,audience:{general:`🟢 Geral`,developer:`🔵 Desenvolvedor`},risk:{low:`baixo`,medium:`médio`,high:`alto`},upstream:`📦 Origem`,setupGuide:`📚 Configuração`,entry:{memory:{displayName:`Memória`,description:`Permite que o Claude lembre o contexto entre sessões.`},sequentialThinking:{displayName:`Pensamento sequencial`,description:`Ajuda o Claude a resolver problemas complexos passo a passo.`},context7:{displayName:`Context7 (documentação de bibliotecas)`,description:`Documentação atualizada de bibliotecas populares — supera o corte de treinamento do modelo.`},deepwiki:{displayName:`DeepWiki (wiki de repos do GitHub)`,description:`Pergunte sobre qualquer repositório do GitHub e receba uma resposta estruturada estilo wiki.`},notion:{displayName:`Notion`,description:`Leia e escreva no seu workspace do Notion — páginas, bancos de dados e busca.`,field:{apiKey:{label:`Token de integração do Notion`,help:`Crie uma integração no Notion e copie o Internal Integration Secret. Clique em 🔑 para abrir a página de integrações.`}}},slack:{displayName:`Slack`,description:`Liste canais, envie mensagens e busque o histórico do seu workspace do Slack.`,field:{botToken:{label:`Token do bot`,help:`App do Slack → OAuth & Permissions → Bot User OAuth Token. Começa com xoxb-.`},teamId:{label:`ID do team / workspace`,help:`Execute team.info ou veja a URL do workspace — algo como T01ABC23DEF.`}}},googleMaps:{displayName:`Google Maps`,description:`Buscar lugares, obter rotas e consultar detalhes de localização.`,field:{apiKey:{label:`Chave de API do Google Maps`,help:`Google Cloud Console → APIs & Services → Credentials → Criar chave de API. Habilite Places + Directions.`}}},appleNative:{displayName:`Apps nativos da Apple (macOS)`,description:`Lê e escreve em Lembretes, Calendário, Notas, Mail e Mapas via AppleScript. Apenas macOS — sem credenciais.`},gmail:{displayName:`Gmail`,description:`Lê, envia e etiqueta seu Gmail. Usa um cliente OAuth do Google criado por você no seu próprio projeto do Google Cloud (sem verificação de app).`,field:{credentials:{label:`Caminho para credentials.json`,help:`Google Cloud Console → APIs & Services → Credentials → ID do cliente OAuth (Desktop app). Baixe credentials.json e cole o caminho absoluto.`}}},googleCalendar:{displayName:`Google Agenda`,description:`Lê e cria eventos no Google Agenda. Mesmo padrão BYO credentials.json do Gmail.`,field:{credentials:{label:`Caminho para credentials.json`,help:`Reutilize o mesmo cliente OAuth do Google Cloud usado no Gmail, ou crie um separado para o Calendar.`}}},googleDrive:{displayName:`Google Drive`,description:`Pesquisa e lê arquivos do Google Drive. BYO credenciais OAuth do Google — o token é armazenado localmente ao lado do arquivo.`,field:{credentials:{label:`Caminho para credentials.json`,help:`Google Cloud Console → APIs & Services → Credentials → ID do cliente OAuth (Desktop app). Habilite a API do Google Drive no mesmo projeto.`}}},github:{displayName:`GitHub`,description:"Lê repos, issues, PRs e executa buscas com um Personal Access Token. Limite o escopo — permissões de escrita (`repo`) deixam o agente fazer push em qualquer repo acessível.",field:{token:{label:`Personal Access Token`,help:`GitHub → Settings → Developer settings → Personal access tokens. Prefira fine-grained tokens limitados aos repos onde o agente deve atuar.`}}},linear:{displayName:`Linear`,description:`Lê e atualiza issues, projetos e ciclos do Linear com uma chave de API pessoal.`,field:{apiKey:{label:`Chave de API do Linear`,help:`Linear → Settings → API → Personal API keys. Clique em 🔑 para abrir a página e em Create key.`}}},weatherOpenMeteo:{displayName:`Clima (Open-Meteo)`,description:`Previsão do tempo gratuita e condições atuais no mundo todo — sem chave de API.`},spotify:{displayName:`Spotify`,description:`Pesquisa faixas, gerencia playlists e controla a reprodução. BYO app de desenvolvedor do Spotify — apenas Client ID (fluxo PKCE, sem client secret).`,field:{clientId:{label:`Client ID`,help:"Spotify Developer Dashboard → Create app, defina a Redirect URI como http://127.0.0.1:8888/callback, copie o Client ID. Depois execute uma vez no terminal `SPOTIFY_CLIENT_ID=<id> npx spotify-mcp@latest auth` para fazer login (refresh token fica em cache em ~/.spotify-mcp/tokens.json)."}}},youtubeTranscript:{displayName:`Transcrição do YouTube`,description:`Obtém as legendas de qualquer vídeo público do YouTube pela URL. Sem credenciais.`}},config:{howToGet:`Como obter`,install:`Instalar`,errMissingRequired:`Campos obrigatórios faltando: {fields}`,requiredMarker:`*`,requiredAria:`obrigatório`}}},pluginScheduler:{previewIcon:`📅`,previewAutomations:`{count} automação | {count} automações`,previewMore:`+ {count} mais…`},pluginSchedulerTasks:{recommendedFrequencies:`Frequências recomendadas`,tableTaskType:`Tipo de tarefa`,tableSuggestedSchedule:`Agendamento sugerido`,noTasks:`Nenhuma tarefa agendada`,runNow:`Executar agora`,enable:`Habilitar`,disable:`Desabilitar`,delete:`Excluir`,nextRun:`Próxima: {time}`,originSystem:`Sistema`,originUser:`Usuário`,originSkill:`Skill`,runFailed:`Falha na execução: {error}`,toggleFailed:`Falha ao alternar: {error}`,deleteFailed:`Falha ao excluir: {error}`,detailsToggle:`Mostrar detalhes`,promptLabel:`Prompt`,roleLabel:`Função`,confirmDelete:`Excluir a tarefa « {name} »? Esta ação não pode ser desfeita.`,hintNewsRss:`Busca de notícias / RSS`,hintJournal:`Passagem diária do diário`,hintWiki:`Manutenção do wiki`,hintMemory:`Extração de memória`,hintCalendar:`Sincronização de calendário / contatos`},pluginCanvas:{undo:`Desfazer`,redo:`Refazer`,clear:`Limpar`,styleLabel:`Estilo:`,stylePromptWithPath:"Transforme a imagem em `{path}` em uma imagem no estilo {style}.",stylePromptNoPath:`Transforme meu desenho na tela em uma imagem no estilo {style}.`,saveFailed:`Não salvo`},pluginWiki:{backToIndex:`Voltar ao índice`,pdf:`PDF`,pdfFailed:`⚠ Falha no PDF`,tabIndex:`Índice`,tabLog:`Log`,tabLint:`Lint`,tabGraph:`Grafo`,graphEmpty:`Ainda não há links para exibir no grafo.`,linkedReferences:`Referências vinculadas`,empty:`O wiki está vazio. Peça ao Wiki Manager para ingerir uma fonte.`,previewMore:`+ {count} mais…`,chatPlaceholder:`Pergunte sobre esta página…`,emptyPage:`A página "{title}" ainda não existe.`,emptyContent:`A página "{title}" existe, mas não tem conteúdo.`,createPage:`Solicitar a criação desta página wiki`,updatePage:`Solicitar a atualização desta página wiki`,tagFilterAll:`Todas`,noMatches:`Nenhuma página com a tag #{tag}`,lintChat:`Revisar meu wiki`,taskCountMismatch:`A fonte do wiki e a saída renderizada divergem no número de tarefas. A alternância foi recusada para evitar corromper o arquivo.`,metadataCreated:`Criado`,metadataUpdated:`Atualizado`,metadataEditor:`Editor`,pageEditHeader:`Edição do wiki`,snapshotExpired:`Snapshot expirado — exibindo a página atual`,snapshotLoadError:`Não foi possível carregar o snapshot — a página pode ainda existir. Tente atualizar.`,pageDeleted:`Página excluída`,history:{tabContent:`Conteúdo`,tabHistory:`Histórico`,empty:`Ainda sem histórico — edite esta página e a primeira versão aparecerá aqui.`,loading:`Carregando histórico…`,backToList:`Voltar ao histórico`,restoreButton:`Restaurar esta versão`,restoreConfirmTitle:`Restaurar esta versão?`,restoreConfirmBody:`Restaurar a página para a versão de {ts} por {editor}. A página atual será substituída. O histórico existente é preservado.`,restoreConfirmAction:`Restaurar`,restoreConfirmCancel:`Cancelar`,restoreSuccessToast:`Página restaurada.`,restoreFailureBanner:`Falha ao restaurar: {error}`,compareCurrent:`Comparar com a página atual`,comparePrevious:`Comparar com a versão anterior`,diffNoPrevious:`Não há versão anterior para comparar.`,diffNoChanges:`Sem diferenças de conteúdo entre esta versão e o objeto de comparação.`,editorBadgeUser:`Usuário`,editorBadgeLLM:`LLM`,editorBadgeSystem:`Sistema`,hiddenLines:`{count} linhas inalteradas ocultas`,expandHidden:`Mostrar`}},pluginPresentForm:{fallbackTitle:`Formulário`,fieldCount:`{count} campo | {count} campos`,submitted:`Enviado`,errorSummary:`Por favor, corrija os seguintes erros`,requiredMarker:`*`,selectOption:`Selecione uma opção`,charactersCount:`{current} / {max} caracteres`,charactersCountNoMax:`{current} caracteres`,submit:`Enviar`,progress:`{filled} de {total} campos obrigatórios preenchidos`},pluginPresentSvg:{saveAsPng:`Baixar como PNG`,png:`PNG`,saveAsPdf:`Salvar como PDF (abre o diálogo de impressão)`,pdf:`PDF`,untitled:`Desenho SVG`,editSource:`Editar fonte SVG`,cancel:`Cancelar`,applyChanges:`Aplicar alterações`,saving:`Salvando...`,saveError:`⚠ Falha ao salvar: {error}`,exportError:`⚠ Falha ao exportar: {error}`,loadingSource:`Carregando fonte…`,sourceError:`Falha ao carregar a fonte: {error}`},photoLocations:{title:`Localizações das fotos`,summary:`{total} capturadas · {withGps} com GPS`,mapHint:`Peça ao Claude "mostre no mapa" para plotá-las com o plugin do Google Map.`,loading:`Carregando…`,empty:`Nenhuma localização capturada ainda. Envie uma foto com tag GPS pelo chat ou por um bridge conectado para começar.`,noGps:`Sem dados GPS`},pluginManageSkills:{deleteProjectSkill:`Excluir esta skill de projeto`,unstarPresetSkill:`Remover favorito deste preset — volta ao catálogo`,heading:`Skills`,previewCount:`{count} skill | {count} skills`,previewMore:`+{count} mais`,subheading:({named:e})=>`${e(`count`)} disponíveis · clique para visualizar · "Run" invoca como /<name>`,emptyWithPath:`Nenhuma skill encontrada. Adicione pastas de skills em {path}.`,emptySkillPath:`~/.claude/skills/`,selectHint:`Selecione uma skill à esquerda para ver seu SKILL.md.`,loading:`Carregando…`,fieldDescription:`Descrição`,fieldBody:`Corpo (Markdown)`,emptyBody:`(corpo vazio)`,btnEdit:`Editar`,btnDelete:`Excluir`,btnUnstar:`Remover favorito`,errListFailed:`Falha ao carregar skills: {error}`,errDetailFailed:`Falha ao carregar a skill: {error}`,errSaveFailed:`Falha ao salvar: {error}`,errDeleteFailed:`Falha ao excluir`,confirmDelete:`Excluir a skill "{name}"? Isso remove ~/mulmoclaude/.claude/skills/{name}/SKILL.md.`,confirmUnstar:`Mover "{name}" de volta ao catálogo? Ela deixará de ser carregada no prompt, mas a cópia do catálogo permanece — você pode favoritá-la novamente quando quiser.`,sectionActive:`Ativas`,sectionCatalog:`Catálogo`,sectionLegendActive:`Skills que o Claude pode usar agora. O Claude as usa automaticamente no fluxo da conversa, ou você pode invocar uma digitando seu nome. {system} Sistema (mc- inclusa) / {project} Projeto (editável, somente neste workspace) / {user} Usuário (skills em ~/.claude/skills/) / {claudePlugin} Plugin (de um plugin do Claude Code instalado, somente leitura).`,sectionLegendCatalog:`Catálogo: skills que passam a ser Ativas ao marcar com {star}. Remover {star} de Ativas devolve a skill ao Catálogo — o Claude deixa de usá-la (a skill não é excluída).`,catalogEmpty:`Nenhuma skill de preset disponível.`,catalogPresetHeading:`Presets`,catalogStar:`Favoritar`,catalogStarred:`Favoritada`,sourceUserTitle:`Skill do usuário (~/.claude/skills/, disponível em todos os workspaces)`,sourceClaudePluginTitle:`Skill de plugin (plugin do Claude Code instalado — somente leitura, atualizado pelo plugin)`,sourceSystemTitle:`Skill de sistema (inclusa, prefixo mc- — somente leitura, sobrescrita pelo launcher)`,sourceProjectTitle:`Skill do projeto (.claude/skills/ do workspace, apenas este workspace)`,sourcePresetTitle:`Catálogo de presets — clique em Favoritar para ativar neste workspace`,errCatalogListFailed:`Falha ao carregar o catálogo: {error}`,errCatalogStarFailed:`Falha ao favoritar a skill: {error}`,errCatalogPreviewFailed:`Falha ao carregar a pré-visualização da skill: {error}`,catalogAddRepo:`Adicionar repositório de skills`,catalogAddRepoTitle:`Adicionar um repositório de skills`,catalogRepoUrlLabel:`URL do GitHub`,catalogRepoUrlPlaceholder:`https://github.com/owner/repo`,catalogRepoSubpathLabel:`Subcaminho (opcional)`,catalogRepoSubpathPlaceholder:`skills`,catalogAddRepoSubmit:`Instalar`,catalogAddRepoSuggestions:`Repositórios sugeridos`,catalogUninstallRepo:`Desinstalar repositório`,catalogUpdateRepo:`Atualizar repositório (rebuscar o mais recente)`,catalogRepoOpenLink:`Abrir o repositório no GitHub (nova aba)`,catalogUninstallConfirm:`Desinstalar este repositório? As skills que você já marcou com estrela permanecem na sua lista ativa.`,catalogRepoInstalling:`Instalando…`,catalogRepoEmpty:`Nenhuma skill encontrada neste repositório.`,sourceExternalTitle:`Skill externa (instalada de um repositório do GitHub — clique na estrela para ativar)`,errCatalogRepoListFailed:`Falha ao carregar os repositórios instalados: {error}`,errCatalogRepoInstallFailed:`Falha ao instalar o repositório: {error}`,errCatalogRepoUninstallFailed:`Falha ao desinstalar o repositório: {error}`,errCatalogRepoInvalidUrl:`Informe uma URL de repositório do GitHub.`},pluginManageRoles:{heading:`Papéis personalizados`,roleCount:`{count} papel | {count} papéis`,addButton:`+ Adicionar`,createPanel:`Criar novo papel`,fieldId:`ID`,fieldName:`Nome`,fieldIcon:`Ícone`,fieldPrompt:`Prompt`,fieldPlugins:`Plugins`,fieldModel:`Modelo`,modelUnset:`(sem configurar — seguir a configuração global)`,modelHelp:`Sessões iniciadas com este papel usam este modelo. Útil para manter um papel de rotina fora do limite semanal do seu modelo principal. Papéis integrados sempre seguem a configuração global.`,fieldStarterQueries:`Consultas iniciais`,onePerLine:`(uma por linha)`,helpLink:`?`,idFormatted:`({id})`,missingEnv:`({env} ausente)`,requiresEnv:`Requer {env} no .env`,collapse:`Recolher`,expand:`Expandir`,idPlaceholder:`id-unico`,creating:`Criando…`,create:`Criar`,updating:`Atualizando…`,update:`Atualizar`,cancel:`Cancelar`,delete:`Excluir`,emptyHint:`Ainda não há papéis personalizados. Clique em "+ Adicionar" ou peça ao Claude para criar um.`,errIdRequired:`O ID é obrigatório.`,errIdInvalid:`O ID pode conter apenas letras, números, '-' e '_'.`,errNameRequired:`O nome é obrigatório.`,errIdDuplicate:`Já existe um papel com ID '{id}'.`,errCreateFailed:`Falha ao criar`,errSaveFailed:`Falha ao salvar`,errDeleteFailed:`Falha ao excluir`,errNetworkError:`Erro de rede`,errServerError:`Erro do servidor: {status}`,errRefreshFailed:`Salvo, mas não foi possível atualizar a lista.`,confirmDelete:`Excluir o papel « {name} »? Esta ação não pode ser desfeita.`},pluginUiImage:{promptLabel:`{label}:`},markdownCodeCopy:{copyLabel:`Copiar código`,copiedLabel:`Copiado`},markdownMermaid:{loadFailed:`⚠ Falha ao carregar o Mermaid: {error}`,renderFailed:`⚠ Falha ao renderizar o Mermaid: {error}`},pluginTextResponse:{pdf:`PDF`,pdfFailed:`⚠ Falha no PDF`,editContent:`Editar conteúdo de texto`,applyChanges:`Aplicar alterações`,copyLabel:`Copiar`,speakerSystem:`Sistema`,speakerUser:`Você`,speakerAssistant:`Assistente`,copiedLabel:`Copiado!`,cancel:`Cancelar`,seededByPlugin:`de {pkg}`,seededByPluginTooltip:`Esta mensagem foi gerada pelo plugin {pkg}, não foi enviada por você.`,truncatedForRender:`Esta mensagem é excepcionalmente longa ({total} caracteres no total). Apenas a primeira parte é renderizada — {omitted} caracteres ocultos para manter a aba responsiva. Use Copiar para obter o texto completo.`},pluginSkill:{noDescription:`(sem descrição)`},pluginSpreadsheet:{previewUntitled:`Planilha`,previewSheets:`{count} aba | {count} abas`,untitled:`Planilha`,excel:`Excel`,valuePlaceholder:`Valor`,valueOrFormulaPlaceholder:`Valor ou Fórmula (ex.: 100 ou SUM(B2:B11))`,formatPlaceholder:`Formato (ex.: $#,##0.00)`,loading:`Carregando planilha...`,noData:`Nenhum dado de planilha disponível`,editData:`Editar dados da planilha`,applyChanges:`Aplicar alterações`,dataMustBeArray:`Os dados devem ser uma matriz de planilhas`,loadFailed:`Falha ao carregar a planilha: {error}`,invalidJsonAlert:`Formato JSON inválido: {error}`,unknownError:`Erro desconhecido`,update:`Atualizar`,stringType:`Texto`,formulaType:`Fórmula`},app:{startConversation:`Iniciar uma conversa`,thinking:`Pensando…`},suggestionsPanel:{suggestions:`Sugestões`,skills:`Habilidades`,tooltip:`Sugestões e habilidades`,emptySuggestions:`Sem sugestões.`,emptySkills:`Nenhuma habilidade instalada.`,skillsError:`Falha ao carregar habilidades: {error}`,sendEditHint:`clique para enviar · shift+clique para editar`},settingsToolsTab:{explanation:`Nomes adicionais de ferramentas a serem passados ao Claude via {allowedTools}. Um por linha. Útil para servidores MCP integrados ao Claude Code como Gmail / Google Calendar após autenticar via {claudeMcp}.`,connectorsSectionTitle:`Conectores conectados`,connectorsEmpty:`Nenhum conector encontrado.`,connectorConnected:`Conectado`,connectorDisconnected:`Não conectado`,connectorsGuide:`Conectores como Slack e Gmail permitem que o Claude acesse suas contas. Adicione ou remova conectores pelo Claude Desktop ou configure-os {configLink}. (Abre claude.ai)`,connectorsConfigLinkText:`aqui`},confirmModal:{defaultTitle:`Confirmar`,defaultConfirm:`Confirmar`,defaultCancel:`Cancelar`}},zlt={common:{downloadZip:`ZIP`,downloadFailed:`Échec du téléchargement`,save:`Enregistrer`,cancel:`Annuler`,loading:`Chargement...`,close:`Fermer`,dismiss:`Ignorer`,add:`Ajouter`,remove:`Supprimer`,yes:`Oui`,no:`Non`,saving:`Enregistrement...`,saved:`Enregistré`,noResultsYet:`Aucun résultat pour le moment`,noImageYet:`Aucune image pour le moment`,sendChat:`Démarrer une nouvelle conversation`},sessionTabBar:{newSession:`Nouvelle session`,activeSessions:`{count} session active (agent en cours d'exécution) | {count} sessions actives (agent en cours d'exécution)`,unreadReplies:`{count} réponse non lue | {count} réponses non lues`,unreadDot:`Nouvelle réponse`,origin:{scheduler:`Démarrée par le planificateur`,skill:`Démarrée par une skill`,bridge:`Démarrée par un bridge`}},chatInput:{placeholder:`Message à Claude…`,send:`Envoyer`,stop:`Arrêter`,runningPlaceholder:`En cours… appuyez sur Entrée pour mettre en file`,removeBuffered:`Supprimer le message en file`,attachFile:`Joindre un fichier`,fileTooLarge:`Fichier trop volumineux ({sizeMB} Mo). La limite est de 30 Mo.`,fileOnlyAttachment:`Contenu illisible — transmis en tant que fichier`,readFileFailed:`Impossible de lire le fichier.`,attachImageFailed:`Échec de l'attache de l'image : {error}`,stopFailed:`Échec de l'arrêt du traitement : {error}`,dropHint:`Déposez le fichier pour joindre`,tooManyFiles:`Vous pouvez joindre jusqu'à {max} fichiers à la fois.`,removeAttachment:`Retirer {name}`,attachmentFallbackName:`pièce jointe`,voice:{start:`Démarrer la saisie vocale`,stop:`Arrêter la saisie vocale`}},cspViolation:{notice:`⚠ Une vue a tenté de charger {host}, mais la politique de sécurité du contenu l'a bloqué ({directive}). Pour l'autoriser, ajoutez l'hôte à config/csp.json, uniquement si vous lui faites confiance.`,dismiss:`Fermer`},sessionHistoryPanel:{filters:{all:`Toutes`,unread:`Non lues`,bookmarked:`Favoris`,longRunning:`Longue durée (24h+)`,human:`Humain`,scheduler:`Planificateur`,skill:`Skill`,bridge:`Bridge`},failedToRefresh:`⚠ Échec de l'actualisation : {error}`,showingLastKnown:` — affichage de la dernière liste connue.`,noSessions:`Aucune session pour le moment.`,noMatching:`Aucune session correspondante.`,running:`En cours`,noMessages:`(aucun message)`,openRowAria:`Ouvrir la session : {preview}`,rowMenuAria:`Actions de la session`,bookmark:`Ajouter aux favoris`,unbookmark:`Retirer des favoris`,delete:`Supprimer`,deleteConfirm:`Supprimer cette session ?
|
|
253
253
|
|
|
254
254
|
{preview}
|
|
255
255
|
|
|
256
|
-
Cette action est irréversible.`},notificationBell:{notifications:`Notifications`,activeSection:`Actives`,historySection:`Historique`,noActive:`Aucune notification active`,noHistory:`Aucune activité récente`,clearAll:`Tout effacer`,dismiss:`Ignorer`,cancel:`Annuler`,showMore:`Voir plus ({count})`,showLess:`Réduire`,openTarget:`Ouvrir`,expandDetails:`Afficher les détails`},pluginDiagnostics:{title:`Problème de configuration du plugin`,hostBody:`Le plugin « {plugin} » a tenté d'enregistrer la clé {label} « {key} », mais elle est réservée par l'hôte. L'entrée du plugin a été supprimée.`,intraBody:`Les plugins « {first} » et « {second} » enregistrent tous deux le {dimension} « {key} ». « {first} » l'a réclamé en premier, donc l'enregistrement de « {second} » est ignoré.`},shadowedEnv:{title:`Le shell remplace .env`,body:`Défini à la fois dans le shell et dans .env : {keys}. La valeur du shell l'emporte, donc .env est ignoré. Si vous avez modifié .env, mettez à jour ou supprimez la valeur du shell puis redémarrez.`},optionalDeps:{title:`Dépendance optionnelle indisponible`,titleNotFound:`{command} n'est pas installé`,titleNotResponding:`{command} n'est pas en cours d'exécution`,notFound:`{command} introuvable — les fonctionnalités associées ont été désactivées. Installez {command} et redémarrez MulmoClaude pour les activer.`,notResponding:`{command} est installé mais n'est pas en cours d'exécution — les fonctionnalités associées ont été désactivées. Démarrez {command} et redémarrez MulmoClaude pour les activer.`},billingMigration:{title:`La facturation est passée à une configuration à la demande`,body:`Les collections intégrées clients, worklog, invoice et profile ont été retirées de votre tableau de bord, mais vos données sont en sécurité et intactes. Demandez à configurer le suivi des clients et du temps, puis la facturation pour les recréer ; vos enregistrements existants réapparaîtront.`},backendOffline:{title:`Impossible de joindre le backend`,body:`Le serveur MulmoClaude n'est peut-être pas démarré. Vérifiez le serveur de développement, puis réessayez.`,retry:`Réessayer`},pluginErrorBoundary:{title:`Le plugin {pkg} a planté`,subtitle:`Le plugin n'a pas pu être affiché. L'erreur a été consignée dans la console.`,showDetails:`Afficher les détails`,hideDetails:`Masquer les détails`,retry:`Réessayer`},remoteHostOffline:{title:`Hôte distant déconnecté`,body:`Votre téléphone ne pourra pas envoyer vers cet appareil tant que vous n'êtes pas reconnecté.`,reconnect:`Se reconnecter`},authTokenStale:{title:`Cette page doit être rechargée`,body:`Le serveur a refusé le jeton de cette page et un nouveau n'a pas pu être récupéré. Rechargez pour continuer.`,reload:`Recharger`},remoteHost:{title:`Hôte distant`,online:`Hôte distant en ligne`,offline:`Hôte distant hors ligne`,uid:`uid {uid}`,signIn:`Se connecter avec Google`,connecting:`Connexion…`,disconnect:`Déconnecter`,disconnecting:`Déconnexion…`,noToken:`La connexion Google n'a renvoyé aucun idToken`,connectFailed:`Échec de la connexion`,disconnectFailed:`Échec de la déconnexion`,signInFailed:`Échec de la connexion Google`,statusFailed:`Échec du chargement de l'état`,description:`L'accès distant permet à un appareil mobile de se connecter aux collections et aux flux de ce MulmoClaude.`,howTo:`Sur votre téléphone, ouvrez {url} et connectez-vous avec le même compte Google.`,customViewHint:`Pour une vue adaptée au mobile, demandez à Claude de créer une {keyword} (pas une custom view classique).`,qrHint:`Ou scannez ce code QR avec l'appareil photo de votre téléphone.`},sessionModelChip:{tooltip:`Modèle utilisé par cette session : {model}`,tooltipOverride:`Modèle de cette conversation : {model} (remplace le rôle / le réglage global)`,ariaLabel:`Modèle de cette conversation`,clear:`Revenir au réglage par défaut`,unknown:`inconnu`,inherited:`{model} (hérité)`},sidebarHeader:{newMessages:`Nouveaux messages`,home:`Aller à la dernière conversation`,toolCallHistory:`Historique des appels d'outils`,settings:`Paramètres`,settingsGeminiMissing:`Paramètres — Clé API Gemini manquante`,todayJournal:`Résumé du jour`,todayJournalNotFound:`Pas encore de résumé — discutez un peu et le journal en générera un.`,todayJournalLoadFailed:`Échec du chargement du journal (status {status}) : {error}`,copyMarkdown:`Copier la conversation en Markdown`,copiedMarkdown:`Copié !`},rightSidebar:{permalink:`Lien vers le message sélectionné`,copyPermalink:`Copier le lien vers le message sélectionné`,copiedPermalink:`Copié !`,toggleSystemPrompt:`Basculer le system prompt`,systemPrompt:`System Prompt`,availableTools:`Outils disponibles`,toggleToolDescription:`Basculer la description de l'outil`,toolCallHistory:`Historique des appels d'outils`,copyHistory:`Copier l'historique des appels d'outils`,copiedHistory:`Copié !`,noToolCalls:`Aucun appel d'outil pour le moment`,arguments:`Arguments`,error:`Erreur`,result:`Résultat`,running:`En cours...`,mcpHint:{title:e=>`Aide à la configuration : ${e.named(`server`)}`,requiredKeys:`Clés requises`,setupGuide:`Ouvrir le guide de configuration`}},fileTreePane:{sort:`Tri :`,sortByName:`Trier par nom`,name:`Nom`,sortByRecent:`Trier par date de modification (plus récent en premier)`,recent:`Récent`,reference:`Référence`,readOnlyBadge:`RO`,showSystemFiles:`Afficher les fichiers système`,showSystemFilesTitle:`Affiche les répertoires racine internes de l'agent (conversations/, feeds/, etc.) en plus des contenus utilisateur (data/, artifacts/, config/).`},fileTree:{dropHint:`Déposez des fichiers ici pour les enregistrer dans ce dossier`,upload:{progress:`Téléversement {done} sur {total}…`,done:`{count} fichier(s) enregistré(s)`,failed:`{count} fichier(s) n'ont pas pu être enregistrés`},workspace:`(espace de travail)`,recentlyChanged:`Modifiés récemment`,newFileMenuItem:`Nouveau fichier`,newFileInputAria:`Nom du nouveau fichier`,newFilePlaceholder:{wikiPage:`slug-de-page`,summary:`nom-du-résumé`,document:`nom-du-document`,html:`nom-de-page`,story:`nom-de-histoire`},newFileError:{empty:`Le nom de fichier ne peut pas être vide.`,unsafe:`Le nom de fichier contient des caractères non valides.`,exists:`Un fichier nommé {filename} existe déjà ici.`,saveFailed:`Impossible de créer le fichier. Veuillez réessayer.`}},lockStatusPopup:{sandboxEnabledTooltip:`Sandbox activé (Docker)`,noSandboxTooltip:`Pas de sandbox (Docker introuvable)`,sandboxEnabledLabel:`Sandbox activé :`,sandboxEnabledBody:`Docker est en cours d'exécution. L'accès au système de fichiers est isolé.`,noSandboxLabel:`Pas de sandbox :`,noSandboxBodyPrefix:`Claude peut accéder à tous les fichiers de votre machine. Installez`,noSandboxBodySuffix:`pour activer l'isolation du système de fichiers.`,dockerDesktop:`Docker Desktop`,hostCredentials:`Identifiants de l'hôte attachés :`,credsLoading:`chargement…`,sshAgent:`Agent SSH :`,forwarded:`transféré`,notForwarded:`non transféré`,mountedConfigs:`Configurations montées :`,none:`aucune`,testIsolation:`Tester l'isolation du sandbox :`},settingsModal:{title:`Paramètres`,version:`MulmoClaude v{version}`,tabs:{gemini:`Clé API Gemini`,tools:`Outils autorisés`,mcp:`Serveurs MCP`,dirs:`Répertoires`,refs:`Répertoires de référence`,map:`Carte`,photos:`Photos`,google:`Google`,model:`Modèle`,voice:`Voix`,chatIndex:`Index du chat`,journal:`Journal`,notifications:`Web Push`,skills:`Skills`,roles:`Rôles`,quit:`Quitter`},groups:{llm:`LLM`,servers:`Serveurs`,workspace:`Espace de travail`,notifications:`Notifications`,plugins:`Plugins`,management:`Gestion`,server:`Serveur`},navAriaLabel:`Sections des paramètres`,googleTab:{description:`Associez votre compte Google pour que cette machine puisse appeler les API Google (Calendar en premier). Le jeton d'actualisation est stocké uniquement sur cette machine et n'est jamais envoyé à un autre serveur que Google.`,statusLinked:`Associé`,statusNotLinked:`Non associé`,statusPending:`En attente de la fin du consentement dans le navigateur…`,connect:`Associer le compte Google`,unlink:`Dissocier`,unlinkConfirm:`Dissocier le compte Google ? Le jeton enregistré sera révoqué et supprimé de cette machine.`,clientSecretAmbiguous:`Plusieurs fichiers client_secret_*.json ont été trouvés dans ~/.secrets/. N'en conservez qu'un seul afin que le jeton enregistré reste associé au bon client OAuth.`,loadError:`Échec du chargement de l'état de l'association Google.`,connectError:`Échec du démarrage du flux d'autorisation Google.`,unlinkError:`Échec de la dissociation du compte Google.`},geminiTab:{required:`La génération d'images nécessite {envKey}. Collez la clé ci-dessous et enregistrez-la.`,apiKeyLabel:`Clé d'API Gemini`,apiKeyPlaceholder:`AIza…`,helperText:`Créez ou copiez une clé depuis {studioLink}.`,storageNote:`Enregistrée uniquement sur cet ordinateur, en dehors de l'espace de travail, et lisible par vous seul. Elle prend effet immédiatement, sans redémarrage.`,storedHere:`Enregistrée dans l'application`,storedInEnvironment:`Provient de l'environnement`,notConfigured:`Non configurée`,clear:`Effacer`,fromEnvironment:`Cette clé vient du shell qui a lancé l'application ou de {envFile}. Une clé enregistrée ici est prioritaire.`,loadError:`Impossible de charger l'état de la clé`,saveError:`Impossible d'enregistrer la clé`,clearError:`Impossible d'effacer la clé`},mapTab:{description:`Définit la clé API Google Maps utilisée par le plugin de carte. La clé est stockée localement et n'est envoyée qu'à Google Maps.`,apiKeyLabel:`Clé API Google Maps`,apiKeyPlaceholder:`AIza…`,helperText:`Créez ou copiez une clé depuis {consoleLink}.`,requiredApis:`APIs requises : Maps JavaScript API, Geocoding API, Places API (New), Directions API.`,configured:`Configurée`,notConfigured:`Non configurée`,clear:`Effacer`,loadError:`Échec du chargement des paramètres`,saveError:`Échec de l'enregistrement`},photosTab:{description:`Contrôles de confidentialité pour les photos reçues par le chat ou par un bridge connecté. Les données de localisation EXIF sont sensibles — décochez pour désactiver la capture automatique.`,autoCaptureLabel:`Capturer automatiquement la localisation des photos`,autoCaptureHint:`Activé : chaque image envoyée avec GPS EXIF génère un sidecar de localisation dans data/locations/. Désactivé : rien n'est capturé automatiquement ; le LLM peut toujours extraire EXIF à la demande.`,statusOn:`Capture automatique ACTIVÉE`,statusOff:`Capture automatique DÉSACTIVÉE`,loadError:`Échec du chargement des paramètres`,saveError:`Échec de l'enregistrement`},quitTab:{description:`Arrête le serveur MulmoClaude qui tourne sur cette machine. Lancé depuis l'icône, il continue de tourner même si vous fermez cet onglet — c'est ici qu'on l'arrête sans terminal.`,restartHint:()=>"Pour le relancer, double-cliquez sur l'icône MulmoClaude (ou lancez `npx mulmoclaude@latest`).",quitLabel:`Quitter MulmoClaude`,confirmBody:`Le serveur s'arrête et cette page cesse de fonctionner. Tout traitement en cours est interrompu.`,confirmLabel:`Quitter`,stopping:`Arrêt en cours…`,stoppedTitle:`MulmoClaude est arrêté`,stoppedBody:`Vous pouvez fermer cet onglet. Double-cliquez sur l'icône pour le relancer.`,error:`Échec de l'arrêt du serveur`},notificationsTab:{description:`Recevez une notification push sur vos appareils enregistrés lorsqu'une tâche que vous avez lancée ici se termine — pratique quand vous posez une question, vous éloignez et voulez savoir dès que la réponse est prête.`,enableLabel:`Envoyer une Web Push à la fin d'une tâche`,enableHint:`Se déclenche à la fin d'une conversation que vous avez lancée ici. Les tâches planifiées et en arrière-plan ne la déclenchent pas.`,remoteHostNote:`Nécessite la connexion RemoteHost (qui fournit l'authentification) et au moins un appareil enregistré. Si l'un manque, rien ne se passe.`,macosRemindersLabel:`Créer un rappel macOS à la fin d'une tâche`,macosRemindersHint:`Ajoute la tâche terminée à votre liste de Rappels par défaut. La synchronisation iCloud la répercute sur votre iPhone, qui délivre la notification.`,macosRemindersForcedOff:`Désactivé au démarrage par --disable-macos-reminders ou DISABLE_MACOS_REMINDER_NOTIFICATIONS. Retirez l'option ou supprimez la variable d'environnement, puis redémarrez pour le contrôler ici.`,statusOn:`Web Push est ACTIVÉ`,statusOff:`Web Push est DÉSACTIVÉ`,loadError:`Échec du chargement des paramètres`,saveError:`Échec de l'enregistrement`},modelTab:{description:`Choisissez le modèle et l'effort de raisonnement utilisés par Claude Code à chaque tour. Laissez l'un ou l'autre vide pour conserver la résolution propre à Claude.`,modelLabel:`Modèle`,modelUnset:`(non défini — suivre ~/.claude/settings.json)`,modelHelperText:`Non défini, le modèle provient de ~/.claude/settings.json, le fichier où les autres clients Claude Code (VS Code, Cursor) enregistrent aussi leur choix de /model : un changement là-bas modifie donc aussi MulmoClaude. Les alias suivent la dernière génération de chaque famille.`,modelConfigured:`Modèle : {model}`,modelNotConfigured:`Non défini (partagé)`,effortLabel:`Effort de raisonnement`,effortUnset:`(non défini — utiliser la valeur par défaut de Claude)`,helperText:`Les niveaux plus élevés autorisent plus de temps de réflexion mais augmentent la latence et la consommation de tokens.`,configured:`Effort : {level}`,notConfigured:`Non défini`,userSettingsLabel:`Charger les réglages utilisateur et les plugins de Claude Code`,userSettingsHint:`Lit les skills, plugins et hooks de ~/.claude, les mêmes que ceux de Claude Code. Désactivez-le si les plugins installés apportent tant de skills que chaque requête devient lourde ; les skills de l'espace de travail restent disponibles. Prend effet à partir du message suivant. Désactivé, un modèle non défini ne suit plus non plus ~/.claude/settings.json.`,skillListingSummary:`Skills chargées au dernier tour : {count}.`,skillListingPlugins:`Depuis les plugins : {plugins}.`,skillListingHeavy:`Autant de skills alourdissent chaque requête ; le désactiver retire celles de ~/.claude.`,loadError:`Échec du chargement des paramètres`,saveError:`Échec de l'enregistrement`},voiceTab:{description:`Dictez vos messages de chat à la voix. L'audio est transcrit localement sur la machine qui exécute MulmoClaude — rien n'est envoyé à un service externe.`,requirements:`Disponible uniquement sur macOS. Nécessite le serveur whisper.cpp — compilez-le avec yarn build:whisper (voir la section Local Voice Input du README).`,unsupported:`La saisie vocale nécessite macOS avec le serveur whisper.cpp installé. Elle n'est pas disponible sur cette machine.`,enableLabel:`Activer la saisie vocale`,enableHint:`L'activation télécharge le modèle vocal (1–3 Go) une seule fois. Un bouton micro apparaît ensuite dans la zone de saisie du chat.`,modelLabel:`Modèle vocal`,downloading:`Téléchargement du modèle… {percent}%`,ready:`Modèle prêt`,downloadError:`Échec du téléchargement du modèle.`,retry:`Réessayer`,loadError:`Échec du chargement des paramètres`,saveError:`Échec de l'enregistrement`},chatIndexTab:{description:`Titres et résumés générés par IA pour l'historique du chat. Désactivé par défaut — les sessions d'automatisation (scheduler / workers système) sont toujours ignorées même quand c'est activé ; les sessions humaines ne paient qu'un appel au résumeur à la fin de chaque tour.`,modeLabel:`Modèle de l'index de chat`,helperText:`Haiku est moins cher ; Sonnet donne des titres plus précis pour de longues sessions changeant de sujet.`,mode:{off:`Désactivé`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Indexation DÉSACTIVÉE`,haiku:`Indexation avec Haiku`,sonnet:`Indexation avec Sonnet`},loadError:`Échec du chargement des paramètres`,saveError:`Échec de l'enregistrement`},journalTab:{description:`Journal quotidien automatisé — résume les sessions de chat récentes dans journal/*.md et extrait des notes de mémoire persistante. Désactivé par défaut. Les sessions d'automatisation (scheduler / workers système) sont toujours exclues, quel que soit ce réglage.`,modeLabel:`Modèle du journal`,helperText:`Haiku est moins cher ; Sonnet produit des résumés quotidiens et thématiques plus riches. Le passage horaire ne s'exécute que lorsque c'est activé.`,mode:{off:`Désactivé`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Journal DÉSACTIVÉ`,haiku:`Journal en cours avec Haiku`,sonnet:`Journal en cours avec Sonnet`},loadError:`Échec du chargement des paramètres`,saveError:`Échec de l'enregistrement`},geminiAskButton:`Demander à Claude`,geminiAskMessage:`Quel est le rôle de la clé API Gemini dans cette application ?`,toolNamesLabel:`Noms d'outils`,invalidToolNamesPrefix:`Ceux-ci semblent non standards (préfixe attendu`,invalidToolNamesSuffix:`) :`,mcpToolsError:`⚠ Impossible de récupérer l'état des outils MCP : {error}. Tous les outils sont affichés quel que soit leur état d'activation.`,changesHint:`Les modifications s'appliquent au prochain message. Pas besoin de redémarrer.`,cannotSaveTooltip:`Impossible d'enregistrer tant que les paramètres ne sont pas chargés`,saving:`Enregistrement…`,loadingLabel:`Chargement…`,unsavedMarker:`●`,unsavedToolsConfirm:`Allowed Tools contient des modifications non enregistrées. Fermer quand même ?`,unsavedMcpDraftConfirm:`Un brouillon de serveur MCP est encore ouvert. Fermer quand même ?`,mcpSaveFailed:`Impossible d'enregistrer les modifications des serveurs MCP.`},canvasViewToggle:{stackViewTooltip:`Vue empilée · cliquez pour passer à la vue simple`,singleViewTooltip:`Vue simple · cliquez pour passer à la vue empilée`,switchToSingle:`Passer à la vue simple`,switchToStack:`Passer à la vue empilée`},sessionHistoryToggle:{showTooltip:`Afficher le panneau d'historique des sessions à gauche`,hideTooltip:`Masquer le panneau d'historique des sessions`,show:`Afficher l'historique des sessions`,hide:`Masquer l'historique des sessions`},sessionHistoryExpand:{expandTooltip:`Agrandir le panneau d'historique des sessions en pleine largeur`,collapseTooltip:`Réduire le panneau d'historique des sessions`,expand:`Agrandir l'historique des sessions`,collapse:`Réduire l'historique des sessions`},settingsWorkspaceDirs:{explanation:`Répertoires personnalisés pour organiser les fichiers sous {dataDir} et {artifactsDir}. Claude s'en sert pour router l'enregistrement des fichiers.`,noEntries:`Aucun répertoire personnalisé configuré.`,addDirTitle:`Ajouter un répertoire`,pathPlaceholder:`data/clients ou artifacts/rapports`,descPlaceholder:`Description (ce qui va dans ce dossier)`,errPathRequired:`Le chemin est obligatoire`,errMustStartWith:`Doit commencer par data/ ou artifacts/`,errAlreadyExists:`Existe déjà`},settingsReferenceDirs:{explanation:`Répertoires externes que Claude peut lire mais pas modifier. En mode Docker, ils sont montés en lecture seule. Utile pour référencer des coffres Obsidian, du code de projet ou des dossiers de documents.`,noEntries:`Aucun répertoire de référence configuré.`,addDirTitle:`Ajouter un répertoire de référence`,pathPlaceholder:`/Users/moi/ObsidianVault ou ~/Documents/notes`,labelPlaceholder:`Étiquette (facultatif — par défaut le nom du dossier)`,readOnlyBadge:`lecture seule`,errPathRequired:`Le chemin est obligatoire`,errMustBeAbsolute:`Doit être un chemin absolu ou commencer par ~/`,errAlreadyExists:`Existe déjà`,errLabelConflict:`L'étiquette "{label}" existe déjà`},dashboard:{empty:`Aucune collection favorite pour l'instant.`,emptyHint:`Épinglez une collection (★) pour la voir ici.`,viewTable:`Tableau`,viewCalendar:`Calendrier`,viewKanban:`Kanban`,viewPickerLabel:`Choisir la vue`,openFull:`Double-cliquez pour ouvrir la vue complète`,dragHint:`Glisser pour réorganiser`,resizeHint:`Glisser pour redimensionner`},pluginLauncher:{chat:{label:`Discussion`},dashboard:{label:`Tableau de bord`},automations:{label:`Actions`},wiki:{label:`Wiki`},collections:{label:`Collections`},feeds:{label:`Flux`},accounting:{label:`Comptabilité`},files:{label:`Fichiers`}},shortcuts:{pin:`Épingler au lanceur`,unpin:`Détacher du lanceur`,zoneAriaLabel:`Raccourcis épinglés`,reorder:{open:`Réorganiser les raccourcis`,title:`Réorganiser`,moveUp:`Monter`,moveDown:`Descendre`}},fileContentHeader:{showRendered:`Afficher le Markdown rendu`,showRaw:`Afficher la source brute`,rendered:`Rendu`,raw:`Source`,closeFile:`Fermer le fichier`,revealInOs:`Afficher dans le dossier`,revealInOsFailed:`Échec de l'affichage dans le dossier`},fileContentRenderer:{download:`ZIP`,downloadZip:`Télécharger en zip autonome (ressources incluses)`,downloadError:`Échec du téléchargement`,selectFile:`Sélectionnez un fichier`,htmlPreview:`Aperçu HTML`,pdfPreview:`Aperçu PDF`,parseError:`erreur d'analyse`,editJson:`Modifier le JSON`,jsonEditorLabel:`Éditeur JSON`,invalidJson:`JSON invalide`,undo:`Annuler`,redo:`Rétablir`,editMarp:`Modifier la source de la diapositive`,marpEditorLabel:`Source des diapositives Marp`,openInOs:`Ouvrir dans le système`,openingInOs:`Ouverture…`,openInOsFailed:`Échec de l'ouverture dans le système`,downloadFile:`Télécharger`,downloadingFile:`Téléchargement…`},filesView:{chatPlaceholder:`Posez une question sur ce fichier…`},systemFiles:{schemaLabel:`Schéma`,showDetails:`Afficher les détails`,hideDetails:`Masquer les détails`,editPolicy:{"agent-managed-but-hand-editable":`Géré par l'agent (édition manuelle OK)`,"user-editable":`Éditable par l'utilisateur`,"agent-managed":`Géré par l'agent`,"fragile-format":`Format fragile`,ephemeral:`Éphémère`},mcp:{title:`Serveurs MCP`,summary:`Serveurs externes Model Context Protocol attachés à l'agent. Ajoutez des serveurs HTTP ou stdio pour étendre les outils disponibles.`},settings:{title:`Paramètres de l'app`,summary:`Préférences de comportement éditables — clé API Gemini, outils autorisés, configuration du sandbox, etc.`},schedulerTasks:{title:`Tâches du planificateur`,summary:`Automatisations récurrentes de l'agent déclenchées selon un planning. Gérées via l'UI Automations ; ce fichier est la source sur disque.`},schedulerOverrides:{title:`Surcharges du planificateur`,summary:`Surcharges horaires / d'intervalle par tâche appliquées au-dessus du planning système. L'agent édite ce fichier quand vous demandez à changer l'horaire d'une tâche récurrente.`},schedulerItems:{title:`File d'éléments du planificateur`,summary:`Invocations planifiées prêtes à se déclencher. Géré par l'agent ; n'éditez pas à la main sans comprendre chaque champ.`},wikiIndex:{title:`Index du wiki`,summary:`Index auto-généré de toutes les pages du wiki. Régénéré à chaque édition — n'éditez pas à la main (vos changements seront écrasés).`},wikiLog:{title:`Journal d'édition du wiki`,summary:`Journal d'activité des créations et éditions de pages. Géré par l'agent et en append seulement — utile comme flux des changements récents.`},wikiSummary:{title:`Résumé du wiki`,summary:`Vue d'ensemble auto-générée du wiki — clusters thématiques, nombre de pages, activité récente. Régénérée par l'agent.`},wikiSchema:{title:`Schéma du wiki`,summary:`Spécification de format que l'agent lit pour garder les pages du wiki cohérentes. Fragile — il attend une structure précise ; préférez les éditions via l'agent.`},memory:{title:`Mémoire`,summary:`Faits distillés à votre sujet, toujours chargés comme contexte pour les nouvelles conversations. L'extracteur du journal y ajoute automatiquement ; vous pouvez aussi éditer à la main.`},summariesIndex:{title:`Index des résumés`,summary:`Index navigable reliant les résumés quotidiens et thématiques générés par le journal. Géré par l'agent ; régénéré à chaque passe.`},rolesJson:{title:`Définition du rôle (JSON)`,summary:`Configuration du rôle — choix du modèle, serveurs MCP, plugins autorisés, suggestions de requêtes. Éditable, pas besoin de redémarrage.`},rolesMd:{title:`Description du rôle (Markdown)`,summary:`Persona et system prompt du rôle, chargés comme contexte quand ce rôle est actif. Éditable ; les changements s'appliquent au prochain message.`},journalDaily:{title:`Résumé quotidien du journal`,summary:`Récapitulatif auto-généré de votre activité pour une journée, distillé par le journal à partir des sessions de chat.`},journalTopic:{title:`Journal thématique`,summary:`Notes à long terme sur un sujet spécifique, accumulées et révisées au fur et à mesure que vous en reparlez. Géré par l'agent.`}},settingsMcpTab:{explanation:`Ajoutez des serveurs MCP externes. Les serveurs HTTP fonctionnent dans tous les modes. Les serveurs Stdio utilisent le {npx} / {node} / {tsx} de l'image du sandbox ; lorsque Docker est activé, les chemins doivent se trouver dans l'espace de travail.`,localhostRewrite:`En mode Docker, {localhost} est réécrit en {hostDockerInternal}.`,noServers:`Aucun serveur MCP configuré pour le moment.`,enabled:`activé`,urlLabel:`URL :`,commandLabel:`Commande :`,dockerStdioUnsupported:`⚠ Ne s'exécutera pas lorsque le sandbox Docker est activé.`,dockerStdioHostExecActive:`⚠ S'exécute sur l'hôte : ce serveur sort du sandbox Docker.`,dockerStdioHostExecOptIn:`Exécuter quand même sur l'hôte (avancé). Ce serveur s'exécute hors du sandbox Docker via une passerelle HTTP locale et peut accéder à votre machine.`,learnMore:`En savoir plus`,addServerButton:`+ Ajouter un serveur MCP`,nameLabel:`Nom`,namePlaceholder:`mon-serveur`,typeHttp:`HTTP`,typeStdio:`Stdio (commande)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`Commande`,argsLabel:`Arguments (un par ligne)`,argsPlaceholder:()=>`-y
|
|
256
|
+
Cette action est irréversible.`},notificationBell:{notifications:`Notifications`,activeSection:`Actives`,historySection:`Historique`,noActive:`Aucune notification active`,noHistory:`Aucune activité récente`,clearAll:`Tout effacer`,dismiss:`Ignorer`,cancel:`Annuler`,showMore:`Voir plus ({count})`,showLess:`Réduire`,openTarget:`Ouvrir`,expandDetails:`Afficher les détails`},pluginDiagnostics:{title:`Problème de configuration du plugin`,hostBody:`Le plugin « {plugin} » a tenté d'enregistrer la clé {label} « {key} », mais elle est réservée par l'hôte. L'entrée du plugin a été supprimée.`,intraBody:`Les plugins « {first} » et « {second} » enregistrent tous deux le {dimension} « {key} ». « {first} » l'a réclamé en premier, donc l'enregistrement de « {second} » est ignoré.`},shadowedEnv:{title:`Le shell remplace .env`,body:`Défini à la fois dans le shell et dans .env : {keys}. La valeur du shell l'emporte, donc .env est ignoré. Si vous avez modifié .env, mettez à jour ou supprimez la valeur du shell puis redémarrez.`},optionalDeps:{title:`Dépendance optionnelle indisponible`,titleNotFound:`{command} n'est pas installé`,titleNotResponding:`{command} n'est pas en cours d'exécution`,notFound:`{command} introuvable — les fonctionnalités associées ont été désactivées. Installez {command} et redémarrez MulmoClaude pour les activer.`,notResponding:`{command} est installé mais n'est pas en cours d'exécution — les fonctionnalités associées ont été désactivées. Démarrez {command} et redémarrez MulmoClaude pour les activer.`},billingMigration:{title:`La facturation est passée à une configuration à la demande`,body:`Les collections intégrées clients, worklog, invoice et profile ont été retirées de votre tableau de bord, mais vos données sont en sécurité et intactes. Demandez à configurer le suivi des clients et du temps, puis la facturation pour les recréer ; vos enregistrements existants réapparaîtront.`},backendOffline:{title:`Impossible de joindre le backend`,body:`Le serveur MulmoClaude n'est peut-être pas démarré. Vérifiez le serveur de développement, puis réessayez.`,retry:`Réessayer`},pluginErrorBoundary:{title:`Le plugin {pkg} a planté`,subtitle:`Le plugin n'a pas pu être affiché. L'erreur a été consignée dans la console.`,showDetails:`Afficher les détails`,hideDetails:`Masquer les détails`,retry:`Réessayer`},remoteHostOffline:{title:`Hôte distant déconnecté`,body:`Votre téléphone ne pourra pas envoyer vers cet appareil tant que vous n'êtes pas reconnecté.`,reconnect:`Se reconnecter`},authTokenStale:{title:`Cette page doit être rechargée`,body:`Le serveur a refusé le jeton de cette page et un nouveau n'a pas pu être récupéré. Rechargez pour continuer.`,reload:`Recharger`},remoteHost:{title:`Hôte distant`,online:`Hôte distant en ligne`,offline:`Hôte distant hors ligne`,uid:`uid {uid}`,signIn:`Se connecter avec Google`,connecting:`Connexion…`,disconnect:`Déconnecter`,disconnecting:`Déconnexion…`,noToken:`La connexion Google n'a renvoyé aucun idToken`,connectFailed:`Échec de la connexion`,disconnectFailed:`Échec de la déconnexion`,signInFailed:`Échec de la connexion Google`,statusFailed:`Échec du chargement de l'état`,description:`L'accès distant permet à un appareil mobile de se connecter aux collections et aux flux de ce MulmoClaude.`,howTo:`Sur votre téléphone, ouvrez {url} et connectez-vous avec le même compte Google.`,customViewHint:`Pour une vue adaptée au mobile, demandez à Claude de créer une {keyword} (pas une custom view classique).`,qrHint:`Ou scannez ce code QR avec l'appareil photo de votre téléphone.`},sessionModelChip:{tooltip:`Modèle utilisé par cette session : {model}`,tooltipOverride:`Modèle de cette conversation : {model} (remplace le rôle / le réglage global)`,ariaLabel:`Modèle de cette conversation`,clear:`Revenir au réglage par défaut`,unknown:`inconnu`,inherited:`{model} (hérité)`},sidebarHeader:{newMessages:`Nouveaux messages`,home:`Aller à la dernière conversation`,toolCallHistory:`Historique des appels d'outils`,settings:`Paramètres`,settingsGeminiMissing:`Paramètres — Clé API Gemini manquante`,todayJournal:`Résumé du jour`,todayJournalNotFound:`Pas encore de résumé — discutez un peu et le journal en générera un.`,todayJournalLoadFailed:`Échec du chargement du journal (status {status}) : {error}`,copyMarkdown:`Copier la conversation en Markdown`,copiedMarkdown:`Copié !`},rightSidebar:{permalink:`Lien vers le message sélectionné`,copyPermalink:`Copier le lien vers le message sélectionné`,copiedPermalink:`Copié !`,toggleSystemPrompt:`Basculer le system prompt`,systemPrompt:`System Prompt`,availableTools:`Outils disponibles`,toggleToolDescription:`Basculer la description de l'outil`,toolCallHistory:`Historique des appels d'outils`,copyHistory:`Copier l'historique des appels d'outils`,copiedHistory:`Copié !`,noToolCalls:`Aucun appel d'outil pour le moment`,arguments:`Arguments`,error:`Erreur`,result:`Résultat`,running:`En cours...`,mcpHint:{title:e=>`Aide à la configuration : ${e.named(`server`)}`,requiredKeys:`Clés requises`,setupGuide:`Ouvrir le guide de configuration`}},fileTreePane:{sort:`Tri :`,sortByName:`Trier par nom`,name:`Nom`,sortByRecent:`Trier par date de modification (plus récent en premier)`,recent:`Récent`,reference:`Référence`,readOnlyBadge:`RO`,showSystemFiles:`Afficher les fichiers système`,showSystemFilesTitle:`Affiche les répertoires racine internes de l'agent (conversations/, feeds/, etc.) en plus des contenus utilisateur (data/, artifacts/, config/).`},fileTree:{dropHint:`Déposez des fichiers ici pour les enregistrer dans ce dossier`,upload:{progress:`Téléversement {done} sur {total}…`,done:`{count} fichier(s) enregistré(s)`,failed:`{count} fichier(s) n'ont pas pu être enregistrés`},workspace:`(espace de travail)`,recentlyChanged:`Modifiés récemment`,newFileMenuItem:`Nouveau fichier`,newFileInputAria:`Nom du nouveau fichier`,newFilePlaceholder:{wikiPage:`slug-de-page`,summary:`nom-du-résumé`,document:`nom-du-document`,html:`nom-de-page`,story:`nom-de-histoire`},newFileError:{empty:`Le nom de fichier ne peut pas être vide.`,unsafe:`Le nom de fichier contient des caractères non valides.`,exists:`Un fichier nommé {filename} existe déjà ici.`,saveFailed:`Impossible de créer le fichier. Veuillez réessayer.`}},lockStatusPopup:{sandboxEnabledTooltip:`Sandbox activé (Docker)`,noSandboxTooltip:`Pas de sandbox (Docker introuvable)`,sandboxEnabledLabel:`Sandbox activé :`,sandboxEnabledBody:`Docker est en cours d'exécution. L'accès au système de fichiers est isolé.`,noSandboxLabel:`Pas de sandbox :`,noSandboxBodyPrefix:`Claude peut accéder à tous les fichiers de votre machine. Installez`,noSandboxBodySuffix:`pour activer l'isolation du système de fichiers.`,dockerDesktop:`Docker Desktop`,hostCredentials:`Identifiants de l'hôte attachés :`,credsLoading:`chargement…`,sshAgent:`Agent SSH :`,forwarded:`transféré`,notForwarded:`non transféré`,mountedConfigs:`Configurations montées :`,none:`aucune`,testIsolation:`Tester l'isolation du sandbox :`},settingsModal:{title:`Paramètres`,version:`MulmoClaude v{version}`,tabs:{gemini:`Clé API Gemini`,tools:`Outils autorisés`,mcp:`Serveurs MCP`,dirs:`Répertoires`,refs:`Répertoires de référence`,map:`Carte`,photos:`Photos`,google:`Google`,model:`Modèle`,voice:`Voix`,chatIndex:`Index du chat`,journal:`Journal`,notifications:`Web Push`,skills:`Skills`,roles:`Rôles`,quit:`Quitter`},groups:{llm:`LLM`,servers:`Serveurs`,workspace:`Espace de travail`,notifications:`Notifications`,plugins:`Plugins`,management:`Gestion`,server:`Serveur`},navAriaLabel:`Sections des paramètres`,googleTab:{description:`Associez votre compte Google pour que cette machine puisse appeler les API Google (Calendar en premier). Le jeton d'actualisation est stocké uniquement sur cette machine et n'est jamais envoyé à un autre serveur que Google.`,statusLinked:`Associé`,statusNotLinked:`Non associé`,statusPending:`En attente de la fin du consentement dans le navigateur…`,connect:`Associer le compte Google`,unlink:`Dissocier`,unlinkConfirm:`Dissocier le compte Google ? Le jeton enregistré sera révoqué et supprimé de cette machine.`,clientSecretAmbiguous:`Plusieurs fichiers client_secret_*.json ont été trouvés dans ~/.secrets/. N'en conservez qu'un seul afin que le jeton enregistré reste associé au bon client OAuth.`,loadError:`Échec du chargement de l'état de l'association Google.`,connectError:`Échec du démarrage du flux d'autorisation Google.`,unlinkError:`Échec de la dissociation du compte Google.`},geminiTab:{required:`La génération d'images nécessite {envKey}. Collez la clé ci-dessous et enregistrez-la.`,apiKeyLabel:`Clé d'API Gemini`,apiKeyPlaceholder:`AIza…`,helperText:`Créez ou copiez une clé depuis {studioLink}.`,storageNote:`Enregistrée uniquement sur cet ordinateur, en dehors de l'espace de travail, et lisible par vous seul. Elle prend effet immédiatement, sans redémarrage.`,storedHere:`Enregistrée dans l'application`,storedInEnvironment:`Provient de l'environnement`,notConfigured:`Non configurée`,clear:`Effacer`,fromEnvironment:`Cette clé vient du shell qui a lancé l'application ou de {envFile}. Une clé enregistrée ici est prioritaire.`,loadError:`Impossible de charger l'état de la clé`,saveError:`Impossible d'enregistrer la clé`,clearError:`Impossible d'effacer la clé`},mapTab:{description:`Définit la clé API Google Maps utilisée par le plugin de carte. La clé est stockée localement et n'est envoyée qu'à Google Maps.`,apiKeyLabel:`Clé API Google Maps`,apiKeyPlaceholder:`AIza…`,helperText:`Créez ou copiez une clé depuis {consoleLink}.`,requiredApis:`APIs requises : Maps JavaScript API, Geocoding API, Places API (New), Directions API.`,configured:`Configurée`,notConfigured:`Non configurée`,clear:`Effacer`,loadError:`Échec du chargement des paramètres`,saveError:`Échec de l'enregistrement`},photosTab:{description:`Contrôles de confidentialité pour les photos reçues par le chat ou par un bridge connecté. Les données de localisation EXIF sont sensibles — décochez pour désactiver la capture automatique.`,autoCaptureLabel:`Capturer automatiquement la localisation des photos`,autoCaptureHint:`Activé : chaque image envoyée avec GPS EXIF génère un sidecar de localisation dans data/locations/. Désactivé : rien n'est capturé automatiquement ; le LLM peut toujours extraire EXIF à la demande.`,statusOn:`Capture automatique ACTIVÉE`,statusOff:`Capture automatique DÉSACTIVÉE`,loadError:`Échec du chargement des paramètres`,saveError:`Échec de l'enregistrement`},quitTab:{description:`Arrête le serveur MulmoClaude qui tourne sur cette machine. Lancé depuis l'icône, il continue de tourner même si vous fermez cet onglet — c'est ici qu'on l'arrête sans terminal.`,restartHint:()=>"Pour le relancer, double-cliquez sur l'icône MulmoClaude (ou lancez `npx mulmoclaude@latest`).",quitLabel:`Quitter MulmoClaude`,confirmBody:`Le serveur s'arrête et cette page cesse de fonctionner. Tout traitement en cours est interrompu.`,confirmLabel:`Quitter`,stopping:`Arrêt en cours…`,stoppedTitle:`MulmoClaude est arrêté`,stoppedBody:`Vous pouvez fermer cet onglet. Double-cliquez sur l'icône pour le relancer.`,error:`Échec de l'arrêt du serveur`},notificationsTab:{description:`Recevez une notification push sur vos appareils enregistrés lorsqu'une tâche que vous avez lancée ici se termine — pratique quand vous posez une question, vous éloignez et voulez savoir dès que la réponse est prête.`,enableLabel:`Envoyer une Web Push à la fin d'une tâche`,enableHint:`Se déclenche à la fin d'une conversation que vous avez lancée ici. Les tâches planifiées et en arrière-plan ne la déclenchent pas.`,remoteHostNote:`Nécessite la connexion RemoteHost (qui fournit l'authentification) et au moins un appareil enregistré. Si l'un manque, rien ne se passe.`,macosRemindersLabel:`Créer un rappel macOS à la fin d'une tâche`,macosRemindersHint:`Ajoute la tâche terminée à votre liste de Rappels par défaut. La synchronisation iCloud la répercute sur votre iPhone, qui délivre la notification.`,macosRemindersForcedOff:`Désactivé au démarrage par --disable-macos-reminders ou DISABLE_MACOS_REMINDER_NOTIFICATIONS. Retirez l'option ou supprimez la variable d'environnement, puis redémarrez pour le contrôler ici.`,statusOn:`Web Push est ACTIVÉ`,statusOff:`Web Push est DÉSACTIVÉ`,loadError:`Échec du chargement des paramètres`,saveError:`Échec de l'enregistrement`},modelTab:{description:`Choisissez le modèle et l'effort de raisonnement utilisés par Claude Code à chaque tour. Laissez l'un ou l'autre vide pour conserver la résolution propre à Claude.`,modelLabel:`Modèle`,modelUnset:`(non défini — suivre ~/.claude/settings.json)`,modelHelperText:`Non défini, le modèle provient de ~/.claude/settings.json, le fichier où les autres clients Claude Code (VS Code, Cursor) enregistrent aussi leur choix de /model : un changement là-bas modifie donc aussi MulmoClaude. Les alias suivent la dernière génération de chaque famille.`,modelConfigured:`Modèle : {model}`,modelNotConfigured:`Non défini (partagé)`,effortLabel:`Effort de raisonnement`,effortUnset:`(non défini — utiliser la valeur par défaut de Claude)`,helperText:`Les niveaux plus élevés autorisent plus de temps de réflexion mais augmentent la latence et la consommation de tokens.`,configured:`Effort : {level}`,notConfigured:`Non défini`,userSettingsLabel:`Charger les réglages utilisateur et les plugins de Claude Code`,userSettingsHint:`Lit les skills, plugins et hooks de ~/.claude, les mêmes que ceux de Claude Code. Désactivez-le si les plugins installés apportent tant de skills que chaque requête devient lourde ; les skills de l'espace de travail restent disponibles. Prend effet à partir du message suivant. Désactivé, un modèle non défini ne suit plus non plus ~/.claude/settings.json.`,skillListingSummary:`Skills chargées au dernier tour : {count}.`,skillListingPlugins:`Depuis les plugins : {plugins}.`,skillListingHeavy:`Autant de skills alourdissent chaque requête ; le désactiver retire celles de ~/.claude.`,loadError:`Échec du chargement des paramètres`,saveError:`Échec de l'enregistrement`},voiceTab:{description:`Dictez vos messages de chat à la voix. L'audio est transcrit localement sur la machine qui exécute MulmoClaude — rien n'est envoyé à un service externe.`,requirements:`Disponible uniquement sur macOS. Nécessite le serveur whisper.cpp — compilez-le avec yarn build:whisper (voir la section Local Voice Input du README).`,unsupported:`La saisie vocale nécessite macOS avec le serveur whisper.cpp installé. Elle n'est pas disponible sur cette machine.`,enableLabel:`Activer la saisie vocale`,enableHint:`L'activation télécharge le modèle vocal (1–3 Go) une seule fois. Un bouton micro apparaît ensuite dans la zone de saisie du chat.`,modelLabel:`Modèle vocal`,downloading:`Téléchargement du modèle… {percent}%`,ready:`Modèle prêt`,downloadError:`Échec du téléchargement du modèle.`,retry:`Réessayer`,loadError:`Échec du chargement des paramètres`,saveError:`Échec de l'enregistrement`},chatIndexTab:{description:`Titres et résumés générés par IA pour l'historique du chat. Désactivé par défaut — les sessions d'automatisation (scheduler / workers système) sont toujours ignorées même quand c'est activé ; les sessions humaines ne paient qu'un appel au résumeur à la fin de chaque tour.`,modeLabel:`Modèle de l'index de chat`,helperText:`Haiku est moins cher ; Sonnet donne des titres plus précis pour de longues sessions changeant de sujet.`,mode:{off:`Désactivé`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Indexation DÉSACTIVÉE`,haiku:`Indexation avec Haiku`,sonnet:`Indexation avec Sonnet`},loadError:`Échec du chargement des paramètres`,saveError:`Échec de l'enregistrement`},journalTab:{description:`Journal quotidien automatisé — résume les sessions de chat récentes dans journal/*.md et extrait des notes de mémoire persistante. Désactivé par défaut. Les sessions d'automatisation (scheduler / workers système) sont toujours exclues, quel que soit ce réglage.`,modeLabel:`Modèle du journal`,helperText:`Haiku est moins cher ; Sonnet produit des résumés quotidiens et thématiques plus riches. Le passage horaire ne s'exécute que lorsque c'est activé.`,mode:{off:`Désactivé`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Journal DÉSACTIVÉ`,haiku:`Journal en cours avec Haiku`,sonnet:`Journal en cours avec Sonnet`},loadError:`Échec du chargement des paramètres`,saveError:`Échec de l'enregistrement`},geminiAskButton:`Demander à Claude`,geminiAskMessage:`Quel est le rôle de la clé API Gemini dans cette application ?`,toolNamesLabel:`Noms d'outils`,invalidToolNamesPrefix:`Ceux-ci semblent non standards (préfixe attendu`,invalidToolNamesSuffix:`) :`,mcpToolsError:`⚠ Impossible de récupérer l'état des outils MCP : {error}. Tous les outils sont affichés quel que soit leur état d'activation.`,changesHint:`Les modifications s'appliquent au prochain message. Pas besoin de redémarrer.`,cannotSaveTooltip:`Impossible d'enregistrer tant que les paramètres ne sont pas chargés`,saving:`Enregistrement…`,loadingLabel:`Chargement…`,unsavedMarker:`●`,unsavedToolsConfirm:`Allowed Tools contient des modifications non enregistrées. Fermer quand même ?`,unsavedMcpDraftConfirm:`Un brouillon de serveur MCP est encore ouvert. Fermer quand même ?`,mcpSaveFailed:`Impossible d'enregistrer les modifications des serveurs MCP.`},canvasViewToggle:{stackViewTooltip:`Vue empilée · cliquez pour passer à la vue simple`,singleViewTooltip:`Vue simple · cliquez pour passer à la vue empilée`,switchToSingle:`Passer à la vue simple`,switchToStack:`Passer à la vue empilée`},sessionHistoryToggle:{showTooltip:`Afficher le panneau d'historique des sessions à gauche`,hideTooltip:`Masquer le panneau d'historique des sessions`,show:`Afficher l'historique des sessions`,hide:`Masquer l'historique des sessions`},sessionHistoryExpand:{expandTooltip:`Agrandir le panneau d'historique des sessions en pleine largeur`,collapseTooltip:`Réduire le panneau d'historique des sessions`,expand:`Agrandir l'historique des sessions`,collapse:`Réduire l'historique des sessions`},settingsWorkspaceDirs:{explanation:`Répertoires personnalisés pour organiser les fichiers sous {dataDir} et {artifactsDir}. Claude s'en sert pour router l'enregistrement des fichiers.`,noEntries:`Aucun répertoire personnalisé configuré.`,addDirTitle:`Ajouter un répertoire`,pathPlaceholder:`data/clients ou artifacts/rapports`,descPlaceholder:`Description (ce qui va dans ce dossier)`,errPathRequired:`Le chemin est obligatoire`,errMustStartWith:`Doit commencer par data/ ou artifacts/`,errAlreadyExists:`Existe déjà`},settingsReferenceDirs:{explanation:`Répertoires externes que Claude peut lire mais pas modifier. En mode Docker, ils sont montés en lecture seule. Utile pour référencer des coffres Obsidian, du code de projet ou des dossiers de documents.`,noEntries:`Aucun répertoire de référence configuré.`,addDirTitle:`Ajouter un répertoire de référence`,pathPlaceholder:`/Users/moi/ObsidianVault ou ~/Documents/notes`,labelPlaceholder:`Étiquette (facultatif — par défaut le nom du dossier)`,readOnlyBadge:`lecture seule`,errPathRequired:`Le chemin est obligatoire`,errMustBeAbsolute:`Doit être un chemin absolu ou commencer par ~/`,errAlreadyExists:`Existe déjà`,errLabelConflict:`L'étiquette "{label}" existe déjà`},dashboard:{empty:`Aucune collection favorite pour l'instant.`,emptyHint:`Épinglez une collection (★) pour la voir ici.`,viewTable:`Tableau`,viewCalendar:`Calendrier`,viewKanban:`Kanban`,viewPickerLabel:`Choisir la vue`,openFull:`Double-cliquez pour ouvrir la vue complète`,dragHint:`Glisser pour réorganiser`,resizeHint:`Glisser pour redimensionner`},pluginLauncher:{chat:{label:`Discussion`},dashboard:{label:`Tableau de bord`},automations:{label:`Actions`},wiki:{label:`Wiki`},collections:{label:`Collections`},feeds:{label:`Flux`},accounting:{label:`Comptabilité`},files:{label:`Fichiers`}},shortcuts:{pin:`Épingler au lanceur`,unpin:`Détacher du lanceur`,zoneAriaLabel:`Raccourcis épinglés`,reorder:{open:`Réorganiser les raccourcis`,title:`Réorganiser`,moveUp:`Monter`,moveDown:`Descendre`}},fileContentHeader:{showRendered:`Afficher le Markdown rendu`,showRaw:`Afficher la source brute`,rendered:`Rendu`,raw:`Source`,closeFile:`Fermer le fichier`,revealInOs:`Afficher dans le dossier`,revealInOsFailed:`Échec de l'affichage dans le dossier`},fileContentRenderer:{download:`ZIP`,downloadZip:`Télécharger en zip autonome (ressources incluses)`,downloadError:`Échec du téléchargement`,selectFile:`Sélectionnez un fichier`,htmlPreview:`Aperçu HTML`,pdfPreview:`Aperçu PDF`,parseError:`erreur d'analyse`,editJson:`Modifier le JSON`,jsonEditorLabel:`Éditeur JSON`,invalidJson:`JSON invalide`,undo:`Annuler`,redo:`Rétablir`,editMarp:`Modifier la source de la diapositive`,marpEditorLabel:`Source des diapositives Marp`,openInOs:`Ouvrir dans le système`,openingInOs:`Ouverture…`,openInOsFailed:`Échec de l'ouverture dans le système`,downloadFile:`Télécharger`,downloadingFile:`Téléchargement…`},filesView:{chatPlaceholder:`Posez une question sur ce fichier…`},systemFiles:{schemaLabel:`Schéma`,showDetails:`Afficher les détails`,hideDetails:`Masquer les détails`,editPolicy:{"agent-managed-but-hand-editable":`Géré par l'agent (édition manuelle OK)`,"user-editable":`Éditable par l'utilisateur`,"agent-managed":`Géré par l'agent`,"fragile-format":`Format fragile`,ephemeral:`Éphémère`},mcp:{title:`Serveurs MCP`,summary:`Serveurs externes Model Context Protocol attachés à l'agent. Ajoutez des serveurs HTTP ou stdio pour étendre les outils disponibles.`},settings:{title:`Paramètres de l'app`,summary:`Préférences de comportement éditables — clé API Gemini, outils autorisés, configuration du sandbox, etc.`},schedulerTasks:{title:`Tâches du planificateur`,summary:`Automatisations récurrentes de l'agent déclenchées selon un planning. Gérées via l'UI Automations ; ce fichier est la source sur disque.`},schedulerOverrides:{title:`Surcharges du planificateur`,summary:`Surcharges horaires / d'intervalle par tâche appliquées au-dessus du planning système. L'agent édite ce fichier quand vous demandez à changer l'horaire d'une tâche récurrente.`},schedulerItems:{title:`Anciens éléments de calendrier`,summary:`Éléments de la vue Calendrier supprimée. L'application ne les affiche plus et rien ne les exécute selon un planning ; seules les anciennes actions /api/scheduler lisent et écrivent encore ce fichier. Les tâches planifiées se trouvent dans config/scheduler/tasks.json.`},wikiIndex:{title:`Index du wiki`,summary:`Index auto-généré de toutes les pages du wiki. Régénéré à chaque édition — n'éditez pas à la main (vos changements seront écrasés).`},wikiLog:{title:`Journal d'édition du wiki`,summary:`Journal d'activité des créations et éditions de pages. Géré par l'agent et en append seulement — utile comme flux des changements récents.`},wikiSummary:{title:`Résumé du wiki`,summary:`Vue d'ensemble auto-générée du wiki — clusters thématiques, nombre de pages, activité récente. Régénérée par l'agent.`},wikiSchema:{title:`Schéma du wiki`,summary:`Spécification de format que l'agent lit pour garder les pages du wiki cohérentes. Fragile — il attend une structure précise ; préférez les éditions via l'agent.`},memory:{title:`Mémoire (ancien fichier)`,summary:`L'ancienne mémoire en un seul fichier. Seuls les espaces de travail encore à l'ancien format la lisent ; les espaces actuels stockent les faits dans des fichiers de sujet sous conversations/memory/<type>/<topic>.md et ignorent ce fichier, donc le modifier n'a pas d'effet pour eux.`},summariesIndex:{title:`Index des résumés`,summary:`Index navigable reliant les résumés quotidiens et thématiques générés par le journal. Géré par l'agent ; régénéré à chaque passe.`},rolesJson:{title:`Définition du rôle (JSON)`,summary:`Configuration du rôle — choix du modèle, serveurs MCP, plugins autorisés, suggestions de requêtes. Éditable, pas besoin de redémarrage.`},rolesMd:{title:`Description du rôle (Markdown)`,summary:`Persona et system prompt du rôle, chargés comme contexte quand ce rôle est actif. Éditable ; les changements s'appliquent au prochain message.`},journalDaily:{title:`Résumé quotidien du journal`,summary:`Récapitulatif auto-généré de votre activité pour une journée, distillé par le journal à partir des sessions de chat.`},journalTopic:{title:`Journal thématique`,summary:`Notes à long terme sur un sujet spécifique, accumulées et révisées au fur et à mesure que vous en reparlez. Géré par l'agent.`}},settingsMcpTab:{explanation:`Ajoutez des serveurs MCP externes. Les serveurs HTTP fonctionnent dans tous les modes. Les serveurs Stdio utilisent le {npx} / {node} / {tsx} de l'image du sandbox ; lorsque Docker est activé, les chemins doivent se trouver dans l'espace de travail.`,localhostRewrite:`En mode Docker, {localhost} est réécrit en {hostDockerInternal}.`,noServers:`Aucun serveur MCP configuré pour le moment.`,enabled:`activé`,urlLabel:`URL :`,commandLabel:`Commande :`,dockerStdioUnsupported:`⚠ Ne s'exécutera pas lorsque le sandbox Docker est activé.`,dockerStdioHostExecActive:`⚠ S'exécute sur l'hôte : ce serveur sort du sandbox Docker.`,dockerStdioHostExecOptIn:`Exécuter quand même sur l'hôte (avancé). Ce serveur s'exécute hors du sandbox Docker via une passerelle HTTP locale et peut accéder à votre machine.`,learnMore:`En savoir plus`,addServerButton:`+ Ajouter un serveur MCP`,nameLabel:`Nom`,namePlaceholder:`mon-serveur`,typeHttp:`HTTP`,typeStdio:`Stdio (commande)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`Commande`,argsLabel:`Arguments (un par ligne)`,argsPlaceholder:()=>`-y
|
|
257
257
|
@modelcontextprotocol/server-filesystem
|
|
258
258
|
/workspace/path`,errNoName:`Indiquez un Nom, ou saisissez une URL / des arguments dont nous pouvons le déduire.`,errBadName:`Le nom doit commencer par une lettre minuscule et contenir uniquement [a-z0-9_-].`,errIdExists:`L'identifiant de serveur "{id}" existe déjà.`,errBadHttpUrl:`L'URL HTTP doit commencer par http:// ou https://`,pendingEntryWarning:`Terminez ou annulez d'abord l'entrée de serveur MCP en attente.`,customHeading:`Serveurs personnalisés`,catalog:{heading:`Serveurs MCP préconfigurés`,audience:{general:`🟢 Général`,developer:`🔵 Développeur`},risk:{low:`faible`,medium:`moyen`,high:`élevé`},upstream:`📦 Source`,setupGuide:`📚 Configuration`,entry:{memory:{displayName:`Mémoire`,description:`Permet à Claude de se souvenir du contexte entre les sessions.`},sequentialThinking:{displayName:`Pensée séquentielle`,description:`Aide Claude à aborder les problèmes complexes étape par étape.`},context7:{displayName:`Context7 (docs de bibliothèques)`,description:`Documentation à jour des bibliothèques populaires — au-delà de la date de coupure d'entraînement du modèle.`},deepwiki:{displayName:`DeepWiki (wiki de dépôts GitHub)`,description:`Posez des questions sur n'importe quel dépôt GitHub et obtenez une réponse structurée style wiki.`},notion:{displayName:`Notion`,description:`Lire et écrire dans votre espace Notion — pages, bases de données et recherche.`,field:{apiKey:{label:`Jeton d'intégration Notion`,help:`Créez une intégration Notion et copiez l'Internal Integration Secret. Cliquez sur 🔑 pour ouvrir la page des intégrations.`}}},slack:{displayName:`Slack`,description:`Lister les canaux, envoyer des messages et rechercher l'historique de votre espace Slack.`,field:{botToken:{label:`Jeton bot`,help:`App Slack → OAuth & Permissions → Bot User OAuth Token. Commence par xoxb-.`},teamId:{label:`ID d'équipe / espace de travail`,help:`Exécutez team.info ou consultez l'URL de l'espace — du type T01ABC23DEF.`}}},googleMaps:{displayName:`Google Maps`,description:`Rechercher des lieux, obtenir des itinéraires et consulter les détails d'une position.`,field:{apiKey:{label:`Clé d'API Google Maps`,help:`Google Cloud Console → APIs & Services → Credentials → Créer une clé d'API. Activez Places + Directions.`}}},appleNative:{displayName:`Apps natives Apple (macOS)`,description:`Lit et écrit Rappels, Calendrier, Notes, Mail et Plans via AppleScript. macOS uniquement — sans identifiants.`},gmail:{displayName:`Gmail`,description:`Lit, envoie et étiquette votre Gmail. Utilise un client OAuth Google que vous créez dans votre propre projet Google Cloud (sans vérification d'app).`,field:{credentials:{label:`Chemin vers credentials.json`,help:`Google Cloud Console → APIs & Services → Credentials → ID client OAuth (Desktop app). Téléchargez credentials.json et collez son chemin absolu.`}}},googleCalendar:{displayName:`Google Agenda`,description:`Lit et crée des événements Google Agenda. Même modèle BYO credentials.json que Gmail.`,field:{credentials:{label:`Chemin vers credentials.json`,help:`Réutilisez le même client OAuth Google Cloud que Gmail, ou créez-en un séparé pour le Calendar.`}}},googleDrive:{displayName:`Google Drive`,description:`Recherche et lit les fichiers Google Drive. BYO identifiants OAuth Google — le jeton est mis en cache localement à côté du fichier.`,field:{credentials:{label:`Chemin vers credentials.json`,help:`Google Cloud Console → APIs & Services → Credentials → ID client OAuth (Desktop app). Activez l'API Google Drive dans le même projet.`}}},github:{displayName:`GitHub`,description:"Lit les repos, issues, PRs et exécute des recherches avec un Personal Access Token. Limitez la portée du token — les permissions d'écriture (`repo`) laissent l'agent push sur n'importe quel repo accessible.",field:{token:{label:`Personal Access Token`,help:`GitHub → Settings → Developer settings → Personal access tokens. Préférez les fine-grained tokens limités aux repos où l'agent doit agir.`}}},linear:{displayName:`Linear`,description:`Lit et met à jour les issues, projets et cycles Linear avec une clé d'API personnelle.`,field:{apiKey:{label:`Clé d'API Linear`,help:`Linear → Settings → API → Personal API keys. Cliquez sur 🔑 pour ouvrir la page et sur Create key.`}}},weatherOpenMeteo:{displayName:`Météo (Open-Meteo)`,description:`Prévisions météo gratuites et conditions actuelles dans le monde entier — sans clé d'API.`},spotify:{displayName:`Spotify`,description:`Recherche des morceaux, gère les playlists, contrôle la lecture. BYO app développeur Spotify — Client ID uniquement (flux PKCE, pas de client secret).`,field:{clientId:{label:`Client ID`,help:"Spotify Developer Dashboard → Create app, configurez la Redirect URI à http://127.0.0.1:8888/callback, copiez le Client ID. Puis exécutez une fois dans le terminal `SPOTIFY_CLIENT_ID=<id> npx spotify-mcp@latest auth` pour vous connecter (refresh token mis en cache dans ~/.spotify-mcp/tokens.json)."}}},youtubeTranscript:{displayName:`Transcription YouTube`,description:`Récupère les sous-titres de n'importe quelle vidéo YouTube publique par URL. Sans identifiants.`}},config:{howToGet:`Comment l'obtenir`,install:`Installer`,errMissingRequired:`Champs obligatoires manquants : {fields}`,requiredMarker:`*`,requiredAria:`obligatoire`}}},pluginScheduler:{previewIcon:`📅`,previewAutomations:`{count} automatisation | {count} automatisations`,previewMore:`+ {count} de plus…`},pluginSchedulerTasks:{recommendedFrequencies:`Fréquences recommandées`,tableTaskType:`Type de tâche`,tableSuggestedSchedule:`Planification suggérée`,noTasks:`Aucune tâche planifiée`,runNow:`Exécuter maintenant`,enable:`Activer`,disable:`Désactiver`,delete:`Supprimer`,nextRun:`Prochaine : {time}`,originSystem:`Système`,originUser:`Utilisateur`,originSkill:`Skill`,runFailed:`Échec de l'exécution : {error}`,toggleFailed:`Échec du basculement : {error}`,deleteFailed:`Échec de la suppression : {error}`,detailsToggle:`Afficher les détails`,promptLabel:`Prompt`,roleLabel:`Rôle`,confirmDelete:`Supprimer la tâche « {name} » ? Cette action est irréversible.`,hintNewsRss:`Récupération actualités / RSS`,hintJournal:`Passage quotidien du journal`,hintWiki:`Maintenance du wiki`,hintMemory:`Extraction de mémoire`,hintCalendar:`Synchronisation agenda / contacts`},pluginCanvas:{undo:`Annuler`,redo:`Rétablir`,clear:`Effacer`,styleLabel:`Style :`,stylePromptWithPath:"Transforme l'image en `{path}` en une image de style {style}.",stylePromptNoPath:`Transforme mon dessin sur le canevas en une image de style {style}.`,saveFailed:`Non enregistré`},pluginWiki:{backToIndex:`Retour à l'index`,pdf:`PDF`,pdfFailed:`⚠ Échec du PDF`,tabIndex:`Index`,tabLog:`Journal`,tabLint:`Lint`,tabGraph:`Graphe`,graphEmpty:`Aucun lien à représenter pour le moment.`,linkedReferences:`Références entrantes`,empty:`Le wiki est vide. Demandez au Wiki Manager d'ingérer une source.`,previewMore:`+ {count} de plus…`,chatPlaceholder:`Posez une question sur cette page…`,emptyPage:`La page « {title} » n'existe pas encore.`,emptyContent:`La page « {title} » existe mais n'a pas de contenu.`,createPage:`Demander la création de cette page wiki`,updatePage:`Demander la mise à jour de cette page wiki`,tagFilterAll:`Toutes`,noMatches:`Aucune page avec le tag #{tag}`,lintChat:`Vérifier mon wiki`,taskCountMismatch:`La source du wiki et le rendu diffèrent sur le nombre de tâches. La modification a été refusée pour éviter de corrompre le fichier.`,metadataCreated:`Créé`,metadataUpdated:`Mis à jour`,metadataEditor:`Éditeur`,pageEditHeader:`Édition du wiki`,snapshotExpired:`Instantané expiré — affichage de la page actuelle`,snapshotLoadError:`Impossible de charger l'instantané — la page existe peut-être encore. Actualisez la page.`,pageDeleted:`Page supprimée`,history:{tabContent:`Contenu`,tabHistory:`Historique`,empty:`Aucun historique — modifiez cette page et la première version apparaîtra ici.`,loading:`Chargement de l'historique…`,backToList:`Retour à l'historique`,restoreButton:`Restaurer cette version`,restoreConfirmTitle:`Restaurer cette version ?`,restoreConfirmBody:`Restaurer la page vers la version du {ts} par {editor}. La page actuelle sera remplacée. L'historique existant est conservé.`,restoreConfirmAction:`Restaurer`,restoreConfirmCancel:`Annuler`,restoreSuccessToast:`Page restaurée.`,restoreFailureBanner:`Échec de la restauration : {error}`,compareCurrent:`Comparer avec la page actuelle`,comparePrevious:`Comparer avec la version précédente`,diffNoPrevious:`Aucune version précédente à comparer.`,diffNoChanges:`Aucune différence de contenu entre cette version et l'élément de comparaison.`,editorBadgeUser:`Utilisateur`,editorBadgeLLM:`LLM`,editorBadgeSystem:`Système`,hiddenLines:`{count} lignes inchangées masquées`,expandHidden:`Afficher`}},pluginPresentForm:{fallbackTitle:`Formulaire`,fieldCount:`{count} champ | {count} champs`,submitted:`Envoyé`,errorSummary:`Veuillez corriger les erreurs suivantes`,requiredMarker:`*`,selectOption:`Sélectionnez une option`,charactersCount:`{current} / {max} caractères`,charactersCountNoMax:`{current} caractères`,submit:`Envoyer`,progress:`{filled} sur {total} champs obligatoires remplis`},pluginPresentSvg:{saveAsPng:`Télécharger en PNG`,png:`PNG`,saveAsPdf:`Enregistrer en PDF (ouvre la boîte de dialogue d'impression)`,pdf:`PDF`,untitled:`Dessin SVG`,editSource:`Modifier la source SVG`,cancel:`Annuler`,applyChanges:`Appliquer les modifications`,saving:`Enregistrement...`,saveError:`⚠ Échec de l'enregistrement : {error}`,exportError:`⚠ Échec de l'exportation : {error}`,loadingSource:`Chargement de la source…`,sourceError:`Échec du chargement de la source : {error}`},photoLocations:{title:`Emplacements des photos`,summary:`{total} capturées · {withGps} avec GPS`,mapHint:`Demandez à Claude « affiche-les sur la carte » pour les tracer avec le plugin Google Map.`,loading:`Chargement…`,empty:`Aucun emplacement capturé pour le moment. Envoyez une photo avec balise GPS via le chat ou un bridge connecté pour commencer.`,noGps:`Pas de données GPS`},pluginManageSkills:{deleteProjectSkill:`Supprimer cette skill de projet`,unstarPresetSkill:`Retirer ce préréglage des favoris — il retourne au catalogue`,heading:`Skills`,previewCount:`{count} skill | {count} skills`,previewMore:`+{count} de plus`,subheading:({named:e})=>`${e(`count`)} disponibles · cliquez pour afficher · "Run" l'invoque comme /<name>`,emptyWithPath:`Aucune skill trouvée. Ajoutez des dossiers de skills sous {path}.`,emptySkillPath:`~/.claude/skills/`,selectHint:`Sélectionnez une skill à gauche pour afficher son SKILL.md.`,loading:`Chargement…`,fieldDescription:`Description`,fieldBody:`Corps (Markdown)`,emptyBody:`(corps vide)`,btnEdit:`Modifier`,btnDelete:`Supprimer`,btnUnstar:`Retirer des favoris`,errListFailed:`Échec du chargement des skills : {error}`,errDetailFailed:`Échec du chargement de la skill : {error}`,errSaveFailed:`Échec de l'enregistrement : {error}`,errDeleteFailed:`Échec de la suppression`,confirmDelete:`Supprimer la skill "{name}" ? Cela retire ~/mulmoclaude/.claude/skills/{name}/SKILL.md.`,confirmUnstar:`Remettre "{name}" dans le catalogue ? Elle ne sera plus chargée dans le prompt, mais la copie du catalogue reste — vous pouvez la remettre en favori à tout moment.`,sectionActive:`Actives`,sectionCatalog:`Catalogue`,sectionLegendActive:`Skills que Claude peut utiliser dès maintenant. Claude les utilise automatiquement dans le fil de la conversation, ou vous pouvez en invoquer une en saisissant son nom. {system} Système (mc- intégrée) / {project} Projet (modifiable, uniquement dans ce workspace) / {user} Utilisateur (skills dans ~/.claude/skills/) / {claudePlugin} Plugin (d'un plugin Claude Code installé, en lecture seule).`,sectionLegendCatalog:`Catalogue : skills qui deviennent Actives quand vous les marquez par {star}. Retirer {star} depuis Actives renvoie la skill au Catalogue — Claude cesse de l'utiliser (la skill n'est pas supprimée).`,catalogEmpty:`Aucune skill de préréglage disponible.`,catalogPresetHeading:`Préréglages`,catalogStar:`Favori`,catalogStarred:`Favoris`,sourceUserTitle:`Skill utilisateur (~/.claude/skills/, disponible dans tous les espaces)`,sourceClaudePluginTitle:`Skill de plugin (plugin Claude Code installé — en lecture seule, mis à jour par le plugin)`,sourceSystemTitle:`Skill système (incluse, préfixe mc- — lecture seule, écrasée par le launcher)`,sourceProjectTitle:`Skill de projet (.claude/skills/ de l'espace, espace courant uniquement)`,sourcePresetTitle:`Catalogue de préréglages — cliquez sur Favori pour activer dans cet espace`,errCatalogListFailed:`Échec du chargement du catalogue : {error}`,errCatalogStarFailed:`Échec de l'ajout aux favoris : {error}`,errCatalogPreviewFailed:`Échec du chargement de l'aperçu : {error}`,catalogAddRepo:`Ajouter un dépôt de skills`,catalogAddRepoTitle:`Ajouter un dépôt de skills`,catalogRepoUrlLabel:`URL GitHub`,catalogRepoUrlPlaceholder:`https://github.com/owner/repo`,catalogRepoSubpathLabel:`Sous-chemin (facultatif)`,catalogRepoSubpathPlaceholder:`skills`,catalogAddRepoSubmit:`Installer`,catalogAddRepoSuggestions:`Dépôts suggérés`,catalogUninstallRepo:`Désinstaller le dépôt`,catalogUpdateRepo:`Mettre à jour le dépôt (récupérer la dernière version)`,catalogRepoOpenLink:`Ouvrir le dépôt sur GitHub (nouvel onglet)`,catalogUninstallConfirm:`Désinstaller ce dépôt ? Les skills déjà mises en favori restent dans votre liste active.`,catalogRepoInstalling:`Installation…`,catalogRepoEmpty:`Aucune skill trouvée dans ce dépôt.`,sourceExternalTitle:`Skill externe (installée depuis un dépôt GitHub — cliquez sur l'étoile pour activer)`,errCatalogRepoListFailed:`Échec du chargement des dépôts installés : {error}`,errCatalogRepoInstallFailed:`Échec de l'installation du dépôt : {error}`,errCatalogRepoUninstallFailed:`Échec de la désinstallation du dépôt : {error}`,errCatalogRepoInvalidUrl:`Saisissez une URL de dépôt GitHub.`},pluginManageRoles:{heading:`Rôles personnalisés`,roleCount:`{count} rôle | {count} rôles`,addButton:`+ Ajouter`,createPanel:`Créer un nouveau rôle`,fieldId:`ID`,fieldName:`Nom`,fieldIcon:`Icône`,fieldPrompt:`Prompt`,fieldPlugins:`Plugins`,fieldModel:`Modèle`,modelUnset:`(non défini — suivre le réglage global)`,modelHelp:`Les sessions démarrées avec ce rôle utilisent ce modèle. Pratique pour garder un rôle routinier hors de la limite hebdomadaire de votre modèle principal. Les rôles intégrés suivent toujours le réglage global.`,fieldStarterQueries:`Questions de démarrage`,onePerLine:`(une par ligne)`,helpLink:`?`,idFormatted:`({id})`,missingEnv:`({env} manquant)`,requiresEnv:`Nécessite {env} dans .env`,collapse:`Réduire`,expand:`Développer`,idPlaceholder:`id-unique`,creating:`Création…`,create:`Créer`,updating:`Mise à jour…`,update:`Mettre à jour`,cancel:`Annuler`,delete:`Supprimer`,emptyHint:`Aucun rôle personnalisé pour le moment. Cliquez sur "+ Ajouter" ou demandez à Claude d'en créer un.`,errIdRequired:`L'ID est obligatoire.`,errIdInvalid:`L'ID ne peut contenir que des lettres, des chiffres, '-' et '_'.`,errNameRequired:`Le nom est obligatoire.`,errIdDuplicate:`Un rôle avec l'ID '{id}' existe déjà.`,errCreateFailed:`Échec de la création`,errSaveFailed:`Échec de l'enregistrement`,errDeleteFailed:`Échec de la suppression`,errNetworkError:`Erreur réseau`,errServerError:`Erreur du serveur : {status}`,errRefreshFailed:`Enregistré, mais l'actualisation de la liste a échoué.`,confirmDelete:`Supprimer le rôle « {name} » ? Cette action est irréversible.`},pluginUiImage:{promptLabel:`{label} :`},markdownCodeCopy:{copyLabel:`Copier le code`,copiedLabel:`Copié`},markdownMermaid:{loadFailed:`⚠ Échec du chargement de Mermaid : {error}`,renderFailed:`⚠ Échec du rendu Mermaid : {error}`},pluginTextResponse:{pdf:`PDF`,pdfFailed:`⚠ Échec PDF`,editContent:`Modifier le contenu texte`,applyChanges:`Appliquer les modifications`,copyLabel:`Copier`,speakerSystem:`Système`,speakerUser:`Vous`,speakerAssistant:`Assistant`,copiedLabel:`Copié !`,cancel:`Annuler`,seededByPlugin:`depuis {pkg}`,seededByPluginTooltip:`Ce message a été généré par le plugin {pkg}, et non envoyé par vous.`,truncatedForRender:`Ce message est exceptionnellement long ({total} caractères au total). Seule la première partie est affichée — {omitted} caractères masqués pour garder l'onglet réactif. Utilisez « Copier » pour obtenir le texte complet.`},pluginSkill:{noDescription:`(aucune description)`},pluginSpreadsheet:{previewUntitled:`Tableur`,previewSheets:`{count} feuille | {count} feuilles`,untitled:`Tableur`,excel:`Excel`,valuePlaceholder:`Valeur`,valueOrFormulaPlaceholder:`Valeur ou formule (ex. 100 ou SUM(B2:B11))`,formatPlaceholder:`Format (ex. $#,##0.00)`,loading:`Chargement du tableur...`,noData:`Aucune donnée de tableur disponible`,editData:`Modifier les données du tableur`,applyChanges:`Appliquer les modifications`,dataMustBeArray:`Les données doivent être un tableau de feuilles`,loadFailed:`Échec du chargement du tableur : {error}`,invalidJsonAlert:`Format JSON non valide : {error}`,unknownError:`Erreur inconnue`,update:`Mettre à jour`,stringType:`Texte`,formulaType:`Formule`},app:{startConversation:`Démarrer une conversation`,thinking:`Réflexion…`},suggestionsPanel:{suggestions:`Suggestions`,skills:`Compétences`,tooltip:`Suggestions et compétences`,emptySuggestions:`Aucune suggestion.`,emptySkills:`Aucune compétence installée.`,skillsError:`Échec du chargement des compétences : {error}`,sendEditHint:`cliquez pour envoyer · shift+clic pour modifier`},settingsToolsTab:{explanation:`Noms d'outils supplémentaires à transmettre à Claude via {allowedTools}. Un par ligne. Utile pour les serveurs MCP intégrés à Claude Code comme Gmail / Google Agenda après authentification via {claudeMcp}.`,connectorsSectionTitle:`Connecteurs actifs`,connectorsEmpty:`Aucun connecteur trouvé.`,connectorConnected:`Connecté`,connectorDisconnected:`Non connecté`,connectorsGuide:`Les connecteurs comme Slack et Gmail permettent à Claude d'accéder à vos comptes. Ajoutez ou supprimez des connecteurs depuis Claude Desktop ou configurez-les {configLink}. (Ouvre claude.ai)`,connectorsConfigLinkText:`ici`},confirmModal:{defaultTitle:`Confirmer`,defaultConfirm:`Confirmer`,defaultCancel:`Annuler`}},Blt={common:{downloadZip:`ZIP`,downloadFailed:`Download fehlgeschlagen`,save:`Speichern`,cancel:`Abbrechen`,loading:`Wird geladen...`,close:`Schließen`,dismiss:`Verwerfen`,add:`Hinzufügen`,remove:`Entfernen`,yes:`Ja`,no:`Nein`,saving:`Wird gespeichert...`,saved:`Gespeichert`,noResultsYet:`Noch keine Ergebnisse`,noImageYet:`Noch kein Bild`,sendChat:`Neuen Chat starten`},sessionTabBar:{newSession:`Neue Sitzung`,activeSessions:`{count} aktive Sitzung (Agent läuft) | {count} aktive Sitzungen (Agent läuft)`,unreadReplies:`{count} ungelesene Antwort | {count} ungelesene Antworten`,unreadDot:`Neue Antwort`,origin:{scheduler:`Vom Scheduler gestartet`,skill:`Von einer Skill gestartet`,bridge:`Von einem Bridge gestartet`}},chatInput:{placeholder:`Nachricht an Claude…`,send:`Senden`,stop:`Stoppen`,runningPlaceholder:`Läuft… Enter reiht die Nachricht ein`,removeBuffered:`Nachricht aus Warteschlange entfernen`,attachFile:`Datei anhängen`,fileTooLarge:`Datei zu groß ({sizeMB} MB). Das Maximum beträgt 30 MB.`,fileOnlyAttachment:`Inhalt nicht lesbar – wird als Datei übergeben`,readFileFailed:`Die Datei konnte nicht gelesen werden.`,attachImageFailed:`Anhängen des Bildes fehlgeschlagen: {error}`,stopFailed:`Stoppen der Ausführung fehlgeschlagen: {error}`,dropHint:`Datei zum Anhängen ablegen`,tooManyFiles:`Sie können maximal {max} Dateien gleichzeitig anhängen.`,removeAttachment:`{name} entfernen`,attachmentFallbackName:`Anhang`,voice:{start:`Spracheingabe starten`,stop:`Spracheingabe stoppen`}},cspViolation:{notice:`⚠ Eine Ansicht wollte {host} laden, aber die Content Security Policy hat es blockiert ({directive}). Zum Erlauben den Host in config/csp.json eintragen – nur wenn Sie ihm vertrauen.`,dismiss:`Schließen`},sessionHistoryPanel:{filters:{all:`Alle`,unread:`Ungelesen`,bookmarked:`Gemerkt`,longRunning:`Langlaufend (24h+)`,human:`Mensch`,scheduler:`Scheduler`,skill:`Skill`,bridge:`Bridge`},failedToRefresh:`⚠ Aktualisieren fehlgeschlagen: {error}`,showingLastKnown:` — zeigt die zuletzt bekannte Liste.`,noSessions:`Noch keine Sitzungen.`,noMatching:`Keine passenden Sitzungen.`,running:`Läuft`,noMessages:`(keine Nachrichten)`,openRowAria:`Sitzung öffnen: {preview}`,rowMenuAria:`Sitzungsaktionen`,bookmark:`Merken`,unbookmark:`Lesezeichen entfernen`,delete:`Löschen`,deleteConfirm:`Diese Sitzung löschen?
|
|
259
259
|
|
|
260
260
|
{preview}
|
|
261
261
|
|
|
262
|
-
Dies kann nicht rückgängig gemacht werden.`},notificationBell:{notifications:`Benachrichtigungen`,activeSection:`Aktiv`,historySection:`Verlauf`,noActive:`Keine aktiven Benachrichtigungen`,noHistory:`Keine kürzlichen Aktivitäten`,clearAll:`Alle löschen`,dismiss:`Verwerfen`,cancel:`Abbrechen`,showMore:`Mehr anzeigen ({count})`,showLess:`Weniger anzeigen`,openTarget:`Öffnen`,expandDetails:`Details anzeigen`},pluginDiagnostics:{title:`Plugin-Konfigurationsproblem`,hostBody:`Das Plugin „{plugin}“ hat versucht, den {label}-Schlüssel „{key}“ zu registrieren, aber er ist vom Host reserviert. Der Plugin-Eintrag wurde verworfen.`,intraBody:`Die Plugins „{first}“ und „{second}“ registrieren beide {dimension} „{key}“. „{first}“ hat ihn zuerst beansprucht, daher wird die Registrierung von „{second}“ ignoriert.`},shadowedEnv:{title:`Shell-Umgebung überschreibt .env`,body:`Sowohl in der Shell als auch in .env gesetzt: {keys}. Der Wert aus der Shell gewinnt, daher wird .env ignoriert. Wenn Sie .env bearbeitet haben, aktualisieren oder entfernen Sie den Wert in der Shell und starten Sie neu.`},optionalDeps:{title:`Optionale Abhängigkeit nicht verfügbar`,titleNotFound:`{command} ist nicht installiert`,titleNotResponding:`{command} läuft nicht`,notFound:`{command} nicht gefunden — zugehörige Funktionen wurden deaktiviert. Installieren Sie {command} und starten Sie MulmoClaude neu, um sie zu aktivieren.`,notResponding:`{command} ist installiert, läuft aber nicht — zugehörige Funktionen wurden deaktiviert. Starten Sie {command} und starten Sie MulmoClaude neu, um sie zu aktivieren.`},billingMigration:{title:`Die Rechnungsstellung wird jetzt bei Bedarf eingerichtet`,body:`Die gebündelten Sammlungen clients, worklog, invoice und profile wurden aus deinem Dashboard entfernt, deine Daten sind jedoch sicher und unverändert. Bitte um die Einrichtung der Kunden- und Zeiterfassung und anschließend der Rechnungsstellung, um sie neu zu erstellen – deine vorhandenen Datensätze werden wieder angezeigt.`},backendOffline:{title:`Backend nicht erreichbar`,body:`Der MulmoClaude-Server läuft möglicherweise nicht. Prüfe den Dev-Server und versuche es erneut.`,retry:`Erneut versuchen`},pluginErrorBoundary:{title:`Plugin {pkg} ist abgestürzt`,subtitle:`Das Plugin konnte nicht gerendert werden. Der Fehler wurde in der Konsole protokolliert.`,showDetails:`Details anzeigen`,hideDetails:`Details ausblenden`,retry:`Erneut versuchen`},remoteHostOffline:{title:`Remote-Host getrennt`,body:`Ihr Telefon kann erst nach dem erneuten Verbinden an dieses Gerät senden.`,reconnect:`Erneut verbinden`},authTokenStale:{title:`Diese Seite muss neu geladen werden`,body:`Der Server hat das Token dieser Seite abgelehnt, und ein neues konnte nicht abgerufen werden. Laden Sie die Seite neu, um fortzufahren.`,reload:`Neu laden`},remoteHost:{title:`Remote-Host`,online:`Remote-Host online`,offline:`Remote-Host offline`,uid:`uid {uid}`,signIn:`Mit Google anmelden`,connecting:`Verbinden…`,disconnect:`Trennen`,disconnecting:`Wird getrennt…`,noToken:`Google-Anmeldung hat kein idToken zurückgegeben`,connectFailed:`Verbindung fehlgeschlagen`,disconnectFailed:`Trennen fehlgeschlagen`,signInFailed:`Google-Anmeldung fehlgeschlagen`,statusFailed:`Status konnte nicht geladen werden`,description:`Mit Remote-Zugriff kann ein Mobilgerät auf die Sammlungen und Feeds dieser MulmoClaude-Instanz zugreifen.`,howTo:`Öffne auf deinem Smartphone {url} und melde dich mit demselben Google-Konto an.`,customViewHint:`Für eine mobiltaugliche Ansicht bitte Claude, statt einer normalen Custom View eine {keyword} zu bauen.`,qrHint:`Oder scanne diesen QR-Code mit der Handykamera.`},sessionModelChip:{tooltip:`Modell dieser Sitzung: {model}`,tooltipOverride:`Modell dieses Chats: {model} (überschreibt Rolle / globale Einstellung)`,ariaLabel:`Modell dieses Chats`,clear:`Zurück zum Standard`,unknown:`unbekannt`,inherited:`{model} (geerbt)`},sidebarHeader:{newMessages:`Neue Nachrichten`,home:`Zum neuesten Chat`,toolCallHistory:`Tool-Aufrufverlauf`,settings:`Einstellungen`,settingsGeminiMissing:`Einstellungen — Gemini-API-Schlüssel fehlt`,todayJournal:`Heutige Zusammenfassung`,todayJournalNotFound:`Noch keine Zusammenfassung — chatte etwas und das Journal erstellt eine.`,todayJournalLoadFailed:`Journal konnte nicht geladen werden (Status {status}): {error}`,copyMarkdown:`Chat als Markdown kopieren`,copiedMarkdown:`Kopiert!`},rightSidebar:{permalink:`Permalink zur ausgewählten Nachricht`,copyPermalink:`Permalink zur ausgewählten Nachricht kopieren`,copiedPermalink:`Kopiert!`,toggleSystemPrompt:`System-Prompt umschalten`,systemPrompt:`System-Prompt`,availableTools:`Verfügbare Tools`,toggleToolDescription:`Tool-Beschreibung umschalten`,toolCallHistory:`Tool-Aufrufverlauf`,copyHistory:`Tool-Aufrufverlauf kopieren`,copiedHistory:`Kopiert!`,noToolCalls:`Noch keine Tool-Aufrufe`,arguments:`Argumente`,error:`Fehler`,result:`Ergebnis`,running:`Läuft...`,mcpHint:{title:e=>`Einrichtungshinweis: ${e.named(`server`)}`,requiredKeys:`Erforderliche Schlüssel`,setupGuide:`Einrichtungsanleitung öffnen`}},fileTreePane:{sort:`Sortieren:`,sortByName:`Nach Name sortieren`,name:`Name`,sortByRecent:`Nach Änderungsdatum sortieren (neueste zuerst)`,recent:`Zuletzt`,reference:`Referenz`,readOnlyBadge:`RO`,showSystemFiles:`Systemdateien anzeigen`,showSystemFilesTitle:`Zeigt agent-interne Top-Level-Verzeichnisse (conversations/, feeds/ usw.) zusätzlich zu den Nutzer-Daten (data/, artifacts/, config/) an.`},fileTree:{dropHint:`Dateien hier ablegen, um sie in diesem Ordner zu speichern`,upload:{progress:`Hochladen {done} von {total}…`,done:`{count} Datei(en) gespeichert`,failed:`{count} Datei(en) konnten nicht gespeichert werden`},workspace:`(Arbeitsbereich)`,recentlyChanged:`Kürzlich geändert`,newFileMenuItem:`Neue Datei`,newFileInputAria:`Name der neuen Datei`,newFilePlaceholder:{wikiPage:`seiten-slug`,summary:`zusammenfassungsname`,document:`dokumentname`,html:`seitenname`,story:`story-name`},newFileError:{empty:`Der Dateiname darf nicht leer sein.`,unsafe:`Der Dateiname enthält ungültige Zeichen.`,exists:`Eine Datei mit dem Namen {filename} existiert hier bereits.`,saveFailed:`Datei konnte nicht erstellt werden. Bitte erneut versuchen.`}},lockStatusPopup:{sandboxEnabledTooltip:`Sandbox aktiviert (Docker)`,noSandboxTooltip:`Keine Sandbox (Docker nicht gefunden)`,sandboxEnabledLabel:`Sandbox aktiviert:`,sandboxEnabledBody:`Docker läuft. Der Dateisystemzugriff ist isoliert.`,noSandboxLabel:`Keine Sandbox:`,noSandboxBodyPrefix:`Claude kann auf alle Dateien auf Ihrem Rechner zugreifen. Installieren Sie`,noSandboxBodySuffix:`, um die Dateisystem-Isolation zu aktivieren.`,dockerDesktop:`Docker Desktop`,hostCredentials:`Angehängte Host-Zugangsdaten:`,credsLoading:`wird geladen…`,sshAgent:`SSH-Agent:`,forwarded:`weitergeleitet`,notForwarded:`nicht weitergeleitet`,mountedConfigs:`Eingebundene Konfigurationen:`,none:`keine`,testIsolation:`Sandbox-Isolation testen:`},settingsModal:{title:`Einstellungen`,version:`MulmoClaude v{version}`,tabs:{gemini:`Gemini-API-Schlüssel`,tools:`Erlaubte Tools`,mcp:`MCP-Server`,dirs:`Verzeichnisse`,refs:`Referenzverzeichnisse`,map:`Karte`,photos:`Fotos`,google:`Google`,model:`Modell`,voice:`Sprache`,chatIndex:`Chat-Index`,journal:`Journal`,notifications:`Web Push`,skills:`Skills`,roles:`Rollen`,quit:`Beenden`},groups:{llm:`LLM`,servers:`Server`,workspace:`Arbeitsbereich`,notifications:`Benachrichtigungen`,plugins:`Plugins`,management:`Verwaltung`,server:`Server`},navAriaLabel:`Einstellungsbereiche`,googleTab:{description:`Verknüpfe dein Google-Konto, damit dieser Rechner Google-APIs direkt aufrufen kann (zuerst Kalender). Das Refresh-Token wird nur auf diesem Rechner gespeichert und außer an Google an keinen Server gesendet.`,statusLinked:`Verknüpft`,statusNotLinked:`Nicht verknüpft`,statusPending:`Warte auf Abschluss der Einwilligung im Browser…`,connect:`Google-Konto verknüpfen`,unlink:`Verknüpfung aufheben`,unlinkConfirm:`Google-Konto-Verknüpfung aufheben? Das gespeicherte Token wird widerrufen und von diesem Rechner gelöscht.`,clientSecretAmbiguous:`In ~/.secrets/ wurden mehrere client_secret_*.json-Dateien gefunden. Behalte genau eine, damit das gespeicherte Token dem richtigen OAuth-Client zugeordnet bleibt.`,loadError:`Der Google-Verknüpfungsstatus konnte nicht geladen werden.`,connectError:`Der Google-Autorisierungsablauf konnte nicht gestartet werden.`,unlinkError:`Die Google-Verknüpfung konnte nicht aufgehoben werden.`},geminiTab:{required:`Die Bildgenerierung erfordert {envKey}. Fügen Sie den Schlüssel unten ein und speichern Sie ihn.`,apiKeyLabel:`Gemini-API-Schlüssel`,apiKeyPlaceholder:`AIza…`,helperText:`Erstellen oder kopieren Sie einen Schlüssel in {studioLink}.`,storageNote:`Wird nur auf diesem Rechner gespeichert, außerhalb des Workspace, und ist nur für Sie lesbar. Er wirkt sofort — ohne Neustart.`,storedHere:`In der App gespeichert`,storedInEnvironment:`Kommt aus der Umgebung`,notConfigured:`Nicht konfiguriert`,clear:`Löschen`,fromEnvironment:`Dieser Schlüssel kommt aus der Shell, die die App gestartet hat, oder aus {envFile}. Ein hier gespeicherter Schlüssel hat Vorrang.`,loadError:`Schlüsselstatus konnte nicht geladen werden`,saveError:`Schlüssel konnte nicht gespeichert werden`,clearError:`Schlüssel konnte nicht gelöscht werden`},mapTab:{description:`Legt den Google-Maps-API-Schlüssel fest, den das Karten-Plugin verwendet. Der Schlüssel wird lokal gespeichert und nur an Google Maps gesendet.`,apiKeyLabel:`Google-Maps-API-Schlüssel`,apiKeyPlaceholder:`AIza…`,helperText:`Erstelle oder kopiere einen Schlüssel aus {consoleLink}.`,requiredApis:`Erforderliche APIs: Maps JavaScript API, Geocoding API, Places API (New), Directions API.`,configured:`Konfiguriert`,notConfigured:`Nicht konfiguriert`,clear:`Löschen`,loadError:`Einstellungen konnten nicht geladen werden`,saveError:`Speichern fehlgeschlagen`},photosTab:{description:`Datenschutzeinstellungen für Fotos, die per Chat oder verbundener Bridge empfangen wurden. EXIF-Standortdaten sind sensibel — Häkchen entfernen, um die automatische Erfassung zu deaktivieren.`,autoCaptureLabel:`Fotostandort automatisch erfassen`,autoCaptureHint:`Aktiv: Für jedes hochgeladene Bild mit EXIF-GPS wird ein Standort-Sidecar in data/locations/ erzeugt. Aus: Es wird nichts automatisch erfasst; das LLM kann EXIF weiterhin auf Anforderung lesen.`,statusOn:`Automatische Erfassung AN`,statusOff:`Automatische Erfassung AUS`,loadError:`Einstellungen konnten nicht geladen werden`,saveError:`Speichern fehlgeschlagen`},quitTab:{description:`Beendet den MulmoClaude-Server auf diesem Rechner. Über das Symbol gestartet, läuft er weiter, auch wenn du diesen Tab schließt — hier beendest du ihn ohne Terminal.`,restartHint:()=>"Zum erneuten Starten doppelklicke auf das MulmoClaude-Symbol (oder führe `npx mulmoclaude@latest` aus).",quitLabel:`MulmoClaude beenden`,confirmBody:`Der Server hält an und diese Seite funktioniert nicht mehr. Laufende Vorgänge werden abgebrochen.`,confirmLabel:`Beenden`,stopping:`Wird beendet…`,stoppedTitle:`MulmoClaude wurde beendet`,stoppedBody:`Du kannst diesen Tab schließen. Doppelklicke auf das Symbol, um neu zu starten.`,error:`Server konnte nicht beendet werden`},notificationsTab:{description:`Erhalte eine Push-Benachrichtigung auf deinen registrierten Geräten, wenn eine hier gestartete Aufgabe abgeschlossen ist — praktisch, wenn du etwas fragst, weggehst und wissen willst, sobald die Antwort fertig ist.`,enableLabel:`Web Push senden, wenn eine Aufgabe abgeschlossen ist`,enableHint:`Wird ausgelöst, wenn ein hier gestarteter Chat abgeschlossen ist. Geplante und Hintergrundaufgaben lösen es nicht aus.`,remoteHostNote:`Erfordert die RemoteHost-Verbindung (sie liefert die Anmeldung) und mindestens ein registriertes Gerät. Fehlt eines davon, passiert nichts.`,macosRemindersLabel:`Bei Aufgabenende eine macOS-Erinnerung anlegen`,macosRemindersHint:`Legt die erledigte Aufgabe in deiner Standard-Erinnerungsliste an. Die iCloud-Synchronisierung spiegelt sie auf dein iPhone, das die Mitteilung zustellt.`,macosRemindersForcedOff:`Beim Start durch --disable-macos-reminders oder DISABLE_MACOS_REMINDER_NOTIFICATIONS deaktiviert. Entferne die Option oder die Umgebungsvariable und starte neu, um sie hier zu steuern.`,statusOn:`Web Push ist AN`,statusOff:`Web Push ist AUS`,loadError:`Einstellungen konnten nicht geladen werden`,saveError:`Speichern fehlgeschlagen`},modelTab:{description:`Wählt das Modell und den Reasoning-Effort, die Claude Code pro Zug verwendet. Ohne Einstellung bleibt die Auflösung durch Claude selbst bestehen.`,modelLabel:`Modell`,modelUnset:`(nicht gesetzt — ~/.claude/settings.json folgen)`,modelHelperText:`Ohne Einstellung stammt das Modell aus ~/.claude/settings.json — dieselbe Datei, in die andere Claude-Code-Clients (VS Code, Cursor) ihre /model-Auswahl schreiben; eine Umstellung dort ändert also auch MulmoClaude. Aliase folgen der jeweils neuesten Generation einer Familie.`,modelConfigured:`Modell: {model}`,modelNotConfigured:`Nicht gesetzt (geteilt)`,effortLabel:`Reasoning-Effort`,effortUnset:`(nicht gesetzt — Standard von Claude verwenden)`,helperText:`Höhere Stufen erlauben mehr Denkzeit, erhöhen aber Latenz und Token-Verbrauch.`,configured:`Effort: {level}`,notConfigured:`Nicht gesetzt`,userSettingsLabel:`Benutzereinstellungen und Plugins von Claude Code laden`,userSettingsHint:`Liest Skills, Plugins und Hooks aus ~/.claude – dieselben, die Claude Code verwendet. Schalten Sie dies aus, wenn installierte Plugins so viele Skills mitbringen, dass jede Anfrage schwer wird; die Skills des Workspace bleiben nutzbar. Gilt ab der nächsten Nachricht. Ausgeschaltet folgt ein nicht gesetztes Modell auch nicht mehr ~/.claude/settings.json.`,skillListingSummary:`Im letzten Durchgang geladene Skills: {count}.`,skillListingPlugins:`Aus Plugins: {plugins}.`,skillListingHeavy:`So viele Skills machen jede Anfrage schwer; ausschalten entfernt die aus ~/.claude.`,loadError:`Einstellungen konnten nicht geladen werden`,saveError:`Speichern fehlgeschlagen`},voiceTab:{description:`Diktieren Sie Chat-Nachrichten mit Ihrer Stimme. Das Audio wird lokal auf dem Rechner transkribiert, der MulmoClaude ausführt — nichts wird an einen externen Dienst gesendet.`,requirements:`Nur unter macOS verfügbar. Erfordert den whisper.cpp-Server — bauen Sie ihn mit yarn build:whisper (siehe Abschnitt Local Voice Input in der README).`,unsupported:`Spracheingabe erfordert macOS mit installiertem whisper.cpp-Server. Auf diesem Rechner ist sie nicht verfügbar.`,enableLabel:`Spracheingabe aktivieren`,enableHint:`Beim Aktivieren wird das Sprachmodell (1–3 GB) einmalig heruntergeladen. Anschließend erscheint eine Mikrofon-Schaltfläche im Chat-Eingabefeld.`,modelLabel:`Sprachmodell`,downloading:`Modell wird heruntergeladen… {percent}%`,ready:`Modell bereit`,downloadError:`Modell-Download fehlgeschlagen.`,retry:`Erneut versuchen`,loadError:`Einstellungen konnten nicht geladen werden`,saveError:`Speichern fehlgeschlagen`},chatIndexTab:{description:`Automatische KI-Titel und Zusammenfassungen für den Chat-Verlauf. Standardmäßig aus — Automatisierungs-Sessions (Scheduler / System-Worker) werden auch bei aktivierter Option immer übersprungen; menschliche Sessions kosten pro beendetem Turn genau einen Summarizer-Aufruf.`,modeLabel:`Chat-Index-Modell`,helperText:`Haiku ist günstiger; Sonnet liefert schärfere Titel bei langen, themenwechselnden Sessions.`,mode:{off:`Aus`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Indizierung ist AUS`,haiku:`Indizierung läuft mit Haiku`,sonnet:`Indizierung läuft mit Sonnet`},loadError:`Einstellungen konnten nicht geladen werden`,saveError:`Speichern fehlgeschlagen`},journalTab:{description:`Automatisiertes Tages-Journal — fasst kürzliche Chat-Sessions in journal/*.md zusammen und extrahiert dauerhafte Memory-Notizen. Standardmäßig aus. Automatisierungs-Sessions (Scheduler / System-Worker) werden unabhängig von dieser Einstellung immer ausgeschlossen.`,modeLabel:`Journal-Modell`,helperText:`Haiku ist günstiger; Sonnet liefert reichhaltigere Tages- und Themen-Zusammenfassungen. Der stündliche Lauf startet nur, wenn dies gesetzt ist.`,mode:{off:`Aus`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Journal ist AUS`,haiku:`Journal läuft mit Haiku`,sonnet:`Journal läuft mit Sonnet`},loadError:`Einstellungen konnten nicht geladen werden`,saveError:`Speichern fehlgeschlagen`},geminiAskButton:`Claude fragen`,geminiAskMessage:`Welche Rolle spielt der Gemini-API-Schlüssel in dieser App?`,toolNamesLabel:`Tool-Namen`,invalidToolNamesPrefix:`Diese sehen nicht standardmäßig aus (erwartetes Präfix`,invalidToolNamesSuffix:`):`,mcpToolsError:`⚠ MCP-Tool-Status konnte nicht abgerufen werden: {error}. Alle Tools werden unabhängig von der Aktivierung angezeigt.`,changesHint:`Änderungen werden bei der nächsten Nachricht wirksam. Kein Neustart erforderlich.`,cannotSaveTooltip:`Kann nicht gespeichert werden, bis die Einstellungen erfolgreich geladen sind`,saving:`Wird gespeichert…`,loadingLabel:`Wird geladen…`,unsavedMarker:`●`,unsavedToolsConfirm:`Allowed Tools enthält ungespeicherte Änderungen. Trotzdem schließen?`,unsavedMcpDraftConfirm:`Ein MCP-Server-Entwurf ist noch offen. Trotzdem schließen?`,mcpSaveFailed:`Änderungen an den MCP-Servern konnten nicht gespeichert werden.`},canvasViewToggle:{stackViewTooltip:`Stapelansicht · klicken, um zur Einzelansicht zu wechseln`,singleViewTooltip:`Einzelansicht · klicken, um zur Stapelansicht zu wechseln`,switchToSingle:`Zur Einzelansicht wechseln`,switchToStack:`Zur Stapelansicht wechseln`},sessionHistoryToggle:{showTooltip:`Sitzungsverlauf-Panel links anzeigen`,hideTooltip:`Sitzungsverlauf-Panel ausblenden`,show:`Sitzungsverlauf anzeigen`,hide:`Sitzungsverlauf ausblenden`},sessionHistoryExpand:{expandTooltip:`Sitzungsverlauf-Panel auf volle Breite erweitern`,collapseTooltip:`Sitzungsverlauf-Panel verkleinern`,expand:`Sitzungsverlauf erweitern`,collapse:`Sitzungsverlauf verkleinern`},settingsWorkspaceDirs:{explanation:`Benutzerdefinierte Verzeichnisse zur Organisation von Dateien unter {dataDir} und {artifactsDir}. Claude nutzt sie, um das Speichern von Dateien zu steuern.`,noEntries:`Keine benutzerdefinierten Verzeichnisse konfiguriert.`,addDirTitle:`Verzeichnis hinzufügen`,pathPlaceholder:`data/kunden oder artifacts/berichte`,descPlaceholder:`Beschreibung (was in diesen Ordner gehört)`,errPathRequired:`Pfad ist erforderlich`,errMustStartWith:`Muss mit data/ oder artifacts/ beginnen`,errAlreadyExists:`Existiert bereits`},settingsReferenceDirs:{explanation:`Externe Verzeichnisse, die Claude lesen, aber nicht ändern kann. Im Docker-Modus werden sie schreibgeschützt eingebunden. Nützlich, um Obsidian-Vaults, Projektcode oder Dokumentordner zu referenzieren.`,noEntries:`Keine Referenzverzeichnisse konfiguriert.`,addDirTitle:`Referenzverzeichnis hinzufügen`,pathPlaceholder:`/Users/ich/ObsidianVault oder ~/Dokumente/notizen`,labelPlaceholder:`Label (optional — Standardwert ist der Ordnername)`,readOnlyBadge:`schreibgeschützt`,errPathRequired:`Pfad ist erforderlich`,errMustBeAbsolute:`Muss ein absoluter Pfad sein oder mit ~/ beginnen`,errAlreadyExists:`Existiert bereits`,errLabelConflict:`Label "{label}" existiert bereits`},dashboard:{empty:`Noch keine Lieblingssammlungen.`,emptyHint:`Hefte eine Sammlung (★) an, um sie hier zu sehen.`,viewTable:`Tabelle`,viewCalendar:`Kalender`,viewKanban:`Kanban`,viewPickerLabel:`Ansicht wählen`,openFull:`Zum Öffnen der Vollansicht doppelklicken`,dragHint:`Zum Neuordnen ziehen`,resizeHint:`Zum Ändern der Höhe ziehen`},pluginLauncher:{chat:{label:`Chat`},dashboard:{label:`Dashboard`},automations:{label:`Aktionen`},wiki:{label:`Wiki`},collections:{label:`Sammlungen`},feeds:{label:`Feeds`},accounting:{label:`Buchhaltung`},files:{label:`Dateien`}},shortcuts:{pin:`An Launcher anheften`,unpin:`Vom Launcher lösen`,zoneAriaLabel:`Angeheftete Verknüpfungen`,reorder:{open:`Verknüpfungen neu anordnen`,title:`Neu anordnen`,moveUp:`Nach oben`,moveDown:`Nach unten`}},fileContentHeader:{showRendered:`Gerendertes Markdown anzeigen`,showRaw:`Rohquelltext anzeigen`,rendered:`Gerendert`,raw:`Roh`,closeFile:`Datei schließen`,revealInOs:`Im Ordner anzeigen`,revealInOsFailed:`Ordner konnte nicht geöffnet werden`},fileContentRenderer:{download:`ZIP`,downloadZip:`Als eigenständiges ZIP herunterladen (Assets gebündelt)`,downloadError:`Download fehlgeschlagen`,selectFile:`Datei auswählen`,htmlPreview:`HTML-Vorschau`,pdfPreview:`PDF-Vorschau`,parseError:`Parse-Fehler`,editJson:`JSON bearbeiten`,jsonEditorLabel:`JSON-Editor`,invalidJson:`Ungültiges JSON`,undo:`Rückgängig`,redo:`Wiederholen`,editMarp:`Folienquelle bearbeiten`,marpEditorLabel:`Marp-Folienquelle`,openInOs:`Im Betriebssystem oeffnen`,openingInOs:`Wird geoeffnet…`,openInOsFailed:`Konnte nicht im Betriebssystem geoeffnet werden`,downloadFile:`Herunterladen`,downloadingFile:`Wird heruntergeladen…`},filesView:{chatPlaceholder:`Frage zu dieser Datei stellen…`},systemFiles:{schemaLabel:`Schema`,showDetails:`Details anzeigen`,hideDetails:`Details ausblenden`,editPolicy:{"agent-managed-but-hand-editable":`Agent-verwaltet (manuelle Bearbeitung erlaubt)`,"user-editable":`Benutzer-bearbeitbar`,"agent-managed":`Agent-verwaltet`,"fragile-format":`Empfindliches Format`,ephemeral:`Flüchtig`},mcp:{title:`MCP-Server`,summary:`Externe Model-Context-Protocol-Server, die mit dem Agenten verbunden sind. HTTP- oder Stdio-Server hinzufügen, um die Werkzeugauswahl zu erweitern.`},settings:{title:`App-Einstellungen`,summary:`Vom Benutzer bearbeitbare Verhaltenseinstellungen — Gemini-API-Schlüssel, erlaubte Werkzeuge, Sandbox-Konfiguration usw.`},schedulerTasks:{title:`Scheduler-Aufgaben`,summary:`Wiederkehrende Agent-Automationen, die nach Zeitplan ausgelöst werden. Verwaltet über die Automations-UI; diese Datei ist die Quelle auf Festplatte.`},schedulerOverrides:{title:`Scheduler-Überschreibungen`,summary:`Pro-Aufgabe Zeit-/Intervall-Überschreibungen über dem Systemzeitplan. Der Agent bearbeitet dies, wenn du den Zeitpunkt einer wiederkehrenden Aufgabe änderst.`},schedulerItems:{title:`Scheduler-Item-Warteschlange`,summary:`Geplante Aufrufe, die zur Auslösung bereitstehen. Agent-verwaltet; nicht von Hand bearbeiten, ohne jedes Feld zu verstehen.`},wikiIndex:{title:`Wiki-Index`,summary:`Automatisch erzeugter Index aller Wiki-Seiten. Wird bei jeder Wiki-Bearbeitung aktualisiert; nicht von Hand bearbeiten (Änderungen werden überschrieben).`},wikiLog:{title:`Wiki-Bearbeitungsprotokoll`,summary:`Aktivitätsprotokoll der Erstellungs- und Bearbeitungsvorgänge im Wiki. Agent-verwaltet und nur anhängend — nützlich als Feed der letzten Änderungen.`},wikiSummary:{title:`Wiki-Übersicht`,summary:`Automatisch erzeugte Übersicht des Wikis — Themencluster, Seitenzahl, jüngste Aktivitäten. Vom Agenten aktualisiert.`},wikiSchema:{title:`Wiki-Schema`,summary:`Formatspezifikation, die der Agent liest, um Wiki-Seiten konsistent zu halten. Empfindlich — eine bestimmte Struktur wird erwartet; bevorzuge Agent-getriebene Bearbeitung.`},memory:{title:`Memory`,summary:`Destillierte Fakten über dich, immer als Kontext für neue Gespräche geladen. Der Journal-Extraktor hängt automatisch an; manuelle Bearbeitung ebenfalls möglich.`},summariesIndex:{title:`Zusammenfassungs-Index`,summary:`Durchsuchbarer Index, der zu den vom Journal erzeugten Tages- und Themen-Zusammenfassungen verlinkt. Agent-verwaltet; bei jedem Journal-Lauf aktualisiert.`},rolesJson:{title:`Rollendefinition (JSON)`,summary:`Rollenkonfiguration — Modellauswahl, MCP-Server, erlaubte Plugins, Anfragen-Vorschläge. Vom Benutzer bearbeitbar, kein Neustart nötig.`},rolesMd:{title:`Rollenbeschreibung (Markdown)`,summary:`Persona und System-Prompt-Text der Rolle, geladen als Kontext, wenn diese Rolle aktiv ist. Vom Benutzer bearbeitbar; Änderungen wirken ab der nächsten Nachricht.`},journalDaily:{title:`Tägliche Journal-Zusammenfassung`,summary:`Automatisch erzeugte Rückschau auf deine Aktivitäten an einem Kalendertag, vom Journal-Lauf aus den Chat-Sitzungen destilliert.`},journalTopic:{title:`Themen-Journal`,summary:`Langlaufende Notizen zu einem bestimmten Thema, gesammelt und überarbeitet, während du weiter darüber sprichst. Agent-verwaltet.`}},settingsMcpTab:{explanation:`Externe MCP-Server hinzufügen. HTTP-Server funktionieren in allen Modi. Stdio-Server nutzen {npx} / {node} / {tsx} aus dem Sandbox-Image; wenn Docker aktiviert ist, müssen die Pfade im Workspace liegen.`,localhostRewrite:`Im Docker-Modus wird {localhost} zu {hostDockerInternal} umgeschrieben.`,noServers:`Noch keine MCP-Server konfiguriert.`,enabled:`aktiviert`,urlLabel:`URL:`,commandLabel:`Befehl:`,dockerStdioUnsupported:`⚠ Wird nicht ausgeführt, solange die Docker-Sandbox aktiv ist.`,dockerStdioHostExecActive:`⚠ Läuft auf dem Host — dieser Server verlässt die Docker-Sandbox.`,dockerStdioHostExecOptIn:`Trotzdem auf dem Host ausführen (fortgeschritten). Dieser Server läuft über ein lokales HTTP-Gateway außerhalb der Docker-Sandbox und kann auf Ihren Rechner zugreifen.`,learnMore:`Mehr erfahren`,addServerButton:`+ MCP-Server hinzufügen`,nameLabel:`Name`,namePlaceholder:`mein-server`,typeHttp:`HTTP`,typeStdio:`Stdio (Befehl)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`Befehl`,argsLabel:`Argumente (eins pro Zeile)`,argsPlaceholder:()=>`-y
|
|
262
|
+
Dies kann nicht rückgängig gemacht werden.`},notificationBell:{notifications:`Benachrichtigungen`,activeSection:`Aktiv`,historySection:`Verlauf`,noActive:`Keine aktiven Benachrichtigungen`,noHistory:`Keine kürzlichen Aktivitäten`,clearAll:`Alle löschen`,dismiss:`Verwerfen`,cancel:`Abbrechen`,showMore:`Mehr anzeigen ({count})`,showLess:`Weniger anzeigen`,openTarget:`Öffnen`,expandDetails:`Details anzeigen`},pluginDiagnostics:{title:`Plugin-Konfigurationsproblem`,hostBody:`Das Plugin „{plugin}“ hat versucht, den {label}-Schlüssel „{key}“ zu registrieren, aber er ist vom Host reserviert. Der Plugin-Eintrag wurde verworfen.`,intraBody:`Die Plugins „{first}“ und „{second}“ registrieren beide {dimension} „{key}“. „{first}“ hat ihn zuerst beansprucht, daher wird die Registrierung von „{second}“ ignoriert.`},shadowedEnv:{title:`Shell-Umgebung überschreibt .env`,body:`Sowohl in der Shell als auch in .env gesetzt: {keys}. Der Wert aus der Shell gewinnt, daher wird .env ignoriert. Wenn Sie .env bearbeitet haben, aktualisieren oder entfernen Sie den Wert in der Shell und starten Sie neu.`},optionalDeps:{title:`Optionale Abhängigkeit nicht verfügbar`,titleNotFound:`{command} ist nicht installiert`,titleNotResponding:`{command} läuft nicht`,notFound:`{command} nicht gefunden — zugehörige Funktionen wurden deaktiviert. Installieren Sie {command} und starten Sie MulmoClaude neu, um sie zu aktivieren.`,notResponding:`{command} ist installiert, läuft aber nicht — zugehörige Funktionen wurden deaktiviert. Starten Sie {command} und starten Sie MulmoClaude neu, um sie zu aktivieren.`},billingMigration:{title:`Die Rechnungsstellung wird jetzt bei Bedarf eingerichtet`,body:`Die gebündelten Sammlungen clients, worklog, invoice und profile wurden aus deinem Dashboard entfernt, deine Daten sind jedoch sicher und unverändert. Bitte um die Einrichtung der Kunden- und Zeiterfassung und anschließend der Rechnungsstellung, um sie neu zu erstellen – deine vorhandenen Datensätze werden wieder angezeigt.`},backendOffline:{title:`Backend nicht erreichbar`,body:`Der MulmoClaude-Server läuft möglicherweise nicht. Prüfe den Dev-Server und versuche es erneut.`,retry:`Erneut versuchen`},pluginErrorBoundary:{title:`Plugin {pkg} ist abgestürzt`,subtitle:`Das Plugin konnte nicht gerendert werden. Der Fehler wurde in der Konsole protokolliert.`,showDetails:`Details anzeigen`,hideDetails:`Details ausblenden`,retry:`Erneut versuchen`},remoteHostOffline:{title:`Remote-Host getrennt`,body:`Ihr Telefon kann erst nach dem erneuten Verbinden an dieses Gerät senden.`,reconnect:`Erneut verbinden`},authTokenStale:{title:`Diese Seite muss neu geladen werden`,body:`Der Server hat das Token dieser Seite abgelehnt, und ein neues konnte nicht abgerufen werden. Laden Sie die Seite neu, um fortzufahren.`,reload:`Neu laden`},remoteHost:{title:`Remote-Host`,online:`Remote-Host online`,offline:`Remote-Host offline`,uid:`uid {uid}`,signIn:`Mit Google anmelden`,connecting:`Verbinden…`,disconnect:`Trennen`,disconnecting:`Wird getrennt…`,noToken:`Google-Anmeldung hat kein idToken zurückgegeben`,connectFailed:`Verbindung fehlgeschlagen`,disconnectFailed:`Trennen fehlgeschlagen`,signInFailed:`Google-Anmeldung fehlgeschlagen`,statusFailed:`Status konnte nicht geladen werden`,description:`Mit Remote-Zugriff kann ein Mobilgerät auf die Sammlungen und Feeds dieser MulmoClaude-Instanz zugreifen.`,howTo:`Öffne auf deinem Smartphone {url} und melde dich mit demselben Google-Konto an.`,customViewHint:`Für eine mobiltaugliche Ansicht bitte Claude, statt einer normalen Custom View eine {keyword} zu bauen.`,qrHint:`Oder scanne diesen QR-Code mit der Handykamera.`},sessionModelChip:{tooltip:`Modell dieser Sitzung: {model}`,tooltipOverride:`Modell dieses Chats: {model} (überschreibt Rolle / globale Einstellung)`,ariaLabel:`Modell dieses Chats`,clear:`Zurück zum Standard`,unknown:`unbekannt`,inherited:`{model} (geerbt)`},sidebarHeader:{newMessages:`Neue Nachrichten`,home:`Zum neuesten Chat`,toolCallHistory:`Tool-Aufrufverlauf`,settings:`Einstellungen`,settingsGeminiMissing:`Einstellungen — Gemini-API-Schlüssel fehlt`,todayJournal:`Heutige Zusammenfassung`,todayJournalNotFound:`Noch keine Zusammenfassung — chatte etwas und das Journal erstellt eine.`,todayJournalLoadFailed:`Journal konnte nicht geladen werden (Status {status}): {error}`,copyMarkdown:`Chat als Markdown kopieren`,copiedMarkdown:`Kopiert!`},rightSidebar:{permalink:`Permalink zur ausgewählten Nachricht`,copyPermalink:`Permalink zur ausgewählten Nachricht kopieren`,copiedPermalink:`Kopiert!`,toggleSystemPrompt:`System-Prompt umschalten`,systemPrompt:`System-Prompt`,availableTools:`Verfügbare Tools`,toggleToolDescription:`Tool-Beschreibung umschalten`,toolCallHistory:`Tool-Aufrufverlauf`,copyHistory:`Tool-Aufrufverlauf kopieren`,copiedHistory:`Kopiert!`,noToolCalls:`Noch keine Tool-Aufrufe`,arguments:`Argumente`,error:`Fehler`,result:`Ergebnis`,running:`Läuft...`,mcpHint:{title:e=>`Einrichtungshinweis: ${e.named(`server`)}`,requiredKeys:`Erforderliche Schlüssel`,setupGuide:`Einrichtungsanleitung öffnen`}},fileTreePane:{sort:`Sortieren:`,sortByName:`Nach Name sortieren`,name:`Name`,sortByRecent:`Nach Änderungsdatum sortieren (neueste zuerst)`,recent:`Zuletzt`,reference:`Referenz`,readOnlyBadge:`RO`,showSystemFiles:`Systemdateien anzeigen`,showSystemFilesTitle:`Zeigt agent-interne Top-Level-Verzeichnisse (conversations/, feeds/ usw.) zusätzlich zu den Nutzer-Daten (data/, artifacts/, config/) an.`},fileTree:{dropHint:`Dateien hier ablegen, um sie in diesem Ordner zu speichern`,upload:{progress:`Hochladen {done} von {total}…`,done:`{count} Datei(en) gespeichert`,failed:`{count} Datei(en) konnten nicht gespeichert werden`},workspace:`(Arbeitsbereich)`,recentlyChanged:`Kürzlich geändert`,newFileMenuItem:`Neue Datei`,newFileInputAria:`Name der neuen Datei`,newFilePlaceholder:{wikiPage:`seiten-slug`,summary:`zusammenfassungsname`,document:`dokumentname`,html:`seitenname`,story:`story-name`},newFileError:{empty:`Der Dateiname darf nicht leer sein.`,unsafe:`Der Dateiname enthält ungültige Zeichen.`,exists:`Eine Datei mit dem Namen {filename} existiert hier bereits.`,saveFailed:`Datei konnte nicht erstellt werden. Bitte erneut versuchen.`}},lockStatusPopup:{sandboxEnabledTooltip:`Sandbox aktiviert (Docker)`,noSandboxTooltip:`Keine Sandbox (Docker nicht gefunden)`,sandboxEnabledLabel:`Sandbox aktiviert:`,sandboxEnabledBody:`Docker läuft. Der Dateisystemzugriff ist isoliert.`,noSandboxLabel:`Keine Sandbox:`,noSandboxBodyPrefix:`Claude kann auf alle Dateien auf Ihrem Rechner zugreifen. Installieren Sie`,noSandboxBodySuffix:`, um die Dateisystem-Isolation zu aktivieren.`,dockerDesktop:`Docker Desktop`,hostCredentials:`Angehängte Host-Zugangsdaten:`,credsLoading:`wird geladen…`,sshAgent:`SSH-Agent:`,forwarded:`weitergeleitet`,notForwarded:`nicht weitergeleitet`,mountedConfigs:`Eingebundene Konfigurationen:`,none:`keine`,testIsolation:`Sandbox-Isolation testen:`},settingsModal:{title:`Einstellungen`,version:`MulmoClaude v{version}`,tabs:{gemini:`Gemini-API-Schlüssel`,tools:`Erlaubte Tools`,mcp:`MCP-Server`,dirs:`Verzeichnisse`,refs:`Referenzverzeichnisse`,map:`Karte`,photos:`Fotos`,google:`Google`,model:`Modell`,voice:`Sprache`,chatIndex:`Chat-Index`,journal:`Journal`,notifications:`Web Push`,skills:`Skills`,roles:`Rollen`,quit:`Beenden`},groups:{llm:`LLM`,servers:`Server`,workspace:`Arbeitsbereich`,notifications:`Benachrichtigungen`,plugins:`Plugins`,management:`Verwaltung`,server:`Server`},navAriaLabel:`Einstellungsbereiche`,googleTab:{description:`Verknüpfe dein Google-Konto, damit dieser Rechner Google-APIs direkt aufrufen kann (zuerst Kalender). Das Refresh-Token wird nur auf diesem Rechner gespeichert und außer an Google an keinen Server gesendet.`,statusLinked:`Verknüpft`,statusNotLinked:`Nicht verknüpft`,statusPending:`Warte auf Abschluss der Einwilligung im Browser…`,connect:`Google-Konto verknüpfen`,unlink:`Verknüpfung aufheben`,unlinkConfirm:`Google-Konto-Verknüpfung aufheben? Das gespeicherte Token wird widerrufen und von diesem Rechner gelöscht.`,clientSecretAmbiguous:`In ~/.secrets/ wurden mehrere client_secret_*.json-Dateien gefunden. Behalte genau eine, damit das gespeicherte Token dem richtigen OAuth-Client zugeordnet bleibt.`,loadError:`Der Google-Verknüpfungsstatus konnte nicht geladen werden.`,connectError:`Der Google-Autorisierungsablauf konnte nicht gestartet werden.`,unlinkError:`Die Google-Verknüpfung konnte nicht aufgehoben werden.`},geminiTab:{required:`Die Bildgenerierung erfordert {envKey}. Fügen Sie den Schlüssel unten ein und speichern Sie ihn.`,apiKeyLabel:`Gemini-API-Schlüssel`,apiKeyPlaceholder:`AIza…`,helperText:`Erstellen oder kopieren Sie einen Schlüssel in {studioLink}.`,storageNote:`Wird nur auf diesem Rechner gespeichert, außerhalb des Workspace, und ist nur für Sie lesbar. Er wirkt sofort — ohne Neustart.`,storedHere:`In der App gespeichert`,storedInEnvironment:`Kommt aus der Umgebung`,notConfigured:`Nicht konfiguriert`,clear:`Löschen`,fromEnvironment:`Dieser Schlüssel kommt aus der Shell, die die App gestartet hat, oder aus {envFile}. Ein hier gespeicherter Schlüssel hat Vorrang.`,loadError:`Schlüsselstatus konnte nicht geladen werden`,saveError:`Schlüssel konnte nicht gespeichert werden`,clearError:`Schlüssel konnte nicht gelöscht werden`},mapTab:{description:`Legt den Google-Maps-API-Schlüssel fest, den das Karten-Plugin verwendet. Der Schlüssel wird lokal gespeichert und nur an Google Maps gesendet.`,apiKeyLabel:`Google-Maps-API-Schlüssel`,apiKeyPlaceholder:`AIza…`,helperText:`Erstelle oder kopiere einen Schlüssel aus {consoleLink}.`,requiredApis:`Erforderliche APIs: Maps JavaScript API, Geocoding API, Places API (New), Directions API.`,configured:`Konfiguriert`,notConfigured:`Nicht konfiguriert`,clear:`Löschen`,loadError:`Einstellungen konnten nicht geladen werden`,saveError:`Speichern fehlgeschlagen`},photosTab:{description:`Datenschutzeinstellungen für Fotos, die per Chat oder verbundener Bridge empfangen wurden. EXIF-Standortdaten sind sensibel — Häkchen entfernen, um die automatische Erfassung zu deaktivieren.`,autoCaptureLabel:`Fotostandort automatisch erfassen`,autoCaptureHint:`Aktiv: Für jedes hochgeladene Bild mit EXIF-GPS wird ein Standort-Sidecar in data/locations/ erzeugt. Aus: Es wird nichts automatisch erfasst; das LLM kann EXIF weiterhin auf Anforderung lesen.`,statusOn:`Automatische Erfassung AN`,statusOff:`Automatische Erfassung AUS`,loadError:`Einstellungen konnten nicht geladen werden`,saveError:`Speichern fehlgeschlagen`},quitTab:{description:`Beendet den MulmoClaude-Server auf diesem Rechner. Über das Symbol gestartet, läuft er weiter, auch wenn du diesen Tab schließt — hier beendest du ihn ohne Terminal.`,restartHint:()=>"Zum erneuten Starten doppelklicke auf das MulmoClaude-Symbol (oder führe `npx mulmoclaude@latest` aus).",quitLabel:`MulmoClaude beenden`,confirmBody:`Der Server hält an und diese Seite funktioniert nicht mehr. Laufende Vorgänge werden abgebrochen.`,confirmLabel:`Beenden`,stopping:`Wird beendet…`,stoppedTitle:`MulmoClaude wurde beendet`,stoppedBody:`Du kannst diesen Tab schließen. Doppelklicke auf das Symbol, um neu zu starten.`,error:`Server konnte nicht beendet werden`},notificationsTab:{description:`Erhalte eine Push-Benachrichtigung auf deinen registrierten Geräten, wenn eine hier gestartete Aufgabe abgeschlossen ist — praktisch, wenn du etwas fragst, weggehst und wissen willst, sobald die Antwort fertig ist.`,enableLabel:`Web Push senden, wenn eine Aufgabe abgeschlossen ist`,enableHint:`Wird ausgelöst, wenn ein hier gestarteter Chat abgeschlossen ist. Geplante und Hintergrundaufgaben lösen es nicht aus.`,remoteHostNote:`Erfordert die RemoteHost-Verbindung (sie liefert die Anmeldung) und mindestens ein registriertes Gerät. Fehlt eines davon, passiert nichts.`,macosRemindersLabel:`Bei Aufgabenende eine macOS-Erinnerung anlegen`,macosRemindersHint:`Legt die erledigte Aufgabe in deiner Standard-Erinnerungsliste an. Die iCloud-Synchronisierung spiegelt sie auf dein iPhone, das die Mitteilung zustellt.`,macosRemindersForcedOff:`Beim Start durch --disable-macos-reminders oder DISABLE_MACOS_REMINDER_NOTIFICATIONS deaktiviert. Entferne die Option oder die Umgebungsvariable und starte neu, um sie hier zu steuern.`,statusOn:`Web Push ist AN`,statusOff:`Web Push ist AUS`,loadError:`Einstellungen konnten nicht geladen werden`,saveError:`Speichern fehlgeschlagen`},modelTab:{description:`Wählt das Modell und den Reasoning-Effort, die Claude Code pro Zug verwendet. Ohne Einstellung bleibt die Auflösung durch Claude selbst bestehen.`,modelLabel:`Modell`,modelUnset:`(nicht gesetzt — ~/.claude/settings.json folgen)`,modelHelperText:`Ohne Einstellung stammt das Modell aus ~/.claude/settings.json — dieselbe Datei, in die andere Claude-Code-Clients (VS Code, Cursor) ihre /model-Auswahl schreiben; eine Umstellung dort ändert also auch MulmoClaude. Aliase folgen der jeweils neuesten Generation einer Familie.`,modelConfigured:`Modell: {model}`,modelNotConfigured:`Nicht gesetzt (geteilt)`,effortLabel:`Reasoning-Effort`,effortUnset:`(nicht gesetzt — Standard von Claude verwenden)`,helperText:`Höhere Stufen erlauben mehr Denkzeit, erhöhen aber Latenz und Token-Verbrauch.`,configured:`Effort: {level}`,notConfigured:`Nicht gesetzt`,userSettingsLabel:`Benutzereinstellungen und Plugins von Claude Code laden`,userSettingsHint:`Liest Skills, Plugins und Hooks aus ~/.claude – dieselben, die Claude Code verwendet. Schalten Sie dies aus, wenn installierte Plugins so viele Skills mitbringen, dass jede Anfrage schwer wird; die Skills des Workspace bleiben nutzbar. Gilt ab der nächsten Nachricht. Ausgeschaltet folgt ein nicht gesetztes Modell auch nicht mehr ~/.claude/settings.json.`,skillListingSummary:`Im letzten Durchgang geladene Skills: {count}.`,skillListingPlugins:`Aus Plugins: {plugins}.`,skillListingHeavy:`So viele Skills machen jede Anfrage schwer; ausschalten entfernt die aus ~/.claude.`,loadError:`Einstellungen konnten nicht geladen werden`,saveError:`Speichern fehlgeschlagen`},voiceTab:{description:`Diktieren Sie Chat-Nachrichten mit Ihrer Stimme. Das Audio wird lokal auf dem Rechner transkribiert, der MulmoClaude ausführt — nichts wird an einen externen Dienst gesendet.`,requirements:`Nur unter macOS verfügbar. Erfordert den whisper.cpp-Server — bauen Sie ihn mit yarn build:whisper (siehe Abschnitt Local Voice Input in der README).`,unsupported:`Spracheingabe erfordert macOS mit installiertem whisper.cpp-Server. Auf diesem Rechner ist sie nicht verfügbar.`,enableLabel:`Spracheingabe aktivieren`,enableHint:`Beim Aktivieren wird das Sprachmodell (1–3 GB) einmalig heruntergeladen. Anschließend erscheint eine Mikrofon-Schaltfläche im Chat-Eingabefeld.`,modelLabel:`Sprachmodell`,downloading:`Modell wird heruntergeladen… {percent}%`,ready:`Modell bereit`,downloadError:`Modell-Download fehlgeschlagen.`,retry:`Erneut versuchen`,loadError:`Einstellungen konnten nicht geladen werden`,saveError:`Speichern fehlgeschlagen`},chatIndexTab:{description:`Automatische KI-Titel und Zusammenfassungen für den Chat-Verlauf. Standardmäßig aus — Automatisierungs-Sessions (Scheduler / System-Worker) werden auch bei aktivierter Option immer übersprungen; menschliche Sessions kosten pro beendetem Turn genau einen Summarizer-Aufruf.`,modeLabel:`Chat-Index-Modell`,helperText:`Haiku ist günstiger; Sonnet liefert schärfere Titel bei langen, themenwechselnden Sessions.`,mode:{off:`Aus`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Indizierung ist AUS`,haiku:`Indizierung läuft mit Haiku`,sonnet:`Indizierung läuft mit Sonnet`},loadError:`Einstellungen konnten nicht geladen werden`,saveError:`Speichern fehlgeschlagen`},journalTab:{description:`Automatisiertes Tages-Journal — fasst kürzliche Chat-Sessions in journal/*.md zusammen und extrahiert dauerhafte Memory-Notizen. Standardmäßig aus. Automatisierungs-Sessions (Scheduler / System-Worker) werden unabhängig von dieser Einstellung immer ausgeschlossen.`,modeLabel:`Journal-Modell`,helperText:`Haiku ist günstiger; Sonnet liefert reichhaltigere Tages- und Themen-Zusammenfassungen. Der stündliche Lauf startet nur, wenn dies gesetzt ist.`,mode:{off:`Aus`,haiku:`Haiku`,sonnet:`Sonnet`},status:{off:`Journal ist AUS`,haiku:`Journal läuft mit Haiku`,sonnet:`Journal läuft mit Sonnet`},loadError:`Einstellungen konnten nicht geladen werden`,saveError:`Speichern fehlgeschlagen`},geminiAskButton:`Claude fragen`,geminiAskMessage:`Welche Rolle spielt der Gemini-API-Schlüssel in dieser App?`,toolNamesLabel:`Tool-Namen`,invalidToolNamesPrefix:`Diese sehen nicht standardmäßig aus (erwartetes Präfix`,invalidToolNamesSuffix:`):`,mcpToolsError:`⚠ MCP-Tool-Status konnte nicht abgerufen werden: {error}. Alle Tools werden unabhängig von der Aktivierung angezeigt.`,changesHint:`Änderungen werden bei der nächsten Nachricht wirksam. Kein Neustart erforderlich.`,cannotSaveTooltip:`Kann nicht gespeichert werden, bis die Einstellungen erfolgreich geladen sind`,saving:`Wird gespeichert…`,loadingLabel:`Wird geladen…`,unsavedMarker:`●`,unsavedToolsConfirm:`Allowed Tools enthält ungespeicherte Änderungen. Trotzdem schließen?`,unsavedMcpDraftConfirm:`Ein MCP-Server-Entwurf ist noch offen. Trotzdem schließen?`,mcpSaveFailed:`Änderungen an den MCP-Servern konnten nicht gespeichert werden.`},canvasViewToggle:{stackViewTooltip:`Stapelansicht · klicken, um zur Einzelansicht zu wechseln`,singleViewTooltip:`Einzelansicht · klicken, um zur Stapelansicht zu wechseln`,switchToSingle:`Zur Einzelansicht wechseln`,switchToStack:`Zur Stapelansicht wechseln`},sessionHistoryToggle:{showTooltip:`Sitzungsverlauf-Panel links anzeigen`,hideTooltip:`Sitzungsverlauf-Panel ausblenden`,show:`Sitzungsverlauf anzeigen`,hide:`Sitzungsverlauf ausblenden`},sessionHistoryExpand:{expandTooltip:`Sitzungsverlauf-Panel auf volle Breite erweitern`,collapseTooltip:`Sitzungsverlauf-Panel verkleinern`,expand:`Sitzungsverlauf erweitern`,collapse:`Sitzungsverlauf verkleinern`},settingsWorkspaceDirs:{explanation:`Benutzerdefinierte Verzeichnisse zur Organisation von Dateien unter {dataDir} und {artifactsDir}. Claude nutzt sie, um das Speichern von Dateien zu steuern.`,noEntries:`Keine benutzerdefinierten Verzeichnisse konfiguriert.`,addDirTitle:`Verzeichnis hinzufügen`,pathPlaceholder:`data/kunden oder artifacts/berichte`,descPlaceholder:`Beschreibung (was in diesen Ordner gehört)`,errPathRequired:`Pfad ist erforderlich`,errMustStartWith:`Muss mit data/ oder artifacts/ beginnen`,errAlreadyExists:`Existiert bereits`},settingsReferenceDirs:{explanation:`Externe Verzeichnisse, die Claude lesen, aber nicht ändern kann. Im Docker-Modus werden sie schreibgeschützt eingebunden. Nützlich, um Obsidian-Vaults, Projektcode oder Dokumentordner zu referenzieren.`,noEntries:`Keine Referenzverzeichnisse konfiguriert.`,addDirTitle:`Referenzverzeichnis hinzufügen`,pathPlaceholder:`/Users/ich/ObsidianVault oder ~/Dokumente/notizen`,labelPlaceholder:`Label (optional — Standardwert ist der Ordnername)`,readOnlyBadge:`schreibgeschützt`,errPathRequired:`Pfad ist erforderlich`,errMustBeAbsolute:`Muss ein absoluter Pfad sein oder mit ~/ beginnen`,errAlreadyExists:`Existiert bereits`,errLabelConflict:`Label "{label}" existiert bereits`},dashboard:{empty:`Noch keine Lieblingssammlungen.`,emptyHint:`Hefte eine Sammlung (★) an, um sie hier zu sehen.`,viewTable:`Tabelle`,viewCalendar:`Kalender`,viewKanban:`Kanban`,viewPickerLabel:`Ansicht wählen`,openFull:`Zum Öffnen der Vollansicht doppelklicken`,dragHint:`Zum Neuordnen ziehen`,resizeHint:`Zum Ändern der Höhe ziehen`},pluginLauncher:{chat:{label:`Chat`},dashboard:{label:`Dashboard`},automations:{label:`Aktionen`},wiki:{label:`Wiki`},collections:{label:`Sammlungen`},feeds:{label:`Feeds`},accounting:{label:`Buchhaltung`},files:{label:`Dateien`}},shortcuts:{pin:`An Launcher anheften`,unpin:`Vom Launcher lösen`,zoneAriaLabel:`Angeheftete Verknüpfungen`,reorder:{open:`Verknüpfungen neu anordnen`,title:`Neu anordnen`,moveUp:`Nach oben`,moveDown:`Nach unten`}},fileContentHeader:{showRendered:`Gerendertes Markdown anzeigen`,showRaw:`Rohquelltext anzeigen`,rendered:`Gerendert`,raw:`Roh`,closeFile:`Datei schließen`,revealInOs:`Im Ordner anzeigen`,revealInOsFailed:`Ordner konnte nicht geöffnet werden`},fileContentRenderer:{download:`ZIP`,downloadZip:`Als eigenständiges ZIP herunterladen (Assets gebündelt)`,downloadError:`Download fehlgeschlagen`,selectFile:`Datei auswählen`,htmlPreview:`HTML-Vorschau`,pdfPreview:`PDF-Vorschau`,parseError:`Parse-Fehler`,editJson:`JSON bearbeiten`,jsonEditorLabel:`JSON-Editor`,invalidJson:`Ungültiges JSON`,undo:`Rückgängig`,redo:`Wiederholen`,editMarp:`Folienquelle bearbeiten`,marpEditorLabel:`Marp-Folienquelle`,openInOs:`Im Betriebssystem oeffnen`,openingInOs:`Wird geoeffnet…`,openInOsFailed:`Konnte nicht im Betriebssystem geoeffnet werden`,downloadFile:`Herunterladen`,downloadingFile:`Wird heruntergeladen…`},filesView:{chatPlaceholder:`Frage zu dieser Datei stellen…`},systemFiles:{schemaLabel:`Schema`,showDetails:`Details anzeigen`,hideDetails:`Details ausblenden`,editPolicy:{"agent-managed-but-hand-editable":`Agent-verwaltet (manuelle Bearbeitung erlaubt)`,"user-editable":`Benutzer-bearbeitbar`,"agent-managed":`Agent-verwaltet`,"fragile-format":`Empfindliches Format`,ephemeral:`Flüchtig`},mcp:{title:`MCP-Server`,summary:`Externe Model-Context-Protocol-Server, die mit dem Agenten verbunden sind. HTTP- oder Stdio-Server hinzufügen, um die Werkzeugauswahl zu erweitern.`},settings:{title:`App-Einstellungen`,summary:`Vom Benutzer bearbeitbare Verhaltenseinstellungen — Gemini-API-Schlüssel, erlaubte Werkzeuge, Sandbox-Konfiguration usw.`},schedulerTasks:{title:`Scheduler-Aufgaben`,summary:`Wiederkehrende Agent-Automationen, die nach Zeitplan ausgelöst werden. Verwaltet über die Automations-UI; diese Datei ist die Quelle auf Festplatte.`},schedulerOverrides:{title:`Scheduler-Überschreibungen`,summary:`Pro-Aufgabe Zeit-/Intervall-Überschreibungen über dem Systemzeitplan. Der Agent bearbeitet dies, wenn du den Zeitpunkt einer wiederkehrenden Aufgabe änderst.`},schedulerItems:{title:`Alte Kalendereinträge`,summary:`Einträge aus der entfernten Kalenderansicht. Die App zeigt sie nicht mehr an, und nichts führt sie nach Zeitplan aus; nur die alten /api/scheduler-Aktionen lesen und schreiben diese Datei noch. Geplante Aufgaben liegen in config/scheduler/tasks.json.`},wikiIndex:{title:`Wiki-Index`,summary:`Automatisch erzeugter Index aller Wiki-Seiten. Wird bei jeder Wiki-Bearbeitung aktualisiert; nicht von Hand bearbeiten (Änderungen werden überschrieben).`},wikiLog:{title:`Wiki-Bearbeitungsprotokoll`,summary:`Aktivitätsprotokoll der Erstellungs- und Bearbeitungsvorgänge im Wiki. Agent-verwaltet und nur anhängend — nützlich als Feed der letzten Änderungen.`},wikiSummary:{title:`Wiki-Übersicht`,summary:`Automatisch erzeugte Übersicht des Wikis — Themencluster, Seitenzahl, jüngste Aktivitäten. Vom Agenten aktualisiert.`},wikiSchema:{title:`Wiki-Schema`,summary:`Formatspezifikation, die der Agent liest, um Wiki-Seiten konsistent zu halten. Empfindlich — eine bestimmte Struktur wird erwartet; bevorzuge Agent-getriebene Bearbeitung.`},memory:{title:`Memory (alte Datei)`,summary:`Das ältere Ein-Datei-Gedächtnis. Nur Arbeitsbereiche im älteren Format lesen es; aktuelle Arbeitsbereiche speichern Fakten als Themendateien unter conversations/memory/<type>/<topic>.md und ignorieren diese Datei, Änderungen hier wirken dort also nicht.`},summariesIndex:{title:`Zusammenfassungs-Index`,summary:`Durchsuchbarer Index, der zu den vom Journal erzeugten Tages- und Themen-Zusammenfassungen verlinkt. Agent-verwaltet; bei jedem Journal-Lauf aktualisiert.`},rolesJson:{title:`Rollendefinition (JSON)`,summary:`Rollenkonfiguration — Modellauswahl, MCP-Server, erlaubte Plugins, Anfragen-Vorschläge. Vom Benutzer bearbeitbar, kein Neustart nötig.`},rolesMd:{title:`Rollenbeschreibung (Markdown)`,summary:`Persona und System-Prompt-Text der Rolle, geladen als Kontext, wenn diese Rolle aktiv ist. Vom Benutzer bearbeitbar; Änderungen wirken ab der nächsten Nachricht.`},journalDaily:{title:`Tägliche Journal-Zusammenfassung`,summary:`Automatisch erzeugte Rückschau auf deine Aktivitäten an einem Kalendertag, vom Journal-Lauf aus den Chat-Sitzungen destilliert.`},journalTopic:{title:`Themen-Journal`,summary:`Langlaufende Notizen zu einem bestimmten Thema, gesammelt und überarbeitet, während du weiter darüber sprichst. Agent-verwaltet.`}},settingsMcpTab:{explanation:`Externe MCP-Server hinzufügen. HTTP-Server funktionieren in allen Modi. Stdio-Server nutzen {npx} / {node} / {tsx} aus dem Sandbox-Image; wenn Docker aktiviert ist, müssen die Pfade im Workspace liegen.`,localhostRewrite:`Im Docker-Modus wird {localhost} zu {hostDockerInternal} umgeschrieben.`,noServers:`Noch keine MCP-Server konfiguriert.`,enabled:`aktiviert`,urlLabel:`URL:`,commandLabel:`Befehl:`,dockerStdioUnsupported:`⚠ Wird nicht ausgeführt, solange die Docker-Sandbox aktiv ist.`,dockerStdioHostExecActive:`⚠ Läuft auf dem Host — dieser Server verlässt die Docker-Sandbox.`,dockerStdioHostExecOptIn:`Trotzdem auf dem Host ausführen (fortgeschritten). Dieser Server läuft über ein lokales HTTP-Gateway außerhalb der Docker-Sandbox und kann auf Ihren Rechner zugreifen.`,learnMore:`Mehr erfahren`,addServerButton:`+ MCP-Server hinzufügen`,nameLabel:`Name`,namePlaceholder:`mein-server`,typeHttp:`HTTP`,typeStdio:`Stdio (Befehl)`,urlFieldLabel:`URL`,urlPlaceholder:`https://example.com/mcp`,commandFieldLabel:`Befehl`,argsLabel:`Argumente (eins pro Zeile)`,argsPlaceholder:()=>`-y
|
|
263
263
|
@modelcontextprotocol/server-filesystem
|
|
264
264
|
/workspace/path`,errNoName:`Bitte einen Namen angeben oder eine URL / Argumente eingeben, aus denen sich einer ableiten lässt.`,errBadName:`Der Name muss mit einem Kleinbuchstaben beginnen und darf nur [a-z0-9_-] enthalten.`,errIdExists:`Die Server-ID "{id}" existiert bereits.`,errBadHttpUrl:`Die HTTP-URL muss mit http:// oder https:// beginnen`,pendingEntryWarning:`Schließen Sie den ausstehenden MCP-Servereintrag zuerst ab oder brechen Sie ihn ab.`,customHeading:`Benutzerdefinierte Server`,catalog:{heading:`Vorkonfigurierte MCP-Server`,audience:{general:`🟢 Allgemein`,developer:`🔵 Entwickler`},risk:{low:`niedrig`,medium:`mittel`,high:`hoch`},upstream:`📦 Quelle`,setupGuide:`📚 Einrichtung`,entry:{memory:{displayName:`Memory`,description:`Lässt Claude den Gesprächskontext über Sitzungen hinweg merken.`},sequentialThinking:{displayName:`Sequenzielles Denken`,description:`Hilft Claude, komplexe Probleme schrittweise zu lösen.`},context7:{displayName:`Context7 (Bibliotheksdokumentation)`,description:`Aktuelle Dokumentation gängiger Bibliotheken — geht über das Trainings-Cutoff des Modells hinaus.`},deepwiki:{displayName:`DeepWiki (Wiki für GitHub-Repositories)`,description:`Stelle Fragen zu beliebigen GitHub-Repositories und erhalte eine strukturierte Antwort im Wiki-Stil.`},notion:{displayName:`Notion`,description:`Lese und schreibe in deinem Notion-Workspace — Seiten, Datenbanken und Suche.`,field:{apiKey:{label:`Notion-Integrationstoken`,help:`Erstelle eine Notion-Integration und kopiere das Internal Integration Secret. 🔑 öffnet die Integrationen-Seite.`}}},slack:{displayName:`Slack`,description:`Kanäle auflisten, Nachrichten senden und den Verlauf deines Slack-Workspaces durchsuchen.`,field:{botToken:{label:`Bot-Token`,help:`Slack-App → OAuth & Permissions → Bot User OAuth Token. Beginnt mit xoxb-.`},teamId:{label:`Team- / Workspace-ID`,help:`Rufe team.info auf oder prüfe die Workspace-URL — etwa T01ABC23DEF.`}}},googleMaps:{displayName:`Google Maps`,description:`Orte suchen, Routen berechnen und Standortdetails abrufen.`,field:{apiKey:{label:`Google-Maps-API-Key`,help:`Google Cloud Console → APIs & Services → Credentials → API-Key erstellen. Aktiviere Places + Directions.`}}},appleNative:{displayName:`Native Apple-Apps (macOS)`,description:`Liest und schreibt Erinnerungen, Kalender, Notizen, Mail und Karten via AppleScript. Nur macOS — keine Zugangsdaten nötig.`},gmail:{displayName:`Gmail`,description:`Liest, sendet und beschriftet dein Gmail. Nutzt einen Google-OAuth-Client, den du selbst in deinem eigenen Google-Cloud-Projekt erstellst (keine App-Verifizierung nötig).`,field:{credentials:{label:`Pfad zu credentials.json`,help:`Google Cloud Console → APIs & Services → Credentials → OAuth-Client-ID (Desktop app). Lade credentials.json herunter und füge den absoluten Pfad ein.`}}},googleCalendar:{displayName:`Google Kalender`,description:`Liest und erstellt Termine im Google Kalender. Gleiches BYO-credentials.json-Muster wie Gmail.`,field:{credentials:{label:`Pfad zu credentials.json`,help:`Verwende denselben Google-Cloud-OAuth-Client wie Gmail, oder erstelle einen separaten nur für Calendar.`}}},googleDrive:{displayName:`Google Drive`,description:`Sucht und liest Google-Drive-Dateien. BYO Google-OAuth-Zugangsdaten — Token wird lokal neben der Datei zwischengespeichert.`,field:{credentials:{label:`Pfad zu credentials.json`,help:`Google Cloud Console → APIs & Services → Credentials → OAuth-Client-ID (Desktop app). Aktiviere die Google-Drive-API im selben Projekt.`}}},github:{displayName:`GitHub`,description:"Liest Repos, Issues, PRs und führt Suchen mit einem Personal Access Token aus. Begrenze den Token-Scope — Schreibrechte (z.B. `repo`) erlauben dem Agenten Pushes auf jeden zugänglichen Repo.",field:{token:{label:`Personal Access Token`,help:`GitHub → Settings → Developer settings → Personal access tokens. Bevorzuge fine-grained tokens, die nur auf Repos beschränkt sind, in denen der Agent arbeiten soll.`}}},linear:{displayName:`Linear`,description:`Liest und aktualisiert Linear-Issues, -Projekte und -Cycles mit einem persönlichen API-Key.`,field:{apiKey:{label:`Linear-API-Key`,help:`Linear → Settings → API → Personal API keys. Klicke auf 🔑, um die Seite zu öffnen, und dann auf Create key.`}}},weatherOpenMeteo:{displayName:`Wetter (Open-Meteo)`,description:`Kostenlose Wettervorhersagen und aktuelle Bedingungen weltweit — ohne API-Key.`},spotify:{displayName:`Spotify`,description:`Suche Tracks, verwalte Playlists, steuere die Wiedergabe. BYO Spotify-Developer-App — nur Client ID (PKCE-Flow, kein Client Secret nötig).`,field:{clientId:{label:`Client ID`,help:"Spotify Developer Dashboard → Create app, setze die Redirect URI auf http://127.0.0.1:8888/callback, kopiere die Client ID. Führe dann einmal im Terminal `SPOTIFY_CLIENT_ID=<id> npx spotify-mcp@latest auth` aus, um dich anzumelden (Refresh-Token wird in ~/.spotify-mcp/tokens.json gecacht)."}}},youtubeTranscript:{displayName:`YouTube-Transkript`,description:`Holt die Untertitel zu jedem öffentlichen YouTube-Video per URL. Keine Zugangsdaten nötig.`}},config:{howToGet:`So erhältst du den Wert`,install:`Installieren`,errMissingRequired:`Pflichtfelder fehlen: {fields}`,requiredMarker:`*`,requiredAria:`Pflichtfeld`}}},pluginScheduler:{previewIcon:`📅`,previewAutomations:`{count} Automatisierung | {count} Automatisierungen`,previewMore:`+ {count} weitere…`},pluginSchedulerTasks:{recommendedFrequencies:`Empfohlene Häufigkeiten`,tableTaskType:`Aufgabentyp`,tableSuggestedSchedule:`Empfohlener Zeitplan`,noTasks:`Keine geplanten Aufgaben`,runNow:`Jetzt ausführen`,enable:`Aktivieren`,disable:`Deaktivieren`,delete:`Löschen`,nextRun:`Nächste: {time}`,originSystem:`System`,originUser:`Benutzer`,originSkill:`Skill`,runFailed:`Ausführung fehlgeschlagen: {error}`,toggleFailed:`Umschalten fehlgeschlagen: {error}`,deleteFailed:`Löschen fehlgeschlagen: {error}`,detailsToggle:`Details anzeigen`,promptLabel:`Prompt`,roleLabel:`Rolle`,confirmDelete:`Aufgabe {name} löschen? Dies kann nicht rückgängig gemacht werden.`,hintNewsRss:`News- / RSS-Abruf`,hintJournal:`Täglicher Journallauf`,hintWiki:`Wiki-Wartung`,hintMemory:`Speicherextraktion`,hintCalendar:`Kalender- / Kontaktsynchronisierung`},pluginCanvas:{undo:`Rückgängig`,redo:`Wiederherstellen`,clear:`Löschen`,styleLabel:`Stil:`,stylePromptWithPath:"Wandle das Bild unter `{path}` in ein Bild im {style}-Stil um.",stylePromptNoPath:`Wandle meine Zeichnung auf dem Canvas in ein Bild im {style}-Stil um.`,saveFailed:`Nicht gespeichert`},pluginWiki:{backToIndex:`Zurück zum Index`,pdf:`PDF`,pdfFailed:`⚠ PDF fehlgeschlagen`,tabIndex:`Index`,tabLog:`Protokoll`,tabLint:`Lint`,tabGraph:`Graph`,graphEmpty:`Noch keine Verknüpfungen für den Graphen.`,linkedReferences:`Eingehende Verweise`,empty:`Das Wiki ist leer. Bitten Sie den Wiki Manager, eine Quelle einzulesen.`,previewMore:`+ {count} weitere…`,chatPlaceholder:`Fragen Sie zu dieser Seite…`,emptyPage:`Die Seite „{title}“ existiert noch nicht.`,emptyContent:`Die Seite „{title}“ existiert, hat aber keinen Inhalt.`,createPage:`Erstellung dieser Wiki-Seite anfordern`,updatePage:`Aktualisierung dieser Wiki-Seite anfordern`,tagFilterAll:`Alle`,noMatches:`Keine Seiten mit dem Tag #{tag}`,lintChat:`Wiki prüfen`,taskCountMismatch:`Wiki-Quelle und gerendertes Ergebnis stimmen in der Anzahl der Aufgaben nicht überein. Die Umschaltung wurde abgelehnt, um eine Beschädigung der Datei zu vermeiden.`,metadataCreated:`Erstellt`,metadataUpdated:`Aktualisiert`,metadataEditor:`Bearbeiter`,pageEditHeader:`Wiki-Bearbeitung`,snapshotExpired:`Snapshot abgelaufen — aktuelle Seite wird angezeigt`,snapshotLoadError:`Snapshot konnte nicht geladen werden — die Seite existiert möglicherweise noch. Bitte aktualisieren.`,pageDeleted:`Seite gelöscht`,history:{tabContent:`Inhalt`,tabHistory:`Verlauf`,empty:`Noch kein Verlauf — bearbeite diese Seite, und die erste Version erscheint hier.`,loading:`Verlauf wird geladen…`,backToList:`Zurück zum Verlauf`,restoreButton:`Diese Version wiederherstellen`,restoreConfirmTitle:`Diese Version wiederherstellen?`,restoreConfirmBody:`Seite auf die Version vom {ts} von {editor} zurücksetzen. Die aktuelle Seite wird ersetzt. Der bestehende Verlauf bleibt erhalten.`,restoreConfirmAction:`Wiederherstellen`,restoreConfirmCancel:`Abbrechen`,restoreSuccessToast:`Seite wiederhergestellt.`,restoreFailureBanner:`Wiederherstellung fehlgeschlagen: {error}`,compareCurrent:`Mit aktueller Seite vergleichen`,comparePrevious:`Mit vorheriger Version vergleichen`,diffNoPrevious:`Keine vorherige Version zum Vergleichen vorhanden.`,diffNoChanges:`Zwischen dieser Version und dem Vergleichsobjekt gibt es keine inhaltlichen Unterschiede.`,editorBadgeUser:`Benutzer`,editorBadgeLLM:`LLM`,editorBadgeSystem:`System`,hiddenLines:`{count} unveränderte Zeilen ausgeblendet`,expandHidden:`Anzeigen`}},pluginPresentForm:{fallbackTitle:`Formular`,fieldCount:`{count} Feld | {count} Felder`,submitted:`Gesendet`,errorSummary:`Bitte korrigieren Sie die folgenden Fehler`,requiredMarker:`*`,selectOption:`Bitte auswählen`,charactersCount:`{current} / {max} Zeichen`,charactersCountNoMax:`{current} Zeichen`,submit:`Senden`,progress:`{filled} von {total} Pflichtfeldern ausgefüllt`},pluginPresentSvg:{saveAsPng:`Als PNG herunterladen`,png:`PNG`,saveAsPdf:`Als PDF speichern (öffnet Druckdialog)`,pdf:`PDF`,untitled:`SVG-Zeichnung`,editSource:`SVG-Quelltext bearbeiten`,cancel:`Abbrechen`,applyChanges:`Änderungen anwenden`,saving:`Wird gespeichert...`,saveError:`⚠ Speichern fehlgeschlagen: {error}`,exportError:`⚠ Export fehlgeschlagen: {error}`,loadingSource:`Quelltext wird geladen…`,sourceError:`Quelltext konnte nicht geladen werden: {error}`},photoLocations:{title:`Fotostandorte`,summary:`{total} erfasst · {withGps} mit GPS`,mapHint:`Bitte Claude um "auf der Karte anzeigen", um sie mit dem Google-Map-Plugin einzuzeichnen.`,loading:`Lädt…`,empty:`Noch keine Fotostandorte erfasst. Sende ein Foto mit GPS-Tag über den Chat oder eine verbundene Bridge, um zu beginnen.`,noGps:`Keine GPS-Daten`},pluginManageSkills:{deleteProjectSkill:`Diese Projekt-Skill löschen`,unstarPresetSkill:`Markierung dieser Preset-Skill entfernen — sie kehrt in den Katalog zurück`,heading:`Skills`,previewCount:`{count} Skill | {count} Skills`,previewMore:`+{count} weitere`,subheading:({named:e})=>`${e(`count`)} verfügbar · zum Anzeigen klicken · "Run" ruft sie als /<name> auf`,emptyWithPath:`Keine Skills gefunden. Fügen Sie Skill-Ordner unter {path} hinzu.`,emptySkillPath:`~/.claude/skills/`,selectHint:`Wählen Sie links eine Skill aus, um ihre SKILL.md anzuzeigen.`,loading:`Wird geladen…`,fieldDescription:`Beschreibung`,fieldBody:`Inhalt (Markdown)`,emptyBody:`(leerer Inhalt)`,btnEdit:`Bearbeiten`,btnDelete:`Löschen`,btnUnstar:`Markierung entfernen`,errListFailed:`Skills konnten nicht geladen werden: {error}`,errDetailFailed:`Skill konnte nicht geladen werden: {error}`,errSaveFailed:`Speichern fehlgeschlagen: {error}`,errDeleteFailed:`Löschen fehlgeschlagen`,confirmDelete:`Skill "{name}" löschen? Dies entfernt ~/mulmoclaude/.claude/skills/{name}/SKILL.md.`,confirmUnstar:`Skill "{name}" zurück in den Katalog verschieben? Sie wird nicht mehr in den Prompt geladen, aber die Katalog-Kopie bleibt erhalten — du kannst sie jederzeit erneut markieren.`,sectionActive:`Aktiv`,sectionCatalog:`Katalog`,sectionLegendActive:`Skills, die Claude jetzt verwenden kann. Claude verwendet sie automatisch im Verlauf des Gesprächs, oder du kannst eine durch Eingabe ihres Namens aufrufen. {system} System (mc- mitgeliefert) / {project} Projekt (bearbeitbar, nur in diesem Workspace) / {user} Nutzer (Skills in ~/.claude/skills/) / {claudePlugin} Plugin (aus einem installierten Claude-Code-Plugin, schreibgeschützt).`,sectionLegendCatalog:`Katalog: Skills, die durch {star} Markieren Aktiv werden. {star} in Aktiv entfernen bringt eine Skill zurück in den Katalog — Claude verwendet sie dann nicht mehr (die Skill wird nicht gelöscht).`,catalogEmpty:`Keine Preset-Skills verfügbar.`,catalogPresetHeading:`Presets`,catalogStar:`Markieren`,catalogStarred:`Markiert`,sourceUserTitle:`Benutzer-Skill (~/.claude/skills/, in allen Workspaces verfügbar)`,sourceClaudePluginTitle:`Plugin-Skill (installiertes Claude-Code-Plugin — schreibgeschützt, wird vom Plugin aktualisiert)`,sourceSystemTitle:`System-Skill (mitgeliefert, mc- Präfix — schreibgeschützt, vom Launcher überschrieben)`,sourceProjectTitle:`Projekt-Skill (.claude/skills/ des Workspaces, nur dieser Workspace)`,sourcePresetTitle:`Preset-Katalog — Markieren anklicken, um in diesem Workspace zu aktivieren`,errCatalogListFailed:`Katalog konnte nicht geladen werden: {error}`,errCatalogStarFailed:`Skill konnte nicht markiert werden: {error}`,errCatalogPreviewFailed:`Skill-Vorschau konnte nicht geladen werden: {error}`,catalogAddRepo:`Skill-Repository hinzufügen`,catalogAddRepoTitle:`Ein Skill-Repository hinzufügen`,catalogRepoUrlLabel:`GitHub-URL`,catalogRepoUrlPlaceholder:`https://github.com/owner/repo`,catalogRepoSubpathLabel:`Unterpfad (optional)`,catalogRepoSubpathPlaceholder:`skills`,catalogAddRepoSubmit:`Installieren`,catalogAddRepoSuggestions:`Vorgeschlagene Repositories`,catalogUninstallRepo:`Repository deinstallieren`,catalogUpdateRepo:`Repository aktualisieren (neueste Version erneut laden)`,catalogRepoOpenLink:`Repository auf GitHub öffnen (neuer Tab)`,catalogUninstallConfirm:`Dieses Repository deinstallieren? Bereits mit Stern markierte Skills bleiben in deiner aktiven Liste.`,catalogRepoInstalling:`Installiere…`,catalogRepoEmpty:`In diesem Repository wurden keine Skills gefunden.`,sourceExternalTitle:`Externe Skill (aus einem GitHub-Repository installiert — zum Aktivieren auf den Stern klicken)`,errCatalogRepoListFailed:`Installierte Repositories konnten nicht geladen werden: {error}`,errCatalogRepoInstallFailed:`Repository konnte nicht installiert werden: {error}`,errCatalogRepoUninstallFailed:`Repository konnte nicht deinstalliert werden: {error}`,errCatalogRepoInvalidUrl:`Gib eine GitHub-Repository-URL ein.`},pluginManageRoles:{heading:`Benutzerdefinierte Rollen`,roleCount:`{count} Rolle | {count} Rollen`,addButton:`+ Hinzufügen`,createPanel:`Neue Rolle erstellen`,fieldId:`ID`,fieldName:`Name`,fieldIcon:`Symbol`,fieldPrompt:`Prompt`,fieldPlugins:`Plugins`,fieldModel:`Modell`,modelUnset:`(nicht gesetzt — der globalen Einstellung folgen)`,modelHelp:`Sitzungen mit dieser Rolle laufen auf diesem Modell. Nützlich, um eine Routine-Rolle aus dem Wochenlimit des Top-Modells herauszuhalten. Eingebaute Rollen folgen immer der globalen Einstellung.`,fieldStarterQueries:`Einstiegsfragen`,onePerLine:`(eine pro Zeile)`,helpLink:`?`,idFormatted:`({id})`,missingEnv:`({env} fehlt)`,requiresEnv:`Erfordert {env} in .env`,collapse:`Einklappen`,expand:`Ausklappen`,idPlaceholder:`eindeutige-id`,creating:`Wird erstellt…`,create:`Erstellen`,updating:`Wird aktualisiert…`,update:`Aktualisieren`,cancel:`Abbrechen`,delete:`Löschen`,emptyHint:`Noch keine benutzerdefinierten Rollen. Klicken Sie auf "+ Hinzufügen" oder bitten Sie Claude, eine zu erstellen.`,errIdRequired:`Die ID ist erforderlich.`,errIdInvalid:`Die ID darf nur Buchstaben, Zahlen, '-' und '_' enthalten.`,errNameRequired:`Der Name ist erforderlich.`,errIdDuplicate:`Eine Rolle mit der ID '{id}' existiert bereits.`,errCreateFailed:`Erstellen fehlgeschlagen`,errSaveFailed:`Speichern fehlgeschlagen`,errDeleteFailed:`Löschen fehlgeschlagen`,errNetworkError:`Netzwerkfehler`,errServerError:`Serverfehler: {status}`,errRefreshFailed:`Gespeichert, aber die Liste konnte nicht aktualisiert werden.`,confirmDelete:`Rolle {name} löschen? Dies kann nicht rückgängig gemacht werden.`},pluginUiImage:{promptLabel:`{label}:`},markdownCodeCopy:{copyLabel:`Code kopieren`,copiedLabel:`Kopiert`},markdownMermaid:{loadFailed:`⚠ Mermaid konnte nicht geladen werden: {error}`,renderFailed:`⚠ Mermaid-Rendering fehlgeschlagen: {error}`},pluginTextResponse:{pdf:`PDF`,pdfFailed:`⚠ PDF fehlgeschlagen`,editContent:`Textinhalt bearbeiten`,applyChanges:`Änderungen übernehmen`,copyLabel:`Kopieren`,speakerSystem:`System`,speakerUser:`Sie`,speakerAssistant:`Assistent`,copiedLabel:`Kopiert!`,cancel:`Abbrechen`,seededByPlugin:`von {pkg}`,seededByPluginTooltip:`Diese Nachricht wurde vom Plugin {pkg} erstellt und nicht von Ihnen gesendet.`,truncatedForRender:`Diese Nachricht ist ungewöhnlich lang (insgesamt {total} Zeichen). Nur der erste Teil wird angezeigt – {omitted} Zeichen ausgeblendet, damit der Tab reaktionsfähig bleibt. Nutze „Kopieren“ für den vollständigen Text.`},pluginSkill:{noDescription:`(keine Beschreibung)`},pluginSpreadsheet:{previewUntitled:`Tabelle`,previewSheets:`{count} Blatt | {count} Blätter`,untitled:`Tabelle`,excel:`Excel`,valuePlaceholder:`Wert`,valueOrFormulaPlaceholder:`Wert oder Formel (z. B. 100 oder SUM(B2:B11))`,formatPlaceholder:`Format (z. B. $#,##0.00)`,loading:`Tabelle wird geladen...`,noData:`Keine Tabellendaten verfügbar`,editData:`Tabellendaten bearbeiten`,applyChanges:`Änderungen übernehmen`,dataMustBeArray:`Daten müssen ein Array von Blättern sein`,loadFailed:`Laden der Tabelle fehlgeschlagen: {error}`,invalidJsonAlert:`Ungültiges JSON-Format: {error}`,unknownError:`Unbekannter Fehler`,update:`Aktualisieren`,stringType:`Zeichenkette`,formulaType:`Formel`},app:{startConversation:`Gespräch beginnen`,thinking:`Denkt nach…`},suggestionsPanel:{suggestions:`Vorschläge`,skills:`Skills`,tooltip:`Vorschläge und Skills`,emptySuggestions:`Keine Vorschläge.`,emptySkills:`Keine Skills installiert.`,skillsError:`Fehler beim Laden der Skills: {error}`,sendEditHint:`klicken zum Senden · Shift+Klick zum Bearbeiten`},settingsToolsTab:{explanation:`Zusätzliche Tool-Namen, die Claude über {allowedTools} übergeben werden sollen. Einer pro Zeile. Nützlich für in Claude Code integrierte MCP-Server wie Gmail / Google Kalender, nachdem Sie sich über {claudeMcp} authentifiziert haben.`,connectorsSectionTitle:`Verbundene Konnektoren`,connectorsEmpty:`Keine Konnektoren gefunden.`,connectorConnected:`Verbunden`,connectorDisconnected:`Nicht verbunden`,connectorsGuide:`Konnektoren wie Slack und Gmail erlauben Claude den Zugriff auf Ihre Konten. Konnektoren können in Claude Desktop oder {configLink} hinzugefügt oder entfernt werden. (Öffnet claude.ai)`,connectorsConfigLinkText:`hier`},confirmModal:{defaultTitle:`Bestätigen`,defaultConfirm:`Bestätigen`,defaultCancel:`Abbrechen`}},Vlt=[`en`,`ja`,`zh`,`ko`,`es`,`pt-BR`,`fr`,`de`],Hlt={en:Nlt,ja:Plt,zh:Flt,ko:Ilt,es:Llt,"pt-BR":Rlt,fr:zlt,de:Blt};function Ult(e){return Vlt.some(t=>t===e)}function Wlt(e){if(Ult(e))return e;let t=e.toLowerCase();for(let e of Vlt)if(e.toLowerCase()===t)return e;let[n=t]=t.split(`-`);return Ult(n)?n:Vlt.find(e=>e.toLowerCase().startsWith(`${n}-`))??null}var Glt=`en`;function Klt(){if(typeof navigator<`u`){let e=navigator.languages&&navigator.languages.length>0?navigator.languages:[navigator.language];for(let t of e){if(typeof t!=`string`)continue;let e=Wlt(t);if(e)return e}}return Glt}var qlt=Klt(),WI=Ge({legacy:!1,locale:qlt,fallbackLocale:`en`,messages:Hlt}),Jlt=ele,Ylt=[`frame-src`,`script-src`,`style-src`,`font-src`,`img-src`,`media-src`,`connect-src`],GI=(e,t)=>[...e[t]??[]];function Xlt(e){try{let t=new URL(e);return t.protocol!==`https:`||e.toLowerCase()!==`https://${t.host}`?!1:t.hostname.length>0&&[...t.hostname].every(e=>/[a-z0-9.-]/i.test(e))}catch{return!1}}function Zlt(e){if(!Na(e))return{};let t={};for(let n of Ylt){let r=e[n];if(!Array.isArray(r))continue;let i=r.map(e=>typeof e==`string`?e.trim():``).filter(Xlt);i.length>0&&(t[n]=[...new Set(i)])}return t}function Qlt(e,t,n,r=``,i=``,a={}){let o=[...n],s=Zlt(a),c=[`default-src 'none'`,`script-src ${[`'unsafe-inline'`,...o,...GI(s,`script-src`)].join(` `)}`,`style-src ${[`'unsafe-inline'`,...o,...GI(s,`style-src`)].join(` `)}`,`font-src ${[...o,...GI(s,`font-src`)].join(` `)}`,`img-src ${[t,...o,`data:`,`blob:`,...r?[r]:[],...GI(s,`img-src`)].join(` `)}`],l=[...i?[i]:[],...GI(s,`media-src`)];l.length>0&&c.push(`media-src ${l.join(` `)}`);let u=GI(s,`frame-src`);return u.length>0&&c.push(`frame-src ${u.join(` `)}`),c.push(`connect-src ${[e,...GI(s,`connect-src`)].join(` `)}`),c.join(`; `)}function $lt(e,t=Jlt,n={}){return Qlt(`'none'`,e??`'self'`,t,``,``,n)}function eut(e,t=Jlt,n={}){return Qlt(e,e,t,`https:`,`${e} https: data: blob:`,n)}var tut=``;function nut(e,t={}){let n=`<meta http-equiv="Content-Security-Policy" content="${$lt(void 0,Jlt,t)}">`;return/<head\b[^>]*>/i.test(e)?e.replace(/(<head\b[^>]*>)/i,`$1${n}`):`<!DOCTYPE html><html><head>${n}</head><body>${e}</body></html>${tut}`}M();var rut=V({}),iut=ee(rut);async function aut(){try{let e=await bN(kP.config.base);e.ok&&(rut.value=Zlt(e.data.csp??{}))}catch{}}var out={key:`text-blue-700`,string:`text-green-700`,number:`text-orange-600`,keyword:`text-purple-700`,punct:`text-gray-500`,whitespace:``},sut=[{type:`string`,pattern:/^"(?:[^"\\]|\\.)*"/},{type:`keyword`,pattern:/^(?:true|false|null)\b/},{type:`number`,pattern:/^-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/},{type:`whitespace`,pattern:/^\s+/},{type:`punct`,pattern:/^[{}[\]:,]/}];function cut(e){for(let{type:t,pattern:n}of sut){let r=n.exec(e);if(r)return{type:t,value:r[0]}}return null}function lut(e){let t=[],n=0;for(;n<e.length;){let r=e.slice(n),i=cut(r);i?(t.push(i),n+=i.value.length):(t.push({type:`punct`,value:r.slice(0,1)}),n++)}return fut(t)}var uut=e=>e?.type===`punct`&&e.value===`:`,dut=(e,t)=>{let n=e[t+1];return n?.type===`whitespace`?e[t+2]:n};function fut(e){return e.map((t,n)=>t.type===`string`&&uut(dut(e,n))?{type:`key`,value:t.value}:t)}function put(e){try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}}function mut(e){return e.split(/\r?\n/).filter(e=>e.trim().length>0).map(e=>{try{return{tokens:lut(JSON.stringify(JSON.parse(e),null,2)),parseError:!1}}catch{return{tokens:lut(e),parseError:!0}}})}o();function KI(e,t){if(!e)return!1;let n=e.toLowerCase();return t.some(e=>n.endsWith(e))}var hut=`artifacts/html/`;function gut(e){if(!e)return null;let t=e.toLowerCase();if(!t.endsWith(`.html`)&&!t.endsWith(`.htm`)||!e.startsWith(hut))return null;let n=e.slice(15);return n.length===0?null:`/artifacts/html/${n.split(`/`).map(encodeURIComponent).join(`/`)}`}var _ut=`artifacts/svg/`;function vut(e){if(!e||!e.toLowerCase().endsWith(`.svg`)||!e.startsWith(_ut))return null;let t=e.slice(14);return t.length===0?null:`/artifacts/svg/${t.split(`/`).map(encodeURIComponent).join(`/`)}`}function yut(e,t){let n=m(()=>KI(e.value,[`.md`,`.markdown`])),r=m(()=>KI(e.value,[`.html`,`.htm`])),i=m(()=>KI(e.value,[`.json`])),a=m(()=>KI(e.value,[`.jsonl`,`.ndjson`])),o=m(()=>t.value?.kind===`text`&&r.value?nut(t.value.content,iut.value):``);return Ve(()=>t.value?.kind===`text`&&r.value,e=>{e&&aut()},{immediate:!0}),{isMarkdown:n,isHtml:r,isJson:i,isJsonl:a,sandboxedHtml:o,htmlPreviewUrl:m(()=>r.value?gut(e.value):null),jsonTokens:m(()=>!t.value||t.value.kind!==`text`||!i.value?[]:lut(put(t.value.content))),jsonlLines:m(()=>!t.value||t.value.kind!==`text`||!a.value?[]:mut(t.value.content)),mdFrontmatter:m(()=>{if(!t.value||t.value.kind!==`text`||!n.value)return null;let e=Va(t.value.content),r=Object.entries(e.meta).map(([e,t])=>({key:e,value:t}));return{...e,fields:r}})}}M();function but(){let e=V(null),t=V(!1),n=V(null),r=null;async function i(i){r?.abort();let a=new AbortController;r=a,t.value=!0,n.value=null,e.value=null;try{let t=await bN(kP.files.content,{path:i},{signal:a.signal});if(a.signal.aborted)return;t.ok?e.value=t.data:n.value=t.error}finally{r===a&&(t.value=!1,r=null)}}function a(){r?.abort(),r=null,t.value=!1}return{content:e,contentLoading:t,contentError:n,loadContent:i,abortContent:a}}M();function qI(e){return typeof e!=`string`||e.length===0||e.startsWith(`/`)?!1:!e.split(`/`).some(e=>e===`..`)}function xut(e){return Array.isArray(e)?e.length===0?null:e.join(`/`):Fa(e)?e:null}function Sut(){let e=PI(),t=NI(),{content:n,contentLoading:r,contentError:i,loadContent:a,abortContent:o}=but(),s=xut(e.params.pathMatch),c=V(qI(s)?s:null);function l(n){c.value=n,a(n),t.push({name:`files`,params:{pathMatch:n.split(`/`)},query:e.query}).catch(e=>{AI(e)||console.error(`[selectFile] navigation failed:`,e)})}function u(){o(),c.value=null,n.value=null,i.value=null,t.replace({name:`files`,params:{pathMatch:[]},query:e.query}).catch(e=>{AI(e)||console.error(`[deselectFile] navigation failed:`,e)})}return{selectedPath:c,content:n,contentLoading:r,contentError:i,loadContent:a,selectFile:l,deselectFile:u,abortContent:o}}M();var Cut=x({});function wut(e){return Cut[e]??0}function Tut(e){Cut[e]=Date.now()}var Eut=`/api/files/raw`;function Dut(e){Eut=e}var Out=`artifacts/images/`;function JI(e){return e.startsWith(`data:`)?e:e.startsWith(Out)?`/${e}`:`${Eut}?path=${encodeURIComponent(e)}`}function kut(e){if(e.startsWith(`data:`))return e;let t=JI(e),n=wut(e);return n<=0?t:`${t}${t.includes(`?`)?`&`:`?`}v=${n}`}var Aut=150,jut=150;function Mut(){return`(function(){var v=window.__MC_VIEW,cbs=[],t,qcbs=[],qt;function fire(){t=undefined;cbs.slice().forEach(function(cb){try{cb()}catch(e){}});}function fireQuery(){qt=undefined;var q=v.searchQuery;qcbs.slice().forEach(function(cb){try{cb(q)}catch(e){}});}window.addEventListener('message',function(e){if(e.source!==window.parent)return;var d=e.data;if(!d||d.type!=='mc-collection-changed'||d.slug!==v.slug)return;if(t)clearTimeout(t);t=setTimeout(fire,${Aut});});var qch=new MessageChannel();qch.port1.onmessage=function(e){var d=e.data;if(!d||d.type!=='mc-search-query')return;v.searchQuery=typeof d.query==='string'?d.query:'';if(qt)clearTimeout(qt);qt=setTimeout(fireQuery,${jut});};window.parent.postMessage({type:'mc-view-ready',slug:v.slug},v.origin,[qch.port2]);v.onChange=function(cb){if(typeof cb!=='function')return function(){};cbs.push(cb);return function(){var i=cbs.indexOf(cb);if(i>=0)cbs.splice(i,1);};};v.onSearchQueryChange=function(cb){if(typeof cb!=='function')return function(){};qcbs.push(cb);return function(){var i=qcbs.indexOf(cb);if(i>=0)qcbs.splice(i,1);};};v.openItem=function(id,mode){window.parent.postMessage({type:'mc-open-item',slug:v.slug,id:String(id),mode:mode==='edit'?'edit':'view'},v.origin);};v.startChat=function(prompt,role){window.parent.postMessage({type:'mc-start-chat',slug:v.slug,prompt:String(prompt),role:typeof role==='string'?role:undefined},v.origin);};v.dict=v.dict||{};v.t=function(key,named){var s=v.dict[key];if(typeof s!=='string')return typeof key==='string'?key:String(key);if(!named||typeof named!=='object')return s;return s.replace(/\\{(\\w+)\\}/g,function(m,n){var x=named[n];return x==null?m:String(x);});};document.addEventListener('securitypolicyviolation',function(e){window.parent.postMessage({type:'mc-csp-violation',slug:v.slug,nonce:v.cspNonce,blockedURI:e.blockedURI,violatedDirective:e.violatedDirective,effectiveDirective:e.effectiveDirective},v.origin);});})();`}function Nut(e,t){return e.startsWith(`/`)?`${t}${e}`:e}function Put(e,t,n={},r=``){let i=`${`<meta http-equiv="Content-Security-Policy" content="${eut(t.origin,void 0,n)}">`}<script>window.__MC_VIEW=${JSON.stringify({slug:t.slug,token:t.token,dataUrl:Nut(t.dataUrl,t.origin),origin:t.origin,searchQuery:``,cspNonce:r,locale:t.locale??``,dict:t.dict??{}}).replace(/</g,`\\u003c`)};${Mut()}<\/script>`;return/<head\b[^>]*>/i.test(e)?e.replace(/(<head\b[^>]*>)/i,`$1${i}`):`<!DOCTYPE html><html><head>${i}</head><body>${e}</body></html>`}M();var Fut=5,YI=V([]),Iut=ee(YI);function Lut(){YI.value=[]}function Rut(e){try{return new URL(e).origin}catch{return e}}var zut=64,XI=new Set;function But(e){if(e)for(XI.add(e);XI.size>zut;){let e=XI.values().next().value;if(e===void 0)break;XI.delete(e)}}function Vut(e){return Na(e)&&e.type===`mc-csp-violation`}function Hut(e){if(!Vut(e))return null;let t=typeof e.blockedURI==`string`?e.blockedURI:``,n=typeof e.violatedDirective==`string`?e.violatedDirective:typeof e.effectiveDirective==`string`?e.effectiveDirective:``;return!t||t===`inline`||t===`eval`?null:{host:Rut(t),directive:n.split(` `)[0]||``}}function Uut(e){if(YI.value.some(t=>t.host===e.host&&t.directive===e.directive))return;YI.value=[e,...YI.value].slice(0,Fut);let t=e.directive?` (${e.directive})`:``;console.warn(`[csp] blocked ${e.host}${t}. To allow it, add the host to config/csp.json — but only if you trust it.`)}function Wut(e,t,n){return e!==`null`||!Vut(t)||!n(typeof t.nonce==`string`?t.nonce:``)?null:Hut(t)}function Gut(e){let t=Wut(e.origin,e.data,e=>XI.has(e));t&&Uut(t)}var Kut=!1;function qut(){Kut||typeof window>`u`||(Kut=!0,window.addEventListener(`message`,Gut))}M();var ZI=V({isOpen:!1,title:``,message:``,confirmText:``,cancelText:``,variant:`primary`,resolve:null});function Jut(){function e(e){let t=typeof e==`string`?{message:e}:e;return new Promise(e=>{let n=ZI.value.resolve;n&&n(!1),ZI.value={isOpen:!0,title:t.title||``,message:t.message,confirmText:t.confirmText||``,cancelText:t.cancelText||``,variant:t.variant||`primary`,resolve:e}})}function t(e){ZI.value.resolve&&ZI.value.resolve(e),ZI.value.isOpen=!1,ZI.value.resolve=null}return{confirmState:ZI,openConfirm:e,handleConfirm:t}}function Yut(){let e=Promise.resolve();return{enqueue:t=>{let n=e.then(t,t);return e=n.then(()=>void 0,()=>void 0),n}}}var Xut=Object.keys({kind:!0,slug:!0,title:!0,icon:!0,color:!0});function Zut(e){let t=Object.entries(e);return Object.fromEntries(t.filter(([e])=>!Xut.includes(e)))}function Qut(e,t){return e.kind===t.kind&&e.slug===t.slug}function $ut(e,t,n){let r=n===`up`?t-1:t+1,i=e[t],a=e[r];if(!i||!a)return e;let o=[...e];return o[t]=a,o[r]=i,o}function edt(e,t,n,r){let i=e.findIndex(e=>Qut(e,{kind:t,slug:n}));return i<0?e:$ut(e,i,r)}function tdt(e){return e===void 0?{}:{color:e}}function ndt(e,t){return t.title!==e.title||t.icon!==e.icon||t.color!==e.color}function rdt(e,t){return{...Zut(e),kind:e.kind,slug:e.slug,title:t.title,icon:t.icon,...tdt(t.color)}}function idt(e,t,n){let r=new Map(n.map(e=>[e.slug,e])),i=e.flatMap(e=>{if(e.kind!==t)return[e];let n=r.get(e.slug);return n?[ndt(e,n)?rdt(e,n):e]:[]});return{next:i,drifted:i.length!==e.length||i.some((t,n)=>t!==e[n])}}o(),M();var QI=V([]),$I=V(null),eL=V(!1),tL=null;async function nL(e=!1){return tL&&!e||(tL=(async()=>{let e=await bN(kP.shortcuts);e.ok?($I.value=null,QI.value=e.data.shortcuts,eL.value=!0):($I.value=e.error,tL=null)})()),tL}var{enqueue:rL}=Yut();async function iL(e,t){QI.value=e;let n=await SN(kP.shortcuts,{shortcuts:e});return n.ok?(QI.value=n.data.shortcuts,$I.value=null,!0):(QI.value=t,$I.value=n.error,console.error(`[useShortcuts] persist failed`,n.error),!1)}function aL(e,t){return QI.value.some(n=>Qut(n,{kind:e,slug:t}))}function adt(e){return rL(async()=>{if(await nL(),!eL.value)return!1;if(aL(e.kind,e.slug))return!0;let t=QI.value;return iL([...t,e],t)})}function odt(e,t){return rL(async()=>{if(await nL(),!eL.value)return!1;if(!aL(e,t))return!0;let n=QI.value;return iL(n.filter(n=>!Qut(n,{kind:e,slug:t})),n)})}function sdt(e,t,n){return rL(async()=>{if(await nL(),!eL.value)return!1;let r=QI.value,i=edt(r,e,t,n);return i===r||iL(i,r)})}function cdt(e,t){return rL(async()=>{if(await nL(),!eL.value)return;let{next:n,drifted:r}=idt(QI.value,e,t);r&&await iL(n,QI.value)})}function oL(){return nL(),{shortcuts:m(()=>QI.value),loadError:m(()=>$I.value),load:nL,isPinned:aL,pin:adt,unpin:odt,movePinned:sdt,reconcile:cdt}}o(),M(),we(),le();var ldt=[`title`,`aria-label`,`aria-pressed`,`data-testid`],udt={class:`material-icons text-lg`},ddt=K({__name:`PinToggle`,props:{kind:{},slug:{},title:{},icon:{},color:{}},setup(e){let t=e,{t:n}=We(),{isPinned:r,pin:i,unpin:a}=oL(),o=m(()=>r(t.kind,t.slug));function u(){o.value?a(t.kind,t.slug):i({kind:t.kind,slug:t.slug,title:t.title,icon:t.icon,...t.color===void 0?{}:{color:t.color}})}return(t,r)=>(B(),U(`button`,{type:`button`,class:c([`h-8 w-8 flex items-center justify-center rounded transition-colors`,o.value?`text-amber-500 hover:bg-amber-50`:`text-slate-400 hover:bg-slate-100 hover:text-slate-600`]),title:o.value?q(n)(`shortcuts.unpin`):q(n)(`shortcuts.pin`),"aria-label":o.value?q(n)(`shortcuts.unpin`):q(n)(`shortcuts.pin`),"aria-pressed":o.value,"data-testid":`pin-toggle-${e.kind}-${e.slug}`,onClick:s(u,[`stop`]),onKeydown:[r[0]||=l(s(()=>{},[`stop`]),[`enter`]),r[1]||=l(s(()=>{},[`stop`]),[`space`])]},[S(`span`,udt,T(o.value?`star`:`star_border`),1)],42,ldt))}});M(),Dut(kP.files.raw);var{openConfirm:fdt}=Jut(),sL=(e,t)=>e.replace(`:slug`,encodeURIComponent(t)),pdt=(e,t)=>sL(kP.collections.item,e).replace(`:itemId`,encodeURIComponent(t)),mdt=(e,t,n)=>sL(kP.collections.itemAction,e).replace(`:itemId`,encodeURIComponent(t)).replace(`:actionId`,encodeURIComponent(n)),hdt=(e,t)=>sL(kP.collections.collectionAction,e).replace(`:actionId`,encodeURIComponent(t)),gdt=(e,t)=>sL(kP.collections.viewDelete,e).replace(`:viewId`,encodeURIComponent(t)),_dt=(e,t)=>sL(kP.collections.remoteViewMutate,e).replace(`:viewId`,encodeURIComponent(t)),vdt=(e,t)=>sL(kP.collections.remoteViewItems,e).replace(`:viewId`,encodeURIComponent(t)),ydt=null,bdt=null,xdt=null,cL=new Map,lL=new Map;function Sdt(e,t,n){return aP().subscribe(get(e,t),()=>n())}function Cdt(e){let{slug:t,appId:n}=e;if(cL.get(t)!==n){n===void 0?cL.delete(t):cL.set(t,n);for(let e of lL.get(t)??[])e.unsubscribeApp?.(),e.unsubscribeApp=n===void 0?null:Sdt(t,n,e.onChange)}}function wdt(e,t){let n=aP().subscribe(get(e),()=>t()),r=cL.get(e),i={onChange:t,unsubscribeApp:r===void 0?null:Sdt(e,r,t)},a=lL.get(e)??new Set;return a.add(i),lL.set(e,a),()=>{n(),i.unsubscribeApp?.(),i.unsubscribeApp=null,a.delete(i),a.size===0&&lL.delete(e)}}function Tdt(e){ydt=e.startChat,bdt=e.startNewChatDraft,xdt=e.notifiedSeverities}LXe({fetchCollectionDetail:e=>bN(sL(kP.collections.detail,e)).then(e=>(e.ok&&Cdt(e.data.collection),e)),fileAssetUrl:e=>qI(e)?gut(e)??vut(e):null,fileRoutePath:e=>qI(e)?`/files/${e.split(`/`).map(encodeURIComponent).join(`/`)}`:null,imageSrc:e=>JI(e),confirm:e=>fdt(e),deleteView:(e,t)=>CN(gdt(e,t)),mintViewToken:(e,t)=>xN(sL(kP.collections.viewToken,e),{viewId:t}),fetchViewHtml:async(e,t)=>{try{await aut();let n=await wN(sL(kP.collections.viewFile,e),{query:{id:t}});return n.ok?{ok:!0,html:await n.text()}:{ok:!1,status:n.status}}catch{return{ok:!1,status:0}}},fetchViewI18n:(e,t,n)=>bN(sL(kP.collections.viewI18n,e),{id:t,locale:n}),fetchRemoteView:(e,t,n)=>bN(sL(kP.collections.remoteView,e),{id:t,locale:n}),mutateRemoteView:(e,t,n)=>xN(_dt(e,t),n),fetchRemoteViewItems:(e,t,n)=>bN(vdt(e,t),{offset:n.offset,limit:n.limit,fields:n.fields?.join(`,`)||void 0}),buildViewSrcdoc:(e,t)=>{let n=crypto.randomUUID();return But(n),Put(e,t,iut.value,n)},createItem:(e,t)=>xN(sL(kP.collections.items,e),t),updateItem:(e,t,n)=>SN(pdt(e,t),n),deleteItem:(e,t)=>CN(pdt(e,t)),deleteCollection:e=>CN(sL(kP.collections.detail,e)),deleteFeed:e=>CN(sL(kP.feeds.detail,e)),runItemAction:(e,t,n,r)=>xN(mdt(e,t,n),r?{params:r}:{}),runCollectionAction:(e,t)=>xN(hdt(e,t),{}),refreshCollection:e=>xN(sL(kP.collections.refresh,e),{}),pushCalendarCollection:e=>xN(sL(kP.collections.calendarPush,e),{}),routeSlug:()=>typeof UI.currentRoute.value.params.slug==`string`?UI.currentRoute.value.params.slug:void 0,routeSelectedId:()=>typeof UI.currentRoute.value.query.selected==`string`?UI.currentRoute.value.query.selected:void 0,isFeedRoute:()=>UI.currentRoute.value.name===AP.feeds,setSelectedId:e=>{let t={...UI.currentRoute.value.query};e===null?delete t.selected:t.selected=e,UI.replace({query:t}).catch(()=>{})},gotoIndex:e=>{UI.push({name:e===`feed`?AP.feeds:AP.collections,params:{}}).catch(()=>{})},gotoDetail:(e,t)=>{UI.push({name:e===`feed`?AP.feeds:AP.collections,params:{slug:t}}).catch(()=>{})},navigateToRecord:(e,t)=>{UI.push({name:AP.collections,params:{slug:e},query:t===void 0?{}:{selected:t}}).catch(()=>{})},recordHref:(e,t)=>{let n=`/collections/${encodeURIComponent(e)}`;return t===void 0?n:`${n}?selected=${encodeURIComponent(t)}`},navigate:e=>{UI.push(e).catch(()=>{})},listCollections:()=>bN(kP.collections.list).then(e=>(e.ok&&e.data.collections.forEach(Cdt),e)),listFeeds:()=>bN(kP.feeds.list),fetchOntology:()=>bN(kP.collections.ontology),listRegistry:()=>bN(kP.collectionsRegistry.list),importRegistry:(e,t,n)=>xN(kP.collectionsRegistry.import,{author:e,slug:t,registry:n}),reconcileShortcuts:(e,t)=>oL().reconcile(e,t),localeTag:()=>q(WI.global.locale),startChat:(e,t)=>ydt?.(e,t),startNewChatDraft:(e,t)=>bdt?.(e,t),generalRoleId:CI.general,personalRoleId:CI.personal,unpin:(e,t)=>oL().unpin(e,t),notifiedSeverities:e=>xdt?.(e)??new Map,subscribeChanges:(e,t)=>wdt(e,t),pinToggle:ddt,translate:e=>xN(kP.translation.translate,e).then(e=>e.ok?e.data:null)}),o(),we(),M(),le();var uL=null;function Edt(e){uL=e}function dL(){if(!uL)throw Error(`@mulmoclaude/accounting-plugin: configureAccountingHost() must be called before the accounting View mounts`);return uL}function Ddt(e,t){return dL().apiCall(e,t)}function Odt(e,t){return dL().subscribe(e,t)}function kdt(){return dL().localeTag()}function fL(){return uL?.projectScope?.()??null}var pL=ci({en:{pluginAccounting:{title:`Accounting`,noBook:`No books yet — click "+ New book" above to create your first one.`,common:{cancel:`Cancel`,loading:`Loading…`,error:`Error: {error}`,empty:`No entries yet.`},tabs:{journal:`Journal`,newEntry:`New entry`,opening:`Opening`,accounts:`Accounts`,ledger:`Ledger`,balanceSheet:`Balance sheet`,profitLoss:`P&L`,settings:`Settings`},bookSwitcher:{label:`Book`,newBook:`New book…`,create:`Create`,nameLabel:`Name`,currencyLabel:`Currency`,countryLabel:`Country`,countryPlaceholder:`Select a country…`,countryHint:`The country sets the tax jurisdiction so the assistant can give country-specific advice (T-number for Japan, VAT ID for the EU, etc.).`,fiscalYearEndLabel:`Fiscal year end`,fiscalYearEndHint:`Determines the fiscal year boundary used by the date-range shortcuts in this book. Pick the month whose last day the fiscal year ends on. Default is December (calendar year).`,placeholder:`Pick a book…`,firstRunHint:`Pick a name, currency, country, and fiscal year end for your first book. The currency is set per-book and is hard to change once you start booking entries.`},deletedNotice:{title:`"{bookName}" has been deleted.`,body:`Pick another book from the dropdown above, or create a new one.`},journalList:{fromLabel:`From`,toLabel:`To`,accountLabel:`Account`,allAccounts:`All accounts`,void:`Void`,edit:`Edit`,voidConfirm:`Void this entry? The original stays in the journal; a reversing pair is appended.`,voidReason:`Reason (optional):`,columns:{date:`Date`,kind:`Kind`,memo:`Memo`,lines:`Lines`},kind:{normal:`—`,opening:`Opening`,void:`Reverse`,voidMarker:`Void marker`}},entryForm:{title:`New journal entry`,editTitle:`Edit journal entry`,editBanner:`When you submit, the original entry will be voided and replaced by this one.`,dateLabel:`Date`,memoLabel:`Memo`,accountLabel:`Account`,debitLabel:`Debit`,creditLabel:`Credit`,taxRegistrationIdLabel:`Tax registration ID`,taxRegistrationIdPlaceholder:`T-number / VAT ID / GSTIN…`,taxRegistrationIdMissingWarning:`Required`,addLine:`Add line`,removeLine:`Remove`,submit:`Post entry`,submitting:`Posting…`,update:`Update entry`,updating:`Updating…`,cancelEdit:`Cancel`,success:`Entry posted.`,editSuccess:`Entry updated.`,editVoidReason:`edited`,imbalance:`Imbalance: {amount}`,balanced:`Balanced ✓`},openingForm:{title:`Opening balances`,asOfLabel:`As of`,explainer:`Enter your balance-sheet positions as of the start date. Income / expense accounts are not allowed here. Σ debit must equal Σ credit; the difference plug-in is Retained Earnings.`,emptyHint:`It's fine to save with everything blank — you can update opening balances later. The book just needs an opening on file before other tabs unlock.`,explainer2:`Balance-sheet accounts only.`,submit:`Save opening balances`,replaceWarning:`Saving replaces the existing opening (the old one is voided in the journal).`,none:`No opening balance set yet.`,setBy:`Set as of {date}`,success:`Opening balances saved.`},ledger:{selectAccount:`Select account`,closingBalance:`Closing balance`,columns:{date:`Date`,memo:`Memo`,debit:`Debit`,credit:`Credit`,balance:`Balance`,taxRegistrationId:`Tax registration ID`}},dateRange:{shortcutLabel:`Range`,currentQuarter:`Current quarter`,previousQuarter:`Last quarter`,currentYear:`Current year`,previousYear:`Last year`,lifetime:`Lifetime`,all:`All`,fromLabel:`From`,toLabel:`To`},balanceSheet:{asOfLabel:`Period`,sections:{asset:`Assets`,liability:`Liabilities`,equity:`Equity`},total:`Total`,imbalance:`Imbalance: {amount}`,currentEarnings:`Current period earnings`,shortcutLabel:`Shortcut`,thisMonth:`This month`,lastMonth:`Last month`,lastQuarter:`Last quarter`,lastYear:`Last year`},profitLoss:{fromLabel:`From`,toLabel:`To`,income:`Income`,expense:`Expense`,netIncome:`Net income:`},accounts:{listEmpty:`No accounts in this category yet.`,openLedgerAria:`Open ledger for {code} {name}`,manageButton:`Manage accounts`,modalTitle:`Manage accounts`,addAccount:`Add account`,sectionTitle:{asset:`Assets`,liability:`Liabilities`,equity:`Equity`,income:`Income`,expense:`Expenses`},columnCode:`Code`,columnName:`Name`,columnType:`Type`,columnNote:`Note`,typeOption:{asset:`Asset`,liability:`Liability`,equity:`Equity`,income:`Income`,expense:`Expense`},edit:`Edit`,save:`Save`,cancel:`Cancel`,saving:`Saving…`,addToCategory:`Add {type} account`,deactivate:`Deactivate`,reactivate:`Activate`,deactivateConfirm:`Hide "{name}" from entry/ledger dropdowns? Existing journal entries are unaffected.`,errorEmptyCode:`Code is required.`,errorReservedCode:`Codes starting with “_” are reserved for system rows.`,errorInvalidCodeFormat:`Account code must be exactly 4 digits.`,errorCodeTypeMismatch:`Code must match the account type: 1xxx asset, 2xxx liability, 3xxx equity, 4xxx income, 5xxx expense.`,errorEmptyName:`Name is required.`,errorDuplicateCode:`An account with this code already exists.`,errorDuplicateName:`An account with this name already exists.`,success:`Account saved.`,codeReadOnlyHint:`Code can't be changed once an account is created.`,noteOptional:`(optional)`},settings:{bookInfo:`Book information`,bookInfoExplain:`Edit the country to update tax-jurisdiction-specific advice. Currency cannot be changed once entries are booked.`,countryUnset:`(not set)`,fiscalYearEndExplain:`Changes only how date-range shortcuts resolve from now on; existing journal entries are not moved.`,saveChanges:`Save changes`,updateOk:`Book updated.`,rebuild:`Rebuild snapshots`,rebuildExplain:`Drops every cached monthly snapshot and recomputes them from the journal. Safe to run; useful after editing journal files by hand.`,rebuildOk:`Rebuilt {count} period(s).`,advanced:`Advanced…`,deleteBook:`Delete book`,deleteBookExplain:`Permanently deletes this book's directory. Cannot be undone.`,deleteBookConfirm:`Type "{bookName}" to confirm:`,deleteBookButton:`Delete forever`},preview:{entry:`Posted entry on {date}`,pl:`P&L {from} → {to}: net {net}`,bs:`Balance sheet as of {date} · assets {assets}`,bookCreated:`Created book "{name}" ({id})`,accountSaved:`Saved account {code} "{name}"`,entryVoided:`Voided entry; reversal posted on {date}`,openingSet:`Set opening balances as of {date}`,openingReplaced:`Replaced opening balances as of {date}`},previewSummary:`Accounting · {bookId}`,previewError:`Accounting: {error}`,previewGeneric:`Accounting result`}},ja:{pluginAccounting:{title:`会計`,noBook:`まだ帳簿がありません — 上の "+ 新しい帳簿" から作成してください。`,common:{cancel:`キャンセル`,loading:`読み込み中…`,error:`エラー: {error}`,empty:`まだエントリがありません。`},tabs:{journal:`仕訳`,newEntry:`新規仕訳`,opening:`期首残高`,accounts:`勘定科目`,ledger:`元帳`,balanceSheet:`貸借対照表`,profitLoss:`損益`,settings:`設定`},bookSwitcher:{label:`帳簿`,newBook:`新しい帳簿…`,create:`作成`,nameLabel:`名前`,currencyLabel:`通貨`,countryLabel:`国`,countryPlaceholder:`国を選択…`,countryHint:`国を設定すると税の管轄が決まり、アシスタントが国別のアドバイス(日本のT番号、EUのVAT IDなど)を提供できます。`,fiscalYearEndLabel:`会計年度末日`,fiscalYearEndHint:`この帳簿の日付範囲ショートカットで使う会計年度の境界を決めます。会計年度が終わる月(その月末日)を選びます。デフォルトは12月(暦年)。`,placeholder:`帳簿を選択…`,firstRunHint:`最初の帳簿の名前・通貨・国・会計年度末日を選んでください。通貨は帳簿ごとに固定で、仕訳を入力した後の変更は難しくなります。`},deletedNotice:{title:`「{bookName}」を削除しました。`,body:`上のドロップダウンから別の帳簿を選ぶか、新しい帳簿を作成してください。`},journalList:{fromLabel:`開始日`,toLabel:`終了日`,accountLabel:`勘定科目`,allAccounts:`すべての科目`,void:`取消`,edit:`編集`,voidConfirm:`この仕訳を取り消しますか?元の仕訳は journal に残り、逆仕訳が追記されます。`,voidReason:`理由(任意):`,columns:{date:`日付`,kind:`種別`,memo:`メモ`,lines:`行`},kind:{normal:`—`,opening:`期首`,void:`逆仕訳`,voidMarker:`取消マーカー`}},entryForm:{title:`新規仕訳`,editTitle:`仕訳の編集`,editBanner:`送信すると、元の仕訳は取り消され、この内容で置き換えられます。`,dateLabel:`日付`,memoLabel:`メモ`,accountLabel:`勘定科目`,debitLabel:`借方`,creditLabel:`貸方`,taxRegistrationIdLabel:`登録番号`,taxRegistrationIdPlaceholder:`T1234567890123`,taxRegistrationIdMissingWarning:`必須`,addLine:`行を追加`,removeLine:`削除`,submit:`起票`,submitting:`起票中…`,update:`更新`,updating:`更新中…`,cancelEdit:`キャンセル`,success:`起票しました。`,editSuccess:`仕訳を更新しました。`,editVoidReason:`編集`,imbalance:`差額: {amount}`,balanced:`バランス OK ✓`},openingForm:{title:`期首残高`,asOfLabel:`基準日`,explainer:`B/S 科目(資産・負債・純資産)のみ入力可能。Σ借方=Σ貸方を満たす必要があり、差額は Retained Earnings に集約されます。`,emptyHint:`すべて空欄のまま保存しても構いません — 期首残高は後から更新できます。他のタブを利用するには、いったん期首残高が登録されている必要があります。`,explainer2:`B/S 科目のみ。`,submit:`期首残高を保存`,replaceWarning:`保存すると既存の期首残高は journal で取り消されます。`,none:`期首残高は未設定です。`,setBy:`{date} 時点で設定済み`,success:`期首残高を保存しました。`},ledger:{selectAccount:`科目を選択`,closingBalance:`期末残高`,columns:{date:`日付`,memo:`メモ`,debit:`借方`,credit:`貸方`,balance:`残高`,taxRegistrationId:`登録番号`}},dateRange:{shortcutLabel:`範囲`,currentQuarter:`今四半期`,previousQuarter:`前四半期`,currentYear:`今年度`,previousYear:`前年度`,lifetime:`開設以来`,all:`すべて`,fromLabel:`開始日`,toLabel:`終了日`},balanceSheet:{asOfLabel:`対象月`,sections:{asset:`資産`,liability:`負債`,equity:`純資産`},total:`合計`,imbalance:`差額: {amount}`,currentEarnings:`当期純損益`,shortcutLabel:`ショートカット`,thisMonth:`今月`,lastMonth:`先月`,lastQuarter:`前四半期`,lastYear:`前年`},profitLoss:{fromLabel:`開始日`,toLabel:`終了日`,income:`収益`,expense:`費用`,netIncome:`当期純利益:`},accounts:{listEmpty:`このカテゴリにはまだ勘定科目がありません。`,openLedgerAria:`{code} {name} の元帳を開く`,manageButton:`勘定科目を管理`,modalTitle:`勘定科目の管理`,addAccount:`勘定科目を追加`,sectionTitle:{asset:`資産`,liability:`負債`,equity:`純資産`,income:`収益`,expense:`費用`},columnCode:`コード`,columnName:`名称`,columnType:`区分`,columnNote:`メモ`,typeOption:{asset:`資産`,liability:`負債`,equity:`純資産`,income:`収益`,expense:`費用`},edit:`編集`,save:`保存`,cancel:`キャンセル`,saving:`保存中…`,addToCategory:`{type}を追加`,deactivate:`無効化`,reactivate:`有効化`,deactivateConfirm:`「{name}」を仕訳・元帳の選択肢から非表示にしますか?既存の仕訳には影響しません。`,errorEmptyCode:`コードは必須です。`,errorReservedCode:`「_」で始まるコードはシステム用に予約されています。`,errorInvalidCodeFormat:`勘定科目コードは4桁の数字で入力してください。`,errorCodeTypeMismatch:`コードの先頭桁は勘定科目タイプと一致させてください: 1xxx 資産, 2xxx 負債, 3xxx 純資産, 4xxx 収益, 5xxx 費用。`,errorEmptyName:`名称は必須です。`,errorDuplicateCode:`このコードの勘定科目は既に存在します。`,errorDuplicateName:`この名称の勘定科目は既に存在します。`,success:`勘定科目を保存しました。`,codeReadOnlyHint:`コードは作成後に変更できません。`,noteOptional:`(任意)`},settings:{bookInfo:`帳簿情報`,bookInfoExplain:`国を編集すると税の管轄に応じたアドバイスが更新されます。通貨は仕訳を入力した後は変更できません。`,countryUnset:`(未設定)`,fiscalYearEndExplain:`今後の日付範囲ショートカットの解決方法のみが変わります。既存の仕訳は移動しません。`,saveChanges:`変更を保存`,updateOk:`帳簿を更新しました。`,rebuild:`スナップショット再構築`,rebuildExplain:`月次スナップショットキャッシュをすべて削除し、journal から再計算します。journal を手で編集した後のリカバリに使えます。`,rebuildOk:`{count} 期間を再構築しました。`,advanced:`詳細設定…`,deleteBook:`帳簿を削除`,deleteBookExplain:`この帳簿のディレクトリを完全に削除します。元に戻せません。`,deleteBookConfirm:`確認のため "{bookName}" を入力してください:`,deleteBookButton:`完全に削除`},preview:{entry:`{date} の仕訳を起票`,pl:`P&L {from} → {to}: 純損益 {net}`,bs:`{date} 時点の B/S · 資産 {assets}`,bookCreated:`帳簿 "{name}" ({id}) を作成`,accountSaved:`勘定科目 {code} "{name}" を保存`,entryVoided:`仕訳を取り消し、{date} に反対仕訳を計上`,openingSet:`{date} 時点の期首残高を設定`,openingReplaced:`{date} 時点の期首残高を置き換え`},previewSummary:`会計 · {bookId}`,previewError:`会計: {error}`,previewGeneric:`会計の結果`}},zh:{pluginAccounting:{title:`会计`,noBook:`尚无账簿 — 点击上方 "+ 新建账簿" 创建第一个。`,common:{cancel:`取消`,loading:`加载中…`,error:`错误: {error}`,empty:`尚无条目。`},tabs:{journal:`日记账`,newEntry:`新建分录`,opening:`期初余额`,accounts:`科目`,ledger:`明细账`,balanceSheet:`资产负债表`,profitLoss:`损益`,settings:`设置`},bookSwitcher:{label:`账簿`,newBook:`新建账簿…`,create:`创建`,nameLabel:`名称`,currencyLabel:`货币`,countryLabel:`国家/地区`,countryPlaceholder:`选择国家/地区…`,countryHint:`国家/地区决定税务管辖,助手可据此提供本地化建议(日本T号、欧盟VAT ID等)。`,fiscalYearEndLabel:`财年结束日`,fiscalYearEndHint:`决定本账簿日期范围快捷方式所使用的财年边界。请选择财年结束的月份(该月最后一天)。默认 12月(自然年)。`,placeholder:`选择账簿…`,firstRunHint:`请为第一本账簿选择名称、货币、国家/地区与财年结束日。货币按账簿固定,登账后再更改会比较困难。`},deletedNotice:{title:`“{bookName}” 已删除。`,body:`请从上方下拉菜单选择其他账簿,或新建一本。`},journalList:{fromLabel:`起始`,toLabel:`结束`,accountLabel:`科目`,allAccounts:`所有科目`,void:`冲销`,edit:`编辑`,voidConfirm:`冲销此分录?原始分录保留在日记账中,会追加一对反向分录。`,voidReason:`原因(可选):`,columns:{date:`日期`,kind:`类型`,memo:`备注`,lines:`明细`},kind:{normal:`—`,opening:`期初`,void:`反向`,voidMarker:`冲销标记`}},entryForm:{title:`新建分录`,editTitle:`编辑分录`,editBanner:`提交后,原分录将被冲销并以此内容替换。`,dateLabel:`日期`,memoLabel:`备注`,accountLabel:`科目`,debitLabel:`借方`,creditLabel:`贷方`,taxRegistrationIdLabel:`税务登记号`,taxRegistrationIdPlaceholder:`T-number / VAT ID / GSTIN…`,taxRegistrationIdMissingWarning:`必填`,addLine:`添加行`,removeLine:`删除`,submit:`登账`,submitting:`登账中…`,update:`更新`,updating:`更新中…`,cancelEdit:`取消`,success:`已登账。`,editSuccess:`分录已更新。`,editVoidReason:`已编辑`,imbalance:`差额: {amount}`,balanced:`已平衡 ✓`},openingForm:{title:`期初余额`,asOfLabel:`基准日`,explainer:`仅允许 B/S 科目(资产 / 负债 / 权益)。Σ借方=Σ贷方,差额会落入 Retained Earnings。`,emptyHint:`可以全部留空保存——期初余额稍后再更新。账簿只需先存在一条期初记录,其他标签页才会解锁。`,explainer2:`仅 B/S 科目。`,submit:`保存期初余额`,replaceWarning:`保存会替换现有期初余额(旧的会在日记账中冲销)。`,none:`尚未设置期初余额。`,setBy:`{date} 已设置`,success:`期初余额已保存。`},ledger:{selectAccount:`选择科目`,closingBalance:`期末余额`,columns:{date:`日期`,memo:`备注`,debit:`借方`,credit:`贷方`,balance:`余额`,taxRegistrationId:`税务登记号`}},dateRange:{shortcutLabel:`范围`,currentQuarter:`本季度`,previousQuarter:`上季度`,currentYear:`本年度`,previousYear:`上年度`,lifetime:`自开账以来`,all:`全部`,fromLabel:`起始`,toLabel:`结束`},balanceSheet:{asOfLabel:`期间`,sections:{asset:`资产`,liability:`负债`,equity:`权益`},total:`合计`,imbalance:`差额: {amount}`,currentEarnings:`当期净损益`,shortcutLabel:`快捷方式`,thisMonth:`本月`,lastMonth:`上月`,lastQuarter:`上季度`,lastYear:`上年`},profitLoss:{fromLabel:`起始`,toLabel:`结束`,income:`收入`,expense:`支出`,netIncome:`净利润:`},accounts:{listEmpty:`此分类下暂无科目。`,openLedgerAria:`打开 {code} {name} 的明细账`,manageButton:`管理科目`,modalTitle:`管理科目`,addAccount:`添加科目`,sectionTitle:{asset:`资产`,liability:`负债`,equity:`权益`,income:`收入`,expense:`费用`},columnCode:`代码`,columnName:`名称`,columnType:`类型`,columnNote:`备注`,typeOption:{asset:`资产`,liability:`负债`,equity:`权益`,income:`收入`,expense:`费用`},edit:`编辑`,save:`保存`,cancel:`取消`,saving:`保存中…`,addToCategory:`添加{type}`,deactivate:`停用`,reactivate:`启用`,deactivateConfirm:`在分录/明细账下拉框中隐藏“{name}”?现有日记账分录不受影响。`,errorEmptyCode:`代码不能为空。`,errorReservedCode:`以 “_” 开头的代码保留给系统行使用。`,errorInvalidCodeFormat:`科目代码必须为 4 位数字。`,errorCodeTypeMismatch:`代码首位必须与科目类型匹配:1xxx 资产,2xxx 负债,3xxx 权益,4xxx 收入,5xxx 费用。`,errorEmptyName:`名称不能为空。`,errorDuplicateCode:`此代码的科目已存在。`,errorDuplicateName:`此名称的科目已存在。`,success:`科目已保存。`,codeReadOnlyHint:`科目创建后代码不能更改。`,noteOptional:`(可选)`},settings:{bookInfo:`账簿信息`,bookInfoExplain:`修改国家/地区可更新税务管辖相关建议。开始登账后货币不可更改。`,countryUnset:`(未设置)`,fiscalYearEndExplain:`仅影响今后日期范围快捷方式的解析方式;现有日记账分录不会移动。`,saveChanges:`保存更改`,updateOk:`账簿已更新。`,rebuild:`重建快照`,rebuildExplain:`删除全部月度快照缓存并从日记账重新计算。手动编辑日记账后可用。`,rebuildOk:`已重建 {count} 期。`,advanced:`高级设置…`,deleteBook:`删除账簿`,deleteBookExplain:`永久删除该账簿目录。无法撤销。`,deleteBookConfirm:`请输入 "{bookName}" 以确认:`,deleteBookButton:`彻底删除`},preview:{entry:`已记账 {date} 的分录`,pl:`P&L {from} → {to}: 净额 {net}`,bs:`{date} 资产负债表 · 资产 {assets}`,bookCreated:`已创建账簿 "{name}" ({id})`,accountSaved:`已保存科目 {code} "{name}"`,entryVoided:`已作废分录,并于 {date} 过账冲销分录`,openingSet:`已设置截至 {date} 的期初余额`,openingReplaced:`已替换截至 {date} 的期初余额`},previewSummary:`会计 · {bookId}`,previewError:`会计: {error}`,previewGeneric:`会计结果`}},ko:{pluginAccounting:{title:`회계`,noBook:`장부가 없습니다 — 위의 "+ 새 장부"를 눌러 첫 장부를 만드세요.`,common:{cancel:`취소`,loading:`불러오는 중…`,error:`오류: {error}`,empty:`아직 항목이 없습니다.`},tabs:{journal:`분개장`,newEntry:`새 분개`,opening:`기초잔액`,accounts:`계정`,ledger:`원장`,balanceSheet:`재무상태표`,profitLoss:`손익`,settings:`설정`},bookSwitcher:{label:`장부`,newBook:`새 장부…`,create:`생성`,nameLabel:`이름`,currencyLabel:`통화`,countryLabel:`국가`,countryPlaceholder:`국가 선택…`,countryHint:`국가를 설정하면 세무 관할이 결정되어 어시스턴트가 국가별 안내(일본 T-번호, EU VAT ID 등)를 제공할 수 있습니다.`,fiscalYearEndLabel:`회계연도 종료일`,fiscalYearEndHint:`이 장부의 날짜 범위 단축 메뉴에 사용되는 회계연도 경계를 결정합니다. 회계연도가 끝나는 월(그 달의 마지막 날)을 선택하세요. 기본값은 12월(달력 연도)입니다.`,placeholder:`장부 선택…`,firstRunHint:`첫 장부의 이름, 통화, 국가, 회계연도 종료일을 선택하세요. 통화는 장부별로 설정되며 분개를 시작한 뒤에는 변경이 어렵습니다.`},deletedNotice:{title:`“{bookName}” 장부가 삭제되었습니다.`,body:`위 드롭다운에서 다른 장부를 선택하거나 새 장부를 만드세요.`},journalList:{fromLabel:`시작`,toLabel:`종료`,accountLabel:`계정`,allAccounts:`모든 계정`,void:`취소`,edit:`편집`,voidConfirm:`이 분개를 취소하시겠습니까? 원 분개는 분개장에 남고 반대 분개가 추가됩니다.`,voidReason:`사유(선택):`,columns:{date:`날짜`,kind:`종류`,memo:`메모`,lines:`라인`},kind:{normal:`—`,opening:`기초`,void:`반대`,voidMarker:`취소 마커`}},entryForm:{title:`새 분개`,editTitle:`분개 편집`,editBanner:`제출하면 원본 분개가 무효 처리되고 이 내용으로 대체됩니다.`,dateLabel:`날짜`,memoLabel:`메모`,accountLabel:`계정`,debitLabel:`차변`,creditLabel:`대변`,taxRegistrationIdLabel:`세무 등록번호`,taxRegistrationIdPlaceholder:`T-number / VAT ID / GSTIN…`,taxRegistrationIdMissingWarning:`필수`,addLine:`라인 추가`,removeLine:`삭제`,submit:`등록`,submitting:`등록 중…`,update:`업데이트`,updating:`업데이트 중…`,cancelEdit:`취소`,success:`분개를 등록했습니다.`,editSuccess:`분개가 업데이트되었습니다.`,editVoidReason:`편집됨`,imbalance:`차액: {amount}`,balanced:`균형 ✓`},openingForm:{title:`기초잔액`,asOfLabel:`기준일`,explainer:`재무상태표 계정(자산/부채/자본)만 입력 가능. Σ차변=Σ대변이 되어야 하며 차액은 Retained Earnings에 흡수됩니다.`,emptyHint:`모두 비워둔 채 저장해도 괜찮습니다 — 기초잔액은 나중에 업데이트할 수 있습니다. 다른 탭을 사용하려면 일단 기초잔액 항목이 등록되어 있어야 합니다.`,explainer2:`재무상태표 계정만.`,submit:`기초잔액 저장`,replaceWarning:`저장 시 기존 기초잔액은 분개장에서 취소됩니다.`,none:`기초잔액이 설정되지 않았습니다.`,setBy:`{date} 기준 설정됨`,success:`기초잔액을 저장했습니다.`},ledger:{selectAccount:`계정 선택`,closingBalance:`기말 잔액`,columns:{date:`날짜`,memo:`메모`,debit:`차변`,credit:`대변`,balance:`잔액`,taxRegistrationId:`세무 등록번호`}},dateRange:{shortcutLabel:`범위`,currentQuarter:`이번 분기`,previousQuarter:`지난 분기`,currentYear:`이번 연도`,previousYear:`지난 연도`,lifetime:`개설 이후`,all:`전체`,fromLabel:`시작`,toLabel:`종료`},balanceSheet:{asOfLabel:`기간`,sections:{asset:`자산`,liability:`부채`,equity:`자본`},total:`합계`,imbalance:`차액: {amount}`,currentEarnings:`당기 순손익`,shortcutLabel:`바로가기`,thisMonth:`이번 달`,lastMonth:`지난달`,lastQuarter:`지난 분기`,lastYear:`지난 연도`},profitLoss:{fromLabel:`시작`,toLabel:`종료`,income:`수익`,expense:`비용`,netIncome:`당기순이익:`},accounts:{listEmpty:`이 카테고리에는 아직 계정이 없습니다.`,openLedgerAria:`{code} {name} 원장 열기`,manageButton:`계정 관리`,modalTitle:`계정 관리`,addAccount:`계정 추가`,sectionTitle:{asset:`자산`,liability:`부채`,equity:`자본`,income:`수익`,expense:`비용`},columnCode:`코드`,columnName:`이름`,columnType:`유형`,columnNote:`메모`,typeOption:{asset:`자산`,liability:`부채`,equity:`자본`,income:`수익`,expense:`비용`},edit:`편집`,save:`저장`,cancel:`취소`,saving:`저장 중…`,addToCategory:`{type} 추가`,deactivate:`비활성화`,reactivate:`활성화`,deactivateConfirm:`‘{name}’을(를) 분개/원장 드롭다운에서 숨기시겠습니까? 기존 분개 항목에는 영향이 없습니다.`,errorEmptyCode:`코드는 필수입니다.`,errorReservedCode:`“_”로 시작하는 코드는 시스템 행에 예약되어 있습니다.`,errorInvalidCodeFormat:`계정 코드는 정확히 4자리 숫자여야 합니다.`,errorCodeTypeMismatch:`코드의 첫 자리는 계정 유형과 일치해야 합니다: 1xxx 자산, 2xxx 부채, 3xxx 자본, 4xxx 수익, 5xxx 비용.`,errorEmptyName:`이름은 필수입니다.`,errorDuplicateCode:`이 코드의 계정이 이미 존재합니다.`,errorDuplicateName:`이 이름의 계정이 이미 존재합니다.`,success:`계정을 저장했습니다.`,codeReadOnlyHint:`계정을 만든 후에는 코드를 변경할 수 없습니다.`,noteOptional:`(선택)`},settings:{bookInfo:`장부 정보`,bookInfoExplain:`국가를 변경하면 세무 관할 기반 안내가 갱신됩니다. 분개를 시작한 뒤에는 통화를 변경할 수 없습니다.`,countryUnset:`(미설정)`,fiscalYearEndExplain:`이후 날짜 범위 단축 메뉴의 해석 방식만 변경됩니다. 기존 분개 항목은 이동되지 않습니다.`,saveChanges:`변경 저장`,updateOk:`장부를 업데이트했습니다.`,rebuild:`스냅샷 재구축`,rebuildExplain:`모든 월별 스냅샷 캐시를 지우고 분개장에서 재계산합니다. 분개 파일을 직접 편집한 뒤 복구할 때 유용합니다.`,rebuildOk:`{count}개 기간을 재구축했습니다.`,advanced:`고급…`,deleteBook:`장부 삭제`,deleteBookExplain:`이 장부의 디렉터리를 영구히 삭제합니다. 되돌릴 수 없습니다.`,deleteBookConfirm:`확인을 위해 "{bookName}"을 입력하세요:`,deleteBookButton:`영구 삭제`},preview:{entry:`{date} 분개를 등록`,pl:`P&L {from} → {to}: 순이익 {net}`,bs:`{date} 재무상태표 · 자산 {assets}`,bookCreated:`장부 "{name}" ({id})를 생성했습니다`,accountSaved:`계정 {code} "{name}"을(를) 저장했습니다`,entryVoided:`분개를 취소하고 {date}에 역분개를 기록했습니다`,openingSet:`{date} 기준 기초 잔액을 설정했습니다`,openingReplaced:`{date} 기준 기초 잔액을 교체했습니다`},previewSummary:`회계 · {bookId}`,previewError:`회계: {error}`,previewGeneric:`회계 결과`}},es:{pluginAccounting:{title:`Contabilidad`,noBook:`Aún no hay libros — pulsa "+ Nuevo libro" arriba para crear el primero.`,common:{cancel:`Cancelar`,loading:`Cargando…`,error:`Error: {error}`,empty:`Aún no hay entradas.`},tabs:{journal:`Diario`,newEntry:`Nueva entrada`,opening:`Apertura`,accounts:`Cuentas`,ledger:`Mayor`,balanceSheet:`Balance`,profitLoss:`P&L`,settings:`Ajustes`},bookSwitcher:{label:`Libro`,newBook:`Nuevo libro…`,create:`Crear`,nameLabel:`Nombre`,currencyLabel:`Moneda`,countryLabel:`País`,countryPlaceholder:`Selecciona un país…`,countryHint:`El país define la jurisdicción fiscal para que el asistente pueda dar consejos específicos (T-number en Japón, ID de IVA en la UE, etc.).`,fiscalYearEndLabel:`Cierre del ejercicio`,fiscalYearEndHint:`Define el límite del ejercicio para los atajos de rango de fechas de este libro. Elige el mes en cuyo último día cierra el ejercicio. Por defecto: diciembre (año natural).`,placeholder:`Elige un libro…`,firstRunHint:`Elige el nombre, la moneda, el país y el cierre de ejercicio de tu primer libro. La moneda se fija por libro y es difícil cambiarla una vez que empieces a registrar asientos.`},deletedNotice:{title:`“{bookName}” se ha eliminado.`,body:`Elige otro libro en el desplegable de arriba o crea uno nuevo.`},journalList:{fromLabel:`Desde`,toLabel:`Hasta`,accountLabel:`Cuenta`,allAccounts:`Todas`,void:`Anular`,edit:`Editar`,voidConfirm:`¿Anular esta entrada? La original permanece en el diario; se añade un par de reversión.`,voidReason:`Motivo (opcional):`,columns:{date:`Fecha`,kind:`Tipo`,memo:`Memo`,lines:`Líneas`},kind:{normal:`—`,opening:`Apertura`,void:`Reverso`,voidMarker:`Marcador de anulación`}},entryForm:{title:`Nueva entrada`,editTitle:`Editar entrada`,editBanner:`Al enviar, la entrada original será anulada y sustituida por esta.`,dateLabel:`Fecha`,memoLabel:`Memo`,accountLabel:`Cuenta`,debitLabel:`Debe`,creditLabel:`Haber`,taxRegistrationIdLabel:`ID fiscal`,taxRegistrationIdPlaceholder:`NIF / VAT ID / RFC…`,taxRegistrationIdMissingWarning:`Obligatorio`,addLine:`Añadir línea`,removeLine:`Quitar`,submit:`Asentar`,submitting:`Asentando…`,update:`Actualizar`,updating:`Actualizando…`,cancelEdit:`Cancelar`,success:`Entrada asentada.`,editSuccess:`Entrada actualizada.`,editVoidReason:`editado`,imbalance:`Descuadre: {amount}`,balanced:`Cuadrada ✓`},openingForm:{title:`Saldos de apertura`,asOfLabel:`Al`,explainer:`Solo cuentas de balance (activo/pasivo/patrimonio). Σ debe = Σ haber; la diferencia va a Retained Earnings.`,emptyHint:`Puedes guardar todo en blanco — luego puedes actualizar los saldos de apertura. Solo hace falta tener una apertura registrada para desbloquear las demás pestañas.`,explainer2:`Solo cuentas de balance.`,submit:`Guardar saldos de apertura`,replaceWarning:`Al guardar se reemplaza la apertura existente (la anterior se anula en el diario).`,none:`Aún no hay saldos de apertura.`,setBy:`Establecido al {date}`,success:`Saldos guardados.`},ledger:{selectAccount:`Seleccionar cuenta`,closingBalance:`Saldo final`,columns:{date:`Fecha`,memo:`Memo`,debit:`Debe`,credit:`Haber`,balance:`Saldo`,taxRegistrationId:`ID fiscal`}},dateRange:{shortcutLabel:`Rango`,currentQuarter:`Trimestre actual`,previousQuarter:`Último trimestre`,currentYear:`Año en curso`,previousYear:`Año anterior`,lifetime:`Desde la apertura`,all:`Todo`,fromLabel:`Desde`,toLabel:`Hasta`},balanceSheet:{asOfLabel:`Período`,sections:{asset:`Activo`,liability:`Pasivo`,equity:`Patrimonio`},total:`Total`,imbalance:`Descuadre: {amount}`,currentEarnings:`Resultado del período`,shortcutLabel:`Atajo`,thisMonth:`Este mes`,lastMonth:`Mes anterior`,lastQuarter:`Último trimestre`,lastYear:`Año anterior`},profitLoss:{fromLabel:`Desde`,toLabel:`Hasta`,income:`Ingresos`,expense:`Gastos`,netIncome:`Resultado neto:`},accounts:{listEmpty:`No hay cuentas en esta categoría.`,openLedgerAria:`Abrir mayor de {code} {name}`,manageButton:`Gestionar cuentas`,modalTitle:`Gestionar cuentas`,addAccount:`Añadir cuenta`,sectionTitle:{asset:`Activos`,liability:`Pasivos`,equity:`Patrimonio`,income:`Ingresos`,expense:`Gastos`},columnCode:`Código`,columnName:`Nombre`,columnType:`Tipo`,columnNote:`Nota`,typeOption:{asset:`Activo`,liability:`Pasivo`,equity:`Patrimonio`,income:`Ingreso`,expense:`Gasto`},edit:`Editar`,save:`Guardar`,cancel:`Cancelar`,saving:`Guardando…`,addToCategory:`Añadir cuenta de {type}`,deactivate:`Desactivar`,reactivate:`Activar`,deactivateConfirm:`¿Ocultar “{name}” de los desplegables de asientos / mayor? Los asientos existentes no se ven afectados.`,errorEmptyCode:`El código es obligatorio.`,errorReservedCode:`Los códigos que empiezan por “_” están reservados para filas del sistema.`,errorInvalidCodeFormat:`El código de cuenta debe tener exactamente 4 dígitos.`,errorCodeTypeMismatch:`El código debe coincidir con el tipo de cuenta: 1xxx activo, 2xxx pasivo, 3xxx patrimonio, 4xxx ingreso, 5xxx gasto.`,errorEmptyName:`El nombre es obligatorio.`,errorDuplicateCode:`Ya existe una cuenta con este código.`,errorDuplicateName:`Ya existe una cuenta con este nombre.`,success:`Cuenta guardada.`,codeReadOnlyHint:`El código no puede cambiarse una vez creada la cuenta.`,noteOptional:`(opcional)`},settings:{bookInfo:`Información del libro`,bookInfoExplain:`Edita el país para actualizar los consejos según la jurisdicción fiscal. La moneda no puede cambiarse una vez registrados los asientos.`,countryUnset:`(sin definir)`,fiscalYearEndExplain:`Solo cambia cómo se resuelven los atajos de rango de fechas en adelante; los asientos existentes no se mueven.`,saveChanges:`Guardar cambios`,updateOk:`Libro actualizado.`,rebuild:`Reconstruir snapshots`,rebuildExplain:`Borra todos los snapshots mensuales y los recalcula desde el diario. Útil tras editar el diario a mano.`,rebuildOk:`Reconstruidos {count} período(s).`,advanced:`Avanzado…`,deleteBook:`Eliminar libro`,deleteBookExplain:`Elimina permanentemente el directorio del libro. No se puede deshacer.`,deleteBookConfirm:`Escribe "{bookName}" para confirmar:`,deleteBookButton:`Eliminar para siempre`},preview:{entry:`Entrada asentada el {date}`,pl:`P&L {from} → {to}: neto {net}`,bs:`Balance al {date} · activos {assets}`,bookCreated:`Libro "{name}" ({id}) creado`,accountSaved:`Cuenta {code} "{name}" guardada`,entryVoided:`Asiento anulado; reversión registrada el {date}`,openingSet:`Saldos iniciales establecidos al {date}`,openingReplaced:`Saldos iniciales reemplazados al {date}`},previewSummary:`Contabilidad · {bookId}`,previewError:`Contabilidad: {error}`,previewGeneric:`Resultado de contabilidad`}},"pt-BR":{pluginAccounting:{title:`Contabilidade`,noBook:`Ainda não há livros — clique em "+ Novo livro" acima para criar o primeiro.`,common:{cancel:`Cancelar`,loading:`Carregando…`,error:`Erro: {error}`,empty:`Ainda não há lançamentos.`},tabs:{journal:`Diário`,newEntry:`Novo lançamento`,opening:`Abertura`,accounts:`Contas`,ledger:`Razão`,balanceSheet:`Balanço`,profitLoss:`DRE`,settings:`Configurações`},bookSwitcher:{label:`Livro`,newBook:`Novo livro…`,create:`Criar`,nameLabel:`Nome`,currencyLabel:`Moeda`,countryLabel:`País`,countryPlaceholder:`Selecione um país…`,countryHint:`O país define a jurisdição fiscal para que o assistente possa dar conselhos específicos (T-number no Japão, ID de IVA na UE, etc.).`,fiscalYearEndLabel:`Encerramento do exercício`,fiscalYearEndHint:`Define o limite do exercício social usado pelos atalhos de período deste livro. Escolha o mês em cujo último dia o exercício encerra. Padrão: dezembro (ano civil).`,placeholder:`Selecione um livro…`,firstRunHint:`Escolha o nome, a moeda, o país e o encerramento do exercício do seu primeiro livro. A moeda é definida por livro e fica difícil alterar depois de começar a lançar.`},deletedNotice:{title:`“{bookName}” foi excluído.`,body:`Selecione outro livro no menu acima ou crie um novo.`},journalList:{fromLabel:`De`,toLabel:`Até`,accountLabel:`Conta`,allAccounts:`Todas as contas`,void:`Estornar`,edit:`Editar`,voidConfirm:`Estornar este lançamento? O original permanece no diário e um par de reversão é anexado.`,voidReason:`Motivo (opcional):`,columns:{date:`Data`,kind:`Tipo`,memo:`Memo`,lines:`Linhas`},kind:{normal:`—`,opening:`Abertura`,void:`Reverso`,voidMarker:`Marcador de estorno`}},entryForm:{title:`Novo lançamento`,editTitle:`Editar lançamento`,editBanner:`Ao enviar, o lançamento original será estornado e substituído por este.`,dateLabel:`Data`,memoLabel:`Memo`,accountLabel:`Conta`,debitLabel:`Débito`,creditLabel:`Crédito`,taxRegistrationIdLabel:`Inscrição fiscal`,taxRegistrationIdPlaceholder:`CNPJ / VAT ID / GSTIN…`,taxRegistrationIdMissingWarning:`Obrigatório`,addLine:`Adicionar linha`,removeLine:`Remover`,submit:`Lançar`,submitting:`Lançando…`,update:`Atualizar`,updating:`Atualizando…`,cancelEdit:`Cancelar`,success:`Lançamento registrado.`,editSuccess:`Lançamento atualizado.`,editVoidReason:`editado`,imbalance:`Diferença: {amount}`,balanced:`Equilibrado ✓`},openingForm:{title:`Saldos iniciais`,asOfLabel:`Em`,explainer:`Apenas contas de balanço (ativo/passivo/patrimônio). Σ débito = Σ crédito; a diferença entra em Retained Earnings.`,emptyHint:`Você pode salvar tudo em branco — os saldos iniciais podem ser atualizados depois. Basta ter uma abertura registrada para que as outras abas sejam liberadas.`,explainer2:`Apenas contas de balanço.`,submit:`Salvar saldos iniciais`,replaceWarning:`Salvar substitui a abertura existente (a anterior é estornada no diário).`,none:`Ainda não há saldo inicial.`,setBy:`Definido em {date}`,success:`Saldos iniciais salvos.`},ledger:{selectAccount:`Selecionar conta`,closingBalance:`Saldo final`,columns:{date:`Data`,memo:`Memo`,debit:`Débito`,credit:`Crédito`,balance:`Saldo`,taxRegistrationId:`Inscrição fiscal`}},dateRange:{shortcutLabel:`Período`,currentQuarter:`Trimestre atual`,previousQuarter:`Último trimestre`,currentYear:`Ano atual`,previousYear:`Ano anterior`,lifetime:`Desde a abertura`,all:`Tudo`,fromLabel:`De`,toLabel:`Até`},balanceSheet:{asOfLabel:`Período`,sections:{asset:`Ativo`,liability:`Passivo`,equity:`Patrimônio`},total:`Total`,imbalance:`Diferença: {amount}`,currentEarnings:`Resultado do período`,shortcutLabel:`Atalho`,thisMonth:`Este mês`,lastMonth:`Mês anterior`,lastQuarter:`Último trimestre`,lastYear:`Ano anterior`},profitLoss:{fromLabel:`De`,toLabel:`Até`,income:`Receita`,expense:`Despesa`,netIncome:`Resultado líquido:`},accounts:{listEmpty:`Ainda não há contas nesta categoria.`,openLedgerAria:`Abrir razão de {code} {name}`,manageButton:`Gerenciar contas`,modalTitle:`Gerenciar contas`,addAccount:`Adicionar conta`,sectionTitle:{asset:`Ativos`,liability:`Passivos`,equity:`Patrimônio`,income:`Receitas`,expense:`Despesas`},columnCode:`Código`,columnName:`Nome`,columnType:`Tipo`,columnNote:`Observação`,typeOption:{asset:`Ativo`,liability:`Passivo`,equity:`Patrimônio`,income:`Receita`,expense:`Despesa`},edit:`Editar`,save:`Salvar`,cancel:`Cancelar`,saving:`Salvando…`,addToCategory:`Adicionar conta de {type}`,deactivate:`Desativar`,reactivate:`Ativar`,deactivateConfirm:`Ocultar “{name}” dos menus de lançamentos / razão? Os lançamentos existentes não são afetados.`,errorEmptyCode:`O código é obrigatório.`,errorReservedCode:`Códigos iniciados por “_” são reservados para linhas do sistema.`,errorInvalidCodeFormat:`O código da conta deve ter exatamente 4 dígitos.`,errorCodeTypeMismatch:`O código deve corresponder ao tipo de conta: 1xxx ativo, 2xxx passivo, 3xxx patrimônio, 4xxx receita, 5xxx despesa.`,errorEmptyName:`O nome é obrigatório.`,errorDuplicateCode:`Já existe uma conta com este código.`,errorDuplicateName:`Já existe uma conta com este nome.`,success:`Conta salva.`,codeReadOnlyHint:`O código não pode ser alterado depois que a conta é criada.`,noteOptional:`(opcional)`},settings:{bookInfo:`Informações do livro`,bookInfoExplain:`Edite o país para atualizar as recomendações conforme a jurisdição fiscal. A moeda não pode ser alterada após registrar lançamentos.`,countryUnset:`(não definido)`,fiscalYearEndExplain:`Apenas altera como os atalhos de período são resolvidos a partir de agora; lançamentos existentes não são movidos.`,saveChanges:`Salvar alterações`,updateOk:`Livro atualizado.`,rebuild:`Reconstruir snapshots`,rebuildExplain:`Apaga todos os snapshots mensais e recalcula a partir do diário. Útil após editar o diário manualmente.`,rebuildOk:`Reconstruído(s) {count} período(s).`,advanced:`Avançado…`,deleteBook:`Excluir livro`,deleteBookExplain:`Exclui permanentemente o diretório do livro. Não pode ser desfeito.`,deleteBookConfirm:`Digite "{bookName}" para confirmar:`,deleteBookButton:`Excluir para sempre`},preview:{entry:`Lançamento em {date}`,pl:`P&L {from} → {to}: líquido {net}`,bs:`Balanço em {date} · ativos {assets}`,bookCreated:`Livro "{name}" ({id}) criado`,accountSaved:`Conta {code} "{name}" salva`,entryVoided:`Lançamento estornado; reversão lançada em {date}`,openingSet:`Saldos iniciais definidos em {date}`,openingReplaced:`Saldos iniciais substituídos em {date}`},previewSummary:`Contabilidade · {bookId}`,previewError:`Contabilidade: {error}`,previewGeneric:`Resultado da contabilidade`}},fr:{pluginAccounting:{title:`Comptabilité`,noBook:`Pas encore de livres — cliquez sur "+ Nouveau livre" en haut pour créer le premier.`,common:{cancel:`Annuler`,loading:`Chargement…`,error:`Erreur : {error}`,empty:`Aucune écriture pour l'instant.`},tabs:{journal:`Journal`,newEntry:`Nouvelle écriture`,opening:`Ouverture`,accounts:`Comptes`,ledger:`Grand livre`,balanceSheet:`Bilan`,profitLoss:`Résultat`,settings:`Paramètres`},bookSwitcher:{label:`Livre`,newBook:`Nouveau livre…`,create:`Créer`,nameLabel:`Nom`,currencyLabel:`Devise`,countryLabel:`Pays`,countryPlaceholder:`Sélectionner un pays…`,countryHint:`Le pays définit la juridiction fiscale afin que l'assistant puisse donner des conseils ciblés (T-number au Japon, ID TVA dans l'UE, etc.).`,fiscalYearEndLabel:`Clôture de l'exercice`,fiscalYearEndHint:`Définit la limite de l'exercice utilisée par les raccourcis de plage de dates de ce livre. Choisissez le mois au dernier jour duquel l'exercice se clôture. Par défaut : décembre (année civile).`,placeholder:`Sélectionner un livre…`,firstRunHint:`Choisissez le nom, la devise, le pays et la clôture de l'exercice de votre premier livre. La devise est figée par livre et difficile à changer une fois les écritures commencées.`},deletedNotice:{title:`« {bookName} » a été supprimé.`,body:`Choisissez un autre livre dans la liste ci-dessus ou créez-en un nouveau.`},journalList:{fromLabel:`Du`,toLabel:`Au`,accountLabel:`Compte`,allAccounts:`Tous`,void:`Annuler`,edit:`Modifier`,voidConfirm:`Annuler cette écriture ? L'originale reste dans le journal ; une paire de contre-passation est ajoutée.`,voidReason:`Motif (optionnel) :`,columns:{date:`Date`,kind:`Type`,memo:`Mémo`,lines:`Lignes`},kind:{normal:`—`,opening:`Ouverture`,void:`Contre-passation`,voidMarker:`Marqueur d'annulation`}},entryForm:{title:`Nouvelle écriture`,editTitle:`Modifier l'écriture`,editBanner:`À l'envoi, l'écriture d'origine sera contre-passée et remplacée par celle-ci.`,dateLabel:`Date`,memoLabel:`Mémo`,accountLabel:`Compte`,debitLabel:`Débit`,creditLabel:`Crédit`,taxRegistrationIdLabel:`N° d'identification fiscale`,taxRegistrationIdPlaceholder:`TVA / SIRET / GSTIN…`,taxRegistrationIdMissingWarning:`Obligatoire`,addLine:`Ajouter une ligne`,removeLine:`Supprimer`,submit:`Comptabiliser`,submitting:`Comptabilisation…`,update:`Mettre à jour`,updating:`Mise à jour…`,cancelEdit:`Annuler`,success:`Écriture comptabilisée.`,editSuccess:`Écriture mise à jour.`,editVoidReason:`modifiée`,imbalance:`Déséquilibre : {amount}`,balanced:`Équilibré ✓`},openingForm:{title:`Soldes d'ouverture`,asOfLabel:`Au`,explainer:`Comptes de bilan uniquement (actif/passif/capitaux). Σ débit = Σ crédit ; le solde tombe sur Retained Earnings.`,emptyHint:`Vous pouvez enregistrer en laissant tout vide — les soldes d'ouverture peuvent être mis à jour plus tard. Il suffit qu'une ouverture soit enregistrée pour débloquer les autres onglets.`,explainer2:`Comptes de bilan uniquement.`,submit:`Enregistrer les soldes d'ouverture`,replaceWarning:`Enregistrer remplace l'ouverture existante (l'ancienne est contre-passée dans le journal).`,none:`Aucun solde d'ouverture défini.`,setBy:`Défini au {date}`,success:`Soldes d'ouverture enregistrés.`},ledger:{selectAccount:`Sélectionner un compte`,closingBalance:`Solde de clôture`,columns:{date:`Date`,memo:`Mémo`,debit:`Débit`,credit:`Crédit`,balance:`Solde`,taxRegistrationId:`N° d'identification fiscale`}},dateRange:{shortcutLabel:`Plage`,currentQuarter:`Trimestre en cours`,previousQuarter:`Trimestre précédent`,currentYear:`Exercice en cours`,previousYear:`Exercice précédent`,lifetime:`Depuis l'ouverture`,all:`Tout`,fromLabel:`Du`,toLabel:`Au`},balanceSheet:{asOfLabel:`Période`,sections:{asset:`Actif`,liability:`Passif`,equity:`Capitaux`},total:`Total`,imbalance:`Déséquilibre : {amount}`,currentEarnings:`Résultat de la période`,shortcutLabel:`Raccourci`,thisMonth:`Ce mois-ci`,lastMonth:`Mois précédent`,lastQuarter:`Trimestre précédent`,lastYear:`Année précédente`},profitLoss:{fromLabel:`Du`,toLabel:`Au`,income:`Produits`,expense:`Charges`,netIncome:`Résultat net :`},accounts:{listEmpty:`Aucun compte dans cette catégorie pour l'instant.`,openLedgerAria:`Ouvrir le grand livre de {code} {name}`,manageButton:`Gérer les comptes`,modalTitle:`Gérer les comptes`,addAccount:`Ajouter un compte`,sectionTitle:{asset:`Actifs`,liability:`Passifs`,equity:`Capitaux propres`,income:`Produits`,expense:`Charges`},columnCode:`Code`,columnName:`Nom`,columnType:`Type`,columnNote:`Note`,typeOption:{asset:`Actif`,liability:`Passif`,equity:`Capitaux propres`,income:`Produit`,expense:`Charge`},edit:`Modifier`,save:`Enregistrer`,cancel:`Annuler`,saving:`Enregistrement…`,addToCategory:`Ajouter un compte de {type}`,deactivate:`Désactiver`,reactivate:`Activer`,deactivateConfirm:`Masquer « {name} » des listes déroulantes d’écriture / grand livre ? Les écritures existantes ne sont pas affectées.`,errorEmptyCode:`Le code est requis.`,errorReservedCode:`Les codes commençant par « _ » sont réservés aux lignes système.`,errorInvalidCodeFormat:`Le code de compte doit comporter exactement 4 chiffres.`,errorCodeTypeMismatch:`Le code doit correspondre au type de compte : 1xxx actif, 2xxx passif, 3xxx capitaux propres, 4xxx produit, 5xxx charge.`,errorEmptyName:`Le nom est requis.`,errorDuplicateCode:`Un compte avec ce code existe déjà.`,errorDuplicateName:`Un compte portant ce nom existe déjà.`,success:`Compte enregistré.`,codeReadOnlyHint:`Le code ne peut pas être modifié une fois le compte créé.`,noteOptional:`(facultatif)`},settings:{bookInfo:`Informations du livre`,bookInfoExplain:`Modifiez le pays pour mettre à jour les conseils selon la juridiction fiscale. La devise ne peut pas être changée une fois des écritures saisies.`,countryUnset:`(non défini)`,fiscalYearEndExplain:`Modifie uniquement la résolution des raccourcis de plage de dates à partir de maintenant ; les écritures existantes ne sont pas déplacées.`,saveChanges:`Enregistrer les modifications`,updateOk:`Livre mis à jour.`,rebuild:`Reconstruire les snapshots`,rebuildExplain:`Supprime tous les snapshots mensuels et les recalcule depuis le journal. Utile après modification manuelle du journal.`,rebuildOk:`{count} période(s) reconstruite(s).`,advanced:`Avancé…`,deleteBook:`Supprimer le livre`,deleteBookExplain:`Supprime définitivement le répertoire du livre. Irréversible.`,deleteBookConfirm:`Tapez "{bookName}" pour confirmer :`,deleteBookButton:`Supprimer définitivement`},preview:{entry:`Écriture comptabilisée le {date}`,pl:`P&L {from} → {to} : net {net}`,bs:`Bilan au {date} · actif {assets}`,bookCreated:`Livre "{name}" ({id}) créé`,accountSaved:`Compte {code} « {name} » enregistré`,entryVoided:`Écriture annulée ; contrepassation passée le {date}`,openingSet:`Soldes d'ouverture définis au {date}`,openingReplaced:`Soldes d'ouverture remplacés au {date}`},previewSummary:`Comptabilité · {bookId}`,previewError:`Comptabilité : {error}`,previewGeneric:`Résultat comptable`}},de:{pluginAccounting:{title:`Buchhaltung`,noBook:`Noch keine Bücher — klicken Sie oben auf "+ Neues Buch", um das erste anzulegen.`,common:{cancel:`Abbrechen`,loading:`Lädt…`,error:`Fehler: {error}`,empty:`Noch keine Einträge.`},tabs:{journal:`Journal`,newEntry:`Neuer Eintrag`,opening:`Eröffnung`,accounts:`Konten`,ledger:`Hauptbuch`,balanceSheet:`Bilanz`,profitLoss:`GuV`,settings:`Einstellungen`},bookSwitcher:{label:`Buch`,newBook:`Neues Buch…`,create:`Anlegen`,nameLabel:`Name`,currencyLabel:`Währung`,countryLabel:`Land`,countryPlaceholder:`Land auswählen…`,countryHint:`Das Land legt die Steuerjurisdiktion fest, damit der Assistent länderspezifische Hinweise geben kann (T-Nummer in Japan, USt-IdNr. in der EU usw.).`,fiscalYearEndLabel:`Geschäftsjahresende`,fiscalYearEndHint:`Bestimmt die Geschäftsjahresgrenze, die für die Datumsbereich-Schnellauswahl in diesem Buch verwendet wird. Wähle den Monat, an dessen letztem Tag das Geschäftsjahr endet. Standard: Dezember (Kalenderjahr).`,placeholder:`Buch auswählen…`,firstRunHint:`Wählen Sie Name, Währung, Land und Geschäftsjahresende für Ihr erstes Buch. Die Währung ist pro Buch fest und nach den ersten Buchungen schwer zu ändern.`},deletedNotice:{title:`Das Buch "{bookName}" wurde gelöscht.`,body:`Wählen Sie oben ein anderes Buch aus oder legen Sie ein neues an.`},journalList:{fromLabel:`Von`,toLabel:`Bis`,accountLabel:`Konto`,allAccounts:`Alle Konten`,void:`Stornieren`,edit:`Bearbeiten`,voidConfirm:`Diesen Eintrag stornieren? Das Original bleibt im Journal; ein Stornopaar wird angehängt.`,voidReason:`Grund (optional):`,columns:{date:`Datum`,kind:`Art`,memo:`Memo`,lines:`Zeilen`},kind:{normal:`—`,opening:`Eröffnung`,void:`Storno`,voidMarker:`Storno-Marker`}},entryForm:{title:`Neuer Eintrag`,editTitle:`Eintrag bearbeiten`,editBanner:`Beim Absenden wird der Originaleintrag storniert und durch diesen ersetzt.`,dateLabel:`Datum`,memoLabel:`Memo`,accountLabel:`Konto`,debitLabel:`Soll`,creditLabel:`Haben`,taxRegistrationIdLabel:`Steuernummer`,taxRegistrationIdPlaceholder:`USt-IdNr. / VAT ID / GSTIN…`,taxRegistrationIdMissingWarning:`Erforderlich`,addLine:`Zeile hinzufügen`,removeLine:`Entfernen`,submit:`Buchen`,submitting:`Bucht…`,update:`Aktualisieren`,updating:`Aktualisiert…`,cancelEdit:`Abbrechen`,success:`Eintrag gebucht.`,editSuccess:`Eintrag aktualisiert.`,editVoidReason:`bearbeitet`,imbalance:`Differenz: {amount}`,balanced:`Ausgeglichen ✓`},openingForm:{title:`Eröffnungsbilanz`,asOfLabel:`Per`,explainer:`Nur Bilanzkonten (Aktiva/Passiva/Eigenkapital). Σ Soll = Σ Haben; die Differenz fließt in Retained Earnings.`,emptyHint:`Sie können das Formular leer speichern — die Eröffnungsbilanz lässt sich später aktualisieren. Es reicht, dass einmalig eine Eröffnung hinterlegt ist, damit die übrigen Tabs freigeschaltet werden.`,explainer2:`Nur Bilanzkonten.`,submit:`Eröffnungsbilanz speichern`,replaceWarning:`Beim Speichern wird die bestehende Eröffnung ersetzt (die alte wird im Journal storniert).`,none:`Noch keine Eröffnungsbilanz.`,setBy:`Per {date} festgelegt`,success:`Eröffnungsbilanz gespeichert.`},ledger:{selectAccount:`Konto wählen`,closingBalance:`Schlusssaldo`,columns:{date:`Datum`,memo:`Memo`,debit:`Soll`,credit:`Haben`,balance:`Saldo`,taxRegistrationId:`Steuernummer`}},dateRange:{shortcutLabel:`Bereich`,currentQuarter:`Aktuelles Quartal`,previousQuarter:`Letztes Quartal`,currentYear:`Aktuelles Jahr`,previousYear:`Letztes Jahr`,lifetime:`Seit Eröffnung`,all:`Alle`,fromLabel:`Von`,toLabel:`Bis`},balanceSheet:{asOfLabel:`Periode`,sections:{asset:`Aktiva`,liability:`Passiva`,equity:`Eigenkapital`},total:`Summe`,imbalance:`Differenz: {amount}`,currentEarnings:`Periodenergebnis`,shortcutLabel:`Schnellauswahl`,thisMonth:`Dieser Monat`,lastMonth:`Letzter Monat`,lastQuarter:`Letztes Quartal`,lastYear:`Letztes Jahr`},profitLoss:{fromLabel:`Von`,toLabel:`Bis`,income:`Erträge`,expense:`Aufwendungen`,netIncome:`Jahresüberschuss:`},accounts:{listEmpty:`In dieser Kategorie sind noch keine Konten vorhanden.`,openLedgerAria:`Hauptbuch für {code} {name} öffnen`,manageButton:`Konten verwalten`,modalTitle:`Konten verwalten`,addAccount:`Konto hinzufügen`,sectionTitle:{asset:`Aktiva`,liability:`Passiva`,equity:`Eigenkapital`,income:`Erträge`,expense:`Aufwendungen`},columnCode:`Code`,columnName:`Name`,columnType:`Typ`,columnNote:`Notiz`,typeOption:{asset:`Aktivkonto`,liability:`Passivkonto`,equity:`Eigenkapital`,income:`Ertrag`,expense:`Aufwand`},edit:`Bearbeiten`,save:`Speichern`,cancel:`Abbrechen`,saving:`Wird gespeichert…`,addToCategory:`Konto vom Typ {type} hinzufügen`,deactivate:`Deaktivieren`,reactivate:`Aktivieren`,deactivateConfirm:`Soll „{name}“ aus den Buchungs- und Kontodropdowns ausgeblendet werden? Bestehende Buchungen bleiben unberührt.`,errorEmptyCode:`Code ist erforderlich.`,errorReservedCode:`Codes, die mit „_“ beginnen, sind für Systemzeilen reserviert.`,errorInvalidCodeFormat:`Der Kontocode muss genau 4 Ziffern haben.`,errorCodeTypeMismatch:`Der Code muss zur Kontoart passen: 1xxx Aktivkonto, 2xxx Passivkonto, 3xxx Eigenkapital, 4xxx Ertrag, 5xxx Aufwand.`,errorEmptyName:`Name ist erforderlich.`,errorDuplicateCode:`Ein Konto mit diesem Code existiert bereits.`,errorDuplicateName:`Ein Konto mit diesem Namen existiert bereits.`,success:`Konto gespeichert.`,codeReadOnlyHint:`Der Code kann nach dem Anlegen des Kontos nicht mehr geändert werden.`,noteOptional:`(optional)`},settings:{bookInfo:`Buchinformationen`,bookInfoExplain:`Ändern Sie das Land, um die Hinweise zur Steuerjurisdiktion zu aktualisieren. Die Währung kann nach gebuchten Einträgen nicht mehr geändert werden.`,countryUnset:`(nicht gesetzt)`,fiscalYearEndExplain:`Ändert nur, wie die Datumsbereich-Schnellauswahl ab jetzt aufgelöst wird; bestehende Buchungen werden nicht verschoben.`,saveChanges:`Änderungen speichern`,updateOk:`Buch aktualisiert.`,rebuild:`Snapshots neu aufbauen`,rebuildExplain:`Verwirft alle Monats-Snapshots und berechnet sie aus dem Journal neu. Nützlich nach manueller Bearbeitung.`,rebuildOk:`{count} Periode(n) neu aufgebaut.`,advanced:`Erweitert…`,deleteBook:`Buch löschen`,deleteBookExplain:`Löscht das Buch-Verzeichnis dauerhaft. Nicht rückgängig zu machen.`,deleteBookConfirm:`Tippen Sie "{bookName}" zur Bestätigung:`,deleteBookButton:`Endgültig löschen`},preview:{entry:`Eintrag am {date} gebucht`,pl:`GuV {from} → {to}: netto {net}`,bs:`Bilanz per {date} · Aktiva {assets}`,bookCreated:`Buch "{name}" ({id}) angelegt`,accountSaved:`Konto {code} "{name}" gespeichert`,entryVoided:`Buchung storniert; Gegenbuchung am {date} erfasst`,openingSet:`Eröffnungssalden zum {date} festgelegt`,openingReplaced:`Eröffnungssalden zum {date} ersetzt`},previewSummary:`Buchhaltung · {bookId}`,previewError:`Buchhaltung: {error}`,previewGeneric:`Buchhaltungs-Ergebnis`}}},kdt),Adt=u9e.dispatch.path,jdt=u9e.dispatch.method;function Mdt(e){return function(t,n={}){let r=e(),i=r?{[d9e]:r}:{};return Ddt(Adt,{method:jdt,body:{action:t,...n,...i}})}}function Ndt(e){function t(){return e(cP.getBooks)}function n(t){return e(cP.createBook,t)}function r(t){return e(cP.updateBook,t)}function i(t){return e(cP.deleteBook,{bookId:t,confirm:!0})}return{getBooks:t,createBook:n,updateBook:r,deleteBook:i}}function Pdt(e){function t(t){return e(cP.getAccounts,{bookId:t})}function n(t,n){return e(cP.upsertAccount,{account:t,bookId:n})}return{getAccounts:t,upsertAccount:n}}function Fdt(e){function t(t){return e(cP.addEntries,t)}function n(t){return e(cP.voidEntry,t)}function r(t){return e(cP.getJournalEntries,t)}function i(t){return e(cP.getOpeningBalances,{bookId:t})}function a(t){return e(cP.setOpeningBalances,t)}return{addEntries:t,voidEntry:n,getJournalEntries:r,getOpeningBalances:i,setOpeningBalances:a}}function Idt(e){function t(t,n){return e(cP.getReport,{kind:`balance`,period:t,bookId:n})}function n(t,n){return e(cP.getReport,{kind:`pl`,period:t,bookId:n})}function r(t,n,r){return e(cP.getReport,{kind:`ledger`,accountCode:t,period:n,bookId:r})}function i(t){return e(cP.getTimeSeries,{...t})}function a(t){return e(cP.rebuildSnapshots,{bookId:t})}return{getBalanceSheet:t,getProfitLoss:n,getLedger:r,getTimeSeries:i,rebuildSnapshots:a}}function Ldt(e){let t=Mdt(e);return{...Ndt(t),...Pdt(t),...Fdt(t),...Idt(t)}}var Rdt=Ldt(fL),zdt=Symbol(`accounting-api`);function Bdt(e){let t=Ldt(e);return C(zdt,t),t}function mL(){return Re(zdt,Rdt)}var Vdt={class:`text-base font-semibold`},Hdt={key:0,class:`text-xs text-gray-500`,"data-testid":`accounting-new-book-firstrun`},Udt={class:`text-sm flex flex-col gap-1`},Wdt={class:`text-sm flex flex-col gap-1`},Gdt=[`value`],Kdt={class:`text-sm flex flex-col gap-1`},qdt={value:``},Jdt=[`value`],Ydt={class:`text-xs text-gray-500`},Xdt={class:`text-sm flex flex-col gap-1`},Zdt=[`value`],Qdt={class:`text-xs text-gray-500`},$dt={key:1,class:`text-xs text-red-500`,"data-testid":`accounting-new-book-error`},eft={class:`flex justify-end gap-2 mt-1`},tft=[`disabled`],nft=K({__name:`NewBookForm`,props:{firstRun:{type:Boolean,default:!1},cancelable:{type:Boolean,default:!0},fullPage:{type:Boolean,default:!1}},emits:[`cancel`,`created`],setup(e,{emit:t}){let n=mL(),{t:r,locale:a}=pL();function o(e){try{let{region:t}=new Intl.Locale(e).maximize();if(N9e(t))return t}catch{}return``}function l(e){let t=o(e);return t===``?o(typeof navigator<`u`&&typeof navigator.language==`string`?navigator.language:``):t}let d=e,f=t,p=V(``),h=V(`USD`),g=V(l(a.value)),_=V(12),v=V(!1),y=V(null),x=V(null);P(()=>{be(()=>x.value?.focus())});let C=m(()=>I9e.map(e=>({code:e,label:`${e} — ${R9e(e,a.value)}`}))),w=m(()=>hP.map(e=>({code:e,label:`${e} — ${M9e(e,a.value)}`}))),E=m(()=>dP.map(e=>({value:e,label:C9e(e,a.value)}))),O=m(()=>d.fullPage?`flex-1 bg-white flex items-center justify-center p-6 overflow-auto`:`fixed inset-0 z-50 bg-black/20 flex items-center justify-center`),k=m(()=>d.cancelable&&!d.fullPage);function A(){d.fullPage||j()}function j(){d.cancelable&&f(`cancel`)}async function M(){if(!v.value){v.value=!0,y.value=null;try{let e=g.value===``?void 0:g.value,t=await n.createBook({name:p.value.trim(),currency:h.value,country:e,fiscalYearEnd:_.value});if(!t.ok){y.value=t.error;return}f(`created`,t.data.book)}finally{v.value=!1}}}return(t,n)=>(B(),U(`div`,{class:c(O.value),"data-testid":`accounting-new-book-modal`,onClick:s(A,[`self`])},[S(`form`,{class:`bg-white p-4 rounded shadow-lg w-96 flex flex-col gap-3`,"data-testid":`accounting-new-book-form`,onSubmit:s(M,[`prevent`])},[S(`h3`,Vdt,T(q(r)(`pluginAccounting.bookSwitcher.newBook`)),1),e.firstRun?(B(),U(`p`,Hdt,T(q(r)(`pluginAccounting.bookSwitcher.firstRunHint`)),1)):b(``,!0),S(`label`,Udt,[J(T(q(r)(`pluginAccounting.bookSwitcher.nameLabel`))+` `,1),u(S(`input`,{ref_key:`nameInput`,ref:x,"onUpdate:modelValue":n[0]||=e=>p.value=e,required:``,class:`h-8 px-2 rounded border border-gray-300 text-sm`,"data-testid":`accounting-new-book-name`},null,512),[[Fe,p.value]])]),S(`label`,Wdt,[J(T(q(r)(`pluginAccounting.bookSwitcher.currencyLabel`))+` `,1),u(S(`select`,{"onUpdate:modelValue":n[1]||=e=>h.value=e,class:`h-8 px-2 rounded border border-gray-300 text-sm bg-white`,"data-testid":`accounting-new-book-currency`},[(B(!0),U(D,null,H(C.value,e=>(B(),U(`option`,{key:e.code,value:e.code},T(e.label),9,Gdt))),128))],512),[[i,h.value]])]),S(`label`,Kdt,[J(T(q(r)(`pluginAccounting.bookSwitcher.countryLabel`))+` `,1),u(S(`select`,{"onUpdate:modelValue":n[2]||=e=>g.value=e,class:`h-8 px-2 rounded border border-gray-300 text-sm bg-white`,"data-testid":`accounting-new-book-country`},[S(`option`,qdt,T(q(r)(`pluginAccounting.bookSwitcher.countryPlaceholder`)),1),(B(!0),U(D,null,H(w.value,e=>(B(),U(`option`,{key:e.code,value:e.code},T(e.label),9,Jdt))),128))],512),[[i,g.value]])]),S(`p`,Ydt,T(q(r)(`pluginAccounting.bookSwitcher.countryHint`)),1),S(`label`,Xdt,[J(T(q(r)(`pluginAccounting.bookSwitcher.fiscalYearEndLabel`))+` `,1),u(S(`select`,{"onUpdate:modelValue":n[3]||=e=>_.value=e,required:``,class:`h-8 px-2 rounded border border-gray-300 text-sm bg-white`,"data-testid":`accounting-new-book-fiscal-year-end`},[(B(!0),U(D,null,H(E.value,e=>(B(),U(`option`,{key:e.value,value:e.value},T(e.label),9,Zdt))),128))],512),[[i,_.value]])]),S(`p`,Qdt,T(q(r)(`pluginAccounting.bookSwitcher.fiscalYearEndHint`)),1),y.value?(B(),U(`p`,$dt,T(y.value),1)):b(``,!0),S(`div`,eft,[k.value?(B(),U(`button`,{key:0,type:`button`,class:`h-8 px-2.5 rounded border border-gray-300 text-sm text-gray-700 hover:bg-gray-50`,onClick:j},T(q(r)(`pluginAccounting.common.cancel`)),1)):b(``,!0),S(`button`,{type:`submit`,class:`h-8 px-2.5 rounded bg-blue-600 hover:bg-blue-700 text-white text-sm`,disabled:v.value,"data-testid":`accounting-new-book-submit`},T(v.value?q(r)(`pluginAccounting.common.loading`):q(r)(`pluginAccounting.bookSwitcher.create`)),9,tft)])],32)],2))}}),rft={class:`flex items-center gap-2`},ift={class:`text-xs text-gray-500`,for:`accounting-book-select`},aft=[`value`],oft={key:0,value:``,disabled:``},sft=[`value`],cft=`__new__`,lft=K({__name:`BookSwitcher`,props:{modelValue:{},books:{}},emits:[`update:modelValue`,`books-changed`,`book-created`],setup(e,{emit:t}){let{t:n}=pL(),r=e,i=t,a=V(!1);function o(e){let t=e.country?`${e.currency} · ${e.country}`:e.currency;return`${e.name} (${t})`}function s(e){let{target:t}=e;if(!(t instanceof HTMLSelectElement))return;let n=t.value;n===cft?(t.value=r.modelValue,a.value=!0):n!==r.modelValue&&i(`update:modelValue`,n)}function c(e){a.value=!1,i(`book-created`,e)}return(t,r)=>(B(),U(`div`,rft,[S(`label`,ift,T(q(n)(`pluginAccounting.bookSwitcher.label`)),1),S(`select`,{id:`accounting-book-select`,value:e.modelValue,class:`h-8 px-2 rounded border border-gray-300 text-sm bg-white`,"data-testid":`accounting-book-select`,onChange:s},[e.modelValue===``?(B(),U(`option`,oft,T(q(n)(`pluginAccounting.bookSwitcher.placeholder`)),1)):b(``,!0),(B(!0),U(D,null,H(e.books,e=>(B(),U(`option`,{key:e.id,value:e.id},T(o(e)),9,sft))),128)),r[1]||=S(`option`,{disabled:``},`──────────`,-1),S(`option`,{value:cft,"data-testid":`accounting-new-book-option`},`+ `+T(q(n)(`pluginAccounting.bookSwitcher.newBook`)),1)],40,aft),a.value?(B(),ke(nft,{key:0,onCancel:r[0]||=e=>a.value=!1,onCreated:c})):b(``,!0)]))}});function hL(){let e=0;return{begin(){return e+=1,e},isCurrent(t){return t===e}}}var uft={class:`flex flex-wrap items-end gap-2`,"data-testid":`accounting-daterange`},dft={class:`text-xs text-gray-500 flex flex-col gap-1`},fft=[`value`],pft={value:`currentQuarter`},mft={value:`previousQuarter`},hft={value:`currentYear`},gft={value:`previousYear`},_ft={key:0,value:`lifetime`},vft={value:`all`},yft={class:`text-xs text-gray-500 flex flex-col gap-1`},bft=[`value`],xft={class:`text-xs text-gray-500 flex flex-col gap-1`},Sft=[`value`],gL=K({__name:`DateRangePicker`,props:{modelValue:{},fiscalYearEnd:{},openingDate:{}},emits:[`update:modelValue`],setup(e,{emit:t}){let{t:n}=pL(),r=e,i=t,a=m(()=>!!r.openingDate),o={from:``,to:``};function s(){return r.openingDate?{from:r.openingDate,to:vP()}:null}function c(e,t){return e.from===t.from&&e.to===t.to}let l=m(()=>{let e=r.modelValue,t=new Date;if(c(e,k9e(r.fiscalYearEnd,t)))return`currentQuarter`;if(c(e,A9e(r.fiscalYearEnd,t)))return`previousQuarter`;if(c(e,mP(r.fiscalYearEnd,t)))return`currentYear`;if(c(e,j9e(r.fiscalYearEnd,t)))return`previousYear`;let n=s();return n&&c(e,n)?`lifetime`:c(e,o)?`all`:``});function u(e){let{target:t}=e;if(!(t instanceof HTMLSelectElement))return;let n=t.value,a=new Date;if(n===`currentQuarter`)i(`update:modelValue`,k9e(r.fiscalYearEnd,a));else if(n===`previousQuarter`)i(`update:modelValue`,A9e(r.fiscalYearEnd,a));else if(n===`currentYear`)i(`update:modelValue`,mP(r.fiscalYearEnd,a));else if(n===`previousYear`)i(`update:modelValue`,j9e(r.fiscalYearEnd,a));else if(n===`lifetime`){let e=s();e&&i(`update:modelValue`,e)}else n===`all`&&i(`update:modelValue`,o)}function d(e){let{target:t}=e;t instanceof HTMLInputElement&&i(`update:modelValue`,{from:t.value,to:r.modelValue.to})}function f(e){let{target:t}=e;t instanceof HTMLInputElement&&i(`update:modelValue`,{from:r.modelValue.from,to:t.value})}return(t,r)=>(B(),U(`div`,uft,[S(`label`,dft,[J(T(q(n)(`pluginAccounting.dateRange.shortcutLabel`))+` `,1),S(`select`,{value:l.value,class:`h-8 px-2 rounded border border-gray-300 text-sm bg-white`,"data-testid":`accounting-daterange-shortcut`,onChange:u},[r[0]||=S(`option`,{value:``,hidden:``},null,-1),S(`option`,pft,T(q(n)(`pluginAccounting.dateRange.currentQuarter`)),1),S(`option`,mft,T(q(n)(`pluginAccounting.dateRange.previousQuarter`)),1),S(`option`,hft,T(q(n)(`pluginAccounting.dateRange.currentYear`)),1),S(`option`,gft,T(q(n)(`pluginAccounting.dateRange.previousYear`)),1),a.value?(B(),U(`option`,_ft,T(q(n)(`pluginAccounting.dateRange.lifetime`)),1)):b(``,!0),S(`option`,vft,T(q(n)(`pluginAccounting.dateRange.all`)),1)],40,fft)]),S(`label`,yft,[J(T(q(n)(`pluginAccounting.dateRange.fromLabel`))+` `,1),S(`input`,{value:e.modelValue.from,type:`date`,class:`h-8 px-2 rounded border border-gray-300 text-sm`,"data-testid":`accounting-daterange-from`,onInput:d},null,40,bft)]),S(`label`,xft,[J(T(q(n)(`pluginAccounting.dateRange.toLabel`))+` `,1),S(`input`,{value:e.modelValue.to,type:`date`,class:`h-8 px-2 rounded border border-gray-300 text-sm`,"data-testid":`accounting-daterange-to`,onInput:f},null,40,Sft)])]))}}),_L={asset:1,liability:2,equity:3,income:4,expense:5},Cft=[`14`];function wft(e){return Cft.some(t=>e.startsWith(t))}var Tft=/^\d{4}$/,Eft=10;function vL(e){return Tft.test(e)}function Dft(e){if(!vL(e))return null;let t=Number.parseInt(e.charAt(0),10);return f9e.find(e=>_L[e]===t)??null}function Oft(e,t){return Dft(e)===t}function kft(e,t){let n=_L[e],r=[];for(let e of t){if(!vL(e.code))continue;let t=Number.parseInt(e.code,10);Math.floor(t/1e3)===n&&r.push(t)}if(r.length===0)return`${n}000`;let i=Math.max(...r),a=i+Eft;if(Math.floor(a/1e3)===n&&a<=9999)return String(a);let o=i+1;return Math.floor(o/1e3)===n&&o<=9999?String(o):`${n}999`}var Aft=[`data-testid`],jft=[`checked`,`title`,`aria-label`,`data-testid`],Mft={class:`font-mono text-xs text-gray-500 w-16 shrink-0`},Nft=[`data-testid`],Pft=[`title`],Fft=[`data-testid`,`disabled`,`aria-hidden`,`tabindex`],Ift=K({__name:`AccountRow`,props:{account:{}},emits:[`edit`,`toggleActive`],setup(e,{emit:t}){let{t:n}=pL(),r=e,i=t,a=m(()=>r.account.active===!1);return(t,r)=>(B(),U(`div`,{class:c([`flex items-center gap-2 px-2 py-0.5 text-sm`,a.value?`opacity-60`:``]),"data-testid":`accounting-accounts-row-${e.account.code}`},[S(`input`,{type:`checkbox`,checked:!a.value,title:a.value?q(n)(`pluginAccounting.accounts.reactivate`):q(n)(`pluginAccounting.accounts.deactivate`),"aria-label":a.value?q(n)(`pluginAccounting.accounts.reactivate`):q(n)(`pluginAccounting.accounts.deactivate`),class:`h-4 w-4 shrink-0 cursor-pointer`,"data-testid":`accounting-accounts-toggle-${e.account.code}`,onChange:r[0]||=e=>i(`toggleActive`)},null,40,jft),S(`span`,Mft,T(e.account.code),1),S(`span`,{class:c([`grow min-w-0 truncate`,a.value?`line-through`:``]),"data-testid":a.value?`accounting-accounts-inactive-${e.account.code}`:void 0},T(e.account.name),11,Nft),e.account.note?(B(),U(`span`,{key:0,class:`text-xs text-gray-400 truncate max-w-[8rem]`,title:e.account.note},T(e.account.note),9,Pft)):b(``,!0),S(`button`,{type:`button`,class:c([`h-8 px-2.5 rounded text-sm text-blue-600 hover:bg-blue-50`,a.value?`invisible`:``]),"data-testid":`accounting-accounts-edit-${e.account.code}`,disabled:a.value,"aria-hidden":a.value?`true`:void 0,tabindex:a.value?-1:void 0,onClick:r[1]||=e=>i(`edit`)},T(q(n)(`pluginAccounting.accounts.edit`)),11,Fft)],10,Aft))}});function Lft(e,t,n){let r=e.code.trim();return r.length===0?`emptyCode`:r.startsWith(`_`)?`reservedCode`:n&&!vL(r)?`invalidCodeFormat`:n&&!Oft(r,e.type)?`codeTypeMismatch`:n&&t.some(e=>e.code===r)?`duplicateCode`:null}function Rft(e,t,n){let r=e.name.trim();if(r.length===0)return`emptyName`;let i=r.toLowerCase();return t.some(t=>!n&&t.code===e.code.trim()?!1:t.name.trim().toLowerCase()===i)?`duplicateName`:null}function zft(e,t,n){return Lft(e,t,n)??Rft(e,t,n)}var Bft=[`data-testid`],Vft={class:`flex flex-wrap gap-2`},Hft={class:`text-xs text-gray-500 flex flex-col gap-1 w-28`},Uft={class:`px-2 flex items-center bg-gray-100 text-gray-500 border-r border-gray-200 select-none`,"data-testid":`accounting-accounts-form-code-prefix`},Wft={class:`text-xs text-gray-500 flex flex-col gap-1 grow min-w-[10rem]`},Gft={class:`text-xs text-gray-500 flex flex-col gap-1 w-32`},Kft=[`value`],qft={class:`text-xs text-gray-500 flex flex-col gap-1`},Jft={class:`text-gray-400`},Yft={key:0,class:`text-xs text-gray-400`},Xft={class:`text-xs text-red-500 min-h-[1rem]`,"data-testid":`accounting-accounts-form-error`},Zft={class:`flex justify-end gap-2`},Qft=[`disabled`],$ft=K({__name:`AccountEditor`,props:{draft:{},isNew:{type:Boolean},busy:{type:Boolean},error:{},existingAccounts:{}},emits:[`save`,`cancel`],setup(e,{emit:t}){let{t:n}=pL(),r=e,a=t,o=[`asset`,`liability`,`equity`,`income`,`expense`],l={emptyCode:`pluginAccounting.accounts.errorEmptyCode`,reservedCode:`pluginAccounting.accounts.errorReservedCode`,invalidCodeFormat:`pluginAccounting.accounts.errorInvalidCodeFormat`,codeTypeMismatch:`pluginAccounting.accounts.errorCodeTypeMismatch`,emptyName:`pluginAccounting.accounts.errorEmptyName`,duplicateCode:`pluginAccounting.accounts.errorDuplicateCode`,duplicateName:`pluginAccounting.accounts.errorDuplicateName`},d=x({...r.draft}),f=V(null),p=V(!1),h=V(!1),g=m(()=>String(_L[d.type])),_=m({get:()=>{let{code:e}=d;return e.startsWith(g.value)?e.slice(g.value.length):e},set:e=>{let t=e.replace(/\D/g,``).slice(0,3);d.code=g.value+t}}),v=m(()=>{let e=Lft(d,r.existingAccounts,r.isNew);return e===`emptyCode`&&!p.value?null:e}),y=m(()=>{let e=Rft(d,r.existingAccounts,r.isNew);return e===`emptyName`&&!h.value&&!r.isNew?null:e}),C=m(()=>{let e=v.value;if(e!==null)return n(l[e]);let t=y.value;return t===null?null:n(l[t])});Ve(()=>r.draft,e=>{d.code=e.code,d.name=e.name,d.type=e.type,d.note=e.note,p.value=!1,h.value=!1}),P(()=>{be(()=>f.value?.focus())});function w(){p.value=!0,h.value=!0,a(`save`,{code:d.code,name:d.name,type:d.type,note:d.note})}return(t,r)=>(B(),U(`form`,{class:`flex flex-col gap-2 p-2 border border-blue-200 bg-blue-50/40 rounded text-sm`,"data-testid":e.isNew?`accounting-accounts-form-new`:`accounting-accounts-form-edit-${e.draft.code}`,onSubmit:s(w,[`prevent`])},[S(`div`,Vft,[S(`label`,Hft,[J(T(q(n)(`pluginAccounting.accounts.columnCode`))+` `,1),e.isNew?(B(),U(`div`,{key:0,class:c([`flex items-stretch h-8 rounded border bg-white text-sm font-mono overflow-hidden`,v.value?`border-red-500 ring-1 ring-red-500`:`border-gray-300 focus-within:ring-1 focus-within:ring-blue-500`])},[S(`span`,Uft,T(g.value),1),u(S(`input`,{"onUpdate:modelValue":r[0]||=e=>_.value=e,type:`text`,inputmode:`numeric`,maxlength:`3`,pattern:`\\d{3}`,class:`px-2 grow w-0 outline-none bg-transparent`,"data-testid":`accounting-accounts-form-code`,onInput:r[1]||=e=>p.value=!0},null,544),[[Fe,_.value]])],2)):u((B(),U(`input`,{key:1,"onUpdate:modelValue":r[2]||=e=>d.code=e,type:`text`,disabled:``,class:`h-8 px-2 rounded border border-gray-300 text-sm font-mono bg-gray-100 text-gray-500`,"data-testid":`accounting-accounts-form-code`},null,512)),[[Fe,d.code]])]),S(`label`,Wft,[J(T(q(n)(`pluginAccounting.accounts.columnName`))+` `,1),u(S(`input`,{ref_key:`nameInput`,ref:f,"onUpdate:modelValue":r[3]||=e=>d.name=e,type:`text`,class:c([`h-8 px-2 rounded border text-sm focus:outline-none`,y.value?`border-red-500 ring-1 ring-red-500`:`border-gray-300 focus:ring-1 focus:ring-blue-500`]),"data-testid":`accounting-accounts-form-name`,onInput:r[4]||=e=>h.value=!0},null,34),[[Fe,d.name]])]),S(`label`,Gft,[J(T(q(n)(`pluginAccounting.accounts.columnType`))+` `,1),u(S(`select`,{"onUpdate:modelValue":r[5]||=e=>d.type=e,class:`h-8 px-2 rounded border border-gray-300 text-sm bg-white disabled:bg-gray-100 disabled:text-gray-500`,disabled:``,"data-testid":`accounting-accounts-form-type`},[(B(),U(D,null,H(o,e=>S(`option`,{key:e,value:e},T(q(n)(`pluginAccounting.accounts.typeOption.${e}`)),9,Kft)),64))],512),[[i,d.type]])])]),S(`label`,qft,[S(`span`,null,[J(T(q(n)(`pluginAccounting.accounts.columnNote`))+` `,1),S(`span`,Jft,T(q(n)(`pluginAccounting.accounts.noteOptional`)),1)]),u(S(`input`,{"onUpdate:modelValue":r[6]||=e=>d.note=e,type:`text`,class:`h-8 px-2 rounded border border-gray-300 text-sm`,"data-testid":`accounting-accounts-form-note`},null,512),[[Fe,d.note]])]),e.isNew?b(``,!0):(B(),U(`p`,Yft,T(q(n)(`pluginAccounting.accounts.codeReadOnlyHint`)),1)),S(`p`,Xft,T(C.value??e.error??``),1),S(`div`,Zft,[S(`button`,{type:`button`,class:`h-8 px-2.5 rounded border border-gray-300 text-sm text-gray-600 hover:bg-gray-50`,"data-testid":`accounting-accounts-form-cancel`,onClick:r[7]||=e=>a(`cancel`)},T(q(n)(`pluginAccounting.accounts.cancel`)),1),S(`button`,{type:`submit`,class:`h-8 px-2.5 rounded bg-blue-600 hover:bg-blue-700 text-white text-sm disabled:opacity-50`,disabled:e.busy,"data-testid":`accounting-accounts-form-save`},T(e.busy?q(n)(`pluginAccounting.accounts.saving`):q(n)(`pluginAccounting.accounts.save`)),9,Qft)])],40,Bft))}}),ept={class:`bg-white rounded shadow-lg w-[32rem] max-h-[80vh] flex flex-col`},tpt={class:`flex items-center justify-between px-4 py-2 border-b border-gray-200 shrink-0`},npt={id:`accounting-accounts-modal-title`,class:`text-base font-semibold`},rpt=[`aria-label`],ipt={class:`flex-1 overflow-auto px-4 py-3 flex flex-col gap-3`},apt={key:0,class:`text-xs text-green-600`,"data-testid":`accounting-accounts-success`},opt={key:1,class:`text-xs text-red-500`,"data-testid":`accounting-accounts-toggle-error`},spt={class:`text-xs font-semibold text-gray-500 uppercase tracking-wide`},cpt={key:0,class:`text-xs text-gray-400 italic px-1`},lpt=[`data-testid`,`onClick`],upt=2500,yL=K({__name:`AccountsModal`,props:{bookId:{},accounts:{}},emits:[`close`,`changed`],setup(e,{emit:t}){let n=mL(),{t:r}=pL(),i=e,a=t,o=[`asset`,`liability`,`equity`,`income`,`expense`],c={emptyCode:`pluginAccounting.accounts.errorEmptyCode`,reservedCode:`pluginAccounting.accounts.errorReservedCode`,invalidCodeFormat:`pluginAccounting.accounts.errorInvalidCodeFormat`,codeTypeMismatch:`pluginAccounting.accounts.errorCodeTypeMismatch`,emptyName:`pluginAccounting.accounts.errorEmptyName`,duplicateCode:`pluginAccounting.accounts.errorDuplicateCode`,duplicateName:`pluginAccounting.accounts.errorDuplicateName`},u=m(()=>o.map(e=>({type:e,accounts:i.accounts.filter(t=>t.type===e).slice().sort(d)})));function d(e,t){return e.code.localeCompare(t.code)}let f=V(null),p=V(!1),h=V(k(`asset`)),g=V(!1),v=V(null),y=V(!1),x=V(null),C=V(null),w=V(null),E=V(null),O=null;function k(e){return{code:``,name:``,type:e,note:``}}function A(e){return{code:kft(e,i.accounts),name:``,type:e,note:``}}function j(e,t){t===h.value.type&&(E.value=e instanceof HTMLDivElement?e:null)}function M(e){p.value=!1,v.value=null,h.value={code:e.code,name:e.name,type:e.type,note:e.note??``},f.value=e.code}function N(e){f.value=null,v.value=null,h.value=A(e),p.value=!0,be(()=>{E.value?.scrollIntoView({behavior:`smooth`,block:`nearest`})})}function F(){f.value=null,p.value=!1,v.value=null,h.value=k(`asset`)}function I(e,t){let n=zft(e,i.accounts,t);return n===null?null:r(c[n])}async function L(e){if(g.value)return;let t=p.value,o=I(e,t);if(o!==null)v.value=o;else{g.value=!0,v.value=null;try{let o={code:e.code.trim(),name:e.name.trim(),type:e.type},s=e.note.trim();s.length>0&&(o.note=s),t||i.accounts.find(e=>e.code===o.code)?.active===!1&&(o.active=!1);let c=await n.upsertAccount(o,i.bookId);if(!c.ok){v.value=c.error;return}F(),z(r(`pluginAccounting.accounts.success`)),a(`changed`)}catch(e){v.value=uP(e)}finally{g.value=!1}}}async function R(e){if(y.value)return;F();let t=e.active!==!1;y.value=!0,x.value=null;try{let r={code:e.code,name:e.name,type:e.type};e.note!==void 0&&e.note.length>0&&(r.note=e.note),r.active=!t;let o=await n.upsertAccount(r,i.bookId);if(!o.ok){x.value=o.error;return}a(`changed`)}catch(e){x.value=uP(e)}finally{y.value=!1}}function z(e){C.value=e,O!==null&&clearTimeout(O),O=setTimeout(()=>{C.value=null,O=null},upt)}function ee(){a(`close`)}return P(()=>{be(()=>w.value?.focus())}),_(()=>{O!==null&&clearTimeout(O)}),(t,n)=>(B(),U(`div`,{class:`fixed inset-0 z-50 bg-black/20 flex items-center justify-center`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`accounting-accounts-modal-title`,"data-testid":`accounting-accounts-modal`,onClick:s(ee,[`self`]),onKeydown:n[1]||=l(e=>a(`close`),[`esc`])},[S(`div`,ept,[S(`header`,tpt,[S(`h3`,npt,T(q(r)(`pluginAccounting.accounts.modalTitle`)),1),S(`button`,{ref_key:`closeButton`,ref:w,type:`button`,class:`h-8 w-8 flex items-center justify-center rounded text-gray-500 hover:bg-gray-100`,"data-testid":`accounting-accounts-close`,"aria-label":q(r)(`pluginAccounting.common.cancel`),onClick:n[0]||=e=>a(`close`)},[...n[2]||=[S(`span`,{class:`material-icons text-base`},`close`,-1)]],8,rpt)]),S(`div`,ipt,[C.value?(B(),U(`p`,apt,T(C.value),1)):b(``,!0),x.value?(B(),U(`p`,opt,T(x.value),1)):b(``,!0),(B(!0),U(D,null,H(u.value,t=>(B(),U(`section`,{key:t.type,class:`flex flex-col gap-1`},[S(`h4`,spt,T(q(r)(`pluginAccounting.accounts.sectionTitle.${t.type}`)),1),t.accounts.length===0?(B(),U(`div`,cpt,T(q(r)(`pluginAccounting.common.empty`)),1)):b(``,!0),(B(!0),U(D,null,H(t.accounts,t=>(B(),U(D,{key:t.code},[f.value===t.code?(B(),ke($ft,{key:1,draft:h.value,"is-new":!1,busy:g.value,error:v.value,"existing-accounts":e.accounts,onSave:L,onCancel:F},null,8,[`draft`,`busy`,`error`,`existing-accounts`])):(B(),ke(Ift,{key:0,account:t,onEdit:e=>M(t),onToggleActive:e=>R(t)},null,8,[`account`,`onEdit`,`onToggleActive`]))],64))),128)),p.value&&h.value.type===t.type?(B(),U(`div`,{key:1,ref_for:!0,ref:e=>j(e,t.type)},[De($ft,{draft:h.value,"is-new":``,busy:g.value,error:v.value,"existing-accounts":e.accounts,onSave:L,onCancel:F},null,8,[`draft`,`busy`,`error`,`existing-accounts`])],512)):(B(),U(`button`,{key:2,type:`button`,class:`self-start h-8 px-2.5 flex items-center gap-1 rounded text-xs text-gray-600 hover:bg-gray-100`,"data-testid":`accounting-accounts-add-${t.type}`,onClick:e=>N(t.type)},[n[3]||=S(`span`,{class:`material-icons text-sm`},`add`,-1),S(`span`,null,T(q(r)(`pluginAccounting.accounts.addToCategory`,{type:q(r)(`pluginAccounting.accounts.typeOption.${t.type}`)})),1)],8,lpt))]))),128))])])],32))}}),dpt={key:0,class:`text-base font-semibold`},fpt={class:`flex flex-wrap gap-3`},ppt={class:`text-xs text-gray-500 flex flex-col gap-1`},mpt={class:`text-xs text-gray-500 flex flex-col gap-1 grow min-w-0`},hpt={class:`w-full text-sm`},gpt={class:`text-xs text-gray-500 border-b border-gray-200`},_pt={class:`text-left py-1 px-2`},vpt={class:`text-right py-1 px-2 w-32`},ypt={class:`text-right py-1 px-2 w-32`},bpt={key:0,class:`text-left py-1 px-2 w-40`},xpt={class:`py-1 px-2`},Spt=[`onUpdate:modelValue`,`data-testid`],Cpt=[`value`],wpt={class:`py-1 px-2`},Tpt=[`onUpdate:modelValue`,`step`,`data-testid`,`onInput`],Ept={class:`py-1 px-2`},Dpt=[`onUpdate:modelValue`,`step`,`data-testid`,`onInput`],Opt={key:0,class:`py-1 px-2`},kpt=[`onUpdate:modelValue`,`placeholder`,`data-testid`,`aria-describedby`],Apt=[`id`,`data-testid`],jpt={class:`py-1 px-2 text-right`},Mpt=[`onClick`],Npt={class:`flex items-center justify-between`},Ppt={class:`flex items-center gap-2`},Fpt={key:1,class:`text-xs text-red-500`,"data-testid":`accounting-entry-error`},Ipt={key:2,class:`text-xs text-green-600`,"data-testid":`accounting-entry-success`},Lpt={class:`flex items-center justify-between gap-2`},Rpt={key:0,class:`text-xs text-gray-500 flex-1 min-w-0`,"data-testid":`accounting-entry-edit-banner`},zpt={key:1},Bpt={class:`flex items-center gap-2`},Vpt=[`disabled`],Hpt=[`disabled`],Upt=`—`,Wpt=32,Gpt=K({__name:`JournalEntryForm`,props:{bookId:{},accounts:{},currency:{},country:{},entryToEdit:{}},emits:[`submitted`,`cancel`],setup(e,{emit:t}){let n=mL(),{t:r}=pL(),a=e,o=t,l=V(!1);function d(e){return`${e.name} (${e.code})`}let f=m(()=>a.accounts.filter(e=>e.active!==!1)),p=m(()=>new Set(f.value.map(e=>e.code)));function h(){return{accountCode:``,debit:null,credit:null,taxRegistrationId:``}}function g(e){return e.taxRegistrationId.trim().length>Wpt}function _(e){return e.accountCode!==``&&wft(e.accountCode)}function v(e){return!_(e)||!ie(e)||!F9e(`warnMissingTaxRegistrationId`,a.country)?!1:e.taxRegistrationId.trim()===``}let y=V(vP()),x=V(``),C=V([h(),h()]),w=V(!1),E=V(null),O=V(null),k=m(()=>!!a.entryToEdit),A=m(()=>w.value?k.value?r(`pluginAccounting.entryForm.updating`):r(`pluginAccounting.entryForm.submitting`):k.value?r(`pluginAccounting.entryForm.update`):r(`pluginAccounting.entryForm.submit`)),j=V(!1),M=m(()=>k.value&&j.value);function N(){C.value.push(h())}function P(e){e.debit!==null&&e.debit!==0&&(e.credit=null)}function F(e){e.credit!==null&&e.credit!==0&&(e.debit=null)}let I=m(()=>{let e=0;for(let t of C.value)ie(t)&&(re(t.debit)&&(e+=t.debit),re(t.credit)&&(e-=t.credit));return e}),L=m(()=>{let e=0;for(let t of C.value)if(ie(t)&&(e+=1,e>=2))return!0;return!1}),R=m(()=>C.value.some(_)),z=m(()=>C.value.some(g)),ee=m(()=>Math.abs(I.value)<=.005&&L.value&&!z.value),te=m(()=>gP(I.value,a.currency)),ne=m(()=>B9e(a.currency));function re(e){return typeof e==`number`&&Number.isFinite(e)&&e>0}function ie(e){return!e.accountCode||!p.value.has(e.accountCode)?!1:re(e.debit)||re(e.credit)}function ae(){let e=[];for(let t of C.value){if(!ie(t))continue;let n={accountCode:t.accountCode};if(re(t.debit)&&(n.debit=t.debit),re(t.credit)&&(n.credit=t.credit),_(t)){let e=t.taxRegistrationId.trim();e!==``&&(n.taxRegistrationId=e)}e.push(n)}return e}async function oe(){if(!(w.value||!ee.value||M.value)){w.value=!0,E.value=null,O.value=null;try{let e=a.entryToEdit?.id;if(e){j.value=!0;let t=await n.voidEntry({bookId:a.bookId,entryId:e,reason:r(`pluginAccounting.entryForm.editVoidReason`)});if(!t.ok){E.value=t.error;return}}let t=await n.addEntries({bookId:a.bookId,entries:[{date:y.value,memo:x.value.trim()||void 0,lines:ae(),...e?{replacesEntryId:e}:{}}]});if(!t.ok){E.value=t.error;return}O.value=r(e?`pluginAccounting.entryForm.editSuccess`:`pluginAccounting.entryForm.success`),C.value=[h(),h()],x.value=``,o(`submitted`)}catch(e){E.value=uP(e)}finally{w.value=!1}}}return Ve(()=>a.bookId,()=>{C.value=[h(),h()],x.value=``,y.value=vP(),E.value=null,O.value=null}),Ve(()=>a.entryToEdit,e=>{if(E.value=null,O.value=null,j.value=!1,!e)C.value=[h(),h()],x.value=``,y.value=vP();else if(y.value=e.date,x.value=e.memo??``,C.value=e.lines.map(e=>({accountCode:e.accountCode,debit:typeof e.debit==`number`?e.debit:null,credit:typeof e.credit==`number`?e.credit:null,taxRegistrationId:e.taxRegistrationId??``})),C.value.length<2)for(;C.value.length<2;)C.value.push(h())},{immediate:!0}),Ve(p,e=>{for(let t of C.value)t.accountCode&&!e.has(t.accountCode)&&(t.accountCode=``)}),(t,n)=>(B(),U(D,null,[S(`form`,{class:`flex flex-col gap-3`,"data-testid":`accounting-entry-form`,onSubmit:s(oe,[`prevent`])},[k.value?b(``,!0):(B(),U(`h3`,dpt,T(q(r)(`pluginAccounting.entryForm.title`)),1)),S(`div`,fpt,[S(`label`,ppt,[J(T(q(r)(`pluginAccounting.entryForm.dateLabel`))+` `,1),u(S(`input`,{"onUpdate:modelValue":n[0]||=e=>y.value=e,type:`date`,required:``,class:`h-8 px-2 rounded border border-gray-300 text-sm bg-white`,"data-testid":`accounting-entry-date`},null,512),[[Fe,y.value]])]),S(`label`,mpt,[J(T(q(r)(`pluginAccounting.entryForm.memoLabel`))+` `,1),u(S(`input`,{"onUpdate:modelValue":n[1]||=e=>x.value=e,type:`text`,class:`h-8 px-2 rounded border border-gray-300 text-sm bg-white`,"data-testid":`accounting-entry-memo`},null,512),[[Fe,x.value]])])]),S(`table`,hpt,[S(`thead`,null,[S(`tr`,gpt,[S(`th`,_pt,T(q(r)(`pluginAccounting.entryForm.accountLabel`)),1),S(`th`,vpt,T(q(r)(`pluginAccounting.entryForm.debitLabel`)),1),S(`th`,ypt,T(q(r)(`pluginAccounting.entryForm.creditLabel`)),1),R.value?(B(),U(`th`,bpt,T(q(r)(`pluginAccounting.entryForm.taxRegistrationIdLabel`)),1)):b(``,!0),n[5]||=S(`th`,{class:`py-1 px-2`},null,-1)])]),S(`tbody`,null,[(B(!0),U(D,null,H(C.value,(e,t)=>(B(),U(`tr`,{key:t,class:`border-b border-gray-100`},[S(`td`,xpt,[u(S(`select`,{"onUpdate:modelValue":t=>e.accountCode=t,class:`h-8 px-2 w-full rounded border border-gray-300 text-sm bg-white`,"data-testid":`accounting-entry-line-account-${t}`},[S(`option`,{value:``},T(Upt)),(B(!0),U(D,null,H(f.value,e=>(B(),U(`option`,{key:e.code,value:e.code},T(d(e)),9,Cpt))),128))],8,Spt),[[i,e.accountCode]])]),S(`td`,wpt,[u(S(`input`,{"onUpdate:modelValue":t=>e.debit=t,type:`number`,step:ne.value,min:`0`,class:`h-8 px-2 w-full rounded border border-gray-300 text-sm text-right bg-white`,"data-testid":`accounting-entry-line-debit-${t}`,onInput:t=>P(e)},null,40,Tpt),[[Fe,e.debit,void 0,{number:!0}]])]),S(`td`,Ept,[u(S(`input`,{"onUpdate:modelValue":t=>e.credit=t,type:`number`,step:ne.value,min:`0`,class:`h-8 px-2 w-full rounded border border-gray-300 text-sm text-right bg-white`,"data-testid":`accounting-entry-line-credit-${t}`,onInput:t=>F(e)},null,40,Dpt),[[Fe,e.credit,void 0,{number:!0}]])]),R.value?(B(),U(`td`,Opt,[_(e)?(B(),U(D,{key:0},[u(S(`input`,{"onUpdate:modelValue":t=>e.taxRegistrationId=t,type:`text`,maxlength:Wpt,placeholder:q(r)(`pluginAccounting.entryForm.taxRegistrationIdPlaceholder`),class:c([`h-8 px-2 w-full rounded border text-sm font-mono bg-white focus:outline-none`,g(e)?`border-red-500 ring-1 ring-red-500`:v(e)?`border-amber-500 ring-1 ring-amber-500`:`border-gray-300 focus:ring-1 focus:ring-blue-500`]),"data-testid":`accounting-entry-line-tax-registration-id-${t}`,"aria-describedby":v(e)?`accounting-entry-line-tax-registration-id-warning-${t}`:void 0},null,10,kpt),[[Fe,e.taxRegistrationId]]),v(e)?(B(),U(`p`,{key:0,id:`accounting-entry-line-tax-registration-id-warning-${t}`,class:`text-xs text-amber-600 mt-1`,role:`status`,"aria-live":`polite`,"data-testid":`accounting-entry-line-tax-registration-id-warning-${t}`},T(q(r)(`pluginAccounting.entryForm.taxRegistrationIdMissingWarning`)),9,Apt)):b(``,!0)],64)):b(``,!0)])):b(``,!0),S(`td`,jpt,[C.value.length>2?(B(),U(`button`,{key:0,type:`button`,class:`text-xs text-red-500 hover:underline`,onClick:e=>C.value.splice(t,1)},T(q(r)(`pluginAccounting.entryForm.removeLine`)),9,Mpt)):b(``,!0)])]))),128))])]),S(`div`,Npt,[S(`div`,Ppt,[S(`button`,{type:`button`,class:`h-8 px-2.5 flex items-center gap-1 rounded border border-gray-300 text-sm text-gray-600 hover:bg-gray-50`,"data-testid":`accounting-entry-add-line`,onClick:N},[n[6]||=S(`span`,{class:`material-icons text-base`},`add`,-1),S(`span`,null,T(q(r)(`pluginAccounting.entryForm.addLine`)),1)]),S(`button`,{type:`button`,class:`h-8 px-2.5 flex items-center gap-1 rounded border border-gray-300 text-sm text-gray-600 hover:bg-gray-50`,"data-testid":`accounting-entry-manage-accounts`,onClick:n[2]||=e=>l.value=!0},[n[7]||=S(`span`,{class:`material-icons text-base`},`tune`,-1),S(`span`,null,T(q(r)(`pluginAccounting.accounts.manageButton`)),1)])]),S(`span`,{class:c([ee.value?`text-green-600`:`text-red-500`,`text-xs`]),"data-testid":`accounting-entry-balance`},T(ee.value?q(r)(`pluginAccounting.entryForm.balanced`):q(r)(`pluginAccounting.entryForm.imbalance`,{amount:te.value})),3)]),E.value?(B(),U(`p`,Fpt,T(E.value),1)):b(``,!0),O.value?(B(),U(`p`,Ipt,T(O.value),1)):b(``,!0),S(`div`,Lpt,[k.value?(B(),U(`p`,Rpt,T(q(r)(`pluginAccounting.entryForm.editBanner`)),1)):(B(),U(`span`,zpt)),S(`div`,Bpt,[S(`button`,{type:`button`,class:`h-8 px-3 rounded border border-gray-300 text-sm text-gray-600 hover:bg-gray-50`,disabled:w.value,"data-testid":`accounting-entry-cancel-edit`,onClick:n[3]||=e=>o(`cancel`)},T(q(r)(`pluginAccounting.common.cancel`)),9,Vpt),S(`button`,{type:`submit`,class:`h-8 px-3 rounded bg-blue-600 hover:bg-blue-700 text-white text-sm disabled:opacity-50`,disabled:!ee.value||w.value||M.value,"data-testid":`accounting-entry-submit`},T(A.value),9,Hpt)])])],32),l.value?(B(),ke(yL,{key:0,"book-id":e.bookId,accounts:e.accounts,onClose:n[4]||=e=>l.value=!1},null,8,[`book-id`,`accounts`])):b(``,!0)],64))}}),bL=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},Kpt=bL(Gpt,[[`__scopeId`,`data-v-8624a7bf`]]),qpt={class:`flex flex-col h-full gap-3`},Jpt={key:0,class:`border border-gray-200 rounded p-3`,"data-testid":`accounting-journal-inline-form`},Ypt={key:1,class:`flex items-center justify-end`},Xpt={class:`flex flex-wrap items-end gap-2`},Zpt={class:`text-xs text-gray-500 flex flex-col gap-1`},Qpt={value:``},$pt=[`value`],emt={class:`flex-1 min-h-0 overflow-auto`},tmt={key:0,class:`text-xs text-gray-400`},nmt={key:1,class:`text-xs text-red-500`},rmt={key:2,class:`text-xs text-gray-400`},imt={key:3,class:`w-full text-sm`,"data-testid":`accounting-journal-table`},amt={class:`text-xs text-gray-500 border-b border-gray-200`},omt={class:`sticky top-0 bg-white text-left py-1 px-2`},smt={class:`sticky top-0 bg-white text-left py-1 px-2`},cmt={class:`sticky top-0 bg-white text-left py-1 px-2`},lmt={class:`sticky top-0 bg-white text-left py-1 px-2`},umt=[`data-testid`,`aria-expanded`,`onClick`,`onKeydown`],dmt={class:`py-1 px-2 whitespace-nowrap`},fmt={class:`py-1 px-2 text-xs`},pmt={class:`py-1 px-2`},mmt={key:0},hmt={class:`py-1 px-2`},gmt={class:`font-mono text-[10px] text-gray-400`},_mt={key:0},vmt={key:1},ymt={key:2},bmt={key:1,class:`flex items-center justify-between gap-2`},xmt={class:`text-xs text-gray-400 font-mono`},Smt=[`data-testid`,`aria-label`],Cmt=[`data-testid`],wmt={colspan:4,class:`px-6 py-2`},Tmt=[`data-testid`],Emt={class:`flex items-center gap-3 mb-2`},Dmt=[`data-testid`,`onClick`],Omt=[`data-testid`,`onClick`],kmt=[`data-testid`],Amt={class:`w-full text-xs`},jmt={class:`text-gray-500 border-b border-gray-200`},Mmt={class:`text-left py-1 px-2`},Nmt={class:`text-right py-1 px-2`},Pmt={class:`text-right py-1 px-2`},Fmt={class:`text-left py-1 px-2`},Imt={key:0,class:`text-left py-1 px-2`},Lmt={class:`py-1 px-2`},Rmt={class:`font-mono text-[10px] text-gray-400 mr-2`},zmt={key:0},Bmt={class:`py-1 px-2 text-right font-mono`},Vmt={class:`py-1 px-2 text-right font-mono`},Hmt={class:`py-1 px-2`},Umt={key:0,class:`py-1 px-2 font-mono text-[10px]`},Wmt={class:`font-semibold border-t border-gray-300 text-gray-700`},Gmt={class:`py-1 px-2 text-gray-500`},Kmt={class:`py-1 px-2 text-right font-mono`},qmt={class:`py-1 px-2 text-right font-mono`},Jmt=[`colspan`],Ymt=bL(K({__name:`JournalList`,props:{bookId:{},accounts:{},currency:{},country:{},version:{},fiscalYearEnd:{},openingDate:{},preselectEntryId:{}},emits:[`editOpening`,`preselectConsumed`],setup(e,{emit:t}){let n=mL(),{t:r}=pL(),a=e,o=t,d=V(!1),f=V(null),p=V(null);function h(){f.value=null,d.value=!0}function g(e){d.value=!1,f.value=e}function _(){d.value=!1,f.value=null}function v(){_(),p.value=null,W()}function y(){_()}Ve(()=>a.bookId,()=>{_(),p.value=null});let x=m(()=>fP(a.fiscalYearEnd)),C=V(mP(x.value)),w=V(``),E=V([]),O=V([]),k=V(!1),A=V(null),{begin:j,isCurrent:M}=hL();function N(e){return r(e===`opening`?`pluginAccounting.journalList.kind.opening`:e===`void`?`pluginAccounting.journalList.kind.void`:e===`void-marker`?`pluginAccounting.journalList.kind.voidMarker`:`pluginAccounting.journalList.kind.normal`)}function P(e){return`DR ${gP(e,a.currency)}`}function F(e){return`CR ${gP(e,a.currency)}`}function I(e){return`${e.name} (${e.code})`}function L(e){let t=new Date(e);if(Number.isNaN(t.getTime()))return`(${e})`;let n=e=>String(e).padStart(2,`0`);return`(${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())})`}let R=m(()=>{let e=new Map;for(let t of a.accounts)e.set(t.code,t.name);return e});function z(e){return R.value.get(e)??null}function ee(){p.value=null,f.value=null}function te(e){f.value?.id!==e&&(p.value=p.value===e?null:e,f.value=null)}function ne(e,t){e.repeat||te(t)}function re(e){return e.lines.some(e=>!!e.taxRegistrationId)}function ie(e,t){return e.reduce((e,n)=>e+(t(n)??0),0)}function ae(e){return ie(e.lines,e=>e.debit)}function oe(e){return ie(e.lines,e=>e.credit)}async function W(){let e=j();k.value=!0,A.value=null;try{let t=await n.getJournalEntries({bookId:a.bookId,from:C.value.from||void 0,to:C.value.to||void 0,accountCode:w.value||void 0});if(!M(e))return;if(!t.ok){A.value=t.error,E.value=[],O.value=[];return}E.value=t.data.entries,O.value=t.data.voidedEntryIds}finally{M(e)&&(k.value=!1)}}let se=m(()=>E.value),ce=m(()=>{let e=se.value,t=f.value;return t&&!e.some(e=>e.id===t.id)?[t,...e]:e}),le=m(()=>new Set(O.value));async function ue(e){let t=window.prompt(r(`pluginAccounting.journalList.voidReason`));if(t!==null)try{let r=await n.voidEntry({entryId:e.id,reason:t||void 0,bookId:a.bookId});r.ok||(A.value=r.error)}catch(e){A.value=uP(e)}}Ve(()=>[a.bookId,x.value],()=>{C.value=mP(x.value)}),Ve(()=>[a.bookId,a.version,C.value.from,C.value.to,w.value],W,{immediate:!0});let de=V(null);return Ve(()=>a.preselectEntryId,e=>{e&&(de.value=e)},{immediate:!0}),Ve([de,E],async([e,t])=>{e&&t.some(t=>t.id===e)&&(f.value?(de.value=null,o(`preselectConsumed`)):(p.value=e,await be(),(document.querySelector(`[data-testid="accounting-journal-row-${e}"]`)??document.querySelector(`[data-testid="accounting-journal-row-voided-${e}"]`))?.scrollIntoView({behavior:`smooth`,block:`center`}),de.value=null,o(`preselectConsumed`)))}),(t,n)=>(B(),U(`div`,qpt,[d.value?(B(),U(`div`,Jpt,[De(Kpt,{"book-id":e.bookId,accounts:e.accounts,currency:e.currency,country:e.country,"entry-to-edit":null,onSubmitted:v,onCancel:y},null,8,[`book-id`,`accounts`,`currency`,`country`])])):(B(),U(`div`,Ypt,[S(`button`,{type:`button`,class:`h-8 px-2.5 flex items-center gap-1 rounded border border-gray-300 text-sm text-gray-600 hover:bg-gray-50`,"data-testid":`accounting-journal-new-entry`,onClick:h},[n[3]||=S(`span`,{class:`material-icons text-base`},`add`,-1),S(`span`,null,T(q(r)(`pluginAccounting.tabs.newEntry`)),1)])])),S(`div`,Xpt,[De(gL,{modelValue:C.value,"onUpdate:modelValue":n[0]||=e=>C.value=e,"fiscal-year-end":x.value,"opening-date":e.openingDate},null,8,[`modelValue`,`fiscal-year-end`,`opening-date`]),S(`label`,Zpt,[J(T(q(r)(`pluginAccounting.journalList.accountLabel`))+` `,1),u(S(`select`,{"onUpdate:modelValue":n[1]||=e=>w.value=e,class:`h-8 px-2 rounded border border-gray-300 text-sm bg-white`,"data-testid":`accounting-journal-account`},[S(`option`,Qpt,T(q(r)(`pluginAccounting.journalList.allAccounts`)),1),(B(!0),U(D,null,H(e.accounts,e=>(B(),U(`option`,{key:e.code,value:e.code},T(I(e)),9,$pt))),128))],512),[[i,w.value]])]),S(`button`,{class:`h-8 px-2.5 rounded border border-gray-300 text-sm text-gray-600 hover:bg-gray-50`,onClick:W},[...n[4]||=[S(`span`,{class:`material-icons text-base align-middle`},`refresh`,-1)]])]),S(`div`,emt,[k.value?(B(),U(`p`,tmt,T(q(r)(`pluginAccounting.common.loading`)),1)):A.value?(B(),U(`p`,nmt,T(q(r)(`pluginAccounting.common.error`,{error:A.value})),1)):ce.value.length===0?(B(),U(`p`,rmt,T(q(r)(`pluginAccounting.common.empty`)),1)):(B(),U(`table`,imt,[S(`thead`,null,[S(`tr`,amt,[S(`th`,omt,T(q(r)(`pluginAccounting.journalList.columns.date`)),1),S(`th`,smt,T(q(r)(`pluginAccounting.journalList.columns.kind`)),1),S(`th`,cmt,T(q(r)(`pluginAccounting.journalList.columns.memo`)),1),S(`th`,lmt,T(q(r)(`pluginAccounting.journalList.columns.lines`)),1)])]),S(`tbody`,null,[(B(!0),U(D,null,H(ce.value,t=>(B(),U(D,{key:t.id},[S(`tr`,{class:c([le.value.has(t.id)?`text-gray-400 line-through`:``,p.value===t.id?`row-selected`:``,`border-b border-gray-100 align-top cursor-pointer hover:bg-gray-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-400`]),"data-testid":le.value.has(t.id)?`accounting-journal-row-voided-${t.id}`:`accounting-journal-row-${t.id}`,tabindex:`0`,role:`button`,"aria-expanded":p.value===t.id,onClick:e=>te(t.id),onKeydown:[l(s(e=>ne(e,t.id),[`prevent`,`self`]),[`enter`]),l(s(e=>ne(e,t.id),[`prevent`,`self`]),[`space`])]},[S(`td`,dmt,T(t.date),1),S(`td`,fmt,T(N(t.kind)),1),S(`td`,pmt,[t.memo?(B(),U(`span`,mmt,T(t.memo),1)):b(``,!0)]),S(`td`,hmt,[p.value===t.id?(B(),U(`div`,bmt,[S(`span`,xmt,T(L(t.createdAt)),1),S(`button`,{type:`button`,class:`h-6 w-6 flex items-center justify-center rounded text-gray-500 hover:bg-gray-100`,"data-testid":`accounting-journal-detail-close-${t.id}`,"aria-label":q(r)(`common.close`),onClick:s(ee,[`stop`])},[...n[5]||=[S(`span`,{class:`material-icons text-base`},`close`,-1)]],8,Smt)])):(B(!0),U(D,{key:0},H(t.lines,(e,t)=>(B(),U(`div`,{key:t,class:`text-xs flex gap-2 items-baseline`},[S(`span`,gmt,T(e.accountCode),1),z(e.accountCode)?(B(),U(`span`,_mt,T(z(e.accountCode)),1)):b(``,!0),e.debit?(B(),U(`span`,vmt,T(P(e.debit)),1)):b(``,!0),e.credit?(B(),U(`span`,ymt,T(F(e.credit)),1)):b(``,!0)]))),128))])],42,umt),p.value===t.id?(B(),U(`tr`,{key:0,class:`bg-gray-50 detail-selected`,"data-testid":`accounting-journal-detail-${t.id}`},[S(`td`,wmt,[f.value?.id===t.id?(B(),U(`div`,{key:0,"data-testid":`accounting-journal-detail-edit-${t.id}`},[De(Kpt,{"book-id":e.bookId,accounts:e.accounts,currency:e.currency,country:e.country,"entry-to-edit":f.value,onSubmitted:v,onCancel:y},null,8,[`book-id`,`accounts`,`currency`,`country`,`entry-to-edit`])],8,Tmt)):(B(),U(D,{key:1},[S(`div`,Emt,[t.kind===`normal`&&!le.value.has(t.id)?(B(),U(D,{key:0},[S(`button`,{class:`text-xs text-blue-600 hover:underline`,"data-testid":`accounting-edit-${t.id}`,onClick:e=>g(t)},T(q(r)(`pluginAccounting.journalList.edit`)),9,Dmt),S(`button`,{class:`text-xs text-red-500 hover:underline`,"data-testid":`accounting-void-${t.id}`,onClick:e=>ue(t)},T(q(r)(`pluginAccounting.journalList.void`)),9,Omt)],64)):t.kind===`opening`&&!le.value.has(t.id)?(B(),U(`button`,{key:1,class:`text-xs text-blue-600 hover:underline`,"data-testid":`accounting-edit-opening-${t.id}`,onClick:n[2]||=e=>o(`editOpening`)},T(q(r)(`pluginAccounting.journalList.edit`)),9,kmt)):b(``,!0)]),S(`table`,Amt,[S(`thead`,null,[S(`tr`,jmt,[S(`th`,Mmt,T(q(r)(`pluginAccounting.entryForm.accountLabel`)),1),S(`th`,Nmt,T(q(r)(`pluginAccounting.entryForm.debitLabel`)),1),S(`th`,Pmt,T(q(r)(`pluginAccounting.entryForm.creditLabel`)),1),S(`th`,Fmt,T(q(r)(`pluginAccounting.entryForm.memoLabel`)),1),re(t)?(B(),U(`th`,Imt,T(q(r)(`pluginAccounting.entryForm.taxRegistrationIdLabel`)),1)):b(``,!0)])]),S(`tbody`,null,[(B(!0),U(D,null,H(t.lines,(n,r)=>(B(),U(`tr`,{key:r,class:`border-b border-gray-100 text-gray-700`},[S(`td`,Lmt,[S(`span`,Rmt,T(n.accountCode),1),z(n.accountCode)?(B(),U(`span`,zmt,T(z(n.accountCode)),1)):b(``,!0)]),S(`td`,Bmt,[n.debit?(B(),U(D,{key:0},[J(T(q(gP)(n.debit,e.currency)),1)],64)):b(``,!0)]),S(`td`,Vmt,[n.credit?(B(),U(D,{key:0},[J(T(q(gP)(n.credit,e.currency)),1)],64)):b(``,!0)]),S(`td`,Hmt,[n.memo?(B(),U(D,{key:0},[J(T(n.memo),1)],64)):b(``,!0)]),re(t)?(B(),U(`td`,Umt,[n.taxRegistrationId?(B(),U(D,{key:0},[J(T(n.taxRegistrationId),1)],64)):b(``,!0)])):b(``,!0)]))),128))]),S(`tfoot`,null,[S(`tr`,Wmt,[S(`td`,Gmt,T(q(r)(`pluginAccounting.balanceSheet.total`)),1),S(`td`,Kmt,T(q(gP)(ae(t),e.currency)),1),S(`td`,qmt,T(q(gP)(oe(t),e.currency)),1),S(`td`,{colspan:re(t)?2:1},null,8,Jmt)])])])],64))])],8,Cmt)):b(``,!0)],64))),128))])]))])]))}}),[[`__scopeId`,`data-v-6d11cf47`]]),Xmt={class:`flex items-center justify-between gap-2`},Zmt={class:`text-base font-semibold`},Qmt={class:`text-xs text-gray-500`},$mt={class:`text-xs text-blue-600`,"data-testid":`accounting-opening-empty-hint`},eht={key:0,class:`text-xs text-gray-500`,"data-testid":`accounting-opening-existing`},tht={key:0,class:`text-amber-600 ml-2`},nht={key:1,class:`text-xs text-gray-400`,"data-testid":`accounting-opening-none`},rht={class:`text-xs text-gray-500 flex flex-col gap-1 w-fit`},iht={class:`w-full text-sm`},aht={class:`text-xs text-gray-500 border-b border-gray-200`},oht={class:`text-left py-1 px-2`},sht={class:`text-right py-1 px-2 w-32`},cht={class:`text-right py-1 px-2 w-32`},lht={class:`py-1 px-2`},uht={class:`font-mono text-[10px] text-gray-400 mr-2`},dht={class:`ml-2 text-xs text-gray-400`},fht={class:`py-1 px-2`},pht=[`onUpdate:modelValue`,`step`,`data-testid`,`onInput`],mht={class:`py-1 px-2`},hht=[`onUpdate:modelValue`,`step`,`data-testid`,`onInput`],ght={class:`flex items-center justify-between`},_ht={class:`text-xs text-gray-400`},vht={key:2,class:`text-xs text-red-500`,"data-testid":`accounting-opening-error`},yht={key:3,class:`text-xs text-green-600`,"data-testid":`accounting-opening-success`},bht={class:`flex justify-end`},xht=[`disabled`],Sht=bL(K({__name:`OpeningBalancesForm`,props:{bookId:{},accounts:{},currency:{},version:{}},emits:[`submitted`],setup(e,{emit:t}){let n=mL(),{t:r}=pL(),i=e,a=t,o=V(!1),l=V(vP()),d=V({}),f=V(null),p=V(!1),h=V(null),g=V(null),{begin:_,isCurrent:v}=hL(),y=m(()=>i.accounts.filter(e=>(e.type===`asset`||e.type===`liability`||e.type===`equity`)&&e.active!==!1));function x(){for(let e of y.value)d.value[e.code]||(d.value[e.code]={debit:null,credit:null})}let C=m(()=>y.value.flatMap(e=>{let t=d.value[e.code];return t?[{account:e,row:t}]:[]}));function w(e){let t=d.value[e];t&&t.debit!==null&&t.debit!==0&&(t.credit=null)}function E(e){let t=d.value[e];t&&t.credit!==null&&t.credit!==0&&(t.debit=null)}let O=m(()=>{let e=0;for(let t of y.value){let n=d.value[t.code];n&&(typeof n.debit==`number`&&(e+=n.debit),typeof n.credit==`number`&&(e-=n.credit))}return e}),k=m(()=>Math.abs(O.value)<=.005),A=m(()=>gP(O.value,i.currency)),j=m(()=>B9e(i.currency));function M(e){return typeof e==`number`&&Number.isFinite(e)&&e>0}function N(){let e=[];for(let t of y.value){let n=d.value[t.code];if(!n)continue;let{debit:r,credit:i}=n,a=M(r),o=M(i);if(!a&&!o)continue;let s={accountCode:t.code};a&&(s.debit=r),o&&(s.credit=i),e.push(s)}return e}function P(){let e={};for(let t of y.value)e[t.code]={debit:null,credit:null};return e}async function F(){let e=_(),t=P(),r=await n.getOpeningBalances(i.bookId);if(v(e)){if(!r.ok)f.value=null,d.value=t;else{if(f.value=r.data.opening,r.data.opening){l.value=r.data.opening.date;for(let e of r.data.opening.lines)t[e.accountCode]={debit:e.debit??null,credit:e.credit??null}}else l.value=vP();d.value=t}}}async function I(){if(!p.value&&k.value){p.value=!0,h.value=null,g.value=null;try{let e=await n.setOpeningBalances({bookId:i.bookId,asOfDate:l.value,lines:N()});if(!e.ok){h.value=e.error;return}g.value=r(`pluginAccounting.openingForm.success`),a(`submitted`)}catch(e){h.value=uP(e)}finally{p.value=!1}}}return Ve(()=>[i.bookId,i.version,i.accounts.length],()=>{x(),F()},{immediate:!0}),(t,n)=>(B(),U(D,null,[S(`form`,{class:`flex flex-col gap-3`,"data-testid":`accounting-opening-form`,onSubmit:s(I,[`prevent`])},[S(`div`,Xmt,[S(`h3`,Zmt,T(q(r)(`pluginAccounting.openingForm.title`)),1),S(`button`,{type:`button`,class:`h-8 px-2.5 flex items-center gap-1 rounded border border-gray-300 text-sm text-gray-600 hover:bg-gray-50`,"data-testid":`accounting-opening-manage-accounts`,onClick:n[0]||=e=>o.value=!0},[n[3]||=S(`span`,{class:`material-icons text-base`},`tune`,-1),S(`span`,null,T(q(r)(`pluginAccounting.accounts.manageButton`)),1)])]),S(`p`,Qmt,T(q(r)(`pluginAccounting.openingForm.explainer`)),1),S(`p`,$mt,T(q(r)(`pluginAccounting.openingForm.emptyHint`)),1),f.value?(B(),U(`div`,eht,[J(T(q(r)(`pluginAccounting.openingForm.setBy`,{date:f.value.date}))+` `,1),f.value?(B(),U(`span`,tht,T(q(r)(`pluginAccounting.openingForm.replaceWarning`)),1)):b(``,!0)])):(B(),U(`p`,nht,T(q(r)(`pluginAccounting.openingForm.none`)),1)),S(`label`,rht,[J(T(q(r)(`pluginAccounting.openingForm.asOfLabel`))+` `,1),u(S(`input`,{"onUpdate:modelValue":n[1]||=e=>l.value=e,type:`date`,required:``,class:`h-8 px-2 rounded border border-gray-300 text-sm`,"data-testid":`accounting-opening-asof`},null,512),[[Fe,l.value]])]),S(`table`,iht,[S(`thead`,null,[S(`tr`,aht,[S(`th`,oht,T(q(r)(`pluginAccounting.entryForm.accountLabel`)),1),S(`th`,sht,T(q(r)(`pluginAccounting.entryForm.debitLabel`)),1),S(`th`,cht,T(q(r)(`pluginAccounting.entryForm.creditLabel`)),1)])]),S(`tbody`,null,[(B(!0),U(D,null,H(C.value,({account:e,row:t})=>(B(),U(`tr`,{key:e.code,class:`border-b border-gray-100`},[S(`td`,lht,[S(`span`,uht,T(e.code),1),S(`span`,null,T(e.name),1),S(`span`,dht,T(e.type),1)]),S(`td`,fht,[u(S(`input`,{"onUpdate:modelValue":e=>t.debit=e,type:`number`,step:j.value,min:`0`,class:`h-8 px-2 w-full rounded border border-gray-300 text-sm text-right`,"data-testid":`accounting-opening-debit-${e.code}`,onInput:t=>w(e.code)},null,40,pht),[[Fe,t.debit,void 0,{number:!0}]])]),S(`td`,mht,[u(S(`input`,{"onUpdate:modelValue":e=>t.credit=e,type:`number`,step:j.value,min:`0`,class:`h-8 px-2 w-full rounded border border-gray-300 text-sm text-right`,"data-testid":`accounting-opening-credit-${e.code}`,onInput:t=>E(e.code)},null,40,hht),[[Fe,t.credit,void 0,{number:!0}]])])]))),128))])]),S(`div`,ght,[S(`span`,_ht,T(q(r)(`pluginAccounting.openingForm.explainer2`)),1),S(`span`,{class:c([k.value?`text-green-600`:`text-red-500`,`text-xs`]),"data-testid":`accounting-opening-balance`},T(k.value?q(r)(`pluginAccounting.entryForm.balanced`):q(r)(`pluginAccounting.entryForm.imbalance`,{amount:A.value})),3)]),h.value?(B(),U(`p`,vht,T(h.value),1)):b(``,!0),g.value?(B(),U(`p`,yht,T(g.value),1)):b(``,!0),S(`div`,bht,[S(`button`,{type:`submit`,class:`h-8 px-3 rounded bg-blue-600 hover:bg-blue-700 text-white text-sm disabled:opacity-50`,disabled:!k.value||p.value,"data-testid":`accounting-opening-submit`},T(p.value?q(r)(`pluginAccounting.entryForm.submitting`):q(r)(`pluginAccounting.openingForm.submit`)),9,xht)])],32),o.value?(B(),ke(yL,{key:0,"book-id":e.bookId,accounts:e.accounts,onClose:n[2]||=e=>o.value=!1},null,8,[`book-id`,`accounts`])):b(``,!0)],64))}}),[[`__scopeId`,`data-v-08e2a48f`]]),Cht={class:`flex flex-col gap-3`,"data-testid":`accounting-accounts-list`},wht={class:`flex flex-wrap items-center justify-end gap-2`},Tht={class:`text-xs font-semibold text-gray-500 uppercase tracking-wide`},Eht={key:0,class:`text-xs text-gray-400 italic px-1`},Dht={key:1,class:`flex flex-col`},Oht=[`aria-label`,`data-testid`,`onClick`,`onKeydown`],kht={class:`font-mono text-xs w-16 shrink-0`},Aht={class:`text-sm flex-1 min-w-0 truncate`},jht=K({__name:`AccountsList`,props:{bookId:{},accounts:{}},emits:[`selectAccount`,`changed`],setup(e,{emit:t}){let{t:n}=pL(),r=e,i=t,a=[`asset`,`liability`,`equity`,`income`,`expense`],o=V(!1);function c(e,t){return e.code.localeCompare(t.code)}let u=m(()=>a.map(e=>({type:e,accounts:r.accounts.filter(t=>t.type===e&&t.active!==!1).slice().sort(c)})));function d(e){i(`selectAccount`,e.code)}function f(e,t){e.repeat||i(`selectAccount`,t.code)}function p(){i(`changed`)}return(t,r)=>(B(),U(`div`,Cht,[S(`div`,wht,[S(`button`,{type:`button`,class:`h-8 px-2.5 flex items-center gap-1 rounded border border-gray-300 text-sm text-gray-600 hover:bg-gray-50`,"data-testid":`accounting-accounts-manage`,onClick:r[0]||=e=>o.value=!0},[r[2]||=S(`span`,{class:`material-icons text-base`},`tune`,-1),S(`span`,null,T(q(n)(`pluginAccounting.accounts.manageButton`)),1)])]),(B(!0),U(D,null,H(u.value,e=>(B(),U(`section`,{key:e.type,class:`flex flex-col gap-1`},[S(`h4`,Tht,T(q(n)(`pluginAccounting.accounts.sectionTitle.${e.type}`)),1),e.accounts.length===0?(B(),U(`p`,Eht,T(q(n)(`pluginAccounting.accounts.listEmpty`)),1)):(B(),U(`ul`,Dht,[(B(!0),U(D,null,H(e.accounts,e=>(B(),U(`li`,{key:e.code,tabindex:`0`,role:`button`,"aria-label":q(n)(`pluginAccounting.accounts.openLedgerAria`,{code:e.code,name:e.name}),class:`flex items-center gap-3 px-2 py-1.5 border-b border-gray-100 hover:bg-blue-50 cursor-pointer text-gray-800 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-400 rounded`,"data-testid":`accounting-account-row-${e.code}`,onClick:t=>d(e),onKeydown:[l(s(t=>f(t,e),[`prevent`,`self`]),[`enter`]),l(s(t=>f(t,e),[`prevent`,`self`]),[`space`])]},[S(`span`,kht,T(e.code),1),S(`span`,Aht,T(e.name),1)],40,Oht))),128))]))]))),128)),o.value?(B(),ke(yL,{key:0,"book-id":e.bookId,accounts:e.accounts,onClose:r[1]||=e=>o.value=!1,onChanged:p},null,8,[`book-id`,`accounts`])):b(``,!0)]))}}),Mht={class:`flex flex-col gap-3`,"data-testid":`accounting-ledger`},Nht={class:`flex flex-wrap items-end gap-3`},Pht={class:`text-xs text-gray-500 flex flex-col gap-1`},Fht=[`value`],Iht={key:0,class:`text-xs text-gray-400`},Lht={key:1,class:`text-xs text-red-500`},Rht=[`data-testid`],zht={class:`text-xs text-gray-500 border-b border-gray-200`},Bht={class:`text-left py-1 px-2`},Vht={class:`text-left py-1 px-2`},Hht={key:0,class:`text-left py-1 px-2 w-40`},Uht={class:`text-right py-1 px-2 w-28`},Wht={class:`text-right py-1 px-2 w-28`},Ght={class:`text-right py-1 px-2 w-28`},Kht={class:`py-1 px-2 whitespace-nowrap`},qht={class:`py-1 px-2`},Jht={key:0},Yht={key:0,class:`py-1 px-2 font-mono text-xs`},Xht={key:0},Zht={class:`py-1 px-2 text-right`},Qht={key:0},$ht={class:`py-1 px-2 text-right`},egt={key:0},tgt={class:`py-1 px-2 text-right font-mono`},ngt={class:`font-semibold border-t border-gray-300`},rgt=[`colspan`],igt={class:`py-1 px-2 text-right`},agt=`—`,ogt=K({__name:`Ledger`,props:{bookId:{},accounts:{},currency:{},version:{},fiscalYearEnd:{},openingDate:{},preselectAccountCode:{}},setup(e){let t=mL(),{t:n}=pL(),r=e,a=V(``),o=V(null),s=V(!1),l=V(null),{begin:d,isCurrent:f}=hL(),p=m(()=>fP(r.fiscalYearEnd)),h=V(mP(p.value));function g(e){return gP(e,r.currency)}function _(e){return`${e.name} (${e.code})`}let v=m(()=>r.accounts.filter(e=>e.active!==!1)),y=m(()=>o.value?wft(o.value.accountCode):!1);function x(e){if(e.from!==``||e.to!==``)return{kind:`range`,from:e.from||`0000-01-01`,to:e.to||`9999-12-31`}}async function C(){let e=d();if(!a.value)o.value=null,l.value=null,s.value=!1;else{s.value=!0,l.value=null;try{let n=await t.getLedger(a.value,x(h.value),r.bookId);if(!f(e))return;if(!n.ok){l.value=n.error,o.value=null;return}o.value=n.data.ledger}finally{f(e)&&(s.value=!1)}}}return Ve(()=>[r.bookId,p.value],()=>{a.value=``,h.value=mP(p.value)}),Ve(()=>r.preselectAccountCode,e=>{e&&(a.value=e,h.value=mP(p.value))},{immediate:!0}),Ve(()=>[r.bookId,r.version,a.value,h.value.from,h.value.to],C,{immediate:!0}),(t,r)=>(B(),U(`div`,Mht,[S(`div`,Nht,[S(`label`,Pht,[J(T(q(n)(`pluginAccounting.ledger.selectAccount`))+` `,1),u(S(`select`,{"onUpdate:modelValue":r[0]||=e=>a.value=e,class:`h-8 px-2 rounded border border-gray-300 text-sm bg-white`,"data-testid":`accounting-ledger-account`},[S(`option`,{value:``},T(agt)),(B(!0),U(D,null,H(v.value,e=>(B(),U(`option`,{key:e.code,value:e.code},T(_(e)),9,Fht))),128))],512),[[i,a.value]])]),De(gL,{modelValue:h.value,"onUpdate:modelValue":r[1]||=e=>h.value=e,"fiscal-year-end":p.value,"opening-date":e.openingDate},null,8,[`modelValue`,`fiscal-year-end`,`opening-date`]),S(`button`,{class:`h-8 px-2.5 rounded border border-gray-300 text-sm text-gray-600 hover:bg-gray-50`,onClick:C},[...r[2]||=[S(`span`,{class:`material-icons text-base align-middle`},`refresh`,-1)]])]),s.value?(B(),U(`p`,Iht,T(q(n)(`pluginAccounting.common.loading`)),1)):l.value?(B(),U(`p`,Lht,T(q(n)(`pluginAccounting.common.error`,{error:l.value})),1)):o.value?(B(),U(`table`,{key:2,class:`w-full text-sm`,"data-testid":y.value?`accounting-ledger-table-with-tax-id`:`accounting-ledger-table`},[S(`thead`,null,[S(`tr`,zht,[S(`th`,Bht,T(q(n)(`pluginAccounting.ledger.columns.date`)),1),S(`th`,Vht,T(q(n)(`pluginAccounting.ledger.columns.memo`)),1),y.value?(B(),U(`th`,Hht,T(q(n)(`pluginAccounting.ledger.columns.taxRegistrationId`)),1)):b(``,!0),S(`th`,Uht,T(q(n)(`pluginAccounting.ledger.columns.debit`)),1),S(`th`,Wht,T(q(n)(`pluginAccounting.ledger.columns.credit`)),1),S(`th`,Ght,T(q(n)(`pluginAccounting.ledger.columns.balance`)),1)])]),S(`tbody`,null,[(B(!0),U(D,null,H(o.value.rows,e=>(B(),U(`tr`,{key:`${e.entryId}-${e.date}`,class:c([e.kind===`void`||e.kind===`void-marker`?`text-gray-400 line-through`:``,`border-b border-gray-100`])},[S(`td`,Kht,T(e.date),1),S(`td`,qht,[e.memo?(B(),U(`span`,Jht,T(e.memo),1)):b(``,!0)]),y.value?(B(),U(`td`,Yht,[e.taxRegistrationId?(B(),U(`span`,Xht,T(e.taxRegistrationId),1)):b(``,!0)])):b(``,!0),S(`td`,Zht,[e.debit?(B(),U(`span`,Qht,T(g(e.debit)),1)):b(``,!0)]),S(`td`,$ht,[e.credit?(B(),U(`span`,egt,T(g(e.credit)),1)):b(``,!0)]),S(`td`,tgt,T(g(e.runningBalance)),1)],2))),128))]),S(`tfoot`,null,[S(`tr`,ngt,[S(`td`,{colspan:y.value?5:4,class:`py-1 px-2 text-right`},T(q(n)(`pluginAccounting.ledger.closingBalance`)),9,rgt),S(`td`,igt,T(g(o.value.closingBalance)),1)])])],8,Rht)):b(``,!0)]))}}),sgt={class:`flex flex-col gap-3`,"data-testid":`accounting-balance-sheet`},cgt={class:`flex flex-wrap items-end gap-3`},lgt={class:`text-xs text-gray-500 flex flex-col gap-1`},ugt=[`value`],dgt={value:`thisMonth`},fgt={value:`lastMonth`},pgt={value:`lastQuarter`},mgt={value:`lastYear`},hgt={class:`text-xs text-gray-500 flex flex-col gap-1`},ggt={key:0,class:`text-xs text-gray-400`},_gt={key:1,class:`text-xs text-red-500`},vgt={class:`grid grid-cols-1 md:grid-cols-2 gap-4`},ygt={class:`text-sm font-semibold mb-2`},bgt={class:`w-full text-sm`},xgt=[`tabindex`,`role`,`aria-label`,`data-testid`,`onClick`,`onKeydown`],Sgt={class:`py-1 px-1`},Cgt={key:0,class:`font-mono text-[10px] text-gray-400 mr-2`},wgt={class:`py-1 px-1 text-right font-mono`},Tgt={class:`font-semibold border-t border-gray-300`},Egt={class:`py-1 px-1`},Dgt={class:`py-1 px-1 text-right`},Ogt=`_currentEarnings`,kgt=K({__name:`BalanceSheet`,props:{bookId:{},currency:{},version:{}},emits:[`selectAccount`],setup(e,{emit:t}){let n=mL(),{t:r}=pL(),i=e,a=t,o=V(yP()),d=V(null),f=V(!1),p=V(null),{begin:h,isCurrent:g}=hL();function _(e){return gP(e,i.currency)}function v(e){return e===`asset`?r(`pluginAccounting.balanceSheet.sections.asset`):e===`liability`?r(`pluginAccounting.balanceSheet.sections.liability`):e===`equity`?r(`pluginAccounting.balanceSheet.sections.equity`):e}function y(e){return e.accountCode===Ogt}function x(e){return y(e)?r(`pluginAccounting.balanceSheet.currentEarnings`):e.accountName}function C(e){y(e)||a(`selectAccount`,e.accountCode)}function w(e,t){e.repeat||y(t)||a(`selectAccount`,t.accountCode)}let E=m(()=>{let{value:e}=o,t=new Date;return e===yP(t)?`thisMonth`:e===H9e(t)?`lastMonth`:e===U9e(t)?`lastQuarter`:e===W9e(t)?`lastYear`:``});function O(e){let{target:t}=e;if(!(t instanceof HTMLSelectElement))return;let n=t.value,r=new Date;n===`thisMonth`?o.value=yP(r):n===`lastMonth`?o.value=H9e(r):n===`lastQuarter`?o.value=U9e(r):n===`lastYear`&&(o.value=W9e(r))}async function k(){let e=h();f.value=!0,p.value=null;try{let t=await n.getBalanceSheet({kind:`month`,period:o.value},i.bookId);if(!g(e))return;if(!t.ok){p.value=t.error,d.value=null;return}d.value=t.data.balanceSheet}finally{g(e)&&(f.value=!1)}}return Ve(()=>[i.bookId,i.version,o.value],k,{immediate:!0}),(e,t)=>(B(),U(`div`,sgt,[S(`div`,cgt,[S(`label`,lgt,[J(T(q(r)(`pluginAccounting.balanceSheet.shortcutLabel`))+` `,1),S(`select`,{value:E.value,class:`h-8 px-2 rounded border border-gray-300 text-sm bg-white`,"data-testid":`accounting-bs-shortcut`,onChange:O},[t[1]||=S(`option`,{value:``,hidden:``},null,-1),S(`option`,dgt,T(q(r)(`pluginAccounting.balanceSheet.thisMonth`)),1),S(`option`,fgt,T(q(r)(`pluginAccounting.balanceSheet.lastMonth`)),1),S(`option`,pgt,T(q(r)(`pluginAccounting.balanceSheet.lastQuarter`)),1),S(`option`,mgt,T(q(r)(`pluginAccounting.balanceSheet.lastYear`)),1)],40,ugt)]),S(`label`,hgt,[J(T(q(r)(`pluginAccounting.balanceSheet.asOfLabel`))+` `,1),u(S(`input`,{"onUpdate:modelValue":t[0]||=e=>o.value=e,type:`month`,class:`h-8 px-2 rounded border border-gray-300 text-sm`,"data-testid":`accounting-bs-period`},null,512),[[Fe,o.value]])]),S(`button`,{class:`h-8 px-2.5 rounded border border-gray-300 text-sm text-gray-600 hover:bg-gray-50`,onClick:k},[...t[2]||=[S(`span`,{class:`material-icons text-base align-middle`},`refresh`,-1)]])]),f.value?(B(),U(`p`,ggt,T(q(r)(`pluginAccounting.common.loading`)),1)):p.value?(B(),U(`p`,_gt,T(q(r)(`pluginAccounting.common.error`,{error:p.value})),1)):d.value?(B(),U(D,{key:2},[S(`div`,vgt,[(B(!0),U(D,null,H(d.value.sections,e=>(B(),U(`section`,{key:e.type,class:`border border-gray-200 rounded p-3`},[S(`h4`,ygt,T(v(e.type)),1),S(`table`,bgt,[S(`tbody`,null,[(B(!0),U(D,null,H(e.rows,e=>(B(),U(`tr`,{key:e.accountCode,class:c([`border-b border-gray-100`,y(e)?`italic text-gray-600`:`hover:bg-blue-50 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-400`]),tabindex:y(e)?-1:0,role:y(e)?void 0:`button`,"aria-label":y(e)?void 0:q(r)(`pluginAccounting.accounts.openLedgerAria`,{code:e.accountCode,name:e.accountName}),"data-testid":y(e)?void 0:`accounting-bs-row-${e.accountCode}`,onClick:t=>C(e),onKeydown:[l(s(t=>w(t,e),[`prevent`,`self`]),[`enter`]),l(s(t=>w(t,e),[`prevent`,`self`]),[`space`])]},[S(`td`,Sgt,[y(e)?b(``,!0):(B(),U(`span`,Cgt,T(e.accountCode),1)),J(T(x(e)),1)]),S(`td`,wgt,T(_(e.balance)),1)],42,xgt))),128))]),S(`tfoot`,null,[S(`tr`,Tgt,[S(`td`,Egt,T(q(r)(`pluginAccounting.balanceSheet.total`)),1),S(`td`,Dgt,T(_(e.total)),1)])])])]))),128))]),S(`p`,{class:c([Math.abs(d.value.imbalance)<=.01?`text-green-600`:`text-red-500`,`text-xs`]),"data-testid":`accounting-bs-imbalance`},T(q(r)(`pluginAccounting.balanceSheet.imbalance`,{amount:_(d.value.imbalance)})),3)],64)):b(``,!0)]))}}),Agt={class:`flex flex-col gap-3`,"data-testid":`accounting-profit-loss`},jgt={class:`flex flex-wrap items-end gap-3`},Mgt={key:0,class:`text-xs text-gray-400`},Ngt={key:1,class:`text-xs text-red-500`},Pgt={class:`border border-gray-200 rounded p-3`},Fgt={class:`text-sm font-semibold mb-2`},Igt={class:`w-full text-sm`},Lgt=[`aria-label`,`data-testid`,`onClick`,`onKeydown`],Rgt={class:`py-1 px-1`},zgt={class:`font-mono text-[10px] text-gray-400 mr-2`},Bgt={class:`py-1 px-1 text-right font-mono`},Vgt={class:`font-semibold border-t border-gray-300`},Hgt={class:`py-1 px-1`},Ugt={class:`py-1 px-1 text-right`},Wgt={class:`border border-gray-200 rounded p-3`},Ggt={class:`text-sm font-semibold mb-2`},Kgt={class:`w-full text-sm`},qgt=[`aria-label`,`data-testid`,`onClick`,`onKeydown`],Jgt={class:`py-1 px-1`},Ygt={class:`font-mono text-[10px] text-gray-400 mr-2`},Xgt={class:`py-1 px-1 text-right font-mono`},Zgt={class:`font-semibold border-t border-gray-300`},Qgt={class:`py-1 px-1`},$gt={class:`py-1 px-1 text-right`},e_t={class:`flex justify-end items-center gap-2 text-sm font-semibold`,"data-testid":`accounting-pl-net`},t_t=K({__name:`ProfitLoss`,props:{bookId:{},currency:{},version:{},fiscalYearEnd:{},openingDate:{}},emits:[`selectAccount`],setup(e,{emit:t}){let n=mL(),{t:r}=pL(),i=e,a=t,o=m(()=>fP(i.fiscalYearEnd));function u(e){a(`selectAccount`,e)}function d(e,t){e.repeat||a(`selectAccount`,t)}let f=V(mP(o.value)),p=V(null),h=V(!1),g=V(null),{begin:_,isCurrent:v}=hL();function y(e){return gP(e,i.currency)}async function x(){let e=_();h.value=!0,g.value=null;try{let t=f.value.from||`0000-01-01`,r=f.value.to||`9999-12-31`,a=await n.getProfitLoss({kind:`range`,from:t,to:r},i.bookId);if(!v(e))return;if(!a.ok){g.value=a.error,p.value=null;return}p.value=a.data.profitLoss}finally{v(e)&&(h.value=!1)}}return Ve(()=>[i.bookId,o.value],()=>{f.value=mP(o.value)}),Ve(()=>[i.bookId,i.version,f.value.from,f.value.to],x,{immediate:!0}),(t,n)=>(B(),U(`div`,Agt,[S(`div`,jgt,[De(gL,{modelValue:f.value,"onUpdate:modelValue":n[0]||=e=>f.value=e,"fiscal-year-end":o.value,"opening-date":e.openingDate},null,8,[`modelValue`,`fiscal-year-end`,`opening-date`]),S(`button`,{class:`h-8 px-2.5 rounded border border-gray-300 text-sm text-gray-600 hover:bg-gray-50`,onClick:x},[...n[1]||=[S(`span`,{class:`material-icons text-base align-middle`},`refresh`,-1)]])]),h.value?(B(),U(`p`,Mgt,T(q(r)(`pluginAccounting.common.loading`)),1)):g.value?(B(),U(`p`,Ngt,T(q(r)(`pluginAccounting.common.error`,{error:g.value})),1)):p.value?(B(),U(D,{key:2},[S(`section`,Pgt,[S(`h4`,Fgt,T(q(r)(`pluginAccounting.profitLoss.income`)),1),S(`table`,Igt,[S(`tbody`,null,[(B(!0),U(D,null,H(p.value.income.rows,e=>(B(),U(`tr`,{key:e.accountCode,class:`border-b border-gray-100 hover:bg-blue-50 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-400`,tabindex:`0`,role:`button`,"aria-label":q(r)(`pluginAccounting.accounts.openLedgerAria`,{code:e.accountCode,name:e.accountName}),"data-testid":`accounting-pl-row-${e.accountCode}`,onClick:t=>u(e.accountCode),onKeydown:[l(s(t=>d(t,e.accountCode),[`prevent`,`self`]),[`enter`]),l(s(t=>d(t,e.accountCode),[`prevent`,`self`]),[`space`])]},[S(`td`,Rgt,[S(`span`,zgt,T(e.accountCode),1),J(T(e.accountName),1)]),S(`td`,Bgt,T(y(e.amount)),1)],40,Lgt))),128))]),S(`tfoot`,null,[S(`tr`,Vgt,[S(`td`,Hgt,T(q(r)(`pluginAccounting.balanceSheet.total`)),1),S(`td`,Ugt,T(y(p.value.income.total)),1)])])])]),S(`section`,Wgt,[S(`h4`,Ggt,T(q(r)(`pluginAccounting.profitLoss.expense`)),1),S(`table`,Kgt,[S(`tbody`,null,[(B(!0),U(D,null,H(p.value.expense.rows,e=>(B(),U(`tr`,{key:e.accountCode,class:`border-b border-gray-100 hover:bg-blue-50 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-400`,tabindex:`0`,role:`button`,"aria-label":q(r)(`pluginAccounting.accounts.openLedgerAria`,{code:e.accountCode,name:e.accountName}),"data-testid":`accounting-pl-row-${e.accountCode}`,onClick:t=>u(e.accountCode),onKeydown:[l(s(t=>d(t,e.accountCode),[`prevent`,`self`]),[`enter`]),l(s(t=>d(t,e.accountCode),[`prevent`,`self`]),[`space`])]},[S(`td`,Jgt,[S(`span`,Ygt,T(e.accountCode),1),J(T(e.accountName),1)]),S(`td`,Xgt,T(y(e.amount)),1)],40,qgt))),128))]),S(`tfoot`,null,[S(`tr`,Zgt,[S(`td`,Qgt,T(q(r)(`pluginAccounting.balanceSheet.total`)),1),S(`td`,$gt,T(y(p.value.expense.total)),1)])])])]),S(`div`,e_t,[S(`span`,null,T(q(r)(`pluginAccounting.profitLoss.netIncome`)),1),S(`span`,{class:c(p.value.netIncome>=0?`text-green-600`:`text-red-500`)},T(y(p.value.netIncome)),3)])],64)):b(``,!0)]))}}),n_t={class:`flex flex-col gap-4`,"data-testid":`accounting-settings`},r_t={class:`border border-gray-200 rounded p-3 flex flex-col gap-2`},i_t={class:`text-sm font-semibold`},a_t={class:`text-xs text-gray-500`},o_t={class:`text-sm flex flex-col gap-1`},s_t=[`disabled`],c_t={class:`text-xs text-gray-700 grid grid-cols-[max-content_1fr] gap-x-3 gap-y-1`},l_t={class:`text-gray-500`},u_t={class:`text-sm flex flex-col gap-1 mt-1`},d_t=[`disabled`],f_t={value:``},p_t=[`value`],m_t={class:`text-sm flex flex-col gap-1 mt-1`},h_t=[`disabled`],g_t=[`value`],__t={class:`text-xs text-gray-500`},v_t={key:0,class:`text-xs text-green-600`,"data-testid":`accounting-settings-update-ok`},y_t={key:1,class:`text-xs text-red-500`,"data-testid":`accounting-settings-update-error`},b_t=[`disabled`],x_t={class:`border border-gray-200 rounded p-3 flex flex-col gap-2`},S_t={class:`text-sm font-semibold`},C_t={class:`text-xs text-gray-500`},w_t={key:0,class:`text-xs text-green-600`,"data-testid":`accounting-settings-rebuild-ok`},T_t={key:1,class:`text-xs text-red-500`,"data-testid":`accounting-settings-rebuild-error`},E_t=[`disabled`],D_t={key:0},O_t={key:1,class:`border border-red-300 rounded p-3 flex flex-col gap-2`},k_t={class:`text-sm font-semibold text-red-700`},A_t={class:`text-xs text-gray-500`},j_t={key:0,class:`text-xs text-red-500`,"data-testid":`accounting-settings-delete-error`},M_t={class:`text-xs text-gray-500 flex flex-col gap-1`},N_t=[`disabled`],P_t=K({__name:`BookSettings`,props:{bookId:{},bookName:{},currency:{},country:{},fiscalYearEnd:{}},emits:[`deleted`,`books-changed`],setup(e,{emit:t}){let n=mL(),{t:r,locale:a}=pL(),o=e,s=t,c=V(!1),l=V(null),d=V(null),f=V(!1),p=V(null),h=V(``),g=V(!1),_=V(null),v=V(null),y=V(!1),x=V(o.bookName),C=V(o.country??``),w=V(fP(o.fiscalYearEnd)),E=m(()=>hP.map(e=>({code:e,label:`${e} — ${M9e(e,a.value)}`}))),O=m(()=>dP.map(e=>({value:e,label:C9e(e,a.value)}))),k=m(()=>{let e=x.value.trim()!==o.bookName,t=x.value.trim().length>0,n=C.value!==(o.country??``),r=w.value!==fP(o.fiscalYearEnd);return t&&(e||n||r)});async function A(){c.value=!0,l.value=null,d.value=null;try{let e=await n.rebuildSnapshots(o.bookId);if(!e.ok){d.value=e.error;return}l.value=r(`pluginAccounting.settings.rebuildOk`,{count:e.data.rebuilt.length})}finally{c.value=!1}}async function j(){if(!g.value){g.value=!0,_.value=null,v.value=null;try{let e=C.value,t=e===``||N9e(e)?e:``,i=await n.updateBook({bookId:o.bookId,name:x.value.trim(),country:t,fiscalYearEnd:w.value});if(!i.ok){v.value=i.error;return}_.value=r(`pluginAccounting.settings.updateOk`),s(`books-changed`)}finally{g.value=!1}}}async function M(){if(!f.value){f.value=!0,p.value=null;try{let e=await n.deleteBook(o.bookId);if(!e.ok){p.value=e.error;return}s(`deleted`,o.bookName),s(`books-changed`)}finally{f.value=!1}}}return Ve(()=>o.bookId,()=>{l.value=null,d.value=null,p.value=null,h.value=``,_.value=null,v.value=null,x.value=o.bookName,C.value=o.country??``,w.value=fP(o.fiscalYearEnd),y.value=!1}),Ve(()=>o.bookName,e=>{x.value=e}),Ve(()=>o.country,e=>{C.value=e??``}),Ve(()=>o.fiscalYearEnd,e=>{w.value=fP(e)}),(t,n)=>(B(),U(`div`,n_t,[S(`section`,r_t,[S(`h4`,i_t,T(q(r)(`pluginAccounting.settings.bookInfo`)),1),S(`p`,a_t,T(q(r)(`pluginAccounting.settings.bookInfoExplain`)),1),S(`label`,o_t,[J(T(q(r)(`pluginAccounting.bookSwitcher.nameLabel`))+` `,1),u(S(`input`,{"onUpdate:modelValue":n[0]||=e=>x.value=e,type:`text`,class:`h-8 px-2 rounded border border-gray-300 text-sm bg-white`,"data-testid":`accounting-settings-name`,disabled:g.value,maxlength:`200`},null,8,s_t),[[Fe,x.value]])]),S(`dl`,c_t,[S(`dt`,l_t,T(q(r)(`pluginAccounting.bookSwitcher.currencyLabel`)),1),S(`dd`,null,T(e.currency),1)]),S(`label`,u_t,[J(T(q(r)(`pluginAccounting.bookSwitcher.countryLabel`))+` `,1),u(S(`select`,{"onUpdate:modelValue":n[1]||=e=>C.value=e,class:`h-8 px-2 rounded border border-gray-300 text-sm bg-white`,"data-testid":`accounting-settings-country`,disabled:g.value},[S(`option`,f_t,T(q(r)(`pluginAccounting.settings.countryUnset`)),1),(B(!0),U(D,null,H(E.value,e=>(B(),U(`option`,{key:e.code,value:e.code},T(e.label),9,p_t))),128))],8,d_t),[[i,C.value]])]),S(`label`,m_t,[J(T(q(r)(`pluginAccounting.bookSwitcher.fiscalYearEndLabel`))+` `,1),u(S(`select`,{"onUpdate:modelValue":n[2]||=e=>w.value=e,class:`h-8 px-2 rounded border border-gray-300 text-sm bg-white`,"data-testid":`accounting-settings-fiscal-year-end`,disabled:g.value},[(B(!0),U(D,null,H(O.value,e=>(B(),U(`option`,{key:e.value,value:e.value},T(e.label),9,g_t))),128))],8,h_t),[[i,w.value]])]),S(`p`,__t,T(q(r)(`pluginAccounting.settings.fiscalYearEndExplain`)),1),_.value?(B(),U(`p`,v_t,T(_.value),1)):b(``,!0),v.value?(B(),U(`p`,y_t,T(v.value),1)):b(``,!0),S(`div`,null,[S(`button`,{class:`h-8 px-3 rounded bg-blue-600 hover:bg-blue-700 text-white text-sm disabled:opacity-50`,disabled:g.value||!k.value,"data-testid":`accounting-settings-save`,onClick:j},T(g.value?q(r)(`pluginAccounting.common.loading`):q(r)(`pluginAccounting.settings.saveChanges`)),9,b_t)])]),S(`section`,x_t,[S(`h4`,S_t,T(q(r)(`pluginAccounting.settings.rebuild`)),1),S(`p`,C_t,T(q(r)(`pluginAccounting.settings.rebuildExplain`)),1),l.value?(B(),U(`p`,w_t,T(l.value),1)):b(``,!0),d.value?(B(),U(`p`,T_t,T(d.value),1)):b(``,!0),S(`div`,null,[S(`button`,{class:`h-8 px-3 rounded bg-blue-600 hover:bg-blue-700 text-white text-sm disabled:opacity-50`,disabled:c.value,"data-testid":`accounting-settings-rebuild`,onClick:A},T(c.value?q(r)(`pluginAccounting.common.loading`):q(r)(`pluginAccounting.settings.rebuild`)),9,E_t)])]),y.value?b(``,!0):(B(),U(`div`,D_t,[S(`button`,{type:`button`,class:`h-8 px-2.5 flex items-center gap-1 rounded border border-gray-300 text-sm text-gray-600 hover:bg-gray-50`,"data-testid":`accounting-settings-advanced`,onClick:n[3]||=e=>y.value=!0},[n[5]||=S(`span`,{class:`material-icons text-base`},`expand_more`,-1),S(`span`,null,T(q(r)(`pluginAccounting.settings.advanced`)),1)])])),y.value?(B(),U(`section`,O_t,[S(`h4`,k_t,T(q(r)(`pluginAccounting.settings.deleteBook`)),1),S(`p`,A_t,T(q(r)(`pluginAccounting.settings.deleteBookExplain`)),1),p.value?(B(),U(`p`,j_t,T(p.value),1)):b(``,!0),S(`label`,M_t,[J(T(q(r)(`pluginAccounting.settings.deleteBookConfirm`,{bookName:e.bookName}))+` `,1),u(S(`input`,{"onUpdate:modelValue":n[4]||=e=>h.value=e,class:`h-8 px-2 rounded border border-gray-300 text-sm`,"data-testid":`accounting-settings-delete-confirm`},null,512),[[Fe,h.value]])]),S(`div`,null,[S(`button`,{class:`h-8 px-3 rounded bg-red-600 hover:bg-red-700 text-white text-sm disabled:opacity-50`,disabled:h.value!==e.bookName||f.value,"data-testid":`accounting-settings-delete`,onClick:M},T(f.value?q(r)(`pluginAccounting.common.loading`):q(r)(`pluginAccounting.settings.deleteBookButton`)),9,N_t)])])):b(``,!0)]))}}),F_t=Object.values(g9e);function I_t(e){if(typeof e!=`object`||!e||!(`kind`in e))return null;let t=F_t.find(t=>t===e.kind);if(t===void 0)return null;let n=`period`in e&&typeof e.period==`string`?e.period:void 0;return n===void 0?{kind:t}:{kind:t,period:n}}function L_t(e){return m(()=>e===void 0?fL():typeof e==`function`?e():e)}function R_t(e,t,n){let r=L_t(n),i=V(0),a=null;function o(e){a?.(),a=null,i.value=0,e&&(a=Odt(p9e(e,r.value),e=>{i.value+=1;let n=I_t(e);n&&t?.(n)}))}return Ve([e,r],([e])=>o(e),{immediate:!0}),_(()=>{a?.(),a=null}),{version:i}}function z_t(e,t){let n=L_t(t),r=null;Ve(n,t=>{r?.(),r=Odt(h9e(t),e)},{immediate:!0}),_(()=>{r?.(),r=null})}var B_t={class:`h-full bg-white flex flex-col`,"data-testid":`accounting-app`},V_t={class:`flex items-center justify-between gap-2 px-3 py-2 border-b border-gray-100 shrink-0`},H_t={class:`flex items-center gap-2 min-w-0`},U_t={class:`text-lg font-semibold text-gray-800`},W_t={class:`flex items-center gap-0.5 px-3 py-1.5 border-b border-gray-100 shrink-0 overflow-x-auto`,"data-testid":`accounting-tabs`},G_t=[`data-testid`,`disabled`,`onClick`],K_t={class:`material-icons text-base`},q_t={class:`flex-1 overflow-auto p-4`},J_t={key:0,class:`text-center text-sm text-gray-600 flex flex-col gap-2 items-center justify-center h-full`,"data-testid":`accounting-deleted-notice`},Y_t={class:`font-medium`,"data-testid":`accounting-deleted-notice-title`},X_t={class:`text-xs text-gray-500`},Z_t={key:1,class:`text-sm text-gray-400`},Q_t={key:2,class:`text-sm text-red-500`,"data-testid":`accounting-load-error`},$_t={key:3,class:`text-sm text-gray-500`,"data-testid":`accounting-no-book`},evt=K({__name:`View`,props:{selectedResult:{}},setup(e){let{t}=pL(),n=e,r=[`journal`,`opening`,`accounts`,`ledger`,`balanceSheet`,`profitLoss`,`settings`],i=[{key:`journal`,icon:`list`,labelKey:`pluginAccounting.tabs.journal`},{key:`opening`,icon:`play_arrow`,labelKey:`pluginAccounting.tabs.opening`},{key:`accounts`,icon:`list_alt`,labelKey:`pluginAccounting.tabs.accounts`},{key:`ledger`,icon:`menu_book`,labelKey:`pluginAccounting.tabs.ledger`},{key:`balanceSheet`,icon:`balance`,labelKey:`pluginAccounting.tabs.balanceSheet`},{key:`profitLoss`,icon:`trending_up`,labelKey:`pluginAccounting.tabs.profitLoss`},{key:`settings`,icon:`settings`,labelKey:`pluginAccounting.tabs.settings`}];function a(e){return r.some(t=>t===e)}let o=m(()=>n.selectedResult?.data??n.selectedResult?.jsonData??{}),s=m(()=>{let e=o.value;return`scope`in e?e.scope??null:fL()}),l=Bdt(()=>s.value),u=m(()=>a(o.value.initialTab)?o.value.initialTab:`journal`),d=V(u.value),f=V([]),p=V(null),h=V([]),g=V(!0),_=V(!1),v=V(!1),y=V(!1),x=V(null),C=V(null),w=V(void 0),E=V(null),O=m(()=>f.value.find(e=>e.id===p.value)??null),k=m(()=>O.value?.name??``),A=m(()=>O.value?.currency??`USD`),j=m(()=>O.value?.country),M=m(()=>O.value?.fiscalYearEnd),{version:N}=R_t(p,void 0,()=>s.value);z_t(()=>void F(),()=>s.value);function P(){let[e]=f.value;if(!e)return null;let t=o.value.bookId;return t&&f.value.some(e=>e.id===t)?t:e.id}async function F(){g.value=!0,x.value=null;let e=O.value;try{let t=await l.getBooks();if(!t.ok){x.value=t.error;return}f.value=t.data.books,_.value=!0,E.value===null&&(p.value!==null&&f.value.some(e=>e.id===p.value)||(e?(p.value=null,E.value=e.name):p.value=P())),!y.value&&f.value.length===0&&(y.value=!0,v.value=!0)}catch(e){x.value=uP(e)}finally{g.value=!1}}async function I(e){v.value=!1,await F(),p.value=e.id}async function L(e){f.value.some(t=>t.id===e.id)||(f.value=[...f.value,e]),p.value=e.id,E.value=null,d.value=`journal`,await F()}async function R(){if(!p.value){h.value=[];return}let e=await l.getAccounts(p.value);e.ok&&(h.value=e.data.accounts)}async function z(){if(!p.value){C.value=null,w.value=void 0;return}let e=await l.getOpeningBalances(p.value);e.ok&&(C.value=e.data.opening!==null,w.value=e.data.opening?.date)}let ee=m(()=>p.value!==null&&C.value===!1),te=m(()=>ee.value?i.filter(e=>e.key===`opening`||e.key===`settings`):i.filter(e=>e.key!==`opening`||d.value===`opening`));function ne(e){p.value=e,E.value=null}let re=V(void 0),ie=V(void 0);function ae(e){ie.value=void 0,Promise.resolve().then(()=>{ie.value=e}),d.value=`ledger`}function oe(){d.value===`opening`&&(d.value=`journal`)}async function W(e){d.value=`journal`,p.value=null,E.value=e,await F()}Ve(()=>[p.value,N.value],()=>{p.value&&R()},{immediate:!0}),Ve(p,()=>{ie.value=void 0});let se=V(null);function ce(e){f.value.some(t=>t.id===e)?(p.value=e,se.value=null):se.value=e}Ve(()=>o.value.bookId,e=>{e&&ce(e)}),Ve(f,()=>{let e=se.value;e&&ce(e)});function le(e){if(a(e.initialTab))return e.initialTab;switch(e.action){case cP.addEntries:case cP.voidEntry:return`journal`;case cP.upsertAccount:return`accounts`;case cP.updateBook:return`settings`;case cP.openBook:case cP.createBook:case cP.setOpeningBalances:return`balanceSheet`;default:return null}}function ue(e){if(e.action===cP.addEntries){let t=Array.isArray(e.entries)?e.entries:[];return t[t.length-1]?.id}if(e.action===cP.voidEntry)return e.markerEntry?.id}return Ve(()=>o.value,e=>{let t=le(e);t&&(d.value=t),re.value=ue(e)},{immediate:!0}),Ve(p,(e,t)=>{t&&(re.value=void 0)}),Ve(()=>[p.value,N.value],()=>void z(),{immediate:!0}),Ve(ee,e=>{e&&d.value!==`opening`&&(d.value=`opening`)}),F(),(e,n)=>(B(),U(`div`,B_t,[v.value?(B(),ke(nft,{key:0,"first-run":``,"full-page":``,onCreated:I})):(B(),U(D,{key:1},[S(`header`,V_t,[S(`div`,H_t,[n[2]||=S(`span`,{class:`material-icons text-gray-600`},`account_balance`,-1),S(`h2`,U_t,T(q(t)(`pluginAccounting.title`)),1)]),_.value?(B(),ke(lft,{key:0,"model-value":p.value??``,books:f.value,"onUpdate:modelValue":ne,onBooksChanged:F,onBookCreated:L},null,8,[`model-value`,`books`])):b(``,!0)]),S(`nav`,W_t,[(B(!0),U(D,null,H(te.value,e=>(B(),U(`button`,{key:e.key,class:c([`h-8 px-2.5 flex items-center gap-1 rounded text-sm whitespace-nowrap`,E.value===null?d.value===e.key?`bg-blue-50 text-blue-600 font-medium`:`text-gray-600 hover:bg-gray-50`:`text-gray-400 cursor-not-allowed`]),"data-testid":`accounting-tab-${e.key}`,disabled:E.value!==null,onClick:t=>d.value=e.key},[S(`span`,K_t,T(e.icon),1),S(`span`,null,T(q(t)(e.labelKey)),1)],10,G_t))),128))]),S(`main`,q_t,[E.value===null?g.value&&!_.value?(B(),U(`p`,Z_t,T(q(t)(`pluginAccounting.common.loading`)),1)):x.value?(B(),U(`p`,Q_t,T(q(t)(`pluginAccounting.common.error`,{error:x.value})),1)):p.value?p.value?(B(),U(D,{key:4},[d.value===`journal`?(B(),ke(Ymt,{key:0,"book-id":p.value,accounts:h.value,currency:A.value,country:j.value,version:q(N),"fiscal-year-end":M.value,"opening-date":w.value,"preselect-entry-id":re.value,onEditOpening:n[0]||=e=>d.value=`opening`,onPreselectConsumed:n[1]||=e=>re.value=void 0},null,8,[`book-id`,`accounts`,`currency`,`country`,`version`,`fiscal-year-end`,`opening-date`,`preselect-entry-id`])):d.value===`opening`?(B(),ke(Sht,{key:1,"book-id":p.value,accounts:h.value,currency:A.value,version:q(N),onSubmitted:oe},null,8,[`book-id`,`accounts`,`currency`,`version`])):d.value===`accounts`?(B(),ke(jht,{key:2,"book-id":p.value,accounts:h.value,onSelectAccount:ae},null,8,[`book-id`,`accounts`])):d.value===`ledger`?(B(),ke(ogt,{key:3,"book-id":p.value,accounts:h.value,currency:A.value,version:q(N),"fiscal-year-end":M.value,"opening-date":w.value,"preselect-account-code":ie.value},null,8,[`book-id`,`accounts`,`currency`,`version`,`fiscal-year-end`,`opening-date`,`preselect-account-code`])):d.value===`balanceSheet`?(B(),ke(kgt,{key:4,"book-id":p.value,currency:A.value,version:q(N),onSelectAccount:ae},null,8,[`book-id`,`currency`,`version`])):d.value===`profitLoss`?(B(),ke(t_t,{key:5,"book-id":p.value,currency:A.value,version:q(N),"fiscal-year-end":M.value,"opening-date":w.value,onSelectAccount:ae},null,8,[`book-id`,`currency`,`version`,`fiscal-year-end`,`opening-date`])):d.value===`settings`?(B(),ke(P_t,{key:6,"book-id":p.value,"book-name":k.value,currency:A.value,country:j.value,"fiscal-year-end":M.value,onDeleted:W,onBooksChanged:F},null,8,[`book-id`,`book-name`,`currency`,`country`,`fiscal-year-end`])):b(``,!0)],64)):b(``,!0):(B(),U(`p`,$_t,T(q(t)(`pluginAccounting.noBook`)),1)):(B(),U(`div`,J_t,[n[3]||=S(`span`,{class:`material-icons text-gray-400`,style:{"font-size":`48px`}},`delete_outline`,-1),S(`p`,Y_t,T(q(t)(`pluginAccounting.deletedNotice.title`,{bookName:E.value})),1),S(`p`,X_t,T(q(t)(`pluginAccounting.deletedNotice.body`)),1)]))])],64))]))}}),xL=e=>typeof e==`string`?e:void 0,tvt=e=>typeof e==`number`?e:void 0;function nvt(e,t){let n=xL(e.error);return n===void 0?null:t(`pluginAccounting.previewError`,{error:n})}function rvt(e,t){let[n]=_9e(e.entries)?e.entries:[],r=lP(n)?n:void 0,i=xL(r?.id),a=xL(r?.date);return!i||!a?null:t(`pluginAccounting.preview.entry`,{date:a})}function ivt(e,t){let{profitLoss:n}=e;if(!lP(n))return null;let r=tvt(n.netIncome);return r===void 0?null:t(`pluginAccounting.preview.pl`,{from:xL(n.from)??`?`,to:xL(n.to)??`?`,net:V9e(r)})}function avt(e,t){let{balanceSheet:n}=e;if(!lP(n))return null;let r=xL(n.asOf),i=_9e(n.sections)?n.sections:void 0;if(!r||!i)return null;let a=i.find(e=>lP(e)&&e.type===`asset`);return t(`pluginAccounting.preview.bs`,{date:r,assets:lP(a)?V9e(tvt(a.total)??0):`?`})}function ovt(e,t){let{book:n}=e;if(!lP(n))return null;let r=xL(n.id),i=xL(n.name);return!r||!i?null:t(`pluginAccounting.preview.bookCreated`,{name:i,id:r})}function svt(e,t){let{account:n}=e;if(!lP(n))return null;let r=xL(n.code),i=xL(n.name);return!r||!i?null:t(`pluginAccounting.preview.accountSaved`,{code:r,name:i})}function cvt(e,t){let{reverseEntry:n}=e;if(!lP(n))return null;let r=xL(n.date);return r?t(`pluginAccounting.preview.entryVoided`,{date:r}):null}function lvt(e,t){let{openingEntry:n}=e;if(!lP(n))return null;let r=xL(n.date);return r?t(e.replacedExisting===!0?`pluginAccounting.preview.openingReplaced`:`pluginAccounting.preview.openingSet`,{date:r}):null}function uvt(e,t){let n=xL(e.bookId);return n===void 0?t(`pluginAccounting.previewGeneric`):t(`pluginAccounting.previewSummary`,{bookId:n})}var dvt=e=>lP(e)?e:{};function fvt(e,t){let n=dvt(e);return nvt(n,t)??rvt(n,t)??ivt(n,t)??avt(n,t)??ovt(n,t)??svt(n,t)??cvt(n,t)??lvt(n,t)??uvt(n,t)}var pvt={class:`text-sm text-gray-700`,"data-testid":`accounting-preview`},mvt=K({__name:`Preview`,props:{result:{}},setup(e){let{t}=pL(),n=e,r=m(()=>fvt(n.result.data,t));return(e,t)=>(B(),U(`div`,pvt,[t[0]||=S(`span`,{class:`material-icons text-base align-middle mr-1`},`account_balance`,-1),S(`span`,null,T(r.value),1)]))}});M();var{subscribe:hvt}=aP();Edt({apiCall:yN,subscribe:hvt,localeTag:()=>q(WI.global.locale)}),o(),M();var gvt=Ae(()=>Xe(()=>Promise.resolve().then(()=>Vvt),void 0)),SL=x(new Map);function _vt(e){return SL.get(e)??null}function vvt(){return Array.from(SL.keys())}function yvt(e){if(document.querySelector(`link[data-runtime-plugin-css="${e}"]`))return;let t=document.createElement(`link`);t.rel=`stylesheet`,t.href=e,t.dataset.runtimePluginCss=e,document.head.appendChild(t)}function bvt(e){return{toolDefinition:{type:`function`,name:e.toolName,description:e.description,parameters:{type:`object`,properties:{},required:[]}}}}async function xvt(e){SL.set(e.toolName,bvt(e));let t=`${e.assetBase}/dist/vue.js`,n;try{n=(await fetch(t,{method:`HEAD`})).status}catch(t){console.warn(`[runtime-plugin] HEAD probe failed for ${e.name}@${e.version}`,t);return}if(n===404)return;if(n!==200){console.warn(`[runtime-plugin] unexpected HEAD status ${n} for ${e.name}@${e.version}`);return}let r;try{r=await Xe(()=>import(t),[])}catch(t){console.warn(`[runtime-plugin] dynamic import failed (asset reachable): ${e.name}@${e.version}`,t);return}let i=r.plugin??r.default?.plugin;i?.toolDefinition?(yvt(`${e.assetBase}/dist/style.css`),SL.set(e.toolName,{toolDefinition:i.toolDefinition,viewComponent:Svt(i.viewComponent,e.name),previewComponent:Svt(i.previewComponent,e.name)})):console.warn(`[runtime-plugin] plugin export missing toolDefinition: ${e.name}`)}function Svt(e,t){if(e)return z(K({name:`RuntimePluginScope:${t}`,inheritAttrs:!1,setup(n,{attrs:r,slots:i}){return()=>ve(gvt,{pkgName:t},()=>ve(e,r,i))}}))}async function Cvt(){let e=await bN(kP.plugins.runtimeList);if(!e.ok){console.warn(`[runtime-plugin] list fetch failed: ${e.error}`);return}let t=e.data.plugins;t.length!==0&&await Promise.allSettled(t.map(xvt))}var wvt={type:`function`,name:bP.toolName,prompt:`When the user asks to open / view their books, or to record, look up, or summarise journal entries / balances / opening balances, use manageAccounting. Use action='openBook' (with the target bookId) to switch the canvas to a specific existing book; use the specific action (addEntries / getReport / etc.) for narrowly-scoped operations the user asked about by name. On a fresh workspace call 'createBook' (always pass \`country\` so tax-registration advice is country-aware) — the accounting view picks up the new book automatically (no follow-up 'openBook' needed for this id). Use 'updateBook' to change a book's name or country (currency cannot be changed). Reach for 'openBook' only when switching to a different existing book. For cross-period charts and dashboards ("chart my quarterly revenue over the last two years", "show net income month-over-month for this fiscal year", "plot the cash balance by month") use action='getTimeSeries' — it returns one chart-ready point per bucket in a single round-trip; do NOT loop over 'getReport' to assemble a series yourself.`,description:`Manage a double-entry accounting book stored in the workspace file system. Supports multiple books (entities), opening balances for adoption from existing books, journal entries, voiding (append-only — corrections are reversing pairs), and balance-sheet / profit-loss / ledger reports. Action='openBook' mounts the full accounting UI in the canvas (requires bookId); 'getTimeSeries' returns chart-ready (label, value)[] series for revenue / expense / netIncome / accountBalance over time; specific actions return compact results that render inline.`,parameters:{type:`object`,properties:{action:{type:`string`,enum:Object.values(cP),description:`Operation to perform. 'openBook' mounts the full UI for a specific book; others perform a single read or write. Use 'openBook' when the user wants to browse / interact, and a specific action when the user named the operation.`},bookId:{type:`string`,description:`Target book id. Required for every action that reads or writes book data, including 'openBook'; call 'getBooks' first to enumerate available ids. The only actions that do NOT take a bookId are 'getBooks' and 'createBook' (which creates a fresh one).`},name:{type:`string`,description:`For 'createBook' / 'updateBook': human-readable book name.`},currency:{type:`string`,description:`For 'createBook': ISO 4217 currency code (default USD). Single-currency per book — cannot be changed once set.`},country:{type:`string`,enum:[...hP,``],description:`For 'createBook' / 'updateBook': ISO 3166-1 alpha-2 country code identifying the tax jurisdiction. Drives country-aware advice — e.g. when set to 'JP', strongly suggest the supplier's T-number (適格請求書発行事業者登録番号) on tax-related lines under インボイス制度. Only the codes listed in the enum are accepted; pass an empty string to 'updateBook' to clear the field.`},fiscalYearEnd:{type:`integer`,minimum:Math.min(...dP),maximum:Math.max(...dP),description:`For 'createBook' / 'updateBook': the calendar month (1-12) on whose LAST DAY this book's fiscal year closes — e.g. 3 = March 31, 8 = August 31, 12 = December 31 (calendar year, the default). Any month is allowed. Drives the date-range shortcuts in the UI ('current quarter', 'current year', etc.). Pure metadata: changing it does not move existing entries.`},initialTab:{type:`string`,description:`For 'openBook': initial tab to show (e.g. 'journal', 'opening', 'balanceSheet').`},confirm:{type:`boolean`,description:`For 'deleteBook': must be true to actually delete (guard against accidental deletion).`},account:{type:`object`,description:`For 'upsertAccount': the account to insert or update (matched by code).`,properties:{code:{type:`string`},name:{type:`string`},type:{type:`string`,enum:[`asset`,`liability`,`equity`,`income`,`expense`]},note:{type:`string`},active:{type:`boolean`,description:"Soft-delete flag. `false` deactivates the account (hides it from entry / ledger dropdowns while keeping it visible in Manage Accounts and historical entries — accounting integrity requires that a code referenced by a journal line never disappears). `true` reactivates a previously-deactivated account. Omit to preserve the existing state — handy when updating name / type / note without touching the active flag."}},required:[`code`,`name`,`type`]},entries:{type:`array`,description:`For 'addEntries': one or more journal entries to post atomically (all-or-nothing — if any entry fails validation, the whole batch is rejected and nothing is written). Use a single-element array to post one entry. Each entry has its own date, lines, optional memo, and optional replacesEntryId.`,items:{type:`object`,properties:{date:{type:`string`,description:`YYYY-MM-DD booking date.`},lines:{type:`array`,description:`Journal lines for this entry. Each line sets exactly one of debit or credit (positive amount). Σ debit must equal Σ credit.`,items:{type:`object`,properties:{accountCode:{type:`string`},debit:{type:`number`},credit:{type:`number`},memo:{type:`string`},taxRegistrationId:{type:`string`,description:`Optional counterparty tax-authority registration ID for this line (Japan T-number, EU VAT ID, UK VAT registration number, India GSTIN, Australia ABN, etc.). Free-form string, max 32 chars. Required for input-tax-credit eligibility under regimes like Japan's インボイス制度.`}},required:[`accountCode`]}},memo:{type:`string`,description:`Optional entry-level memo.`},replacesEntryId:{type:`string`,description:`Optional — id of an entry this one replaces (the 'edit' flow). The caller MUST issue a 'voidEntry' for that id immediately before this addEntries call; the void + post pair is not atomic on the server.`}},required:[`date`,`lines`]}},lines:{type:`array`,description:`For 'setOpeningBalances': journal lines. Each line sets exactly one of debit or credit (positive amount). Σ debit must equal Σ credit. Only balance-sheet accounts (asset / liability / equity) are accepted.`,items:{type:`object`,properties:{accountCode:{type:`string`},debit:{type:`number`},credit:{type:`number`},memo:{type:`string`},taxRegistrationId:{type:`string`}},required:[`accountCode`]}},memo:{type:`string`,description:`For 'setOpeningBalances': optional entry-level memo.`},entryId:{type:`string`,description:`For 'voidEntry': id of the entry to void. The reverse + marker pair is appended (journal stays append-only).`},reason:{type:`string`,description:`For 'voidEntry': human-readable reason.`},voidDate:{type:`string`,description:`For 'voidEntry': YYYY-MM-DD date for the reverse entry (defaults to today).`},from:{type:`string`,description:`For 'getJournalEntries': inclusive YYYY-MM-DD lower bound on entry date. For 'getTimeSeries': inclusive YYYY-MM-DD lower bound — the first bucket is the one CONTAINING this date (it can extend earlier).`},to:{type:`string`,description:`For 'getJournalEntries': inclusive YYYY-MM-DD upper bound on entry date. For 'getTimeSeries': inclusive YYYY-MM-DD upper bound — the last bucket is the one CONTAINING this date (it can extend later).`},accountCode:{type:`string`,description:`For 'getJournalEntries' / 'getReport' (kind=ledger): filter to entries that touch a specific account code. For 'getTimeSeries' with metric='accountBalance': REQUIRED — the account whose closing balance to plot per bucket. Forbidden for the other metrics.`},metric:{type:`string`,enum:[...G9e],description:"For 'getTimeSeries': what to plot per bucket. 'revenue' = sum of income-account presentation values within the bucket (positive = money earned). 'expense' = sum of expense accounts within the bucket (positive = money spent). 'netIncome' = revenue − expense (positive = profit). 'accountBalance' = closing balance of `accountCode` at the end of each bucket (cumulative, includes opening balances)."},granularity:{type:`string`,enum:[...K9e],description:`For 'getTimeSeries': bucket size. 'month' uses calendar months (label format YYYY-MM). 'quarter' and 'year' honour the book's fiscalYearEnd — for a December year-end book (12) they coincide with calendar quarters / years; any other closing month shifts them accordingly. Quarter labels are 'FY{endYear}-Q{1..4}', year labels are 'FY{endYear}'; the FY is named by its END calendar year (e.g. an FY running Apr 2025 – Mar 2026 is FY2026).`},asOfDate:{type:`string`,description:`For 'setOpeningBalances': YYYY-MM-DD date the balances are stated as-of. Must be on or before any existing entry.`},kind:{type:`string`,enum:[`balance`,`pl`,`ledger`],description:`For 'getReport': which report. 'balance' = balance sheet; 'pl' = profit & loss; 'ledger' = per-account running balance.`},period:{type:`object`,description:`For 'getReport': either a single closing month or a date range.`,properties:{kind:{type:`string`,enum:[`month`,`range`]},period:{type:`string`,description:`For kind='month': YYYY-MM.`},from:{type:`string`},to:{type:`string`}},required:[`kind`]}},required:[`action`]}};o();function Tvt(e,t){return`plugin:${e}:${t}`}function Evt(e,t){return n=>{let r;try{r=e(n)}catch{return}r!==null&&t&&t(r)}}function Dvt(e){let{subscribe:t}=aP();function n(n,r,i){let a=Tvt(e,n);return typeof r==`function`?t(a,r):t(a,Evt(r.parse,i))}return{subscribe:n}}function Ovt(e){let t=`[plugin/${e}]`;return{debug:(e,n)=>console.debug(t,e,n),info:(e,n)=>console.info(t,e,n),warn:(e,n)=>console.warn(t,e,n),error:(e,n)=>console.error(t,e,n)}}var kvt=new Set([`http:`,`https:`]);function Avt(e){return t=>{let n;try{n=new URL(t)}catch{console.warn(`[plugin/${e}] openUrl rejected unparseable URL`,{url:t});return}kvt.has(n.protocol)?window.open(t,`_blank`,`noopener,noreferrer`)||console.warn(`[plugin/${e}] window.open returned null`,{url:t}):console.warn(`[plugin/${e}] openUrl rejected non-http(s) scheme`,{scheme:n.protocol})}}function jvt(e){let t=kP.plugins.runtimeDispatch.replace(`:pkg`,encodeURIComponent(e));async function n(n,r){let i=await xN(t,n);if(!i.ok)throw Error(`plugin/${e} dispatch failed (${i.status}): ${i.error}`);return r?r(i.data):i.data}return n}function Mvt(e){let{pkgName:t,endpoints:n}=e,{locale:r}=We(),i=m({get:()=>String(r.value),set:e=>{Ult(e)&&(r.value=e)}});return{pubsub:Dvt(t),locale:i,log:Ovt(t),openUrl:Avt(t),dispatch:jvt(t),...n===void 0?{}:{endpoints:n}}}o(),M();function Nvt(e){let t=V(null),n=V(!1),r=V(0),i=m(()=>{if(!t.value)return``;let e=t.value.message||String(t.value),n=t.value.stack??``;return n?`${e}\n\n${n}`:e});function a(n){let r=cr(n);console.error(`[plugin/${e}] uncaught error`,r),t.value=r}function o(){t.value=null,n.value=!1,r.value+=1}return{error:t,showDetails:n,mountKey:r,errorDetails:i,captureError:a,retry:o}}o(),M(),we();var Pvt={key:0,class:`rounded border border-red-200 bg-red-50 p-3 text-sm`,"data-testid":`plugin-error-boundary`,role:`alert`},Fvt={class:`flex items-center gap-2 mb-1`},Ivt={class:`font-medium text-red-800`},Lvt={class:`text-red-700 mb-2`},Rvt={class:`flex items-center gap-3`},zvt={key:0,class:`mt-2 text-xs text-red-900 bg-red-100 p-2 rounded overflow-auto max-h-40 whitespace-pre-wrap break-words`},Bvt=K({__name:`PluginScopedRoot`,props:{pkgName:{},endpoints:{}},setup(e){let t=e,{t:n}=We(),r=Mvt({pkgName:t.pkgName,endpoints:t.endpoints});C(Ye,r);let{error:i,showDetails:a,mountKey:o,errorDetails:s,captureError:c,retry:l}=Nvt(t.pkgName);return w(e=>(c(e),!1)),(t,r)=>q(i)?(B(),U(`div`,Pvt,[S(`div`,Fvt,[r[2]||=S(`span`,{class:`material-icons text-red-500`,"aria-hidden":`true`},`error_outline`,-1),S(`span`,Ivt,T(q(n)(`pluginErrorBoundary.title`,{pkg:e.pkgName})),1)]),S(`p`,Lvt,T(q(n)(`pluginErrorBoundary.subtitle`)),1),S(`div`,Rvt,[S(`button`,{type:`button`,class:`text-xs text-red-600 hover:underline`,"data-testid":`plugin-error-toggle-details`,onClick:r[0]||=e=>a.value=!q(a)},T(q(a)?q(n)(`pluginErrorBoundary.hideDetails`):q(n)(`pluginErrorBoundary.showDetails`)),1),S(`button`,{type:`button`,class:`text-xs text-red-600 hover:underline`,"data-testid":`plugin-error-retry`,onClick:r[1]||=(...e)=>q(l)&&q(l)(...e)},T(q(n)(`pluginErrorBoundary.retry`)),1)]),q(a)?(B(),U(`pre`,zvt,T(q(s)),1)):b(``,!0)])):ne(t.$slots,`default`,{key:q(o)})}}),Vvt=y({default:()=>CL}),CL=Bvt,wL=null;function Hvt(e){wL=e}function TL(){if(wL===null)throw Error(`Plugin host context not installed. Call installHostContext(...) at app boot before mounting any plugin component.`);return wL}function EL(e){let{endpoints:t}=TL(),n=Object.prototype.hasOwnProperty.call(t,e)?t[e]:void 0;if(!n)throw Error(`Unknown plugin endpoint scope: "${e}"`);return n}function DL(){return TL().builtinRoleIds}function Uvt(e){let{pageRoutes:t}=TL(),n=Object.prototype.hasOwnProperty.call(t,e)?t[e]:void 0;if(!n)throw Error(`Unknown page route: "${e}"`);return n}function Wvt(){return TL().chatModels}o(),M();function OL(e,t){return t&&z(K({name:`BuiltInPluginScope:${e}`,inheritAttrs:!1,setup(n,{attrs:r,slots:i}){let a=EL(e);return()=>ve(CL,{pkgName:e,endpoints:a},()=>ve(t,r,i))}}))}function kL(){return crypto.randomUUID()}var Gvt={toolDefinition:wvt,async execute(e,t){let n=wvt.name,{method:r,path:i}=bP.apiRoutes.dispatch,a=await yN(`/api/${bP.apiNamespace}${i}`,{method:r,body:t});return a.ok?{...a.data,toolName:n,uuid:a.data.uuid??kL()}:{toolName:n,uuid:kL(),message:a.error}},isEnabled:()=>!0,generatingMessage:`Working on the books...`,viewComponent:OL(`accounting`,evt),previewComponent:OL(`accounting`,mvt)},Kvt={toolName:bP.toolName,entry:Gvt},AL=q9e.toolName,qvt={type:`function`,name:AL,description:`Open a drawing canvas for the user to create drawings, sketches, or diagrams.`,prompt:`When the user asks 'I want to draw an image.', call ${AL} API to open the canvas.`,parameters:{type:`object`,properties:{},required:[]}};async function Jvt(e,t,n){let r=await yN(e.url,{method:e.method,body:n});return r.ok?{...r.data,toolName:t,uuid:kL()}:{toolName:t,uuid:kL(),message:r.error}}function Yvt(e,t,n){if(e===void 0)throw Error(`Plugin endpoint "${n}" is not registered for scope "${t}"`);return e}function jL(e,t,n){return async(r,i)=>{let a=EL(e)[t];return Jvt(Yvt(a,e,t),n,i)}}function Xvt(e,t,n){return async(r,i)=>{let a=EL(e)[t];return Jvt({method:`POST`,url:Yvt(a,e,t)},n,i)}}var Zvt=K({name:`VueDrawingCanvas`,props:{strokeType:{type:String,validator:e=>[`dash`,`line`,`square`,`circle`,`triangle`,`half_triangle`].indexOf(e)!==-1,default:()=>`dash`},fillShape:{type:Boolean,default:()=>!1},width:{type:[String,Number],default:()=>600},height:{type:[String,Number],default:()=>400},image:{type:String,default:()=>``},eraser:{type:Boolean,default:()=>!1},color:{type:String,default:()=>`#000000`},lineWidth:{type:Number,default:()=>5},lineCap:{type:String,validator:e=>[`round`,`square`,`butt`].indexOf(e)!==-1,default:()=>`round`},lineJoin:{type:String,validator:e=>[`miter`,`round`,`bevel`].indexOf(e)!==-1,default:()=>`miter`},lock:{type:Boolean,default:()=>!1},styles:{type:[Array,String,Object]},classes:{type:[Array,String,Object]},backgroundColor:{type:String,default:()=>`#FFFFFF`},backgroundImage:{type:String,default:()=>null},watermark:{type:Object,default:()=>null},saveAs:{type:String,validator:e=>[`jpeg`,`png`].indexOf(e)!==-1,default:()=>`png`},canvasId:{type:String,default:()=>`VueDrawingCanvas`},initialImage:{type:Array,default:()=>[]},additionalImages:{type:Array,default:()=>[]},outputWidth:{type:Number},outputHeight:{type:Number}},data(){return{loadedImage:null,drawing:!1,context:null,images:[],strokes:{type:``,from:{x:0,y:0},coordinates:[],color:``,width:``,fill:!1,lineCap:``,lineJoin:``},guides:[],trash:[]}},mounted(){this.setContext(),this.$nextTick(()=>{this.drawInitialImage(),this.drawAdditionalImages()})},watch:{backgroundImage:function(){this.loadedImage=null}},methods:{async setContext(){let e=document.querySelector(`#`+this.canvasId);this.context=this.context?this.context:e.getContext(`2d`),await this.setBackground()},drawInitialImage(){this.initialImage&&this.initialImage.length>0&&(this.images=[].concat(this.images,this.initialImage),this.redraw(!0))},drawAdditionalImages(){if(this.additionalImages&&this.additionalImages.length>0){let e=document.querySelector(`#`+this.canvasId);this.additionalImages.forEach(t=>{this.drawWatermark(e,this.context,t)})}},clear(){this.context.clearRect(0,0,Number(this.width),Number(this.height))},async setBackground(){this.clear(),this.context.fillStyle=this.backgroundColor,this.context.fillRect(0,0,Number(this.width),Number(this.height)),await this.$nextTick(async()=>{await this.drawBackgroundImage()}),this.save()},async drawBackgroundImage(){if(this.loadedImage)this.context.drawImage(this.loadedImage,0,0,Number(this.width),Number(this.height));else return new Promise(e=>{if(!this.backgroundImage){e();return}let t=new Image;t.src=this.backgroundImage,t.onload=()=>{this.context.drawImage(t,0,0,Number(this.width),Number(this.height)),this.loadedImage=t,e()}})},getCoordinates(e){let t,n;if(e.touches&&e.touches.length>0){let r=document.querySelector(`#`+this.canvasId).getBoundingClientRect();t=e.touches[0].clientX-r.left,n=e.touches[0].clientY-r.top}else t=e.offsetX,n=e.offsetY;return{x:t,y:n}},startDraw(e){if(!this.lock){this.drawing=!0;let t=this.getCoordinates(e);this.strokes={type:this.eraser?`eraser`:this.strokeType,from:t,coordinates:[],color:this.eraser?this.backgroundColor:this.color,width:this.lineWidth,fill:this.eraser||this.strokeType===`dash`||this.strokeType===`line`?!1:this.fillShape,lineCap:this.lineCap,lineJoin:this.lineJoin},this.guides=[]}},draw(e){if(this.drawing){this.context||this.setContext();let t=this.getCoordinates(e);if(this.eraser||this.strokeType===`dash`)this.strokes.coordinates.push(t),this.drawShape(this.context,this.strokes,!1);else{switch(this.strokeType){case`line`:this.guides=[{x:t.x,y:t.y}];break;case`square`:this.guides=[{x:t.x,y:this.strokes.from.y},{x:t.x,y:t.y},{x:this.strokes.from.x,y:t.y},{x:this.strokes.from.x,y:this.strokes.from.y}];break;case`triangle`:let e=Math.floor((t.x-this.strokes.from.x)/2)<0?Math.floor((t.x-this.strokes.from.x)/2)*-1:Math.floor((t.x-this.strokes.from.x)/2),n=this.strokes.from.x<t.x?this.strokes.from.x+e:this.strokes.from.x-e;this.guides=[{x:t.x,y:this.strokes.from.y},{x:n,y:t.y},{x:this.strokes.from.x,y:this.strokes.from.y}];break;case`half_triangle`:this.guides=[{x:t.x,y:this.strokes.from.y},{x:this.strokes.from.x,y:t.y},{x:this.strokes.from.x,y:this.strokes.from.y}];break;case`circle`:let r=this.strokes.from.x-t.x<0?(this.strokes.from.x-t.x)*-1:this.strokes.from.x-t.x;this.guides=[{x:this.strokes.from.x>t.x?this.strokes.from.x-r:this.strokes.from.x+r,y:this.strokes.from.y},{x:r,y:r}]}this.drawGuide(!0)}}},drawGuide(e){this.redraw(!0),this.$nextTick(()=>{this.context.strokeStyle=this.color,this.context.lineWidth=1,this.context.lineJoin=this.lineJoin,this.context.lineCap=this.lineCap,this.context.beginPath(),this.context.setLineDash([15,15]),this.strokes.type===`circle`?this.context.ellipse(this.guides[0].x,this.guides[0].y,this.guides[1].x,this.guides[1].y,0,0,Math.PI*2):(this.context.moveTo(this.strokes.from.x,this.strokes.from.y),this.guides.forEach(e=>{this.context.lineTo(e.x,e.y)}),e&&this.context.closePath()),this.context.stroke()})},drawShape(e,t,n){e.strokeStyle=t.color,e.fillStyle=t.color,e.lineWidth=t.width,e.lineJoin=t.lineJoin===void 0?this.lineJoin:t.lineJoin,e.lineCap=t.lineCap===void 0?this.lineCap:t.lineCap,e.beginPath(),e.setLineDash([]),t.type===`circle`?e.ellipse(t.coordinates[0].x,t.coordinates[0].y,t.coordinates[1].x,t.coordinates[1].y,0,0,Math.PI*2):(e.moveTo(t.from.x,t.from.y),t.coordinates.forEach(t=>{e.lineTo(t.x,t.y)}),n&&e.closePath()),t.fill?e.fill():e.stroke()},stopDraw(){this.drawing&&(this.strokes.coordinates=this.guides.length>0?this.guides:this.strokes.coordinates,this.images.push(this.strokes),this.redraw(!0),this.drawing=!1,this.trash=[])},reset(){this.lock||(this.images=[],this.strokes={type:``,coordinates:[],color:``,width:``,fill:!1,lineCap:``,lineJoin:``},this.guides=[],this.trash=[],this.redraw(!0))},undo(){if(!this.lock){let e=this.images.pop();e&&(this.trash.push(e),this.redraw(!0))}},redo(){if(!this.lock){let e=this.trash.pop();e&&(this.images.push(e),this.redraw(!0))}},async redraw(e){e=e===void 0||e,await this.setBackground().then(()=>{this.drawAdditionalImages()}).then(()=>{let e=document.createElement(`canvas`),t=e.getContext(`2d`);e.width=Number(this.width),e.height=Number(this.height),t&&(this.images.forEach(e=>{t&&(t.globalCompositeOperation=e.type===`eraser`?`destination-out`:`source-over`,(e.type!==`circle`||e.type===`circle`&&e.coordinates.length>0)&&this.drawShape(t,e,e.type!==`eraser`&&e.type!==`dash`&&e.type!==`line`))}),this.context.drawImage(e,0,0,Number(this.width),Number(this.height)))}).then(()=>{e&&this.save()})},wrapText(e,t,n,r,i,a){let o=/(\r\n|\n\r|\n|\r)+/g,s=/\s+/g;var c=t.split(o).filter(e=>e.length>0);for(let t=0;t<c.length;t++){for(var l=c[t].split(s).filter(e=>e.length>0),u=``,d=0;d<l.length;d++){var f=u+l[d]+` `;e.measureText(f).width>i&&d>0?(this.watermark&&this.watermark.fontStyle&&this.watermark.fontStyle.drawType&&this.watermark.fontStyle.drawType===`stroke`?e.strokeText(u,n,r):e.fillText(u,n,r),u=l[d]+` `,r+=a):u=f}this.watermark&&this.watermark.fontStyle&&this.watermark.fontStyle.drawType&&this.watermark.fontStyle.drawType===`stroke`?e.strokeText(u,n,r):e.fillText(u,n,r),r+=l.length>0?a:0}},save(){let e=document.querySelector(`#`+this.canvasId);if(this.watermark){let t=document.createElement(`canvas`),n=t.getContext(`2d`);n&&(t.width=Number(this.width),t.height=Number(this.height),n.drawImage(e,0,0,Number(this.width),Number(this.height)),this.drawWatermark(t,n,this.watermark))}else{let t=document.createElement(`canvas`),n=t.getContext(`2d`),r=this.outputWidth===void 0?this.width:this.outputWidth,i=this.outputHeight===void 0?this.height:this.outputHeight;if(t.width=Number(r),t.height=Number(i),n)return n.drawImage(e,0,0,Number(r),Number(i)),this.$emit(`update:image`,t.toDataURL(`image/`+this.saveAs,1)),t.toDataURL(`image/`+this.saveAs,1)}},drawWatermark(e,t,n){if(n.type===`Image`){let r=n.imageStyle&&n.imageStyle.width?n.imageStyle.width:Number(this.width),i=n.imageStyle&&n.imageStyle.height?n.imageStyle.height:Number(this.height),a=new Image;a.src=n.source,a.onload=()=>{n&&t&&t.drawImage(a,n.x,n.y,Number(r),Number(i));let o=document.createElement(`canvas`),s=o.getContext(`2d`),c=this.outputWidth===void 0?this.width:this.outputWidth,l=this.outputHeight===void 0?this.height:this.outputHeight;if(o.width=Number(c),o.height=Number(l),s)return s.drawImage(e,0,0,Number(c),Number(l)),this.$emit(`update:image`,o.toDataURL(`image/`+this.saveAs,1)),o.toDataURL(`image/`+this.saveAs,1)}}else if(n.type===`Text`){let r=n.fontStyle&&n.fontStyle.font?n.fontStyle.font:`20px serif`,i=n.fontStyle&&n.fontStyle.textAlign?n.fontStyle.textAlign:`start`,a=n.fontStyle&&n.fontStyle.textBaseline?n.fontStyle.textBaseline:`alphabetic`,o=n.fontStyle&&n.fontStyle.color?n.fontStyle.color:`#000000`;if(t.font=r,t.textAlign=i,t.textBaseline=a,n.fontStyle&&n.fontStyle.rotate){let e,r;e=n.fontStyle&&n.fontStyle.width?n.x+Math.floor(n.fontStyle.width/2):n.x,r=n.fontStyle&&n.fontStyle.lineHeight?n.y+Math.floor(n.fontStyle.lineHeight/2):n.y,t.translate(e,r),t.rotate(n.fontStyle.rotate*Math.PI/180),t.translate(e*-1,r*-1)}n.fontStyle&&n.fontStyle.drawType&&n.fontStyle.drawType===`stroke`?(t.strokeStyle=n.fontStyle.color,n.fontStyle&&n.fontStyle.width?this.wrapText(t,n.source,n.x,n.y,n.fontStyle.width,n.fontStyle.lineHeight):t.strokeText(n.source,n.x,n.y)):(t.fillStyle=o,n.fontStyle&&n.fontStyle.width?this.wrapText(t,n.source,n.x,n.y,n.fontStyle.width,n.fontStyle.lineHeight):t.fillText(n.source,n.x,n.y));let s=document.createElement(`canvas`),c=s.getContext(`2d`),l=this.outputWidth===void 0?this.width:this.outputWidth,u=this.outputHeight===void 0?this.height:this.outputHeight;if(s.width=Number(l),s.height=Number(u),c)return c.drawImage(e,0,0,Number(l),Number(u)),this.$emit(`update:image`,s.toDataURL(`image/`+this.saveAs,1)),s.toDataURL(`image/`+this.saveAs,1)}},isEmpty(){return!(this.images.length>0)},getAllStrokes(){return this.images}},render(){return ve(`canvas`,{id:this.canvasId,height:Number(this.height),width:Number(this.width),style:{touchAction:`none`,...this.styles},class:this.classes,onMousedown:e=>this.startDraw(e),onMousemove:e=>this.draw(e),onMouseup:()=>this.stopDraw(),onMouseleave:()=>this.stopDraw(),onTouchstart:e=>this.startDraw(e),onTouchmove:e=>this.draw(e),onTouchend:()=>this.stopDraw(),onTouchleave:()=>this.stopDraw(),onTouchcancel:()=>this.stopDraw(),onPointerdown:e=>this.startDraw(e),onPointermove:e=>this.draw(e),onPointerup:()=>this.stopDraw(),onPointerleave:()=>this.stopDraw(),onPointercancel:()=>this.stopDraw()})}}),Qvt=16,$vt=9,eyt=(e,t)=>{let n=Math.floor(e-32),r=Math.floor(n*$vt/Qvt);if(n<=0||r<=0)return{size:null,changed:!1,isFirstPaint:!1};let i=n!==t.width||r!==t.height;return{size:{width:n,height:r},changed:i,isFirstPaint:t.width===0}},tyt=(e,t)=>`vdc-${(e??`default`).replace(/[^A-Za-z0-9_-]/g,`-`)}-${t}`;o(),we(),le(),M();var nyt={class:`w-full h-full flex flex-col bg-white`},ryt={class:`flex-shrink-0 px-4 py-2 border-b border-gray-100 bg-gray-50`},iyt={class:`flex items-center justify-between gap-4`},ayt={class:`flex items-center gap-4`},oyt={class:`flex items-center gap-2`},syt={class:`flex gap-1`},cyt=[`onClick`],lyt={class:`flex items-center gap-2`},uyt={class:`flex items-center gap-1`},dyt={key:0,class:`text-xs text-red-600 bg-red-50 border border-red-200 rounded px-2 py-1 mr-1`,role:`alert`,"data-testid":`canvas-save-failed`},fyt=[`title`],pyt=[`title`],myt=[`title`],hyt={class:`flex items-center gap-2 flex-wrap mt-3`},gyt={class:`text-xs text-gray-500 mr-1`},_yt=[`onClick`],vyt=K({__name:`View`,props:{selectedResult:{},sendTextMessage:{type:Function}},setup(e){let t=EL(`imageStore`),{t:n}=We(),i=e,a=[{id:`ghibli`,label:`Ghibli`},{id:`ukiyoe`,label:`Ukiyoe`},{id:`sumie`,label:`Sumi-e`},{id:`picasso`,label:`Picasso`},{id:`gogh`,label:`Van Gogh`},{id:`photo`,label:`Photo-realistic`},{id:`watercolor`,label:`Watercolor`},{id:`popart`,label:`Pop Art`},{id:`american`,label:`American Comic`},{id:`cyberpunk`,label:`Cyberpunk`},{id:`pencilsketch`,label:`Pencil Sketch`},{id:`pixelart`,label:`Pixel Art`}],o=V(null),s=V(null),l=V(5),d=V(`#000000`),f=V(0),p=V(0),h=V(0),g=m(()=>tyt(i.selectedResult?.uuid,h.value)),v=V(!1),y=m(()=>{let e=i.selectedResult?.data?.imageData;return!e||e.startsWith(`data:`)?``:e}),x=e=>{let t=y.value,r=t?n(`pluginCanvas.stylePromptWithPath`,{path:t,style:e.label}):n(`pluginCanvas.stylePromptNoPath`,{style:e.label});i.sendTextMessage?.(r)},C=Date.now(),w=m(()=>{if(!y.value)return;let e=JI(y.value);return`${e}${e.includes(`?`)?`&`:`?`}mt=${C}-${h.value}`}),E=!1,O=!1;async function k(e){let n=await SN(t.update,{relativePath:y.value,imageData:e});if(!n.ok)throw Error(`PUT failed: ${n.error}`);Tut(y.value)}async function A(){if(o.value&&y.value){if(E)O=!0;else{E=!0;try{await k(await o.value.save()),v.value=!1}catch(e){console.error(`Failed to save drawing:`,e),v.value=!0}finally{E=!1,O&&(O=!1,A())}}}}let j=()=>{o.value?.undo(),setTimeout(A,50)},M=()=>{o.value?.redo(),setTimeout(A,50)},N=async()=>{if(o.value?.reset(),!y.value)return;let e=document.createElement(`canvas`);e.width=f.value,e.height=p.value;let t=e.getContext(`2d`);if(t){t.fillStyle=`#FFFFFF`,t.fillRect(0,0,e.width,e.height);try{await k(e.toDataURL(`image/png`)),v.value=!1,h.value++}catch(e){console.error(`Failed to clear drawing:`,e),v.value=!0}}},F=()=>{let e=s.value;if(!e)return;let{size:t,changed:n,isFirstPaint:r}=eyt(e.getBoundingClientRect().width,{width:f.value,height:p.value});t&&n&&(f.value=t.width,p.value=t.height,r||h.value++)};return P(async()=>{await be(),F(),window.addEventListener(`resize`,F)}),_(()=>{window.removeEventListener(`resize`,F)}),(t,i)=>(B(),U(`div`,nyt,[S(`div`,ryt,[S(`div`,iyt,[S(`div`,ayt,[S(`div`,oyt,[S(`div`,syt,[(B(),U(D,null,H([2,5,10,20],e=>S(`button`,{key:e,class:c([`w-8 h-8 rounded border-2 transition-colors`,l.value===e?`border-blue-500 bg-blue-100`:`border-gray-300 bg-white hover:bg-gray-50`]),onClick:t=>l.value=e},[S(`div`,{class:`bg-gray-800 rounded-full mx-auto`,style:xe({width:Math.max(2,e*1)+`px`,height:Math.max(2,e*1)+`px`})},null,4)],10,cyt)),64))])]),S(`div`,lyt,[u(S(`input`,{"onUpdate:modelValue":i[0]||=e=>d.value=e,type:`color`,class:`w-12 h-8 rounded border border-gray-300`},null,512),[[Fe,d.value]])])]),S(`div`,uyt,[v.value?(B(),U(`span`,dyt,T(q(n)(`pluginCanvas.saveFailed`)),1)):b(``,!0),S(`button`,{class:`w-8 h-8 flex items-center justify-center rounded border-2 border-gray-300 bg-white hover:bg-gray-50`,title:q(n)(`pluginCanvas.undo`),onClick:j},[...i[1]||=[S(`span`,{class:`material-icons text-sm`},`undo`,-1)]],8,fyt),S(`button`,{class:`w-8 h-8 flex items-center justify-center rounded border-2 border-gray-300 bg-white hover:bg-gray-50`,title:q(n)(`pluginCanvas.redo`),onClick:M},[...i[2]||=[S(`span`,{class:`material-icons text-sm`},`redo`,-1)]],8,pyt),S(`button`,{class:`w-8 h-8 flex items-center justify-center rounded border-2 border-red-300 bg-white hover:bg-red-50`,title:q(n)(`pluginCanvas.clear`),onClick:N},[...i[3]||=[S(`span`,{class:`material-icons text-sm`},`delete`,-1)]],8,myt)])])]),S(`div`,{ref_key:`containerRef`,ref:s,class:`flex-1 p-4 overflow-hidden`},[f.value>0?(B(),ke(q(Zvt),r({ref_key:`canvasRef`,ref:o,key:`${e.selectedResult?.uuid||`default`}-${h.value}`,"canvas-id":g.value,width:f.value,height:p.value,"stroke-type":`dash`,"line-cap":`round`,"line-join":`round`,"fill-shape":!1,eraser:!1,"line-width":l.value,color:d.value,"background-color":`#FFFFFF`},w.value===void 0?{}:{backgroundImage:w.value},{"save-as":`png`,styles:{border:`1px solid #ddd`,borderRadius:`8px`},lock:!1,onMouseup:A,onMouseleave:A,onTouchend:A,onTouchcancel:A}),null,16,[`canvas-id`,`width`,`height`,`line-width`,`color`])):b(``,!0),S(`div`,hyt,[S(`span`,gyt,T(q(n)(`pluginCanvas.styleLabel`)),1),(B(),U(D,null,H(a,e=>S(`button`,{key:e.id,class:`px-3 py-1.5 text-xs rounded-full border border-gray-300 bg-white hover:bg-blue-50 hover:border-blue-400 transition-colors`,onClick:t=>x(e)},T(e.label),9,_yt)),64))])],512)]))}});o(),M(),we();var yyt={class:`w-full h-full overflow-y-auto`},byt={class:`min-h-full flex flex-col items-center justify-center p-4`},xyt={key:0,class:`flex-1 flex items-center justify-center min-h-0`},Syt=[`src`,`alt`],Cyt={key:1,class:`flex-1 flex items-center justify-center text-gray-400 text-sm`},wyt={key:2,class:`mt-4 p-3 bg-gray-100 rounded-lg max-w-full flex-shrink-0`},Tyt={class:`text-sm text-gray-700`},Eyt={class:`font-medium`},Dyt=K({__name:`ImageView`,props:{selectedResult:{},alt:{default:`Image`},promptLabel:{default:`Prompt`}},setup(e){let{t}=We(),n=e,r=m(()=>n.selectedResult.data?.imageData?kut(n.selectedResult.data.imageData):``);return(n,i)=>(B(),U(`div`,yyt,[S(`div`,byt,[r.value?(B(),U(`div`,xyt,[S(`img`,{src:r.value,class:`max-w-full max-h-full object-contain rounded`,alt:e.alt},null,8,Syt)])):(B(),U(`div`,Cyt,T(q(t)(`common.noImageYet`)),1)),e.selectedResult.data?.prompt?(B(),U(`div`,wyt,[S(`p`,Tyt,[S(`span`,Eyt,T(q(t)(`pluginUiImage.promptLabel`,{label:e.promptLabel})),1),J(` `+T(e.selectedResult.data.prompt),1)])])):b(``,!0)])]))}});o(),M(),we();var Oyt={class:`min-h-24 flex items-center justify-center`},kyt=[`src`,`alt`],Ayt={key:1,class:`text-gray-400 text-sm`},ML=K({__name:`ImagePreview`,props:{result:{},alt:{default:`Image`}},setup(e){let{t}=We(),n=e,r=m(()=>n.result.data?.imageData?kut(n.result.data.imageData):``);return(n,i)=>(B(),U(`div`,Oyt,[r.value?(B(),U(`img`,{key:0,src:r.value,class:`max-w-full h-auto rounded`,alt:e.alt},null,8,kyt)):(B(),U(`div`,Ayt,T(q(t)(`common.noImageYet`)),1))]))}});o(),M();var jyt=K({__name:`Preview`,props:{result:{}},setup(e){return(t,n)=>(B(),ke(q(ML),{result:e.result,alt:`Canvas drawing`},null,8,[`result`]))}}),Myt={toolName:AL,entry:{toolDefinition:qvt,execute:jL(`canvas`,`dispatch`,AL),isEnabled:()=>!0,generatingMessage:`Opening drawing canvas...`,viewComponent:OL(`canvas`,vyt),previewComponent:OL(`canvas`,jyt)}},Nyt=120;function Pyt(e,t){if(!e)return t;let n=e.toLowerCase().replace(/[^a-z0-9]+/g,`-`),r=0,i=n.length;for(;r<i&&n[r]===`-`;)r+=1;for(;i>r&&n[i-1]===`-`;)--i;for(i-r>Nyt&&(i=r+Nyt);i>r&&n[i-1]===`-`;)--i;return n.slice(r,i)||t}function Fyt(e=new Date){return`${e.getUTCFullYear()}/${String(e.getUTCMonth()+1).padStart(2,`0`)}`}function NL(e){let{dir:t,title:n,ext:r,fallback:i,now:a=new Date,partitioned:o=!0,suffix:s}=e,c=s?`${a.getTime()}-${s}`:`${a.getTime()}`,l=`${Pyt(n,i)}-${c}${r}`;return(o?[t,Fyt(a),l]:[t,l]).join(`/`)}function PL(e){return`${Ke}/${e}`}function FL(e){return e.split(/[/\\]/).some(e=>e===``||e===`.`||e===`..`)}var Iyt=/^[a-zA-Z]:[\\/]/;function Lyt(e){return e.startsWith(`/`)||e.startsWith(`\\`)||Iyt.test(e)}function IL(e,t){if(!e||e.includes(`\0`))return null;let n=e.toLowerCase();if(!t.some(e=>n.endsWith(e)))return null;let r=Lyt(e),i=e.split(/[/\\]/),a=r?i.slice(i.findIndex(e=>e.length>0)):i;return a.length===0||a.some(e=>e===``||e===`.`||e===`..`)?null:r?`absolute`:`relative`}function Ryt(e){return e.split(/[/\\]/).some(e=>e.startsWith(`.`))}var zyt={type:`function`,name:`presentChart`,description:"Save and present one or more Apache ECharts visualizations as a single document. Use this for line, bar, area, scatter, pie, candlestick, heatmap, sankey, or graph/network charts — anything ECharts supports. Pass ECharts option object(s) directly; the plugin calls setOption on each one. Use `charts: []` array form even for a single chart so multi-chart dashboards share the same slug.",parameters:{type:`object`,properties:{document:{type:`object`,description:`Chart document. Contains an optional title and an array of chart entries. Each entry has its own ECharts option object that the UI renders independently.`,properties:{title:{type:`string`,description:`Optional human-friendly title for the whole document. Used to derive the file slug and as the preview label.`},charts:{type:`array`,description:`List of charts to render, in order. Each charts[i].option is passed as-is to ECharts' setOption().`,items:{type:`object`,properties:{title:{type:`string`,description:`Optional short label for this specific chart (shown above it in the UI).`},type:{type:`string`,description:`Informational tag shown in the UI (e.g. 'line', 'bar', 'candlestick', 'sankey'). The actual chart type is determined by option.series[].type.`},option:{type:`object`,description:`Full ECharts option object. Include all series, axes, tooltip, legend, dataset — anything ECharts accepts. Keep data inline; large datasets are fine.`}},required:[`option`]}}},required:[`charts`]},title:{type:`string`,description:`Short label shown in the canvas preview sidebar. Defaults to document.title, or 'Chart' when both are blank.`}},required:[`document`]}},Byt=`charts`,Vyt=`chart`;function Hyt(e,t=new Date){let n=NL({dir:Byt,title:e,ext:`.chart.json`,fallback:Vyt,now:t});return{relPath:n,filePath:PL(n)}}function LL(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function RL(e){return e===void 0||typeof e==`string`}function Uyt(e){return!LL(e)||!RL(e.title)||!RL(e.type)?!1:LL(e.option)}function Wyt(e){return!LL(e)||!RL(e.title)||!Array.isArray(e.charts)||e.charts.length===0?!1:e.charts.every(e=>Uyt(e))}var Gyt={toolDefinition:zyt,execute:async(e,t)=>{if(!LL(t))return{message:"presentChart args must be an object containing a `document`",instructions:`Acknowledge the error and retry with { document: { charts: [{ option: {...} }] } }.`};let{document:n,title:r}=t;if(!Wyt(n))return{message:`document must be { charts: [{ option: {...}, title?, type? }, ...] } with at least one entry`,instructions:`Acknowledge that the chart could not be created and retry with a valid ECharts document shape.`};if(r!==void 0&&typeof r!=`string`)return{message:`title must be a string when provided`,instructions:`Acknowledge the error and retry with a string title (or omit it).`};let{relPath:i,filePath:a}=Hyt(r??n.title??`chart`);await e.files.artifacts.write(i,`${JSON.stringify(n,null,2)}\n`);let o=n.charts.length;return{message:`Saved chart document to ${a}`,data:{document:n,title:r,filePath:a},instructions:`Acknowledge that the chart(s) have been presented to the user. The document contains ${o} chart${o===1?``:`s`}.`}},generatingMessage:`Rendering chart…`,isEnabled:()=>!0};o(),M(),we();var Kyt=Je({de:{untitled:`Diagramm`,chartCount:e=>`${e} Diagramm${e===1?``:`e`}`,chartTitle:e=>`Diagramm ${e}`,png:`PNG`},en:{untitled:`Chart`,chartCount:e=>`${e} chart${e===1?``:`s`}`,chartTitle:e=>`Chart ${e}`,png:`PNG`},es:{untitled:`Gráfico`,chartCount:e=>`${e} gráfico${e===1?``:`s`}`,chartTitle:e=>`Gráfico ${e}`,png:`PNG`},fr:{untitled:`Graphique`,chartCount:e=>`${e} graphique${e===1?``:`s`}`,chartTitle:e=>`Graphique ${e}`,png:`PNG`},ja:{untitled:`チャート`,chartCount:e=>`${e} チャート`,chartTitle:e=>`チャート ${e}`,png:`PNG`},ko:{untitled:`차트`,chartCount:e=>`${e}개 차트`,chartTitle:e=>`차트 ${e}`,png:`PNG`},"pt-BR":{untitled:`Gráfico`,chartCount:e=>`${e} gráfico${e===1?``:`s`}`,chartTitle:e=>`Gráfico ${e}`,png:`PNG`},zh:{untitled:`图表`,chartCount:e=>`${e} 个图表`,chartTitle:e=>`图表 ${e}`,png:`PNG`}}),qyt={class:`h-full flex flex-col overflow-hidden`},Jyt={class:`px-4 py-2 border-b border-gray-100 shrink-0 flex items-center justify-between`},Yyt={class:`text-sm font-medium text-gray-700 truncate`},Xyt={class:`text-xs text-gray-500 shrink-0`},Zyt={class:`flex-1 overflow-y-auto p-4 space-y-4`},Qyt=[`data-testid`],$yt={class:`px-3 py-2 border-b border-gray-100 flex items-center justify-between gap-2`},ebt={class:`flex items-center gap-2 min-w-0`},tbt={class:`text-sm font-medium text-gray-800 truncate`},nbt={key:0,class:`text-[10px] uppercase tracking-wide rounded px-1.5 py-0.5 bg-blue-50 text-blue-700 shrink-0`},rbt=[`data-testid`,`onClick`],ibt=[`data-testid`],abt=K({__name:`View`,props:{selectedResult:{}},setup(e){let t=Kyt(),n=e,r=m(()=>n.selectedResult.data),i=m(()=>r.value?.document?.charts??[]),a=m(()=>r.value?.title??r.value?.document?.title),o=V([]),s=[];function c(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function l(e,t){o.value[e]=t}function u(){for(let e of s)e?.dispose();s.length=0}function d(e){let{dataZoom:t}=e;if(t==null)return e;let n=e=>c(e)?{...e,zoomOnMouseWheel:!1,moveOnMouseWheel:!1}:e,r=Array.isArray(t)?t.map(n):n(t);return{...e,dataZoom:r}}function f(){u();for(let e=0;e<i.value.length;e+=1){let t=o.value[e],n=i.value[e];if(!t||!n){s[e]=void 0;continue}let r=JS(t);try{r.setOption(d(n.option))}catch{}s[e]=r}}function p(){for(let e of s)e?.resize()}P(()=>{queueMicrotask(f),window.addEventListener(`resize`,p)}),k(()=>{window.removeEventListener(`resize`,p),u()}),Ve(()=>r.value?.filePath,()=>queueMicrotask(f));function h(e,t){let n=s[e];if(!n)return;let r=n.getDataURL({type:`png`,pixelRatio:2,backgroundColor:`#ffffff`}),i=(t??a.value??`chart`).toLowerCase().replace(/[^a-z0-9-]+/g,`-`);for(;i.startsWith(`-`);)i=i.slice(1);for(;i.endsWith(`-`);)i=i.slice(0,-1);i||=`chart`;let o=document.createElement(`a`);o.href=r,o.download=`${i}-${e+1}.png`,document.body.appendChild(o),o.click(),document.body.removeChild(o)}return(e,n)=>(B(),U(`div`,qyt,[S(`div`,Jyt,[S(`span`,Yyt,T(a.value??q(t).untitled),1),S(`span`,Xyt,T(q(t).chartCount(i.value.length)),1)]),S(`div`,Zyt,[(B(!0),U(D,null,H(i.value,(e,r)=>(B(),U(`div`,{key:r,class:`border border-gray-200 rounded-lg bg-white`,"data-testid":`chart-card-${r}`},[S(`div`,$yt,[S(`div`,ebt,[S(`span`,tbt,T(e.title??q(t).chartTitle(r+1)),1),e.type?(B(),U(`span`,nbt,T(e.type),1)):b(``,!0)]),S(`button`,{class:`px-2 py-1 text-xs rounded border border-gray-300 text-gray-500 hover:bg-gray-50 shrink-0`,"data-testid":`chart-export-png-${r}`,onClick:t=>h(r,e.title)},[n[0]||=S(`span`,{class:`material-icons text-sm align-middle`},`download`,-1),J(` `+T(q(t).png),1)],8,rbt)]),S(`div`,{ref_for:!0,ref:e=>l(r,e),class:`w-full h-[400px]`,"data-testid":`chart-canvas-${r}`},null,8,ibt)],8,Qyt))),128))])]))}}),obt={class:`p-2 text-sm`},sbt={class:`font-medium text-gray-700 truncate mb-1`},cbt={key:0,class:`text-xs text-gray-500 leading-relaxed truncate`},lbt=K({__name:`Preview`,props:{result:{}},setup(e){let t=e,n=m(()=>t.result.data),r=m(()=>n.value?.title??n.value?.document?.title??`Chart`),i=m(()=>{let e=n.value?.document?.charts??[];if(e.length===0)return``;let t=e.map(e=>e.type??a(e.option)).filter(e=>!!e).slice(0,3),r=e.length>t.length?`, …`:``,i=t.join(`, `),o=e.length===1?``:`s`,s=i?`: ${i}${r}`:``;return`${e.length} chart${o}${s}`});function a(e){let{series:t}=e;if(Array.isArray(t)&&t.length>0){let e=t[0];if(typeof e.type==`string`)return e.type}else if(t&&typeof t==`object`){let e=t.type;if(typeof e==`string`)return e}return null}return(e,t)=>(B(),U(`div`,obt,[S(`div`,sbt,T(r.value),1),i.value?(B(),U(`div`,cbt,T(i.value),1)):b(``,!0)]))}});({...Gyt});var ubt=J9e.toolName,dbt={toolName:ubt,entry:{toolDefinition:zyt,execute:jL(`chart`,`create`,ubt),isEnabled:()=>!0,generatingMessage:`Rendering chart…`,viewComponent:OL(`chart`,abt),previewComponent:OL(`chart`,lbt)}},zL=`editImages`,fbt={type:`function`,name:zL,description:`Edit one or more existing images based on a text prompt. Returns a single new image.`,prompt:`When the user asks to transform or restyle an existing image (e.g. "turn this into a Ghibli-style image", "combine these two photos"), call ${zL} with the workspace-relative paths of the source images in \`imagePaths\` and the edit instructions in \`prompt\`. Use a single-element array for one image; pass two or more paths to combine multiple images.`,parameters:{type:`object`,properties:{prompt:{type:`string`,description:`Description of the edits to be made to the image(s) in English`},imagePaths:{type:`array`,items:{type:`string`},description:`Workspace-relative paths of the source images to edit (e.g. ["artifacts/images/2026/04/abc.png"]). Pass at least one path. Multiple paths are combined into a single result image.`}},required:[`prompt`,`imagePaths`]}},pbt=`The image service answered with an unrecognized response.`,mbt=e=>Na(e)&&typeof e.imageData==`string`&&e.imageData.length>0&&La(e.prompt),hbt=e=>Na(e)&&typeof e.message==`string`&&La(e.toolName)&&La(e.uuid)&&La(e.title)&&La(e.action)&&La(e.instructions)&&Ra(e.instructionsRequired)&&Ra(e.updating)&&Ra(e.cancelled)&&e.jsonData===void 0&&(e.data===void 0||mbt(e.data))&&(e.viewState===void 0||Na(e.viewState));function gbt(e,t){let n=Xvt(`image`,e,t);return async(e,r)=>{let i=await n(e,r);return hbt(i)?i:{toolName:t,uuid:kL(),message:pbt}}}o(),M();var _bt=K({__name:`View`,props:{selectedResult:{}},setup(e){return(t,n)=>e.selectedResult?(B(),ke(q(Dyt),{key:0,"selected-result":e.selectedResult,alt:`Edited image`,"prompt-label":`Edit prompt`},null,8,[`selected-result`])):b(``,!0)}});o(),M();var vbt=K({__name:`Preview`,props:{result:{}},setup(e){return(t,n)=>(B(),ke(q(ML),{result:e.result,alt:`Edited image`},null,8,[`result`]))}}),ybt={toolName:zL,entry:{toolDefinition:fbt,execute:gbt(`edit`,zL),isEnabled:()=>!0,generatingMessage:`Editing images...`,viewComponent:OL(`image`,_bt),previewComponent:OL(`image`,vbt)}},BL=`generateImage`,bbt={type:`function`,name:BL,description:`Generate an image based on the prompt and display it on the screen. Be descriptive and specify the concrete details of the images in the prompt. Each call generates one image.`,prompt:`When the user asks you to generate, draw, or create an image, use the ${BL} API. You may also offer to generate an image when a visual would clearly enhance the conversation, but do not generate images unsolicited during casual discussion.`,parameters:{type:`object`,properties:{prompt:{type:`string`,description:`A detailed prompt describing the image to generate`}},required:[`prompt`]}};o(),M();var xbt={"data-testid":`generate-image-view`,class:`w-full h-full`},Sbt=K({__name:`View`,props:{selectedResult:{},sendTextMessage:{type:Function}},emits:[`updateResult`],setup(e){let t=e,n=V(null);return Ve(()=>t.selectedResult,e=>{e?.toolName===`generateImage`&&e.data&&(n.value=e)},{immediate:!0}),(e,t)=>(B(),U(`div`,xbt,[n.value?(B(),ke(q(Dyt),{key:0,"selected-result":n.value},null,8,[`selected-result`])):b(``,!0)]))}});o(),M();var Cbt=K({__name:`Preview`,props:{result:{}},setup(e){return(t,n)=>(B(),ke(q(ML),{result:e.result},null,8,[`result`]))}});function wbt(e,t,n){return{toolName:BL,data:{imageData:e,prompt:n},message:``,title:t}}var Tbt={toolName:BL,entry:{toolDefinition:bbt,execute:gbt(`generate`,BL),isEnabled:()=>!0,generatingMessage:`Generating image...`,inputHandlers:[{type:`file`,acceptedTypes:[`image/png`,`image/jpeg`],handleInput:(e,t)=>wbt(e,t,``)},{type:`clipboard-image`,handleInput:e=>wbt(e,`clipboard-image.png`,``)}],viewComponent:OL(`image`,Sbt),previewComponent:OL(`image`,Cbt)}},VL=Z9e.toolName,Ebt={type:`function`,name:VL,description:`List, save, update, or delete Claude Code skills. Discovery covers ~/.claude/skills/ (user), <workspace>/.claude/skills/ (project) and the skills of installed Claude Code plugins, which are listed as <plugin>:<skill>. Only the project scope is writable, so save, update, and delete affect only those; everything else is read-only.`,prompt:`Use the ${VL} tool for the user's skill library:\n\n- **list** (default, no args): show every available skill in the canvas.\n- **save**: when the user asks to turn the current conversation into a skill (e.g. "skill 化して" / "save this as a skill"), do these steps:\n 1. Read the current chat transcript via the Read tool. The path is \`conversations/chat/<session-id>.jsonl\` under the workspace; if you don't know the session id, list \`conversations/chat/\` first.\n 2. Distill the conversation into a short markdown body explaining the steps you took, in second person ("First, do X. Then, do Y."). Keep it focused on the reusable workflow, not the one-off details.\n 3. Pick a kebab-case slug (lowercase letters, digits, hyphens; no leading/trailing hyphen; 1-64 chars). If the user gave a name in the request, use it.\n 4. Write a one-line description for the YAML frontmatter.\n 5. Call ${VL} with \`{action: "save", name, description, body}\`. Saves go to <workspace>/.claude/skills/<slug>/SKILL.md.\n 6. If the response says the name already exists, ask the user for a different one.\n- **update**: when the user asks to modify an existing skill (e.g. "〇〇のスキルを更新して" / "change the description of X"), call \`{action: "update", name, description, body}\`. Only project-scope skills can be updated; user-scope and plugin skills are read-only. You must provide both description and body (read the current skill first via list or the Read tool if you only need to change part of it).\n- **delete**: when the user asks to remove a named skill, call \`{action: "delete", name}\`. Only project-scope skills can be deleted; user-scope and plugin skills are protected.\n\n**IMPORTANT**: NEVER edit SKILL.md files directly with the Edit or Write tools. Always use this ${VL} tool with the appropriate action. Direct file edits bypass validation and won't refresh the skills UI.`,parameters:{type:`object`,properties:{action:{type:`string`,enum:[`list`,`save`,`update`,`delete`],description:`The operation to perform. Default: list (show all skills).`},name:{type:`string`,description:`Skill slug. Required for save and delete. Lowercase letters, digits, and hyphens only; 1-64 chars; no leading/trailing or consecutive hyphens.`},description:{type:`string`,description:`One-line summary for the YAML frontmatter. Required for save.`},body:{type:`string`,description:`Markdown body of the skill (instructions for Claude to follow). Required for save. May be multi-line.`}},required:[`action`]}};function Dbt(e){return e.source===`claude-plugin`?`claude-plugin`:e.source===`user`?`user`:e.name.startsWith(`mc-`)?`system`:`project`}function Obt(e,t){let n=+(e.source===`claude-plugin`),r=+(t.source===`claude-plugin`);return n===r?e.name.localeCompare(t.name):n-r}var kbt=[`active`,`catalog`],Abt=[],jbt=`skills:sectionCollapsed`;function Mbt(e){return typeof e==`string`&&kbt.some(t=>t===e)}function Nbt(){let e=new Set(Abt);if(typeof window>`u`)return e;try{let t=window.localStorage.getItem(jbt);if(t===null)return e;let n=JSON.parse(t);return Array.isArray(n)?new Set(n.filter(Mbt)):e}catch{return e}}function Pbt(e){if(typeof window<`u`)try{window.localStorage.setItem(jbt,JSON.stringify([...e]))}catch{}}function Fbt(e,t){let n=new Set(e);return n.has(t)?n.delete(t):n.add(t),n}var Ibt=`skills:repoCollapsed`;function Lbt(){if(typeof window>`u`)return new Set;try{let e=window.localStorage.getItem(Ibt);if(e===null)return new Set;let t=JSON.parse(e);return Array.isArray(t)?new Set(t.filter(e=>typeof e==`string`)):new Set}catch{return new Set}}function Rbt(e){if(typeof window<`u`)try{window.localStorage.setItem(Ibt,JSON.stringify([...e]))}catch{}}function HL(e,t){if(t.has(`active`))return null;let[n]=e;return n?.name??null}function zbt(e,t,n,r){if(n!==t)return n;if(r.has(`active`))return null;let i=e.findIndex(e=>e.name===t),a=e.filter(e=>e.name!==t);return i===-1||a.length===0?null:a[Math.min(i,a.length-1)]?.name??null}function UL(e){return e.source===`external`&&e.repoId&&e.skillFolder?`${e.repoId}/${e.skillFolder}`:e.slug}function Bbt(e){return e.source===`external`&&e.repoId&&e.skillFolder?{source:`external`,repoId:e.repoId,skillFolder:e.skillFolder}:{source:e.source,slug:e.slug}}function Vbt(e,t){let n={url:e},r=t?.trim();return r&&(n.subpath=r),n}function Hbt(e,t){return t.map(t=>({repo:t,entries:e.filter(e=>e.repoId===t.repoId).sort((e,t)=>e.slug.localeCompare(t.slug))}))}var Ubt=/github\.com\/([^/]+\/[^/]+?)(?:\.git)?\/?$/;function Wbt(e){return Ubt.exec(e.url)?.[1]??e.repoId}function Gbt(e){let t=Dbt(e);return t===`system`?{icon:`lock`,colour:`text-gray-500`,titleKey:`pluginManageSkills.sourceSystemTitle`}:t===`user`?{icon:`home`,colour:`text-blue-500`,titleKey:`pluginManageSkills.sourceUserTitle`}:t===`claude-plugin`?{icon:`extension`,colour:`text-purple-500`,titleKey:`pluginManageSkills.sourceClaudePluginTitle`}:{icon:`folder`,colour:`text-green-600`,titleKey:`pluginManageSkills.sourceProjectTitle`}}var WL={icon:`inventory_2`,colour:`text-gray-400`,titleKey:`pluginManageSkills.sourcePresetTitle`};function Kbt(e,t){return e?t.some(t=>t.slug===e&&t.source===`preset`):!1}var qbt=(e,t,n)=>e.map(e=>e.name===t?{...e,description:n}:e),Jbt=(e,t)=>e.filter(e=>e.name!==t),Ybt=(e,t)=>e===null?{acquired:!0,key:t}:{acquired:!1,key:e},Xbt=(e,t)=>e===t?null:e;o(),M();async function Zbt(e){let t=await bN(e.endpoints.catalogList.url);t.ok?(e.catalogError.value=null,Array.isArray(t.data.entries)&&(e.catalogPresets.value=t.data.entries.filter(e=>e.source===`preset`),e.catalogExternal.value=t.data.entries.filter(e=>e.source===`external`))):e.catalogError.value=e.t(`pluginManageSkills.errCatalogListFailed`,{error:t.error})}async function Qbt(e,t){let n=await bN(e.endpoints.catalogPreview.url,Bbt(t));return n.ok?(e.catalogError.value=null,n.data.detail):(e.catalogError.value=e.t(`pluginManageSkills.errCatalogPreviewFailed`,{error:n.error}),null)}function $bt(e,t){let{selectedCatalog:n}=e;if(!n.value||UL(n.value)!==UL(t))return;let r=(t.source===`external`?e.catalogExternal.value:e.catalogPresets.value).find(e=>UL(e)===UL(t));r&&(n.value=r)}async function ext(e,t){if(t.alreadyActive)return;let n=UL(t),{acquired:r,key:i}=Ybt(e.catalogActioningKey.value,n);if(r){e.catalogActioningKey.value=i;try{let n=await xN(e.endpoints.catalogStar.url,Bbt(t));if(!n.ok){e.catalogError.value=e.t(`pluginManageSkills.errCatalogStarFailed`,{error:n.error});return}e.catalogError.value=null,await Promise.all([Zbt(e),e.deps.refreshActiveList()]),$bt(e,t)}finally{e.catalogActioningKey.value=Xbt(e.catalogActioningKey.value,n)}}}async function txt(e,t){e.deps.clearActiveSelection(),e.selectedCatalog.value=t,e.catalogDetail.value=null,e.catalogDetailLoading.value=!0;let n=UL(t),r=await Qbt(e,t);e.selectedCatalog.value&&UL(e.selectedCatalog.value)===n&&(e.catalogDetailLoading.value=!1,r!==null&&(e.catalogDetail.value=r))}function GL(e){e.selectedCatalog.value=null,e.catalogDetail.value=null}function nxt(e,t){e.selectedCatalog.value?.repoId===t&&GL(e)}function rxt(e,t){if(e.selectedCatalog.value?.slug!==t)return;let n=e.catalogPresets.value.find(e=>e.slug===t);n&&(e.selectedCatalog.value=n)}function ixt(e){GL(e),e.catalogDetailLoading.value=!1,e.catalogActioningKey.value=null,e.catalogError.value=null}function axt(){return{catalogPresets:V([]),catalogExternal:V([]),catalogError:V(null),selectedCatalog:V(null),catalogDetail:V(null),catalogDetailLoading:V(!1),catalogActioningKey:V(null)}}function oxt(e){let{t}=We(),n=EL(`skills`),r=axt(),i=m(()=>r.selectedCatalog.value?UL(r.selectedCatalog.value):null),a={t,endpoints:n,deps:e,...r};return{...r,selectedCatalogKey:i,loadCatalog:()=>Zbt(a),selectCatalogEntry:e=>txt(a,e),starCatalogEntry:e=>ext(a,e),clearSelection:()=>GL(a),clearSelectionIfRepo:e=>nxt(a,e),reconcileAfterDelete:e=>rxt(a,e),reset:()=>ixt(a)}}o(),M();function sxt(e,t){return!e.repoCollapsed.value.has(t)}function cxt(e,t){let n=Fbt(e.repoCollapsed.value,t);e.repoCollapsed.value=n,Rbt(n)}async function KL(e){let t=await bN(e.endpoints.externalReposList.url);t.ok?(e.repoListError.value=null,Array.isArray(t.data.repos)&&(e.catalogRepos.value=t.data.repos)):e.repoListError.value=e.t(`pluginManageSkills.errCatalogRepoListFailed`,{error:t.error})}async function lxt(e){let t=await bN(e.endpoints.externalSuggestions.url);t.ok&&Array.isArray(t.data.suggestions)&&(e.suggestions.value=t.data.suggestions)}function uxt(e){e.addRepoUrl.value=``,e.addRepoSubpath.value=``,e.addRepoError.value=null,e.selectedSuggestionUrl.value=null,e.addRepoOpen.value=!0,e.suggestions.value.length===0&&lxt(e)}function dxt(e,t){e.addRepoUrl.value=t.url,e.addRepoSubpath.value=t.subpath??``,e.addRepoError.value=null,e.selectedSuggestionUrl.value=t.url}async function fxt(e,t,n){if(e.addRepoBusy.value)return;let r=t.trim();if(r.length===0)e.addRepoError.value=e.t(`pluginManageSkills.errCatalogRepoInvalidUrl`);else{e.addRepoBusy.value=!0,e.addRepoError.value=null;try{let t=await xN(e.endpoints.externalReposInstall.url,Vbt(r,n));if(!t.ok){e.addRepoError.value=e.t(`pluginManageSkills.errCatalogRepoInstallFailed`,{error:t.error});return}e.addRepoOpen.value=!1,await Promise.all([KL(e),e.deps.reloadCatalog()])}finally{e.addRepoBusy.value=!1}}}async function pxt(e,t){if(e.uninstallingRepoId.value===null&&e.updatingRepoId.value!==t&&(typeof window>`u`||window.confirm(e.t(`pluginManageSkills.catalogUninstallConfirm`)))){e.uninstallingRepoId.value=t;try{let n=await CN(sP(e.endpoints.externalReposRemove,{repoId:t}));if(!n.ok){e.deps.catalogError.value=e.t(`pluginManageSkills.errCatalogRepoUninstallFailed`,{error:n.error});return}e.deps.catalogError.value=null,e.deps.clearCatalogSelectionForRepo(t),await Promise.all([KL(e),e.deps.reloadCatalog(),e.deps.refreshActiveList()])}finally{e.uninstallingRepoId.value=null}}}async function mxt(e,t){if(e.updatingRepoId.value===null&&e.uninstallingRepoId.value!==t.repoId){e.updatingRepoId.value=t.repoId;try{let n=await xN(e.endpoints.externalReposInstall.url,Vbt(t.url,t.subpath));if(!n.ok){e.deps.catalogError.value=e.t(`pluginManageSkills.errCatalogRepoInstallFailed`,{error:n.error});return}e.deps.catalogError.value=null,await Promise.all([KL(e),e.deps.reloadCatalog()])}finally{e.updatingRepoId.value=null}}}function hxt(e){e.addRepoOpen.value=!1,e.addRepoError.value=null,e.selectedSuggestionUrl.value=null,e.uninstallingRepoId.value=null,e.updatingRepoId.value=null}function gxt(){return{catalogRepos:V([]),repoListError:V(null),repoCollapsed:t(Lbt()),addRepoOpen:V(!1),addRepoUrl:V(``),addRepoSubpath:V(``),addRepoError:V(null),addRepoBusy:V(!1),suggestions:V([]),selectedSuggestionUrl:V(null),uninstallingRepoId:V(null),updatingRepoId:V(null)}}function _xt(e){let{t}=We(),n=EL(`skills`),r=gxt(),i={t,endpoints:n,deps:e,...r},a=m(()=>Hbt(e.catalogExternal.value,r.catalogRepos.value));return{...r,externalGroups:a,isRepoOpen:e=>sxt(i,e),toggleRepo:e=>cxt(i,e),loadExternalRepos:()=>KL(i),openAddRepo:()=>uxt(i),selectSuggestion:e=>dxt(i,e),installRepo:(e,t)=>fxt(i,e,t),uninstallRepo:e=>pxt(i,e),updateRepo:e=>mxt(i,e),resetModalState:()=>hxt(i)}}o(),M(),we(),le();var vxt={class:`bg-white rounded-lg shadow-xl w-full max-w-md p-5`},yxt={class:`text-base font-semibold text-gray-800 mb-3`},bxt={class:`block text-xs font-medium text-gray-600 mb-1`},xxt=[`placeholder`],Sxt={class:`block text-xs font-medium text-gray-600 mb-1`},Cxt=[`placeholder`],wxt={key:0,class:`text-xs text-red-600 mb-3`,"data-testid":`skill-add-repo-error`},Txt={class:`flex items-center justify-end gap-2 mb-4`},Ext=[`disabled`],Dxt={key:1},Oxt={class:`text-xs font-medium text-gray-600 mb-2`},kxt={class:`flex items-start`},Axt=[`data-testid`,`aria-pressed`,`onClick`],jxt={class:`font-medium text-gray-700`},Mxt=[`href`,`data-testid`,`title`,`aria-label`],Nxt=K({__name:`AddRepoModal`,props:Se({error:{},busy:{type:Boolean},suggestions:{},selectedSuggestionUrl:{}},{url:{required:!0},urlModifiers:{},subpath:{required:!0},subpathModifiers:{}}),emits:Se([`close`,`install`,`select-suggestion`],[`update:url`,`update:subpath`]),setup(e,{emit:t}){let{t:n}=We(),r=G(e,`url`),i=G(e,`subpath`),a=t;return(t,o)=>(B(),U(`div`,{class:`fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4`,"data-testid":`skill-add-repo-modal`,onClick:o[7]||=s(e=>a(`close`),[`self`])},[S(`div`,vxt,[S(`h3`,yxt,T(q(n)(`pluginManageSkills.catalogAddRepoTitle`)),1),S(`label`,bxt,T(q(n)(`pluginManageSkills.catalogRepoUrlLabel`)),1),u(S(`input`,{"onUpdate:modelValue":o[0]||=e=>r.value=e,type:`text`,"data-testid":`skill-add-repo-url`,class:`w-full h-8 px-2 mb-3 text-sm border border-gray-300 rounded focus:outline-none focus:border-blue-400`,placeholder:q(n)(`pluginManageSkills.catalogRepoUrlPlaceholder`),onKeydown:o[1]||=l(e=>a(`install`),[`enter`])},null,40,xxt),[[Fe,r.value]]),S(`label`,Sxt,T(q(n)(`pluginManageSkills.catalogRepoSubpathLabel`)),1),u(S(`input`,{"onUpdate:modelValue":o[2]||=e=>i.value=e,type:`text`,"data-testid":`skill-add-repo-subpath`,class:`w-full h-8 px-2 mb-3 text-sm border border-gray-300 rounded focus:outline-none focus:border-blue-400`,placeholder:q(n)(`pluginManageSkills.catalogRepoSubpathPlaceholder`),onKeydown:o[3]||=l(e=>a(`install`),[`enter`])},null,40,Cxt),[[Fe,i.value]]),e.error?(B(),U(`p`,wxt,T(e.error),1)):b(``,!0),S(`div`,Txt,[S(`button`,{type:`button`,class:`h-8 px-2.5 flex items-center text-sm rounded border border-gray-300 text-gray-600 hover:bg-gray-50`,onClick:o[4]||=e=>a(`close`)},T(q(n)(`common.cancel`)),1),S(`button`,{type:`button`,"data-testid":`skill-add-repo-submit`,class:`h-8 px-2.5 flex items-center gap-1 text-sm rounded bg-blue-600 hover:bg-blue-700 text-white disabled:opacity-40`,disabled:e.busy,onClick:o[5]||=e=>a(`install`)},T(e.busy?q(n)(`pluginManageSkills.catalogRepoInstalling`):q(n)(`pluginManageSkills.catalogAddRepoSubmit`)),9,Ext)]),e.suggestions.length>0?(B(),U(`div`,Dxt,[S(`p`,Oxt,T(q(n)(`pluginManageSkills.catalogAddRepoSuggestions`)),1),(B(!0),U(D,null,H(e.suggestions,t=>(B(),U(`div`,{key:t.url,class:c([`mb-1 rounded border`,e.selectedSuggestionUrl===t.url?`border-blue-400 bg-blue-50`:`border-gray-200`])},[S(`div`,kxt,[S(`button`,{type:`button`,"data-testid":`skill-add-repo-suggestion-${t.url}`,class:`flex-1 min-w-0 text-left px-3 py-2 text-sm`,"aria-pressed":e.selectedSuggestionUrl===t.url,onClick:e=>a(`select-suggestion`,t)},[S(`div`,jxt,T(t.displayName),1),S(`div`,{class:c([`text-xs text-gray-500`,e.selectedSuggestionUrl===t.url?`whitespace-normal break-words`:`truncate`])},T(t.description),3)],8,Axt),S(`a`,{href:t.url,target:`_blank`,rel:`noopener noreferrer`,"data-testid":`skill-add-repo-suggestion-link-${t.url}`,class:`h-8 w-8 shrink-0 flex items-center justify-center rounded text-gray-400 hover:text-blue-600`,title:q(n)(`pluginManageSkills.catalogRepoOpenLink`),"aria-label":q(n)(`pluginManageSkills.catalogRepoOpenLink`),onClick:o[6]||=s(()=>{},[`stop`])},[...o[8]||=[S(`span`,{class:`material-icons text-sm`,"aria-hidden":`true`},`open_in_new`,-1)]],8,Mxt)])],2))),128))])):b(``,!0)])]))}}),Pxt=1,Fxt=e=>e!==null&&`nodeType`in e&&e.nodeType===Pxt;function Ixt(e,t){if(!e.startsWith(`http://`)&&!e.startsWith(`https://`))return!1;try{return new URL(e).origin!==t}catch{return!1}}function qL(e){if(e.button!==0||e.ctrlKey||e.metaKey||e.shiftKey)return!1;let{target:t}=e;if(!Fxt(t))return!1;let n=t.closest(`a`);if(!n)return!1;let r=n.href;return Ixt(r,window.location.origin)?(e.preventDefault(),window.open(r,`_blank`,`noopener,noreferrer`),!0):!1}function JL(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var YL=JL();function Lxt(e){YL=e}var XL={exec:()=>null};function ZL(e){let t=[];return n=>{let r=Math.max(0,Math.min(3,n-1)),i=t[r];return i||(i=e(r),t[r]=i),i}}function QL(e,t=``){let n=typeof e==`string`?e:e.source,r={replace:(e,t)=>{let i=typeof t==`string`?t:t.source;return i=i.replace($L.caret,`$1`),n=n.replace(e,i),r},getRegex:()=>new RegExp(n,t)};return r}var Rxt=((e=``)=>{try{return!!RegExp(`(?<=1)(?<!1)`+e)}catch{return!1}})(),$L={codeRemoveIndent:/^(?: {0,3}\t| {1,4})/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,endingSpaceTabChar:/[ \t]$/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,leadingSpaceTab:/^[ \t]+/,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,numericCharacterReference:/&#(?:(\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));/g,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:ZL(e=>RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:ZL(e=>RegExp(`^ {0,${e}}((?:-[ ]*){3,}|(?:_[ ]*){3,}|(?:\\*[ ]*){3,})(?:\\n+|$)`)),fencesBeginRegex:ZL(e=>RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)),headingBeginRegex:ZL(e=>RegExp(`^ {0,${e}}#`)),htmlBeginRegex:ZL(e=>RegExp(`^ {0,${e}}(?:</?(?:${iR})(?: +|$|/?>)|<(?:script|pre|style|textarea|!--))`,`i`)),blockquoteBeginRegex:ZL(e=>RegExp(`^ {0,${e}}>`))},zxt=/^(?:[ \t]*(?:\n|$))+/,Bxt=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Vxt=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,eR=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Hxt=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,tR=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,Uxt=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |fences|blockquote|heading|hr|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Wxt=QL(Uxt).replace(/bull/g,tR).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,``).getRegex(),Gxt=QL(Uxt).replace(/bull/g,tR).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),nR=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \t]+\n)[^\n]+)*)/,Kxt=/^[^\n]+/,rR=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,qxt=QL(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace(`label`,rR).replace(`title`,/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Jxt=QL(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,tR).getRegex(),iR=`address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul`,aR=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,Yxt=QL(`^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n*|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n*|$)|<![A-Z][\\s\\S]*?(?:>[^\\n]*\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>[^\\n]*\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][a-z0-9-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))`,`i`).replace(`comment`,aR).replace(`tag`,iR).replace(`attribute`,/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Xxt=e=>QL(nR).replace(`hr`,eR).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace(`list`,e).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,iR).getRegex(),Zxt=Xxt(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/),Qxt=Xxt(/ {0,3}(?:[*+-]|\d{1,9}[.)])(?:[ \t]|\n|$)/),oR={blockquote:QL(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace(`paragraph`,Qxt).getRegex(),code:Bxt,def:qxt,fences:Vxt,heading:Hxt,hr:eR,html:Yxt,lheading:Wxt,list:Jxt,newline:zxt,paragraph:Zxt,table:XL,text:Kxt},$xt=QL(`^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)`).replace(`hr`,eR).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`blockquote`,` {0,3}>`).replace(`code`,`(?: {4}| {0,3} )[^\\n]`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,iR).getRegex(),eSt={...oR,lheading:Gxt,table:$xt,paragraph:QL(nR).replace(`hr`,eR).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`table`,$xt).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,iR).getRegex()},tSt={...oR,html:QL(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace(`comment`,aR).replace(/tag/g,`(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b`).getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:XL,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:QL(nR).replace(`hr`,eR).replace(`heading`,` *#{1,6} *[^
|
|
265
265
|
]`).replace(`lheading`,Wxt).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`|fences`,``).replace(`|list`,``).replace(`|html`,``).replace(`|tag`,``).getRegex()},nSt=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,rSt=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,iSt=/^( {2,}|\\)\n(?!\s*$)[ \t]*/,aSt=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,sR=/[\p{P}\p{S}]/u,cR=/[\s\p{P}\p{S}]/u,lR=/[^\s\p{P}\p{S}]/u,oSt=QL(/^((?![*_])punctSpace)/,`u`).replace(/punctSpace/g,cR).getRegex(),sSt=/[\p{Pi}\p{Ps}"']/u,cSt=/(?!~)[\p{P}\p{S}]/u,lSt=/(?!~)[\s\p{P}\p{S}]/u,uSt=/(?:[^\s\p{P}\p{S}]|~)/u,dSt=QL(/link|precode-code|html/,`g`).replace(`link`,/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace(`precode-`,Rxt?"(?<!`)()":"(^^|[^`])").replace(`code`,/(?<b>`+)[^`]+\k<b>(?!`)/).replace(`html`,/<(?! )[^<>]*?>/).getRegex(),fSt=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,pSt=QL(fSt,`u`).replace(/punct/g,sR).getRegex(),mSt=QL(fSt,`u`).replace(/punct/g,cSt).getRegex(),hSt=QL(/^(?:\*+(?:((?!\*)(?!openQuote)punct)|([^\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\s_]))?/,`u`).replace(/openQuote/g,sSt).replace(/punct/g,sR).getRegex(),gSt=`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)`,_St=QL(gSt,`gu`).replace(/notPunctSpace/g,lR).replace(/punctSpace/g,cR).replace(/punct/g,sR).getRegex(),vSt=QL(gSt,`gu`).replace(/notPunctSpace/g,uSt).replace(/punctSpace/g,lSt).replace(/punct/g,cSt).getRegex(),ySt=QL(`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)[\\s](\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|(?:(?!\\*)punct|notPunctSpace)(\\*+)(?!\\*)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,lR).replace(/punctSpace/g,cR).replace(/punct/g,sR).getRegex(),bSt=QL(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)`,`gu`).replace(/notPunctSpace/g,lR).replace(/punctSpace/g,cR).replace(/punct/g,sR).getRegex(),xSt=QL(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\s](_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,lR).replace(/punctSpace/g,cR).replace(/punct/g,sR).getRegex(),SSt=QL(/^~~?(?:((?!~)punct)|[^\s~])/,`u`).replace(/punct/g,sR).getRegex(),CSt=QL(`^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,lR).replace(/punctSpace/g,cR).replace(/punct/g,sR).getRegex(),wSt=QL(/\\(punct)/,`gu`).replace(/punct/g,sR).getRegex(),TSt=QL(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace(`scheme`,/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(`email`,/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),ESt=QL(aR).replace(`(?:-->|$)`,`-->`).getRegex(),DSt=QL(`^comment|^</[a-zA-Z][a-zA-Z0-9-]*\\s*>|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>`).replace(`comment`,ESt).replace(`attribute`,/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),OSt=/\[(?:\\[\s\S]|[^\[\]\\])*\]/,uR=QL(/(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/).replace(`brackets`,OSt).getRegex(),kSt=QL(/^!?\[(label)\]\([ \t\n]*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?[ \t\n]*\)/).replace(`label`,uR).replace(`href`,/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace(`title`,/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),ASt=QL(/^!?\[(label)\]\[(ref)\]/).replace(`label`,uR).replace(`ref`,rR).getRegex(),jSt=QL(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,rR).getRegex(),MSt=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\]){1,999}/,NSt=QL(/(?:[^\[\]\\`]*(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\]))){0,999}?[^\[\]\\`]*?/).replace(`brackets`,OSt).getRegex(),PSt=QL(`reflink|nolink(?!\\()`,`g`).replace(`reflink`,QL(/^!?\[(label)\]\[(ref)\]/).replace(`label`,NSt).replace(`ref`,MSt).getRegex()).replace(`nolink`,QL(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,MSt).getRegex()).getRegex(),FSt=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,ISt=QL(/(?:mailto:email|xmpp:email(?:\/[A-Za-z0-9@.]+)?)/).replace(/email/g,/[A-Za-z0-9._+-]+@[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex(),dR={_backpedal:XL,anyPunctuation:wSt,autolink:TSt,blockSkip:dSt,br:iSt,code:rSt,del:XL,delLDelim:XL,delRDelim:XL,emStrongLDelim:pSt,emStrongRDelimAst:_St,emStrongRDelimUnd:bSt,escape:nSt,link:kSt,nolink:jSt,punctuation:oSt,reflink:ASt,reflinkSearch:PSt,tag:DSt,text:aSt,url:XL},LSt={...dR,emStrongLDelim:hSt,emStrongRDelimAst:ySt,emStrongRDelimUnd:xSt,link:QL(/^!?\[(label)\]\((.*?)\)/).replace(`label`,uR).getRegex(),reflink:QL(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace(`label`,uR).getRegex()},fR={...dR,emStrongRDelimAst:vSt,emStrongLDelim:mSt,delLDelim:SSt,delRDelim:CSt,url:QL(/^emailProtocol|^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace(`emailProtocol`,ISt).replace(`protocol`,FSt).replace(`email`,/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:QL(/^(?:[^a-zA-Z0-9](?=emailProtocol)|(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9](?=emailProtocol)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))))/).replace(`protocol`,FSt).replace(/emailProtocol/g,/(?:mailto|xmpp):/).getRegex()},RSt={...fR,br:QL(iSt).replace(`{2,}`,`*`).getRegex(),text:QL(fR.text).replace(`\\b_`,`\\b_| {2,}\\n`).replace(/\{2,\}/g,`*`).getRegex()},pR={normal:oR,gfm:eSt,pedantic:tSt},mR={normal:dR,gfm:fR,breaks:RSt,pedantic:LSt},zSt={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`},BSt=e=>zSt[e];function hR(e,t){if(t){if($L.escapeTest.test(e))return e.replace($L.escapeReplace,BSt)}else if($L.escapeTestNoEncode.test(e))return e.replace($L.escapeReplaceNoEncode,BSt);return e}function VSt(e){return e.replace($L.numericCharacterReference,(e,t,n)=>{let r=t===void 0?Number.parseInt(n,16):Number.parseInt(t,10);return r===0||r>1114111||r>=55296&&r<=57343?`�`:String.fromCodePoint(r)})}function HSt(e){try{e=encodeURI(e).replace($L.percentDecode,`%`)}catch{return null}return e}function USt(e,t){let n=e.replace($L.findPipe,(e,t,n)=>{let r=!1,i=t;for(;--i>=0&&n[i]===`\\`;)r=!r;return r?`|`:` |`}).split($L.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),t){if(n.length>t)n.splice(t);else for(;n.length<t;)n.push(``)}for(;r<n.length;r++)n[r]=n[r].trim().replace($L.slashPipe,`|`);return n}function gR(e,t,n){let r=e.length;if(r===0)return``;let i=0;for(;i<r;){let a=e.charAt(r-i-1);if(a===t&&!n)i++;else if(a!==t&&n)i++;else break}return e.slice(0,r-i)}function WSt(e){let t=e.split(`
|
|
@@ -356,7 +356,7 @@ Aspect: \`size: 16:9\` (default 1280×720) or \`size: 4:3\` (960×720) — handl
|
|
|
356
356
|
- \`size: WxH\` → any custom pixel canvas (e.g. \`size: 1920x1080\`)
|
|
357
357
|
Themes: \`theme: default\` | \`gaia\` | \`uncover\`. Custom sizes compose on top of whichever theme is chosen.`,dTt={type:`function`,name:AR,description:`Display a document in markdown format — either new markdown (saved) or an existing saved document (by path).`,prompt:uTt,promptCompact:[`Use the ${AR} tool for a document that combines text with embedded images (guides, reports, tutorials, articles); prefer it over standalone image generation for informational content.`,"Provide EITHER `markdown` + `filenamePrefix` (new content, saved) OR `path` (any existing `.md`, opened in place — never read a file and re-send its content as `markdown`).",`Embed generated images as .`,`For a slide deck / presentation / スライド (Marp), image directives, sizes or themes, Read {{promptFilesDir}}/presentDocument.md first.`].join(` `),promptFiles:{"presentDocument.md":uTt},parameters:{type:`object`,properties:{title:{type:`string`,description:`Title for the document`},markdown:{type:`string`,description:"The markdown content to display. Provide this (with `filenamePrefix`) OR `path`. Describe embedded images in the following format: . IMPORTANT: For embedded images, you MUST use the EXACT placeholder path '__too_be_replaced_image_path__'."},filenamePrefix:{type:`string`,description:"Short English filename prefix (without extension). Always send it with `markdown` — it is what makes the saved file findable; omitting it falls back to 'document'. Ignored with `path`. Use lowercase with hyphens, e.g. 'project-summary'. The server sanitizes the value and appends a random id to prevent collisions."},path:{type:`string`,description:"Path to an existing `.md` file to present without re-saving — workspace-relative (`README.md`, `docs/design.md`, `artifacts/documents/2026/07/report-abc123.md`) or absolute. The user's edits in the view overwrite this file. Provide this OR `markdown`."}},required:[`title`]}};async function fTt(e,t){let{app:n}=e;if(!n)throw Error(`markdown plugin: context.app (MarkdownHostApp) was not provided by the host`);switch(t.kind){case`loadDoc`:return n.loadDoc(t.path);case`saveDoc`:return n.saveDoc(t.path,t.markdown);case`marpThemes`:return n.marpThemes();case`exportPdf`:return n.exportPdf({markdown:t.markdown,filename:t.filename,marp:t.marp,baseDir:t.baseDir,format:t.format,stripFrontmatter:t.stripFrontmatter});case`fillImages`:return n.fillImages(t.markdown);case`bookmarkPattern`:return n.bookmarkPattern?n.bookmarkPattern():{pattern:null};default:throw Error(`markdown plugin: unknown dispatch kind ${JSON.stringify(t)}`)}}var pTt=`The document has been presented to the user in a rendered markdown view.`,MR=e=>typeof e==`string`&&e.length>0;async function mTt(e,t,n){if(!lTt(t))return{message:"path must be a .md file path, without `.` / `..` segments",instructions:"Acknowledge the error and retry with a valid path to an existing .md file, or inline `markdown`."};try{await e.loadDoc(t)}catch(e){return{message:`Cannot open ${t}: ${e instanceof Error?e.message:String(e)}`,instructions:"Acknowledge that the document could not be opened and retry with a path that exists or inline `markdown`."}}return{message:`Presented existing document${n?`: ${n}`:``}`,data:{markdown:t,docPath:t},instructions:pTt}}async function hTt(e,t){let{title:n,markdown:r,filenamePrefix:i}=t,a=(await e.fillImages(r??``)).markdown,{path:o}=await e.saveNewDoc(i??`document`,a);return{message:`Document created${n?`: ${n}`:``}`,data:{markdown:o,docPath:o,filenamePrefix:i},instructions:pTt}}async function gTt(e,t){let{app:n}=e;if(!n)throw Error(`markdown plugin: context.app (MarkdownHostApp) was not provided by the host`);let{title:r,markdown:i,path:a}=t;return MR(a)&&MR(i)?{message:"provide either `markdown` or `path`, not both",instructions:"Acknowledge the error and retry with exactly one of `markdown` or `path`."}:MR(a)?mTt(n,a,r):MR(i)?hTt(n,t):{message:"provide either `markdown` or `path`",instructions:"Acknowledge the error and retry with inline `markdown` or an existing `path`."}}var _Tt=new Set([`loadDoc`,`saveDoc`,`marpThemes`,`exportPdf`,`fillImages`,`bookmarkPattern`]);function vTt(e){if(typeof e!=`object`||!e)return!1;let t=e.kind;return typeof t==`string`&&_Tt.has(t)}var yTt={toolDefinition:dTt,execute:async(e,t)=>{let n=e;return vTt(t)?fTt(n,t):gTt(n,t)},generatingMessage:`Creating document...`,isEnabled:()=>!0};function bTt(e){let t,n=Promise.resolve(),r=Promise.resolve(),i=()=>{};function a(t,r){let i=async()=>{if(e.isWanted(r))try{await e.write(t,r)}catch{}};n=n.then(i,i)}return{schedule(n,o){i(),clearTimeout(t),r=new Promise(e=>{i=e}),t=setTimeout(()=>{t=void 0,a(n,o),i()},e.delayMs)},cancel(){clearTimeout(t),t=void 0,i()},settled(){return r.then(()=>n)}}}var xTt=`^\\.\\.\\.`,STt=80;function CTt(e){try{return new RegExp(e,`gm`)}catch{return null}}function wTt(e,t){let n=e.lastIndexOf(`
|
|
358
358
|
`,t-1)+1,r=e.indexOf(`
|
|
359
|
-
`,t);return g5e(e.slice(n,r<0?e.length:r).trim(),STt)}var TTt=50;function ETt(e,t){if(t===null||e.length===0)return[];let n=new RegExp(t.source,t.flags.includes(`g`)?t.flags:`${t.flags}g`),r=[],i=Date.now()+TTt,a;for(;(a=n.exec(e))!==null&&(r.push({offset:a.index,fraction:a.index/e.length,label:wTt(e,a.index)}),a.index===n.lastIndex&&(n.lastIndex+=1),!(r.length>=200||Date.now()>i)););return r}Object.freeze({min:0,max:65535});function NR(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function DTt(e,t){return NR(e)&&typeof e[t]==`string`}function OTt(e,t){return e instanceof Error?e.message:DTt(e,`details`)&&e.details?e.details:DTt(e,`message`)&&e.message?e.message:t===void 0?String(e):t}var PR=(e,t)=>{throw Error(`markdown plugin: dispatch returned no ${e} (got ${typeof t})`)};function kTt(e){return NR(e)&&typeof e.content==`string`?{content:e.content}:PR(`document content`,e)}function ATt(e){return!NR(e)||!Array.isArray(e.themes)?PR(`marp themes`,e):{themes:e.themes.filter(e=>NR(e)&&typeof e.name==`string`&&typeof e.css==`string`)}}function jTt(e){return NR(e)&&(typeof e.pattern==`string`||e.pattern===null)?{pattern:e.pattern}:PR(`bookmark pattern`,e)}function MTt(e){return NR(e)&&typeof e.pdfBase64==`string`?{pdfBase64:e.pdfBase64}:PR(`exported PDF`,e)}var FR=1280,NTt=200,PTt=3840;function IR(e,t){return!Number.isFinite(e)||e<NTt?t:Math.min(e,PTt)}var FTt=/div\.marpit\s*>\s*section\s*\{[^}]*?width:\s*(\d+)px[^}]*?height:\s*(\d+)px/;function ITt(e){let t=e.match(FTt);return t?{width:IR(Number(t[1]),FR),height:IR(Number(t[2]),720)}:{width:FR,height:720}}var LTt=/viewBox="0 0 (\d+) (\d+)"/;function RTt(e){let t=e.match(LTt);return t?{width:IR(Number(t[1]),FR),height:IR(Number(t[2]),720)}:{width:FR,height:720}}async function zTt(e,t={}){let n=t.inlineSVG??!1,{Marp:r}=await Xe(async()=>{let{Marp:e}=await import(`./marp-
|
|
359
|
+
`,t);return g5e(e.slice(n,r<0?e.length:r).trim(),STt)}var TTt=50;function ETt(e,t){if(t===null||e.length===0)return[];let n=new RegExp(t.source,t.flags.includes(`g`)?t.flags:`${t.flags}g`),r=[],i=Date.now()+TTt,a;for(;(a=n.exec(e))!==null&&(r.push({offset:a.index,fraction:a.index/e.length,label:wTt(e,a.index)}),a.index===n.lastIndex&&(n.lastIndex+=1),!(r.length>=200||Date.now()>i)););return r}Object.freeze({min:0,max:65535});function NR(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function DTt(e,t){return NR(e)&&typeof e[t]==`string`}function OTt(e,t){return e instanceof Error?e.message:DTt(e,`details`)&&e.details?e.details:DTt(e,`message`)&&e.message?e.message:t===void 0?String(e):t}var PR=(e,t)=>{throw Error(`markdown plugin: dispatch returned no ${e} (got ${typeof t})`)};function kTt(e){return NR(e)&&typeof e.content==`string`?{content:e.content}:PR(`document content`,e)}function ATt(e){return!NR(e)||!Array.isArray(e.themes)?PR(`marp themes`,e):{themes:e.themes.filter(e=>NR(e)&&typeof e.name==`string`&&typeof e.css==`string`)}}function jTt(e){return NR(e)&&(typeof e.pattern==`string`||e.pattern===null)?{pattern:e.pattern}:PR(`bookmark pattern`,e)}function MTt(e){return NR(e)&&typeof e.pdfBase64==`string`?{pdfBase64:e.pdfBase64}:PR(`exported PDF`,e)}var FR=1280,NTt=200,PTt=3840;function IR(e,t){return!Number.isFinite(e)||e<NTt?t:Math.min(e,PTt)}var FTt=/div\.marpit\s*>\s*section\s*\{[^}]*?width:\s*(\d+)px[^}]*?height:\s*(\d+)px/;function ITt(e){let t=e.match(FTt);return t?{width:IR(Number(t[1]),FR),height:IR(Number(t[2]),720)}:{width:FR,height:720}}var LTt=/viewBox="0 0 (\d+) (\d+)"/;function RTt(e){let t=e.match(LTt);return t?{width:IR(Number(t[1]),FR),height:IR(Number(t[2]),720)}:{width:FR,height:720}}async function zTt(e,t={}){let n=t.inlineSVG??!1,{Marp:r}=await Xe(async()=>{let{Marp:e}=await import(`./marp-OXXg-yyV.js`).then(e=>Ue(e.default,1));return{Marp:e}},__vite__mapDeps([22,5,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43])),i=new r({inlineSVG:n,html:Zwt,emoji:{unicode:!1,shortcode:!1}});for(let e of t.themes??[])i.themeSet.add(e.css);let a=oTt(i,e),{html:o,css:s}=i.render(a),{width:c,height:l}=n?RTt(o):ITt(s);return{html:o,css:s,slideWidth:c,slideHeight:l}}var BTt={img:[`src`],source:[`src`],video:[`poster`,`src`],audio:[`src`]},VTt={img:[`srcset`],source:[`srcset`]};function LR(e){return e===` `||e===` `||e===`
|
|
360
360
|
`||e===`\f`||e===`\r`}function HTt(e){let t=e.length;for(;t>0&&e[t-1]===`,`;)t--;return e.slice(0,t)}function UTt(e,t){let n=t;for(;n<e.length&&(LR(e[n])||e[n]===`,`);)n++;return n}function WTt(e,t){let n=t,r=n;for(;n<e.length&&!LR(e[n]);)n++;let i=e.slice(r,n),a=HTt(i);if(a.length!==i.length)return{candidate:a?{url:a,descriptor:``}:null,next:n};for(;n<e.length&&LR(e[n]);)n++;let o=n;for(;n<e.length&&e[n]!==`,`;)n++;let s=e.slice(o,n).trim();return n<e.length&&e[n]===`,`&&n++,{candidate:a?{url:a,descriptor:s}:null,next:n}}function GTt(e){let t=[],n=0;for(;n<e.length&&(n=UTt(e,n),!(n>=e.length));){let{candidate:r,next:i}=WTt(e,n);n=i,r&&t.push(r)}return t}function KTt(e,t){let n=GTt(e);if(n.length===0)return e;let r=!1,i=n.map(({url:e,descriptor:n})=>{let i=t(e),a=i===null||i===e?e:(r=!0,i);return n?`${a} ${n}`:a});return r?i.join(`, `):e}var qTt=/<(?:img|source|video|audio)\b(?:[^>"']|"[^"]*"|'[^']*')*\/?>/gi,JTt=/^<([a-z]+)/i,YTt=/(\s)([A-Za-z][\w:-]*)(?:(\s*=\s*)("([^"]*)"|'([^']*)'|([^\s>"'][^\s>]*)))?/g;function XTt(e,t){return e&&e.replace(qTt,e=>{let n=JTt.exec(e)?.[1]?.toLowerCase();if(n===void 0)return e;let r=BTt[n],i=VTt[n];return!r&&!i?e:e.replace(YTt,(...e)=>QTt(e,r??[],i??[],t))})}function ZTt(e){let[t,n,r,i,,a,o,s]=e.map(e=>typeof e==`string`?e:void 0);return{full:t??``,leading:n??``,name:r??``,eqWithSpaces:i,doubleQuoted:a,singleQuoted:o,bare:s}}function QTt(e,t,n,r){let{full:i,leading:a,name:o,eqWithSpaces:s,doubleQuoted:c,singleQuoted:l,bare:u}=ZTt(e);if(!s)return i;let d=o.toLowerCase(),f=n.includes(d);if(!f&&!t.includes(d))return i;let p=(c??l??u??``).trim();if(!p)return i;let m=f?KTt(p,r):r(p);if(m===null||m===p)return i;let h=c===void 0?l===void 0?`"`:`'`:`"`;return`${a}${o}${s}${h}${m}${h}`}function $Tt(e){return!!(e.startsWith(`data:`)||e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`/api/`))}function eEt(e,t){let n=t.startsWith(`/`),r=[...n?[]:e.split(`/`).filter(e=>e!==``&&e!==`.`)],i=(n?t.slice(1):t).split(`/`);for(let e of i)if(e!==``&&e!==`.`){if(e===`..`){if(r.length===0)return null;r.pop()}else r.push(e)}return r.length===0?null:r.join(`/`)}function tEt(e){if(!e.startsWith(`![`))return null;let t=1;for(let n=2;n<e.length;n++){let r=e[n];if(r===`[`)t++;else if(r===`]`&&(t--,t===0))return e.slice(2,n)}return null}function nEt(e,t){let n=(e.href??``).trim();if(n===``||$Tt(n))return null;let r=eEt(t,n);if(r===null)return null;let i=JI(r),a=tEt(e.raw)??e.text??``;return e.title?`.replace(/"/g,`\\"`)}")`:``}function rEt(e,t){return XTt(e,e=>{if($Tt(e))return null;let n=eEt(t,e);return n===null?null:JI(n)})}function iEt(e){return e.type===`code`||e.type===`codespan`}function aEt(e){return typeof e!=`object`||!e?!1:`type`in e&&typeof e.type==`string`&&`raw`in e&&typeof e.raw==`string`}function oEt(e){if(!Array.isArray(e)||e.length===0)return null;let t=e;return t.every(aEt)?t:null}function sEt(e){let t=`tokens`in e?e.tokens:void 0,n=`items`in e?e.items:void 0;return oEt(t)??oEt(n)}function cEt(e,t,n,r){let i=t.map(e=>e.raw).join(``);if(i===``)return!1;let a=e.indexOf(i);if(a<0)return!1;a>0&&r.push(e.slice(0,a));for(let e of t)lEt(e,n,r);let o=e.slice(a+i.length);return o&&r.push(o),!0}function lEt(e,t,n){if(iEt(e)){n.push(e.raw);return}if(e.type===`image`){let r=nEt(e,t);n.push(r??e.raw);return}if(e.type===`html`){n.push(rEt(e.raw,t));return}let{raw:r}=e,i=sEt(e);i&&cEt(r,i,t,n)||n.push(r)}function RR(e,t=``){let n=TR.lexer(e),r=[];for(let e of n)lEt(e,t,r);return r.join(``)}var uEt=/^(\s*(?:>\s*)*)([-*+]|\d+[.)])(\s+)\[([ xX])\]/,dEt=/^( {0,3})(`{3,}|~{3,})/,fEt=/^(\s*(?:>\s?)+)/;function pEt(e,t){let n=e.match(fEt),r=n?e.slice(n[0].length):e,i=r.match(dEt),a=i?.[2];if(i&&a!==void 0){if(!t.inFence)return t.inFence=!0,t.marker=a,!0;let e=r.slice(i[0].length);return t.marker&&a[0]===t.marker[0]&&a.length>=t.marker.length&&/^\s*$/.test(e)&&(t.inFence=!1,t.marker=null),!0}return t.inFence}function mEt(e,t){let[n,r,i,a,o]=t;return`${r}${i}${a}[${o===` `?`x`:` `}]${e.slice(n.length)}`}function zR(e){let t={inFence:!1,marker:null},n=[];for(let[r,i]of e.split(`
|
|
361
361
|
`).entries())pEt(i,t)||uEt.test(i)&&n.push(r);return n}function hEt(e,t){if(!Number.isInteger(t)||t<0)return null;let n=zR(e)[t];if(n===void 0)return null;let r=e.split(`
|
|
362
362
|
`),i=r[n];if(i===void 0)return null;let a=i.match(uEt);return a?(r[n]=mEt(i,a),r.join(`
|
|
@@ -5900,7 +5900,7 @@ end`};t.events.push([`putFont`,function(t){(function(t){var n=t.font,i=t.out,a=t
|
|
|
5900
5900
|
|
|
5901
5901
|
---
|
|
5902
5902
|
|
|
5903
|
-
`),i=t1n(t);return r.length>0?`${i}\n\n${r}\n`:`${i}\n`}o(),M(),we();var r1n=[`disabled`,`title`,`aria-label`],i1n={class:`material-icons text-lg`,"aria-hidden":`true`},a1n=1500,o1n=K({__name:`CopyChatButton`,props:{results:{},resultTimestamps:{},sessionRoleName:{}},setup(e){let{t}=We(),n=e,r=V(!1),i=null;async function a(e){let t=await bN(kP.files.content,{path:e});return t.ok?t.data.content??null:null}async function o(){let e=await n1n(n.results,{sessionRoleName:n.sessionRoleName,resultTimestamps:n.resultTimestamps,readFile:a});try{await navigator.clipboard.writeText(e),r.value=!0,i!==null&&clearTimeout(i),i=setTimeout(()=>{r.value=!1,i=null},a1n)}catch{}}return _(()=>{i!==null&&clearTimeout(i)}),(n,i)=>(B(),U(`button`,{type:`button`,class:c([`h-8 w-8 flex items-center justify-center rounded text-gray-400 hover:text-gray-700 hover:bg-gray-100 transition-colors disabled:opacity-40 disabled:cursor-not-allowed`,{"!text-green-600":r.value}]),"data-testid":`copy-chat-md`,disabled:e.results.length===0,title:r.value?q(t)(`sidebarHeader.copiedMarkdown`):q(t)(`sidebarHeader.copyMarkdown`),"aria-label":r.value?q(t)(`sidebarHeader.copiedMarkdown`):q(t)(`sidebarHeader.copyMarkdown`),onClick:o},[S(`span`,i1n,T(r.value?`check`:`content_copy`),1)],10,r1n))}});o(),M(),we();var s1n={class:`flex-1 min-h-0 flex flex-col bg-gray-100`},c1n={class:`shrink-0 flex items-center gap-2 text-xs text-gray-400 px-3 py-2 border-b border-gray-100`,"data-testid":`sidebar-role-header`},l1n={key:1,class:`truncate`},u1n={class:`ml-auto flex items-center gap-0.5 shrink-0`},d1n=[`title`,`aria-label`,`aria-pressed`],f1n={class:`relative flex-1 min-h-0 flex flex-col`},p1n=[`onClick`],m1n={class:`absolute top-0 left-2 -translate-y-1/2 bg-gray-100 px-1 text-[10px] text-gray-400 leading-none pointer-events-none`},h1n={key:0,class:`absolute top-0 right-2 -translate-y-1/2 bg-gray-100 px-1 text-[10px] text-gray-400 leading-none pointer-events-none`},g1n={key:2,class:`block truncate p-2`},_1n=Qe(K({__name:`SessionSidebar`,props:{results:{},selectedUuid:{},resultTimestamps:{},sessionRoleName:{},sessionRoleIcon:{},sessionModel:{},sessionModelOverride:{},layoutMode:{},showRightSidebar:{type:Boolean},hasNewMessages:{type:Boolean}},emits:[`select`,`activate`,`update:layoutMode`,`toggle-right-sidebar`,`jump-to-latest`,`update:sessionModelOverride`],setup(e,{expose:t,emit:n}){let{t:r}=We();function i(e){if(e.toolName===`text-response`)return e.title??`Assistant`;let t=Na(e)?e.action:void 0;return typeof t==`string`&&t.length>0?`${e.toolName}(${t})`:e.toolName}let a=n,o=V(null);return t({root:o}),(t,n)=>(B(),U(`div`,s1n,[S(`div`,c1n,[e.sessionRoleIcon?(B(),U(`span`,{key:0,class:c([`material-icons text-xs leading-none`,q(g9)])},T(e.sessionRoleIcon),3)):b(``,!0),e.sessionRoleName?(B(),U(`span`,l1n,T(e.sessionRoleName),1)):b(``,!0),e.sessionRoleName?(B(),ke(I$n,{key:2,model:e.sessionModel,override:e.sessionModelOverride,"onUpdate:override":n[0]||=e=>a(`update:sessionModelOverride`,e)},null,8,[`model`,`override`])):b(``,!0),S(`div`,u1n,[De(o1n,{results:e.results,"result-timestamps":e.resultTimestamps,"session-role-name":e.sessionRoleName},null,8,[`results`,`result-timestamps`,`session-role-name`]),S(`button`,{type:`button`,class:c([`h-8 w-8 flex items-center justify-center rounded text-gray-400 hover:text-gray-700 hover:bg-gray-100 transition-colors`,{"!text-blue-500":e.showRightSidebar}]),title:q(r)(`sidebarHeader.toolCallHistory`),"aria-label":q(r)(`sidebarHeader.toolCallHistory`),"aria-pressed":e.showRightSidebar,onClick:n[1]||=e=>a(`toggle-right-sidebar`)},[...n[5]||=[S(`span`,{class:`material-icons text-lg`,"aria-hidden":`true`},`build`,-1)]],10,d1n),De(S$n,{"model-value":e.layoutMode,"onUpdate:modelValue":n[2]||=e=>a(`update:layoutMode`,e)},null,8,[`model-value`])])]),S(`div`,f1n,[e.hasNewMessages?(B(),U(`button`,{key:0,type:`button`,class:`absolute bottom-3 left-1/2 -translate-x-1/2 z-10 flex items-center gap-1 rounded-full bg-blue-600 px-3 py-1.5 text-xs font-medium text-white shadow-lg hover:bg-blue-700 transition-colors`,"data-testid":`chat-new-messages`,onClick:n[3]||=e=>a(`jump-to-latest`)},[J(T(q(r)(`sidebarHeader.newMessages`))+` `,1),n[6]||=S(`span`,{class:`material-icons text-sm leading-none`,"aria-hidden":`true`},`arrow_downward`,-1)])):b(``,!0),S(`div`,{ref_key:`root`,ref:o,class:`flex-1 min-h-0 overflow-y-auto p-2 space-y-2 outline-none`,tabindex:`0`,"data-testid":`tool-results-scroll`,onMousedown:n[4]||=e=>a(`activate`)},[(B(!0),U(D,null,H(e.results,t=>(B(),U(`div`,{key:t.uuid,class:c([`relative cursor-pointer rounded border border-gray-300 text-sm text-gray-900 hover:opacity-75 transition-opacity`,t.uuid===e.selectedUuid?`ring-2 ring-blue-500`:``]),onClick:e=>a(`select`,t.uuid)},[S(`span`,m1n,T(i(t)),1),e.resultTimestamps.get(t.uuid)?(B(),U(`span`,h1n,T(q(QR)(e.resultTimestamps.get(t.uuid))),1)):b(``,!0),q(S5)(t.toolName)?.previewComponent?(B(),ke(fe(q(S5)(t.toolName)?.previewComponent),{key:1,result:t},null,8,[`result`])):(B(),U(`span`,g1n,T(t.title||t.toolName),1))],10,p1n))),128))],544)])]))}}),[[`__scopeId`,`data-v-1abed690`]]),w9=1e3,T9=60*w9,v1n=60*T9;function y1n(e){let t=e>0?e:0;return t<w9?`${(Math.floor(t/100)/10).toFixed(1)}s`:t<T9?`${Math.floor(t/w9)}s`:t<v1n?`${Math.floor(t/T9)}m ${Math.floor(t%T9/w9)}s`:`${Math.floor(t/v1n)}h ${Math.floor(t%v1n/T9)}m`}o(),we(),M();var b1n={class:`px-2 py-1 text-sm`,role:`status`,"aria-live":`polite`,"data-testid":`thinking-indicator`},x1n={class:`flex items-center gap-2 text-gray-500`},S1n={class:`text-xs`},C1n={key:0,class:`text-xs text-gray-400 tabular-nums`,"data-testid":`run-elapsed`},w1n={key:0,class:`mt-1 space-y-0.5`},T1n={class:`font-mono truncate`},E1n={class:`text-xs text-gray-300 tabular-nums shrink-0`},D1n=K({__name:`ThinkingIndicator`,props:{statusMessage:{},runElapsedMs:{default:null},pendingCalls:{default:()=>[]}},setup(e){return(t,n)=>(B(),U(`div`,b1n,[S(`div`,x1n,[S(`span`,S1n,T(e.statusMessage),1),n[0]||=S(`span`,{class:`flex gap-1`,"aria-hidden":`true`},[S(`span`,{class:`w-1.5 h-1.5 rounded-full bg-gray-400 animate-bounce`,style:{"animation-delay":`0ms`}}),S(`span`,{class:`w-1.5 h-1.5 rounded-full bg-gray-400 animate-bounce`,style:{"animation-delay":`150ms`}}),S(`span`,{class:`w-1.5 h-1.5 rounded-full bg-gray-400 animate-bounce`,style:{"animation-delay":`300ms`}})],-1),e.runElapsedMs!==null&&e.runElapsedMs>=1e3?(B(),U(`span`,C1n,` · `+T(q(y1n)(e.runElapsedMs)),1)):b(``,!0)]),e.pendingCalls&&e.pendingCalls.length>0?(B(),U(`div`,w1n,[(B(!0),U(D,null,H(e.pendingCalls,e=>(B(),U(`div`,{key:e.toolUseId,class:`flex items-center gap-1.5 text-xs text-gray-400`},[n[1]||=S(`span`,{class:`w-1.5 h-1.5 rounded-full bg-blue-300 shrink-0 animate-pulse`,"aria-hidden":`true`},null,-1),S(`span`,T1n,T(e.toolName),1),S(`span`,E1n,`· `+T(q(y1n)(e.elapsedMs)),1)]))),128))])):b(``,!0)]))}});o(),M(),we();var O1n=[`title`],k1n=[`title`],A1n=K({__name:`SessionCountBadges`,props:{activeSessionCount:{},unreadCount:{}},setup(e){let{t}=We();return(n,r)=>(B(),U(D,null,[e.activeSessionCount>0?(B(),U(`span`,{key:0,class:`absolute -top-0.5 -left-0.5 min-w-[1rem] h-4 px-0.5 bg-yellow-400 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none cursor-help`,"data-testid":`session-count-active`,title:q(t)(`sessionTabBar.activeSessions`,e.activeSessionCount,{named:{count:e.activeSessionCount}})},T(e.activeSessionCount),9,O1n)):b(``,!0),e.unreadCount>0?(B(),U(`span`,{key:1,class:`absolute -top-0.5 -right-0.5 min-w-[1rem] h-4 px-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none cursor-help`,"data-testid":`session-count-unread`,title:q(t)(`sessionTabBar.unreadReplies`,e.unreadCount,{named:{count:e.unreadCount}})},T(e.unreadCount),9,k1n)):b(``,!0)],64))}});o(),M(),we();var j1n=[`title`,`aria-label`,`aria-expanded`],M1n=[`aria-label`],N1n={class:`px-3 py-2 text-xs font-semibold text-gray-500 border-b border-gray-100`},P1n={class:`max-h-64 overflow-y-auto py-1 [scrollbar-width:thin]`},F1n=[`data-testid`],I1n=[`title`],L1n=[`title`,`aria-label`,`disabled`,`data-testid`,`onClick`],R1n=[`title`,`aria-label`,`disabled`,`data-testid`,`onClick`],z1n=K({__name:`ShortcutReorderPopover`,setup(e){let{t}=We(),{shortcuts:n,movePinned:r}=oL(),i=V(!1),a=V(null),o=V(null),s=V(null);async function l(e,t){await r(e.kind,e.slug,t)}let{handler:u}=_4({isOpen:i,buttonRef:o,popupRef:s});function d(e){e.key===`Escape`&&i.value&&(i.value=!1)}return P(()=>{document.addEventListener(`mousedown`,u),document.addEventListener(`keydown`,d)}),k(()=>{document.removeEventListener(`mousedown`,u),document.removeEventListener(`keydown`,d)}),(e,r)=>(B(),U(`div`,{ref_key:`wrapper`,ref:a,class:`relative inline-flex flex-none`},[S(`button`,{ref_key:`trigger`,ref:o,type:`button`,class:c([`h-8 w-8 flex items-center justify-center border border-gray-300 rounded bg-white text-gray-600 hover:bg-gray-50 transition-colors`,{"bg-blue-50 text-blue-600":i.value}]),title:q(t)(`shortcuts.reorder.open`),"aria-label":q(t)(`shortcuts.reorder.open`),"aria-expanded":i.value,"aria-haspopup":`true`,"data-testid":`shortcut-reorder-open`,onClick:r[0]||=e=>i.value=!i.value},[...r[1]||=[S(`span`,{class:`material-icons text-base`},`edit`,-1)]],10,j1n),i.value?(B(),U(`div`,{key:0,ref_key:`panel`,ref:s,class:`absolute right-0 top-full mt-1 z-50 w-64 max-w-[80vw] bg-white border border-gray-200 rounded-lg shadow-lg overflow-hidden`,role:`dialog`,"aria-label":q(t)(`shortcuts.reorder.title`),"data-testid":`shortcut-reorder-panel`},[S(`div`,N1n,T(q(t)(`shortcuts.reorder.title`)),1),S(`ul`,P1n,[(B(!0),U(D,null,H(q(n),(e,i)=>(B(),U(`li`,{key:`${e.kind}:${e.slug}`,class:`flex items-center gap-2 px-3 py-1 text-sm text-gray-900`,"data-testid":`shortcut-reorder-row-${e.kind}-${e.slug}`},[S(`span`,{class:c([`h-6 w-6 rounded flex items-center justify-center flex-none`,q(Tt)(e.color)??`text-gray-500`])},[De(q(Wa),{icon:e.icon,"size-class":`text-base`},null,8,[`icon`])],2),S(`span`,{class:`flex-1 truncate`,title:e.title},T(e.title),9,I1n),S(`button`,{type:`button`,class:`h-6 w-6 flex items-center justify-center rounded text-gray-400 hover:text-gray-700 hover:bg-gray-100 disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent`,title:q(t)(`shortcuts.reorder.moveUp`),"aria-label":q(t)(`shortcuts.reorder.moveUp`),disabled:i===0,"data-testid":`shortcut-reorder-up-${e.kind}-${e.slug}`,onClick:t=>l(e,`up`)},[...r[2]||=[S(`span`,{class:`material-icons text-base`},`arrow_upward`,-1)]],8,L1n),S(`button`,{type:`button`,class:`h-6 w-6 flex items-center justify-center rounded text-gray-400 hover:text-gray-700 hover:bg-gray-100 disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent`,title:q(t)(`shortcuts.reorder.moveDown`),"aria-label":q(t)(`shortcuts.reorder.moveDown`),disabled:i===q(n).length-1,"data-testid":`shortcut-reorder-down-${e.kind}-${e.slug}`,onClick:t=>l(e,`down`)},[...r[3]||=[S(`span`,{class:`material-icons text-base`},`arrow_downward`,-1)]],8,R1n)],8,F1n))),128))])],8,M1n)):b(``,!0)],512))}});o(),we(),M();var B1n={class:`inline-flex max-w-full items-center gap-2 text-xs`,"data-testid":`plugin-launcher`},V1n={class:`inline-flex flex-none items-stretch border border-gray-300 rounded`},H1n=[`title`,`aria-label`],U1n=[`title`,`aria-label`,`data-testid`,`onClick`],W1n={class:`material-icons text-base`},G1n=[`aria-label`],K1n=[`title`,`aria-label`,`data-testid`,`onClick`],q1n=K({__name:`PluginLauncher`,props:{activeViewMode:{},shortcuts:{},activeSessionCount:{},unreadCount:{}},emits:[`navigate`,`navigateShortcut`,`navigateChat`],setup(e,{emit:t}){let{t:n}=We(),r=PI(),i=e,a=m(()=>i.shortcuts??[]),o=m(()=>r.name===AP.chat),s=m(()=>i.activeSessionCount??0),l=m(()=>i.unreadCount??0),u=m(()=>{let e=[n(`pluginLauncher.chat.label`)];return s.value>0&&e.push(n(`sessionTabBar.activeSessions`,s.value,{named:{count:s.value}})),l.value>0&&e.push(n(`sessionTabBar.unreadReplies`,l.value,{named:{count:l.value}})),e.join(`, `)}),d=[{key:`dashboard`,kind:`view`,icon:`dashboard`},{key:`wiki`,kind:`view`,icon:`menu_book`},{key:`collections`,kind:`view`,icon:`apps`},{key:`feeds`,kind:`view`,icon:`rss_feed`},{key:`accounting`,kind:`view`,icon:`account_balance`},{key:`files`,kind:`view`,icon:`folder`},{key:`automations`,kind:`view`,icon:`schedule`},{key:`debug`,kind:`view`,icon:`bug_report`,devOnly:!0,literalLabel:`Debug`,literalTitle:`Open debug playground (dev mode only)`}],f=m(()=>d.filter(e=>!e.devOnly||!1));function p(e){return i.activeViewMode===e.key}let h={collection:AP.collections,feed:AP.feeds};function g(e){return i.activeViewMode===h[e.kind]&&r.params.slug===e.slug}function _(e){if(g(e))return`bg-blue-50 text-blue-600`;let t=Tt(e.color);return t?`${t} hover:brightness-95`:`bg-white text-gray-600 hover:bg-gray-50`}let v=t;return(e,t)=>(B(),U(`div`,B1n,[S(`div`,V1n,[S(`button`,{class:c([`relative h-8 w-8 flex items-center justify-center rounded-l border-r border-gray-200 transition-colors`,o.value?`bg-blue-50 text-blue-600`:`bg-white text-gray-600 hover:bg-gray-50`]),title:u.value,"aria-label":u.value,"data-testid":`plugin-launcher-chat`,onClick:t[0]||=e=>v(`navigateChat`)},[t[1]||=S(`span`,{class:`material-icons text-base`},`forum`,-1),De(A1n,{"active-session-count":s.value,"unread-count":l.value},null,8,[`active-session-count`,`unread-count`])],10,H1n),(B(!0),U(D,null,H(f.value,e=>(B(),U(`button`,{key:e.key,class:c([`h-8 w-8 flex items-center justify-center border-r border-gray-200 last:border-r-0 last:rounded-r transition-colors`,p(e)?`bg-blue-50 text-blue-600`:`bg-white text-gray-600 hover:bg-gray-50`]),title:e.literalTitle??q(n)(`pluginLauncher.${e.key}.label`),"aria-label":e.literalLabel??q(n)(`pluginLauncher.${e.key}.label`),"data-testid":`plugin-launcher-${e.key}`,onClick:t=>v(`navigate`,e)},[S(`span`,W1n,T(e.icon),1)],10,U1n))),128))]),a.value.length>0?(B(),U(`div`,{key:0,class:`inline-flex min-w-0 items-stretch border border-gray-300 rounded overflow-x-auto [scrollbar-width:thin]`,"aria-label":q(n)(`shortcuts.zoneAriaLabel`),"data-testid":`plugin-launcher-shortcuts`},[(B(!0),U(D,null,H(a.value,e=>(B(),U(`button`,{key:`${e.kind}:${e.slug}`,class:c([`h-8 w-8 flex items-center justify-center flex-none border-r border-gray-200 last:border-r-0 transition-colors`,_(e)]),title:e.title,"aria-label":e.title,"data-testid":`plugin-launcher-shortcut-${e.kind}-${e.slug}`,onClick:t=>v(`navigateShortcut`,e)},[De(q(Wa),{icon:e.icon,"size-class":`text-base`},null,8,[`icon`])],10,K1n))),128))],8,G1n)):b(``,!0),a.value.length>1?(B(),ke(z1n,{key:1})):b(``,!0)]))}});o(),M();var E9=V([]),D9=V({}),O9=V(null),k9=V(!1),A9=null;function j9(){return{tiles:E9.value,rowHeights:D9.value}}function M9(e){E9.value=e.tiles,D9.value=e.rowHeights}async function N9(e=!1){return A9&&!e||(A9=(async()=>{let e=await bN(kP.dashboard);e.ok?(O9.value=null,M9({tiles:e.data.tiles,rowHeights:e.data.rowHeights??{}}),k9.value=!0):(O9.value=e.error,A9=null)})()),A9}var{enqueue:P9}=Yut();async function F9(e,t){M9(e);let n=await SN(kP.dashboard,{tiles:e.tiles,rowHeights:e.rowHeights});return n.ok?(M9({tiles:n.data.tiles,rowHeights:n.data.rowHeights??e.rowHeights}),O9.value=null,!0):(M9(t),O9.value=n.error,console.error(`[useDashboard] persist failed`,n.error),!1)}function J1n(e){return P9(async()=>(await N9(),k9.value?F9({tiles:e,rowHeights:D9.value},j9()):!1))}function Y1n(e,t){return P9(async()=>{if(await N9(),!k9.value)return!1;if(!E9.value.some(t=>t.slug===e))return!0;let n=j9();return F9({tiles:n.tiles.map(n=>{if(n.slug!==e)return n;if(t===null){let{viewMode:e,...t}=n;return t}return{...n,viewMode:t}}),rowHeights:n.rowHeights},n)})}function X1n(e,t,n){return P9(async()=>{if(await N9(),!k9.value)return!1;if(e<1||t<0)return!0;let r=j9(),i=String(e),a=[...r.rowHeights[i]??[]];for(;a.length<=t;)a.push(0);a[t]=n;let o={...r.rowHeights,[i]:a};return F9({tiles:r.tiles,rowHeights:o},r)})}function Z1n(e){return P9(async()=>{if(await N9(),!k9.value)return;let t=new Set(e),n=E9.value.filter(e=>t.has(e.slug)),r=new Set(n.map(e=>e.slug)),i=e.filter(e=>!r.has(e)).map(e=>({slug:e})),a=[...n,...i];(a.length!==E9.value.length||a.some((e,t)=>e.slug!==E9.value[t]?.slug))&&await F9({tiles:a,rowHeights:D9.value},j9())})}function Q1n(){return N9(),{tiles:m(()=>E9.value),rowHeights:m(()=>D9.value),loadError:m(()=>O9.value),load:N9,setTiles:J1n,setViewMode:Y1n,setRowHeight:X1n,reconcile:Z1n}}o(),M(),we(),le();var $1n={key:0,class:`h-full flex flex-col items-center justify-center text-center text-slate-500 gap-2`},e0n={class:`text-sm font-medium`},t0n={class:`text-xs`},n0n={key:1,class:`grid gap-4 sm:grid-cols-2`,"data-testid":`dashboard-grid`},r0n=[`data-dashboard-index`,`data-testid`],i0n={class:`flex items-center gap-2 px-3 py-2 border-b border-slate-100 bg-slate-50`},a0n=[`title`,`aria-label`,`onPointerdown`],o0n=[`title`,`onClick`,`onDblclick`],s0n={class:`truncate`},c0n=[`value`,`aria-label`,`data-testid`,`onChange`],l0n=[`value`],u0n=[`title`,`aria-label`,`data-testid`,`onPointerdown`],d0n=320,f0n=160,p0n=900,m0n=`(min-width: 640px)`,h0n=K({__name:`DashboardView`,setup(e){let{t}=We(),n=NI(),{shortcuts:r,load:i}=oL(),{tiles:a,rowHeights:o,load:l,reconcile:d,setTiles:f,setViewMode:p,setRowHeight:h}=Q1n(),g=m(()=>r.value.filter(e=>e.kind===`collection`)),_=m(()=>g.value.map(e=>e.slug)),v=e=>g.value.find(t=>t.slug===e),y=V({});async function b(e){if(y.value[e])return;let t=await bN(kP.collections.detail.replace(`:slug`,encodeURIComponent(e)));t.ok&&(y.value={...y.value,[e]:t.data.collection.schema})}function x(e){let t=y.value[e];return t?SQe(t):[`table`]}function C(e){let t=x(e.slug);return t.find(t=>t===e.viewMode)??t[0]??`table`}let w={table:`dashboard.viewTable`,calendar:`dashboard.viewCalendar`,kanban:`dashboard.viewKanban`};function E(e,n){let r=w[n];return r?t(r):y.value[e]?.views?.find(e=>sN(e.id)===n)?.label??n}function O(e,t){let{target:n}=t;n instanceof HTMLSelectElement&&p(e,n.value)}function A(e){n.push({name:AP.collections,params:{slug:e}}).catch(()=>{})}function j(e,t){e.detail===0&&A(t)}function M(e){let{currentTarget:t}=e;if(!(t instanceof HTMLElement))return null;try{t.setPointerCapture(e.pointerId)}catch{}return t}let N=V(null),F=V(null),I=V(!1),R=null;function z(e,t){let n=document.elementFromPoint(e,t)?.closest(`[data-dashboard-index]`);if(!n)return null;let r=Number(n.dataset.dashboardIndex);return Number.isNaN(r)?null:r}function ee(e){R&&(e.preventDefault(),F.value=z(e.clientX,e.clientY))}function te(){window.removeEventListener(`pointermove`,ee),window.removeEventListener(`pointerup`,ne),window.removeEventListener(`pointercancel`,ne),I.value=!1}function ne(){if(te(),!R)return;let{startIndex:e,handle:t,pointerId:n}=R,r=F.value;R=null,N.value=null,F.value=null;try{t.releasePointerCapture(n)}catch{}if(r===null||r===e)return;let i=[...a.value],[o]=i.splice(e,1);o&&(i.splice(r,0,o),f(i))}function re(e,t){let n=M(t);n&&(R={startIndex:e,handle:n,pointerId:t.pointerId},N.value=e,I.value=!0,window.addEventListener(`pointermove`,ee),window.addEventListener(`pointerup`,ne),window.addEventListener(`pointercancel`,ne))}let ie=V(2),ae=null;function oe(){ie.value=ae?.matches?2:1}function W(e){return Math.floor(e/ie.value)}let se=V({});function ce(e,t){return`${e}:${t}`}function le(e){let t=W(e),n=se.value[ce(ie.value,t)];if(n!==void 0)return n;let r=o.value[String(ie.value)]?.[t];return r&&r>0?r:d0n}let ue=V(!1),de=null,fe=null,G=0;function pe(){if(G=0,!de||fe===null)return;let e=Math.min(p0n,Math.max(f0n,de.startHeight+(fe-de.startY)));se.value={...se.value,[ce(de.cols,de.row)]:e}}function me(e){de&&(e.preventDefault(),fe=e.clientY,G||=requestAnimationFrame(pe))}function he(e,t){let n=ce(e,t);se.value=Object.fromEntries(Object.entries(se.value).filter(([e])=>e!==n))}async function ge(e,t,n){await h(e,t,Math.round(n)),he(e,t)}function _e(){window.removeEventListener(`pointermove`,me),window.removeEventListener(`pointerup`,ve),window.removeEventListener(`pointercancel`,ve),G&&cancelAnimationFrame(G),G=0,fe=null,ue.value=!1}function ve(){if(_e(),!de)return;let{cols:e,row:t,handle:n,pointerId:r}=de;de=null;try{n.releasePointerCapture(r)}catch{}let i=se.value[ce(e,t)];i!==void 0&&ge(e,t,i)}function K(e,t){let n=M(t);n&&(de={cols:ie.value,row:W(e),startY:t.clientY,startHeight:le(e),handle:n,pointerId:t.pointerId},ue.value=!0,window.addEventListener(`pointermove`,me),window.addEventListener(`pointerup`,ve),window.addEventListener(`pointercancel`,ve))}return k(()=>{_e(),te(),ae?.removeEventListener(`change`,oe)}),P(async()=>{ae=window.matchMedia(m0n),oe(),ae.addEventListener(`change`,oe),await Promise.all([i(),l()]),await d(_.value)}),Ve(_,e=>void d(e)),Ve(a,e=>e.forEach(e=>void b(e.slug)),{immediate:!0}),(e,n)=>(B(),U(`div`,{class:c([`h-full overflow-auto p-4`,{"select-none":ue.value||I.value}]),"data-testid":`dashboard-view`},[_.value.length===0?(B(),U(`div`,$1n,[n[0]||=S(`span`,{class:`material-icons text-4xl text-slate-300`},`dashboard`,-1),S(`p`,e0n,T(q(t)(`dashboard.empty`)),1),S(`p`,t0n,T(q(t)(`dashboard.emptyHint`)),1)])):(B(),U(`div`,n0n,[(B(!0),U(D,null,H(q(a),(e,r)=>u((B(),U(`section`,{key:e.slug,class:c([`flex flex-col border border-slate-200 rounded-lg bg-white overflow-hidden shadow-sm transition-opacity`,{"ring-2 ring-indigo-400":F.value===r&&N.value!==r,"opacity-50":N.value===r}]),"data-dashboard-index":r,"data-testid":`dashboard-tile-${e.slug}`},[S(`header`,i0n,[S(`span`,{class:`material-icons text-base text-slate-400 cursor-grab select-none touch-none`,title:q(t)(`dashboard.dragHint`),"aria-label":q(t)(`dashboard.dragHint`),"data-testid":`dashboard-tile-drag`,onPointerdown:s(e=>re(r,e),[`prevent`])},`drag_indicator`,40,a0n),S(`button`,{type:`button`,class:`flex items-center gap-1.5 min-w-0 flex-1 text-left text-sm font-semibold text-slate-700 hover:text-indigo-600`,title:q(t)(`dashboard.openFull`),onClick:t=>j(t,e.slug),onDblclick:t=>A(e.slug)},[S(`span`,{class:c([`h-6 w-6 rounded flex items-center justify-center flex-none`,q(Tt)(v(e.slug)?.color)??``])},[De(q(Wa),{icon:v(e.slug)?.icon,fallback:`apps`,"size-class":`text-base`},null,8,[`icon`])],2),S(`span`,s0n,T(v(e.slug)?.title||e.slug),1)],40,o0n),S(`select`,{class:`flex-none text-xs bg-white border border-slate-200 rounded px-1.5 py-1 text-slate-600 focus:outline-none focus:ring-2 focus:ring-indigo-500/20`,value:C(e),"aria-label":q(t)(`dashboard.viewPickerLabel`),"data-testid":`dashboard-tile-view-${e.slug}`,onChange:t=>O(e.slug,t)},[(B(!0),U(D,null,H(x(e.slug),t=>(B(),U(`option`,{key:t,value:t},T(E(e.slug,t)),9,l0n))),128))],40,c0n)]),S(`div`,{class:`overflow-auto`,style:xe({height:`${le(r)}px`})},[(B(),ke(q(pN),{key:`${e.slug}:${C(e)}`,slug:e.slug,"initial-view":C(e),"hide-view-toggle":``,"hide-header":``,"hide-search":``},null,8,[`slug`,`initial-view`]))],4),S(`div`,{class:`h-2 flex-none cursor-row-resize bg-slate-100 hover:bg-indigo-200 transition-colors flex items-center justify-center`,title:q(t)(`dashboard.resizeHint`),"aria-label":q(t)(`dashboard.resizeHint`),"data-testid":`dashboard-tile-resize-${e.slug}`,onPointerdown:s(e=>K(r,e),[`prevent`])},[...n[1]||=[S(`span`,{class:`h-0.5 w-8 rounded-full bg-slate-300`},null,-1)]],40,u0n)],10,r0n)),[[L,v(e.slug)]])),128))]))],2))}}),g0n=3e4,_0n=.85;function v0n(e,t){if(!Number.isFinite(e)||e<=0)return 0;if(!Number.isFinite(t)||t<=0)return Math.min(e,g0n);let n=Math.max(1,Math.floor(t*_0n));return Math.min(e,g0n,n)}function y0n(e,t=80){return e.scrollHeight-e.scrollTop-e.clientHeight<=t}function b0n(e){for(let t of e.querySelectorAll(`*`)){if(t.scrollHeight<=t.clientHeight)continue;let e=getComputedStyle(t);if(e.overflowY===`auto`||e.overflowY===`scroll`||e.overflow===`auto`||e.overflow===`scroll`)return t}return null}function x0n(e,t,n){let r=[],i=new Map;for(let a of e){let e=t(a);if(e===null){r.push({key:n(a),head:a,members:[a],isGroup:!1});continue}let o=i.get(e);if(o!==void 0){o.members.push(a),o.head=a;continue}let s={key:`group:${e}`,head:a,members:[a],isGroup:!0};i.set(e,s),r.push(s)}return r}function S0n(e,t,n,r){let i=null;for(let a of e){let e=t(a.head),o=n(e);if(o!==null){if(o<=r)i=e;else break}}return i}function C0n(e,t,n){if(t===void 0)return{kind:`none`};let r=n(t),i=e=>e.members.some(e=>n(e)===r),a=e[e.length-1];if(a!==void 0&&i(a))return{kind:`bottom`};let o=e.find(i);return o===void 0?{kind:`none`}:{kind:`card`,headUuid:n(o.head)}}o(),M(),we();var w0n={class:`h-full flex flex-col bg-gray-50`},T0n={class:`shrink-0 flex items-center gap-1 text-xs text-gray-400 px-4 pt-3 pb-2`,"data-testid":`stack-role-header`},E0n={key:1},D0n={class:`ml-auto flex items-center gap-0.5`},O0n=[`title`,`aria-label`,`aria-pressed`],k0n={key:0,class:`flex-1 flex flex-col items-center justify-center h-full px-6 text-center`,"data-testid":`stack-empty`},A0n={key:1,class:`text-lg font-medium text-gray-700 mb-4`},j0n={key:2,class:`flex flex-wrap gap-2 justify-center max-w-xl`},M0n=[`onClick`],N0n={key:3,class:`text-sm text-gray-500`},P0n=[`title`,`onClick`],F0n={class:`material-icons text-sm text-gray-400`},I0n={class:`text-sm font-medium text-gray-800 truncate`},L0n={key:0,class:`text-[10px] text-gray-400 shrink-0`},R0n={key:1,class:`text-[10px] text-gray-400 shrink-0`},z0n={class:`font-mono text-xs text-gray-400 shrink-0`},B0n={key:0,class:`stack-text-response`},V0n={key:1,class:`h-full overflow-auto p-4 text-xs text-gray-500 whitespace-pre-wrap`},H0n=`min(60vh, 560px)`,U0n=150,W0n=Qe(K({__name:`StackView`,props:{toolResults:{},selectedResultUuid:{},resultTimestamps:{},sendTextMessage:{type:Function},queries:{},sessionRoleName:{},sessionRoleIcon:{},sessionModel:{},sessionModelOverride:{},layoutMode:{},showRightSidebar:{type:Boolean},googleMapKey:{}},emits:[`select`,`updateResult`,`update:layoutMode`,`toggle-right-sidebar`,`update:sessionModelOverride`],setup(e,{emit:t}){let{t:n}=We(),r={[bI.presentMulmoScript]:`min(85vh, 820px)`};function i(e){return r[e]??H0n}let a=new Set([`presentHtml`,`presentDocument`,`presentSpreadsheet`,`manageWiki`,`presentChart`,`skill`]);function o(e){return a.has(e)}let s=e;function l(e){return e===bI.mapControl?s.googleMapKey??null:null}let u=t,d=V(null),f=V(!0),p=new Map,h=new Map;function g(e){let{toolName:t,uuid:n}=e;typeof t==`string`&&typeof n==`string`&&u(`updateResult`,{...e,toolName:t,uuid:n})}function v(e,t){t?p.set(e,t):p.delete(e)}let y=e=>e instanceof HTMLElement?e:null;function x(e,t){let n=y(t);n?(h.set(e,n),be(()=>O(n))):h.delete(e)}function C(e){if(e.toolName!==bI.mapControl)return null;let{data:t}=e;if(!Na(t))return null;let{groupId:n}=t;return typeof n==`string`&&n.length>0?n:null}let w=m(()=>x0n(s.toolResults,C,e=>e.uuid));function E(e,t){let n=y(t);for(let t of e)v(t.uuid,n)}function O(e){let t=e.querySelectorAll(`iframe`);for(let e of t){if(e.dataset.stackSized===`true`)continue;e.dataset.stackSized=`true`;let t=()=>I(e);e.addEventListener(`load`,t);try{e.contentDocument?.readyState===`complete`&&t()}catch{}}}let k=new WeakMap,A=new Map,j=null;function M(e){let t=k.get(e);if(t&&t.isConnected)return t;for(let t of h.values())for(let n of t.querySelectorAll(`iframe`)){let t=n.contentWindow;if(t&&(k.set(t,n),t===e))return n}return null}function N(){j=null;for(let[e,t]of A)e.isConnected&&e.style.setProperty(`height`,`${t}px`,`important`);A.clear()}function F(e){let{data:t}=e;if(!Na(t)||t.type!==`mc-iframe-height`)return;let n=t.height;if(typeof n!=`number`)return;let{source:r}=e;if(!r)return;let i=M(r);if(!i)return;let a=v0n(n,window.innerHeight);a<=0||(A.set(i,a),j===null&&(j=requestAnimationFrame(N)))}function I(e){try{let t=e.contentDocument;if(!t)return;let n=v0n(Math.max(t.documentElement?.scrollHeight??0,t.body?.scrollHeight??0),window.innerHeight);if(n<=0)return;e.style.height=`${n}px`}catch{}}function L(e){if(e.toolName!==`text-response`)return!1;let{data:t}=e;return Na(t)?typeof t.text==`string`:!1}function R(e){return e===`text-response`?`chat`:`extension`}let z=!1,ee=null,te=null,ne=null;function re(){z=!0,ee!==null&&clearTimeout(ee),ee=setTimeout(()=>{z=!1,ee=null},U0n)}function ie(e){let t=parseFloat(getComputedStyle(e).paddingTop);return Number.isFinite(t)?t:0}function ae(){if(!d.value)return null;let e=d.value,t=e.getBoundingClientRect().top+ie(e);return S0n(w.value,e=>e.uuid,e=>{let t=p.get(e);return t?t.getBoundingClientRect().top:null},t)}function oe(){z||(d.value&&(f.value=y0n(d.value)),te===null&&(te=requestAnimationFrame(()=>{if(te=null,z)return;let e=ae();e&&e!==s.selectedResultUuid&&(ne=e,u(`select`,e))})))}Ve(()=>s.selectedResultUuid,e=>{e&&(ne===e?ne=null:(ne=null,be(()=>{let t=p.get(e);t&&(re(),t.scrollIntoView({block:`start`,behavior:`auto`}))})))});let W=m(()=>{let e=s.toolResults,t=e[e.length-1];return`${e.length}:${t?.uuid??``}:${t?.message?.length??0}`});return Ve(W,()=>{be(()=>{if(d.value&&f.value){re();let e=s.toolResults[s.toolResults.length-1],t=C0n(w.value,e,e=>e.uuid);if(t.kind===`bottom`)d.value.scrollTop=d.value.scrollHeight;else if(t.kind===`card`){let e=p.get(t.headUuid);e&&e.scrollIntoView({block:`nearest`,behavior:`auto`})}}for(let e of h.values())O(e)})}),Ve(d,(e,t)=>{t?.removeEventListener(`scroll`,oe),e?.addEventListener(`scroll`,oe,{passive:!0})},{immediate:!0}),P(()=>{window.addEventListener(`message`,F),be(()=>{if(!s.selectedResultUuid)return;let e=p.get(s.selectedResultUuid);e&&(re(),e.scrollIntoView({block:`start`,behavior:`auto`}))})}),_(()=>{d.value?.removeEventListener(`scroll`,oe),window.removeEventListener(`message`,F),te!==null&&cancelAnimationFrame(te),ee!==null&&clearTimeout(ee),j!==null&&cancelAnimationFrame(j),A.clear(),h.clear()}),(t,r)=>(B(),U(`div`,w0n,[S(`div`,T0n,[e.sessionRoleIcon?(B(),U(`span`,{key:0,class:c([`material-icons text-xs leading-none`,q(g9)])},T(e.sessionRoleIcon),3)):b(``,!0),e.sessionRoleName?(B(),U(`span`,E0n,T(e.sessionRoleName),1)):b(``,!0),e.sessionRoleName?(B(),ke(I$n,{key:2,model:e.sessionModel,override:e.sessionModelOverride,"onUpdate:override":r[0]||=e=>u(`update:sessionModelOverride`,e)},null,8,[`model`,`override`])):b(``,!0),S(`div`,D0n,[De(o1n,{results:e.toolResults,"result-timestamps":e.resultTimestamps,"session-role-name":e.sessionRoleName},null,8,[`results`,`result-timestamps`,`session-role-name`]),S(`button`,{type:`button`,class:c([`h-8 w-8 flex items-center justify-center rounded text-gray-400 hover:text-gray-700 hover:bg-gray-100 transition-colors`,{"!text-blue-500":e.showRightSidebar}]),title:q(n)(`sidebarHeader.toolCallHistory`),"aria-label":q(n)(`sidebarHeader.toolCallHistory`),"aria-pressed":e.showRightSidebar,onClick:r[1]||=e=>u(`toggle-right-sidebar`)},[...r[3]||=[S(`span`,{class:`material-icons text-lg`,"aria-hidden":`true`},`build`,-1)]],10,O0n),De(S$n,{"model-value":e.layoutMode,"onUpdate:modelValue":r[2]||=e=>u(`update:layoutMode`,e)},null,8,[`model-value`])])]),e.toolResults.length===0?(B(),U(`div`,k0n,[e.sessionRoleIcon?(B(),U(`span`,{key:0,class:c([`material-icons text-5xl text-gray-400 mb-2`,q(g9)]),"aria-hidden":`true`},T(e.sessionRoleIcon),3)):b(``,!0),e.sessionRoleName?(B(),U(`p`,A0n,T(e.sessionRoleName),1)):b(``,!0),e.queries&&e.queries.length>0&&e.sendTextMessage?(B(),U(`div`,j0n,[(B(!0),U(D,null,H(e.queries,(t,n)=>(B(),U(`button`,{key:`${n}-${t}`,type:`button`,class:`text-sm bg-gray-100 hover:bg-gray-200 text-gray-700 rounded-full px-4 py-2 border border-gray-300 transition-colors`,"data-testid":`stack-empty-query`,onClick:n=>e.sendTextMessage(t)},T(t),9,M0n))),128))])):(B(),U(`p`,N0n,T(q(n)(`app.startConversation`)),1))])):(B(),U(`div`,{key:1,ref_key:`containerRef`,ref:d,class:`flex-1 min-h-0 overflow-y-auto px-4 pb-4 space-y-3`,"data-testid":`stack-scroll`},[(B(!0),U(D,null,H(w.value,t=>(B(),U(`div`,{key:t.key,ref_for:!0,ref:e=>E(t.members,e),class:c([`bg-white rounded-lg border transition-colors`,t.members.some(t=>t.uuid===e.selectedResultUuid)?`border-blue-400 ring-2 ring-blue-200`:`border-gray-200`])},[S(`button`,{class:`w-full flex items-center gap-2 px-3 py-2 border-b border-gray-100 text-left hover:bg-gray-50`,title:t.head.title||t.head.toolName,onClick:e=>u(`select`,t.head.uuid)},[S(`span`,F0n,T(R(t.head.toolName)),1),S(`span`,I0n,T(t.head.title||t.head.toolName),1),t.isGroup&&t.members.length>1?(B(),U(`span`,L0n,T(`${t.members.length}×`),1)):b(``,!0),e.resultTimestamps.get(t.head.uuid)?(B(),U(`span`,R0n,T(q(QR)(e.resultTimestamps.get(t.head.uuid))),1)):b(``,!0),S(`span`,z0n,T(t.head.toolName),1)],8,P0n),L(t.head)?(B(),U(`div`,B0n,[De(q(d4),{"selected-result":t.head,onUpdateResult:g},null,8,[`selected-result`])])):o(t.head.toolName)?(B(),U(`div`,{key:1,ref_for:!0,ref:e=>x(t.head.uuid,e),class:`stack-natural`},[q(S5)(t.head.toolName)?.viewComponent?(B(),ke(fe(q(S5)(t.head.toolName)?.viewComponent),{key:`${t.key}-${l(t.head.toolName)??``}`,"selected-result":t.head,"send-text-message":e.sendTextMessage,"google-map-key":l(t.head.toolName),onUpdateResult:g},null,40,[`selected-result`,`send-text-message`,`google-map-key`])):b(``,!0)],512)):(B(),U(`div`,{key:2,style:xe({height:i(t.head.toolName)})},[q(S5)(t.head.toolName)?.viewComponent?(B(),ke(fe(q(S5)(t.head.toolName)?.viewComponent),{key:`${t.key}-${l(t.head.toolName)??``}`,"selected-result":t.head,results:t.isGroup?t.members:void 0,"send-text-message":e.sendTextMessage,"google-map-key":l(t.head.toolName),onUpdateResult:g},null,40,[`selected-result`,`results`,`send-text-message`,`google-map-key`])):(B(),U(`pre`,V0n,T(JSON.stringify(t.head,null,2)),1))],4))],2))),128))],512))]))}}),[[`__scopeId`,`data-v-7bdfeccd`]]),G0n=`files_expanded_dirs`,K0n=[``];function q0n(e){if(e===null)return new Set(K0n);try{let t=JSON.parse(e);if(!Array.isArray(t))return new Set(K0n);let n=t.filter(e=>typeof e==`string`);return new Set(n)}catch{return new Set(K0n)}}function J0n(e){return JSON.stringify([...e])}M(),o();function Y0n(){if(typeof localStorage>`u`)return q0n(null);try{return q0n(localStorage.getItem(G0n))}catch{return q0n(null)}}var I9=V(Y0n());Ve(I9,e=>{try{localStorage.setItem(G0n,J0n(e))}catch{}});function X0n(){function e(e){return I9.value.has(e)}function t(e){let t=new Set(I9.value);t.has(e)?t.delete(e):t.add(e),I9.value=t}function n(e){if(I9.value.has(e))return;let t=new Set(I9.value);t.add(e),I9.value=t}function r(){return Array.from(I9.value)}return{isExpanded:e,toggle:t,expand:n,expandedPaths:r}}o(),M();var Z0n=null;function L9(e){return e.dataTransfer?.types.includes(`Files`)??!1}function Q0n(){r2n()}var $0n=V(0),e2n=null;function t2n(){if(e2n!==null||typeof window>`u`)return;let e=()=>{$0n.value+=1};window.addEventListener(`drop`,e),window.addEventListener(`dragend`,e),e2n=e}function n2n(){return r2n(),t2n(),$0n}function r2n(){if(Z0n!==null||typeof window>`u`)return;let e=e=>{L9(e)&&e.preventDefault()};window.addEventListener(`dragover`,e),window.addEventListener(`drop`,e),Z0n=e}function i2n(e){r2n();let t=V(!1),n=0;function r(e){L9(e)&&(e.preventDefault(),n+=1,t.value=!0)}function i(e){L9(e)&&e.preventDefault()}function a(){n!==0&&(--n,n<=0&&s())}function o(t){if(!L9(t))return;t.preventDefault(),s();let n=t.dataTransfer?.files;n&&n.length>0&&e.onFiles(Array.from(n))}function s(){n=0,t.value=!1}return P(()=>{typeof window<`u`&&(window.addEventListener(`drop`,s),window.addEventListener(`dragend`,s))}),k(()=>{typeof window<`u`&&(window.removeEventListener(`drop`,s),window.removeEventListener(`dragend`,s))}),{isDragging:t,onDragenter:r,onDragover:i,onDragleave:a,onDrop:o}}function a2n(e,t){let n=e.slice();return n.sort((e,n)=>{if(e.type!==n.type)return e.type===`dir`?-1:1;if(t===`recent`){let t=e.modifiedMs??-1/0,r=n.modifiedMs??-1/0;if(t!==r)return r-t}return e.name.localeCompare(n.name)}),n}var o2n=[{kind:`exact`,path:`config/mcp.json`,descriptor:{id:`mcp`,schemaRef:`server/system/config.ts`,editPolicy:`user-editable`}},{kind:`exact`,path:`config/settings.json`,descriptor:{id:`settings`,schemaRef:`server/system/config.ts`,editPolicy:`user-editable`}},{kind:`exact`,path:`config/scheduler/tasks.json`,descriptor:{id:`schedulerTasks`,schemaRef:`server/utils/files/user-tasks-io.ts`,editPolicy:`agent-managed`}},{kind:`exact`,path:`config/scheduler/overrides.json`,descriptor:{id:`schedulerOverrides`,schemaRef:`server/utils/files/scheduler-io.ts`,editPolicy:`agent-managed`}},{kind:`exact`,path:`data/scheduler/items.json`,descriptor:{id:`schedulerItems`,schemaRef:`server/utils/files/scheduler-io.ts`,editPolicy:`agent-managed`}},{kind:`exact`,path:`data/wiki/index.md`,descriptor:{id:`wikiIndex`,editPolicy:`agent-managed`}},{kind:`exact`,path:`data/wiki/log.md`,descriptor:{id:`wikiLog`,editPolicy:`agent-managed`}},{kind:`exact`,path:`data/wiki/summary.md`,descriptor:{id:`wikiSummary`,editPolicy:`agent-managed`}},{kind:`exact`,path:`data/wiki/SCHEMA.md`,descriptor:{id:`wikiSchema`,editPolicy:`fragile-format`}},{kind:`exact`,path:`conversations/memory.md`,descriptor:{id:`memory`,schemaRef:`server/agent/prompt.ts`,editPolicy:`agent-managed-but-hand-editable`}},{kind:`exact`,path:`conversations/summaries/_index.md`,descriptor:{id:`summariesIndex`,editPolicy:`agent-managed`}},{kind:`pattern`,regex:/^config\/roles\/[^/]+\.json$/,descriptor:{id:`rolesJson`,schemaRef:`src/config/roles.ts`,editPolicy:`user-editable`}},{kind:`pattern`,regex:/^config\/roles\/[^/]+\.md$/,descriptor:{id:`rolesMd`,schemaRef:`src/config/roles.ts`,editPolicy:`user-editable`}},{kind:`pattern`,regex:/^conversations\/summaries\/daily\/\d{4}\/\d{2}\/\d{2}\.md$/,descriptor:{id:`journalDaily`,editPolicy:`agent-managed`}},{kind:`pattern`,regex:/^conversations\/summaries\/topics\/[^/]+\.md$/,descriptor:{id:`journalTopic`,editPolicy:`agent-managed`}}];function s2n(e){for(let t of o2n)if(t.kind===`exact`&&t.path===e||t.kind===`pattern`&&t.regex.test(e))return t.descriptor;return null}var c2n=new Set([`user-editable`,`agent-managed-but-hand-editable`]);function l2n(e){let t=s2n(e);return t===null||c2n.has(t.editPolicy)}var u2n={"agent-managed-but-hand-editable":`text-emerald-500`,"user-editable":`text-blue-500`,"agent-managed":`text-amber-500`,"fragile-format":`text-orange-500`,ephemeral:`text-gray-400`},d2n=[`data`,`artifacts`,`config`];function f2n(e){return d2n.includes(e)}var p2n=[{folder:`data/wiki/pages`,extension:`.md`,placeholderKey:`fileTree.newFilePlaceholder.wikiPage`},{folder:`conversations/summaries`,extension:`.md`,placeholderKey:`fileTree.newFilePlaceholder.summary`},{folder:`artifacts/documents`,extension:`.md`,placeholderKey:`fileTree.newFilePlaceholder.document`},{folder:`artifacts/html`,extension:`.html`,placeholderKey:`fileTree.newFilePlaceholder.html`},{folder:`artifacts/stories`,extension:`.json`,placeholderKey:`fileTree.newFilePlaceholder.story`}];function m2n(e){return p2n.find(t=>t.folder===e)??null}function h2n(e,t){let n=e.trim().replace(/\.[a-z0-9]+$/i,``);return n.length===0?{ok:!1,reason:`empty`}:EXe(n)?{ok:!0,filename:n+t.extension}:{ok:!1,reason:`unsafe`}}o(),M(),we(),le();var g2n=[`data-testid`,`data-drop-target`,`title`],_2n={class:`material-icons text-sm text-gray-400 shrink-0`},v2n={class:`text-gray-700 truncate`},y2n=[`data-testid`,`data-selected`,`title`],b2n={class:`truncate`},x2n=[`title`],S2n={key:2,class:`pl-4`},C2n=[`data-testid`],w2n=[`placeholder`,`aria-label`],T2n={class:`text-xs text-gray-400 font-mono shrink-0 select-none`},E2n={key:1,class:`px-2 py-1 text-xs text-red-600`,"data-testid":`file-tree-new-file-error`},D2n={key:2,class:`px-2 py-1 text-xs text-gray-400`},O2n=`text-gray-400`,k2n=K({__name:`FileTree`,props:{node:{},selectedPath:{},recentPaths:{},childrenByPath:{},sortMode:{},showHiddenSystem:{type:Boolean},allowUpload:{type:Boolean}},emits:[`select`,`loadChildren`,`uploadFiles`,`createFile`],setup(e,{emit:t}){let{t:n}=We(),r=e,i=t,{isExpanded:a,toggle:o,expand:l}=X0n(),d=m(()=>a(r.node.path)),f=m(()=>r.childrenByPath.get(r.node.path)),p=m(()=>f.value===null),h=m(()=>Array.isArray(f.value)?a2n(f.value,r.sortMode):[]),g=m(()=>r.node.path===``),_=m(()=>!g.value||r.showHiddenSystem?h.value:h.value.filter(e=>e.type===`dir`&&f2n(e.name)));Ve([d,f],([e,t])=>{e&&r.node.type===`dir`&&t===void 0&&i(`loadChildren`,r.node.path)},{immediate:!0});function v(){o(r.node.path),a(r.node.path)&&f.value===void 0&&i(`loadChildren`,r.node.path)}let y=V(!1),x=0;function C(e){return e.dataTransfer?.types.includes(`Files`)??!1}function w(e){return r.allowUpload&&r.node.type===`dir`&&C(e)}function E(e){w(e)&&(e.preventDefault(),x+=1,y.value=!0)}function O(e){w(e)&&e.preventDefault()}function M(){x!==0&&(--x,x<=0&&P())}function N(e){if(!w(e))return;e.preventDefault(),e.stopPropagation(),P();let t=e.dataTransfer?.files;t&&t.length>0&&i(`uploadFiles`,{folder:r.node.path,files:Array.from(t)})}function P(){x=0,y.value=!1}Ve(n2n(),P);let F=new Set([`.mp3`,`.wav`,`.m4a`,`.ogg`,`.oga`,`.flac`,`.aac`]),I=m(()=>{if(r.node.type!==`file`)return`description`;let{name:e}=r.node,t=e.lastIndexOf(`.`);if(t<0)return`description`;let n=e.slice(t).toLowerCase();return F.has(n)?`audiotrack`:`description`}),L=m(()=>r.recentPaths.has(r.node.path)),R=m(()=>{if(r.node.type!==`file`)return O2n;let e=s2n(r.node.path);return e?u2n[e.editPolicy]:O2n}),z=m(()=>r.node.type===`dir`?m2n(r.node.path):null),ee=m(()=>z.value?n(z.value.placeholderKey):``),te=V(!1),ne=V(0),re=V(0),ie=V(!1),ae=V(``),oe=V(null),W=V(null),se=!1;function ce(e){z.value&&(e.preventDefault(),ne.value=e.clientX,re.value=e.clientY,te.value=!0)}function le(){te.value=!1}function ue(){le(),z.value&&(a(r.node.path)||l(r.node.path),ae.value=``,oe.value=null,ie.value=!0,be(()=>{W.value?.focus()}))}function de(){ie.value=!1,ae.value=``,oe.value=null}function fe(){se?se=!1:de()}let G=V(!1);function pe(){G.value=!0}function me(){setTimeout(()=>{G.value=!1},0)}function he(e){if(e.key===`Enter`){if(G.value||e.isComposing||e.keyCode===229)return;e.preventDefault(),_e()}else e.key===`Escape`&&(e.preventDefault(),de())}function ge(){se=!0,be(()=>{W.value?.focus(),setTimeout(()=>{se=!1},0)})}function _e(){if(!z.value)return;let e=h2n(ae.value,z.value);e.ok?(se=!0,i(`createFile`,{folder:r.node.path,filename:e.filename,resolve:(e,t)=>{e?de():(oe.value=t??n(`fileTree.newFileError.saveFailed`),ge())}})):(oe.value=e.reason===`empty`?n(`fileTree.newFileError.empty`):n(`fileTree.newFileError.unsafe`),ge())}function ve(){te.value&&le()}function K(e){e.key===`Escape`&&te.value&&le()}return Ve(te,e=>{e?(window.addEventListener(`click`,ve),window.addEventListener(`keydown`,K)):(window.removeEventListener(`click`,ve),window.removeEventListener(`keydown`,K))}),k(()=>{window.removeEventListener(`click`,ve),window.removeEventListener(`keydown`,K)}),(t,r)=>{let a=A(`FileTree`,!0);return B(),U(`div`,null,[e.node.type===`dir`?(B(),U(`button`,{key:0,class:c([`w-full flex items-center gap-1 px-2 py-1 text-left text-sm rounded transition-colors`,y.value?`bg-blue-100 ring-1 ring-blue-400`:`hover:bg-gray-100`]),"data-testid":`file-tree-dir-${e.node.name||`root`}`,"data-drop-target":y.value?`true`:void 0,title:e.allowUpload?q(n)(`fileTree.dropHint`):void 0,onClick:v,onContextmenu:ce,onDragenter:E,onDragover:O,onDragleave:M,onDrop:N},[S(`span`,_2n,T(d.value?`folder_open`:`folder`),1),S(`span`,v2n,T(e.node.name||q(n)(`fileTree.workspace`)),1)],42,g2n)):(B(),U(`button`,{key:1,class:c([`w-full flex items-center gap-1 px-2 py-1 text-left text-sm rounded transition-colors`,e.selectedPath===e.node.path?`bg-blue-100 text-blue-700`:`text-gray-700 hover:bg-gray-100`]),"data-testid":`file-tree-file-${e.node.name}`,"data-selected":e.selectedPath===e.node.path?`true`:void 0,title:e.node.path,onClick:r[0]||=t=>i(`select`,e.node.path)},[S(`span`,{class:c([`material-icons text-sm shrink-0`,R.value])},T(I.value),3),S(`span`,b2n,T(e.node.name),1),L.value?(B(),U(`span`,{key:0,class:`ml-auto w-1.5 h-1.5 rounded-full bg-green-500 shrink-0`,title:q(n)(`fileTree.recentlyChanged`)},null,8,x2n)):b(``,!0)],10,y2n)),e.node.type===`dir`&&d.value?(B(),U(`div`,S2n,[ie.value?(B(),U(`div`,{key:0,class:`flex items-center gap-1 px-2 py-1 text-sm`,"data-testid":`file-tree-new-file-input-${e.node.name||`root`}`},[r[7]||=S(`span`,{class:`material-icons text-sm text-gray-400 shrink-0`},`description`,-1),u(S(`input`,{ref_key:`newFileInputRef`,ref:W,"onUpdate:modelValue":r[1]||=e=>ae.value=e,type:`text`,class:`flex-1 min-w-0 px-1 py-0.5 text-sm border border-blue-400 rounded focus:outline-none focus:ring-1 focus:ring-blue-400`,placeholder:ee.value,"aria-label":q(n)(`fileTree.newFileInputAria`),"data-testid":`file-tree-new-file-input`,onKeydown:he,onCompositionstart:pe,onCompositionend:me,onBlur:fe},null,40,w2n),[[Fe,ae.value]]),S(`span`,T2n,T(z.value?.extension),1)],8,C2n)):b(``,!0),oe.value?(B(),U(`div`,E2n,T(oe.value),1)):b(``,!0),p.value?(B(),U(`div`,D2n,T(q(n)(`common.loading`)),1)):b(``,!0),(B(!0),U(D,null,H(_.value,t=>(B(),ke(a,{key:t.path,node:t,"selected-path":e.selectedPath,"recent-paths":e.recentPaths,"children-by-path":e.childrenByPath,"sort-mode":e.sortMode,"show-hidden-system":e.showHiddenSystem,"allow-upload":e.allowUpload,onSelect:r[2]||=e=>i(`select`,e),onLoadChildren:r[3]||=e=>i(`loadChildren`,e),onCreateFile:r[4]||=e=>i(`createFile`,e),onUploadFiles:r[5]||=e=>i(`uploadFiles`,e)},null,8,[`node`,`selected-path`,`recent-paths`,`children-by-path`,`sort-mode`,`show-hidden-system`,`allow-upload`]))),128))])):b(``,!0),(B(),ke(j,{to:`body`},[te.value?(B(),U(`div`,{key:0,class:`fixed z-50 min-w-32 bg-white border border-gray-200 rounded shadow-md py-1 text-sm`,style:xe({top:`${re.value}px`,left:`${ne.value}px`}),"data-testid":`file-tree-context-menu`,translate:`no`,onClick:r[6]||=s(()=>{},[`stop`])},[S(`button`,{type:`button`,class:`w-full text-left px-3 py-1.5 hover:bg-gray-100 flex items-center gap-2`,"data-testid":`file-tree-context-new-file`,onClick:ue},[r[8]||=S(`span`,{class:`material-icons text-sm text-gray-400`},`note_add`,-1),J(` `+T(q(n)(`fileTree.newFileMenuItem`)),1)])],4)):b(``,!0)]))])}}});o(),M(),we();var A2n={class:`w-72 flex-shrink-0 border-r border-gray-200 overflow-y-auto p-2 bg-gray-50`},j2n={class:`flex flex-wrap justify-end items-center gap-x-3 gap-y-1 pb-1 text-xs`},M2n=[`title`],N2n=[`checked`],P2n={class:`flex items-center gap-2`},F2n={class:`text-gray-400`},I2n={class:`flex border border-gray-300 rounded overflow-hidden`},L2n=[`aria-pressed`,`title`],R2n=[`aria-pressed`,`title`],z2n={key:0,class:`p-2 text-xs text-red-600`},B2n={key:1,class:`p-2 text-xs text-gray-400`},V2n={class:`mt-2 pt-2 border-t border-gray-200 px-1 mb-1 flex items-center gap-1`},H2n={class:`text-[10px] font-semibold text-gray-400 uppercase`},U2n={class:`text-[9px] px-1 py-0.5 rounded bg-blue-100 text-blue-600`},W2n=K({__name:`FileTreePane`,props:{rootNode:{},refRoots:{},childrenByPath:{},treeError:{},selectedPath:{},recentPaths:{},sortMode:{},showHiddenSystem:{type:Boolean}},emits:[`select`,`loadChildren`,`update:sortMode`,`update:showHiddenSystem`,`createFile`,`uploadFiles`],setup(e,{emit:t}){let{t:n}=We(),r=t;function i(e){let{target:t}=e;t instanceof HTMLInputElement&&r(`update:showHiddenSystem`,t.checked)}Q0n();let a=new Set;return(t,o)=>(B(),U(`div`,A2n,[S(`div`,j2n,[S(`label`,{class:`flex items-center gap-1 text-gray-500 cursor-pointer select-none`,title:q(n)(`fileTreePane.showSystemFilesTitle`)},[S(`input`,{type:`checkbox`,class:`h-3.5 w-3.5`,"data-testid":`file-tree-show-system-toggle`,checked:e.showHiddenSystem,onChange:i},null,40,N2n),J(` `+T(q(n)(`fileTreePane.showSystemFiles`)),1)],8,M2n),S(`div`,P2n,[S(`span`,F2n,T(q(n)(`fileTreePane.sort`)),1),S(`div`,I2n,[S(`button`,{type:`button`,class:c([`h-8 px-2.5 flex items-center gap-1 transition-colors`,e.sortMode===`name`?`bg-blue-50 text-blue-700 font-medium`:`bg-white text-gray-500 hover:bg-gray-50`]),"aria-pressed":e.sortMode===`name`,title:q(n)(`fileTreePane.sortByName`),"data-testid":`file-sort-name`,onClick:o[0]||=e=>r(`update:sortMode`,`name`)},T(q(n)(`fileTreePane.name`)),11,L2n),S(`button`,{type:`button`,class:c([`h-8 px-2.5 flex items-center gap-1 transition-colors`,e.sortMode===`recent`?`bg-blue-50 text-blue-700 font-medium`:`bg-white text-gray-500 hover:bg-gray-50`]),"aria-pressed":e.sortMode===`recent`,title:q(n)(`fileTreePane.sortByRecent`),"data-testid":`file-sort-recent`,onClick:o[1]||=e=>r(`update:sortMode`,`recent`)},T(q(n)(`fileTreePane.recent`)),11,R2n)])])]),e.treeError?(B(),U(`div`,z2n,T(e.treeError),1)):e.rootNode?(B(),ke(k2n,{key:2,node:e.rootNode,"selected-path":e.selectedPath,"recent-paths":e.recentPaths,"children-by-path":e.childrenByPath,"sort-mode":e.sortMode,"show-hidden-system":e.showHiddenSystem,"allow-upload":``,onSelect:o[2]||=e=>r(`select`,e),onLoadChildren:o[3]||=e=>r(`loadChildren`,e),onCreateFile:o[4]||=e=>r(`createFile`,e),onUploadFiles:o[5]||=e=>r(`uploadFiles`,e)},null,8,[`node`,`selected-path`,`recent-paths`,`children-by-path`,`sort-mode`,`show-hidden-system`])):(B(),U(`div`,B2n,T(q(n)(`common.loading`)),1)),e.refRoots.length>0?(B(),U(D,{key:3},[S(`div`,V2n,[S(`span`,H2n,T(q(n)(`fileTreePane.reference`)),1),S(`span`,U2n,T(q(n)(`fileTreePane.readOnlyBadge`)),1)]),(B(!0),U(D,null,H(e.refRoots,t=>(B(),ke(k2n,{key:t.path,node:t,"selected-path":e.selectedPath,"recent-paths":q(a),"children-by-path":e.childrenByPath,"sort-mode":e.sortMode,"show-hidden-system":``,"allow-upload":!1,onSelect:o[6]||=e=>r(`select`,e),onLoadChildren:o[7]||=e=>r(`loadChildren`,e)},null,8,[`node`,`selected-path`,`recent-paths`,`children-by-path`,`sort-mode`]))),128))],64)):b(``,!0)]))}}),G2n=1024,K2n=G2n*1024,q2n=K2n*1024;function J2n(e){return e===void 0||!Number.isFinite(e)?1:Math.min(100,Math.max(0,Math.floor(e)))}function Y2n(e,t={}){if(!Number.isFinite(e)||e<0)return`—`;let n=J2n(t.decimals);return e<G2n?`${Math.trunc(e)} B`:e<K2n?`${(e/G2n).toFixed(n)} KB`:e<q2n?`${(e/K2n).toFixed(n)} MB`:`${(e/q2n).toFixed(n)} GB`}M(),o();function X2n(e,t,n){let r=V(!1),i=V(null);Ve(e,()=>{r.value=!1,i.value=null});async function a(){let a=e.value;if(a){r.value=!0,i.value=null;try{let e=await xN(`${t}?path=${encodeURIComponent(a)}`,{path:a});e.ok||(i.value=e.error||n())}finally{r.value=!1}}}return{busy:r,error:i,run:a}}function Z2n(e,t){let{busy:n,error:r,run:i}=X2n(e,kP.files.open,t);return{busy:n,error:r,open:i}}function Q2n(e,t){let{busy:n,error:r,run:i}=X2n(e,kP.files.reveal,t);return{busy:n,error:r,reveal:i}}o(),we(),M();var $2n={key:0,class:`flex items-center gap-2 px-3 py-2 border-b border-gray-200 text-xs text-gray-500 font-mono shrink-0`},e4n={class:`truncate min-w-0`},t4n={key:0,class:`text-gray-400 shrink-0`},n4n={key:1,class:`text-gray-400 shrink-0`},r4n=[`disabled`,`title`,`aria-label`],i4n=[`title`],a4n=[`title`,`aria-label`],o4n=K({__name:`FileContentHeader`,props:{selectedPath:{},size:{},modifiedMs:{},isMarkdown:{type:Boolean},mdRawMode:{type:Boolean}},emits:[`toggleMdRaw`,`deselect`],setup(e,{emit:t}){let{t:n}=We(),r=e,i=t,{busy:a,error:o,reveal:s}=Q2n(Ee(r,`selectedPath`),()=>n(`fileContentHeader.revealInOsFailed`)),l=m(()=>{let e=n(`fileContentHeader.revealInOs`);return o.value?`${e} – ${o.value}`:e});return(t,r)=>e.selectedPath?(B(),U(`div`,$2n,[S(`span`,e4n,T(e.selectedPath),1),e.size===null?b(``,!0):(B(),U(`span`,t4n,`· `+T(q(Y2n)(e.size)),1)),e.modifiedMs===null?b(``,!0):(B(),U(`span`,n4n,`· `+T(q(Gkt)(e.modifiedMs)),1)),S(`button`,{type:`button`,class:c([`ml-auto shrink-0 h-8 w-8 flex items-center justify-center rounded hover:bg-gray-100 font-sans disabled:opacity-50`,q(o)?`text-red-500`:`text-gray-400 hover:text-gray-700`]),disabled:q(a),title:q(o)||q(n)(`fileContentHeader.revealInOs`),"aria-label":l.value,"data-testid":`file-reveal-in-os`,onClick:r[0]||=(...e)=>q(s)&&q(s)(...e)},[...r[3]||=[S(`span`,{class:`material-icons text-base`,"aria-hidden":`true`},`folder_open`,-1)]],10,r4n),e.isMarkdown?(B(),U(`button`,{key:2,class:`shrink-0 h-8 px-2.5 flex items-center gap-1 rounded border border-gray-200 text-gray-600 hover:bg-gray-100 font-sans`,title:e.mdRawMode?q(n)(`fileContentHeader.showRendered`):q(n)(`fileContentHeader.showRaw`),onClick:r[1]||=e=>i(`toggleMdRaw`)},T(e.mdRawMode?q(n)(`fileContentHeader.rendered`):q(n)(`fileContentHeader.raw`)),9,i4n)):b(``,!0),S(`button`,{type:`button`,class:`shrink-0 h-8 w-8 flex items-center justify-center rounded text-gray-400 hover:text-gray-700 hover:bg-gray-100`,title:q(n)(`fileContentHeader.closeFile`),"aria-label":q(n)(`fileContentHeader.closeFile`),"data-testid":`close-file-btn`,onClick:r[2]||=e=>i(`deselect`)},[...r[4]||=[S(`span`,{class:`material-icons text-base`,"aria-hidden":`true`},`close`,-1)]],8,a4n)])):b(``,!0)}});o(),we(),M();var s4n={class:`m-4 mb-0 rounded border border-blue-200 bg-blue-50 text-sm`,"data-testid":`system-file-banner`},c4n={class:`flex items-start gap-2 px-3 py-2`},l4n={class:`flex-1 min-w-0`},u4n={class:`flex items-center gap-2 flex-wrap`},d4n={class:`font-semibold text-blue-900`},f4n={key:0,class:`mt-1 text-gray-700 leading-snug whitespace-pre-line`},p4n={key:1,class:`mt-1 text-xs text-gray-500`},m4n=[`href`],h4n=[`aria-label`],g4n=`systemFileBanner.collapsed.`,_4n=`ℹ️`,v4n=`https://github.com/receptron/mulmoclaude/blob/main/`,y4n=K({__name:`SystemFileBanner`,props:{descriptor:{},path:{}},setup(e){let{t}=We(),n=e;function r(e){return g4n+e}function i(e){try{return localStorage.getItem(r(e))===`1`}catch{return!1}}function a(e,t){try{t?localStorage.setItem(r(e),`1`):localStorage.removeItem(r(e))}catch{}}let o=V(i(n.descriptor.id));Ve(()=>n.descriptor.id,e=>{o.value=i(e)});function s(){o.value=!o.value,a(n.descriptor.id,o.value)}let l={"agent-managed-but-hand-editable":`bg-emerald-100 text-emerald-800`,"user-editable":`bg-blue-100 text-blue-800`,"agent-managed":`bg-amber-100 text-amber-800`,"fragile-format":`bg-orange-100 text-orange-800`,ephemeral:`bg-gray-200 text-gray-700`},u=m(()=>l[n.descriptor.editPolicy]),d=m(()=>n.descriptor.schemaRef?v4n+n.descriptor.schemaRef:``);return(n,r)=>(B(),U(`div`,s4n,[S(`div`,c4n,[S(`span`,{class:`text-blue-600 shrink-0`,"aria-hidden":`true`},T(_4n)),S(`div`,l4n,[S(`div`,u4n,[S(`span`,d4n,T(q(t)(`systemFiles.${e.descriptor.id}.title`)),1),S(`span`,{class:c([`text-xs px-1.5 py-0.5 rounded shrink-0`,u.value])},T(q(t)(`systemFiles.editPolicy.${e.descriptor.editPolicy}`)),3)]),o.value?b(``,!0):(B(),U(`p`,f4n,T(q(t)(`systemFiles.${e.descriptor.id}.summary`)),1)),!o.value&&e.descriptor.schemaRef?(B(),U(`p`,p4n,[J(T(q(t)(`systemFiles.schemaLabel`))+`: `,1),S(`a`,{href:d.value,target:`_blank`,rel:`noopener noreferrer`,class:`font-mono text-blue-700 hover:underline break-all`},T(e.descriptor.schemaRef),9,m4n)])):b(``,!0)]),S(`button`,{type:`button`,class:`shrink-0 text-xs text-blue-700 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-400 rounded px-1`,"aria-label":o.value?q(t)(`systemFiles.showDetails`):q(t)(`systemFiles.hideDetails`),"data-testid":`system-file-banner-toggle`,onClick:s},T(o.value?q(t)(`systemFiles.showDetails`):q(t)(`systemFiles.hideDetails`)),9,h4n)])]))}});M();function b4n(e){return`${e.split(`/`).pop()?.replace(/\.html?$/i,``)||`share`}.zip`}function x4n(){let e=V(!1),t=V(!1);async function n(n){t.value=!1,e.value=!0;try{let e=await wN(kP.share.pack,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:n})});if(!e.ok){t.value=!0;return}zU(await e.blob(),I6t(e.headers.get(`content-disposition`),b4n(n)))}catch{t.value=!0}finally{e.value=!1}}function r(){t.value=!1}return{packing:e,packFailed:t,downloadZip:n,reset:r}}M(),o();var S4n=`download`;function C4n(e,t){let n=V(!1),r=V(null),i=0,a=null;function o(){i+=1,a?.abort(),a=null}Ve(e,()=>{o(),n.value=!1,r.value=null});async function s(){let s=e.value;if(!s)return;o();let c=i,l=new AbortController;a=l,n.value=!0,r.value=null;try{let e=await wN(kP.files.raw,{query:{path:s},signal:l.signal});if(c!==i)return;if(!e.ok){r.value=t();return}let n=await e.blob();if(c!==i)return;zU(n,Mkn(s,S4n))}catch{if(c!==i)return;r.value=t()}finally{c===i&&(n.value=!1)}}return{busy:n,error:r,download:s}}o(),M(),we();var w4n={class:`flex-1 overflow-auto min-h-0`},T4n={key:0,class:`h-full flex items-center justify-center text-gray-400 text-sm`},E4n={key:1,class:`p-4 text-sm text-red-600`},D4n={key:2,class:`p-4 text-sm text-gray-400`},O4n={key:1,class:`h-full flex flex-col overflow-y-auto`},k4n={class:`m-auto w-full`},A4n=[`title`,`aria-label`],j4n={key:2,class:`shrink-0 m-4 mt-0 rounded border border-red-300 bg-red-50 p-2 text-xs text-red-700`,role:`alert`,"data-testid":`files-marp-save-error`},M4n={key:1,class:`h-full flex flex-col overflow-auto`},N4n={key:0,class:`shrink-0 m-4 mb-0 rounded border border-gray-200 bg-gray-50 p-3 text-xs`},P4n={class:`font-semibold text-gray-600 shrink-0`},F4n={key:0,class:`flex flex-wrap gap-1`},I4n={key:1,class:`text-gray-800 break-words`},L4n={key:1,class:`shrink-0 m-4 mt-0 rounded border border-red-300 bg-red-50 p-2 text-xs text-red-700`,role:`alert`},R4n={key:2,class:`p-4 text-xs whitespace-pre-wrap font-mono text-gray-800`},z4n={key:3,class:`relative w-full h-full`},B4n={key:0,class:`absolute top-2 right-2 z-10 flex flex-col items-end gap-1`},V4n=[`title`,`disabled`],H4n={key:0,class:`text-xs text-red-600 bg-white/90 px-1 rounded`,role:`alert`},U4n=[`src`,`title`],W4n=[`srcdoc`,`title`],G4n={key:5,class:`h-full flex flex-col overflow-auto`},K4n={class:`shrink-0 flex items-center justify-end gap-2 px-4 pt-3`},q4n={key:0,class:`text-xs text-red-600 self-center`,"data-testid":`files-json-invalid-hint`},J4n=[`disabled`,`title`],Y4n={key:1,class:`flex-1 p-4 text-xs whitespace-pre-wrap font-mono text-gray-800`},X4n={key:2,class:`shrink-0 m-4 mt-0 rounded border border-red-300 bg-red-50 p-2 text-xs text-red-700`,role:`alert`,"data-testid":`files-json-save-error`},Z4n={key:6,class:`p-4 space-y-2`},Q4n={key:0,class:`text-xs text-red-600 mb-1 font-sans`},$4n={class:`text-xs font-mono text-gray-800 whitespace-pre-wrap`},e3n={key:7,class:`p-4 text-xs whitespace-pre-wrap font-mono text-gray-800`},t3n={key:2,class:`h-full flex items-center justify-center p-4`},n3n=[`src`,`alt`],r3n=[`src`,`title`],i3n={key:4,class:`h-full flex items-center justify-center p-4`},a3n=[`src`],o3n={key:5,class:`h-full flex items-center justify-center p-4 bg-black`},s3n=[`src`],c3n={key:6,class:`p-4 text-sm text-gray-500 flex flex-col gap-3`},l3n={key:1},u3n={class:`flex flex-wrap items-center gap-2`},d3n=[`disabled`],f3n=[`disabled`],p3n={key:0,class:`mt-2 text-xs text-red-600`,"data-testid":`file-download-error`},m3n={key:1,class:`mt-2 text-xs text-red-600`},h3n=K({__name:`FileContentRenderer`,props:{selectedPath:{},content:{},contentError:{},contentLoading:{type:Boolean},isMarkdown:{type:Boolean},isHtml:{type:Boolean},isJson:{type:Boolean},isJsonl:{type:Boolean},mdRawMode:{type:Boolean},sandboxedHtml:{},htmlPreviewUrl:{},jsonTokens:{},jsonlLines:{},mdFrontmatter:{},rawSaveError:{}},emits:[`markdownLinkClick`,`updateSource`],setup(e,{emit:t}){let n=OL(`markdown`,ZR),r=OL(`markdown`,ROt),i=Ae(()=>Xe(()=>import(`./JsonEditor-ZvNJuqs_.js`),__vite__mapDeps([51,5,52,53,54]))),{t:a}=We(),o=e,s=t,l=m(()=>o.selectedPath?s2n(o.selectedPath):null),{packing:u,packFailed:d,downloadZip:f,reset:p}=x4n(),h=m(()=>!!(o.isHtml&&o.htmlPreviewUrl&&o.selectedPath?.toLowerCase().endsWith(`.html`)));function g(){o.selectedPath&&f(o.selectedPath)}Ve(()=>o.selectedPath,()=>p());let _=m(()=>!!(o.mdFrontmatter&&KR(o.mdFrontmatter.meta))),v=m(()=>{let e=o.selectedPath;if(!e)return;let t=e.lastIndexOf(`/`);return t<0?``:e.slice(0,t)}),y=m(()=>{let e=o.selectedPath??``,t=e.lastIndexOf(`/`),n=t>=0?e.slice(t+1):e,r=n.lastIndexOf(`.`);return GR({name:r>0?n.slice(0,r):n,fallback:`slides`})}),{busy:x,error:C,open:w}=Z2n(Ee(o,`selectedPath`),()=>a(`fileContentRenderer.openInOsFailed`)),{busy:E,error:O,download:k}=C4n(Ee(o,`selectedPath`),()=>a(`common.downloadFailed`)),A=V(!1),j=V(``),M=m(()=>o.isJson&&o.selectedPath!==null&&o.content?.kind===`text`&&l2n(o.selectedPath)),N=m(()=>{try{return JSON.parse(j.value),!0}catch{return!1}});function P(){o.content?.kind===`text`&&(j.value=o.content.content,A.value=!0)}function F(){A.value=!1}function I(){s(`updateSource`,j.value)}let L=V(!1),R=V(``);function z(){o.content?.kind===`text`&&(R.value=o.content.content,L.value=!0)}function ee(){L.value=!1}function te(){s(`updateSource`,R.value)}Ve(()=>o.content,()=>{A.value=!1,L.value=!1});function ne(e){return`${kP.files.raw}?path=${encodeURIComponent(e)}`}function re(e){let t=o.selectedPath??``,n=t.lastIndexOf(`/`),r=n>=0?t.slice(0,n):``,i=RR(e,r),a=o.content?.kind===`text`?o.content.content:e,s=o.mdFrontmatter!==null;return{uuid:`files-preview`,toolName:`text-response`,message:i,title:o.selectedPath??``,data:{text:i,role:`assistant`,transportKind:`text-rest`,pdfSourceText:a,pdfBaseDir:r,pdfStripFrontmatter:s}}}return(t,o)=>(B(),U(`div`,w4n,[e.selectedPath?e.contentError?(B(),U(`div`,E4n,T(e.contentError),1)):e.contentLoading?(B(),U(`div`,D4n,T(q(a)(`common.loading`)),1)):e.content?(B(),U(D,{key:3},[l.value&&e.selectedPath?(B(),ke(y4n,{key:0,descriptor:l.value,path:e.selectedPath},null,8,[`descriptor`,`path`])):b(``,!0),e.content.kind===`text`?(B(),U(D,{key:1},[e.isMarkdown&&!e.mdRawMode&&_.value?(B(),U(D,{key:0},[L.value?(B(),ke(q(r),{key:0,modelValue:R.value,"onUpdate:modelValue":o[0]||=e=>R.value=e,"pdf-filename":y.value,"base-dir":v.value,"editor-label":q(a)(`fileContentRenderer.marpEditorLabel`)},{actions:Ie(()=>[S(`button`,{class:`h-8 px-2.5 flex items-center gap-1 text-sm rounded border border-gray-300 text-gray-600 hover:bg-gray-50`,"data-testid":`files-marp-cancel-btn`,onClick:ee},T(q(a)(`common.cancel`)),1),S(`button`,{class:`h-8 px-2.5 flex items-center gap-1 text-sm rounded bg-green-600 hover:bg-green-700 text-white`,"data-testid":`files-marp-save-btn`,onClick:te},[o[6]||=S(`span`,{class:`material-icons text-sm`,"aria-hidden":`true`},`save`,-1),J(` `+T(q(a)(`common.save`)),1)])]),_:1},8,[`modelValue`,`pdf-filename`,`base-dir`,`editor-label`])):(B(),U(`div`,O4n,[S(`div`,k4n,[De(q(n),{markdown:e.content.content,"pdf-filename":y.value,"base-dir":v.value},{toolbar:Ie(()=>[S(`button`,{class:`h-8 px-2.5 flex items-center gap-1 rounded border border-gray-300 text-gray-600 hover:bg-gray-50 text-sm`,title:q(a)(`fileContentRenderer.editMarp`),"aria-label":q(a)(`fileContentRenderer.editMarp`),"data-testid":`files-marp-edit-btn`,onClick:z},[o[7]||=S(`span`,{class:`material-icons text-sm`,"aria-hidden":`true`},`edit`,-1),J(` `+T(q(a)(`fileContentRenderer.editMarp`)),1)],8,A4n)]),_:1},8,[`markdown`,`pdf-filename`,`base-dir`])])])),e.rawSaveError?(B(),U(`div`,j4n,` ⚠ `+T(e.rawSaveError),1)):b(``,!0)],64)):e.isMarkdown&&!e.mdRawMode?(B(),U(`div`,M4n,[e.mdFrontmatter&&e.mdFrontmatter.fields.length>0?(B(),U(`div`,N4n,[(B(!0),U(D,null,H(e.mdFrontmatter.fields,e=>(B(),U(`div`,{key:e.key,class:`flex items-baseline gap-2 py-0.5`},[S(`span`,P4n,T(e.key)+`:`,1),Array.isArray(e.value)?(B(),U(`span`,F4n,[(B(!0),U(D,null,H(e.value,(e,t)=>(B(),U(`span`,{key:String(t)+`:`+q(Ha)(e),class:`rounded-full bg-white border border-gray-300 px-2 py-0.5 text-gray-700`},T(q(Ha)(e)),1))),128))])):(B(),U(`span`,I4n,T(q(Ha)(e.value)),1))]))),128))])):b(``,!0),S(`div`,{class:`flex-1 min-h-0`,onClickCapture:o[2]||=e=>s(`markdownLinkClick`,e)},[De(d4,{"selected-result":re(e.mdFrontmatter?e.mdFrontmatter.body:e.content.content),"editable-source":e.content.content,onUpdateSource:o[1]||=e=>s(`updateSource`,e)},null,8,[`selected-result`,`editable-source`])],32),e.rawSaveError?(B(),U(`div`,L4n,` ⚠ `+T(e.rawSaveError),1)):b(``,!0)])):e.isMarkdown&&e.mdRawMode?(B(),U(`pre`,R4n,T(e.content.content),1)):e.isHtml&&e.htmlPreviewUrl?(B(),U(`div`,z4n,[h.value?(B(),U(`div`,B4n,[S(`button`,{class:`px-2 py-1 text-xs rounded border border-gray-300 bg-white/90 text-gray-600 hover:bg-gray-50 disabled:opacity-50 shadow-sm`,title:q(a)(`fileContentRenderer.downloadZip`),disabled:q(u),"data-testid":`file-html-download`,onClick:g},[o[8]||=S(`span`,{class:`material-icons text-sm align-middle`},`download`,-1),J(` `+T(q(a)(`fileContentRenderer.download`)),1)],8,V4n),q(d)?(B(),U(`span`,H4n,T(q(a)(`fileContentRenderer.downloadError`)),1)):b(``,!0)])):b(``,!0),S(`iframe`,{src:e.htmlPreviewUrl,class:`w-full h-full border-0`,sandbox:`allow-scripts`,title:q(a)(`fileContentRenderer.htmlPreview`)},null,8,U4n)])):e.isHtml?(B(),U(`iframe`,{key:4,srcdoc:e.sandboxedHtml,class:`w-full h-full border-0`,sandbox:`allow-scripts`,title:q(a)(`fileContentRenderer.htmlPreview`)},null,8,W4n)):e.isJson?(B(),U(`div`,G4n,[S(`div`,K4n,[A.value?(B(),U(D,{key:0},[S(`button`,{class:`h-8 px-2.5 flex items-center gap-1 text-sm rounded border border-gray-300 text-gray-600 hover:bg-gray-50`,"data-testid":`files-json-cancel-btn`,onClick:F},T(q(a)(`common.cancel`)),1),N.value?b(``,!0):(B(),U(`span`,q4n,T(q(a)(`fileContentRenderer.invalidJson`)),1)),S(`button`,{class:`h-8 px-2.5 flex items-center gap-1 text-sm rounded bg-green-600 hover:bg-green-700 text-white disabled:opacity-40 disabled:cursor-not-allowed`,"data-testid":`files-json-save-btn`,disabled:!N.value,title:N.value?void 0:q(a)(`fileContentRenderer.invalidJson`),onClick:I},[o[9]||=S(`span`,{class:`material-icons text-sm`},`save`,-1),J(` `+T(q(a)(`common.save`)),1)],8,J4n)],64)):M.value?(B(),U(`button`,{key:1,class:`h-8 px-2.5 flex items-center gap-1 text-sm rounded border border-gray-300 text-gray-600 hover:bg-gray-50`,"data-testid":`files-json-edit-btn`,onClick:P},[o[10]||=S(`span`,{class:`material-icons text-sm`},`edit`,-1),J(` `+T(q(a)(`fileContentRenderer.editJson`)),1)])):b(``,!0)]),A.value?(B(),ke(q(i),{key:0,modelValue:j.value,"onUpdate:modelValue":o[3]||=e=>j.value=e,"editor-label":q(a)(`fileContentRenderer.jsonEditorLabel`),class:`flex-1 min-h-0 m-4`},null,8,[`modelValue`,`editor-label`])):(B(),U(`pre`,Y4n,[(B(!0),U(D,null,H(e.jsonTokens,(e,t)=>(B(),U(`span`,{key:t,class:c(q(out)[e.type])},T(e.value),3))),128))])),e.rawSaveError?(B(),U(`div`,X4n,` ⚠ `+T(e.rawSaveError),1)):b(``,!0)])):e.isJsonl?(B(),U(`div`,Z4n,[(B(!0),U(D,null,H(e.jsonlLines,(e,t)=>(B(),U(`div`,{key:t,class:c([`rounded border bg-gray-50 p-3`,e.parseError?`border-red-300`:`border-gray-200`])},[e.parseError?(B(),U(`div`,Q4n,T(q(a)(`fileContentRenderer.parseError`)),1)):b(``,!0),S(`pre`,$4n,[(B(!0),U(D,null,H(e.tokens,(e,t)=>(B(),U(`span`,{key:t,class:c(q(out)[e.type])},T(e.value),3))),128))])],2))),128))])):(B(),U(`pre`,e3n,T(e.content.content),1))],64)):e.content.kind===`image`&&e.selectedPath?(B(),U(`div`,t3n,[S(`img`,{src:ne(e.selectedPath),alt:e.selectedPath,class:`max-w-full max-h-full object-contain`},null,8,n3n)])):e.content.kind===`pdf`&&e.selectedPath?(B(),U(`iframe`,{key:3,src:ne(e.selectedPath),class:`w-full h-full border-0`,title:q(a)(`fileContentRenderer.pdfPreview`)},null,8,r3n)):e.content.kind===`audio`&&e.selectedPath?(B(),U(`div`,i3n,[(B(),U(`audio`,{key:e.selectedPath,src:ne(e.selectedPath),controls:``,preload:`metadata`,class:`w-full max-w-2xl`},null,8,a3n))])):e.content.kind===`video`&&e.selectedPath?(B(),U(`div`,o3n,[(B(),U(`video`,{key:e.selectedPath,src:ne(e.selectedPath),controls:``,preload:`metadata`,class:`max-w-full max-h-full`},null,8,s3n))])):(B(),U(`div`,c3n,[`message`in e.content?(B(),U(D,{key:0},[J(T(e.content.message),1)],64)):b(``,!0),e.selectedPath?(B(),U(`div`,l3n,[S(`div`,u3n,[S(`button`,{type:`button`,class:`h-8 px-3 flex items-center gap-1 rounded border border-gray-300 bg-white hover:bg-gray-50 text-gray-700 font-medium disabled:opacity-50`,disabled:q(E),"data-testid":`file-download`,onClick:o[4]||=(...e)=>q(k)&&q(k)(...e)},[o[11]||=S(`span`,{class:`material-icons text-sm`},`download`,-1),J(` `+T(q(E)?q(a)(`fileContentRenderer.downloadingFile`):q(a)(`fileContentRenderer.downloadFile`)),1)],8,d3n),S(`button`,{type:`button`,class:`h-8 px-3 flex items-center gap-1 rounded border border-gray-300 bg-white hover:bg-gray-50 text-gray-700 font-medium disabled:opacity-50`,disabled:q(x),"data-testid":`file-open-in-os`,onClick:o[5]||=(...e)=>q(w)&&q(w)(...e)},[o[12]||=S(`span`,{class:`material-icons text-sm`},`open_in_new`,-1),J(` `+T(q(x)?q(a)(`fileContentRenderer.openingInOs`):q(a)(`fileContentRenderer.openInOs`)),1)],8,f3n)]),q(O)?(B(),U(`p`,p3n,T(q(O)),1)):b(``,!0),q(C)?(B(),U(`p`,m3n,T(q(C)),1)):b(``,!0)])):b(``,!0)]))],64)):b(``,!0):(B(),U(`div`,T4n,T(q(a)(`fileContentRenderer.selectFile`)),1))]))}});function g3n(e){let t=e.split(`/`).filter(Boolean);if(t.length<=1)return[];let n=[];for(let e=1;e<t.length;e++)n.push(t.slice(0,e).join(`/`));return n}function _3n(e,t,n){let r=new Map(e);return r.set(t,n),r}function v3n(e,t){let n=new Map(e);return n.delete(t),n}M();function y3n(){let e=V(null),t=V(new Map),n=V(null),r=0,i=new Map;function a(e){let t=(i.get(e)??0)+1;return i.set(e,t),t}async function o(o){if(t.value.has(o))return;let s=r,c=a(o);t.value=_3n(t.value,o,null);let l=await bN(kP.files.dir,{path:o});if(s!==r||i.get(o)!==c)return;if(!l.ok){t.value=v3n(t.value,o),n.value=l.error||`dir: ${l.status}`;return}let u=l.data;t.value=_3n(t.value,o,u.children??[]),o===``&&(e.value={...u,children:[]})}async function s(){r++,e.value=null,t.value=new Map,n.value=null,await o(``)}async function c(e){a(e),t.value=v3n(t.value,e),await o(e)}return{rootNode:e,childrenByPath:t,treeError:n,loadDirChildren:o,reloadRoot:s,reloadDirChildren:c}}M();function b3n(){let e=V([]);async function t(){let t=await bN(kP.files.refRoots);t.ok&&Array.isArray(t.data)&&(e.value=t.data)}return{refRoots:e,loadRefRoots:t}}function x3n(){let{expand:e}=X0n(),t=y3n(),{refRoots:n,loadRefRoots:r}=b3n();async function i(n){for(let r of g3n(n))e(r),await t.loadDirChildren(r)}return{rootNode:t.rootNode,refRoots:n,childrenByPath:t.childrenByPath,treeError:t.treeError,loadDirChildren:t.loadDirChildren,ensureAncestorsLoaded:i,reloadRoot:t.reloadRoot,reloadDirChildren:t.reloadDirChildren,loadRefRoots:r}}M();var S3n=`files_md_raw_mode`;function C3n(){let e=V(localStorage.getItem(S3n)===`true`);function t(){e.value=!e.value,localStorage.setItem(S3n,String(e.value))}return{mdRawMode:e,toggleMdRaw:t}}M();var w3n=`files_sort_mode`;function T3n(){return localStorage.getItem(w3n)===`recent`?`recent`:`name`}function E3n(){let e=V(T3n());function t(t){e.value=t,localStorage.setItem(w3n,t)}return{sortMode:e,setSortMode:t}}M();var D3n=`filesView.showHiddenSystem`;function O3n(){return localStorage.getItem(D3n)===`true`}function k3n(){let e=V(O3n());function t(t){e.value=t,localStorage.setItem(D3n,t?`true`:`false`)}return{showHiddenSystem:e,setShowHiddenSystem:t}}function A3n(e,t){function n(n){if(n.button!==0||n.ctrlKey||n.metaKey||n.shiftKey)return;let{target:r}=n;if(!(r instanceof Element))return;let i=r.closest(`a`);if(!i)return;let a=i.getAttribute(`href`);if(!a||c4(a)||a.startsWith(`#`)||!e.value)return;let o=Nkn(e.value,a);if(!o)return;n.preventDefault(),n.stopPropagation();let s=Pkn(o);s===null?t.onNavigate(o):t.onLoadSession(s)}return{handleMarkdownLinkClick:n}}o(),M(),we();var j3n={class:`h-full flex bg-white`,"data-testid":`files-view-root`},M3n={class:`flex-1 flex flex-col min-w-0 overflow-hidden`},N3n=6e4,P3n=4e3,F3n=K({__name:`FilesView`,props:{refreshToken:{}},emits:[`loadSession`],setup(e,{emit:t}){let n=PI(),{t:r}=We(),i=e,a=t,{rootNode:o,refRoots:s,childrenByPath:l,treeError:u,loadDirChildren:d,ensureAncestorsLoaded:f,reloadDirChildren:p,reloadRoot:h,loadRefRoots:g}=x3n(),{selectedPath:v,content:y,contentLoading:x,contentError:C,loadContent:w,selectFile:E,deselectFile:D,abortContent:O}=Sut(),{mdRawMode:k,toggleMdRaw:A}=C3n(),{sortMode:j,setSortMode:M}=E3n(),{showHiddenSystem:N,setShowHiddenSystem:F}=k3n(),{isMarkdown:I,isHtml:L,isJson:R,isJsonl:z,sandboxedHtml:H,htmlPreviewUrl:ee,jsonTokens:te,jsonlLines:ne,mdFrontmatter:re}=yut(v,y),ie=V(null);async function ae(e){if(!v.value||y.value?.kind!==`text`||e===y.value.content)return;let t=v.value;ie.value=null;let n=await SN(kP.files.content,{path:t,content:e});v.value===t&&(n.ok?y.value={kind:`text`,path:n.data.path,content:e,size:n.data.size,modifiedMs:n.data.modifiedMs}:ie.value=n.error)}Ve(y,()=>{ie.value=null});async function oe(e){let{folder:t,filename:n,resolve:i}=e,a=t?`${t}/${n}`:n,o=l.value.get(t);if(Array.isArray(o)&&o.some(e=>e.name===n)){i(!1,r(`fileTree.newFileError.exists`,{filename:n}));return}let s=await xN(kP.files.create,{path:a,content:``});if(s.ok)i(!0),await p(t),E(s.data.path);else{if(s.status===409){i(!1,r(`fileTree.newFileError.exists`,{filename:n})),await p(t);return}i(!1,r(`fileTree.newFileError.saveFailed`))}}let W=V(null),se=null,ce=m(()=>{let e=W.value;return e===null?null:e.done<e.total?{failed:!1,message:r(`fileTree.upload.progress`,{done:e.done,total:e.total})}:e.failed>0?{failed:!0,message:r(`fileTree.upload.failed`,{count:e.failed})}:{failed:!1,message:r(`fileTree.upload.done`,{count:e.total})}});function le(e){return new Promise((t,n)=>{let r=new FileReader;r.onerror=()=>n(Error(`file read failed`)),r.onload=()=>t(typeof r.result==`string`?r.result:``),r.readAsDataURL(e)})}async function ue(e,t){try{let n=await le(t);return n!==``&&(await xN(kP.files.upload,{dir:e,filename:t.name,dataUrl:n})).ok}catch{return!1}}async function de(e){let{folder:t,files:n}=e;se!==null&&(clearTimeout(se),se=null);let r=W.value;W.value=r===null?{done:0,total:n.length,failed:0}:{done:r.done,total:r.total+n.length,failed:r.failed};for(let e of n){let r=await ue(t,e),i=W.value;W.value=i===null?{done:1,total:n.length,failed:+!r}:{done:i.done+1,total:i.total,failed:i.failed+ +!r}}await p(t);let i=W.value;i!==null&&i.done>=i.total&&(se=setTimeout(()=>{W.value=null},P3n))}let fe=m(()=>{let e=new Set,t=Date.now();for(let n of l.value.values())if(n)for(let r of n)r.type===`file`&&r.modifiedMs&&t-r.modifiedMs<N3n&&e.add(r.path);return e}),{handleMarkdownLinkClick:G}=A3n(v,{onNavigate:E,onLoadSession:e=>a(`loadSession`,e)});Ve(()=>xut(n.params.pathMatch),e=>{qI(e)?e!==v.value&&(v.value=e,w(e)):v.value!==null&&(v.value=null,y.value=null)}),Ve(v,e=>{e&&f(e)},{immediate:!0});let pe=V(null),me=0;function he(){v.value&&me===0&&(me=requestAnimationFrame(()=>{me=0;let e=pe.value?.$el;e instanceof HTMLElement&&e.querySelector(`button[data-selected="true"]`)?.scrollIntoView({block:`nearest`})}))}return Ve(v,he),Ve(l,he),Ve(()=>i.refreshToken,()=>{h(),v.value&&w(v.value)}),P(async()=>{await d(``),await g(),v.value&&w(v.value)}),_(()=>{O(),me!==0&&cancelAnimationFrame(me)}),(e,t)=>(B(),U(`div`,j3n,[De(W2n,{ref_key:`treePaneRef`,ref:pe,"root-node":q(o),"ref-roots":q(s),"children-by-path":q(l),"tree-error":q(u),"selected-path":q(v),"recent-paths":fe.value,"sort-mode":q(j),"show-hidden-system":q(N),onSelect:q(E),onLoadChildren:q(d),"onUpdate:sortMode":q(M),"onUpdate:showHiddenSystem":q(F),onCreateFile:oe,onUploadFiles:de},null,8,[`root-node`,`ref-roots`,`children-by-path`,`tree-error`,`selected-path`,`recent-paths`,`sort-mode`,`show-hidden-system`,`onSelect`,`onLoadChildren`,`onUpdate:sortMode`,`onUpdate:showHiddenSystem`]),ce.value?(B(),U(`div`,{key:0,class:c([`fixed bottom-4 left-4 z-50 px-3 py-2 rounded shadow-md text-sm`,ce.value.failed?`bg-red-50 text-red-700 border border-red-200`:`bg-blue-50 text-blue-700 border border-blue-200`]),"data-testid":`file-upload-status`,role:`status`,"aria-live":`polite`,"aria-atomic":`true`},T(ce.value.message),3)):b(``,!0),S(`div`,M3n,[De(o4n,{"selected-path":q(v),size:q(y)?.size??null,"modified-ms":q(y)?.modifiedMs??null,"is-markdown":q(I),"md-raw-mode":q(k),onToggleMdRaw:q(A),onDeselect:q(D)},null,8,[`selected-path`,`size`,`modified-ms`,`is-markdown`,`md-raw-mode`,`onToggleMdRaw`,`onDeselect`]),De(h3n,{"selected-path":q(v),content:q(y),"content-error":q(C),"content-loading":q(x),"is-markdown":q(I),"is-html":q(L),"is-json":q(R),"is-jsonl":q(z),"md-raw-mode":q(k),"sandboxed-html":q(H),"html-preview-url":q(ee),"json-tokens":q(te),"jsonl-lines":q(ne),"md-frontmatter":q(re),"raw-save-error":ie.value,onMarkdownLinkClick:q(G),onUpdateSource:ae},null,8,[`selected-path`,`content`,`content-error`,`content-loading`,`is-markdown`,`is-html`,`is-json`,`is-jsonl`,`md-raw-mode`,`sandboxed-html`,`html-preview-url`,`json-tokens`,`jsonl-lines`,`md-frontmatter`,`raw-save-error`,`onMarkdownLinkClick`]),q(v)&&!q(x)&&!q(C)?(B(),ke(mjn,{key:q(v),placeholder:q(r)(`filesView.chatPlaceholder`),"prepend-text":`Before answering, take a look at the file at ${q(v)}.`,"test-id-prefix":`files-page-chat`},null,8,[`placeholder`,`prepend-text`])):b(``,!0)])]))}}),I3n=[{id:`memory`,displayName:`settingsMcpTab.catalog.entry.memory.displayName`,description:`settingsMcpTab.catalog.entry.memory.description`,audience:`general`,upstreamUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/memory`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-memory`]},configSchema:[],riskLevel:`low`},{id:`sequential-thinking`,displayName:`settingsMcpTab.catalog.entry.sequentialThinking.displayName`,description:`settingsMcpTab.catalog.entry.sequentialThinking.description`,audience:`general`,upstreamUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/sequentialthinking`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-sequential-thinking`]},configSchema:[],riskLevel:`low`},{id:`context7`,displayName:`settingsMcpTab.catalog.entry.context7.displayName`,description:`settingsMcpTab.catalog.entry.context7.description`,audience:`general`,upstreamUrl:`https://github.com/upstash/context7`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@upstash/context7-mcp`]},configSchema:[],riskLevel:`low`},{id:`deepwiki`,displayName:`settingsMcpTab.catalog.entry.deepwiki.displayName`,description:`settingsMcpTab.catalog.entry.deepwiki.description`,audience:`general`,upstreamUrl:`https://docs.devin.ai/work-with-devin/deepwiki-mcp`,spec:{type:`http`,url:`https://mcp.deepwiki.com/sse`},configSchema:[],riskLevel:`low`},{id:`notion`,displayName:`settingsMcpTab.catalog.entry.notion.displayName`,description:`settingsMcpTab.catalog.entry.notion.description`,audience:`general`,upstreamUrl:`https://github.com/makenotion/notion-mcp-server`,setupGuideUrl:`https://www.notion.so/help/create-integrations-with-the-notion-api`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@notionhq/notion-mcp-server`],env:{NOTION_TOKEN:"${NOTION_API_KEY}"}},configSchema:[{key:`NOTION_API_KEY`,label:`settingsMcpTab.catalog.entry.notion.field.apiKey.label`,kind:`secret`,placeholder:`secret_...`,required:!0,helpUrl:`https://www.notion.so/my-integrations`,helpText:`settingsMcpTab.catalog.entry.notion.field.apiKey.help`}],riskLevel:`medium`},{id:`slack`,displayName:`settingsMcpTab.catalog.entry.slack.displayName`,description:`settingsMcpTab.catalog.entry.slack.description`,audience:`general`,upstreamUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/slack`,setupGuideUrl:`https://api.slack.com/quickstart`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-slack`],env:{SLACK_BOT_TOKEN:"${SLACK_BOT_TOKEN}",SLACK_TEAM_ID:"${SLACK_TEAM_ID}"}},configSchema:[{key:`SLACK_BOT_TOKEN`,label:`settingsMcpTab.catalog.entry.slack.field.botToken.label`,kind:`secret`,placeholder:`xoxb-...`,required:!0,helpUrl:`https://api.slack.com/apps`,helpText:`settingsMcpTab.catalog.entry.slack.field.botToken.help`},{key:`SLACK_TEAM_ID`,label:`settingsMcpTab.catalog.entry.slack.field.teamId.label`,kind:`text`,placeholder:`T01ABC23DEF`,required:!0,helpUrl:`https://api.slack.com/methods/team.info`,helpText:`settingsMcpTab.catalog.entry.slack.field.teamId.help`}],riskLevel:`medium`},{id:`google-maps`,displayName:`settingsMcpTab.catalog.entry.googleMaps.displayName`,description:`settingsMcpTab.catalog.entry.googleMaps.description`,audience:`general`,upstreamUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/google-maps`,setupGuideUrl:`https://developers.google.com/maps/documentation/javascript/get-api-key`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-google-maps`],env:{GOOGLE_MAPS_API_KEY:"${GOOGLE_MAPS_API_KEY}"}},configSchema:[{key:`GOOGLE_MAPS_API_KEY`,label:`settingsMcpTab.catalog.entry.googleMaps.field.apiKey.label`,kind:`secret`,placeholder:`AIza...`,required:!0,helpUrl:`https://console.cloud.google.com/google/maps-apis/credentials`,helpText:`settingsMcpTab.catalog.entry.googleMaps.field.apiKey.help`}],riskLevel:`low`},{id:`apple-native`,displayName:`settingsMcpTab.catalog.entry.appleNative.displayName`,description:`settingsMcpTab.catalog.entry.appleNative.description`,audience:`general`,upstreamUrl:`https://github.com/Dhravya/apple-mcp`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@dhravya/apple-mcp`]},configSchema:[],riskLevel:`medium`},{id:`gmail`,displayName:`settingsMcpTab.catalog.entry.gmail.displayName`,description:`settingsMcpTab.catalog.entry.gmail.description`,audience:`general`,upstreamUrl:`https://github.com/GongRzhe/Gmail-MCP-Server`,setupGuideUrl:`https://developers.google.com/workspace/guides/create-credentials#desktop-app`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@gongrzhe/server-gmail-autoauth-mcp`],env:{GMAIL_OAUTH_PATH:"${GMAIL_OAUTH_PATH}"}},configSchema:[{key:`GMAIL_OAUTH_PATH`,label:`settingsMcpTab.catalog.entry.gmail.field.credentials.label`,kind:`path`,placeholder:`~/.gmail-mcp/credentials.json`,required:!0,helpUrl:`https://console.cloud.google.com/apis/credentials`,helpText:`settingsMcpTab.catalog.entry.gmail.field.credentials.help`}],riskLevel:`high`},{id:`google-calendar`,displayName:`settingsMcpTab.catalog.entry.googleCalendar.displayName`,description:`settingsMcpTab.catalog.entry.googleCalendar.description`,audience:`general`,upstreamUrl:`https://github.com/nspady/google-calendar-mcp`,setupGuideUrl:`https://developers.google.com/workspace/guides/create-credentials#desktop-app`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@cocal/google-calendar-mcp`],env:{GOOGLE_OAUTH_CREDENTIALS:"${GOOGLE_OAUTH_CREDENTIALS}"}},configSchema:[{key:`GOOGLE_OAUTH_CREDENTIALS`,label:`settingsMcpTab.catalog.entry.googleCalendar.field.credentials.label`,kind:`path`,placeholder:`~/.gcal-mcp/credentials.json`,required:!0,helpUrl:`https://console.cloud.google.com/apis/credentials`,helpText:`settingsMcpTab.catalog.entry.googleCalendar.field.credentials.help`}],riskLevel:`medium`},{id:`google-drive`,displayName:`settingsMcpTab.catalog.entry.googleDrive.displayName`,description:`settingsMcpTab.catalog.entry.googleDrive.description`,audience:`general`,upstreamUrl:`https://github.com/modelcontextprotocol/servers-archived/tree/main/src/gdrive`,setupGuideUrl:`https://developers.google.com/workspace/guides/create-credentials#desktop-app`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-gdrive`],env:{GDRIVE_CREDENTIALS_PATH:"${GDRIVE_CREDENTIALS_PATH}"}},configSchema:[{key:`GDRIVE_CREDENTIALS_PATH`,label:`settingsMcpTab.catalog.entry.googleDrive.field.credentials.label`,kind:`path`,placeholder:`~/.gdrive-mcp/credentials.json`,required:!0,helpUrl:`https://console.cloud.google.com/apis/credentials`,helpText:`settingsMcpTab.catalog.entry.googleDrive.field.credentials.help`}],riskLevel:`medium`},{id:`github`,displayName:`settingsMcpTab.catalog.entry.github.displayName`,description:`settingsMcpTab.catalog.entry.github.description`,audience:`general`,upstreamUrl:`https://github.com/github/github-mcp-server`,setupGuideUrl:`https://docs.github.com/en/copilot/how-tos/provide-context/use-mcp/set-up-the-github-mcp-server`,spec:{type:`http`,url:`https://api.githubcopilot.com/mcp/`,headers:{Authorization:"Bearer ${GITHUB_PERSONAL_ACCESS_TOKEN}"}},configSchema:[{key:`GITHUB_PERSONAL_ACCESS_TOKEN`,label:`settingsMcpTab.catalog.entry.github.field.token.label`,kind:`secret`,placeholder:`ghp_…`,required:!0,helpUrl:`https://github.com/settings/tokens`,helpText:`settingsMcpTab.catalog.entry.github.field.token.help`}],riskLevel:`medium`},{id:`linear`,displayName:`settingsMcpTab.catalog.entry.linear.displayName`,description:`settingsMcpTab.catalog.entry.linear.description`,audience:`general`,upstreamUrl:`https://github.com/tacticlaunch/mcp-linear`,setupGuideUrl:`https://linear.app/docs/personal-api-keys`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@tacticlaunch/mcp-linear`],env:{LINEAR_API_KEY:"${LINEAR_API_KEY}"}},configSchema:[{key:`LINEAR_API_KEY`,label:`settingsMcpTab.catalog.entry.linear.field.apiKey.label`,kind:`secret`,placeholder:`lin_api_…`,required:!0,helpUrl:`https://linear.app/settings/api`,helpText:`settingsMcpTab.catalog.entry.linear.field.apiKey.help`}],riskLevel:`medium`},{id:`weather-open-meteo`,displayName:`settingsMcpTab.catalog.entry.weatherOpenMeteo.displayName`,description:`settingsMcpTab.catalog.entry.weatherOpenMeteo.description`,audience:`general`,upstreamUrl:`https://www.npmjs.com/package/open-meteo-mcp`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`open-meteo-mcp`]},configSchema:[],riskLevel:`low`},{id:`spotify`,displayName:`settingsMcpTab.catalog.entry.spotify.displayName`,description:`settingsMcpTab.catalog.entry.spotify.description`,audience:`general`,upstreamUrl:`https://github.com/calebWei/SpotifyMCP`,setupGuideUrl:`https://developer.spotify.com/documentation/web-api/concepts/apps`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`spotify-mcp@latest`],env:{SPOTIFY_CLIENT_ID:"${SPOTIFY_CLIENT_ID}"}},configSchema:[{key:`SPOTIFY_CLIENT_ID`,label:`settingsMcpTab.catalog.entry.spotify.field.clientId.label`,kind:`secret`,placeholder:`spotify-client-id`,required:!0,helpUrl:`https://developer.spotify.com/dashboard`,helpText:`settingsMcpTab.catalog.entry.spotify.field.clientId.help`}],riskLevel:`medium`},{id:`youtube-transcript`,displayName:`settingsMcpTab.catalog.entry.youtubeTranscript.displayName`,description:`settingsMcpTab.catalog.entry.youtubeTranscript.description`,audience:`general`,upstreamUrl:`https://github.com/kimtaeyoon83/mcp-server-youtube-transcript`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@kimtaeyoon83/mcp-server-youtube-transcript`]},configSchema:[],riskLevel:`low`}];function L3n(e){return I3n.find(t=>t.id===e)??null}function R3n(e){return new Set(e.configSchema.filter(e=>e.required).map(e=>e.key))}var z3n=/\$\{([A-Z_][A-Z0-9_]*)\}/g;function B3n(e,t,n){let r=new Set,i=new Set,a=e=>e.replace(z3n,(e,a)=>{i.add(a);let o=t[a];return o===void 0||o===``?(n.has(a)&&r.add(a),``):o}),o;o=e.type===`http`?{type:`http`,url:a(e.url),...e.headers!==void 0&&{headers:V3n(e.headers,a)},...e.enabled!==void 0&&{enabled:e.enabled}}:{type:`stdio`,command:a(e.command),...e.args!==void 0&&{args:e.args.map(a)},...e.env!==void 0&&{env:V3n(e.env,a)},...e.enabled!==void 0&&{enabled:e.enabled}};for(let e of n)i.has(e)||r.add(e);return r.size>0?{ok:!1,missing:[...r]}:{ok:!0,spec:o}}function V3n(e,t){let n={};for(let[r,i]of Object.entries(e))n[r]=t(i);return n}o(),M(),we(),le();var H3n={class:`space-y-3`},U3n={"data-testid":`mcp-catalog`,class:`space-y-2 pt-1`},W3n={class:`text-xs font-semibold text-gray-700`},G3n={class:`group`,open:``,"data-testid":`mcp-catalog-audience-general`},K3n={class:`cursor-pointer text-xs font-medium text-gray-700 select-none py-1`},q3n={class:`text-gray-400 ml-1`},J3n={class:`mt-2 space-y-2`},Y3n=[`data-testid`],X3n={class:`flex items-start gap-2 cursor-pointer`},Z3n=[`checked`,`data-testid`,`onChange`],Q3n={class:`flex-1 min-w-0`},$3n={class:`flex items-center gap-2 flex-wrap`},e6n={class:`text-sm font-semibold text-gray-800`},t6n={class:`text-xs text-gray-600 mt-0.5`},n6n={class:`text-[11px] text-gray-500 flex flex-wrap gap-x-3 ml-6`},r6n=[`href`,`data-testid`,`textContent`],i6n=[`href`,`data-testid`,`textContent`],a6n=[`data-testid`],o6n=[`data-testid`,`onSubmit`],s6n={class:`flex items-center gap-1.5`},c6n=[`for`],l6n=[`aria-label`],u6n=[`href`,`title`,`aria-label`,`data-testid`],d6n=[`id`,`onUpdate:modelValue`,`aria-required`,`data-testid`],f6n={key:0,value:``},p6n=[`value`],m6n=[`id`,`onUpdate:modelValue`,`type`,`placeholder`,`aria-required`,`data-testid`],h6n={key:2,class:`text-[11px] text-gray-500`},g6n=[`data-testid`],_6n={class:`flex gap-2 justify-end`},v6n=[`data-testid`],y6n=[`data-testid`],b6n={class:`text-xs font-semibold text-gray-700`},x6n={key:0,class:`text-xs text-gray-500 italic`,"data-testid":`mcp-empty`},S6n={key:1,class:`space-y-2`,"data-testid":`mcp-server-list`},C6n=[`data-testid`],w6n={class:`flex items-center justify-between`},T6n={class:`flex items-center gap-2`},E6n={class:`text-sm font-semibold text-gray-800`},D6n={class:`flex items-center gap-1 text-xs text-gray-600 ml-2`},O6n=[`checked`,`data-testid`,`onChange`],k6n=[`data-testid`,`onClick`],A6n={key:0,class:`text-xs space-y-1`},j6n={class:`text-gray-500`},M6n={class:`ml-1`},N6n={key:1,class:`text-xs space-y-1`},P6n={class:`text-gray-500`},F6n={class:`ml-1`},I6n={key:0,class:`ml-1`},L6n=[`data-testid`],R6n={class:`flex items-start gap-1.5 text-gray-600 cursor-pointer`},z6n=[`checked`,`data-testid`,`onChange`],B6n={key:3,class:`border border-blue-300 rounded p-3 space-y-2`,"data-testid":`mcp-add-form`},V6n={class:`block text-xs font-semibold text-gray-700`},H6n=[`placeholder`],U6n={class:`flex gap-3 text-xs`},W6n={class:`flex items-center gap-1`},G6n={class:`flex items-center gap-1`},K6n={key:0,class:`space-y-2`},q6n={class:`block text-xs font-semibold text-gray-700`},J6n=[`placeholder`],Y6n={key:1,class:`space-y-2`},X6n={class:`block text-xs font-semibold text-gray-700`},Z6n={class:`block text-xs font-semibold text-gray-700`},Q6n=[`placeholder`],$6n={key:2,class:`text-xs text-red-600`,"data-testid":`mcp-draft-error`},e8n={class:`flex justify-end gap-2`},t8n=`mcp-catalog-draft:`,n8n=`https://github.com/receptron/mulmoclaude/blob/main/docs/mcp-sandbox.md`,r8n=K({__name:`SettingsMcpTab`,props:{servers:{},dockerMode:{type:Boolean}},emits:[`add`,`update`,`remove`],setup(e,{expose:t,emit:n}){let{t:r}=We(),a=e,o=n,l=V(!1),d=V(P()),f=V(``),p=m(()=>I3n.filter(e=>e.audience===`general`));function h(e){return a.servers.some(t=>t.id===e)}function g(e,t){let n=t.target;if(!(n instanceof HTMLInputElement))return;if(n.checked){if(e.configSchema.length>0){x(e),n.checked=!1;return}o(`add`,{id:e.id,spec:{...e.spec,enabled:!0}});return}let r=a.servers.findIndex(t=>t.id===e.id);r>=0&&o(`remove`,r)}let _=V(null),v=V({}),y=V([]);function x(e){_.value=e.id,y.value=[],v.value=O(e.id);for(let t of e.configSchema)v.value[t.key]===void 0&&(v.value[t.key]=``)}function C(){_.value=null,v.value={},y.value=[]}function w(){C()}function E(e){y.value=[];let t=B3n(e.spec,v.value,R3n(e));t.ok?(o(`add`,{id:e.id,spec:{...t.spec,enabled:!0}}),j(e.id),C()):(y.value=t.missing,k(e.id,v.value,e.configSchema))}function O(e){try{let t=window.localStorage.getItem(t8n+e);if(!t)return{};let n=JSON.parse(t);if(!n||typeof n!=`object`||Array.isArray(n))return{};let r={};for(let[e,t]of Object.entries(n))typeof t==`string`&&(r[e]=t);return r}catch{return{}}}function k(e,t,n){let r=new Set(n.filter(e=>e.kind===`secret`).map(e=>e.key)),i={};for(let[e,n]of Object.entries(t))r.has(e)||(i[e]=n);try{window.localStorage.setItem(t8n+e,JSON.stringify(i))}catch{}}function j(e){try{window.localStorage.removeItem(t8n+e)}catch{}}function M(e){return e.kind===`secret`?`password`:e.kind===`url`?`url`:`text`}function N(e){return e===`low`?`bg-green-100 text-green-700`:e===`medium`?`bg-amber-100 text-amber-700`:`bg-red-100 text-red-700`}function P(){return{id:``,type:`http`,url:``,command:`npx`,argsText:``}}function I(){d.value=P(),f.value=``,l.value=!0}function L(){l.value=!1,f.value=``}let R=/^[a-z][a-z0-9_-]{0,63}$/;function z(e){return e.type===`http`?ee(e.url.trim()):te(e.argsText.split(`
|
|
5903
|
+
`),i=t1n(t);return r.length>0?`${i}\n\n${r}\n`:`${i}\n`}o(),M(),we();var r1n=[`disabled`,`title`,`aria-label`],i1n={class:`material-icons text-lg`,"aria-hidden":`true`},a1n=1500,o1n=K({__name:`CopyChatButton`,props:{results:{},resultTimestamps:{},sessionRoleName:{}},setup(e){let{t}=We(),n=e,r=V(!1),i=null;async function a(e){let t=await bN(kP.files.content,{path:e});return t.ok?t.data.content??null:null}async function o(){let e=await n1n(n.results,{sessionRoleName:n.sessionRoleName,resultTimestamps:n.resultTimestamps,readFile:a});try{await navigator.clipboard.writeText(e),r.value=!0,i!==null&&clearTimeout(i),i=setTimeout(()=>{r.value=!1,i=null},a1n)}catch{}}return _(()=>{i!==null&&clearTimeout(i)}),(n,i)=>(B(),U(`button`,{type:`button`,class:c([`h-8 w-8 flex items-center justify-center rounded text-gray-400 hover:text-gray-700 hover:bg-gray-100 transition-colors disabled:opacity-40 disabled:cursor-not-allowed`,{"!text-green-600":r.value}]),"data-testid":`copy-chat-md`,disabled:e.results.length===0,title:r.value?q(t)(`sidebarHeader.copiedMarkdown`):q(t)(`sidebarHeader.copyMarkdown`),"aria-label":r.value?q(t)(`sidebarHeader.copiedMarkdown`):q(t)(`sidebarHeader.copyMarkdown`),onClick:o},[S(`span`,i1n,T(r.value?`check`:`content_copy`),1)],10,r1n))}});o(),M(),we();var s1n={class:`flex-1 min-h-0 flex flex-col bg-gray-100`},c1n={class:`shrink-0 flex items-center gap-2 text-xs text-gray-400 px-3 py-2 border-b border-gray-100`,"data-testid":`sidebar-role-header`},l1n={key:1,class:`truncate`},u1n={class:`ml-auto flex items-center gap-0.5 shrink-0`},d1n=[`title`,`aria-label`,`aria-pressed`],f1n={class:`relative flex-1 min-h-0 flex flex-col`},p1n=[`onClick`],m1n={class:`absolute top-0 left-2 -translate-y-1/2 bg-gray-100 px-1 text-[10px] text-gray-400 leading-none pointer-events-none`},h1n={key:0,class:`absolute top-0 right-2 -translate-y-1/2 bg-gray-100 px-1 text-[10px] text-gray-400 leading-none pointer-events-none`},g1n={key:2,class:`block truncate p-2`},_1n=Qe(K({__name:`SessionSidebar`,props:{results:{},selectedUuid:{},resultTimestamps:{},sessionRoleName:{},sessionRoleIcon:{},sessionModel:{},sessionModelOverride:{},layoutMode:{},showRightSidebar:{type:Boolean},hasNewMessages:{type:Boolean}},emits:[`select`,`activate`,`update:layoutMode`,`toggle-right-sidebar`,`jump-to-latest`,`update:sessionModelOverride`],setup(e,{expose:t,emit:n}){let{t:r}=We();function i(e){if(e.toolName===`text-response`)return e.title??`Assistant`;let t=Na(e)?e.action:void 0;return typeof t==`string`&&t.length>0?`${e.toolName}(${t})`:e.toolName}let a=n,o=V(null);return t({root:o}),(t,n)=>(B(),U(`div`,s1n,[S(`div`,c1n,[e.sessionRoleIcon?(B(),U(`span`,{key:0,class:c([`material-icons text-xs leading-none`,q(g9)])},T(e.sessionRoleIcon),3)):b(``,!0),e.sessionRoleName?(B(),U(`span`,l1n,T(e.sessionRoleName),1)):b(``,!0),e.sessionRoleName?(B(),ke(I$n,{key:2,model:e.sessionModel,override:e.sessionModelOverride,"onUpdate:override":n[0]||=e=>a(`update:sessionModelOverride`,e)},null,8,[`model`,`override`])):b(``,!0),S(`div`,u1n,[De(o1n,{results:e.results,"result-timestamps":e.resultTimestamps,"session-role-name":e.sessionRoleName},null,8,[`results`,`result-timestamps`,`session-role-name`]),S(`button`,{type:`button`,class:c([`h-8 w-8 flex items-center justify-center rounded text-gray-400 hover:text-gray-700 hover:bg-gray-100 transition-colors`,{"!text-blue-500":e.showRightSidebar}]),title:q(r)(`sidebarHeader.toolCallHistory`),"aria-label":q(r)(`sidebarHeader.toolCallHistory`),"aria-pressed":e.showRightSidebar,onClick:n[1]||=e=>a(`toggle-right-sidebar`)},[...n[5]||=[S(`span`,{class:`material-icons text-lg`,"aria-hidden":`true`},`build`,-1)]],10,d1n),De(S$n,{"model-value":e.layoutMode,"onUpdate:modelValue":n[2]||=e=>a(`update:layoutMode`,e)},null,8,[`model-value`])])]),S(`div`,f1n,[e.hasNewMessages?(B(),U(`button`,{key:0,type:`button`,class:`absolute bottom-3 left-1/2 -translate-x-1/2 z-10 flex items-center gap-1 rounded-full bg-blue-600 px-3 py-1.5 text-xs font-medium text-white shadow-lg hover:bg-blue-700 transition-colors`,"data-testid":`chat-new-messages`,onClick:n[3]||=e=>a(`jump-to-latest`)},[J(T(q(r)(`sidebarHeader.newMessages`))+` `,1),n[6]||=S(`span`,{class:`material-icons text-sm leading-none`,"aria-hidden":`true`},`arrow_downward`,-1)])):b(``,!0),S(`div`,{ref_key:`root`,ref:o,class:`flex-1 min-h-0 overflow-y-auto p-2 space-y-2 outline-none`,tabindex:`0`,"data-testid":`tool-results-scroll`,onMousedown:n[4]||=e=>a(`activate`)},[(B(!0),U(D,null,H(e.results,t=>(B(),U(`div`,{key:t.uuid,class:c([`relative cursor-pointer rounded border border-gray-300 text-sm text-gray-900 hover:opacity-75 transition-opacity`,t.uuid===e.selectedUuid?`ring-2 ring-blue-500`:``]),onClick:e=>a(`select`,t.uuid)},[S(`span`,m1n,T(i(t)),1),e.resultTimestamps.get(t.uuid)?(B(),U(`span`,h1n,T(q(QR)(e.resultTimestamps.get(t.uuid))),1)):b(``,!0),q(S5)(t.toolName)?.previewComponent?(B(),ke(fe(q(S5)(t.toolName)?.previewComponent),{key:1,result:t},null,8,[`result`])):(B(),U(`span`,g1n,T(t.title||t.toolName),1))],10,p1n))),128))],544)])]))}}),[[`__scopeId`,`data-v-1abed690`]]),w9=1e3,T9=60*w9,v1n=60*T9;function y1n(e){let t=e>0?e:0;return t<w9?`${(Math.floor(t/100)/10).toFixed(1)}s`:t<T9?`${Math.floor(t/w9)}s`:t<v1n?`${Math.floor(t/T9)}m ${Math.floor(t%T9/w9)}s`:`${Math.floor(t/v1n)}h ${Math.floor(t%v1n/T9)}m`}o(),we(),M();var b1n={class:`px-2 py-1 text-sm`,role:`status`,"aria-live":`polite`,"data-testid":`thinking-indicator`},x1n={class:`flex items-center gap-2 text-gray-500`},S1n={class:`text-xs`},C1n={key:0,class:`text-xs text-gray-400 tabular-nums`,"data-testid":`run-elapsed`},w1n={key:0,class:`mt-1 space-y-0.5`},T1n={class:`font-mono truncate`},E1n={class:`text-xs text-gray-300 tabular-nums shrink-0`},D1n=K({__name:`ThinkingIndicator`,props:{statusMessage:{},runElapsedMs:{default:null},pendingCalls:{default:()=>[]}},setup(e){return(t,n)=>(B(),U(`div`,b1n,[S(`div`,x1n,[S(`span`,S1n,T(e.statusMessage),1),n[0]||=S(`span`,{class:`flex gap-1`,"aria-hidden":`true`},[S(`span`,{class:`w-1.5 h-1.5 rounded-full bg-gray-400 animate-bounce`,style:{"animation-delay":`0ms`}}),S(`span`,{class:`w-1.5 h-1.5 rounded-full bg-gray-400 animate-bounce`,style:{"animation-delay":`150ms`}}),S(`span`,{class:`w-1.5 h-1.5 rounded-full bg-gray-400 animate-bounce`,style:{"animation-delay":`300ms`}})],-1),e.runElapsedMs!==null&&e.runElapsedMs>=1e3?(B(),U(`span`,C1n,` · `+T(q(y1n)(e.runElapsedMs)),1)):b(``,!0)]),e.pendingCalls&&e.pendingCalls.length>0?(B(),U(`div`,w1n,[(B(!0),U(D,null,H(e.pendingCalls,e=>(B(),U(`div`,{key:e.toolUseId,class:`flex items-center gap-1.5 text-xs text-gray-400`},[n[1]||=S(`span`,{class:`w-1.5 h-1.5 rounded-full bg-blue-300 shrink-0 animate-pulse`,"aria-hidden":`true`},null,-1),S(`span`,T1n,T(e.toolName),1),S(`span`,E1n,`· `+T(q(y1n)(e.elapsedMs)),1)]))),128))])):b(``,!0)]))}});o(),M(),we();var O1n=[`title`],k1n=[`title`],A1n=K({__name:`SessionCountBadges`,props:{activeSessionCount:{},unreadCount:{}},setup(e){let{t}=We();return(n,r)=>(B(),U(D,null,[e.activeSessionCount>0?(B(),U(`span`,{key:0,class:`absolute -top-0.5 -left-0.5 min-w-[1rem] h-4 px-0.5 bg-yellow-400 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none cursor-help`,"data-testid":`session-count-active`,title:q(t)(`sessionTabBar.activeSessions`,e.activeSessionCount,{named:{count:e.activeSessionCount}})},T(e.activeSessionCount),9,O1n)):b(``,!0),e.unreadCount>0?(B(),U(`span`,{key:1,class:`absolute -top-0.5 -right-0.5 min-w-[1rem] h-4 px-0.5 bg-red-500 text-white text-[10px] font-bold rounded-full flex items-center justify-center leading-none cursor-help`,"data-testid":`session-count-unread`,title:q(t)(`sessionTabBar.unreadReplies`,e.unreadCount,{named:{count:e.unreadCount}})},T(e.unreadCount),9,k1n)):b(``,!0)],64))}});o(),M(),we();var j1n=[`title`,`aria-label`,`aria-expanded`],M1n=[`aria-label`],N1n={class:`px-3 py-2 text-xs font-semibold text-gray-500 border-b border-gray-100`},P1n={class:`max-h-64 overflow-y-auto py-1 [scrollbar-width:thin]`},F1n=[`data-testid`],I1n=[`title`],L1n=[`title`,`aria-label`,`disabled`,`data-testid`,`onClick`],R1n=[`title`,`aria-label`,`disabled`,`data-testid`,`onClick`],z1n=K({__name:`ShortcutReorderPopover`,setup(e){let{t}=We(),{shortcuts:n,movePinned:r}=oL(),i=V(!1),a=V(null),o=V(null),s=V(null);async function l(e,t){await r(e.kind,e.slug,t)}let{handler:u}=_4({isOpen:i,buttonRef:o,popupRef:s});function d(e){e.key===`Escape`&&i.value&&(i.value=!1)}return P(()=>{document.addEventListener(`mousedown`,u),document.addEventListener(`keydown`,d)}),k(()=>{document.removeEventListener(`mousedown`,u),document.removeEventListener(`keydown`,d)}),(e,r)=>(B(),U(`div`,{ref_key:`wrapper`,ref:a,class:`relative inline-flex flex-none`},[S(`button`,{ref_key:`trigger`,ref:o,type:`button`,class:c([`h-8 w-8 flex items-center justify-center border border-gray-300 rounded bg-white text-gray-600 hover:bg-gray-50 transition-colors`,{"bg-blue-50 text-blue-600":i.value}]),title:q(t)(`shortcuts.reorder.open`),"aria-label":q(t)(`shortcuts.reorder.open`),"aria-expanded":i.value,"aria-haspopup":`true`,"data-testid":`shortcut-reorder-open`,onClick:r[0]||=e=>i.value=!i.value},[...r[1]||=[S(`span`,{class:`material-icons text-base`},`edit`,-1)]],10,j1n),i.value?(B(),U(`div`,{key:0,ref_key:`panel`,ref:s,class:`absolute right-0 top-full mt-1 z-50 w-64 max-w-[80vw] bg-white border border-gray-200 rounded-lg shadow-lg overflow-hidden`,role:`dialog`,"aria-label":q(t)(`shortcuts.reorder.title`),"data-testid":`shortcut-reorder-panel`},[S(`div`,N1n,T(q(t)(`shortcuts.reorder.title`)),1),S(`ul`,P1n,[(B(!0),U(D,null,H(q(n),(e,i)=>(B(),U(`li`,{key:`${e.kind}:${e.slug}`,class:`flex items-center gap-2 px-3 py-1 text-sm text-gray-900`,"data-testid":`shortcut-reorder-row-${e.kind}-${e.slug}`},[S(`span`,{class:c([`h-6 w-6 rounded flex items-center justify-center flex-none`,q(Tt)(e.color)??`text-gray-500`])},[De(q(Wa),{icon:e.icon,"size-class":`text-base`},null,8,[`icon`])],2),S(`span`,{class:`flex-1 truncate`,title:e.title},T(e.title),9,I1n),S(`button`,{type:`button`,class:`h-6 w-6 flex items-center justify-center rounded text-gray-400 hover:text-gray-700 hover:bg-gray-100 disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent`,title:q(t)(`shortcuts.reorder.moveUp`),"aria-label":q(t)(`shortcuts.reorder.moveUp`),disabled:i===0,"data-testid":`shortcut-reorder-up-${e.kind}-${e.slug}`,onClick:t=>l(e,`up`)},[...r[2]||=[S(`span`,{class:`material-icons text-base`},`arrow_upward`,-1)]],8,L1n),S(`button`,{type:`button`,class:`h-6 w-6 flex items-center justify-center rounded text-gray-400 hover:text-gray-700 hover:bg-gray-100 disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent`,title:q(t)(`shortcuts.reorder.moveDown`),"aria-label":q(t)(`shortcuts.reorder.moveDown`),disabled:i===q(n).length-1,"data-testid":`shortcut-reorder-down-${e.kind}-${e.slug}`,onClick:t=>l(e,`down`)},[...r[3]||=[S(`span`,{class:`material-icons text-base`},`arrow_downward`,-1)]],8,R1n)],8,F1n))),128))])],8,M1n)):b(``,!0)],512))}});o(),we(),M();var B1n={class:`inline-flex max-w-full items-center gap-2 text-xs`,"data-testid":`plugin-launcher`},V1n={class:`inline-flex flex-none items-stretch border border-gray-300 rounded`},H1n=[`title`,`aria-label`],U1n=[`title`,`aria-label`,`data-testid`,`onClick`],W1n={class:`material-icons text-base`},G1n=[`aria-label`],K1n=[`title`,`aria-label`,`data-testid`,`onClick`],q1n=K({__name:`PluginLauncher`,props:{activeViewMode:{},shortcuts:{},activeSessionCount:{},unreadCount:{}},emits:[`navigate`,`navigateShortcut`,`navigateChat`],setup(e,{emit:t}){let{t:n}=We(),r=PI(),i=e,a=m(()=>i.shortcuts??[]),o=m(()=>r.name===AP.chat),s=m(()=>i.activeSessionCount??0),l=m(()=>i.unreadCount??0),u=m(()=>{let e=[n(`pluginLauncher.chat.label`)];return s.value>0&&e.push(n(`sessionTabBar.activeSessions`,s.value,{named:{count:s.value}})),l.value>0&&e.push(n(`sessionTabBar.unreadReplies`,l.value,{named:{count:l.value}})),e.join(`, `)}),d=[{key:`dashboard`,kind:`view`,icon:`dashboard`},{key:`wiki`,kind:`view`,icon:`menu_book`},{key:`collections`,kind:`view`,icon:`apps`},{key:`feeds`,kind:`view`,icon:`rss_feed`},{key:`accounting`,kind:`view`,icon:`account_balance`},{key:`files`,kind:`view`,icon:`folder`},{key:`automations`,kind:`view`,icon:`schedule`},{key:`debug`,kind:`view`,icon:`bug_report`,devOnly:!0,literalLabel:`Debug`,literalTitle:`Open debug playground (dev mode only)`}],f=m(()=>d.filter(e=>!e.devOnly||!1));function p(e){return i.activeViewMode===e.key}let h={collection:AP.collections,feed:AP.feeds};function g(e){return i.activeViewMode===h[e.kind]&&r.params.slug===e.slug}function _(e){if(g(e))return`bg-blue-50 text-blue-600`;let t=Tt(e.color);return t?`${t} hover:brightness-95`:`bg-white text-gray-600 hover:bg-gray-50`}let v=t;return(e,t)=>(B(),U(`div`,B1n,[S(`div`,V1n,[S(`button`,{class:c([`relative h-8 w-8 flex items-center justify-center rounded-l border-r border-gray-200 transition-colors`,o.value?`bg-blue-50 text-blue-600`:`bg-white text-gray-600 hover:bg-gray-50`]),title:u.value,"aria-label":u.value,"data-testid":`plugin-launcher-chat`,onClick:t[0]||=e=>v(`navigateChat`)},[t[1]||=S(`span`,{class:`material-icons text-base`},`forum`,-1),De(A1n,{"active-session-count":s.value,"unread-count":l.value},null,8,[`active-session-count`,`unread-count`])],10,H1n),(B(!0),U(D,null,H(f.value,e=>(B(),U(`button`,{key:e.key,class:c([`h-8 w-8 flex items-center justify-center border-r border-gray-200 last:border-r-0 last:rounded-r transition-colors`,p(e)?`bg-blue-50 text-blue-600`:`bg-white text-gray-600 hover:bg-gray-50`]),title:e.literalTitle??q(n)(`pluginLauncher.${e.key}.label`),"aria-label":e.literalLabel??q(n)(`pluginLauncher.${e.key}.label`),"data-testid":`plugin-launcher-${e.key}`,onClick:t=>v(`navigate`,e)},[S(`span`,W1n,T(e.icon),1)],10,U1n))),128))]),a.value.length>0?(B(),U(`div`,{key:0,class:`inline-flex min-w-0 items-stretch border border-gray-300 rounded overflow-x-auto [scrollbar-width:thin]`,"aria-label":q(n)(`shortcuts.zoneAriaLabel`),"data-testid":`plugin-launcher-shortcuts`},[(B(!0),U(D,null,H(a.value,e=>(B(),U(`button`,{key:`${e.kind}:${e.slug}`,class:c([`h-8 w-8 flex items-center justify-center flex-none border-r border-gray-200 last:border-r-0 transition-colors`,_(e)]),title:e.title,"aria-label":e.title,"data-testid":`plugin-launcher-shortcut-${e.kind}-${e.slug}`,onClick:t=>v(`navigateShortcut`,e)},[De(q(Wa),{icon:e.icon,"size-class":`text-base`},null,8,[`icon`])],10,K1n))),128))],8,G1n)):b(``,!0),a.value.length>1?(B(),ke(z1n,{key:1})):b(``,!0)]))}});o(),M();var E9=V([]),D9=V({}),O9=V(null),k9=V(!1),A9=null;function j9(){return{tiles:E9.value,rowHeights:D9.value}}function M9(e){E9.value=e.tiles,D9.value=e.rowHeights}async function N9(e=!1){return A9&&!e||(A9=(async()=>{let e=await bN(kP.dashboard);e.ok?(O9.value=null,M9({tiles:e.data.tiles,rowHeights:e.data.rowHeights??{}}),k9.value=!0):(O9.value=e.error,A9=null)})()),A9}var{enqueue:P9}=Yut();async function F9(e,t){M9(e);let n=await SN(kP.dashboard,{tiles:e.tiles,rowHeights:e.rowHeights});return n.ok?(M9({tiles:n.data.tiles,rowHeights:n.data.rowHeights??e.rowHeights}),O9.value=null,!0):(M9(t),O9.value=n.error,console.error(`[useDashboard] persist failed`,n.error),!1)}function J1n(e){return P9(async()=>(await N9(),k9.value?F9({tiles:e,rowHeights:D9.value},j9()):!1))}function Y1n(e,t){return P9(async()=>{if(await N9(),!k9.value)return!1;if(!E9.value.some(t=>t.slug===e))return!0;let n=j9();return F9({tiles:n.tiles.map(n=>{if(n.slug!==e)return n;if(t===null){let{viewMode:e,...t}=n;return t}return{...n,viewMode:t}}),rowHeights:n.rowHeights},n)})}function X1n(e,t,n){return P9(async()=>{if(await N9(),!k9.value)return!1;if(e<1||t<0)return!0;let r=j9(),i=String(e),a=[...r.rowHeights[i]??[]];for(;a.length<=t;)a.push(0);a[t]=n;let o={...r.rowHeights,[i]:a};return F9({tiles:r.tiles,rowHeights:o},r)})}function Z1n(e){return P9(async()=>{if(await N9(),!k9.value)return;let t=new Set(e),n=E9.value.filter(e=>t.has(e.slug)),r=new Set(n.map(e=>e.slug)),i=e.filter(e=>!r.has(e)).map(e=>({slug:e})),a=[...n,...i];(a.length!==E9.value.length||a.some((e,t)=>e.slug!==E9.value[t]?.slug))&&await F9({tiles:a,rowHeights:D9.value},j9())})}function Q1n(){return N9(),{tiles:m(()=>E9.value),rowHeights:m(()=>D9.value),loadError:m(()=>O9.value),load:N9,setTiles:J1n,setViewMode:Y1n,setRowHeight:X1n,reconcile:Z1n}}o(),M(),we(),le();var $1n={key:0,class:`h-full flex flex-col items-center justify-center text-center text-slate-500 gap-2`},e0n={class:`text-sm font-medium`},t0n={class:`text-xs`},n0n={key:1,class:`grid gap-4 sm:grid-cols-2`,"data-testid":`dashboard-grid`},r0n=[`data-dashboard-index`,`data-testid`],i0n={class:`flex items-center gap-2 px-3 py-2 border-b border-slate-100 bg-slate-50`},a0n=[`title`,`aria-label`,`onPointerdown`],o0n=[`title`,`onClick`,`onDblclick`],s0n={class:`truncate`},c0n=[`value`,`aria-label`,`data-testid`,`onChange`],l0n=[`value`],u0n=[`title`,`aria-label`,`data-testid`,`onPointerdown`],d0n=320,f0n=160,p0n=900,m0n=`(min-width: 640px)`,h0n=K({__name:`DashboardView`,setup(e){let{t}=We(),n=NI(),{shortcuts:r,load:i}=oL(),{tiles:a,rowHeights:o,load:l,reconcile:d,setTiles:f,setViewMode:p,setRowHeight:h}=Q1n(),g=m(()=>r.value.filter(e=>e.kind===`collection`)),_=m(()=>g.value.map(e=>e.slug)),v=e=>g.value.find(t=>t.slug===e),y=V({});async function b(e){if(y.value[e])return;let t=await bN(kP.collections.detail.replace(`:slug`,encodeURIComponent(e)));t.ok&&(y.value={...y.value,[e]:t.data.collection.schema})}function x(e){let t=y.value[e];return t?SQe(t):[`table`]}function C(e){let t=x(e.slug);return t.find(t=>t===e.viewMode)??t[0]??`table`}let w={table:`dashboard.viewTable`,calendar:`dashboard.viewCalendar`,kanban:`dashboard.viewKanban`};function E(e,n){let r=w[n];return r?t(r):y.value[e]?.views?.find(e=>sN(e.id)===n)?.label??n}function O(e,t){let{target:n}=t;n instanceof HTMLSelectElement&&p(e,n.value)}function A(e){n.push({name:AP.collections,params:{slug:e}}).catch(()=>{})}function j(e,t){e.detail===0&&A(t)}function M(e){let{currentTarget:t}=e;if(!(t instanceof HTMLElement))return null;try{t.setPointerCapture(e.pointerId)}catch{}return t}let N=V(null),F=V(null),I=V(!1),R=null;function z(e,t){let n=document.elementFromPoint(e,t)?.closest(`[data-dashboard-index]`);if(!n)return null;let r=Number(n.dataset.dashboardIndex);return Number.isNaN(r)?null:r}function ee(e){R&&(e.preventDefault(),F.value=z(e.clientX,e.clientY))}function te(){window.removeEventListener(`pointermove`,ee),window.removeEventListener(`pointerup`,ne),window.removeEventListener(`pointercancel`,ne),I.value=!1}function ne(){if(te(),!R)return;let{startIndex:e,handle:t,pointerId:n}=R,r=F.value;R=null,N.value=null,F.value=null;try{t.releasePointerCapture(n)}catch{}if(r===null||r===e)return;let i=[...a.value],[o]=i.splice(e,1);o&&(i.splice(r,0,o),f(i))}function re(e,t){let n=M(t);n&&(R={startIndex:e,handle:n,pointerId:t.pointerId},N.value=e,I.value=!0,window.addEventListener(`pointermove`,ee),window.addEventListener(`pointerup`,ne),window.addEventListener(`pointercancel`,ne))}let ie=V(2),ae=null;function oe(){ie.value=ae?.matches?2:1}function W(e){return Math.floor(e/ie.value)}let se=V({});function ce(e,t){return`${e}:${t}`}function le(e){let t=W(e),n=se.value[ce(ie.value,t)];if(n!==void 0)return n;let r=o.value[String(ie.value)]?.[t];return r&&r>0?r:d0n}let ue=V(!1),de=null,fe=null,G=0;function pe(){if(G=0,!de||fe===null)return;let e=Math.min(p0n,Math.max(f0n,de.startHeight+(fe-de.startY)));se.value={...se.value,[ce(de.cols,de.row)]:e}}function me(e){de&&(e.preventDefault(),fe=e.clientY,G||=requestAnimationFrame(pe))}function he(e,t){let n=ce(e,t);se.value=Object.fromEntries(Object.entries(se.value).filter(([e])=>e!==n))}async function ge(e,t,n){await h(e,t,Math.round(n)),he(e,t)}function _e(){window.removeEventListener(`pointermove`,me),window.removeEventListener(`pointerup`,ve),window.removeEventListener(`pointercancel`,ve),G&&cancelAnimationFrame(G),G=0,fe=null,ue.value=!1}function ve(){if(_e(),!de)return;let{cols:e,row:t,handle:n,pointerId:r}=de;de=null;try{n.releasePointerCapture(r)}catch{}let i=se.value[ce(e,t)];i!==void 0&&ge(e,t,i)}function K(e,t){let n=M(t);n&&(de={cols:ie.value,row:W(e),startY:t.clientY,startHeight:le(e),handle:n,pointerId:t.pointerId},ue.value=!0,window.addEventListener(`pointermove`,me),window.addEventListener(`pointerup`,ve),window.addEventListener(`pointercancel`,ve))}return k(()=>{_e(),te(),ae?.removeEventListener(`change`,oe)}),P(async()=>{ae=window.matchMedia(m0n),oe(),ae.addEventListener(`change`,oe),await Promise.all([i(),l()]),await d(_.value)}),Ve(_,e=>void d(e)),Ve(a,e=>e.forEach(e=>void b(e.slug)),{immediate:!0}),(e,n)=>(B(),U(`div`,{class:c([`h-full overflow-auto p-4`,{"select-none":ue.value||I.value}]),"data-testid":`dashboard-view`},[_.value.length===0?(B(),U(`div`,$1n,[n[0]||=S(`span`,{class:`material-icons text-4xl text-slate-300`},`dashboard`,-1),S(`p`,e0n,T(q(t)(`dashboard.empty`)),1),S(`p`,t0n,T(q(t)(`dashboard.emptyHint`)),1)])):(B(),U(`div`,n0n,[(B(!0),U(D,null,H(q(a),(e,r)=>u((B(),U(`section`,{key:e.slug,class:c([`flex flex-col border border-slate-200 rounded-lg bg-white overflow-hidden shadow-sm transition-opacity`,{"ring-2 ring-indigo-400":F.value===r&&N.value!==r,"opacity-50":N.value===r}]),"data-dashboard-index":r,"data-testid":`dashboard-tile-${e.slug}`},[S(`header`,i0n,[S(`span`,{class:`material-icons text-base text-slate-400 cursor-grab select-none touch-none`,title:q(t)(`dashboard.dragHint`),"aria-label":q(t)(`dashboard.dragHint`),"data-testid":`dashboard-tile-drag`,onPointerdown:s(e=>re(r,e),[`prevent`])},`drag_indicator`,40,a0n),S(`button`,{type:`button`,class:`flex items-center gap-1.5 min-w-0 flex-1 text-left text-sm font-semibold text-slate-700 hover:text-indigo-600`,title:q(t)(`dashboard.openFull`),onClick:t=>j(t,e.slug),onDblclick:t=>A(e.slug)},[S(`span`,{class:c([`h-6 w-6 rounded flex items-center justify-center flex-none`,q(Tt)(v(e.slug)?.color)??``])},[De(q(Wa),{icon:v(e.slug)?.icon,fallback:`apps`,"size-class":`text-base`},null,8,[`icon`])],2),S(`span`,s0n,T(v(e.slug)?.title||e.slug),1)],40,o0n),S(`select`,{class:`flex-none text-xs bg-white border border-slate-200 rounded px-1.5 py-1 text-slate-600 focus:outline-none focus:ring-2 focus:ring-indigo-500/20`,value:C(e),"aria-label":q(t)(`dashboard.viewPickerLabel`),"data-testid":`dashboard-tile-view-${e.slug}`,onChange:t=>O(e.slug,t)},[(B(!0),U(D,null,H(x(e.slug),t=>(B(),U(`option`,{key:t,value:t},T(E(e.slug,t)),9,l0n))),128))],40,c0n)]),S(`div`,{class:`overflow-auto`,style:xe({height:`${le(r)}px`})},[(B(),ke(q(pN),{key:`${e.slug}:${C(e)}`,slug:e.slug,"initial-view":C(e),"hide-view-toggle":``,"hide-header":``,"hide-search":``},null,8,[`slug`,`initial-view`]))],4),S(`div`,{class:`h-2 flex-none cursor-row-resize bg-slate-100 hover:bg-indigo-200 transition-colors flex items-center justify-center`,title:q(t)(`dashboard.resizeHint`),"aria-label":q(t)(`dashboard.resizeHint`),"data-testid":`dashboard-tile-resize-${e.slug}`,onPointerdown:s(e=>K(r,e),[`prevent`])},[...n[1]||=[S(`span`,{class:`h-0.5 w-8 rounded-full bg-slate-300`},null,-1)]],40,u0n)],10,r0n)),[[L,v(e.slug)]])),128))]))],2))}}),g0n=3e4,_0n=.85;function v0n(e,t){if(!Number.isFinite(e)||e<=0)return 0;if(!Number.isFinite(t)||t<=0)return Math.min(e,g0n);let n=Math.max(1,Math.floor(t*_0n));return Math.min(e,g0n,n)}function y0n(e,t=80){return e.scrollHeight-e.scrollTop-e.clientHeight<=t}function b0n(e){for(let t of e.querySelectorAll(`*`)){if(t.scrollHeight<=t.clientHeight)continue;let e=getComputedStyle(t);if(e.overflowY===`auto`||e.overflowY===`scroll`||e.overflow===`auto`||e.overflow===`scroll`)return t}return null}function x0n(e,t,n){let r=[],i=new Map;for(let a of e){let e=t(a);if(e===null){r.push({key:n(a),head:a,members:[a],isGroup:!1});continue}let o=i.get(e);if(o!==void 0){o.members.push(a),o.head=a;continue}let s={key:`group:${e}`,head:a,members:[a],isGroup:!0};i.set(e,s),r.push(s)}return r}function S0n(e,t,n,r){let i=null;for(let a of e){let e=t(a.head),o=n(e);if(o!==null){if(o<=r)i=e;else break}}return i}function C0n(e,t,n){if(t===void 0)return{kind:`none`};let r=n(t),i=e=>e.members.some(e=>n(e)===r),a=e[e.length-1];if(a!==void 0&&i(a))return{kind:`bottom`};let o=e.find(i);return o===void 0?{kind:`none`}:{kind:`card`,headUuid:n(o.head)}}o(),M(),we();var w0n={class:`h-full flex flex-col bg-gray-50`},T0n={class:`shrink-0 flex items-center gap-1 text-xs text-gray-400 px-4 pt-3 pb-2`,"data-testid":`stack-role-header`},E0n={key:1},D0n={class:`ml-auto flex items-center gap-0.5`},O0n=[`title`,`aria-label`,`aria-pressed`],k0n={key:0,class:`flex-1 flex flex-col items-center justify-center h-full px-6 text-center`,"data-testid":`stack-empty`},A0n={key:1,class:`text-lg font-medium text-gray-700 mb-4`},j0n={key:2,class:`flex flex-wrap gap-2 justify-center max-w-xl`},M0n=[`onClick`],N0n={key:3,class:`text-sm text-gray-500`},P0n=[`title`,`onClick`],F0n={class:`material-icons text-sm text-gray-400`},I0n={class:`text-sm font-medium text-gray-800 truncate`},L0n={key:0,class:`text-[10px] text-gray-400 shrink-0`},R0n={key:1,class:`text-[10px] text-gray-400 shrink-0`},z0n={class:`font-mono text-xs text-gray-400 shrink-0`},B0n={key:0,class:`stack-text-response`},V0n={key:1,class:`h-full overflow-auto p-4 text-xs text-gray-500 whitespace-pre-wrap`},H0n=`min(60vh, 560px)`,U0n=150,W0n=Qe(K({__name:`StackView`,props:{toolResults:{},selectedResultUuid:{},resultTimestamps:{},sendTextMessage:{type:Function},queries:{},sessionRoleName:{},sessionRoleIcon:{},sessionModel:{},sessionModelOverride:{},layoutMode:{},showRightSidebar:{type:Boolean},googleMapKey:{}},emits:[`select`,`updateResult`,`update:layoutMode`,`toggle-right-sidebar`,`update:sessionModelOverride`],setup(e,{emit:t}){let{t:n}=We(),r={[bI.presentMulmoScript]:`min(85vh, 820px)`};function i(e){return r[e]??H0n}let a=new Set([`presentHtml`,`presentDocument`,`presentSpreadsheet`,`manageWiki`,`presentChart`,`skill`]);function o(e){return a.has(e)}let s=e;function l(e){return e===bI.mapControl?s.googleMapKey??null:null}let u=t,d=V(null),f=V(!0),p=new Map,h=new Map;function g(e){let{toolName:t,uuid:n}=e;typeof t==`string`&&typeof n==`string`&&u(`updateResult`,{...e,toolName:t,uuid:n})}function v(e,t){t?p.set(e,t):p.delete(e)}let y=e=>e instanceof HTMLElement?e:null;function x(e,t){let n=y(t);n?(h.set(e,n),be(()=>O(n))):h.delete(e)}function C(e){if(e.toolName!==bI.mapControl)return null;let{data:t}=e;if(!Na(t))return null;let{groupId:n}=t;return typeof n==`string`&&n.length>0?n:null}let w=m(()=>x0n(s.toolResults,C,e=>e.uuid));function E(e,t){let n=y(t);for(let t of e)v(t.uuid,n)}function O(e){let t=e.querySelectorAll(`iframe`);for(let e of t){if(e.dataset.stackSized===`true`)continue;e.dataset.stackSized=`true`;let t=()=>I(e);e.addEventListener(`load`,t);try{e.contentDocument?.readyState===`complete`&&t()}catch{}}}let k=new WeakMap,A=new Map,j=null;function M(e){let t=k.get(e);if(t&&t.isConnected)return t;for(let t of h.values())for(let n of t.querySelectorAll(`iframe`)){let t=n.contentWindow;if(t&&(k.set(t,n),t===e))return n}return null}function N(){j=null;for(let[e,t]of A)e.isConnected&&e.style.setProperty(`height`,`${t}px`,`important`);A.clear()}function F(e){let{data:t}=e;if(!Na(t)||t.type!==`mc-iframe-height`)return;let n=t.height;if(typeof n!=`number`)return;let{source:r}=e;if(!r)return;let i=M(r);if(!i)return;let a=v0n(n,window.innerHeight);a<=0||(A.set(i,a),j===null&&(j=requestAnimationFrame(N)))}function I(e){try{let t=e.contentDocument;if(!t)return;let n=v0n(Math.max(t.documentElement?.scrollHeight??0,t.body?.scrollHeight??0),window.innerHeight);if(n<=0)return;e.style.height=`${n}px`}catch{}}function L(e){if(e.toolName!==`text-response`)return!1;let{data:t}=e;return Na(t)?typeof t.text==`string`:!1}function R(e){return e===`text-response`?`chat`:`extension`}let z=!1,ee=null,te=null,ne=null;function re(){z=!0,ee!==null&&clearTimeout(ee),ee=setTimeout(()=>{z=!1,ee=null},U0n)}function ie(e){let t=parseFloat(getComputedStyle(e).paddingTop);return Number.isFinite(t)?t:0}function ae(){if(!d.value)return null;let e=d.value,t=e.getBoundingClientRect().top+ie(e);return S0n(w.value,e=>e.uuid,e=>{let t=p.get(e);return t?t.getBoundingClientRect().top:null},t)}function oe(){z||(d.value&&(f.value=y0n(d.value)),te===null&&(te=requestAnimationFrame(()=>{if(te=null,z)return;let e=ae();e&&e!==s.selectedResultUuid&&(ne=e,u(`select`,e))})))}Ve(()=>s.selectedResultUuid,e=>{e&&(ne===e?ne=null:(ne=null,be(()=>{let t=p.get(e);t&&(re(),t.scrollIntoView({block:`start`,behavior:`auto`}))})))});let W=m(()=>{let e=s.toolResults,t=e[e.length-1];return`${e.length}:${t?.uuid??``}:${t?.message?.length??0}`});return Ve(W,()=>{be(()=>{if(d.value&&f.value){re();let e=s.toolResults[s.toolResults.length-1],t=C0n(w.value,e,e=>e.uuid);if(t.kind===`bottom`)d.value.scrollTop=d.value.scrollHeight;else if(t.kind===`card`){let e=p.get(t.headUuid);e&&e.scrollIntoView({block:`nearest`,behavior:`auto`})}}for(let e of h.values())O(e)})}),Ve(d,(e,t)=>{t?.removeEventListener(`scroll`,oe),e?.addEventListener(`scroll`,oe,{passive:!0})},{immediate:!0}),P(()=>{window.addEventListener(`message`,F),be(()=>{if(!s.selectedResultUuid)return;let e=p.get(s.selectedResultUuid);e&&(re(),e.scrollIntoView({block:`start`,behavior:`auto`}))})}),_(()=>{d.value?.removeEventListener(`scroll`,oe),window.removeEventListener(`message`,F),te!==null&&cancelAnimationFrame(te),ee!==null&&clearTimeout(ee),j!==null&&cancelAnimationFrame(j),A.clear(),h.clear()}),(t,r)=>(B(),U(`div`,w0n,[S(`div`,T0n,[e.sessionRoleIcon?(B(),U(`span`,{key:0,class:c([`material-icons text-xs leading-none`,q(g9)])},T(e.sessionRoleIcon),3)):b(``,!0),e.sessionRoleName?(B(),U(`span`,E0n,T(e.sessionRoleName),1)):b(``,!0),e.sessionRoleName?(B(),ke(I$n,{key:2,model:e.sessionModel,override:e.sessionModelOverride,"onUpdate:override":r[0]||=e=>u(`update:sessionModelOverride`,e)},null,8,[`model`,`override`])):b(``,!0),S(`div`,D0n,[De(o1n,{results:e.toolResults,"result-timestamps":e.resultTimestamps,"session-role-name":e.sessionRoleName},null,8,[`results`,`result-timestamps`,`session-role-name`]),S(`button`,{type:`button`,class:c([`h-8 w-8 flex items-center justify-center rounded text-gray-400 hover:text-gray-700 hover:bg-gray-100 transition-colors`,{"!text-blue-500":e.showRightSidebar}]),title:q(n)(`sidebarHeader.toolCallHistory`),"aria-label":q(n)(`sidebarHeader.toolCallHistory`),"aria-pressed":e.showRightSidebar,onClick:r[1]||=e=>u(`toggle-right-sidebar`)},[...r[3]||=[S(`span`,{class:`material-icons text-lg`,"aria-hidden":`true`},`build`,-1)]],10,O0n),De(S$n,{"model-value":e.layoutMode,"onUpdate:modelValue":r[2]||=e=>u(`update:layoutMode`,e)},null,8,[`model-value`])])]),e.toolResults.length===0?(B(),U(`div`,k0n,[e.sessionRoleIcon?(B(),U(`span`,{key:0,class:c([`material-icons text-5xl text-gray-400 mb-2`,q(g9)]),"aria-hidden":`true`},T(e.sessionRoleIcon),3)):b(``,!0),e.sessionRoleName?(B(),U(`p`,A0n,T(e.sessionRoleName),1)):b(``,!0),e.queries&&e.queries.length>0&&e.sendTextMessage?(B(),U(`div`,j0n,[(B(!0),U(D,null,H(e.queries,(t,n)=>(B(),U(`button`,{key:`${n}-${t}`,type:`button`,class:`text-sm bg-gray-100 hover:bg-gray-200 text-gray-700 rounded-full px-4 py-2 border border-gray-300 transition-colors`,"data-testid":`stack-empty-query`,onClick:n=>e.sendTextMessage(t)},T(t),9,M0n))),128))])):(B(),U(`p`,N0n,T(q(n)(`app.startConversation`)),1))])):(B(),U(`div`,{key:1,ref_key:`containerRef`,ref:d,class:`flex-1 min-h-0 overflow-y-auto px-4 pb-4 space-y-3`,"data-testid":`stack-scroll`},[(B(!0),U(D,null,H(w.value,t=>(B(),U(`div`,{key:t.key,ref_for:!0,ref:e=>E(t.members,e),class:c([`bg-white rounded-lg border transition-colors`,t.members.some(t=>t.uuid===e.selectedResultUuid)?`border-blue-400 ring-2 ring-blue-200`:`border-gray-200`])},[S(`button`,{class:`w-full flex items-center gap-2 px-3 py-2 border-b border-gray-100 text-left hover:bg-gray-50`,title:t.head.title||t.head.toolName,onClick:e=>u(`select`,t.head.uuid)},[S(`span`,F0n,T(R(t.head.toolName)),1),S(`span`,I0n,T(t.head.title||t.head.toolName),1),t.isGroup&&t.members.length>1?(B(),U(`span`,L0n,T(`${t.members.length}×`),1)):b(``,!0),e.resultTimestamps.get(t.head.uuid)?(B(),U(`span`,R0n,T(q(QR)(e.resultTimestamps.get(t.head.uuid))),1)):b(``,!0),S(`span`,z0n,T(t.head.toolName),1)],8,P0n),L(t.head)?(B(),U(`div`,B0n,[De(q(d4),{"selected-result":t.head,onUpdateResult:g},null,8,[`selected-result`])])):o(t.head.toolName)?(B(),U(`div`,{key:1,ref_for:!0,ref:e=>x(t.head.uuid,e),class:`stack-natural`},[q(S5)(t.head.toolName)?.viewComponent?(B(),ke(fe(q(S5)(t.head.toolName)?.viewComponent),{key:`${t.key}-${l(t.head.toolName)??``}`,"selected-result":t.head,"send-text-message":e.sendTextMessage,"google-map-key":l(t.head.toolName),onUpdateResult:g},null,40,[`selected-result`,`send-text-message`,`google-map-key`])):b(``,!0)],512)):(B(),U(`div`,{key:2,style:xe({height:i(t.head.toolName)})},[q(S5)(t.head.toolName)?.viewComponent?(B(),ke(fe(q(S5)(t.head.toolName)?.viewComponent),{key:`${t.key}-${l(t.head.toolName)??``}`,"selected-result":t.head,results:t.isGroup?t.members:void 0,"send-text-message":e.sendTextMessage,"google-map-key":l(t.head.toolName),onUpdateResult:g},null,40,[`selected-result`,`results`,`send-text-message`,`google-map-key`])):(B(),U(`pre`,V0n,T(JSON.stringify(t.head,null,2)),1))],4))],2))),128))],512))]))}}),[[`__scopeId`,`data-v-7bdfeccd`]]),G0n=`files_expanded_dirs`,K0n=[``];function q0n(e){if(e===null)return new Set(K0n);try{let t=JSON.parse(e);if(!Array.isArray(t))return new Set(K0n);let n=t.filter(e=>typeof e==`string`);return new Set(n)}catch{return new Set(K0n)}}function J0n(e){return JSON.stringify([...e])}M(),o();function Y0n(){if(typeof localStorage>`u`)return q0n(null);try{return q0n(localStorage.getItem(G0n))}catch{return q0n(null)}}var I9=V(Y0n());Ve(I9,e=>{try{localStorage.setItem(G0n,J0n(e))}catch{}});function X0n(){function e(e){return I9.value.has(e)}function t(e){let t=new Set(I9.value);t.has(e)?t.delete(e):t.add(e),I9.value=t}function n(e){if(I9.value.has(e))return;let t=new Set(I9.value);t.add(e),I9.value=t}function r(){return Array.from(I9.value)}return{isExpanded:e,toggle:t,expand:n,expandedPaths:r}}o(),M();var Z0n=null;function L9(e){return e.dataTransfer?.types.includes(`Files`)??!1}function Q0n(){r2n()}var $0n=V(0),e2n=null;function t2n(){if(e2n!==null||typeof window>`u`)return;let e=()=>{$0n.value+=1};window.addEventListener(`drop`,e),window.addEventListener(`dragend`,e),e2n=e}function n2n(){return r2n(),t2n(),$0n}function r2n(){if(Z0n!==null||typeof window>`u`)return;let e=e=>{L9(e)&&e.preventDefault()};window.addEventListener(`dragover`,e),window.addEventListener(`drop`,e),Z0n=e}function i2n(e){r2n();let t=V(!1),n=0;function r(e){L9(e)&&(e.preventDefault(),n+=1,t.value=!0)}function i(e){L9(e)&&e.preventDefault()}function a(){n!==0&&(--n,n<=0&&s())}function o(t){if(!L9(t))return;t.preventDefault(),s();let n=t.dataTransfer?.files;n&&n.length>0&&e.onFiles(Array.from(n))}function s(){n=0,t.value=!1}return P(()=>{typeof window<`u`&&(window.addEventListener(`drop`,s),window.addEventListener(`dragend`,s))}),k(()=>{typeof window<`u`&&(window.removeEventListener(`drop`,s),window.removeEventListener(`dragend`,s))}),{isDragging:t,onDragenter:r,onDragover:i,onDragleave:a,onDrop:o}}function a2n(e,t){let n=e.slice();return n.sort((e,n)=>{if(e.type!==n.type)return e.type===`dir`?-1:1;if(t===`recent`){let t=e.modifiedMs??-1/0,r=n.modifiedMs??-1/0;if(t!==r)return r-t}return e.name.localeCompare(n.name)}),n}var o2n=[{kind:`exact`,path:`config/mcp.json`,descriptor:{id:`mcp`,schemaRef:`server/system/config.ts`,editPolicy:`user-editable`}},{kind:`exact`,path:`config/settings.json`,descriptor:{id:`settings`,schemaRef:`server/system/config.ts`,editPolicy:`user-editable`}},{kind:`exact`,path:`config/scheduler/tasks.json`,descriptor:{id:`schedulerTasks`,schemaRef:`server/utils/files/user-tasks-io.ts`,editPolicy:`agent-managed`}},{kind:`exact`,path:`config/scheduler/overrides.json`,descriptor:{id:`schedulerOverrides`,schemaRef:`server/utils/files/scheduler-overrides-io.ts`,editPolicy:`agent-managed`}},{kind:`exact`,path:`data/scheduler/items.json`,descriptor:{id:`schedulerItems`,schemaRef:`server/utils/files/scheduler-io.ts`,editPolicy:`agent-managed`}},{kind:`exact`,path:`data/wiki/index.md`,descriptor:{id:`wikiIndex`,editPolicy:`agent-managed`}},{kind:`exact`,path:`data/wiki/log.md`,descriptor:{id:`wikiLog`,editPolicy:`agent-managed`}},{kind:`exact`,path:`data/wiki/summary.md`,descriptor:{id:`wikiSummary`,editPolicy:`agent-managed`}},{kind:`exact`,path:`data/wiki/SCHEMA.md`,descriptor:{id:`wikiSchema`,editPolicy:`fragile-format`}},{kind:`exact`,path:`conversations/memory.md`,descriptor:{id:`memory`,schemaRef:`server/agent/prompt.ts`,editPolicy:`agent-managed-but-hand-editable`}},{kind:`exact`,path:`conversations/summaries/_index.md`,descriptor:{id:`summariesIndex`,editPolicy:`agent-managed`}},{kind:`pattern`,regex:/^config\/roles\/[^/]+\.json$/,descriptor:{id:`rolesJson`,schemaRef:`src/config/roles.ts`,editPolicy:`user-editable`}},{kind:`pattern`,regex:/^config\/roles\/[^/]+\.md$/,descriptor:{id:`rolesMd`,schemaRef:`src/config/roles.ts`,editPolicy:`user-editable`}},{kind:`pattern`,regex:/^conversations\/summaries\/daily\/\d{4}\/\d{2}\/\d{2}\.md$/,descriptor:{id:`journalDaily`,editPolicy:`agent-managed`}},{kind:`pattern`,regex:/^conversations\/summaries\/topics\/[^/]+\.md$/,descriptor:{id:`journalTopic`,editPolicy:`agent-managed`}}];function s2n(e){for(let t of o2n)if(t.kind===`exact`&&t.path===e||t.kind===`pattern`&&t.regex.test(e))return t.descriptor;return null}var c2n=new Set([`user-editable`,`agent-managed-but-hand-editable`]);function l2n(e){let t=s2n(e);return t===null||c2n.has(t.editPolicy)}var u2n={"agent-managed-but-hand-editable":`text-emerald-500`,"user-editable":`text-blue-500`,"agent-managed":`text-amber-500`,"fragile-format":`text-orange-500`,ephemeral:`text-gray-400`},d2n=[`data`,`artifacts`,`config`];function f2n(e){return d2n.includes(e)}var p2n=[{folder:`data/wiki/pages`,extension:`.md`,placeholderKey:`fileTree.newFilePlaceholder.wikiPage`},{folder:`conversations/summaries`,extension:`.md`,placeholderKey:`fileTree.newFilePlaceholder.summary`},{folder:`artifacts/documents`,extension:`.md`,placeholderKey:`fileTree.newFilePlaceholder.document`},{folder:`artifacts/html`,extension:`.html`,placeholderKey:`fileTree.newFilePlaceholder.html`},{folder:`artifacts/stories`,extension:`.json`,placeholderKey:`fileTree.newFilePlaceholder.story`}];function m2n(e){return p2n.find(t=>t.folder===e)??null}function h2n(e,t){let n=e.trim().replace(/\.[a-z0-9]+$/i,``);return n.length===0?{ok:!1,reason:`empty`}:EXe(n)?{ok:!0,filename:n+t.extension}:{ok:!1,reason:`unsafe`}}o(),M(),we(),le();var g2n=[`data-testid`,`data-drop-target`,`title`],_2n={class:`material-icons text-sm text-gray-400 shrink-0`},v2n={class:`text-gray-700 truncate`},y2n=[`data-testid`,`data-selected`,`title`],b2n={class:`truncate`},x2n=[`title`],S2n={key:2,class:`pl-4`},C2n=[`data-testid`],w2n=[`placeholder`,`aria-label`],T2n={class:`text-xs text-gray-400 font-mono shrink-0 select-none`},E2n={key:1,class:`px-2 py-1 text-xs text-red-600`,"data-testid":`file-tree-new-file-error`},D2n={key:2,class:`px-2 py-1 text-xs text-gray-400`},O2n=`text-gray-400`,k2n=K({__name:`FileTree`,props:{node:{},selectedPath:{},recentPaths:{},childrenByPath:{},sortMode:{},showHiddenSystem:{type:Boolean},allowUpload:{type:Boolean}},emits:[`select`,`loadChildren`,`uploadFiles`,`createFile`],setup(e,{emit:t}){let{t:n}=We(),r=e,i=t,{isExpanded:a,toggle:o,expand:l}=X0n(),d=m(()=>a(r.node.path)),f=m(()=>r.childrenByPath.get(r.node.path)),p=m(()=>f.value===null),h=m(()=>Array.isArray(f.value)?a2n(f.value,r.sortMode):[]),g=m(()=>r.node.path===``),_=m(()=>!g.value||r.showHiddenSystem?h.value:h.value.filter(e=>e.type===`dir`&&f2n(e.name)));Ve([d,f],([e,t])=>{e&&r.node.type===`dir`&&t===void 0&&i(`loadChildren`,r.node.path)},{immediate:!0});function v(){o(r.node.path),a(r.node.path)&&f.value===void 0&&i(`loadChildren`,r.node.path)}let y=V(!1),x=0;function C(e){return e.dataTransfer?.types.includes(`Files`)??!1}function w(e){return r.allowUpload&&r.node.type===`dir`&&C(e)}function E(e){w(e)&&(e.preventDefault(),x+=1,y.value=!0)}function O(e){w(e)&&e.preventDefault()}function M(){x!==0&&(--x,x<=0&&P())}function N(e){if(!w(e))return;e.preventDefault(),e.stopPropagation(),P();let t=e.dataTransfer?.files;t&&t.length>0&&i(`uploadFiles`,{folder:r.node.path,files:Array.from(t)})}function P(){x=0,y.value=!1}Ve(n2n(),P);let F=new Set([`.mp3`,`.wav`,`.m4a`,`.ogg`,`.oga`,`.flac`,`.aac`]),I=m(()=>{if(r.node.type!==`file`)return`description`;let{name:e}=r.node,t=e.lastIndexOf(`.`);if(t<0)return`description`;let n=e.slice(t).toLowerCase();return F.has(n)?`audiotrack`:`description`}),L=m(()=>r.recentPaths.has(r.node.path)),R=m(()=>{if(r.node.type!==`file`)return O2n;let e=s2n(r.node.path);return e?u2n[e.editPolicy]:O2n}),z=m(()=>r.node.type===`dir`?m2n(r.node.path):null),ee=m(()=>z.value?n(z.value.placeholderKey):``),te=V(!1),ne=V(0),re=V(0),ie=V(!1),ae=V(``),oe=V(null),W=V(null),se=!1;function ce(e){z.value&&(e.preventDefault(),ne.value=e.clientX,re.value=e.clientY,te.value=!0)}function le(){te.value=!1}function ue(){le(),z.value&&(a(r.node.path)||l(r.node.path),ae.value=``,oe.value=null,ie.value=!0,be(()=>{W.value?.focus()}))}function de(){ie.value=!1,ae.value=``,oe.value=null}function fe(){se?se=!1:de()}let G=V(!1);function pe(){G.value=!0}function me(){setTimeout(()=>{G.value=!1},0)}function he(e){if(e.key===`Enter`){if(G.value||e.isComposing||e.keyCode===229)return;e.preventDefault(),_e()}else e.key===`Escape`&&(e.preventDefault(),de())}function ge(){se=!0,be(()=>{W.value?.focus(),setTimeout(()=>{se=!1},0)})}function _e(){if(!z.value)return;let e=h2n(ae.value,z.value);e.ok?(se=!0,i(`createFile`,{folder:r.node.path,filename:e.filename,resolve:(e,t)=>{e?de():(oe.value=t??n(`fileTree.newFileError.saveFailed`),ge())}})):(oe.value=e.reason===`empty`?n(`fileTree.newFileError.empty`):n(`fileTree.newFileError.unsafe`),ge())}function ve(){te.value&&le()}function K(e){e.key===`Escape`&&te.value&&le()}return Ve(te,e=>{e?(window.addEventListener(`click`,ve),window.addEventListener(`keydown`,K)):(window.removeEventListener(`click`,ve),window.removeEventListener(`keydown`,K))}),k(()=>{window.removeEventListener(`click`,ve),window.removeEventListener(`keydown`,K)}),(t,r)=>{let a=A(`FileTree`,!0);return B(),U(`div`,null,[e.node.type===`dir`?(B(),U(`button`,{key:0,class:c([`w-full flex items-center gap-1 px-2 py-1 text-left text-sm rounded transition-colors`,y.value?`bg-blue-100 ring-1 ring-blue-400`:`hover:bg-gray-100`]),"data-testid":`file-tree-dir-${e.node.name||`root`}`,"data-drop-target":y.value?`true`:void 0,title:e.allowUpload?q(n)(`fileTree.dropHint`):void 0,onClick:v,onContextmenu:ce,onDragenter:E,onDragover:O,onDragleave:M,onDrop:N},[S(`span`,_2n,T(d.value?`folder_open`:`folder`),1),S(`span`,v2n,T(e.node.name||q(n)(`fileTree.workspace`)),1)],42,g2n)):(B(),U(`button`,{key:1,class:c([`w-full flex items-center gap-1 px-2 py-1 text-left text-sm rounded transition-colors`,e.selectedPath===e.node.path?`bg-blue-100 text-blue-700`:`text-gray-700 hover:bg-gray-100`]),"data-testid":`file-tree-file-${e.node.name}`,"data-selected":e.selectedPath===e.node.path?`true`:void 0,title:e.node.path,onClick:r[0]||=t=>i(`select`,e.node.path)},[S(`span`,{class:c([`material-icons text-sm shrink-0`,R.value])},T(I.value),3),S(`span`,b2n,T(e.node.name),1),L.value?(B(),U(`span`,{key:0,class:`ml-auto w-1.5 h-1.5 rounded-full bg-green-500 shrink-0`,title:q(n)(`fileTree.recentlyChanged`)},null,8,x2n)):b(``,!0)],10,y2n)),e.node.type===`dir`&&d.value?(B(),U(`div`,S2n,[ie.value?(B(),U(`div`,{key:0,class:`flex items-center gap-1 px-2 py-1 text-sm`,"data-testid":`file-tree-new-file-input-${e.node.name||`root`}`},[r[7]||=S(`span`,{class:`material-icons text-sm text-gray-400 shrink-0`},`description`,-1),u(S(`input`,{ref_key:`newFileInputRef`,ref:W,"onUpdate:modelValue":r[1]||=e=>ae.value=e,type:`text`,class:`flex-1 min-w-0 px-1 py-0.5 text-sm border border-blue-400 rounded focus:outline-none focus:ring-1 focus:ring-blue-400`,placeholder:ee.value,"aria-label":q(n)(`fileTree.newFileInputAria`),"data-testid":`file-tree-new-file-input`,onKeydown:he,onCompositionstart:pe,onCompositionend:me,onBlur:fe},null,40,w2n),[[Fe,ae.value]]),S(`span`,T2n,T(z.value?.extension),1)],8,C2n)):b(``,!0),oe.value?(B(),U(`div`,E2n,T(oe.value),1)):b(``,!0),p.value?(B(),U(`div`,D2n,T(q(n)(`common.loading`)),1)):b(``,!0),(B(!0),U(D,null,H(_.value,t=>(B(),ke(a,{key:t.path,node:t,"selected-path":e.selectedPath,"recent-paths":e.recentPaths,"children-by-path":e.childrenByPath,"sort-mode":e.sortMode,"show-hidden-system":e.showHiddenSystem,"allow-upload":e.allowUpload,onSelect:r[2]||=e=>i(`select`,e),onLoadChildren:r[3]||=e=>i(`loadChildren`,e),onCreateFile:r[4]||=e=>i(`createFile`,e),onUploadFiles:r[5]||=e=>i(`uploadFiles`,e)},null,8,[`node`,`selected-path`,`recent-paths`,`children-by-path`,`sort-mode`,`show-hidden-system`,`allow-upload`]))),128))])):b(``,!0),(B(),ke(j,{to:`body`},[te.value?(B(),U(`div`,{key:0,class:`fixed z-50 min-w-32 bg-white border border-gray-200 rounded shadow-md py-1 text-sm`,style:xe({top:`${re.value}px`,left:`${ne.value}px`}),"data-testid":`file-tree-context-menu`,translate:`no`,onClick:r[6]||=s(()=>{},[`stop`])},[S(`button`,{type:`button`,class:`w-full text-left px-3 py-1.5 hover:bg-gray-100 flex items-center gap-2`,"data-testid":`file-tree-context-new-file`,onClick:ue},[r[8]||=S(`span`,{class:`material-icons text-sm text-gray-400`},`note_add`,-1),J(` `+T(q(n)(`fileTree.newFileMenuItem`)),1)])],4)):b(``,!0)]))])}}});o(),M(),we();var A2n={class:`w-72 flex-shrink-0 border-r border-gray-200 overflow-y-auto p-2 bg-gray-50`},j2n={class:`flex flex-wrap justify-end items-center gap-x-3 gap-y-1 pb-1 text-xs`},M2n=[`title`],N2n=[`checked`],P2n={class:`flex items-center gap-2`},F2n={class:`text-gray-400`},I2n={class:`flex border border-gray-300 rounded overflow-hidden`},L2n=[`aria-pressed`,`title`],R2n=[`aria-pressed`,`title`],z2n={key:0,class:`p-2 text-xs text-red-600`},B2n={key:1,class:`p-2 text-xs text-gray-400`},V2n={class:`mt-2 pt-2 border-t border-gray-200 px-1 mb-1 flex items-center gap-1`},H2n={class:`text-[10px] font-semibold text-gray-400 uppercase`},U2n={class:`text-[9px] px-1 py-0.5 rounded bg-blue-100 text-blue-600`},W2n=K({__name:`FileTreePane`,props:{rootNode:{},refRoots:{},childrenByPath:{},treeError:{},selectedPath:{},recentPaths:{},sortMode:{},showHiddenSystem:{type:Boolean}},emits:[`select`,`loadChildren`,`update:sortMode`,`update:showHiddenSystem`,`createFile`,`uploadFiles`],setup(e,{emit:t}){let{t:n}=We(),r=t;function i(e){let{target:t}=e;t instanceof HTMLInputElement&&r(`update:showHiddenSystem`,t.checked)}Q0n();let a=new Set;return(t,o)=>(B(),U(`div`,A2n,[S(`div`,j2n,[S(`label`,{class:`flex items-center gap-1 text-gray-500 cursor-pointer select-none`,title:q(n)(`fileTreePane.showSystemFilesTitle`)},[S(`input`,{type:`checkbox`,class:`h-3.5 w-3.5`,"data-testid":`file-tree-show-system-toggle`,checked:e.showHiddenSystem,onChange:i},null,40,N2n),J(` `+T(q(n)(`fileTreePane.showSystemFiles`)),1)],8,M2n),S(`div`,P2n,[S(`span`,F2n,T(q(n)(`fileTreePane.sort`)),1),S(`div`,I2n,[S(`button`,{type:`button`,class:c([`h-8 px-2.5 flex items-center gap-1 transition-colors`,e.sortMode===`name`?`bg-blue-50 text-blue-700 font-medium`:`bg-white text-gray-500 hover:bg-gray-50`]),"aria-pressed":e.sortMode===`name`,title:q(n)(`fileTreePane.sortByName`),"data-testid":`file-sort-name`,onClick:o[0]||=e=>r(`update:sortMode`,`name`)},T(q(n)(`fileTreePane.name`)),11,L2n),S(`button`,{type:`button`,class:c([`h-8 px-2.5 flex items-center gap-1 transition-colors`,e.sortMode===`recent`?`bg-blue-50 text-blue-700 font-medium`:`bg-white text-gray-500 hover:bg-gray-50`]),"aria-pressed":e.sortMode===`recent`,title:q(n)(`fileTreePane.sortByRecent`),"data-testid":`file-sort-recent`,onClick:o[1]||=e=>r(`update:sortMode`,`recent`)},T(q(n)(`fileTreePane.recent`)),11,R2n)])])]),e.treeError?(B(),U(`div`,z2n,T(e.treeError),1)):e.rootNode?(B(),ke(k2n,{key:2,node:e.rootNode,"selected-path":e.selectedPath,"recent-paths":e.recentPaths,"children-by-path":e.childrenByPath,"sort-mode":e.sortMode,"show-hidden-system":e.showHiddenSystem,"allow-upload":``,onSelect:o[2]||=e=>r(`select`,e),onLoadChildren:o[3]||=e=>r(`loadChildren`,e),onCreateFile:o[4]||=e=>r(`createFile`,e),onUploadFiles:o[5]||=e=>r(`uploadFiles`,e)},null,8,[`node`,`selected-path`,`recent-paths`,`children-by-path`,`sort-mode`,`show-hidden-system`])):(B(),U(`div`,B2n,T(q(n)(`common.loading`)),1)),e.refRoots.length>0?(B(),U(D,{key:3},[S(`div`,V2n,[S(`span`,H2n,T(q(n)(`fileTreePane.reference`)),1),S(`span`,U2n,T(q(n)(`fileTreePane.readOnlyBadge`)),1)]),(B(!0),U(D,null,H(e.refRoots,t=>(B(),ke(k2n,{key:t.path,node:t,"selected-path":e.selectedPath,"recent-paths":q(a),"children-by-path":e.childrenByPath,"sort-mode":e.sortMode,"show-hidden-system":``,"allow-upload":!1,onSelect:o[6]||=e=>r(`select`,e),onLoadChildren:o[7]||=e=>r(`loadChildren`,e)},null,8,[`node`,`selected-path`,`recent-paths`,`children-by-path`,`sort-mode`]))),128))],64)):b(``,!0)]))}}),G2n=1024,K2n=G2n*1024,q2n=K2n*1024;function J2n(e){return e===void 0||!Number.isFinite(e)?1:Math.min(100,Math.max(0,Math.floor(e)))}function Y2n(e,t={}){if(!Number.isFinite(e)||e<0)return`—`;let n=J2n(t.decimals);return e<G2n?`${Math.trunc(e)} B`:e<K2n?`${(e/G2n).toFixed(n)} KB`:e<q2n?`${(e/K2n).toFixed(n)} MB`:`${(e/q2n).toFixed(n)} GB`}M(),o();function X2n(e,t,n){let r=V(!1),i=V(null);Ve(e,()=>{r.value=!1,i.value=null});async function a(){let a=e.value;if(a){r.value=!0,i.value=null;try{let e=await xN(`${t}?path=${encodeURIComponent(a)}`,{path:a});e.ok||(i.value=e.error||n())}finally{r.value=!1}}}return{busy:r,error:i,run:a}}function Z2n(e,t){let{busy:n,error:r,run:i}=X2n(e,kP.files.open,t);return{busy:n,error:r,open:i}}function Q2n(e,t){let{busy:n,error:r,run:i}=X2n(e,kP.files.reveal,t);return{busy:n,error:r,reveal:i}}o(),we(),M();var $2n={key:0,class:`flex items-center gap-2 px-3 py-2 border-b border-gray-200 text-xs text-gray-500 font-mono shrink-0`},e4n={class:`truncate min-w-0`},t4n={key:0,class:`text-gray-400 shrink-0`},n4n={key:1,class:`text-gray-400 shrink-0`},r4n=[`disabled`,`title`,`aria-label`],i4n=[`title`],a4n=[`title`,`aria-label`],o4n=K({__name:`FileContentHeader`,props:{selectedPath:{},size:{},modifiedMs:{},isMarkdown:{type:Boolean},mdRawMode:{type:Boolean}},emits:[`toggleMdRaw`,`deselect`],setup(e,{emit:t}){let{t:n}=We(),r=e,i=t,{busy:a,error:o,reveal:s}=Q2n(Ee(r,`selectedPath`),()=>n(`fileContentHeader.revealInOsFailed`)),l=m(()=>{let e=n(`fileContentHeader.revealInOs`);return o.value?`${e} – ${o.value}`:e});return(t,r)=>e.selectedPath?(B(),U(`div`,$2n,[S(`span`,e4n,T(e.selectedPath),1),e.size===null?b(``,!0):(B(),U(`span`,t4n,`· `+T(q(Y2n)(e.size)),1)),e.modifiedMs===null?b(``,!0):(B(),U(`span`,n4n,`· `+T(q(Gkt)(e.modifiedMs)),1)),S(`button`,{type:`button`,class:c([`ml-auto shrink-0 h-8 w-8 flex items-center justify-center rounded hover:bg-gray-100 font-sans disabled:opacity-50`,q(o)?`text-red-500`:`text-gray-400 hover:text-gray-700`]),disabled:q(a),title:q(o)||q(n)(`fileContentHeader.revealInOs`),"aria-label":l.value,"data-testid":`file-reveal-in-os`,onClick:r[0]||=(...e)=>q(s)&&q(s)(...e)},[...r[3]||=[S(`span`,{class:`material-icons text-base`,"aria-hidden":`true`},`folder_open`,-1)]],10,r4n),e.isMarkdown?(B(),U(`button`,{key:2,class:`shrink-0 h-8 px-2.5 flex items-center gap-1 rounded border border-gray-200 text-gray-600 hover:bg-gray-100 font-sans`,title:e.mdRawMode?q(n)(`fileContentHeader.showRendered`):q(n)(`fileContentHeader.showRaw`),onClick:r[1]||=e=>i(`toggleMdRaw`)},T(e.mdRawMode?q(n)(`fileContentHeader.rendered`):q(n)(`fileContentHeader.raw`)),9,i4n)):b(``,!0),S(`button`,{type:`button`,class:`shrink-0 h-8 w-8 flex items-center justify-center rounded text-gray-400 hover:text-gray-700 hover:bg-gray-100`,title:q(n)(`fileContentHeader.closeFile`),"aria-label":q(n)(`fileContentHeader.closeFile`),"data-testid":`close-file-btn`,onClick:r[2]||=e=>i(`deselect`)},[...r[4]||=[S(`span`,{class:`material-icons text-base`,"aria-hidden":`true`},`close`,-1)]],8,a4n)])):b(``,!0)}});o(),we(),M();var s4n={class:`m-4 mb-0 rounded border border-blue-200 bg-blue-50 text-sm`,"data-testid":`system-file-banner`},c4n={class:`flex items-start gap-2 px-3 py-2`},l4n={class:`flex-1 min-w-0`},u4n={class:`flex items-center gap-2 flex-wrap`},d4n={class:`font-semibold text-blue-900`},f4n={key:0,class:`mt-1 text-gray-700 leading-snug whitespace-pre-line`},p4n={key:1,class:`mt-1 text-xs text-gray-500`},m4n=[`href`],h4n=[`aria-label`],g4n=`systemFileBanner.collapsed.`,_4n=`ℹ️`,v4n=`https://github.com/receptron/mulmoclaude/blob/main/`,y4n=K({__name:`SystemFileBanner`,props:{descriptor:{},path:{}},setup(e){let{t}=We(),n=e;function r(e){return g4n+e}function i(e){try{return localStorage.getItem(r(e))===`1`}catch{return!1}}function a(e,t){try{t?localStorage.setItem(r(e),`1`):localStorage.removeItem(r(e))}catch{}}let o=V(i(n.descriptor.id));Ve(()=>n.descriptor.id,e=>{o.value=i(e)});function s(){o.value=!o.value,a(n.descriptor.id,o.value)}let l={"agent-managed-but-hand-editable":`bg-emerald-100 text-emerald-800`,"user-editable":`bg-blue-100 text-blue-800`,"agent-managed":`bg-amber-100 text-amber-800`,"fragile-format":`bg-orange-100 text-orange-800`,ephemeral:`bg-gray-200 text-gray-700`},u=m(()=>l[n.descriptor.editPolicy]),d=m(()=>n.descriptor.schemaRef?v4n+n.descriptor.schemaRef:``);return(n,r)=>(B(),U(`div`,s4n,[S(`div`,c4n,[S(`span`,{class:`text-blue-600 shrink-0`,"aria-hidden":`true`},T(_4n)),S(`div`,l4n,[S(`div`,u4n,[S(`span`,d4n,T(q(t)(`systemFiles.${e.descriptor.id}.title`)),1),S(`span`,{class:c([`text-xs px-1.5 py-0.5 rounded shrink-0`,u.value])},T(q(t)(`systemFiles.editPolicy.${e.descriptor.editPolicy}`)),3)]),o.value?b(``,!0):(B(),U(`p`,f4n,T(q(t)(`systemFiles.${e.descriptor.id}.summary`)),1)),!o.value&&e.descriptor.schemaRef?(B(),U(`p`,p4n,[J(T(q(t)(`systemFiles.schemaLabel`))+`: `,1),S(`a`,{href:d.value,target:`_blank`,rel:`noopener noreferrer`,class:`font-mono text-blue-700 hover:underline break-all`},T(e.descriptor.schemaRef),9,m4n)])):b(``,!0)]),S(`button`,{type:`button`,class:`shrink-0 text-xs text-blue-700 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-400 rounded px-1`,"aria-label":o.value?q(t)(`systemFiles.showDetails`):q(t)(`systemFiles.hideDetails`),"data-testid":`system-file-banner-toggle`,onClick:s},T(o.value?q(t)(`systemFiles.showDetails`):q(t)(`systemFiles.hideDetails`)),9,h4n)])]))}});M();function b4n(e){return`${e.split(`/`).pop()?.replace(/\.html?$/i,``)||`share`}.zip`}function x4n(){let e=V(!1),t=V(!1);async function n(n){t.value=!1,e.value=!0;try{let e=await wN(kP.share.pack,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:n})});if(!e.ok){t.value=!0;return}zU(await e.blob(),I6t(e.headers.get(`content-disposition`),b4n(n)))}catch{t.value=!0}finally{e.value=!1}}function r(){t.value=!1}return{packing:e,packFailed:t,downloadZip:n,reset:r}}M(),o();var S4n=`download`;function C4n(e,t){let n=V(!1),r=V(null),i=0,a=null;function o(){i+=1,a?.abort(),a=null}Ve(e,()=>{o(),n.value=!1,r.value=null});async function s(){let s=e.value;if(!s)return;o();let c=i,l=new AbortController;a=l,n.value=!0,r.value=null;try{let e=await wN(kP.files.raw,{query:{path:s},signal:l.signal});if(c!==i)return;if(!e.ok){r.value=t();return}let n=await e.blob();if(c!==i)return;zU(n,Mkn(s,S4n))}catch{if(c!==i)return;r.value=t()}finally{c===i&&(n.value=!1)}}return{busy:n,error:r,download:s}}o(),M(),we();var w4n={class:`flex-1 overflow-auto min-h-0`},T4n={key:0,class:`h-full flex items-center justify-center text-gray-400 text-sm`},E4n={key:1,class:`p-4 text-sm text-red-600`},D4n={key:2,class:`p-4 text-sm text-gray-400`},O4n={key:1,class:`h-full flex flex-col overflow-y-auto`},k4n={class:`m-auto w-full`},A4n=[`title`,`aria-label`],j4n={key:2,class:`shrink-0 m-4 mt-0 rounded border border-red-300 bg-red-50 p-2 text-xs text-red-700`,role:`alert`,"data-testid":`files-marp-save-error`},M4n={key:1,class:`h-full flex flex-col overflow-auto`},N4n={key:0,class:`shrink-0 m-4 mb-0 rounded border border-gray-200 bg-gray-50 p-3 text-xs`},P4n={class:`font-semibold text-gray-600 shrink-0`},F4n={key:0,class:`flex flex-wrap gap-1`},I4n={key:1,class:`text-gray-800 break-words`},L4n={key:1,class:`shrink-0 m-4 mt-0 rounded border border-red-300 bg-red-50 p-2 text-xs text-red-700`,role:`alert`},R4n={key:2,class:`p-4 text-xs whitespace-pre-wrap font-mono text-gray-800`},z4n={key:3,class:`relative w-full h-full`},B4n={key:0,class:`absolute top-2 right-2 z-10 flex flex-col items-end gap-1`},V4n=[`title`,`disabled`],H4n={key:0,class:`text-xs text-red-600 bg-white/90 px-1 rounded`,role:`alert`},U4n=[`src`,`title`],W4n=[`srcdoc`,`title`],G4n={key:5,class:`h-full flex flex-col overflow-auto`},K4n={class:`shrink-0 flex items-center justify-end gap-2 px-4 pt-3`},q4n={key:0,class:`text-xs text-red-600 self-center`,"data-testid":`files-json-invalid-hint`},J4n=[`disabled`,`title`],Y4n={key:1,class:`flex-1 p-4 text-xs whitespace-pre-wrap font-mono text-gray-800`},X4n={key:2,class:`shrink-0 m-4 mt-0 rounded border border-red-300 bg-red-50 p-2 text-xs text-red-700`,role:`alert`,"data-testid":`files-json-save-error`},Z4n={key:6,class:`p-4 space-y-2`},Q4n={key:0,class:`text-xs text-red-600 mb-1 font-sans`},$4n={class:`text-xs font-mono text-gray-800 whitespace-pre-wrap`},e3n={key:7,class:`p-4 text-xs whitespace-pre-wrap font-mono text-gray-800`},t3n={key:2,class:`h-full flex items-center justify-center p-4`},n3n=[`src`,`alt`],r3n=[`src`,`title`],i3n={key:4,class:`h-full flex items-center justify-center p-4`},a3n=[`src`],o3n={key:5,class:`h-full flex items-center justify-center p-4 bg-black`},s3n=[`src`],c3n={key:6,class:`p-4 text-sm text-gray-500 flex flex-col gap-3`},l3n={key:1},u3n={class:`flex flex-wrap items-center gap-2`},d3n=[`disabled`],f3n=[`disabled`],p3n={key:0,class:`mt-2 text-xs text-red-600`,"data-testid":`file-download-error`},m3n={key:1,class:`mt-2 text-xs text-red-600`},h3n=K({__name:`FileContentRenderer`,props:{selectedPath:{},content:{},contentError:{},contentLoading:{type:Boolean},isMarkdown:{type:Boolean},isHtml:{type:Boolean},isJson:{type:Boolean},isJsonl:{type:Boolean},mdRawMode:{type:Boolean},sandboxedHtml:{},htmlPreviewUrl:{},jsonTokens:{},jsonlLines:{},mdFrontmatter:{},rawSaveError:{}},emits:[`markdownLinkClick`,`updateSource`],setup(e,{emit:t}){let n=OL(`markdown`,ZR),r=OL(`markdown`,ROt),i=Ae(()=>Xe(()=>import(`./JsonEditor-ZvNJuqs_.js`),__vite__mapDeps([51,5,52,53,54]))),{t:a}=We(),o=e,s=t,l=m(()=>o.selectedPath?s2n(o.selectedPath):null),{packing:u,packFailed:d,downloadZip:f,reset:p}=x4n(),h=m(()=>!!(o.isHtml&&o.htmlPreviewUrl&&o.selectedPath?.toLowerCase().endsWith(`.html`)));function g(){o.selectedPath&&f(o.selectedPath)}Ve(()=>o.selectedPath,()=>p());let _=m(()=>!!(o.mdFrontmatter&&KR(o.mdFrontmatter.meta))),v=m(()=>{let e=o.selectedPath;if(!e)return;let t=e.lastIndexOf(`/`);return t<0?``:e.slice(0,t)}),y=m(()=>{let e=o.selectedPath??``,t=e.lastIndexOf(`/`),n=t>=0?e.slice(t+1):e,r=n.lastIndexOf(`.`);return GR({name:r>0?n.slice(0,r):n,fallback:`slides`})}),{busy:x,error:C,open:w}=Z2n(Ee(o,`selectedPath`),()=>a(`fileContentRenderer.openInOsFailed`)),{busy:E,error:O,download:k}=C4n(Ee(o,`selectedPath`),()=>a(`common.downloadFailed`)),A=V(!1),j=V(``),M=m(()=>o.isJson&&o.selectedPath!==null&&o.content?.kind===`text`&&l2n(o.selectedPath)),N=m(()=>{try{return JSON.parse(j.value),!0}catch{return!1}});function P(){o.content?.kind===`text`&&(j.value=o.content.content,A.value=!0)}function F(){A.value=!1}function I(){s(`updateSource`,j.value)}let L=V(!1),R=V(``);function z(){o.content?.kind===`text`&&(R.value=o.content.content,L.value=!0)}function ee(){L.value=!1}function te(){s(`updateSource`,R.value)}Ve(()=>o.content,()=>{A.value=!1,L.value=!1});function ne(e){return`${kP.files.raw}?path=${encodeURIComponent(e)}`}function re(e){let t=o.selectedPath??``,n=t.lastIndexOf(`/`),r=n>=0?t.slice(0,n):``,i=RR(e,r),a=o.content?.kind===`text`?o.content.content:e,s=o.mdFrontmatter!==null;return{uuid:`files-preview`,toolName:`text-response`,message:i,title:o.selectedPath??``,data:{text:i,role:`assistant`,transportKind:`text-rest`,pdfSourceText:a,pdfBaseDir:r,pdfStripFrontmatter:s}}}return(t,o)=>(B(),U(`div`,w4n,[e.selectedPath?e.contentError?(B(),U(`div`,E4n,T(e.contentError),1)):e.contentLoading?(B(),U(`div`,D4n,T(q(a)(`common.loading`)),1)):e.content?(B(),U(D,{key:3},[l.value&&e.selectedPath?(B(),ke(y4n,{key:0,descriptor:l.value,path:e.selectedPath},null,8,[`descriptor`,`path`])):b(``,!0),e.content.kind===`text`?(B(),U(D,{key:1},[e.isMarkdown&&!e.mdRawMode&&_.value?(B(),U(D,{key:0},[L.value?(B(),ke(q(r),{key:0,modelValue:R.value,"onUpdate:modelValue":o[0]||=e=>R.value=e,"pdf-filename":y.value,"base-dir":v.value,"editor-label":q(a)(`fileContentRenderer.marpEditorLabel`)},{actions:Ie(()=>[S(`button`,{class:`h-8 px-2.5 flex items-center gap-1 text-sm rounded border border-gray-300 text-gray-600 hover:bg-gray-50`,"data-testid":`files-marp-cancel-btn`,onClick:ee},T(q(a)(`common.cancel`)),1),S(`button`,{class:`h-8 px-2.5 flex items-center gap-1 text-sm rounded bg-green-600 hover:bg-green-700 text-white`,"data-testid":`files-marp-save-btn`,onClick:te},[o[6]||=S(`span`,{class:`material-icons text-sm`,"aria-hidden":`true`},`save`,-1),J(` `+T(q(a)(`common.save`)),1)])]),_:1},8,[`modelValue`,`pdf-filename`,`base-dir`,`editor-label`])):(B(),U(`div`,O4n,[S(`div`,k4n,[De(q(n),{markdown:e.content.content,"pdf-filename":y.value,"base-dir":v.value},{toolbar:Ie(()=>[S(`button`,{class:`h-8 px-2.5 flex items-center gap-1 rounded border border-gray-300 text-gray-600 hover:bg-gray-50 text-sm`,title:q(a)(`fileContentRenderer.editMarp`),"aria-label":q(a)(`fileContentRenderer.editMarp`),"data-testid":`files-marp-edit-btn`,onClick:z},[o[7]||=S(`span`,{class:`material-icons text-sm`,"aria-hidden":`true`},`edit`,-1),J(` `+T(q(a)(`fileContentRenderer.editMarp`)),1)],8,A4n)]),_:1},8,[`markdown`,`pdf-filename`,`base-dir`])])])),e.rawSaveError?(B(),U(`div`,j4n,` ⚠ `+T(e.rawSaveError),1)):b(``,!0)],64)):e.isMarkdown&&!e.mdRawMode?(B(),U(`div`,M4n,[e.mdFrontmatter&&e.mdFrontmatter.fields.length>0?(B(),U(`div`,N4n,[(B(!0),U(D,null,H(e.mdFrontmatter.fields,e=>(B(),U(`div`,{key:e.key,class:`flex items-baseline gap-2 py-0.5`},[S(`span`,P4n,T(e.key)+`:`,1),Array.isArray(e.value)?(B(),U(`span`,F4n,[(B(!0),U(D,null,H(e.value,(e,t)=>(B(),U(`span`,{key:String(t)+`:`+q(Ha)(e),class:`rounded-full bg-white border border-gray-300 px-2 py-0.5 text-gray-700`},T(q(Ha)(e)),1))),128))])):(B(),U(`span`,I4n,T(q(Ha)(e.value)),1))]))),128))])):b(``,!0),S(`div`,{class:`flex-1 min-h-0`,onClickCapture:o[2]||=e=>s(`markdownLinkClick`,e)},[De(d4,{"selected-result":re(e.mdFrontmatter?e.mdFrontmatter.body:e.content.content),"editable-source":e.content.content,onUpdateSource:o[1]||=e=>s(`updateSource`,e)},null,8,[`selected-result`,`editable-source`])],32),e.rawSaveError?(B(),U(`div`,L4n,` ⚠ `+T(e.rawSaveError),1)):b(``,!0)])):e.isMarkdown&&e.mdRawMode?(B(),U(`pre`,R4n,T(e.content.content),1)):e.isHtml&&e.htmlPreviewUrl?(B(),U(`div`,z4n,[h.value?(B(),U(`div`,B4n,[S(`button`,{class:`px-2 py-1 text-xs rounded border border-gray-300 bg-white/90 text-gray-600 hover:bg-gray-50 disabled:opacity-50 shadow-sm`,title:q(a)(`fileContentRenderer.downloadZip`),disabled:q(u),"data-testid":`file-html-download`,onClick:g},[o[8]||=S(`span`,{class:`material-icons text-sm align-middle`},`download`,-1),J(` `+T(q(a)(`fileContentRenderer.download`)),1)],8,V4n),q(d)?(B(),U(`span`,H4n,T(q(a)(`fileContentRenderer.downloadError`)),1)):b(``,!0)])):b(``,!0),S(`iframe`,{src:e.htmlPreviewUrl,class:`w-full h-full border-0`,sandbox:`allow-scripts`,title:q(a)(`fileContentRenderer.htmlPreview`)},null,8,U4n)])):e.isHtml?(B(),U(`iframe`,{key:4,srcdoc:e.sandboxedHtml,class:`w-full h-full border-0`,sandbox:`allow-scripts`,title:q(a)(`fileContentRenderer.htmlPreview`)},null,8,W4n)):e.isJson?(B(),U(`div`,G4n,[S(`div`,K4n,[A.value?(B(),U(D,{key:0},[S(`button`,{class:`h-8 px-2.5 flex items-center gap-1 text-sm rounded border border-gray-300 text-gray-600 hover:bg-gray-50`,"data-testid":`files-json-cancel-btn`,onClick:F},T(q(a)(`common.cancel`)),1),N.value?b(``,!0):(B(),U(`span`,q4n,T(q(a)(`fileContentRenderer.invalidJson`)),1)),S(`button`,{class:`h-8 px-2.5 flex items-center gap-1 text-sm rounded bg-green-600 hover:bg-green-700 text-white disabled:opacity-40 disabled:cursor-not-allowed`,"data-testid":`files-json-save-btn`,disabled:!N.value,title:N.value?void 0:q(a)(`fileContentRenderer.invalidJson`),onClick:I},[o[9]||=S(`span`,{class:`material-icons text-sm`},`save`,-1),J(` `+T(q(a)(`common.save`)),1)],8,J4n)],64)):M.value?(B(),U(`button`,{key:1,class:`h-8 px-2.5 flex items-center gap-1 text-sm rounded border border-gray-300 text-gray-600 hover:bg-gray-50`,"data-testid":`files-json-edit-btn`,onClick:P},[o[10]||=S(`span`,{class:`material-icons text-sm`},`edit`,-1),J(` `+T(q(a)(`fileContentRenderer.editJson`)),1)])):b(``,!0)]),A.value?(B(),ke(q(i),{key:0,modelValue:j.value,"onUpdate:modelValue":o[3]||=e=>j.value=e,"editor-label":q(a)(`fileContentRenderer.jsonEditorLabel`),class:`flex-1 min-h-0 m-4`},null,8,[`modelValue`,`editor-label`])):(B(),U(`pre`,Y4n,[(B(!0),U(D,null,H(e.jsonTokens,(e,t)=>(B(),U(`span`,{key:t,class:c(q(out)[e.type])},T(e.value),3))),128))])),e.rawSaveError?(B(),U(`div`,X4n,` ⚠ `+T(e.rawSaveError),1)):b(``,!0)])):e.isJsonl?(B(),U(`div`,Z4n,[(B(!0),U(D,null,H(e.jsonlLines,(e,t)=>(B(),U(`div`,{key:t,class:c([`rounded border bg-gray-50 p-3`,e.parseError?`border-red-300`:`border-gray-200`])},[e.parseError?(B(),U(`div`,Q4n,T(q(a)(`fileContentRenderer.parseError`)),1)):b(``,!0),S(`pre`,$4n,[(B(!0),U(D,null,H(e.tokens,(e,t)=>(B(),U(`span`,{key:t,class:c(q(out)[e.type])},T(e.value),3))),128))])],2))),128))])):(B(),U(`pre`,e3n,T(e.content.content),1))],64)):e.content.kind===`image`&&e.selectedPath?(B(),U(`div`,t3n,[S(`img`,{src:ne(e.selectedPath),alt:e.selectedPath,class:`max-w-full max-h-full object-contain`},null,8,n3n)])):e.content.kind===`pdf`&&e.selectedPath?(B(),U(`iframe`,{key:3,src:ne(e.selectedPath),class:`w-full h-full border-0`,title:q(a)(`fileContentRenderer.pdfPreview`)},null,8,r3n)):e.content.kind===`audio`&&e.selectedPath?(B(),U(`div`,i3n,[(B(),U(`audio`,{key:e.selectedPath,src:ne(e.selectedPath),controls:``,preload:`metadata`,class:`w-full max-w-2xl`},null,8,a3n))])):e.content.kind===`video`&&e.selectedPath?(B(),U(`div`,o3n,[(B(),U(`video`,{key:e.selectedPath,src:ne(e.selectedPath),controls:``,preload:`metadata`,class:`max-w-full max-h-full`},null,8,s3n))])):(B(),U(`div`,c3n,[`message`in e.content?(B(),U(D,{key:0},[J(T(e.content.message),1)],64)):b(``,!0),e.selectedPath?(B(),U(`div`,l3n,[S(`div`,u3n,[S(`button`,{type:`button`,class:`h-8 px-3 flex items-center gap-1 rounded border border-gray-300 bg-white hover:bg-gray-50 text-gray-700 font-medium disabled:opacity-50`,disabled:q(E),"data-testid":`file-download`,onClick:o[4]||=(...e)=>q(k)&&q(k)(...e)},[o[11]||=S(`span`,{class:`material-icons text-sm`},`download`,-1),J(` `+T(q(E)?q(a)(`fileContentRenderer.downloadingFile`):q(a)(`fileContentRenderer.downloadFile`)),1)],8,d3n),S(`button`,{type:`button`,class:`h-8 px-3 flex items-center gap-1 rounded border border-gray-300 bg-white hover:bg-gray-50 text-gray-700 font-medium disabled:opacity-50`,disabled:q(x),"data-testid":`file-open-in-os`,onClick:o[5]||=(...e)=>q(w)&&q(w)(...e)},[o[12]||=S(`span`,{class:`material-icons text-sm`},`open_in_new`,-1),J(` `+T(q(x)?q(a)(`fileContentRenderer.openingInOs`):q(a)(`fileContentRenderer.openInOs`)),1)],8,f3n)]),q(O)?(B(),U(`p`,p3n,T(q(O)),1)):b(``,!0),q(C)?(B(),U(`p`,m3n,T(q(C)),1)):b(``,!0)])):b(``,!0)]))],64)):b(``,!0):(B(),U(`div`,T4n,T(q(a)(`fileContentRenderer.selectFile`)),1))]))}});function g3n(e){let t=e.split(`/`).filter(Boolean);if(t.length<=1)return[];let n=[];for(let e=1;e<t.length;e++)n.push(t.slice(0,e).join(`/`));return n}function _3n(e,t,n){let r=new Map(e);return r.set(t,n),r}function v3n(e,t){let n=new Map(e);return n.delete(t),n}M();function y3n(){let e=V(null),t=V(new Map),n=V(null),r=0,i=new Map;function a(e){let t=(i.get(e)??0)+1;return i.set(e,t),t}async function o(o){if(t.value.has(o))return;let s=r,c=a(o);t.value=_3n(t.value,o,null);let l=await bN(kP.files.dir,{path:o});if(s!==r||i.get(o)!==c)return;if(!l.ok){t.value=v3n(t.value,o),n.value=l.error||`dir: ${l.status}`;return}let u=l.data;t.value=_3n(t.value,o,u.children??[]),o===``&&(e.value={...u,children:[]})}async function s(){r++,e.value=null,t.value=new Map,n.value=null,await o(``)}async function c(e){a(e),t.value=v3n(t.value,e),await o(e)}return{rootNode:e,childrenByPath:t,treeError:n,loadDirChildren:o,reloadRoot:s,reloadDirChildren:c}}M();function b3n(){let e=V([]);async function t(){let t=await bN(kP.files.refRoots);t.ok&&Array.isArray(t.data)&&(e.value=t.data)}return{refRoots:e,loadRefRoots:t}}function x3n(){let{expand:e}=X0n(),t=y3n(),{refRoots:n,loadRefRoots:r}=b3n();async function i(n){for(let r of g3n(n))e(r),await t.loadDirChildren(r)}return{rootNode:t.rootNode,refRoots:n,childrenByPath:t.childrenByPath,treeError:t.treeError,loadDirChildren:t.loadDirChildren,ensureAncestorsLoaded:i,reloadRoot:t.reloadRoot,reloadDirChildren:t.reloadDirChildren,loadRefRoots:r}}M();var S3n=`files_md_raw_mode`;function C3n(){let e=V(localStorage.getItem(S3n)===`true`);function t(){e.value=!e.value,localStorage.setItem(S3n,String(e.value))}return{mdRawMode:e,toggleMdRaw:t}}M();var w3n=`files_sort_mode`;function T3n(){return localStorage.getItem(w3n)===`recent`?`recent`:`name`}function E3n(){let e=V(T3n());function t(t){e.value=t,localStorage.setItem(w3n,t)}return{sortMode:e,setSortMode:t}}M();var D3n=`filesView.showHiddenSystem`;function O3n(){return localStorage.getItem(D3n)===`true`}function k3n(){let e=V(O3n());function t(t){e.value=t,localStorage.setItem(D3n,t?`true`:`false`)}return{showHiddenSystem:e,setShowHiddenSystem:t}}function A3n(e,t){function n(n){if(n.button!==0||n.ctrlKey||n.metaKey||n.shiftKey)return;let{target:r}=n;if(!(r instanceof Element))return;let i=r.closest(`a`);if(!i)return;let a=i.getAttribute(`href`);if(!a||c4(a)||a.startsWith(`#`)||!e.value)return;let o=Nkn(e.value,a);if(!o)return;n.preventDefault(),n.stopPropagation();let s=Pkn(o);s===null?t.onNavigate(o):t.onLoadSession(s)}return{handleMarkdownLinkClick:n}}o(),M(),we();var j3n={class:`h-full flex bg-white`,"data-testid":`files-view-root`},M3n={class:`flex-1 flex flex-col min-w-0 overflow-hidden`},N3n=6e4,P3n=4e3,F3n=K({__name:`FilesView`,props:{refreshToken:{}},emits:[`loadSession`],setup(e,{emit:t}){let n=PI(),{t:r}=We(),i=e,a=t,{rootNode:o,refRoots:s,childrenByPath:l,treeError:u,loadDirChildren:d,ensureAncestorsLoaded:f,reloadDirChildren:p,reloadRoot:h,loadRefRoots:g}=x3n(),{selectedPath:v,content:y,contentLoading:x,contentError:C,loadContent:w,selectFile:E,deselectFile:D,abortContent:O}=Sut(),{mdRawMode:k,toggleMdRaw:A}=C3n(),{sortMode:j,setSortMode:M}=E3n(),{showHiddenSystem:N,setShowHiddenSystem:F}=k3n(),{isMarkdown:I,isHtml:L,isJson:R,isJsonl:z,sandboxedHtml:H,htmlPreviewUrl:ee,jsonTokens:te,jsonlLines:ne,mdFrontmatter:re}=yut(v,y),ie=V(null);async function ae(e){if(!v.value||y.value?.kind!==`text`||e===y.value.content)return;let t=v.value;ie.value=null;let n=await SN(kP.files.content,{path:t,content:e});v.value===t&&(n.ok?y.value={kind:`text`,path:n.data.path,content:e,size:n.data.size,modifiedMs:n.data.modifiedMs}:ie.value=n.error)}Ve(y,()=>{ie.value=null});async function oe(e){let{folder:t,filename:n,resolve:i}=e,a=t?`${t}/${n}`:n,o=l.value.get(t);if(Array.isArray(o)&&o.some(e=>e.name===n)){i(!1,r(`fileTree.newFileError.exists`,{filename:n}));return}let s=await xN(kP.files.create,{path:a,content:``});if(s.ok)i(!0),await p(t),E(s.data.path);else{if(s.status===409){i(!1,r(`fileTree.newFileError.exists`,{filename:n})),await p(t);return}i(!1,r(`fileTree.newFileError.saveFailed`))}}let W=V(null),se=null,ce=m(()=>{let e=W.value;return e===null?null:e.done<e.total?{failed:!1,message:r(`fileTree.upload.progress`,{done:e.done,total:e.total})}:e.failed>0?{failed:!0,message:r(`fileTree.upload.failed`,{count:e.failed})}:{failed:!1,message:r(`fileTree.upload.done`,{count:e.total})}});function le(e){return new Promise((t,n)=>{let r=new FileReader;r.onerror=()=>n(Error(`file read failed`)),r.onload=()=>t(typeof r.result==`string`?r.result:``),r.readAsDataURL(e)})}async function ue(e,t){try{let n=await le(t);return n!==``&&(await xN(kP.files.upload,{dir:e,filename:t.name,dataUrl:n})).ok}catch{return!1}}async function de(e){let{folder:t,files:n}=e;se!==null&&(clearTimeout(se),se=null);let r=W.value;W.value=r===null?{done:0,total:n.length,failed:0}:{done:r.done,total:r.total+n.length,failed:r.failed};for(let e of n){let r=await ue(t,e),i=W.value;W.value=i===null?{done:1,total:n.length,failed:+!r}:{done:i.done+1,total:i.total,failed:i.failed+ +!r}}await p(t);let i=W.value;i!==null&&i.done>=i.total&&(se=setTimeout(()=>{W.value=null},P3n))}let fe=m(()=>{let e=new Set,t=Date.now();for(let n of l.value.values())if(n)for(let r of n)r.type===`file`&&r.modifiedMs&&t-r.modifiedMs<N3n&&e.add(r.path);return e}),{handleMarkdownLinkClick:G}=A3n(v,{onNavigate:E,onLoadSession:e=>a(`loadSession`,e)});Ve(()=>xut(n.params.pathMatch),e=>{qI(e)?e!==v.value&&(v.value=e,w(e)):v.value!==null&&(v.value=null,y.value=null)}),Ve(v,e=>{e&&f(e)},{immediate:!0});let pe=V(null),me=0;function he(){v.value&&me===0&&(me=requestAnimationFrame(()=>{me=0;let e=pe.value?.$el;e instanceof HTMLElement&&e.querySelector(`button[data-selected="true"]`)?.scrollIntoView({block:`nearest`})}))}return Ve(v,he),Ve(l,he),Ve(()=>i.refreshToken,()=>{h(),v.value&&w(v.value)}),P(async()=>{await d(``),await g(),v.value&&w(v.value)}),_(()=>{O(),me!==0&&cancelAnimationFrame(me)}),(e,t)=>(B(),U(`div`,j3n,[De(W2n,{ref_key:`treePaneRef`,ref:pe,"root-node":q(o),"ref-roots":q(s),"children-by-path":q(l),"tree-error":q(u),"selected-path":q(v),"recent-paths":fe.value,"sort-mode":q(j),"show-hidden-system":q(N),onSelect:q(E),onLoadChildren:q(d),"onUpdate:sortMode":q(M),"onUpdate:showHiddenSystem":q(F),onCreateFile:oe,onUploadFiles:de},null,8,[`root-node`,`ref-roots`,`children-by-path`,`tree-error`,`selected-path`,`recent-paths`,`sort-mode`,`show-hidden-system`,`onSelect`,`onLoadChildren`,`onUpdate:sortMode`,`onUpdate:showHiddenSystem`]),ce.value?(B(),U(`div`,{key:0,class:c([`fixed bottom-4 left-4 z-50 px-3 py-2 rounded shadow-md text-sm`,ce.value.failed?`bg-red-50 text-red-700 border border-red-200`:`bg-blue-50 text-blue-700 border border-blue-200`]),"data-testid":`file-upload-status`,role:`status`,"aria-live":`polite`,"aria-atomic":`true`},T(ce.value.message),3)):b(``,!0),S(`div`,M3n,[De(o4n,{"selected-path":q(v),size:q(y)?.size??null,"modified-ms":q(y)?.modifiedMs??null,"is-markdown":q(I),"md-raw-mode":q(k),onToggleMdRaw:q(A),onDeselect:q(D)},null,8,[`selected-path`,`size`,`modified-ms`,`is-markdown`,`md-raw-mode`,`onToggleMdRaw`,`onDeselect`]),De(h3n,{"selected-path":q(v),content:q(y),"content-error":q(C),"content-loading":q(x),"is-markdown":q(I),"is-html":q(L),"is-json":q(R),"is-jsonl":q(z),"md-raw-mode":q(k),"sandboxed-html":q(H),"html-preview-url":q(ee),"json-tokens":q(te),"jsonl-lines":q(ne),"md-frontmatter":q(re),"raw-save-error":ie.value,onMarkdownLinkClick:q(G),onUpdateSource:ae},null,8,[`selected-path`,`content`,`content-error`,`content-loading`,`is-markdown`,`is-html`,`is-json`,`is-jsonl`,`md-raw-mode`,`sandboxed-html`,`html-preview-url`,`json-tokens`,`jsonl-lines`,`md-frontmatter`,`raw-save-error`,`onMarkdownLinkClick`]),q(v)&&!q(x)&&!q(C)?(B(),ke(mjn,{key:q(v),placeholder:q(r)(`filesView.chatPlaceholder`),"prepend-text":`Before answering, take a look at the file at ${q(v)}.`,"test-id-prefix":`files-page-chat`},null,8,[`placeholder`,`prepend-text`])):b(``,!0)])]))}}),I3n=[{id:`memory`,displayName:`settingsMcpTab.catalog.entry.memory.displayName`,description:`settingsMcpTab.catalog.entry.memory.description`,audience:`general`,upstreamUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/memory`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-memory`]},configSchema:[],riskLevel:`low`},{id:`sequential-thinking`,displayName:`settingsMcpTab.catalog.entry.sequentialThinking.displayName`,description:`settingsMcpTab.catalog.entry.sequentialThinking.description`,audience:`general`,upstreamUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/sequentialthinking`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-sequential-thinking`]},configSchema:[],riskLevel:`low`},{id:`context7`,displayName:`settingsMcpTab.catalog.entry.context7.displayName`,description:`settingsMcpTab.catalog.entry.context7.description`,audience:`general`,upstreamUrl:`https://github.com/upstash/context7`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@upstash/context7-mcp`]},configSchema:[],riskLevel:`low`},{id:`deepwiki`,displayName:`settingsMcpTab.catalog.entry.deepwiki.displayName`,description:`settingsMcpTab.catalog.entry.deepwiki.description`,audience:`general`,upstreamUrl:`https://docs.devin.ai/work-with-devin/deepwiki-mcp`,spec:{type:`http`,url:`https://mcp.deepwiki.com/sse`},configSchema:[],riskLevel:`low`},{id:`notion`,displayName:`settingsMcpTab.catalog.entry.notion.displayName`,description:`settingsMcpTab.catalog.entry.notion.description`,audience:`general`,upstreamUrl:`https://github.com/makenotion/notion-mcp-server`,setupGuideUrl:`https://www.notion.so/help/create-integrations-with-the-notion-api`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@notionhq/notion-mcp-server`],env:{NOTION_TOKEN:"${NOTION_API_KEY}"}},configSchema:[{key:`NOTION_API_KEY`,label:`settingsMcpTab.catalog.entry.notion.field.apiKey.label`,kind:`secret`,placeholder:`secret_...`,required:!0,helpUrl:`https://www.notion.so/my-integrations`,helpText:`settingsMcpTab.catalog.entry.notion.field.apiKey.help`}],riskLevel:`medium`},{id:`slack`,displayName:`settingsMcpTab.catalog.entry.slack.displayName`,description:`settingsMcpTab.catalog.entry.slack.description`,audience:`general`,upstreamUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/slack`,setupGuideUrl:`https://api.slack.com/quickstart`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-slack`],env:{SLACK_BOT_TOKEN:"${SLACK_BOT_TOKEN}",SLACK_TEAM_ID:"${SLACK_TEAM_ID}"}},configSchema:[{key:`SLACK_BOT_TOKEN`,label:`settingsMcpTab.catalog.entry.slack.field.botToken.label`,kind:`secret`,placeholder:`xoxb-...`,required:!0,helpUrl:`https://api.slack.com/apps`,helpText:`settingsMcpTab.catalog.entry.slack.field.botToken.help`},{key:`SLACK_TEAM_ID`,label:`settingsMcpTab.catalog.entry.slack.field.teamId.label`,kind:`text`,placeholder:`T01ABC23DEF`,required:!0,helpUrl:`https://api.slack.com/methods/team.info`,helpText:`settingsMcpTab.catalog.entry.slack.field.teamId.help`}],riskLevel:`medium`},{id:`google-maps`,displayName:`settingsMcpTab.catalog.entry.googleMaps.displayName`,description:`settingsMcpTab.catalog.entry.googleMaps.description`,audience:`general`,upstreamUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/google-maps`,setupGuideUrl:`https://developers.google.com/maps/documentation/javascript/get-api-key`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-google-maps`],env:{GOOGLE_MAPS_API_KEY:"${GOOGLE_MAPS_API_KEY}"}},configSchema:[{key:`GOOGLE_MAPS_API_KEY`,label:`settingsMcpTab.catalog.entry.googleMaps.field.apiKey.label`,kind:`secret`,placeholder:`AIza...`,required:!0,helpUrl:`https://console.cloud.google.com/google/maps-apis/credentials`,helpText:`settingsMcpTab.catalog.entry.googleMaps.field.apiKey.help`}],riskLevel:`low`},{id:`apple-native`,displayName:`settingsMcpTab.catalog.entry.appleNative.displayName`,description:`settingsMcpTab.catalog.entry.appleNative.description`,audience:`general`,upstreamUrl:`https://github.com/Dhravya/apple-mcp`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@dhravya/apple-mcp`]},configSchema:[],riskLevel:`medium`},{id:`gmail`,displayName:`settingsMcpTab.catalog.entry.gmail.displayName`,description:`settingsMcpTab.catalog.entry.gmail.description`,audience:`general`,upstreamUrl:`https://github.com/GongRzhe/Gmail-MCP-Server`,setupGuideUrl:`https://developers.google.com/workspace/guides/create-credentials#desktop-app`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@gongrzhe/server-gmail-autoauth-mcp`],env:{GMAIL_OAUTH_PATH:"${GMAIL_OAUTH_PATH}"}},configSchema:[{key:`GMAIL_OAUTH_PATH`,label:`settingsMcpTab.catalog.entry.gmail.field.credentials.label`,kind:`path`,placeholder:`~/.gmail-mcp/credentials.json`,required:!0,helpUrl:`https://console.cloud.google.com/apis/credentials`,helpText:`settingsMcpTab.catalog.entry.gmail.field.credentials.help`}],riskLevel:`high`},{id:`google-calendar`,displayName:`settingsMcpTab.catalog.entry.googleCalendar.displayName`,description:`settingsMcpTab.catalog.entry.googleCalendar.description`,audience:`general`,upstreamUrl:`https://github.com/nspady/google-calendar-mcp`,setupGuideUrl:`https://developers.google.com/workspace/guides/create-credentials#desktop-app`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@cocal/google-calendar-mcp`],env:{GOOGLE_OAUTH_CREDENTIALS:"${GOOGLE_OAUTH_CREDENTIALS}"}},configSchema:[{key:`GOOGLE_OAUTH_CREDENTIALS`,label:`settingsMcpTab.catalog.entry.googleCalendar.field.credentials.label`,kind:`path`,placeholder:`~/.gcal-mcp/credentials.json`,required:!0,helpUrl:`https://console.cloud.google.com/apis/credentials`,helpText:`settingsMcpTab.catalog.entry.googleCalendar.field.credentials.help`}],riskLevel:`medium`},{id:`google-drive`,displayName:`settingsMcpTab.catalog.entry.googleDrive.displayName`,description:`settingsMcpTab.catalog.entry.googleDrive.description`,audience:`general`,upstreamUrl:`https://github.com/modelcontextprotocol/servers-archived/tree/main/src/gdrive`,setupGuideUrl:`https://developers.google.com/workspace/guides/create-credentials#desktop-app`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-gdrive`],env:{GDRIVE_CREDENTIALS_PATH:"${GDRIVE_CREDENTIALS_PATH}"}},configSchema:[{key:`GDRIVE_CREDENTIALS_PATH`,label:`settingsMcpTab.catalog.entry.googleDrive.field.credentials.label`,kind:`path`,placeholder:`~/.gdrive-mcp/credentials.json`,required:!0,helpUrl:`https://console.cloud.google.com/apis/credentials`,helpText:`settingsMcpTab.catalog.entry.googleDrive.field.credentials.help`}],riskLevel:`medium`},{id:`github`,displayName:`settingsMcpTab.catalog.entry.github.displayName`,description:`settingsMcpTab.catalog.entry.github.description`,audience:`general`,upstreamUrl:`https://github.com/github/github-mcp-server`,setupGuideUrl:`https://docs.github.com/en/copilot/how-tos/provide-context/use-mcp/set-up-the-github-mcp-server`,spec:{type:`http`,url:`https://api.githubcopilot.com/mcp/`,headers:{Authorization:"Bearer ${GITHUB_PERSONAL_ACCESS_TOKEN}"}},configSchema:[{key:`GITHUB_PERSONAL_ACCESS_TOKEN`,label:`settingsMcpTab.catalog.entry.github.field.token.label`,kind:`secret`,placeholder:`ghp_…`,required:!0,helpUrl:`https://github.com/settings/tokens`,helpText:`settingsMcpTab.catalog.entry.github.field.token.help`}],riskLevel:`medium`},{id:`linear`,displayName:`settingsMcpTab.catalog.entry.linear.displayName`,description:`settingsMcpTab.catalog.entry.linear.description`,audience:`general`,upstreamUrl:`https://github.com/tacticlaunch/mcp-linear`,setupGuideUrl:`https://linear.app/docs/personal-api-keys`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@tacticlaunch/mcp-linear`],env:{LINEAR_API_KEY:"${LINEAR_API_KEY}"}},configSchema:[{key:`LINEAR_API_KEY`,label:`settingsMcpTab.catalog.entry.linear.field.apiKey.label`,kind:`secret`,placeholder:`lin_api_…`,required:!0,helpUrl:`https://linear.app/settings/api`,helpText:`settingsMcpTab.catalog.entry.linear.field.apiKey.help`}],riskLevel:`medium`},{id:`weather-open-meteo`,displayName:`settingsMcpTab.catalog.entry.weatherOpenMeteo.displayName`,description:`settingsMcpTab.catalog.entry.weatherOpenMeteo.description`,audience:`general`,upstreamUrl:`https://www.npmjs.com/package/open-meteo-mcp`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`open-meteo-mcp`]},configSchema:[],riskLevel:`low`},{id:`spotify`,displayName:`settingsMcpTab.catalog.entry.spotify.displayName`,description:`settingsMcpTab.catalog.entry.spotify.description`,audience:`general`,upstreamUrl:`https://github.com/calebWei/SpotifyMCP`,setupGuideUrl:`https://developer.spotify.com/documentation/web-api/concepts/apps`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`spotify-mcp@latest`],env:{SPOTIFY_CLIENT_ID:"${SPOTIFY_CLIENT_ID}"}},configSchema:[{key:`SPOTIFY_CLIENT_ID`,label:`settingsMcpTab.catalog.entry.spotify.field.clientId.label`,kind:`secret`,placeholder:`spotify-client-id`,required:!0,helpUrl:`https://developer.spotify.com/dashboard`,helpText:`settingsMcpTab.catalog.entry.spotify.field.clientId.help`}],riskLevel:`medium`},{id:`youtube-transcript`,displayName:`settingsMcpTab.catalog.entry.youtubeTranscript.displayName`,description:`settingsMcpTab.catalog.entry.youtubeTranscript.description`,audience:`general`,upstreamUrl:`https://github.com/kimtaeyoon83/mcp-server-youtube-transcript`,spec:{type:`stdio`,command:`npx`,args:[`-y`,`@kimtaeyoon83/mcp-server-youtube-transcript`]},configSchema:[],riskLevel:`low`}];function L3n(e){return I3n.find(t=>t.id===e)??null}function R3n(e){return new Set(e.configSchema.filter(e=>e.required).map(e=>e.key))}var z3n=/\$\{([A-Z_][A-Z0-9_]*)\}/g;function B3n(e,t,n){let r=new Set,i=new Set,a=e=>e.replace(z3n,(e,a)=>{i.add(a);let o=t[a];return o===void 0||o===``?(n.has(a)&&r.add(a),``):o}),o;o=e.type===`http`?{type:`http`,url:a(e.url),...e.headers!==void 0&&{headers:V3n(e.headers,a)},...e.enabled!==void 0&&{enabled:e.enabled}}:{type:`stdio`,command:a(e.command),...e.args!==void 0&&{args:e.args.map(a)},...e.env!==void 0&&{env:V3n(e.env,a)},...e.enabled!==void 0&&{enabled:e.enabled}};for(let e of n)i.has(e)||r.add(e);return r.size>0?{ok:!1,missing:[...r]}:{ok:!0,spec:o}}function V3n(e,t){let n={};for(let[r,i]of Object.entries(e))n[r]=t(i);return n}o(),M(),we(),le();var H3n={class:`space-y-3`},U3n={"data-testid":`mcp-catalog`,class:`space-y-2 pt-1`},W3n={class:`text-xs font-semibold text-gray-700`},G3n={class:`group`,open:``,"data-testid":`mcp-catalog-audience-general`},K3n={class:`cursor-pointer text-xs font-medium text-gray-700 select-none py-1`},q3n={class:`text-gray-400 ml-1`},J3n={class:`mt-2 space-y-2`},Y3n=[`data-testid`],X3n={class:`flex items-start gap-2 cursor-pointer`},Z3n=[`checked`,`data-testid`,`onChange`],Q3n={class:`flex-1 min-w-0`},$3n={class:`flex items-center gap-2 flex-wrap`},e6n={class:`text-sm font-semibold text-gray-800`},t6n={class:`text-xs text-gray-600 mt-0.5`},n6n={class:`text-[11px] text-gray-500 flex flex-wrap gap-x-3 ml-6`},r6n=[`href`,`data-testid`,`textContent`],i6n=[`href`,`data-testid`,`textContent`],a6n=[`data-testid`],o6n=[`data-testid`,`onSubmit`],s6n={class:`flex items-center gap-1.5`},c6n=[`for`],l6n=[`aria-label`],u6n=[`href`,`title`,`aria-label`,`data-testid`],d6n=[`id`,`onUpdate:modelValue`,`aria-required`,`data-testid`],f6n={key:0,value:``},p6n=[`value`],m6n=[`id`,`onUpdate:modelValue`,`type`,`placeholder`,`aria-required`,`data-testid`],h6n={key:2,class:`text-[11px] text-gray-500`},g6n=[`data-testid`],_6n={class:`flex gap-2 justify-end`},v6n=[`data-testid`],y6n=[`data-testid`],b6n={class:`text-xs font-semibold text-gray-700`},x6n={key:0,class:`text-xs text-gray-500 italic`,"data-testid":`mcp-empty`},S6n={key:1,class:`space-y-2`,"data-testid":`mcp-server-list`},C6n=[`data-testid`],w6n={class:`flex items-center justify-between`},T6n={class:`flex items-center gap-2`},E6n={class:`text-sm font-semibold text-gray-800`},D6n={class:`flex items-center gap-1 text-xs text-gray-600 ml-2`},O6n=[`checked`,`data-testid`,`onChange`],k6n=[`data-testid`,`onClick`],A6n={key:0,class:`text-xs space-y-1`},j6n={class:`text-gray-500`},M6n={class:`ml-1`},N6n={key:1,class:`text-xs space-y-1`},P6n={class:`text-gray-500`},F6n={class:`ml-1`},I6n={key:0,class:`ml-1`},L6n=[`data-testid`],R6n={class:`flex items-start gap-1.5 text-gray-600 cursor-pointer`},z6n=[`checked`,`data-testid`,`onChange`],B6n={key:3,class:`border border-blue-300 rounded p-3 space-y-2`,"data-testid":`mcp-add-form`},V6n={class:`block text-xs font-semibold text-gray-700`},H6n=[`placeholder`],U6n={class:`flex gap-3 text-xs`},W6n={class:`flex items-center gap-1`},G6n={class:`flex items-center gap-1`},K6n={key:0,class:`space-y-2`},q6n={class:`block text-xs font-semibold text-gray-700`},J6n=[`placeholder`],Y6n={key:1,class:`space-y-2`},X6n={class:`block text-xs font-semibold text-gray-700`},Z6n={class:`block text-xs font-semibold text-gray-700`},Q6n=[`placeholder`],$6n={key:2,class:`text-xs text-red-600`,"data-testid":`mcp-draft-error`},e8n={class:`flex justify-end gap-2`},t8n=`mcp-catalog-draft:`,n8n=`https://github.com/receptron/mulmoclaude/blob/main/docs/mcp-sandbox.md`,r8n=K({__name:`SettingsMcpTab`,props:{servers:{},dockerMode:{type:Boolean}},emits:[`add`,`update`,`remove`],setup(e,{expose:t,emit:n}){let{t:r}=We(),a=e,o=n,l=V(!1),d=V(P()),f=V(``),p=m(()=>I3n.filter(e=>e.audience===`general`));function h(e){return a.servers.some(t=>t.id===e)}function g(e,t){let n=t.target;if(!(n instanceof HTMLInputElement))return;if(n.checked){if(e.configSchema.length>0){x(e),n.checked=!1;return}o(`add`,{id:e.id,spec:{...e.spec,enabled:!0}});return}let r=a.servers.findIndex(t=>t.id===e.id);r>=0&&o(`remove`,r)}let _=V(null),v=V({}),y=V([]);function x(e){_.value=e.id,y.value=[],v.value=O(e.id);for(let t of e.configSchema)v.value[t.key]===void 0&&(v.value[t.key]=``)}function C(){_.value=null,v.value={},y.value=[]}function w(){C()}function E(e){y.value=[];let t=B3n(e.spec,v.value,R3n(e));t.ok?(o(`add`,{id:e.id,spec:{...t.spec,enabled:!0}}),j(e.id),C()):(y.value=t.missing,k(e.id,v.value,e.configSchema))}function O(e){try{let t=window.localStorage.getItem(t8n+e);if(!t)return{};let n=JSON.parse(t);if(!n||typeof n!=`object`||Array.isArray(n))return{};let r={};for(let[e,t]of Object.entries(n))typeof t==`string`&&(r[e]=t);return r}catch{return{}}}function k(e,t,n){let r=new Set(n.filter(e=>e.kind===`secret`).map(e=>e.key)),i={};for(let[e,n]of Object.entries(t))r.has(e)||(i[e]=n);try{window.localStorage.setItem(t8n+e,JSON.stringify(i))}catch{}}function j(e){try{window.localStorage.removeItem(t8n+e)}catch{}}function M(e){return e.kind===`secret`?`password`:e.kind===`url`?`url`:`text`}function N(e){return e===`low`?`bg-green-100 text-green-700`:e===`medium`?`bg-amber-100 text-amber-700`:`bg-red-100 text-red-700`}function P(){return{id:``,type:`http`,url:``,command:`npx`,argsText:``}}function I(){d.value=P(),f.value=``,l.value=!0}function L(){l.value=!1,f.value=``}let R=/^[a-z][a-z0-9_-]{0,63}$/;function z(e){return e.type===`http`?ee(e.url.trim()):te(e.argsText.split(`
|
|
5904
5904
|
`).map(e=>e.trim()).filter(e=>e.length>0))}function ee(e){try{let t=new URL(e).hostname.split(`.`).filter(e=>e.length>0);return ne(t.filter((e,n)=>(n!==0||e!==`mcp`&&e!==`www`&&e!==`api`)&&!(n===t.length-1&&/^[a-z]{2,4}$/.test(e)))[0]??t[0]??``)}catch{return``}}function te(e){let t=e.find(e=>!e.startsWith(`-`));return t?ne((t.split(`/`).pop()??t).replace(/^(mcp-server-|server-|mcp-)/,``).replace(/\.(?:[jt]s|mjs|cjs)$/,``)):``}function ne(e){let t=e.toLowerCase().replace(/[^a-z0-9_-]+/g,`-`);for(;t.startsWith(`-`);)t=t.slice(1);for(;t.endsWith(`-`);)t=t.slice(0,-1);return t=t.slice(0,64),/^[a-z]/.test(t)?t:``}function re(e){if(!e)return``;if(!a.servers.some(t=>t.id===e))return e;for(let t=2;t<1e3;t+=1){let n=`${e}-${t}`;if(!a.servers.some(e=>e.id===n))return n}return``}function ie(){let e=d.value.id.trim();if(!e){let t=re(z(d.value));if(!t){f.value=r(`settingsMcpTab.errNoName`);return}e=t}if(!R.test(e)){f.value=r(`settingsMcpTab.errBadName`);return}if(a.servers.some(t=>t.id===e)){f.value=r(`settingsMcpTab.errIdExists`,{id:e});return}let t;if(d.value.type===`http`){let e=d.value.url.trim();if(!/^https?:\/\//.test(e)){f.value=r(`settingsMcpTab.errBadHttpUrl`);return}t={type:`http`,url:e,enabled:!0}}else{let e=d.value.argsText.split(`
|
|
5905
5905
|
`).map(e=>e.trim()).filter(e=>e.length>0);t={type:`stdio`,command:d.value.command,args:e,enabled:!0}}o(`add`,{id:e,spec:t}),l.value=!1,f.value=``}function ae(){return l.value?d.value.id.trim().length>0||d.value.type===`http`&&d.value.url.trim().length>0||d.value.type===`stdio`&&d.value.argsText.trim().length>0?(ie(),!l.value):(L(),!0):!0}function oe(){return l.value?d.value.id.trim().length>0||d.value.url.trim().length>0||d.value.type===`stdio`&&(d.value.command.trim().length>0||d.value.argsText.trim().length>0):!1}t({flushDraft:ae,hasPendingDraft:oe});function W(e,t){let{target:n}=t;if(!(n instanceof HTMLInputElement))return;let r=a.servers[e];r&&o(`update`,e,{...r,spec:{...r.spec,enabled:n.checked}})}function se(e,t){let{target:n}=t;if(!(n instanceof HTMLInputElement))return;let r=a.servers[e];r&&r.spec.type===`stdio`&&o(`update`,e,{...r,spec:{...r.spec,hostExecInDocker:n.checked}})}function ce(e){return/^https?:\/\/(localhost|127\.0\.0\.1)(?=[:/]|$)/.test(e)}return(t,n)=>{let a=A(`i18n-t`);return B(),U(`div`,H3n,[De(a,{keypath:`settingsMcpTab.explanation`,tag:`p`,class:`text-xs text-gray-600 leading-relaxed`},{npx:Ie(()=>[...n[9]||=[S(`code`,{class:`bg-gray-100 px-1 rounded`},`npx`,-1)]]),node:Ie(()=>[...n[10]||=[S(`code`,{class:`bg-gray-100 px-1 rounded`},`node`,-1)]]),tsx:Ie(()=>[...n[11]||=[S(`code`,{class:`bg-gray-100 px-1 rounded`},`tsx`,-1)]]),_:1}),S(`section`,U3n,[S(`h3`,W3n,T(q(r)(`settingsMcpTab.catalog.heading`)),1),S(`details`,G3n,[S(`summary`,K3n,[J(T(q(r)(`settingsMcpTab.catalog.audience.general`))+` `,1),S(`span`,q3n,`(`+T(p.value.length)+`)`,1)]),S(`ul`,J3n,[(B(!0),U(D,null,H(p.value,t=>(B(),U(`li`,{key:t.id,"data-testid":`mcp-catalog-entry-${t.id}`,class:`border border-gray-200 rounded p-3 space-y-1.5`},[S(`label`,X3n,[S(`input`,{type:`checkbox`,checked:h(t.id),"data-testid":`mcp-catalog-toggle-${t.id}`,class:`mt-1 shrink-0`,onChange:e=>g(t,e)},null,40,Z3n),S(`div`,Q3n,[S(`div`,$3n,[S(`span`,e6n,T(q(r)(t.displayName)),1),S(`span`,{class:c([`text-[10px] uppercase tracking-wide rounded px-1.5 py-0.5`,N(t.riskLevel)])},T(q(r)(`settingsMcpTab.catalog.risk.${t.riskLevel}`)),3)]),S(`p`,t6n,T(q(r)(t.description)),1)])]),S(`div`,n6n,[S(`a`,{href:t.upstreamUrl,target:`_blank`,rel:`noopener noreferrer`,class:`hover:text-blue-600 hover:underline`,"data-testid":`mcp-catalog-upstream-${t.id}`,textContent:T(q(r)(`settingsMcpTab.catalog.upstream`))},null,8,r6n),t.setupGuideUrl?(B(),U(`a`,{key:0,href:t.setupGuideUrl,target:`_blank`,rel:`noopener noreferrer`,class:`hover:text-blue-600 hover:underline`,"data-testid":`mcp-catalog-setup-${t.id}`,textContent:T(q(r)(`settingsMcpTab.catalog.setupGuide`))},null,8,i6n)):b(``,!0)]),e.dockerMode&&t.spec.type===`stdio`?(B(),U(`div`,{key:0,class:`flex items-baseline gap-2 text-amber-700 text-[11px] ml-6`,"data-testid":`mcp-catalog-docker-warning-${t.id}`},[S(`span`,null,T(q(r)(`settingsMcpTab.dockerStdioUnsupported`)),1),S(`a`,{href:n8n,target:`_blank`,rel:`noopener noreferrer`,class:`underline whitespace-nowrap`},T(q(r)(`settingsMcpTab.learnMore`)),1)],8,a6n)):b(``,!0),_.value===t.id?(B(),U(`form`,{key:1,"data-testid":`mcp-catalog-config-form-${t.id}`,class:`ml-6 mt-2 space-y-3 border-l-2 border-blue-200 pl-3`,onSubmit:s(e=>E(t),[`prevent`])},[(B(!0),U(D,null,H(t.configSchema,e=>(B(),U(`div`,{key:e.key,class:`space-y-1`},[S(`div`,s6n,[S(`label`,{for:`mcp-config-${t.id}-${e.key}`,class:`text-xs font-medium text-gray-700`},[J(T(q(r)(e.label))+` `,1),e.required?(B(),U(`span`,{key:0,class:`text-red-500`,"aria-label":q(r)(`settingsMcpTab.catalog.config.requiredAria`)},T(q(r)(`settingsMcpTab.catalog.config.requiredMarker`)),9,l6n)):b(``,!0)],8,c6n),e.helpUrl?(B(),U(`a`,{key:0,href:e.helpUrl,target:`_blank`,rel:`noopener noreferrer`,class:`text-xs text-blue-600 hover:underline`,title:q(r)(`settingsMcpTab.catalog.config.howToGet`),"aria-label":q(r)(`settingsMcpTab.catalog.config.howToGet`),"data-testid":`mcp-catalog-config-help-${t.id}-${e.key}`},` 🔑 `,8,u6n)):b(``,!0)]),e.kind===`select`?u((B(),U(`select`,{key:0,id:`mcp-config-${t.id}-${e.key}`,"onUpdate:modelValue":t=>v.value[e.key]=t,"aria-required":e.required,class:c([`w-full px-2 py-1 text-xs border rounded`,y.value.includes(e.key)?`border-red-400 bg-red-50`:`border-gray-300`]),"data-testid":`mcp-catalog-config-input-${t.id}-${e.key}`},[e.required?b(``,!0):(B(),U(`option`,f6n,T(e.placeholder??``),1)),(B(!0),U(D,null,H(e.options??[],e=>(B(),U(`option`,{key:e,value:e},T(e),9,p6n))),128))],10,d6n)),[[i,v.value[e.key]]]):u((B(),U(`input`,{key:1,id:`mcp-config-${t.id}-${e.key}`,"onUpdate:modelValue":t=>v.value[e.key]=t,type:M(e),placeholder:e.placeholder??``,"aria-required":e.required,class:c([`w-full px-2 py-1 text-xs border rounded`,y.value.includes(e.key)?`border-red-400 bg-red-50`:`border-gray-300`]),"data-testid":`mcp-catalog-config-input-${t.id}-${e.key}`,autocomplete:`off`,spellcheck:`false`},null,10,m6n)),[[ze,v.value[e.key]]]),e.helpText?(B(),U(`p`,h6n,T(q(r)(e.helpText)),1)):b(``,!0)]))),128)),y.value.length>0?(B(),U(`div`,{key:0,class:`text-xs text-red-600`,"data-testid":`mcp-catalog-config-error-${t.id}`},T(q(r)(`settingsMcpTab.catalog.config.errMissingRequired`,{fields:y.value.join(`, `)})),9,g6n)):b(``,!0),S(`div`,_6n,[S(`button`,{type:`button`,class:`px-2 py-1 text-xs rounded border border-gray-300 text-gray-600 hover:bg-gray-50`,"data-testid":`mcp-catalog-config-cancel-${t.id}`,onClick:w},T(q(r)(`common.cancel`)),9,v6n),S(`button`,{type:`submit`,class:`px-2 py-1 text-xs rounded bg-blue-500 text-white hover:bg-blue-600`,"data-testid":`mcp-catalog-config-install-${t.id}`},T(q(r)(`settingsMcpTab.catalog.config.install`)),9,y6n)])],40,o6n)):b(``,!0)],8,Y3n))),128))])])]),n[15]||=S(`hr`,{class:`border-gray-200`},null,-1),S(`h3`,b6n,T(q(r)(`settingsMcpTab.customHeading`)),1),e.servers.length===0?(B(),U(`div`,x6n,T(q(r)(`settingsMcpTab.noServers`)),1)):(B(),U(`ul`,S6n,[(B(!0),U(D,null,H(e.servers,(t,i)=>(B(),U(`li`,{key:t.id+`:`+i,class:`border border-gray-200 rounded p-3 space-y-2`,"data-testid":`mcp-server-`+t.id},[S(`div`,w6n,[S(`div`,T6n,[S(`span`,E6n,T(t.id),1),S(`span`,{class:c([`text-[10px] uppercase tracking-wide rounded px-1.5 py-0.5`,t.spec.type===`http`?`bg-green-100 text-green-700`:`bg-amber-100 text-amber-700`])},T(t.spec.type),3),S(`label`,D6n,[S(`input`,{type:`checkbox`,checked:t.spec.enabled!==!1,"data-testid":`mcp-enabled-`+t.id,onChange:e=>W(i,e)},null,40,O6n),J(` `+T(q(r)(`settingsMcpTab.enabled`)),1)])]),S(`button`,{class:`text-xs text-red-600 hover:text-red-800`,"data-testid":`mcp-remove-`+t.id,onClick:e=>o(`remove`,i)},T(q(r)(`common.remove`)),9,k6n)]),t.spec.type===`http`?(B(),U(`div`,A6n,[S(`div`,null,[S(`span`,j6n,T(q(r)(`settingsMcpTab.urlLabel`)),1),S(`code`,M6n,T(t.spec.url),1)]),e.dockerMode&&ce(t.spec.url)?(B(),ke(a,{key:0,keypath:`settingsMcpTab.localhostRewrite`,tag:`div`,class:`text-amber-700`},{localhost:Ie(()=>[...n[12]||=[S(`code`,null,`localhost`,-1)]]),hostDockerInternal:Ie(()=>[...n[13]||=[S(`code`,null,`host.docker.internal`,-1)]]),_:1})):b(``,!0)])):t.spec.type===`stdio`?(B(),U(`div`,N6n,[S(`div`,null,[S(`span`,P6n,T(q(r)(`settingsMcpTab.commandLabel`)),1),S(`code`,F6n,T(t.spec.command),1),t.spec.args?.length?(B(),U(`code`,I6n,T((t.spec.args??[]).join(` `)),1)):b(``,!0)]),e.dockerMode?(B(),U(`div`,{key:0,class:`space-y-1`,"data-testid":`mcp-docker-warning-`+t.id},[S(`div`,{class:c([`flex items-baseline gap-2`,t.spec.hostExecInDocker?`text-red-700`:`text-amber-700`])},[S(`span`,null,T(t.spec.hostExecInDocker?q(r)(`settingsMcpTab.dockerStdioHostExecActive`):q(r)(`settingsMcpTab.dockerStdioUnsupported`)),1),S(`a`,{href:n8n,target:`_blank`,rel:`noopener noreferrer`,class:`underline whitespace-nowrap`},T(q(r)(`settingsMcpTab.learnMore`)),1)],2),S(`label`,R6n,[S(`input`,{type:`checkbox`,class:`mt-0.5 shrink-0`,checked:t.spec.hostExecInDocker===!0,"data-testid":`mcp-hostexec-`+t.id,onChange:e=>se(i,e)},null,40,z6n),S(`span`,null,T(q(r)(`settingsMcpTab.dockerStdioHostExecOptIn`)),1)])],8,L6n)):b(``,!0)])):b(``,!0)],8,C6n))),128))])),l.value?(B(),U(`div`,B6n,[S(`label`,V6n,[J(T(q(r)(`settingsMcpTab.nameLabel`))+` `,1),u(S(`input`,{"onUpdate:modelValue":n[0]||=e=>d.value.id=e,type:`text`,placeholder:q(r)(`settingsMcpTab.namePlaceholder`),class:`mt-1 w-full px-2 py-1 text-sm border border-gray-300 rounded focus:outline-none focus:border-blue-400`,"data-testid":`mcp-draft-id`,onKeydown:n[1]||=s(()=>{},[`stop`])},null,40,H6n),[[Fe,d.value.id]])]),S(`div`,U6n,[S(`label`,W6n,[u(S(`input`,{"onUpdate:modelValue":n[2]||=e=>d.value.type=e,type:`radio`,value:`http`,"data-testid":`mcp-draft-type-http`},null,512),[[F,d.value.type]]),J(` `+T(q(r)(`settingsMcpTab.typeHttp`)),1)]),S(`label`,G6n,[u(S(`input`,{"onUpdate:modelValue":n[3]||=e=>d.value.type=e,type:`radio`,value:`stdio`,"data-testid":`mcp-draft-type-stdio`},null,512),[[F,d.value.type]]),J(` `+T(q(r)(`settingsMcpTab.typeStdio`)),1)])]),d.value.type===`http`?(B(),U(`div`,K6n,[S(`label`,q6n,[J(T(q(r)(`settingsMcpTab.urlFieldLabel`))+` `,1),u(S(`input`,{"onUpdate:modelValue":n[4]||=e=>d.value.url=e,type:`text`,placeholder:q(r)(`settingsMcpTab.urlPlaceholder`),class:`mt-1 w-full px-2 py-1 text-sm border border-gray-300 rounded focus:outline-none focus:border-blue-400`,"data-testid":`mcp-draft-url`,onKeydown:n[5]||=s(()=>{},[`stop`])},null,40,J6n),[[Fe,d.value.url]])])])):(B(),U(`div`,Y6n,[S(`label`,X6n,[J(T(q(r)(`settingsMcpTab.commandFieldLabel`))+` `,1),u(S(`select`,{"onUpdate:modelValue":n[6]||=e=>d.value.command=e,class:`mt-1 w-full px-2 py-1 text-sm border border-gray-300 rounded focus:outline-none focus:border-blue-400`,"data-testid":`mcp-draft-command`},[...n[14]||=[S(`option`,{value:`npx`},`npx`,-1),S(`option`,{value:`node`},`node`,-1),S(`option`,{value:`tsx`},`tsx`,-1)]],512),[[i,d.value.command]])]),S(`label`,Z6n,[J(T(q(r)(`settingsMcpTab.argsLabel`))+` `,1),u(S(`textarea`,{"onUpdate:modelValue":n[7]||=e=>d.value.argsText=e,class:`mt-1 w-full h-20 px-2 py-1 text-sm font-mono border border-gray-300 rounded focus:outline-none focus:border-blue-400`,placeholder:q(r)(`settingsMcpTab.argsPlaceholder`),"data-testid":`mcp-draft-args`,onKeydown:n[8]||=s(()=>{},[`stop`])},null,40,Q6n),[[Fe,d.value.argsText]])])])),f.value?(B(),U(`div`,$6n,T(f.value),1)):b(``,!0),S(`div`,e8n,[S(`button`,{class:`px-2 py-1 text-xs rounded border border-gray-300 text-gray-600 hover:bg-gray-50`,"data-testid":`mcp-draft-cancel`,onClick:L},T(q(r)(`common.cancel`)),1),S(`button`,{class:`px-2 py-1 text-xs rounded bg-blue-500 text-white hover:bg-blue-600`,"data-testid":`mcp-draft-add`,onClick:ie},T(q(r)(`common.add`)),1)])])):(B(),U(`button`,{key:2,class:`text-xs px-2 py-1 rounded border border-gray-300 text-gray-700 hover:bg-gray-50`,"data-testid":`mcp-add-btn`,onClick:I},T(q(r)(`settingsMcpTab.addServerButton`)),1))])}}});o(),M(),we(),le();var i8n={class:`space-y-3`},a8n={key:0,class:`text-sm text-gray-400`},o8n={key:1,class:`text-sm text-red-600 bg-red-50 rounded px-3 py-2`},s8n={key:0,class:`text-sm text-gray-400`},c8n={key:1,class:`space-y-1.5`},l8n=[`data-testid`],u8n={class:`flex-1 min-w-0`},d8n={class:`font-mono text-xs text-gray-800`},f8n={key:0,class:`text-xs text-gray-500 truncate`},p8n={class:`text-[10px] px-1.5 py-0.5 rounded bg-gray-200 text-gray-600 shrink-0`},m8n=[`title`,`onClick`],h8n={class:`border border-gray-200 rounded p-2 space-y-2`},g8n={class:`text-xs font-semibold text-gray-600`},_8n={class:`flex gap-2`},v8n=[`placeholder`],y8n=[`placeholder`],b8n={class:`flex items-center gap-2`},x8n={key:0,class:`text-xs text-red-500`},S8n={key:2,class:`text-xs text-red-600 bg-red-50 rounded px-3 py-1.5`,"data-testid":`workspace-dirs-persist-error`},C8n=K({__name:`SettingsWorkspaceDirsTab`,setup(e){let{t}=We(),n=V([]),r=V(!0),a=V(``),o=V(``),c=V(``),d=V(``),f=V(`flat`),p=V(``);async function m(){r.value=!0,a.value=``;let e=await bN(kP.config.workspaceDirs);r.value=!1,e.ok?n.value=e.data.dirs:a.value=e.error}let h=Promise.resolve();async function g(e){let t=h.catch(()=>void 0).then(async()=>{let t=e(n.value),r=await SN(kP.config.workspaceDirs,{dirs:t});return r.ok?(n.value=r.data.dirs,o.value=``,!0):(o.value=r.error,!1)});return h=t,t}async function _(){p.value=``;let e=c.value.trim();if(!e){p.value=t(`settingsWorkspaceDirs.errPathRequired`);return}if(!e.startsWith(`data/`)&&!e.startsWith(`artifacts/`)){p.value=t(`settingsWorkspaceDirs.errMustStartWith`);return}if(n.value.some(t=>t.path===e)){p.value=t(`settingsWorkspaceDirs.errAlreadyExists`);return}let r={path:e,description:d.value.trim(),structure:f.value};await g(e=>[...e,r])&&(c.value=``,d.value=``,f.value=`flat`)}async function v(e){let t=n.value[e];t&&await g(e=>e.filter(e=>e!==t))}return P(m),(e,m)=>{let h=A(`i18n-t`);return B(),U(`div`,i8n,[De(h,{keypath:`settingsWorkspaceDirs.explanation`,tag:`p`,class:`text-xs text-gray-600 leading-relaxed`},{dataDir:Ie(()=>[...m[5]||=[S(`code`,{class:`bg-gray-100 px-1 rounded`},`data/`,-1)]]),artifactsDir:Ie(()=>[...m[6]||=[S(`code`,{class:`bg-gray-100 px-1 rounded`},`artifacts/`,-1)]]),_:1}),r.value?(B(),U(`div`,a8n,T(q(t)(`common.loading`)),1)):a.value?(B(),U(`div`,o8n,T(a.value),1)):(B(),U(D,{key:2},[n.value.length===0?(B(),U(`div`,s8n,T(q(t)(`settingsWorkspaceDirs.noEntries`)),1)):(B(),U(`div`,c8n,[(B(!0),U(D,null,H(n.value,(e,n)=>(B(),U(`div`,{key:e.path,class:`flex items-center gap-2 px-2 py-1.5 bg-gray-50 rounded text-sm`,"data-testid":`workspace-dir-${n}`},[S(`div`,u8n,[S(`div`,d8n,T(e.path)+`/`,1),e.description?(B(),U(`div`,f8n,T(e.description),1)):b(``,!0)]),S(`span`,p8n,T(e.structure),1),S(`button`,{class:`text-gray-300 hover:text-red-500 shrink-0`,title:q(t)(`common.remove`),onClick:e=>v(n)},[...m[7]||=[S(`span`,{class:`material-icons text-sm`},`close`,-1)]],8,m8n)],8,l8n))),128))])),S(`div`,h8n,[S(`div`,g8n,T(q(t)(`settingsWorkspaceDirs.addDirTitle`)),1),S(`div`,_8n,[u(S(`input`,{"onUpdate:modelValue":m[0]||=e=>c.value=e,class:`flex-1 px-2 py-1 text-xs font-mono border border-gray-300 rounded focus:outline-none focus:border-blue-400`,placeholder:q(t)(`settingsWorkspaceDirs.pathPlaceholder`),"data-testid":`workspace-dir-path-input`,onKeydown:[l(_,[`enter`]),m[1]||=s(()=>{},[`stop`])]},null,40,v8n),[[Fe,c.value]]),u(S(`select`,{"onUpdate:modelValue":m[2]||=e=>f.value=e,class:`text-xs border border-gray-300 rounded px-1 py-1 focus:outline-none`,"data-testid":`workspace-dir-structure-select`},[...m[8]||=[S(`option`,{value:`flat`},`flat`,-1),S(`option`,{value:`by-name`},`by-name`,-1),S(`option`,{value:`by-date`},`by-date`,-1)]],512),[[i,f.value]])]),u(S(`input`,{"onUpdate:modelValue":m[3]||=e=>d.value=e,class:`w-full px-2 py-1 text-xs border border-gray-300 rounded focus:outline-none focus:border-blue-400`,placeholder:q(t)(`settingsWorkspaceDirs.descPlaceholder`),"data-testid":`workspace-dir-desc-input`,onKeydown:[l(_,[`enter`]),m[4]||=s(()=>{},[`stop`])]},null,40,y8n),[[Fe,d.value]]),S(`div`,b8n,[S(`button`,{class:`px-2 py-1 text-xs rounded bg-blue-500 text-white hover:bg-blue-600`,"data-testid":`workspace-dir-add-btn`,onClick:_},T(q(t)(`common.add`)),1),p.value?(B(),U(`span`,x8n,T(p.value),1)):b(``,!0)])]),o.value?(B(),U(`div`,S8n,T(o.value),1)):b(``,!0)],64))])}}});o(),M(),we(),le();var w8n={class:`space-y-3`},T8n={class:`text-xs text-gray-600 leading-relaxed`},E8n={key:0,class:`text-sm text-gray-400`},D8n={key:1,class:`text-sm text-red-600 bg-red-50 rounded px-3 py-2`},O8n={key:0,class:`text-sm text-gray-400`},k8n={key:1,class:`space-y-1.5`},A8n=[`data-testid`],j8n={class:`flex-1 min-w-0`},M8n={class:`font-mono text-xs text-gray-800 truncate`},N8n={key:0,class:`text-xs text-gray-500 truncate`},P8n={class:`text-[10px] px-1.5 py-0.5 rounded bg-blue-100 text-blue-600 shrink-0`},F8n=[`title`,`onClick`],I8n={class:`border border-gray-200 rounded p-2 space-y-2`},L8n={class:`text-xs font-semibold text-gray-600`},R8n=[`placeholder`],z8n=[`placeholder`],B8n={class:`flex items-center gap-2`},V8n={key:0,class:`text-xs text-red-500`},H8n={key:2,class:`text-xs text-red-600 bg-red-50 rounded px-3 py-1.5`,"data-testid":`reference-dirs-persist-error`},U8n=K({__name:`SettingsReferenceDirsTab`,setup(e){let{t}=We(),n=V([]),r=V(!0),i=V(``),a=V(``),o=V(``),c=V(``),d=V(``);async function f(){r.value=!0,i.value=``;let e=await bN(kP.config.referenceDirs);r.value=!1,e.ok?n.value=e.data.dirs:i.value=e.error}let p=Promise.resolve();async function m(e){let t=p.catch(()=>void 0).then(async()=>{let t=e(n.value),r=await SN(kP.config.referenceDirs,{dirs:t});return r.ok?(n.value=r.data.dirs,a.value=``,!0):(a.value=r.error,!1)});return p=t,t}async function h(){d.value=``;let e=o.value.trim();if(!e){d.value=t(`settingsReferenceDirs.errPathRequired`);return}if(!e.startsWith(`/`)&&!e.startsWith(`~/`)){d.value=t(`settingsReferenceDirs.errMustBeAbsolute`);return}let r=e;for(;r.length>1&&r.endsWith(`/`);)r=r.slice(0,-1);let i=e=>{let t=e;for(;t.length>1&&t.endsWith(`/`);)t=t.slice(0,-1);return t};if(n.value.some(e=>i(e.hostPath)===r)){d.value=t(`settingsReferenceDirs.errAlreadyExists`);return}let a=r.split(`/`).pop(),s=c.value.trim()||a||r;if(n.value.some(e=>e.label===s)){d.value=t(`settingsReferenceDirs.errLabelConflict`,{label:s});return}let l={hostPath:r,label:s};await m(e=>[...e,l])&&(o.value=``,c.value=``)}async function g(e){let t=n.value[e];t&&await m(e=>e.filter(e=>e!==t))}return P(f),(e,f)=>(B(),U(`div`,w8n,[S(`p`,T8n,T(q(t)(`settingsReferenceDirs.explanation`)),1),r.value?(B(),U(`div`,E8n,T(q(t)(`common.loading`)),1)):i.value?(B(),U(`div`,D8n,T(i.value),1)):(B(),U(D,{key:2},[n.value.length===0?(B(),U(`div`,O8n,T(q(t)(`settingsReferenceDirs.noEntries`)),1)):(B(),U(`div`,k8n,[(B(!0),U(D,null,H(n.value,(e,n)=>(B(),U(`div`,{key:e.hostPath,class:`flex items-center gap-2 px-2 py-1.5 bg-gray-50 rounded text-sm`,"data-testid":`reference-dir-${n}`},[f[5]||=S(`span`,{class:`material-icons text-sm text-gray-400 shrink-0`},`folder_open`,-1),S(`div`,j8n,[S(`div`,M8n,T(e.hostPath),1),e.label?(B(),U(`div`,N8n,T(e.label),1)):b(``,!0)]),S(`span`,P8n,T(q(t)(`settingsReferenceDirs.readOnlyBadge`)),1),S(`button`,{class:`text-gray-300 hover:text-red-500 shrink-0`,title:q(t)(`common.remove`),"data-testid":`reference-dir-remove-btn`,onClick:e=>g(n)},[...f[4]||=[S(`span`,{class:`material-icons text-sm`},`close`,-1)]],8,F8n)],8,A8n))),128))])),S(`div`,I8n,[S(`div`,L8n,T(q(t)(`settingsReferenceDirs.addDirTitle`)),1),u(S(`input`,{"onUpdate:modelValue":f[0]||=e=>o.value=e,class:`w-full px-2 py-1 text-xs font-mono border border-gray-300 rounded focus:outline-none focus:border-blue-400`,placeholder:q(t)(`settingsReferenceDirs.pathPlaceholder`),"data-testid":`reference-dir-path-input`,onKeydown:[l(h,[`enter`]),f[1]||=s(()=>{},[`stop`])]},null,40,R8n),[[Fe,o.value]]),u(S(`input`,{"onUpdate:modelValue":f[2]||=e=>c.value=e,class:`w-full px-2 py-1 text-xs border border-gray-300 rounded focus:outline-none focus:border-blue-400`,placeholder:q(t)(`settingsReferenceDirs.labelPlaceholder`),"data-testid":`reference-dir-label-input`,onKeydown:[l(h,[`enter`]),f[3]||=s(()=>{},[`stop`])]},null,40,z8n),[[Fe,c.value]]),S(`div`,B8n,[S(`button`,{class:`px-2 py-1 text-xs rounded bg-blue-500 text-white hover:bg-blue-600`,"data-testid":`reference-dir-add-btn`,onClick:h},T(q(t)(`common.add`)),1),d.value?(B(),U(`span`,V8n,T(d.value),1)):b(``,!0)])]),a.value?(B(),U(`div`,H8n,T(a.value),1)):b(``,!0)],64))]))}});o(),M(),we(),le();var W8n={class:`space-y-3`,"data-testid":`settings-gemini-tab`},G8n={key:0,class:`rounded border border-yellow-400 bg-yellow-50 p-3 text-sm text-yellow-800`,"data-testid":`settings-gemini-warning`},K8n={class:`space-y-2`},q8n={class:`block text-sm font-medium text-gray-800`,for:`settings-gemini-api-key`},J8n={class:`flex items-center gap-2`},Y8n=[`placeholder`,`disabled`,`onKeydown`],X8n=[`disabled`],Z8n={class:`text-xs text-gray-500`},Q8n={class:`text-xs text-gray-500`},$8n={class:`flex items-center gap-3 text-xs`},e5n=[`disabled`],t5n={key:1,class:`text-xs text-gray-500`,"data-testid":`settings-gemini-env-source`},n5n={class:`font-mono`},r5n={key:2,class:`text-sm text-red-700`,role:`alert`,"data-testid":`settings-gemini-error`},R9=`GEMINI_API_KEY`,i5n=`.env`,a5n=K({__name:`SettingsGeminiTab`,props:{reloadToken:{},geminiAvailable:{type:Boolean},envFilePath:{}},emits:[`saved`,`ask`],setup(e,{emit:t}){let{t:n}=We(),r=e,i=t,a=V(``),o=V(`none`),d=V(!0),f=V(!1),p=V(``),h=m(()=>d.value||f.value),g=m(()=>r.envFilePath||i5n),_=m(()=>f.value?n(`common.saving`):d.value?n(`common.loading`):o.value===`gui`?n(`settingsModal.geminiTab.storedHere`):o.value===`env`?n(`settingsModal.geminiTab.storedInEnvironment`):n(`settingsModal.geminiTab.notConfigured`)),v=m(()=>p.value?`text-red-600`:o.value===`none`?`text-gray-500`:`text-green-600`);async function y(){p.value=``,d.value=!0;let e=await bN(kP.secrets);d.value=!1,e.ok?(o.value=e.data.secrets.find(e=>e.key===R9)?.source??`none`,a.value=``):p.value=e.error||n(`settingsModal.geminiTab.loadError`)}async function x(){let e=a.value.trim();if(h.value||e===``)return;f.value=!0,p.value=``;let t=await SN(kP.secrets,{key:R9,value:e});f.value=!1,t.ok?(o.value=t.data.secrets.find(e=>e.key===R9)?.source??`gui`,a.value=``,i(`saved`)):p.value=t.error||n(`settingsModal.geminiTab.saveError`)}async function C(){if(h.value)return;f.value=!0,p.value=``;let e=await CN(kP.secrets,{key:R9});f.value=!1,e.ok?(o.value=e.data.secrets.find(e=>e.key===R9)?.source??`none`,i(`saved`)):p.value=e.error||n(`settingsModal.geminiTab.clearError`)}return Ve(()=>r.reloadToken,y,{immediate:!0}),(t,r)=>{let d=A(`i18n-t`);return B(),U(`div`,W8n,[e.geminiAvailable?b(``,!0):(B(),U(`div`,G8n,[r[3]||=S(`span`,{class:`material-icons text-sm align-middle mr-1`},`warning`,-1),De(d,{keypath:`settingsModal.geminiTab.required`,tag:`span`},{envKey:Ie(()=>[...r[2]||=[S(`code`,{class:`font-mono`},`GEMINI_API_KEY`,-1)]]),_:1})])),S(`div`,K8n,[S(`label`,q8n,T(q(n)(`settingsModal.geminiTab.apiKeyLabel`)),1),S(`div`,J8n,[u(S(`input`,{id:`settings-gemini-api-key`,"onUpdate:modelValue":r[0]||=e=>a.value=e,type:`password`,autocomplete:`off`,spellcheck:`false`,class:`flex-1 px-3 py-2 text-sm font-mono rounded border border-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,placeholder:q(n)(`settingsModal.geminiTab.apiKeyPlaceholder`),disabled:h.value,"data-testid":`settings-gemini-api-key-input`,onKeydown:l(s(x,[`prevent`]),[`enter`])},null,40,Y8n),[[Fe,a.value]]),S(`button`,{class:`px-3 py-2 text-sm rounded bg-blue-500 text-white hover:bg-blue-600 disabled:bg-gray-300 disabled:cursor-not-allowed`,disabled:h.value||a.value.trim()===``,"data-testid":`settings-gemini-save-btn`,onClick:x},T(q(n)(`common.save`)),9,X8n)]),S(`p`,Z8n,[De(d,{keypath:`settingsModal.geminiTab.helperText`,tag:`span`},{studioLink:Ie(()=>[...r[4]||=[S(`a`,{href:`https://aistudio.google.com/apikey`,target:`_blank`,rel:`noopener noreferrer`,class:`text-blue-600 hover:underline`},`Google AI Studio`,-1)]]),_:1})]),S(`p`,Q8n,T(q(n)(`settingsModal.geminiTab.storageNote`)),1)]),S(`div`,$8n,[S(`span`,{class:c(v.value),"data-testid":`settings-gemini-status`},T(_.value),3),o.value===`gui`?(B(),U(`button`,{key:0,class:`text-xs text-red-600 hover:underline disabled:text-gray-400`,disabled:h.value,"data-testid":`settings-gemini-clear-btn`,onClick:C},T(q(n)(`settingsModal.geminiTab.clear`)),9,e5n)):b(``,!0)]),o.value===`env`?(B(),U(`p`,t5n,[De(d,{keypath:`settingsModal.geminiTab.fromEnvironment`,tag:`span`},{envFile:Ie(()=>[S(`code`,n5n,T(g.value),1)]),_:1})])):b(``,!0),p.value?(B(),U(`p`,r5n,T(p.value),1)):b(``,!0),S(`button`,{class:`px-3 py-1.5 text-sm rounded bg-gray-100 text-gray-800 hover:bg-gray-200`,"data-testid":`settings-gemini-ask-btn`,onClick:r[1]||=e=>i(`ask`)},T(q(n)(`settingsModal.geminiAskButton`)),1)])}}});o(),M(),we(),le();var o5n={class:`space-y-3`,"data-testid":`settings-map-tab`},s5n={class:`text-sm text-gray-700`},c5n={class:`space-y-2`},l5n={class:`block text-sm font-medium text-gray-800`,for:`settings-map-api-key`},u5n=[`placeholder`,`disabled`,`onKeydown`],d5n={class:`text-xs text-gray-500`},f5n={class:`text-xs text-gray-500`},p5n={key:0,class:`flex items-center gap-3 text-xs`},m5n={key:1,class:`text-sm text-red-700`,role:`alert`,"data-testid":`settings-map-error`},h5n=K({__name:`SettingsMapTab`,props:{reloadToken:{}},emits:[`saved`],setup(e,{emit:t}){let{t:n}=We(),r=e,i=t,a=V(``),o=V(``),d=V(!0),f=V(!1),p=V(!1),h=V(``),g=m(()=>p.value?n(`common.saving`):h.value?h.value:o.value?n(`settingsModal.mapTab.configured`):n(`settingsModal.mapTab.notConfigured`)),_=m(()=>p.value?`text-gray-500`:h.value?`text-red-600`:o.value?`text-green-600`:`text-gray-500`);async function v(){h.value=``,d.value=!0;let e=await bN(kP.config.base);d.value=!1,e.ok?(o.value=e.data.settings.googleMapsApiKey??``,a.value=o.value,f.value=!0):h.value=e.error||n(`settingsModal.mapTab.loadError`)}async function y(){if(p.value)return;let e=a.value.trim();if(e===o.value)return;p.value=!0,h.value=``;let t=await SN(kP.config.settings,{googleMapsApiKey:e});p.value=!1,t.ok?(o.value=e,a.value=e,i(`saved`)):h.value=t.error||n(`settingsModal.mapTab.saveError`)}function x(e){let{target:t}=e;t instanceof HTMLElement&&t.blur()}return Ve(()=>r.reloadToken,()=>{v()},{immediate:!0}),(e,t)=>{let r=A(`i18n-t`);return B(),U(`div`,o5n,[S(`p`,s5n,T(q(n)(`settingsModal.mapTab.description`)),1),S(`div`,c5n,[S(`label`,l5n,T(q(n)(`settingsModal.mapTab.apiKeyLabel`)),1),u(S(`input`,{id:`settings-map-api-key`,"onUpdate:modelValue":t[0]||=e=>a.value=e,type:`password`,autocomplete:`off`,spellcheck:`false`,class:`w-full px-3 py-2 text-sm font-mono rounded border border-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500 disabled:bg-gray-100 disabled:cursor-not-allowed`,placeholder:q(n)(`settingsModal.mapTab.apiKeyPlaceholder`),disabled:d.value,"data-testid":`settings-map-api-key-input`,onBlur:y,onKeydown:l(s(x,[`prevent`]),[`enter`])},null,40,u5n),[[Fe,a.value]]),S(`p`,d5n,[De(r,{keypath:`settingsModal.mapTab.helperText`,tag:`span`},{consoleLink:Ie(()=>[...t[1]||=[S(`a`,{href:`https://console.cloud.google.com/apis/credentials`,target:`_blank`,rel:`noopener noreferrer`,class:`text-blue-600 hover:underline`},`Google Cloud Console`,-1)]]),_:1})]),S(`p`,f5n,T(q(n)(`settingsModal.mapTab.requiredApis`)),1)]),f.value?(B(),U(`div`,p5n,[S(`span`,{class:c(_.value),"data-testid":`settings-map-status`},T(g.value),3)])):b(``,!0),h.value?(B(),U(`p`,m5n,T(h.value),1)):b(``,!0)])}}});o(),M(),we(),le();var g5n={class:`space-y-3`,"data-testid":`settings-photos-tab`},_5n={class:`text-sm text-gray-700`},v5n={class:`flex items-start gap-3`},y5n=[`disabled`],b5n={for:`settings-photos-auto-capture`,class:`flex-1`},x5n={class:`block text-sm font-medium text-gray-800`},S5n={class:`block text-xs text-gray-500 mt-0.5`},C5n={key:0,class:`flex items-center gap-3 text-xs`},w5n={key:1,class:`text-sm text-red-700`,role:`alert`,"data-testid":`settings-photos-error`},T5n=K({__name:`SettingsPhotosTab`,props:{reloadToken:{}},emits:[`saved`],setup(e,{emit:t}){let{t:n}=We(),r=e,i=t,a=V(!0),o=V(!0),s=V(!1),l=V(!1),d=V(``),f=m(()=>l.value?n(`common.saving`):d.value?d.value:o.value?n(`settingsModal.photosTab.statusOn`):n(`settingsModal.photosTab.statusOff`)),p=m(()=>l.value?`text-gray-500`:d.value?`text-red-600`:o.value?`text-green-600`:`text-gray-500`);async function h(){d.value=``;let e=await bN(kP.config.base);if(!e.ok){d.value=e.error||n(`settingsModal.photosTab.loadError`);return}let t=e.data.settings.photoExif?.autoCapture??!0;o.value=t,a.value=t,s.value=!0}async function g(){if(l.value||a.value===o.value)return;l.value=!0,d.value=``;let e=await SN(kP.config.settings,{photoExif:{autoCapture:a.value}});l.value=!1,e.ok?(o.value=a.value,i(`saved`)):(d.value=e.error||n(`settingsModal.photosTab.saveError`),a.value=o.value)}return Ve(()=>r.reloadToken,()=>{h()},{immediate:!0}),(e,t)=>(B(),U(`div`,g5n,[S(`p`,_5n,T(q(n)(`settingsModal.photosTab.description`)),1),S(`div`,v5n,[u(S(`input`,{id:`settings-photos-auto-capture`,"onUpdate:modelValue":t[0]||=e=>a.value=e,type:`checkbox`,class:`mt-1 h-4 w-4`,disabled:l.value,"data-testid":`settings-photos-auto-capture-input`,onChange:g},null,40,y5n),[[ae,a.value]]),S(`label`,b5n,[S(`span`,x5n,T(q(n)(`settingsModal.photosTab.autoCaptureLabel`)),1),S(`span`,S5n,T(q(n)(`settingsModal.photosTab.autoCaptureHint`)),1)])]),s.value?(B(),U(`div`,C5n,[S(`span`,{class:c(p.value),"data-testid":`settings-photos-status`},T(f.value),3)])):b(``,!0),d.value?(B(),U(`p`,w5n,T(d.value),1)):b(``,!0)]))}});o(),M(),we();var E5n={class:`space-y-3`,"data-testid":`settings-google-tab`},D5n={class:`text-sm text-gray-700`},O5n={key:0,class:`text-sm text-amber-700`,"data-testid":`settings-google-secret-ambiguous`},k5n={key:1,class:`flex items-center gap-3`},A5n=[`disabled`],j5n=[`disabled`],M5n={key:2,class:`text-sm text-red-700`,role:`alert`,"data-testid":`settings-google-error`},N5n=2e3,P5n=3e4,F5n=K({__name:`SettingsGoogleTab`,props:{reloadToken:{}},setup(e){let{t}=We(),n=e,r=V(!1),i=V(!1),a=V(`found`),o=V(!1),s=V(!1),l=V(``),u=V(null),d=V(0),f=!1,p=m(()=>i.value?t(`settingsModal.googleTab.statusPending`):r.value?t(`settingsModal.googleTab.statusLinked`):t(`settingsModal.googleTab.statusNotLinked`)),h=m(()=>r.value?`text-green-600`:`text-gray-500`),g=e=>Math.min(N5n*2**e,P5n),_=(e=N5n)=>{u.value&&clearTimeout(u.value),u.value=!f&&i.value?setTimeout(()=>void v(),e):null};async function v(){let e=await bN(kP.google.status);f||(e.ok?(d.value=0,r.value=e.data.linked,i.value=e.data.pending,a.value=e.data.clientSecret,l.value=e.data.lastError??``,o.value=!0,_()):(l.value=e.error||t(`settingsModal.googleTab.loadError`),d.value+=1,_(g(d.value))))}async function y(){s.value=!0,l.value=``;let e=await xN(kP.google.authorize,{});s.value=!1,e.ok?(window.open(e.data.authUrl,`_blank`,`noopener`),i.value=!0,d.value=0,_()):l.value=e.error||t(`settingsModal.googleTab.connectError`)}async function x(){if(!window.confirm(t(`settingsModal.googleTab.unlinkConfirm`)))return;s.value=!0,l.value=``;let e=await xN(kP.google.unlink,{});s.value=!1,e.ok?r.value=!1:l.value=e.error||t(`settingsModal.googleTab.unlinkError`)}return Ve(()=>n.reloadToken,()=>{v()},{immediate:!0}),k(()=>{f=!0,u.value&&clearTimeout(u.value)}),(e,n)=>(B(),U(`div`,E5n,[S(`p`,D5n,T(q(t)(`settingsModal.googleTab.description`)),1),o.value&&a.value===`ambiguous`?(B(),U(`p`,O5n,T(q(t)(`settingsModal.googleTab.clientSecretAmbiguous`)),1)):b(``,!0),o.value?(B(),U(`div`,k5n,[S(`span`,{class:c([`text-sm`,h.value]),"data-testid":`settings-google-status`},T(p.value),3),r.value?(B(),U(`button`,{key:1,class:`px-2 py-1 text-xs rounded border border-gray-300 text-gray-700 hover:bg-gray-100 disabled:opacity-50`,disabled:s.value,"data-testid":`settings-google-unlink-btn`,onClick:x},T(q(t)(`settingsModal.googleTab.unlink`)),9,j5n)):(B(),U(`button`,{key:0,class:`px-2 py-1 text-xs rounded bg-blue-500 text-white hover:bg-blue-600 disabled:opacity-50`,disabled:s.value||a.value===`ambiguous`,"data-testid":`settings-google-connect-btn`,onClick:y},T(q(t)(`settingsModal.googleTab.connect`)),9,A5n))])):b(``,!0),l.value?(B(),U(`p`,M5n,T(l.value),1)):b(``,!0)]))}}),I5n=(e,t,n)=>!e&&t!==n,L5n=(e,t,n)=>({store:e,resend:t!==n});o(),M(),we(),le();var R5n={class:`space-y-3`,"data-testid":`settings-model-tab`},z5n={class:`text-sm text-gray-700`},B5n={class:`space-y-2`},V5n={class:`block text-sm font-medium text-gray-800`,for:`settings-model-chat-model`},H5n={value:``},U5n=[`value`],W5n={class:`text-xs text-gray-500`},G5n={class:`space-y-2`},K5n={class:`block text-sm font-medium text-gray-800`,for:`settings-model-effort`},q5n={value:``},J5n=[`value`],Y5n={class:`text-xs text-gray-500`},X5n={class:`flex items-start gap-3 border-t border-gray-200 pt-3`},Z5n=[`disabled`],Q5n={for:`settings-model-user-settings`,class:`flex-1`},$5n={class:`block text-sm font-medium text-gray-800`},e7n={class:`block text-xs text-gray-500 mt-0.5`},t7n={key:0,class:`block text-xs text-gray-600 mt-1`,"data-testid":`settings-model-skill-listing`},n7n={key:1,class:`block text-xs text-amber-700 mt-1`,"data-testid":`settings-model-skill-listing-heavy`},r7n={key:0,class:`flex items-center gap-3 text-xs`},i7n={key:1,class:`text-sm text-red-700`,role:`alert`,"data-testid":`settings-model-error`},a7n=K({__name:`SettingsModelTab`,props:{reloadToken:{}},emits:[`saved`],setup(e,{emit:t}){let{t:n}=We(),r=e,a=t,o=V(``),s=V(``),l=V(!1),d={key:`effortLevel`,draft:o,stored:s,saving:l},f=V(``),p=V(``),h=V(!1),g={key:`chatModel`,draft:f,stored:p,saving:h},_=V(!0),v=V(!0),y=V(!1),x=V(null),C=V(!1),w=V(``),E=m(()=>l.value?n(`common.saving`):s.value?n(`settingsModal.modelTab.configured`,{level:s.value}):n(`settingsModal.modelTab.notConfigured`)),O=m(()=>h.value?n(`common.saving`):p.value?n(`settingsModal.modelTab.modelConfigured`,{model:p.value}):n(`settingsModal.modelTab.modelNotConfigured`));function k(e){return e.saving.value?`text-gray-500`:e.stored.value?`text-green-600`:`text-gray-500`}async function A(){w.value=``;let e=await bN(kP.config.base);e.ok?(s.value=e.data.settings.effortLevel??``,o.value=s.value,p.value=e.data.settings.chatModel??``,f.value=p.value,v.value=e.data.settings.loadClaudeUserSettings??!0,_.value=v.value,x.value=e.data.skillListing??null,C.value=!0):w.value=e.error||n(`settingsModal.modelTab.loadError`)}async function j(e){if(!I5n(e.saving.value,e.draft.value,e.stored.value))return;let t=e.draft.value;e.saving.value=!0,w.value=``;let r=await SN(kP.config.settings,{[e.key]:t===``?null:t});e.saving.value=!1;let i=r.ok?``:r.error||n(`settingsModal.modelTab.saveError`),{store:o,resend:s}=L5n(r.ok,e.draft.value,t);o&&(e.stored.value=t,a(`saved`)),w.value=i,s&&j(e)}async function M(){if(y.value||_.value===v.value)return;let e=_.value;y.value=!0,w.value=``;let t=await SN(kP.config.settings,{loadClaudeUserSettings:e});y.value=!1,t.ok?(v.value=e,a(`saved`)):(w.value=t.error||n(`settingsModal.modelTab.saveError`),_.value=v.value)}return Ve(()=>r.reloadToken,()=>{A()},{immediate:!0}),(e,t)=>(B(),U(`div`,R5n,[S(`p`,z5n,T(q(n)(`settingsModal.modelTab.description`)),1),S(`div`,B5n,[S(`label`,V5n,T(q(n)(`settingsModal.modelTab.modelLabel`)),1),u(S(`select`,{id:`settings-model-chat-model`,"onUpdate:modelValue":t[0]||=e=>f.value=e,class:`w-full px-3 py-2 text-sm rounded border border-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500`,"data-testid":`settings-model-model-select`,onChange:t[1]||=e=>j(g)},[S(`option`,H5n,T(q(n)(`settingsModal.modelTab.modelUnset`)),1),(B(!0),U(D,null,H(q(xI),e=>(B(),U(`option`,{key:e,value:e},T(e),9,U5n))),128))],544),[[i,f.value]]),S(`p`,W5n,T(q(n)(`settingsModal.modelTab.modelHelperText`)),1)]),S(`div`,G5n,[S(`label`,K5n,T(q(n)(`settingsModal.modelTab.effortLabel`)),1),u(S(`select`,{id:`settings-model-effort`,"onUpdate:modelValue":t[2]||=e=>o.value=e,class:`w-full px-3 py-2 text-sm rounded border border-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500`,"data-testid":`settings-model-effort-select`,onChange:t[3]||=e=>j(d)},[S(`option`,q5n,T(q(n)(`settingsModal.modelTab.effortUnset`)),1),(B(!0),U(D,null,H(q(Bst),e=>(B(),U(`option`,{key:e,value:e},T(e),9,J5n))),128))],544),[[i,o.value]]),S(`p`,Y5n,T(q(n)(`settingsModal.modelTab.helperText`)),1)]),S(`div`,X5n,[u(S(`input`,{id:`settings-model-user-settings`,"onUpdate:modelValue":t[4]||=e=>_.value=e,type:`checkbox`,class:`mt-1 h-4 w-4`,disabled:y.value||!C.value,"data-testid":`settings-model-user-settings-input`,onChange:M},null,40,Z5n),[[ae,_.value]]),S(`label`,Q5n,[S(`span`,$5n,T(q(n)(`settingsModal.modelTab.userSettingsLabel`)),1),S(`span`,e7n,T(q(n)(`settingsModal.modelTab.userSettingsHint`)),1),x.value?(B(),U(`span`,t7n,[J(T(q(n)(`settingsModal.modelTab.skillListingSummary`,{count:x.value.skillCount}))+` `,1),x.value.pluginNames.length>0?(B(),U(D,{key:0},[J(T(q(n)(`settingsModal.modelTab.skillListingPlugins`,{plugins:x.value.pluginNames.join(`, `)})),1)],64)):b(``,!0)])):b(``,!0),x.value?.heavy?(B(),U(`span`,n7n,T(q(n)(`settingsModal.modelTab.skillListingHeavy`)),1)):b(``,!0)])]),C.value&&!w.value?(B(),U(`div`,r7n,[S(`span`,{class:c(k(g)),"data-testid":`settings-model-model-status`},T(O.value),3),S(`span`,{class:c(k(d)),"data-testid":`settings-model-status`},T(E.value),3)])):b(``,!0),w.value?(B(),U(`p`,i7n,T(w.value),1)):b(``,!0)]))}});o(),M(),we(),le();var o7n={class:`space-y-3`,"data-testid":`settings-voice-tab`},s7n={class:`text-sm text-gray-700`},c7n={class:`text-xs text-gray-500`,"data-testid":`settings-voice-requirements`},l7n={key:0,class:`rounded border border-gray-300 bg-gray-50 p-3 text-sm text-gray-600`,"data-testid":`settings-voice-unsupported`},u7n={class:`flex items-start gap-3`},d7n=[`disabled`],f7n={for:`settings-voice-enabled`,class:`flex-1`},p7n={class:`block text-sm font-medium text-gray-800`},m7n={class:`block text-xs text-gray-500 mt-0.5`},h7n={class:`block`},g7n={class:`text-xs font-semibold text-gray-700`},_7n=[`disabled`],v7n=[`value`],y7n={key:0,class:`flex items-center gap-2 text-xs`,"data-testid":`settings-voice-status`},b7n={key:0,class:`text-blue-600`},x7n={key:1,class:`text-green-600`},S7n={key:2,class:`text-red-600`},C7n={key:2,class:`text-sm text-red-700`,role:`alert`,"data-testid":`settings-voice-error`},w7n=1500,T7n=K({__name:`SettingsVoiceTab`,props:{reloadToken:{}},setup(e){let{t}=We(),n=e,r=[`large-v3-turbo`,`small`,`base`],a=V({capable:!1,enabled:!1,model:{name:`large-v3-turbo`,state:`idle`}}),o=V(!1),s=V(`large-v3-turbo`),c=V(!1),l=V(!1),d=V(``),f=null,p=m(()=>Math.round((a.value.model.progress??0)*100));function h(){f!==null&&(window.clearInterval(f),f=null)}async function g(){let e=await bN(kP.transcribe.model);e.ok?(c.value=!0,a.value=e.data,e.data.model.state!==`downloading`&&h()):(c.value=!1,d.value=e.error||t(`settingsModal.voiceTab.loadError`))}function v(){f===null&&(f=window.setInterval(()=>{g()},w7n))}async function y(){d.value=``;let e=await bN(kP.config.base);e.ok?(o.value=e.data.settings.voiceInput?.enabled??!1,s.value=e.data.settings.voiceInput?.model??`large-v3-turbo`,await g(),a.value.model.state===`downloading`&&v()):d.value=t(`settingsModal.voiceTab.loadError`)}async function x(){l.value=!0,d.value=``;let e=await SN(kP.config.settings,{voiceInput:{enabled:o.value,model:s.value}});return l.value=!1,e.ok?!0:(d.value=e.error||t(`settingsModal.voiceTab.saveError`),!1)}async function C(){let e=await xN(kP.transcribe.modelDownload);e.ok?(a.value=e.data,e.data.model.state===`downloading`&&v()):d.value=e.error||t(`settingsModal.voiceTab.downloadError`)}async function w(){await x()?o.value&&a.value.model.state!==`ready`&&await C():o.value=!o.value}async function E(){await x()&&(await g(),o.value&&a.value.model.state!==`ready`&&await C())}return Ve(()=>n.reloadToken,()=>{y()},{immediate:!0}),_(h),(e,n)=>(B(),U(`div`,o7n,[S(`p`,s7n,T(q(t)(`settingsModal.voiceTab.description`)),1),S(`p`,c7n,T(q(t)(`settingsModal.voiceTab.requirements`)),1),c.value&&!a.value.capable?(B(),U(`div`,l7n,T(q(t)(`settingsModal.voiceTab.unsupported`)),1)):c.value?(B(),U(D,{key:1},[S(`div`,u7n,[u(S(`input`,{id:`settings-voice-enabled`,"onUpdate:modelValue":n[0]||=e=>o.value=e,type:`checkbox`,class:`mt-1 h-4 w-4`,disabled:l.value,"data-testid":`settings-voice-enabled-input`,onChange:w},null,40,d7n),[[ae,o.value]]),S(`label`,f7n,[S(`span`,p7n,T(q(t)(`settingsModal.voiceTab.enableLabel`)),1),S(`span`,m7n,T(q(t)(`settingsModal.voiceTab.enableHint`)),1)])]),S(`label`,h7n,[S(`span`,g7n,T(q(t)(`settingsModal.voiceTab.modelLabel`)),1),u(S(`select`,{"onUpdate:modelValue":n[1]||=e=>s.value=e,class:`mt-1 w-full px-2 py-1.5 text-sm border border-gray-300 rounded focus:outline-none focus:border-blue-400 disabled:opacity-50`,disabled:l.value,"data-testid":`settings-voice-model-select`,onChange:E},[(B(),U(D,null,H(r,e=>S(`option`,{key:e,value:e},T(e),9,v7n)),64))],40,_7n),[[i,s.value]])]),o.value?(B(),U(`div`,y7n,[a.value.model.state===`downloading`?(B(),U(`span`,b7n,T(q(t)(`settingsModal.voiceTab.downloading`,{percent:p.value})),1)):a.value.model.state===`ready`?(B(),U(`span`,x7n,T(q(t)(`settingsModal.voiceTab.ready`)),1)):a.value.model.state===`error`?(B(),U(`span`,S7n,T(q(t)(`settingsModal.voiceTab.downloadError`)),1)):b(``,!0),a.value.model.state===`error`?(B(),U(`button`,{key:3,class:`px-2 py-0.5 rounded bg-blue-500 text-white hover:bg-blue-600`,"data-testid":`settings-voice-retry-btn`,onClick:C},T(q(t)(`settingsModal.voiceTab.retry`)),1)):b(``,!0)])):b(``,!0)],64)):b(``,!0),d.value?(B(),U(`p`,C7n,T(d.value),1)):b(``,!0)]))}});o(),M(),we(),le();var E7n={class:`space-y-3`,"data-testid":`settings-chat-index-tab`},D7n={class:`text-sm text-gray-700`},O7n={class:`space-y-2`},k7n={class:`block text-sm font-medium text-gray-800`,for:`settings-chat-index-mode`},A7n=[`value`],j7n={class:`text-xs text-gray-500`},M7n={key:0,class:`flex items-center gap-3 text-xs`},N7n={key:1,class:`text-sm text-red-700`,role:`alert`,"data-testid":`settings-chat-index-error`},P7n=K({__name:`SettingsChatIndexTab`,props:{reloadToken:{}},emits:[`saved`],setup(e,{emit:t}){let n=[`off`,`haiku`,`sonnet`],{t:r}=We(),a=e,o=t,s=V(`off`),l=V(`off`),d=V(!1),f=V(!1),p=V(``),h=m(()=>f.value?r(`common.saving`):r(`settingsModal.chatIndexTab.status.${l.value}`)),g=m(()=>f.value||l.value===`off`?`text-gray-500`:`text-green-600`);async function _(){p.value=``;let e=await bN(kP.config.base);e.ok?(l.value=e.data.settings.chatIndex??`off`,s.value=l.value,d.value=!0):p.value=e.error||r(`settingsModal.chatIndexTab.loadError`)}async function v(){if(f.value||s.value===l.value)return;let e=s.value;f.value=!0,p.value=``;let t={chatIndex:e===`off`?null:e},n=await SN(kP.config.settings,t);f.value=!1,y(n,e)}function y(e,t){e.ok?(l.value=t,o(`saved`),s.value!==t&&v()):(p.value=e.error||r(`settingsModal.chatIndexTab.saveError`),s.value===t?s.value=l.value:v())}return Ve(()=>a.reloadToken,()=>{_()},{immediate:!0}),(e,t)=>(B(),U(`div`,E7n,[S(`p`,D7n,T(q(r)(`settingsModal.chatIndexTab.description`)),1),S(`div`,O7n,[S(`label`,k7n,T(q(r)(`settingsModal.chatIndexTab.modeLabel`)),1),u(S(`select`,{id:`settings-chat-index-mode`,"onUpdate:modelValue":t[0]||=e=>s.value=e,class:`w-full px-3 py-2 text-sm rounded border border-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500`,"data-testid":`settings-chat-index-mode-select`,onChange:v},[(B(),U(D,null,H(n,e=>S(`option`,{key:e,value:e},T(q(r)(`settingsModal.chatIndexTab.mode.${e}`)),9,A7n)),64))],544),[[i,s.value]]),S(`p`,j7n,T(q(r)(`settingsModal.chatIndexTab.helperText`)),1)]),d.value&&!p.value?(B(),U(`div`,M7n,[S(`span`,{class:c(g.value),"data-testid":`settings-chat-index-status`},T(h.value),3)])):b(``,!0),p.value?(B(),U(`p`,N7n,T(p.value),1)):b(``,!0)]))}});o(),M(),we(),le();var F7n={class:`space-y-3`,"data-testid":`settings-journal-tab`},I7n={class:`text-sm text-gray-700`},L7n={class:`space-y-2`},R7n={class:`block text-sm font-medium text-gray-800`,for:`settings-journal-mode`},z7n=[`value`],B7n={class:`text-xs text-gray-500`},V7n={key:0,class:`flex items-center gap-3 text-xs`},H7n={key:1,class:`text-sm text-red-700`,role:`alert`,"data-testid":`settings-journal-error`},U7n=K({__name:`SettingsJournalTab`,props:{reloadToken:{}},emits:[`saved`],setup(e,{emit:t}){let n=[`off`,`haiku`,`sonnet`],{t:r}=We(),a=e,o=t,s=V(`off`),l=V(`off`),d=V(!1),f=V(!1),p=V(``),h=m(()=>f.value?r(`common.saving`):r(`settingsModal.journalTab.status.${l.value}`)),g=m(()=>f.value||l.value===`off`?`text-gray-500`:`text-green-600`);async function _(){p.value=``;let e=await bN(kP.config.base);e.ok?(l.value=e.data.settings.journal??`off`,s.value=l.value,d.value=!0):p.value=e.error||r(`settingsModal.journalTab.loadError`)}async function v(){if(f.value||s.value===l.value)return;let e=s.value;f.value=!0,p.value=``;let t={journal:e===`off`?null:e},n=await SN(kP.config.settings,t);f.value=!1,y(n,e)}function y(e,t){e.ok?(l.value=t,o(`saved`),s.value!==t&&v()):(p.value=e.error||r(`settingsModal.journalTab.saveError`),s.value===t?s.value=l.value:v())}return Ve(()=>a.reloadToken,()=>{_()},{immediate:!0}),(e,t)=>(B(),U(`div`,F7n,[S(`p`,I7n,T(q(r)(`settingsModal.journalTab.description`)),1),S(`div`,L7n,[S(`label`,R7n,T(q(r)(`settingsModal.journalTab.modeLabel`)),1),u(S(`select`,{id:`settings-journal-mode`,"onUpdate:modelValue":t[0]||=e=>s.value=e,class:`w-full px-3 py-2 text-sm rounded border border-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500`,"data-testid":`settings-journal-mode-select`,onChange:v},[(B(),U(D,null,H(n,e=>S(`option`,{key:e,value:e},T(q(r)(`settingsModal.journalTab.mode.${e}`)),9,z7n)),64))],544),[[i,s.value]]),S(`p`,B7n,T(q(r)(`settingsModal.journalTab.helperText`)),1)]),d.value&&!p.value?(B(),U(`div`,V7n,[S(`span`,{class:c(g.value),"data-testid":`settings-journal-status`},T(h.value),3)])):b(``,!0),p.value?(B(),U(`p`,H7n,T(p.value),1)):b(``,!0)]))}});o(),M(),we(),le();var W7n={class:`space-y-3`,"data-testid":`settings-notifications-tab`},G7n={class:`text-sm text-gray-700`},K7n={class:`flex items-start gap-3`},q7n=[`disabled`],J7n={for:`settings-notifications-push-enabled`,class:`flex-1`},Y7n={class:`block text-sm font-medium text-gray-800`},X7n={class:`block text-xs text-gray-500 mt-0.5`},Z7n={class:`text-xs text-gray-500`,"data-testid":`settings-notifications-remote-note`},Q7n={key:0,class:`flex items-center gap-3 text-xs`},$7n={key:1,class:`flex items-start gap-3 border-t border-gray-200 pt-3`},e9n=[`disabled`],t9n={for:`settings-notifications-macos-reminders`,class:`flex-1`},n9n={class:`block text-sm font-medium text-gray-800`},r9n={class:`block text-xs text-gray-500 mt-0.5`},i9n={key:0,class:`block text-xs text-amber-700 mt-1`,"data-testid":`settings-notifications-macos-reminders-forced`},a9n={key:2,class:`text-sm text-red-700`,role:`alert`,"data-testid":`settings-notifications-error`},o9n=K({__name:`SettingsNotificationsTab`,props:{reloadToken:{}},emits:[`saved`],setup(e,{emit:t}){let{t:n}=We(),r=e,i=t,a=V(!1),o=V(!1),s=V(!0),l=V(!0),d=V(!1),f=V(!1),p=V(!1),h=V(!1),g=V(``),_=m(()=>h.value?n(`common.saving`):g.value?g.value:o.value?n(`settingsModal.notificationsTab.statusOn`):n(`settingsModal.notificationsTab.statusOff`)),v=m(()=>h.value?`text-gray-500`:g.value?`text-red-600`:o.value?`text-green-600`:`text-gray-500`);async function y(){g.value=``;let e=await bN(kP.config.base);if(!e.ok){g.value=e.error||n(`settingsModal.notificationsTab.loadError`);return}let t=e.data.settings.pushEnabled??!1;o.value=t,a.value=t;let r=e.data.settings.macosRemindersEnabled??!0;l.value=r,s.value=r,d.value=e.data.macosReminders?.supported??!1,f.value=e.data.macosReminders?.forcedOffByEnv??!1,p.value=!0}async function x(){if(h.value||s.value===l.value)return;h.value=!0,g.value=``;let e=await SN(kP.config.settings,{macosRemindersEnabled:s.value});h.value=!1,e.ok?(l.value=s.value,i(`saved`)):(g.value=e.error||n(`settingsModal.notificationsTab.saveError`),s.value=l.value)}async function C(){if(h.value||a.value===o.value)return;h.value=!0,g.value=``;let e=await SN(kP.config.settings,{pushEnabled:a.value});h.value=!1,e.ok?(o.value=a.value,i(`saved`)):(g.value=e.error||n(`settingsModal.notificationsTab.saveError`),a.value=o.value)}return Ve(()=>r.reloadToken,()=>{y()},{immediate:!0}),(e,t)=>(B(),U(`div`,W7n,[S(`p`,G7n,T(q(n)(`settingsModal.notificationsTab.description`)),1),S(`div`,K7n,[u(S(`input`,{id:`settings-notifications-push-enabled`,"onUpdate:modelValue":t[0]||=e=>a.value=e,type:`checkbox`,class:`mt-1 h-4 w-4`,disabled:h.value,"data-testid":`settings-notifications-push-enabled-input`,onChange:C},null,40,q7n),[[ae,a.value]]),S(`label`,J7n,[S(`span`,Y7n,T(q(n)(`settingsModal.notificationsTab.enableLabel`)),1),S(`span`,X7n,T(q(n)(`settingsModal.notificationsTab.enableHint`)),1)])]),S(`p`,Z7n,T(q(n)(`settingsModal.notificationsTab.remoteHostNote`)),1),p.value?(B(),U(`div`,Q7n,[S(`span`,{class:c(v.value),"data-testid":`settings-notifications-status`},T(_.value),3)])):b(``,!0),d.value?(B(),U(`div`,$7n,[u(S(`input`,{id:`settings-notifications-macos-reminders`,"onUpdate:modelValue":t[1]||=e=>s.value=e,type:`checkbox`,class:`mt-1 h-4 w-4`,disabled:h.value||f.value,"data-testid":`settings-notifications-macos-reminders-input`,onChange:x},null,40,e9n),[[ae,s.value]]),S(`label`,t9n,[S(`span`,n9n,T(q(n)(`settingsModal.notificationsTab.macosRemindersLabel`)),1),S(`span`,r9n,T(q(n)(`settingsModal.notificationsTab.macosRemindersHint`)),1),f.value?(B(),U(`span`,i9n,T(q(n)(`settingsModal.notificationsTab.macosRemindersForcedOff`)),1)):b(``,!0)])])):b(``,!0),g.value?(B(),U(`p`,a9n,T(g.value),1)):b(``,!0)]))}});o(),M(),we();var s9n={class:`space-y-3`,"data-testid":`settings-quit-tab`},c9n={class:`text-sm text-gray-700`},l9n={class:`text-xs text-gray-500`},u9n={key:0,class:`pt-1`},d9n=[`disabled`],f9n={key:1,class:`rounded border border-red-200 bg-red-50 p-3 space-y-2`,"data-testid":`settings-quit-confirm`},p9n={class:`text-sm text-red-900`},m9n={class:`flex gap-2`},h9n=[`disabled`],g9n=[`disabled`],_9n={key:2,class:`text-sm text-red-700`,role:`alert`,"data-testid":`settings-quit-error`},v9n=K({__name:`SettingsQuitTab`,emits:[`stopped`],setup(e,{emit:t}){let{t:n}=We(),r=t,i=V(!1),a=V(!1),o=V(``);async function s(){if(a.value)return;a.value=!0,o.value=``;let e=await xN(kP.shutdown,{});e.ok?r(`stopped`):(a.value=!1,i.value=!1,o.value=e.error||n(`settingsModal.quitTab.error`))}return(e,t)=>(B(),U(`div`,s9n,[S(`p`,c9n,T(q(n)(`settingsModal.quitTab.description`)),1),S(`p`,l9n,T(q(n)(`settingsModal.quitTab.restartHint`)),1),i.value?(B(),U(`div`,f9n,[S(`p`,p9n,T(q(n)(`settingsModal.quitTab.confirmBody`)),1),S(`div`,m9n,[S(`button`,{type:`button`,class:`rounded bg-red-700 px-3 py-1.5 text-sm font-medium text-white hover:bg-red-800 disabled:opacity-50`,disabled:a.value,"data-testid":`settings-quit-confirm-btn`,onClick:s},T(a.value?q(n)(`settingsModal.quitTab.stopping`):q(n)(`settingsModal.quitTab.confirmLabel`)),9,h9n),S(`button`,{type:`button`,class:`rounded border border-gray-300 px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100 disabled:opacity-50`,disabled:a.value,"data-testid":`settings-quit-cancel-btn`,onClick:t[1]||=e=>i.value=!1},T(q(n)(`common.cancel`)),9,g9n)])])):(B(),U(`div`,u9n,[S(`button`,{type:`button`,class:`rounded border border-red-300 bg-red-50 px-3 py-1.5 text-sm font-medium text-red-800 hover:bg-red-100 disabled:opacity-50`,disabled:a.value,"data-testid":`settings-quit-btn`,onClick:t[0]||=e=>i.value=!0},T(q(n)(`settingsModal.quitTab.quitLabel`)),9,d9n)])),o.value?(B(),U(`p`,_9n,T(o.value),1)):b(``,!0)]))}}),y9n=`person`,b9n=e=>typeof e==`string`&&e!==``,x9n=e=>{if(!Na(e))return null;let{id:t,name:n,icon:r,prompt:i,availablePlugins:a,queries:o,model:s,excludedAlwaysActiveTools:c}=e;if(typeof t!=`string`||typeof n!=`string`||typeof r!=`string`||typeof i!=`string`||!Ia(a))return null;let l={id:t,name:n,icon:r,prompt:i,availablePlugins:a},u=b9n(s)?{...l,model:s}:l,d=Ia(c)?{...u,excludedAlwaysActiveTools:c}:u;return Ia(o)?{...d,queries:o}:d},S9n=e=>{if(!za(e))return null;let t=e.flatMap(e=>x9n(e)??[]);return t.length===e.length?t:null},C9n=e=>!Na(e)||!Na(e.data)?null:S9n(e.data.customRoles),w9n=e=>e.split(`
|
|
5906
5906
|
`).map(e=>e.trim()).filter(Boolean),T9n=e=>({id:e.id.trim(),name:e.name.trim(),icon:e.icon.trim()||`person`,prompt:e.prompt,availablePlugins:e.selectedPlugins,queries:w9n(e.queriesText),...e.model?{model:e.model}:{},...e.excludedAlwaysActiveTools.length>0?{excludedAlwaysActiveTools:e.excludedAlwaysActiveTools}:{}}),E9n=()=>({id:``,name:``,icon:y9n,prompt:``,selectedPlugins:[],queriesText:``,model:``,excludedAlwaysActiveTools:[]}),D9n=e=>({id:e.id,name:e.name,icon:e.icon,prompt:e.prompt,selectedPlugins:[...e.availablePlugins],queriesText:(e.queries??[]).join(`
|