mulmoclaude 1.9.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/assets/PluginScopedRoot-_O0SE-9F.js +49 -0
- package/client/assets/{index-jQFYMjfF.js → index-BW6GylmC.js} +217 -265
- package/client/assets/index-v-a8lVSc.css +2 -0
- package/client/assets/{marp-BRMJ-LDQ.js → marp-3wcqoKph.js} +1 -1
- package/client/assets/material-symbols-outlined-Bz-4pmf0.woff2 +0 -0
- package/client/index.html +3 -3
- package/package.json +28 -28
- package/server/agent/activeTools.ts +4 -8
- package/server/agent/attachmentConverter.ts +4 -0
- package/server/agent/backend/claude-code.ts +1 -1
- package/server/agent/backend/fake-echo.ts +12 -10
- package/server/agent/backend/types.ts +6 -6
- package/server/agent/config.ts +15 -6
- package/server/agent/index.ts +6 -6
- package/server/agent/mcp-server.ts +57 -19
- package/server/agent/mcp-tools/handlePermission.ts +1 -7
- package/server/agent/mcpPreflight.ts +2 -2
- package/server/agent/prompt.ts +1 -1
- package/server/agent/resolveActiveTools.ts +4 -1
- package/server/agent/resumeFailover.ts +1 -2
- package/server/agent/sandboxMounts.ts +3 -3
- package/server/agent/stream.ts +1 -0
- package/server/api/auth/viewToken.ts +22 -9
- package/server/api/bridge/sessionRole.ts +4 -1
- package/server/api/routes/agent.ts +7 -7
- package/server/api/routes/collectionAgentActions.ts +6 -5
- package/server/api/routes/collectionCalendarRefresh.ts +3 -3
- package/server/api/routes/collectionParams.ts +2 -2
- package/server/api/routes/collections.ts +10 -10
- package/server/api/routes/config.ts +8 -2
- package/server/api/routes/files.ts +6 -5
- package/server/api/routes/hookLog.ts +5 -5
- package/server/api/routes/mulmo-script.ts +11 -10
- package/server/api/routes/mulmoScriptBeatOp.ts +6 -6
- package/server/api/routes/pdf.ts +9 -9
- package/server/api/routes/plugins.ts +36 -16
- package/server/api/routes/presentSvg.ts +2 -2
- package/server/api/routes/scheduler.ts +7 -3
- package/server/api/routes/schedulerHandlers.ts +11 -14
- package/server/api/routes/schedulerTasks.ts +3 -3
- package/server/api/routes/share.ts +5 -5
- package/server/api/routes/shortcuts.ts +2 -1
- package/server/api/routes/translation.ts +2 -2
- package/server/api/routes/wiki/history.ts +3 -3
- package/server/api/routes/wiki.ts +5 -5
- package/server/api/sandboxStatus.ts +3 -3
- package/server/build/dispatcher.mjs +23 -9
- package/server/build/mcp-server.mjs +477 -476
- package/server/events/collection-change.ts +10 -2
- package/server/events/notifications.ts +11 -11
- package/server/events/relay-client-helpers.ts +9 -9
- package/server/events/relay-client.ts +2 -2
- package/server/events/session-store/index.ts +130 -37
- package/server/plugins/builtin-dispatch.ts +4 -2
- package/server/plugins/dev-loader.ts +2 -1
- package/server/plugins/preset-loader.ts +19 -15
- package/server/plugins/runtime-loader.ts +93 -53
- package/server/plugins/runtime.ts +45 -23
- package/server/remoteHost/handlers/collectionPage.ts +12 -12
- package/server/remoteHost/handlers/getRemoteViewItems.ts +4 -4
- package/server/remoteHost/handlers/mutateRemoteView.ts +5 -7
- package/server/remoteHost/handlers/startChat.ts +1 -1
- package/server/services/translation/cache.ts +1 -1
- package/server/services/translation/index.ts +5 -1
- package/server/services/translation/llm.ts +3 -2
- package/server/services/translation/types.ts +1 -1
- package/server/system/appVersion.ts +2 -4
- package/server/system/config.ts +3 -3
- package/server/system/logger/config.ts +15 -1
- package/server/system/logger/sinks.ts +19 -3
- package/server/system/macosNotify.ts +1 -1
- package/server/system/whisper/index.ts +11 -3
- package/server/utils/date.ts +12 -0
- package/server/utils/exif.ts +16 -15
- package/server/utils/files/by-path.ts +1 -1
- package/server/utils/files/content-write-validate.ts +2 -1
- package/server/utils/files/csp-io.ts +3 -3
- package/server/utils/files/dashboard-io.ts +8 -7
- package/server/utils/files/journal-io.ts +4 -2
- package/server/utils/files/json.ts +4 -0
- package/server/utils/files/plugins-io.ts +3 -5
- package/server/utils/files/safe.ts +3 -1
- package/server/utils/files/scheduler-overrides-io.ts +14 -7
- package/server/utils/files/session-io.ts +44 -12
- package/server/utils/files/shortcuts-io.ts +10 -9
- package/server/utils/files/translation-io.ts +3 -10
- package/server/utils/files/workspace-io.ts +6 -4
- package/server/utils/markdown.ts +4 -2
- package/server/utils/promise.ts +19 -0
- package/server/utils/request.ts +4 -2
- package/server/utils/requestBody.ts +13 -0
- package/server/utils/router.ts +24 -18
- package/server/utils/sessionJsonl.ts +2 -1
- package/server/utils/share/rewriteAssets.ts +1 -1
- package/server/workspace/chat-index/index.ts +6 -6
- package/server/workspace/chat-index/indexer.ts +10 -12
- package/server/workspace/chat-index/summarizer.ts +3 -4
- package/server/workspace/collections/remoteView.ts +6 -4
- package/server/workspace/feeds/summaries.ts +1 -1
- package/server/workspace/hooks/provision.ts +27 -25
- package/server/workspace/hooks/shared/stdin.ts +23 -2
- package/server/workspace/journal/archivist-schemas.ts +14 -18
- package/server/workspace/journal/dailyPass.ts +15 -16
- package/server/workspace/journal/indexFile.ts +3 -3
- package/server/workspace/journal/latestDaily.ts +3 -4
- package/server/workspace/journal/paths.ts +4 -4
- package/server/workspace/journal/state.ts +11 -12
- package/server/workspace/memory/llm-classifier.ts +3 -3
- package/server/workspace/memory/migrate.ts +5 -4
- package/server/workspace/memory/topic-cluster.ts +7 -9
- package/server/workspace/memory/topic-migrate.ts +1 -1
- package/server/workspace/memory/types.ts +1 -1
- package/server/workspace/paths.ts +16 -10
- package/server/workspace/photo-locations/index.ts +3 -1
- package/server/workspace/photo-locations/list.ts +73 -12
- package/server/workspace/reference-dirs.ts +1 -2
- package/server/workspace/skills/catalog.ts +2 -2
- package/server/workspace/skills/discovery.ts +5 -6
- package/server/workspace/skills/external/catalog.ts +5 -16
- package/server/workspace/skills/external/clone.ts +2 -2
- package/server/workspace/skills/external/id.ts +3 -2
- package/server/workspace/skills/external/install.ts +31 -30
- package/server/workspace/skills/external/presets.ts +1 -1
- package/server/workspace/skills/parser.ts +1 -0
- package/server/workspace/skills/user-tasks.ts +15 -18
- package/server/workspace/skills/writer.ts +3 -3
- package/server/workspace/tool-trace/classify.ts +1 -1
- package/server/workspace/tool-trace/index.ts +4 -4
- package/server/workspace/wiki-pages/io.ts +5 -5
- package/server/workspace/wiki-pages/snapshot.ts +11 -10
- package/src/App.vue +13 -12
- package/src/components/ChatAttachmentPreview.vue +1 -1
- package/src/components/ChatInput.vue +8 -2
- package/src/components/CopyChatButton.vue +1 -1
- package/src/components/DashboardView.vue +24 -18
- package/src/components/FileContentRenderer.vue +3 -4
- package/src/components/FileTreePane.vue +6 -7
- package/src/components/FilesView.vue +5 -2
- package/src/components/FilterChip.vue +1 -1
- package/src/components/NotificationBell.vue +45 -25
- package/src/components/PluginScopedRoot.vue +1 -1
- package/src/components/RemoteHostControl.vue +2 -1
- package/src/components/RolesView.vue +32 -9
- package/src/components/SentAttachmentChip.vue +3 -3
- package/src/components/SessionSidebar.vue +5 -6
- package/src/components/SessionTabBar.vue +16 -10
- package/src/components/SettingsMapTab.vue +10 -2
- package/src/components/SettingsMcpTab.vue +14 -18
- package/src/components/SlashCommandMenu.vue +3 -1
- package/src/components/StackView.vue +28 -19
- package/src/composables/shortcutReorder.ts +5 -3
- package/src/composables/useClickOutside.ts +2 -1
- package/src/composables/useCspViolations.ts +3 -1
- package/src/composables/useCurrentRole.ts +6 -3
- package/src/composables/useDashboard.ts +2 -2
- package/src/composables/useDebugBeat.ts +6 -4
- package/src/composables/useDynamicFavicon.ts +33 -20
- package/src/composables/useKeyNavigation.ts +8 -6
- package/src/composables/useNotifications.ts +39 -5
- package/src/composables/useSlashCommandMenu.ts +1 -2
- package/src/composables/useVoiceInput.ts +1 -1
- package/src/config/apiRoutes.ts +16 -12
- package/src/config/pubsubChannels.ts +2 -2
- package/src/config/roles.ts +10 -3
- package/src/config/toolNames.ts +3 -3
- package/src/lang/index.ts +2 -2
- package/src/plugins/accounting/definition.ts +2 -2
- package/src/plugins/api.ts +1 -0
- package/src/plugins/canvas/View.vue +1 -2
- package/src/plugins/canvas/definition.ts +1 -1
- package/src/plugins/chart/index.ts +3 -6
- package/src/plugins/execute.ts +16 -2
- package/src/plugins/manageRoles/Preview.vue +2 -1
- package/src/plugins/manageRoles/View.vue +32 -10
- package/src/plugins/manageRoles/roleForm.ts +31 -0
- package/src/plugins/manageSkills/categories.ts +7 -6
- package/src/plugins/markdown/index.ts +3 -6
- package/src/plugins/meta-types.ts +1 -1
- package/src/plugins/metas.ts +33 -14
- package/src/plugins/presentForm/index.ts +9 -9
- package/src/plugins/presentHtml/index.ts +14 -12
- package/src/plugins/presentMulmoScript/index.ts +5 -7
- package/src/plugins/presentSVG/View.vue +5 -3
- package/src/plugins/scheduler/TasksTab.vue +1 -1
- package/src/plugins/scheduler/formatSchedule.ts +9 -6
- package/src/plugins/scope.ts +4 -2
- package/src/plugins/server-bindings-types.ts +17 -5
- package/src/plugins/skill/View.vue +2 -3
- package/src/plugins/spreadsheet/View.vue +47 -16
- package/src/plugins/spreadsheet/definition.ts +16 -4
- package/src/plugins/spreadsheet/engine/calculator.ts +77 -79
- package/src/plugins/spreadsheet/engine/date-parser.ts +65 -64
- package/src/plugins/spreadsheet/engine/date-utils.ts +21 -4
- package/src/plugins/spreadsheet/engine/evaluator.ts +33 -26
- package/src/plugins/spreadsheet/engine/financial-math.ts +13 -7
- package/src/plugins/spreadsheet/engine/formatter.ts +3 -3
- package/src/plugins/spreadsheet/engine/formulaRefs.ts +32 -25
- package/src/plugins/spreadsheet/engine/functions/date.ts +16 -16
- package/src/plugins/spreadsheet/engine/functions/financial.ts +36 -36
- package/src/plugins/spreadsheet/engine/functions/logical.ts +14 -20
- package/src/plugins/spreadsheet/engine/functions/lookup.ts +59 -81
- package/src/plugins/spreadsheet/engine/functions/mathematical.ts +26 -26
- package/src/plugins/spreadsheet/engine/functions/statistical-math.ts +9 -3
- package/src/plugins/spreadsheet/engine/functions/statistical.ts +49 -65
- package/src/plugins/spreadsheet/engine/functions/text.ts +36 -33
- package/src/plugins/spreadsheet/engine/registry.ts +51 -19
- package/src/plugins/spreadsheet/engine/textFormat.ts +5 -2
- package/src/plugins/spreadsheet/engine/translateFormula.ts +4 -4
- package/src/plugins/textResponse/Preview.vue +4 -1
- package/src/plugins/textResponse/View.vue +9 -5
- package/src/plugins/textResponse/types.ts +3 -3
- package/src/plugins/wiki/Preview.vue +4 -3
- package/src/plugins/wiki/View.vue +5 -4
- package/src/plugins/wiki/components/WikiGraphView.vue +2 -1
- package/src/plugins/wiki/components/WikiPageBody.vue +21 -6
- package/src/plugins/wiki/composables/useWikiGraph.ts +3 -3
- package/src/plugins/wiki/composables/useWikiPageEdit.ts +1 -0
- package/src/plugins/wiki/helpers.ts +7 -3
- package/src/plugins/wiki/history/HistoryTab.vue +1 -1
- package/src/plugins/wiki/history/api.ts +7 -1
- package/src/plugins/wiki/history/diff.ts +3 -3
- package/src/plugins/wiki/index.ts +5 -0
- package/src/plugins/wiki/parseWikiResponse.ts +41 -0
- package/src/tools/runtimeLoader.ts +12 -4
- package/src/tools/types.ts +2 -2
- package/src/types/attachment.ts +1 -1
- package/src/types/dashboard.ts +1 -1
- package/src/types/notification.ts +3 -3
- package/src/types/pastedFile.ts +1 -1
- package/src/types/session.ts +6 -1
- package/src/types/sse.ts +4 -4
- package/src/types/toolCallHistory.ts +3 -3
- package/src/utils/agent/mcpHint.ts +2 -3
- package/src/utils/agent/parseSseEvent.ts +128 -0
- package/src/utils/agent/request.ts +2 -2
- package/src/utils/agent/toolCalls.ts +2 -11
- package/src/utils/api.ts +22 -17
- package/src/utils/attachment/heicPreview.ts +3 -0
- package/src/utils/blobDownload.ts +4 -2
- package/src/utils/canvas/stackGrouping.ts +14 -11
- package/src/utils/chat/exportMarkdown.ts +22 -20
- package/src/utils/collections/notifiedItems.ts +10 -9
- package/src/utils/collections/presentSeed.ts +7 -4
- package/src/utils/dom/eventTarget.ts +11 -0
- package/src/utils/dom/scrollable.ts +10 -9
- package/src/utils/format/jsonSyntax.ts +15 -13
- package/src/utils/html/iframeHeightReporterScript.ts +3 -8
- package/src/utils/html/injectBeforeBodyClose.ts +20 -0
- package/src/utils/html/previewCsp.ts +3 -3
- package/src/utils/image/imageRepairInlineScript.ts +29 -31
- package/src/utils/inFlightShare.ts +1 -0
- package/src/utils/markdown/wikiEmbedHandlers.ts +1 -1
- package/src/utils/markdown/wikiEmbeds.ts +9 -9
- package/src/utils/markdownBlobRequest.ts +3 -3
- package/src/utils/path/workspaceLinkRouter.ts +4 -4
- package/src/utils/plugin/runtime.ts +75 -21
- package/src/utils/session/sessionEntries.ts +3 -3
- package/src/utils/session/sessionHelpers.ts +22 -15
- package/src/utils/tools/mcp.ts +1 -1
- package/src/utils/tools/result.ts +3 -3
- package/client/assets/PluginScopedRoot-C8w5S4g8.js +0 -1
- package/client/assets/index-rxM8QYSF.css +0 -2
- package/client/assets/material-symbols-outlined-D4PiVfdc.woff2 +0 -0
- package/server/system/logs/aaa +0 -737
- package/server/system/logs/bb +0 -446
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-CNC7AqOf.js";import{Gt as t,K as n,Nr as r,Qt as i,Rt as a,X as o,Y as s,Zn as c,at as l,hr as u,q as d,qt as ee,sr as f,wt as p,zn as m}from"./vue.runtime.esm-bundler-DQ_ijuEl.js";import{n as te}from"./vue-i18n-DwyyKgu3.js";import{t as ne}from"./vue-DFpEJkZz.js";function re(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ie(e){return typeof e==`object`&&!!e}function ae(e){return Array.isArray(e)}function oe(e,t){return re(e)&&typeof e[t]==`string`}function h(e,t){return e instanceof Error?e.message:oe(e,`details`)&&e.details?e.details:oe(e,`message`)&&e.message?e.message:t===void 0?String(e):t}var se=new Map([[`&`,`&`],[`<`,`<`],[`>`,`>`],[`"`,`"`],[`'`,`'`]]);function ce(e){return e.replace(/[&<>"']/g,e=>se.get(e)??e)}function le(e,t){return e instanceof Error?e:Error(t??h(e))}function ue(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function de(e){return typeof e==`object`&&!!e}function fe(e){return typeof e==`string`&&e.trim().length>0}function pe(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function me(e){return Array.isArray(e)}function he(e,t){return ue(e)&&typeof e[t]==`string`}var ge=new Map([[`&`,`&`],[`<`,`<`],[`>`,`>`],[`"`,`"`],[`'`,`'`]]);function _e(e){return e.replace(/[&<>"']/g,e=>ge.get(e)??e)}m();var g=c(!0),_=c(null);function ve(e){return typeof DOMException<`u`&&e instanceof DOMException&&e.name===`AbortError`||he(e,`name`)&&e.name===`AbortError`}var v=null;function ye(e){v=e}function be(e){if(!e)return``;let t=[];for(let[n,r]of Object.entries(e))r!==void 0&&t.push(`${encodeURIComponent(n)}=${encodeURIComponent(String(r))}`);return t.length===0?``:`?${t.join(`&`)}`}function xe(e,t){let n={...e.headers??{}};return t&&n[`Content-Type`]===void 0&&(n[`Content-Type`]=`application/json`),v&&n.Authorization===void 0&&(n.Authorization=`Bearer ${v}`),n}async function Se(e){let{status:t}=e;try{let n=await e.clone().json();if(he(n,`error`))return{error:n.error,status:t}}catch{}return{error:e.statusText||`Request failed (${t})`,status:t}}async function y(e,t={}){let n=t.method??`GET`,r=t.body!==void 0,i=`${e}${be(t.query)}`,a={method:n,headers:xe(t,r),...t.signal===void 0?{}:{signal:t.signal}};r&&(a.body=JSON.stringify(t.body));let o;try{o=await fetch(i,a)}catch(e){let t=h(e);return ve(e)||(g.value=!1,_.value=t),{ok:!1,error:t,status:0}}if(g.value||(g.value=!0,_.value=null),!o.ok){let{error:e,status:t}=await Se(o);return{ok:!1,error:e,status:t}}try{return{ok:!0,data:await o.json()}}catch(e){return{ok:!1,error:`Invalid JSON response: ${h(e)}`,status:o.status}}}function Ce(e,t,n={}){return y(e,{...n,method:`GET`,query:t})}function we(e,t,n={}){return y(e,{...n,method:`POST`,body:t})}function Te(e,t,n={}){return y(e,{...n,method:`PUT`,body:t})}function Ee(e,t,n={}){return y(e,{...n,method:`DELETE`,body:t})}async function De(e,t={}){let n=`${e}${be(t.query)}`,r={method:t.method??`GET`,headers:xe(t,!1),...t.body===void 0?{}:{body:t.body},...t.signal===void 0?{}:{signal:t.signal}};return fetch(n,r)}var b=Object.create(null);b.open=`0`,b.close=`1`,b.ping=`2`,b.pong=`3`,b.message=`4`,b.upgrade=`5`,b.noop=`6`;var x=Object.create(null);Object.keys(b).forEach(e=>{x[b[e]]=e});var S={type:`error`,data:`parser error`},Oe=typeof Blob==`function`||typeof Blob<`u`&&Object.prototype.toString.call(Blob)===`[object BlobConstructor]`,ke=typeof ArrayBuffer==`function`,Ae=e=>typeof ArrayBuffer.isView==`function`?ArrayBuffer.isView(e):e&&e.buffer instanceof ArrayBuffer,C=({type:e,data:t},n,r)=>Oe&&t instanceof Blob?n?r(t):je(t,r):ke&&(t instanceof ArrayBuffer||Ae(t))?n?r(t):je(new Blob([t]),r):r(b[e]+(t||``)),je=(e,t)=>{let n=new FileReader;return n.onload=function(){let e=n.result.split(`,`)[1];t(`b`+(e||``))},n.readAsDataURL(e)};function Me(e){return e instanceof Uint8Array?e:e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}var Ne;function Pe(e,t){if(Oe&&e.data instanceof Blob)return e.data.arrayBuffer().then(Me).then(t);if(ke&&(e.data instanceof ArrayBuffer||Ae(e.data)))return t(Me(e.data));C(e,!1,e=>{Ne||=new TextEncoder,t(Ne.encode(e))})}var Fe=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`,w=typeof Uint8Array>`u`?[]:new Uint8Array(256);for(let e=0;e<64;e++)w[Fe.charCodeAt(e)]=e;var Ie=e=>{let t=e.length*.75,n=e.length,r,i=0,a,o,s,c;e[e.length-1]===`=`&&(t--,e[e.length-2]===`=`&&t--);let l=new ArrayBuffer(t),u=new Uint8Array(l);for(r=0;r<n;r+=4)a=w[e.charCodeAt(r)],o=w[e.charCodeAt(r+1)],s=w[e.charCodeAt(r+2)],c=w[e.charCodeAt(r+3)],u[i++]=a<<2|o>>4,u[i++]=(o&15)<<4|s>>2,u[i++]=(s&3)<<6|c&63;return l},Le=typeof ArrayBuffer==`function`,T=(e,t)=>{if(typeof e!=`string`)return{type:`message`,data:ze(e,t)};let n=e.charAt(0);return n===`b`?{type:`message`,data:Re(e.substring(1),t)}:x[n]?e.length>1?{type:x[n],data:e.substring(1)}:{type:x[n]}:S},Re=(e,t)=>Le?ze(Ie(e),t):{base64:!0,data:e},ze=(e,t)=>{switch(t){case`blob`:return e instanceof Blob?e:new Blob([e]);default:return e instanceof ArrayBuffer?e:e.buffer}},Be=``,Ve=(e,t)=>{let n=e.length,r=Array(n),i=0;e.forEach((e,a)=>{C(e,!1,e=>{r[a]=e,++i===n&&t(r.join(Be))})})},He=(e,t)=>{let n=e.split(Be),r=[];for(let e=0;e<n.length;e++){let i=T(n[e],t);if(r.push(i),i.type===`error`)break}return r};function Ue(){return new TransformStream({transform(e,t){Pe(e,n=>{let r=n.length,i;if(r<126)i=new Uint8Array(1),new DataView(i.buffer).setUint8(0,r);else if(r<65536){i=new Uint8Array(3);let e=new DataView(i.buffer);e.setUint8(0,126),e.setUint16(1,r)}else{i=new Uint8Array(9);let e=new DataView(i.buffer);e.setUint8(0,127),e.setBigUint64(1,BigInt(r))}e.data&&typeof e.data!=`string`&&(i[0]|=128),t.enqueue(i),t.enqueue(n)})}})}var We;function E(e){return e.reduce((e,t)=>e+t.length,0)}function D(e,t){if(e[0].length===t)return e.shift();let n=new Uint8Array(t),r=0;for(let i=0;i<t;i++)n[i]=e[0][r++],r===e[0].length&&(e.shift(),r=0);return e.length&&r<e[0].length&&(e[0]=e[0].slice(r)),n}function Ge(e,t){We||=new TextDecoder;let n=[],r=0,i=-1,a=!1;return new TransformStream({transform(o,s){for(n.push(o);;){if(r===0){if(E(n)<1)break;let e=D(n,1);a=(e[0]&128)==128,i=e[0]&127,r=i<126?3:i===126?1:2}else if(r===1){if(E(n)<2)break;let e=D(n,2);i=new DataView(e.buffer,e.byteOffset,e.length).getUint16(0),r=3}else if(r===2){if(E(n)<8)break;let e=D(n,8),t=new DataView(e.buffer,e.byteOffset,e.length),a=t.getUint32(0);if(a>2**21-1){s.enqueue(S);break}i=a*2**32+t.getUint32(4),r=3}else{if(E(n)<i)break;let e=D(n,i);s.enqueue(T(a?e:We.decode(e),t)),r=0}if(i===0||i>e){s.enqueue(S);break}}}})}function O(e){if(e)return Ke(e)}function Ke(e){for(var t in O.prototype)e[t]=O.prototype[t];return e}O.prototype.on=O.prototype.addEventListener=function(e,t){return this._callbacks=this._callbacks||{},(this._callbacks[`$`+e]=this._callbacks[`$`+e]||[]).push(t),this},O.prototype.once=function(e,t){function n(){this.off(e,n),t.apply(this,arguments)}return n.fn=t,this.on(e,n),this},O.prototype.off=O.prototype.removeListener=O.prototype.removeAllListeners=O.prototype.removeEventListener=function(e,t){if(this._callbacks=this._callbacks||{},arguments.length==0)return this._callbacks={},this;var n=this._callbacks[`$`+e];if(!n)return this;if(arguments.length==1)return delete this._callbacks[`$`+e],this;for(var r,i=0;i<n.length;i++)if(r=n[i],r===t||r.fn===t){n.splice(i,1);break}return n.length===0&&delete this._callbacks[`$`+e],this},O.prototype.emit=function(e){this._callbacks=this._callbacks||{};for(var t=Array(arguments.length-1),n=this._callbacks[`$`+e],r=1;r<arguments.length;r++)t[r-1]=arguments[r];if(n){n=n.slice(0);for(var r=0,i=n.length;r<i;++r)n[r].apply(this,t)}return this},O.prototype.emitReserved=O.prototype.emit,O.prototype.listeners=function(e){return this._callbacks=this._callbacks||{},this._callbacks[`$`+e]||[]},O.prototype.hasListeners=function(e){return!!this.listeners(e).length};var k=typeof Promise==`function`&&typeof Promise.resolve==`function`?e=>Promise.resolve().then(e):(e,t)=>t(e,0),A=typeof self<`u`?self:typeof window<`u`?window:Function(`return this`)(),qe=`arraybuffer`;function Je(e,...t){return t.reduce((t,n)=>(e.hasOwnProperty(n)&&(t[n]=e[n]),t),{})}var Ye=A.setTimeout,Xe=A.clearTimeout;function j(e,t){t.useNativeTimers?(e.setTimeoutFn=Ye.bind(A),e.clearTimeoutFn=Xe.bind(A)):(e.setTimeoutFn=A.setTimeout.bind(A),e.clearTimeoutFn=A.clearTimeout.bind(A))}var Ze=1.33;function Qe(e){return typeof e==`string`?$e(e):Math.ceil((e.byteLength||e.size)*Ze)}function $e(e){let t=0,n=0;for(let r=0,i=e.length;r<i;r++)t=e.charCodeAt(r),t<128?n+=1:t<2048?n+=2:t<55296||t>=57344?n+=3:(r++,n+=4);return n}function et(){return Date.now().toString(36).substring(3)+Math.random().toString(36).substring(2,5)}function tt(e){let t=``;for(let n in e)e.hasOwnProperty(n)&&(t.length&&(t+=`&`),t+=encodeURIComponent(n)+`=`+encodeURIComponent(e[n]));return t}function nt(e){let t={},n=e.split(`&`);for(let e=0,r=n.length;e<r;e++){let r=n[e].split(`=`);t[decodeURIComponent(r[0])]=decodeURIComponent(r[1])}return t}var rt=class extends Error{constructor(e,t,n){super(e),this.description=t,this.context=n,this.type=`TransportError`}},M=class extends O{constructor(e){super(),this.writable=!1,j(this,e),this.opts=e,this.query=e.query,this.socket=e.socket,this.supportsBinary=!e.forceBase64}onError(e,t,n){return super.emitReserved(`error`,new rt(e,t,n)),this}open(){return this.readyState=`opening`,this.doOpen(),this}close(){return(this.readyState===`opening`||this.readyState===`open`)&&(this.doClose(),this.onClose()),this}send(e){this.readyState===`open`&&this.write(e)}onOpen(){this.readyState=`open`,this.writable=!0,super.emitReserved(`open`)}onData(e){let t=T(e,this.socket.binaryType);this.onPacket(t)}onPacket(e){super.emitReserved(`packet`,e)}onClose(e){this.readyState=`closed`,super.emitReserved(`close`,e)}pause(e){}createUri(e,t={}){return e+`://`+this._hostname()+this._port()+this.opts.path+this._query(t)}_hostname(){let e=this.opts.hostname;return e.indexOf(`:`)===-1?e:`[`+e+`]`}_port(){return this.opts.port&&(this.opts.secure&&Number(this.opts.port)!==443||!this.opts.secure&&Number(this.opts.port)!==80)?`:`+this.opts.port:``}_query(e){let t=tt(e);return t.length?`?`+t:``}},it=class extends M{constructor(){super(...arguments),this._polling=!1}get name(){return`polling`}doOpen(){this._poll()}pause(e){this.readyState=`pausing`;let t=()=>{this.readyState=`paused`,e()};if(this._polling||!this.writable){let e=0;this._polling&&(e++,this.once(`pollComplete`,function(){--e||t()})),this.writable||(e++,this.once(`drain`,function(){--e||t()}))}else t()}_poll(){this._polling=!0,this.doPoll(),this.emitReserved(`poll`)}onData(e){He(e,this.socket.binaryType).forEach(e=>{if(this.readyState===`opening`&&e.type===`open`&&this.onOpen(),e.type===`close`)return this.onClose({description:`transport closed by the server`}),!1;this.onPacket(e)}),this.readyState!==`closed`&&(this._polling=!1,this.emitReserved(`pollComplete`),this.readyState===`open`&&this._poll())}doClose(){let e=()=>{this.write([{type:`close`}])};this.readyState===`open`?e():this.once(`open`,e)}write(e){this.writable=!1,Ve(e,e=>{this.doWrite(e,()=>{this.writable=!0,this.emitReserved(`drain`)})})}uri(){let e=this.opts.secure?`https`:`http`,t=this.query||{};return!1!==this.opts.timestampRequests&&(t[this.opts.timestampParam]=et()),!this.supportsBinary&&!t.sid&&(t.b64=1),this.createUri(e,t)}},at=!1;try{at=typeof XMLHttpRequest<`u`&&`withCredentials`in new XMLHttpRequest}catch{}var ot=at;function st(){}var ct=class extends it{constructor(e){if(super(e),typeof location<`u`){let t=location.protocol===`https:`,n=location.port;n||=t?`443`:`80`,this.xd=typeof location<`u`&&e.hostname!==location.hostname||n!==e.port}}doWrite(e,t){let n=this.request({method:`POST`,data:e});n.on(`success`,t),n.on(`error`,(e,t)=>{this.onError(`xhr post error`,e,t)})}doPoll(){let e=this.request();e.on(`data`,this.onData.bind(this)),e.on(`error`,(e,t)=>{this.onError(`xhr poll error`,e,t)}),this.pollXhr=e}},N=class e extends O{constructor(e,t,n){super(),this.createRequest=e,j(this,n),this._opts=n,this._method=n.method||`GET`,this._uri=t,this._data=n.data===void 0?null:n.data,this._create()}_create(){var t;let n=Je(this._opts,`agent`,`pfx`,`key`,`passphrase`,`cert`,`ca`,`ciphers`,`rejectUnauthorized`,`autoUnref`);n.xdomain=!!this._opts.xd;let r=this._xhr=this.createRequest(n);try{r.open(this._method,this._uri,!0);try{if(this._opts.extraHeaders){r.setDisableHeaderCheck&&r.setDisableHeaderCheck(!0);for(let e in this._opts.extraHeaders)this._opts.extraHeaders.hasOwnProperty(e)&&r.setRequestHeader(e,this._opts.extraHeaders[e])}}catch{}if(this._method===`POST`)try{r.setRequestHeader(`Content-type`,`text/plain;charset=UTF-8`)}catch{}try{r.setRequestHeader(`Accept`,`*/*`)}catch{}(t=this._opts.cookieJar)==null||t.addCookies(r),`withCredentials`in r&&(r.withCredentials=this._opts.withCredentials),this._opts.requestTimeout&&(r.timeout=this._opts.requestTimeout),r.onreadystatechange=()=>{var e;r.readyState===3&&((e=this._opts.cookieJar)==null||e.parseCookies(r.getResponseHeader(`set-cookie`))),r.readyState===4&&(r.status===200||r.status===1223?this._onLoad():this.setTimeoutFn(()=>{this._onError(typeof r.status==`number`?r.status:0)},0))},r.send(this._data)}catch(e){this.setTimeoutFn(()=>{this._onError(e)},0);return}typeof document<`u`&&(this._index=e.requestsCount++,e.requests[this._index]=this)}_onError(e){this.emitReserved(`error`,e,this._xhr),this._cleanup(!0)}_cleanup(t){if(!(this._xhr===void 0||this._xhr===null)){if(this._xhr.onreadystatechange=st,t)try{this._xhr.abort()}catch{}typeof document<`u`&&delete e.requests[this._index],this._xhr=null}}_onLoad(){let e=this._xhr.responseText;e!==null&&(this.emitReserved(`data`,e),this.emitReserved(`success`),this._cleanup())}abort(){this._cleanup()}};if(N.requestsCount=0,N.requests={},typeof document<`u`){if(typeof attachEvent==`function`)attachEvent(`onunload`,lt);else if(typeof addEventListener==`function`){let e=`onpagehide`in A?`pagehide`:`unload`;addEventListener(e,lt,!1)}}function lt(){for(let e in N.requests)N.requests.hasOwnProperty(e)&&N.requests[e].abort()}var ut=(function(){let e=ft({xdomain:!1});return e&&e.responseType!==null})(),dt=class extends ct{constructor(e){super(e);let t=e&&e.forceBase64;this.supportsBinary=ut&&!t}request(e={}){return Object.assign(e,{xd:this.xd},this.opts),new N(ft,this.uri(),e)}};function ft(e){let t=e.xdomain;try{if(typeof XMLHttpRequest<`u`&&(!t||ot))return new XMLHttpRequest}catch{}if(!t)try{return new A[[`Active`,`Object`].join(`X`)](`Microsoft.XMLHTTP`)}catch{}}var pt=typeof navigator<`u`&&typeof navigator.product==`string`&&navigator.product.toLowerCase()===`reactnative`,mt=class extends M{get name(){return`websocket`}doOpen(){let e=this.uri(),t=this.opts.protocols,n=pt?{}:Je(this.opts,`agent`,`perMessageDeflate`,`pfx`,`key`,`passphrase`,`cert`,`ca`,`ciphers`,`rejectUnauthorized`,`localAddress`,`protocolVersion`,`origin`,`maxPayload`,`family`,`checkServerIdentity`);this.opts.extraHeaders&&(n.headers=this.opts.extraHeaders);try{this.ws=this.createSocket(e,t,n)}catch(e){return this.emitReserved(`error`,e)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws._socket.unref(),this.onOpen()},this.ws.onclose=e=>this.onClose({description:`websocket connection closed`,context:e}),this.ws.onmessage=e=>this.onData(e.data),this.ws.onerror=e=>this.onError(`websocket error`,e)}write(e){this.writable=!1;for(let t=0;t<e.length;t++){let n=e[t],r=t===e.length-1;C(n,this.supportsBinary,e=>{try{this.doWrite(n,e)}catch{}r&&k(()=>{this.writable=!0,this.emitReserved(`drain`)},this.setTimeoutFn)})}}doClose(){this.ws!==void 0&&(this.ws.onerror=()=>{},this.ws.close(),this.ws=null)}uri(){let e=this.opts.secure?`wss`:`ws`,t=this.query||{};return this.opts.timestampRequests&&(t[this.opts.timestampParam]=et()),this.supportsBinary||(t.b64=1),this.createUri(e,t)}},ht=A.WebSocket||A.MozWebSocket,gt={websocket:class extends mt{createSocket(e,t,n){return pt?new ht(e,t,n):t?new ht(e,t):new ht(e)}doWrite(e,t){this.ws.send(t)}},webtransport:class extends M{get name(){return`webtransport`}doOpen(){try{this._transport=new WebTransport(this.createUri(`https`),this.opts.transportOptions[this.name])}catch(e){return this.emitReserved(`error`,e)}this._transport.closed.then(()=>{this.onClose()}).catch(e=>{this.onError(`webtransport error`,e)}),this._transport.ready.then(()=>{this._transport.createBidirectionalStream().then(e=>{let t=Ge(2**53-1,this.socket.binaryType),n=e.readable.pipeThrough(t).getReader(),r=Ue();r.readable.pipeTo(e.writable),this._writer=r.writable.getWriter();let i=()=>{n.read().then(({done:e,value:t})=>{e||(this.onPacket(t),i())}).catch(e=>{})};i();let a={type:`open`};this.query.sid&&(a.data=`{"sid":"${this.query.sid}"}`),this._writer.write(a).then(()=>this.onOpen())})})}write(e){this.writable=!1;for(let t=0;t<e.length;t++){let n=e[t],r=t===e.length-1;this._writer.write(n).then(()=>{r&&k(()=>{this.writable=!0,this.emitReserved(`drain`)},this.setTimeoutFn)})}}doClose(){var e;(e=this._transport)==null||e.close()}},polling:dt},_t=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,vt=[`source`,`protocol`,`authority`,`userInfo`,`user`,`password`,`host`,`port`,`relative`,`path`,`directory`,`file`,`query`,`anchor`];function P(e){if(e.length>8e3)throw`URI too long`;let t=e,n=e.indexOf(`[`),r=e.indexOf(`]`);n!=-1&&r!=-1&&(e=e.substring(0,n)+e.substring(n,r).replace(/:/g,`;`)+e.substring(r,e.length));let i=_t.exec(e||``),a={},o=14;for(;o--;)a[vt[o]]=i[o]||``;return n!=-1&&r!=-1&&(a.source=t,a.host=a.host.substring(1,a.host.length-1).replace(/;/g,`:`),a.authority=a.authority.replace(`[`,``).replace(`]`,``).replace(/;/g,`:`),a.ipv6uri=!0),a.pathNames=yt(a,a.path),a.queryKey=bt(a,a.query),a}function yt(e,t){let n=t.replace(/\/{2,9}/g,`/`).split(`/`);return(t.slice(0,1)==`/`||t.length===0)&&n.splice(0,1),t.slice(-1)==`/`&&n.splice(n.length-1,1),n}function bt(e,t){let n={};return t.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,function(e,t,r){t&&(n[t]=r)}),n}var F=typeof addEventListener==`function`&&typeof removeEventListener==`function`,I=[];F&&addEventListener(`offline`,()=>{I.forEach(e=>e())},!1);var L=class e extends O{constructor(e,t){if(super(),this.binaryType=qe,this.writeBuffer=[],this._prevBufferLen=0,this._pingInterval=-1,this._pingTimeout=-1,this._maxPayload=-1,this._pingTimeoutTime=1/0,e&&typeof e==`object`&&(t=e,e=null),e){let n=P(e);t.hostname=n.host,t.secure=n.protocol===`https`||n.protocol===`wss`,t.port=n.port,n.query&&(t.query=n.query)}else t.host&&(t.hostname=P(t.host).host);j(this,t),this.secure=t.secure==null?typeof location<`u`&&location.protocol===`https:`:t.secure,t.hostname&&!t.port&&(t.port=this.secure?`443`:`80`),this.hostname=t.hostname||(typeof location<`u`?location.hostname:`localhost`),this.port=t.port||(typeof location<`u`&&location.port?location.port:this.secure?`443`:`80`),this.transports=[],this._transportsByName={},t.transports.forEach(e=>{let t=e.prototype.name;this.transports.push(t),this._transportsByName[t]=e}),this.opts=Object.assign({path:`/engine.io`,agent:!1,withCredentials:!1,upgrade:!0,timestampParam:`t`,rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},t),this.opts.path=this.opts.path.replace(/\/$/,``)+(this.opts.addTrailingSlash?`/`:``),typeof this.opts.query==`string`&&(this.opts.query=nt(this.opts.query)),F&&(this.opts.closeOnBeforeunload&&(this._beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener(`beforeunload`,this._beforeunloadEventListener,!1)),this.hostname!==`localhost`&&(this._offlineEventListener=()=>{this._onClose(`transport close`,{description:`network connection lost`})},I.push(this._offlineEventListener))),this.opts.withCredentials&&(this._cookieJar=void 0),this._open()}createTransport(e){let t=Object.assign({},this.opts.query);t.EIO=4,t.transport=e,this.id&&(t.sid=this.id);let n=Object.assign({},this.opts,{query:t,socket:this,hostname:this.hostname,secure:this.secure,port:this.port},this.opts.transportOptions[e]);return new this._transportsByName[e](n)}_open(){if(this.transports.length===0){this.setTimeoutFn(()=>{this.emitReserved(`error`,`No transports available`)},0);return}let t=this.opts.rememberUpgrade&&e.priorWebsocketSuccess&&this.transports.indexOf(`websocket`)!==-1?`websocket`:this.transports[0];this.readyState=`opening`;let n=this.createTransport(t);n.open(),this.setTransport(n)}setTransport(e){this.transport&&this.transport.removeAllListeners(),this.transport=e,e.on(`drain`,this._onDrain.bind(this)).on(`packet`,this._onPacket.bind(this)).on(`error`,this._onError.bind(this)).on(`close`,e=>this._onClose(`transport close`,e))}onOpen(){this.readyState=`open`,e.priorWebsocketSuccess=this.transport.name===`websocket`,this.emitReserved(`open`),this.flush()}_onPacket(e){if(this.readyState===`opening`||this.readyState===`open`||this.readyState===`closing`)switch(this.emitReserved(`packet`,e),this.emitReserved(`heartbeat`),e.type){case`open`:this.onHandshake(JSON.parse(e.data));break;case`ping`:this._sendPacket(`pong`),this.emitReserved(`ping`),this.emitReserved(`pong`),this._resetPingTimeout();break;case`error`:let t=Error(`server error`);t.code=e.data,this._onError(t);break;case`message`:this.emitReserved(`data`,e.data),this.emitReserved(`message`,e.data);break}}onHandshake(e){this.emitReserved(`handshake`,e),this.id=e.sid,this.transport.query.sid=e.sid,this._pingInterval=e.pingInterval,this._pingTimeout=e.pingTimeout,this._maxPayload=e.maxPayload,this.onOpen(),this.readyState!==`closed`&&this._resetPingTimeout()}_resetPingTimeout(){this.clearTimeoutFn(this._pingTimeoutTimer);let e=this._pingInterval+this._pingTimeout;this._pingTimeoutTime=Date.now()+e,this._pingTimeoutTimer=this.setTimeoutFn(()=>{this._onClose(`ping timeout`)},e),this.opts.autoUnref&&this._pingTimeoutTimer.unref()}_onDrain(){this.writeBuffer.splice(0,this._prevBufferLen),this._prevBufferLen=0,this.writeBuffer.length===0?this.emitReserved(`drain`):this.flush()}flush(){if(this.readyState!==`closed`&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){let e=this._getWritablePackets();this.transport.send(e),this._prevBufferLen=e.length,this.emitReserved(`flush`)}}_getWritablePackets(){if(!(this._maxPayload&&this.transport.name===`polling`&&this.writeBuffer.length>1))return this.writeBuffer;let e=1;for(let t=0;t<this.writeBuffer.length;t++){let n=this.writeBuffer[t].data;if(n&&(e+=Qe(n)),t>0&&e>this._maxPayload)return this.writeBuffer.slice(0,t);e+=2}return this.writeBuffer}_hasPingExpired(){if(!this._pingTimeoutTime)return!0;let e=Date.now()>this._pingTimeoutTime;return e&&(this._pingTimeoutTime=0,k(()=>{this._onClose(`ping timeout`)},this.setTimeoutFn)),e}write(e,t,n){return this._sendPacket(`message`,e,t,n),this}send(e,t,n){return this._sendPacket(`message`,e,t,n),this}_sendPacket(e,t,n,r){if(typeof t==`function`&&(r=t,t=void 0),typeof n==`function`&&(r=n,n=null),this.readyState===`closing`||this.readyState===`closed`)return;n||={},n.compress=!1!==n.compress;let i={type:e,data:t,options:n};this.emitReserved(`packetCreate`,i),this.writeBuffer.push(i),r&&this.once(`flush`,r),this.flush()}close(){let e=()=>{this._onClose(`forced close`),this.transport.close()},t=()=>{this.off(`upgrade`,t),this.off(`upgradeError`,t),e()},n=()=>{this.once(`upgrade`,t),this.once(`upgradeError`,t)};return(this.readyState===`opening`||this.readyState===`open`)&&(this.readyState=`closing`,this.writeBuffer.length?this.once(`drain`,()=>{this.upgrading?n():e()}):this.upgrading?n():e()),this}_onError(t){if(e.priorWebsocketSuccess=!1,this.opts.tryAllTransports&&this.transports.length>1&&this.readyState===`opening`)return this.transports.shift(),this._open();this.emitReserved(`error`,t),this._onClose(`transport error`,t)}_onClose(e,t){if(this.readyState===`opening`||this.readyState===`open`||this.readyState===`closing`){if(this.clearTimeoutFn(this._pingTimeoutTimer),this.transport.removeAllListeners(`close`),this.transport.close(),this.transport.removeAllListeners(),F&&(this._beforeunloadEventListener&&removeEventListener(`beforeunload`,this._beforeunloadEventListener,!1),this._offlineEventListener)){let e=I.indexOf(this._offlineEventListener);e!==-1&&I.splice(e,1)}this.readyState=`closed`,this.id=null,this.emitReserved(`close`,e,t),this.writeBuffer=[],this._prevBufferLen=0}}};L.protocol=4;var xt=class extends L{constructor(){super(...arguments),this._upgrades=[]}onOpen(){if(super.onOpen(),this.readyState===`open`&&this.opts.upgrade)for(let e=0;e<this._upgrades.length;e++)this._probe(this._upgrades[e])}_probe(e){let t=this.createTransport(e),n=!1;L.priorWebsocketSuccess=!1;let r=()=>{n||(t.send([{type:`ping`,data:`probe`}]),t.once(`packet`,e=>{if(!n)if(e.type===`pong`&&e.data===`probe`){if(this.upgrading=!0,this.emitReserved(`upgrading`,t),!t)return;L.priorWebsocketSuccess=t.name===`websocket`,this.transport.pause(()=>{n||this.readyState!==`closed`&&(l(),this.setTransport(t),t.send([{type:`upgrade`}]),this.emitReserved(`upgrade`,t),t=null,this.upgrading=!1,this.flush())})}else{let e=Error(`probe error`);e.transport=t.name,this.emitReserved(`upgradeError`,e)}}))};function i(){n||(n=!0,l(),t.close(),t=null)}let a=e=>{let n=Error(`probe error: `+e);n.transport=t.name,i(),this.emitReserved(`upgradeError`,n)};function o(){a(`transport closed`)}function s(){a(`socket closed`)}function c(e){t&&e.name!==t.name&&i()}let l=()=>{t.removeListener(`open`,r),t.removeListener(`error`,a),t.removeListener(`close`,o),this.off(`close`,s),this.off(`upgrading`,c)};t.once(`open`,r),t.once(`error`,a),t.once(`close`,o),this.once(`close`,s),this.once(`upgrading`,c),this._upgrades.indexOf(`webtransport`)!==-1&&e!==`webtransport`?this.setTimeoutFn(()=>{n||t.open()},200):t.open()}onHandshake(e){this._upgrades=this._filterUpgrades(e.upgrades),super.onHandshake(e)}_filterUpgrades(e){let t=[];for(let n=0;n<e.length;n++)~this.transports.indexOf(e[n])&&t.push(e[n]);return t}},St=class extends xt{constructor(e,t={}){let n=typeof e==`object`,r=n?{...e}:{...t};(!r.transports||r.transports&&typeof r.transports[0]==`string`)&&(r.transports=(r.transports||[`polling`,`websocket`,`webtransport`]).map(e=>gt[e]).filter(e=>!!e)),super(n?r:e,r)}};St.protocol;function Ct(e,t=``,n){let r=e;n||=typeof location<`u`&&location,e??=n.protocol+`//`+n.host,typeof e==`string`&&(e.charAt(0)===`/`&&(e=e.charAt(1)===`/`?n.protocol+e:n.host+e),/^(https?|wss?):\/\//.test(e)||(e=n===void 0?`https://`+e:n.protocol+`//`+e),r=P(e)),r.port||(/^(http|ws)$/.test(r.protocol)?r.port=`80`:/^(http|ws)s$/.test(r.protocol)&&(r.port=`443`)),r.path=r.path||`/`;let i=r.host.indexOf(`:`)===-1?r.host:`[`+r.host+`]`;return r.id=r.protocol+`://`+i+`:`+r.port+t,r.href=r.protocol+`://`+i+(n&&n.port===r.port?``:`:`+r.port),r}var wt=typeof ArrayBuffer==`function`,Tt=e=>typeof ArrayBuffer.isView==`function`?ArrayBuffer.isView(e):e.buffer instanceof ArrayBuffer,Et=Object.prototype.toString,Dt=typeof Blob==`function`||typeof Blob<`u`&&Et.call(Blob)===`[object BlobConstructor]`,Ot=typeof File==`function`||typeof File<`u`&&Et.call(File)===`[object FileConstructor]`;function R(e){return wt&&(e instanceof ArrayBuffer||Tt(e))||Dt&&e instanceof Blob||Ot&&e instanceof File}function z(e,t){if(!e||typeof e!=`object`)return!1;if(Array.isArray(e)){for(let t=0,n=e.length;t<n;t++)if(z(e[t]))return!0;return!1}if(R(e))return!0;if(e.toJSON&&typeof e.toJSON==`function`&&arguments.length===1)return z(e.toJSON(),!0);for(let t in e)if(Object.prototype.hasOwnProperty.call(e,t)&&z(e[t]))return!0;return!1}function kt(e){let t=[],n=e.data,r=e;return r.data=B(n,t),r.attachments=t.length,{packet:r,buffers:t}}function B(e,t){if(!e)return e;if(R(e)){let n={_placeholder:!0,num:t.length};return t.push(e),n}else if(Array.isArray(e)){let n=Array(e.length);for(let r=0;r<e.length;r++)n[r]=B(e[r],t);return n}else if(typeof e==`object`&&!(e instanceof Date)){let n={};for(let r in e)Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=B(e[r],t));return n}return e}function At(e,t){return e.data=V(e.data,t),delete e.attachments,e}function V(e,t){if(!e)return e;if(e&&e._placeholder===!0){if(typeof e.num==`number`&&e.num>=0&&e.num<t.length)return t[e.num];throw Error(`illegal attachments`)}else if(Array.isArray(e))for(let n=0;n<e.length;n++)e[n]=V(e[n],t);else if(typeof e==`object`)for(let n in e)Object.prototype.hasOwnProperty.call(e,n)&&(e[n]=V(e[n],t));return e}var jt=e({Decoder:()=>Pt,Encoder:()=>Nt,PacketType:()=>H,isPacketValid:()=>Bt,protocol:()=>5}),Mt=[`connect`,`connect_error`,`disconnect`,`disconnecting`,`newListener`,`removeListener`],H;(function(e){e[e.CONNECT=0]=`CONNECT`,e[e.DISCONNECT=1]=`DISCONNECT`,e[e.EVENT=2]=`EVENT`,e[e.ACK=3]=`ACK`,e[e.CONNECT_ERROR=4]=`CONNECT_ERROR`,e[e.BINARY_EVENT=5]=`BINARY_EVENT`,e[e.BINARY_ACK=6]=`BINARY_ACK`})(H||={});var Nt=class{constructor(e){this.replacer=e}encode(e){return(e.type===H.EVENT||e.type===H.ACK)&&z(e)?this.encodeAsBinary({type:e.type===H.EVENT?H.BINARY_EVENT:H.BINARY_ACK,nsp:e.nsp,data:e.data,id:e.id}):[this.encodeAsString(e)]}encodeAsString(e){let t=``+e.type;return(e.type===H.BINARY_EVENT||e.type===H.BINARY_ACK)&&(t+=e.attachments+`-`),e.nsp&&e.nsp!==`/`&&(t+=e.nsp+`,`),e.id!=null&&(t+=e.id),e.data!=null&&(t+=JSON.stringify(e.data,this.replacer)),t}encodeAsBinary(e){let t=kt(e),n=this.encodeAsString(t.packet),r=t.buffers;return r.unshift(n),r}},Pt=class e extends O{constructor(e){super(),this.opts=Object.assign({reviver:void 0,maxAttachments:10},typeof e==`function`?{reviver:e}:e)}add(e){let t;if(typeof e==`string`){if(this.reconstructor)throw Error(`got plaintext data when reconstructing a packet`);t=this.decodeString(e);let n=t.type===H.BINARY_EVENT;n||t.type===H.BINARY_ACK?(t.type=n?H.EVENT:H.ACK,this.reconstructor=new Ft(t),t.attachments===0&&super.emitReserved(`decoded`,t)):super.emitReserved(`decoded`,t)}else if(R(e)||e.base64)if(this.reconstructor)t=this.reconstructor.takeBinaryData(e),t&&(this.reconstructor=null,super.emitReserved(`decoded`,t));else throw Error(`got binary data when not reconstructing a packet`);else throw Error(`Unknown type: `+e)}decodeString(t){let n=0,r={type:Number(t.charAt(0))};if(H[r.type]===void 0)throw Error(`unknown packet type `+r.type);if(r.type===H.BINARY_EVENT||r.type===H.BINARY_ACK){let e=n+1;for(;t.charAt(++n)!==`-`&&n!=t.length;);let i=t.substring(e,n);if(i!=Number(i)||t.charAt(n)!==`-`)throw Error(`Illegal attachments`);let a=Number(i);if(!Lt(a)||a<0)throw Error(`Illegal attachments`);if(a>this.opts.maxAttachments)throw Error(`too many attachments`);r.attachments=a}if(t.charAt(n+1)===`/`){let e=n+1;for(;++n&&!(t.charAt(n)===`,`||n===t.length););r.nsp=t.substring(e,n)}else r.nsp=`/`;let i=t.charAt(n+1);if(i!==``&&Number(i)==i){let e=n+1;for(;++n;){let e=t.charAt(n);if(e==null||Number(e)!=e){--n;break}if(n===t.length)break}r.id=Number(t.substring(e,n+1))}if(t.charAt(++n)){let i=this.tryParse(t.substr(n));if(e.isPayloadValid(r.type,i))r.data=i;else throw Error(`invalid payload`)}return r}tryParse(e){try{return JSON.parse(e,this.opts.reviver)}catch{return!1}}static isPayloadValid(e,t){switch(e){case H.CONNECT:return U(t);case H.DISCONNECT:return t===void 0;case H.CONNECT_ERROR:return typeof t==`string`||U(t);case H.EVENT:case H.BINARY_EVENT:return Array.isArray(t)&&(typeof t[0]==`number`||typeof t[0]==`string`&&Mt.indexOf(t[0])===-1);case H.ACK:case H.BINARY_ACK:return Array.isArray(t)}}destroy(){this.reconstructor&&=(this.reconstructor.finishedReconstruction(),null)}},Ft=class{constructor(e){this.packet=e,this.buffers=[],this.reconPack=e}takeBinaryData(e){if(this.buffers.push(e),this.buffers.length===this.reconPack.attachments){let e=At(this.reconPack,this.buffers);return this.finishedReconstruction(),e}return null}finishedReconstruction(){this.reconPack=null,this.buffers=[]}};function It(e){return typeof e==`string`}var Lt=Number.isInteger||function(e){return typeof e==`number`&&isFinite(e)&&Math.floor(e)===e};function Rt(e){return e===void 0||Lt(e)}function U(e){return Object.prototype.toString.call(e)===`[object Object]`}function zt(e,t){switch(e){case H.CONNECT:return t===void 0||U(t);case H.DISCONNECT:return t===void 0;case H.EVENT:return Array.isArray(t)&&(typeof t[0]==`number`||typeof t[0]==`string`&&Mt.indexOf(t[0])===-1);case H.ACK:return Array.isArray(t);case H.CONNECT_ERROR:return typeof t==`string`||U(t);default:return!1}}function Bt(e){return It(e.nsp)&&Rt(e.id)&&zt(e.type,e.data)}function W(e,t,n){return e.on(t,n),function(){e.off(t,n)}}var Vt=Object.freeze({connect:1,connect_error:1,disconnect:1,disconnecting:1,newListener:1,removeListener:1}),Ht=class extends O{constructor(e,t,n){super(),this.connected=!1,this.recovered=!1,this.receiveBuffer=[],this.sendBuffer=[],this._queue=[],this._queueSeq=0,this.ids=0,this.acks={},this.flags={},this.io=e,this.nsp=t,n&&n.auth&&(this.auth=n.auth),this._opts=Object.assign({},n),this.io._autoConnect&&this.open()}get disconnected(){return!this.connected}subEvents(){if(this.subs)return;let e=this.io;this.subs=[W(e,`open`,this.onopen.bind(this)),W(e,`packet`,this.onpacket.bind(this)),W(e,`error`,this.onerror.bind(this)),W(e,`close`,this.onclose.bind(this))]}get active(){return!!this.subs}connect(){return this.connected?this:(this.subEvents(),this.io._reconnecting||this.io.open(),this.io._readyState===`open`&&this.onopen(),this)}open(){return this.connect()}send(...e){return e.unshift(`message`),this.emit.apply(this,e),this}emit(e,...t){if(Vt.hasOwnProperty(e))throw Error(`"`+e.toString()+`" is a reserved event name`);if(t.unshift(e),this._opts.retries&&!this.flags.fromQueue&&!this.flags.volatile)return this._addToQueue(t),this;let n={type:H.EVENT,data:t};if(n.options={},n.options.compress=this.flags.compress!==!1,typeof t[t.length-1]==`function`){let e=this.ids++,r=t.pop();this._registerAckCallback(e,r),n.id=e}let r=this.io.engine?.transport?.writable,i=this.connected&&!this.io.engine?._hasPingExpired();return this.flags.volatile&&!r||(i?(this.notifyOutgoingListeners(n),this.packet(n)):this.sendBuffer.push(n)),this.flags={},this}_registerAckCallback(e,t){let n=this.flags.timeout??this._opts.ackTimeout;if(n===void 0){this.acks[e]=t;return}let r=this.io.setTimeoutFn(()=>{delete this.acks[e];for(let t=0;t<this.sendBuffer.length;t++)this.sendBuffer[t].id===e&&this.sendBuffer.splice(t,1);t.call(this,Error(`operation has timed out`))},n),i=(...e)=>{this.io.clearTimeoutFn(r),t.apply(this,e)};i.withError=!0,this.acks[e]=i}emitWithAck(e,...t){return new Promise((n,r)=>{let i=(e,t)=>e?r(e):n(t);i.withError=!0,t.push(i),this.emit(e,...t)})}_addToQueue(e){let t;typeof e[e.length-1]==`function`&&(t=e.pop());let n={id:this._queueSeq++,tryCount:0,pending:!1,args:e,flags:Object.assign({fromQueue:!0},this.flags)};e.push((e,...r)=>(this._queue[0],e===null?(this._queue.shift(),t&&t(null,...r)):n.tryCount>this._opts.retries&&(this._queue.shift(),t&&t(e)),n.pending=!1,this._drainQueue())),this._queue.push(n),this._drainQueue()}_drainQueue(e=!1){if(!this.connected||this._queue.length===0)return;let t=this._queue[0];t.pending&&!e||(t.pending=!0,t.tryCount++,this.flags=t.flags,this.emit.apply(this,t.args))}packet(e){e.nsp=this.nsp,this.io._packet(e)}onopen(){typeof this.auth==`function`?this.auth(e=>{this._sendConnectPacket(e)}):this._sendConnectPacket(this.auth)}_sendConnectPacket(e){this.packet({type:H.CONNECT,data:this._pid?Object.assign({pid:this._pid,offset:this._lastOffset},e):e})}onerror(e){this.connected||this.emitReserved(`connect_error`,e)}onclose(e,t){this.connected=!1,delete this.id,this.emitReserved(`disconnect`,e,t),this._clearAcks()}_clearAcks(){Object.keys(this.acks).forEach(e=>{if(!this.sendBuffer.some(t=>String(t.id)===e)){let t=this.acks[e];delete this.acks[e],t.withError&&t.call(this,Error(`socket has been disconnected`))}})}onpacket(e){if(e.nsp===this.nsp)switch(e.type){case H.CONNECT:e.data&&e.data.sid?this.onconnect(e.data.sid,e.data.pid):this.emitReserved(`connect_error`,Error(`It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)`));break;case H.EVENT:case H.BINARY_EVENT:this.onevent(e);break;case H.ACK:case H.BINARY_ACK:this.onack(e);break;case H.DISCONNECT:this.ondisconnect();break;case H.CONNECT_ERROR:this.destroy();let t=Error(e.data.message);t.data=e.data.data,this.emitReserved(`connect_error`,t);break}}onevent(e){let t=e.data||[];e.id!=null&&t.push(this.ack(e.id)),this.connected?this.emitEvent(t):this.receiveBuffer.push(Object.freeze(t))}emitEvent(e){if(this._anyListeners&&this._anyListeners.length){let t=this._anyListeners.slice();for(let n of t)n.apply(this,e)}super.emit.apply(this,e),this._pid&&e.length&&typeof e[e.length-1]==`string`&&(this._lastOffset=e[e.length-1])}ack(e){let t=this,n=!1;return function(...r){n||(n=!0,t.packet({type:H.ACK,id:e,data:r}))}}onack(e){let t=this.acks[e.id];typeof t==`function`&&(delete this.acks[e.id],t.withError&&e.data.unshift(null),t.apply(this,e.data))}onconnect(e,t){this.id=e,this.recovered=t&&this._pid===t,this._pid=t,this.connected=!0,this.emitBuffered(),this._drainQueue(!0),this.emitReserved(`connect`)}emitBuffered(){this.receiveBuffer.forEach(e=>this.emitEvent(e)),this.receiveBuffer=[],this.sendBuffer.forEach(e=>{this.notifyOutgoingListeners(e),this.packet(e)}),this.sendBuffer=[]}ondisconnect(){this.destroy(),this.onclose(`io server disconnect`)}destroy(){this.subs&&=(this.subs.forEach(e=>e()),void 0),this.io._destroy(this)}disconnect(){return this.connected&&this.packet({type:H.DISCONNECT}),this.destroy(),this.connected&&this.onclose(`io client disconnect`),this}close(){return this.disconnect()}compress(e){return this.flags.compress=e,this}get volatile(){return this.flags.volatile=!0,this}timeout(e){return this.flags.timeout=e,this}onAny(e){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(e),this}prependAny(e){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(e),this}offAny(e){if(!this._anyListeners)return this;if(e){let t=this._anyListeners;for(let n=0;n<t.length;n++)if(e===t[n])return t.splice(n,1),this}else this._anyListeners=[];return this}listenersAny(){return this._anyListeners||[]}onAnyOutgoing(e){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.push(e),this}prependAnyOutgoing(e){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.unshift(e),this}offAnyOutgoing(e){if(!this._anyOutgoingListeners)return this;if(e){let t=this._anyOutgoingListeners;for(let n=0;n<t.length;n++)if(e===t[n])return t.splice(n,1),this}else this._anyOutgoingListeners=[];return this}listenersAnyOutgoing(){return this._anyOutgoingListeners||[]}notifyOutgoingListeners(e){if(this._anyOutgoingListeners&&this._anyOutgoingListeners.length){let t=this._anyOutgoingListeners.slice();for(let n of t)n.apply(this,e.data)}}};function G(e){e||={},this.ms=e.min||100,this.max=e.max||1e4,this.factor=e.factor||2,this.jitter=e.jitter>0&&e.jitter<=1?e.jitter:0,this.attempts=0}G.prototype.duration=function(){var e=this.ms*this.factor**+this.attempts++;if(this.jitter){var t=Math.random(),n=Math.floor(t*this.jitter*e);e=Math.floor(t*10)&1?e+n:e-n}return Math.min(e,this.max)|0},G.prototype.reset=function(){this.attempts=0},G.prototype.setMin=function(e){this.ms=e},G.prototype.setMax=function(e){this.max=e},G.prototype.setJitter=function(e){this.jitter=e};var K=class extends O{constructor(e,t){super(),this.nsps={},this.subs=[],e&&typeof e==`object`&&(t=e,e=void 0),t||={},t.path=t.path||`/socket.io`,this.opts=t,j(this,t),this.reconnection(t.reconnection!==!1),this.reconnectionAttempts(t.reconnectionAttempts||1/0),this.reconnectionDelay(t.reconnectionDelay||1e3),this.reconnectionDelayMax(t.reconnectionDelayMax||5e3),this.randomizationFactor(t.randomizationFactor??.5),this.backoff=new G({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(t.timeout==null?2e4:t.timeout),this._readyState=`closed`,this.uri=e;let n=t.parser||jt;this.encoder=new n.Encoder,this.decoder=new n.Decoder,this._autoConnect=t.autoConnect!==!1,this._autoConnect&&this.open()}reconnection(e){return arguments.length?(this._reconnection=!!e,e||(this.skipReconnect=!0),this):this._reconnection}reconnectionAttempts(e){return e===void 0?this._reconnectionAttempts:(this._reconnectionAttempts=e,this)}reconnectionDelay(e){var t;return e===void 0?this._reconnectionDelay:(this._reconnectionDelay=e,(t=this.backoff)==null||t.setMin(e),this)}randomizationFactor(e){var t;return e===void 0?this._randomizationFactor:(this._randomizationFactor=e,(t=this.backoff)==null||t.setJitter(e),this)}reconnectionDelayMax(e){var t;return e===void 0?this._reconnectionDelayMax:(this._reconnectionDelayMax=e,(t=this.backoff)==null||t.setMax(e),this)}timeout(e){return arguments.length?(this._timeout=e,this):this._timeout}maybeReconnectOnOpen(){!this._reconnecting&&this._reconnection&&this.backoff.attempts===0&&this.reconnect()}open(e){if(~this._readyState.indexOf(`open`))return this;this.engine=new St(this.uri,this.opts);let t=this.engine,n=this;this._readyState=`opening`,this.skipReconnect=!1;let r=W(t,`open`,function(){n.onopen(),e&&e()}),i=t=>{this.cleanup(),this._readyState=`closed`,this.emitReserved(`error`,t),e?e(t):this.maybeReconnectOnOpen()},a=W(t,`error`,i);if(!1!==this._timeout){let e=this._timeout,n=this.setTimeoutFn(()=>{r(),i(Error(`timeout`)),t.close()},e);this.opts.autoUnref&&n.unref(),this.subs.push(()=>{this.clearTimeoutFn(n)})}return this.subs.push(r),this.subs.push(a),this}connect(e){return this.open(e)}onopen(){this.cleanup(),this._readyState=`open`,this.emitReserved(`open`);let e=this.engine;this.subs.push(W(e,`ping`,this.onping.bind(this)),W(e,`data`,this.ondata.bind(this)),W(e,`error`,this.onerror.bind(this)),W(e,`close`,this.onclose.bind(this)),W(this.decoder,`decoded`,this.ondecoded.bind(this)))}onping(){this.emitReserved(`ping`)}ondata(e){try{this.decoder.add(e)}catch(e){this.onclose(`parse error`,e)}}ondecoded(e){k(()=>{this.emitReserved(`packet`,e)},this.setTimeoutFn)}onerror(e){this.emitReserved(`error`,e)}socket(e,t){let n=this.nsps[e];return n?this._autoConnect&&!n.active&&n.connect():(n=new Ht(this,e,t),this.nsps[e]=n),n}_destroy(e){let t=Object.keys(this.nsps);for(let e of t)if(this.nsps[e].active)return;this._close()}_packet(e){let t=this.encoder.encode(e);for(let n=0;n<t.length;n++)this.engine.write(t[n],e.options)}cleanup(){this.subs.forEach(e=>e()),this.subs.length=0,this.decoder.destroy()}_close(){this.skipReconnect=!0,this._reconnecting=!1,this.onclose(`forced close`)}disconnect(){return this._close()}onclose(e,t){var n;this.cleanup(),(n=this.engine)==null||n.close(),this.backoff.reset(),this._readyState=`closed`,this.emitReserved(`close`,e,t),this._reconnection&&!this.skipReconnect&&this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;let e=this;if(this.backoff.attempts>=this._reconnectionAttempts)this.backoff.reset(),this.emitReserved(`reconnect_failed`),this._reconnecting=!1;else{let t=this.backoff.duration();this._reconnecting=!0;let n=this.setTimeoutFn(()=>{e.skipReconnect||(this.emitReserved(`reconnect_attempt`,e.backoff.attempts),!e.skipReconnect&&e.open(t=>{t?(e._reconnecting=!1,e.reconnect(),this.emitReserved(`reconnect_error`,t)):e.onreconnect()}))},t);this.opts.autoUnref&&n.unref(),this.subs.push(()=>{this.clearTimeoutFn(n)})}}onreconnect(){let e=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved(`reconnect`,e)}},q={};function J(e,t){typeof e==`object`&&(t=e,e=void 0),t||={};let n=Ct(e,t.path||`/socket.io`),r=n.source,i=n.id,a=n.path,o=q[i]&&a in q[i].nsps,s=t.forceNew||t[`force new connection`]||!1===t.multiplex||o,c;return s?c=new K(r,t):(q[i]||(q[i]=new K(r,t)),c=q[i]),n.query&&!t.query&&(t.query=n.queryKey),c.socket(n.path,t)}Object.assign(J,{Manager:K,Socket:Ht,io:J,connect:J});var Y=null,X=new Map,Ut=new Set,Wt=!1;function Gt(e){for(let t of X.keys())e.emit(`subscribe`,t)}function Kt(){for(let e of Ut)try{e()}catch(e){console.error(`[usePubSub] reconnect handler threw:`,e)}}function qt(){if(Y)return Y;let e=J({path:`/ws/pubsub`,transports:[`websocket`]});return e.on(`connect`,()=>{Gt(e),Wt?Kt():Wt=!0}),e.on(`data`,e=>{let t=X.get(e.channel);if(t)for(let n of t)n(e.data)}),Y=e,e}function Jt(){X.size>0||Y&&(Y.disconnect(),Y=null,Wt=!1)}function Yt(){function e(e,t){let n=X.get(e);n||(n=new Set,X.set(e,n)),n.add(t);let r=qt();return r.connected&&r.emit(`subscribe`,e),()=>{let n=X.get(e);n&&(n.delete(t),n.size===0&&(X.delete(e),Y?.connected&&Y.emit(`unsubscribe`,e)),Jt())}}function t(e){return Ut.add(e),()=>{Ut.delete(e)}}return{subscribe:e,onReconnect:t}}function Z(e){return e}function Xt(e,t){return t?e.url.replace(/:(\w+)/g,(e,n)=>Object.prototype.hasOwnProperty.call(t,n)?encodeURIComponent(String(t[n])):e):e.url}var Zt={openBook:`openBook`,getBooks:`getBooks`,createBook:`createBook`,updateBook:`updateBook`,deleteBook:`deleteBook`,getAccounts:`getAccounts`,upsertAccount:`upsertAccount`,addEntries:`addEntries`,voidEntry:`voidEntry`,getJournalEntries:`getJournalEntries`,getOpeningBalances:`getOpeningBalances`,setOpeningBalances:`setOpeningBalances`,getReport:`getReport`,getTimeSeries:`getTimeSeries`,rebuildSnapshots:`rebuildSnapshots`},Qt={dispatch:{path:`/api/accounting`,method:`POST`}},$t=[`asset`,`liability`,`equity`,`income`,`expense`];function en(e){return`accounting:${e}`}var tn=`accounting:books`,nn={journal:`journal`,opening:`opening`,accounts:`accounts`,snapshotsRebuilding:`snapshots-rebuilding`,snapshotsReady:`snapshots-ready`};function rn(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function an(e){return Array.isArray(e)}function on(e,t){return rn(e)&&typeof e[t]==`string`}function sn(e,t){return e instanceof Error?e.message:on(e,`details`)&&e.details?e.details:on(e,`message`)&&e.message?e.message:t===void 0?String(e):t}var cn={accounting:`data/accounting`,accountingBooks:`data/accounting/books`},ln=[1,2,3,4,5,6,7,8,9,10,11,12],un=new Map([[`Q1`,3],[`Q2`,6],[`Q3`,9],[`Q4`,12]]);function dn(e){return typeof e==`number`&&Number.isInteger(e)&&e>=1&&e<=12}function fn(e){return dn(e)?e:(typeof e==`string`?un.get(e):void 0)??12}function pn(e){return fn(e)}function mn(e,t){let n=new Date(Date.UTC(2001,e,0));try{return new Intl.DateTimeFormat(t,{month:`long`,day:`numeric`,timeZone:`UTC`}).format(n)}catch{return String(e)}}function hn(e){return String(e).padStart(2,`0`)}function gn(e,t){return new Date(e,t+1,0).getDate()}function _n(e,t,n){return`${e}-${hn(t)}-${hn(n)}`}function vn(e,t){let n=pn(e),r=(t.getMonth()+1-n-1+12)%12;return Math.floor(r/3)}function yn(e,t,n){let r=pn(e),i=t.getMonth()+1,a=t.getFullYear(),o=r%12+1,s=i>=o?a:a-1,c=o+n*3;return{year:s+Math.floor((c-1)/12),month:(c-1)%12+1}}function Q(e,t,n){let r=yn(e,t,n),i=r.month-1+2,a=r.year+Math.floor(i/12),o=i%12+1,s=gn(a,o-1);return{from:_n(r.year,r.month,1),to:_n(a,o,s)}}function bn(e,t=new Date){return Q(e,t,vn(e,t))}function xn(e,t=new Date){let n=vn(e,t);return n>0?Q(e,t,n-1):Q(e,new Date(t.getFullYear(),t.getMonth()-3,1),3)}function Sn(e,t=new Date){let n=Q(e,t,0),r=Q(e,t,3);return{from:n.from,to:r.to}}function Cn(e,t=new Date){return Sn(e,new Date(t.getFullYear()-1,t.getMonth(),t.getDate()))}var wn=`US.JP.GB.CA.AU.NZ.DE.FR.IT.ES.NL.BE.AT.IE.PT.FI.SE.DK.PL.CH.NO.CN.KR.TW.HK.SG.IN.BR.MX`.split(`.`);function Tn(e,t){try{return new Intl.DisplayNames([t],{type:`region`}).of(e)??e}catch{return e}}function En(e){return wn.some(t=>t===e)}var Dn={warnMissingTaxRegistrationId:new Set([`JP`,`GB`,`DE`,`FR`,`IT`,`ES`,`NL`,`BE`,`AT`,`IE`,`PT`,`FI`,`SE`,`DK`,`PL`,`IN`,`AU`,`NZ`,`CA`])};function On(e,t){return t?Dn[e].has(t):!1}var kn=[`USD`,`EUR`,`JPY`,`GBP`,`CNY`,`KRW`,`TWD`,`HKD`,`SGD`,`AUD`,`CAD`,`CHF`,`INR`,`BRL`,`MXN`],An=2;function jn(e,t){try{return new Intl.DisplayNames([t],{type:`currency`}).of(e)??e}catch{return e}}function Mn(e){try{return new Intl.NumberFormat(`en`,{style:`currency`,currency:e}).resolvedOptions().maximumFractionDigits??An}catch{return An}}function Nn(e){let t=Mn(e);return t===0?`1`:(1/10**t).toFixed(t)}function Pn(e,t,n){try{return new Intl.NumberFormat(n,{style:`currency`,currency:t}).format(e)}catch{return e.toFixed(Mn(t))}}function Fn(e,t=2,n){return e.toLocaleString(n,{minimumFractionDigits:t,maximumFractionDigits:t})}function $(e){return String(e).padStart(2,`0`)}function In(e=new Date){return`${e.getFullYear()}-${$(e.getMonth()+1)}-${$(e.getDate())}`}function Ln(e=new Date){return`${e.getFullYear()}-${$(e.getMonth()+1)}`}function Rn(e=new Date){let t=new Date(e.getFullYear(),e.getMonth()-1,1);return`${t.getFullYear()}-${$(t.getMonth()+1)}`}function zn(e=new Date){let t=Math.floor(e.getMonth()/3)*3,n=new Date(e.getFullYear(),t-1,1);return`${n.getFullYear()}-${$(n.getMonth()+1)}`}function Bn(e=new Date){return`${e.getFullYear()-1}-12`}var Vn=[`revenue`,`expense`,`netIncome`,`accountBalance`],Hn=[`month`,`quarter`,`year`],Un=Z({toolName:`manageAccounting`,apiNamespace:`accounting`,apiRoutes:{dispatch:{method:`POST`,path:``}},mcpDispatch:`dispatch`,workspaceDirs:{accounting:cn.accounting,accountingBooks:cn.accountingBooks},staticChannels:{accountingBooks:`accounting:books`}}),Wn=Z({toolName:`openCanvas`,apiNamespace:`canvas`,apiRoutes:{dispatch:{method:`POST`,path:``}},mcpDispatch:`dispatch`}),Gn=Z({toolName:`presentChart`,apiNamespace:`chart`,apiRoutes:{create:{method:`POST`,path:``}},mcpDispatch:`create`}),Kn=Z({toolName:`editImages`}),qn=Z({toolName:`generateImage`}),Jn=Z({toolName:`manageSkills`,apiNamespace:`skills`,apiRoutes:{list:{method:`GET`,path:``},detail:{method:`GET`,path:`/:name`},create:{method:`POST`,path:``},update:{method:`PUT`,path:`/:name`},remove:{method:`DELETE`,path:`/:name`},catalogList:{method:`GET`,path:`/catalog`},catalogStar:{method:`POST`,path:`/catalog/star`},catalogPreview:{method:`GET`,path:`/catalog/preview`},externalSuggestions:{method:`GET`,path:`/external/suggestions`},externalReposList:{method:`GET`,path:`/external/repos`},externalReposInstall:{method:`POST`,path:`/external/repos`},externalReposRemove:{method:`DELETE`,path:`/external/repos/:repoId`}},mcpDispatch:`create`}),Yn=Z({toolName:`presentDocument`,apiNamespace:`markdown`,apiRoutes:{create:{method:`POST`,path:``},update:{method:`PUT`,path:`/update`}},mcpDispatch:`create`}),Xn=Z({toolName:`managePhotoLocations`,apiNamespace:`photoLocations`,apiRoutes:{dispatch:{method:`POST`,path:``}},mcpDispatch:`dispatch`,staticChannels:{locationsChanged:`photoLocations:locations-changed`}}),Zn=Z({toolName:`presentCollection`,apiNamespace:`presentCollection`,apiRoutes:{dispatch:{method:`POST`,path:``}},mcpDispatch:`dispatch`}),Qn=Z({toolName:`presentForm`,apiNamespace:`form`,apiRoutes:{dispatch:{method:`POST`,path:``}},mcpDispatch:`dispatch`}),$n=Z({toolName:`presentHtml`,apiNamespace:`html`,apiRoutes:{create:{method:`POST`,path:``},update:{method:`PUT`,path:`/update`}},mcpDispatch:`create`}),er=Z({toolName:`presentMulmoScript`,apiNamespace:`mulmoScript`,apiRoutes:{save:{method:`POST`,path:`/save`},updateBeat:{method:`POST`,path:`/update-beat`},updateScript:{method:`POST`,path:`/update-script`},beatImage:{method:`GET`,path:`/beat-image`},beatAudio:{method:`GET`,path:`/beat-audio`},beatMovie:{method:`GET`,path:`/beat-movie`},generateBeatAudio:{method:`POST`,path:`/generate-beat-audio`},renderBeat:{method:`POST`,path:`/render-beat`},uploadBeatImage:{method:`POST`,path:`/upload-beat-image`},characterImage:{method:`GET`,path:`/character-image`},renderCharacter:{method:`POST`,path:`/render-character`},uploadCharacterImage:{method:`POST`,path:`/upload-character-image`},movieStatus:{method:`GET`,path:`/movie-status`},generateMovie:{method:`POST`,path:`/generate-movie`},downloadMovie:{method:`GET`,path:`/download-movie`},pdfStatus:{method:`GET`,path:`/pdf-status`},generatePdf:{method:`POST`,path:`/generate-pdf`},downloadPdf:{method:`GET`,path:`/download-pdf`}},mcpDispatch:`save`,requires:[`ffmpeg`]}),tr=Z({toolName:`presentSVG`,apiNamespace:`svg`,apiRoutes:{create:{method:`POST`,path:``},update:{method:`PUT`,path:`/update`}},mcpDispatch:`create`}),nr=Z({toolName:`manageAutomations`,apiNamespace:`scheduler`,apiRoutes:{list:{method:`GET`,path:``},dispatch:{method:`POST`,path:``},tasksList:{method:`GET`,path:`/tasks`},tasksCreate:{method:`POST`,path:`/tasks`},taskUpdate:{method:`PUT`,path:`/tasks/:id`},taskDelete:{method:`DELETE`,path:`/tasks/:id`},taskRun:{method:`POST`,path:`/tasks/:id/run`},logs:{method:`GET`,path:`/logs`}},mcpDispatch:`dispatch`}),rr=Z({toolName:`presentSpreadsheet`,apiNamespace:`spreadsheet`,apiRoutes:{create:{method:`POST`,path:``},update:{method:`PUT`,path:`/update`}},mcpDispatch:`create`}),ir=[Un,Wn,Gn,Kn,qn,Jn,Yn,Xn,Zn,Qn,$n,er,tr,nr,rr,Z({toolName:`manageWiki`})],ar=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function or(e,t){return ar(e,t)?e[t]??``:``}function sr(e,t,n){let r=Object.create(null),i=Object.create(null),a=[];for(let o of e){let e=t(o);if(e)for(let[t,s]of Object.entries(e)){if(ar(i,t)){let e=i[t]??``;a.push({dimension:n,key:t,plugins:[e,o.toolName]});continue}r[t]=s,i[t]=o.toolName}}return{aggregate:{...r},owner:{...i},collisions:a}}function cr(e,t,n,r){let i=Object.create(null),a=[];for(let[o,s]of Object.entries(n)){if(t.has(o)){a.push({label:e,key:o,plugin:or(r,o)});continue}i[o]=s}return{cleaned:{...i},dropped:a}}function lr(e,t){let{aggregate:n,owner:r,collisions:i}=sr(e,t.extract,t.dimension),a=new Set(Object.keys(t.hostRecord));if(t.additionalReservedKeys)for(let e of t.additionalReservedKeys)a.add(e);let{cleaned:o,dropped:s}=cr(t.label,a,n,r),c=o;return{merged:{...t.hostRecord,...c},hostCollisions:s,intraCollisions:i}}var ur={message:`/api/transports/:transportId/chats/:externalChatId`,connect:`/api/transports/:transportId/chats/:externalChatId/connect`};function dr(e,t){let n={};for(let[r,i]of Object.entries(t))n[r]={method:i.method,url:`/api/${e}${i.path}`};return n}var fr=lr(ir,{label:`API_ROUTES`,hostRecord:{health:`/api/health`,sandbox:`/api/sandbox`,diagnosticsReport:`/api/diagnostics/report`,shortcuts:`/api/shortcuts`,dashboard:`/api/dashboard`,agent:{run:`/api/agent`,cancel:`/api/agent/cancel`,internal:{toolResult:`/api/internal/tool-result`}},chatIndex:{rebuild:`/api/chat-index/rebuild`},chatService:ur,shutdown:`/api/shutdown`,config:{base:`/api/config`,settings:`/api/config/settings`,mcp:`/api/config/mcp`,workspaceDirs:`/api/config/workspace-dirs`,referenceDirs:`/api/config/reference-dirs`,schedulerOverrides:`/api/config/scheduler-overrides`,refresh:`/api/config/refresh`,connectors:`/api/config/connectors`},files:{tree:`/api/files/tree`,dir:`/api/files/dir`,content:`/api/files/content`,create:`/api/files/create`,upload:`/api/files/upload`,raw:`/api/files/raw`,refRoots:`/api/files/ref-roots`,open:`/api/files/open`,reveal:`/api/files/reveal`},image:{generate:`/api/generate-image`,edit:`/api/edit-image`,upload:`/api/images`,update:`/api/images/update`},attachments:{upload:`/api/attachments`},share:{pack:`/api/share/pack`,packMarkdown:`/api/share/pack-markdown`},remoteHost:{connect:`/api/remote-host/connect`,reconnect:`/api/remote-host/reconnect`,disconnect:`/api/remote-host/disconnect`,status:`/api/remote-host/status`},google:{status:`/api/google/status`,authorize:`/api/google/authorize`,unlink:`/api/google/unlink`},mcpTools:{list:`/api/mcp-tools`,invoke:`/api/mcp-tools/:tool`},notifier:{dispatch:`/api/notifier`},journal:{latestDaily:`/api/journal/latest-daily`},pdf:{markdown:`/api/pdf/markdown`},translation:{translate:`/api/translation`},transcribe:{run:`/api/transcribe`,model:`/api/transcribe/model`,modelDownload:`/api/transcribe/model/download`},plugins:{mindmap:`/api/mindmap`,quiz:`/api/quiz`,present3d:`/api/present3d`,googleMap:`/api/google-map`,runtimeList:`/api/plugins/runtime/list`,runtimeDispatch:`/api/plugins/runtime/:pkg/dispatch`,runtimeOauthCallback:`/api/plugins/runtime/oauth-callback/:alias`,diagnostics:`/api/plugins/diagnostics`,runtimeAsset:`/api/plugins/runtime/:pkg/:version/{*splat}`},roles:{list:`/api/roles`,manage:`/api/roles/manage`},marpThemes:{list:`/api/marp-themes`},collections:{list:`/api/collections`,ontology:`/api/collections/ontology`,detail:`/api/collections/:slug`,items:`/api/collections/:slug/items`,item:`/api/collections/:slug/items/:itemId`,itemAction:`/api/collections/:slug/items/:itemId/actions/:actionId`,collectionAction:`/api/collections/:slug/actions/:actionId`,refresh:`/api/collections/:slug/refresh`,calendarPush:`/api/collections/:slug/calendar-push`,viewFile:`/api/collections/:slug/view-file`,remoteView:`/api/collections/:slug/remote-view`,remoteViewMutate:`/api/collections/:slug/remote-view/:viewId/mutate`,remoteViewItems:`/api/collections/:slug/remote-view/:viewId/items`,viewI18n:`/api/collections/:slug/view-i18n`,viewToken:`/api/collections/:slug/view-token`,viewData:`/api/collections/:slug/view-data`,viewDataAction:`/api/collections/:slug/view-data/actions/:actionId`,viewDataQuery:`/api/collections/:slug/view-data/query`,viewDataImage:`/api/collections/:slug/view-data/image`,viewDelete:`/api/collections/:slug/views/:viewId`},collectionsRegistry:{list:`/api/collections-registry`,preview:`/api/collections-registry/preview`,import:`/api/collections-registry/import`,export:`/api/collections-registry/export`},sessions:{list:`/api/sessions`,detail:`/api/sessions/:id`,markRead:`/api/sessions/:id/mark-read`,bookmark:`/api/sessions/:id/bookmark`},feeds:{list:`/api/feeds`,detail:`/api/feeds/:slug`},hooks:{log:`/api/hooks/log`},wiki:{base:`/api/wiki`,pageHistory:`/api/wiki/pages/:slug/history`,pageHistorySnapshot:`/api/wiki/pages/:slug/history/:stamp`,pageHistoryRestore:`/api/wiki/pages/:slug/history/:stamp/restore`,internalSnapshot:`/api/wiki/internal/snapshot`}},extract:e=>{if(e.apiRoutes===void 0)return;let t=e.apiNamespace??e.toolName;return{[t]:dr(t,e.apiRoutes)}},dimension:`apiNamespace`});fr.hostCollisions,fr.intraCollisions;var pr=fr.merged,mr={common:{downloadZip:`ZIP`,downloadFailed:`Download failed`,save:`Save`,cancel:`Cancel`,loading:`Loading...`,close:`Close`,dismiss:`Dismiss`,add:`Add`,remove:`Remove`,yes:`Yes`,no:`No`,saving:`Saving...`,saved:`Saved`,noResultsYet:`No results yet`,noImageYet:`No image yet`,sendChat:`Start a new chat`},sessionTabBar:{newSession:`New session`,activeSessions:`{count} active session (agent running) | {count} active sessions (agent running)`,unreadReplies:`{count} unread reply | {count} unread replies`,unreadDot:`New reply`,origin:{scheduler:`Started by scheduler`,skill:`Started by skill`,bridge:`Started by bridge`}},chatInput:{placeholder:`Message Claude…`,send:`Send`,stop:`Stop`,runningPlaceholder:`Running… press Enter to queue for later`,removeBuffered:`Remove queued message`,attachFile:`Attach file`,fileTooLarge:`File too large ({sizeMB} MB). Maximum is 30 MB.`,unsupportedFileType:`File type not supported. Accepted: images, PDF, DOCX, XLSX, PPTX, text files.`,attachImageFailed:`Failed to attach image: {error}`,stopFailed:`Failed to stop the run: {error}`,dropHint:`Drop file to attach`,tooManyFiles:`You can attach up to {max} files at once.`,removeAttachment:`Remove {name}`,attachmentFallbackName:`attachment`,voice:{start:`Start voice input`,stop:`Stop voice input`}},cspViolation:{notice:`⚠ A view tried to load {host}, but the content security policy blocked it ({directive}). To allow it, add the host to config/csp.json — only if you trust it.`,dismiss:`Dismiss`},sessionHistoryPanel:{filters:{all:`All`,unread:`Unread`,bookmarked:`Bookmarked`,longRunning:`Long-running (24h+)`,human:`Human`,scheduler:`Scheduler`,skill:`Skill`,bridge:`Bridge`},failedToRefresh:`⚠ Failed to refresh: {error}`,showingLastKnown:` — showing last known list.`,noSessions:`No sessions yet.`,noMatching:`No matching sessions.`,running:`Running`,noMessages:`(no messages)`,openRowAria:`Open session: {preview}`,rowMenuAria:`Session actions`,bookmark:`Bookmark`,unbookmark:`Remove bookmark`,delete:`Delete`,deleteConfirm:`Delete this session?
|
|
2
|
+
|
|
3
|
+
{preview}
|
|
4
|
+
|
|
5
|
+
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`},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.`},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.`},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:`Control the reasoning effort Claude Code uses for each turn. Leave unset to use Claude's default.`,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`,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`},geminiRequired:`Image generation requires {envKey}. Add it to {envFile} and restart the app.`,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`},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
|
|
6
|
+
@modelcontextprotocol/server-filesystem
|
|
7
|
+
/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/).`,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)`,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`,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}:`},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`}},hr={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 です。`,unsupportedFileType:`対応していないファイル形式です。画像・PDF・DOCX・XLSX・PPTX・テキストファイルを使用してください。`,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:`このセッションを削除しますか?
|
|
8
|
+
|
|
9
|
+
{preview}
|
|
10
|
+
|
|
11
|
+
この操作は取り消せません。`},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:`再接続`},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 コードを読み取っても開けます。`},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 連携の解除に失敗しました。`},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 のデフォルトに従います。`,effortLabel:`推論 effort`,effortUnset:`(未設定 — Claude のデフォルトを使用)`,helperText:`高いレベルほど思考時間が長くなりますが、レイテンシとトークン消費も増えます。`,configured:`Effort: {level}`,notConfigured:`未設定`,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:`保存に失敗しました`},geminiRequired:`画像生成には {envKey} が必要です。{envFile} に追加してアプリを再起動してください。`,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 で開けませんでした`},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
|
|
12
|
+
@modelcontextprotocol/server-filesystem
|
|
13
|
+
/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/ のスキル)。`,sectionLegendCatalog:`カタログ: {star} を付けるとアクティブになるスキル。アクティブから {star} を外せばカタログに戻り、Claude は使わなくなります (削除はされません)。`,catalogEmpty:`利用できるプリセットスキルがありません。`,catalogPresetHeading:`プリセット`,catalogStar:`スター`,catalogStarred:`スター済み`,sourceUserTitle:`ユーザースキル (~/.claude/skills/、全ワークスペース共通)`,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:`プラグイン`,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}:`},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:`キャンセル`}},gr={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。`,unsupportedFileType:`不支持的文件类型。支持:图像、PDF、DOCX、XLSX、PPTX、文本文件。`,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:`确定要删除该会话吗?
|
|
14
|
+
|
|
15
|
+
{preview}
|
|
16
|
+
|
|
17
|
+
此操作无法撤销。`},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:`重新连接`},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:`也可以用手机相机扫描此二维码打开。`},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 关联失败。`},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 的默认值。`,effortLabel:`推理强度`,effortUnset:`(未设置 — 使用 Claude 的默认值)`,helperText:`更高的等级会带来更多思考时间,但也会增加延迟和 token 消耗。`,configured:`推理强度:{level}`,notConfigured:`未设置`,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:`保存失败`},geminiRequired:`图像生成需要 {envKey}。请将它加入 {envFile} 并重启应用。`,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:`无法在系统中打开`},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
|
|
18
|
+
@modelcontextprotocol/server-filesystem
|
|
19
|
+
/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/ 中的技能)。`,sectionLegendCatalog:`目录: 标记 {star} 后会成为活动的技能。从活动中取消 {star} 会回到目录 — Claude 将不再使用 (技能不会被删除)。`,catalogEmpty:`没有可用的预设技能。`,catalogPresetHeading:`预设`,catalogStar:`收藏`,catalogStarred:`已收藏`,sourceUserTitle:`用户技能 (~/.claude/skills/,所有工作区通用)`,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:`插件`,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}:`},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:`取消`}},_r={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 까지 가능합니다.`,unsupportedFileType:`지원되지 않는 파일 형식입니다. 이미지, PDF, DOCX, XLSX, PPTX, 텍스트 파일만 지원됩니다.`,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:`이 세션을 삭제하시겠습니까?
|
|
20
|
+
|
|
21
|
+
{preview}
|
|
22
|
+
|
|
23
|
+
이 작업은 되돌릴 수 없습니다.`},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:`다시 연결`},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 코드를 스캔해도 열 수 있습니다.`},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 연결 해제에 실패했습니다.`},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의 기본값이 사용됩니다.`,effortLabel:`추론 effort`,effortUnset:`(미설정 — Claude 기본값 사용)`,helperText:`레벨이 높을수록 사고 시간이 늘어나지만 지연 시간과 토큰 사용량도 증가합니다.`,configured:`Effort: {level}`,notConfigured:`미설정`,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:`저장에 실패했습니다`},geminiRequired:`이미지 생성에는 {envKey} 가 필요합니다. {envFile} 에 추가하고 앱을 재시작해주세요.`,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에서 열 수 없습니다`},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
|
|
24
|
+
@modelcontextprotocol/server-filesystem
|
|
25
|
+
/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/ 의 스킬).`,sectionLegendCatalog:`카탈로그: {star}를 누르면 활성이 되는 스킬. 활성에서 {star}를 해제하면 카탈로그로 돌아가고 Claude는 사용하지 않게 됩니다 (스킬은 삭제되지 않습니다).`,catalogEmpty:`사용 가능한 프리셋 스킬이 없습니다.`,catalogPresetHeading:`프리셋`,catalogStar:`별 표시`,catalogStarred:`별 표시됨`,sourceUserTitle:`사용자 스킬 (~/.claude/skills/, 모든 워크스페이스 공통)`,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:`플러그인`,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}:`},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:`취소`}},vr={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.`,unsupportedFileType:`Tipo de archivo no admitido. Se aceptan: imágenes, PDF, DOCX, XLSX, PPTX y archivos de texto.`,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?
|
|
26
|
+
|
|
27
|
+
{preview}
|
|
28
|
+
|
|
29
|
+
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`},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.`},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.`},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:`Controla el esfuerzo de razonamiento que Claude Code usa en cada turno. Déjalo sin configurar para usar el valor por defecto de Claude.`,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`,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`},geminiRequired:`La generación de imágenes requiere {envKey}. Añádelo a {envFile} y reinicia la app.`,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`},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
|
|
30
|
+
@modelcontextprotocol/server-filesystem
|
|
31
|
+
/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/).`,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)`,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`,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}:`},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`}},yr={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.`,unsupportedFileType:`Tipo de arquivo não suportado. Aceitos: imagens, PDF, DOCX, XLSX, PPTX e arquivos de texto.`,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?
|
|
32
|
+
|
|
33
|
+
{preview}
|
|
34
|
+
|
|
35
|
+
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`},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.`},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.`},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:`Controla o esforço de raciocínio que o Claude Code usa em cada turno. Deixe sem configurar para usar o padrão do Claude.`,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`,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`},geminiRequired:`A geração de imagens requer {envKey}. Adicione-o a {envFile} e reinicie o app.`,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`},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
|
|
36
|
+
@modelcontextprotocol/server-filesystem
|
|
37
|
+
/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/).`,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)`,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`,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}:`},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`}},br={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.`,unsupportedFileType:`Type de fichier non pris en charge. Acceptés : images, PDF, DOCX, XLSX, PPTX, fichiers texte.`,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 ?
|
|
38
|
+
|
|
39
|
+
{preview}
|
|
40
|
+
|
|
41
|
+
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`},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.`},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.`},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:`Contrôle l'effort de raisonnement utilisé par Claude Code à chaque tour. Laissez vide pour utiliser la valeur par défaut de Claude.`,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`,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`},geminiRequired:`La génération d'images nécessite {envKey}. Ajoutez-le à {envFile} et redémarrez l'application.`,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`},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
|
|
42
|
+
@modelcontextprotocol/server-filesystem
|
|
43
|
+
/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/).`,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)`,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`,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} :`},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`}},xr={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.`,unsupportedFileType:`Dateityp nicht unterstützt. Akzeptiert: Bilder, PDF, DOCX, XLSX, PPTX, Textdateien.`,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?
|
|
44
|
+
|
|
45
|
+
{preview}
|
|
46
|
+
|
|
47
|
+
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`},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.`},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.`},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:`Steuert den Reasoning-Effort, den Claude Code pro Zug verwendet. Ohne Einstellung wird der Standard von Claude verwendet.`,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`,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`},geminiRequired:`Die Bildgenerierung erfordert {envKey}. Fügen Sie ihn zu {envFile} hinzu und starten Sie die App neu.`,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`},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
|
|
48
|
+
@modelcontextprotocol/server-filesystem
|
|
49
|
+
/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/).`,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)`,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`,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}:`},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`}},Sr=[`en`,`ja`,`zh`,`ko`,`es`,`pt-BR`,`fr`,`de`],Cr={en:mr,ja:hr,zh:gr,ko:_r,es:vr,"pt-BR":yr,fr:br,de:xr};function wr(e){return Sr.some(t=>t===e)}function Tr(e){if(wr(e))return e;let t=e.toLowerCase();for(let e of Sr)if(e.toLowerCase()===t)return e;let[n=t]=t.split(`-`);return wr(n)?n:Sr.find(e=>e.toLowerCase().startsWith(`${n}-`))??null}p();function Er(e,t){return`plugin:${e}:${t}`}function Dr(e,t){return n=>{let r;try{r=e(n)}catch{return}r!==null&&t&&t(r)}}function Or(e){let{subscribe:t}=Yt();function n(n,r,i){let a=Er(e,n);return typeof r==`function`?t(a,r):t(a,Dr(r.parse,i))}return{subscribe:n}}function kr(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 Ar=new Set([`http:`,`https:`]);function jr(e){return t=>{let n;try{n=new URL(t)}catch{console.warn(`[plugin/${e}] openUrl rejected unparseable URL`,{url:t});return}if(!Ar.has(n.protocol)){console.warn(`[plugin/${e}] openUrl rejected non-http(s) scheme`,{scheme:n.protocol});return}window.open(t,`_blank`,`noopener,noreferrer`)||console.warn(`[plugin/${e}] window.open returned null`,{url:t})}}function Mr(e){let t=pr.plugins.runtimeDispatch.replace(`:pkg`,encodeURIComponent(e));async function n(n,r){let i=await we(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 Nr(e){let{pkgName:t,endpoints:r}=e,{locale:i}=te(),a=n({get:()=>String(i.value),set:e=>{wr(e)&&(i.value=e)}});return{pubsub:Or(t),locale:a,log:kr(t),openUrl:jr(t),dispatch:Mr(t),...r===void 0?{}:{endpoints:r}}}p(),m();function Pr(e){let t=c(null),r=c(!1),i=c(0),a=n(()=>{if(!t.value)return``;let e=t.value.message||String(t.value),n=t.value.stack??``;return n?`${e}\n\n${n}`:e});function o(n){let r=le(n);console.error(`[plugin/${e}] uncaught error`,r),t.value=r}function s(){t.value=null,r.value=!1,i.value+=1}return{error:t,showDetails:r,mountKey:i,errorDetails:a,captureError:o,retry:s}}p(),m(),u();var Fr={key:0,class:`rounded border border-red-200 bg-red-50 p-3 text-sm`,"data-testid":`plugin-error-boundary`,role:`alert`},Ir={class:`flex items-center gap-2 mb-1`},Lr={class:`font-medium text-red-800`},Rr={class:`text-red-700 mb-2`},zr={class:`flex items-center gap-3`},Br={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`},Vr=l({__name:`PluginScopedRoot`,props:{pkgName:{},endpoints:{}},setup(e){let n=e,{t:c}=te();ee(ne,Nr({pkgName:n.pkgName,endpoints:n.endpoints}));let{error:l,showDetails:u,mountKey:p,errorDetails:m,captureError:re,retry:ie}=Pr(n.pkgName);return a(e=>(re(e),!1)),(n,a)=>f(l)?(t(),o(`div`,Fr,[d(`div`,Ir,[a[2]||=d(`span`,{class:`material-icons text-red-500`,"aria-hidden":`true`},`error_outline`,-1),d(`span`,Lr,r(f(c)(`pluginErrorBoundary.title`,{pkg:e.pkgName})),1)]),d(`p`,Rr,r(f(c)(`pluginErrorBoundary.subtitle`)),1),d(`div`,zr,[d(`button`,{type:`button`,class:`text-xs text-red-600 hover:underline`,"data-testid":`plugin-error-toggle-details`,onClick:a[0]||=e=>u.value=!f(u)},r(f(u)?f(c)(`pluginErrorBoundary.hideDetails`):f(c)(`pluginErrorBoundary.showDetails`)),1),d(`button`,{type:`button`,class:`text-xs text-red-600 hover:underline`,"data-testid":`plugin-error-retry`,onClick:a[1]||=(...e)=>f(ie)&&f(ie)(...e)},r(f(c)(`pluginErrorBoundary.retry`)),1)]),f(u)?(t(),o(`pre`,Br,r(f(m)),1)):s(``,!0)])):i(n.$slots,`default`,{key:f(p)})}}),Hr=e({default:()=>Ur}),Ur=Vr;export{y as $,On as A,En as B,nn as C,Hn as D,kn as E,mn as F,Tn as G,zn as H,Pn as I,Rn as J,jn as K,Fn as L,bn as M,Bn as N,Vn as O,sn as P,Yt as Q,Nn as R,$t as S,wn as T,In as U,an as V,Ln as W,fn as X,xn as Y,Xt as Z,Wn as _,ie as _t,pr as a,g as at,Qt as b,rr as c,_e as ct,$n as d,ue as dt,Ee as et,Qn as f,pe as ft,Gn as g,ce as gt,Jn as h,h as ht,Tr as i,Te as it,Sn as j,en as k,tr as l,fe as lt,Xn as m,le as mt,Hr as n,Ce as nt,ir as o,_ as ot,Zn as p,me as pt,Cn as q,Cr as r,we as rt,lr as s,ye as st,Ur as t,De as tt,er as u,de as ut,Un as v,re as vt,ln as w,tn as x,Zt as y,ae as yt,rn as z};
|