From cd4ebb7e449ac42586720368795be547b98cb485 Mon Sep 17 00:00:00 2001 From: windyboy Date: Wed, 4 Feb 2026 18:01:06 +0800 Subject: [PATCH] vault backup: 2026-02-04 18:01:06 --- .obsidian/community-plugins.json | 3 +- .obsidian/plugins/claudian/main.js | 9471 ++++++++++++++++--------- .obsidian/plugins/claudian/styles.css | 910 ++- 3 files changed, 7002 insertions(+), 3382 deletions(-) diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index 67cd5f5..c133227 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -15,11 +15,10 @@ "obsidian-git", "obsidian-excalidraw-plugin", "code-styler", - "note-buddy", "claudian", "calendar", "better-word-count", "table-editor-obsidian", "obsidian-advanced-uri", "advanced-canvas" -] +] \ No newline at end of file diff --git a/.obsidian/plugins/claudian/main.js b/.obsidian/plugins/claudian/main.js index 176acf2..a160cd1 100644 --- a/.obsidian/plugins/claudian/main.js +++ b/.obsidian/plugins/claudian/main.js @@ -3224,8 +3224,8 @@ var require_utils = __commonJS({ } return ind; } - function removeDotSegments(path10) { - let input = path10; + function removeDotSegments(path11) { + let input = path11; const output = []; let nextSlash = -1; let len = 0; @@ -3424,8 +3424,8 @@ var require_schemes = __commonJS({ wsComponent.secure = void 0; } if (wsComponent.resourceName) { - const [path10, query] = wsComponent.resourceName.split("?"); - wsComponent.path = path10 && path10 !== "/" ? path10 : void 0; + const [path11, query] = wsComponent.resourceName.split("?"); + wsComponent.path = path11 && path11 !== "/" ? path11 : void 0; wsComponent.query = query; wsComponent.resourceName = void 0; } @@ -12464,12 +12464,12 @@ var require_dist = __commonJS({ throw new Error(`Unknown format "${name}"`); return f3; }; - function addFormats(ajv, list, fs10, exportName) { + function addFormats(ajv, list, fs11, exportName) { var _a3; var _b; (_a3 = (_b = ajv.opts.code).formats) !== null && _a3 !== void 0 ? _a3 : _b.formats = (0, codegen_1._)`require("ajv-formats/dist/formats").${exportName}`; for (const f3 of list) - ajv.addFormat(f3, fs10[f3]); + ajv.addFormat(f3, fs11[f3]); } module2.exports = exports = formatsPlugin; Object.defineProperty(exports, "__esModule", { value: true }); @@ -12482,8 +12482,8 @@ var require_windows = __commonJS({ "node_modules/isexe/windows.js"(exports, module2) { module2.exports = isexe; isexe.sync = sync; - var fs10 = require("fs"); - function checkPathExt(path10, options) { + var fs11 = require("fs"); + function checkPathExt(path11, options) { var pathext = options.pathExt !== void 0 ? options.pathExt : process.env.PATHEXT; if (!pathext) { return true; @@ -12494,25 +12494,25 @@ var require_windows = __commonJS({ } for (var i2 = 0; i2 < pathext.length; i2++) { var p2 = pathext[i2].toLowerCase(); - if (p2 && path10.substr(-p2.length).toLowerCase() === p2) { + if (p2 && path11.substr(-p2.length).toLowerCase() === p2) { return true; } } return false; } - function checkStat(stat, path10, options) { + function checkStat(stat, path11, options) { if (!stat.isSymbolicLink() && !stat.isFile()) { return false; } - return checkPathExt(path10, options); + return checkPathExt(path11, options); } - function isexe(path10, options, cb) { - fs10.stat(path10, function(er, stat) { - cb(er, er ? false : checkStat(stat, path10, options)); + function isexe(path11, options, cb) { + fs11.stat(path11, function(er, stat) { + cb(er, er ? false : checkStat(stat, path11, options)); }); } - function sync(path10, options) { - return checkStat(fs10.statSync(path10), path10, options); + function sync(path11, options) { + return checkStat(fs11.statSync(path11), path11, options); } } }); @@ -12522,14 +12522,14 @@ var require_mode = __commonJS({ "node_modules/isexe/mode.js"(exports, module2) { module2.exports = isexe; isexe.sync = sync; - var fs10 = require("fs"); - function isexe(path10, options, cb) { - fs10.stat(path10, function(er, stat) { + var fs11 = require("fs"); + function isexe(path11, options, cb) { + fs11.stat(path11, function(er, stat) { cb(er, er ? false : checkStat(stat, options)); }); } - function sync(path10, options) { - return checkStat(fs10.statSync(path10), options); + function sync(path11, options) { + return checkStat(fs11.statSync(path11), options); } function checkStat(stat, options) { return stat.isFile() && checkMode(stat, options); @@ -12553,7 +12553,7 @@ var require_mode = __commonJS({ // node_modules/isexe/index.js var require_isexe = __commonJS({ "node_modules/isexe/index.js"(exports, module2) { - var fs10 = require("fs"); + var fs11 = require("fs"); var core; if (process.platform === "win32" || global.TESTING_WINDOWS) { core = require_windows(); @@ -12562,7 +12562,7 @@ var require_isexe = __commonJS({ } module2.exports = isexe; isexe.sync = sync; - function isexe(path10, options, cb) { + function isexe(path11, options, cb) { if (typeof options === "function") { cb = options; options = {}; @@ -12572,7 +12572,7 @@ var require_isexe = __commonJS({ throw new TypeError("callback not provided"); } return new Promise(function(resolve4, reject) { - isexe(path10, options || {}, function(er, is) { + isexe(path11, options || {}, function(er, is) { if (er) { reject(er); } else { @@ -12581,7 +12581,7 @@ var require_isexe = __commonJS({ }); }); } - core(path10, options || {}, function(er, is) { + core(path11, options || {}, function(er, is) { if (er) { if (er.code === "EACCES" || options && options.ignoreErrors) { er = null; @@ -12591,9 +12591,9 @@ var require_isexe = __commonJS({ cb(er, is); }); } - function sync(path10, options) { + function sync(path11, options) { try { - return core.sync(path10, options || {}); + return core.sync(path11, options || {}); } catch (er) { if (options && options.ignoreErrors || er.code === "EACCES") { return false; @@ -12609,7 +12609,7 @@ var require_isexe = __commonJS({ var require_which = __commonJS({ "node_modules/which/which.js"(exports, module2) { var isWindows2 = process.platform === "win32" || process.env.OSTYPE === "cygwin" || process.env.OSTYPE === "msys"; - var path10 = require("path"); + var path11 = require("path"); var COLON = isWindows2 ? ";" : ":"; var isexe = require_isexe(); var getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: "ENOENT" }); @@ -12647,7 +12647,7 @@ var require_which = __commonJS({ return opt.all && found.length ? resolve4(found) : reject(getNotFoundError(cmd)); const ppRaw = pathEnv[i2]; const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw; - const pCmd = path10.join(pathPart, cmd); + const pCmd = path11.join(pathPart, cmd); const p2 = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd; resolve4(subStep(p2, i2, 0)); }); @@ -12674,7 +12674,7 @@ var require_which = __commonJS({ for (let i2 = 0; i2 < pathEnv.length; i2++) { const ppRaw = pathEnv[i2]; const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw; - const pCmd = path10.join(pathPart, cmd); + const pCmd = path11.join(pathPart, cmd); const p2 = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd; for (let j3 = 0; j3 < pathExt.length; j3++) { const cur = p2 + pathExt[j3]; @@ -12722,7 +12722,7 @@ var require_path_key = __commonJS({ var require_resolveCommand = __commonJS({ "node_modules/cross-spawn/lib/util/resolveCommand.js"(exports, module2) { "use strict"; - var path10 = require("path"); + var path11 = require("path"); var which = require_which(); var getPathKey = require_path_key(); function resolveCommandAttempt(parsed, withoutPathExt) { @@ -12740,7 +12740,7 @@ var require_resolveCommand = __commonJS({ try { resolved = which.sync(parsed.command, { path: env[getPathKey({ env })], - pathExt: withoutPathExt ? path10.delimiter : void 0 + pathExt: withoutPathExt ? path11.delimiter : void 0 }); } catch (e2) { } finally { @@ -12749,7 +12749,7 @@ var require_resolveCommand = __commonJS({ } } if (resolved) { - resolved = path10.resolve(hasCustomCwd ? parsed.options.cwd : "", resolved); + resolved = path11.resolve(hasCustomCwd ? parsed.options.cwd : "", resolved); } return resolved; } @@ -12803,8 +12803,8 @@ var require_shebang_command = __commonJS({ if (!match) { return null; } - const [path10, argument] = match[0].replace(/#! ?/, "").split(" "); - const binary = path10.split("/").pop(); + const [path11, argument] = match[0].replace(/#! ?/, "").split(" "); + const binary = path11.split("/").pop(); if (binary === "env") { return argument; } @@ -12817,16 +12817,16 @@ var require_shebang_command = __commonJS({ var require_readShebang = __commonJS({ "node_modules/cross-spawn/lib/util/readShebang.js"(exports, module2) { "use strict"; - var fs10 = require("fs"); + var fs11 = require("fs"); var shebangCommand = require_shebang_command(); function readShebang(command) { const size = 150; const buffer = Buffer.alloc(size); let fd; try { - fd = fs10.openSync(command, "r"); - fs10.readSync(fd, buffer, 0, size, 0); - fs10.closeSync(fd); + fd = fs11.openSync(command, "r"); + fs11.readSync(fd, buffer, 0, size, 0); + fs11.closeSync(fd); } catch (e2) { } return shebangCommand(buffer.toString()); @@ -12839,7 +12839,7 @@ var require_readShebang = __commonJS({ var require_parse = __commonJS({ "node_modules/cross-spawn/lib/parse.js"(exports, module2) { "use strict"; - var path10 = require("path"); + var path11 = require("path"); var resolveCommand = require_resolveCommand(); var escape2 = require_escape(); var readShebang = require_readShebang(); @@ -12864,7 +12864,7 @@ var require_parse = __commonJS({ const needsShell = !isExecutableRegExp.test(commandFile); if (parsed.options.forceShell || needsShell) { const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile); - parsed.command = path10.normalize(parsed.command); + parsed.command = path11.normalize(parsed.command); parsed.command = escape2.command(parsed.command); parsed.args = parsed.args.map((arg) => escape2.argument(arg, needsDoubleEscapeMetaChars)); const shellCommand = [parsed.command].concat(parsed.args).join(" "); @@ -12980,7 +12980,7 @@ __export(main_exports, { default: () => ClaudianPlugin }); module.exports = __toCommonJS(main_exports); -var import_obsidian30 = require("obsidian"); +var import_obsidian34 = require("obsidian"); // src/core/agents/AgentManager.ts var fs3 = __toESM(require("fs")); @@ -13046,6 +13046,9 @@ function parseFrontmatter(content) { function extractString(fm, key) { const val = fm[key]; if (typeof val === "string" && val.length > 0) return val; + if (Array.isArray(val) && val.length > 0 && val.every((v3) => typeof v3 === "string")) { + return val.map((v3) => `[${v3}]`).join(" "); + } return void 0; } function normalizeStringArray(val) { @@ -13228,6 +13231,8 @@ var DEFAULT_SETTINGS = { // Hidden by default enableChrome: false, // Disabled by default + enableBangBash: false, + // Disabled by default // Content settings excludedTags: [], mediaFolder: "", @@ -14234,9 +14239,18 @@ var AgentManager = class { async loadAgents() { this.agents = []; this.agents.push(...this.builtinAgentNames.map(makeBuiltinAgent)); - await this.loadPluginAgents(); - await this.loadVaultAgents(); - await this.loadGlobalAgents(); + try { + await this.loadPluginAgents(); + } catch (e2) { + } + try { + await this.loadVaultAgents(); + } catch (e2) { + } + try { + await this.loadGlobalAgents(); + } catch (e2) { + } } getAvailableAgents() { return [...this.agents]; @@ -14844,8 +14858,8 @@ function getErrorMap() { // node_modules/zod/v3/helpers/parseUtil.js var makeIssue = (params) => { - const { data, path: path10, errorMaps, issueData } = params; - const fullPath = [...path10, ...issueData.path || []]; + const { data, path: path11, errorMaps, issueData } = params; + const fullPath = [...path11, ...issueData.path || []]; const fullIssue = { ...issueData, path: fullPath @@ -14960,11 +14974,11 @@ var errorUtil; // node_modules/zod/v3/types.js var ParseInputLazyPath = class { - constructor(parent, value, path10, key) { + constructor(parent, value, path11, key) { this._cachedPath = []; this.parent = parent; this.data = value; - this._path = path10; + this._path = path11; this._key = key; } get path() { @@ -18897,15 +18911,15 @@ function mergeDefs(...defs) { function cloneDef(schema) { return mergeDefs(schema._zod.def); } -function getElementAtPath(obj, path10) { - if (!path10) +function getElementAtPath(obj, path11) { + if (!path11) return obj; - return path10.reduce((acc, key) => acc == null ? void 0 : acc[key], obj); + return path11.reduce((acc, key) => acc == null ? void 0 : acc[key], obj); } function promiseAllObject(promisesObj) { const keys = Object.keys(promisesObj); - const promises = keys.map((key) => promisesObj[key]); - return Promise.all(promises).then((results) => { + const promises2 = keys.map((key) => promisesObj[key]); + return Promise.all(promises2).then((results) => { const resolvedObj = {}; for (let i2 = 0; i2 < keys.length; i2++) { resolvedObj[keys[i2]] = results[i2]; @@ -19285,12 +19299,12 @@ function aborted(x3, startIndex = 0) { } return false; } -function prefixIssues(path10, issues) { +function prefixIssues(path11, issues) { return issues.map((iss) => { var _a4; var _a3; (_a4 = (_a3 = iss).path) != null ? _a4 : _a3.path = []; - iss.path.unshift(path10); + iss.path.unshift(path11); return iss; }); } @@ -19474,7 +19488,7 @@ function formatError(error48, mapper = (issue2) => issue2.message) { } function treeifyError(error48, mapper = (issue2) => issue2.message) { const result = { errors: [] }; - const processError = (error49, path10 = []) => { + const processError = (error49, path11 = []) => { var _a4, _b2, _c, _d; var _a3, _b; for (const issue2 of error49.issues) { @@ -19485,7 +19499,7 @@ function treeifyError(error48, mapper = (issue2) => issue2.message) { } else if (issue2.code === "invalid_element") { processError({ issues: issue2.issues }, issue2.path); } else { - const fullpath = [...path10, ...issue2.path]; + const fullpath = [...path11, ...issue2.path]; if (fullpath.length === 0) { result.errors.push(mapper(issue2)); continue; @@ -19517,8 +19531,8 @@ function treeifyError(error48, mapper = (issue2) => issue2.message) { } function toDotPath(_path) { const segs = []; - const path10 = _path.map((seg) => typeof seg === "object" ? seg.key : seg); - for (const seg of path10) { + const path11 = _path.map((seg) => typeof seg === "object" ? seg.key : seg); + for (const seg of path11) { if (typeof seg === "number") segs.push(`[${seg}]`); else if (typeof seg === "symbol") @@ -37439,8 +37453,13 @@ function parseSlashCommandContent(content) { hooks: isRecord(fm.hooks) ? fm.hooks : void 0 }; } +function normalizeArgumentHint(hint) { + if (!hint) return hint; + if (hint.includes("[") || hint.includes("<")) return hint; + return `[${hint}]`; +} function yamlString(value) { - if (value.includes(":") || value.includes("#") || value.includes("\n") || value.startsWith(" ") || value.endsWith(" ")) { + if (value.includes(":") || value.includes("#") || value.includes("\n") || value.startsWith(" ") || value.endsWith(" ") || value.startsWith("[") || value.startsWith("{")) { return `"${value.replace(/"/g, '\\"')}"`; } return value; @@ -38409,7 +38428,9 @@ var SessionStorage = class { enabledMcpServers: conversation.enabledMcpServers, usage: conversation.usage, legacyCutoffAt: conversation.legacyCutoffAt, - subagentData: Object.keys(subagentData).length > 0 ? subagentData : void 0 + subagentData: Object.keys(subagentData).length > 0 ? subagentData : void 0, + resumeSessionAt: conversation.resumeSessionAt, + forkSource: conversation.forkSource }; } /** @@ -38436,21 +38457,25 @@ var SkillStorage = class { } async loadAll() { const skills = []; - const folders = await this.adapter.listFolders(SKILLS_PATH); - for (const folder of folders) { - const skillName = folder.split("/").pop(); - const skillPath = `${SKILLS_PATH}/${skillName}/SKILL.md`; - try { - if (!await this.adapter.exists(skillPath)) continue; - const content = await this.adapter.read(skillPath); - const parsed = parseSlashCommandContent(content); - skills.push(parsedToSlashCommand(parsed, { - id: `skill-${skillName}`, - name: skillName, - source: "user" - })); - } catch (e2) { + try { + const folders = await this.adapter.listFolders(SKILLS_PATH); + for (const folder of folders) { + const skillName = folder.split("/").pop(); + const skillPath = `${SKILLS_PATH}/${skillName}/SKILL.md`; + try { + if (!await this.adapter.exists(skillPath)) continue; + const content = await this.adapter.read(skillPath); + const parsed = parseSlashCommandContent(content); + skills.push(parsedToSlashCommand(parsed, { + id: `skill-${skillName}`, + name: skillName, + source: "user" + })); + } catch (e2) { + } } + } catch (e2) { + return []; } return skills; } @@ -38495,12 +38520,8 @@ var SlashCommandStorage = class { return commands; } async loadFromFile(filePath) { - try { - const content = await this.adapter.read(filePath); - return this.parseFile(content, filePath); - } catch (e2) { - return null; - } + const content = await this.adapter.read(filePath); + return this.parseFile(content, filePath); } async save(command) { const filePath = this.getFilePath(command); @@ -38543,35 +38564,35 @@ var VaultFileAdapter = class { constructor(app) { this.app = app; } - async exists(path10) { - return this.app.vault.adapter.exists(path10); + async exists(path11) { + return this.app.vault.adapter.exists(path11); } - async read(path10) { - return this.app.vault.adapter.read(path10); + async read(path11) { + return this.app.vault.adapter.read(path11); } - async write(path10, content) { - await this.ensureParentFolder(path10); - await this.app.vault.adapter.write(path10, content); + async write(path11, content) { + await this.ensureParentFolder(path11); + await this.app.vault.adapter.write(path11, content); } - async append(path10, content) { - await this.ensureParentFolder(path10); - if (await this.exists(path10)) { - const existing = await this.read(path10); - await this.app.vault.adapter.write(path10, existing + content); + async append(path11, content) { + await this.ensureParentFolder(path11); + if (await this.exists(path11)) { + const existing = await this.read(path11); + await this.app.vault.adapter.write(path11, existing + content); } else { - await this.app.vault.adapter.write(path10, content); + await this.app.vault.adapter.write(path11, content); } } - async delete(path10) { - if (await this.exists(path10)) { - await this.app.vault.adapter.remove(path10); + async delete(path11) { + if (await this.exists(path11)) { + await this.app.vault.adapter.remove(path11); } } /** Fails silently if non-empty or missing. */ - async deleteFolder(path10) { + async deleteFolder(path11) { try { - if (await this.exists(path10)) { - await this.app.vault.adapter.rmdir(path10, false); + if (await this.exists(path11)) { + await this.app.vault.adapter.rmdir(path11, false); } } catch (e2) { } @@ -38612,9 +38633,9 @@ var VaultFileAdapter = class { } } /** Ensure a folder exists, creating it and parent folders if needed. */ - async ensureFolder(path10) { - if (await this.exists(path10)) return; - const parts = path10.split("/").filter(Boolean); + async ensureFolder(path11) { + if (await this.exists(path11)) return; + const parts = path11.split("/").filter(Boolean); let current = ""; for (const part of parts) { current = current ? `${current}/${part}` : part; @@ -38627,9 +38648,9 @@ var VaultFileAdapter = class { async rename(oldPath, newPath) { await this.app.vault.adapter.rename(oldPath, newPath); } - async stat(path10) { + async stat(path11) { try { - const stat = await this.app.vault.adapter.stat(path10); + const stat = await this.app.vault.adapter.stat(path11); if (!stat) return null; return { mtime: stat.mtime, size: stat.size }; } catch (e2) { @@ -38963,7 +38984,7 @@ var StorageService = class { }; // src/features/chat/ClaudianView.ts -var import_obsidian19 = require("obsidian"); +var import_obsidian24 = require("obsidian"); // src/features/chat/constants.ts var LOGO_SVG = { @@ -39084,6 +39105,9 @@ var FLAVOR_TEXTS = [ "Give me a moment..." ]; +// src/features/chat/tabs/Tab.ts +var import_obsidian21 = require("obsidian"); + // node_modules/@anthropic-ai/claude-agent-sdk/sdk.mjs var import_path2 = require("path"); var import_url = require("url"); @@ -47932,6 +47956,12 @@ function u_({ prompt: X, options: Q }) { return z7; } +// src/core/agent/ClaudianService.ts +var import_crypto4 = require("crypto"); +var fs5 = __toESM(require("fs")); +var os5 = __toESM(require("os")); +var path6 = __toESM(require("path")); + // src/utils/context.ts var CURRENT_NOTE_PREFIX_REGEX = /^\n[\s\S]*?<\/current_note>\n\n/; var CURRENT_NOTE_SUFFIX_REGEX = /\n\n\n[\s\S]*?<\/current_note>$/; @@ -48370,6 +48400,7 @@ function isCommandBlocked(command, patterns, enableBlocklist) { // src/core/tools/toolNames.ts var TOOL_AGENT_OUTPUT = "TaskOutput"; +var TOOL_ASK_USER_QUESTION = "AskUserQuestion"; var TOOL_BASH = "Bash"; var TOOL_BASH_OUTPUT = "BashOutput"; var TOOL_EDIT = "Edit"; @@ -48388,6 +48419,16 @@ var TOOL_TODO_WRITE = "TodoWrite"; var TOOL_WEB_FETCH = "WebFetch"; var TOOL_WEB_SEARCH = "WebSearch"; var TOOL_WRITE = "Write"; +var TOOL_ENTER_PLAN_MODE = "EnterPlanMode"; +var TOOL_EXIT_PLAN_MODE = "ExitPlanMode"; +var TOOLS_SKIP_BLOCKED_DETECTION = [ + TOOL_ENTER_PLAN_MODE, + TOOL_EXIT_PLAN_MODE, + TOOL_ASK_USER_QUESTION +]; +function skipsBlockedDetection(name) { + return TOOLS_SKIP_BLOCKED_DETECTION.includes(name); +} var EDIT_TOOLS = [TOOL_WRITE, TOOL_EDIT, TOOL_NOTEBOOK_EDIT]; var WRITE_EDIT_TOOLS = [TOOL_WRITE, TOOL_EDIT]; var FILE_TOOLS = [ @@ -48422,6 +48463,12 @@ function isReadOnlyTool(toolName) { } // src/core/tools/toolInput.ts +function extractResolvedAnswers(toolUseResult) { + if (typeof toolUseResult !== "object" || toolUseResult === null) return void 0; + const r2 = toolUseResult; + if (!r2.answers || typeof r2.answers !== "object") return void 0; + return r2.answers; +} function getPathFromToolInput(toolName, toolInput) { switch (toolName) { case TOOL_READ: @@ -48540,7 +48587,8 @@ function* transformSDKMessage(message, options) { yield { type: "session_init", sessionId: message.session_id, - agents: message.agents + agents: message.agents, + permissionMode: message.permissionMode }; } else if (message.subtype === "compact_boundary") { yield { type: "compact_boundary" }; @@ -48551,7 +48599,7 @@ function* transformSDKMessage(message, options) { for (const block of message.message.content) { if (block.type === "thinking" && block.thinking) { yield { type: "thinking", content: block.thinking, parentToolUseId }; - } else if (block.type === "text" && block.text) { + } else if (block.type === "text" && block.text && block.text.trim() !== "(no content)") { yield { type: "text", content: block.text, parentToolUseId }; } else if (block.type === "tool_use") { yield { @@ -48768,11 +48816,7 @@ function createResponseHandler(options) { } }; } -var UNSUPPORTED_SDK_TOOLS = [ - "AskUserQuestion", - "EnterPlanMode", - "ExitPlanMode" -]; +var UNSUPPORTED_SDK_TOOLS = []; var DISABLED_BUILTIN_SUBAGENTS = [ "Task(statusline-setup)" ]; @@ -49362,8 +49406,15 @@ var QueryOptionsBuilder = class _QueryOptionsBuilder { _QueryOptionsBuilder.applyPermissionMode(options, permissionMode, ctx.canUseTool); _QueryOptionsBuilder.applyThinkingBudget(options, ctx.settings.thinkingBudget); options.hooks = ctx.hooks; - if (ctx.resumeSessionId) { - options.resume = ctx.resumeSessionId; + options.enableFileCheckpointing = true; + if (ctx.resume) { + options.resume = ctx.resume.sessionId; + if (ctx.resume.sessionAt) { + options.resumeSessionAt = ctx.resume.sessionAt; + } + if (ctx.resume.fork) { + options.forkSession = true; + } } if (ctx.externalContextPaths && ctx.externalContextPaths.length > 0) { options.additionalDirectories = ctx.externalContextPaths; @@ -49437,13 +49488,15 @@ var QueryOptionsBuilder = class _QueryOptionsBuilder { */ static applyPermissionMode(options, permissionMode, canUseTool) { options.allowDangerouslySkipPermissions = true; + if (canUseTool) { + options.canUseTool = canUseTool; + } if (permissionMode === "yolo") { options.permissionMode = "bypassPermissions"; + } else if (permissionMode === "plan") { + options.permissionMode = "plan"; } else { options.permissionMode = "acceptEdits"; - if (canUseTool) { - options.canUseTool = canUseTool; - } } } static applyExtraArgs(options, settings11) { @@ -49551,6 +49604,9 @@ var ClaudianService = class { this.abortController = null; this.approvalCallback = null; this.approvalDismisser = null; + this.askUserQuestionCallback = null; + this.exitPlanModeCallback = null; + this.permissionModeSyncCallback = null; this.vaultPath = null; this.currentExternalContextPaths = []; this.readyStateListeners = /* @__PURE__ */ new Set(); @@ -49566,6 +49622,7 @@ var ClaudianService = class { this.currentConfig = null; // Current allowed tools for canUseTool enforcement (null = no restriction) this.currentAllowedTools = null; + this.pendingForkSession = false; // Last sent message for crash recovery (Phase 1.3) this.lastSentMessage = null; this.lastSentQueryOptions = null; @@ -49596,6 +49653,21 @@ var ClaudianService = class { } } } + setPendingResumeAt(uuid3) { + this.pendingResumeAt = uuid3; + } + /** One-shot: consumed on the next query, then cleared by routeMessage on session init. */ + applyForkState(conv) { + var _a3, _b, _c; + const isPending = !conv.sessionId && !conv.sdkSessionId && !!conv.forkSource; + this.pendingForkSession = isPending; + if (isPending) { + this.pendingResumeAt = conv.forkSource.resumeAt; + } else { + this.pendingResumeAt = void 0; + } + return (_c = (_b = conv.sessionId) != null ? _b : (_a3 = conv.forkSource) == null ? void 0 : _a3.sessionId) != null ? _c : null; + } async reloadMcpServers() { await this.mcpManager.loadServers(); } @@ -49669,16 +49741,21 @@ var ClaudianService = class { this.queryAbortController = new AbortController(); const config2 = this.buildPersistentQueryConfig(vaultPath, cliPath, externalContextPaths); this.currentConfig = config2; + const resumeSessionAt = this.pendingResumeAt; const options = await this.buildPersistentQueryOptions( vaultPath, cliPath, resumeSessionId, + resumeSessionAt, externalContextPaths ); this.persistentQuery = u_({ prompt: this.messageChannel, options }); + if (this.pendingResumeAt === resumeSessionAt) { + this.pendingResumeAt = void 0; + } this.attachPersistentQueryStdinErrorHandler(this.persistentQuery); this.startResponseConsumer(); this.notifyReadyStateChange(); @@ -49770,16 +49847,15 @@ var ClaudianService = class { /** * Builds SDK options for the persistent query. */ - buildPersistentQueryOptions(vaultPath, cliPath, resumeSessionId, externalContextPaths) { + buildPersistentQueryOptions(vaultPath, cliPath, resumeSessionId, resumeSessionAt, externalContextPaths) { var _a3; const baseContext = this.buildQueryOptionsContext(vaultPath, cliPath); const hooks = this.buildHooks(); - const permissionMode = this.plugin.settings.permissionMode; const ctx = { ...baseContext, abortController: (_a3 = this.queryAbortController) != null ? _a3 : void 0, - resumeSessionId, - canUseTool: permissionMode !== "yolo" ? this.createApprovalCallback() : void 0, + resume: resumeSessionId ? { sessionId: resumeSessionId, sessionAt: resumeSessionAt, fork: this.pendingForkSession || void 0 } : void 0, + canUseTool: this.createApprovalCallback(), hooks, externalContextPaths }; @@ -49903,7 +49979,12 @@ var ClaudianService = class { } for (const event of transformSDKMessage(message, this.getTransformOptions())) { if (isSessionInitEvent(event)) { + const wasFork = this.pendingForkSession; this.sessionManager.captureSession(event.sessionId); + if (wasFork) { + this.sessionManager.clearHistoryRebuild(); + this.pendingForkSession = false; + } (_a3 = this.messageChannel) == null ? void 0 : _a3.setSessionId(event.sessionId); if (event.agents) { try { @@ -49911,10 +49992,27 @@ var ClaudianService = class { } catch (e2) { } } + if (event.permissionMode && this.permissionModeSyncCallback) { + try { + this.permissionModeSyncCallback(event.permissionMode); + } catch (e2) { + } + } } else if (isStreamChunk(event)) { if (message.type === "assistant" && (handler == null ? void 0 : handler.sawStreamText) && event.type === "text") { continue; } + if (event.type === "tool_use" && event.name === TOOL_ENTER_PLAN_MODE) { + if (this.currentConfig) { + this.currentConfig.permissionMode = "plan"; + } + if (this.permissionModeSyncCallback) { + try { + this.permissionModeSyncCallback("plan"); + } catch (e2) { + } + } + } if (handler) { if (event.type === "usage") { handler.onChunk({ ...event, sessionId: this.sessionManager.getSessionId() }); @@ -49924,6 +50022,9 @@ var ClaudianService = class { } } } + if (message.type === "assistant" && message.uuid && handler) { + handler.onChunk({ type: "sdk_assistant_uuid", uuid: message.uuid }); + } if (isTurnCompleteMessage(message)) { (_b = this.messageChannel) == null ? void 0 : _b.onTurnComplete(); if (handler) { @@ -50100,6 +50201,7 @@ var ClaudianService = class { return; } const message = this.buildSDKUserMessage(prompt, images); + yield { type: "sdk_user_uuid", uuid: message.uuid }; const state = { chunks: [], resolveChunk: null, @@ -50148,6 +50250,7 @@ var ClaudianService = class { } throw error48; } + yield { type: "sdk_user_sent", uuid: message.uuid }; while (!state.done) { if (state.chunks.length > 0) { yield state.chunks.shift(); @@ -50187,7 +50290,8 @@ var ClaudianService = class { content: prompt }, parent_tool_use_id: null, - session_id: sessionId + session_id: sessionId, + uuid: (0, import_crypto4.randomUUID)() }; } const content = []; @@ -50214,7 +50318,8 @@ var ClaudianService = class { content }, parent_tool_use_id: null, - session_id: sessionId + session_id: sessionId, + uuid: (0, import_crypto4.randomUUID)() }; } /** @@ -50255,7 +50360,7 @@ var ClaudianService = class { } } if (this.currentConfig && permissionMode !== this.currentConfig.permissionMode) { - const sdkMode = permissionMode === "yolo" ? "bypassPermissions" : "acceptEdits"; + const sdkMode = this.mapToSDKPermissionMode(permissionMode); try { await this.persistentQuery.setPermissionMode(sdkMode); this.currentConfig.permissionMode = permissionMode; @@ -50344,7 +50449,6 @@ var ClaudianService = class { async *queryViaSDK(prompt, cwd, cliPath, images, queryOptions) { var _a3, _b, _c; const selectedModel = (queryOptions == null ? void 0 : queryOptions.model) || this.plugin.settings.model; - const permissionMode = this.plugin.settings.permissionMode; this.sessionManager.setPendingModel(selectedModel); this.vaultPath = cwd; const queryPrompt = this.buildPromptWithImages(prompt, images); @@ -50362,7 +50466,7 @@ var ClaudianService = class { abortController: (_a3 = this.abortController) != null ? _a3 : void 0, sessionId: (_b = this.sessionManager.getSessionId()) != null ? _b : void 0, modelOverride: queryOptions == null ? void 0 : queryOptions.model, - canUseTool: permissionMode !== "yolo" ? this.createApprovalCallback() : void 0, + canUseTool: this.createApprovalCallback(), hooks, mcpMentions: queryOptions == null ? void 0 : queryOptions.mcpMentions, enabledMcpServers: queryOptions == null ? void 0 : queryOptions.enabledMcpServers, @@ -50502,12 +50606,159 @@ var ClaudianService = class { this.cancel(); this.resetSession(); } + async rewindFiles(sdkUserUuid, dryRun) { + if (!this.persistentQuery) throw new Error("No active query"); + if (this.shuttingDown) throw new Error("Service is shutting down"); + return this.persistentQuery.rewindFiles(sdkUserUuid, { dryRun }); + } + resolveRewindFilePath(filePath) { + if (path6.isAbsolute(filePath)) { + return filePath; + } + if (this.vaultPath) { + return path6.join(this.vaultPath, filePath); + } + return filePath; + } + async createRewindBackup(filesChanged) { + if (!filesChanged || filesChanged.length === 0) { + return null; + } + const backupRoot = await fs5.promises.mkdtemp(path6.join(os5.tmpdir(), "claudian-rewind-")); + const entries = []; + const copyDir = async (from, to) => { + await fs5.promises.mkdir(to, { recursive: true }); + const dirents = await fs5.promises.readdir(from, { withFileTypes: true }); + for (const dirent of dirents) { + const srcPath = path6.join(from, dirent.name); + const destPath = path6.join(to, dirent.name); + if (dirent.isDirectory()) { + await copyDir(srcPath, destPath); + continue; + } + if (dirent.isSymbolicLink()) { + const target = await fs5.promises.readlink(srcPath); + await fs5.promises.symlink(target, destPath); + continue; + } + if (dirent.isFile()) { + await fs5.promises.copyFile(srcPath, destPath); + } + } + }; + const backupPathForIndex = (i2) => path6.join(backupRoot, String(i2)); + for (let i2 = 0; i2 < filesChanged.length; i2++) { + const originalPath = this.resolveRewindFilePath(filesChanged[i2]); + try { + const stats = await fs5.promises.lstat(originalPath); + if (stats.isSymbolicLink()) { + const target = await fs5.promises.readlink(originalPath); + entries.push({ originalPath, existedBefore: true, kind: "symlink", symlinkTarget: target }); + continue; + } + const backupPath = backupPathForIndex(i2); + if (stats.isDirectory()) { + await copyDir(originalPath, backupPath); + entries.push({ originalPath, existedBefore: true, kind: "dir", backupPath }); + continue; + } + if (stats.isFile()) { + await fs5.promises.copyFile(originalPath, backupPath); + entries.push({ originalPath, existedBefore: true, kind: "file", backupPath }); + continue; + } + entries.push({ originalPath, existedBefore: false }); + } catch (error48) { + const err = error48; + if (err && err.code === "ENOENT") { + entries.push({ originalPath, existedBefore: false }); + continue; + } + await fs5.promises.rm(backupRoot, { recursive: true, force: true }); + throw error48; + } + } + const restore = async () => { + const errors = []; + for (const entry of entries) { + try { + if (!entry.existedBefore) { + await fs5.promises.rm(entry.originalPath, { recursive: true, force: true }); + continue; + } + await fs5.promises.rm(entry.originalPath, { recursive: true, force: true }); + await fs5.promises.mkdir(path6.dirname(entry.originalPath), { recursive: true }); + if (entry.kind === "symlink") { + await fs5.promises.symlink(entry.symlinkTarget, entry.originalPath); + continue; + } + if (entry.kind === "dir") { + await copyDir(entry.backupPath, entry.originalPath); + continue; + } + await fs5.promises.copyFile(entry.backupPath, entry.originalPath); + } catch (error48) { + errors.push(error48); + } + } + if (errors.length > 0) { + throw new Error(`Failed to restore ${errors.length} file(s) after rewind failure.`); + } + }; + const cleanup = async () => { + await fs5.promises.rm(backupRoot, { recursive: true, force: true }); + }; + return { restore, cleanup }; + } + async rewind(sdkUserUuid, sdkAssistantUuid) { + const preview = await this.rewindFiles(sdkUserUuid, true); + if (!preview.canRewind) return preview; + const backup = await this.createRewindBackup(preview.filesChanged); + try { + const result = await this.rewindFiles(sdkUserUuid); + if (!result.canRewind) { + await (backup == null ? void 0 : backup.restore()); + this.closePersistentQuery("rewind failed"); + return result; + } + this.pendingResumeAt = sdkAssistantUuid; + this.closePersistentQuery("rewind"); + return { + ...result, + filesChanged: preview.filesChanged, + insertions: preview.insertions, + deletions: preview.deletions + }; + } catch (error48) { + try { + await (backup == null ? void 0 : backup.restore()); + } catch (rollbackError) { + this.closePersistentQuery("rewind failed"); + throw new Error( + `Rewind failed and files could not be fully restored: ${rollbackError instanceof Error ? rollbackError.message : "Unknown error"}` + ); + } + this.closePersistentQuery("rewind failed"); + throw new Error(`Rewind failed but files were restored: ${error48 instanceof Error ? error48.message : "Unknown error"}`); + } finally { + await (backup == null ? void 0 : backup.cleanup()); + } + } setApprovalCallback(callback) { this.approvalCallback = callback; } setApprovalDismisser(dismisser) { this.approvalDismisser = dismisser; } + setAskUserQuestionCallback(callback) { + this.askUserQuestionCallback = callback; + } + setExitPlanModeCallback(callback) { + this.exitPlanModeCallback = callback; + } + setPermissionModeSyncCallback(callback) { + this.permissionModeSyncCallback = callback; + } createApprovalCallback() { return async (toolName, input, options) => { if (this.currentAllowedTools !== null) { @@ -50519,6 +50770,49 @@ var ClaudianService = class { }; } } + if (toolName === TOOL_EXIT_PLAN_MODE && this.exitPlanModeCallback) { + try { + const decision = await this.exitPlanModeCallback(input, options.signal); + if (decision === null) { + return { behavior: "deny", message: "User cancelled.", interrupt: true }; + } + if (decision.type === "feedback") { + return { behavior: "deny", message: decision.text, interrupt: false }; + } + const sdkMode = this.mapToSDKPermissionMode(this.plugin.settings.permissionMode); + if (this.currentConfig) { + this.currentConfig.permissionMode = this.plugin.settings.permissionMode; + } + return { + behavior: "allow", + updatedInput: input, + updatedPermissions: [ + { type: "setMode", mode: sdkMode, destination: "session" } + ] + }; + } catch (error48) { + return { + behavior: "deny", + message: `Failed to handle plan mode exit: ${error48 instanceof Error ? error48.message : "Unknown error"}`, + interrupt: true + }; + } + } + if (toolName === TOOL_ASK_USER_QUESTION && this.askUserQuestionCallback) { + try { + const answers = await this.askUserQuestionCallback(input, options.signal); + if (answers === null) { + return { behavior: "deny", message: "User declined to answer.", interrupt: true }; + } + return { behavior: "allow", updatedInput: { ...input, answers } }; + } catch (error48) { + return { + behavior: "deny", + message: `Failed to get user answers: ${error48 instanceof Error ? error48.message : "Unknown error"}`, + interrupt: true + }; + } + } if (!this.approvalCallback) { return { behavior: "deny", message: "No approval handler available." }; } @@ -50553,8 +50847,3071 @@ var ClaudianService = class { } }; } + mapToSDKPermissionMode(mode) { + if (mode === "yolo") return "bypassPermissions"; + if (mode === "plan") return "plan"; + return "acceptEdits"; + } }; +// src/i18n/locales/de.json +var de_exports = {}; +__export(de_exports, { + chat: () => chat, + common: () => common, + default: () => de_default2, + settings: () => settings +}); +var common = { + save: "Speichern", + cancel: "Abbrechen", + delete: "L\xF6schen", + edit: "Bearbeiten", + add: "Hinzuf\xFCgen", + remove: "Entfernen", + clear: "L\xF6schen", + clearAll: "Alle l\xF6schen", + loading: "L\xE4dt", + error: "Fehler", + success: "Erfolg", + warning: "Warnung", + confirm: "Best\xE4tigen", + settings: "Einstellungen", + advanced: "Erweitert", + enabled: "Aktiviert", + disabled: "Deaktiviert", + platform: "Plattform", + rewind: "Zur\xFCckspulen" +}; +var chat = { + rewind: { + confirmMessage: "Zu diesem Punkt zur\xFCckspulen? Datei\xE4nderungen nach dieser Nachricht werden r\xFCckg\xE4ngig gemacht. Das Zur\xFCckspulen betrifft keine manuell oder \xFCber Bash bearbeiteten Dateien.", + confirmButton: "Zur\xFCckspulen", + ariaLabel: "Hierher zur\xFCckspulen", + notice: "Zur\xFCckgespult: {count} Datei(en) wiederhergestellt", + noticeSaveFailed: "Zur\xFCckgespult: {count} Datei(en) wiederhergestellt, aber Status konnte nicht gespeichert werden: {error}", + failed: "Zur\xFCckspulen fehlgeschlagen: {error}", + cannot: "Zur\xFCckspulen nicht m\xF6glich: {error}", + unavailableStreaming: "Zur\xFCckspulen w\xE4hrend des Streamings nicht m\xF6glich", + unavailableNoUuid: "Zur\xFCckspulen nicht m\xF6glich: Nachrichtenkennungen fehlen" + }, + fork: { + ariaLabel: "Konversation verzweigen", + chooseTarget: "Konversation verzweigen", + targetNewTab: "Neuer Tab", + targetCurrentTab: "Aktueller Tab", + maxTabsReached: "Verzweigung nicht m\xF6glich: maximal {count} Tabs erreicht", + notice: "In neuem Tab verzweigt", + noticeCurrentTab: "Im aktuellen Tab verzweigt", + failed: "Verzweigung fehlgeschlagen: {error}", + unavailableStreaming: "Verzweigung w\xE4hrend des Streamings nicht m\xF6glich", + unavailableNoUuid: "Verzweigung nicht m\xF6glich: Nachrichtenkennungen fehlen", + unavailableNoResponse: "Verzweigung nicht m\xF6glich: keine Antwort zum Verzweigen vorhanden", + errorMessageNotFound: "Message not found", + errorNoSession: "No session ID available", + errorNoActiveTab: "No active tab", + commandNoMessages: "Verzweigung nicht m\xF6glich: keine Nachrichten in der Konversation", + commandNoAssistantUuid: "Verzweigung nicht m\xF6glich: keine Assistentenantwort mit Kennungen" + }, + bangBash: { + placeholder: "> Run a bash command...", + commandPanel: "Command panel", + copyAriaLabel: "Copy latest command output", + clearAriaLabel: "Clear bash output", + commandLabel: "{command}", + statusLabel: "Status: {status}", + collapseOutput: "Collapse command output", + expandOutput: "Expand command output", + running: "Running...", + copyFailed: "Failed to copy to clipboard" + } +}; +var settings = { + title: "Claudian Einstellungen", + customization: "Anpassung", + userName: { + name: "Wie soll Claudian dich nennen?", + desc: "Dein Name f\xFCr personalisierte Begr\xFC\xDFungen (leer lassen f\xFCr allgemeine Begr\xFC\xDFungen)" + }, + excludedTags: { + name: "Ausgeschlossene Tags", + desc: "Notizen mit diesen Tags werden nicht automatisch als Kontext geladen (einer pro Zeile, ohne #)" + }, + mediaFolder: { + name: "Medienordner", + desc: "Ordner mit Anh\xE4ngen/Bildern. Wenn Notizen ![[image.jpg]] verwenden, sucht Claude hier. Leer lassen f\xFCr Vault-Stammverzeichnis." + }, + systemPrompt: { + name: "Benutzerdefinierter System-Prompt", + desc: "Zus\xE4tzliche Anweisungen, die an den Standard-System-Prompt angeh\xE4ngt werden" + }, + autoTitle: { + name: "Konversationstitel automatisch generieren", + desc: "Generiert automatisch Konversationstitel nach der ersten Nutzernachricht." + }, + titleModel: { + name: "Titel-Generierungsmodell", + desc: "Modell zur automatischen Generierung von Konversationstiteln.", + auto: "Automatisch (Haiku)" + }, + navMappings: { + name: "Vim-Style Navigationszuordnungen", + desc: 'Eine Zuordnung pro Zeile. Format: "map " (Aktionen: scrollUp, scrollDown, focusInput).' + }, + hotkeys: "Tastenk\xFCrzel", + inlineEditHotkey: { + name: "Inline-Bearbeitung", + descWithKey: "Aktuelles Tastenk\xFCrzel: {hotkey}", + descNoKey: "Kein Tastenk\xFCrzel festgelegt", + btnChange: "\xC4ndern", + btnSet: "Festlegen" + }, + openChatHotkey: { + name: "Chat \xF6ffnen", + descWithKey: "Aktuelles Tastenk\xFCrzel: {hotkey}", + descNoKey: "Kein Tastenk\xFCrzel festgelegt", + btnChange: "\xC4ndern", + btnSet: "Festlegen" + }, + newSessionHotkey: { + name: "Neue Sitzung", + descWithKey: "Aktuelles Tastenk\xFCrzel: {hotkey}", + descNoKey: "Kein Tastenk\xFCrzel festgelegt", + btnChange: "\xC4ndern", + btnSet: "Festlegen" + }, + newTabHotkey: { + name: "Neuer Tab", + descWithKey: "Aktuelles Tastenk\xFCrzel: {hotkey}", + descNoKey: "Kein Tastenk\xFCrzel festgelegt", + btnChange: "\xC4ndern", + btnSet: "Festlegen" + }, + closeTabHotkey: { + name: "Tab schlie\xDFen", + descWithKey: "Aktuelles Tastenk\xFCrzel: {hotkey}", + descNoKey: "Kein Tastenk\xFCrzel festgelegt", + btnChange: "\xC4ndern", + btnSet: "Festlegen" + }, + slashCommands: { + name: "Befehle und F\xE4higkeiten", + desc: "Definiere benutzerdefinierte Befehle und F\xE4higkeiten, die durch /Name ausgel\xF6st werden." + }, + hiddenSlashCommands: { + name: "Ausgeblendete Befehle", + desc: "Bestimmte Schr\xE4gstrich-Befehle aus dem Dropdown ausblenden. N\xFCtzlich, um Claude Code-Befehle auszublenden, die f\xFCr Claudian nicht relevant sind. Gib Befehlsnamen ohne f\xFChrenden Schr\xE4gstrich ein, einen pro Zeile.", + placeholder: "commit\nbuild\ntest" + }, + mcpServers: { + name: "MCP-Server", + desc: "Konfiguriere Model Context Protocol Server, um Claude mit externen Tools und Datenquellen zu erweitern. Server mit Kontext-Speichermodus ben\xF6tigen @mention zur Aktivierung." + }, + plugins: { + name: "Claude Code Plugins", + desc: "Aktiviere oder deaktiviere Claude Code Plugins aus ~/.claude/plugins. Aktivierte Plugins werden pro Vault gespeichert." + }, + subagents: { + name: "Subagents", + desc: "Configure custom subagents that Claude can delegate to.", + noAgents: "No subagents configured. Click + to create one.", + deleteConfirm: 'Delete subagent "{name}"?', + saveFailed: "Failed to save subagent: {message}", + deleteFailed: "Failed to delete subagent: {message}", + renameCleanupFailed: 'Warning: could not remove old file for "{name}"', + saved: 'Subagent "{name}" {action}', + deleted: 'Subagent "{name}" deleted', + duplicateName: 'An agent named "{name}" already exists', + descriptionRequired: "Description is required", + promptRequired: "System prompt is required", + modal: { + titleEdit: "Edit Subagent", + titleAdd: "Add Subagent", + name: "Name", + nameDesc: "Lowercase letters, numbers, and hyphens only", + namePlaceholder: "code-reviewer", + description: "Description", + descriptionDesc: "Brief description of this agent", + descriptionPlaceholder: "Reviews code for bugs and style", + advancedOptions: "Advanced options", + model: "Model", + modelDesc: "Model override for this agent", + tools: "Tools", + toolsDesc: "Comma-separated list of allowed tools (empty = all)", + disallowedTools: "Disallowed tools", + disallowedToolsDesc: "Comma-separated list of tools to disallow", + skills: "Skills", + skillsDesc: "Comma-separated list of skills", + prompt: "System prompt", + promptDesc: "Instructions for the agent", + promptPlaceholder: "You are a code reviewer. Analyze the given code for..." + } + }, + safety: "Sicherheit", + loadUserSettings: { + name: "Benutzer-Claude-Einstellungen laden", + desc: "L\xE4dt ~/.claude/settings.json. Wenn aktiviert, k\xF6nnen Benutzer-Claude-Code-Berechtigungsregeln den Sicherheitsmodus umgehen." + }, + enableBlocklist: { + name: "Befehlsblockliste aktivieren", + desc: "Blockiert potenziell gef\xE4hrliche Bash-Befehle" + }, + blockedCommands: { + name: "Blockierte Befehle ({platform})", + desc: "Muster zum Blockieren auf {platform} (einer pro Zeile). Unterst\xFCtzt Regex.", + unixName: "Blockierte Befehle (Unix/Git Bash)", + unixDesc: "Unix-Muster werden auch auf Windows blockiert, da Git Bash sie aufrufen kann." + }, + exportPaths: { + name: "Zugelassene Exportpfade", + desc: "Pfade au\xDFerhalb des Vaults, in die Dateien exportiert werden k\xF6nnen (einer pro Zeile). Unterst\xFCtzt ~ f\xFCr Home-Verzeichnis." + }, + environment: "Umgebung", + customVariables: { + name: "Benutzerdefinierte Variablen", + desc: "Umgebungsvariablen f\xFCr Claude SDK (KEY=VALUE-Format, eine pro Zeile). Export-Pr\xE4fix unterst\xFCtzt." + }, + envSnippets: { + name: "Snippets", + addBtn: "Snippet hinzuf\xFCgen", + noSnippets: "Keine gespeicherten Umgebungsvariablen-Snippets. Klicken Sie auf +, um Ihre aktuelle Konfiguration zu speichern.", + nameRequired: "Bitte geben Sie einen Namen f\xFCr das Snippet ein", + modal: { + titleEdit: "Snippet bearbeiten", + titleSave: "Snippet speichern", + name: "Name", + namePlaceholder: "Ein beschreibender Name f\xFCr diese Umgebungskonfiguration", + description: "Beschreibung", + descPlaceholder: "Optionale Beschreibung", + envVars: "Umgebungsvariablen", + envVarsPlaceholder: "KEY=VALUE-Format, eine pro Zeile (export-Pr\xE4fix unterst\xFCtzt)", + save: "Speichern", + update: "Aktualisieren", + cancel: "Abbrechen" + } + }, + customContextLimits: { + name: "Benutzerdefinierte Kontextlimits", + desc: "Legen Sie die Kontextfenstergr\xF6\xDFen f\xFCr Ihre benutzerdefinierten Modelle fest. Leer lassen f\xFCr den Standardwert (200k Token).", + invalid: "Ung\xFCltiges Format. Verwenden Sie: 256k, 1m oder exakte Anzahl (1000-10000000)." + }, + advanced: "Erweitert", + show1MModel: { + name: "Sonnet mit 1M-Kontextfenster aktivieren", + desc: "Standard-Sonnet durch Sonnet (1M) in der Modellauswahl ersetzen. Gleiche Preise unter 200k Token. Erfordert Max-Abonnement." + }, + enableChrome: { + name: "Chrome-Erweiterung aktivieren", + desc: "Erlaubt Claude die Interaktion mit Chrome \xFCber die claude-in-chrome-Erweiterung. Die Erweiterung muss installiert sein. Erfordert Neustart der Sitzung." + }, + enableBangBash: { + name: "Enable bash mode (!)", + desc: "Type ! on empty input to enter bash mode. Runs commands directly via Node.js child_process.", + validation: { + noNode: "Node.js not found on PATH. Install Node.js or check your PATH configuration." + } + }, + maxTabs: { + name: "Maximale Chat-Tabs", + desc: "Maximale Anzahl gleichzeitiger Chat-Tabs (3-10). Jeder Tab verwendet eine separate Claude-Sitzung.", + warning: "Mehr als 5 Tabs k\xF6nnen Leistung und Speichernutzung beeintr\xE4chtigen." + }, + tabBarPosition: { + name: "Tab-Leiste Position", + desc: "W\xE4hlen Sie, wo Tab-Badges und Aktionsschaltfl\xE4chen angezeigt werden", + input: "\xDCber Eingabefeld (Standard)", + header: "In Kopfzeile" + }, + enableAutoScroll: { + name: "Automatisches Scrollen w\xE4hrend Streaming", + desc: "Automatisch nach unten scrollen, w\xE4hrend Claude Antworten streamt. Deaktivieren, um oben zu bleiben und von Anfang an zu lesen." + }, + openInMainTab: { + name: "Im Haupteditorbereich \xF6ffnen", + desc: "Chat-Panel als Haupttab im zentralen Editorbereich statt in der rechten Seitenleiste \xF6ffnen" + }, + cliPath: { + name: "Claude CLI-Pfad", + desc: "Benutzerdefinierter Pfad zum Claude Code CLI. Leer lassen f\xFCr automatische Erkennung.", + descWindows: "F\xFCr den nativen Installer verwenden Sie claude.exe. F\xFCr npm/pnpm/yarn oder andere Paketmanager-Installationen verwenden Sie den cli.js-Pfad (nicht claude.cmd).", + descUnix: 'F\xFCgen Sie die Ausgabe von "which claude" ein \u2014 funktioniert sowohl f\xFCr native als auch npm/pnpm/yarn-Installationen.', + validation: { + notExist: "Pfad existiert nicht", + isDirectory: "Pfad ist ein Verzeichnis, keine Datei" + } + }, + language: { + name: "Sprache", + desc: "Anzeigesprache der Plugin-Oberfl\xE4che \xE4ndern" + } +}; +var de_default2 = { + common, + chat, + settings +}; + +// src/i18n/locales/en.json +var en_exports = {}; +__export(en_exports, { + chat: () => chat2, + common: () => common2, + default: () => en_default3, + settings: () => settings2 +}); +var common2 = { + save: "Save", + cancel: "Cancel", + delete: "Delete", + edit: "Edit", + add: "Add", + remove: "Remove", + clear: "Clear", + clearAll: "Clear all", + loading: "Loading", + error: "Error", + success: "Success", + warning: "Warning", + confirm: "Confirm", + settings: "Settings", + advanced: "Advanced", + enabled: "Enabled", + disabled: "Disabled", + platform: "Platform", + rewind: "Rewind" +}; +var chat2 = { + rewind: { + confirmMessage: "Rewind to this point? File changes after this message will be reverted. Rewinding does not affect files edited manually or via bash.", + confirmButton: "Rewind", + ariaLabel: "Rewind to here", + notice: "Rewound: {count} file(s) reverted", + noticeSaveFailed: "Rewound: {count} file(s) reverted, but failed to save state: {error}", + failed: "Rewind failed: {error}", + cannot: "Cannot rewind: {error}", + unavailableStreaming: "Cannot rewind while streaming", + unavailableNoUuid: "Cannot rewind: missing message identifiers" + }, + fork: { + ariaLabel: "Fork conversation", + chooseTarget: "Fork conversation", + targetNewTab: "New tab", + targetCurrentTab: "Current tab", + maxTabsReached: "Cannot fork: maximum {count} tabs reached", + notice: "Forked to new tab", + noticeCurrentTab: "Forked in current tab", + failed: "Fork failed: {error}", + unavailableStreaming: "Cannot fork while streaming", + unavailableNoUuid: "Cannot fork: missing message identifiers", + unavailableNoResponse: "Cannot fork: no response to fork from", + errorMessageNotFound: "Message not found", + errorNoSession: "No session ID available", + errorNoActiveTab: "No active tab", + commandNoMessages: "Cannot fork: no messages in conversation", + commandNoAssistantUuid: "Cannot fork: no assistant response with identifiers" + }, + bangBash: { + placeholder: "> Run a bash command...", + commandPanel: "Command panel", + copyAriaLabel: "Copy latest command output", + clearAriaLabel: "Clear bash output", + commandLabel: "{command}", + statusLabel: "Status: {status}", + collapseOutput: "Collapse command output", + expandOutput: "Expand command output", + running: "Running...", + copyFailed: "Failed to copy to clipboard" + } +}; +var settings2 = { + title: "Claudian Settings", + customization: "Customization", + userName: { + name: "What should Claudian call you?", + desc: "Your name for personalized greetings (leave empty for generic greetings)" + }, + excludedTags: { + name: "Excluded tags", + desc: "Notes with these tags will not auto-load as context (one per line, without #)" + }, + mediaFolder: { + name: "Media folder", + desc: "Folder containing attachments/images. When notes use ![[image.jpg]], Claude will look here. Leave empty for vault root." + }, + systemPrompt: { + name: "Custom system prompt", + desc: "Additional instructions appended to the default system prompt" + }, + autoTitle: { + name: "Auto-generate conversation titles", + desc: "Automatically generate conversation titles after the first user message is sent." + }, + titleModel: { + name: "Title generation model", + desc: "Model used for auto-generating conversation titles.", + auto: "Auto (Haiku)" + }, + navMappings: { + name: "Vim-style navigation mappings", + desc: 'One mapping per line. Format: "map " (actions: scrollUp, scrollDown, focusInput).' + }, + hotkeys: "Hotkeys", + inlineEditHotkey: { + name: "Inline Edit", + descWithKey: "Current hotkey: {hotkey}", + descNoKey: "No hotkey set", + btnChange: "Change", + btnSet: "Set hotkey" + }, + openChatHotkey: { + name: "Open Chat", + descWithKey: "Current hotkey: {hotkey}", + descNoKey: "No hotkey set", + btnChange: "Change", + btnSet: "Set hotkey" + }, + newSessionHotkey: { + name: "New Session", + descWithKey: "Current hotkey: {hotkey}", + descNoKey: "No hotkey set", + btnChange: "Change", + btnSet: "Set hotkey" + }, + newTabHotkey: { + name: "New Tab", + descWithKey: "Current hotkey: {hotkey}", + descNoKey: "No hotkey set", + btnChange: "Change", + btnSet: "Set hotkey" + }, + closeTabHotkey: { + name: "Close Tab", + descWithKey: "Current hotkey: {hotkey}", + descNoKey: "No hotkey set", + btnChange: "Change", + btnSet: "Set hotkey" + }, + slashCommands: { + name: "Commands and Skills", + desc: "Define custom commands and skills triggered by /name." + }, + hiddenSlashCommands: { + name: "Hidden Commands", + desc: "Hide specific slash commands from the dropdown. Useful for hiding Claude Code commands that are not relevant to Claudian. Enter command names without the leading slash, one per line.", + placeholder: "commit\nbuild\ntest" + }, + mcpServers: { + name: "MCP Servers", + desc: "Configure Model Context Protocol servers to extend Claude's capabilities with external tools and data sources. Servers with context-saving mode require @mention to activate." + }, + plugins: { + name: "Claude Code Plugins", + desc: "Enable or disable Claude Code plugins discovered from ~/.claude/plugins. Enabled plugins are stored per vault." + }, + subagents: { + name: "Subagents", + desc: "Configure custom subagents that Claude can delegate to.", + noAgents: "No subagents configured. Click + to create one.", + deleteConfirm: 'Delete subagent "{name}"?', + saveFailed: "Failed to save subagent: {message}", + deleteFailed: "Failed to delete subagent: {message}", + renameCleanupFailed: 'Warning: could not remove old file for "{name}"', + saved: 'Subagent "{name}" {action}', + deleted: 'Subagent "{name}" deleted', + duplicateName: 'An agent named "{name}" already exists', + descriptionRequired: "Description is required", + promptRequired: "System prompt is required", + modal: { + titleEdit: "Edit Subagent", + titleAdd: "Add Subagent", + name: "Name", + nameDesc: "Lowercase letters, numbers, and hyphens only", + namePlaceholder: "code-reviewer", + description: "Description", + descriptionDesc: "Brief description of this agent", + descriptionPlaceholder: "Reviews code for bugs and style", + advancedOptions: "Advanced options", + model: "Model", + modelDesc: "Model override for this agent", + tools: "Tools", + toolsDesc: "Comma-separated list of allowed tools (empty = all)", + disallowedTools: "Disallowed tools", + disallowedToolsDesc: "Comma-separated list of tools to disallow", + skills: "Skills", + skillsDesc: "Comma-separated list of skills", + prompt: "System prompt", + promptDesc: "Instructions for the agent", + promptPlaceholder: "You are a code reviewer. Analyze the given code for..." + } + }, + safety: "Safety", + loadUserSettings: { + name: "Load user Claude settings", + desc: "Load ~/.claude/settings.json. When enabled, user's Claude Code permission rules may bypass Safe mode." + }, + enableBlocklist: { + name: "Enable command blocklist", + desc: "Block potentially dangerous bash commands" + }, + blockedCommands: { + name: "Blocked commands ({platform})", + desc: "Patterns to block on {platform} (one per line). Supports regex.", + unixName: "Blocked commands (Unix/Git Bash)", + unixDesc: "Unix patterns also blocked on Windows because Git Bash can invoke them." + }, + exportPaths: { + name: "Allowed export paths", + desc: "Paths outside the vault where files can be exported (one per line). Supports ~ for home directory." + }, + environment: "Environment", + customVariables: { + name: "Custom variables", + desc: "Environment variables for Claude SDK (KEY=VALUE format, one per line). Shell export prefix supported." + }, + envSnippets: { + name: "Snippets", + addBtn: "Add snippet", + noSnippets: "No saved environment snippets yet. Click + to save your current environment configuration.", + nameRequired: "Please enter a name for the snippet", + modal: { + titleEdit: "Edit snippet", + titleSave: "Save snippet", + name: "Name", + namePlaceholder: "A descriptive name for this environment configuration", + description: "Description", + descPlaceholder: "Optional description", + envVars: "Environment variables", + envVarsPlaceholder: "KEY=VALUE format, one per line (export prefix supported)", + save: "Save", + update: "Update", + cancel: "Cancel" + } + }, + customContextLimits: { + name: "Custom Context Limits", + desc: "Set context window sizes for your custom models. Leave empty to use the default (200k tokens).", + invalid: "Invalid format. Use: 256k, 1m, or exact count (1000-10000000)." + }, + advanced: "Advanced", + show1MModel: { + name: "Enable Sonnet with 1M context window", + desc: "Replace standard Sonnet with Sonnet (1M) in the model selector. Same pricing under 200k tokens. Requires Max subscription." + }, + enableChrome: { + name: "Enable Chrome extension", + desc: "Allow Claude to interact with Chrome via the claude-in-chrome extension. Requires the extension to be installed. Requires session restart." + }, + enableBangBash: { + name: "Enable bash mode (!)", + desc: "Type ! on empty input to enter bash mode. Runs commands directly via Node.js child_process. Requires view reopen.", + validation: { + noNode: "Node.js not found on PATH. Install Node.js or check your PATH configuration." + } + }, + maxTabs: { + name: "Maximum chat tabs", + desc: "Maximum number of concurrent chat tabs (3-10). Each tab uses a separate Claude session.", + warning: "More than 5 tabs may impact performance and memory usage." + }, + tabBarPosition: { + name: "Tab bar position", + desc: "Choose where to display tab badges and action buttons", + input: "Above input (default)", + header: "In header" + }, + enableAutoScroll: { + name: "Auto-scroll during streaming", + desc: "Automatically scroll to the bottom as Claude streams responses. Disable to stay at the top and read from the beginning." + }, + openInMainTab: { + name: "Open in main editor area", + desc: "Open chat panel as a main tab in the center editor area instead of the right sidebar" + }, + cliPath: { + name: "Claude CLI path", + desc: "Custom path to Claude Code CLI. Leave empty for auto-detection.", + descWindows: "For the native installer, use claude.exe. For npm/pnpm/yarn or other package manager installs, use the cli.js path (not claude.cmd).", + descUnix: 'Paste the output of "which claude" \u2014 works for both native and npm/pnpm/yarn installs.', + validation: { + notExist: "Path does not exist", + isDirectory: "Path is a directory, not a file" + } + }, + language: { + name: "Language", + desc: "Change the display language of the plugin interface" + } +}; +var en_default3 = { + common: common2, + chat: chat2, + settings: settings2 +}; + +// src/i18n/locales/es.json +var es_exports = {}; +__export(es_exports, { + chat: () => chat3, + common: () => common3, + default: () => es_default2, + settings: () => settings3 +}); +var common3 = { + save: "Guardar", + cancel: "Cancelar", + delete: "Eliminar", + edit: "Editar", + add: "Agregar", + remove: "Eliminar", + clear: "Limpiar", + clearAll: "Limpiar todo", + loading: "Cargando", + error: "Error", + success: "\xC9xito", + warning: "Advertencia", + confirm: "Confirmar", + settings: "Configuraci\xF3n", + advanced: "Avanzado", + enabled: "Habilitado", + disabled: "Deshabilitado", + platform: "Plataforma", + rewind: "Rebobinar" +}; +var chat3 = { + rewind: { + confirmMessage: "\xBFRebobinar a este punto? Los cambios de archivos despu\xE9s de este mensaje ser\xE1n revertidos. El rebobinado no afecta archivos editados manualmente o mediante bash.", + confirmButton: "Rebobinar", + ariaLabel: "Rebobinar hasta aqu\xED", + notice: "Rebobinado: {count} archivo(s) revertido(s)", + noticeSaveFailed: "Rebobinado: {count} archivo(s) revertido(s), pero no se pudo guardar el estado: {error}", + failed: "Error al rebobinar: {error}", + cannot: "No se puede rebobinar: {error}", + unavailableStreaming: "No se puede rebobinar durante la transmisi\xF3n", + unavailableNoUuid: "No se puede rebobinar: faltan identificadores de mensaje" + }, + fork: { + ariaLabel: "Bifurcar conversaci\xF3n", + chooseTarget: "Bifurcar conversaci\xF3n", + targetNewTab: "Nueva pesta\xF1a", + targetCurrentTab: "Pesta\xF1a actual", + maxTabsReached: "No se puede bifurcar: m\xE1ximo de {count} pesta\xF1as alcanzado", + notice: "Bifurcado a nueva pesta\xF1a", + noticeCurrentTab: "Bifurcado en pesta\xF1a actual", + failed: "Error al bifurcar: {error}", + unavailableStreaming: "No se puede bifurcar durante la transmisi\xF3n", + unavailableNoUuid: "No se puede bifurcar: faltan identificadores de mensaje", + unavailableNoResponse: "No se puede bifurcar: no hay respuesta para bifurcar", + errorMessageNotFound: "Message not found", + errorNoSession: "No session ID available", + errorNoActiveTab: "No active tab", + commandNoMessages: "No se puede bifurcar: no hay mensajes en la conversaci\xF3n", + commandNoAssistantUuid: "No se puede bifurcar: no hay respuesta del asistente con identificadores" + }, + bangBash: { + placeholder: "> Run a bash command...", + commandPanel: "Command panel", + copyAriaLabel: "Copy latest command output", + clearAriaLabel: "Clear bash output", + commandLabel: "{command}", + statusLabel: "Status: {status}", + collapseOutput: "Collapse command output", + expandOutput: "Expand command output", + running: "Running...", + copyFailed: "Failed to copy to clipboard" + } +}; +var settings3 = { + title: "Configuraci\xF3n de Claudian", + customization: "Personalizaci\xF3n", + userName: { + name: "\xBFC\xF3mo deber\xEDa Claudian llamarte?", + desc: "Tu nombre para saludos personalizados (dejar vac\xEDo para saludos gen\xE9ricos)" + }, + excludedTags: { + name: "Etiquetas excluidas", + desc: "Las notas con estas etiquetas no se cargar\xE1n autom\xE1ticamente como contexto (una por l\xEDnea, sin #)" + }, + mediaFolder: { + name: "Carpeta de medios", + desc: "Carpeta que contiene archivos adjuntos/imagenes. Cuando las notas usan ![[image.jpg]], Claude buscar\xE1 aqu\xED. Dejar vac\xEDo para la ra\xEDz del dep\xF3sito." + }, + systemPrompt: { + name: "Prompt de sistema personalizado", + desc: "Instrucciones adicionales a\xF1adidas al prompt de sistema por defecto" + }, + autoTitle: { + name: "Generar autom\xE1ticamente t\xEDtulos de conversaci\xF3n", + desc: "Genera autom\xE1ticamente t\xEDtulos de conversaci\xF3n despu\xE9s del primer mensaje del usuario." + }, + titleModel: { + name: "Modelo de generaci\xF3n de t\xEDtulos", + desc: "Modelo utilizado para generar autom\xE1ticamente t\xEDtulos de conversaci\xF3n.", + auto: "Auto (Haiku)" + }, + navMappings: { + name: "Mapeos de navegaci\xF3n estilo Vim", + desc: 'Un mapeo por l\xEDnea. Formato: "map " (acciones: scrollUp, scrollDown, focusInput).' + }, + hotkeys: "Atajos de teclado", + inlineEditHotkey: { + name: "Edici\xF3n en l\xEDnea", + descWithKey: "Atajo actual: {hotkey}", + descNoKey: "Sin atajo configurado", + btnChange: "Cambiar", + btnSet: "Configurar" + }, + openChatHotkey: { + name: "Abrir chat", + descWithKey: "Atajo actual: {hotkey}", + descNoKey: "Sin atajo configurado", + btnChange: "Cambiar", + btnSet: "Configurar" + }, + newSessionHotkey: { + name: "Nueva sesi\xF3n", + descWithKey: "Atajo actual: {hotkey}", + descNoKey: "Sin atajo configurado", + btnChange: "Cambiar", + btnSet: "Configurar" + }, + newTabHotkey: { + name: "Nueva pesta\xF1a", + descWithKey: "Atajo actual: {hotkey}", + descNoKey: "Sin atajo configurado", + btnChange: "Cambiar", + btnSet: "Configurar" + }, + closeTabHotkey: { + name: "Cerrar pesta\xF1a", + descWithKey: "Atajo actual: {hotkey}", + descNoKey: "Sin atajo configurado", + btnChange: "Cambiar", + btnSet: "Configurar" + }, + slashCommands: { + name: "Comandos y habilidades", + desc: "Define comandos y habilidades personalizados activados por /nombre." + }, + hiddenSlashCommands: { + name: "Comandos ocultos", + desc: "Oculta comandos slash espec\xEDficos del men\xFA desplegable. \xDAtil para ocultar comandos de Claude Code que no son relevantes para Claudian. Ingresa nombres de comandos sin la barra inicial, uno por l\xEDnea.", + placeholder: "commit\nbuild\ntest" + }, + mcpServers: { + name: "Servidores MCP", + desc: "Configura servidores Model Context Protocol para extender las capacidades de Claude con herramientas y fuentes de datos externas. Los servidores con modo de guardado de contexto requieren @mention para activarse." + }, + plugins: { + name: "Plugins de Claude Code", + desc: "Habilita o deshabilita plugins de Claude Code descubiertos desde ~/.claude/plugins. Los plugins habilitados se almacenan por b\xF3veda." + }, + subagents: { + name: "Subagents", + desc: "Configure custom subagents that Claude can delegate to.", + noAgents: "No subagents configured. Click + to create one.", + deleteConfirm: 'Delete subagent "{name}"?', + saveFailed: "Failed to save subagent: {message}", + deleteFailed: "Failed to delete subagent: {message}", + renameCleanupFailed: 'Warning: could not remove old file for "{name}"', + saved: 'Subagent "{name}" {action}', + deleted: 'Subagent "{name}" deleted', + duplicateName: 'An agent named "{name}" already exists', + descriptionRequired: "Description is required", + promptRequired: "System prompt is required", + modal: { + titleEdit: "Edit Subagent", + titleAdd: "Add Subagent", + name: "Name", + nameDesc: "Lowercase letters, numbers, and hyphens only", + namePlaceholder: "code-reviewer", + description: "Description", + descriptionDesc: "Brief description of this agent", + descriptionPlaceholder: "Reviews code for bugs and style", + advancedOptions: "Advanced options", + model: "Model", + modelDesc: "Model override for this agent", + tools: "Tools", + toolsDesc: "Comma-separated list of allowed tools (empty = all)", + disallowedTools: "Disallowed tools", + disallowedToolsDesc: "Comma-separated list of tools to disallow", + skills: "Skills", + skillsDesc: "Comma-separated list of skills", + prompt: "System prompt", + promptDesc: "Instructions for the agent", + promptPlaceholder: "You are a code reviewer. Analyze the given code for..." + } + }, + safety: "Seguridad", + loadUserSettings: { + name: "Cargar configuraci\xF3n de usuario Claude", + desc: "Carga ~/.claude/settings.json. Cuando est\xE1 habilitado, las reglas de permisos del usuario pueden eludir el modo seguro." + }, + enableBlocklist: { + name: "Habilitar lista negra de comandos", + desc: "Bloquea comandos bash potencialmente peligrosos" + }, + blockedCommands: { + name: "Comandos bloqueados ({platform})", + desc: "Patrones a bloquear en {platform} (uno por l\xEDnea). Soporta expresiones regulares.", + unixName: "Comandos bloqueados (Unix/Git Bash)", + unixDesc: "Los patrones Unix tambi\xE9n se bloquean en Windows porque Git Bash puede invocarlos." + }, + exportPaths: { + name: "Rutas de exportaci\xF3n permitidas", + desc: "Rutas fuera del dep\xF3sito donde se pueden exportar archivos (una por l\xEDnea). Soporta ~ para el directorio home." + }, + environment: "Entorno", + customVariables: { + name: "Variables personalizadas", + desc: "Variables de entorno para Claude SDK (formato KEY=VALUE, una por l\xEDnea). Prefijo export soportado." + }, + envSnippets: { + name: "Snippets", + addBtn: "A\xF1adir fragmento", + noSnippets: "No hay fragmentos de entorno guardados. Haga clic en + para guardar su configuraci\xF3n actual.", + nameRequired: "Por favor ingrese un nombre para el fragmento", + modal: { + titleEdit: "Editar fragmento", + titleSave: "Guardar fragmento", + name: "Nombre", + namePlaceholder: "Un nombre descriptivo para esta configuraci\xF3n", + description: "Descripci\xF3n", + descPlaceholder: "Descripci\xF3n opcional", + envVars: "Variables de entorno", + envVarsPlaceholder: "Formato KEY=VALUE, una por l\xEDnea (prefijo export soportado)", + save: "Guardar", + update: "Actualizar", + cancel: "Cancelar" + } + }, + customContextLimits: { + name: "L\xEDmites de contexto personalizados", + desc: "Establezca tama\xF1os de ventana de contexto para sus modelos personalizados. Deje vac\xEDo para usar el valor predeterminado (200k tokens).", + invalid: "Formato inv\xE1lido. Use: 256k, 1m o n\xFAmero exacto (1000-10000000)." + }, + advanced: "Avanzado", + show1MModel: { + name: "Habilitar Sonnet con ventana de contexto de 1M", + desc: "Reemplazar Sonnet est\xE1ndar con Sonnet (1M) en el selector de modelos. Mismo precio bajo 200k tokens. Requiere suscripci\xF3n Max." + }, + enableChrome: { + name: "Habilitar extensi\xF3n de Chrome", + desc: "Permitir que Claude interact\xFAe con Chrome a trav\xE9s de la extensi\xF3n claude-in-chrome. Requiere que la extensi\xF3n est\xE9 instalada. Requiere reinicio de sesi\xF3n." + }, + enableBangBash: { + name: "Enable bash mode (!)", + desc: "Type ! on empty input to enter bash mode. Runs commands directly via Node.js child_process.", + validation: { + noNode: "Node.js not found on PATH. Install Node.js or check your PATH configuration." + } + }, + maxTabs: { + name: "M\xE1ximo de pesta\xF1as de chat", + desc: "N\xFAmero m\xE1ximo de pesta\xF1as de chat simult\xE1neas (3-10). Cada pesta\xF1a usa una sesi\xF3n de Claude separada.", + warning: "M\xE1s de 5 pesta\xF1as puede afectar el rendimiento y el uso de memoria." + }, + tabBarPosition: { + name: "Posici\xF3n de la barra de pesta\xF1as", + desc: "Elige d\xF3nde mostrar las insignias de pesta\xF1as y los botones de acci\xF3n", + input: "Sobre el \xE1rea de entrada (predeterminado)", + header: "En el encabezado" + }, + enableAutoScroll: { + name: "Desplazamiento autom\xE1tico durante streaming", + desc: "Desplazarse autom\xE1ticamente hacia abajo mientras Claude transmite respuestas. Desactivar para quedarse arriba y leer desde el principio." + }, + openInMainTab: { + name: "Abrir en \xE1rea de editor principal", + desc: "Abrir el panel de chat como una pesta\xF1a principal en el \xE1rea de editor central en lugar de la barra lateral derecha" + }, + cliPath: { + name: "Ruta CLI Claude", + desc: "Ruta personalizada a Claude Code CLI. Dejar vac\xEDo para detecci\xF3n autom\xE1tica.", + descWindows: "Para el instalador nativo, use claude.exe. Para instalaciones con npm/pnpm/yarn u otros gestores de paquetes, use la ruta cli.js (no claude.cmd).", + descUnix: 'Pegue la salida de "which claude" \u2014 funciona tanto para instalaciones nativas como npm/pnpm/yarn.', + validation: { + notExist: "La ruta no existe", + isDirectory: "La ruta es un directorio, no un archivo" + } + }, + language: { + name: "Idioma", + desc: "Cambiar el idioma de visualizaci\xF3n de la interfaz del plugin" + } +}; +var es_default2 = { + common: common3, + chat: chat3, + settings: settings3 +}; + +// src/i18n/locales/fr.json +var fr_exports = {}; +__export(fr_exports, { + chat: () => chat4, + common: () => common4, + default: () => fr_default2, + settings: () => settings4 +}); +var common4 = { + save: "Enregistrer", + cancel: "Annuler", + delete: "Supprimer", + edit: "Modifier", + add: "Ajouter", + remove: "Supprimer", + clear: "Effacer", + clearAll: "Tout effacer", + loading: "Chargement", + error: "Erreur", + success: "Succ\xE8s", + warning: "Avertissement", + confirm: "Confirmer", + settings: "Param\xE8tres", + advanced: "Avanc\xE9", + enabled: "Activ\xE9", + disabled: "D\xE9sactiv\xE9", + platform: "Plateforme", + rewind: "Rembobiner" +}; +var chat4 = { + rewind: { + confirmMessage: "Rembobiner jusqu'\xE0 ce point ? Les modifications de fichiers apr\xE8s ce message seront annul\xE9es. Le rembobinage n'affecte pas les fichiers modifi\xE9s manuellement ou via bash.", + confirmButton: "Rembobiner", + ariaLabel: "Rembobiner jusqu'ici", + notice: "Rembobin\xE9 : {count} fichier(s) restaur\xE9(s)", + noticeSaveFailed: "Rembobin\xE9 : {count} fichier(s) restaur\xE9(s), mais impossible d'enregistrer l'\xE9tat : {error}", + failed: "\xC9chec du rembobinage : {error}", + cannot: "Impossible de rembobiner : {error}", + unavailableStreaming: "Impossible de rembobiner pendant le streaming", + unavailableNoUuid: "Impossible de rembobiner : identifiants de message manquants" + }, + fork: { + ariaLabel: "Bifurquer la conversation", + chooseTarget: "Bifurquer la conversation", + targetNewTab: "Nouvel onglet", + targetCurrentTab: "Onglet actuel", + maxTabsReached: "Impossible de bifurquer : maximum de {count} onglets atteint", + notice: "Bifurqu\xE9 dans un nouvel onglet", + noticeCurrentTab: "Bifurqu\xE9 dans l'onglet actuel", + failed: "\xC9chec de la bifurcation : {error}", + unavailableStreaming: "Impossible de bifurquer pendant le streaming", + unavailableNoUuid: "Impossible de bifurquer : identifiants de message manquants", + unavailableNoResponse: "Impossible de bifurquer : aucune r\xE9ponse pour bifurquer", + errorMessageNotFound: "Message not found", + errorNoSession: "No session ID available", + errorNoActiveTab: "No active tab", + commandNoMessages: "Impossible de bifurquer : aucun message dans la conversation", + commandNoAssistantUuid: "Impossible de bifurquer : aucune r\xE9ponse de l\u2019assistant avec des identifiants" + }, + bangBash: { + placeholder: "> Run a bash command...", + commandPanel: "Command panel", + copyAriaLabel: "Copy latest command output", + clearAriaLabel: "Clear bash output", + commandLabel: "{command}", + statusLabel: "Status: {status}", + collapseOutput: "Collapse command output", + expandOutput: "Expand command output", + running: "Running...", + copyFailed: "Failed to copy to clipboard" + } +}; +var settings4 = { + title: "Param\xE8tres Claudian", + customization: "Personnalisation", + userName: { + name: "Comment Claudian doit-il vous appeler ?", + desc: "Votre nom pour les salutations personnalis\xE9es (laisser vide pour les salutations g\xE9n\xE9riques)" + }, + excludedTags: { + name: "Tags exclus", + desc: "Les notes avec ces tags ne seront pas charg\xE9es automatiquement comme contexte (un par ligne, sans #)" + }, + mediaFolder: { + name: "Dossier des m\xE9dias", + desc: "Dossier contenant les pi\xE8ces jointes/images. Lorsque les notes utilisent ![[image.jpg]], Claude cherchera ici. Laisser vide pour la racine du coffre." + }, + systemPrompt: { + name: "Prompt syst\xE8me personnalis\xE9", + desc: "Instructions suppl\xE9mentaires ajout\xE9es au prompt syst\xE8me par d\xE9faut" + }, + autoTitle: { + name: "G\xE9n\xE9rer automatiquement les titres de conversation", + desc: "G\xE9n\xE8re automatiquement les titres de conversation apr\xE8s le premier message de l'utilisateur." + }, + titleModel: { + name: "Mod\xE8le de g\xE9n\xE9ration de titre", + desc: "Mod\xE8le utilis\xE9 pour g\xE9n\xE9rer automatiquement les titres de conversation.", + auto: "Auto (Haiku)" + }, + navMappings: { + name: "Mappages de navigation style Vim", + desc: 'Un mappage par ligne. Format : "map " (actions : scrollUp, scrollDown, focusInput).' + }, + hotkeys: "Raccourcis clavier", + inlineEditHotkey: { + name: "\xC9dition en ligne", + descWithKey: "Raccourci actuel : {hotkey}", + descNoKey: "Aucun raccourci d\xE9fini", + btnChange: "Modifier", + btnSet: "D\xE9finir" + }, + openChatHotkey: { + name: "Ouvrir le chat", + descWithKey: "Raccourci actuel : {hotkey}", + descNoKey: "Aucun raccourci d\xE9fini", + btnChange: "Modifier", + btnSet: "D\xE9finir" + }, + newSessionHotkey: { + name: "Nouvelle session", + descWithKey: "Raccourci actuel : {hotkey}", + descNoKey: "Aucun raccourci d\xE9fini", + btnChange: "Modifier", + btnSet: "D\xE9finir" + }, + newTabHotkey: { + name: "Nouvel onglet", + descWithKey: "Raccourci actuel : {hotkey}", + descNoKey: "Aucun raccourci d\xE9fini", + btnChange: "Modifier", + btnSet: "D\xE9finir" + }, + closeTabHotkey: { + name: "Fermer l'onglet", + descWithKey: "Raccourci actuel : {hotkey}", + descNoKey: "Aucun raccourci d\xE9fini", + btnChange: "Modifier", + btnSet: "D\xE9finir" + }, + slashCommands: { + name: "Commandes et comp\xE9tences", + desc: "D\xE9finissez des commandes et comp\xE9tences personnalis\xE9es d\xE9clench\xE9es par /nom." + }, + hiddenSlashCommands: { + name: "Commandes masqu\xE9es", + desc: "Masquer des commandes slash sp\xE9cifiques du menu d\xE9roulant. Utile pour masquer les commandes Claude Code qui ne sont pas pertinentes pour Claudian. Entrez les noms de commandes sans le slash initial, un par ligne.", + placeholder: "commit\nbuild\ntest" + }, + mcpServers: { + name: "Serveurs MCP", + desc: "Configurez les serveurs Model Context Protocol pour \xE9tendre les capacit\xE9s de Claude avec des outils et sources de donn\xE9es externes. Les serveurs avec mode de sauvegarde de contexte n\xE9cessitent une @mention pour s'activer." + }, + plugins: { + name: "Plugins Claude Code", + desc: "Activez ou d\xE9sactivez les plugins Claude Code d\xE9couverts dans ~/.claude/plugins. Les plugins activ\xE9s sont stock\xE9s par coffre." + }, + subagents: { + name: "Subagents", + desc: "Configure custom subagents that Claude can delegate to.", + noAgents: "No subagents configured. Click + to create one.", + deleteConfirm: 'Delete subagent "{name}"?', + saveFailed: "Failed to save subagent: {message}", + deleteFailed: "Failed to delete subagent: {message}", + renameCleanupFailed: 'Warning: could not remove old file for "{name}"', + saved: 'Subagent "{name}" {action}', + deleted: 'Subagent "{name}" deleted', + duplicateName: 'An agent named "{name}" already exists', + descriptionRequired: "Description is required", + promptRequired: "System prompt is required", + modal: { + titleEdit: "Edit Subagent", + titleAdd: "Add Subagent", + name: "Name", + nameDesc: "Lowercase letters, numbers, and hyphens only", + namePlaceholder: "code-reviewer", + description: "Description", + descriptionDesc: "Brief description of this agent", + descriptionPlaceholder: "Reviews code for bugs and style", + advancedOptions: "Advanced options", + model: "Model", + modelDesc: "Model override for this agent", + tools: "Tools", + toolsDesc: "Comma-separated list of allowed tools (empty = all)", + disallowedTools: "Disallowed tools", + disallowedToolsDesc: "Comma-separated list of tools to disallow", + skills: "Skills", + skillsDesc: "Comma-separated list of skills", + prompt: "System prompt", + promptDesc: "Instructions for the agent", + promptPlaceholder: "You are a code reviewer. Analyze the given code for..." + } + }, + safety: "S\xE9curit\xE9", + loadUserSettings: { + name: "Charger les param\xE8tres utilisateur Claude", + desc: "Charge ~/.claude/settings.json. Lorsqu'activ\xE9, les r\xE8gles de permission de l'utilisateur peuvent contourner le mode s\xE9curis\xE9." + }, + enableBlocklist: { + name: "Activer la liste noire de commandes", + desc: "Bloque les commandes bash potentiellement dangereuses" + }, + blockedCommands: { + name: "Commandes bloqu\xE9es ({platform})", + desc: "Mod\xE8les \xE0 bloquer sur {platform} (un par ligne). Supporte les expressions r\xE9guli\xE8res.", + unixName: "Commandes bloqu\xE9es (Unix/Git Bash)", + unixDesc: "Les mod\xE8les Unix sont \xE9galement bloqu\xE9s sur Windows car Git Bash peut les appeler." + }, + exportPaths: { + name: "Chemins d'exportation autoris\xE9s", + desc: "Chemins en dehors du coffre o\xF9 les fichiers peuvent \xEAtre export\xE9s (un par ligne). Supporte ~ pour le r\xE9pertoire home." + }, + environment: "Environnement", + customVariables: { + name: "Variables personnalis\xE9es", + desc: "Variables d'environnement pour Claude SDK (format KEY=VALUE, une par ligne). Pr\xE9fixe export support\xE9." + }, + envSnippets: { + name: "Snippets", + addBtn: "Ajouter un extrait", + noSnippets: "Aucun extrait d'environnement enregistr\xE9. Cliquez sur + pour sauvegarder votre configuration actuelle.", + nameRequired: "Veuillez entrer un nom pour l'extrait", + modal: { + titleEdit: "Modifier l'extrait", + titleSave: "Sauvegarder l'extrait", + name: "Nom", + namePlaceholder: "Un nom descriptif pour cette configuration", + description: "Description", + descPlaceholder: "Description optionnelle", + envVars: "Variables d'environnement", + envVarsPlaceholder: "Format KEY=VALUE, une par ligne (pr\xE9fixe export support\xE9)", + save: "Enregistrer", + update: "Mettre \xE0 jour", + cancel: "Annuler" + } + }, + customContextLimits: { + name: "Limites de contexte personnalis\xE9es", + desc: "D\xE9finissez les tailles de fen\xEAtre de contexte pour vos mod\xE8les personnalis\xE9s. Laissez vide pour utiliser la valeur par d\xE9faut (200k tokens).", + invalid: "Format invalide. Utilisez : 256k, 1m ou nombre exact (1000-10000000)." + }, + advanced: "Avanc\xE9", + show1MModel: { + name: "Activer Sonnet avec fen\xEAtre de contexte de 1M", + desc: "Remplacer Sonnet standard par Sonnet (1M) dans le s\xE9lecteur de mod\xE8les. M\xEAme tarif sous 200k tokens. N\xE9cessite un abonnement Max." + }, + enableChrome: { + name: "Activer l'extension Chrome", + desc: "Permettre \xE0 Claude d'interagir avec Chrome via l'extension claude-in-chrome. L'extension doit \xEAtre install\xE9e. N\xE9cessite un red\xE9marrage de session." + }, + enableBangBash: { + name: "Enable bash mode (!)", + desc: "Type ! on empty input to enter bash mode. Runs commands directly via Node.js child_process.", + validation: { + noNode: "Node.js not found on PATH. Install Node.js or check your PATH configuration." + } + }, + maxTabs: { + name: "Maximum d'onglets de chat", + desc: "Nombre maximum d'onglets de chat simultan\xE9s (3-10). Chaque onglet utilise une session Claude s\xE9par\xE9e.", + warning: "Plus de 5 onglets peut affecter les performances et l'utilisation de la m\xE9moire." + }, + tabBarPosition: { + name: "Position de la barre d'onglets", + desc: "Choisissez o\xF9 afficher les badges d'onglets et les boutons d'action", + input: "Au-dessus de la saisie (par d\xE9faut)", + header: "Dans l'en-t\xEAte" + }, + enableAutoScroll: { + name: "D\xE9filement automatique pendant le streaming", + desc: "D\xE9filer automatiquement vers le bas pendant que Claude diffuse les r\xE9ponses. D\xE9sactiver pour rester en haut et lire depuis le d\xE9but." + }, + openInMainTab: { + name: "Ouvrir dans la zone d'\xE9diteur principale", + desc: "Ouvrir le panneau de chat comme un onglet principal dans la zone d'\xE9diteur centrale au lieu de la barre lat\xE9rale droite" + }, + cliPath: { + name: "Chemin CLI Claude", + desc: "Chemin personnalis\xE9 vers Claude Code CLI. Laisser vide pour la d\xE9tection automatique.", + descWindows: "Pour l'installateur natif, utilisez claude.exe. Pour les installations npm/pnpm/yarn ou autres gestionnaires de paquets, utilisez le chemin cli.js (pas claude.cmd).", + descUnix: 'Collez la sortie de "which claude" \u2014 fonctionne pour les installations natives et npm/pnpm/yarn.', + validation: { + notExist: "Le chemin n'existe pas", + isDirectory: "Le chemin est un r\xE9pertoire, pas un fichier" + } + }, + language: { + name: "Langue", + desc: "Changer la langue d'affichage de l'interface du plugin" + } +}; +var fr_default2 = { + common: common4, + chat: chat4, + settings: settings4 +}; + +// src/i18n/locales/ja.json +var ja_exports = {}; +__export(ja_exports, { + chat: () => chat5, + common: () => common5, + default: () => ja_default2, + settings: () => settings5 +}); +var common5 = { + save: "\u4FDD\u5B58", + cancel: "\u30AD\u30E3\u30F3\u30BB\u30EB", + delete: "\u524A\u9664", + edit: "\u7DE8\u96C6", + add: "\u8FFD\u52A0", + remove: "\u524A\u9664", + clear: "\u30AF\u30EA\u30A2", + clearAll: "\u3059\u3079\u3066\u30AF\u30EA\u30A2", + loading: "\u8AAD\u307F\u8FBC\u307F\u4E2D", + error: "\u30A8\u30E9\u30FC", + success: "\u6210\u529F", + warning: "\u8B66\u544A", + confirm: "\u78BA\u8A8D", + settings: "\u8A2D\u5B9A", + advanced: "\u8A73\u7D30", + enabled: "\u6709\u52B9", + disabled: "\u7121\u52B9", + platform: "\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0", + rewind: "\u5DFB\u304D\u623B\u3057" +}; +var chat5 = { + rewind: { + confirmMessage: "\u3053\u306E\u6642\u70B9\u306B\u5DFB\u304D\u623B\u3057\u307E\u3059\u304B\uFF1F\u3053\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u4EE5\u964D\u306E\u30D5\u30A1\u30A4\u30EB\u5909\u66F4\u304C\u5143\u306B\u623B\u3055\u308C\u307E\u3059\u3002\u624B\u52D5\u307E\u305F\u306Fbash\u3067\u7DE8\u96C6\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u306B\u306F\u5F71\u97FF\u3057\u307E\u305B\u3093\u3002", + confirmButton: "\u5DFB\u304D\u623B\u3059", + ariaLabel: "\u3053\u3053\u306B\u5DFB\u304D\u623B\u3059", + notice: "\u5DFB\u304D\u623B\u3057\u5B8C\u4E86\uFF1A{count} \u500B\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u5FA9\u5143", + noticeSaveFailed: "\u5DFB\u304D\u623B\u3057\u5B8C\u4E86\uFF1A{count} \u500B\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u5FA9\u5143\u3057\u307E\u3057\u305F\u304C\u3001\u72B6\u614B\u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF1A{error}", + failed: "\u5DFB\u304D\u623B\u3057\u306B\u5931\u6557\uFF1A{error}", + cannot: "\u5DFB\u304D\u623B\u3057\u3067\u304D\u307E\u305B\u3093\uFF1A{error}", + unavailableStreaming: "\u30B9\u30C8\u30EA\u30FC\u30DF\u30F3\u30B0\u4E2D\u306F\u5DFB\u304D\u623B\u3057\u3067\u304D\u307E\u305B\u3093", + unavailableNoUuid: "\u5DFB\u304D\u623B\u3057\u3067\u304D\u307E\u305B\u3093\uFF1A\u30E1\u30C3\u30BB\u30FC\u30B8\u8B58\u5225\u5B50\u304C\u3042\u308A\u307E\u305B\u3093" + }, + fork: { + ariaLabel: "\u4F1A\u8A71\u3092\u5206\u5C90", + chooseTarget: "\u4F1A\u8A71\u3092\u5206\u5C90", + targetNewTab: "\u65B0\u3057\u3044\u30BF\u30D6", + targetCurrentTab: "\u73FE\u5728\u306E\u30BF\u30D6", + maxTabsReached: "\u5206\u5C90\u3067\u304D\u307E\u305B\u3093\uFF1A\u6700\u5927 {count} \u30BF\u30D6\u306B\u9054\u3057\u307E\u3057\u305F", + notice: "\u65B0\u3057\u3044\u30BF\u30D6\u306B\u5206\u5C90\u3057\u307E\u3057\u305F", + noticeCurrentTab: "\u73FE\u5728\u306E\u30BF\u30D6\u3067\u5206\u5C90\u3057\u307E\u3057\u305F", + failed: "\u5206\u5C90\u306B\u5931\u6557\uFF1A{error}", + unavailableStreaming: "\u30B9\u30C8\u30EA\u30FC\u30DF\u30F3\u30B0\u4E2D\u306F\u5206\u5C90\u3067\u304D\u307E\u305B\u3093", + unavailableNoUuid: "\u5206\u5C90\u3067\u304D\u307E\u305B\u3093\uFF1A\u30E1\u30C3\u30BB\u30FC\u30B8\u8B58\u5225\u5B50\u304C\u3042\u308A\u307E\u305B\u3093", + unavailableNoResponse: "\u5206\u5C90\u3067\u304D\u307E\u305B\u3093\uFF1A\u5206\u5C90\u5143\u306E\u5FDC\u7B54\u304C\u3042\u308A\u307E\u305B\u3093", + errorMessageNotFound: "Message not found", + errorNoSession: "No session ID available", + errorNoActiveTab: "No active tab", + commandNoMessages: "\u30D5\u30A9\u30FC\u30AF\u3067\u304D\u307E\u305B\u3093: \u4F1A\u8A71\u306B\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u3042\u308A\u307E\u305B\u3093", + commandNoAssistantUuid: "\u30D5\u30A9\u30FC\u30AF\u3067\u304D\u307E\u305B\u3093: \u8B58\u5225\u5B50\u4ED8\u304D\u306E\u30A2\u30B7\u30B9\u30BF\u30F3\u30C8\u5FDC\u7B54\u304C\u3042\u308A\u307E\u305B\u3093" + }, + bangBash: { + placeholder: "> Run a bash command...", + commandPanel: "Command panel", + copyAriaLabel: "Copy latest command output", + clearAriaLabel: "Clear bash output", + commandLabel: "{command}", + statusLabel: "Status: {status}", + collapseOutput: "Collapse command output", + expandOutput: "Expand command output", + running: "Running...", + copyFailed: "Failed to copy to clipboard" + } +}; +var settings5 = { + title: "Claudian \u8A2D\u5B9A", + customization: "\u30AB\u30B9\u30BF\u30DE\u30A4\u30BA", + userName: { + name: "Claudian \u306F\u3069\u306E\u3088\u3046\u306B\u547C\u3073\u307E\u3059\u304B\uFF1F", + desc: "\u30D1\u30FC\u30BD\u30CA\u30E9\u30A4\u30BA\u3055\u308C\u305F\u6328\u62F6\u306B\u4F7F\u7528\u3059\u308B\u540D\u524D\uFF08\u7A7A\u6B04\u3067\u4E00\u822C\u306E\u6328\u62F6\uFF09" + }, + excludedTags: { + name: "\u9664\u5916\u30BF\u30B0", + desc: "\u3053\u308C\u3089\u306E\u30BF\u30B0\u3092\u542B\u3080\u30CE\u30FC\u30C8\u306F\u81EA\u52D5\u7684\u306B\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3068\u3057\u3066\u8AAD\u307F\u8FBC\u307E\u308C\u307E\u305B\u3093\uFF081\u884C\u306B1\u3064\u3001#\u306A\u3057\uFF09" + }, + mediaFolder: { + name: "\u30E1\u30C7\u30A3\u30A2\u30D5\u30A9\u30EB\u30C0", + desc: "\u6DFB\u4ED8\u30D5\u30A1\u30A4\u30EB/\u753B\u50CF\u3092\u683C\u7D0D\u3059\u308B\u30D5\u30A9\u30EB\u30C0\u3002\u30CE\u30FC\u30C8\u304C ![[image.jpg]] \u3092\u4F7F\u7528\u3059\u308B\u5834\u5408\u3001Claude \u306F\u3053\u3053\u3067\u63A2\u3057\u307E\u3059\u3002\u7A7A\u6B04\u3067\u30EA\u30DD\u30B8\u30C8\u30EA\u306E\u30EB\u30FC\u30C8\u3092\u4F7F\u7528\u3002" + }, + systemPrompt: { + name: "\u30AB\u30B9\u30BF\u30E0\u30B7\u30B9\u30C6\u30E0\u30D7\u30ED\u30F3\u30D7\u30C8", + desc: "\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30B7\u30B9\u30C6\u30E0\u30D7\u30ED\u30F3\u30D7\u30C8\u306B\u8FFD\u52A0\u3055\u308C\u308B\u8FFD\u52A0\u6307\u793A" + }, + autoTitle: { + name: "\u4F1A\u8A71\u30BF\u30A4\u30C8\u30EB\u3092\u81EA\u52D5\u751F\u6210", + desc: "\u6700\u521D\u306E\u30E6\u30FC\u30B6\u30FC\u30E1\u30C3\u30BB\u30FC\u30B8\u9001\u4FE1\u5F8C\u306B\u4F1A\u8A71\u30BF\u30A4\u30C8\u30EB\u3092\u81EA\u52D5\u7684\u306B\u751F\u6210\u3057\u307E\u3059\u3002" + }, + titleModel: { + name: "\u30BF\u30A4\u30C8\u30EB\u751F\u6210\u30E2\u30C7\u30EB", + desc: "\u4F1A\u8A71\u30BF\u30A4\u30C8\u30EB\u3092\u81EA\u52D5\u751F\u6210\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u308B\u30E2\u30C7\u30EB\u3002", + auto: "\u81EA\u52D5 (Haiku)" + }, + navMappings: { + name: "Vim\u30B9\u30BF\u30A4\u30EB\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u30DE\u30C3\u30D4\u30F3\u30B0", + desc: '1\u884C\u306B1\u3064\u306E\u30DE\u30C3\u30D4\u30F3\u30B0\u3002\u5F62\u5F0F\uFF1A"map <\u30AD\u30FC> <\u30A2\u30AF\u30B7\u30E7\u30F3>"\uFF08\u30A2\u30AF\u30B7\u30E7\u30F3\uFF1AscrollUp, scrollDown, focusInput\uFF09\u3002' + }, + hotkeys: "\u30DB\u30C3\u30C8\u30AD\u30FC", + inlineEditHotkey: { + name: "\u30A4\u30F3\u30E9\u30A4\u30F3\u7DE8\u96C6", + descWithKey: "\u73FE\u5728\u306E\u30DB\u30C3\u30C8\u30AD\u30FC: {hotkey}", + descNoKey: "\u30DB\u30C3\u30C8\u30AD\u30FC\u672A\u8A2D\u5B9A", + btnChange: "\u5909\u66F4", + btnSet: "\u8A2D\u5B9A" + }, + openChatHotkey: { + name: "\u30C1\u30E3\u30C3\u30C8\u3092\u958B\u304F", + descWithKey: "\u73FE\u5728\u306E\u30DB\u30C3\u30C8\u30AD\u30FC: {hotkey}", + descNoKey: "\u30DB\u30C3\u30C8\u30AD\u30FC\u672A\u8A2D\u5B9A", + btnChange: "\u5909\u66F4", + btnSet: "\u8A2D\u5B9A" + }, + newSessionHotkey: { + name: "\u65B0\u898F\u30BB\u30C3\u30B7\u30E7\u30F3", + descWithKey: "\u73FE\u5728\u306E\u30DB\u30C3\u30C8\u30AD\u30FC: {hotkey}", + descNoKey: "\u30DB\u30C3\u30C8\u30AD\u30FC\u672A\u8A2D\u5B9A", + btnChange: "\u5909\u66F4", + btnSet: "\u8A2D\u5B9A" + }, + newTabHotkey: { + name: "\u65B0\u898F\u30BF\u30D6", + descWithKey: "\u73FE\u5728\u306E\u30DB\u30C3\u30C8\u30AD\u30FC: {hotkey}", + descNoKey: "\u30DB\u30C3\u30C8\u30AD\u30FC\u672A\u8A2D\u5B9A", + btnChange: "\u5909\u66F4", + btnSet: "\u8A2D\u5B9A" + }, + closeTabHotkey: { + name: "\u30BF\u30D6\u3092\u9589\u3058\u308B", + descWithKey: "\u73FE\u5728\u306E\u30DB\u30C3\u30C8\u30AD\u30FC: {hotkey}", + descNoKey: "\u30DB\u30C3\u30C8\u30AD\u30FC\u672A\u8A2D\u5B9A", + btnChange: "\u5909\u66F4", + btnSet: "\u8A2D\u5B9A" + }, + slashCommands: { + name: "\u30B3\u30DE\u30F3\u30C9\u3068\u30B9\u30AD\u30EB", + desc: "/\u540D\u524D \u3067\u30C8\u30EA\u30AC\u30FC\u3055\u308C\u308B\u30AB\u30B9\u30BF\u30E0\u30B3\u30DE\u30F3\u30C9\u3068\u30B9\u30AD\u30EB\u3092\u5B9A\u7FA9\u3057\u307E\u3059\u3002" + }, + hiddenSlashCommands: { + name: "\u975E\u8868\u793A\u30B3\u30DE\u30F3\u30C9", + desc: "\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u304B\u3089\u7279\u5B9A\u306E\u30B9\u30E9\u30C3\u30B7\u30E5\u30B3\u30DE\u30F3\u30C9\u3092\u975E\u8868\u793A\u306B\u3057\u307E\u3059\u3002Claudian \u306B\u95A2\u4FC2\u306E\u306A\u3044 Claude Code \u30B3\u30DE\u30F3\u30C9\u3092\u975E\u8868\u793A\u306B\u3059\u308B\u306E\u306B\u4FBF\u5229\u3067\u3059\u3002\u5148\u982D\u306E\u30B9\u30E9\u30C3\u30B7\u30E5\u306A\u3057\u3067\u30B3\u30DE\u30F3\u30C9\u540D\u30921\u884C\u306B1\u3064\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + placeholder: "commit\nbuild\ntest" + }, + mcpServers: { + name: "MCP \u30B5\u30FC\u30D0\u30FC", + desc: "\u30E2\u30C7\u30EB\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u30D7\u30ED\u30C8\u30B3\u30EB\u30B5\u30FC\u30D0\u30FC\u3092\u8A2D\u5B9A\u3057\u3001\u5916\u90E8\u30C4\u30FC\u30EB\u3084\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u3067 Claude \u306E\u6A5F\u80FD\u3092\u62E1\u5F35\u3057\u307E\u3059\u3002\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u4FDD\u5B58\u30E2\u30FC\u30C9\u306E\u30B5\u30FC\u30D0\u30FC\u306F @mention \u3067\u30A2\u30AF\u30C6\u30A3\u30D6\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002" + }, + plugins: { + name: "Claude Code \u30D7\u30E9\u30B0\u30A4\u30F3", + desc: "~/.claude/plugins \u304B\u3089\u691C\u51FA\u3055\u308C\u305F Claude Code \u30D7\u30E9\u30B0\u30A4\u30F3\u3092\u6709\u52B9\u5316\u307E\u305F\u306F\u7121\u52B9\u5316\u3057\u307E\u3059\u3002\u6709\u52B9\u5316\u3055\u308C\u305F\u30D7\u30E9\u30B0\u30A4\u30F3\u306F\u4FDD\u7BA1\u5EAB\u3054\u3068\u306B\u4FDD\u5B58\u3055\u308C\u307E\u3059\u3002" + }, + subagents: { + name: "Subagents", + desc: "Configure custom subagents that Claude can delegate to.", + noAgents: "No subagents configured. Click + to create one.", + deleteConfirm: 'Delete subagent "{name}"?', + saveFailed: "Failed to save subagent: {message}", + deleteFailed: "Failed to delete subagent: {message}", + renameCleanupFailed: 'Warning: could not remove old file for "{name}"', + saved: 'Subagent "{name}" {action}', + deleted: 'Subagent "{name}" deleted', + duplicateName: 'An agent named "{name}" already exists', + descriptionRequired: "Description is required", + promptRequired: "System prompt is required", + modal: { + titleEdit: "Edit Subagent", + titleAdd: "Add Subagent", + name: "Name", + nameDesc: "Lowercase letters, numbers, and hyphens only", + namePlaceholder: "code-reviewer", + description: "Description", + descriptionDesc: "Brief description of this agent", + descriptionPlaceholder: "Reviews code for bugs and style", + advancedOptions: "Advanced options", + model: "Model", + modelDesc: "Model override for this agent", + tools: "Tools", + toolsDesc: "Comma-separated list of allowed tools (empty = all)", + disallowedTools: "Disallowed tools", + disallowedToolsDesc: "Comma-separated list of tools to disallow", + skills: "Skills", + skillsDesc: "Comma-separated list of skills", + prompt: "System prompt", + promptDesc: "Instructions for the agent", + promptPlaceholder: "You are a code reviewer. Analyze the given code for..." + } + }, + safety: "\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3", + loadUserSettings: { + name: "\u30E6\u30FC\u30B6\u30FCClaude\u8A2D\u5B9A\u3092\u8AAD\u307F\u8FBC\u3080", + desc: "~/.claude/settings.json \u3092\u8AAD\u307F\u8FBC\u307F\u307E\u3059\u3002\u6709\u52B9\u306B\u3059\u308B\u3068\u3001\u30E6\u30FC\u30B6\u30FC\u306E Claude Code \u8A31\u53EF\u30EB\u30FC\u30EB\u304C\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u30E2\u30FC\u30C9\u3092\u30D0\u30A4\u30D1\u30B9\u3059\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002" + }, + enableBlocklist: { + name: "\u30B3\u30DE\u30F3\u30C9\u30D6\u30E9\u30C3\u30AF\u30EA\u30B9\u30C8\u3092\u6709\u52B9\u5316", + desc: "\u6F5C\u5728\u7684\u306B\u5371\u967A\u306Abash\u30B3\u30DE\u30F3\u30C9\u3092\u30D6\u30ED\u30C3\u30AF" + }, + blockedCommands: { + name: "\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u305F\u30B3\u30DE\u30F3\u30C9 ({platform})", + desc: "{platform} \u3067\u30D6\u30ED\u30C3\u30AF\u3059\u308B\u30D1\u30BF\u30FC\u30F3\uFF081\u884C\u306B1\u3064\uFF09\u3002\u6B63\u898F\u8868\u73FE\u3092\u30B5\u30DD\u30FC\u30C8\u3002", + unixName: "\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u305F\u30B3\u30DE\u30F3\u30C9 (Unix/Git Bash)", + unixDesc: "Git Bash\u304C\u547C\u3073\u51FA\u305B\u308B\u305F\u3081\u3001Unix\u30D1\u30BF\u30FC\u30F3\u3082Windows\u4E0A\u3067\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u307E\u3059\u3002" + }, + exportPaths: { + name: "\u8A31\u53EF\u3055\u308C\u305F\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u30D1\u30B9", + desc: "\u30D5\u30A1\u30A4\u30EB\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3067\u304D\u308B\u30EA\u30DD\u30B8\u30C8\u30EA\u5916\u306E\u30D1\u30B9\uFF081\u884C\u306B1\u3064\uFF09\u3002~ \u3067\u30DB\u30FC\u30E0\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u30B5\u30DD\u30FC\u30C8\u3002" + }, + environment: "\u74B0\u5883", + customVariables: { + name: "\u30AB\u30B9\u30BF\u30E0\u5909\u6570", + desc: "Claude SDK\u306E\u74B0\u5883\u5909\u6570\uFF08KEY=VALUE\u5F62\u5F0F\u30011\u884C\u306B1\u3064\uFF09\u3002export\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u5BFE\u5FDC\u3002" + }, + envSnippets: { + name: "\u30B9\u30CB\u30DA\u30C3\u30C8", + addBtn: "\u30B9\u30CB\u30DA\u30C3\u30C8\u3092\u8FFD\u52A0", + noSnippets: "\u4FDD\u5B58\u3055\u308C\u305F\u74B0\u5883\u5909\u6570\u30B9\u30CB\u30DA\u30C3\u30C8\u306F\u3042\u308A\u307E\u305B\u3093\u3002+\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u73FE\u5728\u306E\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + nameRequired: "\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u540D\u524D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044", + modal: { + titleEdit: "\u30B9\u30CB\u30DA\u30C3\u30C8\u3092\u7DE8\u96C6", + titleSave: "\u30B9\u30CB\u30DA\u30C3\u30C8\u3092\u4FDD\u5B58", + name: "\u540D\u524D", + namePlaceholder: "\u3053\u306E\u8A2D\u5B9A\u306E\u308F\u304B\u308A\u3084\u3059\u3044\u540D\u524D", + description: "\u8AAC\u660E", + descPlaceholder: "\u4EFB\u610F\u306E\u8AAC\u660E", + envVars: "\u74B0\u5883\u5909\u6570", + envVarsPlaceholder: "KEY=VALUE\u5F62\u5F0F\u30011\u884C\u306B1\u3064\uFF08export\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u5BFE\u5FDC\uFF09", + save: "\u4FDD\u5B58", + update: "\u66F4\u65B0", + cancel: "\u30AD\u30E3\u30F3\u30BB\u30EB" + } + }, + customContextLimits: { + name: "\u30AB\u30B9\u30BF\u30E0\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u5236\u9650", + desc: "\u30AB\u30B9\u30BF\u30E0\u30E2\u30C7\u30EB\u306E\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u30A6\u30A3\u30F3\u30C9\u30A6\u30B5\u30A4\u30BA\u3092\u8A2D\u5B9A\u3057\u307E\u3059\u3002\u30C7\u30D5\u30A9\u30EB\u30C8\uFF08200k\u30C8\u30FC\u30AF\u30F3\uFF09\u3092\u4F7F\u7528\u3059\u308B\u5834\u5408\u306F\u7A7A\u6B04\u306E\u307E\u307E\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + invalid: "\u7121\u52B9\u306A\u5F62\u5F0F\u3067\u3059\u3002\u4F7F\u7528\uFF1A256k\u30011m\u3001\u307E\u305F\u306F\u6B63\u78BA\u306A\u6570\u5024\uFF081000-10000000\uFF09\u3002" + }, + advanced: "\u8A73\u7D30\u8A2D\u5B9A", + show1MModel: { + name: "1M\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u6301\u3064Sonnet\u3092\u6709\u52B9\u5316", + desc: "\u30E2\u30C7\u30EB\u30BB\u30EC\u30AF\u30BF\u30FC\u3067\u6A19\u6E96Sonnet\u3092 Sonnet (1M) \u306B\u7F6E\u304D\u63DB\u3048\u307E\u3059\u3002200k\u30C8\u30FC\u30AF\u30F3\u672A\u6E80\u3067\u306F\u540C\u3058\u4FA1\u683C\u3002Max\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u304C\u5FC5\u8981\u3067\u3059\u3002" + }, + enableChrome: { + name: "Chrome\u62E1\u5F35\u6A5F\u80FD\u3092\u6709\u52B9\u5316", + desc: "claude-in-chrome\u62E1\u5F35\u6A5F\u80FD\u3092\u901A\u3058\u3066Claude\u304CChrome\u3068\u9023\u643A\u3067\u304D\u308B\u3088\u3046\u306B\u3057\u307E\u3059\u3002\u62E1\u5F35\u6A5F\u80FD\u306E\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u304C\u5FC5\u8981\u3067\u3059\u3002\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u518D\u8D77\u52D5\u304C\u5FC5\u8981\u3067\u3059\u3002" + }, + enableBangBash: { + name: "Enable bash mode (!)", + desc: "Type ! on empty input to enter bash mode. Runs commands directly via Node.js child_process.", + validation: { + noNode: "Node.js not found on PATH. Install Node.js or check your PATH configuration." + } + }, + maxTabs: { + name: "\u6700\u5927\u30C1\u30E3\u30C3\u30C8\u30BF\u30D6\u6570", + desc: "\u540C\u6642\u306B\u958B\u3051\u308B\u6700\u5927\u30C1\u30E3\u30C3\u30C8\u30BF\u30D6\u6570\uFF083-10\uFF09\u3002\u5404\u30BF\u30D6\u306F\u500B\u5225\u306E Claude \u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002", + warning: "5 \u30BF\u30D6\u3092\u8D85\u3048\u308B\u3068\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3084\u30E1\u30E2\u30EA\u4F7F\u7528\u91CF\u306B\u5F71\u97FF\u3059\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002" + }, + tabBarPosition: { + name: "\u30BF\u30D6\u30D0\u30FC\u306E\u4F4D\u7F6E", + desc: "\u30BF\u30D6\u30D0\u30C3\u30B8\u3068\u30A2\u30AF\u30B7\u30E7\u30F3\u30DC\u30BF\u30F3\u306E\u8868\u793A\u4F4D\u7F6E\u3092\u9078\u629E", + input: "\u5165\u529B\u6B04\u306E\u4E0A\uFF08\u30C7\u30D5\u30A9\u30EB\u30C8\uFF09", + header: "\u30D8\u30C3\u30C0\u30FC\u5185" + }, + enableAutoScroll: { + name: "\u30B9\u30C8\u30EA\u30FC\u30DF\u30F3\u30B0\u4E2D\u306E\u81EA\u52D5\u30B9\u30AF\u30ED\u30FC\u30EB", + desc: "Claude\u304C\u5FDC\u7B54\u3092\u30B9\u30C8\u30EA\u30FC\u30DF\u30F3\u30B0\u3057\u3066\u3044\u308B\u9593\u3001\u81EA\u52D5\u7684\u306B\u4E0B\u306B\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u307E\u3059\u3002\u7121\u52B9\u306B\u3059\u308B\u3068\u4E0A\u90E8\u306B\u7559\u307E\u308A\u3001\u6700\u521D\u304B\u3089\u8AAD\u3080\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002" + }, + openInMainTab: { + name: "\u30E1\u30A4\u30F3\u30A8\u30C7\u30A3\u30BF\u9818\u57DF\u3067\u958B\u304F", + desc: "\u30C1\u30E3\u30C3\u30C8\u30D1\u30CD\u30EB\u3092\u53F3\u30B5\u30A4\u30C9\u30D0\u30FC\u3067\u306F\u306A\u304F\u3001\u4E2D\u592E\u30A8\u30C7\u30A3\u30BF\u9818\u57DF\u306E\u30E1\u30A4\u30F3\u30BF\u30D6\u3068\u3057\u3066\u958B\u304D\u307E\u3059" + }, + cliPath: { + name: "Claude CLI \u30D1\u30B9", + desc: "Claude Code CLI \u306E\u30AB\u30B9\u30BF\u30E0\u30D1\u30B9\u3002\u7A7A\u6B04\u3067\u81EA\u52D5\u691C\u51FA\u3092\u4F7F\u7528\u3002", + descWindows: "\u30CD\u30A4\u30C6\u30A3\u30D6\u30A4\u30F3\u30B9\u30C8\u30FC\u30E9\u30FC\u306E\u5834\u5408\u306F claude.exe \u3092\u4F7F\u7528\u3002npm/pnpm/yarn \u3084\u305D\u306E\u4ED6\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u30DE\u30CD\u30FC\u30B8\u30E3\u30FC\u3067\u306E\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u306E\u5834\u5408\u306F cli.js \u30D1\u30B9\u3092\u4F7F\u7528\uFF08claude.cmd \u3067\u306F\u306A\u3044\uFF09\u3002", + descUnix: '"which claude" \u306E\u51FA\u529B\u3092\u8CBC\u308A\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044 - \u30CD\u30A4\u30C6\u30A3\u30D6\u3068 npm/pnpm/yarn \u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u306E\u4E21\u65B9\u3067\u52D5\u4F5C\u3057\u307E\u3059\u3002', + validation: { + notExist: "\u30D1\u30B9\u304C\u5B58\u5728\u3057\u307E\u305B\u3093", + isDirectory: "\u30D1\u30B9\u306F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3067\u30D5\u30A1\u30A4\u30EB\u3067\u306F\u3042\u308A\u307E\u305B\u3093" + } + }, + language: { + name: "\u8A00\u8A9E", + desc: "\u30D7\u30E9\u30B0\u30A4\u30F3\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30FC\u30B9\u306E\u8868\u793A\u8A00\u8A9E\u3092\u5909\u66F4" + } +}; +var ja_default2 = { + common: common5, + chat: chat5, + settings: settings5 +}; + +// src/i18n/locales/ko.json +var ko_exports = {}; +__export(ko_exports, { + chat: () => chat6, + common: () => common6, + default: () => ko_default2, + settings: () => settings6 +}); +var common6 = { + save: "\uC800\uC7A5", + cancel: "\uCDE8\uC18C", + delete: "\uC0AD\uC81C", + edit: "\uD3B8\uC9D1", + add: "\uCD94\uAC00", + remove: "\uC81C\uAC70", + clear: "\uC9C0\uC6B0\uAE30", + clearAll: "\uBAA8\uB450 \uC9C0\uC6B0\uAE30", + loading: "\uB85C\uB529 \uC911", + error: "\uC624\uB958", + success: "\uC131\uACF5", + warning: "\uACBD\uACE0", + confirm: "\uD655\uC778", + settings: "\uC124\uC815", + advanced: "\uACE0\uAE09", + enabled: "\uD65C\uC131\uD654", + disabled: "\uBE44\uD65C\uC131\uD654", + platform: "\uD50C\uB7AB\uD3FC", + rewind: "\uB418\uAC10\uAE30" +}; +var chat6 = { + rewind: { + confirmMessage: "\uC774 \uC2DC\uC810\uC73C\uB85C \uB418\uAC10\uC73C\uC2DC\uACA0\uC2B5\uB2C8\uAE4C? \uC774 \uBA54\uC2DC\uC9C0 \uC774\uD6C4\uC758 \uD30C\uC77C \uBCC0\uACBD \uC0AC\uD56D\uC774 \uB418\uB3CC\uB824\uC9D1\uB2C8\uB2E4. \uC218\uB3D9\uC73C\uB85C \uB610\uB294 bash\uB97C \uD1B5\uD574 \uD3B8\uC9D1\uB41C \uD30C\uC77C\uC5D0\uB294 \uC601\uD5A5\uC744 \uBBF8\uCE58\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", + confirmButton: "\uB418\uAC10\uAE30", + ariaLabel: "\uC5EC\uAE30\uB85C \uB418\uAC10\uAE30", + notice: "\uB418\uAC10\uAE30 \uC644\uB8CC: {count}\uAC1C \uD30C\uC77C \uBCF5\uC6D0\uB428", + noticeSaveFailed: "\uB418\uAC10\uAE30 \uC644\uB8CC: {count}\uAC1C \uD30C\uC77C \uBCF5\uC6D0\uB428, \uD558\uC9C0\uB9CC \uC0C1\uD0DC\uB97C \uC800\uC7A5\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4: {error}", + failed: "\uB418\uAC10\uAE30 \uC2E4\uD328: {error}", + cannot: "\uB418\uAC10\uAE30 \uBD88\uAC00: {error}", + unavailableStreaming: "\uC2A4\uD2B8\uB9AC\uBC0D \uC911\uC5D0\uB294 \uB418\uAC10\uAE30\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4", + unavailableNoUuid: "\uB418\uAC10\uAE30 \uBD88\uAC00: \uBA54\uC2DC\uC9C0 \uC2DD\uBCC4\uC790 \uB204\uB77D" + }, + fork: { + ariaLabel: "\uB300\uD654 \uBD84\uAE30", + chooseTarget: "\uB300\uD654 \uBD84\uAE30", + targetNewTab: "\uC0C8 \uD0ED", + targetCurrentTab: "\uD604\uC7AC \uD0ED", + maxTabsReached: "\uBD84\uAE30 \uBD88\uAC00: \uCD5C\uB300 {count}\uAC1C \uD0ED\uC5D0 \uB3C4\uB2EC\uD588\uC2B5\uB2C8\uB2E4", + notice: "\uC0C8 \uD0ED\uC73C\uB85C \uBD84\uAE30\uB428", + noticeCurrentTab: "\uD604\uC7AC \uD0ED\uC5D0\uC11C \uBD84\uAE30\uB428", + failed: "\uBD84\uAE30 \uC2E4\uD328: {error}", + unavailableStreaming: "\uC2A4\uD2B8\uB9AC\uBC0D \uC911\uC5D0\uB294 \uBD84\uAE30\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4", + unavailableNoUuid: "\uBD84\uAE30 \uBD88\uAC00: \uBA54\uC2DC\uC9C0 \uC2DD\uBCC4\uC790 \uB204\uB77D", + unavailableNoResponse: "\uBD84\uAE30 \uBD88\uAC00: \uBD84\uAE30\uD560 \uC751\uB2F5\uC774 \uC5C6\uC2B5\uB2C8\uB2E4", + errorMessageNotFound: "Message not found", + errorNoSession: "No session ID available", + errorNoActiveTab: "No active tab", + commandNoMessages: "\uD3EC\uD06C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: \uB300\uD654\uC5D0 \uBA54\uC2DC\uC9C0\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4", + commandNoAssistantUuid: "\uD3EC\uD06C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: \uC2DD\uBCC4\uC790\uAC00 \uC788\uB294 \uC5B4\uC2DC\uC2A4\uD134\uD2B8 \uC751\uB2F5\uC774 \uC5C6\uC2B5\uB2C8\uB2E4" + }, + bangBash: { + placeholder: "> Run a bash command...", + commandPanel: "Command panel", + copyAriaLabel: "Copy latest command output", + clearAriaLabel: "Clear bash output", + commandLabel: "{command}", + statusLabel: "Status: {status}", + collapseOutput: "Collapse command output", + expandOutput: "Expand command output", + running: "Running...", + copyFailed: "Failed to copy to clipboard" + } +}; +var settings6 = { + title: "Claudian \uC124\uC815", + customization: "\uC0AC\uC6A9\uC790 \uC815\uC758", + userName: { + name: "Claudian\uC774 \uB2F9\uC2E0\uC744 \uC5B4\uB5BB\uAC8C \uBD88\uB7EC\uC57C \uD569\uB2C8\uAE4C?", + desc: "\uAC1C\uC778\uD654\uB41C \uC778\uC0AC\uC5D0 \uC0AC\uC6A9\uD560 \uC774\uB984 (\uBE44\uC6CC\uB450\uBA74 \uC77C\uBC18 \uC778\uC0AC)" + }, + excludedTags: { + name: "\uC81C\uC678 \uD0DC\uADF8", + desc: "\uC774 \uD0DC\uADF8\uAC00 \uD3EC\uD568\uB41C \uB178\uD2B8\uB294 \uC790\uB3D9\uC73C\uB85C \uCEE8\uD14D\uC2A4\uD2B8\uB85C \uB85C\uB4DC\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 (\uD55C \uC904\uC5D0 \uD558\uB098, # \uC81C\uC678)" + }, + mediaFolder: { + name: "\uBBF8\uB514\uC5B4 \uD3F4\uB354", + desc: "\uCCA8\uBD80 \uD30C\uC77C/\uC774\uBBF8\uC9C0\uB97C \uC800\uC7A5\uD560 \uD3F4\uB354. \uB178\uD2B8\uAC00 ![[image.jpg]]\uB97C \uC0AC\uC6A9\uD560 \uB54C Claude\uAC00 \uC5EC\uAE30\uC11C \uCC3E\uC2B5\uB2C8\uB2E4. \uBE44\uC6CC\uB450\uBA74 \uC800\uC7A5\uC18C \uB8E8\uD2B8 \uC0AC\uC6A9." + }, + systemPrompt: { + name: "\uCEE4\uC2A4\uD140 \uC2DC\uC2A4\uD15C \uD504\uB86C\uD504\uD2B8", + desc: "\uAE30\uBCF8 \uC2DC\uC2A4\uD15C \uD504\uB86C\uD504\uD2B8\uC5D0 \uCD94\uAC00\uB418\uB294 \uCD94\uAC00 \uC9C0\uCE68" + }, + autoTitle: { + name: "\uB300\uD654 \uC81C\uBAA9 \uC790\uB3D9 \uC0DD\uC131", + desc: "\uCCAB \uBC88\uC9F8 \uC0AC\uC6A9\uC790 \uBA54\uC2DC\uC9C0 \uC804\uC1A1 \uD6C4 \uC790\uB3D9\uC73C\uB85C \uB300\uD654 \uC81C\uBAA9\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4." + }, + titleModel: { + name: "\uC81C\uBAA9 \uC0DD\uC131 \uBAA8\uB378", + desc: "\uB300\uD654 \uC81C\uBAA9\uC744 \uC790\uB3D9 \uC0DD\uC131\uD558\uB294 \uB370 \uC0AC\uC6A9\uB418\uB294 \uBAA8\uB378.", + auto: "\uC790\uB3D9 (Haiku)" + }, + navMappings: { + name: "Vim \uC2A4\uD0C0\uC77C \uB124\uBE44\uAC8C\uC774\uC158 \uB9E4\uD551", + desc: '\uD55C \uC904\uC5D0 \uD558\uB098\uC758 \uB9E4\uD551. \uD615\uC2DD: "map <\uD0A4> <\uB3D9\uC791>" (\uB3D9\uC791: scrollUp, scrollDown, focusInput).' + }, + hotkeys: "\uB2E8\uCD95\uD0A4", + inlineEditHotkey: { + name: "\uC778\uB77C\uC778 \uD3B8\uC9D1", + descWithKey: "\uD604\uC7AC \uB2E8\uCD95\uD0A4: {hotkey}", + descNoKey: "\uB2E8\uCD95\uD0A4 \uBBF8\uC124\uC815", + btnChange: "\uBCC0\uACBD", + btnSet: "\uB2E8\uCD95\uD0A4 \uC124\uC815" + }, + openChatHotkey: { + name: "\uCC44\uD305 \uC5F4\uAE30", + descWithKey: "\uD604\uC7AC \uB2E8\uCD95\uD0A4: {hotkey}", + descNoKey: "\uB2E8\uCD95\uD0A4 \uBBF8\uC124\uC815", + btnChange: "\uBCC0\uACBD", + btnSet: "\uB2E8\uCD95\uD0A4 \uC124\uC815" + }, + newSessionHotkey: { + name: "\uC0C8 \uC138\uC158", + descWithKey: "\uD604\uC7AC \uB2E8\uCD95\uD0A4: {hotkey}", + descNoKey: "\uB2E8\uCD95\uD0A4 \uBBF8\uC124\uC815", + btnChange: "\uBCC0\uACBD", + btnSet: "\uB2E8\uCD95\uD0A4 \uC124\uC815" + }, + newTabHotkey: { + name: "\uC0C8 \uD0ED", + descWithKey: "\uD604\uC7AC \uB2E8\uCD95\uD0A4: {hotkey}", + descNoKey: "\uB2E8\uCD95\uD0A4 \uBBF8\uC124\uC815", + btnChange: "\uBCC0\uACBD", + btnSet: "\uB2E8\uCD95\uD0A4 \uC124\uC815" + }, + closeTabHotkey: { + name: "\uD0ED \uB2EB\uAE30", + descWithKey: "\uD604\uC7AC \uB2E8\uCD95\uD0A4: {hotkey}", + descNoKey: "\uB2E8\uCD95\uD0A4 \uBBF8\uC124\uC815", + btnChange: "\uBCC0\uACBD", + btnSet: "\uB2E8\uCD95\uD0A4 \uC124\uC815" + }, + slashCommands: { + name: "\uBA85\uB839\uC5B4\uC640 \uC2A4\uD0AC", + desc: "/\uC774\uB984\uC73C\uB85C \uD2B8\uB9AC\uAC70\uB418\uB294 \uCEE4\uC2A4\uD140 \uBA85\uB839\uC5B4\uC640 \uC2A4\uD0AC\uC744 \uC815\uC758\uD569\uB2C8\uB2E4." + }, + hiddenSlashCommands: { + name: "\uC228\uACA8\uC9C4 \uBA85\uB839\uC5B4", + desc: "\uB4DC\uB86D\uB2E4\uC6B4\uC5D0\uC11C \uD2B9\uC815 \uC2AC\uB798\uC2DC \uBA85\uB839\uC5B4\uB97C \uC228\uAE41\uB2C8\uB2E4. Claudian\uACFC \uAD00\uB828 \uC5C6\uB294 Claude Code \uBA85\uB839\uC5B4\uB97C \uC228\uAE30\uB294 \uB370 \uC720\uC6A9\uD569\uB2C8\uB2E4. \uC55E\uC758 \uC2AC\uB798\uC2DC \uC5C6\uC774 \uD55C \uC904\uC5D0 \uD558\uB098\uC529 \uBA85\uB839\uC5B4 \uC774\uB984\uC744 \uC785\uB825\uD558\uC138\uC694.", + placeholder: "commit\nbuild\ntest" + }, + mcpServers: { + name: "MCP \uC11C\uBC84", + desc: "\uBAA8\uB378 \uCEE8\uD14D\uC2A4\uD2B8 \uD504\uB85C\uD1A0\uCF5C \uC11C\uBC84\uB97C \uC124\uC815\uD558\uC5EC \uC678\uBD80 \uB3C4\uAD6C\uC640 \uB370\uC774\uD130 \uC18C\uC2A4\uB85C Claude\uC758 \uAE30\uB2A5\uC744 \uD655\uC7A5\uD569\uB2C8\uB2E4. \uCEE8\uD14D\uC2A4\uD2B8 \uC800\uC7A5 \uBAA8\uB4DC \uC11C\uBC84\uB294 @mention\uC73C\uB85C \uD65C\uC131\uD654\uD574\uC57C \uD569\uB2C8\uB2E4." + }, + plugins: { + name: "Claude Code \uD50C\uB7EC\uADF8\uC778", + desc: "~/.claude/plugins\uC5D0\uC11C \uBC1C\uACAC\uB41C Claude Code \uD50C\uB7EC\uADF8\uC778\uC744 \uD65C\uC131\uD654 \uB610\uB294 \uBE44\uD65C\uC131\uD654\uD569\uB2C8\uB2E4. \uD65C\uC131\uD654\uB41C \uD50C\uB7EC\uADF8\uC778\uC740 \uBCFC\uD2B8\uBCC4\uB85C \uC800\uC7A5\uB429\uB2C8\uB2E4." + }, + subagents: { + name: "Subagents", + desc: "Configure custom subagents that Claude can delegate to.", + noAgents: "No subagents configured. Click + to create one.", + deleteConfirm: 'Delete subagent "{name}"?', + saveFailed: "Failed to save subagent: {message}", + deleteFailed: "Failed to delete subagent: {message}", + renameCleanupFailed: 'Warning: could not remove old file for "{name}"', + saved: 'Subagent "{name}" {action}', + deleted: 'Subagent "{name}" deleted', + duplicateName: 'An agent named "{name}" already exists', + descriptionRequired: "Description is required", + promptRequired: "System prompt is required", + modal: { + titleEdit: "Edit Subagent", + titleAdd: "Add Subagent", + name: "Name", + nameDesc: "Lowercase letters, numbers, and hyphens only", + namePlaceholder: "code-reviewer", + description: "Description", + descriptionDesc: "Brief description of this agent", + descriptionPlaceholder: "Reviews code for bugs and style", + advancedOptions: "Advanced options", + model: "Model", + modelDesc: "Model override for this agent", + tools: "Tools", + toolsDesc: "Comma-separated list of allowed tools (empty = all)", + disallowedTools: "Disallowed tools", + disallowedToolsDesc: "Comma-separated list of tools to disallow", + skills: "Skills", + skillsDesc: "Comma-separated list of skills", + prompt: "System prompt", + promptDesc: "Instructions for the agent", + promptPlaceholder: "You are a code reviewer. Analyze the given code for..." + } + }, + safety: "\uBCF4\uC548", + loadUserSettings: { + name: "\uC0AC\uC6A9\uC790 Claude \uC124\uC815 \uB85C\uB4DC", + desc: "~/.claude/settings.json\uC744 \uB85C\uB4DC\uD569\uB2C8\uB2E4. \uD65C\uC131\uD654\uD558\uBA74 \uC0AC\uC6A9\uC790\uC758 Claude Code \uD5C8\uC6A9 \uADDC\uCE59\uC774 \uBCF4\uC548 \uBAA8\uB4DC\uB97C \uC6B0\uD68C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4." + }, + enableBlocklist: { + name: "\uBA85\uB839\uC5B4 \uBE14\uB799\uB9AC\uC2A4\uD2B8 \uD65C\uC131\uD654", + desc: "\uC7A0\uC7AC\uC801\uC73C\uB85C \uC704\uD5D8\uD55C bash \uBA85\uB839\uC5B4 \uCC28\uB2E8" + }, + blockedCommands: { + name: "\uCC28\uB2E8\uB41C \uBA85\uB839\uC5B4 ({platform})", + desc: "{platform}\uC5D0\uC11C \uCC28\uB2E8\uD560 \uD328\uD134 (\uD55C \uC904\uC5D0 \uD558\uB098). \uC815\uADDC\uC2DD \uC9C0\uC6D0.", + unixName: "\uCC28\uB2E8\uB41C \uBA85\uB839\uC5B4 (Unix/Git Bash)", + unixDesc: "Git Bash\uAC00 \uD638\uCD9C\uD560 \uC218 \uC788\uC73C\uBBC0\uB85C Unix \uD328\uD134\uB3C4 Windows\uC5D0\uC11C \uCC28\uB2E8\uB429\uB2C8\uB2E4." + }, + exportPaths: { + name: "\uD5C8\uC6A9\uB41C \uB0B4\uBCF4\uB0B4\uAE30 \uACBD\uB85C", + desc: "\uD30C\uC77C\uC744 \uB0B4\uBCF4\uB0BC \uC218 \uC788\uB294 \uC800\uC7A5\uC18C \uC678\uBD80 \uACBD\uB85C (\uD55C \uC904\uC5D0 \uD558\uB098). ~\uB85C \uD648 \uB514\uB809\uD1A0\uB9AC \uC9C0\uC6D0." + }, + environment: "\uD658\uACBD", + customVariables: { + name: "\uCEE4\uC2A4\uD140 \uBCC0\uC218", + desc: "Claude SDK \uD658\uACBD \uBCC0\uC218 (KEY=VALUE \uD615\uC2DD, \uD55C \uC904\uC5D0 \uD558\uB098). export \uC811\uB450\uC0AC \uC9C0\uC6D0." + }, + envSnippets: { + name: "\uC2A4\uB2C8\uD3AB", + addBtn: "\uC2A4\uB2C8\uD3AB \uCD94\uAC00", + noSnippets: "\uC800\uC7A5\uB41C \uD658\uACBD \uBCC0\uC218 \uC2A4\uB2C8\uD3AB\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. +\uB97C \uD074\uB9AD\uD558\uC5EC \uD604\uC7AC \uAD6C\uC131\uC744 \uC800\uC7A5\uD558\uC138\uC694.", + nameRequired: "\uC2A4\uB2C8\uD3AB \uC774\uB984\uC744 \uC785\uB825\uD558\uC138\uC694", + modal: { + titleEdit: "\uC2A4\uB2C8\uD3AB \uD3B8\uC9D1", + titleSave: "\uC2A4\uB2C8\uD3AB \uC800\uC7A5", + name: "\uC774\uB984", + namePlaceholder: "\uC774 \uAD6C\uC131\uC5D0 \uB300\uD55C \uC124\uBA85\uC801\uC778 \uC774\uB984", + description: "\uC124\uBA85", + descPlaceholder: "\uC120\uD0DD\uC801 \uC124\uBA85", + envVars: "\uD658\uACBD \uBCC0\uC218", + envVarsPlaceholder: "KEY=VALUE \uD615\uC2DD, \uD55C \uC904\uC5D0 \uD558\uB098 (export \uC811\uB450\uC0AC \uC9C0\uC6D0)", + save: "\uC800\uC7A5", + update: "\uC5C5\uB370\uC774\uD2B8", + cancel: "\uCDE8\uC18C" + } + }, + customContextLimits: { + name: "\uC0AC\uC6A9\uC790 \uC815\uC758 \uCEE8\uD14D\uC2A4\uD2B8 \uC81C\uD55C", + desc: "\uC0AC\uC6A9\uC790 \uC815\uC758 \uBAA8\uB378\uC758 \uCEE8\uD14D\uC2A4\uD2B8 \uCC3D \uD06C\uAE30\uB97C \uC124\uC815\uD569\uB2C8\uB2E4. \uAE30\uBCF8\uAC12(200k \uD1A0\uD070)\uC744 \uC0AC\uC6A9\uD558\uB824\uBA74 \uBE44\uC6CC\uB450\uC138\uC694.", + invalid: "\uC798\uBABB\uB41C \uD615\uC2DD\uC785\uB2C8\uB2E4. \uC0AC\uC6A9: 256k, 1m \uB610\uB294 \uC815\uD655\uD55C \uC22B\uC790(1000-10000000)." + }, + advanced: "\uACE0\uAE09", + show1MModel: { + name: "1M \uCEE8\uD14D\uC2A4\uD2B8 \uCC3D\uC744 \uAC00\uC9C4 Sonnet \uD65C\uC131\uD654", + desc: "\uBAA8\uB378 \uC120\uD0DD\uAE30\uC5D0\uC11C \uD45C\uC900 Sonnet\uC744 Sonnet (1M)\uC73C\uB85C \uAD50\uCCB4\uD569\uB2C8\uB2E4. 200k \uD1A0\uD070 \uBBF8\uB9CC\uC5D0\uC11C\uB294 \uB3D9\uC77C\uD55C \uAC00\uACA9. Max \uAD6C\uB3C5\uC774 \uD544\uC694\uD569\uB2C8\uB2E4." + }, + enableChrome: { + name: "Chrome \uD655\uC7A5 \uD504\uB85C\uADF8\uB7A8 \uD65C\uC131\uD654", + desc: "claude-in-chrome \uD655\uC7A5 \uD504\uB85C\uADF8\uB7A8\uC744 \uD1B5\uD574 Claude\uAC00 Chrome\uACFC \uC0C1\uD638\uC791\uC6A9\uD560 \uC218 \uC788\uB3C4\uB85D \uD569\uB2C8\uB2E4. \uD655\uC7A5 \uD504\uB85C\uADF8\uB7A8\uC774 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC57C \uD569\uB2C8\uB2E4. \uC138\uC158 \uC7AC\uC2DC\uC791\uC774 \uD544\uC694\uD569\uB2C8\uB2E4." + }, + enableBangBash: { + name: "Enable bash mode (!)", + desc: "Type ! on empty input to enter bash mode. Runs commands directly via Node.js child_process.", + validation: { + noNode: "Node.js not found on PATH. Install Node.js or check your PATH configuration." + } + }, + maxTabs: { + name: "\uCD5C\uB300 \uCC44\uD305 \uD0ED \uC218", + desc: "\uB3D9\uC2DC\uC5D0 \uC5F4 \uC218 \uC788\uB294 \uCD5C\uB300 \uCC44\uD305 \uD0ED \uC218(3-10). \uAC01 \uD0ED\uC740 \uBCC4\uB3C4\uC758 Claude \uC138\uC158\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.", + warning: "5\uAC1C \uD0ED\uC744 \uCD08\uACFC\uD558\uBA74 \uC131\uB2A5 \uBC0F \uBA54\uBAA8\uB9AC \uC0AC\uC6A9\uB7C9\uC5D0 \uC601\uD5A5\uC744 \uC904 \uC218 \uC788\uC2B5\uB2C8\uB2E4." + }, + tabBarPosition: { + name: "\uD0ED \uBC14 \uC704\uCE58", + desc: "\uD0ED \uBC30\uC9C0\uC640 \uC791\uC5C5 \uBC84\uD2BC\uC758 \uD45C\uC2DC \uC704\uCE58 \uC120\uD0DD", + input: "\uC785\uB825\uCC3D \uC704(\uAE30\uBCF8\uAC12)", + header: "\uD5E4\uB354\uC5D0" + }, + enableAutoScroll: { + name: "\uC2A4\uD2B8\uB9AC\uBC0D \uC911 \uC790\uB3D9 \uC2A4\uD06C\uB864", + desc: "Claude\uAC00 \uC751\uB2F5\uC744 \uC2A4\uD2B8\uB9AC\uBC0D\uD558\uB294 \uB3D9\uC548 \uC790\uB3D9\uC73C\uB85C \uC544\uB798\uB85C \uC2A4\uD06C\uB864\uD569\uB2C8\uB2E4. \uBE44\uD65C\uC131\uD654\uD558\uBA74 \uC0C1\uB2E8\uC5D0 \uBA38\uBB3C\uB7EC \uCC98\uC74C\uBD80\uD130 \uC77D\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4." + }, + openInMainTab: { + name: "\uBA54\uC778 \uD3B8\uC9D1\uAE30 \uC601\uC5ED\uC5D0\uC11C \uC5F4\uAE30", + desc: "\uCC44\uD305 \uD328\uB110\uC744 \uC624\uB978\uCABD \uC0AC\uC774\uB4DC\uBC14\uAC00 \uC544\uB2CC \uC911\uC559 \uD3B8\uC9D1\uAE30 \uC601\uC5ED\uC758 \uBA54\uC778 \uD0ED\uC73C\uB85C \uC5FD\uB2C8\uB2E4" + }, + cliPath: { + name: "Claude CLI \uACBD\uB85C", + desc: "Claude Code CLI\uC758 \uC0AC\uC6A9\uC790 \uC815\uC758 \uACBD\uB85C. \uBE44\uC6CC\uB450\uBA74 \uC790\uB3D9 \uAC10\uC9C0 \uC0AC\uC6A9.", + descWindows: "\uB124\uC774\uD2F0\uBE0C \uC124\uCE58 \uD504\uB85C\uADF8\uB7A8\uC758 \uACBD\uC6B0 claude.exe\uB97C \uC0AC\uC6A9\uD558\uC138\uC694. npm/pnpm/yarn \uB610\uB294 \uAE30\uD0C0 \uD328\uD0A4\uC9C0 \uAD00\uB9AC\uC790 \uC124\uCE58\uC758 \uACBD\uC6B0 cli.js \uACBD\uB85C\uB97C \uC0AC\uC6A9\uD558\uC138\uC694 (claude.cmd\uAC00 \uC544\uB2D8).", + descUnix: '"which claude"\uC758 \uCD9C\uB825\uC744 \uBD99\uC5EC\uB123\uC73C\uC138\uC694 - \uB124\uC774\uD2F0\uBE0C \uBC0F npm/pnpm/yarn \uC124\uCE58 \uBAA8\uB450\uC5D0\uC11C \uC791\uB3D9\uD569\uB2C8\uB2E4.', + validation: { + notExist: "\uACBD\uB85C\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4", + isDirectory: "\uACBD\uB85C\uAC00 \uB514\uB809\uD1A0\uB9AC\uC785\uB2C8\uB2E4 \uD30C\uC77C\uC774 \uC544\uB2D9\uB2C8\uB2E4" + } + }, + language: { + name: "\uC5B8\uC5B4", + desc: "\uD50C\uB7EC\uADF8\uC778 \uC778\uD130\uD398\uC774\uC2A4\uC758 \uD45C\uC2DC \uC5B8\uC5B4 \uBCC0\uACBD" + } +}; +var ko_default2 = { + common: common6, + chat: chat6, + settings: settings6 +}; + +// src/i18n/locales/pt.json +var pt_exports = {}; +__export(pt_exports, { + chat: () => chat7, + common: () => common7, + default: () => pt_default2, + settings: () => settings7 +}); +var common7 = { + save: "Salvar", + cancel: "Cancelar", + delete: "Excluir", + edit: "Editar", + add: "Adicionar", + remove: "Remover", + clear: "Limpar", + clearAll: "Limpar tudo", + loading: "Carregando", + error: "Erro", + success: "Sucesso", + warning: "Aviso", + confirm: "Confirmar", + settings: "Configura\xE7\xF5es", + advanced: "Avan\xE7ado", + enabled: "Ativado", + disabled: "Desativado", + platform: "Plataforma", + rewind: "Retroceder" +}; +var chat7 = { + rewind: { + confirmMessage: "Retroceder at\xE9 este ponto? As altera\xE7\xF5es de arquivos ap\xF3s esta mensagem ser\xE3o revertidas. O retrocesso n\xE3o afeta arquivos editados manualmente ou via bash.", + confirmButton: "Retroceder", + ariaLabel: "Retroceder at\xE9 aqui", + notice: "Retrocedido: {count} arquivo(s) revertido(s)", + noticeSaveFailed: "Retrocedido: {count} arquivo(s) revertido(s), mas n\xE3o foi poss\xEDvel salvar o estado: {error}", + failed: "Falha ao retroceder: {error}", + cannot: "N\xE3o \xE9 poss\xEDvel retroceder: {error}", + unavailableStreaming: "N\xE3o \xE9 poss\xEDvel retroceder durante a transmiss\xE3o", + unavailableNoUuid: "N\xE3o \xE9 poss\xEDvel retroceder: identificadores de mensagem ausentes" + }, + fork: { + ariaLabel: "Bifurcar conversa", + chooseTarget: "Bifurcar conversa", + targetNewTab: "Nova aba", + targetCurrentTab: "Aba atual", + maxTabsReached: "N\xE3o \xE9 poss\xEDvel bifurcar: m\xE1ximo de {count} abas atingido", + notice: "Bifurcado para nova aba", + noticeCurrentTab: "Bifurcado na aba atual", + failed: "Falha ao bifurcar: {error}", + unavailableStreaming: "N\xE3o \xE9 poss\xEDvel bifurcar durante a transmiss\xE3o", + unavailableNoUuid: "N\xE3o \xE9 poss\xEDvel bifurcar: identificadores de mensagem ausentes", + unavailableNoResponse: "N\xE3o \xE9 poss\xEDvel bifurcar: nenhuma resposta para bifurcar", + errorMessageNotFound: "Message not found", + errorNoSession: "No session ID available", + errorNoActiveTab: "No active tab", + commandNoMessages: "N\xE3o \xE9 poss\xEDvel bifurcar: n\xE3o h\xE1 mensagens na conversa", + commandNoAssistantUuid: "N\xE3o \xE9 poss\xEDvel bifurcar: n\xE3o h\xE1 resposta do assistente com identificadores" + }, + bangBash: { + placeholder: "> Run a bash command...", + commandPanel: "Command panel", + copyAriaLabel: "Copy latest command output", + clearAriaLabel: "Clear bash output", + commandLabel: "{command}", + statusLabel: "Status: {status}", + collapseOutput: "Collapse command output", + expandOutput: "Expand command output", + running: "Running...", + copyFailed: "Failed to copy to clipboard" + } +}; +var settings7 = { + title: "Configura\xE7\xF5es do Claudian", + customization: "Personaliza\xE7\xE3o", + userName: { + name: "Como o Claudian deve cham\xE1-lo?", + desc: "Seu nome para sauda\xE7\xF5es personalizadas (deixe vazio para sauda\xE7\xF5es gen\xE9ricas)" + }, + excludedTags: { + name: "Tags exclu\xEDdas", + desc: "Notas com estas tags n\xE3o ser\xE3o carregadas automaticamente como contexto (uma por linha, sem #)" + }, + mediaFolder: { + name: "Pasta de m\xEDdia", + desc: "Pasta contendo anexos/imagens. Quando notas usam ![[image.jpg]], Claude procurar\xE1 aqui. Deixe vazio para a raiz do reposit\xF3rio." + }, + systemPrompt: { + name: "Prompt de sistema personalizado", + desc: "Instru\xE7\xF5es adicionais anexadas ao prompt de sistema padr\xE3o" + }, + autoTitle: { + name: "Gerar automaticamente t\xEDtulos de conversa", + desc: "Gera automaticamente t\xEDtulos de conversa ap\xF3s a primeira mensagem do usu\xE1rio." + }, + titleModel: { + name: "Modelo de gera\xE7\xE3o de t\xEDtulo", + desc: "Modelo usado para gerar automaticamente t\xEDtulos de conversa.", + auto: "Auto (Haiku)" + }, + navMappings: { + name: "Mapeamentos de navega\xE7\xE3o estilo Vim", + desc: 'Um mapeamento por linha. Formato: "map " (a\xE7\xF5es: scrollUp, scrollDown, focusInput).' + }, + hotkeys: "Atalhos", + inlineEditHotkey: { + name: "Edi\xE7\xE3o em linha", + descWithKey: "Atalho atual: {hotkey}", + descNoKey: "Nenhum atalho definido", + btnChange: "Alterar", + btnSet: "Definir" + }, + openChatHotkey: { + name: "Abrir chat", + descWithKey: "Atalho atual: {hotkey}", + descNoKey: "Nenhum atalho definido", + btnChange: "Alterar", + btnSet: "Definir" + }, + newSessionHotkey: { + name: "Nova sess\xE3o", + descWithKey: "Atalho atual: {hotkey}", + descNoKey: "Nenhum atalho definido", + btnChange: "Alterar", + btnSet: "Definir" + }, + newTabHotkey: { + name: "Nova aba", + descWithKey: "Atalho atual: {hotkey}", + descNoKey: "Nenhum atalho definido", + btnChange: "Alterar", + btnSet: "Definir" + }, + closeTabHotkey: { + name: "Fechar aba", + descWithKey: "Atalho atual: {hotkey}", + descNoKey: "Nenhum atalho definido", + btnChange: "Alterar", + btnSet: "Definir" + }, + slashCommands: { + name: "Comandos e habilidades", + desc: "Defina comandos e habilidades personalizados acionados por /nome." + }, + hiddenSlashCommands: { + name: "Comandos ocultos", + desc: "Ocultar comandos slash espec\xEDficos do menu suspenso. \xDAtil para ocultar comandos do Claude Code que n\xE3o s\xE3o relevantes para o Claudian. Digite os nomes dos comandos sem a barra inicial, um por linha.", + placeholder: "commit\nbuild\ntest" + }, + mcpServers: { + name: "Servidores MCP", + desc: "Configure servidores Model Context Protocol para estender as capacidades do Claude com ferramentas e fontes de dados externas. Servidores com modo de salvamento de contexto exigem @mention para ativar." + }, + plugins: { + name: "Plugins do Claude Code", + desc: "Ative ou desative plugins do Claude Code descobertos em ~/.claude/plugins. Plugins ativados s\xE3o armazenados por cofre." + }, + subagents: { + name: "Subagents", + desc: "Configure custom subagents that Claude can delegate to.", + noAgents: "No subagents configured. Click + to create one.", + deleteConfirm: 'Delete subagent "{name}"?', + saveFailed: "Failed to save subagent: {message}", + deleteFailed: "Failed to delete subagent: {message}", + renameCleanupFailed: 'Warning: could not remove old file for "{name}"', + saved: 'Subagent "{name}" {action}', + deleted: 'Subagent "{name}" deleted', + duplicateName: 'An agent named "{name}" already exists', + descriptionRequired: "Description is required", + promptRequired: "System prompt is required", + modal: { + titleEdit: "Edit Subagent", + titleAdd: "Add Subagent", + name: "Name", + nameDesc: "Lowercase letters, numbers, and hyphens only", + namePlaceholder: "code-reviewer", + description: "Description", + descriptionDesc: "Brief description of this agent", + descriptionPlaceholder: "Reviews code for bugs and style", + advancedOptions: "Advanced options", + model: "Model", + modelDesc: "Model override for this agent", + tools: "Tools", + toolsDesc: "Comma-separated list of allowed tools (empty = all)", + disallowedTools: "Disallowed tools", + disallowedToolsDesc: "Comma-separated list of tools to disallow", + skills: "Skills", + skillsDesc: "Comma-separated list of skills", + prompt: "System prompt", + promptDesc: "Instructions for the agent", + promptPlaceholder: "You are a code reviewer. Analyze the given code for..." + } + }, + safety: "Seguran\xE7a", + loadUserSettings: { + name: "Carregar configura\xE7\xF5es do usu\xE1rio Claude", + desc: "Carrega ~/.claude/settings.json. Quando habilitado, as regras de permiss\xE3o do usu\xE1rio podem ignorar o modo seguro." + }, + enableBlocklist: { + name: "Habilitar lista negra de comandos", + desc: "Bloqueia comandos bash potencialmente perigosos" + }, + blockedCommands: { + name: "Comandos bloqueados ({platform})", + desc: "Padr\xF5es para bloquear em {platform} (um por linha). Suporta express\xF5es regulares.", + unixName: "Comandos bloqueados (Unix/Git Bash)", + unixDesc: "Padr\xF5es Unix tamb\xE9m bloqueados no Windows porque Git Bash pode invoc\xE1-los." + }, + exportPaths: { + name: "Caminhos de exporta\xE7\xE3o permitidos", + desc: "Caminhos fora do reposit\xF3rio onde arquivos podem ser exportados (um por linha). Suporta ~ para diret\xF3rio home." + }, + environment: "Ambiente", + customVariables: { + name: "Vari\xE1veis personalizadas", + desc: "Vari\xE1veis de ambiente para Claude SDK (formato KEY=VALUE, uma por linha). Prefixo export suportado." + }, + envSnippets: { + name: "Snippets", + addBtn: "Adicionar snippet", + noSnippets: "Nenhum snippet de ambiente salvo. Clique em + para salvar sua configura\xE7\xE3o atual.", + nameRequired: "Por favor, insira um nome para o snippet", + modal: { + titleEdit: "Editar snippet", + titleSave: "Salvar snippet", + name: "Nome", + namePlaceholder: "Um nome descritivo para esta configura\xE7\xE3o", + description: "Descri\xE7\xE3o", + descPlaceholder: "Descri\xE7\xE3o opcional", + envVars: "Vari\xE1veis de ambiente", + envVarsPlaceholder: "Formato KEY=VALUE, uma por linha (prefixo export suportado)", + save: "Salvar", + update: "Atualizar", + cancel: "Cancelar" + } + }, + customContextLimits: { + name: "Limites de contexto personalizados", + desc: "Defina tamanhos de janela de contexto para seus modelos personalizados. Deixe vazio para usar o padr\xE3o (200k tokens).", + invalid: "Formato inv\xE1lido. Use: 256k, 1m ou n\xFAmero exato (1000-10000000)." + }, + advanced: "Avan\xE7ado", + show1MModel: { + name: "Habilitar Sonnet com janela de contexto de 1M", + desc: "Substituir Sonnet padr\xE3o por Sonnet (1M) no seletor de modelos. Mesmo pre\xE7o abaixo de 200k tokens. Requer assinatura Max." + }, + enableChrome: { + name: "Habilitar extens\xE3o do Chrome", + desc: "Permitir que o Claude interaja com o Chrome atrav\xE9s da extens\xE3o claude-in-chrome. Requer que a extens\xE3o esteja instalada. Requer rein\xEDcio de sess\xE3o." + }, + enableBangBash: { + name: "Enable bash mode (!)", + desc: "Type ! on empty input to enter bash mode. Runs commands directly via Node.js child_process.", + validation: { + noNode: "Node.js not found on PATH. Install Node.js or check your PATH configuration." + } + }, + maxTabs: { + name: "M\xE1ximo de abas de chat", + desc: "N\xFAmero m\xE1ximo de abas de chat simult\xE2neas (3-10). Cada aba usa uma sess\xE3o Claude separada.", + warning: "Mais de 5 abas pode afetar o desempenho e o uso de mem\xF3ria." + }, + tabBarPosition: { + name: "Posi\xE7\xE3o da barra de abas", + desc: "Escolha onde exibir os emblemas de abas e bot\xF5es de a\xE7\xE3o", + input: "Acima da entrada (padr\xE3o)", + header: "No cabe\xE7alho" + }, + enableAutoScroll: { + name: "Rolagem autom\xE1tica durante streaming", + desc: "Rolar automaticamente para baixo enquanto o Claude transmite respostas. Desativar para ficar no topo e ler desde o in\xEDcio." + }, + openInMainTab: { + name: "Abrir na \xE1rea do editor principal", + desc: "Abrir o painel de chat como uma aba principal na \xE1rea do editor central em vez da barra lateral direita" + }, + cliPath: { + name: "Caminho CLI Claude", + desc: "Caminho personalizado para Claude Code CLI. Deixe vazio para detec\xE7\xE3o autom\xE1tica.", + descWindows: "Para o instalador nativo, use claude.exe. Para instala\xE7\xF5es com npm/pnpm/yarn ou outros gerenciadores de pacotes, use o caminho cli.js (n\xE3o claude.cmd).", + descUnix: 'Cole a sa\xEDda de "which claude" \u2014 funciona tanto para instala\xE7\xF5es nativas quanto npm/pnpm/yarn.', + validation: { + notExist: "Caminho n\xE3o existe", + isDirectory: "Caminho \xE9 um diret\xF3rio, n\xE3o um arquivo" + } + }, + language: { + name: "Idioma", + desc: "Alterar o idioma de exibi\xE7\xE3o da interface do plugin" + } +}; +var pt_default2 = { + common: common7, + chat: chat7, + settings: settings7 +}; + +// src/i18n/locales/ru.json +var ru_exports = {}; +__export(ru_exports, { + chat: () => chat8, + common: () => common8, + default: () => ru_default2, + settings: () => settings8 +}); +var common8 = { + save: "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C", + cancel: "\u041E\u0442\u043C\u0435\u043D\u0430", + delete: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C", + edit: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C", + add: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C", + remove: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C", + clear: "\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C", + clearAll: "\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u0432\u0441\u0451", + loading: "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430", + error: "\u041E\u0448\u0438\u0431\u043A\u0430", + success: "\u0423\u0441\u043F\u0435\u0445", + warning: "\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435", + confirm: "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C", + settings: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438", + advanced: "\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E", + enabled: "\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u043E", + disabled: "\u041E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u043E", + platform: "\u041F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u0430", + rewind: "\u041E\u0442\u043A\u0430\u0442\u0438\u0442\u044C" +}; +var chat8 = { + rewind: { + confirmMessage: "\u041E\u0442\u043A\u0430\u0442\u0438\u0442\u044C \u0434\u043E \u044D\u0442\u043E\u0439 \u0442\u043E\u0447\u043A\u0438? \u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0444\u0430\u0439\u043B\u043E\u0432 \u043F\u043E\u0441\u043B\u0435 \u044D\u0442\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0431\u0443\u0434\u0443\u0442 \u043E\u0442\u043C\u0435\u043D\u0435\u043D\u044B. \u041E\u0442\u043A\u0430\u0442 \u043D\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442 \u0444\u0430\u0439\u043B\u044B, \u043E\u0442\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0432\u0440\u0443\u0447\u043D\u0443\u044E \u0438\u043B\u0438 \u0447\u0435\u0440\u0435\u0437 bash.", + confirmButton: "\u041E\u0442\u043A\u0430\u0442\u0438\u0442\u044C", + ariaLabel: "\u041E\u0442\u043A\u0430\u0442\u0438\u0442\u044C \u0441\u044E\u0434\u0430", + notice: "\u041E\u0442\u043A\u0430\u0447\u0435\u043D\u043E: \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E \u0444\u0430\u0439\u043B\u043E\u0432 \u2014 {count}", + noticeSaveFailed: "\u041E\u0442\u043A\u0430\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D: \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E \u0444\u0430\u0439\u043B\u043E\u0432 \u2014 {count}, \u043D\u043E \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435: {error}", + failed: "\u041E\u0448\u0438\u0431\u043A\u0430 \u043E\u0442\u043A\u0430\u0442\u0430: {error}", + cannot: "\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043E\u0442\u043A\u0430\u0442\u0438\u0442\u044C: {error}", + unavailableStreaming: "\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043E\u0442\u043A\u0430\u0442\u0438\u0442\u044C \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0442\u043E\u043A\u043E\u0432\u043E\u0439 \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0438", + unavailableNoUuid: "\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043E\u0442\u043A\u0430\u0442\u0438\u0442\u044C: \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440\u044B \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439" + }, + fork: { + ariaLabel: "\u041E\u0442\u0432\u0435\u0442\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440", + chooseTarget: "\u041E\u0442\u0432\u0435\u0442\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440", + targetNewTab: "\u041D\u043E\u0432\u0430\u044F \u0432\u043A\u043B\u0430\u0434\u043A\u0430", + targetCurrentTab: "\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u0432\u043A\u043B\u0430\u0434\u043A\u0430", + maxTabsReached: "\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043E\u0442\u0432\u0435\u0442\u0432\u0438\u0442\u044C: \u0434\u043E\u0441\u0442\u0438\u0433\u043D\u0443\u0442 \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C {count} \u0432\u043A\u043B\u0430\u0434\u043E\u043A", + notice: "\u041E\u0442\u0432\u0435\u0442\u0432\u043B\u0435\u043D\u043E \u0432 \u043D\u043E\u0432\u0443\u044E \u0432\u043A\u043B\u0430\u0434\u043A\u0443", + noticeCurrentTab: "\u041E\u0442\u0432\u0435\u0442\u0432\u043B\u0435\u043D\u043E \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0432\u043A\u043B\u0430\u0434\u043A\u0435", + failed: "\u041E\u0448\u0438\u0431\u043A\u0430 \u043E\u0442\u0432\u0435\u0442\u0432\u043B\u0435\u043D\u0438\u044F: {error}", + unavailableStreaming: "\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043E\u0442\u0432\u0435\u0442\u0432\u0438\u0442\u044C \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0442\u043E\u043A\u043E\u0432\u043E\u0439 \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0438", + unavailableNoUuid: "\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043E\u0442\u0432\u0435\u0442\u0432\u0438\u0442\u044C: \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440\u044B \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439", + unavailableNoResponse: "\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043E\u0442\u0432\u0435\u0442\u0432\u0438\u0442\u044C: \u043D\u0435\u0442 \u043E\u0442\u0432\u0435\u0442\u0430 \u0434\u043B\u044F \u043E\u0442\u0432\u0435\u0442\u0432\u043B\u0435\u043D\u0438\u044F", + errorMessageNotFound: "Message not found", + errorNoSession: "No session ID available", + errorNoActiveTab: "No active tab", + commandNoMessages: "\u041D\u0435\u043B\u044C\u0437\u044F \u0444\u043E\u0440\u043A\u043D\u0443\u0442\u044C: \u0432 \u0434\u0438\u0430\u043B\u043E\u0433\u0435 \u043D\u0435\u0442 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439", + commandNoAssistantUuid: "\u041D\u0435\u043B\u044C\u0437\u044F \u0444\u043E\u0440\u043A\u043D\u0443\u0442\u044C: \u043D\u0435\u0442 \u043E\u0442\u0432\u0435\u0442\u0430 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0430 \u0441 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440\u0430\u043C\u0438" + }, + bangBash: { + placeholder: "> Run a bash command...", + commandPanel: "Command panel", + copyAriaLabel: "Copy latest command output", + clearAriaLabel: "Clear bash output", + commandLabel: "{command}", + statusLabel: "Status: {status}", + collapseOutput: "Collapse command output", + expandOutput: "Expand command output", + running: "Running...", + copyFailed: "Failed to copy to clipboard" + } +}; +var settings8 = { + title: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 Claudian", + customization: "\u041F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F", + userName: { + name: "\u041A\u0430\u043A Claudian \u0434\u043E\u043B\u0436\u0435\u043D \u043E\u0431\u0440\u0430\u0449\u0430\u0442\u044C\u0441\u044F \u043A \u0432\u0430\u043C?", + desc: "\u0412\u0430\u0448\u0435 \u0438\u043C\u044F \u0434\u043B\u044F \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043F\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439 (\u043E\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u043F\u0443\u0441\u0442\u044B\u043C \u0434\u043B\u044F \u043E\u0431\u0449\u0438\u0445 \u043F\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439)" + }, + excludedTags: { + name: "\u0418\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u0435 \u0442\u0435\u0433\u0438", + desc: "\u0417\u0430\u043C\u0435\u0442\u043A\u0438 \u0441 \u044D\u0442\u0438\u043C\u0438 \u0442\u0435\u0433\u0430\u043C\u0438 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044C\u0441\u044F \u043A\u0430\u043A \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 (\u043F\u043E \u043E\u0434\u043D\u043E\u043C\u0443 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435, \u0431\u0435\u0437 #)" + }, + mediaFolder: { + name: "\u041F\u0430\u043F\u043A\u0430 \u043C\u0435\u0434\u0438\u0430\u0444\u0430\u0439\u043B\u043E\u0432", + desc: "\u041F\u0430\u043F\u043A\u0430 \u0441 \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438/\u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F\u043C\u0438. \u041A\u043E\u0433\u0434\u0430 \u0437\u0430\u043C\u0435\u0442\u043A\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442 ![[image.jpg]], Claude \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043A\u0430\u0442\u044C \u0437\u0434\u0435\u0441\u044C. \u041E\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u043F\u0443\u0441\u0442\u044B\u043C \u0434\u043B\u044F \u043A\u043E\u0440\u043D\u044F \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430." + }, + systemPrompt: { + name: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0439 \u043F\u0440\u043E\u043C\u043F\u0442", + desc: "\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043A\u0446\u0438\u0438, \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u043C\u044B\u0435 \u043A \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u043E\u043C\u0443 \u043F\u0440\u043E\u043C\u043F\u0442\u0443 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E" + }, + autoTitle: { + name: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 \u0431\u0435\u0441\u0435\u0434", + desc: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 \u0431\u0435\u0441\u0435\u0434 \u043F\u043E\u0441\u043B\u0435 \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F." + }, + titleModel: { + name: "\u041C\u043E\u0434\u0435\u043B\u044C \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432", + desc: "\u041C\u043E\u0434\u0435\u043B\u044C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u0430\u044F \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0439 \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0431\u0435\u0441\u0435\u0434.", + auto: "\u0410\u0432\u0442\u043E (Haiku)" + }, + navMappings: { + name: "\u0421\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432 \u0441\u0442\u0438\u043B\u0435 Vim", + desc: '\u041F\u043E \u043E\u0434\u043D\u043E\u043C\u0443 \u0441\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044E \u0432 \u0441\u0442\u0440\u043E\u043A\u0435. \u0424\u043E\u0440\u043C\u0430\u0442: "map <\u043A\u043B\u044E\u0447> <\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435>" (\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F: scrollUp, scrollDown, focusInput).' + }, + hotkeys: "\u0413\u043E\u0440\u044F\u0447\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0438", + inlineEditHotkey: { + name: "\u0418\u043D\u043B\u0430\u0439\u043D-\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435", + descWithKey: "\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u043A\u043B\u0430\u0432\u0438\u0448\u0430: {hotkey}", + descNoKey: "\u041A\u043B\u0430\u0432\u0438\u0448\u0430 \u043D\u0435 \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0430", + btnChange: "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C", + btnSet: "\u041D\u0430\u0437\u043D\u0430\u0447\u0438\u0442\u044C" + }, + openChatHotkey: { + name: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0447\u0430\u0442", + descWithKey: "\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u043A\u043B\u0430\u0432\u0438\u0448\u0430: {hotkey}", + descNoKey: "\u041A\u043B\u0430\u0432\u0438\u0448\u0430 \u043D\u0435 \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0430", + btnChange: "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C", + btnSet: "\u041D\u0430\u0437\u043D\u0430\u0447\u0438\u0442\u044C" + }, + newSessionHotkey: { + name: "\u041D\u043E\u0432\u0430\u044F \u0441\u0435\u0441\u0441\u0438\u044F", + descWithKey: "\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u043A\u043B\u0430\u0432\u0438\u0448\u0430: {hotkey}", + descNoKey: "\u041A\u043B\u0430\u0432\u0438\u0448\u0430 \u043D\u0435 \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0430", + btnChange: "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C", + btnSet: "\u041D\u0430\u0437\u043D\u0430\u0447\u0438\u0442\u044C" + }, + newTabHotkey: { + name: "\u041D\u043E\u0432\u0430\u044F \u0432\u043A\u043B\u0430\u0434\u043A\u0430", + descWithKey: "\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u043A\u043B\u0430\u0432\u0438\u0448\u0430: {hotkey}", + descNoKey: "\u041A\u043B\u0430\u0432\u0438\u0448\u0430 \u043D\u0435 \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0430", + btnChange: "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C", + btnSet: "\u041D\u0430\u0437\u043D\u0430\u0447\u0438\u0442\u044C" + }, + closeTabHotkey: { + name: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0432\u043A\u043B\u0430\u0434\u043A\u0443", + descWithKey: "\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u043A\u043B\u0430\u0432\u0438\u0448\u0430: {hotkey}", + descNoKey: "\u041A\u043B\u0430\u0432\u0438\u0448\u0430 \u043D\u0435 \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0430", + btnChange: "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C", + btnSet: "\u041D\u0430\u0437\u043D\u0430\u0447\u0438\u0442\u044C" + }, + slashCommands: { + name: "\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0438 \u043D\u0430\u0432\u044B\u043A\u0438", + desc: "\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0439\u0442\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B \u0438 \u043D\u0430\u0432\u044B\u043A\u0438, \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0435\u043C\u044B\u0435 \u0447\u0435\u0440\u0435\u0437 /\u0438\u043C\u044F." + }, + hiddenSlashCommands: { + name: "\u0421\u043A\u0440\u044B\u0442\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B", + desc: "\u0421\u043A\u0440\u044B\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0451\u043D\u043D\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B \u0441\u043E \u0441\u043B\u044D\u0448\u0435\u043C \u0438\u0437 \u0432\u044B\u043F\u0430\u0434\u0430\u044E\u0449\u0435\u0433\u043E \u0441\u043F\u0438\u0441\u043A\u0430. \u041F\u043E\u043B\u0435\u0437\u043D\u043E \u0434\u043B\u044F \u0441\u043A\u0440\u044B\u0442\u0438\u044F \u043A\u043E\u043C\u0430\u043D\u0434 Claude Code, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043D\u0435 \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u044B \u0434\u043B\u044F Claudian. \u0412\u0432\u043E\u0434\u0438\u0442\u0435 \u0438\u043C\u0435\u043D\u0430 \u043A\u043E\u043C\u0430\u043D\u0434 \u0431\u0435\u0437 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0441\u043B\u044D\u0448\u0430, \u043F\u043E \u043E\u0434\u043D\u043E\u0439 \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443.", + placeholder: "commit\nbuild\ntest" + }, + mcpServers: { + name: "MCP \u0441\u0435\u0440\u0432\u0435\u0440\u044B", + desc: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044B Model Context Protocol \u0434\u043B\u044F \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439 Claude \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0432\u043D\u0435\u0448\u043D\u0438\u0445 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0438 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u043E\u0432 \u0434\u0430\u043D\u043D\u044B\u0445. \u0421\u0435\u0440\u0432\u0435\u0440\u044B \u0441 \u0440\u0435\u0436\u0438\u043C\u043E\u043C \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430 \u0442\u0440\u0435\u0431\u0443\u044E\u0442 @mention \u0434\u043B\u044F \u0430\u043A\u0442\u0438\u0432\u0430\u0446\u0438\u0438." + }, + plugins: { + name: "\u041F\u043B\u0430\u0433\u0438\u043D\u044B Claude Code", + desc: "\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u043F\u043B\u0430\u0433\u0438\u043D\u044B Claude Code \u0438\u0437 ~/.claude/plugins. \u0412\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u0435 \u043F\u043B\u0430\u0433\u0438\u043D\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u044E\u0442\u0441\u044F \u0434\u043B\u044F \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430." + }, + subagents: { + name: "Subagents", + desc: "Configure custom subagents that Claude can delegate to.", + noAgents: "No subagents configured. Click + to create one.", + deleteConfirm: 'Delete subagent "{name}"?', + saveFailed: "Failed to save subagent: {message}", + deleteFailed: "Failed to delete subagent: {message}", + renameCleanupFailed: 'Warning: could not remove old file for "{name}"', + saved: 'Subagent "{name}" {action}', + deleted: 'Subagent "{name}" deleted', + duplicateName: 'An agent named "{name}" already exists', + descriptionRequired: "Description is required", + promptRequired: "System prompt is required", + modal: { + titleEdit: "Edit Subagent", + titleAdd: "Add Subagent", + name: "Name", + nameDesc: "Lowercase letters, numbers, and hyphens only", + namePlaceholder: "code-reviewer", + description: "Description", + descriptionDesc: "Brief description of this agent", + descriptionPlaceholder: "Reviews code for bugs and style", + advancedOptions: "Advanced options", + model: "Model", + modelDesc: "Model override for this agent", + tools: "Tools", + toolsDesc: "Comma-separated list of allowed tools (empty = all)", + disallowedTools: "Disallowed tools", + disallowedToolsDesc: "Comma-separated list of tools to disallow", + skills: "Skills", + skillsDesc: "Comma-separated list of skills", + prompt: "System prompt", + promptDesc: "Instructions for the agent", + promptPlaceholder: "You are a code reviewer. Analyze the given code for..." + } + }, + safety: "\u0411\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u044C", + loadUserSettings: { + name: "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 Claude", + desc: "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 ~/.claude/settings.json. \u041F\u0440\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0439 Claude Code \u043C\u043E\u0433\u0443\u0442 \u043E\u0431\u0445\u043E\u0434\u0438\u0442\u044C \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C." + }, + enableBlocklist: { + name: "\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0447\u0435\u0440\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u043A\u043E\u043C\u0430\u043D\u0434", + desc: "\u0411\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u0442\u0435\u043D\u0446\u0438\u0430\u043B\u044C\u043D\u043E \u043E\u043F\u0430\u0441\u043D\u044B\u0435 bash \u043A\u043E\u043C\u0430\u043D\u0434\u044B" + }, + blockedCommands: { + name: "\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B ({platform})", + desc: "\u0428\u0430\u0431\u043B\u043E\u043D\u044B \u0434\u043B\u044F \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0438 \u043D\u0430 {platform} (\u043F\u043E \u043E\u0434\u043D\u043E\u043C\u0443 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435). \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044E\u0442\u0441\u044F \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u0435 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u044F.", + unixName: "\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B (Unix/Git Bash)", + unixDesc: "Unix \u0448\u0430\u0431\u043B\u043E\u043D\u044B \u0442\u0430\u043A\u0436\u0435 \u0431\u043B\u043E\u043A\u0438\u0440\u0443\u044E\u0442\u0441\u044F \u043D\u0430 Windows, \u0442\u0430\u043A \u043A\u0430\u043A Git Bash \u043C\u043E\u0436\u0435\u0442 \u0438\u0445 \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C." + }, + exportPaths: { + name: "\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u043D\u044B\u0435 \u043F\u0443\u0442\u0438 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0430", + desc: "\u041F\u0443\u0442\u0438 \u0432\u043D\u0435 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430, \u043A\u0443\u0434\u0430 \u043C\u043E\u0436\u043D\u043E \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0444\u0430\u0439\u043B\u044B (\u043F\u043E \u043E\u0434\u043D\u043E\u043C\u0443 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435). \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 ~ \u0434\u043B\u044F \u0434\u043E\u043C\u0430\u0448\u043D\u0435\u0433\u043E \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430." + }, + environment: "\u041E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u0435", + customVariables: { + name: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435", + desc: "\u041F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435 \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u044F \u0434\u043B\u044F Claude SDK (\u0444\u043E\u0440\u043C\u0430\u0442 KEY=VALUE, \u043F\u043E \u043E\u0434\u043D\u043E\u0439 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435). \u041F\u0440\u0435\u0444\u0438\u043A\u0441 export \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F." + }, + envSnippets: { + name: "\u0421\u043D\u0438\u043F\u043F\u0435\u0442\u044B", + addBtn: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u043D\u0438\u043F\u043F\u0435\u0442", + noSnippets: "\u041D\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u043D\u044B\u0445 \u0441\u043D\u0438\u043F\u043F\u0435\u0442\u043E\u0432 \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u044F. \u041D\u0430\u0436\u043C\u0438\u0442\u0435 +, \u0447\u0442\u043E\u0431\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044E.", + nameRequired: "\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0441\u043D\u0438\u043F\u043F\u0435\u0442\u0430", + modal: { + titleEdit: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u043D\u0438\u043F\u043F\u0435\u0442", + titleSave: "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0441\u043D\u0438\u043F\u043F\u0435\u0442", + name: "\u0418\u043C\u044F", + namePlaceholder: "\u041E\u043F\u0438\u0441\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0434\u043B\u044F \u044D\u0442\u043E\u0439 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438", + description: "\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435", + descPlaceholder: "\u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u0435 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435", + envVars: "\u041F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435 \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u044F", + envVarsPlaceholder: "\u0424\u043E\u0440\u043C\u0430\u0442 KEY=VALUE, \u043F\u043E \u043E\u0434\u043D\u043E\u0439 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 (\u043F\u0440\u0435\u0444\u0438\u043A\u0441 export \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F)", + save: "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C", + update: "\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C", + cancel: "\u041E\u0442\u043C\u0435\u043D\u0430" + } + }, + customContextLimits: { + name: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u043B\u0438\u043C\u0438\u0442\u044B \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430", + desc: "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0435 \u0440\u0430\u0437\u043C\u0435\u0440\u044B \u043E\u043A\u043D\u0430 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430 \u0434\u043B\u044F \u0432\u0430\u0448\u0438\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439. \u041E\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u043F\u0443\u0441\u0442\u044B\u043C \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E (200k \u0442\u043E\u043A\u0435\u043D\u043E\u0432).", + invalid: "\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435: 256k, 1m \u0438\u043B\u0438 \u0442\u043E\u0447\u043D\u043E\u0435 \u0447\u0438\u0441\u043B\u043E (1000-10000000)." + }, + advanced: "\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E", + show1MModel: { + name: "\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C Sonnet \u0441 \u043E\u043A\u043D\u043E\u043C \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430 1M", + desc: "\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0439 Sonnet \u043D\u0430 Sonnet (1M) \u0432 \u0432\u044B\u0431\u043E\u0440\u0435 \u043C\u043E\u0434\u0435\u043B\u0435\u0439. \u0422\u0430 \u0436\u0435 \u0446\u0435\u043D\u0430 \u0434\u043E 200k \u0442\u043E\u043A\u0435\u043D\u043E\u0432. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0430 Max." + }, + enableChrome: { + name: "\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 Chrome", + desc: "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C Claude \u0432\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u043E\u0432\u0430\u0442\u044C \u0441 Chrome \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 claude-in-chrome. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A \u0441\u0435\u0441\u0441\u0438\u0438." + }, + enableBangBash: { + name: "Enable bash mode (!)", + desc: "Type ! on empty input to enter bash mode. Runs commands directly via Node.js child_process.", + validation: { + noNode: "Node.js not found on PATH. Install Node.js or check your PATH configuration." + } + }, + maxTabs: { + name: "\u041C\u0430\u043A\u0441\u0438\u043C\u0443\u043C \u0432\u043A\u043B\u0430\u0434\u043E\u043A \u0447\u0430\u0442\u0430", + desc: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u0434\u043D\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0445 \u0432\u043A\u043B\u0430\u0434\u043E\u043A \u0447\u0430\u0442\u0430 (3-10). \u041A\u0430\u0436\u0434\u0430\u044F \u0432\u043A\u043B\u0430\u0434\u043A\u0430 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u0443\u044E \u0441\u0435\u0441\u0441\u0438\u044E Claude.", + warning: "\u0411\u043E\u043B\u0435\u0435 5 \u0432\u043A\u043B\u0430\u0434\u043E\u043A \u043C\u043E\u0436\u0435\u0442 \u043F\u043E\u0432\u043B\u0438\u044F\u0442\u044C \u043D\u0430 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u0430\u043C\u044F\u0442\u0438." + }, + tabBarPosition: { + name: "\u041F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0430\u043D\u0435\u043B\u0438 \u0432\u043A\u043B\u0430\u0434\u043E\u043A", + desc: "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435, \u0433\u0434\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0437\u043D\u0430\u0447\u043A\u0438 \u0432\u043A\u043B\u0430\u0434\u043E\u043A \u0438 \u043A\u043D\u043E\u043F\u043A\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439", + input: "\u041D\u0430\u0434 \u043F\u043E\u043B\u0435\u043C \u0432\u0432\u043E\u0434\u0430 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E)", + header: "\u0412 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0435" + }, + enableAutoScroll: { + name: "\u0410\u0432\u0442\u043E\u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0442\u043E\u043A\u043E\u0432\u043E\u0439 \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0438", + desc: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044C \u0432\u043D\u0438\u0437, \u043F\u043E\u043A\u0430 Claude \u043F\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043E\u0442\u0432\u0435\u0442\u044B. \u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043E\u0441\u0442\u0430\u0432\u0430\u0442\u044C\u0441\u044F \u043D\u0430\u0432\u0435\u0440\u0445\u0443 \u0438 \u0447\u0438\u0442\u0430\u0442\u044C \u0441 \u043D\u0430\u0447\u0430\u043B\u0430." + }, + openInMainTab: { + name: "\u041E\u0442\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0432 \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430", + desc: "\u041E\u0442\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u043F\u0430\u043D\u0435\u043B\u044C \u0447\u0430\u0442\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 \u0432\u043A\u043B\u0430\u0434\u043A\u0438 \u0432 \u0446\u0435\u043D\u0442\u0440\u0430\u043B\u044C\u043D\u043E\u0439 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0432\u043C\u0435\u0441\u0442\u043E \u043F\u0440\u0430\u0432\u043E\u0439 \u0431\u043E\u043A\u043E\u0432\u043E\u0439 \u043F\u0430\u043D\u0435\u043B\u0438" + }, + cliPath: { + name: "\u041F\u0443\u0442\u044C \u043A CLI Claude", + desc: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u043F\u0443\u0442\u044C \u043A Claude Code CLI. \u041E\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u043F\u0443\u0441\u0442\u044B\u043C \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F.", + descWindows: "\u0414\u043B\u044F \u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0433\u043E \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0449\u0438\u043A\u0430 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 claude.exe. \u0414\u043B\u044F \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043E\u043A \u0447\u0435\u0440\u0435\u0437 npm/pnpm/yarn \u0438\u043B\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u044B \u043F\u0430\u043A\u0435\u0442\u043E\u0432 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u043F\u0443\u0442\u044C \u043A cli.js (\u043D\u0435 claude.cmd).", + descUnix: '\u0412\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u0432\u044B\u0432\u043E\u0434 \u043A\u043E\u043C\u0430\u043D\u0434\u044B "which claude" \u2014 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043A\u0430\u043A \u0434\u043B\u044F \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0445 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043E\u043A, \u0442\u0430\u043A \u0438 \u0434\u043B\u044F npm/pnpm/yarn.', + validation: { + notExist: "\u041F\u0443\u0442\u044C \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442", + isDirectory: "\u041F\u0443\u0442\u044C \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0435\u0439, \u0430 \u043D\u0435 \u0444\u0430\u0439\u043B\u043E\u043C" + } + }, + language: { + name: "\u042F\u0437\u044B\u043A", + desc: "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u044F\u0437\u044B\u043A \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043F\u043B\u0430\u0433\u0438\u043D\u0430" + } +}; +var ru_default2 = { + common: common8, + chat: chat8, + settings: settings8 +}; + +// src/i18n/locales/zh-CN.json +var zh_CN_exports = {}; +__export(zh_CN_exports, { + chat: () => chat9, + common: () => common9, + default: () => zh_CN_default2, + settings: () => settings9 +}); +var common9 = { + save: "\u4FDD\u5B58", + cancel: "\u53D6\u6D88", + delete: "\u5220\u9664", + edit: "\u7F16\u8F91", + add: "\u6DFB\u52A0", + remove: "\u79FB\u9664", + clear: "\u6E05\u9664", + clearAll: "\u6E05\u9664\u5168\u90E8", + loading: "\u52A0\u8F7D\u4E2D", + error: "\u9519\u8BEF", + success: "\u6210\u529F", + warning: "\u8B66\u544A", + confirm: "\u786E\u8BA4", + settings: "\u8BBE\u7F6E", + advanced: "\u9AD8\u7EA7", + enabled: "\u5DF2\u542F\u7528", + disabled: "\u5DF2\u7981\u7528", + platform: "\u5E73\u53F0", + rewind: "\u56DE\u9000" +}; +var chat9 = { + rewind: { + confirmMessage: "\u56DE\u9000\u5230\u6B64\u5904\uFF1F\u6B64\u6D88\u606F\u4E4B\u540E\u7684\u6587\u4EF6\u66F4\u6539\u5C06\u88AB\u8FD8\u539F\u3002\u56DE\u9000\u4E0D\u4F1A\u5F71\u54CD\u624B\u52A8\u6216\u901A\u8FC7 bash \u7F16\u8F91\u7684\u6587\u4EF6\u3002", + confirmButton: "\u56DE\u9000", + ariaLabel: "\u56DE\u9000\u5230\u6B64\u5904", + notice: "\u5DF2\u56DE\u9000\uFF1A\u8FD8\u539F\u4E86 {count} \u4E2A\u6587\u4EF6", + noticeSaveFailed: "\u5DF2\u56DE\u9000\uFF1A\u8FD8\u539F\u4E86 {count} \u4E2A\u6587\u4EF6\uFF0C\u4F46\u65E0\u6CD5\u4FDD\u5B58\u72B6\u6001\uFF1A{error}", + failed: "\u56DE\u9000\u5931\u8D25\uFF1A{error}", + cannot: "\u65E0\u6CD5\u56DE\u9000\uFF1A{error}", + unavailableStreaming: "\u6D41\u5F0F\u54CD\u5E94\u4E2D\u65E0\u6CD5\u56DE\u9000", + unavailableNoUuid: "\u65E0\u6CD5\u56DE\u9000\uFF1A\u7F3A\u5C11\u6D88\u606F\u6807\u8BC6\u7B26" + }, + fork: { + ariaLabel: "\u5206\u53C9\u5BF9\u8BDD", + chooseTarget: "\u5206\u53C9\u5BF9\u8BDD", + targetNewTab: "\u65B0\u6807\u7B7E\u9875", + targetCurrentTab: "\u5F53\u524D\u6807\u7B7E\u9875", + maxTabsReached: "\u65E0\u6CD5\u5206\u53C9\uFF1A\u5DF2\u8FBE\u5230\u6700\u5927 {count} \u4E2A\u6807\u7B7E\u9875", + notice: "\u5DF2\u5206\u53C9\u5230\u65B0\u6807\u7B7E\u9875", + noticeCurrentTab: "\u5DF2\u5728\u5F53\u524D\u6807\u7B7E\u9875\u5206\u53C9", + failed: "\u5206\u53C9\u5931\u8D25\uFF1A{error}", + unavailableStreaming: "\u6D41\u5F0F\u54CD\u5E94\u4E2D\u65E0\u6CD5\u5206\u53C9", + unavailableNoUuid: "\u65E0\u6CD5\u5206\u53C9\uFF1A\u7F3A\u5C11\u6D88\u606F\u6807\u8BC6\u7B26", + unavailableNoResponse: "\u65E0\u6CD5\u5206\u53C9\uFF1A\u6CA1\u6709\u53EF\u5206\u53C9\u7684\u54CD\u5E94", + errorMessageNotFound: "Message not found", + errorNoSession: "No session ID available", + errorNoActiveTab: "No active tab", + commandNoMessages: "\u65E0\u6CD5\u5206\u53C9\uFF1A\u5BF9\u8BDD\u4E2D\u6CA1\u6709\u6D88\u606F", + commandNoAssistantUuid: "\u65E0\u6CD5\u5206\u53C9\uFF1A\u6CA1\u6709\u5E26\u6807\u8BC6\u7B26\u7684\u52A9\u624B\u56DE\u590D" + }, + bangBash: { + placeholder: "> \u8FD0\u884C\u547D\u4EE4...", + commandPanel: "\u547D\u4EE4\u9762\u677F", + copyAriaLabel: "\u590D\u5236\u6700\u65B0\u547D\u4EE4\u8F93\u51FA", + clearAriaLabel: "\u6E05\u9664\u547D\u4EE4\u8F93\u51FA", + commandLabel: "{command}", + statusLabel: "\u72B6\u6001: {status}", + collapseOutput: "\u6298\u53E0\u547D\u4EE4\u8F93\u51FA", + expandOutput: "\u5C55\u5F00\u547D\u4EE4\u8F93\u51FA", + running: "\u8FD0\u884C\u4E2D...", + copyFailed: "\u590D\u5236\u5230\u526A\u8D34\u677F\u5931\u8D25" + } +}; +var settings9 = { + title: "Claudian \u8BBE\u7F6E", + customization: "\u4E2A\u6027\u5316\u8BBE\u7F6E", + userName: { + name: "Claudian \u5E94\u8BE5\u5982\u4F55\u79F0\u547C\u4F60\uFF1F", + desc: "\u7528\u4E8E\u4E2A\u6027\u5316\u95EE\u5019\u7684\u7528\u6237\u540D\uFF08\u7559\u7A7A\u4F7F\u7528\u901A\u7528\u95EE\u5019\uFF09" + }, + excludedTags: { + name: "\u6392\u9664\u7684\u6807\u7B7E", + desc: "\u5305\u542B\u8FD9\u4E9B\u6807\u7B7E\u7684\u7B14\u8BB0\u4E0D\u4F1A\u81EA\u52A8\u52A0\u8F7D\u4E3A\u4E0A\u4E0B\u6587\uFF08\u6BCF\u884C\u4E00\u4E2A\uFF0C\u4E0D\u5E26 #\uFF09" + }, + mediaFolder: { + name: "\u5A92\u4F53\u6587\u4EF6\u5939", + desc: "\u5B58\u653E\u9644\u4EF6/\u56FE\u7247\u7684\u6587\u4EF6\u5939\u3002\u5F53\u7B14\u8BB0\u4F7F\u7528 ![[image.jpg]] \u65F6\uFF0CClaude \u4F1A\u5728\u6B64\u67E5\u627E\u3002\u7559\u7A7A\u4F7F\u7528\u4ED3\u5E93\u6839\u76EE\u5F55\u3002" + }, + systemPrompt: { + name: "\u81EA\u5B9A\u4E49\u7CFB\u7EDF\u63D0\u793A\u8BCD", + desc: "\u9644\u52A0\u5230\u9ED8\u8BA4\u7CFB\u7EDF\u63D0\u793A\u8BCD\u7684\u989D\u5916\u6307\u4EE4" + }, + autoTitle: { + name: "\u81EA\u52A8\u751F\u6210\u5BF9\u8BDD\u6807\u9898", + desc: "\u5728\u7528\u6237\u53D1\u9001\u9996\u6761\u6D88\u606F\u540E\u81EA\u52A8\u751F\u6210\u5BF9\u8BDD\u6807\u9898\u3002" + }, + titleModel: { + name: "\u6807\u9898\u751F\u6210\u6A21\u578B", + desc: "\u7528\u4E8E\u81EA\u52A8\u751F\u6210\u5BF9\u8BDD\u6807\u9898\u7684\u6A21\u578B\u3002", + auto: "\u81EA\u52A8 (Haiku)" + }, + navMappings: { + name: "Vim \u98CE\u683C\u5BFC\u822A\u6620\u5C04", + desc: '\u6BCF\u884C\u4E00\u4E2A\u6620\u5C04\u3002\u683C\u5F0F\uFF1A"map <\u952E> <\u52A8\u4F5C>"\uFF08\u52A8\u4F5C\uFF1AscrollUp, scrollDown, focusInput\uFF09\u3002' + }, + hotkeys: "\u5FEB\u6377\u952E", + inlineEditHotkey: { + name: "\u5185\u8054\u7F16\u8F91", + descWithKey: "\u5F53\u524D\u5FEB\u6377\u952E\uFF1A{hotkey}", + descNoKey: "\u672A\u8BBE\u7F6E\u5FEB\u6377\u952E", + btnChange: "\u66F4\u6539", + btnSet: "\u8BBE\u7F6E\u5FEB\u6377\u952E" + }, + openChatHotkey: { + name: "\u6253\u5F00\u804A\u5929", + descWithKey: "\u5F53\u524D\u5FEB\u6377\u952E\uFF1A{hotkey}", + descNoKey: "\u672A\u8BBE\u7F6E\u5FEB\u6377\u952E", + btnChange: "\u66F4\u6539", + btnSet: "\u8BBE\u7F6E\u5FEB\u6377\u952E" + }, + newSessionHotkey: { + name: "\u65B0\u4F1A\u8BDD", + descWithKey: "\u5F53\u524D\u5FEB\u6377\u952E\uFF1A{hotkey}", + descNoKey: "\u672A\u8BBE\u7F6E\u5FEB\u6377\u952E", + btnChange: "\u66F4\u6539", + btnSet: "\u8BBE\u7F6E\u5FEB\u6377\u952E" + }, + newTabHotkey: { + name: "\u65B0\u6807\u7B7E\u9875", + descWithKey: "\u5F53\u524D\u5FEB\u6377\u952E\uFF1A{hotkey}", + descNoKey: "\u672A\u8BBE\u7F6E\u5FEB\u6377\u952E", + btnChange: "\u66F4\u6539", + btnSet: "\u8BBE\u7F6E\u5FEB\u6377\u952E" + }, + closeTabHotkey: { + name: "\u5173\u95ED\u6807\u7B7E\u9875", + descWithKey: "\u5F53\u524D\u5FEB\u6377\u952E\uFF1A{hotkey}", + descNoKey: "\u672A\u8BBE\u7F6E\u5FEB\u6377\u952E", + btnChange: "\u66F4\u6539", + btnSet: "\u8BBE\u7F6E\u5FEB\u6377\u952E" + }, + slashCommands: { + name: "\u547D\u4EE4\u4E0E\u6280\u80FD", + desc: "\u5B9A\u4E49\u7531 /\u540D\u79F0 \u89E6\u53D1\u7684\u81EA\u5B9A\u4E49\u547D\u4EE4\u4E0E\u6280\u80FD\u3002" + }, + hiddenSlashCommands: { + name: "\u9690\u85CF\u547D\u4EE4", + desc: "\u4ECE\u4E0B\u62C9\u83DC\u5355\u4E2D\u9690\u85CF\u7279\u5B9A\u7684\u659C\u6760\u547D\u4EE4\u3002\u9002\u7528\u4E8E\u9690\u85CF\u4E0E Claudian \u65E0\u5173\u7684 Claude Code \u547D\u4EE4\u3002\u6BCF\u884C\u8F93\u5165\u4E00\u4E2A\u547D\u4EE4\u540D\u79F0\uFF0C\u65E0\u9700\u524D\u5BFC\u659C\u6760\u3002", + placeholder: "commit\nbuild\ntest" + }, + mcpServers: { + name: "MCP \u670D\u52A1\u5668", + desc: "\u914D\u7F6E\u6A21\u578B\u4E0A\u4E0B\u6587\u534F\u8BAE\u670D\u52A1\u5668\uFF0C\u901A\u8FC7\u5916\u90E8\u5DE5\u5177\u548C\u6570\u636E\u6E90\u6269\u5C55 Claude \u7684\u80FD\u529B\u3002\u542F\u7528\u4E0A\u4E0B\u6587\u4FDD\u5B58\u6A21\u5F0F\u7684\u670D\u52A1\u5668\u9700\u8981 @ \u63D0\u53CA\u624D\u80FD\u6FC0\u6D3B\u3002" + }, + plugins: { + name: "Claude Code \u63D2\u4EF6", + desc: "\u542F\u7528\u6216\u7981\u7528\u4ECE ~/.claude/plugins \u53D1\u73B0\u7684 Claude Code \u63D2\u4EF6\u3002\u542F\u7528\u7684\u63D2\u4EF6\u6309 Vault \u5B58\u50A8\u3002" + }, + subagents: { + name: "Subagents", + desc: "Configure custom subagents that Claude can delegate to.", + noAgents: "No subagents configured. Click + to create one.", + deleteConfirm: 'Delete subagent "{name}"?', + saveFailed: "Failed to save subagent: {message}", + deleteFailed: "Failed to delete subagent: {message}", + renameCleanupFailed: 'Warning: could not remove old file for "{name}"', + saved: 'Subagent "{name}" {action}', + deleted: 'Subagent "{name}" deleted', + duplicateName: 'An agent named "{name}" already exists', + descriptionRequired: "Description is required", + promptRequired: "System prompt is required", + modal: { + titleEdit: "Edit Subagent", + titleAdd: "Add Subagent", + name: "Name", + nameDesc: "Lowercase letters, numbers, and hyphens only", + namePlaceholder: "code-reviewer", + description: "Description", + descriptionDesc: "Brief description of this agent", + descriptionPlaceholder: "Reviews code for bugs and style", + advancedOptions: "Advanced options", + model: "Model", + modelDesc: "Model override for this agent", + tools: "Tools", + toolsDesc: "Comma-separated list of allowed tools (empty = all)", + disallowedTools: "Disallowed tools", + disallowedToolsDesc: "Comma-separated list of tools to disallow", + skills: "Skills", + skillsDesc: "Comma-separated list of skills", + prompt: "System prompt", + promptDesc: "Instructions for the agent", + promptPlaceholder: "You are a code reviewer. Analyze the given code for..." + } + }, + safety: "\u5B89\u5168", + loadUserSettings: { + name: "\u52A0\u8F7D\u7528\u6237 Claude \u8BBE\u7F6E", + desc: "\u52A0\u8F7D ~/.claude/settings.json\u3002\u542F\u7528\u540E\uFF0C\u7528\u6237\u7684 Claude Code \u6743\u9650\u89C4\u5219\u53EF\u80FD\u7ED5\u8FC7\u5B89\u5168\u6A21\u5F0F\u3002" + }, + enableBlocklist: { + name: "\u542F\u7528\u547D\u4EE4\u9ED1\u540D\u5355", + desc: "\u963B\u6B62\u6F5C\u5728\u5371\u9669\u7684 bash \u547D\u4EE4" + }, + blockedCommands: { + name: "\u963B\u6B62\u7684\u547D\u4EE4 ({platform})", + desc: "\u5728 {platform} \u4E0A\u963B\u6B62\u7684\u6A21\u5F0F\uFF08\u6BCF\u884C\u4E00\u4E2A\uFF09\u3002\u652F\u6301\u6B63\u5219\u8868\u8FBE\u5F0F\u3002", + unixName: "\u963B\u6B62\u7684\u547D\u4EE4 (Unix/Git Bash)", + unixDesc: "Unix \u6A21\u5F0F\u5728 Windows \u4E0A\u4E5F\u4F1A\u88AB\u963B\u6B62\uFF0C\u56E0\u4E3A Git Bash \u53EF\u4EE5\u8C03\u7528\u5B83\u4EEC\u3002" + }, + exportPaths: { + name: "\u5141\u8BB8\u7684\u5BFC\u51FA\u8DEF\u5F84", + desc: "\u5141\u8BB8\u5BFC\u51FA\u6587\u4EF6\u7684\u4ED3\u5E93\u5916\u90E8\u8DEF\u5F84\uFF08\u6BCF\u884C\u4E00\u4E2A\uFF09\u3002\u652F\u6301 ~ \u8868\u793A\u4E3B\u76EE\u5F55\u3002" + }, + environment: "\u73AF\u5883", + customVariables: { + name: "\u81EA\u5B9A\u4E49\u53D8\u91CF", + desc: "Claude SDK \u7684\u73AF\u5883\u53D8\u91CF\uFF08KEY=VALUE \u683C\u5F0F\uFF0C\u6BCF\u884C\u4E00\u4E2A\uFF09\u3002\u652F\u6301 export \u524D\u7F00\u3002" + }, + envSnippets: { + name: "\u7247\u6BB5", + addBtn: "\u6DFB\u52A0\u7247\u6BB5", + noSnippets: "\u5C1A\u65E0\u4FDD\u5B58\u7684\u73AF\u5883\u53D8\u91CF\u7247\u6BB5\u3002\u70B9\u51FB + \u4FDD\u5B58\u5F53\u524D\u914D\u7F6E\u3002", + nameRequired: "\u8BF7\u8F93\u5165\u7247\u6BB5\u540D\u79F0", + modal: { + titleEdit: "\u7F16\u8F91\u7247\u6BB5", + titleSave: "\u4FDD\u5B58\u7247\u6BB5", + name: "\u540D\u79F0", + namePlaceholder: "\u6B64\u914D\u7F6E\u7684\u63CF\u8FF0\u6027\u540D\u79F0", + description: "\u63CF\u8FF0", + descPlaceholder: "\u53EF\u9009\u63CF\u8FF0", + envVars: "\u73AF\u5883\u53D8\u91CF", + envVarsPlaceholder: "KEY=VALUE \u683C\u5F0F\uFF0C\u6BCF\u884C\u4E00\u4E2A\uFF08\u652F\u6301 export \u524D\u7F00\uFF09", + save: "\u4FDD\u5B58", + update: "\u66F4\u65B0", + cancel: "\u53D6\u6D88" + } + }, + customContextLimits: { + name: "\u81EA\u5B9A\u4E49\u4E0A\u4E0B\u6587\u9650\u5236", + desc: "\u4E3A\u60A8\u7684\u81EA\u5B9A\u4E49\u6A21\u578B\u8BBE\u7F6E\u4E0A\u4E0B\u6587\u7A97\u53E3\u5927\u5C0F\u3002\u7559\u7A7A\u4F7F\u7528\u9ED8\u8BA4\u503C\uFF08200k \u4EE4\u724C\uFF09\u3002", + invalid: "\u683C\u5F0F\u65E0\u6548\u3002\u4F7F\u7528\uFF1A256k\u30011m \u6216\u7CBE\u786E\u6570\u91CF\uFF081000-10000000\uFF09\u3002" + }, + advanced: "\u9AD8\u7EA7", + show1MModel: { + name: "\u542F\u7528\u5177\u6709 1M \u4E0A\u4E0B\u6587\u7A97\u53E3\u7684 Sonnet", + desc: "\u5728\u6A21\u578B\u9009\u62E9\u5668\u4E2D\u5C06\u6807\u51C6 Sonnet \u66FF\u6362\u4E3A Sonnet (1M)\u3002\u5728 200k \u4EE4\u724C\u4EE5\u4E0B\u4EF7\u683C\u76F8\u540C\u3002\u9700\u8981 Max \u8BA2\u9605\u3002" + }, + enableChrome: { + name: "\u542F\u7528 Chrome \u6269\u5C55", + desc: "\u5141\u8BB8 Claude \u901A\u8FC7 claude-in-chrome \u6269\u5C55\u4E0E Chrome \u4EA4\u4E92\u3002\u9700\u8981\u5B89\u88C5\u8BE5\u6269\u5C55\u3002\u9700\u8981\u91CD\u542F\u4F1A\u8BDD\u3002" + }, + enableBangBash: { + name: "\u542F\u7528\u547D\u4EE4\u6A21\u5F0F (!)", + desc: "\u5728\u7A7A\u8F93\u5165\u6846\u4E2D\u8F93\u5165 ! \u8FDB\u5165\u547D\u4EE4\u6A21\u5F0F\u3002\u901A\u8FC7 Node.js child_process \u76F4\u63A5\u8FD0\u884C\u547D\u4EE4\u3002\u9700\u8981\u91CD\u65B0\u6253\u5F00\u89C6\u56FE\u3002", + validation: { + noNode: "\u672A\u5728 PATH \u4E2D\u627E\u5230 Node.js\u3002\u8BF7\u5B89\u88C5 Node.js \u6216\u68C0\u67E5 PATH \u914D\u7F6E\u3002" + } + }, + maxTabs: { + name: "\u6700\u5927\u804A\u5929\u6807\u7B7E\u6570", + desc: "\u540C\u65F6\u5F00\u542F\u7684\u6700\u5927\u804A\u5929\u6807\u7B7E\u6570\uFF083-10\uFF09\u3002\u6BCF\u4E2A\u6807\u7B7E\u4F7F\u7528\u72EC\u7ACB\u7684 Claude \u4F1A\u8BDD\u3002", + warning: "\u8D85\u8FC7 5 \u4E2A\u6807\u7B7E\u53EF\u80FD\u4F1A\u5F71\u54CD\u6027\u80FD\u548C\u5185\u5B58\u4F7F\u7528\u3002" + }, + tabBarPosition: { + name: "\u6807\u7B7E\u680F\u4F4D\u7F6E", + desc: "\u9009\u62E9\u6807\u7B7E\u5FBD\u7AE0\u548C\u64CD\u4F5C\u6309\u94AE\u7684\u663E\u793A\u4F4D\u7F6E", + input: "\u8F93\u5165\u6846\u4E0A\u65B9\uFF08\u9ED8\u8BA4\uFF09", + header: "\u5728\u6807\u9898\u680F" + }, + enableAutoScroll: { + name: "\u6D41\u5F0F\u4F20\u8F93\u65F6\u81EA\u52A8\u6EDA\u52A8", + desc: "\u5728 Claude \u6D41\u5F0F\u4F20\u8F93\u54CD\u5E94\u65F6\u81EA\u52A8\u6EDA\u52A8\u5230\u5E95\u90E8\u3002\u7981\u7528\u540E\u5C06\u505C\u7559\u5728\u9876\u90E8\uFF0C\u4ECE\u5934\u5F00\u59CB\u9605\u8BFB\u3002" + }, + openInMainTab: { + name: "\u5728\u4E3B\u7F16\u8F91\u5668\u533A\u57DF\u6253\u5F00", + desc: "\u5728\u4E2D\u592E\u7F16\u8F91\u5668\u533A\u57DF\u4EE5\u4E3B\u6807\u7B7E\u9875\u5F62\u5F0F\u6253\u5F00\u804A\u5929\u9762\u677F\uFF0C\u800C\u4E0D\u662F\u5728\u53F3\u4FA7\u8FB9\u680F" + }, + cliPath: { + name: "Claude CLI \u8DEF\u5F84", + desc: "Claude Code CLI \u7684\u81EA\u5B9A\u4E49\u8DEF\u5F84\u3002\u7559\u7A7A\u4F7F\u7528\u81EA\u52A8\u68C0\u6D4B\u3002", + descWindows: "\u5BF9\u4E8E\u539F\u751F\u5B89\u88C5\u7A0B\u5E8F\uFF0C\u4F7F\u7528 claude.exe\u3002\u5BF9\u4E8E npm/pnpm/yarn \u6216\u5176\u4ED6\u5305\u7BA1\u7406\u5668\u5B89\u88C5\uFF0C\u4F7F\u7528 cli.js \u8DEF\u5F84\uFF08\u4E0D\u662F claude.cmd\uFF09\u3002", + descUnix: '\u7C98\u8D34 "which claude" \u7684\u8F93\u51FA - \u9002\u7528\u4E8E\u539F\u751F\u5B89\u88C5\u548C npm/pnpm/yarn \u5B89\u88C5\u3002', + validation: { + notExist: "\u8DEF\u5F84\u4E0D\u5B58\u5728", + isDirectory: "\u8DEF\u5F84\u662F\u76EE\u5F55\uFF0C\u4E0D\u662F\u6587\u4EF6" + } + }, + language: { + name: "\u8BED\u8A00", + desc: "\u66F4\u6539\u63D2\u4EF6\u754C\u9762\u7684\u663E\u793A\u8BED\u8A00" + } +}; +var zh_CN_default2 = { + common: common9, + chat: chat9, + settings: settings9 +}; + +// src/i18n/locales/zh-TW.json +var zh_TW_exports = {}; +__export(zh_TW_exports, { + chat: () => chat10, + common: () => common10, + default: () => zh_TW_default2, + settings: () => settings10 +}); +var common10 = { + save: "\u4FDD\u5B58", + cancel: "\u53D6\u6D88", + delete: "\u522A\u9664", + edit: "\u7DE8\u8F2F", + add: "\u6DFB\u52A0", + remove: "\u79FB\u9664", + clear: "\u6E05\u9664", + clearAll: "\u6E05\u9664\u5168\u90E8", + loading: "\u52A0\u8F09\u4E2D", + error: "\u932F\u8AA4", + success: "\u6210\u529F", + warning: "\u8B66\u544A", + confirm: "\u78BA\u8A8D", + settings: "\u8A2D\u7F6E", + advanced: "\u9AD8\u7D1A", + enabled: "\u5DF2\u555F\u7528", + disabled: "\u5DF2\u7981\u7528", + platform: "\u5E73\u53F0", + rewind: "\u56DE\u9000" +}; +var chat10 = { + rewind: { + confirmMessage: "\u56DE\u9000\u5230\u6B64\u8655\uFF1F\u6B64\u8A0A\u606F\u4E4B\u5F8C\u7684\u6A94\u6848\u8B8A\u66F4\u5C07\u88AB\u9084\u539F\u3002\u56DE\u9000\u4E0D\u6703\u5F71\u97FF\u624B\u52D5\u6216\u900F\u904E bash \u7DE8\u8F2F\u7684\u6A94\u6848\u3002", + confirmButton: "\u56DE\u9000", + ariaLabel: "\u56DE\u9000\u5230\u6B64\u8655", + notice: "\u5DF2\u56DE\u9000\uFF1A\u9084\u539F\u4E86 {count} \u500B\u6A94\u6848", + noticeSaveFailed: "\u5DF2\u56DE\u9000\uFF1A\u9084\u539F\u4E86 {count} \u500B\u6A94\u6848\uFF0C\u4F46\u7121\u6CD5\u5132\u5B58\u72C0\u614B\uFF1A{error}", + failed: "\u56DE\u9000\u5931\u6557\uFF1A{error}", + cannot: "\u7121\u6CD5\u56DE\u9000\uFF1A{error}", + unavailableStreaming: "\u4E32\u6D41\u56DE\u61C9\u4E2D\u7121\u6CD5\u56DE\u9000", + unavailableNoUuid: "\u7121\u6CD5\u56DE\u9000\uFF1A\u7F3A\u5C11\u8A0A\u606F\u8B58\u5225\u78BC" + }, + fork: { + ariaLabel: "\u5206\u53C9\u5C0D\u8A71", + chooseTarget: "\u5206\u53C9\u5C0D\u8A71", + targetNewTab: "\u65B0\u5206\u9801", + targetCurrentTab: "\u76EE\u524D\u5206\u9801", + maxTabsReached: "\u7121\u6CD5\u5206\u53C9\uFF1A\u5DF2\u9054\u5230\u6700\u5927 {count} \u500B\u5206\u9801", + notice: "\u5DF2\u5206\u53C9\u5230\u65B0\u5206\u9801", + noticeCurrentTab: "\u5DF2\u5728\u76EE\u524D\u5206\u9801\u5206\u53C9", + failed: "\u5206\u53C9\u5931\u6557\uFF1A{error}", + unavailableStreaming: "\u4E32\u6D41\u56DE\u61C9\u4E2D\u7121\u6CD5\u5206\u53C9", + unavailableNoUuid: "\u7121\u6CD5\u5206\u53C9\uFF1A\u7F3A\u5C11\u8A0A\u606F\u8B58\u5225\u78BC", + unavailableNoResponse: "\u7121\u6CD5\u5206\u53C9\uFF1A\u6C92\u6709\u53EF\u5206\u53C9\u7684\u56DE\u61C9", + errorMessageNotFound: "Message not found", + errorNoSession: "No session ID available", + errorNoActiveTab: "No active tab", + commandNoMessages: "\u7121\u6CD5\u5206\u53C9\uFF1A\u5C0D\u8A71\u4E2D\u6C92\u6709\u8A0A\u606F", + commandNoAssistantUuid: "\u7121\u6CD5\u5206\u53C9\uFF1A\u6C92\u6709\u5E36\u8B58\u5225\u78BC\u7684\u52A9\u624B\u56DE\u8986" + }, + bangBash: { + placeholder: "> Run a bash command...", + commandPanel: "Command panel", + copyAriaLabel: "Copy latest command output", + clearAriaLabel: "Clear bash output", + commandLabel: "{command}", + statusLabel: "Status: {status}", + collapseOutput: "Collapse command output", + expandOutput: "Expand command output", + running: "Running...", + copyFailed: "Failed to copy to clipboard" + } +}; +var settings10 = { + title: "Claudian \u8A2D\u5B9A", + customization: "\u500B\u4EBA\u5316\u8A2D\u5B9A", + userName: { + name: "Claudian \u61C9\u8A72\u5982\u4F55\u7A31\u547C\u60A8\uFF1F", + desc: "\u7528\u65BC\u500B\u4EBA\u5316\u554F\u5019\u7684\u4F7F\u7528\u8005\u540D\u7A31\uFF08\u7559\u7A7A\u4F7F\u7528\u901A\u7528\u554F\u5019\uFF09" + }, + excludedTags: { + name: "\u6392\u9664\u7684\u6A19\u7C64", + desc: "\u5305\u542B\u9019\u4E9B\u6A19\u7C64\u7684\u7B46\u8A18\u4E0D\u6703\u81EA\u52D5\u8F09\u5165\u70BA\u4E0A\u4E0B\u6587\uFF08\u6BCF\u884C\u4E00\u500B\uFF0C\u4E0D\u5E36 #\uFF09" + }, + mediaFolder: { + name: "\u5A92\u9AD4\u8CC7\u6599\u593E", + desc: "\u5B58\u653E\u9644\u4EF6/\u5716\u7247\u7684\u8CC7\u6599\u593E\u3002\u7576\u7B46\u8A18\u4F7F\u7528 ![[image.jpg]] \u6642\uFF0CClaude \u6703\u5728\u6B64\u67E5\u627E\u3002\u7559\u7A7A\u4F7F\u7528\u5132\u5B58\u5EAB\u6839\u76EE\u9304\u3002" + }, + systemPrompt: { + name: "\u81EA\u8A02\u7CFB\u7D71\u63D0\u793A\u8A5E", + desc: "\u9644\u52A0\u5230\u9810\u8A2D\u7CFB\u7D71\u63D0\u793A\u8A5E\u7684\u984D\u5916\u6307\u4EE4" + }, + autoTitle: { + name: "\u81EA\u52D5\u751F\u6210\u5C0D\u8A71\u6A19\u984C", + desc: "\u5728\u4F7F\u7528\u8005\u9001\u51FA\u7B2C\u4E00\u5247\u8A0A\u606F\u5F8C\u81EA\u52D5\u751F\u6210\u5C0D\u8A71\u6A19\u984C\u3002" + }, + titleModel: { + name: "\u6A19\u984C\u751F\u6210\u6A21\u578B", + desc: "\u7528\u65BC\u81EA\u52D5\u751F\u6210\u5C0D\u8A71\u6A19\u984C\u7684\u6A21\u578B\u3002", + auto: "\u81EA\u52D5 (Haiku)" + }, + navMappings: { + name: "Vim \u98A8\u683C\u5C0E\u822A\u6620\u5C04", + desc: '\u6BCF\u884C\u4E00\u500B\u6620\u5C04\u3002\u683C\u5F0F\uFF1A"map <\u9375> <\u52D5\u4F5C>"\uFF08\u52D5\u4F5C\uFF1AscrollUp, scrollDown, focusInput\uFF09\u3002' + }, + hotkeys: "\u5FEB\u6377\u9375", + inlineEditHotkey: { + name: "\u5167\u5D4C\u7DE8\u8F2F", + descWithKey: "\u76EE\u524D\u5FEB\u6377\u9375\uFF1A{hotkey}", + descNoKey: "\u672A\u8A2D\u5B9A\u5FEB\u6377\u9375", + btnChange: "\u8B8A\u66F4", + btnSet: "\u8A2D\u5B9A\u5FEB\u6377\u9375" + }, + openChatHotkey: { + name: "\u958B\u555F\u804A\u5929", + descWithKey: "\u76EE\u524D\u5FEB\u6377\u9375\uFF1A{hotkey}", + descNoKey: "\u672A\u8A2D\u5B9A\u5FEB\u6377\u9375", + btnChange: "\u8B8A\u66F4", + btnSet: "\u8A2D\u5B9A\u5FEB\u6377\u9375" + }, + newSessionHotkey: { + name: "\u65B0\u5DE5\u4F5C\u968E\u6BB5", + descWithKey: "\u76EE\u524D\u5FEB\u6377\u9375\uFF1A{hotkey}", + descNoKey: "\u672A\u8A2D\u5B9A\u5FEB\u6377\u9375", + btnChange: "\u8B8A\u66F4", + btnSet: "\u8A2D\u5B9A\u5FEB\u6377\u9375" + }, + newTabHotkey: { + name: "\u65B0\u5206\u9801", + descWithKey: "\u76EE\u524D\u5FEB\u6377\u9375\uFF1A{hotkey}", + descNoKey: "\u672A\u8A2D\u5B9A\u5FEB\u6377\u9375", + btnChange: "\u8B8A\u66F4", + btnSet: "\u8A2D\u5B9A\u5FEB\u6377\u9375" + }, + closeTabHotkey: { + name: "\u95DC\u9589\u5206\u9801", + descWithKey: "\u76EE\u524D\u5FEB\u6377\u9375\uFF1A{hotkey}", + descNoKey: "\u672A\u8A2D\u5B9A\u5FEB\u6377\u9375", + btnChange: "\u8B8A\u66F4", + btnSet: "\u8A2D\u5B9A\u5FEB\u6377\u9375" + }, + slashCommands: { + name: "\u547D\u4EE4\u8207\u6280\u80FD", + desc: "\u5B9A\u7FA9\u7531 /\u540D\u7A31 \u89F8\u767C\u7684\u81EA\u8A02\u547D\u4EE4\u8207\u6280\u80FD\u3002" + }, + hiddenSlashCommands: { + name: "\u96B1\u85CF\u547D\u4EE4", + desc: "\u5F9E\u4E0B\u62C9\u9078\u55AE\u4E2D\u96B1\u85CF\u7279\u5B9A\u7684\u659C\u7DDA\u547D\u4EE4\u3002\u9069\u7528\u65BC\u96B1\u85CF\u8207 Claudian \u7121\u95DC\u7684 Claude Code \u547D\u4EE4\u3002\u6BCF\u884C\u8F38\u5165\u4E00\u500B\u547D\u4EE4\u540D\u7A31\uFF0C\u7121\u9700\u524D\u5C0E\u659C\u7DDA\u3002", + placeholder: "commit\nbuild\ntest" + }, + mcpServers: { + name: "MCP \u4F3A\u670D\u5668", + desc: "\u8A2D\u5B9A\u6A21\u578B\u4E0A\u4E0B\u6587\u5354\u5B9A\u4F3A\u670D\u5668\uFF0C\u900F\u904E\u5916\u90E8\u5DE5\u5177\u548C\u8CC7\u6599\u4F86\u6E90\u64F4\u5C55 Claude \u7684\u80FD\u529B\u3002\u555F\u7528\u4E0A\u4E0B\u6587\u4FDD\u5B58\u6A21\u5F0F\u7684\u4F3A\u670D\u5668\u9700\u8981 @ \u63D0\u53CA\u624D\u80FD\u555F\u7528\u3002" + }, + plugins: { + name: "Claude Code \u5916\u639B\u7A0B\u5F0F", + desc: "\u555F\u7528\u6216\u505C\u7528\u5F9E ~/.claude/plugins \u767C\u73FE\u7684 Claude Code \u5916\u639B\u7A0B\u5F0F\u3002\u5DF2\u555F\u7528\u7684\u5916\u639B\u7A0B\u5F0F\u6309\u5132\u5B58\u5EAB\u5132\u5B58\u3002" + }, + subagents: { + name: "Subagents", + desc: "Configure custom subagents that Claude can delegate to.", + noAgents: "No subagents configured. Click + to create one.", + deleteConfirm: 'Delete subagent "{name}"?', + saveFailed: "Failed to save subagent: {message}", + deleteFailed: "Failed to delete subagent: {message}", + renameCleanupFailed: 'Warning: could not remove old file for "{name}"', + saved: 'Subagent "{name}" {action}', + deleted: 'Subagent "{name}" deleted', + duplicateName: 'An agent named "{name}" already exists', + descriptionRequired: "Description is required", + promptRequired: "System prompt is required", + modal: { + titleEdit: "Edit Subagent", + titleAdd: "Add Subagent", + name: "Name", + nameDesc: "Lowercase letters, numbers, and hyphens only", + namePlaceholder: "code-reviewer", + description: "Description", + descriptionDesc: "Brief description of this agent", + descriptionPlaceholder: "Reviews code for bugs and style", + advancedOptions: "Advanced options", + model: "Model", + modelDesc: "Model override for this agent", + tools: "Tools", + toolsDesc: "Comma-separated list of allowed tools (empty = all)", + disallowedTools: "Disallowed tools", + disallowedToolsDesc: "Comma-separated list of tools to disallow", + skills: "Skills", + skillsDesc: "Comma-separated list of skills", + prompt: "System prompt", + promptDesc: "Instructions for the agent", + promptPlaceholder: "You are a code reviewer. Analyze the given code for..." + } + }, + safety: "\u5B89\u5168", + loadUserSettings: { + name: "\u8F09\u5165\u4F7F\u7528\u8005 Claude \u8A2D\u5B9A", + desc: "\u8F09\u5165 ~/.claude/settings.json\u3002\u555F\u7528\u5F8C\uFF0C\u4F7F\u7528\u8005\u7684 Claude Code \u6B0A\u9650\u898F\u5247\u53EF\u80FD\u7E5E\u904E\u5B89\u5168\u6A21\u5F0F\u3002" + }, + enableBlocklist: { + name: "\u555F\u7528\u547D\u4EE4\u9ED1\u540D\u55AE", + desc: "\u963B\u6B62\u6F5B\u5728\u5371\u96AA\u7684 bash \u547D\u4EE4" + }, + blockedCommands: { + name: "\u963B\u6B62\u7684\u547D\u4EE4 ({platform})", + desc: "\u5728 {platform} \u4E0A\u963B\u6B62\u7684\u6A21\u5F0F\uFF08\u6BCF\u884C\u4E00\u500B\uFF09\u3002\u652F\u63F4\u6B63\u5247\u8868\u793A\u5F0F\u3002", + unixName: "\u963B\u6B62\u7684\u547D\u4EE4 (Unix/Git Bash)", + unixDesc: "Unix \u6A21\u5F0F\u5728 Windows \u4E0A\u4E5F\u6703\u88AB\u963B\u6B62\uFF0C\u56E0\u70BA Git Bash \u53EF\u4EE5\u547C\u53EB\u5B83\u5011\u3002" + }, + exportPaths: { + name: "\u5141\u8A31\u7684\u532F\u51FA\u8DEF\u5F91", + desc: "\u5141\u8A31\u532F\u51FA\u6A94\u6848\u7684\u5132\u5B58\u5EAB\u5916\u90E8\u8DEF\u5F91\uFF08\u6BCF\u884C\u4E00\u500B\uFF09\u3002\u652F\u63F4 ~ \u8868\u793A\u4E3B\u76EE\u9304\u3002" + }, + environment: "\u74B0\u5883", + customVariables: { + name: "\u81EA\u8A02\u8B8A\u6578", + desc: "Claude SDK \u7684\u74B0\u5883\u8B8A\u6578\uFF08KEY=VALUE \u683C\u5F0F\uFF0C\u6BCF\u884C\u4E00\u500B\uFF09\u3002\u652F\u63F4 export \u524D\u7DB4\u3002" + }, + envSnippets: { + name: "\u7247\u6BB5", + addBtn: "\u65B0\u589E\u7247\u6BB5", + noSnippets: "\u5C1A\u7121\u4FDD\u5B58\u7684\u74B0\u5883\u8B8A\u6578\u7247\u6BB5\u3002\u9EDE\u64CA + \u4FDD\u5B58\u7576\u524D\u914D\u7F6E\u3002", + nameRequired: "\u8ACB\u8F38\u5165\u7247\u6BB5\u540D\u7A31", + modal: { + titleEdit: "\u7DE8\u8F2F\u7247\u6BB5", + titleSave: "\u4FDD\u5B58\u7247\u6BB5", + name: "\u540D\u7A31", + namePlaceholder: "\u6B64\u914D\u7F6E\u7684\u63CF\u8FF0\u6027\u540D\u7A31", + description: "\u63CF\u8FF0", + descPlaceholder: "\u53EF\u9078\u63CF\u8FF0", + envVars: "\u74B0\u5883\u8B8A\u6578", + envVarsPlaceholder: "KEY=VALUE \u683C\u5F0F\uFF0C\u6BCF\u884C\u4E00\u500B\uFF08\u652F\u63F4 export \u524D\u7DB4\uFF09", + save: "\u4FDD\u5B58", + update: "\u66F4\u65B0", + cancel: "\u53D6\u6D88" + } + }, + customContextLimits: { + name: "\u81EA\u8A02\u4E0A\u4E0B\u6587\u9650\u5236", + desc: "\u70BA\u60A8\u7684\u81EA\u8A02\u6A21\u578B\u8A2D\u5B9A\u4E0A\u4E0B\u6587\u8996\u7A97\u5927\u5C0F\u3002\u7559\u7A7A\u4F7F\u7528\u9810\u8A2D\u503C\uFF08200k \u6B0A\u6756\uFF09\u3002", + invalid: "\u683C\u5F0F\u7121\u6548\u3002\u4F7F\u7528\uFF1A256k\u30011m \u6216\u7CBE\u78BA\u6578\u91CF\uFF081000-10000000\uFF09\u3002" + }, + advanced: "\u9032\u968E", + show1MModel: { + name: "\u555F\u7528\u5177\u6709 1M \u4E0A\u4E0B\u6587\u8996\u7A97\u7684 Sonnet", + desc: "\u5728\u6A21\u578B\u9078\u64C7\u5668\u4E2D\u5C07\u6A19\u6E96 Sonnet \u66FF\u63DB\u70BA Sonnet (1M)\u3002\u5728 200k \u6B0A\u6756\u4EE5\u4E0B\u50F9\u683C\u76F8\u540C\u3002\u9700\u8981 Max \u8A02\u95B1\u3002" + }, + enableChrome: { + name: "\u555F\u7528 Chrome \u64F4\u5145\u529F\u80FD", + desc: "\u5141\u8A31 Claude \u900F\u904E claude-in-chrome \u64F4\u5145\u529F\u80FD\u8207 Chrome \u4E92\u52D5\u3002\u9700\u8981\u5B89\u88DD\u8A72\u64F4\u5145\u529F\u80FD\u3002\u9700\u8981\u91CD\u65B0\u555F\u52D5\u5DE5\u4F5C\u968E\u6BB5\u3002" + }, + enableBangBash: { + name: "Enable bash mode (!)", + desc: "Type ! on empty input to enter bash mode. Runs commands directly via Node.js child_process.", + validation: { + noNode: "Node.js not found on PATH. Install Node.js or check your PATH configuration." + } + }, + maxTabs: { + name: "\u6700\u5927\u804A\u5929\u6A19\u7C64\u6578", + desc: "\u540C\u6642\u958B\u555F\u7684\u6700\u5927\u804A\u5929\u6A19\u7C64\u6578\uFF083-10\uFF09\u3002\u6BCF\u500B\u6A19\u7C64\u4F7F\u7528\u7368\u7ACB\u7684 Claude \u5C0D\u8A71\u3002", + warning: "\u8D85\u904E 5 \u500B\u6A19\u7C64\u53EF\u80FD\u6703\u5F71\u97FF\u6548\u80FD\u548C\u8A18\u61B6\u9AD4\u4F7F\u7528\u3002" + }, + tabBarPosition: { + name: "\u6A19\u7C64\u5217\u4F4D\u7F6E", + desc: "\u9078\u64C7\u6A19\u7C64\u5FBD\u7AE0\u548C\u64CD\u4F5C\u6309\u9215\u7684\u986F\u793A\u4F4D\u7F6E", + input: "\u8F38\u5165\u6846\u4E0A\u65B9\uFF08\u9810\u8A2D\uFF09", + header: "\u5728\u6A19\u984C\u5217" + }, + enableAutoScroll: { + name: "\u4E32\u6D41\u50B3\u8F38\u6642\u81EA\u52D5\u6372\u52D5", + desc: "\u5728 Claude \u4E32\u6D41\u50B3\u8F38\u56DE\u61C9\u6642\u81EA\u52D5\u6372\u52D5\u5230\u5E95\u90E8\u3002\u505C\u7528\u5F8C\u5C07\u505C\u7559\u5728\u9802\u90E8\uFF0C\u5F9E\u982D\u958B\u59CB\u95B1\u8B80\u3002" + }, + openInMainTab: { + name: "\u5728\u4E3B\u7DE8\u8F2F\u5668\u5340\u57DF\u958B\u555F", + desc: "\u5728\u4E2D\u592E\u7DE8\u8F2F\u5668\u5340\u57DF\u4EE5\u4E3B\u5206\u9801\u5F62\u5F0F\u958B\u555F\u804A\u5929\u9762\u677F\uFF0C\u800C\u4E0D\u662F\u5728\u53F3\u5074\u908A\u6B04" + }, + cliPath: { + name: "Claude CLI \u8DEF\u5F91", + desc: "Claude Code CLI \u7684\u81EA\u8A02\u8DEF\u5F91\u3002\u7559\u7A7A\u4F7F\u7528\u81EA\u52D5\u6AA2\u6E2C\u3002", + descWindows: "\u5C0D\u65BC\u539F\u751F\u5B89\u88DD\u7A0B\u5F0F\uFF0C\u4F7F\u7528 claude.exe\u3002\u5C0D\u65BC npm/pnpm/yarn \u6216\u5176\u4ED6\u5957\u4EF6\u7BA1\u7406\u5668\u5B89\u88DD\uFF0C\u4F7F\u7528 cli.js \u8DEF\u5F91\uFF08\u4E0D\u662F claude.cmd\uFF09\u3002", + descUnix: '\u8CBC\u4E0A "which claude" \u7684\u8F38\u51FA - \u9069\u7528\u65BC\u539F\u751F\u5B89\u88DD\u548C npm/pnpm/yarn \u5B89\u88DD\u3002', + validation: { + notExist: "\u8DEF\u5F91\u4E0D\u5B58\u5728", + isDirectory: "\u8DEF\u5F91\u662F\u76EE\u9304\uFF0C\u4E0D\u662F\u6A94\u6848" + } + }, + language: { + name: "\u8A9E\u8A00", + desc: "\u66F4\u6539\u63D2\u4EF6\u4ECB\u9762\u7684\u986F\u793A\u8A9E\u8A00" + } +}; +var zh_TW_default2 = { + common: common10, + chat: chat10, + settings: settings10 +}; + +// src/i18n/i18n.ts +var translations = { + en: en_exports, + "zh-CN": zh_CN_exports, + "zh-TW": zh_TW_exports, + ja: ja_exports, + ko: ko_exports, + de: de_exports, + fr: fr_exports, + es: es_exports, + ru: ru_exports, + pt: pt_exports +}; +var DEFAULT_LOCALE = "en"; +var currentLocale = DEFAULT_LOCALE; +function t(key, params) { + const dict = translations[currentLocale]; + const keys = key.split("."); + let value = dict; + for (const k of keys) { + if (value && typeof value === "object" && k in value) { + value = value[k]; + } else { + if (currentLocale !== DEFAULT_LOCALE) { + return tFallback(key, params); + } + return key; + } + } + if (typeof value !== "string") { + return key; + } + if (params) { + return value.replace(/\{(\w+)\}/g, (_, param) => { + var _a3, _b; + return (_b = (_a3 = params[param]) == null ? void 0 : _a3.toString()) != null ? _b : `{${param}}`; + }); + } + return value; +} +function tFallback(key, params) { + const dict = translations[DEFAULT_LOCALE]; + const keys = key.split("."); + let value = dict; + for (const k of keys) { + if (value && typeof value === "object" && k in value) { + value = value[k]; + } else { + return key; + } + } + if (typeof value !== "string") { + return key; + } + if (params) { + return value.replace(/\{(\w+)\}/g, (_, param) => { + var _a3, _b; + return (_b = (_a3 = params[param]) == null ? void 0 : _a3.toString()) != null ? _b : `{${param}}`; + }); + } + return value; +} +function setLocale(locale) { + if (!translations[locale]) { + return false; + } + currentLocale = locale; + return true; +} +function getAvailableLocales() { + return Object.keys(translations); +} +function getLocaleDisplayName(locale) { + const names = { + "en": "English", + "zh-CN": "\u7B80\u4F53\u4E2D\u6587", + "zh-TW": "\u7E41\u9AD4\u4E2D\u6587", + "ja": "\u65E5\u672C\u8A9E", + "ko": "\uD55C\uAD6D\uC5B4", + "de": "Deutsch", + "fr": "Fran\xE7ais", + "es": "Espa\xF1ol", + "ru": "\u0420\u0443\u0441\u0441\u043A\u0438\u0439", + "pt": "Portugu\xEAs" + }; + return names[locale] || locale; +} + // src/core/commands/builtInCommands.ts var BUILT_IN_COMMANDS = [ { @@ -50568,7 +53925,17 @@ var BUILT_IN_COMMANDS = [ description: "Add external context directory", action: "add-dir", hasArgs: true, - argumentHint: "path/to/directory" + argumentHint: "[path/to/directory]" + }, + { + name: "resume", + description: "Resume a previous conversation", + action: "resume" + }, + { + name: "fork", + description: "Fork entire conversation to new session", + action: "fork" } ]; var commandMap = /* @__PURE__ */ new Map(); @@ -50614,6 +53981,7 @@ var FILTERED_SDK_COMMANDS = /* @__PURE__ */ new Set([ var SlashCommandDropdown = class { constructor(containerEl, inputEl, callbacks, options = {}) { this.dropdownEl = null; + this.enabled = true; this.slashStartIndex = -1; this.selectedIndex = 0; this.filteredCommands = []; @@ -50631,10 +53999,17 @@ var SlashCommandDropdown = class { this.onInput = () => this.handleInputChange(); this.inputEl.addEventListener("input", this.onInput); } + setEnabled(enabled) { + this.enabled = enabled; + if (!enabled) { + this.hide(); + } + } setHiddenCommands(commands) { this.hiddenCommands = commands; } handleInputChange() { + if (!this.enabled) return; const text = this.getInputValue(); const cursorPos = this.getCursorPosition(); const textBeforeCursor = text.substring(0, cursorPos); @@ -50652,7 +54027,7 @@ var SlashCommandDropdown = class { this.showDropdown(searchText); } handleKeydown(e2) { - if (!this.isVisible()) return false; + if (!this.enabled || !this.isVisible()) return false; switch (e2.key) { case "ArrowDown": e2.preventDefault(); @@ -50792,7 +54167,7 @@ var SlashCommandDropdown = class { nameEl.setText(`/${cmd.name}`); if (cmd.argumentHint) { const hintEl = itemEl.createSpan({ cls: "claudian-slash-hint" }); - hintEl.setText(`[${cmd.argumentHint}]`); + hintEl.setText(normalizeArgumentHint(cmd.argumentHint)); } if (cmd.description) { const descEl = itemEl.createDiv({ cls: "claudian-slash-desc" }); @@ -50867,10 +54242,52 @@ var SlashCommandDropdown = class { }; // src/features/chat/controllers/ConversationController.ts -var import_obsidian8 = require("obsidian"); +var import_obsidian9 = require("obsidian"); + +// src/shared/modals/ConfirmModal.ts +var import_obsidian3 = require("obsidian"); +function confirmDelete(app, message) { + return new Promise((resolve4) => { + new ConfirmModal(app, message, resolve4).open(); + }); +} +function confirm2(app, message, confirmText) { + return new Promise((resolve4) => { + new ConfirmModal(app, message, resolve4, confirmText).open(); + }); +} +var ConfirmModal = class extends import_obsidian3.Modal { + constructor(app, message, resolve4, confirmText) { + super(app); + this.resolved = false; + this.message = message; + this.resolve = resolve4; + this.confirmText = confirmText != null ? confirmText : t("common.delete"); + } + onOpen() { + this.setTitle(t("common.confirm")); + this.modalEl.addClass("claudian-confirm-modal"); + this.contentEl.createEl("p", { text: this.message }); + new import_obsidian3.Setting(this.contentEl).addButton( + (btn) => btn.setButtonText(t("common.cancel")).onClick(() => this.close()) + ).addButton( + (btn) => btn.setButtonText(this.confirmText).setWarning().onClick(() => { + this.resolved = true; + this.resolve(true); + this.close(); + }) + ); + } + onClose() { + if (!this.resolved) { + this.resolve(false); + } + this.contentEl.empty(); + } +}; // src/features/chat/rendering/MessageRenderer.ts -var import_obsidian7 = require("obsidian"); +var import_obsidian8 = require("obsidian"); // src/utils/fileLink.ts var WIKILINK_PATTERN_SOURCE = "(?= 0; i2--) { + if (messages[i2].role === "assistant" && messages[i2].sdkAssistantUuid) { + prevAssistantUuid = messages[i2].sdkAssistantUuid; + break; + } + } + let hasResponse = false; + for (let i2 = userIndex + 1; i2 < messages.length; i2++) { + if (messages[i2].role === "user") break; + if (messages[i2].role === "assistant" && messages[i2].sdkAssistantUuid) { + hasResponse = true; + break; + } + } + return { prevAssistantUuid, hasResponse }; +} + // src/features/chat/rendering/SubagentRenderer.ts -var import_obsidian5 = require("obsidian"); +var import_obsidian6 = require("obsidian"); // src/core/tools/todo.ts function isValidTodoItem(item) { @@ -51124,7 +54561,10 @@ var TOOL_ICONS = { [TOOL_WEB_SEARCH]: "globe", [TOOL_WEB_FETCH]: "download", [TOOL_AGENT_OUTPUT]: "bot", - [TOOL_SKILL]: "zap" + [TOOL_ASK_USER_QUESTION]: "help-circle", + [TOOL_SKILL]: "zap", + [TOOL_ENTER_PLAN_MODE]: "map", + [TOOL_EXIT_PLAN_MODE]: "check-circle" }; var MCP_ICON_MARKER = "__mcp_icon__"; function getToolIcon(toolName) { @@ -51183,14 +54623,14 @@ function collapseElement(wrapperEl, headerEl, contentEl, state) { } // src/features/chat/rendering/ToolCallRenderer.ts -var import_obsidian4 = require("obsidian"); +var import_obsidian5 = require("obsidian"); // src/shared/icons.ts var MCP_ICON_SVG = `MCP`; var CHECK_ICON_SVG = ``; // src/features/chat/rendering/todoUtils.ts -var import_obsidian3 = require("obsidian"); +var import_obsidian4 = require("obsidian"); function getTodoStatusIcon(status) { return status === "completed" ? "check" : "dot"; } @@ -51203,7 +54643,7 @@ function renderTodoItems(container, todos) { const item = container.createDiv({ cls: `claudian-todo-item claudian-todo-${todo.status}` }); const icon = item.createSpan({ cls: "claudian-todo-status-icon" }); icon.setAttribute("aria-hidden", "true"); - (0, import_obsidian3.setIcon)(icon, getTodoStatusIcon(todo.status)); + (0, import_obsidian4.setIcon)(icon, getTodoStatusIcon(todo.status)); const text = item.createSpan({ cls: "claudian-todo-text" }); text.setText(getTodoDisplayText(todo)); } @@ -51215,7 +54655,7 @@ function setToolIcon(el, name) { if (icon === MCP_ICON_MARKER) { el.innerHTML = MCP_ICON_SVG; } else { - (0, import_obsidian4.setIcon)(el, icon); + (0, import_obsidian5.setIcon)(el, icon); } } function getToolLabel(name, input) { @@ -51256,6 +54696,10 @@ function getToolLabel(name, input) { const skillName = input.skill || "skill"; return `Skill: ${skillName}`; } + case TOOL_ENTER_PLAN_MODE: + return "Entering plan mode"; + case TOOL_EXIT_PLAN_MODE: + return "Plan complete"; default: return name; } @@ -51330,12 +54774,12 @@ function setTodoWriteStatus(statusEl, input) { const status = isComplete ? "completed" : "running"; const ariaLabel = isComplete ? "Status: completed" : "Status: in progress"; resetStatusElement(statusEl, `status-${status}`, ariaLabel); - if (isComplete) (0, import_obsidian4.setIcon)(statusEl, "check"); + if (isComplete) (0, import_obsidian5.setIcon)(statusEl, "check"); } function setToolStatus(statusEl, status) { resetStatusElement(statusEl, `status-${status}`, `Status: ${status}`); const icon = STATUS_ICONS[status]; - if (icon) (0, import_obsidian4.setIcon)(statusEl, icon); + if (icon) (0, import_obsidian5.setIcon)(statusEl, icon); } function renderToolResultContent(container, toolName, result) { if (!result) { @@ -51422,10 +54866,42 @@ function createToolElementStructure(parentEl, toolCall) { const content = toolEl.createDiv({ cls: "claudian-tool-content" }); return { toolEl, header, labelEl, statusEl, content, currentTaskEl }; } +function formatAnswer(raw) { + if (Array.isArray(raw)) return raw.join(", "); + if (typeof raw === "string") return raw; + return ""; +} +function renderAskUserQuestionResult(container, toolCall) { + container.empty(); + const questions = toolCall.input.questions; + const answers = toolCall.resolvedAnswers; + if (!questions || !Array.isArray(questions) || !answers) return; + const reviewEl = container.createDiv({ cls: "claudian-ask-review" }); + for (const q of questions) { + const answer = formatAnswer(answers[q.question]); + const qLine = reviewEl.createDiv({ cls: "claudian-ask-review-q" }); + qLine.createSpan({ text: q.question, cls: "claudian-ask-review-q-text" }); + const aLine = reviewEl.createDiv({ cls: "claudian-ask-review-a" }); + aLine.createSpan({ text: "\u2192 ", cls: "claudian-ask-review-arrow" }); + aLine.createSpan({ + text: answer || "Not answered", + cls: answer ? "claudian-ask-review-a-text" : "claudian-ask-review-empty" + }); + } +} function renderToolContent(content, toolCall, initialText) { if (toolCall.name === TOOL_TODO_WRITE) { content.addClass("claudian-tool-content-todo"); renderTodoWriteResult(content, toolCall.input); + } else if (toolCall.name === TOOL_ASK_USER_QUESTION) { + content.addClass("claudian-tool-content-ask"); + if (initialText || !toolCall.resolvedAnswers) { + const resultRow = content.createDiv({ cls: "claudian-tool-result-row" }); + const resultText = resultRow.createSpan({ cls: "claudian-tool-result-text" }); + resultText.setText("Waiting for answer..."); + } else { + renderAskUserQuestionResult(content, toolCall); + } } else { const resultRow = content.createDiv({ cls: "claudian-tool-result-row" }); const resultText = resultRow.createSpan({ cls: "claudian-tool-result-text" }); @@ -51482,6 +54958,14 @@ function updateToolCallResult(toolId, toolCall, toolCallElements) { if (statusEl) { setToolStatus(statusEl, toolCall.status); } + if (toolCall.name === TOOL_ASK_USER_QUESTION) { + const content = toolEl.querySelector(".claudian-tool-content"); + if (content) { + content.addClass("claudian-tool-content-ask"); + renderAskUserQuestionResult(content, toolCall); + } + return; + } const resultText = toolEl.querySelector(".claudian-tool-result-text"); if (resultText) { renderToolResultContent(resultText, toolCall.name, toolCall.result); @@ -51547,7 +55031,7 @@ function createSubagentBlock(parentEl, taskToolId, taskInput) { headerEl.setAttribute("aria-label", `Subagent task: ${truncateDescription(description)} - click to expand`); const iconEl = headerEl.createDiv({ cls: "claudian-subagent-icon" }); iconEl.setAttribute("aria-hidden", "true"); - (0, import_obsidian5.setIcon)(iconEl, getToolIcon(TOOL_TASK)); + (0, import_obsidian6.setIcon)(iconEl, getToolIcon(TOOL_TASK)); const labelEl = headerEl.createDiv({ cls: "claudian-subagent-label" }); labelEl.setText(truncateDescription(description)); const countEl = headerEl.createDiv({ cls: "claudian-subagent-count" }); @@ -51616,9 +55100,9 @@ function finalizeSubagentBlock(state, result, isError) { state.statusEl.addClass(`status-${state.info.status}`); state.statusEl.empty(); if (state.info.status === "completed") { - (0, import_obsidian5.setIcon)(state.statusEl, "check"); + (0, import_obsidian6.setIcon)(state.statusEl, "check"); } else { - (0, import_obsidian5.setIcon)(state.statusEl, "x"); + (0, import_obsidian6.setIcon)(state.statusEl, "x"); } if (state.info.status === "completed") { state.wrapperEl.addClass("done"); @@ -51645,7 +55129,7 @@ function renderStoredSubagent(parentEl, subagent) { headerEl.setAttribute("aria-label", `Subagent task: ${truncateDescription(subagent.description)} - ${toolCount} tool uses - Status: ${subagent.status}`); const iconEl = headerEl.createDiv({ cls: "claudian-subagent-icon" }); iconEl.setAttribute("aria-hidden", "true"); - (0, import_obsidian5.setIcon)(iconEl, getToolIcon(TOOL_TASK)); + (0, import_obsidian6.setIcon)(iconEl, getToolIcon(TOOL_TASK)); const labelEl = headerEl.createDiv({ cls: "claudian-subagent-label" }); labelEl.setText(truncateDescription(subagent.description)); const countEl = headerEl.createDiv({ cls: "claudian-subagent-count" }); @@ -51653,9 +55137,9 @@ function renderStoredSubagent(parentEl, subagent) { const statusEl = headerEl.createDiv({ cls: `claudian-subagent-status status-${subagent.status}` }); statusEl.setAttribute("aria-label", `Status: ${subagent.status}`); if (subagent.status === "completed") { - (0, import_obsidian5.setIcon)(statusEl, "check"); + (0, import_obsidian6.setIcon)(statusEl, "check"); } else if (subagent.status === "error") { - (0, import_obsidian5.setIcon)(statusEl, "x"); + (0, import_obsidian6.setIcon)(statusEl, "x"); } const contentEl = wrapperEl.createDiv({ cls: "claudian-subagent-content" }); if (subagent.status === "completed" || subagent.status === "error") { @@ -51760,7 +55244,7 @@ function createAsyncSubagentBlock(parentEl, taskToolId, taskInput) { headerEl.setAttribute("aria-label", `Background task: ${description} - click to expand`); const iconEl = headerEl.createDiv({ cls: "claudian-subagent-icon" }); iconEl.setAttribute("aria-hidden", "true"); - (0, import_obsidian5.setIcon)(iconEl, getToolIcon(TOOL_TASK)); + (0, import_obsidian6.setIcon)(iconEl, getToolIcon(TOOL_TASK)); const labelEl = headerEl.createDiv({ cls: "claudian-subagent-label" }); labelEl.setText(truncateDescription(description)); const statusTextEl = headerEl.createDiv({ cls: "claudian-subagent-status-text" }); @@ -51800,9 +55284,9 @@ function finalizeAsyncSubagent(state, result, isError) { state.statusEl.addClass(`status-${isError ? "error" : "completed"}`); state.statusEl.empty(); if (isError) { - (0, import_obsidian5.setIcon)(state.statusEl, "x"); + (0, import_obsidian6.setIcon)(state.statusEl, "x"); } else { - (0, import_obsidian5.setIcon)(state.statusEl, "check"); + (0, import_obsidian6.setIcon)(state.statusEl, "check"); } if (isError) { state.wrapperEl.addClass("error"); @@ -51828,7 +55312,7 @@ function markAsyncSubagentOrphaned(state) { state.statusTextEl.setText("Orphaned"); state.statusEl.className = "claudian-subagent-status status-error"; state.statusEl.empty(); - (0, import_obsidian5.setIcon)(state.statusEl, "alert-circle"); + (0, import_obsidian6.setIcon)(state.statusEl, "alert-circle"); state.wrapperEl.addClass("error"); state.wrapperEl.addClass("orphaned"); state.contentEl.empty(); @@ -51853,7 +55337,7 @@ function renderStoredAsyncSubagent(parentEl, subagent) { headerEl.setAttribute("aria-label", `Background task: ${subagent.description} - ${statusAriaLabel} - click to expand`); const iconEl = headerEl.createDiv({ cls: "claudian-subagent-icon" }); iconEl.setAttribute("aria-hidden", "true"); - (0, import_obsidian5.setIcon)(iconEl, getToolIcon(TOOL_TASK)); + (0, import_obsidian6.setIcon)(iconEl, getToolIcon(TOOL_TASK)); const labelEl = headerEl.createDiv({ cls: "claudian-subagent-label" }); labelEl.setText(truncateDescription(subagent.description)); const statusTextEl = headerEl.createDiv({ cls: "claudian-subagent-status-text" }); @@ -51874,13 +55358,13 @@ function renderStoredAsyncSubagent(parentEl, subagent) { statusEl.setAttribute("aria-label", `Status: ${statusAriaLabel}`); switch (displayStatus) { case "completed": - (0, import_obsidian5.setIcon)(statusEl, "check"); + (0, import_obsidian6.setIcon)(statusEl, "check"); break; case "error": - (0, import_obsidian5.setIcon)(statusEl, "x"); + (0, import_obsidian6.setIcon)(statusEl, "x"); break; case "orphaned": - (0, import_obsidian5.setIcon)(statusEl, "alert-circle"); + (0, import_obsidian6.setIcon)(statusEl, "alert-circle"); break; } const contentEl = wrapperEl.createDiv({ cls: "claudian-subagent-content" }); @@ -51969,7 +55453,7 @@ function renderStoredThinkingBlock(parentEl, content, durationSeconds, renderCon } // src/features/chat/rendering/WriteEditRenderer.ts -var import_obsidian6 = require("obsidian"); +var import_obsidian7 = require("obsidian"); // src/features/chat/rendering/DiffRenderer.ts function splitIntoHunks(diffLines, contextLines = 3) { @@ -52087,7 +55571,7 @@ function createWriteEditBlock(parentEl, toolCall) { headerEl.setAttribute("aria-label", `${toolName}: ${shortenPath2(filePath)} - click to expand`); const iconEl = headerEl.createDiv({ cls: "claudian-write-edit-icon" }); iconEl.setAttribute("aria-hidden", "true"); - (0, import_obsidian6.setIcon)(iconEl, getToolIcon(toolName)); + (0, import_obsidian7.setIcon)(iconEl, getToolIcon(toolName)); const labelEl = headerEl.createDiv({ cls: "claudian-write-edit-label" }); labelEl.setText(`${toolName}: ${shortenPath2(filePath)}`); const statsEl = headerEl.createDiv({ cls: "claudian-write-edit-stats" }); @@ -52125,7 +55609,7 @@ function finalizeWriteEditBlock(state, isError) { state.statusEl.empty(); if (isError) { state.statusEl.addClass("status-error"); - (0, import_obsidian6.setIcon)(state.statusEl, "x"); + (0, import_obsidian7.setIcon)(state.statusEl, "x"); state.statusEl.setAttribute("aria-label", "Status: error"); if (!state.diffLines) { state.contentEl.empty(); @@ -52161,7 +55645,7 @@ function renderStoredWriteEdit(parentEl, toolCall) { headerEl.setAttribute("role", "button"); const iconEl = headerEl.createDiv({ cls: "claudian-write-edit-icon" }); iconEl.setAttribute("aria-hidden", "true"); - (0, import_obsidian6.setIcon)(iconEl, getToolIcon(toolName)); + (0, import_obsidian7.setIcon)(iconEl, getToolIcon(toolName)); const labelEl = headerEl.createDiv({ cls: "claudian-write-edit-label" }); labelEl.setText(`${toolName}: ${shortenPath2(filePath)}`); const statsEl = headerEl.createDiv({ cls: "claudian-write-edit-stats" }); @@ -52171,7 +55655,7 @@ function renderStoredWriteEdit(parentEl, toolCall) { const statusEl = headerEl.createDiv({ cls: "claudian-write-edit-status" }); if (isError) { statusEl.addClass("status-error"); - (0, import_obsidian6.setIcon)(statusEl, "x"); + (0, import_obsidian7.setIcon)(statusEl, "x"); } const contentEl = wrapperEl.createDiv({ cls: "claudian-write-edit-content" }); const row = contentEl.createDiv({ cls: "claudian-write-edit-diff-row" }); @@ -52192,11 +55676,14 @@ function renderStoredWriteEdit(parentEl, toolCall) { // src/features/chat/rendering/MessageRenderer.ts var _MessageRenderer = class _MessageRenderer { - constructor(plugin, component, messagesEl) { + constructor(plugin, component, messagesEl, rewindCallback, forkCallback) { + this.liveMessageEls = /* @__PURE__ */ new Map(); this.app = plugin.app; this.plugin = plugin; this.component = component; this.messagesEl = messagesEl; + this.rewindCallback = rewindCallback; + this.forkCallback = forkCallback; registerFileLinkHandler(this.app, this.messagesEl, this.component); } /** Sets the messages container element. */ @@ -52226,12 +55713,16 @@ var _MessageRenderer = class _MessageRenderer { const msgEl = this.messagesEl.createDiv({ cls: `claudian-message claudian-message-${msg.role}` }); - const contentEl = msgEl.createDiv({ cls: "claudian-message-content" }); + const contentEl = msgEl.createDiv({ cls: "claudian-message-content", attr: { dir: "auto" } }); if (msg.role === "user") { const textToShow = (_b = msg.displayContent) != null ? _b : msg.content; if (textToShow) { const textEl = contentEl.createDiv({ cls: "claudian-text-block" }); void this.renderContent(textEl, textToShow); + this.addUserCopyButton(msgEl, textToShow); + } + if (this.rewindCallback || this.forkCallback) { + this.liveMessageEls.set(msg.id, msgEl); } } this.scrollToBottom(); @@ -52248,18 +55739,16 @@ var _MessageRenderer = class _MessageRenderer { */ renderMessages(messages, getGreeting) { this.messagesEl.empty(); + this.liveMessageEls.clear(); const newWelcomeEl = this.messagesEl.createDiv({ cls: "claudian-welcome" }); newWelcomeEl.createDiv({ cls: "claudian-welcome-greeting", text: getGreeting() }); - for (const msg of messages) { - this.renderStoredMessage(msg); + for (let i2 = 0; i2 < messages.length; i2++) { + this.renderStoredMessage(messages[i2], messages, i2); } this.scrollToBottom(); return newWelcomeEl; } - /** - * Renders a persisted message from history. - */ - renderStoredMessage(msg) { + renderStoredMessage(msg, allMessages, index) { var _a3, _b; if (msg.isInterrupt) { this.renderInterruptMessage(); @@ -52280,24 +55769,38 @@ var _MessageRenderer = class _MessageRenderer { const msgEl = this.messagesEl.createDiv({ cls: `claudian-message claudian-message-${msg.role}` }); - const contentEl = msgEl.createDiv({ cls: "claudian-message-content" }); + const contentEl = msgEl.createDiv({ cls: "claudian-message-content", attr: { dir: "auto" } }); if (msg.role === "user") { const textToShow = (_b = msg.displayContent) != null ? _b : msg.content; if (textToShow) { const textEl = contentEl.createDiv({ cls: "claudian-text-block" }); void this.renderContent(textEl, textToShow); + this.addUserCopyButton(msgEl, textToShow); + } + if (msg.sdkUserUuid && this.isRewindEligible(allMessages, index)) { + if (this.rewindCallback) { + this.addRewindButton(msgEl, msg.id); + } + if (this.forkCallback) { + this.addForkButton(msgEl, msg.id); + } } } else if (msg.role === "assistant") { this.renderAssistantContent(msg, contentEl); } } + isRewindEligible(allMessages, index) { + if (!allMessages || index === void 0) return false; + const ctx = findRewindContext(allMessages, index); + return !!ctx.prevAssistantUuid && ctx.hasResponse; + } /** * Renders an interrupt indicator (stored interrupts from SDK history). * Uses the same styling as streaming interrupts. */ renderInterruptMessage() { const msgEl = this.messagesEl.createDiv({ cls: "claudian-message claudian-message-assistant" }); - const contentEl = msgEl.createDiv({ cls: "claudian-message-content" }); + const contentEl = msgEl.createDiv({ cls: "claudian-message-content", attr: { dir: "auto" } }); const textEl = contentEl.createDiv({ cls: "claudian-text-block" }); textEl.innerHTML = 'Interrupted \xB7 What should Claudian do instead?'; } @@ -52472,7 +55975,7 @@ var _MessageRenderer = class _MessageRenderer { this.app, this.plugin.settings.mediaFolder ); - await import_obsidian7.MarkdownRenderer.renderMarkdown(processedMarkdown, el, "", this.component); + await import_obsidian8.MarkdownRenderer.renderMarkdown(processedMarkdown, el, "", this.component); el.querySelectorAll("pre").forEach((pre) => { var _a3, _b; if ((_a3 = pre.parentElement) == null ? void 0 : _a3.classList.contains("claudian-code-wrapper")) return; @@ -52542,6 +56045,87 @@ var _MessageRenderer = class _MessageRenderer { }, 1500); }); } + refreshActionButtons(msg, allMessages, index) { + if (!msg.sdkUserUuid) return; + if (!this.isRewindEligible(allMessages, index)) return; + const msgEl = this.liveMessageEls.get(msg.id); + if (!msgEl) return; + if (this.rewindCallback && !msgEl.querySelector(".claudian-message-rewind-btn")) { + this.addRewindButton(msgEl, msg.id); + } + if (this.forkCallback && !msgEl.querySelector(".claudian-message-fork-btn")) { + this.addForkButton(msgEl, msg.id); + } + this.cleanupLiveMessageEl(msg.id, msgEl); + } + cleanupLiveMessageEl(msgId, msgEl) { + const needsRewind = this.rewindCallback && !msgEl.querySelector(".claudian-message-rewind-btn"); + const needsFork = this.forkCallback && !msgEl.querySelector(".claudian-message-fork-btn"); + if (!needsRewind && !needsFork) { + this.liveMessageEls.delete(msgId); + } + } + getOrCreateActionsToolbar(msgEl) { + const existing = msgEl.querySelector(".claudian-user-msg-actions"); + if (existing) return existing; + return msgEl.createDiv({ cls: "claudian-user-msg-actions" }); + } + addUserCopyButton(msgEl, content) { + const toolbar = this.getOrCreateActionsToolbar(msgEl); + const copyBtn = toolbar.createSpan({ cls: "claudian-user-msg-copy-btn" }); + copyBtn.innerHTML = _MessageRenderer.COPY_ICON; + copyBtn.setAttribute("aria-label", "Copy message"); + let feedbackTimeout = null; + copyBtn.addEventListener("click", async (e2) => { + e2.stopPropagation(); + try { + await navigator.clipboard.writeText(content); + } catch (e3) { + return; + } + if (feedbackTimeout) clearTimeout(feedbackTimeout); + copyBtn.innerHTML = ""; + copyBtn.setText("copied!"); + copyBtn.classList.add("copied"); + feedbackTimeout = setTimeout(() => { + copyBtn.innerHTML = _MessageRenderer.COPY_ICON; + copyBtn.classList.remove("copied"); + feedbackTimeout = null; + }, 1500); + }); + } + addRewindButton(msgEl, messageId) { + const toolbar = this.getOrCreateActionsToolbar(msgEl); + const btn = toolbar.createSpan({ cls: "claudian-message-rewind-btn" }); + if (toolbar.firstChild !== btn) toolbar.insertBefore(btn, toolbar.firstChild); + btn.innerHTML = _MessageRenderer.REWIND_ICON; + btn.setAttribute("aria-label", t("chat.rewind.ariaLabel")); + btn.addEventListener("click", async (e2) => { + var _a3; + e2.stopPropagation(); + try { + await ((_a3 = this.rewindCallback) == null ? void 0 : _a3.call(this, messageId)); + } catch (err) { + new import_obsidian8.Notice(t("chat.rewind.failed", { error: err instanceof Error ? err.message : "Unknown error" })); + } + }); + } + addForkButton(msgEl, messageId) { + const toolbar = this.getOrCreateActionsToolbar(msgEl); + const btn = toolbar.createSpan({ cls: "claudian-message-fork-btn" }); + if (toolbar.firstChild !== btn) toolbar.insertBefore(btn, toolbar.firstChild); + btn.innerHTML = _MessageRenderer.FORK_ICON; + btn.setAttribute("aria-label", t("chat.fork.ariaLabel")); + btn.addEventListener("click", async (e2) => { + var _a3; + e2.stopPropagation(); + try { + await ((_a3 = this.forkCallback) == null ? void 0 : _a3.call(this, messageId)); + } catch (err) { + new import_obsidian8.Notice(t("chat.fork.failed", { error: err instanceof Error ? err.message : "Unknown error" })); + } + }); + } // ============================================ // Utilities // ============================================ @@ -52560,6 +56144,8 @@ var _MessageRenderer = class _MessageRenderer { } } }; +_MessageRenderer.REWIND_ICON = ``; +_MessageRenderer.FORK_ICON = ``; // ============================================ // Copy Button // ============================================ @@ -52617,6 +56203,9 @@ var ConversationController = class { state.clearMessages(); state.usage = null; state.currentTodos = null; + state.pendingNewSessionPlan = null; + state.planFilePath = null; + state.prePlanPermissionMode = null; state.autoScrollEnabled = (_b = plugin.settings.enableAutoScroll) != null ? _b : true; (_c = this.getAgentService()) == null ? void 0 : _c.setSessionId( null, @@ -52660,6 +56249,9 @@ var ConversationController = class { state.clearMessages(); state.usage = null; state.currentTodos = null; + state.pendingNewSessionPlan = null; + state.planFilePath = null; + state.prePlanPermissionMode = null; state.autoScrollEnabled = (_a3 = plugin.settings.enableAutoScroll) != null ? _a3 : true; (_b = this.getAgentService()) == null ? void 0 : _b.setSessionId( null, @@ -52717,7 +56309,7 @@ var ConversationController = class { } /** Switches to a different conversation. */ async switchTo(id) { - var _a3, _b, _c, _d, _e, _f, _g, _h; + var _a3, _b, _c, _d, _e, _f; const { plugin, state, renderer, subagentManager } = this.deps; if (id === state.currentConversationId) return; if (state.isStreaming) return; @@ -52740,7 +56332,11 @@ var ConversationController = class { (_c = this.deps.getStatusPanel()) == null ? void 0 : _c.clearSubagents(); const hasMessages = state.messages.length > 0; const externalContextPaths = hasMessages ? conversation.externalContextPaths || [] : plugin.settings.persistentExternalContextPaths || []; - (_e = this.getAgentService()) == null ? void 0 : _e.setSessionId((_d = conversation.sessionId) != null ? _d : null, externalContextPaths); + const agentService = this.getAgentService(); + if (agentService) { + const resolvedSessionId = agentService.applyForkState(conversation); + agentService.setSessionId(resolvedSessionId, externalContextPaths); + } this.deps.getInputEl().value = ""; this.deps.clearQueuedMessage(); const fileCtx = this.deps.getFileContextManager(); @@ -52763,13 +56359,83 @@ var ConversationController = class { () => this.getGreeting() ); this.deps.setWelcomeEl(welcomeEl); - (_f = this.deps.getHistoryDropdown()) == null ? void 0 : _f.removeClass("visible"); + (_d = this.deps.getHistoryDropdown()) == null ? void 0 : _d.removeClass("visible"); this.updateWelcomeVisibility(); - (_h = (_g = this.callbacks).onConversationSwitched) == null ? void 0 : _h.call(_g); + (_f = (_e = this.callbacks).onConversationSwitched) == null ? void 0 : _f.call(_e); } finally { state.isSwitchingConversation = false; } } + async rewind(userMessageId) { + var _a3, _b, _c; + const { plugin, state, renderer } = this.deps; + if (state.isStreaming) { + new import_obsidian9.Notice(t("chat.rewind.unavailableStreaming")); + return; + } + const msgs = state.messages; + const userIdx = msgs.findIndex((m) => m.id === userMessageId); + if (userIdx === -1) { + new import_obsidian9.Notice(t("chat.rewind.failed", { error: "Message not found" })); + return; + } + const userMsg = msgs[userIdx]; + if (!userMsg.sdkUserUuid) { + new import_obsidian9.Notice(t("chat.rewind.unavailableNoUuid")); + return; + } + const rewindCtx = findRewindContext(msgs, userIdx); + if (!rewindCtx.hasResponse || !rewindCtx.prevAssistantUuid) { + new import_obsidian9.Notice(t("chat.rewind.unavailableNoUuid")); + return; + } + const prevAssistantUuid = rewindCtx.prevAssistantUuid; + const confirmed = await confirm2( + plugin.app, + t("chat.rewind.confirmMessage"), + t("chat.rewind.confirmButton") + ); + if (!confirmed) return; + if (state.isStreaming) { + new import_obsidian9.Notice(t("chat.rewind.unavailableStreaming")); + return; + } + const agentService = this.getAgentService(); + if (!agentService) { + new import_obsidian9.Notice(t("chat.rewind.failed", { error: "Agent service not available" })); + return; + } + let result; + try { + result = await agentService.rewind(userMsg.sdkUserUuid, prevAssistantUuid); + } catch (e2) { + new import_obsidian9.Notice(t("chat.rewind.failed", { error: e2 instanceof Error ? e2.message : "Unknown error" })); + return; + } + if (!result.canRewind) { + new import_obsidian9.Notice(t("chat.rewind.cannot", { error: (_a3 = result.error) != null ? _a3 : "Unknown error" })); + return; + } + state.truncateAt(userMessageId); + const inputEl = this.deps.getInputEl(); + inputEl.value = userMsg.content; + inputEl.focus(); + const welcomeEl = renderer.renderMessages(state.messages, () => this.getGreeting()); + this.deps.setWelcomeEl(welcomeEl); + this.updateWelcomeVisibility(); + const filesChanged = (_c = (_b = result.filesChanged) == null ? void 0 : _b.length) != null ? _c : 0; + let saveError = null; + try { + await this.save(false, { resumeSessionAt: prevAssistantUuid }); + } catch (e2) { + saveError = e2 instanceof Error ? e2.message : "Failed to save"; + } + if (saveError) { + new import_obsidian9.Notice(t("chat.rewind.noticeSaveFailed", { count: String(filesChanged), error: saveError })); + return; + } + new import_obsidian9.Notice(t("chat.rewind.notice", { count: String(filesChanged) })); + } /** * Saves the current conversation. * @@ -52779,8 +56445,8 @@ var ConversationController = class { * For native sessions (new conversations with sessionId from SDK), * only metadata is saved - the SDK handles message persistence. */ - async save(updateLastResponse = false) { - var _a3, _b, _c, _d, _e, _f, _g, _h, _i; + async save(updateLastResponse = false, options) { + var _a3, _b, _c, _d, _e, _f, _g, _h, _i, _j; const { plugin, state } = this.deps; if (!state.currentConversationId && state.messages.length === 0) { return; @@ -52807,25 +56473,37 @@ var ConversationController = class { const oldSdkSessionId = conversation == null ? void 0 : conversation.sdkSessionId; const sessionChanged = isNative && sessionId && oldSdkSessionId && sessionId !== oldSdkSessionId; const previousSdkSessionIds = sessionChanged ? [.../* @__PURE__ */ new Set([...(conversation == null ? void 0 : conversation.previousSdkSessionIds) || [], oldSdkSessionId])] : conversation == null ? void 0 : conversation.previousSdkSessionIds; + const isForkSourceOnly = !!(conversation == null ? void 0 : conversation.forkSource) && !(conversation == null ? void 0 : conversation.sdkSessionId) && sessionId === conversation.forkSource.sessionId; + let resolvedSessionId; + if (sessionInvalidated) { + resolvedSessionId = null; + } else if (isForkSourceOnly) { + resolvedSessionId = (_h = conversation == null ? void 0 : conversation.sessionId) != null ? _h : null; + } else { + resolvedSessionId = (_i = sessionId != null ? sessionId : conversation == null ? void 0 : conversation.sessionId) != null ? _i : null; + } const updates = { - // For native sessions, don't persist messages (SDK handles that) - // For legacy sessions, persist messages as before messages: isNative ? state.messages : state.getPersistedMessages(), - // Preserve existing sessionId when SDK hasn't captured a new one yet - sessionId: sessionInvalidated ? null : (_h = sessionId != null ? sessionId : conversation == null ? void 0 : conversation.sessionId) != null ? _h : null, - sdkSessionId: isNative && sessionId ? sessionId : conversation == null ? void 0 : conversation.sdkSessionId, + sessionId: resolvedSessionId, + sdkSessionId: isNative && sessionId && !isForkSourceOnly ? sessionId : conversation == null ? void 0 : conversation.sdkSessionId, previousSdkSessionIds, isNative: isNative || void 0, legacyCutoffAt, sdkMessagesLoaded: isNative ? true : void 0, currentNote, externalContextPaths: externalContextPaths.length > 0 ? externalContextPaths : void 0, - usage: (_i = state.usage) != null ? _i : void 0, + usage: (_j = state.usage) != null ? _j : void 0, enabledMcpServers: enabledMcpServers.length > 0 ? enabledMcpServers : void 0 }; if (updateLastResponse) { updates.lastResponseAt = Date.now(); } + if (options) { + updates.resumeSessionAt = options.resumeSessionAt; + } + if ((conversation == null ? void 0 : conversation.forkSource) && sessionId && sessionId !== conversation.forkSource.sessionId) { + updates.forkSource = void 0; + } await plugin.updateConversation(state.currentConversationId, updates); } /** @@ -52895,7 +56573,7 @@ var ConversationController = class { cls: `claudian-history-item${isCurrent ? " active" : ""}` }); const iconEl = item.createDiv({ cls: "claudian-history-item-icon" }); - (0, import_obsidian8.setIcon)(iconEl, isCurrent ? "message-square-dot" : "message-square"); + (0, import_obsidian9.setIcon)(iconEl, isCurrent ? "message-square-dot" : "message-square"); const content = item.createDiv({ cls: "claudian-history-item-content" }); const titleEl = content.createDiv({ cls: "claudian-history-item-title", text: conv.title }); titleEl.setAttribute("title", conv.title); @@ -52915,11 +56593,11 @@ var ConversationController = class { const actions = item.createDiv({ cls: "claudian-history-item-actions" }); if (conv.titleGenerationStatus === "pending") { const loadingEl = actions.createEl("span", { cls: "claudian-action-btn claudian-action-loading" }); - (0, import_obsidian8.setIcon)(loadingEl, "loader-2"); + (0, import_obsidian9.setIcon)(loadingEl, "loader-2"); loadingEl.setAttribute("aria-label", "Generating title..."); } else if (conv.titleGenerationStatus === "failed") { const regenerateBtn = actions.createEl("button", { cls: "claudian-action-btn" }); - (0, import_obsidian8.setIcon)(regenerateBtn, "refresh-cw"); + (0, import_obsidian9.setIcon)(regenerateBtn, "refresh-cw"); regenerateBtn.setAttribute("aria-label", "Regenerate title"); regenerateBtn.addEventListener("click", async (e2) => { e2.stopPropagation(); @@ -52930,14 +56608,14 @@ var ConversationController = class { }); } const renameBtn = actions.createEl("button", { cls: "claudian-action-btn" }); - (0, import_obsidian8.setIcon)(renameBtn, "pencil"); + (0, import_obsidian9.setIcon)(renameBtn, "pencil"); renameBtn.setAttribute("aria-label", "Rename"); renameBtn.addEventListener("click", (e2) => { e2.stopPropagation(); this.showRenameInput(item, conv.id, conv.title); }); const deleteBtn = actions.createEl("button", { cls: "claudian-action-btn claudian-delete-btn" }); - (0, import_obsidian8.setIcon)(deleteBtn, "trash-2"); + (0, import_obsidian9.setIcon)(deleteBtn, "trash-2"); deleteBtn.setAttribute("aria-label", "Delete"); deleteBtn.addEventListener("click", async (e2) => { e2.stopPropagation(); @@ -53122,144 +56800,146 @@ var ConversationController = class { }; // src/features/chat/controllers/InputController.ts -var import_obsidian11 = require("obsidian"); +var import_obsidian12 = require("obsidian"); -// src/shared/modals/ApprovalModal.ts -var import_obsidian9 = require("obsidian"); -var ApprovalModal = class extends import_obsidian9.Modal { - constructor(app, toolName, _input, description, resolve4, options = {}) { - super(app); - this.resolved = false; - this.buttons = []; - this.currentButtonIndex = 0; - this.documentKeydownHandler = null; - this.toolName = toolName; - this.description = description; - this.resolve = resolve4; - this.options = options; +// src/shared/components/ResumeSessionDropdown.ts +var import_obsidian10 = require("obsidian"); +var ResumeSessionDropdown = class { + constructor(containerEl, inputEl, conversations, currentConversationId, callbacks) { + this.selectedIndex = 0; + this.containerEl = containerEl; + this.inputEl = inputEl; + this.conversations = this.sortConversations(conversations); + this.currentConversationId = currentConversationId; + this.callbacks = callbacks; + this.dropdownEl = this.containerEl.createDiv({ cls: "claudian-resume-dropdown" }); + this.render(); + this.dropdownEl.addClass("visible"); + this.onInput = () => this.dismiss(); + this.inputEl.addEventListener("input", this.onInput); } - onOpen() { - var _a3, _b; - const { contentEl } = this; - contentEl.addClass("claudian-approval-modal"); - this.setTitle((_a3 = this.options.title) != null ? _a3 : "Permission required"); - const infoEl = contentEl.createDiv({ cls: "claudian-approval-info" }); - const toolEl = infoEl.createDiv({ cls: "claudian-approval-tool" }); - const iconEl = toolEl.createSpan({ cls: "claudian-approval-icon" }); - iconEl.setAttribute("aria-hidden", "true"); - (0, import_obsidian9.setIcon)(iconEl, getToolIcon(this.toolName)); - toolEl.createSpan({ text: this.toolName, cls: "claudian-approval-tool-name" }); - if (this.options.decisionReason) { - const reasonEl = infoEl.createDiv({ cls: "claudian-approval-reason" }); - reasonEl.setText(this.options.decisionReason); - } - if (this.options.blockedPath) { - const pathEl = infoEl.createDiv({ cls: "claudian-approval-blocked-path" }); - pathEl.setText(this.options.blockedPath); - } - if (this.options.agentID) { - const agentEl = infoEl.createDiv({ cls: "claudian-approval-agent" }); - agentEl.setText(`Agent: ${this.options.agentID}`); - } - const descEl = contentEl.createDiv({ cls: "claudian-approval-desc" }); - descEl.setText(this.description); - const buttonsEl = contentEl.createDiv({ cls: "claudian-approval-buttons" }); - const denyBtn = buttonsEl.createEl("button", { - text: "Deny", - cls: "claudian-approval-btn claudian-deny-btn", - attr: { "aria-label": `Deny ${this.toolName} action` } - }); - denyBtn.addEventListener("click", () => this.handleDecision("deny")); - const allowBtn = buttonsEl.createEl("button", { - text: "Allow once", - cls: "claudian-approval-btn claudian-allow-btn", - attr: { "aria-label": `Allow ${this.toolName} action once` } - }); - allowBtn.addEventListener("click", () => this.handleDecision("allow")); - let alwaysAllowBtn = null; - if ((_b = this.options.showAlwaysAllow) != null ? _b : true) { - alwaysAllowBtn = buttonsEl.createEl("button", { - text: "Always allow", - cls: "claudian-approval-btn claudian-always-btn", - attr: { "aria-label": `Always allow ${this.toolName} actions` } - }); - alwaysAllowBtn.addEventListener("click", () => this.handleDecision("allow-always")); - } - this.buttons = [denyBtn, allowBtn]; - if (alwaysAllowBtn) { - this.buttons.push(alwaysAllowBtn); - } - this.currentButtonIndex = 0; - this.focusCurrentButton(); - this.attachDocumentHandler(); - } - handleDecision(decision) { - if (!this.resolved) { - this.resolved = true; - this.resolve(decision); - this.close(); - } - } - attachDocumentHandler() { - this.detachDocumentHandler(); - this.documentKeydownHandler = (e2) => { - if (!this.isNavigationKey(e2)) { - return; - } - e2.preventDefault(); - e2.stopPropagation(); - this.handleNavigationKey(e2); - }; - document.addEventListener("keydown", this.documentKeydownHandler, true); - } - detachDocumentHandler() { - if (this.documentKeydownHandler) { - document.removeEventListener("keydown", this.documentKeydownHandler, true); - this.documentKeydownHandler = null; - } - } - isNavigationKey(e2) { - return e2.key === "ArrowUp" || e2.key === "ArrowDown" || e2.key === "ArrowLeft" || e2.key === "ArrowRight" || e2.key === "Tab"; - } - handleNavigationKey(e2) { - if (!this.buttons.length) return; - let direction = 0; + handleKeydown(e2) { + if (!this.isVisible()) return false; switch (e2.key) { - case "ArrowUp": - case "ArrowLeft": - direction = -1; - break; case "ArrowDown": - case "ArrowRight": - direction = 1; - break; + e2.preventDefault(); + this.navigate(1); + return true; + case "ArrowUp": + e2.preventDefault(); + this.navigate(-1); + return true; + case "Enter": case "Tab": - direction = e2.shiftKey ? -1 : 1; - break; - default: - return; + if (this.conversations.length > 0) { + e2.preventDefault(); + this.selectItem(); + return true; + } + return false; + case "Escape": + e2.preventDefault(); + this.dismiss(); + return true; } - const total = this.buttons.length; - this.currentButtonIndex = (this.currentButtonIndex + direction + total) % total; - this.focusCurrentButton(); + return false; } - focusCurrentButton() { - const button = this.buttons[this.currentButtonIndex]; - button == null ? void 0 : button.focus(); + isVisible() { + var _a3, _b; + return (_b = (_a3 = this.dropdownEl) == null ? void 0 : _a3.hasClass("visible")) != null ? _b : false; } - onClose() { - this.detachDocumentHandler(); - if (!this.resolved) { - this.resolved = true; - this.resolve("cancel"); + destroy() { + var _a3; + this.inputEl.removeEventListener("input", this.onInput); + (_a3 = this.dropdownEl) == null ? void 0 : _a3.remove(); + } + dismiss() { + this.dropdownEl.removeClass("visible"); + this.callbacks.onDismiss(); + } + selectItem() { + if (this.conversations.length === 0) return; + const selected = this.conversations[this.selectedIndex]; + if (!selected) return; + if (selected.id === this.currentConversationId) { + this.dismiss(); + return; } - this.contentEl.empty(); + this.callbacks.onSelect(selected.id); + } + navigate(direction) { + const maxIndex = this.conversations.length - 1; + this.selectedIndex = Math.max(0, Math.min(maxIndex, this.selectedIndex + direction)); + this.updateSelection(); + } + updateSelection() { + const items = this.dropdownEl.querySelectorAll(".claudian-resume-item"); + items == null ? void 0 : items.forEach((item, index) => { + if (index === this.selectedIndex) { + item.addClass("selected"); + item.scrollIntoView({ block: "nearest" }); + } else { + item.removeClass("selected"); + } + }); + } + sortConversations(conversations) { + return [...conversations].sort((a, b3) => { + var _a3, _b; + return ((_a3 = b3.lastResponseAt) != null ? _a3 : b3.createdAt) - ((_b = a.lastResponseAt) != null ? _b : a.createdAt); + }); + } + render() { + var _a3; + this.dropdownEl.empty(); + const header = this.dropdownEl.createDiv({ cls: "claudian-resume-header" }); + header.createSpan({ text: "Resume conversation" }); + if (this.conversations.length === 0) { + this.dropdownEl.createDiv({ cls: "claudian-resume-empty", text: "No conversations" }); + return; + } + const list = this.dropdownEl.createDiv({ cls: "claudian-resume-list" }); + for (let i2 = 0; i2 < this.conversations.length; i2++) { + const conv = this.conversations[i2]; + const isCurrent = conv.id === this.currentConversationId; + const item = list.createDiv({ cls: "claudian-resume-item" }); + if (isCurrent) item.addClass("current"); + if (i2 === this.selectedIndex) item.addClass("selected"); + const iconEl = item.createDiv({ cls: "claudian-resume-item-icon" }); + (0, import_obsidian10.setIcon)(iconEl, isCurrent ? "message-square-dot" : "message-square"); + const content = item.createDiv({ cls: "claudian-resume-item-content" }); + const titleEl = content.createDiv({ cls: "claudian-resume-item-title", text: conv.title }); + titleEl.setAttribute("title", conv.title); + content.createDiv({ + cls: "claudian-resume-item-date", + text: isCurrent ? "Current session" : this.formatDate((_a3 = conv.lastResponseAt) != null ? _a3 : conv.createdAt) + }); + item.addEventListener("click", () => { + if (isCurrent) { + this.dismiss(); + return; + } + this.callbacks.onSelect(conv.id); + }); + item.addEventListener("mouseenter", () => { + this.selectedIndex = i2; + this.updateSelection(); + }); + } + } + formatDate(timestamp) { + const date7 = new Date(timestamp); + const now = /* @__PURE__ */ new Date(); + if (date7.toDateString() === now.toDateString()) { + return date7.toLocaleTimeString(void 0, { hour: "2-digit", minute: "2-digit", hour12: false }); + } + return date7.toLocaleDateString(void 0, { month: "short", day: "numeric" }); } }; // src/shared/modals/InstructionConfirmModal.ts -var import_obsidian10 = require("obsidian"); -var InstructionModal = class extends import_obsidian10.Modal { +var import_obsidian11 = require("obsidian"); +var InstructionModal = class extends import_obsidian11.Modal { constructor(app, rawInstruction, callbacks) { super(app); this.state = "loading"; @@ -53303,7 +56983,7 @@ var InstructionModal = class extends import_obsidian10.Modal { const responseSection = this.clarificationEl.createDiv({ cls: "claudian-instruction-section" }); const responseLabel = responseSection.createDiv({ cls: "claudian-instruction-label" }); responseLabel.setText("Your response:"); - this.responseTextarea = new import_obsidian10.TextAreaComponent(responseSection); + this.responseTextarea = new import_obsidian11.TextAreaComponent(responseSection); this.responseTextarea.inputEl.addClass("claudian-instruction-response-textarea"); this.responseTextarea.inputEl.rows = 3; this.responseTextarea.inputEl.placeholder = "Provide more details..."; @@ -53321,7 +57001,7 @@ var InstructionModal = class extends import_obsidian10.Modal { this.refinedDisplayEl = refinedSection.createDiv({ cls: "claudian-instruction-refined" }); this.editContainerEl = refinedSection.createDiv({ cls: "claudian-instruction-edit-container" }); this.editContainerEl.style.display = "none"; - this.editTextarea = new import_obsidian10.TextAreaComponent(this.editContainerEl); + this.editTextarea = new import_obsidian11.TextAreaComponent(this.editContainerEl); this.editTextarea.inputEl.addClass("claudian-instruction-edit-textarea"); this.editTextarea.inputEl.rows = 4; this.buttonsEl = contentEl.createDiv({ cls: "claudian-instruction-buttons" }); @@ -53536,16 +57216,778 @@ function appendMarkdownSnippet(existingPrompt, snippet) { return existingPrompt + separator + trimmedSnippet; } +// src/features/chat/rendering/InlineAskUserQuestion.ts +var HINTS_TEXT = "Enter to select \xB7 Tab/Arrow keys to navigate \xB7 Esc to cancel"; +var HINTS_TEXT_IMMEDIATE = "Enter to select \xB7 Arrow keys to navigate \xB7 Esc to cancel"; +var InlineAskUserQuestion = class { + constructor(containerEl, input, resolve4, signal, config2) { + this.resolved = false; + this.questions = []; + this.answers = /* @__PURE__ */ new Map(); + this.customInputs = /* @__PURE__ */ new Map(); + this.activeTabIndex = 0; + this.focusedItemIndex = 0; + this.isInputFocused = false; + this.tabElements = []; + this.currentItems = []; + this.abortHandler = null; + var _a3, _b, _c; + this.containerEl = containerEl; + this.input = input; + this.resolveCallback = resolve4; + this.signal = signal; + this.config = { + title: (_a3 = config2 == null ? void 0 : config2.title) != null ? _a3 : "Claude has a question", + headerEl: config2 == null ? void 0 : config2.headerEl, + showCustomInput: (_b = config2 == null ? void 0 : config2.showCustomInput) != null ? _b : true, + immediateSelect: (_c = config2 == null ? void 0 : config2.immediateSelect) != null ? _c : false + }; + this.boundKeyDown = this.handleKeyDown.bind(this); + } + render() { + this.rootEl = this.containerEl.createDiv({ cls: "claudian-ask-question-inline" }); + const titleEl = this.rootEl.createDiv({ cls: "claudian-ask-inline-title" }); + titleEl.setText(this.config.title); + if (this.config.headerEl) { + this.rootEl.appendChild(this.config.headerEl); + } + this.questions = this.parseQuestions(); + if (this.questions.length === 0) { + this.handleResolve(null); + return; + } + if (this.config.immediateSelect && this.questions.length !== 1) { + this.config.immediateSelect = false; + } + for (let i2 = 0; i2 < this.questions.length; i2++) { + this.answers.set(i2, /* @__PURE__ */ new Set()); + this.customInputs.set(i2, ""); + } + if (!this.config.immediateSelect) { + this.tabBar = this.rootEl.createDiv({ cls: "claudian-ask-tab-bar" }); + this.renderTabBar(); + } + this.contentArea = this.rootEl.createDiv({ cls: "claudian-ask-content" }); + this.renderTabContent(); + this.rootEl.setAttribute("tabindex", "0"); + this.rootEl.addEventListener("keydown", this.boundKeyDown); + requestAnimationFrame(() => { + this.rootEl.focus(); + this.rootEl.scrollIntoView({ block: "nearest", behavior: "smooth" }); + }); + if (this.signal) { + this.abortHandler = () => this.handleResolve(null); + this.signal.addEventListener("abort", this.abortHandler, { once: true }); + } + } + destroy() { + this.handleResolve(null); + } + parseQuestions() { + const raw = this.input.questions; + if (!Array.isArray(raw)) return []; + return raw.filter( + (q) => typeof q === "object" && q !== null && typeof q.question === "string" && Array.isArray(q.options) && q.options.length > 0 + ).map((q, idx) => { + var _a3; + return { + question: q.question, + header: typeof q.header === "string" ? q.header.slice(0, 12) : `Q${idx + 1}`, + options: this.deduplicateOptions(q.options.map((o) => this.coerceOption(o))), + multiSelect: (_a3 = q.multiSelect) != null ? _a3 : false + }; + }); + } + coerceOption(opt) { + if (typeof opt === "object" && opt !== null) { + const obj = opt; + const label = this.extractLabel(obj); + const description = typeof obj.description === "string" ? obj.description : ""; + return { label, description }; + } + return { label: typeof opt === "string" ? opt : String(opt), description: "" }; + } + deduplicateOptions(options) { + const seen = /* @__PURE__ */ new Set(); + return options.filter((o) => { + if (seen.has(o.label)) return false; + seen.add(o.label); + return true; + }); + } + extractLabel(obj) { + if (typeof obj.label === "string") return obj.label; + if (typeof obj.value === "string") return obj.value; + if (typeof obj.text === "string") return obj.text; + if (typeof obj.name === "string") return obj.name; + return String(obj); + } + renderTabBar() { + this.tabBar.empty(); + this.tabElements = []; + for (let idx = 0; idx < this.questions.length; idx++) { + const answered = this.isQuestionAnswered(idx); + const tab = this.tabBar.createSpan({ cls: "claudian-ask-tab" }); + tab.createSpan({ text: this.questions[idx].header, cls: "claudian-ask-tab-label" }); + tab.createSpan({ text: answered ? " \u2713" : "", cls: "claudian-ask-tab-tick" }); + tab.setAttribute("title", this.questions[idx].question); + if (idx === this.activeTabIndex) tab.addClass("is-active"); + if (answered) tab.addClass("is-answered"); + tab.addEventListener("click", () => this.switchTab(idx)); + this.tabElements.push(tab); + } + const allAnswered = this.questions.every((_, i2) => this.isQuestionAnswered(i2)); + const submitTab = this.tabBar.createSpan({ cls: "claudian-ask-tab" }); + submitTab.createSpan({ text: allAnswered ? "\u2713 " : "", cls: "claudian-ask-tab-submit-check" }); + submitTab.createSpan({ text: "Submit", cls: "claudian-ask-tab-label" }); + if (this.activeTabIndex === this.questions.length) submitTab.addClass("is-active"); + submitTab.addEventListener("click", () => this.switchTab(this.questions.length)); + this.tabElements.push(submitTab); + } + isQuestionAnswered(idx) { + return this.answers.get(idx).size > 0 || this.customInputs.get(idx).trim().length > 0; + } + switchTab(index) { + const clamped = Math.max(0, Math.min(index, this.questions.length)); + if (clamped === this.activeTabIndex) return; + this.activeTabIndex = clamped; + this.focusedItemIndex = 0; + this.isInputFocused = false; + if (!this.config.immediateSelect) { + this.renderTabBar(); + } + this.renderTabContent(); + this.rootEl.focus(); + } + renderTabContent() { + this.contentArea.empty(); + this.currentItems = []; + if (this.activeTabIndex < this.questions.length) { + this.renderQuestionTab(this.activeTabIndex); + } else { + this.renderSubmitTab(); + } + } + renderQuestionTab(idx) { + var _a3; + const q = this.questions[idx]; + const isMulti = q.multiSelect; + const selected = this.answers.get(idx); + this.contentArea.createDiv({ + text: q.question, + cls: "claudian-ask-question-text" + }); + const listEl = this.contentArea.createDiv({ cls: "claudian-ask-list" }); + for (let optIdx = 0; optIdx < q.options.length; optIdx++) { + const option = q.options[optIdx]; + const isFocused = optIdx === this.focusedItemIndex; + const isSelected = selected.has(option.label); + const row = listEl.createDiv({ cls: "claudian-ask-item" }); + if (isFocused) row.addClass("is-focused"); + if (isSelected) row.addClass("is-selected"); + row.createSpan({ text: isFocused ? "\u203A" : "\xA0", cls: "claudian-ask-cursor" }); + row.createSpan({ text: `${optIdx + 1}. `, cls: "claudian-ask-item-num" }); + if (isMulti) { + this.renderMultiSelectCheckbox(row, isSelected); + } + const labelBlock = row.createDiv({ cls: "claudian-ask-item-content" }); + const labelRow = labelBlock.createDiv({ cls: "claudian-ask-label-row" }); + labelRow.createSpan({ text: option.label, cls: "claudian-ask-item-label" }); + if (!isMulti && isSelected) { + labelRow.createSpan({ text: " \u2713", cls: "claudian-ask-check-mark" }); + } + if (option.description) { + labelBlock.createDiv({ text: option.description, cls: "claudian-ask-item-desc" }); + } + row.addEventListener("click", () => { + this.focusedItemIndex = optIdx; + this.updateFocusIndicator(); + this.selectOption(idx, option.label); + }); + this.currentItems.push(row); + } + if (this.config.showCustomInput) { + const customIdx = q.options.length; + const customFocused = customIdx === this.focusedItemIndex; + const customText = (_a3 = this.customInputs.get(idx)) != null ? _a3 : ""; + const hasCustomText = customText.trim().length > 0; + const customRow = listEl.createDiv({ cls: "claudian-ask-item claudian-ask-custom-item" }); + if (customFocused) customRow.addClass("is-focused"); + customRow.createSpan({ text: customFocused ? "\u203A" : "\xA0", cls: "claudian-ask-cursor" }); + customRow.createSpan({ text: `${customIdx + 1}. `, cls: "claudian-ask-item-num" }); + if (isMulti) { + this.renderMultiSelectCheckbox(customRow, hasCustomText); + } + const inputEl = customRow.createEl("input", { + type: "text", + cls: "claudian-ask-custom-text", + placeholder: "Type something.", + value: customText + }); + inputEl.addEventListener("input", () => { + this.customInputs.set(idx, inputEl.value); + if (!isMulti && inputEl.value.trim()) { + selected.clear(); + this.updateOptionVisuals(idx); + } + this.updateTabIndicators(); + }); + inputEl.addEventListener("focus", () => { + this.isInputFocused = true; + }); + inputEl.addEventListener("blur", () => { + this.isInputFocused = false; + }); + this.currentItems.push(customRow); + } + this.contentArea.createDiv({ + text: this.config.immediateSelect ? HINTS_TEXT_IMMEDIATE : HINTS_TEXT, + cls: "claudian-ask-hints" + }); + } + renderSubmitTab() { + this.contentArea.createDiv({ + text: "Review your answers", + cls: "claudian-ask-review-title" + }); + const reviewEl = this.contentArea.createDiv({ cls: "claudian-ask-review" }); + for (let idx = 0; idx < this.questions.length; idx++) { + const q = this.questions[idx]; + const answerText = this.getAnswerText(idx); + const qLine = reviewEl.createDiv({ cls: "claudian-ask-review-q" }); + qLine.createSpan({ text: "\u25CF ", cls: "claudian-ask-review-bullet" }); + qLine.createSpan({ text: q.question, cls: "claudian-ask-review-q-text" }); + qLine.addEventListener("click", () => this.switchTab(idx)); + const aLine = reviewEl.createDiv({ cls: "claudian-ask-review-a" }); + aLine.createSpan({ text: " \u2192 ", cls: "claudian-ask-review-arrow" }); + aLine.createSpan({ + text: answerText || "Not answered", + cls: answerText ? "claudian-ask-review-a-text" : "claudian-ask-review-empty" + }); + aLine.addEventListener("click", () => this.switchTab(idx)); + } + this.contentArea.createDiv({ + text: "Ready to submit your answers?", + cls: "claudian-ask-review-prompt" + }); + const actionsEl = this.contentArea.createDiv({ cls: "claudian-ask-list" }); + const allAnswered = this.questions.every((_, i2) => this.isQuestionAnswered(i2)); + const submitRow = actionsEl.createDiv({ cls: "claudian-ask-item" }); + if (this.focusedItemIndex === 0) submitRow.addClass("is-focused"); + if (!allAnswered) submitRow.addClass("is-disabled"); + submitRow.createSpan({ text: this.focusedItemIndex === 0 ? "\u203A" : "\xA0", cls: "claudian-ask-cursor" }); + submitRow.createSpan({ text: "1. ", cls: "claudian-ask-item-num" }); + submitRow.createSpan({ text: "Submit answers", cls: "claudian-ask-item-label" }); + submitRow.addEventListener("click", () => { + this.focusedItemIndex = 0; + this.updateFocusIndicator(); + this.handleSubmit(); + }); + this.currentItems.push(submitRow); + const cancelRow = actionsEl.createDiv({ cls: "claudian-ask-item" }); + if (this.focusedItemIndex === 1) cancelRow.addClass("is-focused"); + cancelRow.createSpan({ text: this.focusedItemIndex === 1 ? "\u203A" : "\xA0", cls: "claudian-ask-cursor" }); + cancelRow.createSpan({ text: "2. ", cls: "claudian-ask-item-num" }); + cancelRow.createSpan({ text: "Cancel", cls: "claudian-ask-item-label" }); + cancelRow.addEventListener("click", () => { + this.focusedItemIndex = 1; + this.handleResolve(null); + }); + this.currentItems.push(cancelRow); + this.contentArea.createDiv({ + text: HINTS_TEXT, + cls: "claudian-ask-hints" + }); + } + getAnswerText(idx) { + const selected = this.answers.get(idx); + const custom2 = this.customInputs.get(idx); + const parts = []; + if (selected.size > 0) parts.push([...selected].join(", ")); + if (custom2.trim()) parts.push(custom2.trim()); + return parts.join(", "); + } + selectOption(qIdx, label) { + const q = this.questions[qIdx]; + const selected = this.answers.get(qIdx); + const isMulti = q.multiSelect; + if (isMulti) { + if (selected.has(label)) { + selected.delete(label); + } else { + selected.add(label); + } + } else { + selected.clear(); + selected.add(label); + this.customInputs.set(qIdx, ""); + } + this.updateOptionVisuals(qIdx); + if (this.config.immediateSelect) { + const result = {}; + result[q.question] = label; + this.handleResolve(result); + return; + } + this.updateTabIndicators(); + if (!isMulti) { + this.switchTab(this.activeTabIndex + 1); + } + } + renderMultiSelectCheckbox(parent, checked) { + parent.createSpan({ + text: checked ? "[\u2713] " : "[ ] ", + cls: `claudian-ask-check${checked ? " is-checked" : ""}` + }); + } + updateOptionVisuals(qIdx) { + const q = this.questions[qIdx]; + const selected = this.answers.get(qIdx); + const isMulti = q.multiSelect; + for (let i2 = 0; i2 < q.options.length; i2++) { + const item = this.currentItems[i2]; + const isSelected = selected.has(q.options[i2].label); + item.toggleClass("is-selected", isSelected); + if (isMulti) { + const checkSpan = item.querySelector(".claudian-ask-check"); + if (checkSpan) { + checkSpan.textContent = isSelected ? "[\u2713] " : "[ ] "; + checkSpan.toggleClass("is-checked", isSelected); + } + } else { + const labelRow = item.querySelector(".claudian-ask-label-row"); + const existingMark = item.querySelector(".claudian-ask-check-mark"); + if (isSelected && !existingMark && labelRow) { + labelRow.createSpan({ text: " \u2713", cls: "claudian-ask-check-mark" }); + } else if (!isSelected && existingMark) { + existingMark.remove(); + } + } + } + } + updateFocusIndicator() { + for (let i2 = 0; i2 < this.currentItems.length; i2++) { + const item = this.currentItems[i2]; + const cursor = item.querySelector(".claudian-ask-cursor"); + if (i2 === this.focusedItemIndex) { + item.addClass("is-focused"); + if (cursor) cursor.textContent = "\u203A"; + item.scrollIntoView({ block: "nearest" }); + if (item.hasClass("claudian-ask-custom-item")) { + const input = item.querySelector(".claudian-ask-custom-text"); + if (input) { + input.focus(); + this.isInputFocused = true; + } + } + } else { + item.removeClass("is-focused"); + if (cursor) cursor.textContent = "\xA0"; + if (item.hasClass("claudian-ask-custom-item")) { + const input = item.querySelector(".claudian-ask-custom-text"); + if (input && document.activeElement === input) { + input.blur(); + this.isInputFocused = false; + } + } + } + } + } + updateTabIndicators() { + for (let idx = 0; idx < this.questions.length; idx++) { + const tab = this.tabElements[idx]; + const tick = tab.querySelector(".claudian-ask-tab-tick"); + const answered = this.isQuestionAnswered(idx); + tab.toggleClass("is-answered", answered); + if (tick) tick.textContent = answered ? " \u2713" : ""; + } + const submitTab = this.tabElements[this.questions.length]; + if (submitTab) { + const submitCheck = submitTab.querySelector(".claudian-ask-tab-submit-check"); + const allAnswered = this.questions.every((_, i2) => this.isQuestionAnswered(i2)); + if (submitCheck) submitCheck.textContent = allAnswered ? "\u2713 " : ""; + } + } + handleNavigationKey(e2, maxFocusIndex) { + switch (e2.key) { + case "ArrowDown": + e2.preventDefault(); + e2.stopPropagation(); + this.focusedItemIndex = Math.min(this.focusedItemIndex + 1, maxFocusIndex); + this.updateFocusIndicator(); + return true; + case "ArrowUp": + e2.preventDefault(); + e2.stopPropagation(); + this.focusedItemIndex = Math.max(this.focusedItemIndex - 1, 0); + this.updateFocusIndicator(); + return true; + case "ArrowLeft": + if (this.config.immediateSelect) return false; + e2.preventDefault(); + e2.stopPropagation(); + this.switchTab(this.activeTabIndex - 1); + return true; + case "Tab": + if (this.config.immediateSelect) return false; + e2.preventDefault(); + e2.stopPropagation(); + if (e2.shiftKey) { + this.switchTab(this.activeTabIndex - 1); + } else { + this.switchTab(this.activeTabIndex + 1); + } + return true; + case "Escape": + e2.preventDefault(); + e2.stopPropagation(); + this.handleResolve(null); + return true; + default: + return false; + } + } + handleKeyDown(e2) { + var _a3, _b; + if (this.isInputFocused) { + if (e2.key === "Escape") { + e2.preventDefault(); + e2.stopPropagation(); + this.isInputFocused = false; + (_a3 = document.activeElement) == null ? void 0 : _a3.blur(); + this.rootEl.focus(); + return; + } + if (e2.key === "Tab" || e2.key === "Enter") { + e2.preventDefault(); + e2.stopPropagation(); + this.isInputFocused = false; + (_b = document.activeElement) == null ? void 0 : _b.blur(); + if (e2.key === "Tab" && e2.shiftKey) { + this.switchTab(this.activeTabIndex - 1); + } else { + this.switchTab(this.activeTabIndex + 1); + } + return; + } + return; + } + if (this.config.immediateSelect) { + const q3 = this.questions[this.activeTabIndex]; + const maxIdx = q3.options.length - 1; + if (this.handleNavigationKey(e2, maxIdx)) return; + if (e2.key === "Enter") { + e2.preventDefault(); + e2.stopPropagation(); + if (this.focusedItemIndex <= maxIdx) { + this.selectOption(this.activeTabIndex, q3.options[this.focusedItemIndex].label); + } + } + return; + } + const isSubmitTab = this.activeTabIndex === this.questions.length; + const q = this.questions[this.activeTabIndex]; + const maxFocusIndex = isSubmitTab ? 1 : this.config.showCustomInput ? q.options.length : q.options.length - 1; + if (this.handleNavigationKey(e2, maxFocusIndex)) return; + if (isSubmitTab) { + if (e2.key === "Enter") { + e2.preventDefault(); + e2.stopPropagation(); + if (this.focusedItemIndex === 0) this.handleSubmit(); + else this.handleResolve(null); + } + return; + } + switch (e2.key) { + case "ArrowRight": + e2.preventDefault(); + e2.stopPropagation(); + this.switchTab(this.activeTabIndex + 1); + break; + case "Enter": + e2.preventDefault(); + e2.stopPropagation(); + if (this.focusedItemIndex < q.options.length) { + this.selectOption(this.activeTabIndex, q.options[this.focusedItemIndex].label); + } else if (this.config.showCustomInput) { + this.isInputFocused = true; + const input = this.contentArea.querySelector( + ".claudian-ask-custom-text" + ); + input == null ? void 0 : input.focus(); + } + break; + } + } + handleSubmit() { + const allAnswered = this.questions.every((_, i2) => this.isQuestionAnswered(i2)); + if (!allAnswered) return; + const result = {}; + for (let i2 = 0; i2 < this.questions.length; i2++) { + result[this.questions[i2].question] = this.getAnswerText(i2); + } + this.handleResolve(result); + } + handleResolve(result) { + var _a3, _b; + if (!this.resolved) { + this.resolved = true; + (_a3 = this.rootEl) == null ? void 0 : _a3.removeEventListener("keydown", this.boundKeyDown); + if (this.signal && this.abortHandler) { + this.signal.removeEventListener("abort", this.abortHandler); + this.abortHandler = null; + } + (_b = this.rootEl) == null ? void 0 : _b.remove(); + this.resolveCallback(result); + } + } +}; + +// src/features/chat/rendering/InlineExitPlanMode.ts +var HINTS_TEXT2 = "Arrow keys to navigate \xB7 Enter to select \xB7 Esc to cancel"; +var InlineExitPlanMode = class { + constructor(containerEl, input, resolve4, signal, renderContent) { + this.resolved = false; + this.planContent = null; + this.planReadError = null; + this.focusedIndex = 0; + this.items = []; + this.isInputFocused = false; + this.abortHandler = null; + this.containerEl = containerEl; + this.input = input; + this.resolveCallback = resolve4; + this.signal = signal; + this.renderContent = renderContent; + this.boundKeyDown = this.handleKeyDown.bind(this); + } + render() { + this.rootEl = this.containerEl.createDiv({ cls: "claudian-plan-approval-inline" }); + const titleEl = this.rootEl.createDiv({ cls: "claudian-plan-inline-title" }); + titleEl.setText("Plan complete"); + this.planContent = this.readPlanContent(); + if (this.planContent) { + const contentEl = this.rootEl.createDiv({ cls: "claudian-plan-content-preview" }); + if (this.renderContent) { + void this.renderContent(contentEl, this.planContent); + } else { + contentEl.createDiv({ cls: "claudian-plan-content-text", text: this.planContent }); + } + } else if (this.planReadError) { + this.rootEl.createDiv({ + cls: "claudian-plan-content-preview claudian-plan-read-error", + text: `Could not read plan file: ${this.planReadError}. "Approve (new session)" will not include plan details.` + }); + } + const allowedPrompts = this.input.allowedPrompts; + if (allowedPrompts && Array.isArray(allowedPrompts) && allowedPrompts.length > 0) { + const permEl = this.rootEl.createDiv({ cls: "claudian-plan-permissions" }); + permEl.createDiv({ text: "Requested permissions:", cls: "claudian-plan-permissions-label" }); + const listEl = permEl.createEl("ul", { cls: "claudian-plan-permissions-list" }); + for (const perm of allowedPrompts) { + listEl.createEl("li", { text: perm.prompt }); + } + } + const actionsEl = this.rootEl.createDiv({ cls: "claudian-ask-list" }); + const newSessionRow = actionsEl.createDiv({ cls: "claudian-ask-item" }); + newSessionRow.addClass("is-focused"); + newSessionRow.createSpan({ text: "\u203A", cls: "claudian-ask-cursor" }); + newSessionRow.createSpan({ text: "1. ", cls: "claudian-ask-item-num" }); + newSessionRow.createSpan({ text: "Approve (new session)", cls: "claudian-ask-item-label" }); + newSessionRow.addEventListener("click", () => { + this.focusedIndex = 0; + this.updateFocus(); + this.handleResolve({ + type: "approve-new-session", + planContent: this.extractPlanContent() + }); + }); + this.items.push(newSessionRow); + const approveRow = actionsEl.createDiv({ cls: "claudian-ask-item" }); + approveRow.createSpan({ text: "\xA0", cls: "claudian-ask-cursor" }); + approveRow.createSpan({ text: "2. ", cls: "claudian-ask-item-num" }); + approveRow.createSpan({ text: "Approve (current session)", cls: "claudian-ask-item-label" }); + approveRow.addEventListener("click", () => { + this.focusedIndex = 1; + this.updateFocus(); + this.handleResolve({ type: "approve" }); + }); + this.items.push(approveRow); + const feedbackRow = actionsEl.createDiv({ cls: "claudian-ask-item claudian-ask-custom-item" }); + feedbackRow.createSpan({ text: "\xA0", cls: "claudian-ask-cursor" }); + feedbackRow.createSpan({ text: "3. ", cls: "claudian-ask-item-num" }); + this.feedbackInput = feedbackRow.createEl("input", { + type: "text", + cls: "claudian-ask-custom-text", + placeholder: "Enter feedback to continue planning..." + }); + this.feedbackInput.addEventListener("focus", () => { + this.isInputFocused = true; + }); + this.feedbackInput.addEventListener("blur", () => { + this.isInputFocused = false; + }); + feedbackRow.addEventListener("click", () => { + this.focusedIndex = 2; + this.updateFocus(); + }); + this.items.push(feedbackRow); + this.rootEl.createDiv({ text: HINTS_TEXT2, cls: "claudian-ask-hints" }); + this.rootEl.setAttribute("tabindex", "0"); + this.rootEl.addEventListener("keydown", this.boundKeyDown); + requestAnimationFrame(() => { + this.rootEl.focus(); + this.rootEl.scrollIntoView({ block: "nearest", behavior: "smooth" }); + }); + if (this.signal) { + this.abortHandler = () => this.handleResolve(null); + this.signal.addEventListener("abort", this.abortHandler, { once: true }); + } + } + destroy() { + this.handleResolve(null); + } + readPlanContent() { + const planFilePath = this.input.planFilePath; + if (!planFilePath) return null; + try { + const fs11 = require("fs"); + const content = fs11.readFileSync(planFilePath, "utf-8"); + return content.trim() || null; + } catch (err) { + this.planReadError = err instanceof Error ? err.message : "unknown error"; + return null; + } + } + extractPlanContent() { + if (this.planContent) { + return `Implement this plan: + +${this.planContent}`; + } + return "Implement the approved plan."; + } + handleKeyDown(e2) { + if (this.isInputFocused) { + if (e2.key === "Escape") { + e2.preventDefault(); + e2.stopPropagation(); + this.isInputFocused = false; + this.feedbackInput.blur(); + this.rootEl.focus(); + return; + } + if (e2.key === "Enter" && this.feedbackInput.value.trim()) { + e2.preventDefault(); + e2.stopPropagation(); + this.handleResolve({ type: "feedback", text: this.feedbackInput.value.trim() }); + return; + } + return; + } + switch (e2.key) { + case "ArrowDown": + e2.preventDefault(); + e2.stopPropagation(); + this.focusedIndex = Math.min(this.focusedIndex + 1, this.items.length - 1); + this.updateFocus(); + break; + case "ArrowUp": + e2.preventDefault(); + e2.stopPropagation(); + this.focusedIndex = Math.max(this.focusedIndex - 1, 0); + this.updateFocus(); + break; + case "Enter": + e2.preventDefault(); + e2.stopPropagation(); + if (this.focusedIndex === 0) { + this.handleResolve({ + type: "approve-new-session", + planContent: this.extractPlanContent() + }); + } else if (this.focusedIndex === 1) { + this.handleResolve({ type: "approve" }); + } else if (this.focusedIndex === 2) { + this.feedbackInput.focus(); + } + break; + case "Escape": + e2.preventDefault(); + e2.stopPropagation(); + this.handleResolve(null); + break; + } + } + updateFocus() { + for (let i2 = 0; i2 < this.items.length; i2++) { + const item = this.items[i2]; + const cursor = item.querySelector(".claudian-ask-cursor"); + if (i2 === this.focusedIndex) { + item.addClass("is-focused"); + if (cursor) cursor.textContent = "\u203A"; + item.scrollIntoView({ block: "nearest" }); + if (item.hasClass("claudian-ask-custom-item")) { + const input = item.querySelector(".claudian-ask-custom-text"); + if (input) { + input.focus(); + this.isInputFocused = true; + } + } + } else { + item.removeClass("is-focused"); + if (cursor) cursor.textContent = "\xA0"; + if (item.hasClass("claudian-ask-custom-item")) { + const input = item.querySelector(".claudian-ask-custom-text"); + if (input && document.activeElement === input) { + input.blur(); + this.isInputFocused = false; + } + } + } + } + } + handleResolve(decision) { + var _a3, _b; + if (!this.resolved) { + this.resolved = true; + (_a3 = this.rootEl) == null ? void 0 : _a3.removeEventListener("keydown", this.boundKeyDown); + if (this.signal && this.abortHandler) { + this.signal.removeEventListener("abort", this.abortHandler); + this.abortHandler = null; + } + (_b = this.rootEl) == null ? void 0 : _b.remove(); + this.resolveCallback(decision); + } + } +}; + // src/features/chat/controllers/InputController.ts +var APPROVAL_OPTION_MAP = { + "Deny": "deny", + "Allow once": "allow", + "Always allow": "allow-always" +}; var InputController = class { constructor(deps) { - this.pendingApprovalModal = null; + this.pendingApprovalInline = null; + this.pendingAskInline = null; + this.pendingExitPlanModeInline = null; + this.activeResumeDropdown = null; this.deps = deps; } getAgentService() { var _a3, _b, _c; return (_c = (_b = (_a3 = this.deps).getAgentService) == null ? void 0 : _b.call(_a3)) != null ? _c : null; } + isResumeSessionAtStillNeeded(resumeUuid, previousMessages) { + for (let i2 = previousMessages.length - 1; i2 >= 0; i2--) { + if (previousMessages[i2].role === "assistant" && previousMessages[i2].sdkAssistantUuid === resumeUuid) { + return i2 === previousMessages.length - 1; + } + } + return false; + } // ============================================ // Message Sending // ============================================ @@ -53692,10 +58134,11 @@ var InputController = class { } let wasInterrupted = false; let wasInvalidated = false; + let didEnqueueToSdk = false; if (this.deps.ensureServiceInitialized) { const ready = await this.deps.ensureServiceInitialized(); if (!ready) { - new import_obsidian11.Notice("Failed to initialize agent service. Please try again."); + new import_obsidian12.Notice("Failed to initialize agent service. Please try again."); streamController.hideThinkingIndicator(); state.isStreaming = false; return; @@ -53703,12 +58146,34 @@ var InputController = class { } const agentService = this.getAgentService(); if (!agentService) { - new import_obsidian11.Notice("Agent service not available. Please reload the plugin."); + new import_obsidian12.Notice("Agent service not available. Please reload the plugin."); return; } + const conversationIdForSend = state.currentConversationId; + if (conversationIdForSend) { + const conv = plugin.getConversationSync(conversationIdForSend); + if (conv == null ? void 0 : conv.resumeSessionAt) { + if (this.isResumeSessionAtStillNeeded(conv.resumeSessionAt, state.messages.slice(0, -2))) { + agentService.setPendingResumeAt(conv.resumeSessionAt); + } else { + try { + await plugin.updateConversation(conversationIdForSend, { resumeSessionAt: void 0 }); + } catch (e2) { + } + } + } + } try { const previousMessages = state.messages.slice(0, -2); for await (const chunk of agentService.query(promptToSend, imagesForMessage, previousMessages, queryOptions)) { + if (chunk.type === "sdk_user_uuid") { + userMsg.sdkUserUuid = chunk.uuid; + continue; + } + if (chunk.type === "sdk_user_sent") { + didEnqueueToSdk = true; + continue; + } if (state.streamGeneration !== streamGeneration) { wasInvalidated = true; break; @@ -53727,7 +58192,7 @@ var InputController = class { } finally { state.clearFlavorTimerInterval(); if (!wasInvalidated && state.streamGeneration === streamGeneration) { - if (wasInterrupted) { + if (wasInterrupted && !state.pendingNewSessionPlan) { await streamController.appendText('\n\nInterrupted \xB7 What should Claudian do instead?'); } streamController.hideThinkingIndicator(); @@ -53760,8 +58225,29 @@ var InputController = class { if (statusPanel == null ? void 0 : statusPanel.areAllSubagentsCompleted()) { statusPanel.clearTerminalSubagents(); } - await conversationController.save(true); - this.processQueuedMessage(); + if (state.pendingNewSessionPlan && assistantMsg.toolCalls) { + for (const tc of assistantMsg.toolCalls) { + if (tc.name === TOOL_EXIT_PLAN_MODE && !tc.result) { + tc.status = "completed"; + tc.result = "User approved the plan and started a new session."; + updateToolCallResult(tc.id, tc, state.toolCallElements); + } + } + } + const saveExtras = didEnqueueToSdk ? { resumeSessionAt: void 0 } : void 0; + await conversationController.save(true, saveExtras); + const userMsgIndex = state.messages.indexOf(userMsg); + renderer.refreshActionButtons(userMsg, state.messages, userMsgIndex >= 0 ? userMsgIndex : void 0); + const planContent = state.pendingNewSessionPlan; + if (planContent) { + state.pendingNewSessionPlan = null; + await conversationController.createNew(); + this.deps.getInputEl().value = planContent; + this.sendMessage().catch(() => { + }); + } else { + this.processQueuedMessage(); + } } } } @@ -53906,7 +58392,7 @@ var InputController = class { const currentPrompt = plugin.settings.systemPrompt; plugin.settings.systemPrompt = appendMarkdownSnippet(currentPrompt, finalInstruction); await plugin.saveSettings(); - new import_obsidian11.Notice("Instruction added to custom system prompt"); + new import_obsidian12.Notice("Instruction added to custom system prompt"); instructionModeManager == null ? void 0 : instructionModeManager.clear(); }, onReject: () => { @@ -53923,7 +58409,7 @@ var InputController = class { if (result2.error === "Cancelled") { return; } - new import_obsidian11.Notice(result2.error || "Failed to process response"); + new import_obsidian12.Notice(result2.error || "Failed to process response"); modal == null ? void 0 : modal.showError(result2.error || "Failed to process response"); return; } @@ -53949,7 +58435,7 @@ var InputController = class { instructionModeManager == null ? void 0 : instructionModeManager.clear(); return; } - new import_obsidian11.Notice(result.error || "Failed to refine instruction"); + new import_obsidian12.Notice(result.error || "Failed to refine instruction"); modal.showError(result.error || "Failed to refine instruction"); instructionModeManager == null ? void 0 : instructionModeManager.clear(); return; @@ -53959,13 +58445,13 @@ var InputController = class { } else if (result.refinedInstruction) { modal.showConfirmation(result.refinedInstruction); } else { - new import_obsidian11.Notice("No instruction received"); + new import_obsidian12.Notice("No instruction received"); modal.showError("No instruction received"); instructionModeManager == null ? void 0 : instructionModeManager.clear(); } } catch (error48) { const errorMsg = error48 instanceof Error ? error48.message : "Unknown error"; - new import_obsidian11.Notice(`Error: ${errorMsg}`); + new import_obsidian12.Notice(`Error: ${errorMsg}`); modal == null ? void 0 : modal.showError(errorMsg); instructionModeManager == null ? void 0 : instructionModeManager.clear(); } @@ -53973,21 +58459,137 @@ var InputController = class { // ============================================ // Approval Dialogs // ============================================ - async handleApprovalRequest(toolName, input, description, options) { - const { plugin } = this.deps; - return new Promise((resolve4) => { - const modal = new ApprovalModal(plugin.app, toolName, input, description, (decision) => { - this.pendingApprovalModal = null; - resolve4(decision); - }, options); - this.pendingApprovalModal = modal; - modal.open(); + async handleApprovalRequest(toolName, _input, description, approvalOptions) { + const inputContainerEl = this.deps.getInputContainerEl(); + const parentEl = inputContainerEl.parentElement; + if (!parentEl) { + throw new Error("Input container is detached from DOM"); + } + const headerEl = parentEl.createDiv({ cls: "claudian-ask-approval-info" }); + headerEl.remove(); + const toolEl = headerEl.createDiv({ cls: "claudian-ask-approval-tool" }); + const iconEl = toolEl.createSpan({ cls: "claudian-ask-approval-icon" }); + iconEl.setAttribute("aria-hidden", "true"); + setToolIcon(iconEl, toolName); + toolEl.createSpan({ text: toolName, cls: "claudian-ask-approval-tool-name" }); + if (approvalOptions == null ? void 0 : approvalOptions.decisionReason) { + headerEl.createDiv({ text: approvalOptions.decisionReason, cls: "claudian-ask-approval-reason" }); + } + if (approvalOptions == null ? void 0 : approvalOptions.blockedPath) { + headerEl.createDiv({ text: approvalOptions.blockedPath, cls: "claudian-ask-approval-blocked-path" }); + } + if (approvalOptions == null ? void 0 : approvalOptions.agentID) { + headerEl.createDiv({ text: `Agent: ${approvalOptions.agentID}`, cls: "claudian-ask-approval-agent" }); + } + headerEl.createDiv({ text: description, cls: "claudian-ask-approval-desc" }); + const questionOptions = Object.keys(APPROVAL_OPTION_MAP); + const input = { questions: [{ question: "Allow this action?", options: questionOptions }] }; + const result = await this.showInlineQuestion( + parentEl, + inputContainerEl, + input, + (inline) => { + this.pendingApprovalInline = inline; + }, + void 0, + { title: "Permission required", headerEl, showCustomInput: false, immediateSelect: true } + ); + if (!result) return "cancel"; + const selected = Object.values(result)[0]; + const decision = APPROVAL_OPTION_MAP[selected]; + if (!decision) { + new import_obsidian12.Notice(`Unexpected approval selection: "${selected}"`); + return "cancel"; + } + return decision; + } + async handleAskUserQuestion(input, signal) { + const inputContainerEl = this.deps.getInputContainerEl(); + const parentEl = inputContainerEl.parentElement; + if (!parentEl) { + throw new Error("Input container is detached from DOM"); + } + return this.showInlineQuestion( + parentEl, + inputContainerEl, + input, + (inline) => { + this.pendingAskInline = inline; + }, + signal + ); + } + showInlineQuestion(parentEl, inputContainerEl, input, setPending, signal, config2) { + this.deps.streamController.hideThinkingIndicator(); + const previousDisplay = inputContainerEl.style.display; + inputContainerEl.style.display = "none"; + return new Promise((resolve4, reject) => { + const inline = new InlineAskUserQuestion( + parentEl, + input, + (result) => { + setPending(null); + inputContainerEl.style.display = previousDisplay; + resolve4(result); + }, + signal, + config2 + ); + setPending(inline); + try { + inline.render(); + } catch (err) { + setPending(null); + inputContainerEl.style.display = previousDisplay; + reject(err); + } + }); + } + async handleExitPlanMode(input, signal) { + const { state, streamController } = this.deps; + const inputContainerEl = this.deps.getInputContainerEl(); + const parentEl = inputContainerEl.parentElement; + if (!parentEl) { + throw new Error("Input container is detached from DOM"); + } + streamController.hideThinkingIndicator(); + inputContainerEl.style.display = "none"; + const enrichedInput = state.planFilePath ? { ...input, planFilePath: state.planFilePath } : input; + const renderContent = (el, markdown) => this.deps.renderer.renderContent(el, markdown); + return new Promise((resolve4, reject) => { + const inline = new InlineExitPlanMode( + parentEl, + enrichedInput, + (decision) => { + this.pendingExitPlanModeInline = null; + inputContainerEl.style.display = ""; + resolve4(decision); + }, + signal, + renderContent + ); + this.pendingExitPlanModeInline = inline; + try { + inline.render(); + } catch (err) { + this.pendingExitPlanModeInline = null; + inputContainerEl.style.display = ""; + reject(err); + } }); } dismissPendingApproval() { - if (this.pendingApprovalModal) { - this.pendingApprovalModal.close(); - this.pendingApprovalModal = null; + if (this.pendingApprovalInline) { + this.pendingApprovalInline.destroy(); + this.pendingApprovalInline = null; + } + if (this.pendingAskInline) { + this.pendingAskInline.destroy(); + this.pendingAskInline = null; + } + if (this.pendingExitPlanModeInline) { + this.pendingExitPlanModeInline.destroy(); + this.pendingExitPlanModeInline = null; } } // ============================================ @@ -54002,21 +58604,79 @@ var InputController = class { case "add-dir": { const externalContextSelector = this.deps.getExternalContextSelector(); if (!externalContextSelector) { - new import_obsidian11.Notice("External context selector not available."); + new import_obsidian12.Notice("External context selector not available."); return; } const result = externalContextSelector.addExternalContext(args); if (result.success) { - new import_obsidian11.Notice(`Added external context: ${result.normalizedPath}`); + new import_obsidian12.Notice(`Added external context: ${result.normalizedPath}`); } else { - new import_obsidian11.Notice(result.error); + new import_obsidian12.Notice(result.error); } break; } + case "resume": + this.showResumeDropdown(); + break; + case "fork": { + if (!this.deps.onForkAll) { + new import_obsidian12.Notice("Fork not available."); + return; + } + await this.deps.onForkAll(); + break; + } default: - new import_obsidian11.Notice(`Unknown command: ${action}`); + new import_obsidian12.Notice(`Unknown command: ${action}`); } } + // ============================================ + // Resume Session Dropdown + // ============================================ + handleResumeKeydown(e2) { + var _a3; + if (!((_a3 = this.activeResumeDropdown) == null ? void 0 : _a3.isVisible())) return false; + return this.activeResumeDropdown.handleKeydown(e2); + } + isResumeDropdownVisible() { + var _a3, _b; + return (_b = (_a3 = this.activeResumeDropdown) == null ? void 0 : _a3.isVisible()) != null ? _b : false; + } + destroyResumeDropdown() { + if (this.activeResumeDropdown) { + this.activeResumeDropdown.destroy(); + this.activeResumeDropdown = null; + } + } + showResumeDropdown() { + var _a3; + const { plugin, state, conversationController } = this.deps; + this.destroyResumeDropdown(); + const conversations = plugin.getConversationList(); + if (conversations.length === 0) { + new import_obsidian12.Notice("No conversations to resume"); + return; + } + const openConversation = (_a3 = this.deps.openConversation) != null ? _a3 : ((id) => conversationController.switchTo(id)); + this.activeResumeDropdown = new ResumeSessionDropdown( + this.deps.getInputContainerEl(), + this.deps.getInputEl(), + conversations, + state.currentConversationId, + { + onSelect: (id) => { + this.destroyResumeDropdown(); + openConversation(id).catch((err) => { + const msg = err instanceof Error ? err.message : String(err); + new import_obsidian12.Notice(`Failed to open conversation: ${msg}`); + }); + }, + onDismiss: () => { + this.destroyResumeDropdown(); + } + } + ); + } }; // src/features/chat/controllers/NavigationController.ts @@ -54146,7 +58806,7 @@ var NavigationController = class { }; // src/features/chat/controllers/SelectionController.ts -var import_obsidian12 = require("obsidian"); +var import_obsidian13 = require("obsidian"); // src/shared/components/SelectionHighlight.ts var import_state = require("@codemirror/state"); @@ -54235,7 +58895,7 @@ var SelectionController = class { // ============================================ poll() { var _a3, _b, _c, _d; - const view = this.app.workspace.getActiveViewOfType(import_obsidian12.MarkdownView); + const view = this.app.workspace.getActiveViewOfType(import_obsidian13.MarkdownView); if (!view) return; const editor = view.editor; const editorView = getEditorView(editor); @@ -54428,7 +59088,7 @@ var _StreamController = class _StreamController { if (state.currentTextEl) { this.finalizeCurrentTextBlock(msg); } - await this.appendThinking(chunk.content, msg); + await this.appendThinking(chunk.content); break; case "text": this.flushPendingTools(); @@ -54485,6 +59145,12 @@ var _StreamController = class _StreamController { this.renderCompactBoundary(); break; } + case "sdk_assistant_uuid": + msg.sdkAssistantUuid = chunk.uuid; + break; + case "sdk_user_uuid": + case "sdk_user_sent": + break; case "usage": { const currentSessionId = (_d = (_c = (_b = (_a3 = this.deps).getAgentService) == null ? void 0 : _b.call(_a3)) == null ? void 0 : _c.getSessionId()) != null ? _d : null; const chunkSessionId = (_e = chunk.sessionId) != null ? _e : null; @@ -54523,6 +59189,9 @@ var _StreamController = class _StreamController { this.deps.state.currentTodos = todos; } } + if (existingToolCall.name === TOOL_WRITE) { + this.capturePlanFilePath(existingToolCall.input); + } const toolEl = state.toolCallElements.get(chunk.id); if (toolEl) { const labelEl = (_b = toolEl.querySelector(".claudian-tool-label")) != null ? _b : toolEl.querySelector(".claudian-write-edit-label"); @@ -54550,6 +59219,9 @@ var _StreamController = class _StreamController { this.deps.state.currentTodos = todos; } } + if (chunk.name === TOOL_WRITE) { + this.capturePlanFilePath(chunk.input); + } if (state.currentContentEl) { state.pendingTools.set(chunk.id, { toolCall, @@ -54558,6 +59230,12 @@ var _StreamController = class _StreamController { this.showThinkingIndicator(); } } + capturePlanFilePath(input) { + const filePath = input.file_path; + if (filePath && filePath.replace(/\\/g, "/").includes("/.claude/plans/")) { + this.deps.state.planFilePath = filePath; + } + } /** * Flushes all pending tool calls by rendering them. * Called when a different content type arrives or stream ends. @@ -54615,8 +59293,18 @@ var _StreamController = class _StreamController { const existingToolCall = (_a3 = msg.toolCalls) == null ? void 0 : _a3.find((tc) => tc.id === chunk.id); const isBlocked = isBlockedToolResult(chunk.content, chunk.isError); if (existingToolCall) { - existingToolCall.status = isBlocked ? "blocked" : chunk.isError ? "error" : "completed"; + if (chunk.isError) { + existingToolCall.status = "error"; + } else if (!skipsBlockedDetection(existingToolCall.name) && isBlocked) { + existingToolCall.status = "blocked"; + } else { + existingToolCall.status = "completed"; + } existingToolCall.result = chunk.content; + if (existingToolCall.name === TOOL_ASK_USER_QUESTION && chunk.toolUseResult) { + const answers = extractResolvedAnswers(chunk.toolUseResult); + if (answers) existingToolCall.resolvedAnswers = answers; + } const writeEditState = state.writeEditStates.get(chunk.id); if (writeEditState && isWriteEditTool(existingToolCall.name)) { if (!chunk.isError && !isBlocked) { @@ -54662,7 +59350,7 @@ var _StreamController = class _StreamController { // ============================================ // Thinking Block Management // ============================================ - async appendThinking(content, msg) { + async appendThinking(content) { const { state, renderer } = this.deps; if (!state.currentContentEl) return; this.hideThinkingIndicator(); @@ -54939,6 +59627,46 @@ var _StreamController = class _StreamController { _StreamController.THINKING_INDICATOR_DELAY = 400; var StreamController = _StreamController; +// src/features/chat/services/BangBashService.ts +var import_child_process3 = require("child_process"); +var TIMEOUT_MS = 3e4; +var MAX_BUFFER = 1024 * 1024; +var BangBashService = class { + constructor(cwd, enhancedPath) { + this.cwd = cwd; + this.enhancedPath = enhancedPath; + } + execute(command) { + return new Promise((resolve4) => { + (0, import_child_process3.exec)(command, { + cwd: this.cwd, + env: { ...process.env, PATH: this.enhancedPath }, + timeout: TIMEOUT_MS, + maxBuffer: MAX_BUFFER, + shell: process.platform === "win32" ? "cmd.exe" : "/bin/bash" + }, (error48, stdout, stderr) => { + if (error48 && "killed" in error48 && error48.killed) { + const isMaxBuffer = "code" in error48 && error48.code === "ERR_CHILD_PROCESS_STDIO_MAXBUFFER"; + resolve4({ + command, + stdout: stdout != null ? stdout : "", + stderr: stderr != null ? stderr : "", + exitCode: 124, + error: isMaxBuffer ? "Output exceeded maximum buffer size (1MB)" : `Command timed out after ${TIMEOUT_MS / 1e3}s` + }); + return; + } + resolve4({ + command, + stdout: stdout != null ? stdout : "", + stderr: stderr != null ? stderr : "", + exitCode: typeof (error48 == null ? void 0 : error48.code) === "number" ? error48.code : error48 ? 1 : 0 + }); + }); + }); + } +}; + // src/core/prompts/instructionRefine.ts function buildRefineSystemPrompt(existingInstructions) { const existingSection = existingInstructions.trim() ? ` @@ -55824,7 +60552,10 @@ function createInitialState() { autoScrollEnabled: true, // Default; controllers will override based on settings responseStartTime: null, - flavorTimerInterval: null + flavorTimerInterval: null, + pendingNewSessionPlan: null, + planFilePath: null, + prePlanPermissionMode: null }; } var ChatState = class { @@ -55859,6 +60590,15 @@ var ChatState = class { this.state.messages = []; (_b = (_a3 = this._callbacks).onMessagesChanged) == null ? void 0 : _b.call(_a3); } + truncateAt(messageId) { + var _a3, _b; + const idx = this.state.messages.findIndex((m) => m.id === messageId); + if (idx === -1) return 0; + const removed = this.state.messages.length - idx; + this.state.messages = this.state.messages.slice(0, idx); + (_b = (_a3 = this._callbacks).onMessagesChanged) == null ? void 0 : _b.call(_a3); + return removed; + } // ============================================ // Streaming Control // ============================================ @@ -56041,6 +60781,24 @@ var ChatState = class { set flavorTimerInterval(value) { this.state.flavorTimerInterval = value; } + get pendingNewSessionPlan() { + return this.state.pendingNewSessionPlan; + } + set pendingNewSessionPlan(value) { + this.state.pendingNewSessionPlan = value; + } + get planFilePath() { + return this.state.planFilePath; + } + set planFilePath(value) { + this.state.planFilePath = value; + } + get prePlanPermissionMode() { + return this.state.prePlanPermissionMode; + } + set prePlanPermissionMode(value) { + this.state.prePlanPermissionMode = value; + } // ============================================ // Reset Methods // ============================================ @@ -56083,14 +60841,101 @@ var ChatState = class { } }; +// src/features/chat/ui/BangBashModeManager.ts +var import_obsidian14 = require("obsidian"); +var BangBashModeManager = class { + constructor(inputEl, callbacks) { + this.state = { active: false, rawCommand: "" }; + this.isSubmitting = false; + this.originalPlaceholder = ""; + this.inputEl = inputEl; + this.callbacks = callbacks; + this.originalPlaceholder = inputEl.placeholder; + } + handleTriggerKey(e2) { + if (!this.state.active && this.inputEl.value === "" && e2.key === "!") { + if (this.enterMode()) { + e2.preventDefault(); + return true; + } + } + return false; + } + handleInputChange() { + if (!this.state.active) return; + this.state.rawCommand = this.inputEl.value; + } + enterMode() { + const wrapper = this.callbacks.getInputWrapper(); + if (!wrapper) return false; + wrapper.addClass("claudian-input-bang-bash-mode"); + this.state = { active: true, rawCommand: "" }; + this.inputEl.placeholder = t("chat.bangBash.placeholder"); + return true; + } + exitMode() { + const wrapper = this.callbacks.getInputWrapper(); + if (wrapper) { + wrapper.removeClass("claudian-input-bang-bash-mode"); + } + this.state = { active: false, rawCommand: "" }; + this.inputEl.placeholder = this.originalPlaceholder; + } + handleKeydown(e2) { + if (!this.state.active) return false; + if (e2.key === "Enter" && !e2.shiftKey && !e2.isComposing) { + e2.preventDefault(); + if (this.state.rawCommand.trim()) { + this.submit(); + } + return true; + } + if (e2.key === "Escape" && !e2.isComposing) { + e2.preventDefault(); + this.clear(); + return true; + } + return false; + } + isActive() { + return this.state.active; + } + getRawCommand() { + return this.state.rawCommand; + } + async submit() { + if (this.isSubmitting) return; + const rawCommand = this.state.rawCommand.trim(); + if (!rawCommand) return; + this.isSubmitting = true; + try { + this.clear(); + await this.callbacks.onSubmit(rawCommand); + } catch (e2) { + new import_obsidian14.Notice(`Command failed: ${e2 instanceof Error ? e2.message : String(e2)}`); + } finally { + this.isSubmitting = false; + } + } + clear() { + var _a3, _b; + this.inputEl.value = ""; + this.exitMode(); + (_b = (_a3 = this.callbacks).resetInputHeight) == null ? void 0 : _b.call(_a3); + } + destroy() { + this.exitMode(); + } +}; + // src/features/chat/ui/FileContext.ts -var import_obsidian15 = require("obsidian"); +var import_obsidian17 = require("obsidian"); // src/shared/mention/MentionDropdownController.ts -var import_obsidian13 = require("obsidian"); +var import_obsidian15 = require("obsidian"); // src/utils/externalContext.ts -var fs5 = __toESM(require("fs")); +var fs6 = __toESM(require("fs")); function normalizePathForComparison3(p2) { return normalizePathForComparison(p2); } @@ -56118,7 +60963,7 @@ function getFolderName(p2) { } function validateDirectoryPath(p2) { try { - const stats = fs5.statSync(p2); + const stats = fs6.statSync(p2); if (!stats.isDirectory()) { return { valid: false, error: "Path exists but is not a directory" }; } @@ -56146,8 +60991,8 @@ function isDuplicatePath(newPath, existingPaths) { } // src/utils/externalContextScanner.ts -var fs6 = __toESM(require("fs")); -var path6 = __toESM(require("path")); +var fs7 = __toESM(require("fs")); +var path7 = __toESM(require("path")); var CACHE_TTL_MS = 3e4; var MAX_FILES_PER_PATH = 1e3; var MAX_DEPTH = 10; @@ -56192,25 +61037,25 @@ var ExternalContextScanner = class { if (depth > MAX_DEPTH) return []; const files = []; try { - if (!fs6.existsSync(dir)) return []; - const stat = fs6.statSync(dir); + if (!fs7.existsSync(dir)) return []; + const stat = fs7.statSync(dir); if (!stat.isDirectory()) return []; - const entries = fs6.readdirSync(dir, { withFileTypes: true }); + const entries = fs7.readdirSync(dir, { withFileTypes: true }); for (const entry of entries) { if (entry.name.startsWith(".")) continue; if (SKIP_DIRECTORIES.has(entry.name)) continue; if (entry.isSymbolicLink()) continue; - const fullPath = path6.join(dir, entry.name); + const fullPath = path7.join(dir, entry.name); if (entry.isDirectory()) { const subFiles = this.scanDirectory(fullPath, contextRoot, depth + 1); files.push(...subFiles); } else if (entry.isFile()) { try { - const fileStat = fs6.statSync(fullPath); + const fileStat = fs7.statSync(fullPath); files.push({ path: fullPath, name: entry.name, - relativePath: path6.relative(contextRoot, fullPath), + relativePath: path7.relative(contextRoot, fullPath), contextRoot, mtime: fileStat.mtimeMs }); @@ -56642,13 +61487,13 @@ var MentionDropdownController = class { if (item.type === "mcp-server") { iconEl.innerHTML = MCP_ICON_SVG; } else if (item.type === "agent" || item.type === "agent-folder") { - (0, import_obsidian13.setIcon)(iconEl, "bot"); + (0, import_obsidian15.setIcon)(iconEl, "bot"); } else if (item.type === "context-file") { - (0, import_obsidian13.setIcon)(iconEl, "folder-open"); + (0, import_obsidian15.setIcon)(iconEl, "folder-open"); } else if (item.type === "context-folder") { - (0, import_obsidian13.setIcon)(iconEl, "folder"); + (0, import_obsidian15.setIcon)(iconEl, "folder"); } else { - (0, import_obsidian13.setIcon)(iconEl, "file-text"); + (0, import_obsidian15.setIcon)(iconEl, "file-text"); } const textEl = itemEl.createSpan({ cls: "claudian-mention-text" }); if (item.type === "mcp-server") { @@ -56828,16 +61673,16 @@ var FileContextState = class { this.attachedFiles.add(file2); } } - attachFile(path10) { - this.attachedFiles.add(path10); + attachFile(path11) { + this.attachedFiles.add(path11); } /** Attach an external context file with display name to absolute path mapping. */ attachContextFile(displayName, absolutePath) { this.attachedFiles.add(absolutePath); this.contextFileMap.set(displayName, absolutePath); } - detachFile(path10) { - this.attachedFiles.delete(path10); + detachFile(path11) { + this.attachedFiles.delete(path11); } clearAttachments() { this.attachedFiles.clear(); @@ -56889,7 +61734,7 @@ var MarkdownFileCache = class { }; // src/features/chat/ui/file-context/view/FileChipsView.ts -var import_obsidian14 = require("obsidian"); +var import_obsidian16 = require("obsidian"); var FileChipsView = class { constructor(containerEl, callbacks) { this.containerEl = containerEl; @@ -56917,7 +61762,7 @@ var FileChipsView = class { renderFileChip(filePath, onRemove) { const chipEl = this.fileIndicatorEl.createDiv({ cls: "claudian-file-chip" }); const iconEl = chipEl.createSpan({ cls: "claudian-file-chip-icon" }); - (0, import_obsidian14.setIcon)(iconEl, "file-text"); + (0, import_obsidian16.setIcon)(iconEl, "file-text"); const normalizedPath = filePath.replace(/\\/g, "/"); const filename = normalizedPath.split("/").pop() || filePath; const nameEl = chipEl.createSpan({ cls: "claudian-file-chip-name" }); @@ -56963,14 +61808,14 @@ var FileContextManager = class { }, onOpenFile: async (filePath) => { const file2 = this.app.vault.getAbstractFileByPath(filePath); - if (!(file2 instanceof import_obsidian15.TFile)) { - new import_obsidian15.Notice(`Could not open file: ${filePath}`); + if (!(file2 instanceof import_obsidian17.TFile)) { + new import_obsidian17.Notice(`Could not open file: ${filePath}`); return; } try { await this.app.workspace.getLeaf().openFile(file2); } catch (error48) { - new import_obsidian15.Notice(`Failed to open file: ${error48 instanceof Error ? error48.message : String(error48)}`); + new import_obsidian17.Notice(`Failed to open file: ${error48 instanceof Error ? error48.message : String(error48)}`); } } }); @@ -57000,10 +61845,10 @@ var FileContextManager = class { } ); this.deleteEventRef = this.app.vault.on("delete", (file2) => { - if (file2 instanceof import_obsidian15.TFile) this.handleFileDeleted(file2.path); + if (file2 instanceof import_obsidian17.TFile) this.handleFileDeleted(file2.path); }); this.renameEventRef = this.app.vault.on("rename", (file2, oldPath) => { - if (file2 instanceof import_obsidian15.TFile) this.handleFileRenamed(oldPath, file2.path); + if (file2 instanceof import_obsidian17.TFile) this.handleFileRenamed(oldPath, file2.path); }); } /** Returns the current note path (shown as chip). */ @@ -57202,8 +62047,8 @@ var FileContextManager = class { }; // src/features/chat/ui/ImageContext.ts -var import_obsidian16 = require("obsidian"); -var path7 = __toESM(require("path")); +var import_obsidian18 = require("obsidian"); +var path8 = __toESM(require("path")); var MAX_IMAGE_SIZE = 5 * 1024 * 1024; var IMAGE_EXTENSIONS2 = { ".jpg": "image/jpeg", @@ -57342,7 +62187,7 @@ var ImageContextManager = class { return file2.type.startsWith("image/") && this.getMediaType(file2.name) !== null; } getMediaType(filename) { - const ext = path7.extname(filename).toLowerCase(); + const ext = path8.extname(filename).toLowerCase(); return IMAGE_EXTENSIONS2[ext] || null; } async addImageFromFile(file2, source) { @@ -57452,7 +62297,7 @@ var ImageContextManager = class { } truncateName(name, maxLen) { if (name.length <= maxLen) return name; - const ext = path7.extname(name); + const ext = path8.extname(name); const base = name.slice(0, name.length - ext.length); const truncatedBase = base.slice(0, maxLen - ext.length - 3); return `${truncatedBase}...${ext}`; @@ -57471,13 +62316,13 @@ var ImageContextManager = class { userMessage = `${message} (Permission denied)`; } } - new import_obsidian16.Notice(userMessage); + new import_obsidian18.Notice(userMessage); } }; // src/features/chat/ui/InputToolbar.ts -var import_obsidian17 = require("obsidian"); -var path8 = __toESM(require("path")); +var import_obsidian19 = require("obsidian"); +var path9 = __toESM(require("path")); var ModelSelector = class { constructor(parentEl, callbacks) { this.buttonEl = null; @@ -57612,13 +62457,22 @@ var PermissionToggle = class { } updateDisplay() { if (!this.toggleEl || !this.labelEl) return; - const isYolo = this.callbacks.getSettings().permissionMode === "yolo"; - if (isYolo) { - this.toggleEl.addClass("active"); + const mode = this.callbacks.getSettings().permissionMode; + if (mode === "plan") { + this.toggleEl.style.display = "none"; + this.labelEl.setText("PLAN"); + this.labelEl.addClass("plan-active"); } else { - this.toggleEl.removeClass("active"); + this.toggleEl.style.display = ""; + this.labelEl.removeClass("plan-active"); + if (mode === "yolo") { + this.toggleEl.addClass("active"); + this.labelEl.setText("YOLO"); + } else { + this.toggleEl.removeClass("active"); + this.labelEl.setText("Safe"); + } } - this.labelEl.setText(isYolo ? "YOLO" : "Safe"); } async toggle() { const current = this.callbacks.getSettings().permissionMode; @@ -57669,28 +62523,28 @@ var ExternalContextSelector = class { this.renderDropdown(); if (invalidPaths.length > 0) { const pathNames = invalidPaths.map((p2) => this.shortenPath(p2)).join(", "); - new import_obsidian17.Notice(`Removed ${invalidPaths.length} invalid external context path(s): ${pathNames}`, 5e3); + new import_obsidian19.Notice(`Removed ${invalidPaths.length} invalid external context path(s): ${pathNames}`, 5e3); (_a3 = this.onPersistenceChangeCallback) == null ? void 0 : _a3.call(this, [...this.persistentPaths]); } } - togglePersistence(path10) { + togglePersistence(path11) { var _a3; - if (this.persistentPaths.has(path10)) { - this.persistentPaths.delete(path10); + if (this.persistentPaths.has(path11)) { + this.persistentPaths.delete(path11); } else { - if (!isValidDirectoryPath(path10)) { - new import_obsidian17.Notice(`Cannot persist "${this.shortenPath(path10)}" - directory no longer exists`, 4e3); + if (!isValidDirectoryPath(path11)) { + new import_obsidian19.Notice(`Cannot persist "${this.shortenPath(path11)}" - directory no longer exists`, 4e3); return; } - this.persistentPaths.add(path10); + this.persistentPaths.add(path11); } (_a3 = this.onPersistenceChangeCallback) == null ? void 0 : _a3.call(this, [...this.persistentPaths]); this.renderDropdown(); } mergePersistentPaths() { const pathSet = new Set(this.externalContextPaths); - for (const path10 of this.persistentPaths) { - pathSet.add(path10); + for (const path11 of this.persistentPaths) { + pathSet.add(path11); } this.externalContextPaths = [...pathSet]; } @@ -57737,7 +62591,7 @@ var ExternalContextSelector = class { } const expandedPath = expandHomePath(cleanPath); const normalizedPath = normalizePathForFilesystem(expandedPath); - if (!path8.isAbsolute(normalizedPath)) { + if (!path9.isAbsolute(normalizedPath)) { return { success: false, error: "Path must be absolute. Usage: /add-dir /absolute/path" }; } const validation = validateDirectoryPath(normalizedPath); @@ -57775,7 +62629,7 @@ var ExternalContextSelector = class { this.container.empty(); const iconWrapper = this.container.createDiv({ cls: "claudian-external-context-icon-wrapper" }); this.iconEl = iconWrapper.createDiv({ cls: "claudian-external-context-icon" }); - (0, import_obsidian17.setIcon)(this.iconEl, "folder"); + (0, import_obsidian19.setIcon)(this.iconEl, "folder"); this.badgeEl = iconWrapper.createDiv({ cls: "claudian-external-context-badge" }); this.updateDisplay(); iconWrapper.addEventListener("click", (e2) => { @@ -57796,12 +62650,12 @@ var ExternalContextSelector = class { if (!result.canceled && result.filePaths.length > 0) { const selectedPath = result.filePaths[0]; if (isDuplicatePath(selectedPath, this.externalContextPaths)) { - new import_obsidian17.Notice("This folder is already added as an external context.", 3e3); + new import_obsidian19.Notice("This folder is already added as an external context.", 3e3); return; } const conflict = findConflictingPath(selectedPath, this.externalContextPaths); if (conflict) { - new import_obsidian17.Notice(this.formatConflictMessage(selectedPath, conflict), 5e3); + new import_obsidian19.Notice(this.formatConflictMessage(selectedPath, conflict), 5e3); return; } this.externalContextPaths = [...this.externalContextPaths, selectedPath]; @@ -57810,7 +62664,7 @@ var ExternalContextSelector = class { this.renderDropdown(); } } catch (e2) { - new import_obsidian17.Notice("Unable to open folder picker.", 5e3); + new import_obsidian19.Notice("Unable to open folder picker.", 5e3); } } /** Formats a conflict error message for display. */ @@ -57840,14 +62694,14 @@ var ExternalContextSelector = class { if (isPersistent) { lockBtn.addClass("locked"); } - (0, import_obsidian17.setIcon)(lockBtn, isPersistent ? "lock" : "unlock"); + (0, import_obsidian19.setIcon)(lockBtn, isPersistent ? "lock" : "unlock"); lockBtn.setAttribute("title", isPersistent ? "Persistent (click to make session-only)" : "Session-only (click to persist)"); lockBtn.addEventListener("click", (e2) => { e2.stopPropagation(); this.togglePersistence(pathStr); }); const removeBtn = itemEl.createSpan({ cls: "claudian-external-context-remove" }); - (0, import_obsidian17.setIcon)(removeBtn, "x"); + (0, import_obsidian19.setIcon)(removeBtn, "x"); removeBtn.setAttribute("title", "Remove path"); removeBtn.addEventListener("click", (e2) => { e2.stopPropagation(); @@ -57859,8 +62713,8 @@ var ExternalContextSelector = class { /** Shorten path for display (replace home dir with ~) */ shortenPath(fullPath) { try { - const os6 = require("os"); - const homeDir = os6.homedir(); + const os7 = require("os"); + const homeDir = os7.homedir(); const normalize2 = (value) => value.replace(/\\/g, "/"); const normalizedFull = normalize2(fullPath); const normalizedHome = normalize2(homeDir); @@ -58259,8 +63113,9 @@ var InstructionModeManager = class { }; // src/features/chat/ui/StatusPanel.ts -var import_obsidian18 = require("obsidian"); +var import_obsidian20 = require("obsidian"); var TERMINAL_STATES = ["completed", "error", "orphaned"]; +var MAX_BASH_OUTPUTS = 50; var StatusPanel = class { constructor() { this.containerEl = null; @@ -58268,6 +63123,13 @@ var StatusPanel = class { // Async subagent section (above todos) this.subagentContainerEl = null; this.currentSubagents = /* @__PURE__ */ new Map(); + // Bash output section (between subagents and todos) + this.bashOutputContainerEl = null; + this.bashHeaderEl = null; + this.bashContentEl = null; + this.isBashExpanded = true; + this.currentBashOutputs = /* @__PURE__ */ new Map(); + this.bashEntryExpanded = /* @__PURE__ */ new Map(); // Todo section this.todoContainerEl = null; this.todoHeaderEl = null; @@ -58277,6 +63139,8 @@ var StatusPanel = class { // Event handler references for cleanup this.todoClickHandler = null; this.todoKeydownHandler = null; + this.bashClickHandler = null; + this.bashKeydownHandler = null; } /** * Mount the panel into the messages container. @@ -58304,16 +63168,30 @@ var StatusPanel = class { } this.todoClickHandler = null; this.todoKeydownHandler = null; + if (this.bashHeaderEl) { + if (this.bashClickHandler) { + this.bashHeaderEl.removeEventListener("click", this.bashClickHandler); + } + if (this.bashKeydownHandler) { + this.bashHeaderEl.removeEventListener("keydown", this.bashKeydownHandler); + } + } + this.bashClickHandler = null; + this.bashKeydownHandler = null; if (this.panelEl) { this.panelEl.remove(); } this.panelEl = null; this.subagentContainerEl = null; + this.bashOutputContainerEl = null; + this.bashHeaderEl = null; + this.bashContentEl = null; this.todoContainerEl = null; this.todoHeaderEl = null; this.todoContentEl = null; this.createPanel(); this.renderSubagentStatus(); + this.renderBashOutputs(); if (this.currentTodos && this.currentTodos.length > 0) { this.updateTodos(this.currentTodos); } @@ -58331,6 +63209,27 @@ var StatusPanel = class { this.subagentContainerEl.className = "claudian-status-panel-subagents"; this.subagentContainerEl.style.display = "none"; this.panelEl.appendChild(this.subagentContainerEl); + this.bashOutputContainerEl = document.createElement("div"); + this.bashOutputContainerEl.className = "claudian-status-panel-bash"; + this.bashOutputContainerEl.style.display = "none"; + this.bashHeaderEl = document.createElement("div"); + this.bashHeaderEl.className = "claudian-tool-header claudian-status-panel-bash-header"; + this.bashHeaderEl.setAttribute("tabindex", "0"); + this.bashHeaderEl.setAttribute("role", "button"); + this.bashClickHandler = () => this.toggleBashSection(); + this.bashKeydownHandler = (e2) => { + if (e2.key === "Enter" || e2.key === " ") { + e2.preventDefault(); + this.toggleBashSection(); + } + }; + this.bashHeaderEl.addEventListener("click", this.bashClickHandler); + this.bashHeaderEl.addEventListener("keydown", this.bashKeydownHandler); + this.bashContentEl = document.createElement("div"); + this.bashContentEl.className = "claudian-status-panel-bash-content"; + this.bashOutputContainerEl.appendChild(this.bashHeaderEl); + this.bashOutputContainerEl.appendChild(this.bashContentEl); + this.panelEl.appendChild(this.bashOutputContainerEl); this.todoContainerEl = document.createElement("div"); this.todoContainerEl.className = "claudian-status-panel-todos"; this.todoContainerEl.style.display = "none"; @@ -58388,7 +63287,7 @@ var StatusPanel = class { this.todoHeaderEl.empty(); const icon = document.createElement("span"); icon.className = "claudian-status-panel-icon"; - (0, import_obsidian18.setIcon)(icon, getToolIcon(TOOL_TODO_WRITE)); + (0, import_obsidian20.setIcon)(icon, getToolIcon(TOOL_TODO_WRITE)); this.todoHeaderEl.appendChild(icon); const label = document.createElement("span"); label.className = "claudian-status-panel-label"; @@ -58398,7 +63297,7 @@ var StatusPanel = class { if (completedCount === totalCount && totalCount > 0) { const status = document.createElement("span"); status.className = "claudian-status-panel-status status-completed"; - (0, import_obsidian18.setIcon)(status, "check"); + (0, import_obsidian20.setIcon)(status, "check"); this.todoHeaderEl.appendChild(status); } if (currentTask) { @@ -58557,7 +63456,7 @@ var StatusPanel = class { rowEl.className = showRunningOnThisRow ? "claudian-status-panel-done-row claudian-status-panel-combined-row" : "claudian-status-panel-done-row"; const botIconEl = document.createElement("span"); botIconEl.className = "claudian-status-panel-icon claudian-status-panel-bot-icon"; - (0, import_obsidian18.setIcon)(botIconEl, getToolIcon(TOOL_TASK)); + (0, import_obsidian20.setIcon)(botIconEl, getToolIcon(TOOL_TASK)); rowEl.appendChild(botIconEl); const textEl = document.createElement("span"); textEl.className = "claudian-status-panel-done-text"; @@ -58565,7 +63464,7 @@ var StatusPanel = class { rowEl.appendChild(textEl); const iconEl = document.createElement("span"); iconEl.className = "claudian-status-panel-icon claudian-status-panel-done-icon"; - (0, import_obsidian18.setIcon)(iconEl, "check"); + (0, import_obsidian20.setIcon)(iconEl, "check"); rowEl.appendChild(iconEl); if (showRunningOnThisRow) { const runningEl = document.createElement("span"); @@ -58587,6 +63486,185 @@ var StatusPanel = class { this.scrollToBottom(); } // ============================================ + // Bash Output Methods + // ============================================ + addBashOutput(info) { + this.currentBashOutputs.set(info.id, info); + while (this.currentBashOutputs.size > MAX_BASH_OUTPUTS) { + const oldest = this.currentBashOutputs.keys().next().value; + if (!oldest) break; + this.currentBashOutputs.delete(oldest); + this.bashEntryExpanded.delete(oldest); + } + this.renderBashOutputs(); + } + updateBashOutput(id, updates) { + const existing = this.currentBashOutputs.get(id); + if (!existing) return; + this.currentBashOutputs.set(id, { ...existing, ...updates }); + this.renderBashOutputs(); + } + clearBashOutputs() { + this.currentBashOutputs.clear(); + this.bashEntryExpanded.clear(); + this.renderBashOutputs(); + } + renderBashOutputs(options = {}) { + var _a3; + if (!this.bashOutputContainerEl || !this.bashHeaderEl || !this.bashContentEl) return; + const scroll = (_a3 = options.scroll) != null ? _a3 : true; + if (this.currentBashOutputs.size === 0) { + this.bashOutputContainerEl.style.display = "none"; + return; + } + this.bashOutputContainerEl.style.display = "block"; + this.bashHeaderEl.empty(); + this.bashContentEl.empty(); + const headerIconEl = document.createElement("span"); + headerIconEl.className = "claudian-tool-icon"; + headerIconEl.setAttribute("aria-hidden", "true"); + (0, import_obsidian20.setIcon)(headerIconEl, "terminal"); + this.bashHeaderEl.appendChild(headerIconEl); + const latest = Array.from(this.currentBashOutputs.values()).at(-1); + const headerLabelEl = document.createElement("span"); + headerLabelEl.className = "claudian-tool-label"; + if (this.isBashExpanded) { + headerLabelEl.textContent = t("chat.bangBash.commandPanel"); + } else { + headerLabelEl.textContent = latest ? this.truncateDescription(latest.command, 60) : t("chat.bangBash.commandPanel"); + } + this.bashHeaderEl.appendChild(headerLabelEl); + const previewEl = document.createElement("span"); + previewEl.className = "claudian-tool-current"; + previewEl.style.display = this.isBashExpanded ? "" : "none"; + this.bashHeaderEl.appendChild(previewEl); + const summaryStatusEl = document.createElement("span"); + summaryStatusEl.className = "claudian-tool-status"; + if (!this.isBashExpanded && latest) { + summaryStatusEl.classList.add(`status-${latest.status}`); + summaryStatusEl.setAttribute("aria-label", t("chat.bangBash.statusLabel", { status: latest.status })); + if (latest.status === "completed") (0, import_obsidian20.setIcon)(summaryStatusEl, "check"); + if (latest.status === "error") (0, import_obsidian20.setIcon)(summaryStatusEl, "x"); + } else { + summaryStatusEl.style.display = "none"; + } + this.bashHeaderEl.appendChild(summaryStatusEl); + this.bashHeaderEl.setAttribute("aria-expanded", String(this.isBashExpanded)); + const actionsEl = document.createElement("span"); + actionsEl.className = "claudian-status-panel-bash-actions"; + this.appendActionButton(actionsEl, "copy", t("chat.bangBash.copyAriaLabel"), "copy", () => { + void this.copyLatestBashOutput(); + }); + this.appendActionButton(actionsEl, "clear", t("chat.bangBash.clearAriaLabel"), "trash", () => { + this.clearBashOutputs(); + }); + this.bashHeaderEl.appendChild(actionsEl); + this.bashContentEl.style.display = this.isBashExpanded ? "block" : "none"; + if (!this.isBashExpanded) { + return; + } + for (const info of this.currentBashOutputs.values()) { + this.bashContentEl.appendChild(this.renderBashEntry(info)); + } + if (scroll) { + this.bashContentEl.scrollTop = this.bashContentEl.scrollHeight; + this.scrollToBottom(); + } + } + renderBashEntry(info) { + var _a3; + const entryEl = document.createElement("div"); + entryEl.className = "claudian-tool-call claudian-status-panel-bash-entry"; + const entryHeaderEl = document.createElement("div"); + entryHeaderEl.className = "claudian-tool-header"; + entryHeaderEl.setAttribute("tabindex", "0"); + entryHeaderEl.setAttribute("role", "button"); + const entryIconEl = document.createElement("span"); + entryIconEl.className = "claudian-tool-icon"; + entryIconEl.setAttribute("aria-hidden", "true"); + (0, import_obsidian20.setIcon)(entryIconEl, "dollar-sign"); + entryHeaderEl.appendChild(entryIconEl); + const entryLabelEl = document.createElement("span"); + entryLabelEl.className = "claudian-tool-label"; + entryLabelEl.textContent = t("chat.bangBash.commandLabel", { command: this.truncateDescription(info.command, 60) }); + entryHeaderEl.appendChild(entryLabelEl); + const entryStatusEl = document.createElement("span"); + entryStatusEl.className = "claudian-tool-status"; + entryStatusEl.classList.add(`status-${info.status}`); + entryStatusEl.setAttribute("aria-label", t("chat.bangBash.statusLabel", { status: info.status })); + if (info.status === "completed") (0, import_obsidian20.setIcon)(entryStatusEl, "check"); + if (info.status === "error") (0, import_obsidian20.setIcon)(entryStatusEl, "x"); + entryHeaderEl.appendChild(entryStatusEl); + entryEl.appendChild(entryHeaderEl); + const contentEl = document.createElement("div"); + contentEl.className = "claudian-tool-content"; + const isEntryExpanded = (_a3 = this.bashEntryExpanded.get(info.id)) != null ? _a3 : true; + contentEl.style.display = isEntryExpanded ? "block" : "none"; + entryHeaderEl.setAttribute("aria-expanded", String(isEntryExpanded)); + entryHeaderEl.setAttribute("aria-label", isEntryExpanded ? t("chat.bangBash.collapseOutput") : t("chat.bangBash.expandOutput")); + entryHeaderEl.addEventListener("click", () => { + this.bashEntryExpanded.set(info.id, !isEntryExpanded); + this.renderBashOutputs({ scroll: false }); + }); + entryHeaderEl.addEventListener("keydown", (e2) => { + if (e2.key === "Enter" || e2.key === " ") { + e2.preventDefault(); + this.bashEntryExpanded.set(info.id, !isEntryExpanded); + this.renderBashOutputs({ scroll: false }); + } + }); + const rowEl = document.createElement("div"); + rowEl.className = "claudian-tool-result-row"; + const textEl = document.createElement("span"); + textEl.className = "claudian-tool-result-text"; + if (info.status === "running" && !info.output) { + textEl.textContent = t("chat.bangBash.running"); + } else if (info.output) { + textEl.textContent = info.output; + } + rowEl.appendChild(textEl); + contentEl.appendChild(rowEl); + entryEl.appendChild(contentEl); + return entryEl; + } + async copyLatestBashOutput() { + var _a3; + const latest = Array.from(this.currentBashOutputs.values()).at(-1); + if (!latest) return; + const output = ((_a3 = latest.output) == null ? void 0 : _a3.trim()) || (latest.status === "running" ? t("chat.bangBash.running") : ""); + const text = output ? `$ ${latest.command} +${output}` : `$ ${latest.command}`; + try { + await navigator.clipboard.writeText(text); + } catch (e2) { + new import_obsidian20.Notice(t("chat.bangBash.copyFailed")); + } + } + appendActionButton(parent, name, ariaLabel, icon, action) { + const el = document.createElement("span"); + el.className = `claudian-status-panel-bash-action claudian-status-panel-bash-action-${name}`; + el.setAttribute("role", "button"); + el.setAttribute("tabindex", "0"); + el.setAttribute("aria-label", ariaLabel); + (0, import_obsidian20.setIcon)(el, icon); + el.addEventListener("click", (e2) => { + e2.stopPropagation(); + action(); + }); + el.addEventListener("keydown", (e2) => { + if (e2.key === "Enter" || e2.key === " ") { + e2.preventDefault(); + e2.stopPropagation(); + action(); + } + }); + parent.appendChild(el); + } + toggleBashSection() { + this.isBashExpanded = !this.isBashExpanded; + this.renderBashOutputs({ scroll: false }); + } + // ============================================ // Cleanup // ============================================ /** @@ -58603,12 +63681,26 @@ var StatusPanel = class { } this.todoClickHandler = null; this.todoKeydownHandler = null; + if (this.bashHeaderEl) { + if (this.bashClickHandler) { + this.bashHeaderEl.removeEventListener("click", this.bashClickHandler); + } + if (this.bashKeydownHandler) { + this.bashHeaderEl.removeEventListener("keydown", this.bashKeydownHandler); + } + } + this.bashClickHandler = null; + this.bashKeydownHandler = null; this.currentSubagents.clear(); + this.currentBashOutputs.clear(); if (this.panelEl) { this.panelEl.remove(); this.panelEl = null; } this.subagentContainerEl = null; + this.bashOutputContainerEl = null; + this.bashHeaderEl = null; + this.bashContentEl = null; this.todoContainerEl = null; this.todoHeaderEl = null; this.todoContentEl = null; @@ -58683,6 +63775,7 @@ function createTab(options) { permissionToggle: null, slashCommandDropdown: null, instructionModeManager: null, + bangBashModeManager: null, contextUsageMeter: null, statusPanel: null }, @@ -58724,7 +63817,8 @@ function buildTabDOM(contentEl) { cls: "claudian-input", attr: { placeholder: "How can I help you today?", - rows: "3" + rows: "3", + dir: "auto" } }); return { @@ -58760,8 +63854,8 @@ async function initializeTabService(tab, plugin, mcpManager) { let externalContextPaths = plugin.settings.persistentExternalContextPaths || []; if (tab.conversationId) { const conversation = await plugin.getConversationById(tab.conversationId); - sessionId = (_a3 = conversation == null ? void 0 : conversation.sessionId) != null ? _a3 : void 0; if (conversation) { + sessionId = (_a3 = service.applyForkState(conversation)) != null ? _a3 : void 0; const hasMessages = conversation.messages.length > 0; externalContextPaths = hasMessages ? conversation.externalContextPaths || [] : plugin.settings.persistentExternalContextPaths || []; } @@ -58851,6 +63945,29 @@ function initializeInstructionAndTodo(tab, plugin) { getInputWrapper: () => dom.inputWrapper } ); + if (plugin.settings.enableBangBash) { + const vaultPath = getVaultPath(plugin.app); + if (vaultPath) { + const enhancedPath = getEnhancedPath(); + const bashService = new BangBashService(vaultPath, enhancedPath); + tab.ui.bangBashModeManager = new BangBashModeManager( + dom.inputEl, + { + onSubmit: async (command) => { + const statusPanel = tab.ui.statusPanel; + if (!statusPanel) return; + const id = `bash-${Date.now()}`; + statusPanel.addBashOutput({ id, command, status: "running", output: "" }); + const result = await bashService.execute(command); + const output = [result.stdout, result.stderr, result.error].filter(Boolean).join("\n").trim(); + const status = result.exitCode === 0 ? "completed" : "error"; + statusPanel.updateBashOutput(id, { status, output, exitCode: result.exitCode }); + }, + getInputWrapper: () => dom.inputWrapper + } + ); + } + } tab.ui.statusPanel = new StatusPanel(); tab.ui.statusPanel.mount(dom.statusPanelContainerEl); } @@ -58899,6 +64016,7 @@ function initializeInputToolbar(tab, plugin) { onPermissionModeChange: async (mode) => { plugin.settings.permissionMode = mode; await plugin.saveSettings(); + dom.inputWrapper.toggleClass("claudian-input-plan-mode", mode === "plan"); } }); tab.ui.modelSelector = toolbarComponents.modelSelector; @@ -58923,6 +64041,7 @@ function initializeInputToolbar(tab, plugin) { plugin.settings.persistentExternalContextPaths = paths; await plugin.saveSettings(); }); + dom.inputWrapper.toggleClass("claudian-input-plan-mode", plugin.settings.permissionMode === "plan"); } function initializeTabUI(tab, plugin, options = {}) { const { dom, state } = tab; @@ -58963,9 +64082,108 @@ function initializeTabUI(tab, plugin, options = {}) { dom.eventCleanups.push(() => resizeObserver.disconnect()); updateScrollToBottomVisibility(); } -function initializeTabControllers(tab, plugin, component, mcpManager) { +function deepCloneMessages(messages) { + const sc = globalThis.structuredClone; + if (typeof sc === "function") { + return sc(messages); + } + return JSON.parse(JSON.stringify(messages)); +} +function countUserMessagesForForkTitle(messages) { + return messages.filter((m) => m.role === "user" && !m.isInterrupt && !m.isRebuiltContext).length; +} +function resolveForkSource(tab, plugin) { + var _a3, _b, _c, _d, _e, _f; + let sourceSessionId = (_b = (_a3 = tab.service) == null ? void 0 : _a3.getSessionId()) != null ? _b : null; + if (!sourceSessionId && tab.conversationId) { + const conversation = plugin.getConversationSync(tab.conversationId); + sourceSessionId = (_f = (_e = (_c = conversation == null ? void 0 : conversation.sdkSessionId) != null ? _c : conversation == null ? void 0 : conversation.sessionId) != null ? _e : (_d = conversation == null ? void 0 : conversation.forkSource) == null ? void 0 : _d.sessionId) != null ? _f : null; + } + if (!sourceSessionId) { + new import_obsidian21.Notice(t("chat.fork.failed", { error: t("chat.fork.errorNoSession") })); + return null; + } + const sourceConversation = tab.conversationId ? plugin.getConversationSync(tab.conversationId) : void 0; + return { + sourceSessionId, + sourceTitle: sourceConversation == null ? void 0 : sourceConversation.title, + currentNote: sourceConversation == null ? void 0 : sourceConversation.currentNote + }; +} +async function handleForkRequest(tab, plugin, userMessageId, forkRequestCallback) { + const { state } = tab; + if (state.isStreaming) { + new import_obsidian21.Notice(t("chat.fork.unavailableStreaming")); + return; + } + const msgs = state.messages; + const userIdx = msgs.findIndex((m) => m.id === userMessageId); + if (userIdx === -1) { + new import_obsidian21.Notice(t("chat.fork.failed", { error: t("chat.fork.errorMessageNotFound") })); + return; + } + if (!msgs[userIdx].sdkUserUuid) { + new import_obsidian21.Notice(t("chat.fork.unavailableNoUuid")); + return; + } + const rewindCtx = findRewindContext(msgs, userIdx); + if (!rewindCtx.hasResponse || !rewindCtx.prevAssistantUuid) { + new import_obsidian21.Notice(t("chat.fork.unavailableNoResponse")); + return; + } + const source = resolveForkSource(tab, plugin); + if (!source) return; + await forkRequestCallback({ + messages: deepCloneMessages(msgs.slice(0, userIdx)), + sourceSessionId: source.sourceSessionId, + resumeAt: rewindCtx.prevAssistantUuid, + sourceTitle: source.sourceTitle, + forkAtUserMessage: countUserMessagesForForkTitle(msgs.slice(0, userIdx + 1)), + currentNote: source.currentNote + }); +} +async function handleForkAll(tab, plugin, forkRequestCallback) { + const { state } = tab; + if (state.isStreaming) { + new import_obsidian21.Notice(t("chat.fork.unavailableStreaming")); + return; + } + const msgs = state.messages; + if (msgs.length === 0) { + new import_obsidian21.Notice(t("chat.fork.commandNoMessages")); + return; + } + let lastAssistantUuid; + for (let i2 = msgs.length - 1; i2 >= 0; i2--) { + if (msgs[i2].role === "assistant" && msgs[i2].sdkAssistantUuid) { + lastAssistantUuid = msgs[i2].sdkAssistantUuid; + break; + } + } + if (!lastAssistantUuid) { + new import_obsidian21.Notice(t("chat.fork.commandNoAssistantUuid")); + return; + } + const source = resolveForkSource(tab, plugin); + if (!source) return; + await forkRequestCallback({ + messages: deepCloneMessages(msgs), + sourceSessionId: source.sourceSessionId, + resumeAt: lastAssistantUuid, + sourceTitle: source.sourceTitle, + forkAtUserMessage: countUserMessagesForForkTitle(msgs) + 1, + currentNote: source.currentNote + }); +} +function initializeTabControllers(tab, plugin, component, mcpManager, forkRequestCallback, openConversation) { const { dom, state, services, ui } = tab; - tab.renderer = new MessageRenderer(plugin, component, dom.messagesEl); + tab.renderer = new MessageRenderer( + plugin, + component, + dom.messagesEl, + (id) => tab.controllers.conversationController.rewind(id), + forkRequestCallback ? (id) => handleForkRequest(tab, plugin, id, forkRequestCallback) : void 0 + ); tab.controllers.selectionController = new SelectionController( plugin.app, dom.selectionIndicatorEl, @@ -59039,6 +64257,7 @@ function initializeTabControllers(tab, plugin, component, mcpManager) { selectionController: tab.controllers.selectionController, conversationController: tab.controllers.conversationController, getInputEl: () => dom.inputEl, + getInputContainerEl: () => dom.inputContainerEl, getWelcomeEl: () => dom.welcomeEl, getMessagesEl: () => dom.messagesEl, getFileContextManager: () => ui.fileContextManager, @@ -59063,12 +64282,14 @@ function initializeTabControllers(tab, plugin, component, mcpManager) { } try { await initializeTabService(tab, plugin, mcpManager); - setupApprovalCallback(tab); + setupServiceCallbacks(tab, plugin); return true; } catch (e2) { return false; } - } + }, + openConversation, + onForkAll: forkRequestCallback ? () => handleForkAll(tab, plugin, forkRequestCallback) : void 0 }); tab.controllers.navigationController = new NavigationController({ getMessagesEl: () => dom.messagesEl, @@ -59076,54 +64297,84 @@ function initializeTabControllers(tab, plugin, component, mcpManager) { getSettings: () => plugin.settings.keyboardNavigation, isStreaming: () => state.isStreaming, shouldSkipEscapeHandling: () => { - var _a3, _b, _c; + var _a3, _b, _c, _d, _e; if ((_a3 = ui.instructionModeManager) == null ? void 0 : _a3.isActive()) return true; - if ((_b = ui.slashCommandDropdown) == null ? void 0 : _b.isVisible()) return true; - if ((_c = ui.fileContextManager) == null ? void 0 : _c.isMentionDropdownVisible()) return true; + if ((_b = ui.bangBashModeManager) == null ? void 0 : _b.isActive()) return true; + if ((_c = tab.controllers.inputController) == null ? void 0 : _c.isResumeDropdownVisible()) return true; + if ((_d = ui.slashCommandDropdown) == null ? void 0 : _d.isVisible()) return true; + if ((_e = ui.fileContextManager) == null ? void 0 : _e.isMentionDropdownVisible()) return true; return false; } }); tab.controllers.navigationController.initialize(); } function wireTabInputEvents(tab, plugin) { + var _a3, _b; const { dom, ui, state, controllers } = tab; + let wasBangBashActive = (_b = (_a3 = ui.bangBashModeManager) == null ? void 0 : _a3.isActive()) != null ? _b : false; + const syncBangBashSuppression = () => { + var _a4, _b2, _c, _d; + const isActive = (_b2 = (_a4 = ui.bangBashModeManager) == null ? void 0 : _a4.isActive()) != null ? _b2 : false; + if (isActive === wasBangBashActive) return; + wasBangBashActive = isActive; + (_c = ui.slashCommandDropdown) == null ? void 0 : _c.setEnabled(!isActive); + if (isActive) { + (_d = ui.fileContextManager) == null ? void 0 : _d.hideMentionDropdown(); + } + }; const keydownHandler = (e2) => { - var _a3, _b, _c, _d, _e, _f; - if ((_a3 = ui.instructionModeManager) == null ? void 0 : _a3.handleTriggerKey(e2)) { + var _a4, _b2, _c, _d, _e, _f, _g, _h, _i; + if ((_a4 = ui.bangBashModeManager) == null ? void 0 : _a4.isActive()) { + ui.bangBashModeManager.handleKeydown(e2); + syncBangBashSuppression(); return; } - if ((_b = ui.instructionModeManager) == null ? void 0 : _b.handleKeydown(e2)) { + if ((_b2 = ui.instructionModeManager) == null ? void 0 : _b2.handleTriggerKey(e2)) { return; } - if ((_c = ui.slashCommandDropdown) == null ? void 0 : _c.handleKeydown(e2)) { + if ((_c = ui.bangBashModeManager) == null ? void 0 : _c.handleTriggerKey(e2)) { + syncBangBashSuppression(); return; } - if ((_d = ui.fileContextManager) == null ? void 0 : _d.handleMentionKeydown(e2)) { + if ((_d = ui.instructionModeManager) == null ? void 0 : _d.handleKeydown(e2)) { + return; + } + if ((_e = controllers.inputController) == null ? void 0 : _e.handleResumeKeydown(e2)) { + return; + } + if ((_f = ui.slashCommandDropdown) == null ? void 0 : _f.handleKeydown(e2)) { + return; + } + if ((_g = ui.fileContextManager) == null ? void 0 : _g.handleMentionKeydown(e2)) { return; } if (e2.key === "Escape" && !e2.isComposing && state.isStreaming) { e2.preventDefault(); - (_e = controllers.inputController) == null ? void 0 : _e.cancelStreaming(); + (_h = controllers.inputController) == null ? void 0 : _h.cancelStreaming(); return; } if (e2.key === "Enter" && !e2.shiftKey && !e2.isComposing) { e2.preventDefault(); - void ((_f = controllers.inputController) == null ? void 0 : _f.sendMessage()); + void ((_i = controllers.inputController) == null ? void 0 : _i.sendMessage()); } }; dom.inputEl.addEventListener("keydown", keydownHandler); dom.eventCleanups.push(() => dom.inputEl.removeEventListener("keydown", keydownHandler)); const inputHandler = () => { - var _a3, _b; - (_a3 = ui.fileContextManager) == null ? void 0 : _a3.handleInputChange(); - (_b = ui.instructionModeManager) == null ? void 0 : _b.handleInputChange(); + var _a4, _b2, _c, _d; + if (!((_a4 = ui.bangBashModeManager) == null ? void 0 : _a4.isActive())) { + (_b2 = ui.fileContextManager) == null ? void 0 : _b2.handleInputChange(); + } + (_c = ui.instructionModeManager) == null ? void 0 : _c.handleInputChange(); + (_d = ui.bangBashModeManager) == null ? void 0 : _d.handleInputChange(); + syncBangBashSuppression(); autoResizeTextarea(dom.inputEl); }; dom.inputEl.addEventListener("input", inputHandler); dom.eventCleanups.push(() => dom.inputEl.removeEventListener("input", inputHandler)); const focusHandler = () => { - var _a3; - (_a3 = controllers.selectionController) == null ? void 0 : _a3.showHighlight(); + var _a4; + (_a4 = controllers.selectionController) == null ? void 0 : _a4.showHighlight(); }; dom.inputEl.addEventListener("focus", focusHandler); dom.eventCleanups.push(() => dom.inputEl.removeEventListener("focus", focusHandler)); @@ -59131,8 +64382,8 @@ function wireTabInputEvents(tab, plugin) { const RE_ENABLE_DELAY = 150; let reEnableTimeout = null; const isAutoScrollAllowed = () => { - var _a3; - return (_a3 = plugin.settings.enableAutoScroll) != null ? _a3 : true; + var _a4; + return (_a4 = plugin.settings.enableAutoScroll) != null ? _a4 : true; }; const scrollHandler = () => { if (!isAutoScrollAllowed()) { @@ -59177,8 +64428,8 @@ function wireTabInputEvents(tab, plugin) { }; dom.scrollToBottomEl.addEventListener("click", scrollToBottomHandler); dom.eventCleanups.push(() => { - var _a3; - return (_a3 = dom.scrollToBottomEl) == null ? void 0 : _a3.removeEventListener("click", scrollToBottomHandler); + var _a4; + return (_a4 = dom.scrollToBottomEl) == null ? void 0 : _a4.removeEventListener("click", scrollToBottomHandler); }); } } @@ -59194,22 +64445,25 @@ function deactivateTab(tab) { (_a3 = tab.controllers.selectionController) == null ? void 0 : _a3.stop(); } async function destroyTab(tab) { - var _a3, _b, _c, _d, _e, _f, _g, _h, _i, _j; + var _a3, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l; (_a3 = tab.controllers.selectionController) == null ? void 0 : _a3.stop(); (_b = tab.controllers.selectionController) == null ? void 0 : _b.clear(); (_c = tab.controllers.navigationController) == null ? void 0 : _c.dispose(); cleanupThinkingBlock(tab.state.currentThinkingState); tab.state.currentThinkingState = null; - (_d = tab.ui.fileContextManager) == null ? void 0 : _d.destroy(); - (_e = tab.ui.slashCommandDropdown) == null ? void 0 : _e.destroy(); + (_d = tab.controllers.inputController) == null ? void 0 : _d.destroyResumeDropdown(); + (_e = tab.ui.fileContextManager) == null ? void 0 : _e.destroy(); + (_f = tab.ui.slashCommandDropdown) == null ? void 0 : _f.destroy(); tab.ui.slashCommandDropdown = null; - (_f = tab.ui.instructionModeManager) == null ? void 0 : _f.destroy(); + (_g = tab.ui.instructionModeManager) == null ? void 0 : _g.destroy(); tab.ui.instructionModeManager = null; - (_g = tab.services.instructionRefineService) == null ? void 0 : _g.cancel(); + (_h = tab.ui.bangBashModeManager) == null ? void 0 : _h.destroy(); + tab.ui.bangBashModeManager = null; + (_i = tab.services.instructionRefineService) == null ? void 0 : _i.cancel(); tab.services.instructionRefineService = null; - (_h = tab.services.titleGenerationService) == null ? void 0 : _h.cancel(); + (_j = tab.services.titleGenerationService) == null ? void 0 : _j.cancel(); tab.services.titleGenerationService = null; - (_i = tab.ui.statusPanel) == null ? void 0 : _i.destroy(); + (_k = tab.ui.statusPanel) == null ? void 0 : _k.destroy(); tab.ui.statusPanel = null; tab.services.subagentManager.orphanAllActive(); tab.services.subagentManager.clear(); @@ -59217,7 +64471,7 @@ async function destroyTab(tab) { cleanup(); } tab.dom.eventCleanups.length = 0; - (_j = tab.service) == null ? void 0 : _j.closePersistentQuery("tab closed"); + (_l = tab.service) == null ? void 0 : _l.closePersistentQuery("tab closed"); tab.service = null; tab.dom.contentEl.remove(); } @@ -59230,10 +64484,13 @@ function getTabTitle(tab, plugin) { } return "New Chat"; } -function setupApprovalCallback(tab) { +function setupServiceCallbacks(tab, plugin) { if (tab.service && tab.controllers.inputController) { tab.service.setApprovalCallback( - (toolName, input, description, options) => tab.controllers.inputController.handleApprovalRequest(toolName, input, description, options) + async (toolName, input, description, options) => { + var _a3, _b; + return (_b = await ((_a3 = tab.controllers.inputController) == null ? void 0 : _a3.handleApprovalRequest(toolName, input, description, options))) != null ? _b : "cancel"; + } ); tab.service.setApprovalDismisser( () => { @@ -59241,8 +64498,51 @@ function setupApprovalCallback(tab) { return (_a3 = tab.controllers.inputController) == null ? void 0 : _a3.dismissPendingApproval(); } ); + tab.service.setAskUserQuestionCallback( + async (input, signal) => { + var _a3, _b; + return (_b = await ((_a3 = tab.controllers.inputController) == null ? void 0 : _a3.handleAskUserQuestion(input, signal))) != null ? _b : null; + } + ); + tab.service.setExitPlanModeCallback( + async (input, signal) => { + var _a3, _b, _c; + const decision = (_b = await ((_a3 = tab.controllers.inputController) == null ? void 0 : _a3.handleExitPlanMode(input, signal))) != null ? _b : null; + if (decision !== null && decision.type !== "feedback") { + if (plugin.settings.permissionMode === "plan") { + const restoreMode = (_c = tab.state.prePlanPermissionMode) != null ? _c : "normal"; + tab.state.prePlanPermissionMode = null; + updatePlanModeUI(tab, plugin, restoreMode); + } + if (decision.type === "approve-new-session") { + tab.state.pendingNewSessionPlan = decision.planContent; + tab.state.cancelRequested = true; + } + } + return decision; + } + ); + tab.service.setPermissionModeSyncCallback((sdkMode) => { + let mode; + if (sdkMode === "bypassPermissions") mode = "yolo"; + else if (sdkMode === "plan") mode = "plan"; + else mode = "normal"; + if (plugin.settings.permissionMode !== mode) { + if (mode === "plan" && tab.state.prePlanPermissionMode === null) { + tab.state.prePlanPermissionMode = plugin.settings.permissionMode; + } + updatePlanModeUI(tab, plugin, mode); + } + }); } } +function updatePlanModeUI(tab, plugin, mode) { + var _a3; + plugin.settings.permissionMode = mode; + void plugin.saveSettings(); + (_a3 = tab.ui.permissionToggle) == null ? void 0 : _a3.updateDisplay(); + tab.dom.inputWrapper.toggleClass("claudian-input-plan-mode", mode === "plan"); +} // src/features/chat/tabs/TabBar.ts var TabBar = class { @@ -59298,6 +64598,45 @@ var TabBar = class { } }; +// src/features/chat/tabs/TabManager.ts +var import_obsidian23 = require("obsidian"); + +// src/shared/modals/ForkTargetModal.ts +var import_obsidian22 = require("obsidian"); +function chooseForkTarget(app) { + return new Promise((resolve4) => { + new ForkTargetModal(app, resolve4).open(); + }); +} +var ForkTargetModal = class extends import_obsidian22.Modal { + constructor(app, resolve4) { + super(app); + this.resolved = false; + this.resolve = resolve4; + } + onOpen() { + this.setTitle(t("chat.fork.chooseTarget")); + this.modalEl.addClass("claudian-fork-target-modal"); + const list = this.contentEl.createDiv({ cls: "claudian-fork-target-list" }); + this.createOption(list, "current-tab", t("chat.fork.targetCurrentTab")); + this.createOption(list, "new-tab", t("chat.fork.targetNewTab")); + } + createOption(container, target, label) { + const item = container.createDiv({ cls: "claudian-fork-target-option", text: label }); + item.addEventListener("click", () => { + this.resolved = true; + this.resolve(target); + this.close(); + }); + } + onClose() { + if (!this.resolved) { + this.resolve(null); + } + this.contentEl.empty(); + } +}; + // src/features/chat/tabs/TabManager.ts var TabManager = class { constructor(plugin, mcpManager, containerEl, view, callbacks = {}) { @@ -59363,7 +64702,14 @@ var TabManager = class { initializeTabUI(tab, this.plugin, { getSdkCommands: () => this.getSdkCommands() }); - initializeTabControllers(tab, this.plugin, this.view, this.mcpManager); + initializeTabControllers( + tab, + this.plugin, + this.view, + this.mcpManager, + (forkContext) => this.handleForkRequest(forkContext), + (conversationId2) => this.openConversation(conversationId2) + ); wireTabInputEvents(tab, this.plugin); this.tabs.set(tab.id, tab); (_b = (_a3 = this.callbacks).onTabCreated) == null ? void 0 : _b.call(_a3, tab); @@ -59375,7 +64721,7 @@ var TabManager = class { * @param tabId The tab to switch to. */ async switchToTab(tabId) { - var _a3, _b, _c, _d, _e; + var _a3, _b, _c, _d; const tab = this.tabs.get(tabId); if (!tab) { return; @@ -59401,12 +64747,13 @@ var TabManager = class { if (conversation) { const hasMessages = conversation.messages.length > 0; const externalContextPaths = hasMessages ? conversation.externalContextPaths || [] : this.plugin.settings.persistentExternalContextPaths || []; - tab.service.setSessionId((_b = conversation.sessionId) != null ? _b : null, externalContextPaths); + const resolvedSessionId = tab.service.applyForkState(conversation); + tab.service.setSessionId(resolvedSessionId, externalContextPaths); } } else if (!tab.conversationId && tab.state.messages.length === 0) { - (_c = tab.controllers.conversationController) == null ? void 0 : _c.initializeWelcome(); + (_b = tab.controllers.conversationController) == null ? void 0 : _b.initializeWelcome(); } - (_e = (_d = this.callbacks).onTabSwitched) == null ? void 0 : _e.call(_d, previousTabId, tabId); + (_d = (_c = this.callbacks).onTabSwitched) == null ? void 0 : _d.call(_c, previousTabId, tabId); } finally { this.isSwitchingTab = false; } @@ -59545,6 +64892,85 @@ var TabManager = class { } } // ============================================ + // Fork + // ============================================ + async handleForkRequest(context) { + const target = await chooseForkTarget(this.plugin.app); + if (!target) return; + if (target === "new-tab") { + const tab = await this.forkToNewTab(context); + if (!tab) { + const maxTabs = this.getMaxTabs(); + new import_obsidian23.Notice(t("chat.fork.maxTabsReached", { count: String(maxTabs) })); + return; + } + new import_obsidian23.Notice(t("chat.fork.notice")); + } else { + const success2 = await this.forkInCurrentTab(context); + if (!success2) { + new import_obsidian23.Notice(t("chat.fork.failed", { error: t("chat.fork.errorNoActiveTab") })); + return; + } + new import_obsidian23.Notice(t("chat.fork.noticeCurrentTab")); + } + } + async forkToNewTab(context) { + const maxTabs = this.getMaxTabs(); + if (this.tabs.size >= maxTabs) { + return null; + } + const conversationId = await this.createForkConversation(context); + try { + return await this.createTab(conversationId); + } catch (error48) { + await this.plugin.deleteConversation(conversationId).catch(() => { + }); + throw error48; + } + } + async forkInCurrentTab(context) { + const activeTab = this.getActiveTab(); + if (!(activeTab == null ? void 0 : activeTab.controllers.conversationController)) return false; + const conversationId = await this.createForkConversation(context); + try { + await activeTab.controllers.conversationController.switchTo(conversationId); + } catch (error48) { + await this.plugin.deleteConversation(conversationId).catch(() => { + }); + throw error48; + } + return true; + } + async createForkConversation(context) { + const conversation = await this.plugin.createConversation(); + const title = context.sourceTitle ? this.buildForkTitle(context.sourceTitle, context.forkAtUserMessage) : void 0; + await this.plugin.updateConversation(conversation.id, { + messages: context.messages, + forkSource: { sessionId: context.sourceSessionId, resumeAt: context.resumeAt }, + // Prevent immediate SDK message load from merging duplicates with the copied messages. + // This is in-memory only (not persisted in metadata). + sdkMessagesLoaded: true, + ...title && { title }, + ...context.currentNote && { currentNote: context.currentNote } + }); + return conversation.id; + } + buildForkTitle(sourceTitle, forkAtUserMessage) { + const MAX_TITLE_LENGTH = 50; + const forkSuffix = forkAtUserMessage ? ` (#${forkAtUserMessage})` : ""; + const forkPrefix = "Fork: "; + const maxSourceLength = MAX_TITLE_LENGTH - forkPrefix.length - forkSuffix.length; + const truncatedSource = sourceTitle.length > maxSourceLength ? sourceTitle.slice(0, maxSourceLength - 1) + "\u2026" : sourceTitle; + let title = forkPrefix + truncatedSource + forkSuffix; + const existingTitles = new Set(this.plugin.getConversationList().map((c3) => c3.title)); + if (existingTitles.has(title)) { + let n2 = 2; + while (existingTitles.has(`${title} ${n2}`)) n2++; + title = `${title} ${n2}`; + } + return title; + } + // ============================================ // Persistence // ============================================ /** Gets the state to persist. */ @@ -59591,7 +65017,7 @@ var TabManager = class { } try { await initializeTabService(activeTab, this.plugin, this.mcpManager); - setupApprovalCallback(activeTab); + setupServiceCallbacks(activeTab, this.plugin); } catch (e2) { } } @@ -59621,16 +65047,16 @@ var TabManager = class { * @param fn Function to call on each service. */ async broadcastToAllTabs(fn) { - const promises = []; + const promises2 = []; for (const tab of this.tabs.values()) { if (tab.service && tab.serviceInitialized) { - promises.push( + promises2.push( fn(tab.service).catch(() => { }) ); } } - await Promise.all(promises); + await Promise.all(promises2); } // ============================================ // Cleanup @@ -59650,7 +65076,7 @@ var TabManager = class { }; // src/features/chat/ClaudianView.ts -var ClaudianView = class extends import_obsidian19.ItemView { +var ClaudianView = class extends import_obsidian24.ItemView { constructor(leaf, plugin) { super(leaf); // Tab management @@ -59794,10 +65220,10 @@ var ClaudianView = class extends import_obsidian19.ItemView { svg.setAttribute("width", LOGO_SVG.width); svg.setAttribute("height", LOGO_SVG.height); svg.setAttribute("fill", "none"); - const path10 = document.createElementNS("http://www.w3.org/2000/svg", "path"); - path10.setAttribute("d", LOGO_SVG.path); - path10.setAttribute("fill", LOGO_SVG.fill); - svg.appendChild(path10); + const path11 = document.createElementNS("http://www.w3.org/2000/svg", "path"); + path11.setAttribute("d", LOGO_SVG.path); + path11.setAttribute("fill", LOGO_SVG.fill); + svg.appendChild(path11); this.logoEl.appendChild(svg); this.titleTextEl = this.titleSlotEl.createEl("h4", { text: "Claudian", cls: "claudian-title-text" }); this.headerActionsEl = header.createDiv({ cls: "claudian-header-actions claudian-header-actions-slot" }); @@ -59820,13 +65246,13 @@ var ClaudianView = class extends import_obsidian19.ItemView { this.headerActionsContent = document.createElement("div"); this.headerActionsContent.className = "claudian-header-actions"; const newTabBtn = this.headerActionsContent.createDiv({ cls: "claudian-header-btn claudian-new-tab-btn" }); - (0, import_obsidian19.setIcon)(newTabBtn, "square-plus"); + (0, import_obsidian24.setIcon)(newTabBtn, "square-plus"); newTabBtn.setAttribute("aria-label", "New tab"); newTabBtn.addEventListener("click", async () => { await this.handleNewTab(); }); const newBtn = this.headerActionsContent.createDiv({ cls: "claudian-header-btn" }); - (0, import_obsidian19.setIcon)(newBtn, "square-pen"); + (0, import_obsidian24.setIcon)(newBtn, "square-pen"); newBtn.setAttribute("aria-label", "New conversation"); newBtn.addEventListener("click", async () => { var _a3; @@ -59835,7 +65261,7 @@ var ClaudianView = class extends import_obsidian19.ItemView { }); const historyContainer = this.headerActionsContent.createDiv({ cls: "claudian-history-container" }); const historyBtn = historyContainer.createDiv({ cls: "claudian-header-btn" }); - (0, import_obsidian19.setIcon)(historyBtn, "history"); + (0, import_obsidian24.setIcon)(historyBtn, "history"); historyBtn.setAttribute("aria-label", "Chat history"); this.historyDropdown = historyContainer.createDiv({ cls: "claudian-history-menu" }); historyBtn.addEventListener("click", (e2) => { @@ -59907,7 +65333,7 @@ var ClaudianView = class extends import_obsidian19.ItemView { const tab = await ((_a3 = this.tabManager) == null ? void 0 : _a3.createTab()); if (!tab) { const maxTabs = (_b = this.plugin.settings.maxTabs) != null ? _b : 3; - new import_obsidian19.Notice(`Maximum ${maxTabs} tabs allowed`); + new import_obsidian24.Notice(`Maximum ${maxTabs} tabs allowed`); return; } this.updateTabBarVisibility(); @@ -59994,6 +65420,23 @@ var ClaudianView = class extends import_obsidian19.ItemView { var _a3; (_a3 = this.historyDropdown) == null ? void 0 : _a3.removeClass("visible"); }); + this.registerDomEvent(this.containerEl, "keydown", (e2) => { + var _a3, _b; + if (e2.key === "Tab" && e2.shiftKey && !e2.isComposing) { + e2.preventDefault(); + const activeTab = (_a3 = this.tabManager) == null ? void 0 : _a3.getActiveTab(); + if (!activeTab) return; + const current = this.plugin.settings.permissionMode; + if (current === "plan") { + const restoreMode = (_b = activeTab.state.prePlanPermissionMode) != null ? _b : "normal"; + activeTab.state.prePlanPermissionMode = null; + updatePlanModeUI(activeTab, this.plugin, restoreMode); + } else { + activeTab.state.prePlanPermissionMode = current; + updatePlanModeUI(activeTab, this.plugin, "plan"); + } + } + }); this.registerDomEvent(document, "keydown", (e2) => { var _a3, _b; if (e2.key === "Escape" && !e2.isComposing) { @@ -60095,7 +65538,7 @@ var ClaudianView = class extends import_obsidian19.ItemView { }; // src/features/inline-edit/ui/InlineEditModal.ts -var import_obsidian20 = require("obsidian"); +var import_obsidian25 = require("obsidian"); // src/utils/inlineEdit.ts function normalizeInsertionText(text) { @@ -60686,7 +66129,7 @@ var InlineEditModal = class { activeController.reject(); return { decision: "reject" }; } - const view = this.app.workspace.getActiveViewOfType(import_obsidian20.MarkdownView); + const view = this.app.workspace.getActiveViewOfType(import_obsidian25.MarkdownView); if (!view) return { decision: "reject" }; const editor = view.editor; const editorView = getEditorView(editor); @@ -61087,2543 +66530,15 @@ var InlineEditController = class { const vaultPath = getVaultPath(this.app); return normalizePathForVault(rawPath, vaultPath); } catch (e2) { - new import_obsidian20.Notice("Failed to attach file: invalid path"); + new import_obsidian25.Notice("Failed to attach file: invalid path"); return null; } } }; // src/features/settings/ClaudianSettings.ts -var fs7 = __toESM(require("fs")); -var import_obsidian29 = require("obsidian"); - -// src/i18n/locales/de.json -var de_exports = {}; -__export(de_exports, { - common: () => common, - default: () => de_default2, - settings: () => settings -}); -var common = { - save: "Speichern", - cancel: "Abbrechen", - delete: "L\xF6schen", - edit: "Bearbeiten", - add: "Hinzuf\xFCgen", - remove: "Entfernen", - clear: "L\xF6schen", - clearAll: "Alle l\xF6schen", - loading: "L\xE4dt", - error: "Fehler", - success: "Erfolg", - warning: "Warnung", - confirm: "Best\xE4tigen", - settings: "Einstellungen", - advanced: "Erweitert", - enabled: "Aktiviert", - disabled: "Deaktiviert", - platform: "Plattform" -}; -var settings = { - title: "Claudian Einstellungen", - customization: "Anpassung", - userName: { - name: "Wie soll Claudian dich nennen?", - desc: "Dein Name f\xFCr personalisierte Begr\xFC\xDFungen (leer lassen f\xFCr allgemeine Begr\xFC\xDFungen)" - }, - excludedTags: { - name: "Ausgeschlossene Tags", - desc: "Notizen mit diesen Tags werden nicht automatisch als Kontext geladen (einer pro Zeile, ohne #)" - }, - mediaFolder: { - name: "Medienordner", - desc: "Ordner mit Anh\xE4ngen/Bildern. Wenn Notizen ![[image.jpg]] verwenden, sucht Claude hier. Leer lassen f\xFCr Vault-Stammverzeichnis." - }, - systemPrompt: { - name: "Benutzerdefinierter System-Prompt", - desc: "Zus\xE4tzliche Anweisungen, die an den Standard-System-Prompt angeh\xE4ngt werden" - }, - autoTitle: { - name: "Konversationstitel automatisch generieren", - desc: "Generiert automatisch Konversationstitel nach der ersten Nutzernachricht." - }, - titleModel: { - name: "Titel-Generierungsmodell", - desc: "Modell zur automatischen Generierung von Konversationstiteln.", - auto: "Automatisch (Haiku)" - }, - navMappings: { - name: "Vim-Style Navigationszuordnungen", - desc: 'Eine Zuordnung pro Zeile. Format: "map " (Aktionen: scrollUp, scrollDown, focusInput).' - }, - hotkeys: "Tastenk\xFCrzel", - inlineEditHotkey: { - name: "Inline-Bearbeitung", - descWithKey: "Aktuelles Tastenk\xFCrzel: {hotkey}", - descNoKey: "Kein Tastenk\xFCrzel festgelegt", - btnChange: "\xC4ndern", - btnSet: "Festlegen" - }, - openChatHotkey: { - name: "Chat \xF6ffnen", - descWithKey: "Aktuelles Tastenk\xFCrzel: {hotkey}", - descNoKey: "Kein Tastenk\xFCrzel festgelegt", - btnChange: "\xC4ndern", - btnSet: "Festlegen" - }, - newSessionHotkey: { - name: "Neue Sitzung", - descWithKey: "Aktuelles Tastenk\xFCrzel: {hotkey}", - descNoKey: "Kein Tastenk\xFCrzel festgelegt", - btnChange: "\xC4ndern", - btnSet: "Festlegen" - }, - newTabHotkey: { - name: "Neuer Tab", - descWithKey: "Aktuelles Tastenk\xFCrzel: {hotkey}", - descNoKey: "Kein Tastenk\xFCrzel festgelegt", - btnChange: "\xC4ndern", - btnSet: "Festlegen" - }, - closeTabHotkey: { - name: "Tab schlie\xDFen", - descWithKey: "Aktuelles Tastenk\xFCrzel: {hotkey}", - descNoKey: "Kein Tastenk\xFCrzel festgelegt", - btnChange: "\xC4ndern", - btnSet: "Festlegen" - }, - slashCommands: { - name: "Befehle und F\xE4higkeiten", - desc: "Definiere benutzerdefinierte Befehle und F\xE4higkeiten, die durch /Name ausgel\xF6st werden." - }, - hiddenSlashCommands: { - name: "Ausgeblendete Befehle", - desc: "Bestimmte Schr\xE4gstrich-Befehle aus dem Dropdown ausblenden. N\xFCtzlich, um Claude Code-Befehle auszublenden, die f\xFCr Claudian nicht relevant sind. Gib Befehlsnamen ohne f\xFChrenden Schr\xE4gstrich ein, einen pro Zeile.", - placeholder: "commit\nbuild\ntest" - }, - mcpServers: { - name: "MCP-Server", - desc: "Konfiguriere Model Context Protocol Server, um Claude mit externen Tools und Datenquellen zu erweitern. Server mit Kontext-Speichermodus ben\xF6tigen @mention zur Aktivierung." - }, - plugins: { - name: "Claude Code Plugins", - desc: "Aktiviere oder deaktiviere Claude Code Plugins aus ~/.claude/plugins. Aktivierte Plugins werden pro Vault gespeichert." - }, - subagents: { - name: "Subagents", - desc: "Configure custom subagents that Claude can delegate to.", - noAgents: "No subagents configured. Click + to create one.", - deleteConfirm: 'Delete subagent "{name}"?', - saveFailed: "Failed to save subagent: {message}", - deleteFailed: "Failed to delete subagent: {message}", - renameCleanupFailed: 'Warning: could not remove old file for "{name}"', - saved: 'Subagent "{name}" {action}', - deleted: 'Subagent "{name}" deleted', - duplicateName: 'An agent named "{name}" already exists', - descriptionRequired: "Description is required", - promptRequired: "System prompt is required", - modal: { - titleEdit: "Edit Subagent", - titleAdd: "Add Subagent", - name: "Name", - nameDesc: "Lowercase letters, numbers, and hyphens only", - namePlaceholder: "code-reviewer", - description: "Description", - descriptionDesc: "Brief description of this agent", - descriptionPlaceholder: "Reviews code for bugs and style", - advancedOptions: "Advanced options", - model: "Model", - modelDesc: "Model override for this agent", - tools: "Tools", - toolsDesc: "Comma-separated list of allowed tools (empty = all)", - disallowedTools: "Disallowed tools", - disallowedToolsDesc: "Comma-separated list of tools to disallow", - skills: "Skills", - skillsDesc: "Comma-separated list of skills", - prompt: "System prompt", - promptDesc: "Instructions for the agent", - promptPlaceholder: "You are a code reviewer. Analyze the given code for..." - } - }, - safety: "Sicherheit", - loadUserSettings: { - name: "Benutzer-Claude-Einstellungen laden", - desc: "L\xE4dt ~/.claude/settings.json. Wenn aktiviert, k\xF6nnen Benutzer-Claude-Code-Berechtigungsregeln den Sicherheitsmodus umgehen." - }, - enableBlocklist: { - name: "Befehlsblockliste aktivieren", - desc: "Blockiert potenziell gef\xE4hrliche Bash-Befehle" - }, - blockedCommands: { - name: "Blockierte Befehle ({platform})", - desc: "Muster zum Blockieren auf {platform} (einer pro Zeile). Unterst\xFCtzt Regex.", - unixName: "Blockierte Befehle (Unix/Git Bash)", - unixDesc: "Unix-Muster werden auch auf Windows blockiert, da Git Bash sie aufrufen kann." - }, - exportPaths: { - name: "Zugelassene Exportpfade", - desc: "Pfade au\xDFerhalb des Vaults, in die Dateien exportiert werden k\xF6nnen (einer pro Zeile). Unterst\xFCtzt ~ f\xFCr Home-Verzeichnis." - }, - environment: "Umgebung", - customVariables: { - name: "Benutzerdefinierte Variablen", - desc: "Umgebungsvariablen f\xFCr Claude SDK (KEY=VALUE-Format, eine pro Zeile). Export-Pr\xE4fix unterst\xFCtzt." - }, - envSnippets: { - name: "Snippets", - addBtn: "Snippet hinzuf\xFCgen", - noSnippets: "Keine gespeicherten Umgebungsvariablen-Snippets. Klicken Sie auf +, um Ihre aktuelle Konfiguration zu speichern.", - nameRequired: "Bitte geben Sie einen Namen f\xFCr das Snippet ein", - modal: { - titleEdit: "Snippet bearbeiten", - titleSave: "Snippet speichern", - name: "Name", - namePlaceholder: "Ein beschreibender Name f\xFCr diese Umgebungskonfiguration", - description: "Beschreibung", - descPlaceholder: "Optionale Beschreibung", - envVars: "Umgebungsvariablen", - envVarsPlaceholder: "KEY=VALUE-Format, eine pro Zeile (export-Pr\xE4fix unterst\xFCtzt)", - save: "Speichern", - update: "Aktualisieren", - cancel: "Abbrechen" - } - }, - customContextLimits: { - name: "Benutzerdefinierte Kontextlimits", - desc: "Legen Sie die Kontextfenstergr\xF6\xDFen f\xFCr Ihre benutzerdefinierten Modelle fest. Leer lassen f\xFCr den Standardwert (200k Token).", - invalid: "Ung\xFCltiges Format. Verwenden Sie: 256k, 1m oder exakte Anzahl (1000-10000000)." - }, - advanced: "Erweitert", - show1MModel: { - name: "Sonnet mit 1M-Kontextfenster aktivieren", - desc: "Standard-Sonnet durch Sonnet (1M) in der Modellauswahl ersetzen. Gleiche Preise unter 200k Token. Erfordert Max-Abonnement." - }, - enableChrome: { - name: "Chrome-Erweiterung aktivieren", - desc: "Erlaubt Claude die Interaktion mit Chrome \xFCber die claude-in-chrome-Erweiterung. Die Erweiterung muss installiert sein. Erfordert Neustart der Sitzung." - }, - maxTabs: { - name: "Maximale Chat-Tabs", - desc: "Maximale Anzahl gleichzeitiger Chat-Tabs (3-10). Jeder Tab verwendet eine separate Claude-Sitzung.", - warning: "Mehr als 5 Tabs k\xF6nnen Leistung und Speichernutzung beeintr\xE4chtigen." - }, - tabBarPosition: { - name: "Tab-Leiste Position", - desc: "W\xE4hlen Sie, wo Tab-Badges und Aktionsschaltfl\xE4chen angezeigt werden", - input: "\xDCber Eingabefeld (Standard)", - header: "In Kopfzeile" - }, - enableAutoScroll: { - name: "Automatisches Scrollen w\xE4hrend Streaming", - desc: "Automatisch nach unten scrollen, w\xE4hrend Claude Antworten streamt. Deaktivieren, um oben zu bleiben und von Anfang an zu lesen." - }, - openInMainTab: { - name: "Im Haupteditorbereich \xF6ffnen", - desc: "Chat-Panel als Haupttab im zentralen Editorbereich statt in der rechten Seitenleiste \xF6ffnen" - }, - cliPath: { - name: "Claude CLI-Pfad", - desc: "Benutzerdefinierter Pfad zum Claude Code CLI. Leer lassen f\xFCr automatische Erkennung.", - descWindows: "F\xFCr den nativen Installer verwenden Sie claude.exe. F\xFCr npm/pnpm/yarn oder andere Paketmanager-Installationen verwenden Sie den cli.js-Pfad (nicht claude.cmd).", - descUnix: 'F\xFCgen Sie die Ausgabe von "which claude" ein \u2014 funktioniert sowohl f\xFCr native als auch npm/pnpm/yarn-Installationen.', - validation: { - notExist: "Pfad existiert nicht", - isDirectory: "Pfad ist ein Verzeichnis, keine Datei" - } - }, - language: { - name: "Sprache", - desc: "Anzeigesprache der Plugin-Oberfl\xE4che \xE4ndern" - } -}; -var de_default2 = { - common, - settings -}; - -// src/i18n/locales/en.json -var en_exports = {}; -__export(en_exports, { - common: () => common2, - default: () => en_default3, - settings: () => settings2 -}); -var common2 = { - save: "Save", - cancel: "Cancel", - delete: "Delete", - edit: "Edit", - add: "Add", - remove: "Remove", - clear: "Clear", - clearAll: "Clear all", - loading: "Loading", - error: "Error", - success: "Success", - warning: "Warning", - confirm: "Confirm", - settings: "Settings", - advanced: "Advanced", - enabled: "Enabled", - disabled: "Disabled", - platform: "Platform" -}; -var settings2 = { - title: "Claudian Settings", - customization: "Customization", - userName: { - name: "What should Claudian call you?", - desc: "Your name for personalized greetings (leave empty for generic greetings)" - }, - excludedTags: { - name: "Excluded tags", - desc: "Notes with these tags will not auto-load as context (one per line, without #)" - }, - mediaFolder: { - name: "Media folder", - desc: "Folder containing attachments/images. When notes use ![[image.jpg]], Claude will look here. Leave empty for vault root." - }, - systemPrompt: { - name: "Custom system prompt", - desc: "Additional instructions appended to the default system prompt" - }, - autoTitle: { - name: "Auto-generate conversation titles", - desc: "Automatically generate conversation titles after the first user message is sent." - }, - titleModel: { - name: "Title generation model", - desc: "Model used for auto-generating conversation titles.", - auto: "Auto (Haiku)" - }, - navMappings: { - name: "Vim-style navigation mappings", - desc: 'One mapping per line. Format: "map " (actions: scrollUp, scrollDown, focusInput).' - }, - hotkeys: "Hotkeys", - inlineEditHotkey: { - name: "Inline Edit", - descWithKey: "Current hotkey: {hotkey}", - descNoKey: "No hotkey set", - btnChange: "Change", - btnSet: "Set hotkey" - }, - openChatHotkey: { - name: "Open Chat", - descWithKey: "Current hotkey: {hotkey}", - descNoKey: "No hotkey set", - btnChange: "Change", - btnSet: "Set hotkey" - }, - newSessionHotkey: { - name: "New Session", - descWithKey: "Current hotkey: {hotkey}", - descNoKey: "No hotkey set", - btnChange: "Change", - btnSet: "Set hotkey" - }, - newTabHotkey: { - name: "New Tab", - descWithKey: "Current hotkey: {hotkey}", - descNoKey: "No hotkey set", - btnChange: "Change", - btnSet: "Set hotkey" - }, - closeTabHotkey: { - name: "Close Tab", - descWithKey: "Current hotkey: {hotkey}", - descNoKey: "No hotkey set", - btnChange: "Change", - btnSet: "Set hotkey" - }, - slashCommands: { - name: "Commands and Skills", - desc: "Define custom commands and skills triggered by /name." - }, - hiddenSlashCommands: { - name: "Hidden Commands", - desc: "Hide specific slash commands from the dropdown. Useful for hiding Claude Code commands that are not relevant to Claudian. Enter command names without the leading slash, one per line.", - placeholder: "commit\nbuild\ntest" - }, - mcpServers: { - name: "MCP Servers", - desc: "Configure Model Context Protocol servers to extend Claude's capabilities with external tools and data sources. Servers with context-saving mode require @mention to activate." - }, - plugins: { - name: "Claude Code Plugins", - desc: "Enable or disable Claude Code plugins discovered from ~/.claude/plugins. Enabled plugins are stored per vault." - }, - subagents: { - name: "Subagents", - desc: "Configure custom subagents that Claude can delegate to.", - noAgents: "No subagents configured. Click + to create one.", - deleteConfirm: 'Delete subagent "{name}"?', - saveFailed: "Failed to save subagent: {message}", - deleteFailed: "Failed to delete subagent: {message}", - renameCleanupFailed: 'Warning: could not remove old file for "{name}"', - saved: 'Subagent "{name}" {action}', - deleted: 'Subagent "{name}" deleted', - duplicateName: 'An agent named "{name}" already exists', - descriptionRequired: "Description is required", - promptRequired: "System prompt is required", - modal: { - titleEdit: "Edit Subagent", - titleAdd: "Add Subagent", - name: "Name", - nameDesc: "Lowercase letters, numbers, and hyphens only", - namePlaceholder: "code-reviewer", - description: "Description", - descriptionDesc: "Brief description of this agent", - descriptionPlaceholder: "Reviews code for bugs and style", - advancedOptions: "Advanced options", - model: "Model", - modelDesc: "Model override for this agent", - tools: "Tools", - toolsDesc: "Comma-separated list of allowed tools (empty = all)", - disallowedTools: "Disallowed tools", - disallowedToolsDesc: "Comma-separated list of tools to disallow", - skills: "Skills", - skillsDesc: "Comma-separated list of skills", - prompt: "System prompt", - promptDesc: "Instructions for the agent", - promptPlaceholder: "You are a code reviewer. Analyze the given code for..." - } - }, - safety: "Safety", - loadUserSettings: { - name: "Load user Claude settings", - desc: "Load ~/.claude/settings.json. When enabled, user's Claude Code permission rules may bypass Safe mode." - }, - enableBlocklist: { - name: "Enable command blocklist", - desc: "Block potentially dangerous bash commands" - }, - blockedCommands: { - name: "Blocked commands ({platform})", - desc: "Patterns to block on {platform} (one per line). Supports regex.", - unixName: "Blocked commands (Unix/Git Bash)", - unixDesc: "Unix patterns also blocked on Windows because Git Bash can invoke them." - }, - exportPaths: { - name: "Allowed export paths", - desc: "Paths outside the vault where files can be exported (one per line). Supports ~ for home directory." - }, - environment: "Environment", - customVariables: { - name: "Custom variables", - desc: "Environment variables for Claude SDK (KEY=VALUE format, one per line). Shell export prefix supported." - }, - envSnippets: { - name: "Snippets", - addBtn: "Add snippet", - noSnippets: "No saved environment snippets yet. Click + to save your current environment configuration.", - nameRequired: "Please enter a name for the snippet", - modal: { - titleEdit: "Edit snippet", - titleSave: "Save snippet", - name: "Name", - namePlaceholder: "A descriptive name for this environment configuration", - description: "Description", - descPlaceholder: "Optional description", - envVars: "Environment variables", - envVarsPlaceholder: "KEY=VALUE format, one per line (export prefix supported)", - save: "Save", - update: "Update", - cancel: "Cancel" - } - }, - customContextLimits: { - name: "Custom Context Limits", - desc: "Set context window sizes for your custom models. Leave empty to use the default (200k tokens).", - invalid: "Invalid format. Use: 256k, 1m, or exact count (1000-10000000)." - }, - advanced: "Advanced", - show1MModel: { - name: "Enable Sonnet with 1M context window", - desc: "Replace standard Sonnet with Sonnet (1M) in the model selector. Same pricing under 200k tokens. Requires Max subscription." - }, - enableChrome: { - name: "Enable Chrome extension", - desc: "Allow Claude to interact with Chrome via the claude-in-chrome extension. Requires the extension to be installed. Requires session restart." - }, - maxTabs: { - name: "Maximum chat tabs", - desc: "Maximum number of concurrent chat tabs (3-10). Each tab uses a separate Claude session.", - warning: "More than 5 tabs may impact performance and memory usage." - }, - tabBarPosition: { - name: "Tab bar position", - desc: "Choose where to display tab badges and action buttons", - input: "Above input (default)", - header: "In header" - }, - enableAutoScroll: { - name: "Auto-scroll during streaming", - desc: "Automatically scroll to the bottom as Claude streams responses. Disable to stay at the top and read from the beginning." - }, - openInMainTab: { - name: "Open in main editor area", - desc: "Open chat panel as a main tab in the center editor area instead of the right sidebar" - }, - cliPath: { - name: "Claude CLI path", - desc: "Custom path to Claude Code CLI. Leave empty for auto-detection.", - descWindows: "For the native installer, use claude.exe. For npm/pnpm/yarn or other package manager installs, use the cli.js path (not claude.cmd).", - descUnix: 'Paste the output of "which claude" \u2014 works for both native and npm/pnpm/yarn installs.', - validation: { - notExist: "Path does not exist", - isDirectory: "Path is a directory, not a file" - } - }, - language: { - name: "Language", - desc: "Change the display language of the plugin interface" - } -}; -var en_default3 = { - common: common2, - settings: settings2 -}; - -// src/i18n/locales/es.json -var es_exports = {}; -__export(es_exports, { - common: () => common3, - default: () => es_default2, - settings: () => settings3 -}); -var common3 = { - save: "Guardar", - cancel: "Cancelar", - delete: "Eliminar", - edit: "Editar", - add: "Agregar", - remove: "Eliminar", - clear: "Limpiar", - clearAll: "Limpiar todo", - loading: "Cargando", - error: "Error", - success: "\xC9xito", - warning: "Advertencia", - confirm: "Confirmar", - settings: "Configuraci\xF3n", - advanced: "Avanzado", - enabled: "Habilitado", - disabled: "Deshabilitado", - platform: "Plataforma" -}; -var settings3 = { - title: "Configuraci\xF3n de Claudian", - customization: "Personalizaci\xF3n", - userName: { - name: "\xBFC\xF3mo deber\xEDa Claudian llamarte?", - desc: "Tu nombre para saludos personalizados (dejar vac\xEDo para saludos gen\xE9ricos)" - }, - excludedTags: { - name: "Etiquetas excluidas", - desc: "Las notas con estas etiquetas no se cargar\xE1n autom\xE1ticamente como contexto (una por l\xEDnea, sin #)" - }, - mediaFolder: { - name: "Carpeta de medios", - desc: "Carpeta que contiene archivos adjuntos/imagenes. Cuando las notas usan ![[image.jpg]], Claude buscar\xE1 aqu\xED. Dejar vac\xEDo para la ra\xEDz del dep\xF3sito." - }, - systemPrompt: { - name: "Prompt de sistema personalizado", - desc: "Instrucciones adicionales a\xF1adidas al prompt de sistema por defecto" - }, - autoTitle: { - name: "Generar autom\xE1ticamente t\xEDtulos de conversaci\xF3n", - desc: "Genera autom\xE1ticamente t\xEDtulos de conversaci\xF3n despu\xE9s del primer mensaje del usuario." - }, - titleModel: { - name: "Modelo de generaci\xF3n de t\xEDtulos", - desc: "Modelo utilizado para generar autom\xE1ticamente t\xEDtulos de conversaci\xF3n.", - auto: "Auto (Haiku)" - }, - navMappings: { - name: "Mapeos de navegaci\xF3n estilo Vim", - desc: 'Un mapeo por l\xEDnea. Formato: "map " (acciones: scrollUp, scrollDown, focusInput).' - }, - hotkeys: "Atajos de teclado", - inlineEditHotkey: { - name: "Edici\xF3n en l\xEDnea", - descWithKey: "Atajo actual: {hotkey}", - descNoKey: "Sin atajo configurado", - btnChange: "Cambiar", - btnSet: "Configurar" - }, - openChatHotkey: { - name: "Abrir chat", - descWithKey: "Atajo actual: {hotkey}", - descNoKey: "Sin atajo configurado", - btnChange: "Cambiar", - btnSet: "Configurar" - }, - newSessionHotkey: { - name: "Nueva sesi\xF3n", - descWithKey: "Atajo actual: {hotkey}", - descNoKey: "Sin atajo configurado", - btnChange: "Cambiar", - btnSet: "Configurar" - }, - newTabHotkey: { - name: "Nueva pesta\xF1a", - descWithKey: "Atajo actual: {hotkey}", - descNoKey: "Sin atajo configurado", - btnChange: "Cambiar", - btnSet: "Configurar" - }, - closeTabHotkey: { - name: "Cerrar pesta\xF1a", - descWithKey: "Atajo actual: {hotkey}", - descNoKey: "Sin atajo configurado", - btnChange: "Cambiar", - btnSet: "Configurar" - }, - slashCommands: { - name: "Comandos y habilidades", - desc: "Define comandos y habilidades personalizados activados por /nombre." - }, - hiddenSlashCommands: { - name: "Comandos ocultos", - desc: "Oculta comandos slash espec\xEDficos del men\xFA desplegable. \xDAtil para ocultar comandos de Claude Code que no son relevantes para Claudian. Ingresa nombres de comandos sin la barra inicial, uno por l\xEDnea.", - placeholder: "commit\nbuild\ntest" - }, - mcpServers: { - name: "Servidores MCP", - desc: "Configura servidores Model Context Protocol para extender las capacidades de Claude con herramientas y fuentes de datos externas. Los servidores con modo de guardado de contexto requieren @mention para activarse." - }, - plugins: { - name: "Plugins de Claude Code", - desc: "Habilita o deshabilita plugins de Claude Code descubiertos desde ~/.claude/plugins. Los plugins habilitados se almacenan por b\xF3veda." - }, - subagents: { - name: "Subagents", - desc: "Configure custom subagents that Claude can delegate to.", - noAgents: "No subagents configured. Click + to create one.", - deleteConfirm: 'Delete subagent "{name}"?', - saveFailed: "Failed to save subagent: {message}", - deleteFailed: "Failed to delete subagent: {message}", - renameCleanupFailed: 'Warning: could not remove old file for "{name}"', - saved: 'Subagent "{name}" {action}', - deleted: 'Subagent "{name}" deleted', - duplicateName: 'An agent named "{name}" already exists', - descriptionRequired: "Description is required", - promptRequired: "System prompt is required", - modal: { - titleEdit: "Edit Subagent", - titleAdd: "Add Subagent", - name: "Name", - nameDesc: "Lowercase letters, numbers, and hyphens only", - namePlaceholder: "code-reviewer", - description: "Description", - descriptionDesc: "Brief description of this agent", - descriptionPlaceholder: "Reviews code for bugs and style", - advancedOptions: "Advanced options", - model: "Model", - modelDesc: "Model override for this agent", - tools: "Tools", - toolsDesc: "Comma-separated list of allowed tools (empty = all)", - disallowedTools: "Disallowed tools", - disallowedToolsDesc: "Comma-separated list of tools to disallow", - skills: "Skills", - skillsDesc: "Comma-separated list of skills", - prompt: "System prompt", - promptDesc: "Instructions for the agent", - promptPlaceholder: "You are a code reviewer. Analyze the given code for..." - } - }, - safety: "Seguridad", - loadUserSettings: { - name: "Cargar configuraci\xF3n de usuario Claude", - desc: "Carga ~/.claude/settings.json. Cuando est\xE1 habilitado, las reglas de permisos del usuario pueden eludir el modo seguro." - }, - enableBlocklist: { - name: "Habilitar lista negra de comandos", - desc: "Bloquea comandos bash potencialmente peligrosos" - }, - blockedCommands: { - name: "Comandos bloqueados ({platform})", - desc: "Patrones a bloquear en {platform} (uno por l\xEDnea). Soporta expresiones regulares.", - unixName: "Comandos bloqueados (Unix/Git Bash)", - unixDesc: "Los patrones Unix tambi\xE9n se bloquean en Windows porque Git Bash puede invocarlos." - }, - exportPaths: { - name: "Rutas de exportaci\xF3n permitidas", - desc: "Rutas fuera del dep\xF3sito donde se pueden exportar archivos (una por l\xEDnea). Soporta ~ para el directorio home." - }, - environment: "Entorno", - customVariables: { - name: "Variables personalizadas", - desc: "Variables de entorno para Claude SDK (formato KEY=VALUE, una por l\xEDnea). Prefijo export soportado." - }, - envSnippets: { - name: "Snippets", - addBtn: "A\xF1adir fragmento", - noSnippets: "No hay fragmentos de entorno guardados. Haga clic en + para guardar su configuraci\xF3n actual.", - nameRequired: "Por favor ingrese un nombre para el fragmento", - modal: { - titleEdit: "Editar fragmento", - titleSave: "Guardar fragmento", - name: "Nombre", - namePlaceholder: "Un nombre descriptivo para esta configuraci\xF3n", - description: "Descripci\xF3n", - descPlaceholder: "Descripci\xF3n opcional", - envVars: "Variables de entorno", - envVarsPlaceholder: "Formato KEY=VALUE, una por l\xEDnea (prefijo export soportado)", - save: "Guardar", - update: "Actualizar", - cancel: "Cancelar" - } - }, - customContextLimits: { - name: "L\xEDmites de contexto personalizados", - desc: "Establezca tama\xF1os de ventana de contexto para sus modelos personalizados. Deje vac\xEDo para usar el valor predeterminado (200k tokens).", - invalid: "Formato inv\xE1lido. Use: 256k, 1m o n\xFAmero exacto (1000-10000000)." - }, - advanced: "Avanzado", - show1MModel: { - name: "Habilitar Sonnet con ventana de contexto de 1M", - desc: "Reemplazar Sonnet est\xE1ndar con Sonnet (1M) en el selector de modelos. Mismo precio bajo 200k tokens. Requiere suscripci\xF3n Max." - }, - enableChrome: { - name: "Habilitar extensi\xF3n de Chrome", - desc: "Permitir que Claude interact\xFAe con Chrome a trav\xE9s de la extensi\xF3n claude-in-chrome. Requiere que la extensi\xF3n est\xE9 instalada. Requiere reinicio de sesi\xF3n." - }, - maxTabs: { - name: "M\xE1ximo de pesta\xF1as de chat", - desc: "N\xFAmero m\xE1ximo de pesta\xF1as de chat simult\xE1neas (3-10). Cada pesta\xF1a usa una sesi\xF3n de Claude separada.", - warning: "M\xE1s de 5 pesta\xF1as puede afectar el rendimiento y el uso de memoria." - }, - tabBarPosition: { - name: "Posici\xF3n de la barra de pesta\xF1as", - desc: "Elige d\xF3nde mostrar las insignias de pesta\xF1as y los botones de acci\xF3n", - input: "Sobre el \xE1rea de entrada (predeterminado)", - header: "En el encabezado" - }, - enableAutoScroll: { - name: "Desplazamiento autom\xE1tico durante streaming", - desc: "Desplazarse autom\xE1ticamente hacia abajo mientras Claude transmite respuestas. Desactivar para quedarse arriba y leer desde el principio." - }, - openInMainTab: { - name: "Abrir en \xE1rea de editor principal", - desc: "Abrir el panel de chat como una pesta\xF1a principal en el \xE1rea de editor central en lugar de la barra lateral derecha" - }, - cliPath: { - name: "Ruta CLI Claude", - desc: "Ruta personalizada a Claude Code CLI. Dejar vac\xEDo para detecci\xF3n autom\xE1tica.", - descWindows: "Para el instalador nativo, use claude.exe. Para instalaciones con npm/pnpm/yarn u otros gestores de paquetes, use la ruta cli.js (no claude.cmd).", - descUnix: 'Pegue la salida de "which claude" \u2014 funciona tanto para instalaciones nativas como npm/pnpm/yarn.', - validation: { - notExist: "La ruta no existe", - isDirectory: "La ruta es un directorio, no un archivo" - } - }, - language: { - name: "Idioma", - desc: "Cambiar el idioma de visualizaci\xF3n de la interfaz del plugin" - } -}; -var es_default2 = { - common: common3, - settings: settings3 -}; - -// src/i18n/locales/fr.json -var fr_exports = {}; -__export(fr_exports, { - common: () => common4, - default: () => fr_default2, - settings: () => settings4 -}); -var common4 = { - save: "Enregistrer", - cancel: "Annuler", - delete: "Supprimer", - edit: "Modifier", - add: "Ajouter", - remove: "Supprimer", - clear: "Effacer", - clearAll: "Tout effacer", - loading: "Chargement", - error: "Erreur", - success: "Succ\xE8s", - warning: "Avertissement", - confirm: "Confirmer", - settings: "Param\xE8tres", - advanced: "Avanc\xE9", - enabled: "Activ\xE9", - disabled: "D\xE9sactiv\xE9", - platform: "Plateforme" -}; -var settings4 = { - title: "Param\xE8tres Claudian", - customization: "Personnalisation", - userName: { - name: "Comment Claudian doit-il vous appeler ?", - desc: "Votre nom pour les salutations personnalis\xE9es (laisser vide pour les salutations g\xE9n\xE9riques)" - }, - excludedTags: { - name: "Tags exclus", - desc: "Les notes avec ces tags ne seront pas charg\xE9es automatiquement comme contexte (un par ligne, sans #)" - }, - mediaFolder: { - name: "Dossier des m\xE9dias", - desc: "Dossier contenant les pi\xE8ces jointes/images. Lorsque les notes utilisent ![[image.jpg]], Claude cherchera ici. Laisser vide pour la racine du coffre." - }, - systemPrompt: { - name: "Prompt syst\xE8me personnalis\xE9", - desc: "Instructions suppl\xE9mentaires ajout\xE9es au prompt syst\xE8me par d\xE9faut" - }, - autoTitle: { - name: "G\xE9n\xE9rer automatiquement les titres de conversation", - desc: "G\xE9n\xE8re automatiquement les titres de conversation apr\xE8s le premier message de l'utilisateur." - }, - titleModel: { - name: "Mod\xE8le de g\xE9n\xE9ration de titre", - desc: "Mod\xE8le utilis\xE9 pour g\xE9n\xE9rer automatiquement les titres de conversation.", - auto: "Auto (Haiku)" - }, - navMappings: { - name: "Mappages de navigation style Vim", - desc: 'Un mappage par ligne. Format : "map " (actions : scrollUp, scrollDown, focusInput).' - }, - hotkeys: "Raccourcis clavier", - inlineEditHotkey: { - name: "\xC9dition en ligne", - descWithKey: "Raccourci actuel : {hotkey}", - descNoKey: "Aucun raccourci d\xE9fini", - btnChange: "Modifier", - btnSet: "D\xE9finir" - }, - openChatHotkey: { - name: "Ouvrir le chat", - descWithKey: "Raccourci actuel : {hotkey}", - descNoKey: "Aucun raccourci d\xE9fini", - btnChange: "Modifier", - btnSet: "D\xE9finir" - }, - newSessionHotkey: { - name: "Nouvelle session", - descWithKey: "Raccourci actuel : {hotkey}", - descNoKey: "Aucun raccourci d\xE9fini", - btnChange: "Modifier", - btnSet: "D\xE9finir" - }, - newTabHotkey: { - name: "Nouvel onglet", - descWithKey: "Raccourci actuel : {hotkey}", - descNoKey: "Aucun raccourci d\xE9fini", - btnChange: "Modifier", - btnSet: "D\xE9finir" - }, - closeTabHotkey: { - name: "Fermer l'onglet", - descWithKey: "Raccourci actuel : {hotkey}", - descNoKey: "Aucun raccourci d\xE9fini", - btnChange: "Modifier", - btnSet: "D\xE9finir" - }, - slashCommands: { - name: "Commandes et comp\xE9tences", - desc: "D\xE9finissez des commandes et comp\xE9tences personnalis\xE9es d\xE9clench\xE9es par /nom." - }, - hiddenSlashCommands: { - name: "Commandes masqu\xE9es", - desc: "Masquer des commandes slash sp\xE9cifiques du menu d\xE9roulant. Utile pour masquer les commandes Claude Code qui ne sont pas pertinentes pour Claudian. Entrez les noms de commandes sans le slash initial, un par ligne.", - placeholder: "commit\nbuild\ntest" - }, - mcpServers: { - name: "Serveurs MCP", - desc: "Configurez les serveurs Model Context Protocol pour \xE9tendre les capacit\xE9s de Claude avec des outils et sources de donn\xE9es externes. Les serveurs avec mode de sauvegarde de contexte n\xE9cessitent une @mention pour s'activer." - }, - plugins: { - name: "Plugins Claude Code", - desc: "Activez ou d\xE9sactivez les plugins Claude Code d\xE9couverts dans ~/.claude/plugins. Les plugins activ\xE9s sont stock\xE9s par coffre." - }, - subagents: { - name: "Subagents", - desc: "Configure custom subagents that Claude can delegate to.", - noAgents: "No subagents configured. Click + to create one.", - deleteConfirm: 'Delete subagent "{name}"?', - saveFailed: "Failed to save subagent: {message}", - deleteFailed: "Failed to delete subagent: {message}", - renameCleanupFailed: 'Warning: could not remove old file for "{name}"', - saved: 'Subagent "{name}" {action}', - deleted: 'Subagent "{name}" deleted', - duplicateName: 'An agent named "{name}" already exists', - descriptionRequired: "Description is required", - promptRequired: "System prompt is required", - modal: { - titleEdit: "Edit Subagent", - titleAdd: "Add Subagent", - name: "Name", - nameDesc: "Lowercase letters, numbers, and hyphens only", - namePlaceholder: "code-reviewer", - description: "Description", - descriptionDesc: "Brief description of this agent", - descriptionPlaceholder: "Reviews code for bugs and style", - advancedOptions: "Advanced options", - model: "Model", - modelDesc: "Model override for this agent", - tools: "Tools", - toolsDesc: "Comma-separated list of allowed tools (empty = all)", - disallowedTools: "Disallowed tools", - disallowedToolsDesc: "Comma-separated list of tools to disallow", - skills: "Skills", - skillsDesc: "Comma-separated list of skills", - prompt: "System prompt", - promptDesc: "Instructions for the agent", - promptPlaceholder: "You are a code reviewer. Analyze the given code for..." - } - }, - safety: "S\xE9curit\xE9", - loadUserSettings: { - name: "Charger les param\xE8tres utilisateur Claude", - desc: "Charge ~/.claude/settings.json. Lorsqu'activ\xE9, les r\xE8gles de permission de l'utilisateur peuvent contourner le mode s\xE9curis\xE9." - }, - enableBlocklist: { - name: "Activer la liste noire de commandes", - desc: "Bloque les commandes bash potentiellement dangereuses" - }, - blockedCommands: { - name: "Commandes bloqu\xE9es ({platform})", - desc: "Mod\xE8les \xE0 bloquer sur {platform} (un par ligne). Supporte les expressions r\xE9guli\xE8res.", - unixName: "Commandes bloqu\xE9es (Unix/Git Bash)", - unixDesc: "Les mod\xE8les Unix sont \xE9galement bloqu\xE9s sur Windows car Git Bash peut les appeler." - }, - exportPaths: { - name: "Chemins d'exportation autoris\xE9s", - desc: "Chemins en dehors du coffre o\xF9 les fichiers peuvent \xEAtre export\xE9s (un par ligne). Supporte ~ pour le r\xE9pertoire home." - }, - environment: "Environnement", - customVariables: { - name: "Variables personnalis\xE9es", - desc: "Variables d'environnement pour Claude SDK (format KEY=VALUE, une par ligne). Pr\xE9fixe export support\xE9." - }, - envSnippets: { - name: "Snippets", - addBtn: "Ajouter un extrait", - noSnippets: "Aucun extrait d'environnement enregistr\xE9. Cliquez sur + pour sauvegarder votre configuration actuelle.", - nameRequired: "Veuillez entrer un nom pour l'extrait", - modal: { - titleEdit: "Modifier l'extrait", - titleSave: "Sauvegarder l'extrait", - name: "Nom", - namePlaceholder: "Un nom descriptif pour cette configuration", - description: "Description", - descPlaceholder: "Description optionnelle", - envVars: "Variables d'environnement", - envVarsPlaceholder: "Format KEY=VALUE, une par ligne (pr\xE9fixe export support\xE9)", - save: "Enregistrer", - update: "Mettre \xE0 jour", - cancel: "Annuler" - } - }, - customContextLimits: { - name: "Limites de contexte personnalis\xE9es", - desc: "D\xE9finissez les tailles de fen\xEAtre de contexte pour vos mod\xE8les personnalis\xE9s. Laissez vide pour utiliser la valeur par d\xE9faut (200k tokens).", - invalid: "Format invalide. Utilisez : 256k, 1m ou nombre exact (1000-10000000)." - }, - advanced: "Avanc\xE9", - show1MModel: { - name: "Activer Sonnet avec fen\xEAtre de contexte de 1M", - desc: "Remplacer Sonnet standard par Sonnet (1M) dans le s\xE9lecteur de mod\xE8les. M\xEAme tarif sous 200k tokens. N\xE9cessite un abonnement Max." - }, - enableChrome: { - name: "Activer l'extension Chrome", - desc: "Permettre \xE0 Claude d'interagir avec Chrome via l'extension claude-in-chrome. L'extension doit \xEAtre install\xE9e. N\xE9cessite un red\xE9marrage de session." - }, - maxTabs: { - name: "Maximum d'onglets de chat", - desc: "Nombre maximum d'onglets de chat simultan\xE9s (3-10). Chaque onglet utilise une session Claude s\xE9par\xE9e.", - warning: "Plus de 5 onglets peut affecter les performances et l'utilisation de la m\xE9moire." - }, - tabBarPosition: { - name: "Position de la barre d'onglets", - desc: "Choisissez o\xF9 afficher les badges d'onglets et les boutons d'action", - input: "Au-dessus de la saisie (par d\xE9faut)", - header: "Dans l'en-t\xEAte" - }, - enableAutoScroll: { - name: "D\xE9filement automatique pendant le streaming", - desc: "D\xE9filer automatiquement vers le bas pendant que Claude diffuse les r\xE9ponses. D\xE9sactiver pour rester en haut et lire depuis le d\xE9but." - }, - openInMainTab: { - name: "Ouvrir dans la zone d'\xE9diteur principale", - desc: "Ouvrir le panneau de chat comme un onglet principal dans la zone d'\xE9diteur centrale au lieu de la barre lat\xE9rale droite" - }, - cliPath: { - name: "Chemin CLI Claude", - desc: "Chemin personnalis\xE9 vers Claude Code CLI. Laisser vide pour la d\xE9tection automatique.", - descWindows: "Pour l'installateur natif, utilisez claude.exe. Pour les installations npm/pnpm/yarn ou autres gestionnaires de paquets, utilisez le chemin cli.js (pas claude.cmd).", - descUnix: 'Collez la sortie de "which claude" \u2014 fonctionne pour les installations natives et npm/pnpm/yarn.', - validation: { - notExist: "Le chemin n'existe pas", - isDirectory: "Le chemin est un r\xE9pertoire, pas un fichier" - } - }, - language: { - name: "Langue", - desc: "Changer la langue d'affichage de l'interface du plugin" - } -}; -var fr_default2 = { - common: common4, - settings: settings4 -}; - -// src/i18n/locales/ja.json -var ja_exports = {}; -__export(ja_exports, { - common: () => common5, - default: () => ja_default2, - settings: () => settings5 -}); -var common5 = { - save: "\u4FDD\u5B58", - cancel: "\u30AD\u30E3\u30F3\u30BB\u30EB", - delete: "\u524A\u9664", - edit: "\u7DE8\u96C6", - add: "\u8FFD\u52A0", - remove: "\u524A\u9664", - clear: "\u30AF\u30EA\u30A2", - clearAll: "\u3059\u3079\u3066\u30AF\u30EA\u30A2", - loading: "\u8AAD\u307F\u8FBC\u307F\u4E2D", - error: "\u30A8\u30E9\u30FC", - success: "\u6210\u529F", - warning: "\u8B66\u544A", - confirm: "\u78BA\u8A8D", - settings: "\u8A2D\u5B9A", - advanced: "\u8A73\u7D30", - enabled: "\u6709\u52B9", - disabled: "\u7121\u52B9", - platform: "\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0" -}; -var settings5 = { - title: "Claudian \u8A2D\u5B9A", - customization: "\u30AB\u30B9\u30BF\u30DE\u30A4\u30BA", - userName: { - name: "Claudian \u306F\u3069\u306E\u3088\u3046\u306B\u547C\u3073\u307E\u3059\u304B\uFF1F", - desc: "\u30D1\u30FC\u30BD\u30CA\u30E9\u30A4\u30BA\u3055\u308C\u305F\u6328\u62F6\u306B\u4F7F\u7528\u3059\u308B\u540D\u524D\uFF08\u7A7A\u6B04\u3067\u4E00\u822C\u306E\u6328\u62F6\uFF09" - }, - excludedTags: { - name: "\u9664\u5916\u30BF\u30B0", - desc: "\u3053\u308C\u3089\u306E\u30BF\u30B0\u3092\u542B\u3080\u30CE\u30FC\u30C8\u306F\u81EA\u52D5\u7684\u306B\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3068\u3057\u3066\u8AAD\u307F\u8FBC\u307E\u308C\u307E\u305B\u3093\uFF081\u884C\u306B1\u3064\u3001#\u306A\u3057\uFF09" - }, - mediaFolder: { - name: "\u30E1\u30C7\u30A3\u30A2\u30D5\u30A9\u30EB\u30C0", - desc: "\u6DFB\u4ED8\u30D5\u30A1\u30A4\u30EB/\u753B\u50CF\u3092\u683C\u7D0D\u3059\u308B\u30D5\u30A9\u30EB\u30C0\u3002\u30CE\u30FC\u30C8\u304C ![[image.jpg]] \u3092\u4F7F\u7528\u3059\u308B\u5834\u5408\u3001Claude \u306F\u3053\u3053\u3067\u63A2\u3057\u307E\u3059\u3002\u7A7A\u6B04\u3067\u30EA\u30DD\u30B8\u30C8\u30EA\u306E\u30EB\u30FC\u30C8\u3092\u4F7F\u7528\u3002" - }, - systemPrompt: { - name: "\u30AB\u30B9\u30BF\u30E0\u30B7\u30B9\u30C6\u30E0\u30D7\u30ED\u30F3\u30D7\u30C8", - desc: "\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30B7\u30B9\u30C6\u30E0\u30D7\u30ED\u30F3\u30D7\u30C8\u306B\u8FFD\u52A0\u3055\u308C\u308B\u8FFD\u52A0\u6307\u793A" - }, - autoTitle: { - name: "\u4F1A\u8A71\u30BF\u30A4\u30C8\u30EB\u3092\u81EA\u52D5\u751F\u6210", - desc: "\u6700\u521D\u306E\u30E6\u30FC\u30B6\u30FC\u30E1\u30C3\u30BB\u30FC\u30B8\u9001\u4FE1\u5F8C\u306B\u4F1A\u8A71\u30BF\u30A4\u30C8\u30EB\u3092\u81EA\u52D5\u7684\u306B\u751F\u6210\u3057\u307E\u3059\u3002" - }, - titleModel: { - name: "\u30BF\u30A4\u30C8\u30EB\u751F\u6210\u30E2\u30C7\u30EB", - desc: "\u4F1A\u8A71\u30BF\u30A4\u30C8\u30EB\u3092\u81EA\u52D5\u751F\u6210\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u308B\u30E2\u30C7\u30EB\u3002", - auto: "\u81EA\u52D5 (Haiku)" - }, - navMappings: { - name: "Vim\u30B9\u30BF\u30A4\u30EB\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u30DE\u30C3\u30D4\u30F3\u30B0", - desc: '1\u884C\u306B1\u3064\u306E\u30DE\u30C3\u30D4\u30F3\u30B0\u3002\u5F62\u5F0F\uFF1A"map <\u30AD\u30FC> <\u30A2\u30AF\u30B7\u30E7\u30F3>"\uFF08\u30A2\u30AF\u30B7\u30E7\u30F3\uFF1AscrollUp, scrollDown, focusInput\uFF09\u3002' - }, - hotkeys: "\u30DB\u30C3\u30C8\u30AD\u30FC", - inlineEditHotkey: { - name: "\u30A4\u30F3\u30E9\u30A4\u30F3\u7DE8\u96C6", - descWithKey: "\u73FE\u5728\u306E\u30DB\u30C3\u30C8\u30AD\u30FC: {hotkey}", - descNoKey: "\u30DB\u30C3\u30C8\u30AD\u30FC\u672A\u8A2D\u5B9A", - btnChange: "\u5909\u66F4", - btnSet: "\u8A2D\u5B9A" - }, - openChatHotkey: { - name: "\u30C1\u30E3\u30C3\u30C8\u3092\u958B\u304F", - descWithKey: "\u73FE\u5728\u306E\u30DB\u30C3\u30C8\u30AD\u30FC: {hotkey}", - descNoKey: "\u30DB\u30C3\u30C8\u30AD\u30FC\u672A\u8A2D\u5B9A", - btnChange: "\u5909\u66F4", - btnSet: "\u8A2D\u5B9A" - }, - newSessionHotkey: { - name: "\u65B0\u898F\u30BB\u30C3\u30B7\u30E7\u30F3", - descWithKey: "\u73FE\u5728\u306E\u30DB\u30C3\u30C8\u30AD\u30FC: {hotkey}", - descNoKey: "\u30DB\u30C3\u30C8\u30AD\u30FC\u672A\u8A2D\u5B9A", - btnChange: "\u5909\u66F4", - btnSet: "\u8A2D\u5B9A" - }, - newTabHotkey: { - name: "\u65B0\u898F\u30BF\u30D6", - descWithKey: "\u73FE\u5728\u306E\u30DB\u30C3\u30C8\u30AD\u30FC: {hotkey}", - descNoKey: "\u30DB\u30C3\u30C8\u30AD\u30FC\u672A\u8A2D\u5B9A", - btnChange: "\u5909\u66F4", - btnSet: "\u8A2D\u5B9A" - }, - closeTabHotkey: { - name: "\u30BF\u30D6\u3092\u9589\u3058\u308B", - descWithKey: "\u73FE\u5728\u306E\u30DB\u30C3\u30C8\u30AD\u30FC: {hotkey}", - descNoKey: "\u30DB\u30C3\u30C8\u30AD\u30FC\u672A\u8A2D\u5B9A", - btnChange: "\u5909\u66F4", - btnSet: "\u8A2D\u5B9A" - }, - slashCommands: { - name: "\u30B3\u30DE\u30F3\u30C9\u3068\u30B9\u30AD\u30EB", - desc: "/\u540D\u524D \u3067\u30C8\u30EA\u30AC\u30FC\u3055\u308C\u308B\u30AB\u30B9\u30BF\u30E0\u30B3\u30DE\u30F3\u30C9\u3068\u30B9\u30AD\u30EB\u3092\u5B9A\u7FA9\u3057\u307E\u3059\u3002" - }, - hiddenSlashCommands: { - name: "\u975E\u8868\u793A\u30B3\u30DE\u30F3\u30C9", - desc: "\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u304B\u3089\u7279\u5B9A\u306E\u30B9\u30E9\u30C3\u30B7\u30E5\u30B3\u30DE\u30F3\u30C9\u3092\u975E\u8868\u793A\u306B\u3057\u307E\u3059\u3002Claudian \u306B\u95A2\u4FC2\u306E\u306A\u3044 Claude Code \u30B3\u30DE\u30F3\u30C9\u3092\u975E\u8868\u793A\u306B\u3059\u308B\u306E\u306B\u4FBF\u5229\u3067\u3059\u3002\u5148\u982D\u306E\u30B9\u30E9\u30C3\u30B7\u30E5\u306A\u3057\u3067\u30B3\u30DE\u30F3\u30C9\u540D\u30921\u884C\u306B1\u3064\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002", - placeholder: "commit\nbuild\ntest" - }, - mcpServers: { - name: "MCP \u30B5\u30FC\u30D0\u30FC", - desc: "\u30E2\u30C7\u30EB\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u30D7\u30ED\u30C8\u30B3\u30EB\u30B5\u30FC\u30D0\u30FC\u3092\u8A2D\u5B9A\u3057\u3001\u5916\u90E8\u30C4\u30FC\u30EB\u3084\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u3067 Claude \u306E\u6A5F\u80FD\u3092\u62E1\u5F35\u3057\u307E\u3059\u3002\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u4FDD\u5B58\u30E2\u30FC\u30C9\u306E\u30B5\u30FC\u30D0\u30FC\u306F @mention \u3067\u30A2\u30AF\u30C6\u30A3\u30D6\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002" - }, - plugins: { - name: "Claude Code \u30D7\u30E9\u30B0\u30A4\u30F3", - desc: "~/.claude/plugins \u304B\u3089\u691C\u51FA\u3055\u308C\u305F Claude Code \u30D7\u30E9\u30B0\u30A4\u30F3\u3092\u6709\u52B9\u5316\u307E\u305F\u306F\u7121\u52B9\u5316\u3057\u307E\u3059\u3002\u6709\u52B9\u5316\u3055\u308C\u305F\u30D7\u30E9\u30B0\u30A4\u30F3\u306F\u4FDD\u7BA1\u5EAB\u3054\u3068\u306B\u4FDD\u5B58\u3055\u308C\u307E\u3059\u3002" - }, - subagents: { - name: "Subagents", - desc: "Configure custom subagents that Claude can delegate to.", - noAgents: "No subagents configured. Click + to create one.", - deleteConfirm: 'Delete subagent "{name}"?', - saveFailed: "Failed to save subagent: {message}", - deleteFailed: "Failed to delete subagent: {message}", - renameCleanupFailed: 'Warning: could not remove old file for "{name}"', - saved: 'Subagent "{name}" {action}', - deleted: 'Subagent "{name}" deleted', - duplicateName: 'An agent named "{name}" already exists', - descriptionRequired: "Description is required", - promptRequired: "System prompt is required", - modal: { - titleEdit: "Edit Subagent", - titleAdd: "Add Subagent", - name: "Name", - nameDesc: "Lowercase letters, numbers, and hyphens only", - namePlaceholder: "code-reviewer", - description: "Description", - descriptionDesc: "Brief description of this agent", - descriptionPlaceholder: "Reviews code for bugs and style", - advancedOptions: "Advanced options", - model: "Model", - modelDesc: "Model override for this agent", - tools: "Tools", - toolsDesc: "Comma-separated list of allowed tools (empty = all)", - disallowedTools: "Disallowed tools", - disallowedToolsDesc: "Comma-separated list of tools to disallow", - skills: "Skills", - skillsDesc: "Comma-separated list of skills", - prompt: "System prompt", - promptDesc: "Instructions for the agent", - promptPlaceholder: "You are a code reviewer. Analyze the given code for..." - } - }, - safety: "\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3", - loadUserSettings: { - name: "\u30E6\u30FC\u30B6\u30FCClaude\u8A2D\u5B9A\u3092\u8AAD\u307F\u8FBC\u3080", - desc: "~/.claude/settings.json \u3092\u8AAD\u307F\u8FBC\u307F\u307E\u3059\u3002\u6709\u52B9\u306B\u3059\u308B\u3068\u3001\u30E6\u30FC\u30B6\u30FC\u306E Claude Code \u8A31\u53EF\u30EB\u30FC\u30EB\u304C\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u30E2\u30FC\u30C9\u3092\u30D0\u30A4\u30D1\u30B9\u3059\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002" - }, - enableBlocklist: { - name: "\u30B3\u30DE\u30F3\u30C9\u30D6\u30E9\u30C3\u30AF\u30EA\u30B9\u30C8\u3092\u6709\u52B9\u5316", - desc: "\u6F5C\u5728\u7684\u306B\u5371\u967A\u306Abash\u30B3\u30DE\u30F3\u30C9\u3092\u30D6\u30ED\u30C3\u30AF" - }, - blockedCommands: { - name: "\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u305F\u30B3\u30DE\u30F3\u30C9 ({platform})", - desc: "{platform} \u3067\u30D6\u30ED\u30C3\u30AF\u3059\u308B\u30D1\u30BF\u30FC\u30F3\uFF081\u884C\u306B1\u3064\uFF09\u3002\u6B63\u898F\u8868\u73FE\u3092\u30B5\u30DD\u30FC\u30C8\u3002", - unixName: "\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u305F\u30B3\u30DE\u30F3\u30C9 (Unix/Git Bash)", - unixDesc: "Git Bash\u304C\u547C\u3073\u51FA\u305B\u308B\u305F\u3081\u3001Unix\u30D1\u30BF\u30FC\u30F3\u3082Windows\u4E0A\u3067\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u307E\u3059\u3002" - }, - exportPaths: { - name: "\u8A31\u53EF\u3055\u308C\u305F\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u30D1\u30B9", - desc: "\u30D5\u30A1\u30A4\u30EB\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3067\u304D\u308B\u30EA\u30DD\u30B8\u30C8\u30EA\u5916\u306E\u30D1\u30B9\uFF081\u884C\u306B1\u3064\uFF09\u3002~ \u3067\u30DB\u30FC\u30E0\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u30B5\u30DD\u30FC\u30C8\u3002" - }, - environment: "\u74B0\u5883", - customVariables: { - name: "\u30AB\u30B9\u30BF\u30E0\u5909\u6570", - desc: "Claude SDK\u306E\u74B0\u5883\u5909\u6570\uFF08KEY=VALUE\u5F62\u5F0F\u30011\u884C\u306B1\u3064\uFF09\u3002export\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u5BFE\u5FDC\u3002" - }, - envSnippets: { - name: "\u30B9\u30CB\u30DA\u30C3\u30C8", - addBtn: "\u30B9\u30CB\u30DA\u30C3\u30C8\u3092\u8FFD\u52A0", - noSnippets: "\u4FDD\u5B58\u3055\u308C\u305F\u74B0\u5883\u5909\u6570\u30B9\u30CB\u30DA\u30C3\u30C8\u306F\u3042\u308A\u307E\u305B\u3093\u3002+\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u73FE\u5728\u306E\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u3066\u304F\u3060\u3055\u3044\u3002", - nameRequired: "\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u540D\u524D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044", - modal: { - titleEdit: "\u30B9\u30CB\u30DA\u30C3\u30C8\u3092\u7DE8\u96C6", - titleSave: "\u30B9\u30CB\u30DA\u30C3\u30C8\u3092\u4FDD\u5B58", - name: "\u540D\u524D", - namePlaceholder: "\u3053\u306E\u8A2D\u5B9A\u306E\u308F\u304B\u308A\u3084\u3059\u3044\u540D\u524D", - description: "\u8AAC\u660E", - descPlaceholder: "\u4EFB\u610F\u306E\u8AAC\u660E", - envVars: "\u74B0\u5883\u5909\u6570", - envVarsPlaceholder: "KEY=VALUE\u5F62\u5F0F\u30011\u884C\u306B1\u3064\uFF08export\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u5BFE\u5FDC\uFF09", - save: "\u4FDD\u5B58", - update: "\u66F4\u65B0", - cancel: "\u30AD\u30E3\u30F3\u30BB\u30EB" - } - }, - customContextLimits: { - name: "\u30AB\u30B9\u30BF\u30E0\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u5236\u9650", - desc: "\u30AB\u30B9\u30BF\u30E0\u30E2\u30C7\u30EB\u306E\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u30A6\u30A3\u30F3\u30C9\u30A6\u30B5\u30A4\u30BA\u3092\u8A2D\u5B9A\u3057\u307E\u3059\u3002\u30C7\u30D5\u30A9\u30EB\u30C8\uFF08200k\u30C8\u30FC\u30AF\u30F3\uFF09\u3092\u4F7F\u7528\u3059\u308B\u5834\u5408\u306F\u7A7A\u6B04\u306E\u307E\u307E\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002", - invalid: "\u7121\u52B9\u306A\u5F62\u5F0F\u3067\u3059\u3002\u4F7F\u7528\uFF1A256k\u30011m\u3001\u307E\u305F\u306F\u6B63\u78BA\u306A\u6570\u5024\uFF081000-10000000\uFF09\u3002" - }, - advanced: "\u8A73\u7D30\u8A2D\u5B9A", - show1MModel: { - name: "1M\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u6301\u3064Sonnet\u3092\u6709\u52B9\u5316", - desc: "\u30E2\u30C7\u30EB\u30BB\u30EC\u30AF\u30BF\u30FC\u3067\u6A19\u6E96Sonnet\u3092 Sonnet (1M) \u306B\u7F6E\u304D\u63DB\u3048\u307E\u3059\u3002200k\u30C8\u30FC\u30AF\u30F3\u672A\u6E80\u3067\u306F\u540C\u3058\u4FA1\u683C\u3002Max\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u304C\u5FC5\u8981\u3067\u3059\u3002" - }, - enableChrome: { - name: "Chrome\u62E1\u5F35\u6A5F\u80FD\u3092\u6709\u52B9\u5316", - desc: "claude-in-chrome\u62E1\u5F35\u6A5F\u80FD\u3092\u901A\u3058\u3066Claude\u304CChrome\u3068\u9023\u643A\u3067\u304D\u308B\u3088\u3046\u306B\u3057\u307E\u3059\u3002\u62E1\u5F35\u6A5F\u80FD\u306E\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u304C\u5FC5\u8981\u3067\u3059\u3002\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u518D\u8D77\u52D5\u304C\u5FC5\u8981\u3067\u3059\u3002" - }, - maxTabs: { - name: "\u6700\u5927\u30C1\u30E3\u30C3\u30C8\u30BF\u30D6\u6570", - desc: "\u540C\u6642\u306B\u958B\u3051\u308B\u6700\u5927\u30C1\u30E3\u30C3\u30C8\u30BF\u30D6\u6570\uFF083-10\uFF09\u3002\u5404\u30BF\u30D6\u306F\u500B\u5225\u306E Claude \u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002", - warning: "5 \u30BF\u30D6\u3092\u8D85\u3048\u308B\u3068\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3084\u30E1\u30E2\u30EA\u4F7F\u7528\u91CF\u306B\u5F71\u97FF\u3059\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002" - }, - tabBarPosition: { - name: "\u30BF\u30D6\u30D0\u30FC\u306E\u4F4D\u7F6E", - desc: "\u30BF\u30D6\u30D0\u30C3\u30B8\u3068\u30A2\u30AF\u30B7\u30E7\u30F3\u30DC\u30BF\u30F3\u306E\u8868\u793A\u4F4D\u7F6E\u3092\u9078\u629E", - input: "\u5165\u529B\u6B04\u306E\u4E0A\uFF08\u30C7\u30D5\u30A9\u30EB\u30C8\uFF09", - header: "\u30D8\u30C3\u30C0\u30FC\u5185" - }, - enableAutoScroll: { - name: "\u30B9\u30C8\u30EA\u30FC\u30DF\u30F3\u30B0\u4E2D\u306E\u81EA\u52D5\u30B9\u30AF\u30ED\u30FC\u30EB", - desc: "Claude\u304C\u5FDC\u7B54\u3092\u30B9\u30C8\u30EA\u30FC\u30DF\u30F3\u30B0\u3057\u3066\u3044\u308B\u9593\u3001\u81EA\u52D5\u7684\u306B\u4E0B\u306B\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u307E\u3059\u3002\u7121\u52B9\u306B\u3059\u308B\u3068\u4E0A\u90E8\u306B\u7559\u307E\u308A\u3001\u6700\u521D\u304B\u3089\u8AAD\u3080\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002" - }, - openInMainTab: { - name: "\u30E1\u30A4\u30F3\u30A8\u30C7\u30A3\u30BF\u9818\u57DF\u3067\u958B\u304F", - desc: "\u30C1\u30E3\u30C3\u30C8\u30D1\u30CD\u30EB\u3092\u53F3\u30B5\u30A4\u30C9\u30D0\u30FC\u3067\u306F\u306A\u304F\u3001\u4E2D\u592E\u30A8\u30C7\u30A3\u30BF\u9818\u57DF\u306E\u30E1\u30A4\u30F3\u30BF\u30D6\u3068\u3057\u3066\u958B\u304D\u307E\u3059" - }, - cliPath: { - name: "Claude CLI \u30D1\u30B9", - desc: "Claude Code CLI \u306E\u30AB\u30B9\u30BF\u30E0\u30D1\u30B9\u3002\u7A7A\u6B04\u3067\u81EA\u52D5\u691C\u51FA\u3092\u4F7F\u7528\u3002", - descWindows: "\u30CD\u30A4\u30C6\u30A3\u30D6\u30A4\u30F3\u30B9\u30C8\u30FC\u30E9\u30FC\u306E\u5834\u5408\u306F claude.exe \u3092\u4F7F\u7528\u3002npm/pnpm/yarn \u3084\u305D\u306E\u4ED6\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u30DE\u30CD\u30FC\u30B8\u30E3\u30FC\u3067\u306E\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u306E\u5834\u5408\u306F cli.js \u30D1\u30B9\u3092\u4F7F\u7528\uFF08claude.cmd \u3067\u306F\u306A\u3044\uFF09\u3002", - descUnix: '"which claude" \u306E\u51FA\u529B\u3092\u8CBC\u308A\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044 - \u30CD\u30A4\u30C6\u30A3\u30D6\u3068 npm/pnpm/yarn \u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u306E\u4E21\u65B9\u3067\u52D5\u4F5C\u3057\u307E\u3059\u3002', - validation: { - notExist: "\u30D1\u30B9\u304C\u5B58\u5728\u3057\u307E\u305B\u3093", - isDirectory: "\u30D1\u30B9\u306F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3067\u30D5\u30A1\u30A4\u30EB\u3067\u306F\u3042\u308A\u307E\u305B\u3093" - } - }, - language: { - name: "\u8A00\u8A9E", - desc: "\u30D7\u30E9\u30B0\u30A4\u30F3\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30FC\u30B9\u306E\u8868\u793A\u8A00\u8A9E\u3092\u5909\u66F4" - } -}; -var ja_default2 = { - common: common5, - settings: settings5 -}; - -// src/i18n/locales/ko.json -var ko_exports = {}; -__export(ko_exports, { - common: () => common6, - default: () => ko_default2, - settings: () => settings6 -}); -var common6 = { - save: "\uC800\uC7A5", - cancel: "\uCDE8\uC18C", - delete: "\uC0AD\uC81C", - edit: "\uD3B8\uC9D1", - add: "\uCD94\uAC00", - remove: "\uC81C\uAC70", - clear: "\uC9C0\uC6B0\uAE30", - clearAll: "\uBAA8\uB450 \uC9C0\uC6B0\uAE30", - loading: "\uB85C\uB529 \uC911", - error: "\uC624\uB958", - success: "\uC131\uACF5", - warning: "\uACBD\uACE0", - confirm: "\uD655\uC778", - settings: "\uC124\uC815", - advanced: "\uACE0\uAE09", - enabled: "\uD65C\uC131\uD654", - disabled: "\uBE44\uD65C\uC131\uD654", - platform: "\uD50C\uB7AB\uD3FC" -}; -var settings6 = { - title: "Claudian \uC124\uC815", - customization: "\uC0AC\uC6A9\uC790 \uC815\uC758", - userName: { - name: "Claudian\uC774 \uB2F9\uC2E0\uC744 \uC5B4\uB5BB\uAC8C \uBD88\uB7EC\uC57C \uD569\uB2C8\uAE4C?", - desc: "\uAC1C\uC778\uD654\uB41C \uC778\uC0AC\uC5D0 \uC0AC\uC6A9\uD560 \uC774\uB984 (\uBE44\uC6CC\uB450\uBA74 \uC77C\uBC18 \uC778\uC0AC)" - }, - excludedTags: { - name: "\uC81C\uC678 \uD0DC\uADF8", - desc: "\uC774 \uD0DC\uADF8\uAC00 \uD3EC\uD568\uB41C \uB178\uD2B8\uB294 \uC790\uB3D9\uC73C\uB85C \uCEE8\uD14D\uC2A4\uD2B8\uB85C \uB85C\uB4DC\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 (\uD55C \uC904\uC5D0 \uD558\uB098, # \uC81C\uC678)" - }, - mediaFolder: { - name: "\uBBF8\uB514\uC5B4 \uD3F4\uB354", - desc: "\uCCA8\uBD80 \uD30C\uC77C/\uC774\uBBF8\uC9C0\uB97C \uC800\uC7A5\uD560 \uD3F4\uB354. \uB178\uD2B8\uAC00 ![[image.jpg]]\uB97C \uC0AC\uC6A9\uD560 \uB54C Claude\uAC00 \uC5EC\uAE30\uC11C \uCC3E\uC2B5\uB2C8\uB2E4. \uBE44\uC6CC\uB450\uBA74 \uC800\uC7A5\uC18C \uB8E8\uD2B8 \uC0AC\uC6A9." - }, - systemPrompt: { - name: "\uCEE4\uC2A4\uD140 \uC2DC\uC2A4\uD15C \uD504\uB86C\uD504\uD2B8", - desc: "\uAE30\uBCF8 \uC2DC\uC2A4\uD15C \uD504\uB86C\uD504\uD2B8\uC5D0 \uCD94\uAC00\uB418\uB294 \uCD94\uAC00 \uC9C0\uCE68" - }, - autoTitle: { - name: "\uB300\uD654 \uC81C\uBAA9 \uC790\uB3D9 \uC0DD\uC131", - desc: "\uCCAB \uBC88\uC9F8 \uC0AC\uC6A9\uC790 \uBA54\uC2DC\uC9C0 \uC804\uC1A1 \uD6C4 \uC790\uB3D9\uC73C\uB85C \uB300\uD654 \uC81C\uBAA9\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4." - }, - titleModel: { - name: "\uC81C\uBAA9 \uC0DD\uC131 \uBAA8\uB378", - desc: "\uB300\uD654 \uC81C\uBAA9\uC744 \uC790\uB3D9 \uC0DD\uC131\uD558\uB294 \uB370 \uC0AC\uC6A9\uB418\uB294 \uBAA8\uB378.", - auto: "\uC790\uB3D9 (Haiku)" - }, - navMappings: { - name: "Vim \uC2A4\uD0C0\uC77C \uB124\uBE44\uAC8C\uC774\uC158 \uB9E4\uD551", - desc: '\uD55C \uC904\uC5D0 \uD558\uB098\uC758 \uB9E4\uD551. \uD615\uC2DD: "map <\uD0A4> <\uB3D9\uC791>" (\uB3D9\uC791: scrollUp, scrollDown, focusInput).' - }, - hotkeys: "\uB2E8\uCD95\uD0A4", - inlineEditHotkey: { - name: "\uC778\uB77C\uC778 \uD3B8\uC9D1", - descWithKey: "\uD604\uC7AC \uB2E8\uCD95\uD0A4: {hotkey}", - descNoKey: "\uB2E8\uCD95\uD0A4 \uBBF8\uC124\uC815", - btnChange: "\uBCC0\uACBD", - btnSet: "\uB2E8\uCD95\uD0A4 \uC124\uC815" - }, - openChatHotkey: { - name: "\uCC44\uD305 \uC5F4\uAE30", - descWithKey: "\uD604\uC7AC \uB2E8\uCD95\uD0A4: {hotkey}", - descNoKey: "\uB2E8\uCD95\uD0A4 \uBBF8\uC124\uC815", - btnChange: "\uBCC0\uACBD", - btnSet: "\uB2E8\uCD95\uD0A4 \uC124\uC815" - }, - newSessionHotkey: { - name: "\uC0C8 \uC138\uC158", - descWithKey: "\uD604\uC7AC \uB2E8\uCD95\uD0A4: {hotkey}", - descNoKey: "\uB2E8\uCD95\uD0A4 \uBBF8\uC124\uC815", - btnChange: "\uBCC0\uACBD", - btnSet: "\uB2E8\uCD95\uD0A4 \uC124\uC815" - }, - newTabHotkey: { - name: "\uC0C8 \uD0ED", - descWithKey: "\uD604\uC7AC \uB2E8\uCD95\uD0A4: {hotkey}", - descNoKey: "\uB2E8\uCD95\uD0A4 \uBBF8\uC124\uC815", - btnChange: "\uBCC0\uACBD", - btnSet: "\uB2E8\uCD95\uD0A4 \uC124\uC815" - }, - closeTabHotkey: { - name: "\uD0ED \uB2EB\uAE30", - descWithKey: "\uD604\uC7AC \uB2E8\uCD95\uD0A4: {hotkey}", - descNoKey: "\uB2E8\uCD95\uD0A4 \uBBF8\uC124\uC815", - btnChange: "\uBCC0\uACBD", - btnSet: "\uB2E8\uCD95\uD0A4 \uC124\uC815" - }, - slashCommands: { - name: "\uBA85\uB839\uC5B4\uC640 \uC2A4\uD0AC", - desc: "/\uC774\uB984\uC73C\uB85C \uD2B8\uB9AC\uAC70\uB418\uB294 \uCEE4\uC2A4\uD140 \uBA85\uB839\uC5B4\uC640 \uC2A4\uD0AC\uC744 \uC815\uC758\uD569\uB2C8\uB2E4." - }, - hiddenSlashCommands: { - name: "\uC228\uACA8\uC9C4 \uBA85\uB839\uC5B4", - desc: "\uB4DC\uB86D\uB2E4\uC6B4\uC5D0\uC11C \uD2B9\uC815 \uC2AC\uB798\uC2DC \uBA85\uB839\uC5B4\uB97C \uC228\uAE41\uB2C8\uB2E4. Claudian\uACFC \uAD00\uB828 \uC5C6\uB294 Claude Code \uBA85\uB839\uC5B4\uB97C \uC228\uAE30\uB294 \uB370 \uC720\uC6A9\uD569\uB2C8\uB2E4. \uC55E\uC758 \uC2AC\uB798\uC2DC \uC5C6\uC774 \uD55C \uC904\uC5D0 \uD558\uB098\uC529 \uBA85\uB839\uC5B4 \uC774\uB984\uC744 \uC785\uB825\uD558\uC138\uC694.", - placeholder: "commit\nbuild\ntest" - }, - mcpServers: { - name: "MCP \uC11C\uBC84", - desc: "\uBAA8\uB378 \uCEE8\uD14D\uC2A4\uD2B8 \uD504\uB85C\uD1A0\uCF5C \uC11C\uBC84\uB97C \uC124\uC815\uD558\uC5EC \uC678\uBD80 \uB3C4\uAD6C\uC640 \uB370\uC774\uD130 \uC18C\uC2A4\uB85C Claude\uC758 \uAE30\uB2A5\uC744 \uD655\uC7A5\uD569\uB2C8\uB2E4. \uCEE8\uD14D\uC2A4\uD2B8 \uC800\uC7A5 \uBAA8\uB4DC \uC11C\uBC84\uB294 @mention\uC73C\uB85C \uD65C\uC131\uD654\uD574\uC57C \uD569\uB2C8\uB2E4." - }, - plugins: { - name: "Claude Code \uD50C\uB7EC\uADF8\uC778", - desc: "~/.claude/plugins\uC5D0\uC11C \uBC1C\uACAC\uB41C Claude Code \uD50C\uB7EC\uADF8\uC778\uC744 \uD65C\uC131\uD654 \uB610\uB294 \uBE44\uD65C\uC131\uD654\uD569\uB2C8\uB2E4. \uD65C\uC131\uD654\uB41C \uD50C\uB7EC\uADF8\uC778\uC740 \uBCFC\uD2B8\uBCC4\uB85C \uC800\uC7A5\uB429\uB2C8\uB2E4." - }, - subagents: { - name: "Subagents", - desc: "Configure custom subagents that Claude can delegate to.", - noAgents: "No subagents configured. Click + to create one.", - deleteConfirm: 'Delete subagent "{name}"?', - saveFailed: "Failed to save subagent: {message}", - deleteFailed: "Failed to delete subagent: {message}", - renameCleanupFailed: 'Warning: could not remove old file for "{name}"', - saved: 'Subagent "{name}" {action}', - deleted: 'Subagent "{name}" deleted', - duplicateName: 'An agent named "{name}" already exists', - descriptionRequired: "Description is required", - promptRequired: "System prompt is required", - modal: { - titleEdit: "Edit Subagent", - titleAdd: "Add Subagent", - name: "Name", - nameDesc: "Lowercase letters, numbers, and hyphens only", - namePlaceholder: "code-reviewer", - description: "Description", - descriptionDesc: "Brief description of this agent", - descriptionPlaceholder: "Reviews code for bugs and style", - advancedOptions: "Advanced options", - model: "Model", - modelDesc: "Model override for this agent", - tools: "Tools", - toolsDesc: "Comma-separated list of allowed tools (empty = all)", - disallowedTools: "Disallowed tools", - disallowedToolsDesc: "Comma-separated list of tools to disallow", - skills: "Skills", - skillsDesc: "Comma-separated list of skills", - prompt: "System prompt", - promptDesc: "Instructions for the agent", - promptPlaceholder: "You are a code reviewer. Analyze the given code for..." - } - }, - safety: "\uBCF4\uC548", - loadUserSettings: { - name: "\uC0AC\uC6A9\uC790 Claude \uC124\uC815 \uB85C\uB4DC", - desc: "~/.claude/settings.json\uC744 \uB85C\uB4DC\uD569\uB2C8\uB2E4. \uD65C\uC131\uD654\uD558\uBA74 \uC0AC\uC6A9\uC790\uC758 Claude Code \uD5C8\uC6A9 \uADDC\uCE59\uC774 \uBCF4\uC548 \uBAA8\uB4DC\uB97C \uC6B0\uD68C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4." - }, - enableBlocklist: { - name: "\uBA85\uB839\uC5B4 \uBE14\uB799\uB9AC\uC2A4\uD2B8 \uD65C\uC131\uD654", - desc: "\uC7A0\uC7AC\uC801\uC73C\uB85C \uC704\uD5D8\uD55C bash \uBA85\uB839\uC5B4 \uCC28\uB2E8" - }, - blockedCommands: { - name: "\uCC28\uB2E8\uB41C \uBA85\uB839\uC5B4 ({platform})", - desc: "{platform}\uC5D0\uC11C \uCC28\uB2E8\uD560 \uD328\uD134 (\uD55C \uC904\uC5D0 \uD558\uB098). \uC815\uADDC\uC2DD \uC9C0\uC6D0.", - unixName: "\uCC28\uB2E8\uB41C \uBA85\uB839\uC5B4 (Unix/Git Bash)", - unixDesc: "Git Bash\uAC00 \uD638\uCD9C\uD560 \uC218 \uC788\uC73C\uBBC0\uB85C Unix \uD328\uD134\uB3C4 Windows\uC5D0\uC11C \uCC28\uB2E8\uB429\uB2C8\uB2E4." - }, - exportPaths: { - name: "\uD5C8\uC6A9\uB41C \uB0B4\uBCF4\uB0B4\uAE30 \uACBD\uB85C", - desc: "\uD30C\uC77C\uC744 \uB0B4\uBCF4\uB0BC \uC218 \uC788\uB294 \uC800\uC7A5\uC18C \uC678\uBD80 \uACBD\uB85C (\uD55C \uC904\uC5D0 \uD558\uB098). ~\uB85C \uD648 \uB514\uB809\uD1A0\uB9AC \uC9C0\uC6D0." - }, - environment: "\uD658\uACBD", - customVariables: { - name: "\uCEE4\uC2A4\uD140 \uBCC0\uC218", - desc: "Claude SDK \uD658\uACBD \uBCC0\uC218 (KEY=VALUE \uD615\uC2DD, \uD55C \uC904\uC5D0 \uD558\uB098). export \uC811\uB450\uC0AC \uC9C0\uC6D0." - }, - envSnippets: { - name: "\uC2A4\uB2C8\uD3AB", - addBtn: "\uC2A4\uB2C8\uD3AB \uCD94\uAC00", - noSnippets: "\uC800\uC7A5\uB41C \uD658\uACBD \uBCC0\uC218 \uC2A4\uB2C8\uD3AB\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. +\uB97C \uD074\uB9AD\uD558\uC5EC \uD604\uC7AC \uAD6C\uC131\uC744 \uC800\uC7A5\uD558\uC138\uC694.", - nameRequired: "\uC2A4\uB2C8\uD3AB \uC774\uB984\uC744 \uC785\uB825\uD558\uC138\uC694", - modal: { - titleEdit: "\uC2A4\uB2C8\uD3AB \uD3B8\uC9D1", - titleSave: "\uC2A4\uB2C8\uD3AB \uC800\uC7A5", - name: "\uC774\uB984", - namePlaceholder: "\uC774 \uAD6C\uC131\uC5D0 \uB300\uD55C \uC124\uBA85\uC801\uC778 \uC774\uB984", - description: "\uC124\uBA85", - descPlaceholder: "\uC120\uD0DD\uC801 \uC124\uBA85", - envVars: "\uD658\uACBD \uBCC0\uC218", - envVarsPlaceholder: "KEY=VALUE \uD615\uC2DD, \uD55C \uC904\uC5D0 \uD558\uB098 (export \uC811\uB450\uC0AC \uC9C0\uC6D0)", - save: "\uC800\uC7A5", - update: "\uC5C5\uB370\uC774\uD2B8", - cancel: "\uCDE8\uC18C" - } - }, - customContextLimits: { - name: "\uC0AC\uC6A9\uC790 \uC815\uC758 \uCEE8\uD14D\uC2A4\uD2B8 \uC81C\uD55C", - desc: "\uC0AC\uC6A9\uC790 \uC815\uC758 \uBAA8\uB378\uC758 \uCEE8\uD14D\uC2A4\uD2B8 \uCC3D \uD06C\uAE30\uB97C \uC124\uC815\uD569\uB2C8\uB2E4. \uAE30\uBCF8\uAC12(200k \uD1A0\uD070)\uC744 \uC0AC\uC6A9\uD558\uB824\uBA74 \uBE44\uC6CC\uB450\uC138\uC694.", - invalid: "\uC798\uBABB\uB41C \uD615\uC2DD\uC785\uB2C8\uB2E4. \uC0AC\uC6A9: 256k, 1m \uB610\uB294 \uC815\uD655\uD55C \uC22B\uC790(1000-10000000)." - }, - advanced: "\uACE0\uAE09", - show1MModel: { - name: "1M \uCEE8\uD14D\uC2A4\uD2B8 \uCC3D\uC744 \uAC00\uC9C4 Sonnet \uD65C\uC131\uD654", - desc: "\uBAA8\uB378 \uC120\uD0DD\uAE30\uC5D0\uC11C \uD45C\uC900 Sonnet\uC744 Sonnet (1M)\uC73C\uB85C \uAD50\uCCB4\uD569\uB2C8\uB2E4. 200k \uD1A0\uD070 \uBBF8\uB9CC\uC5D0\uC11C\uB294 \uB3D9\uC77C\uD55C \uAC00\uACA9. Max \uAD6C\uB3C5\uC774 \uD544\uC694\uD569\uB2C8\uB2E4." - }, - enableChrome: { - name: "Chrome \uD655\uC7A5 \uD504\uB85C\uADF8\uB7A8 \uD65C\uC131\uD654", - desc: "claude-in-chrome \uD655\uC7A5 \uD504\uB85C\uADF8\uB7A8\uC744 \uD1B5\uD574 Claude\uAC00 Chrome\uACFC \uC0C1\uD638\uC791\uC6A9\uD560 \uC218 \uC788\uB3C4\uB85D \uD569\uB2C8\uB2E4. \uD655\uC7A5 \uD504\uB85C\uADF8\uB7A8\uC774 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC57C \uD569\uB2C8\uB2E4. \uC138\uC158 \uC7AC\uC2DC\uC791\uC774 \uD544\uC694\uD569\uB2C8\uB2E4." - }, - maxTabs: { - name: "\uCD5C\uB300 \uCC44\uD305 \uD0ED \uC218", - desc: "\uB3D9\uC2DC\uC5D0 \uC5F4 \uC218 \uC788\uB294 \uCD5C\uB300 \uCC44\uD305 \uD0ED \uC218(3-10). \uAC01 \uD0ED\uC740 \uBCC4\uB3C4\uC758 Claude \uC138\uC158\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.", - warning: "5\uAC1C \uD0ED\uC744 \uCD08\uACFC\uD558\uBA74 \uC131\uB2A5 \uBC0F \uBA54\uBAA8\uB9AC \uC0AC\uC6A9\uB7C9\uC5D0 \uC601\uD5A5\uC744 \uC904 \uC218 \uC788\uC2B5\uB2C8\uB2E4." - }, - tabBarPosition: { - name: "\uD0ED \uBC14 \uC704\uCE58", - desc: "\uD0ED \uBC30\uC9C0\uC640 \uC791\uC5C5 \uBC84\uD2BC\uC758 \uD45C\uC2DC \uC704\uCE58 \uC120\uD0DD", - input: "\uC785\uB825\uCC3D \uC704(\uAE30\uBCF8\uAC12)", - header: "\uD5E4\uB354\uC5D0" - }, - enableAutoScroll: { - name: "\uC2A4\uD2B8\uB9AC\uBC0D \uC911 \uC790\uB3D9 \uC2A4\uD06C\uB864", - desc: "Claude\uAC00 \uC751\uB2F5\uC744 \uC2A4\uD2B8\uB9AC\uBC0D\uD558\uB294 \uB3D9\uC548 \uC790\uB3D9\uC73C\uB85C \uC544\uB798\uB85C \uC2A4\uD06C\uB864\uD569\uB2C8\uB2E4. \uBE44\uD65C\uC131\uD654\uD558\uBA74 \uC0C1\uB2E8\uC5D0 \uBA38\uBB3C\uB7EC \uCC98\uC74C\uBD80\uD130 \uC77D\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4." - }, - openInMainTab: { - name: "\uBA54\uC778 \uD3B8\uC9D1\uAE30 \uC601\uC5ED\uC5D0\uC11C \uC5F4\uAE30", - desc: "\uCC44\uD305 \uD328\uB110\uC744 \uC624\uB978\uCABD \uC0AC\uC774\uB4DC\uBC14\uAC00 \uC544\uB2CC \uC911\uC559 \uD3B8\uC9D1\uAE30 \uC601\uC5ED\uC758 \uBA54\uC778 \uD0ED\uC73C\uB85C \uC5FD\uB2C8\uB2E4" - }, - cliPath: { - name: "Claude CLI \uACBD\uB85C", - desc: "Claude Code CLI\uC758 \uC0AC\uC6A9\uC790 \uC815\uC758 \uACBD\uB85C. \uBE44\uC6CC\uB450\uBA74 \uC790\uB3D9 \uAC10\uC9C0 \uC0AC\uC6A9.", - descWindows: "\uB124\uC774\uD2F0\uBE0C \uC124\uCE58 \uD504\uB85C\uADF8\uB7A8\uC758 \uACBD\uC6B0 claude.exe\uB97C \uC0AC\uC6A9\uD558\uC138\uC694. npm/pnpm/yarn \uB610\uB294 \uAE30\uD0C0 \uD328\uD0A4\uC9C0 \uAD00\uB9AC\uC790 \uC124\uCE58\uC758 \uACBD\uC6B0 cli.js \uACBD\uB85C\uB97C \uC0AC\uC6A9\uD558\uC138\uC694 (claude.cmd\uAC00 \uC544\uB2D8).", - descUnix: '"which claude"\uC758 \uCD9C\uB825\uC744 \uBD99\uC5EC\uB123\uC73C\uC138\uC694 - \uB124\uC774\uD2F0\uBE0C \uBC0F npm/pnpm/yarn \uC124\uCE58 \uBAA8\uB450\uC5D0\uC11C \uC791\uB3D9\uD569\uB2C8\uB2E4.', - validation: { - notExist: "\uACBD\uB85C\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4", - isDirectory: "\uACBD\uB85C\uAC00 \uB514\uB809\uD1A0\uB9AC\uC785\uB2C8\uB2E4 \uD30C\uC77C\uC774 \uC544\uB2D9\uB2C8\uB2E4" - } - }, - language: { - name: "\uC5B8\uC5B4", - desc: "\uD50C\uB7EC\uADF8\uC778 \uC778\uD130\uD398\uC774\uC2A4\uC758 \uD45C\uC2DC \uC5B8\uC5B4 \uBCC0\uACBD" - } -}; -var ko_default2 = { - common: common6, - settings: settings6 -}; - -// src/i18n/locales/pt.json -var pt_exports = {}; -__export(pt_exports, { - common: () => common7, - default: () => pt_default2, - settings: () => settings7 -}); -var common7 = { - save: "Salvar", - cancel: "Cancelar", - delete: "Excluir", - edit: "Editar", - add: "Adicionar", - remove: "Remover", - clear: "Limpar", - clearAll: "Limpar tudo", - loading: "Carregando", - error: "Erro", - success: "Sucesso", - warning: "Aviso", - confirm: "Confirmar", - settings: "Configura\xE7\xF5es", - advanced: "Avan\xE7ado", - enabled: "Ativado", - disabled: "Desativado", - platform: "Plataforma" -}; -var settings7 = { - title: "Configura\xE7\xF5es do Claudian", - customization: "Personaliza\xE7\xE3o", - userName: { - name: "Como o Claudian deve cham\xE1-lo?", - desc: "Seu nome para sauda\xE7\xF5es personalizadas (deixe vazio para sauda\xE7\xF5es gen\xE9ricas)" - }, - excludedTags: { - name: "Tags exclu\xEDdas", - desc: "Notas com estas tags n\xE3o ser\xE3o carregadas automaticamente como contexto (uma por linha, sem #)" - }, - mediaFolder: { - name: "Pasta de m\xEDdia", - desc: "Pasta contendo anexos/imagens. Quando notas usam ![[image.jpg]], Claude procurar\xE1 aqui. Deixe vazio para a raiz do reposit\xF3rio." - }, - systemPrompt: { - name: "Prompt de sistema personalizado", - desc: "Instru\xE7\xF5es adicionais anexadas ao prompt de sistema padr\xE3o" - }, - autoTitle: { - name: "Gerar automaticamente t\xEDtulos de conversa", - desc: "Gera automaticamente t\xEDtulos de conversa ap\xF3s a primeira mensagem do usu\xE1rio." - }, - titleModel: { - name: "Modelo de gera\xE7\xE3o de t\xEDtulo", - desc: "Modelo usado para gerar automaticamente t\xEDtulos de conversa.", - auto: "Auto (Haiku)" - }, - navMappings: { - name: "Mapeamentos de navega\xE7\xE3o estilo Vim", - desc: 'Um mapeamento por linha. Formato: "map " (a\xE7\xF5es: scrollUp, scrollDown, focusInput).' - }, - hotkeys: "Atalhos", - inlineEditHotkey: { - name: "Edi\xE7\xE3o em linha", - descWithKey: "Atalho atual: {hotkey}", - descNoKey: "Nenhum atalho definido", - btnChange: "Alterar", - btnSet: "Definir" - }, - openChatHotkey: { - name: "Abrir chat", - descWithKey: "Atalho atual: {hotkey}", - descNoKey: "Nenhum atalho definido", - btnChange: "Alterar", - btnSet: "Definir" - }, - newSessionHotkey: { - name: "Nova sess\xE3o", - descWithKey: "Atalho atual: {hotkey}", - descNoKey: "Nenhum atalho definido", - btnChange: "Alterar", - btnSet: "Definir" - }, - newTabHotkey: { - name: "Nova aba", - descWithKey: "Atalho atual: {hotkey}", - descNoKey: "Nenhum atalho definido", - btnChange: "Alterar", - btnSet: "Definir" - }, - closeTabHotkey: { - name: "Fechar aba", - descWithKey: "Atalho atual: {hotkey}", - descNoKey: "Nenhum atalho definido", - btnChange: "Alterar", - btnSet: "Definir" - }, - slashCommands: { - name: "Comandos e habilidades", - desc: "Defina comandos e habilidades personalizados acionados por /nome." - }, - hiddenSlashCommands: { - name: "Comandos ocultos", - desc: "Ocultar comandos slash espec\xEDficos do menu suspenso. \xDAtil para ocultar comandos do Claude Code que n\xE3o s\xE3o relevantes para o Claudian. Digite os nomes dos comandos sem a barra inicial, um por linha.", - placeholder: "commit\nbuild\ntest" - }, - mcpServers: { - name: "Servidores MCP", - desc: "Configure servidores Model Context Protocol para estender as capacidades do Claude com ferramentas e fontes de dados externas. Servidores com modo de salvamento de contexto exigem @mention para ativar." - }, - plugins: { - name: "Plugins do Claude Code", - desc: "Ative ou desative plugins do Claude Code descobertos em ~/.claude/plugins. Plugins ativados s\xE3o armazenados por cofre." - }, - subagents: { - name: "Subagents", - desc: "Configure custom subagents that Claude can delegate to.", - noAgents: "No subagents configured. Click + to create one.", - deleteConfirm: 'Delete subagent "{name}"?', - saveFailed: "Failed to save subagent: {message}", - deleteFailed: "Failed to delete subagent: {message}", - renameCleanupFailed: 'Warning: could not remove old file for "{name}"', - saved: 'Subagent "{name}" {action}', - deleted: 'Subagent "{name}" deleted', - duplicateName: 'An agent named "{name}" already exists', - descriptionRequired: "Description is required", - promptRequired: "System prompt is required", - modal: { - titleEdit: "Edit Subagent", - titleAdd: "Add Subagent", - name: "Name", - nameDesc: "Lowercase letters, numbers, and hyphens only", - namePlaceholder: "code-reviewer", - description: "Description", - descriptionDesc: "Brief description of this agent", - descriptionPlaceholder: "Reviews code for bugs and style", - advancedOptions: "Advanced options", - model: "Model", - modelDesc: "Model override for this agent", - tools: "Tools", - toolsDesc: "Comma-separated list of allowed tools (empty = all)", - disallowedTools: "Disallowed tools", - disallowedToolsDesc: "Comma-separated list of tools to disallow", - skills: "Skills", - skillsDesc: "Comma-separated list of skills", - prompt: "System prompt", - promptDesc: "Instructions for the agent", - promptPlaceholder: "You are a code reviewer. Analyze the given code for..." - } - }, - safety: "Seguran\xE7a", - loadUserSettings: { - name: "Carregar configura\xE7\xF5es do usu\xE1rio Claude", - desc: "Carrega ~/.claude/settings.json. Quando habilitado, as regras de permiss\xE3o do usu\xE1rio podem ignorar o modo seguro." - }, - enableBlocklist: { - name: "Habilitar lista negra de comandos", - desc: "Bloqueia comandos bash potencialmente perigosos" - }, - blockedCommands: { - name: "Comandos bloqueados ({platform})", - desc: "Padr\xF5es para bloquear em {platform} (um por linha). Suporta express\xF5es regulares.", - unixName: "Comandos bloqueados (Unix/Git Bash)", - unixDesc: "Padr\xF5es Unix tamb\xE9m bloqueados no Windows porque Git Bash pode invoc\xE1-los." - }, - exportPaths: { - name: "Caminhos de exporta\xE7\xE3o permitidos", - desc: "Caminhos fora do reposit\xF3rio onde arquivos podem ser exportados (um por linha). Suporta ~ para diret\xF3rio home." - }, - environment: "Ambiente", - customVariables: { - name: "Vari\xE1veis personalizadas", - desc: "Vari\xE1veis de ambiente para Claude SDK (formato KEY=VALUE, uma por linha). Prefixo export suportado." - }, - envSnippets: { - name: "Snippets", - addBtn: "Adicionar snippet", - noSnippets: "Nenhum snippet de ambiente salvo. Clique em + para salvar sua configura\xE7\xE3o atual.", - nameRequired: "Por favor, insira um nome para o snippet", - modal: { - titleEdit: "Editar snippet", - titleSave: "Salvar snippet", - name: "Nome", - namePlaceholder: "Um nome descritivo para esta configura\xE7\xE3o", - description: "Descri\xE7\xE3o", - descPlaceholder: "Descri\xE7\xE3o opcional", - envVars: "Vari\xE1veis de ambiente", - envVarsPlaceholder: "Formato KEY=VALUE, uma por linha (prefixo export suportado)", - save: "Salvar", - update: "Atualizar", - cancel: "Cancelar" - } - }, - customContextLimits: { - name: "Limites de contexto personalizados", - desc: "Defina tamanhos de janela de contexto para seus modelos personalizados. Deixe vazio para usar o padr\xE3o (200k tokens).", - invalid: "Formato inv\xE1lido. Use: 256k, 1m ou n\xFAmero exato (1000-10000000)." - }, - advanced: "Avan\xE7ado", - show1MModel: { - name: "Habilitar Sonnet com janela de contexto de 1M", - desc: "Substituir Sonnet padr\xE3o por Sonnet (1M) no seletor de modelos. Mesmo pre\xE7o abaixo de 200k tokens. Requer assinatura Max." - }, - enableChrome: { - name: "Habilitar extens\xE3o do Chrome", - desc: "Permitir que o Claude interaja com o Chrome atrav\xE9s da extens\xE3o claude-in-chrome. Requer que a extens\xE3o esteja instalada. Requer rein\xEDcio de sess\xE3o." - }, - maxTabs: { - name: "M\xE1ximo de abas de chat", - desc: "N\xFAmero m\xE1ximo de abas de chat simult\xE2neas (3-10). Cada aba usa uma sess\xE3o Claude separada.", - warning: "Mais de 5 abas pode afetar o desempenho e o uso de mem\xF3ria." - }, - tabBarPosition: { - name: "Posi\xE7\xE3o da barra de abas", - desc: "Escolha onde exibir os emblemas de abas e bot\xF5es de a\xE7\xE3o", - input: "Acima da entrada (padr\xE3o)", - header: "No cabe\xE7alho" - }, - enableAutoScroll: { - name: "Rolagem autom\xE1tica durante streaming", - desc: "Rolar automaticamente para baixo enquanto o Claude transmite respostas. Desativar para ficar no topo e ler desde o in\xEDcio." - }, - openInMainTab: { - name: "Abrir na \xE1rea do editor principal", - desc: "Abrir o painel de chat como uma aba principal na \xE1rea do editor central em vez da barra lateral direita" - }, - cliPath: { - name: "Caminho CLI Claude", - desc: "Caminho personalizado para Claude Code CLI. Deixe vazio para detec\xE7\xE3o autom\xE1tica.", - descWindows: "Para o instalador nativo, use claude.exe. Para instala\xE7\xF5es com npm/pnpm/yarn ou outros gerenciadores de pacotes, use o caminho cli.js (n\xE3o claude.cmd).", - descUnix: 'Cole a sa\xEDda de "which claude" \u2014 funciona tanto para instala\xE7\xF5es nativas quanto npm/pnpm/yarn.', - validation: { - notExist: "Caminho n\xE3o existe", - isDirectory: "Caminho \xE9 um diret\xF3rio, n\xE3o um arquivo" - } - }, - language: { - name: "Idioma", - desc: "Alterar o idioma de exibi\xE7\xE3o da interface do plugin" - } -}; -var pt_default2 = { - common: common7, - settings: settings7 -}; - -// src/i18n/locales/ru.json -var ru_exports = {}; -__export(ru_exports, { - common: () => common8, - default: () => ru_default2, - settings: () => settings8 -}); -var common8 = { - save: "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C", - cancel: "\u041E\u0442\u043C\u0435\u043D\u0430", - delete: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C", - edit: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C", - add: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C", - remove: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C", - clear: "\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C", - clearAll: "\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u0432\u0441\u0451", - loading: "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430", - error: "\u041E\u0448\u0438\u0431\u043A\u0430", - success: "\u0423\u0441\u043F\u0435\u0445", - warning: "\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435", - confirm: "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C", - settings: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438", - advanced: "\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E", - enabled: "\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u043E", - disabled: "\u041E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u043E", - platform: "\u041F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u0430" -}; -var settings8 = { - title: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 Claudian", - customization: "\u041F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F", - userName: { - name: "\u041A\u0430\u043A Claudian \u0434\u043E\u043B\u0436\u0435\u043D \u043E\u0431\u0440\u0430\u0449\u0430\u0442\u044C\u0441\u044F \u043A \u0432\u0430\u043C?", - desc: "\u0412\u0430\u0448\u0435 \u0438\u043C\u044F \u0434\u043B\u044F \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043F\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439 (\u043E\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u043F\u0443\u0441\u0442\u044B\u043C \u0434\u043B\u044F \u043E\u0431\u0449\u0438\u0445 \u043F\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439)" - }, - excludedTags: { - name: "\u0418\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u0435 \u0442\u0435\u0433\u0438", - desc: "\u0417\u0430\u043C\u0435\u0442\u043A\u0438 \u0441 \u044D\u0442\u0438\u043C\u0438 \u0442\u0435\u0433\u0430\u043C\u0438 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044C\u0441\u044F \u043A\u0430\u043A \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 (\u043F\u043E \u043E\u0434\u043D\u043E\u043C\u0443 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435, \u0431\u0435\u0437 #)" - }, - mediaFolder: { - name: "\u041F\u0430\u043F\u043A\u0430 \u043C\u0435\u0434\u0438\u0430\u0444\u0430\u0439\u043B\u043E\u0432", - desc: "\u041F\u0430\u043F\u043A\u0430 \u0441 \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438/\u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F\u043C\u0438. \u041A\u043E\u0433\u0434\u0430 \u0437\u0430\u043C\u0435\u0442\u043A\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442 ![[image.jpg]], Claude \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043A\u0430\u0442\u044C \u0437\u0434\u0435\u0441\u044C. \u041E\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u043F\u0443\u0441\u0442\u044B\u043C \u0434\u043B\u044F \u043A\u043E\u0440\u043D\u044F \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430." - }, - systemPrompt: { - name: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0439 \u043F\u0440\u043E\u043C\u043F\u0442", - desc: "\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043A\u0446\u0438\u0438, \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u043C\u044B\u0435 \u043A \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u043E\u043C\u0443 \u043F\u0440\u043E\u043C\u043F\u0442\u0443 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E" - }, - autoTitle: { - name: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 \u0431\u0435\u0441\u0435\u0434", - desc: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 \u0431\u0435\u0441\u0435\u0434 \u043F\u043E\u0441\u043B\u0435 \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F." - }, - titleModel: { - name: "\u041C\u043E\u0434\u0435\u043B\u044C \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432", - desc: "\u041C\u043E\u0434\u0435\u043B\u044C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u0430\u044F \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0439 \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0431\u0435\u0441\u0435\u0434.", - auto: "\u0410\u0432\u0442\u043E (Haiku)" - }, - navMappings: { - name: "\u0421\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432 \u0441\u0442\u0438\u043B\u0435 Vim", - desc: '\u041F\u043E \u043E\u0434\u043D\u043E\u043C\u0443 \u0441\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044E \u0432 \u0441\u0442\u0440\u043E\u043A\u0435. \u0424\u043E\u0440\u043C\u0430\u0442: "map <\u043A\u043B\u044E\u0447> <\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435>" (\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F: scrollUp, scrollDown, focusInput).' - }, - hotkeys: "\u0413\u043E\u0440\u044F\u0447\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0438", - inlineEditHotkey: { - name: "\u0418\u043D\u043B\u0430\u0439\u043D-\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435", - descWithKey: "\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u043A\u043B\u0430\u0432\u0438\u0448\u0430: {hotkey}", - descNoKey: "\u041A\u043B\u0430\u0432\u0438\u0448\u0430 \u043D\u0435 \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0430", - btnChange: "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C", - btnSet: "\u041D\u0430\u0437\u043D\u0430\u0447\u0438\u0442\u044C" - }, - openChatHotkey: { - name: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0447\u0430\u0442", - descWithKey: "\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u043A\u043B\u0430\u0432\u0438\u0448\u0430: {hotkey}", - descNoKey: "\u041A\u043B\u0430\u0432\u0438\u0448\u0430 \u043D\u0435 \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0430", - btnChange: "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C", - btnSet: "\u041D\u0430\u0437\u043D\u0430\u0447\u0438\u0442\u044C" - }, - newSessionHotkey: { - name: "\u041D\u043E\u0432\u0430\u044F \u0441\u0435\u0441\u0441\u0438\u044F", - descWithKey: "\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u043A\u043B\u0430\u0432\u0438\u0448\u0430: {hotkey}", - descNoKey: "\u041A\u043B\u0430\u0432\u0438\u0448\u0430 \u043D\u0435 \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0430", - btnChange: "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C", - btnSet: "\u041D\u0430\u0437\u043D\u0430\u0447\u0438\u0442\u044C" - }, - newTabHotkey: { - name: "\u041D\u043E\u0432\u0430\u044F \u0432\u043A\u043B\u0430\u0434\u043A\u0430", - descWithKey: "\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u043A\u043B\u0430\u0432\u0438\u0448\u0430: {hotkey}", - descNoKey: "\u041A\u043B\u0430\u0432\u0438\u0448\u0430 \u043D\u0435 \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0430", - btnChange: "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C", - btnSet: "\u041D\u0430\u0437\u043D\u0430\u0447\u0438\u0442\u044C" - }, - closeTabHotkey: { - name: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0432\u043A\u043B\u0430\u0434\u043A\u0443", - descWithKey: "\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u043A\u043B\u0430\u0432\u0438\u0448\u0430: {hotkey}", - descNoKey: "\u041A\u043B\u0430\u0432\u0438\u0448\u0430 \u043D\u0435 \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0430", - btnChange: "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C", - btnSet: "\u041D\u0430\u0437\u043D\u0430\u0447\u0438\u0442\u044C" - }, - slashCommands: { - name: "\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0438 \u043D\u0430\u0432\u044B\u043A\u0438", - desc: "\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0439\u0442\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B \u0438 \u043D\u0430\u0432\u044B\u043A\u0438, \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0435\u043C\u044B\u0435 \u0447\u0435\u0440\u0435\u0437 /\u0438\u043C\u044F." - }, - hiddenSlashCommands: { - name: "\u0421\u043A\u0440\u044B\u0442\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B", - desc: "\u0421\u043A\u0440\u044B\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0451\u043D\u043D\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B \u0441\u043E \u0441\u043B\u044D\u0448\u0435\u043C \u0438\u0437 \u0432\u044B\u043F\u0430\u0434\u0430\u044E\u0449\u0435\u0433\u043E \u0441\u043F\u0438\u0441\u043A\u0430. \u041F\u043E\u043B\u0435\u0437\u043D\u043E \u0434\u043B\u044F \u0441\u043A\u0440\u044B\u0442\u0438\u044F \u043A\u043E\u043C\u0430\u043D\u0434 Claude Code, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043D\u0435 \u0430\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u044B \u0434\u043B\u044F Claudian. \u0412\u0432\u043E\u0434\u0438\u0442\u0435 \u0438\u043C\u0435\u043D\u0430 \u043A\u043E\u043C\u0430\u043D\u0434 \u0431\u0435\u0437 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0441\u043B\u044D\u0448\u0430, \u043F\u043E \u043E\u0434\u043D\u043E\u0439 \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443.", - placeholder: "commit\nbuild\ntest" - }, - mcpServers: { - name: "MCP \u0441\u0435\u0440\u0432\u0435\u0440\u044B", - desc: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044B Model Context Protocol \u0434\u043B\u044F \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439 Claude \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0432\u043D\u0435\u0448\u043D\u0438\u0445 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0438 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u043E\u0432 \u0434\u0430\u043D\u043D\u044B\u0445. \u0421\u0435\u0440\u0432\u0435\u0440\u044B \u0441 \u0440\u0435\u0436\u0438\u043C\u043E\u043C \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430 \u0442\u0440\u0435\u0431\u0443\u044E\u0442 @mention \u0434\u043B\u044F \u0430\u043A\u0442\u0438\u0432\u0430\u0446\u0438\u0438." - }, - plugins: { - name: "\u041F\u043B\u0430\u0433\u0438\u043D\u044B Claude Code", - desc: "\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u043F\u043B\u0430\u0433\u0438\u043D\u044B Claude Code \u0438\u0437 ~/.claude/plugins. \u0412\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u0435 \u043F\u043B\u0430\u0433\u0438\u043D\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u044E\u0442\u0441\u044F \u0434\u043B\u044F \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430." - }, - subagents: { - name: "Subagents", - desc: "Configure custom subagents that Claude can delegate to.", - noAgents: "No subagents configured. Click + to create one.", - deleteConfirm: 'Delete subagent "{name}"?', - saveFailed: "Failed to save subagent: {message}", - deleteFailed: "Failed to delete subagent: {message}", - renameCleanupFailed: 'Warning: could not remove old file for "{name}"', - saved: 'Subagent "{name}" {action}', - deleted: 'Subagent "{name}" deleted', - duplicateName: 'An agent named "{name}" already exists', - descriptionRequired: "Description is required", - promptRequired: "System prompt is required", - modal: { - titleEdit: "Edit Subagent", - titleAdd: "Add Subagent", - name: "Name", - nameDesc: "Lowercase letters, numbers, and hyphens only", - namePlaceholder: "code-reviewer", - description: "Description", - descriptionDesc: "Brief description of this agent", - descriptionPlaceholder: "Reviews code for bugs and style", - advancedOptions: "Advanced options", - model: "Model", - modelDesc: "Model override for this agent", - tools: "Tools", - toolsDesc: "Comma-separated list of allowed tools (empty = all)", - disallowedTools: "Disallowed tools", - disallowedToolsDesc: "Comma-separated list of tools to disallow", - skills: "Skills", - skillsDesc: "Comma-separated list of skills", - prompt: "System prompt", - promptDesc: "Instructions for the agent", - promptPlaceholder: "You are a code reviewer. Analyze the given code for..." - } - }, - safety: "\u0411\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u044C", - loadUserSettings: { - name: "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 Claude", - desc: "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 ~/.claude/settings.json. \u041F\u0440\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0439 Claude Code \u043C\u043E\u0433\u0443\u0442 \u043E\u0431\u0445\u043E\u0434\u0438\u0442\u044C \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C." - }, - enableBlocklist: { - name: "\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0447\u0435\u0440\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u043A\u043E\u043C\u0430\u043D\u0434", - desc: "\u0411\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u0442\u0435\u043D\u0446\u0438\u0430\u043B\u044C\u043D\u043E \u043E\u043F\u0430\u0441\u043D\u044B\u0435 bash \u043A\u043E\u043C\u0430\u043D\u0434\u044B" - }, - blockedCommands: { - name: "\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B ({platform})", - desc: "\u0428\u0430\u0431\u043B\u043E\u043D\u044B \u0434\u043B\u044F \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0438 \u043D\u0430 {platform} (\u043F\u043E \u043E\u0434\u043D\u043E\u043C\u0443 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435). \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044E\u0442\u0441\u044F \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u0435 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u044F.", - unixName: "\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B (Unix/Git Bash)", - unixDesc: "Unix \u0448\u0430\u0431\u043B\u043E\u043D\u044B \u0442\u0430\u043A\u0436\u0435 \u0431\u043B\u043E\u043A\u0438\u0440\u0443\u044E\u0442\u0441\u044F \u043D\u0430 Windows, \u0442\u0430\u043A \u043A\u0430\u043A Git Bash \u043C\u043E\u0436\u0435\u0442 \u0438\u0445 \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C." - }, - exportPaths: { - name: "\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u043D\u044B\u0435 \u043F\u0443\u0442\u0438 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0430", - desc: "\u041F\u0443\u0442\u0438 \u0432\u043D\u0435 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0430, \u043A\u0443\u0434\u0430 \u043C\u043E\u0436\u043D\u043E \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0444\u0430\u0439\u043B\u044B (\u043F\u043E \u043E\u0434\u043D\u043E\u043C\u0443 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435). \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 ~ \u0434\u043B\u044F \u0434\u043E\u043C\u0430\u0448\u043D\u0435\u0433\u043E \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430." - }, - environment: "\u041E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u0435", - customVariables: { - name: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435", - desc: "\u041F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435 \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u044F \u0434\u043B\u044F Claude SDK (\u0444\u043E\u0440\u043C\u0430\u0442 KEY=VALUE, \u043F\u043E \u043E\u0434\u043D\u043E\u0439 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435). \u041F\u0440\u0435\u0444\u0438\u043A\u0441 export \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F." - }, - envSnippets: { - name: "\u0421\u043D\u0438\u043F\u043F\u0435\u0442\u044B", - addBtn: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u043D\u0438\u043F\u043F\u0435\u0442", - noSnippets: "\u041D\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u043D\u044B\u0445 \u0441\u043D\u0438\u043F\u043F\u0435\u0442\u043E\u0432 \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u044F. \u041D\u0430\u0436\u043C\u0438\u0442\u0435 +, \u0447\u0442\u043E\u0431\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044E.", - nameRequired: "\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0441\u043D\u0438\u043F\u043F\u0435\u0442\u0430", - modal: { - titleEdit: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u043D\u0438\u043F\u043F\u0435\u0442", - titleSave: "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0441\u043D\u0438\u043F\u043F\u0435\u0442", - name: "\u0418\u043C\u044F", - namePlaceholder: "\u041E\u043F\u0438\u0441\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0434\u043B\u044F \u044D\u0442\u043E\u0439 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438", - description: "\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435", - descPlaceholder: "\u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u0435 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435", - envVars: "\u041F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435 \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u044F", - envVarsPlaceholder: "\u0424\u043E\u0440\u043C\u0430\u0442 KEY=VALUE, \u043F\u043E \u043E\u0434\u043D\u043E\u0439 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 (\u043F\u0440\u0435\u0444\u0438\u043A\u0441 export \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F)", - save: "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C", - update: "\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C", - cancel: "\u041E\u0442\u043C\u0435\u043D\u0430" - } - }, - customContextLimits: { - name: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0435 \u043B\u0438\u043C\u0438\u0442\u044B \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430", - desc: "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0435 \u0440\u0430\u0437\u043C\u0435\u0440\u044B \u043E\u043A\u043D\u0430 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430 \u0434\u043B\u044F \u0432\u0430\u0448\u0438\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439. \u041E\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u043F\u0443\u0441\u0442\u044B\u043C \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E (200k \u0442\u043E\u043A\u0435\u043D\u043E\u0432).", - invalid: "\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435: 256k, 1m \u0438\u043B\u0438 \u0442\u043E\u0447\u043D\u043E\u0435 \u0447\u0438\u0441\u043B\u043E (1000-10000000)." - }, - advanced: "\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E", - show1MModel: { - name: "\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C Sonnet \u0441 \u043E\u043A\u043D\u043E\u043C \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430 1M", - desc: "\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0439 Sonnet \u043D\u0430 Sonnet (1M) \u0432 \u0432\u044B\u0431\u043E\u0440\u0435 \u043C\u043E\u0434\u0435\u043B\u0435\u0439. \u0422\u0430 \u0436\u0435 \u0446\u0435\u043D\u0430 \u0434\u043E 200k \u0442\u043E\u043A\u0435\u043D\u043E\u0432. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0430 Max." - }, - enableChrome: { - name: "\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 Chrome", - desc: "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C Claude \u0432\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u043E\u0432\u0430\u0442\u044C \u0441 Chrome \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 claude-in-chrome. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A \u0441\u0435\u0441\u0441\u0438\u0438." - }, - maxTabs: { - name: "\u041C\u0430\u043A\u0441\u0438\u043C\u0443\u043C \u0432\u043A\u043B\u0430\u0434\u043E\u043A \u0447\u0430\u0442\u0430", - desc: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u0434\u043D\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0445 \u0432\u043A\u043B\u0430\u0434\u043E\u043A \u0447\u0430\u0442\u0430 (3-10). \u041A\u0430\u0436\u0434\u0430\u044F \u0432\u043A\u043B\u0430\u0434\u043A\u0430 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u0443\u044E \u0441\u0435\u0441\u0441\u0438\u044E Claude.", - warning: "\u0411\u043E\u043B\u0435\u0435 5 \u0432\u043A\u043B\u0430\u0434\u043E\u043A \u043C\u043E\u0436\u0435\u0442 \u043F\u043E\u0432\u043B\u0438\u044F\u0442\u044C \u043D\u0430 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u0430\u043C\u044F\u0442\u0438." - }, - tabBarPosition: { - name: "\u041F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0430\u043D\u0435\u043B\u0438 \u0432\u043A\u043B\u0430\u0434\u043E\u043A", - desc: "\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435, \u0433\u0434\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0437\u043D\u0430\u0447\u043A\u0438 \u0432\u043A\u043B\u0430\u0434\u043E\u043A \u0438 \u043A\u043D\u043E\u043F\u043A\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439", - input: "\u041D\u0430\u0434 \u043F\u043E\u043B\u0435\u043C \u0432\u0432\u043E\u0434\u0430 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E)", - header: "\u0412 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0435" - }, - enableAutoScroll: { - name: "\u0410\u0432\u0442\u043E\u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0442\u043E\u043A\u043E\u0432\u043E\u0439 \u043F\u0435\u0440\u0435\u0434\u0430\u0447\u0438", - desc: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044C \u0432\u043D\u0438\u0437, \u043F\u043E\u043A\u0430 Claude \u043F\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043E\u0442\u0432\u0435\u0442\u044B. \u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043E\u0441\u0442\u0430\u0432\u0430\u0442\u044C\u0441\u044F \u043D\u0430\u0432\u0435\u0440\u0445\u0443 \u0438 \u0447\u0438\u0442\u0430\u0442\u044C \u0441 \u043D\u0430\u0447\u0430\u043B\u0430." - }, - openInMainTab: { - name: "\u041E\u0442\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0432 \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430", - desc: "\u041E\u0442\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u043F\u0430\u043D\u0435\u043B\u044C \u0447\u0430\u0442\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 \u0432\u043A\u043B\u0430\u0434\u043A\u0438 \u0432 \u0446\u0435\u043D\u0442\u0440\u0430\u043B\u044C\u043D\u043E\u0439 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0432\u043C\u0435\u0441\u0442\u043E \u043F\u0440\u0430\u0432\u043E\u0439 \u0431\u043E\u043A\u043E\u0432\u043E\u0439 \u043F\u0430\u043D\u0435\u043B\u0438" - }, - cliPath: { - name: "\u041F\u0443\u0442\u044C \u043A CLI Claude", - desc: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u043F\u0443\u0442\u044C \u043A Claude Code CLI. \u041E\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u043F\u0443\u0441\u0442\u044B\u043C \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F.", - descWindows: "\u0414\u043B\u044F \u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0433\u043E \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0449\u0438\u043A\u0430 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 claude.exe. \u0414\u043B\u044F \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043E\u043A \u0447\u0435\u0440\u0435\u0437 npm/pnpm/yarn \u0438\u043B\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u044B \u043F\u0430\u043A\u0435\u0442\u043E\u0432 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u043F\u0443\u0442\u044C \u043A cli.js (\u043D\u0435 claude.cmd).", - descUnix: '\u0412\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u0432\u044B\u0432\u043E\u0434 \u043A\u043E\u043C\u0430\u043D\u0434\u044B "which claude" \u2014 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043A\u0430\u043A \u0434\u043B\u044F \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0445 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043E\u043A, \u0442\u0430\u043A \u0438 \u0434\u043B\u044F npm/pnpm/yarn.', - validation: { - notExist: "\u041F\u0443\u0442\u044C \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442", - isDirectory: "\u041F\u0443\u0442\u044C \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0435\u0439, \u0430 \u043D\u0435 \u0444\u0430\u0439\u043B\u043E\u043C" - } - }, - language: { - name: "\u042F\u0437\u044B\u043A", - desc: "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u044F\u0437\u044B\u043A \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043F\u043B\u0430\u0433\u0438\u043D\u0430" - } -}; -var ru_default2 = { - common: common8, - settings: settings8 -}; - -// src/i18n/locales/zh-CN.json -var zh_CN_exports = {}; -__export(zh_CN_exports, { - common: () => common9, - default: () => zh_CN_default2, - settings: () => settings9 -}); -var common9 = { - save: "\u4FDD\u5B58", - cancel: "\u53D6\u6D88", - delete: "\u5220\u9664", - edit: "\u7F16\u8F91", - add: "\u6DFB\u52A0", - remove: "\u79FB\u9664", - clear: "\u6E05\u9664", - clearAll: "\u6E05\u9664\u5168\u90E8", - loading: "\u52A0\u8F7D\u4E2D", - error: "\u9519\u8BEF", - success: "\u6210\u529F", - warning: "\u8B66\u544A", - confirm: "\u786E\u8BA4", - settings: "\u8BBE\u7F6E", - advanced: "\u9AD8\u7EA7", - enabled: "\u5DF2\u542F\u7528", - disabled: "\u5DF2\u7981\u7528", - platform: "\u5E73\u53F0" -}; -var settings9 = { - title: "Claudian \u8BBE\u7F6E", - customization: "\u4E2A\u6027\u5316\u8BBE\u7F6E", - userName: { - name: "Claudian \u5E94\u8BE5\u5982\u4F55\u79F0\u547C\u4F60\uFF1F", - desc: "\u7528\u4E8E\u4E2A\u6027\u5316\u95EE\u5019\u7684\u7528\u6237\u540D\uFF08\u7559\u7A7A\u4F7F\u7528\u901A\u7528\u95EE\u5019\uFF09" - }, - excludedTags: { - name: "\u6392\u9664\u7684\u6807\u7B7E", - desc: "\u5305\u542B\u8FD9\u4E9B\u6807\u7B7E\u7684\u7B14\u8BB0\u4E0D\u4F1A\u81EA\u52A8\u52A0\u8F7D\u4E3A\u4E0A\u4E0B\u6587\uFF08\u6BCF\u884C\u4E00\u4E2A\uFF0C\u4E0D\u5E26 #\uFF09" - }, - mediaFolder: { - name: "\u5A92\u4F53\u6587\u4EF6\u5939", - desc: "\u5B58\u653E\u9644\u4EF6/\u56FE\u7247\u7684\u6587\u4EF6\u5939\u3002\u5F53\u7B14\u8BB0\u4F7F\u7528 ![[image.jpg]] \u65F6\uFF0CClaude \u4F1A\u5728\u6B64\u67E5\u627E\u3002\u7559\u7A7A\u4F7F\u7528\u4ED3\u5E93\u6839\u76EE\u5F55\u3002" - }, - systemPrompt: { - name: "\u81EA\u5B9A\u4E49\u7CFB\u7EDF\u63D0\u793A\u8BCD", - desc: "\u9644\u52A0\u5230\u9ED8\u8BA4\u7CFB\u7EDF\u63D0\u793A\u8BCD\u7684\u989D\u5916\u6307\u4EE4" - }, - autoTitle: { - name: "\u81EA\u52A8\u751F\u6210\u5BF9\u8BDD\u6807\u9898", - desc: "\u5728\u7528\u6237\u53D1\u9001\u9996\u6761\u6D88\u606F\u540E\u81EA\u52A8\u751F\u6210\u5BF9\u8BDD\u6807\u9898\u3002" - }, - titleModel: { - name: "\u6807\u9898\u751F\u6210\u6A21\u578B", - desc: "\u7528\u4E8E\u81EA\u52A8\u751F\u6210\u5BF9\u8BDD\u6807\u9898\u7684\u6A21\u578B\u3002", - auto: "\u81EA\u52A8 (Haiku)" - }, - navMappings: { - name: "Vim \u98CE\u683C\u5BFC\u822A\u6620\u5C04", - desc: '\u6BCF\u884C\u4E00\u4E2A\u6620\u5C04\u3002\u683C\u5F0F\uFF1A"map <\u952E> <\u52A8\u4F5C>"\uFF08\u52A8\u4F5C\uFF1AscrollUp, scrollDown, focusInput\uFF09\u3002' - }, - hotkeys: "\u5FEB\u6377\u952E", - inlineEditHotkey: { - name: "\u5185\u8054\u7F16\u8F91", - descWithKey: "\u5F53\u524D\u5FEB\u6377\u952E\uFF1A{hotkey}", - descNoKey: "\u672A\u8BBE\u7F6E\u5FEB\u6377\u952E", - btnChange: "\u66F4\u6539", - btnSet: "\u8BBE\u7F6E\u5FEB\u6377\u952E" - }, - openChatHotkey: { - name: "\u6253\u5F00\u804A\u5929", - descWithKey: "\u5F53\u524D\u5FEB\u6377\u952E\uFF1A{hotkey}", - descNoKey: "\u672A\u8BBE\u7F6E\u5FEB\u6377\u952E", - btnChange: "\u66F4\u6539", - btnSet: "\u8BBE\u7F6E\u5FEB\u6377\u952E" - }, - newSessionHotkey: { - name: "\u65B0\u4F1A\u8BDD", - descWithKey: "\u5F53\u524D\u5FEB\u6377\u952E\uFF1A{hotkey}", - descNoKey: "\u672A\u8BBE\u7F6E\u5FEB\u6377\u952E", - btnChange: "\u66F4\u6539", - btnSet: "\u8BBE\u7F6E\u5FEB\u6377\u952E" - }, - newTabHotkey: { - name: "\u65B0\u6807\u7B7E\u9875", - descWithKey: "\u5F53\u524D\u5FEB\u6377\u952E\uFF1A{hotkey}", - descNoKey: "\u672A\u8BBE\u7F6E\u5FEB\u6377\u952E", - btnChange: "\u66F4\u6539", - btnSet: "\u8BBE\u7F6E\u5FEB\u6377\u952E" - }, - closeTabHotkey: { - name: "\u5173\u95ED\u6807\u7B7E\u9875", - descWithKey: "\u5F53\u524D\u5FEB\u6377\u952E\uFF1A{hotkey}", - descNoKey: "\u672A\u8BBE\u7F6E\u5FEB\u6377\u952E", - btnChange: "\u66F4\u6539", - btnSet: "\u8BBE\u7F6E\u5FEB\u6377\u952E" - }, - slashCommands: { - name: "\u547D\u4EE4\u4E0E\u6280\u80FD", - desc: "\u5B9A\u4E49\u7531 /\u540D\u79F0 \u89E6\u53D1\u7684\u81EA\u5B9A\u4E49\u547D\u4EE4\u4E0E\u6280\u80FD\u3002" - }, - hiddenSlashCommands: { - name: "\u9690\u85CF\u547D\u4EE4", - desc: "\u4ECE\u4E0B\u62C9\u83DC\u5355\u4E2D\u9690\u85CF\u7279\u5B9A\u7684\u659C\u6760\u547D\u4EE4\u3002\u9002\u7528\u4E8E\u9690\u85CF\u4E0E Claudian \u65E0\u5173\u7684 Claude Code \u547D\u4EE4\u3002\u6BCF\u884C\u8F93\u5165\u4E00\u4E2A\u547D\u4EE4\u540D\u79F0\uFF0C\u65E0\u9700\u524D\u5BFC\u659C\u6760\u3002", - placeholder: "commit\nbuild\ntest" - }, - mcpServers: { - name: "MCP \u670D\u52A1\u5668", - desc: "\u914D\u7F6E\u6A21\u578B\u4E0A\u4E0B\u6587\u534F\u8BAE\u670D\u52A1\u5668\uFF0C\u901A\u8FC7\u5916\u90E8\u5DE5\u5177\u548C\u6570\u636E\u6E90\u6269\u5C55 Claude \u7684\u80FD\u529B\u3002\u542F\u7528\u4E0A\u4E0B\u6587\u4FDD\u5B58\u6A21\u5F0F\u7684\u670D\u52A1\u5668\u9700\u8981 @ \u63D0\u53CA\u624D\u80FD\u6FC0\u6D3B\u3002" - }, - plugins: { - name: "Claude Code \u63D2\u4EF6", - desc: "\u542F\u7528\u6216\u7981\u7528\u4ECE ~/.claude/plugins \u53D1\u73B0\u7684 Claude Code \u63D2\u4EF6\u3002\u542F\u7528\u7684\u63D2\u4EF6\u6309 Vault \u5B58\u50A8\u3002" - }, - subagents: { - name: "Subagents", - desc: "Configure custom subagents that Claude can delegate to.", - noAgents: "No subagents configured. Click + to create one.", - deleteConfirm: 'Delete subagent "{name}"?', - saveFailed: "Failed to save subagent: {message}", - deleteFailed: "Failed to delete subagent: {message}", - renameCleanupFailed: 'Warning: could not remove old file for "{name}"', - saved: 'Subagent "{name}" {action}', - deleted: 'Subagent "{name}" deleted', - duplicateName: 'An agent named "{name}" already exists', - descriptionRequired: "Description is required", - promptRequired: "System prompt is required", - modal: { - titleEdit: "Edit Subagent", - titleAdd: "Add Subagent", - name: "Name", - nameDesc: "Lowercase letters, numbers, and hyphens only", - namePlaceholder: "code-reviewer", - description: "Description", - descriptionDesc: "Brief description of this agent", - descriptionPlaceholder: "Reviews code for bugs and style", - advancedOptions: "Advanced options", - model: "Model", - modelDesc: "Model override for this agent", - tools: "Tools", - toolsDesc: "Comma-separated list of allowed tools (empty = all)", - disallowedTools: "Disallowed tools", - disallowedToolsDesc: "Comma-separated list of tools to disallow", - skills: "Skills", - skillsDesc: "Comma-separated list of skills", - prompt: "System prompt", - promptDesc: "Instructions for the agent", - promptPlaceholder: "You are a code reviewer. Analyze the given code for..." - } - }, - safety: "\u5B89\u5168", - loadUserSettings: { - name: "\u52A0\u8F7D\u7528\u6237 Claude \u8BBE\u7F6E", - desc: "\u52A0\u8F7D ~/.claude/settings.json\u3002\u542F\u7528\u540E\uFF0C\u7528\u6237\u7684 Claude Code \u6743\u9650\u89C4\u5219\u53EF\u80FD\u7ED5\u8FC7\u5B89\u5168\u6A21\u5F0F\u3002" - }, - enableBlocklist: { - name: "\u542F\u7528\u547D\u4EE4\u9ED1\u540D\u5355", - desc: "\u963B\u6B62\u6F5C\u5728\u5371\u9669\u7684 bash \u547D\u4EE4" - }, - blockedCommands: { - name: "\u963B\u6B62\u7684\u547D\u4EE4 ({platform})", - desc: "\u5728 {platform} \u4E0A\u963B\u6B62\u7684\u6A21\u5F0F\uFF08\u6BCF\u884C\u4E00\u4E2A\uFF09\u3002\u652F\u6301\u6B63\u5219\u8868\u8FBE\u5F0F\u3002", - unixName: "\u963B\u6B62\u7684\u547D\u4EE4 (Unix/Git Bash)", - unixDesc: "Unix \u6A21\u5F0F\u5728 Windows \u4E0A\u4E5F\u4F1A\u88AB\u963B\u6B62\uFF0C\u56E0\u4E3A Git Bash \u53EF\u4EE5\u8C03\u7528\u5B83\u4EEC\u3002" - }, - exportPaths: { - name: "\u5141\u8BB8\u7684\u5BFC\u51FA\u8DEF\u5F84", - desc: "\u5141\u8BB8\u5BFC\u51FA\u6587\u4EF6\u7684\u4ED3\u5E93\u5916\u90E8\u8DEF\u5F84\uFF08\u6BCF\u884C\u4E00\u4E2A\uFF09\u3002\u652F\u6301 ~ \u8868\u793A\u4E3B\u76EE\u5F55\u3002" - }, - environment: "\u73AF\u5883", - customVariables: { - name: "\u81EA\u5B9A\u4E49\u53D8\u91CF", - desc: "Claude SDK \u7684\u73AF\u5883\u53D8\u91CF\uFF08KEY=VALUE \u683C\u5F0F\uFF0C\u6BCF\u884C\u4E00\u4E2A\uFF09\u3002\u652F\u6301 export \u524D\u7F00\u3002" - }, - envSnippets: { - name: "\u7247\u6BB5", - addBtn: "\u6DFB\u52A0\u7247\u6BB5", - noSnippets: "\u5C1A\u65E0\u4FDD\u5B58\u7684\u73AF\u5883\u53D8\u91CF\u7247\u6BB5\u3002\u70B9\u51FB + \u4FDD\u5B58\u5F53\u524D\u914D\u7F6E\u3002", - nameRequired: "\u8BF7\u8F93\u5165\u7247\u6BB5\u540D\u79F0", - modal: { - titleEdit: "\u7F16\u8F91\u7247\u6BB5", - titleSave: "\u4FDD\u5B58\u7247\u6BB5", - name: "\u540D\u79F0", - namePlaceholder: "\u6B64\u914D\u7F6E\u7684\u63CF\u8FF0\u6027\u540D\u79F0", - description: "\u63CF\u8FF0", - descPlaceholder: "\u53EF\u9009\u63CF\u8FF0", - envVars: "\u73AF\u5883\u53D8\u91CF", - envVarsPlaceholder: "KEY=VALUE \u683C\u5F0F\uFF0C\u6BCF\u884C\u4E00\u4E2A\uFF08\u652F\u6301 export \u524D\u7F00\uFF09", - save: "\u4FDD\u5B58", - update: "\u66F4\u65B0", - cancel: "\u53D6\u6D88" - } - }, - customContextLimits: { - name: "\u81EA\u5B9A\u4E49\u4E0A\u4E0B\u6587\u9650\u5236", - desc: "\u4E3A\u60A8\u7684\u81EA\u5B9A\u4E49\u6A21\u578B\u8BBE\u7F6E\u4E0A\u4E0B\u6587\u7A97\u53E3\u5927\u5C0F\u3002\u7559\u7A7A\u4F7F\u7528\u9ED8\u8BA4\u503C\uFF08200k \u4EE4\u724C\uFF09\u3002", - invalid: "\u683C\u5F0F\u65E0\u6548\u3002\u4F7F\u7528\uFF1A256k\u30011m \u6216\u7CBE\u786E\u6570\u91CF\uFF081000-10000000\uFF09\u3002" - }, - advanced: "\u9AD8\u7EA7", - show1MModel: { - name: "\u542F\u7528\u5177\u6709 1M \u4E0A\u4E0B\u6587\u7A97\u53E3\u7684 Sonnet", - desc: "\u5728\u6A21\u578B\u9009\u62E9\u5668\u4E2D\u5C06\u6807\u51C6 Sonnet \u66FF\u6362\u4E3A Sonnet (1M)\u3002\u5728 200k \u4EE4\u724C\u4EE5\u4E0B\u4EF7\u683C\u76F8\u540C\u3002\u9700\u8981 Max \u8BA2\u9605\u3002" - }, - enableChrome: { - name: "\u542F\u7528 Chrome \u6269\u5C55", - desc: "\u5141\u8BB8 Claude \u901A\u8FC7 claude-in-chrome \u6269\u5C55\u4E0E Chrome \u4EA4\u4E92\u3002\u9700\u8981\u5B89\u88C5\u8BE5\u6269\u5C55\u3002\u9700\u8981\u91CD\u542F\u4F1A\u8BDD\u3002" - }, - maxTabs: { - name: "\u6700\u5927\u804A\u5929\u6807\u7B7E\u6570", - desc: "\u540C\u65F6\u5F00\u542F\u7684\u6700\u5927\u804A\u5929\u6807\u7B7E\u6570\uFF083-10\uFF09\u3002\u6BCF\u4E2A\u6807\u7B7E\u4F7F\u7528\u72EC\u7ACB\u7684 Claude \u4F1A\u8BDD\u3002", - warning: "\u8D85\u8FC7 5 \u4E2A\u6807\u7B7E\u53EF\u80FD\u4F1A\u5F71\u54CD\u6027\u80FD\u548C\u5185\u5B58\u4F7F\u7528\u3002" - }, - tabBarPosition: { - name: "\u6807\u7B7E\u680F\u4F4D\u7F6E", - desc: "\u9009\u62E9\u6807\u7B7E\u5FBD\u7AE0\u548C\u64CD\u4F5C\u6309\u94AE\u7684\u663E\u793A\u4F4D\u7F6E", - input: "\u8F93\u5165\u6846\u4E0A\u65B9\uFF08\u9ED8\u8BA4\uFF09", - header: "\u5728\u6807\u9898\u680F" - }, - enableAutoScroll: { - name: "\u6D41\u5F0F\u4F20\u8F93\u65F6\u81EA\u52A8\u6EDA\u52A8", - desc: "\u5728 Claude \u6D41\u5F0F\u4F20\u8F93\u54CD\u5E94\u65F6\u81EA\u52A8\u6EDA\u52A8\u5230\u5E95\u90E8\u3002\u7981\u7528\u540E\u5C06\u505C\u7559\u5728\u9876\u90E8\uFF0C\u4ECE\u5934\u5F00\u59CB\u9605\u8BFB\u3002" - }, - openInMainTab: { - name: "\u5728\u4E3B\u7F16\u8F91\u5668\u533A\u57DF\u6253\u5F00", - desc: "\u5728\u4E2D\u592E\u7F16\u8F91\u5668\u533A\u57DF\u4EE5\u4E3B\u6807\u7B7E\u9875\u5F62\u5F0F\u6253\u5F00\u804A\u5929\u9762\u677F\uFF0C\u800C\u4E0D\u662F\u5728\u53F3\u4FA7\u8FB9\u680F" - }, - cliPath: { - name: "Claude CLI \u8DEF\u5F84", - desc: "Claude Code CLI \u7684\u81EA\u5B9A\u4E49\u8DEF\u5F84\u3002\u7559\u7A7A\u4F7F\u7528\u81EA\u52A8\u68C0\u6D4B\u3002", - descWindows: "\u5BF9\u4E8E\u539F\u751F\u5B89\u88C5\u7A0B\u5E8F\uFF0C\u4F7F\u7528 claude.exe\u3002\u5BF9\u4E8E npm/pnpm/yarn \u6216\u5176\u4ED6\u5305\u7BA1\u7406\u5668\u5B89\u88C5\uFF0C\u4F7F\u7528 cli.js \u8DEF\u5F84\uFF08\u4E0D\u662F claude.cmd\uFF09\u3002", - descUnix: '\u7C98\u8D34 "which claude" \u7684\u8F93\u51FA - \u9002\u7528\u4E8E\u539F\u751F\u5B89\u88C5\u548C npm/pnpm/yarn \u5B89\u88C5\u3002', - validation: { - notExist: "\u8DEF\u5F84\u4E0D\u5B58\u5728", - isDirectory: "\u8DEF\u5F84\u662F\u76EE\u5F55\uFF0C\u4E0D\u662F\u6587\u4EF6" - } - }, - language: { - name: "\u8BED\u8A00", - desc: "\u66F4\u6539\u63D2\u4EF6\u754C\u9762\u7684\u663E\u793A\u8BED\u8A00" - } -}; -var zh_CN_default2 = { - common: common9, - settings: settings9 -}; - -// src/i18n/locales/zh-TW.json -var zh_TW_exports = {}; -__export(zh_TW_exports, { - common: () => common10, - default: () => zh_TW_default2, - settings: () => settings10 -}); -var common10 = { - save: "\u4FDD\u5B58", - cancel: "\u53D6\u6D88", - delete: "\u522A\u9664", - edit: "\u7DE8\u8F2F", - add: "\u6DFB\u52A0", - remove: "\u79FB\u9664", - clear: "\u6E05\u9664", - clearAll: "\u6E05\u9664\u5168\u90E8", - loading: "\u52A0\u8F09\u4E2D", - error: "\u932F\u8AA4", - success: "\u6210\u529F", - warning: "\u8B66\u544A", - confirm: "\u78BA\u8A8D", - settings: "\u8A2D\u7F6E", - advanced: "\u9AD8\u7D1A", - enabled: "\u5DF2\u555F\u7528", - disabled: "\u5DF2\u7981\u7528", - platform: "\u5E73\u53F0" -}; -var settings10 = { - title: "Claudian \u8A2D\u5B9A", - customization: "\u500B\u4EBA\u5316\u8A2D\u5B9A", - userName: { - name: "Claudian \u61C9\u8A72\u5982\u4F55\u7A31\u547C\u60A8\uFF1F", - desc: "\u7528\u65BC\u500B\u4EBA\u5316\u554F\u5019\u7684\u4F7F\u7528\u8005\u540D\u7A31\uFF08\u7559\u7A7A\u4F7F\u7528\u901A\u7528\u554F\u5019\uFF09" - }, - excludedTags: { - name: "\u6392\u9664\u7684\u6A19\u7C64", - desc: "\u5305\u542B\u9019\u4E9B\u6A19\u7C64\u7684\u7B46\u8A18\u4E0D\u6703\u81EA\u52D5\u8F09\u5165\u70BA\u4E0A\u4E0B\u6587\uFF08\u6BCF\u884C\u4E00\u500B\uFF0C\u4E0D\u5E36 #\uFF09" - }, - mediaFolder: { - name: "\u5A92\u9AD4\u8CC7\u6599\u593E", - desc: "\u5B58\u653E\u9644\u4EF6/\u5716\u7247\u7684\u8CC7\u6599\u593E\u3002\u7576\u7B46\u8A18\u4F7F\u7528 ![[image.jpg]] \u6642\uFF0CClaude \u6703\u5728\u6B64\u67E5\u627E\u3002\u7559\u7A7A\u4F7F\u7528\u5132\u5B58\u5EAB\u6839\u76EE\u9304\u3002" - }, - systemPrompt: { - name: "\u81EA\u8A02\u7CFB\u7D71\u63D0\u793A\u8A5E", - desc: "\u9644\u52A0\u5230\u9810\u8A2D\u7CFB\u7D71\u63D0\u793A\u8A5E\u7684\u984D\u5916\u6307\u4EE4" - }, - autoTitle: { - name: "\u81EA\u52D5\u751F\u6210\u5C0D\u8A71\u6A19\u984C", - desc: "\u5728\u4F7F\u7528\u8005\u9001\u51FA\u7B2C\u4E00\u5247\u8A0A\u606F\u5F8C\u81EA\u52D5\u751F\u6210\u5C0D\u8A71\u6A19\u984C\u3002" - }, - titleModel: { - name: "\u6A19\u984C\u751F\u6210\u6A21\u578B", - desc: "\u7528\u65BC\u81EA\u52D5\u751F\u6210\u5C0D\u8A71\u6A19\u984C\u7684\u6A21\u578B\u3002", - auto: "\u81EA\u52D5 (Haiku)" - }, - navMappings: { - name: "Vim \u98A8\u683C\u5C0E\u822A\u6620\u5C04", - desc: '\u6BCF\u884C\u4E00\u500B\u6620\u5C04\u3002\u683C\u5F0F\uFF1A"map <\u9375> <\u52D5\u4F5C>"\uFF08\u52D5\u4F5C\uFF1AscrollUp, scrollDown, focusInput\uFF09\u3002' - }, - hotkeys: "\u5FEB\u6377\u9375", - inlineEditHotkey: { - name: "\u5167\u5D4C\u7DE8\u8F2F", - descWithKey: "\u76EE\u524D\u5FEB\u6377\u9375\uFF1A{hotkey}", - descNoKey: "\u672A\u8A2D\u5B9A\u5FEB\u6377\u9375", - btnChange: "\u8B8A\u66F4", - btnSet: "\u8A2D\u5B9A\u5FEB\u6377\u9375" - }, - openChatHotkey: { - name: "\u958B\u555F\u804A\u5929", - descWithKey: "\u76EE\u524D\u5FEB\u6377\u9375\uFF1A{hotkey}", - descNoKey: "\u672A\u8A2D\u5B9A\u5FEB\u6377\u9375", - btnChange: "\u8B8A\u66F4", - btnSet: "\u8A2D\u5B9A\u5FEB\u6377\u9375" - }, - newSessionHotkey: { - name: "\u65B0\u5DE5\u4F5C\u968E\u6BB5", - descWithKey: "\u76EE\u524D\u5FEB\u6377\u9375\uFF1A{hotkey}", - descNoKey: "\u672A\u8A2D\u5B9A\u5FEB\u6377\u9375", - btnChange: "\u8B8A\u66F4", - btnSet: "\u8A2D\u5B9A\u5FEB\u6377\u9375" - }, - newTabHotkey: { - name: "\u65B0\u5206\u9801", - descWithKey: "\u76EE\u524D\u5FEB\u6377\u9375\uFF1A{hotkey}", - descNoKey: "\u672A\u8A2D\u5B9A\u5FEB\u6377\u9375", - btnChange: "\u8B8A\u66F4", - btnSet: "\u8A2D\u5B9A\u5FEB\u6377\u9375" - }, - closeTabHotkey: { - name: "\u95DC\u9589\u5206\u9801", - descWithKey: "\u76EE\u524D\u5FEB\u6377\u9375\uFF1A{hotkey}", - descNoKey: "\u672A\u8A2D\u5B9A\u5FEB\u6377\u9375", - btnChange: "\u8B8A\u66F4", - btnSet: "\u8A2D\u5B9A\u5FEB\u6377\u9375" - }, - slashCommands: { - name: "\u547D\u4EE4\u8207\u6280\u80FD", - desc: "\u5B9A\u7FA9\u7531 /\u540D\u7A31 \u89F8\u767C\u7684\u81EA\u8A02\u547D\u4EE4\u8207\u6280\u80FD\u3002" - }, - hiddenSlashCommands: { - name: "\u96B1\u85CF\u547D\u4EE4", - desc: "\u5F9E\u4E0B\u62C9\u9078\u55AE\u4E2D\u96B1\u85CF\u7279\u5B9A\u7684\u659C\u7DDA\u547D\u4EE4\u3002\u9069\u7528\u65BC\u96B1\u85CF\u8207 Claudian \u7121\u95DC\u7684 Claude Code \u547D\u4EE4\u3002\u6BCF\u884C\u8F38\u5165\u4E00\u500B\u547D\u4EE4\u540D\u7A31\uFF0C\u7121\u9700\u524D\u5C0E\u659C\u7DDA\u3002", - placeholder: "commit\nbuild\ntest" - }, - mcpServers: { - name: "MCP \u4F3A\u670D\u5668", - desc: "\u8A2D\u5B9A\u6A21\u578B\u4E0A\u4E0B\u6587\u5354\u5B9A\u4F3A\u670D\u5668\uFF0C\u900F\u904E\u5916\u90E8\u5DE5\u5177\u548C\u8CC7\u6599\u4F86\u6E90\u64F4\u5C55 Claude \u7684\u80FD\u529B\u3002\u555F\u7528\u4E0A\u4E0B\u6587\u4FDD\u5B58\u6A21\u5F0F\u7684\u4F3A\u670D\u5668\u9700\u8981 @ \u63D0\u53CA\u624D\u80FD\u555F\u7528\u3002" - }, - plugins: { - name: "Claude Code \u5916\u639B\u7A0B\u5F0F", - desc: "\u555F\u7528\u6216\u505C\u7528\u5F9E ~/.claude/plugins \u767C\u73FE\u7684 Claude Code \u5916\u639B\u7A0B\u5F0F\u3002\u5DF2\u555F\u7528\u7684\u5916\u639B\u7A0B\u5F0F\u6309\u5132\u5B58\u5EAB\u5132\u5B58\u3002" - }, - subagents: { - name: "Subagents", - desc: "Configure custom subagents that Claude can delegate to.", - noAgents: "No subagents configured. Click + to create one.", - deleteConfirm: 'Delete subagent "{name}"?', - saveFailed: "Failed to save subagent: {message}", - deleteFailed: "Failed to delete subagent: {message}", - renameCleanupFailed: 'Warning: could not remove old file for "{name}"', - saved: 'Subagent "{name}" {action}', - deleted: 'Subagent "{name}" deleted', - duplicateName: 'An agent named "{name}" already exists', - descriptionRequired: "Description is required", - promptRequired: "System prompt is required", - modal: { - titleEdit: "Edit Subagent", - titleAdd: "Add Subagent", - name: "Name", - nameDesc: "Lowercase letters, numbers, and hyphens only", - namePlaceholder: "code-reviewer", - description: "Description", - descriptionDesc: "Brief description of this agent", - descriptionPlaceholder: "Reviews code for bugs and style", - advancedOptions: "Advanced options", - model: "Model", - modelDesc: "Model override for this agent", - tools: "Tools", - toolsDesc: "Comma-separated list of allowed tools (empty = all)", - disallowedTools: "Disallowed tools", - disallowedToolsDesc: "Comma-separated list of tools to disallow", - skills: "Skills", - skillsDesc: "Comma-separated list of skills", - prompt: "System prompt", - promptDesc: "Instructions for the agent", - promptPlaceholder: "You are a code reviewer. Analyze the given code for..." - } - }, - safety: "\u5B89\u5168", - loadUserSettings: { - name: "\u8F09\u5165\u4F7F\u7528\u8005 Claude \u8A2D\u5B9A", - desc: "\u8F09\u5165 ~/.claude/settings.json\u3002\u555F\u7528\u5F8C\uFF0C\u4F7F\u7528\u8005\u7684 Claude Code \u6B0A\u9650\u898F\u5247\u53EF\u80FD\u7E5E\u904E\u5B89\u5168\u6A21\u5F0F\u3002" - }, - enableBlocklist: { - name: "\u555F\u7528\u547D\u4EE4\u9ED1\u540D\u55AE", - desc: "\u963B\u6B62\u6F5B\u5728\u5371\u96AA\u7684 bash \u547D\u4EE4" - }, - blockedCommands: { - name: "\u963B\u6B62\u7684\u547D\u4EE4 ({platform})", - desc: "\u5728 {platform} \u4E0A\u963B\u6B62\u7684\u6A21\u5F0F\uFF08\u6BCF\u884C\u4E00\u500B\uFF09\u3002\u652F\u63F4\u6B63\u5247\u8868\u793A\u5F0F\u3002", - unixName: "\u963B\u6B62\u7684\u547D\u4EE4 (Unix/Git Bash)", - unixDesc: "Unix \u6A21\u5F0F\u5728 Windows \u4E0A\u4E5F\u6703\u88AB\u963B\u6B62\uFF0C\u56E0\u70BA Git Bash \u53EF\u4EE5\u547C\u53EB\u5B83\u5011\u3002" - }, - exportPaths: { - name: "\u5141\u8A31\u7684\u532F\u51FA\u8DEF\u5F91", - desc: "\u5141\u8A31\u532F\u51FA\u6A94\u6848\u7684\u5132\u5B58\u5EAB\u5916\u90E8\u8DEF\u5F91\uFF08\u6BCF\u884C\u4E00\u500B\uFF09\u3002\u652F\u63F4 ~ \u8868\u793A\u4E3B\u76EE\u9304\u3002" - }, - environment: "\u74B0\u5883", - customVariables: { - name: "\u81EA\u8A02\u8B8A\u6578", - desc: "Claude SDK \u7684\u74B0\u5883\u8B8A\u6578\uFF08KEY=VALUE \u683C\u5F0F\uFF0C\u6BCF\u884C\u4E00\u500B\uFF09\u3002\u652F\u63F4 export \u524D\u7DB4\u3002" - }, - envSnippets: { - name: "\u7247\u6BB5", - addBtn: "\u65B0\u589E\u7247\u6BB5", - noSnippets: "\u5C1A\u7121\u4FDD\u5B58\u7684\u74B0\u5883\u8B8A\u6578\u7247\u6BB5\u3002\u9EDE\u64CA + \u4FDD\u5B58\u7576\u524D\u914D\u7F6E\u3002", - nameRequired: "\u8ACB\u8F38\u5165\u7247\u6BB5\u540D\u7A31", - modal: { - titleEdit: "\u7DE8\u8F2F\u7247\u6BB5", - titleSave: "\u4FDD\u5B58\u7247\u6BB5", - name: "\u540D\u7A31", - namePlaceholder: "\u6B64\u914D\u7F6E\u7684\u63CF\u8FF0\u6027\u540D\u7A31", - description: "\u63CF\u8FF0", - descPlaceholder: "\u53EF\u9078\u63CF\u8FF0", - envVars: "\u74B0\u5883\u8B8A\u6578", - envVarsPlaceholder: "KEY=VALUE \u683C\u5F0F\uFF0C\u6BCF\u884C\u4E00\u500B\uFF08\u652F\u63F4 export \u524D\u7DB4\uFF09", - save: "\u4FDD\u5B58", - update: "\u66F4\u65B0", - cancel: "\u53D6\u6D88" - } - }, - customContextLimits: { - name: "\u81EA\u8A02\u4E0A\u4E0B\u6587\u9650\u5236", - desc: "\u70BA\u60A8\u7684\u81EA\u8A02\u6A21\u578B\u8A2D\u5B9A\u4E0A\u4E0B\u6587\u8996\u7A97\u5927\u5C0F\u3002\u7559\u7A7A\u4F7F\u7528\u9810\u8A2D\u503C\uFF08200k \u6B0A\u6756\uFF09\u3002", - invalid: "\u683C\u5F0F\u7121\u6548\u3002\u4F7F\u7528\uFF1A256k\u30011m \u6216\u7CBE\u78BA\u6578\u91CF\uFF081000-10000000\uFF09\u3002" - }, - advanced: "\u9032\u968E", - show1MModel: { - name: "\u555F\u7528\u5177\u6709 1M \u4E0A\u4E0B\u6587\u8996\u7A97\u7684 Sonnet", - desc: "\u5728\u6A21\u578B\u9078\u64C7\u5668\u4E2D\u5C07\u6A19\u6E96 Sonnet \u66FF\u63DB\u70BA Sonnet (1M)\u3002\u5728 200k \u6B0A\u6756\u4EE5\u4E0B\u50F9\u683C\u76F8\u540C\u3002\u9700\u8981 Max \u8A02\u95B1\u3002" - }, - enableChrome: { - name: "\u555F\u7528 Chrome \u64F4\u5145\u529F\u80FD", - desc: "\u5141\u8A31 Claude \u900F\u904E claude-in-chrome \u64F4\u5145\u529F\u80FD\u8207 Chrome \u4E92\u52D5\u3002\u9700\u8981\u5B89\u88DD\u8A72\u64F4\u5145\u529F\u80FD\u3002\u9700\u8981\u91CD\u65B0\u555F\u52D5\u5DE5\u4F5C\u968E\u6BB5\u3002" - }, - maxTabs: { - name: "\u6700\u5927\u804A\u5929\u6A19\u7C64\u6578", - desc: "\u540C\u6642\u958B\u555F\u7684\u6700\u5927\u804A\u5929\u6A19\u7C64\u6578\uFF083-10\uFF09\u3002\u6BCF\u500B\u6A19\u7C64\u4F7F\u7528\u7368\u7ACB\u7684 Claude \u5C0D\u8A71\u3002", - warning: "\u8D85\u904E 5 \u500B\u6A19\u7C64\u53EF\u80FD\u6703\u5F71\u97FF\u6548\u80FD\u548C\u8A18\u61B6\u9AD4\u4F7F\u7528\u3002" - }, - tabBarPosition: { - name: "\u6A19\u7C64\u5217\u4F4D\u7F6E", - desc: "\u9078\u64C7\u6A19\u7C64\u5FBD\u7AE0\u548C\u64CD\u4F5C\u6309\u9215\u7684\u986F\u793A\u4F4D\u7F6E", - input: "\u8F38\u5165\u6846\u4E0A\u65B9\uFF08\u9810\u8A2D\uFF09", - header: "\u5728\u6A19\u984C\u5217" - }, - enableAutoScroll: { - name: "\u4E32\u6D41\u50B3\u8F38\u6642\u81EA\u52D5\u6372\u52D5", - desc: "\u5728 Claude \u4E32\u6D41\u50B3\u8F38\u56DE\u61C9\u6642\u81EA\u52D5\u6372\u52D5\u5230\u5E95\u90E8\u3002\u505C\u7528\u5F8C\u5C07\u505C\u7559\u5728\u9802\u90E8\uFF0C\u5F9E\u982D\u958B\u59CB\u95B1\u8B80\u3002" - }, - openInMainTab: { - name: "\u5728\u4E3B\u7DE8\u8F2F\u5668\u5340\u57DF\u958B\u555F", - desc: "\u5728\u4E2D\u592E\u7DE8\u8F2F\u5668\u5340\u57DF\u4EE5\u4E3B\u5206\u9801\u5F62\u5F0F\u958B\u555F\u804A\u5929\u9762\u677F\uFF0C\u800C\u4E0D\u662F\u5728\u53F3\u5074\u908A\u6B04" - }, - cliPath: { - name: "Claude CLI \u8DEF\u5F91", - desc: "Claude Code CLI \u7684\u81EA\u8A02\u8DEF\u5F91\u3002\u7559\u7A7A\u4F7F\u7528\u81EA\u52D5\u6AA2\u6E2C\u3002", - descWindows: "\u5C0D\u65BC\u539F\u751F\u5B89\u88DD\u7A0B\u5F0F\uFF0C\u4F7F\u7528 claude.exe\u3002\u5C0D\u65BC npm/pnpm/yarn \u6216\u5176\u4ED6\u5957\u4EF6\u7BA1\u7406\u5668\u5B89\u88DD\uFF0C\u4F7F\u7528 cli.js \u8DEF\u5F91\uFF08\u4E0D\u662F claude.cmd\uFF09\u3002", - descUnix: '\u8CBC\u4E0A "which claude" \u7684\u8F38\u51FA - \u9069\u7528\u65BC\u539F\u751F\u5B89\u88DD\u548C npm/pnpm/yarn \u5B89\u88DD\u3002', - validation: { - notExist: "\u8DEF\u5F91\u4E0D\u5B58\u5728", - isDirectory: "\u8DEF\u5F91\u662F\u76EE\u9304\uFF0C\u4E0D\u662F\u6A94\u6848" - } - }, - language: { - name: "\u8A9E\u8A00", - desc: "\u66F4\u6539\u63D2\u4EF6\u4ECB\u9762\u7684\u986F\u793A\u8A9E\u8A00" - } -}; -var zh_TW_default2 = { - common: common10, - settings: settings10 -}; - -// src/i18n/i18n.ts -var translations = { - en: en_exports, - "zh-CN": zh_CN_exports, - "zh-TW": zh_TW_exports, - ja: ja_exports, - ko: ko_exports, - de: de_exports, - fr: fr_exports, - es: es_exports, - ru: ru_exports, - pt: pt_exports -}; -var DEFAULT_LOCALE = "en"; -var currentLocale = DEFAULT_LOCALE; -function t(key, params) { - const dict = translations[currentLocale]; - const keys = key.split("."); - let value = dict; - for (const k of keys) { - if (value && typeof value === "object" && k in value) { - value = value[k]; - } else { - if (currentLocale !== DEFAULT_LOCALE) { - return tFallback(key, params); - } - return key; - } - } - if (typeof value !== "string") { - return key; - } - if (params) { - return value.replace(/\{(\w+)\}/g, (_, param) => { - var _a3, _b; - return (_b = (_a3 = params[param]) == null ? void 0 : _a3.toString()) != null ? _b : `{${param}}`; - }); - } - return value; -} -function tFallback(key, params) { - const dict = translations[DEFAULT_LOCALE]; - const keys = key.split("."); - let value = dict; - for (const k of keys) { - if (value && typeof value === "object" && k in value) { - value = value[k]; - } else { - return key; - } - } - if (typeof value !== "string") { - return key; - } - if (params) { - return value.replace(/\{(\w+)\}/g, (_, param) => { - var _a3, _b; - return (_b = (_a3 = params[param]) == null ? void 0 : _a3.toString()) != null ? _b : `{${param}}`; - }); - } - return value; -} -function setLocale(locale) { - if (!translations[locale]) { - return false; - } - currentLocale = locale; - return true; -} -function getAvailableLocales() { - return Object.keys(translations); -} -function getLocaleDisplayName(locale) { - const names = { - "en": "English", - "zh-CN": "\u7B80\u4F53\u4E2D\u6587", - "zh-TW": "\u7E41\u9AD4\u4E2D\u6587", - "ja": "\u65E5\u672C\u8A9E", - "ko": "\uD55C\uAD6D\uC5B4", - "de": "Deutsch", - "fr": "Fran\xE7ais", - "es": "Espa\xF1ol", - "ru": "\u0420\u0443\u0441\u0441\u043A\u0438\u0439", - "pt": "Portugu\xEAs" - }; - return names[locale] || locale; -} +var fs8 = __toESM(require("fs")); +var import_obsidian33 = require("obsidian"); // src/features/settings/keyboardNavigation.ts var NAV_ACTIONS = ["scrollUp", "scrollDown", "focusInput"]; @@ -63671,52 +66586,14 @@ var parseNavMappings = (value) => { }; // src/features/settings/ui/AgentSettings.ts -var import_obsidian22 = require("obsidian"); - -// src/shared/modals/ConfirmModal.ts -var import_obsidian21 = require("obsidian"); -function confirmDelete(app, message) { - return new Promise((resolve4) => { - new ConfirmModal(app, message, resolve4).open(); - }); -} -var ConfirmModal = class extends import_obsidian21.Modal { - constructor(app, message, resolve4) { - super(app); - this.resolved = false; - this.message = message; - this.resolve = resolve4; - } - onOpen() { - this.setTitle(t("common.confirm")); - this.modalEl.addClass("claudian-confirm-modal"); - this.contentEl.createEl("p", { text: this.message }); - new import_obsidian21.Setting(this.contentEl).addButton( - (btn) => btn.setButtonText(t("common.cancel")).onClick(() => this.close()) - ).addButton( - (btn) => btn.setButtonText(t("common.delete")).setWarning().onClick(() => { - this.resolved = true; - this.resolve(true); - this.close(); - }) - ); - } - onClose() { - if (!this.resolved) { - this.resolve(false); - } - this.contentEl.empty(); - } -}; - -// src/features/settings/ui/AgentSettings.ts +var import_obsidian26 = require("obsidian"); var MODEL_OPTIONS = [ { value: "inherit", label: "Inherit" }, { value: "sonnet", label: "Sonnet" }, { value: "opus", label: "Opus" }, { value: "haiku", label: "Haiku" } ]; -var AgentModal = class extends import_obsidian22.Modal { +var AgentModal = class extends import_obsidian26.Modal { constructor(app, plugin, existingAgent, onSave) { super(app); this.plugin = plugin; @@ -63736,12 +66613,12 @@ var AgentModal = class extends import_obsidian22.Modal { let toolsInput; let disallowedToolsInput; let skillsInput; - new import_obsidian22.Setting(contentEl).setName(t("settings.subagents.modal.name")).setDesc(t("settings.subagents.modal.nameDesc")).addText((text) => { + new import_obsidian26.Setting(contentEl).setName(t("settings.subagents.modal.name")).setDesc(t("settings.subagents.modal.nameDesc")).addText((text) => { var _a4; nameInput = text.inputEl; text.setValue(((_a4 = this.existingAgent) == null ? void 0 : _a4.name) || "").setPlaceholder(t("settings.subagents.modal.namePlaceholder")); }); - new import_obsidian22.Setting(contentEl).setName(t("settings.subagents.modal.description")).setDesc(t("settings.subagents.modal.descriptionDesc")).addText((text) => { + new import_obsidian26.Setting(contentEl).setName(t("settings.subagents.modal.description")).setDesc(t("settings.subagents.modal.descriptionDesc")).addText((text) => { var _a4; descInput = text.inputEl; text.setValue(((_a4 = this.existingAgent) == null ? void 0 : _a4.description) || "").setPlaceholder(t("settings.subagents.modal.descriptionPlaceholder")); @@ -63754,7 +66631,7 @@ var AgentModal = class extends import_obsidian22.Modal { if (((_c = this.existingAgent) == null ? void 0 : _c.model) && this.existingAgent.model !== "inherit" || ((_e = (_d = this.existingAgent) == null ? void 0 : _d.tools) == null ? void 0 : _e.length) || ((_g = (_f = this.existingAgent) == null ? void 0 : _f.disallowedTools) == null ? void 0 : _g.length) || ((_i = (_h = this.existingAgent) == null ? void 0 : _h.skills) == null ? void 0 : _i.length)) { details.open = true; } - new import_obsidian22.Setting(details).setName(t("settings.subagents.modal.model")).setDesc(t("settings.subagents.modal.modelDesc")).addDropdown((dropdown) => { + new import_obsidian26.Setting(details).setName(t("settings.subagents.modal.model")).setDesc(t("settings.subagents.modal.modelDesc")).addDropdown((dropdown) => { for (const opt of MODEL_OPTIONS) { dropdown.addOption(opt.value, opt.label); } @@ -63762,22 +66639,22 @@ var AgentModal = class extends import_obsidian22.Modal { modelValue = value; }); }); - new import_obsidian22.Setting(details).setName(t("settings.subagents.modal.tools")).setDesc(t("settings.subagents.modal.toolsDesc")).addText((text) => { + new import_obsidian26.Setting(details).setName(t("settings.subagents.modal.tools")).setDesc(t("settings.subagents.modal.toolsDesc")).addText((text) => { var _a4, _b2; toolsInput = text.inputEl; text.setValue(((_b2 = (_a4 = this.existingAgent) == null ? void 0 : _a4.tools) == null ? void 0 : _b2.join(", ")) || ""); }); - new import_obsidian22.Setting(details).setName(t("settings.subagents.modal.disallowedTools")).setDesc(t("settings.subagents.modal.disallowedToolsDesc")).addText((text) => { + new import_obsidian26.Setting(details).setName(t("settings.subagents.modal.disallowedTools")).setDesc(t("settings.subagents.modal.disallowedToolsDesc")).addText((text) => { var _a4, _b2; disallowedToolsInput = text.inputEl; text.setValue(((_b2 = (_a4 = this.existingAgent) == null ? void 0 : _a4.disallowedTools) == null ? void 0 : _b2.join(", ")) || ""); }); - new import_obsidian22.Setting(details).setName(t("settings.subagents.modal.skills")).setDesc(t("settings.subagents.modal.skillsDesc")).addText((text) => { + new import_obsidian26.Setting(details).setName(t("settings.subagents.modal.skills")).setDesc(t("settings.subagents.modal.skillsDesc")).addText((text) => { var _a4, _b2; skillsInput = text.inputEl; text.setValue(((_b2 = (_a4 = this.existingAgent) == null ? void 0 : _a4.skills) == null ? void 0 : _b2.join(", ")) || ""); }); - new import_obsidian22.Setting(contentEl).setName(t("settings.subagents.modal.prompt")).setDesc(t("settings.subagents.modal.promptDesc")); + new import_obsidian26.Setting(contentEl).setName(t("settings.subagents.modal.prompt")).setDesc(t("settings.subagents.modal.promptDesc")); const contentArea = contentEl.createEl("textarea", { cls: "claudian-sp-content-area", attr: { @@ -63801,17 +66678,17 @@ var AgentModal = class extends import_obsidian22.Modal { const name = nameInput.value.trim(); const nameError = validateAgentName(name); if (nameError) { - new import_obsidian22.Notice(nameError); + new import_obsidian26.Notice(nameError); return; } const description = descInput.value.trim(); if (!description) { - new import_obsidian22.Notice(t("settings.subagents.descriptionRequired")); + new import_obsidian26.Notice(t("settings.subagents.descriptionRequired")); return; } const prompt = contentArea.value; if (!prompt.trim()) { - new import_obsidian22.Notice(t("settings.subagents.promptRequired")); + new import_obsidian26.Notice(t("settings.subagents.promptRequired")); return; } const allAgents = this.plugin.agentManager.getAvailableAgents(); @@ -63822,7 +66699,7 @@ var AgentModal = class extends import_obsidian22.Modal { } ); if (duplicate) { - new import_obsidian22.Notice(t("settings.subagents.duplicateName", { name })); + new import_obsidian26.Notice(t("settings.subagents.duplicateName", { name })); return; } const parseList = (input) => { @@ -63849,7 +66726,7 @@ var AgentModal = class extends import_obsidian22.Modal { await this.onSave(agent); } catch (err) { const message = err instanceof Error ? err.message : "Unknown error"; - new import_obsidian22.Notice(t("settings.subagents.saveFailed", { message })); + new import_obsidian26.Notice(t("settings.subagents.saveFailed", { message })); return; } this.close(); @@ -63874,7 +66751,7 @@ var AgentSettings = class { cls: "claudian-settings-action-btn", attr: { "aria-label": t("common.add") } }); - (0, import_obsidian22.setIcon)(addBtn, "plus"); + (0, import_obsidian26.setIcon)(addBtn, "plus"); addBtn.addEventListener("click", () => this.openAgentModal(null)); const allAgents = this.plugin.agentManager.getAvailableAgents(); const vaultAgents = allAgents.filter((a) => a.source === "vault"); @@ -63903,13 +66780,13 @@ var AgentSettings = class { cls: "claudian-settings-action-btn", attr: { "aria-label": t("common.edit") } }); - (0, import_obsidian22.setIcon)(editBtn, "pencil"); + (0, import_obsidian26.setIcon)(editBtn, "pencil"); editBtn.addEventListener("click", () => this.openAgentModal(agent)); const deleteBtn = actionsEl.createEl("button", { cls: "claudian-settings-action-btn claudian-settings-delete-btn", attr: { "aria-label": t("common.delete") } }); - (0, import_obsidian22.setIcon)(deleteBtn, "trash-2"); + (0, import_obsidian26.setIcon)(deleteBtn, "trash-2"); deleteBtn.addEventListener("click", async () => { const confirmed = await confirmDelete( this.plugin.app, @@ -63920,7 +66797,7 @@ var AgentSettings = class { await this.deleteAgent(agent); } catch (err) { const message = err instanceof Error ? err.message : "Unknown error"; - new import_obsidian22.Notice(t("settings.subagents.deleteFailed", { message })); + new import_obsidian26.Notice(t("settings.subagents.deleteFailed", { message })); } }); } @@ -63938,7 +66815,7 @@ var AgentSettings = class { try { await this.plugin.storage.agents.delete(existing); } catch (e2) { - new import_obsidian22.Notice(t("settings.subagents.renameCleanupFailed", { name: existing.name })); + new import_obsidian26.Notice(t("settings.subagents.renameCleanupFailed", { name: existing.name })); } } try { @@ -63947,7 +66824,7 @@ var AgentSettings = class { } this.render(); const action = existing ? "updated" : "created"; - new import_obsidian22.Notice(t("settings.subagents.saved", { name: agent.name, action })); + new import_obsidian26.Notice(t("settings.subagents.saved", { name: agent.name, action })); } async deleteAgent(agent) { await this.plugin.storage.agents.delete(agent); @@ -63956,13 +66833,13 @@ var AgentSettings = class { } catch (e2) { } this.render(); - new import_obsidian22.Notice(t("settings.subagents.deleted", { name: agent.name })); + new import_obsidian26.Notice(t("settings.subagents.deleted", { name: agent.name })); } }; // src/features/settings/ui/EnvSnippetManager.ts -var import_obsidian23 = require("obsidian"); -var EnvSnippetModal = class extends import_obsidian23.Modal { +var import_obsidian27 = require("obsidian"); +var EnvSnippetModal = class extends import_obsidian27.Modal { constructor(app, plugin, snippet, onSave) { super(app); this.plugin = plugin; @@ -63991,7 +66868,7 @@ var EnvSnippetModal = class extends import_obsidian23.Modal { var _a3; const name = nameEl.value.trim(); if (!name) { - new import_obsidian23.Notice(t("settings.envSnippets.nameRequired")); + new import_obsidian27.Notice(t("settings.envSnippets.nameRequired")); return; } const contextLimits = {}; @@ -64048,19 +66925,19 @@ var EnvSnippetModal = class extends import_obsidian23.Modal { contextLimitInputs.set(modelId, input); } }; - new import_obsidian23.Setting(contentEl).setName(t("settings.envSnippets.modal.name")).setDesc(t("settings.envSnippets.modal.namePlaceholder")).addText((text) => { + new import_obsidian27.Setting(contentEl).setName(t("settings.envSnippets.modal.name")).setDesc(t("settings.envSnippets.modal.namePlaceholder")).addText((text) => { var _a3; nameEl = text.inputEl; text.setValue(((_a3 = this.snippet) == null ? void 0 : _a3.name) || ""); text.inputEl.addEventListener("keydown", handleKeyDown); }); - new import_obsidian23.Setting(contentEl).setName(t("settings.envSnippets.modal.description")).setDesc(t("settings.envSnippets.modal.descPlaceholder")).addText((text) => { + new import_obsidian27.Setting(contentEl).setName(t("settings.envSnippets.modal.description")).setDesc(t("settings.envSnippets.modal.descPlaceholder")).addText((text) => { var _a3; descEl = text.inputEl; text.setValue(((_a3 = this.snippet) == null ? void 0 : _a3.description) || ""); text.inputEl.addEventListener("keydown", handleKeyDown); }); - const envVarsSetting = new import_obsidian23.Setting(contentEl).setName(t("settings.envSnippets.modal.envVars")).setDesc(t("settings.envSnippets.modal.envVarsPlaceholder")).addTextArea((text) => { + const envVarsSetting = new import_obsidian27.Setting(contentEl).setName(t("settings.envSnippets.modal.envVars")).setDesc(t("settings.envSnippets.modal.envVarsPlaceholder")).addTextArea((text) => { var _a3, _b; envVarsEl = text.inputEl; const envVarsToShow = (_b = (_a3 = this.snippet) == null ? void 0 : _a3.envVars) != null ? _b : this.plugin.settings.environmentVariables; @@ -64105,7 +66982,7 @@ var EnvSnippetManager = class { cls: "claudian-settings-action-btn", attr: { "aria-label": t("settings.envSnippets.addBtn") } }); - (0, import_obsidian23.setIcon)(saveBtn, "plus"); + (0, import_obsidian27.setIcon)(saveBtn, "plus"); saveBtn.addEventListener("click", () => this.saveCurrentEnv()); const snippets = this.plugin.settings.envSnippets; if (snippets.length === 0) { @@ -64128,19 +67005,19 @@ var EnvSnippetManager = class { cls: "claudian-settings-action-btn", attr: { "aria-label": "Insert" } }); - (0, import_obsidian23.setIcon)(restoreBtn, "clipboard-paste"); + (0, import_obsidian27.setIcon)(restoreBtn, "clipboard-paste"); restoreBtn.addEventListener("click", async () => { try { await this.insertSnippet(snippet); } catch (e2) { - new import_obsidian23.Notice("Failed to insert snippet"); + new import_obsidian27.Notice("Failed to insert snippet"); } }); const editBtn = actionsEl.createEl("button", { cls: "claudian-settings-action-btn", attr: { "aria-label": "Edit" } }); - (0, import_obsidian23.setIcon)(editBtn, "pencil"); + (0, import_obsidian27.setIcon)(editBtn, "pencil"); editBtn.addEventListener("click", () => { this.editSnippet(snippet); }); @@ -64148,14 +67025,14 @@ var EnvSnippetManager = class { cls: "claudian-settings-action-btn claudian-settings-delete-btn", attr: { "aria-label": "Delete" } }); - (0, import_obsidian23.setIcon)(deleteBtn, "trash-2"); + (0, import_obsidian27.setIcon)(deleteBtn, "trash-2"); deleteBtn.addEventListener("click", async () => { try { if (confirm(`Delete environment snippet "${snippet.name}"?`)) { await this.deleteSnippet(snippet); } } catch (e2) { - new import_obsidian23.Notice("Failed to delete snippet"); + new import_obsidian27.Notice("Failed to delete snippet"); } }); } @@ -64169,7 +67046,7 @@ var EnvSnippetManager = class { this.plugin.settings.envSnippets.push(snippet); await this.plugin.saveSettings(); this.render(); - new import_obsidian23.Notice(`Environment snippet "${snippet.name}" saved`); + new import_obsidian27.Notice(`Environment snippet "${snippet.name}" saved`); } ); modal.open(); @@ -64206,7 +67083,7 @@ var EnvSnippetManager = class { this.plugin.settings.envSnippets[index] = updatedSnippet; await this.plugin.saveSettings(); this.render(); - new import_obsidian23.Notice(`Environment snippet "${updatedSnippet.name}" updated`); + new import_obsidian27.Notice(`Environment snippet "${updatedSnippet.name}" updated`); } } ); @@ -64216,7 +67093,7 @@ var EnvSnippetManager = class { this.plugin.settings.envSnippets = this.plugin.settings.envSnippets.filter((s) => s.id !== snippet.id); await this.plugin.saveSettings(); this.render(); - new import_obsidian23.Notice(`Environment snippet "${snippet.name}" deleted`); + new import_obsidian27.Notice(`Environment snippet "${snippet.name}" deleted`); } refresh() { this.render(); @@ -64224,11 +67101,11 @@ var EnvSnippetManager = class { }; // src/features/settings/ui/McpSettingsManager.ts -var import_obsidian26 = require("obsidian"); +var import_obsidian30 = require("obsidian"); // src/features/settings/ui/McpServerModal.ts -var import_obsidian24 = require("obsidian"); -var McpServerModal = class extends import_obsidian24.Modal { +var import_obsidian28 = require("obsidian"); +var McpServerModal = class extends import_obsidian28.Modal { constructor(app, plugin, existingServer, onSave, initialType, prefillConfig) { super(app); this.serverName = ""; @@ -64278,7 +67155,7 @@ var McpServerModal = class extends import_obsidian24.Modal { this.setTitle(this.existingServer ? "Edit MCP Server" : "Add MCP Server"); this.modalEl.addClass("claudian-mcp-modal"); const { contentEl } = this; - new import_obsidian24.Setting(contentEl).setName("Server name").setDesc("Unique identifier for this server").addText((text) => { + new import_obsidian28.Setting(contentEl).setName("Server name").setDesc("Unique identifier for this server").addText((text) => { this.nameInputEl = text.inputEl; text.setValue(this.serverName); text.setPlaceholder("my-mcp-server"); @@ -64287,7 +67164,7 @@ var McpServerModal = class extends import_obsidian24.Modal { }); text.inputEl.addEventListener("keydown", (e2) => this.handleKeyDown(e2)); }); - new import_obsidian24.Setting(contentEl).setName("Type").setDesc("Server connection type").addDropdown((dropdown) => { + new import_obsidian28.Setting(contentEl).setName("Type").setDesc("Server connection type").addDropdown((dropdown) => { dropdown.addOption("stdio", "stdio (local command)"); dropdown.addOption("sse", "sse (Server-Sent Events)"); dropdown.addOption("http", "http (HTTP endpoint)"); @@ -64299,13 +67176,13 @@ var McpServerModal = class extends import_obsidian24.Modal { }); this.typeFieldsEl = contentEl.createDiv({ cls: "claudian-mcp-type-fields" }); this.renderTypeFields(); - new import_obsidian24.Setting(contentEl).setName("Enabled").setDesc("Whether this server is active").addToggle((toggle) => { + new import_obsidian28.Setting(contentEl).setName("Enabled").setDesc("Whether this server is active").addToggle((toggle) => { toggle.setValue(this.enabled); toggle.onChange((value) => { this.enabled = value; }); }); - new import_obsidian24.Setting(contentEl).setName("Context-saving mode").setDesc("Hide tools from agent unless @-mentioned (saves context window)").addToggle((toggle) => { + new import_obsidian28.Setting(contentEl).setName("Context-saving mode").setDesc("Hide tools from agent unless @-mentioned (saves context window)").addToggle((toggle) => { toggle.setValue(this.contextSaving); toggle.onChange((value) => { this.contextSaving = value; @@ -64334,7 +67211,7 @@ var McpServerModal = class extends import_obsidian24.Modal { } renderStdioFields() { if (!this.typeFieldsEl) return; - const cmdSetting = new import_obsidian24.Setting(this.typeFieldsEl).setName("Command").setDesc("Full command with arguments"); + const cmdSetting = new import_obsidian28.Setting(this.typeFieldsEl).setName("Command").setDesc("Full command with arguments"); cmdSetting.settingEl.addClass("claudian-mcp-cmd-setting"); const cmdTextarea = cmdSetting.controlEl.createEl("textarea", { cls: "claudian-mcp-cmd-textarea" @@ -64345,7 +67222,7 @@ var McpServerModal = class extends import_obsidian24.Modal { cmdTextarea.addEventListener("input", () => { this.command = cmdTextarea.value; }); - const envSetting = new import_obsidian24.Setting(this.typeFieldsEl).setName("Environment variables").setDesc("KEY=VALUE per line (optional)"); + const envSetting = new import_obsidian28.Setting(this.typeFieldsEl).setName("Environment variables").setDesc("KEY=VALUE per line (optional)"); envSetting.settingEl.addClass("claudian-mcp-env-setting"); const envTextarea = envSetting.controlEl.createEl("textarea", { cls: "claudian-mcp-env-textarea" @@ -64359,7 +67236,7 @@ var McpServerModal = class extends import_obsidian24.Modal { } renderUrlFields() { if (!this.typeFieldsEl) return; - new import_obsidian24.Setting(this.typeFieldsEl).setName("URL").setDesc(this.serverType === "sse" ? "SSE endpoint URL" : "HTTP endpoint URL").addText((text) => { + new import_obsidian28.Setting(this.typeFieldsEl).setName("URL").setDesc(this.serverType === "sse" ? "SSE endpoint URL" : "HTTP endpoint URL").addText((text) => { text.setValue(this.url); text.setPlaceholder("http://localhost:3000/sse"); text.onChange((value) => { @@ -64367,7 +67244,7 @@ var McpServerModal = class extends import_obsidian24.Modal { }); text.inputEl.addEventListener("keydown", (e2) => this.handleKeyDown(e2)); }); - const headersSetting = new import_obsidian24.Setting(this.typeFieldsEl).setName("Headers").setDesc("HTTP headers (KEY=VALUE per line)"); + const headersSetting = new import_obsidian28.Setting(this.typeFieldsEl).setName("Headers").setDesc("HTTP headers (KEY=VALUE per line)"); headersSetting.settingEl.addClass("claudian-mcp-env-setting"); const headersTextarea = headersSetting.controlEl.createEl("textarea", { cls: "claudian-mcp-env-textarea" @@ -64392,12 +67269,12 @@ var McpServerModal = class extends import_obsidian24.Modal { var _a3, _b, _c; const name = this.serverName.trim(); if (!name) { - new import_obsidian24.Notice("Please enter a server name"); + new import_obsidian28.Notice("Please enter a server name"); (_a3 = this.nameInputEl) == null ? void 0 : _a3.focus(); return; } if (!/^[a-zA-Z0-9._-]+$/.test(name)) { - new import_obsidian24.Notice("Server name can only contain letters, numbers, dots, hyphens, and underscores"); + new import_obsidian28.Notice("Server name can only contain letters, numbers, dots, hyphens, and underscores"); (_b = this.nameInputEl) == null ? void 0 : _b.focus(); return; } @@ -64405,7 +67282,7 @@ var McpServerModal = class extends import_obsidian24.Modal { if (this.serverType === "stdio") { const fullCommand = this.command.trim(); if (!fullCommand) { - new import_obsidian24.Notice("Please enter a command"); + new import_obsidian28.Notice("Please enter a command"); return; } const { cmd, args } = parseCommand(fullCommand); @@ -64421,7 +67298,7 @@ var McpServerModal = class extends import_obsidian24.Modal { } else { const url2 = this.url.trim(); if (!url2) { - new import_obsidian24.Notice("Please enter a URL"); + new import_obsidian28.Notice("Please enter a URL"); return; } if (this.serverType === "sse") { @@ -64476,7 +67353,7 @@ var McpServerModal = class extends import_obsidian24.Modal { }; // src/features/settings/ui/McpTestModal.ts -var import_obsidian25 = require("obsidian"); +var import_obsidian29 = require("obsidian"); function formatToggleError(error48) { if (!(error48 instanceof Error)) return "Failed to update tool setting"; const msg = error48.message.toLowerCase(); @@ -64491,7 +67368,7 @@ function formatToggleError(error48) { } return error48.message || "Failed to update tool setting"; } -var McpTestModal = class extends import_obsidian25.Modal { +var McpTestModal = class extends import_obsidian29.Modal { constructor(app, serverName, initialDisabledTools, onToolToggle, onBulkToggle) { super(app); this.result = null; @@ -64544,10 +67421,10 @@ var McpTestModal = class extends import_obsidian25.Modal { const statusEl = this.contentEl_.createDiv({ cls: "claudian-mcp-test-status" }); const iconEl = statusEl.createSpan({ cls: "claudian-mcp-test-icon" }); if (this.result.success) { - (0, import_obsidian25.setIcon)(iconEl, "check-circle"); + (0, import_obsidian29.setIcon)(iconEl, "check-circle"); iconEl.addClass("success"); } else { - (0, import_obsidian25.setIcon)(iconEl, "x-circle"); + (0, import_obsidian29.setIcon)(iconEl, "x-circle"); iconEl.addClass("error"); } const textEl = statusEl.createSpan({ cls: "claudian-mcp-test-text" }); @@ -64599,7 +67476,7 @@ var McpTestModal = class extends import_obsidian25.Modal { const toolEl = container.createDiv({ cls: "claudian-mcp-test-tool" }); const headerEl = toolEl.createDiv({ cls: "claudian-mcp-test-tool-header" }); const iconEl = headerEl.createSpan({ cls: "claudian-mcp-test-tool-icon" }); - (0, import_obsidian25.setIcon)(iconEl, "wrench"); + (0, import_obsidian29.setIcon)(iconEl, "wrench"); const nameEl = headerEl.createSpan({ cls: "claudian-mcp-test-tool-name" }); nameEl.setText(tool.name); const toggleEl = headerEl.createDiv({ cls: "claudian-mcp-test-tool-toggle" }); @@ -64657,7 +67534,7 @@ var McpTestModal = class extends import_obsidian25.Modal { container.toggleClass("is-enabled", !wasDisabled); this.updateToolState(toolEl, !wasDisabled); this.updateToggleAllButton(); - new import_obsidian25.Notice(formatToggleError(error48)); + new import_obsidian29.Notice(formatToggleError(error48)); } finally { checkbox.disabled = false; } @@ -64712,7 +67589,7 @@ var McpTestModal = class extends import_obsidian25.Modal { this.updateToolState(toolEl, isEnabled); } this.updateToggleAllButton(); - new import_obsidian25.Notice(formatToggleError(error48)); + new import_obsidian29.Notice(formatToggleError(error48)); } for (const { checkbox } of this.toolToggles.values()) { checkbox.disabled = false; @@ -64759,24 +67636,24 @@ var McpSettingsManager = class { cls: "claudian-settings-action-btn", attr: { "aria-label": "Add" } }); - (0, import_obsidian26.setIcon)(addBtn, "plus"); + (0, import_obsidian30.setIcon)(addBtn, "plus"); const dropdown = addContainer.createDiv({ cls: "claudian-mcp-add-dropdown" }); const stdioOption = dropdown.createDiv({ cls: "claudian-mcp-add-option" }); - (0, import_obsidian26.setIcon)(stdioOption.createSpan({ cls: "claudian-mcp-add-option-icon" }), "terminal"); + (0, import_obsidian30.setIcon)(stdioOption.createSpan({ cls: "claudian-mcp-add-option-icon" }), "terminal"); stdioOption.createSpan({ text: "stdio (local command)" }); stdioOption.addEventListener("click", () => { dropdown.removeClass("is-visible"); this.openModal(null, "stdio"); }); const httpOption = dropdown.createDiv({ cls: "claudian-mcp-add-option" }); - (0, import_obsidian26.setIcon)(httpOption.createSpan({ cls: "claudian-mcp-add-option-icon" }), "globe"); + (0, import_obsidian30.setIcon)(httpOption.createSpan({ cls: "claudian-mcp-add-option-icon" }), "globe"); httpOption.createSpan({ text: "http / sse (remote)" }); httpOption.addEventListener("click", () => { dropdown.removeClass("is-visible"); this.openModal(null, "http"); }); const importOption = dropdown.createDiv({ cls: "claudian-mcp-add-option" }); - (0, import_obsidian26.setIcon)(importOption.createSpan({ cls: "claudian-mcp-add-option-icon" }), "clipboard-paste"); + (0, import_obsidian30.setIcon)(importOption.createSpan({ cls: "claudian-mcp-add-option-icon" }), "clipboard-paste"); importOption.createSpan({ text: "Import from clipboard" }); importOption.addEventListener("click", () => { dropdown.removeClass("is-visible"); @@ -64831,25 +67708,25 @@ var McpSettingsManager = class { cls: "claudian-mcp-action-btn", attr: { "aria-label": "Verify (show tools)" } }); - (0, import_obsidian26.setIcon)(testBtn, "zap"); + (0, import_obsidian30.setIcon)(testBtn, "zap"); testBtn.addEventListener("click", () => this.testServer(server)); const toggleBtn = actionsEl.createEl("button", { cls: "claudian-mcp-action-btn", attr: { "aria-label": server.enabled ? "Disable" : "Enable" } }); - (0, import_obsidian26.setIcon)(toggleBtn, server.enabled ? "toggle-right" : "toggle-left"); + (0, import_obsidian30.setIcon)(toggleBtn, server.enabled ? "toggle-right" : "toggle-left"); toggleBtn.addEventListener("click", () => this.toggleServer(server)); const editBtn = actionsEl.createEl("button", { cls: "claudian-mcp-action-btn", attr: { "aria-label": "Edit" } }); - (0, import_obsidian26.setIcon)(editBtn, "pencil"); + (0, import_obsidian30.setIcon)(editBtn, "pencil"); editBtn.addEventListener("click", () => this.openModal(server)); const deleteBtn = actionsEl.createEl("button", { cls: "claudian-mcp-action-btn claudian-mcp-delete-btn", attr: { "aria-label": "Delete" } }); - (0, import_obsidian26.setIcon)(deleteBtn, "trash-2"); + (0, import_obsidian30.setIcon)(deleteBtn, "trash-2"); deleteBtn.addEventListener("click", () => this.deleteServer(server)); } async testServer(server) { @@ -64885,7 +67762,7 @@ var McpSettingsManager = class { try { await this.broadcastMcpReloadToAllViews(); } catch (e2) { - new import_obsidian26.Notice("Setting saved but reload failed. Changes will apply on next session."); + new import_obsidian30.Notice("Setting saved but reload failed. Changes will apply on next session."); } } async updateDisabledTool(server, toolName, enabled) { @@ -64934,12 +67811,12 @@ var McpSettingsManager = class { try { const text = await navigator.clipboard.readText(); if (!text.trim()) { - new import_obsidian26.Notice("Clipboard is empty"); + new import_obsidian30.Notice("Clipboard is empty"); return; } const parsed = McpStorage.tryParseClipboardConfig(text); if (!parsed || parsed.servers.length === 0) { - new import_obsidian26.Notice("No valid MCP configuration found in clipboard"); + new import_obsidian30.Notice("No valid MCP configuration found in clipboard"); return; } if (parsed.needsName || parsed.servers.length === 1) { @@ -64958,13 +67835,13 @@ var McpSettingsManager = class { ); modal.open(); if (parsed.needsName) { - new import_obsidian26.Notice("Enter a name for the server"); + new import_obsidian30.Notice("Enter a name for the server"); } return; } await this.importServers(parsed.servers); } catch (e2) { - new import_obsidian26.Notice("Failed to read clipboard"); + new import_obsidian30.Notice("Failed to read clipboard"); } } async saveServer(server, existing) { @@ -64974,7 +67851,7 @@ var McpSettingsManager = class { if (server.name !== existing.name) { const conflict = this.servers.find((s) => s.name === server.name); if (conflict) { - new import_obsidian26.Notice(`Server "${server.name}" already exists`); + new import_obsidian30.Notice(`Server "${server.name}" already exists`); return; } } @@ -64983,7 +67860,7 @@ var McpSettingsManager = class { } else { const conflict = this.servers.find((s) => s.name === server.name); if (conflict) { - new import_obsidian26.Notice(`Server "${server.name}" already exists`); + new import_obsidian30.Notice(`Server "${server.name}" already exists`); return; } this.servers.push(server); @@ -64991,7 +67868,7 @@ var McpSettingsManager = class { await this.plugin.storage.mcp.save(this.servers); await this.broadcastMcpReloadToAllViews(); this.render(); - new import_obsidian26.Notice(existing ? `MCP server "${server.name}" updated` : `MCP server "${server.name}" added`); + new import_obsidian30.Notice(existing ? `MCP server "${server.name}" updated` : `MCP server "${server.name}" added`); } async importServers(servers) { const added = []; @@ -65016,7 +67893,7 @@ var McpSettingsManager = class { added.push(name); } if (added.length === 0) { - new import_obsidian26.Notice("No new MCP servers imported"); + new import_obsidian30.Notice("No new MCP servers imported"); return; } await this.plugin.storage.mcp.save(this.servers); @@ -65026,14 +67903,14 @@ var McpSettingsManager = class { if (skipped.length > 0) { message += ` (${skipped.length} skipped)`; } - new import_obsidian26.Notice(message); + new import_obsidian30.Notice(message); } async toggleServer(server) { server.enabled = !server.enabled; await this.plugin.storage.mcp.save(this.servers); await this.broadcastMcpReloadToAllViews(); this.render(); - new import_obsidian26.Notice(`MCP server "${server.name}" ${server.enabled ? "enabled" : "disabled"}`); + new import_obsidian30.Notice(`MCP server "${server.name}" ${server.enabled ? "enabled" : "disabled"}`); } async deleteServer(server) { if (!confirm(`Delete MCP server "${server.name}"?`)) { @@ -65043,7 +67920,7 @@ var McpSettingsManager = class { await this.plugin.storage.mcp.save(this.servers); await this.broadcastMcpReloadToAllViews(); this.render(); - new import_obsidian26.Notice(`MCP server "${server.name}" deleted`); + new import_obsidian30.Notice(`MCP server "${server.name}" deleted`); } /** Refresh the server list (call after external changes). */ refresh() { @@ -65052,7 +67929,7 @@ var McpSettingsManager = class { }; // src/features/settings/ui/PluginSettingsManager.ts -var import_obsidian27 = require("obsidian"); +var import_obsidian31 = require("obsidian"); var PluginSettingsManager = class { constructor(containerEl, plugin) { this.containerEl = containerEl; @@ -65067,7 +67944,7 @@ var PluginSettingsManager = class { cls: "claudian-settings-action-btn", attr: { "aria-label": "Refresh" } }); - (0, import_obsidian27.setIcon)(refreshBtn, "refresh-cw"); + (0, import_obsidian31.setIcon)(refreshBtn, "refresh-cw"); refreshBtn.addEventListener("click", () => this.refreshPlugins()); const plugins = this.plugin.pluginManager.getPlugins(); if (plugins.length === 0) { @@ -65113,7 +67990,7 @@ var PluginSettingsManager = class { cls: "claudian-plugin-action-btn", attr: { "aria-label": plugin.enabled ? "Disable" : "Enable" } }); - (0, import_obsidian27.setIcon)(toggleBtn, plugin.enabled ? "toggle-right" : "toggle-left"); + (0, import_obsidian31.setIcon)(toggleBtn, plugin.enabled ? "toggle-right" : "toggle-left"); toggleBtn.addEventListener("click", () => this.togglePlugin(plugin.id)); } async togglePlugin(pluginId) { @@ -65133,14 +68010,14 @@ var PluginSettingsManager = class { } ); } catch (e2) { - new import_obsidian27.Notice("Plugin toggled, but some tabs failed to restart."); + new import_obsidian31.Notice("Plugin toggled, but some tabs failed to restart."); } } - new import_obsidian27.Notice(`Plugin "${pluginId}" ${wasEnabled ? "disabled" : "enabled"}`); + new import_obsidian31.Notice(`Plugin "${pluginId}" ${wasEnabled ? "disabled" : "enabled"}`); } catch (err) { await this.plugin.pluginManager.togglePlugin(pluginId); const message = err instanceof Error ? err.message : "Unknown error"; - new import_obsidian27.Notice(`Failed to toggle plugin: ${message}`); + new import_obsidian31.Notice(`Failed to toggle plugin: ${message}`); } finally { this.render(); } @@ -65149,10 +68026,10 @@ var PluginSettingsManager = class { try { await this.plugin.pluginManager.loadPlugins(); await this.plugin.agentManager.loadAgents(); - new import_obsidian27.Notice("Plugin list refreshed"); + new import_obsidian31.Notice("Plugin list refreshed"); } catch (err) { const message = err instanceof Error ? err.message : "Unknown error"; - new import_obsidian27.Notice(`Failed to refresh plugins: ${message}`); + new import_obsidian31.Notice(`Failed to refresh plugins: ${message}`); } finally { this.render(); } @@ -65163,7 +68040,7 @@ var PluginSettingsManager = class { }; // src/features/settings/ui/SlashCommandSettings.ts -var import_obsidian28 = require("obsidian"); +var import_obsidian32 = require("obsidian"); function resolveAllowedTools(inputValue, parsedTools) { const trimmed = inputValue.trim(); if (trimmed) { @@ -65174,7 +68051,7 @@ function resolveAllowedTools(inputValue, parsedTools) { } return void 0; } -var SlashCommandModal = class extends import_obsidian28.Modal { +var SlashCommandModal = class extends import_obsidian32.Modal { constructor(app, plugin, existingCmd, onSave) { super(app); this.plugin = plugin; @@ -65208,7 +68085,7 @@ var SlashCommandModal = class extends import_obsidian28.Modal { disableUserToggle.setValue(false); } }; - new import_obsidian28.Setting(contentEl).setName("Type").setDesc("Command or skill").addDropdown((dropdown) => { + new import_obsidian32.Setting(contentEl).setName("Type").setDesc("Command or skill").addDropdown((dropdown) => { dropdown.addOption("command", "Command").addOption("skill", "Skill").setValue(selectedType).onChange((value) => { selectedType = value; this.setTitle(this.existingCmd ? `Edit ${typeLabel()}` : `Add ${typeLabel()}`); @@ -65218,12 +68095,12 @@ var SlashCommandModal = class extends import_obsidian28.Modal { dropdown.setDisabled(true); } }); - new import_obsidian28.Setting(contentEl).setName("Command name").setDesc('The name used after / (e.g., "review" for /review)').addText((text) => { + new import_obsidian32.Setting(contentEl).setName("Command name").setDesc('The name used after / (e.g., "review" for /review)').addText((text) => { var _a4; nameInput = text.inputEl; text.setValue(((_a4 = this.existingCmd) == null ? void 0 : _a4.name) || "").setPlaceholder("review-code"); }); - new import_obsidian28.Setting(contentEl).setName("Description").setDesc("Optional description shown in dropdown").addText((text) => { + new import_obsidian32.Setting(contentEl).setName("Description").setDesc("Optional description shown in dropdown").addText((text) => { var _a4; descInput = text.inputEl; text.setValue(((_a4 = this.existingCmd) == null ? void 0 : _a4.description) || ""); @@ -65236,46 +68113,46 @@ var SlashCommandModal = class extends import_obsidian28.Modal { if (((_f = this.existingCmd) == null ? void 0 : _f.argumentHint) || ((_g = this.existingCmd) == null ? void 0 : _g.model) || ((_i = (_h = this.existingCmd) == null ? void 0 : _h.allowedTools) == null ? void 0 : _i.length) || ((_j = this.existingCmd) == null ? void 0 : _j.disableModelInvocation) || ((_k = this.existingCmd) == null ? void 0 : _k.userInvocable) === false || ((_l = this.existingCmd) == null ? void 0 : _l.context) || ((_m = this.existingCmd) == null ? void 0 : _m.agent)) { details.open = true; } - new import_obsidian28.Setting(details).setName("Argument hint").setDesc('Placeholder text for arguments (e.g., "[file] [focus]")').addText((text) => { + new import_obsidian32.Setting(details).setName("Argument hint").setDesc('Placeholder text for arguments (e.g., "[file] [focus]")').addText((text) => { var _a4; hintInput = text.inputEl; text.setValue(((_a4 = this.existingCmd) == null ? void 0 : _a4.argumentHint) || ""); }); - new import_obsidian28.Setting(details).setName("Model override").setDesc("Optional model to use for this command").addText((text) => { + new import_obsidian32.Setting(details).setName("Model override").setDesc("Optional model to use for this command").addText((text) => { var _a4; modelInput = text.inputEl; text.setValue(((_a4 = this.existingCmd) == null ? void 0 : _a4.model) || "").setPlaceholder("claude-sonnet-4-5"); }); - new import_obsidian28.Setting(details).setName("Allowed tools").setDesc("Comma-separated list of tools to allow (empty = all)").addText((text) => { + new import_obsidian32.Setting(details).setName("Allowed tools").setDesc("Comma-separated list of tools to allow (empty = all)").addText((text) => { var _a4, _b2; toolsInput = text.inputEl; text.setValue(((_b2 = (_a4 = this.existingCmd) == null ? void 0 : _a4.allowedTools) == null ? void 0 : _b2.join(", ")) || ""); }); - new import_obsidian28.Setting(details).setName("Disable model invocation").setDesc("Prevent the model from invoking this command itself").addToggle((toggle) => { + new import_obsidian32.Setting(details).setName("Disable model invocation").setDesc("Prevent the model from invoking this command itself").addToggle((toggle) => { toggle.setValue(disableModelToggle).onChange((value) => { disableModelToggle = value; }); }); - disableUserSetting = new import_obsidian28.Setting(details).setName("Disable user invocation").setDesc("Prevent the user from invoking this skill directly").addToggle((toggle) => { + disableUserSetting = new import_obsidian32.Setting(details).setName("Disable user invocation").setDesc("Prevent the user from invoking this skill directly").addToggle((toggle) => { disableUserToggle = toggle; toggle.setValue(disableUserInvocation).onChange((value) => { disableUserInvocation = value; }); }); updateSkillOnlyFields(); - new import_obsidian28.Setting(details).setName("Context").setDesc("Run in a subagent (fork)").addToggle((toggle) => { + new import_obsidian32.Setting(details).setName("Context").setDesc("Run in a subagent (fork)").addToggle((toggle) => { toggle.setValue(contextValue === "fork").onChange((value) => { contextValue = value ? "fork" : ""; agentSetting.settingEl.style.display = value ? "" : "none"; }); }); - const agentSetting = new import_obsidian28.Setting(details).setName("Agent").setDesc("Subagent type when context is fork").addText((text) => { + const agentSetting = new import_obsidian32.Setting(details).setName("Agent").setDesc("Subagent type when context is fork").addText((text) => { var _a4; agentInput = text.inputEl; text.setValue(((_a4 = this.existingCmd) == null ? void 0 : _a4.agent) || "").setPlaceholder("code-reviewer"); }); agentSetting.settingEl.style.display = contextValue === "fork" ? "" : "none"; - new import_obsidian28.Setting(contentEl).setName("Prompt template").setDesc("Use $ARGUMENTS, $1, $2, @file, !`bash`"); + new import_obsidian32.Setting(contentEl).setName("Prompt template").setDesc("Use $ARGUMENTS, $1, $2, @file, !`bash`"); const contentArea = contentEl.createEl("textarea", { cls: "claudian-sp-content-area", attr: { @@ -65300,12 +68177,12 @@ var SlashCommandModal = class extends import_obsidian28.Modal { const name = nameInput.value.trim(); const nameError = validateCommandName(name); if (nameError) { - new import_obsidian28.Notice(nameError); + new import_obsidian32.Notice(nameError); return; } const content = contentArea.value; if (!content.trim()) { - new import_obsidian28.Notice("Prompt template is required"); + new import_obsidian32.Notice("Prompt template is required"); return; } const existing = this.plugin.settings.slashCommands.find( @@ -65315,7 +68192,7 @@ var SlashCommandModal = class extends import_obsidian28.Modal { } ); if (existing) { - new import_obsidian28.Notice(`A command named "/${name}" already exists`); + new import_obsidian32.Notice(`A command named "/${name}" already exists`); return; } const parsed = parseSlashCommandContent(content); @@ -65326,7 +68203,7 @@ var SlashCommandModal = class extends import_obsidian28.Modal { id, name, description: descInput.value.trim() || parsed.description || void 0, - argumentHint: hintInput.value.trim() || parsed.argumentHint || void 0, + argumentHint: normalizeArgumentHint(hintInput.value.trim()) || parsed.argumentHint || void 0, model: modelInput.value.trim() || parsed.model || void 0, allowedTools: resolveAllowedTools(toolsInput.value, parsed.allowedTools), content: promptContent, @@ -65340,7 +68217,7 @@ var SlashCommandModal = class extends import_obsidian28.Modal { await this.onSave(cmd); } catch (e2) { const label = isSkillType ? "skill" : "slash command"; - new import_obsidian28.Notice(`Failed to save ${label}`); + new import_obsidian32.Notice(`Failed to save ${label}`); return; } this.close(); @@ -65372,7 +68249,7 @@ var SlashCommandSettings = class { cls: "claudian-settings-action-btn", attr: { "aria-label": "Add" } }); - (0, import_obsidian28.setIcon)(addBtn, "plus"); + (0, import_obsidian32.setIcon)(addBtn, "plus"); addBtn.addEventListener("click", () => this.openCommandModal(null)); const commands = this.plugin.settings.slashCommands; if (commands.length === 0) { @@ -65407,19 +68284,19 @@ var SlashCommandSettings = class { cls: "claudian-settings-action-btn", attr: { "aria-label": "Edit" } }); - (0, import_obsidian28.setIcon)(editBtn, "pencil"); + (0, import_obsidian32.setIcon)(editBtn, "pencil"); editBtn.addEventListener("click", () => this.openCommandModal(cmd)); if (!isSkill(cmd)) { const convertBtn = actionsEl.createEl("button", { cls: "claudian-settings-action-btn", attr: { "aria-label": "Convert to skill" } }); - (0, import_obsidian28.setIcon)(convertBtn, "package"); + (0, import_obsidian32.setIcon)(convertBtn, "package"); convertBtn.addEventListener("click", async () => { try { await this.transformToSkill(cmd); } catch (e2) { - new import_obsidian28.Notice("Failed to convert to skill"); + new import_obsidian32.Notice("Failed to convert to skill"); } }); } @@ -65427,13 +68304,13 @@ var SlashCommandSettings = class { cls: "claudian-settings-action-btn claudian-settings-delete-btn", attr: { "aria-label": "Delete" } }); - (0, import_obsidian28.setIcon)(deleteBtn, "trash-2"); + (0, import_obsidian32.setIcon)(deleteBtn, "trash-2"); deleteBtn.addEventListener("click", async () => { try { await this.deleteCommand(cmd); } catch (e2) { const label = isSkill(cmd) ? "skill" : "slash command"; - new import_obsidian28.Notice(`Failed to delete ${label}`); + new import_obsidian32.Notice(`Failed to delete ${label}`); } }); } @@ -65459,14 +68336,14 @@ var SlashCommandSettings = class { await this.reloadCommands(); this.render(); const label = isSkill(cmd) ? "Skill" : "Slash command"; - new import_obsidian28.Notice(`${label} "/${cmd.name}" ${existing ? "updated" : "created"}`); + new import_obsidian32.Notice(`${label} "/${cmd.name}" ${existing ? "updated" : "created"}`); } async deleteCommand(cmd) { await this.storageFor(cmd).delete(cmd.id); await this.reloadCommands(); this.render(); const label = isSkill(cmd) ? "Skill" : "Slash command"; - new import_obsidian28.Notice(`${label} "/${cmd.name}" deleted`); + new import_obsidian32.Notice(`${label} "/${cmd.name}" deleted`); } async transformToSkill(cmd) { const skillName = cmd.name.toLowerCase().replace(/[^a-z0-9-]/g, "-").slice(0, 64); @@ -65474,7 +68351,7 @@ var SlashCommandSettings = class { (c3) => isSkill(c3) && c3.name === skillName ); if (existingSkill) { - new import_obsidian28.Notice(`A skill named "/${skillName}" already exists`); + new import_obsidian32.Notice(`A skill named "/${skillName}" already exists`); return; } const description = cmd.description || extractFirstParagraph(cmd.content); @@ -65489,7 +68366,7 @@ var SlashCommandSettings = class { await this.plugin.storage.commands.delete(cmd.id); await this.reloadCommands(); this.render(); - new import_obsidian28.Notice(`Converted "/${cmd.name}" to skill`); + new import_obsidian32.Notice(`Converted "/${cmd.name}" to skill`); } async reloadCommands() { this.plugin.settings.slashCommands = await this.plugin.storage.loadAllSlashCommands(); @@ -65542,7 +68419,7 @@ function addHotkeySettingRow(containerEl, app, commandId, translationPrefix) { } item.addEventListener("click", () => openHotkeySettings(app)); } -var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { +var ClaudianSettingTab = class extends import_obsidian33.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.contextLimitsContainer = null; @@ -65553,7 +68430,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { containerEl.empty(); containerEl.addClass("claudian-settings"); setLocale(this.plugin.settings.locale); - new import_obsidian29.Setting(containerEl).setName(t("settings.language.name")).setDesc(t("settings.language.desc")).addDropdown((dropdown) => { + new import_obsidian33.Setting(containerEl).setName(t("settings.language.name")).setDesc(t("settings.language.desc")).addDropdown((dropdown) => { const locales = getAvailableLocales(); for (const locale of locales) { dropdown.addOption(locale, getLocaleDisplayName(locale)); @@ -65568,15 +68445,15 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { this.display(); }); }); - new import_obsidian29.Setting(containerEl).setName(t("settings.customization")).setHeading(); - new import_obsidian29.Setting(containerEl).setName(t("settings.userName.name")).setDesc(t("settings.userName.desc")).addText((text) => { + new import_obsidian33.Setting(containerEl).setName(t("settings.customization")).setHeading(); + new import_obsidian33.Setting(containerEl).setName(t("settings.userName.name")).setDesc(t("settings.userName.desc")).addText((text) => { text.setPlaceholder(t("settings.userName.name")).setValue(this.plugin.settings.userName).onChange(async (value) => { this.plugin.settings.userName = value; await this.plugin.saveSettings(); }); text.inputEl.addEventListener("blur", () => this.restartServiceForPromptChange()); }); - new import_obsidian29.Setting(containerEl).setName(t("settings.excludedTags.name")).setDesc(t("settings.excludedTags.desc")).addTextArea((text) => { + new import_obsidian33.Setting(containerEl).setName(t("settings.excludedTags.name")).setDesc(t("settings.excludedTags.desc")).addTextArea((text) => { text.setPlaceholder("system\nprivate\ndraft").setValue(this.plugin.settings.excludedTags.join("\n")).onChange(async (value) => { this.plugin.settings.excludedTags = value.split(/\r?\n/).map((s) => s.trim().replace(/^#/, "")).filter((s) => s.length > 0); await this.plugin.saveSettings(); @@ -65584,7 +68461,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { text.inputEl.rows = 4; text.inputEl.cols = 30; }); - new import_obsidian29.Setting(containerEl).setName(t("settings.mediaFolder.name")).setDesc(t("settings.mediaFolder.desc")).addText((text) => { + new import_obsidian33.Setting(containerEl).setName(t("settings.mediaFolder.name")).setDesc(t("settings.mediaFolder.desc")).addText((text) => { text.setPlaceholder("attachments").setValue(this.plugin.settings.mediaFolder).onChange(async (value) => { this.plugin.settings.mediaFolder = value.trim(); await this.plugin.saveSettings(); @@ -65592,7 +68469,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { text.inputEl.addClass("claudian-settings-media-input"); text.inputEl.addEventListener("blur", () => this.restartServiceForPromptChange()); }); - new import_obsidian29.Setting(containerEl).setName(t("settings.systemPrompt.name")).setDesc(t("settings.systemPrompt.desc")).addTextArea((text) => { + new import_obsidian33.Setting(containerEl).setName(t("settings.systemPrompt.name")).setDesc(t("settings.systemPrompt.desc")).addTextArea((text) => { text.setPlaceholder(t("settings.systemPrompt.name")).setValue(this.plugin.settings.systemPrompt).onChange(async (value) => { this.plugin.settings.systemPrompt = value; await this.plugin.saveSettings(); @@ -65601,7 +68478,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { text.inputEl.cols = 50; text.inputEl.addEventListener("blur", () => this.restartServiceForPromptChange()); }); - new import_obsidian29.Setting(containerEl).setName(t("settings.enableAutoScroll.name")).setDesc(t("settings.enableAutoScroll.desc")).addToggle( + new import_obsidian33.Setting(containerEl).setName(t("settings.enableAutoScroll.name")).setDesc(t("settings.enableAutoScroll.desc")).addToggle( (toggle) => { var _a3; return toggle.setValue((_a3 = this.plugin.settings.enableAutoScroll) != null ? _a3 : true).onChange(async (value) => { @@ -65610,7 +68487,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { }); } ); - new import_obsidian29.Setting(containerEl).setName(t("settings.autoTitle.name")).setDesc(t("settings.autoTitle.desc")).addToggle( + new import_obsidian33.Setting(containerEl).setName(t("settings.autoTitle.name")).setDesc(t("settings.autoTitle.desc")).addToggle( (toggle) => toggle.setValue(this.plugin.settings.enableAutoTitleGeneration).onChange(async (value) => { this.plugin.settings.enableAutoTitleGeneration = value; await this.plugin.saveSettings(); @@ -65618,7 +68495,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { }) ); if (this.plugin.settings.enableAutoTitleGeneration) { - new import_obsidian29.Setting(containerEl).setName(t("settings.titleModel.name")).setDesc(t("settings.titleModel.desc")).addDropdown((dropdown) => { + new import_obsidian33.Setting(containerEl).setName(t("settings.titleModel.name")).setDesc(t("settings.titleModel.desc")).addDropdown((dropdown) => { dropdown.addOption("", t("settings.titleModel.auto")); const envVars = parseEnvironmentVariables(this.plugin.settings.environmentVariables); const customModels = getModelsFromEnvironment(envVars); @@ -65632,7 +68509,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { }); }); } - new import_obsidian29.Setting(containerEl).setName(t("settings.navMappings.name")).setDesc(t("settings.navMappings.desc")).addTextArea((text) => { + new import_obsidian33.Setting(containerEl).setName(t("settings.navMappings.name")).setDesc(t("settings.navMappings.desc")).addTextArea((text) => { let pendingValue = buildNavMappingText(this.plugin.settings.keyboardNavigation); let saveTimeout = null; const commitValue = async (showError) => { @@ -65643,7 +68520,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { const result = parseNavMappings(pendingValue); if (!result.settings) { if (showError) { - new import_obsidian29.Notice(`${t("common.error")}: ${result.error}`); + new import_obsidian33.Notice(`${t("common.error")}: ${result.error}`); pendingValue = buildNavMappingText(this.plugin.settings.keyboardNavigation); text.setValue(pendingValue); } @@ -65673,7 +68550,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { await commitValue(true); }); }); - new import_obsidian29.Setting(containerEl).setName(t("settings.tabBarPosition.name")).setDesc(t("settings.tabBarPosition.desc")).addDropdown((dropdown) => { + new import_obsidian33.Setting(containerEl).setName(t("settings.tabBarPosition.name")).setDesc(t("settings.tabBarPosition.desc")).addDropdown((dropdown) => { var _a3; dropdown.addOption("input", t("settings.tabBarPosition.input")).addOption("header", t("settings.tabBarPosition.header")).setValue((_a3 = this.plugin.settings.tabBarPosition) != null ? _a3 : "input").onChange(async (value) => { this.plugin.settings.tabBarPosition = value; @@ -65685,20 +68562,20 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { } }); }); - new import_obsidian29.Setting(containerEl).setName(t("settings.openInMainTab.name")).setDesc(t("settings.openInMainTab.desc")).addToggle( + new import_obsidian33.Setting(containerEl).setName(t("settings.openInMainTab.name")).setDesc(t("settings.openInMainTab.desc")).addToggle( (toggle) => toggle.setValue(this.plugin.settings.openInMainTab).onChange(async (value) => { this.plugin.settings.openInMainTab = value; await this.plugin.saveSettings(); }) ); - new import_obsidian29.Setting(containerEl).setName(t("settings.hotkeys")).setHeading(); + new import_obsidian33.Setting(containerEl).setName(t("settings.hotkeys")).setHeading(); const hotkeyGrid = containerEl.createDiv({ cls: "claudian-hotkey-grid" }); addHotkeySettingRow(hotkeyGrid, this.app, "claudian:inline-edit", "settings.inlineEditHotkey"); addHotkeySettingRow(hotkeyGrid, this.app, "claudian:open-view", "settings.openChatHotkey"); addHotkeySettingRow(hotkeyGrid, this.app, "claudian:new-session", "settings.newSessionHotkey"); addHotkeySettingRow(hotkeyGrid, this.app, "claudian:new-tab", "settings.newTabHotkey"); addHotkeySettingRow(hotkeyGrid, this.app, "claudian:close-current-tab", "settings.closeTabHotkey"); - new import_obsidian29.Setting(containerEl).setName(t("settings.slashCommands.name")).setHeading(); + new import_obsidian33.Setting(containerEl).setName(t("settings.slashCommands.name")).setHeading(); const slashCommandsDesc = containerEl.createDiv({ cls: "claudian-sp-settings-desc" }); const descP = slashCommandsDesc.createEl("p", { cls: "setting-item-description" }); descP.appendText(t("settings.slashCommands.desc") + " "); @@ -65708,7 +68585,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { }); const slashCommandsContainer = containerEl.createDiv({ cls: "claudian-slash-commands-container" }); new SlashCommandSettings(slashCommandsContainer, this.plugin); - new import_obsidian29.Setting(containerEl).setName(t("settings.hiddenSlashCommands.name")).setDesc(t("settings.hiddenSlashCommands.desc")).addTextArea((text) => { + new import_obsidian33.Setting(containerEl).setName(t("settings.hiddenSlashCommands.name")).setDesc(t("settings.hiddenSlashCommands.desc")).addTextArea((text) => { text.setPlaceholder(t("settings.hiddenSlashCommands.placeholder")).setValue((this.plugin.settings.hiddenSlashCommands || []).join("\n")).onChange(async (value) => { var _a3; this.plugin.settings.hiddenSlashCommands = value.split(/\r?\n/).map((s) => s.trim().replace(/^\//, "")).filter((s) => s.length > 0); @@ -65718,7 +68595,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { text.inputEl.rows = 4; text.inputEl.cols = 30; }); - new import_obsidian29.Setting(containerEl).setName(t("settings.subagents.name")).setHeading(); + new import_obsidian33.Setting(containerEl).setName(t("settings.subagents.name")).setHeading(); const agentsDesc = containerEl.createDiv({ cls: "claudian-sp-settings-desc" }); agentsDesc.createEl("p", { text: t("settings.subagents.desc"), @@ -65726,7 +68603,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { }); const agentsContainer = containerEl.createDiv({ cls: "claudian-agents-container" }); new AgentSettings(agentsContainer, this.plugin); - new import_obsidian29.Setting(containerEl).setName(t("settings.mcpServers.name")).setHeading(); + new import_obsidian33.Setting(containerEl).setName(t("settings.mcpServers.name")).setHeading(); const mcpDesc = containerEl.createDiv({ cls: "claudian-mcp-settings-desc" }); mcpDesc.createEl("p", { text: t("settings.mcpServers.desc"), @@ -65734,7 +68611,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { }); const mcpContainer = containerEl.createDiv({ cls: "claudian-mcp-container" }); new McpSettingsManager(mcpContainer, this.plugin); - new import_obsidian29.Setting(containerEl).setName(t("settings.plugins.name")).setHeading(); + new import_obsidian33.Setting(containerEl).setName(t("settings.plugins.name")).setHeading(); const pluginsDesc = containerEl.createDiv({ cls: "claudian-plugin-settings-desc" }); pluginsDesc.createEl("p", { text: t("settings.plugins.desc"), @@ -65742,14 +68619,14 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { }); const pluginsContainer = containerEl.createDiv({ cls: "claudian-plugins-container" }); new PluginSettingsManager(pluginsContainer, this.plugin); - new import_obsidian29.Setting(containerEl).setName(t("settings.safety")).setHeading(); - new import_obsidian29.Setting(containerEl).setName(t("settings.loadUserSettings.name")).setDesc(t("settings.loadUserSettings.desc")).addToggle( + new import_obsidian33.Setting(containerEl).setName(t("settings.safety")).setHeading(); + new import_obsidian33.Setting(containerEl).setName(t("settings.loadUserSettings.name")).setDesc(t("settings.loadUserSettings.desc")).addToggle( (toggle) => toggle.setValue(this.plugin.settings.loadUserClaudeSettings).onChange(async (value) => { this.plugin.settings.loadUserClaudeSettings = value; await this.plugin.saveSettings(); }) ); - new import_obsidian29.Setting(containerEl).setName(t("settings.enableBlocklist.name")).setDesc(t("settings.enableBlocklist.desc")).addToggle( + new import_obsidian33.Setting(containerEl).setName(t("settings.enableBlocklist.name")).setDesc(t("settings.enableBlocklist.desc")).addToggle( (toggle) => toggle.setValue(this.plugin.settings.enableBlocklist).onChange(async (value) => { this.plugin.settings.enableBlocklist = value; await this.plugin.saveSettings(); @@ -65758,7 +68635,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { const platformKey = getCurrentPlatformKey(); const isWindows2 = platformKey === "windows"; const platformLabel = isWindows2 ? "Windows" : "Unix"; - new import_obsidian29.Setting(containerEl).setName(t("settings.blockedCommands.name", { platform: platformLabel })).setDesc(t("settings.blockedCommands.desc", { platform: platformLabel })).addTextArea((text) => { + new import_obsidian33.Setting(containerEl).setName(t("settings.blockedCommands.name", { platform: platformLabel })).setDesc(t("settings.blockedCommands.desc", { platform: platformLabel })).addTextArea((text) => { const placeholder = isWindows2 ? "del /s /q\nrd /s /q\nRemove-Item -Recurse -Force" : "rm -rf\nchmod 777\nmkfs"; text.setPlaceholder(placeholder).setValue(this.plugin.settings.blockedCommands[platformKey].join("\n")).onChange(async (value) => { this.plugin.settings.blockedCommands[platformKey] = value.split(/\r?\n/).map((s) => s.trim()).filter((s) => s.length > 0); @@ -65768,7 +68645,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { text.inputEl.cols = 40; }); if (isWindows2) { - new import_obsidian29.Setting(containerEl).setName(t("settings.blockedCommands.unixName")).setDesc(t("settings.blockedCommands.unixDesc")).addTextArea((text) => { + new import_obsidian33.Setting(containerEl).setName(t("settings.blockedCommands.unixName")).setDesc(t("settings.blockedCommands.unixDesc")).addTextArea((text) => { text.setPlaceholder("rm -rf\nchmod 777\nmkfs").setValue(this.plugin.settings.blockedCommands.unix.join("\n")).onChange(async (value) => { this.plugin.settings.blockedCommands.unix = value.split(/\r?\n/).map((s) => s.trim()).filter((s) => s.length > 0); await this.plugin.saveSettings(); @@ -65777,7 +68654,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { text.inputEl.cols = 40; }); } - new import_obsidian29.Setting(containerEl).setName(t("settings.exportPaths.name")).setDesc(t("settings.exportPaths.desc")).addTextArea((text) => { + new import_obsidian33.Setting(containerEl).setName(t("settings.exportPaths.name")).setDesc(t("settings.exportPaths.desc")).addTextArea((text) => { const placeholder = process.platform === "win32" ? "~/Desktop\n~/Downloads\n%TEMP%" : "~/Desktop\n~/Downloads\n/tmp"; text.setPlaceholder(placeholder).setValue(this.plugin.settings.allowedExportPaths.join("\n")).onChange(async (value) => { this.plugin.settings.allowedExportPaths = value.split(/\r?\n/).map((s) => s.trim()).filter((s) => s.length > 0); @@ -65787,8 +68664,8 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { text.inputEl.cols = 40; text.inputEl.addEventListener("blur", () => this.restartServiceForPromptChange()); }); - new import_obsidian29.Setting(containerEl).setName(t("settings.environment")).setHeading(); - new import_obsidian29.Setting(containerEl).setName(t("settings.customVariables.name")).setDesc(t("settings.customVariables.desc")).addTextArea((text) => { + new import_obsidian33.Setting(containerEl).setName(t("settings.environment")).setHeading(); + new import_obsidian33.Setting(containerEl).setName(t("settings.customVariables.name")).setDesc(t("settings.customVariables.desc")).addTextArea((text) => { text.setPlaceholder("ANTHROPIC_API_KEY=your-key\nANTHROPIC_BASE_URL=https://api.example.com\nANTHROPIC_MODEL=custom-model").setValue(this.plugin.settings.environmentVariables); text.inputEl.rows = 6; text.inputEl.cols = 50; @@ -65804,8 +68681,8 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { new EnvSnippetManager(envSnippetsContainer, this.plugin, () => { this.renderContextLimitsSection(); }); - new import_obsidian29.Setting(containerEl).setName(t("settings.advanced")).setHeading(); - new import_obsidian29.Setting(containerEl).setName(t("settings.show1MModel.name")).setDesc(t("settings.show1MModel.desc")).addToggle( + new import_obsidian33.Setting(containerEl).setName(t("settings.advanced")).setHeading(); + new import_obsidian33.Setting(containerEl).setName(t("settings.show1MModel.name")).setDesc(t("settings.show1MModel.desc")).addToggle( (toggle) => { var _a3; return toggle.setValue((_a3 = this.plugin.settings.show1MModel) != null ? _a3 : false).onChange(async (value) => { @@ -65817,7 +68694,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { }); } ); - new import_obsidian29.Setting(containerEl).setName(t("settings.enableChrome.name")).setDesc(t("settings.enableChrome.desc")).addToggle( + new import_obsidian33.Setting(containerEl).setName(t("settings.enableChrome.name")).setDesc(t("settings.enableChrome.desc")).addToggle( (toggle) => { var _a3; return toggle.setValue((_a3 = this.plugin.settings.enableChrome) != null ? _a3 : false).onChange(async (value) => { @@ -65826,7 +68703,33 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { }); } ); - const maxTabsSetting = new import_obsidian29.Setting(containerEl).setName(t("settings.maxTabs.name")).setDesc(t("settings.maxTabs.desc")); + new import_obsidian33.Setting(containerEl).setName(t("settings.enableBangBash.name")).setDesc(t("settings.enableBangBash.desc")).addToggle( + (toggle) => { + var _a3; + return toggle.setValue((_a3 = this.plugin.settings.enableBangBash) != null ? _a3 : false).onChange(async (value) => { + bangBashValidationEl.style.display = "none"; + if (value) { + const enhancedPath = getEnhancedPath(); + const nodePath = findNodeExecutable(enhancedPath); + if (!nodePath) { + bangBashValidationEl.setText(t("settings.enableBangBash.validation.noNode")); + bangBashValidationEl.style.display = "block"; + toggle.setValue(false); + return; + } + } + this.plugin.settings.enableBangBash = value; + await this.plugin.saveSettings(); + }); + } + ); + const bangBashValidationEl = containerEl.createDiv({ cls: "claudian-bang-bash-validation" }); + bangBashValidationEl.style.color = "var(--text-error)"; + bangBashValidationEl.style.fontSize = "0.85em"; + bangBashValidationEl.style.marginTop = "-0.5em"; + bangBashValidationEl.style.marginBottom = "0.5em"; + bangBashValidationEl.style.display = "none"; + const maxTabsSetting = new import_obsidian33.Setting(containerEl).setName(t("settings.maxTabs.name")).setDesc(t("settings.maxTabs.desc")); const maxTabsWarningEl = containerEl.createDiv({ cls: "claudian-max-tabs-warning" }); maxTabsWarningEl.style.color = "var(--text-warning)"; maxTabsWarningEl.style.fontSize = "0.85em"; @@ -65849,7 +68752,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { const hostnameKey = getHostnameKey(); const platformDesc = process.platform === "win32" ? t("settings.cliPath.descWindows") : t("settings.cliPath.descUnix"); const cliPathDescription = `${t("settings.cliPath.desc")} ${platformDesc}`; - const cliPathSetting = new import_obsidian29.Setting(containerEl).setName(`${t("settings.cliPath.name")} (${hostnameKey})`).setDesc(cliPathDescription); + const cliPathSetting = new import_obsidian33.Setting(containerEl).setName(`${t("settings.cliPath.name")} (${hostnameKey})`).setDesc(cliPathDescription); const validationEl = containerEl.createDiv({ cls: "claudian-cli-path-validation" }); validationEl.style.color = "var(--text-error)"; validationEl.style.fontSize = "0.85em"; @@ -65860,10 +68763,10 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { const trimmed = value.trim(); if (!trimmed) return null; const expandedPath = expandHomePath(trimmed); - if (!fs7.existsSync(expandedPath)) { + if (!fs8.existsSync(expandedPath)) { return t("settings.cliPath.validation.notExist"); } - const stat = fs7.statSync(expandedPath); + const stat = fs8.statSync(expandedPath); if (!stat.isFile()) { return t("settings.cliPath.validation.isDirectory"); } @@ -65975,7 +68878,7 @@ var ClaudianSettingTab = class extends import_obsidian29.PluginSettingTab { }; // src/utils/claudeCli.ts -var fs8 = __toESM(require("fs")); +var fs9 = __toESM(require("fs")); var ClaudeCliResolver = class { constructor() { this.resolvedPath = null; @@ -66018,8 +68921,8 @@ function resolveClaudeCliPath(hostnamePath, legacyPath, envText) { if (trimmedHostname) { try { const expandedPath = expandHomePath(trimmedHostname); - if (fs8.existsSync(expandedPath)) { - const stat = fs8.statSync(expandedPath); + if (fs9.existsSync(expandedPath)) { + const stat = fs9.statSync(expandedPath); if (stat.isFile()) { return expandedPath; } @@ -66031,8 +68934,8 @@ function resolveClaudeCliPath(hostnamePath, legacyPath, envText) { if (trimmedLegacy) { try { const expandedPath = expandHomePath(trimmedLegacy); - if (fs8.existsSync(expandedPath)) { - const stat = fs8.statSync(expandedPath); + if (fs9.existsSync(expandedPath)) { + const stat = fs9.statSync(expandedPath); if (stat.isFile()) { return expandedPath; } @@ -66046,15 +68949,15 @@ function resolveClaudeCliPath(hostnamePath, legacyPath, envText) { // src/utils/sdkSession.ts var import_fs3 = require("fs"); -var fs9 = __toESM(require("fs/promises")); -var os5 = __toESM(require("os")); -var path9 = __toESM(require("path")); +var fs10 = __toESM(require("fs/promises")); +var os6 = __toESM(require("os")); +var path10 = __toESM(require("path")); function encodeVaultPathForSDK(vaultPath) { - const absolutePath = path9.resolve(vaultPath); + const absolutePath = path10.resolve(vaultPath); return absolutePath.replace(/[^a-zA-Z0-9]/g, "-"); } function getSDKProjectsPath() { - return path9.join(os5.homedir(), ".claude", "projects"); + return path10.join(os6.homedir(), ".claude", "projects"); } function isValidSessionId(sessionId) { if (!sessionId || sessionId.length === 0 || sessionId.length > 128) { @@ -66071,7 +68974,7 @@ function getSDKSessionPath(vaultPath, sessionId) { } const projectsPath = getSDKProjectsPath(); const encodedVault = encodeVaultPathForSDK(vaultPath); - return path9.join(projectsPath, encodedVault, `${sessionId}.jsonl`); + return path10.join(projectsPath, encodedVault, `${sessionId}.jsonl`); } function sdkSessionExists(vaultPath, sessionId) { try { @@ -66085,7 +68988,7 @@ async function deleteSDKSession(vaultPath, sessionId) { try { const sessionPath = getSDKSessionPath(vaultPath, sessionId); if (!(0, import_fs3.existsSync)(sessionPath)) return; - await fs9.unlink(sessionPath); + await fs10.unlink(sessionPath); } catch (e2) { } } @@ -66095,7 +68998,7 @@ async function readSDKSession(vaultPath, sessionId) { if (!(0, import_fs3.existsSync)(sessionPath)) { return { messages: [], skippedLines: 0 }; } - const content = await fs9.readFile(sessionPath, "utf-8"); + const content = await fs10.readFile(sessionPath, "utf-8"); const lines = content.split("\n").filter((line) => line.trim()); const messages = []; let skippedLines = 0; @@ -66230,10 +69133,10 @@ function parseSDKMessageToChat(sdkMsg, toolResults) { const hasImages = images && images.length > 0; if (!textContent && !hasToolUse && !hasImages && (!content || typeof content === "string")) return null; const timestamp = sdkMsg.timestamp ? new Date(sdkMsg.timestamp).getTime() : Date.now(); - const isCompactCommand = sdkMsg.type === "user" && textContent.includes("/compact"); + const commandNameMatch = sdkMsg.type === "user" ? textContent.match(/(\/[^<]+)<\/command-name>/) : null; let displayContent; if (sdkMsg.type === "user") { - displayContent = isCompactCommand ? "/compact" : extractDisplayContent(textContent); + displayContent = commandNameMatch ? commandNameMatch[1] : extractDisplayContent(textContent); } const isInterrupt = sdkMsg.type === "user" && (textContent === "[Request interrupted by user]" || textContent === "[Request interrupted by user for tool use]" || textContent.includes("") && textContent.includes("Compaction canceled")); const isRebuiltContext = sdkMsg.type === "user" && isRebuiltContextContent(textContent); @@ -66246,6 +69149,8 @@ function parseSDKMessageToChat(sdkMsg, toolResults) { toolCalls: sdkMsg.type === "assistant" ? extractToolCalls(content, toolResults) : void 0, contentBlocks: sdkMsg.type === "assistant" ? mapContentBlocks(content) : void 0, images, + ...sdkMsg.type === "user" && sdkMsg.uuid && { sdkUserUuid: sdkMsg.uuid }, + ...sdkMsg.type === "assistant" && sdkMsg.uuid && { sdkAssistantUuid: sdkMsg.uuid }, ...isInterrupt && { isInterrupt: true }, ...isRebuiltContext && { isRebuiltContext: true } }; @@ -66291,13 +69196,101 @@ function isSystemInjectedMessage(sdkMsg) { } const text = extractTextContent((_a3 = sdkMsg.message) == null ? void 0 : _a3.content); if (!text) return false; - if (text.includes("/compact")) return false; + if (text.includes("") && text.includes("")) return false; if (text.includes("") && text.includes("Compaction canceled")) return false; if (text.startsWith("This session is being continued from a previous conversation")) return true; if (text.includes("")) return true; if (text.includes("") || text.includes("")) return true; return false; } +function filterActiveBranch(entries, resumeSessionAt) { + if (entries.length === 0) return []; + const seen = /* @__PURE__ */ new Set(); + const deduped = []; + for (const entry of entries) { + if (entry.uuid) { + if (seen.has(entry.uuid)) continue; + seen.add(entry.uuid); + } + deduped.push(entry); + } + const byUuid = /* @__PURE__ */ new Map(); + const childrenOf = /* @__PURE__ */ new Map(); + for (const entry of deduped) { + if (entry.uuid) { + byUuid.set(entry.uuid, entry); + } + if (entry.parentUuid && entry.uuid) { + let children = childrenOf.get(entry.parentUuid); + if (!children) { + children = /* @__PURE__ */ new Set(); + childrenOf.set(entry.parentUuid, children); + } + children.add(entry.uuid); + } + } + const hasBranching = [...childrenOf.values()].some((children) => children.size > 1); + let leaf; + if (hasBranching) { + for (let i2 = deduped.length - 1; i2 >= 0; i2--) { + const uuid3 = deduped[i2].uuid; + if (uuid3 && !childrenOf.has(uuid3)) { + leaf = deduped[i2]; + break; + } + } + if (resumeSessionAt && (leaf == null ? void 0 : leaf.uuid) && byUuid.has(resumeSessionAt)) { + let current2 = leaf; + while (current2 == null ? void 0 : current2.uuid) { + if (current2.uuid === resumeSessionAt) { + leaf = current2; + break; + } + if (current2.parentUuid) { + current2 = byUuid.get(current2.parentUuid); + } else { + break; + } + } + } + } else if (resumeSessionAt) { + leaf = byUuid.get(resumeSessionAt); + } else { + return deduped; + } + if (!leaf || !leaf.uuid) return deduped; + const activeUuids = /* @__PURE__ */ new Set(); + let current = leaf; + while (current == null ? void 0 : current.uuid) { + activeUuids.add(current.uuid); + if (current.parentUuid) { + current = byUuid.get(current.parentUuid); + } else { + break; + } + } + const n2 = deduped.length; + const prevIsActive = new Array(n2); + const nextIsActive = new Array(n2); + let lastPrevActive = false; + for (let i2 = 0; i2 < n2; i2++) { + if (deduped[i2].uuid) { + lastPrevActive = activeUuids.has(deduped[i2].uuid); + } + prevIsActive[i2] = lastPrevActive; + } + let lastNextActive = false; + for (let i2 = n2 - 1; i2 >= 0; i2--) { + if (deduped[i2].uuid) { + lastNextActive = activeUuids.has(deduped[i2].uuid); + } + nextIsActive[i2] = lastNextActive; + } + return deduped.filter((entry, idx) => { + if (entry.uuid) return activeUuids.has(entry.uuid); + return prevIsActive[idx] && nextIsActive[idx]; + }); +} function mergeAssistantMessage(target, source) { if (source.content) { if (target.content) { @@ -66312,23 +69305,22 @@ function mergeAssistantMessage(target, source) { if (source.contentBlocks) { target.contentBlocks = [...target.contentBlocks || [], ...source.contentBlocks]; } + if (source.sdkAssistantUuid) { + target.sdkAssistantUuid = source.sdkAssistantUuid; + } } -async function loadSDKSessionMessages(vaultPath, sessionId) { +async function loadSDKSessionMessages(vaultPath, sessionId, resumeSessionAt) { var _a3, _b; const result = await readSDKSession(vaultPath, sessionId); if (result.error) { return { messages: [], skippedLines: result.skippedLines, error: result.error }; } - const toolResults = collectToolResults(result.messages); - const toolUseResults = collectStructuredPatchResults(result.messages); + const filteredEntries = filterActiveBranch(result.messages, resumeSessionAt); + const toolResults = collectToolResults(filteredEntries); + const toolUseResults = collectStructuredPatchResults(filteredEntries); const chatMessages = []; let pendingAssistant = null; - const seenUuids = /* @__PURE__ */ new Set(); - for (const sdkMsg of result.messages) { - if (sdkMsg.uuid) { - if (seenUuids.has(sdkMsg.uuid)) continue; - seenUuids.add(sdkMsg.uuid); - } + for (const sdkMsg of filteredEntries) { if (isSystemInjectedMessage(sdkMsg)) continue; if (sdkMsg.type === "assistant" && ((_a3 = sdkMsg.message) == null ? void 0 : _a3.model) === "") continue; const chatMsg = parseSDKMessageToChat(sdkMsg, toolResults); @@ -66362,9 +69354,14 @@ async function loadSDKSessionMessages(vaultPath, sessionId) { if (msg.role !== "assistant" || !msg.toolCalls) continue; for (const toolCall of msg.toolCalls) { const toolUseResult = toolUseResults.get(toolCall.id); - if (toolUseResult && !toolCall.diffData) { + if (!toolUseResult) continue; + if (!toolCall.diffData) { toolCall.diffData = extractDiffData(toolUseResult, toolCall); } + if (toolCall.name === TOOL_ASK_USER_QUESTION) { + const answers = extractResolvedAnswers(toolUseResult); + if (answers) toolCall.resolvedAnswers = answers; + } } } } @@ -66373,7 +69370,7 @@ async function loadSDKSessionMessages(vaultPath, sessionId) { } // src/main.ts -var ClaudianPlugin = class extends import_obsidian30.Plugin { +var ClaudianPlugin = class extends import_obsidian34.Plugin { constructor() { super(...arguments); this.conversations = []; @@ -66426,7 +69423,7 @@ var ClaudianPlugin = class extends import_obsidian30.Plugin { const modal = new InlineEditModal(this.app, this, editContext, notePath); const result = await modal.openAndWait(); if (result.decision === "accept" && result.editedText !== void 0) { - new import_obsidian30.Notice(editContext.mode === "cursor" ? "Inserted" : "Edit applied"); + new import_obsidian34.Notice(editContext.mode === "cursor" ? "Inserted" : "Edit applied"); } } }); @@ -66512,7 +69509,7 @@ var ClaudianPlugin = class extends import_obsidian30.Plugin { } /** Loads settings and conversations from persistent storage. */ async loadSettings() { - var _a3, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o; + var _a3, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q2; this.storage = new StorageService(this); const { claudian } = await this.storage.initialize(); const slashCommands = await this.storage.loadAllSlashCommands(); @@ -66521,6 +69518,9 @@ var ClaudianPlugin = class extends import_obsidian30.Plugin { ...claudian, slashCommands }; + if (this.settings.permissionMode === "plan") { + this.settings.permissionMode = "normal"; + } (_b = (_a3 = this.settings).claudeCliPathsByHost) != null ? _b : _a3.claudeCliPathsByHost = {}; const hostname4 = getHostnameKey(); let didMigrateCliPath = false; @@ -66559,6 +69559,8 @@ var ClaudianPlugin = class extends import_obsidian30.Plugin { } conversation.previousSdkSessionIds = (_n = meta3.previousSdkSessionIds) != null ? _n : conversation.previousSdkSessionIds; conversation.legacyCutoffAt = (_o = meta3.legacyCutoffAt) != null ? _o : conversation.legacyCutoffAt; + conversation.resumeSessionAt = (_p = meta3.resumeSessionAt) != null ? _p : conversation.resumeSessionAt; + conversation.forkSource = (_q2 = meta3.forkSource) != null ? _q2 : conversation.forkSource; } const nativeMetadata = await this.storage.sessions.listNativeMetadata(); const nativeConversations = nativeMetadata.filter((meta3) => !legacyIds.has(meta3.id)).map((meta3) => { @@ -66582,8 +69584,10 @@ var ClaudianPlugin = class extends import_obsidian30.Plugin { titleGenerationStatus: meta3.titleGenerationStatus, legacyCutoffAt: meta3.legacyCutoffAt, isNative: true, - subagentData: meta3.subagentData + subagentData: meta3.subagentData, // Preserve for applying to loaded messages + resumeSessionAt: meta3.resumeSessionAt, + forkSource: meta3.forkSource }; }); this.conversations = [...legacyConversations, ...nativeConversations].sort( @@ -66593,7 +69597,7 @@ var ClaudianPlugin = class extends import_obsidian30.Plugin { } ); if (failedCount > 0) { - new import_obsidian30.Notice(`Failed to load ${failedCount} conversation${failedCount > 1 ? "s" : ""}`); + new import_obsidian34.Notice(`Failed to load ${failedCount} conversation${failedCount > 1 ? "s" : ""}`); } setLocale(this.settings.locale); const backfilledConversations = this.backfillConversationResponseTimestamps(); @@ -66694,12 +69698,12 @@ var ClaudianPlugin = class extends import_obsidian30.Plugin { } } if (failedTabs > 0) { - new import_obsidian30.Notice(`Environment changes applied, but ${failedTabs} tab(s) failed to restart.`); + new import_obsidian34.Notice(`Environment changes applied, but ${failedTabs} tab(s) failed to restart.`); } } view == null ? void 0 : view.refreshModelSelector(); const noticeText = changed ? "Environment variables applied. Sessions will be rebuilt on next message." : "Environment variables applied."; - new import_obsidian30.Notice(noticeText); + new import_obsidian34.Notice(noticeText); } /** Returns the runtime environment variables (fixed at plugin load). */ getActiveEnvironmentVariables() { @@ -66788,12 +69792,17 @@ var ClaudianPlugin = class extends import_obsidian30.Plugin { } return firstUserMsg.content.substring(0, 50) + (firstUserMsg.content.length > 50 ? "..." : ""); } + /** Fork has no owned session yet; still referencing the source session for resume. */ + isPendingFork(conversation) { + return !!conversation.forkSource && !conversation.sdkSessionId && !conversation.sessionId; + } async loadSdkMessagesForConversation(conversation) { - var _a3; + var _a3, _b; if (!conversation.isNative || conversation.sdkMessagesLoaded) return; const vaultPath = getVaultPath(this.app); if (!vaultPath) return; - const allSessionIds = [ + const isPendingFork = this.isPendingFork(conversation); + const allSessionIds = isPendingFork ? [conversation.forkSource.sessionId] : [ ...conversation.previousSdkSessionIds || [], (_a3 = conversation.sdkSessionId) != null ? _a3 : conversation.sessionId ].filter((id) => !!id); @@ -66802,12 +69811,19 @@ var ClaudianPlugin = class extends import_obsidian30.Plugin { let missingSessionCount = 0; let errorCount = 0; let successCount = 0; + const currentSessionId = isPendingFork ? conversation.forkSource.sessionId : (_b = conversation.sdkSessionId) != null ? _b : conversation.sessionId; for (const sessionId of allSessionIds) { if (!sdkSessionExists(vaultPath, sessionId)) { missingSessionCount++; continue; } - const result = await loadSDKSessionMessages(vaultPath, sessionId); + const isCurrentSession = sessionId === currentSessionId; + const truncateAt = isCurrentSession ? isPendingFork ? conversation.forkSource.resumeAt : conversation.resumeSessionAt : void 0; + const result = await loadSDKSessionMessages( + vaultPath, + sessionId, + truncateAt + ); if (result.error) { errorCount++; continue; @@ -66970,7 +69986,8 @@ var ClaudianPlugin = class extends import_obsidian30.Plugin { * For native sessions, saves metadata only (SDK handles messages including images). * For legacy sessions, saves full JSONL. * - * Image data is cleared from memory after save (SDK/JSONL has persisted it). + * Image data is cleared from memory after save (SDK/JSONL has persisted it), + * except for pending fork conversations whose images aren't yet in SDK storage. */ async updateConversation(id, updates) { const conversation = this.conversations.find((c3) => c3.id === id); @@ -66983,10 +70000,12 @@ var ClaudianPlugin = class extends import_obsidian30.Plugin { } else { await this.storage.sessions.saveConversation(conversation); } - for (const msg of conversation.messages) { - if (msg.images) { - for (const img of msg.images) { - img.data = ""; + if (!this.isPendingFork(conversation)) { + for (const msg of conversation.messages) { + if (msg.images) { + for (const img of msg.images) { + img.data = ""; + } } } } diff --git a/.obsidian/plugins/claudian/styles.css b/.obsidian/plugins/claudian/styles.css index 687fb39..fe98d10 100644 --- a/.obsidian/plugins/claudian/styles.css +++ b/.obsidian/plugins/claudian/styles.css @@ -114,17 +114,17 @@ align-items: center; } -/* Header actions (right side - always stays right via margin-left: auto) */ +/* Header actions (end side - always stays at end via margin-inline-start: auto) */ .claudian-header-actions { display: flex; align-items: center; - gap: 4px; + gap: 12px; flex-shrink: 0; - margin-left: auto; + margin-inline-start: auto; } .claudian-header-actions-slot { - /* No margin-left: auto here; it's set by the base .claudian-header-actions */ + /* No margin-inline-start: auto here; it's set by the base .claudian-header-actions */ } .claudian-header .claudian-tab-bar-container { @@ -136,15 +136,12 @@ display: flex; align-items: center; justify-content: center; - padding: 4px; - border-radius: 4px; cursor: pointer; - color: var(--text-muted); - transition: background 0.15s ease, color 0.15s ease; + color: var(--text-faint); + transition: color 0.15s ease; } .claudian-header-btn:hover { - background: var(--background-modifier-hover); color: var(--text-normal); } @@ -241,7 +238,7 @@ display: none; position: absolute; bottom: 100%; - right: 0; + inset-inline-end: 0; margin-bottom: 4px; background: var(--background-secondary); backdrop-filter: blur(20px); @@ -321,8 +318,8 @@ .claudian-history-item.active { background: var(--background-secondary); - border-left: 2px solid var(--interactive-accent); - padding-left: 10px; + border-inline-start: 2px solid var(--interactive-accent); + padding-inline-start: 10px; } .claudian-history-item.active .claudian-history-item-icon { @@ -361,7 +358,7 @@ .claudian-history-item-actions { display: flex; gap: 4px; - margin-left: 8px; + margin-inline-start: 8px; opacity: 0; transition: opacity 0.15s ease; } @@ -479,7 +476,7 @@ position: relative; background: rgba(0, 0, 0, 0.3); align-self: flex-end; - border-bottom-right-radius: 4px; + border-end-end-radius: 4px; } /* Text selection in user messages - visible highlight */ @@ -493,14 +490,15 @@ align-self: stretch; width: 100%; max-width: 100%; - border-bottom-left-radius: 4px; - text-align: left; + border-end-start-radius: 4px; + text-align: start; } .claudian-message-content { line-height: 1.5; user-select: text; -webkit-user-select: text; + unicode-bidi: plaintext; /* Proper BiDi text handling for mixed RTL/LTR */ } .claudian-interrupted { @@ -519,17 +517,12 @@ .claudian-text-copy-btn { position: absolute; bottom: 0; - right: 0; - padding: 4px 8px; - font-size: 11px; - font-family: var(--font-monospace); - background: var(--background-primary); + inset-inline-end: 0; border: none; - color: var(--text-muted); + color: var(--text-faint); cursor: pointer; opacity: 0; - transition: opacity 0.15s ease, color 0.15s ease, background 0.15s ease; - border-radius: 3px; + transition: opacity 0.15s ease, color 0.15s ease; z-index: 2; display: flex; align-items: center; @@ -537,8 +530,8 @@ } .claudian-text-copy-btn svg { - width: 14px; - height: 14px; + width: 16px; + height: 16px; } .claudian-text-block:hover .claudian-text-copy-btn { @@ -546,13 +539,13 @@ } .claudian-text-copy-btn:hover { - background: var(--background-modifier-hover); color: var(--text-normal); } -/* Copied state - only affects color, visibility still controlled by hover */ .claudian-text-copy-btn.copied { color: var(--text-accent); + font-size: 11px; + font-family: var(--font-monospace); } .claudian-text-block+.claudian-tool-call { @@ -574,7 +567,30 @@ .claudian-message-content ul, .claudian-message-content ol { margin: 8px 0; - padding-left: 20px; + padding-inline-start: 20px; +} + +/* Full-width tables */ +.claudian-message-content table { + width: 100%; + border-collapse: collapse; + margin: 8px 0; +} + +.claudian-message-content th, +.claudian-message-content td { + border: 1px solid var(--background-modifier-border); + padding: 6px 10px; + text-align: start; +} + +.claudian-message-content th { + background: var(--background-secondary); + font-weight: 600; +} + +.claudian-message-content tr:hover { + background: var(--background-secondary-alt); } .claudian-messages::-webkit-scrollbar { @@ -606,6 +622,46 @@ font-style: italic; } +/* Action buttons toolbar below user messages */ +.claudian-user-msg-actions { + position: absolute; + bottom: -20px; + right: 0; + display: flex; + gap: 12px; + opacity: 0; + transition: opacity 0.15s; + z-index: 1; +} + +.claudian-message-user:hover .claudian-user-msg-actions { + opacity: 1; +} + +.claudian-user-msg-actions span { + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + color: var(--text-faint); + transition: color 0.15s; +} + +.claudian-user-msg-actions span svg { + width: 16px; + height: 16px; +} + +.claudian-user-msg-actions span:hover { + color: var(--text-normal); +} + +.claudian-user-msg-actions span.copied { + color: var(--text-accent); + font-size: 11px; + font-family: var(--font-monospace); +} + /* Compact boundary indicator */ .claudian-compact-boundary { display: flex; @@ -721,7 +777,7 @@ .claudian-code-wrapper .claudian-code-lang-label { position: absolute; top: 6px; - right: 6px; + inset-inline-end: 6px; padding: 2px 8px; font-size: 12px; font-family: var(--font-monospace); @@ -747,7 +803,7 @@ .claudian-code-wrapper .copy-code-button { position: absolute; top: 6px; - right: 6px; + inset-inline-end: 6px; padding: 4px 8px; font-size: 11px; background: var(--background-primary); @@ -783,7 +839,7 @@ color: var(--claudian-brand); font-style: italic; padding: 4px 0; - text-align: left; + text-align: start; animation: thinking-pulse 1.5s ease-in-out infinite; } @@ -835,14 +891,15 @@ /* Thinking block content - tree-branch style */ .claudian-thinking-content { - padding: 4px 0 4px 24px; + padding: 4px 0; + padding-inline-start: 24px; font-size: 13px; line-height: 1.5; color: var(--text-muted); max-height: 400px; overflow-y: auto; - border-left: 2px solid var(--background-modifier-border); - margin-left: 7px; + border-inline-start: 2px solid var(--background-modifier-border); + margin-inline-start: 7px; } .claudian-thinking-content p { @@ -942,18 +999,20 @@ .claudian-tool-status.status-blocked { color: var(--color-orange); } -/* Tool call content - border-left style (like thinking block) */ +/* Tool call content - border style (like thinking block) */ .claudian-tool-content { - padding: 4px 0 4px 16px; - margin-left: 7px; - border-left: 2px solid var(--background-modifier-border); + padding: 4px 0; + padding-inline-start: 16px; + margin-inline-start: 7px; + border-inline-start: 2px solid var(--background-modifier-border); } -/* TodoWrite content - no border (renders todo panel directly) */ -.claudian-tool-content-todo { - border-left: none; - margin-left: 0; - padding-left: 0; +/* Tool content variants that render inline widgets instead of bordered results */ +.claudian-tool-content-todo, +.claudian-tool-content-ask { + border-inline-start: none; + margin-inline-start: 0; + padding-inline-start: 0; } .claudian-tool-result-row { @@ -983,7 +1042,7 @@ /* Bulleted items (WebSearch) - hanging indent for wrapped lines */ .claudian-tool-result-bullet { display: block; - padding-left: 0.8em; + padding-inline-start: 0.8em; text-indent: -0.8em; margin-bottom: 2px; } @@ -1186,6 +1245,67 @@ color: var(--text-muted); } +/* Bash Output Section */ + +.claudian-status-panel-bash { + margin-bottom: 4px; +} + +.claudian-status-panel-bash-header { + padding: 4px 0; +} + +.claudian-status-panel-bash-actions { + display: flex; + align-items: center; + gap: 6px; +} + +.claudian-status-panel-bash-action { + display: inline-flex; + align-items: center; + justify-content: center; + width: 22px; + height: 22px; + border-radius: 4px; + color: var(--text-muted); +} + +.claudian-status-panel-bash-action:hover { + background: var(--background-modifier-hover); + color: var(--text-normal); +} + +.claudian-status-panel-bash-content { + padding-top: 2px; + max-height: 320px; + max-height: min(40vh, 320px); + overflow-y: auto; + overscroll-behavior: contain; +} + +.claudian-status-panel-bash-entry { + margin: 4px 0; +} + +.claudian-status-panel-bash-entry .claudian-tool-icon svg { + width: 14px; + height: 14px; + position: relative; + top: -1px; +} + +.claudian-status-panel-bash-entry .claudian-tool-call { + margin: 0; +} + +/* Keep bash output blocks from growing without bound */ +.claudian-status-panel-bash-entry .claudian-tool-result-text { + max-height: 200px; + overflow-y: auto; + word-break: break-word; +} + /* ============================================ components/subagent.css @@ -1268,11 +1388,12 @@ color: var(--color-red); } -/* Subagent content - border-left style (like thinking block) */ +/* Subagent content - border style (like thinking block) */ .claudian-subagent-content { - padding: 4px 0 4px 16px; - margin-left: 7px; - border-left: 2px solid var(--background-modifier-border); + padding: 4px 0; + padding-inline-start: 16px; + margin-inline-start: 7px; + border-inline-start: 2px solid var(--background-modifier-border); } .claudian-subagent-bullet { @@ -1280,7 +1401,7 @@ flex-shrink: 0; font-size: 12px; line-height: 1.4; - margin-right: 4px; + margin-inline-end: 4px; } .claudian-subagent-tool-item { @@ -1305,7 +1426,8 @@ .claudian-subagent-tool-result { display: flex; align-items: baseline; - padding: 2px 0 0 8px; + padding: 2px 0 0; + padding-inline-start: 8px; } .claudian-subagent-result-text { @@ -1336,8 +1458,8 @@ font-size: 11px; font-family: var(--font-monospace); color: var(--text-muted); - margin-left: auto; - padding-left: 8px; + margin-inline-start: auto; + padding-inline-start: 8px; } .claudian-subagent-list.async .claudian-subagent-icon { @@ -1390,7 +1512,7 @@ background: var(--background-primary); } -/* Context row (file chip left, selection indicator right) - inside input wrapper at top */ +/* Context row (file chip start, selection indicator end) - inside input wrapper at top */ /* Collapsed by default; expanded via .has-content class; textarea fills remaining space */ .claudian-context-row { display: none; @@ -1406,7 +1528,7 @@ display: flex; } -/* Nav row (tab badges left, header icons right) - above input wrapper */ +/* Nav row (tab badges start, header icons end) - above input wrapper */ .claudian-input-nav-row { display: flex; align-items: center; @@ -1433,7 +1555,7 @@ padding: 5px 6px; border: 1px solid transparent; border-radius: 4px; - margin-left: auto; + margin-inline-start: auto; flex-shrink: 0; } @@ -1453,6 +1575,7 @@ line-height: 1.4; box-shadow: none !important; overflow-y: auto; + unicode-bidi: plaintext; /* Proper BiDi text handling for mixed RTL/LTR */ } .claudian-input:hover, @@ -1557,6 +1680,17 @@ box-shadow: 0 0 0 1px #60a5fa; } +/* Pink border when bash mode is active */ +.claudian-input-bang-bash-mode { + border-color: #f472b6 !important; + box-shadow: 0 0 0 1px #f472b6; +} + +/* Monospace input while in bash mode */ +.claudian-input-wrapper.claudian-input-bang-bash-mode .claudian-input { + font-family: var(--font-monospace); +} + /* ============================================ components/context-footer.css @@ -1568,7 +1702,7 @@ display: flex; align-items: center; gap: 4px; - margin-left: 8px; + margin-inline-start: 8px; cursor: default; } @@ -1625,7 +1759,7 @@ font-size: 11px; color: var(--claudian-brand); min-width: 24px; - text-align: right; + text-align: end; transition: color 0.3s ease; } @@ -1824,6 +1958,11 @@ min-width: 28px; } +.claudian-permission-label.plan-active { + color: rgb(92, 148, 140); + font-weight: 600; +} + .claudian-toggle-switch { width: 32px; height: 18px; @@ -1886,20 +2025,16 @@ justify-content: center; width: 24px; height: 24px; - border-radius: 4px; - color: var(--text-muted); - opacity: 0.5; - transition: all 0.2s ease; + color: var(--text-faint); + transition: color 0.15s ease; } .claudian-external-context-icon-wrapper:hover .claudian-external-context-icon { - background: var(--background-modifier-hover); - opacity: 0.8; + color: var(--text-normal); } .claudian-external-context-icon.active { color: var(--claudian-brand); - opacity: 1; animation: external-context-glow 2s ease-in-out infinite; } @@ -2072,20 +2207,16 @@ justify-content: center; width: 24px; height: 24px; - border-radius: 4px; - color: var(--text-muted); - opacity: 0.5; - transition: all 0.2s ease; + color: var(--text-faint); + transition: color 0.15s ease; } .claudian-mcp-selector-icon-wrapper:hover .claudian-mcp-selector-icon { - background: var(--background-modifier-hover); - opacity: 0.8; + color: var(--text-normal); } .claudian-mcp-selector-icon.active { color: var(--claudian-brand); - opacity: 1; animation: mcp-glow 2s ease-in-out infinite; } @@ -2770,7 +2901,8 @@ code .claudian-file-link:hover { /* Input - fully transparent */ .claudian-inline-input { width: 100%; - padding: 4px 30px 4px 8px; + padding: 4px 8px; + padding-inline-end: 30px; border-width: 1px !important; border-style: solid !important; border-color: var(--background-modifier-border) !important; @@ -2795,10 +2927,10 @@ code .claudian-file-link:hover { opacity: 0.6; } -/* Spinner - inside input box on right */ +/* Spinner - inside input box on end side */ .claudian-inline-spinner { position: absolute; - right: 8px; + inset-inline-end: 8px; top: 50%; width: 14px; height: 14px; @@ -2852,7 +2984,7 @@ code .claudian-file-link:hover { .claudian-inline-diff-buttons { display: inline-flex; gap: 8px; - margin-left: 6px; + margin-inline-start: 6px; background: none !important; } @@ -3160,113 +3292,558 @@ code .claudian-file-link:hover { /* ============================================ - modals/approval.css + features/resume-session.css ============================================ */ -/* Approval Modal */ -.claudian-approval-modal { +/* Resume Session Dropdown */ +.claudian-resume-dropdown { + display: none; + position: absolute; + bottom: 100%; + left: 0; + right: 0; + margin-bottom: 4px; + background: var(--background-secondary); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border: 1px solid var(--background-modifier-border); + border-radius: 6px; + box-shadow: 0 -4px 16px rgba(0, 0, 0, 0.2); + z-index: 1000; + max-height: 400px; + overflow: hidden; +} + +.claudian-resume-dropdown.visible { + display: block; +} + +.claudian-resume-header { + padding: 8px 12px; + font-size: 12px; + font-weight: 600; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.5px; + border-bottom: 1px solid var(--background-modifier-border); +} + +.claudian-resume-list { + max-height: 350px; + overflow-y: auto; +} + +.claudian-resume-empty { padding: 16px; + text-align: center; + color: var(--text-muted); + font-size: 13px; } -.claudian-approval-info { - margin-bottom: 12px; +.claudian-resume-item { + display: flex; + align-items: center; + gap: 10px; + padding: 8px 12px; + cursor: pointer; + border-bottom: 1px solid var(--background-modifier-border); + transition: background 0.1s ease; } -.claudian-approval-tool { +.claudian-resume-item:last-child { + border-bottom: none; +} + +.claudian-resume-item:hover, +.claudian-resume-item.selected { + background: var(--background-modifier-hover); +} + +.claudian-resume-item.current { + background: var(--background-secondary); + border-inline-start: 2px solid var(--interactive-accent); + padding-inline-start: 10px; +} + +.claudian-resume-item-icon { + display: flex; + align-items: center; + color: var(--text-muted); + flex-shrink: 0; +} + +.claudian-resume-item-icon svg { + width: 16px; + height: 16px; +} + +.claudian-resume-item.current .claudian-resume-item-icon { + color: var(--interactive-accent); +} + +.claudian-resume-item-content { + flex: 1; + min-width: 0; +} + +.claudian-resume-item-title { + font-size: 13px; + font-weight: 500; + color: var(--text-normal); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.claudian-resume-item-date { + font-size: 11px; + color: var(--text-faint); + margin-top: 2px; +} + +/* Scrollbar */ +.claudian-resume-list::-webkit-scrollbar { + width: 6px; +} + +.claudian-resume-list::-webkit-scrollbar-track { + background: transparent; +} + +.claudian-resume-list::-webkit-scrollbar-thumb { + background: var(--background-modifier-border); + border-radius: 3px; +} + + +/* ============================================ + features/ask-user-question.css + ============================================ */ +/* AskUserQuestion - inline widget rendered in chat panel */ + +.claudian-ask-question-inline { + font-family: var(--font-monospace); + font-size: 12px; + outline: none; +} + +.claudian-ask-inline-title { + font-weight: 700; + color: var(--text-muted); + padding: 6px 10px 0; +} + +/* ── Tab bar ─────────────────────────────────── */ + +.claudian-ask-tab-bar { + display: flex; + align-items: center; + gap: 6px; + padding: 4px 10px; + border-bottom: 1px solid var(--background-modifier-border); + line-height: 1.4; +} + +.claudian-ask-tab { + display: inline-flex; + align-items: center; + padding: 2px 10px; + border-radius: 3px; + cursor: pointer; + user-select: none; + color: var(--text-muted); + transition: + background 0.15s ease, + color 0.15s ease; +} + +.claudian-ask-tab:hover { + color: var(--text-normal); +} + +.claudian-ask-tab.is-active { + background: hsla(55, 30%, 50%, 0.18); + color: var(--text-normal); +} + +.claudian-ask-tab-label { + font-weight: 600; + max-width: 14ch; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.claudian-ask-tab-tick { + color: var(--color-green); + font-weight: 700; +} + +.claudian-ask-tab-submit-check { + color: var(--color-green); + white-space: pre; +} + +/* ── Content area ────────────────────────────── */ + +.claudian-ask-content { + padding: 8px 10px; +} + +.claudian-ask-question-text { + font-weight: 700; + color: var(--text-normal); + margin-bottom: 8px; + line-height: 1.4; +} + +/* ── Item list ───────────────────────────────── */ + +.claudian-ask-list { + display: flex; + flex-direction: column; + gap: 2px; + margin-bottom: 8px; +} + +.claudian-ask-item { + display: flex; + align-items: flex-start; + padding: 3px 4px; + cursor: pointer; + line-height: 1.4; + color: var(--text-normal); + border-radius: 3px; +} + +.claudian-ask-item:hover { + background: var(--background-modifier-hover); +} + +.claudian-ask-cursor { + display: inline-block; + width: 2ch; + flex-shrink: 0; + color: var(--text-accent); + font-weight: 700; +} + +.claudian-ask-item-num { + color: var(--text-muted); + flex-shrink: 0; +} + +.claudian-ask-item-content { + display: flex; + flex-direction: column; + flex: 1; + min-width: 0; +} + +.claudian-ask-label-row { + display: flex; + align-items: baseline; +} + +.claudian-ask-item-label { + font-weight: 600; +} + +.claudian-ask-item-desc { + color: var(--text-muted); + font-weight: 400; + line-height: 1.4; + margin-top: 1px; +} + +/* Selected items: green text */ +.claudian-ask-item.is-selected .claudian-ask-item-label { + color: var(--color-green); +} + +/* Disabled items: muted text */ +.claudian-ask-item.is-disabled .claudian-ask-item-label { + color: var(--text-faint); +} + +/* ── Multi-select brackets ───────────────────── */ + +.claudian-ask-check { + color: var(--text-faint); + flex-shrink: 0; + white-space: pre; +} + +.claudian-ask-check.is-checked { + color: var(--color-green); +} + +/* ── Single-select check mark ────────────────── */ + +.claudian-ask-check-mark { + color: var(--color-green); + font-weight: 700; +} + +/* ── Custom input ────────────────────────────── */ + +.claudian-ask-item input.claudian-ask-custom-text, +.claudian-ask-item input.claudian-ask-custom-text:hover, +.claudian-ask-item input.claudian-ask-custom-text:focus { + border: none; + border-radius: 0; + background: transparent; + box-shadow: none; + font-family: var(--font-monospace); + font-size: inherit; + color: var(--text-normal); + outline: none; + padding: 0; + width: 0; + height: auto; + min-height: 0; + line-height: 1.4; + flex: 1 1 0; + min-width: 0; +} + +.claudian-ask-custom-text::placeholder { + color: var(--text-faint); +} + +/* ── Submit review tab ───────────────────────── */ + +.claudian-ask-review-title { + font-weight: 700; + color: var(--text-normal); + margin-bottom: 6px; +} + +.claudian-ask-review { + font-family: var(--font-monospace); + margin-bottom: 16px; +} + +.claudian-tool-content .claudian-ask-review { + font-size: 12px; +} + +.claudian-ask-review:last-child { + margin-bottom: 0; +} + +.claudian-ask-review-q, +.claudian-ask-review-a { + padding: 2px 4px; + border-radius: 3px; +} + +.claudian-ask-review-bullet { + color: var(--text-normal); +} + +.claudian-ask-review-q-text { + color: var(--text-muted); +} + +.claudian-ask-review-arrow { + color: var(--text-muted); + white-space: pre; +} + +.claudian-ask-review-a-text { + color: var(--text-normal); +} + +.claudian-ask-review-empty { + color: var(--text-faint); + font-style: italic; +} + +.claudian-ask-review-a { + margin-bottom: 4px; +} + +.claudian-ask-review-a:last-child { + margin-bottom: 0; +} + +.claudian-ask-review-prompt { + color: var(--text-muted); + margin-bottom: 6px; +} + +/* ── Hints ───────────────────────────────────── */ + +.claudian-ask-hints { + color: var(--text-faint); + padding-top: 6px; + border-top: 1px solid var(--background-modifier-border); +} + +/* ── Approval header (inline permission request) ── */ + +.claudian-ask-approval-info { + padding: 8px 10px; +} + +.claudian-ask-approval-tool { display: flex; align-items: center; gap: 8px; - padding: 8px 12px; + padding: 6px 10px; background: var(--background-secondary); border-radius: 6px; - margin-bottom: 12px; + margin-bottom: 8px; } -.claudian-approval-icon { +.claudian-ask-approval-icon { color: var(--claudian-brand); } -.claudian-approval-tool-name { +.claudian-ask-approval-tool-name { font-weight: 600; color: var(--text-normal); } -.claudian-approval-desc { - padding: 12px; - background: var(--background-primary-alt); - border-radius: 6px; - font-family: var(--font-monospace); - font-size: 13px; - color: var(--text-normal); - word-break: break-all; - margin-bottom: 12px; -} - -.claudian-approval-buttons { - display: flex; - gap: 8px; - justify-content: flex-end; -} - -.claudian-approval-btn { - padding: 8px 16px; - border-radius: 6px; - font-size: 14px; - font-weight: 500; - cursor: pointer; - transition: background 0.15s ease, color 0.15s ease; -} - -.claudian-deny-btn { - background: var(--background-modifier-error); - color: var(--text-on-accent); - border: none; -} - -.claudian-deny-btn:hover { - opacity: 0.9; -} - -.claudian-allow-btn { - background: var(--background-secondary); - color: var(--text-normal); - border: 1px solid var(--background-modifier-border); -} - -.claudian-allow-btn:hover { - background: var(--background-modifier-hover); -} - -.claudian-always-btn { - background: var(--claudian-brand); - color: white; - border: none; -} - -.claudian-always-btn:hover { - background: #c56a4a; -} - -.claudian-approval-reason { +.claudian-ask-approval-reason { color: var(--text-muted); - font-size: 13px; - margin-bottom: 8px; -} - -.claudian-approval-blocked-path { - font-family: var(--font-monospace); font-size: 12px; + margin-bottom: 6px; +} + +.claudian-ask-approval-blocked-path { + font-family: var(--font-monospace); + font-size: 11px; color: var(--text-muted); - padding: 4px 8px; + padding: 3px 6px; background: var(--background-primary-alt); border-radius: 4px; - margin-bottom: 8px; + margin-bottom: 6px; word-break: break-all; } -.claudian-approval-agent { +.claudian-ask-approval-agent { color: var(--text-muted); + font-size: 12px; + margin-bottom: 6px; +} + +.claudian-ask-approval-desc { + padding: 8px 10px; + background: var(--background-primary-alt); + border-radius: 6px; + font-family: var(--font-monospace); + font-size: 12px; + color: var(--text-normal); + word-break: break-all; +} + + +/* ============================================ + features/plan-mode.css + ============================================ */ +/* Plan Mode - inline cards for EnterPlanMode / ExitPlanMode */ + +.claudian-plan-approval-inline { + font-family: var(--font-monospace); + font-size: 12px; + outline: none; +} + +.claudian-plan-inline-title { + font-weight: 700; + color: var(--text-muted); + padding: 6px 10px 0; +} + +/* ── Plan content preview ────────────────────────── */ + +.claudian-plan-content-preview { + max-height: 300px; + overflow-y: auto; + margin: 6px 10px 8px; + padding: 8px 10px; + border: 1px solid var(--background-modifier-border); + border-radius: 4px; + background: var(--background-primary); + font-size: 12px; + line-height: 1.5; + color: var(--text-normal); +} + +.claudian-plan-content-preview::-webkit-scrollbar { + width: 4px; +} + +.claudian-plan-content-preview::-webkit-scrollbar-thumb { + background: var(--background-modifier-border); + border-radius: 2px; +} + +.claudian-plan-content-preview p { + margin: 0 0 6px; +} + +.claudian-plan-content-preview p:last-child { + margin-bottom: 0; +} + +.claudian-plan-content-preview h1, +.claudian-plan-content-preview h2, +.claudian-plan-content-preview h3, +.claudian-plan-content-preview h4 { + margin: 8px 0 4px; font-size: 13px; - margin-bottom: 8px; +} + +.claudian-plan-content-preview ul, +.claudian-plan-content-preview ol { + margin: 2px 0 6px; + padding-left: 18px; +} + +.claudian-plan-content-preview li { + margin: 0; +} + +.claudian-plan-content-preview code { + font-size: 11px; +} + +.claudian-plan-content-text { + white-space: pre-wrap; + word-break: break-word; + font-family: var(--font-monospace); +} + +/* ── Permissions list ──────────────────────────── */ + +.claudian-plan-permissions { + padding: 4px 10px 8px; +} + +.claudian-plan-permissions-label { + color: var(--text-muted); + font-weight: 600; + margin-bottom: 4px; +} + +.claudian-plan-permissions-list { + margin: 0; + padding-left: 18px; + color: var(--text-normal); + line-height: 1.5; +} + +.claudian-plan-permissions-list li { + margin: 0; +} + +/* ── Plan mode input border ──────────────────────── */ + +.claudian-input-wrapper.claudian-input-plan-mode { + border-color: rgb(92, 148, 140) !important; + box-shadow: 0 0 0 1px rgb(92, 148, 140); } @@ -3682,6 +4259,32 @@ code .claudian-file-link:hover { } +/* ============================================ + modals/fork-target.css + ============================================ */ +/* Fork Target Modal */ +.claudian-fork-target-modal { + max-width: 340px; +} + +.claudian-fork-target-list { + display: flex; + flex-direction: column; +} + +.claudian-fork-target-option { + padding: 10px 12px; + border-radius: 6px; + cursor: pointer; + color: var(--text-normal); + font-size: 14px; +} + +.claudian-fork-target-option:hover { + background: var(--background-modifier-hover); +} + + /* ============================================ settings/base.css ============================================ */ @@ -4703,7 +5306,6 @@ code .claudian-file-link:hover { /* outline + offset only */ .claudian-action-btn:focus-visible, -.claudian-approval-btn:focus-visible, .claudian-toggle-switch:focus-visible, .claudian-file-chip:focus-visible, .claudian-image-chip:focus-visible,