scream-code 0.9.7 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,6 +6,7 @@ const __dirname = __cjsShimDirname(__filename);
6
6
  import { a as __toESM, i as __require, r as __exportAll, t as __commonJSMin } from "./chunk-apG1qJts.mjs";
7
7
  import "./suppress-sqlite-warning-C2VB0doZ.mjs";
8
8
  import { C as join$1, D as resolve$1, E as relative$1, S as isAbsolute$1, T as parse$7, a as isSupportedFile, b as basename$1, i as ingestFile, r as ingestDirectory, t as multiSearch, w as normalize, x as dirname$2, y as KnowledgeStore } from "./src-1LHYB0xM.mjs";
9
+ import { a as setLocale, i as getLocale, n as assertScreamHostIdentity, o as t, r as createScreamDefaultHeaders, t as TextInputDialogComponent } from "./text-input-dialog-os5jWxGT.mjs";
9
10
  import { createRequire } from "node:module";
10
11
  import { createHash, randomBytes, randomInt, randomUUID } from "node:crypto";
11
12
  import Jn, { access, appendFile, chmod, copyFile, cp, lstat, mkdir, mkdtemp, open, readFile, readdir, realpath, rename, rm, rmdir, stat, unlink, writeFile } from "node:fs/promises";
@@ -27,12 +28,12 @@ import path, { basename, dirname as dirname$1, extname, isAbsolute, join, posix,
27
28
  import { z } from "zod";
28
29
  import { DatabaseSync } from "node:sqlite";
29
30
  import * as nodeOs from "node:os";
30
- import { arch, homedir, hostname, release, tmpdir, type } from "node:os";
31
+ import { homedir, tmpdir } from "node:os";
31
32
  import { EventEmitter as EventEmitter$1 } from "node:events";
32
33
  import { StringDecoder } from "node:string_decoder";
33
34
  import Pi from "assert";
34
35
  import ro from "node:assert";
35
- import { exec, execFile, execFileSync, execSync, spawn, spawnSync } from "node:child_process";
36
+ import { exec, execFile, execSync, spawn, spawnSync } from "node:child_process";
36
37
  import * as posixPath from "node:path/posix";
37
38
  import * as win32Path from "node:path/win32";
38
39
  import { createServer } from "node:http";
@@ -48,7 +49,7 @@ import { AsyncLocalStorage } from "node:async_hooks";
48
49
  import { Command, Option } from "commander";
49
50
  import { createInterface } from "node:readline/promises";
50
51
  import chalk, { chalkStderr } from "chalk";
51
- import { CombinedAutocompleteProvider, Container, Editor, Image, Input, Key, Markdown, ProcessTerminal, Spacer, TUI, Text, decodeKittyPrintable, deleteAllKittyImages, fuzzyFilter, fuzzyMatch, getCapabilities, getImageDimensions, isKeyRelease, matchesKey, truncateToWidth, visibleWidth, wrapTextWithAnsi } from "@earendil-works/pi-tui";
52
+ import { CombinedAutocompleteProvider, Container, Editor, Image, Input, Key, Markdown, ProcessTerminal, Spacer, TUI, Text, decodeKittyPrintable, deleteAllKittyImages, fuzzyFilter, fuzzyMatch, getCapabilities, getImageDimensions, isKeyRelease, matchesKey, truncateToWidth, visibleWidth, wrapTextWithAnsi } from "@liutod-scream/pi-tui";
52
53
  import { highlight, supportsLanguage } from "cli-highlight";
53
54
  import { diffWords } from "diff";
54
55
  import { promisify } from "node:util";
@@ -55817,7 +55818,7 @@ function formatBudget(value, unit) {
55817
55818
  /** Maximum objective length in characters. */
55818
55819
  const MAX_GOAL_OBJECTIVE_LENGTH = 4e3;
55819
55820
  /** Maximum number of working notes kept per goal. */
55820
- const MAX_GOAL_NOTES = 10;
55821
+ const MAX_GOAL_NOTES = 30;
55821
55822
  /** Maximum characters per note. */
55822
55823
  const MAX_NOTE_LENGTH = 200;
55823
55824
  const GOAL_CANCELLED_REMINDER = [
@@ -56049,7 +56050,7 @@ var GoalMode = class {
56049
56050
  content: trimmed,
56050
56051
  time: Date.now()
56051
56052
  });
56052
- if (state.notes.length > MAX_GOAL_NOTES) state.notes = state.notes.slice(-10);
56053
+ if (state.notes.length > MAX_GOAL_NOTES) state.notes = state.notes.slice(-30);
56053
56054
  this.persistState(state, { silent: true });
56054
56055
  return this.toSnapshot(state);
56055
56056
  }
@@ -71110,6 +71111,8 @@ const WolfPackToolInputSchema = z.object({
71110
71111
  prompt_template: z.string().min(1).describe("Prompt template with {{item}} placeholder. Each item is substituted in."),
71111
71112
  items: z.array(z.string().min(1)).min(1).describe("Array of items to process. Each item gets its own subagent.")
71112
71113
  });
71114
+ /** Default per-subagent timeout (5 minutes). */
71115
+ const DEFAULT_SUBAGENT_TIMEOUT_MS = 300 * 1e3;
71113
71116
  var WolfPackTool = class {
71114
71117
  subagentHost;
71115
71118
  isEnabled;
@@ -71123,9 +71126,11 @@ var WolfPackTool = class {
71123
71126
  this.description = typeLines ? `${wolfpack_default}\n\nAvailable agent types (pass via subagent_type):\n${typeLines}` : wolfpack_default;
71124
71127
  this.log = options?.log;
71125
71128
  this.allowedSpawns = options?.allowedSpawns;
71129
+ this.timeoutMs = options?.timeoutMs ?? DEFAULT_SUBAGENT_TIMEOUT_MS;
71126
71130
  }
71127
71131
  log;
71128
71132
  allowedSpawns;
71133
+ timeoutMs;
71129
71134
  resolveExecution(args) {
71130
71135
  return {
71131
71136
  description: `WolfPack: ${args.description} (${args.items.length} agents)`,
@@ -71145,7 +71150,7 @@ var WolfPackTool = class {
71145
71150
  async execution(args, ctx) {
71146
71151
  ctx.signal.throwIfAborted();
71147
71152
  if (!this.isEnabled()) return {
71148
- output: "WolfPack 模式未开启。请输入 /wolfpack 打开后再试。",
71153
+ output: "WolfPack mode is not enabled. Use /wolfpack to enable it first.",
71149
71154
  isError: true
71150
71155
  };
71151
71156
  const profileName = args.subagent_type ?? "coder";
@@ -71194,7 +71199,7 @@ var WolfPackTool = class {
71194
71199
  try {
71195
71200
  return {
71196
71201
  item,
71197
- result: (await handle.completion).result,
71202
+ result: (await withTimeout$1(handle.completion, this.timeoutMs, ctx.signal)).result,
71198
71203
  success: true,
71199
71204
  agentId: handle.agentId
71200
71205
  };
@@ -71216,7 +71221,7 @@ var WolfPackTool = class {
71216
71221
  const lines = [];
71217
71222
  for (const settled of completions) {
71218
71223
  if (settled.status === "fulfilled") {
71219
- const { item, result: _result, success, agentId } = settled.value;
71224
+ const { item, result, success, agentId } = settled.value;
71220
71225
  if (success) {
71221
71226
  successCount++;
71222
71227
  lines.push(`### ${item} (OK)`);
@@ -71225,6 +71230,7 @@ var WolfPackTool = class {
71225
71230
  lines.push(`### ${item} (FAILED)`);
71226
71231
  }
71227
71232
  if (agentId !== void 0) lines.push(`agent_id: ${agentId}`);
71233
+ if (result.length > 0) lines.push(result);
71228
71234
  } else {
71229
71235
  failureCount++;
71230
71236
  const msg = settled.reason instanceof Error ? settled.reason.message : String(settled.reason);
@@ -71252,6 +71258,40 @@ function filterSubagentsBySpawns(subagents, allowedSpawns) {
71252
71258
  if (allowedSpawns === void 0 || subagents === void 0) return subagents;
71253
71259
  return Object.fromEntries(Object.entries(subagents).filter(([name]) => allowedSpawns.includes(name)));
71254
71260
  }
71261
+ /**
71262
+ * Wraps a promise with a per-subagent timeout. If the parent signal aborts
71263
+ * before the timeout fires, the timeout is cleared and the parent abort
71264
+ * propagates naturally. On timeout, the returned promise rejects with a
71265
+ * descriptive error.
71266
+ */
71267
+ function withTimeout$1(promise, timeoutMs, parentSignal) {
71268
+ if (parentSignal.aborted) return Promise.reject(/* @__PURE__ */ new Error("Aborted before start"));
71269
+ return new Promise((resolve, reject) => {
71270
+ let settled = false;
71271
+ const cleanup = () => {
71272
+ if (settled) return;
71273
+ settled = true;
71274
+ clearTimeout(timer);
71275
+ parentSignal.removeEventListener("abort", onParentAbort);
71276
+ };
71277
+ const timer = setTimeout(() => {
71278
+ cleanup();
71279
+ reject(/* @__PURE__ */ new Error(`Subagent timed out after ${timeoutMs / 1e3}s`));
71280
+ }, timeoutMs);
71281
+ const onParentAbort = () => {
71282
+ cleanup();
71283
+ reject(/* @__PURE__ */ new Error("The subagent was stopped before it finished."));
71284
+ };
71285
+ parentSignal.addEventListener("abort", onParentAbort, { once: true });
71286
+ promise.then((value) => {
71287
+ cleanup();
71288
+ resolve(value);
71289
+ }, (error) => {
71290
+ cleanup();
71291
+ reject(error);
71292
+ });
71293
+ });
71294
+ }
71255
71295
  //#endregion
71256
71296
  //#region ../../packages/agent-core/src/tools/builtin/file/conflict-detect.ts
71257
71297
  /**
@@ -82703,14 +82743,21 @@ var YoloModeApprovePermissionPolicy = class {
82703
82743
  };
82704
82744
  //#endregion
82705
82745
  //#region ../../packages/agent-core/src/agent/permission/policies/wolfpack-mode-approve.ts
82746
+ /** Tools that spawn subagents and should be auto-approved when WolfPack is active. */
82747
+ const WOLFPACK_SPAWN_TOOLS = new Set([
82748
+ "WolfPack",
82749
+ "Agent",
82750
+ "FusionPlan"
82751
+ ]);
82706
82752
  var WolfPackModeApprovePermissionPolicy = class {
82707
82753
  agent;
82708
82754
  name = "wolfpack-mode-approve";
82709
82755
  constructor(agent) {
82710
82756
  this.agent = agent;
82711
82757
  }
82712
- evaluate() {
82758
+ evaluate(context) {
82713
82759
  if (!this.agent.wolfpackMode?.isActive) return;
82760
+ if (!WOLFPACK_SPAWN_TOOLS.has(context.toolCall.name)) return;
82714
82761
  return { kind: "approve" };
82715
82762
  }
82716
82763
  };
@@ -99292,6 +99339,9 @@ var Agent = class {
99292
99339
  budgetLimits = { wallClockBudgetMs: ms };
99293
99340
  }
99294
99341
  return this.goal.setBudgetLimits({ budgetLimits }, "user");
99342
+ },
99343
+ getWolfpackMode: () => {
99344
+ return this.wolfpackMode.isActive;
99295
99345
  }
99296
99346
  };
99297
99347
  }
@@ -99415,6 +99465,7 @@ var Agent = class {
99415
99465
  contextUsage,
99416
99466
  planMode: this.planMode.isActive,
99417
99467
  planStrategy: this.planMode.isActive ? this.planMode.strategy : void 0,
99468
+ wolfpackMode: this.wolfpackMode.isActive,
99418
99469
  permission: this.permission.mode,
99419
99470
  usage
99420
99471
  });
@@ -119082,6 +119133,9 @@ var SessionAPIImpl = class {
119082
119133
  setGoalBudget({ agentId, ...payload }) {
119083
119134
  return this.getAgent(agentId).setGoalBudget(payload);
119084
119135
  }
119136
+ getWolfpackMode({ agentId }) {
119137
+ return this.getAgent(agentId).getWolfpackMode({});
119138
+ }
119085
119139
  getAgent(agentId) {
119086
119140
  const agent = this.session.agents.get(agentId);
119087
119141
  if (agent === void 0) throw new ScreamError(ErrorCodes.AGENT_NOT_FOUND, `Agent "${agentId}" was not found`);
@@ -120777,6 +120831,9 @@ var ScreamCore = class {
120777
120831
  setGoalBudget({ sessionId, ...payload }) {
120778
120832
  return this.sessionApi(sessionId).setGoalBudget(payload);
120779
120833
  }
120834
+ getWolfpackMode({ sessionId, ...payload }) {
120835
+ return this.sessionApi(sessionId).getWolfpackMode(payload);
120836
+ }
120780
120837
  updateSessionMetadata({ sessionId, ...payload }) {
120781
120838
  return this.sessionApi(sessionId).updateSessionMetadata(payload);
120782
120839
  }
@@ -121067,2272 +121124,6 @@ function parsePositiveInt(value) {
121067
121124
  return n;
121068
121125
  }
121069
121126
  //#endregion
121070
- //#region ../../packages/config/dist/index.mjs
121071
- /**
121072
- * Scream host and device identity header factories.
121073
- *
121074
- * The caller owns the host identity (product name + host app version)
121075
- * and the `homeDir` where the stable device id is stored. This module
121076
- * intentionally keeps no global CLI version or environment-derived
121077
- * production state.
121078
- */
121079
- const SCREAM_CODE_PLATFORM = "scream_code_cli";
121080
- function createScreamDeviceId(homeDir, _options = {}) {
121081
- const deviceIdPath = join(homeDir, "device_id");
121082
- if (existsSync(deviceIdPath)) try {
121083
- const text = readFileSync(deviceIdPath, "utf-8").trim();
121084
- if (text.length > 0) return text;
121085
- } catch {}
121086
- const id = randomUUID();
121087
- try {
121088
- mkdirSync(homeDir, {
121089
- recursive: true,
121090
- mode: 448
121091
- });
121092
- writeFileSync(deviceIdPath, id, {
121093
- encoding: "utf-8",
121094
- mode: 384
121095
- });
121096
- } catch {}
121097
- return id;
121098
- }
121099
- function createScreamDeviceHeaders(options) {
121100
- return {
121101
- "X-Msh-Platform": SCREAM_CODE_PLATFORM,
121102
- "X-Msh-Version": requiredAsciiHeader(options.version, "Scream identity version"),
121103
- "X-Msh-Device-Name": asciiHeader(hostname()),
121104
- "X-Msh-Device-Model": asciiHeader(deviceModel()),
121105
- "X-Msh-Os-Version": asciiHeader(release()),
121106
- "X-Msh-Device-Id": createScreamDeviceId(options.homeDir)
121107
- };
121108
- }
121109
- function createScreamUserAgent(options) {
121110
- const product = requiredAsciiHeader(options.userAgentProduct, "Scream identity product");
121111
- const version = requiredAsciiHeader(options.version, "Scream identity version");
121112
- const suffix = options.userAgentSuffix === void 0 ? void 0 : asciiHeader(options.userAgentSuffix, "");
121113
- return suffix === void 0 || suffix.length === 0 ? `${product}/${version}` : `${product}/${version} (${suffix})`;
121114
- }
121115
- function createScreamDefaultHeaders(options) {
121116
- return {
121117
- "User-Agent": createScreamUserAgent(options),
121118
- ...createScreamDeviceHeaders({
121119
- homeDir: options.homeDir,
121120
- version: options.version
121121
- })
121122
- };
121123
- }
121124
- function assertScreamHostIdentity(identity) {
121125
- if (identity === void 0) throw new Error("Scream host identity is required. Pass the host product name and version.");
121126
- requiredAsciiHeader(identity.userAgentProduct, "Scream identity product");
121127
- requiredAsciiHeader(identity.version, "Scream identity version");
121128
- return identity;
121129
- }
121130
- function deviceModel() {
121131
- const os = type();
121132
- const version = release();
121133
- const osArch = arch();
121134
- if (os === "Darwin") return `macOS ${macOsProductVersion() ?? version} ${osArch}`;
121135
- if (os === "Windows_NT") return `Windows ${version} ${osArch}`;
121136
- return `${os} ${version} ${osArch}`.trim();
121137
- }
121138
- function macOsProductVersion() {
121139
- try {
121140
- const version = execFileSync("/usr/bin/sw_vers", ["-productVersion"], {
121141
- encoding: "utf-8",
121142
- timeout: 1e3
121143
- }).trim();
121144
- return version.length > 0 ? version : void 0;
121145
- } catch {
121146
- return;
121147
- }
121148
- }
121149
- function asciiHeader(value, fallback = "unknown") {
121150
- const cleaned = value.replaceAll(/[^ -~]/g, "").trim();
121151
- return cleaned.length > 0 ? cleaned : fallback;
121152
- }
121153
- function requiredAsciiHeader(value, fieldName) {
121154
- const cleaned = asciiHeader(value, "");
121155
- if (cleaned.length === 0) throw new Error(`${fieldName} must be a non-empty ASCII string.`);
121156
- return cleaned;
121157
- }
121158
- const dictionaries = {
121159
- zh: {
121160
- "status.not_set": "未设置",
121161
- "status.none": "无",
121162
- "status.model_name": "模型名称",
121163
- "status.work_dir": "工作目录",
121164
- "status.permission_mode": "权限模式",
121165
- "status.plan_mode": "计划模式",
121166
- "status.session_id": "会话编号",
121167
- "status.session_title": "会话标题",
121168
- "status.status_warning": "状态警告",
121169
- "status.context_window": "上下文窗口",
121170
- "status.no_context_data": "暂无上下文窗口数据。",
121171
- "tasks.no_session": "没有活动会话。",
121172
- "tasks.load_failed": "加载任务失败:{msg}",
121173
- "tasks.refresh_output_failed": "输出刷新失败:{msg}",
121174
- "tasks.refresh_failed": "刷新失败:{msg}",
121175
- "tasks.already_stopped": "{name} 已是终止状态 — 无需停止。",
121176
- "tasks.refreshing": "正在刷新…",
121177
- "tasks.stopping": "正在停止 {name}…",
121178
- "tasks.user_stopped": "用户发起停止",
121179
- "tasks.stop_failed": "停止失败:{msg}",
121180
- "tasks.open_output_failed": "无法打开输出:{msg}",
121181
- "status.idle": "○ 空闲",
121182
- "status.thinking": "思考中",
121183
- "status.composing": "输出中",
121184
- "status.tool": "执行中",
121185
- "status.waiting": "等待响应",
121186
- "status.verifying": "验证中",
121187
- "approval.allow_once": "批准一次",
121188
- "approval.allow_session": "批准(当前会话)",
121189
- "approval.deny": "拒绝",
121190
- "approval.deny_feedback": "拒绝并反馈",
121191
- "approval.revise": "修订",
121192
- "approval.approve": "批准",
121193
- "approval.edit": "编辑 ",
121194
- "approval.file": "文件",
121195
- "approval.stop_task": "停止任务:",
121196
- "approval.start": "启动 ",
121197
- "approval.agent": "智能体",
121198
- "approval.invoke_skill": "调用技能 ",
121199
- "approval.fetch": "获取 ",
121200
- "approval.search": "搜索:",
121201
- "approval.todo_update": "更新待办列表({count} 项)",
121202
- "approval.background": "后台",
121203
- "approval.danger.recursive_delete": "递归删除",
121204
- "approval.danger.pipe_to_shell": "管道到 shell",
121205
- "approval.danger.dd_write": "dd 写入",
121206
- "approval.danger.raw_device": "写入原始设备",
121207
- "approval.danger.fork_bomb": "fork 炸弹",
121208
- "approval.stop_task_prefix": "停止任务 ",
121209
- "approval.header.command": "是否执行此命令?",
121210
- "approval.header.file_write": "是否写入此文件?",
121211
- "approval.header.file_edit": "是否应用这些编辑?",
121212
- "approval.header.stop_task": "是否停止此任务?",
121213
- "approval.header.plan": "是否按此计划构建?",
121214
- "approval.header.generic": "是否批准 {name}?",
121215
- "approval.feedback_hint": "输入反馈 · ↵ 提交。",
121216
- "common.cancel": "取消",
121217
- "common.confirm": "确认",
121218
- "common.submit": "提交",
121219
- "common.back": "返回",
121220
- "common.close": "关闭",
121221
- "common.delete": "删除",
121222
- "common.install": "安装",
121223
- "common.uninstall": "卸载",
121224
- "common.restart": "重启",
121225
- "common.start": "启动",
121226
- "common.stop": "关闭",
121227
- "common.off": "关闭",
121228
- "common.on": "开启",
121229
- "common.done": "完成",
121230
- "common.fail": "失败",
121231
- "common.running": "运行中",
121232
- "common.not_set": "未设置",
121233
- "error.path_empty": "路径不能为空",
121234
- "error.path_not_exist": "路径不存在: {path}",
121235
- "error.unsupported_format": "仅支持 .md、.markdown、.txt 文件",
121236
- "error.image_not_supported": "当前模型不支持图片输入。",
121237
- "error.video_not_supported": "当前模型不支持视频输入。",
121238
- "error.network_timeout": "网络超时,建议检查网络或开启加速后重试。",
121239
- "error.load_failed": "加载失败: {msg}",
121240
- "error.internal": "内部错误",
121241
- "error.no_session": "没有活跃的会话。",
121242
- "footer.shift_tab": "shift+tab: 计划模式",
121243
- "footer.model": "/model: 切换模型",
121244
- "footer.ctrl_s": "ctrl+s: 中途干预",
121245
- "footer.compact": "/compact: 压缩上下文",
121246
- "footer.ctrl_o": "ctrl+o: 展开工具输出",
121247
- "footer.tasks": "/tasks: 后台任务",
121248
- "footer.shift_enter": "shift+enter: 换行",
121249
- "footer.init": "/init: 生成 AGENTS.md",
121250
- "footer.at": "@: 提及文件",
121251
- "footer.ctrl_c": "ctrl+c: 取消",
121252
- "footer.skill": "/skill: 打开 Skill 中心",
121253
- "footer.help": "/help: 显示命令",
121254
- "footer.config": "/config: 选择并配置你常用的模型商",
121255
- "footer.reminder": "让 Scream 安排任务,例如 \"2个小时后提醒我去拿快递\"",
121256
- "footer.context": "上下文:{pct} ({tokens}/{maxTokens})",
121257
- "footer.context_short": "上下文:{pct}",
121258
- "footer.tasks_running": "{count}个任务 运行中",
121259
- "footer.agents_running": "{count}个代理 运行中",
121260
- "lifecycle.memory_countdown": "15 分钟未操作,即将整理会话记忆",
121261
- "lifecycle.memory_cancel_hint": "按 Ctrl+W 取消({seconds} 秒后自动开始)",
121262
- "lifecycle.memory_cancelled": "已取消记忆提取",
121263
- "lifecycle.memory_processing": "正在整理会话记忆...",
121264
- "lifecycle.memory_done": "已沉淀 {count} 条记忆至备忘录",
121265
- "lifecycle.memory_none": "本次无需沉淀新记忆",
121266
- "lifecycle.memory_failed": "记忆整理失败,稍后再试",
121267
- "input.replay_blocked": "会话历史正在回放时无法发送输入。",
121268
- "input.send_failed": "发送失败:{message}",
121269
- "input.guide_failed": "引导失败:{message}",
121270
- "welcome.config": "/config 配置模型",
121271
- "welcome.sessions": "/sessions 恢复历史会话",
121272
- "welcome.quick_menu": "/ 输入后打开快捷菜单",
121273
- "welcome.just_now": "刚刚",
121274
- "welcome.minutes_ago": "{minutes}分钟前",
121275
- "welcome.hours_ago": "{hours}小时前",
121276
- "welcome.days_ago": "{days}天前",
121277
- "welcome.no_recent": "无最近会话",
121278
- "welcome.recent": "最近会话",
121279
- "welcome.like_active": "like已激活",
121280
- "welcome.like_inactive": "like未加载",
121281
- "loading.ai": "Ai正在加载中...",
121282
- "loading.waking": "正在唤醒核心...",
121283
- "loading.press_enter": "按下 ENTER 唤醒核心",
121284
- "loading.quit_hint": "按住 Ctrl+C 即可退出 Scream Code",
121285
- "language.picker_title": "语言 / Language",
121286
- "language.picker_hint": "↑↓ 选择 · Enter 确认 · Esc 取消",
121287
- "language.unchanged": "语言未更改:\"{locale}\"。",
121288
- "language.save_failed": "保存语言设置失败:{error}",
121289
- "language.switched": "语言已切换为 {locale}",
121290
- "language.restart_hint": "建议重启 scream-code 以使所有界面文本生效",
121291
- "knowledge.chunking": "切分文件中...",
121292
- "knowledge.embedding_chunks": "嵌入 chunks: {index}/{total}",
121293
- "knowledge.extracting": "抽取事件: {index}/{total}",
121294
- "knowledge.embedding_events": "嵌入 events: {index}/{total}",
121295
- "knowledge.embedding_entities": "嵌入 entities...",
121296
- "knowledge.embedding_relations": "嵌入关系...",
121297
- "knowledge.error": "错误: {msg}",
121298
- "knowledge.ingest": "摄入文件/文件夹",
121299
- "knowledge.ingest_desc": "输入 markdown/txt 文件或文件夹路径【摄入后首次抽取事件关联需要调用llm,文件过大建议更换性价比模型】",
121300
- "knowledge.ingesting": "开始摄入...",
121301
- "knowledge.ingest_done": "摄入完成",
121302
- "knowledge.ingest_fail": "摄入失败",
121303
- "knowledge.batch_done": "批量摄入完成",
121304
- "knowledge.batch_partial": "批量摄入完成(部分失败)",
121305
- "knowledge.succeeded": "成功: {count} 个文件",
121306
- "knowledge.failed": "失败: {count} 个文件",
121307
- "knowledge.failed_files": "失败文件:",
121308
- "knowledge.file_label": "文件",
121309
- "knowledge.docs_title": "知识库文档",
121310
- "knowledge.empty": "知识库为空,请先用 /knowledge 摄入文档",
121311
- "knowledge.search": "搜索测试",
121312
- "knowledge.search_desc": "输入查询,测试多跳检索",
121313
- "knowledge.search_placeholder": "例如:A 公司的竞争对手是谁",
121314
- "knowledge.searching": "搜索中...",
121315
- "knowledge.search_done": "搜索完成",
121316
- "knowledge.search_fail": "搜索失败",
121317
- "knowledge.search_result": "搜索结果",
121318
- "knowledge.no_hits": "查询 \"{query}\" 未命中任何 chunk",
121319
- "knowledge.vector_degraded": "向量模型未就绪,当前为关键词检索模式。如下载失败,建议开启科学上网后重启。",
121320
- "knowledge.query_label": "查询",
121321
- "knowledge.no_title": "(无标题)",
121322
- "knowledge.source_label": "来源",
121323
- "knowledge.delete": "删除文档",
121324
- "knowledge.delete_desc": "从知识库删除一个文档(级联删除关联数据)",
121325
- "knowledge.delete_pick": "选择要删除的文档",
121326
- "knowledge.cascade_warning": "删除后无法恢复,关联的 chunks/events/entities 会级联删除(Esc 取消)",
121327
- "knowledge.cascade_delete": "级联删除",
121328
- "knowledge.confirm_delete": "确认删除",
121329
- "knowledge.confirm_delete_name": "确认删除「{name}」?",
121330
- "knowledge.no_delete_data": "返回,不删除任何数据",
121331
- "knowledge.no_delete": "没有可删除的文档",
121332
- "knowledge.delete_fail_not_found": "删除失败:文档不存在",
121333
- "knowledge.deleted": "已删除",
121334
- "knowledge.doc_removed": "文档已从知识库移除",
121335
- "knowledge.cancelled": "已取消",
121336
- "knowledge.no_delete_doc": "未删除任何文档",
121337
- "knowledge.stats": "知识库统计",
121338
- "knowledge.stats_desc": "查看知识库整体统计",
121339
- "knowledge.stats_note": "说明",
121340
- "knowledge.stats_sources": "摄入的文件/来源数",
121341
- "knowledge.stats_documents": "文档元数据记录数",
121342
- "knowledge.stats_chunks": "切片数(按标题切分)",
121343
- "knowledge.stats_events": "LLM 抽取的融合事件数",
121344
- "knowledge.stats_entities": "去重后的实体数",
121345
- "knowledge.ingest_full": "从 markdown/txt 文件或文件夹摄入知识(chunk + 抽事件 + 抽实体)",
121346
- "knowledge.doc_list": "文档列表",
121347
- "knowledge.doc_list_desc": "查看所有已摄入的文档",
121348
- "knowledge.search_effect": "输入查询,测试多跳检索效果",
121349
- "knowledge.web": "知识图谱",
121350
- "knowledge.web_desc": "在浏览器中查看交互式知识图谱",
121351
- "knowledge.download_model": "下载向量模型",
121352
- "knowledge.download_model_desc": "手动下载 bge-small-zh-v1.5 模型(约 95 MB)以启用语义搜索",
121353
- "knowledge.download_model_installed": "(已安装)",
121354
- "knowledge.download_model_retry_hint": "可返回菜单重新选择「下载向量模型」重试,建议科学上网",
121355
- "knowledge.menu_title": "SAG知识库管理",
121356
- "knowledge.menu_hint": "选择操作(esc 退出)",
121357
- "knowledge.op_failed": "操作失败: {msg}",
121358
- "init.select_title": "选择 AGENTS.md 生成位置",
121359
- "init.select_hint": "当前目录:{currentDir} · 项目根目录:{projectRoot}",
121360
- "init.current_dir": "当前目录",
121361
- "init.current_dir_desc": "仅在当前目录生成并分析",
121362
- "init.project_root": "项目根目录",
121363
- "init.project_root_desc": "基于当前目录,允许 AI 自行向上探索后生成",
121364
- "init.cancelled": "已取消初始化",
121365
- "loop.permission_auto": "权限已切到 auto(循环期间不再弹审批)。",
121366
- "loop.disabled": "循环模式已关闭。",
121367
- "loop.prompt_updated": "循环提示词已更新。",
121368
- "loop.fixed_prompt": "已固定提示词,每轮结束后自动重发。",
121369
- "loop.next_prompt": "下一条提示词将在每轮结束后自动重发。",
121370
- "loop.enabled": "循环模式已开启",
121371
- "loop.hint_reset": "提示:每轮重发同一条 prompt,AI 不记得上一轮输出。",
121372
- "loop.hint_goal": "需要根据上次失败调整策略时,用 /goal 更合适。",
121373
- "loop.conflict_goal": "当前已有激活的目标(/goal)。/loop 与 /goal 语义冲突:\nloop 每轮重置上下文,会破坏 goal 的工作笔记迭代。\n请先 /goal off 关闭目标,再开启循环模式。",
121374
- "loop.status_off": "循环:关闭",
121375
- "loop.status_on": "循环:开启({limit})",
121376
- "loop.status_repeating": "循环:开启(正在重复提示词)",
121377
- "loop.status_waiting": "循环:开启(等待下一条提示词)",
121378
- "loop.title": "/loop 循环模式",
121379
- "loop.limit_label": "限制:",
121380
- "loop.verify_label": "验证命令:",
121381
- "loop.verify_hint": "(通过即停)。",
121382
- "loop.help_desc": "无状态重试:每轮重发同一条 prompt,AI 不记得上一轮输出。配 --verify 验证命令,让客观 exit code 决定循环何时结束。",
121383
- "loop.help_usage": "用法:/loop [次数|时长] [提示词] [--verify \"验证命令\"]",
121384
- "loop.help_example_count": "· /loop 10 [提示词] — 限制 10 次迭代",
121385
- "loop.help_example_duration": "· /loop 5m [提示词] — 限制 5 分钟",
121386
- "loop.help_example_combo": "· /loop 1h30m [提示词] — 组合时长限制",
121387
- "loop.help_example_verify": "· /loop 10 修复 lint --verify \"pnpm lint\" — 每轮后跑验证,通过即停",
121388
- "loop.help_suitable": "适合:等 CI 通过、轮询健康检查、单次可能失败需重试的幂等任务。",
121389
- "loop.help_unsuitable": "不适合:需要根据上次失败调整策略 → 用 /goal(AI 带工作笔记迭代)。",
121390
- "loop.help_esc_hint": "按 Esc 暂停当前迭代;再次输入 /loop 关闭循环。",
121391
- "loop.conflict_goal_title": "Storm Breaker(风暴守护者)",
121392
- "loop.command_ref": "/loop 命令说明:",
121393
- "loop.help_toggle": "· /loop — 切换循环开关",
121394
- "loop.help_verify_short": "· /loop 10 ... --verify \"命令\" — 每轮后跑验证,通过即停",
121395
- "goal.need_desc": "请提供目标描述,例如 /goal 实现登录功能",
121396
- "goal.no_active": "当前没有激活的目标。",
121397
- "goal.no_resumable": "没有可恢复的目标。使用 /goal <指令> 设置新目标。",
121398
- "goal.set": "🎯 目标已设置:{objective}",
121399
- "goal.paused": "🎯 目标已暂停。使用 /goal resume 恢复。",
121400
- "goal.resumed": "🎯 目标已恢复。",
121401
- "goal.cancelled": "🎯 目标已取消。",
121402
- "goal.conflict_loop": "当前已开启循环模式(/loop)。/goal 与 /loop 语义冲突:\nloop 每轮重置上下文,会破坏 goal 的工作笔记迭代。\n请先 /loop 关闭循环模式,再设置目标。",
121403
- "goal.create_failed": "创建目标失败:{msg}",
121404
- "goal.pause_failed": "暂停目标失败:{msg}",
121405
- "goal.resume_failed": "恢复目标失败:{msg}",
121406
- "goal.cancel_failed": "取消目标失败:{msg}",
121407
- "goal.status_failed": "获取目标状态失败:{msg}",
121408
- "goal.resume_hint": "继续执行当前目标。",
121409
- "update.timeout": "超时,可能因网络原因卡住。",
121410
- "update.network_hint": "请检查网络后重试(国内用户建议科学上网)。",
121411
- "update.network_error": "失败:网络连接异常,请检查网络后重试。",
121412
- "update.network_hint_retry": "(国内用户建议科学上网,如遇网络错误请多尝试几次)",
121413
- "update.failed": "失败:{msg}",
121414
- "update.signal": "信号",
121415
- "update.exit_code": "退出码",
121416
- "update.idle_only": "请在空闲时执行更新。",
121417
- "update.checking": "正在检测更新...",
121418
- "update.already_latest": "当前已是最新版本({version})",
121419
- "update.updating": "正在更新到 {version}...",
121420
- "update.npm_install": "正在通过 npm 安装最新版本...",
121421
- "update.install_label": "安装 scream-code",
121422
- "update.done": "更新完成。请重启 Scream Code 以使用新版本。",
121423
- "mcp.connecting": "⏳ 连接中",
121424
- "mcp.connected": "🔌 已连接",
121425
- "mcp.failed": "❌ 失败",
121426
- "mcp.disabled": "⏸ 已停用",
121427
- "mcp.auth_required": "🔐 需授权",
121428
- "mcp.load_failed": "加载 MCP 服务器失败:{msg}",
121429
- "mcp.install_success": "{name} 安装成功并已启动。",
121430
- "mcp.install_fail": "{name} 安装失败。",
121431
- "mcp.uninstall_confirm": "确认卸载 \"{name}\"?",
121432
- "mcp.already_installed": "{name} 已安装,无需重复安装。",
121433
- "mcp.disabled_done": "{name} 已停用。",
121434
- "mcp.uninstalled": "{name} 已卸载。",
121435
- "mcp.no_session": "请先创建或恢复一个会话。",
121436
- "mcp.manage_title": "MCP 管理({count} 已连接)",
121437
- "mcp.no_installed": "暂无已安装的 MCP 服务器",
121438
- "mcp.recommended": "推荐 MCP(Enter 安装)",
121439
- "mcp.installed": "已安装",
121440
- "mcp.install_enter": "Enter 安装",
121441
- "mcp.confirm_uninstall": "确认卸载",
121442
- "mcp.uninstall_yes": "是,卸载",
121443
- "mcp.installing": "正在安装",
121444
- "mcp.configuring": "正在配置",
121445
- "mcp.network_timeout": "网络超时,建议检查网络或开启加速后重试。",
121446
- "mcp.install_failed": "安装失败:{msg}",
121447
- "mcp.disable_failed": "停用失败: {msg}",
121448
- "mcp.detected_starting": "已检测到安装,正在启动...",
121449
- "mcp.start_failed": "启动失败: {msg}",
121450
- "mcp.uninstall_done": "已卸载。",
121451
- "mcp.uninstall_failed": "卸载失败: {msg}",
121452
- "mcp.footer_hint": "Enter 安装/启停 d 卸载 Esc 返回",
121453
- "mcp.macos_only": "仅支持 macOS",
121454
- "cc.start": "启动",
121455
- "cc.stop": "关闭",
121456
- "cc.restart": "重启",
121457
- "cc.uninstall": "卸载",
121458
- "cc.start_desc": "启动 cc-connect 后台守护进程",
121459
- "cc.stop_desc": "停止 cc-connect 后台守护进程",
121460
- "cc.restart_desc": "重启 cc-connect 后台守护进程",
121461
- "cc.uninstall_desc": "彻底卸载 cc-connect(守护进程 + 配置 + npm 包)",
121462
- "cc.manage_title": "cc-connect 守护进程管理",
121463
- "cc.operating": "正在{label}cc-connect...",
121464
- "cc.started": "cc-connect 已{label}",
121465
- "cc.start_failed": "{label}失败:{output}",
121466
- "cc.will_clean": "将执行以下清理:",
121467
- "cc.clean_daemon": "· 停止并卸载 {label} 守护进程",
121468
- "cc.clean_config": "· 删除配置目录{detail}",
121469
- "cc.current_version": "· 当前版本:{version}",
121470
- "cc.install_path": "· 安装路径:{path}",
121471
- "cc.clean_pm2": "· 删除 pm2 进程 + 启动项(startup.bat / schtasks)",
121472
- "cc.clean_residual": "· 清理 {count} 个残留文件(launchd/systemd/pm2 日志)",
121473
- "cc.not_detected": "未识别 cc-connect 安装",
121474
- "cc.not_detected_desc": "未在默认 npm 全局路径下检测到 cc-connect 安装,已中止卸载。建议将此情况发送给 scream,由其指导手动清理。",
121475
- "cc.uninstalling": "正在卸载 cc-connect…",
121476
- "cc.stop_daemon": "停止守护进程",
121477
- "cc.delete_label": "删除",
121478
- "cc.clean_files": "清理残留文件",
121479
- "cc.uninstall_done": "cc-connect 已彻底卸载",
121480
- "cc.uninstall_partial": "部分步骤失败,详见下方提示",
121481
- "cc.uninstalled": "cc-connect 已卸载",
121482
- "cc.restart_hint": "建议重启 Scream Code 以确保 cc-connect 状态完全清空。",
121483
- "cc.uninstall_partial_label": "卸载部分失败",
121484
- "cc.residual": "残留",
121485
- "cc.confirm_uninstall": "确认彻底卸载 cc-connect?",
121486
- "cc.uninstall_irreversible": "此操作不可撤销,所有 cc-connect 数据将被清除",
121487
- "cc.confirm_uninstall_btn": "确认卸载",
121488
- "auth.fetching_models": "正在拉取最新模型目录...",
121489
- "auth.no_providers": "没有已配置的模型商。",
121490
- "auth.deleted": "已删除模型商: {name}",
121491
- "auth.input_api_url": "输入服务商 API 地址",
121492
- "auth.api_url_hint": "例如 https://api.deepseek.com(可粘贴)",
121493
- "auth.input_api_key": "输入 API Key",
121494
- "auth.api_key_hint": "密钥保存到 ~/.scream/config.toml(可粘贴,Esc 取消)",
121495
- "auth.input_model": "输入模型型号",
121496
- "auth.model_hint": "例如 deepseek-v4-flash",
121497
- "auth.input_context": "输入模型最大上下文长度 (tokens)",
121498
- "auth.context_hint": "默认 131072,DeepSeek V4 填 1000000",
121499
- "auth.connected": "已连接: {name}",
121500
- "like.priority": "用户通过 /like 设置的偏好具有最高优先级,每次回复都必须遵守。",
121501
- "like.nickname": "设置昵称",
121502
- "like.nickname_hint": "你希望我怎么称呼你?留空表示不设置。",
121503
- "like.nickname_example": "例如:Alex",
121504
- "like.tone": "设置回应语气",
121505
- "like.tone_hint": "例如:友好、专业、幽默、简洁等(留空表示不设置)",
121506
- "like.tone_example": "例如:友好而专业",
121507
- "like.other": "其他偏好",
121508
- "like.other_hint": "例如:多说例子、先给结论再展开、避免术语等(留空表示不设置)",
121509
- "like.other_example": "例如:请用中文回答,避免缩写",
121510
- "like.cancelled": "已取消 /like 设置",
121511
- "like.saved": "偏好已保存(下次新会话生效)",
121512
- "revoke.streaming": "无法在 streaming 中撤回 — 请先按 Esc 或 Ctrl-C 取消。",
121513
- "revoke.usage": "用法:/revoke [数量],数量为正整数。",
121514
- "revoke.nothing": "没有可以撤回的内容。",
121515
- "revoke.failed": "撤回失败:{msg}",
121516
- "btw.usage": "/btw 用法",
121517
- "btw.desc": "在不中断当前对话的情况下快速提问。",
121518
- "btw.example1": "示例:/btw 这个项目有多少个包?",
121519
- "btw.example2": "示例:/btw useEffect 的 cleanup 什么时候执行?",
121520
- "btw.no_session": "请先创建或恢复一个会话,再使用 /btw。",
121521
- "session.exporting_md": "正在导出会话为 Markdown…",
121522
- "session.no_messages": "没有消息可导出。",
121523
- "session.exporting": "正在导出会话…",
121524
- "memory.inject_prefix": "[用户从记忆备忘录中注入了以下历史记录]",
121525
- "memory.history_title": "历史备忘录",
121526
- "memory.requirement": "用户需求",
121527
- "memory.plan": "执行方案",
121528
- "memory.plan_none": "(无)",
121529
- "memory.result": "完成结果",
121530
- "memory.pitfall": "踩坑记录",
121531
- "memory.pitfall_none": "无",
121532
- "memory.experience": "成功经验",
121533
- "memory.experience_none": "无",
121534
- "memory.source_session": "来源会话",
121535
- "memory.record_time": "记录时间",
121536
- "memory.inject_hint": "请参考以上历史经验来处理当前问题。特别注意踩坑记录中的错误不要重犯。",
121537
- "makeskill.wait": "请等待当前回复完成后再使用 /make-skill",
121538
- "dialog.nav": "↑↓ 导航",
121539
- "dialog.page": "←→ 翻页",
121540
- "dialog.select": "Enter 选择",
121541
- "dialog.cancel": "Esc 取消",
121542
- "dialog.search_placeholder": "(输入搜索)",
121543
- "session.title": "会话",
121544
- "session.loading": "正在加载会话...",
121545
- "session_picker.empty": "未找到会话。按 Escape 关闭。",
121546
- "session_picker.cc_restricted": "CC专属会话不支持切换或删除,请点击或复制下方文件路径进入手动管理",
121547
- "session.picker_title": "会话 ",
121548
- "session.delete_confirm": "⚠️ 按 Enter 确认删除,Esc 取消",
121549
- "session.picker_hint": "(↑↓ 导航,Enter 选择,d 删除,Esc 取消)",
121550
- "model.nav_model": "↑↓ 模型",
121551
- "model.nav_thinking": "←→ 思考等级",
121552
- "model.nav_page": "PgUp/PgDn 翻页",
121553
- "model.nav_select": "Enter 切换模型",
121554
- "model.nav_cancel": "Esc 取消",
121555
- "model.search_placeholder": "(输入搜索)",
121556
- "model.select_title": " 选择模型",
121557
- "model.search_label": " 搜索:",
121558
- "model.thinking_global": " Thinking(全局设置)",
121559
- "model.multimodal": " 多模态能力",
121560
- "model.image": "识图",
121561
- "model.supported": "✓ 支持",
121562
- "model.not_supported": "✗ 不支持",
121563
- "model.video": "视频",
121564
- "model.audio": "音频",
121565
- "help.toggle_plan": "切换计划模式",
121566
- "help.toggle_output": "切换工具输出展开",
121567
- "help.interrupt": "中途干预 — 在流式传输中插入后续提示",
121568
- "help.newline": "插入换行",
121569
- "help.cancel_stream": "中断流 / 清空输入",
121570
- "help.exit": "退出(空输入时)",
121571
- "help.close_dialog": "关闭对话框 / 中断流",
121572
- "help.browse_history": "浏览输入历史",
121573
- "help.submit": "提交",
121574
- "help.title": " 帮助 ",
121575
- "help.close_hint": "Esc / Enter / q 关闭 · ↑↓ 滚动",
121576
- "help.welcome_msg": "Scream 已准备好帮助您!发送消息即可开始。",
121577
- "help.shortcuts": "键盘快捷键",
121578
- "help.slash_commands": "斜杠命令",
121579
- "help.showing_range": "显示 {start}-{end} / {total}",
121580
- "question.other": "其他",
121581
- "question.unanswered": "未回答",
121582
- "question.check_before_submit": "提交前检查您的答案",
121583
- "question.ready_to_submit": "准备好提交答案了吗?",
121584
- "question.partial_unanswered": "部分问题尚未回答。",
121585
- "question.submit": "提交",
121586
- "question.cancel": "取消",
121587
- "question.label": " 问题",
121588
- "question.input_hint": " 输入答案,然后按 Enter 保存。",
121589
- "question.more_lines": "更多行",
121590
- "question.showing_range": "显示 {start}-{end} / {total}",
121591
- "question.input_placeholder": "输入答案",
121592
- "question.save_hint": "↵ 保存",
121593
- "question.tab_switch": "tab 切换",
121594
- "question.esc_cancel": "esc 取消",
121595
- "question.arrow_select": "▲/▼ 选择",
121596
- "question.tab_arrow_switch": "←/→/tab 切换",
121597
- "question.enter_confirm": "↵ 确认",
121598
- "question.toggle": "切换",
121599
- "question.choose": "选择",
121600
- "memory.just_now": "刚刚",
121601
- "memory.minutes_ago": "{minutes} 分钟前",
121602
- "memory.hours_ago": "{hours} 小时前",
121603
- "memory.days_ago": "{days} 天前",
121604
- "memory.compaction_extract": "压缩提取",
121605
- "memory.manual_record": "手动记录",
121606
- "memory.exit_extract": "退出提取",
121607
- "memory.search_label": "搜索: ",
121608
- "memory.notebook_title": "记忆备忘录 ",
121609
- "memory.esc_clear_search": "(Esc 清除搜索)",
121610
- "memory.nav_hint": "(↑↓ 导航,Enter 查看,i 注入,d 删除,/ 搜索,Esc 关闭)",
121611
- "memory.loading": "正在加载...",
121612
- "memory.no_match": "未找到匹配 \"{query}\" 的记忆。",
121613
- "memory.empty": "暂无记忆备忘录。",
121614
- "memory.auto_extract_hint": " 压缩对话或退出会话时,系统会自动提取并保存。",
121615
- "memory.deleting": "删除: ",
121616
- "memory.delete_confirm_hint": " 按 Enter 确认删除,Esc 取消",
121617
- "memory.showing_range": "{start}-{end} / {total} 条",
121618
- "memory.id_label": "ID: ",
121619
- "memory.source_label": "来源: ",
121620
- "memory.project_label": "项目: ",
121621
- "memory.tags_label": "标签: ",
121622
- "memory.plan_label": "方案: ",
121623
- "memory.requirement_label": "需求: ",
121624
- "memory.result_label": "结果: ",
121625
- "memory.session_label": "会话: ",
121626
- "memory.pitfall_label": "踩坑: ",
121627
- "memory.experience_label": "经验: ",
121628
- "memory.detail_nav_hint": " Enter/Esc 返回 | i 注入 | d 删除",
121629
- "skill.no_session": "请先创建或恢复一个会话,再使用 Skill 中心。",
121630
- "skill.loading": "正在加载 Skill 中心…",
121631
- "skill.center_title": "Skill 中心",
121632
- "skill.no_skills": "当前没有已安装 Skill 也没有可安装 Skill 包。",
121633
- "skill.footer_hint": "Enter 激活/安装 · d 卸载 · i 安装并注入 · Esc 返回",
121634
- "skill.installed": "已安装的 Skill",
121635
- "skill.installable": "可安装的 Skill 包",
121636
- "skill.not_installed": "未安装",
121637
- "skill.no_session_activate": "未连接到会话。请先创建或恢复一个会话。",
121638
- "skill.not_found": "未找到 Skill",
121639
- "skill.installing_package": "正在安装 Skill 包…",
121640
- "skill.installed_injected": "已安装并注入当前会话。",
121641
- "skill.plugin_installed": "插件已安装",
121642
- "skill.no_manual_skill": "已成功安装,但该包没有可手动激活的 Skill。",
121643
- "skill.install_failed": "安装失败。",
121644
- "skill.install_failed_msg": "安装失败: {msg}",
121645
- "skill.select_activate": "选择一个 Skill 激活",
121646
- "skill.select_hint": "Enter 激活 · Esc 返回",
121647
- "skill.uninstall_whole_pkg": "将卸载整个包(共 {count} 个 Skill),无法只删除单个 Skill",
121648
- "skill.uninstall_single": "将卸载整个 Skill 包",
121649
- "skill.uninstalling": "正在卸载",
121650
- "skill.uninstalled": "已卸载。",
121651
- "skill.plugin_uninstalled": "插件已卸载",
121652
- "skill.plugin_removed": "该插件的 Skill 已从当前会话中移除,无需重启会话。",
121653
- "skill.uninstall_failed": "卸载失败。",
121654
- "skill.uninstall_failed_msg": "卸载失败: {msg}",
121655
- "skill.deleting_skill": "将删除该 Skill 的安装目录及子 Skill",
121656
- "skill.deleting": "正在删除",
121657
- "skill.deleted": "已删除。",
121658
- "skill.skill_deleted": "Skill 已删除",
121659
- "skill.skill_removed": "该 Skill 及其子 Skill 已从当前会话中移除。",
121660
- "skill.delete_failed": "删除失败。",
121661
- "skill.delete_failed_msg": "删除失败: {msg}",
121662
- "skill.confirm_uninstall": "确认卸载 \"{label}\"?",
121663
- "skill.uninstall_reversible": "卸载后可在 Skill 中心重新安装",
121664
- "skill.uninstall_yes": "是,卸载",
121665
- "toolcall.bg_agent_lost": "后台 agent 丢失(会话在完成前已重启)",
121666
- "toolcall.bg_agent_terminated": "后台 agent 已终止",
121667
- "toolcall.bg_agent_failed": "后台 agent 失败",
121668
- "toolcall.current_plan": "当前计划",
121669
- "toolcall.approved": "已批准:{chosen}",
121670
- "toolcall.approved_label": "已批准",
121671
- "toolcall.input_unavailable": "无法收集你的输入",
121672
- "toolcall.input_collected": "已收集你的答案",
121673
- "toolcall.waiting_input": "等待你的输入",
121674
- "toolcall.used": "已使用",
121675
- "toolcall.truncated": "已截断",
121676
- "toolcall.in_use": "正在使用",
121677
- "toolcall.sub_agent_named": "子 agent {name} ({id})",
121678
- "toolcall.sub_agent": "子 agent ({id})",
121679
- "toolcall.more_tools": "还有 {count} 个 tool call...",
121680
- "toolcall.agent_used": "{name} 已使用 {tool}",
121681
- "toolcall.agent_in_use": "{name} 正在使用 {tool}",
121682
- "toolcall.starting": "启动中…",
121683
- "toolcall.running": "运行中",
121684
- "toolcall.completed": "已完成",
121685
- "toolcall.tool_count": "{count} 个 tool",
121686
- "toolcall.failed": "失败",
121687
- "toolcall.bg_running": "后台运行",
121688
- "toolcall.truncation_notice": "Tool 调用参数因 max_tokens 被截断 — 调用未执行。",
121689
- "toolcall.lines_hidden": "...(还有 {hidden} 行,共 {total} 行,按 ctrl+o 展开)",
121690
- "toolcall.preparing_changes": "正在准备变更{path}...{bytes} · 已用 {elapsed}",
121691
- "toolcall.rejected": "已拒绝",
121692
- "toolcall.suggestion": "建议",
121693
- "toolcall.question_ignored": "用户忽略了该问题。",
121694
- "toolcall.question_label": "问",
121695
- "readgroup.reading": "正在读取 {count} 个文件…",
121696
- "readgroup.read": "已读取 {count} 个文件",
121697
- "readgroup.failed_suffix": " · 失败",
121698
- "readgroup.lines_suffix": " · {count} 行",
121699
- "readgroup.failed_count": " · {count} 失败",
121700
- "readgroup.reading_suffix": " · 读取中…",
121701
- "readgroup.conflict_suffix": "冲突",
121702
- "handler.oauth_page_opened": "已在浏览器中打开 {serverName} 的授权页面",
121703
- "handler.mcp_sync_failed": "同步 MCP 服务器状态失败: {message}",
121704
- "handler.loop_limit_time": "时间",
121705
- "handler.loop_limit_count": "次数",
121706
- "handler.loop_limit_reached": "循环{reason}限制已到{suffix},循环模式已关闭。",
121707
- "handler.loop_verify_passed": "✓ 验证通过,循环结束({iteration} 次迭代)。",
121708
- "handler.loop_verify_not_passed": ",验证未通过",
121709
- "handler.max_tokens_truncated": "模型达到 max_tokens 限制 — 工具调用在运行前被截断。",
121710
- "handler.max_tokens_no_tool": "模型达到 max_tokens 限制 — 未发出工具调用。",
121711
- "handler.max_tokens_hint": "如果此限制对您的模型不合适,请在 scream-code 配置中为模型别名设置 `max_output_size`。",
121712
- "handler.user_interrupted": "用户中断",
121713
- "handler.max_steps_reached": "达到每轮步骤限制(max_steps)",
121714
- "handler.step_interrupted": "步骤中断 ({reason})",
121715
- "handler.warning_prefix": "警告: {message}",
121716
- "handler.mcp_server_failed": "MCP 服务器 \"{name}\" 失败{error}",
121717
- "handler.mcp_server_needs_auth": "MCP 服务器 \"{name}\" 需要 OAuth 认证,请运行 /mcp",
121718
- "handler.mcp_server_disabled": "MCP 服务器 \"{name}\" 已禁用",
121719
- "handler.mcp_server_connecting": "MCP 服务器 \"{name}\" 正在连接…",
121720
- "handler.skill_activated": "已激活技能: {skillName}",
121721
- "handler.storm_breaker_title": "Storm Breaker(风暴守护者)",
121722
- "handler.storm_breaker_detail": "检测到异常压缩节奏:{detail}可能存在工具调用循环或超长输出,建议查看最近几步的对话记录。",
121723
- "session.not_found": "未找到会话 \"{sessionId}\"。",
121724
- "session.wrong_dir": "会话 \"{sessionId}\" 是在其他目录下创建的。\n cd \"{workDir}\" && scream -r {sessionId}",
121725
- "session.no_resumable": "\"{workDir}\" 下没有可继续的会话;正在启动新会话。",
121726
- "session.init_failed": "启动会话未初始化。",
121727
- "session.already_in": "已在该会话中。",
121728
- "session.switch_streaming": "流式传输期间无法切换会话 — 请先按 Esc 或 Ctrl-C。",
121729
- "session.switch_replaying": "历史回放期间无法切换会话。",
121730
- "session.resume_failed": "恢复会话 {sessionId} 失败:{msg}",
121731
- "session.resumed": "已恢复会话 ({sessionId})。",
121732
- "session.replay_failed": "重放会话历史失败:{msg}",
121733
- "session.resume_warning": "警告:{warning}",
121734
- "session.new_replaying": "历史回放期间无法启动新会话。",
121735
- "session.new_failed": "启动新会话失败:{msg}",
121736
- "session.setup_failed": "创建后设置失败:{msg}",
121737
- "session.new_started": "已启动新会话 ({sessionId})。",
121738
- "replay.history_unavailable": "此会话的历史记录不可用。",
121739
- "replay.history_failed": "回放会话历史失败: {message}",
121740
- "replay.skill_activated": "已激活技能: {skillName}",
121741
- "replay.yes_mode_on": "YES 模式:开启",
121742
- "replay.yes_mode_on_detail": "所有操作将自动批准。请谨慎使用。",
121743
- "replay.yes_mode_off": "YES 模式:关闭",
121744
- "replay.permission_mode": "权限模式: {mode}",
121745
- "replay.approved_session": "已批准(当前会话)",
121746
- "replay.approved": "已批准",
121747
- "replay.rejected": "已拒绝",
121748
- "replay.cancelled": "已取消",
121749
- "replay.plan_revise": "计划已退回修订",
121750
- "replay.plan_rejected": "计划审查已拒绝",
121751
- "replay.plan_cancelled": "计划审查已取消",
121752
- "replay.feedback_prefix": "反馈: {feedback}",
121753
- "replay.bg_failed_suffix": " 在后台失败",
121754
- "replay.bg_lost_suffix": " 在后台丢失",
121755
- "replay.bg_stopped_suffix": " stopped",
121756
- "skill.source_label": "来源:",
121757
- "skill.plugin_label": "插件:",
121758
- "taskbrowser.running": "运行中",
121759
- "taskbrowser.awaiting": "等待中",
121760
- "taskbrowser.completed": "已完成",
121761
- "taskbrowser.interrupted": "已中断",
121762
- "taskbrowser.total": "总计",
121763
- "taskbrowser.stop": "停止",
121764
- "taskbrowser.confirm": "确认",
121765
- "taskbrowser.cancel": "取消",
121766
- "taskbrowser.select": "选择",
121767
- "taskbrowser.output": "输出",
121768
- "taskbrowser.stop_action": "停止",
121769
- "taskbrowser.refresh": "刷新",
121770
- "taskbrowser.filter": "筛选",
121771
- "taskbrowser.exit": "退出",
121772
- "taskbrowser.no_active": "无活跃任务。Tab = 显示全部。",
121773
- "taskbrowser.no_tasks": "本会话无后台任务。",
121774
- "taskbrowser.select_task": "从列表中选择一个任务。",
121775
- "taskbrowser.detail": "详情",
121776
- "taskbrowser.task_id": "任务 ID:",
121777
- "taskbrowser.status": "状态:",
121778
- "taskbrowser.description": "描述:",
121779
- "taskbrowser.command": "命令:",
121780
- "taskbrowser.running_time": "运行中",
121781
- "taskbrowser.completed_time": "已完成",
121782
- "taskbrowser.time": "时间:",
121783
- "taskbrowser.process_id": "进程 ID:",
121784
- "taskbrowser.exit_code": "退出码:",
121785
- "taskbrowser.stop_reason": "停止原因:",
121786
- "taskbrowser.timed_out": "已超时:",
121787
- "taskbrowser.yes": "是",
121788
- "taskbrowser.awaiting_label": "等待中:",
121789
- "subagent.desc_coder": "通用软件工程任务",
121790
- "subagent.desc_reviewer": "代码审查,发现 bug 和 API 契约违反",
121791
- "subagent.desc_writer": "内容生产与研究报告",
121792
- "subagent.desc_explore": "快速代码库探索(只读)",
121793
- "subagent.desc_oracle": "深度调试与架构决策",
121794
- "subagent.desc_plan": "实现规划与架构设计(只读)",
121795
- "subagent.desc_verify": "运行构建/测试/lint 验证改动",
121796
- "subagent.follow_main": "跟随主模型",
121797
- "subagent.follow_main_desc": "使用主代理当前模型(默认)",
121798
- "subagent.title": "子代理模型绑定",
121799
- "subagent.hint": "↑↓ 选择子代理 · Enter 绑定模型 · Esc 取消",
121800
- "subagent.bind_title": "绑定 {profile}",
121801
- "subagent.model_hint": "↑↓ 选择模型 · Enter 确认 · Esc 返回",
121802
- "subagent.save_failed": "保存失败:{msg}",
121803
- "kdoctree.no_title": "(无标题)",
121804
- "kdoctree.empty": "(空)",
121805
- "kdoctree.move": "移动",
121806
- "kdoctree.expand": "展开",
121807
- "kdoctree.collapse": "折叠",
121808
- "kdoctree.top_bottom": "顶/底",
121809
- "kdoctree.back": "返回",
121810
- "usage.no_token": "尚无 token 用量记录。",
121811
- "usage.input": "输入",
121812
- "usage.output": "输出",
121813
- "usage.total": "总计",
121814
- "usage.managed_title": "计划用量",
121815
- "usage.no_data": "暂无用量数据。",
121816
- "usage.used": "已用",
121817
- "usage.session_title": "会话用量",
121818
- "usage.context_window": "上下文窗口",
121819
- "usage.subagent_title": "子 Agent 用量",
121820
- "usage.panel_title": " 用量 ",
121821
- "agentgroup.n_agent_done": "{total} 个 {name} agent 已完成",
121822
- "agentgroup.n_agents_done": "{total} 个 agent 已完成",
121823
- "agentgroup.running_n_agents": "正在运行 {total} 个 agent",
121824
- "agentgroup.done": "已完成",
121825
- "agentgroup.failed": "失败",
121826
- "agentgroup.running": "运行中",
121827
- "agentgroup.running_n_agents_mixed": "正在运行 {total} 个 agent({parts})",
121828
- "agentgroup.no_desc": "(无描述)",
121829
- "agentgroup.error": "错误:",
121830
- "agentgroup.initializing": "初始化中…",
121831
- "agentgroup.check_done": "✓ 已完成",
121832
- "agentgroup.cross_failed": "✗ 失败",
121833
- "agentgroup.bg_running": "◐ 后台运行",
121834
- "mcppanel.connected": "已连接",
121835
- "mcppanel.pending": "等待中",
121836
- "mcppanel.needs_auth": "需认证",
121837
- "mcppanel.failed": "失败",
121838
- "mcppanel.disabled": "已禁用",
121839
- "mcppanel.tools_available": "{count} 个 tool 可用",
121840
- "mcppanel.servers": "服务器",
121841
- "mcppanel.no_config": "未配置 MCP 服务器。运行 /mcp 添加一个。",
121842
- "mcppanel.name": "名称",
121843
- "mcppanel.status": "状态",
121844
- "mcppanel.transport": "传输方式",
121845
- "mcppanel.tools": "工具",
121846
- "mcppanel.error": "错误:",
121847
- "mcppanel.action": "操作:",
121848
- "mcppanel.run_mcp": "运行 /mcp 管理服务器。",
121849
- "goalpanel.active": "▶ 运行中",
121850
- "goalpanel.complete": "✅ 已完成",
121851
- "goalpanel.blocked": "🚫 已阻塞",
121852
- "goalpanel.paused": "⏸ 已暂停",
121853
- "goalpanel.no_goal": "未开启任务",
121854
- "goalpanel.create_goal": "创建并启动目标",
121855
- "goalpanel.pause_goal": "暂停当前目标",
121856
- "goalpanel.resume_goal": "恢复已暂停的目标",
121857
- "goalpanel.cancel_goal": "取消当前目标",
121858
- "goalpanel.no_stop_condition": " No stop condition — runs until evaluated complete.",
121859
- "kresult.empty": "(空)",
121860
- "kresult.line": "行",
121861
- "kresult.page": "页",
121862
- "kresult.top_bottom": "顶/底",
121863
- "kresult.back": "返回",
121864
- "looplimit.usage": "用法:/loop [次数|时长] [提示词]。示例:/loop 10、/loop 5m、/loop 10 继续优化",
121865
- "looplimit.verify_usage": "验证命令需用引号包裹,例如:--verify \"pnpm lint\"",
121866
- "looplimit.iteration_must_be_positive": "循环次数必须是正整数。",
121867
- "looplimit.duration_must_be_positive": "循环时长必须为正数。",
121868
- "looplimit.duration_unit_invalid": "循环时长单位必须是秒、分钟或小时。",
121869
- "looplimit.iterations": "{count} 次",
121870
- "looplimit.remaining_iterations": "剩余 {remaining}/{initial} 次",
121871
- "looplimit.expired": "已过期",
121872
- "looplimit.remaining_duration": "剩余 {duration}",
121873
- "looplimit.hours": "{count} 小时",
121874
- "looplimit.minutes": "{count} 分钟",
121875
- "looplimit.seconds": "{count} 秒",
121876
- "export.thinking": "思考",
121877
- "export.image": "[图片]",
121878
- "export.audio": "[音频]",
121879
- "export.video": "[视频]",
121880
- "export.tool_call": "#### 工具调用: {name}",
121881
- "export.tool_result": "工具结果: {name}",
121882
- "export.unknown": "未知",
121883
- "export.turn": "## 轮次 {number}",
121884
- "export.user": "### 用户",
121885
- "export.assistant": "### 助手",
121886
- "export.system": "### 系统",
121887
- "export.overview": "## 概览",
121888
- "export.topic": "- **主题**: {topic}",
121889
- "export.topic_empty": "- **主题**: (空)",
121890
- "export.conversation_stats": "- **对话**: {turns} 轮 | {toolCalls} 次工具调用",
121891
- "export.session_title": "# Scream 会话导出",
121892
- "bgtask.agent_task": "代理任务",
121893
- "bgtask.bash_task": "bash 任务",
121894
- "bgtask.started_bg": "{subject} 已在后台启动",
121895
- "bgtask.awaiting_approval": "{subject} 等待审批",
121896
- "bgtask.completed_bg": "{subject} 已在后台完成",
121897
- "bgtask.failed_bg": "{subject} 在后台失败",
121898
- "bgtask.killed": "{subject} 已停止",
121899
- "bgtask.lost": "{subject} 已丢失",
121900
- "bgtask.stopped_reason": "已停止 — {reason}",
121901
- "bgtask.stopped": "已停止",
121902
- "bgtask.waiting": "等待中: {reason}",
121903
- "bgtask.session_restarted": "会话在完成前已重启",
121904
- "bgtask.timed_out": "已超时",
121905
- "mcpstatus.failed": "{count} 失败",
121906
- "mcpstatus.needs_auth": "{count} 需要认证",
121907
- "mcpstatus.connecting": "{count} 连接中",
121908
- "mcpstatus.connected": "{count} 已连接",
121909
- "mcpstatus.disabled_count": "{count} 已禁用",
121910
- "mcpstatus.summary": "MCP 服务器: {detail}",
121911
- "mcpstatus.more_summary": "MCP 服务器: {count} 个更多 ({detail})",
121912
- "permission.manual": "手动",
121913
- "permission.manual_desc": "执行命令、编辑等风险操作前询问。读取/搜索工具直接运行;会话审批规则生效。",
121914
- "permission.auto": "自动",
121915
- "permission.auto_desc": "完全无交互运行。工具操作自动批准,跳过代理问题以便其自行决策。",
121916
- "permission.yolo_desc": "自动批准工具操作和计划转换。需要您输入时代理仍会明确提问。",
121917
- "permission.select_title": "选择权限模式",
121918
- "theme.auto": "自动(跟随终端)",
121919
- "theme.dark": "深色",
121920
- "theme.light": "浅色",
121921
- "theme.select_title": "选择主题",
121922
- "taskviewer.no_output": "[no output captured]",
121923
- "taskviewer.key_line": "行",
121924
- "taskviewer.key_page": "页",
121925
- "taskviewer.key_top_bottom": "顶/底",
121926
- "approvalpreview.key_line": "行",
121927
- "approvalpreview.key_page": "页",
121928
- "approvalpreview.key_top_bottom": "顶/底",
121929
- "approvalpreview.key_back": "返回",
121930
- "apikey.footer": "Enter 提交 · Esc 取消",
121931
- "apikey.title": "输入 {name} 的 API 密钥",
121932
- "apikey.subtitle": "您的密钥将保存到 ~/.scream-code/config.toml",
121933
- "apikey.empty_hint": "API 密钥不能为空。",
121934
- "planbox.title_prefix": " 计划: ",
121935
- "planbox.title_fallback": " 计划 ",
121936
- "planbox.more_lines": "...(还有 {count} 行,按 ctrl+e 展开)",
121937
- "skillact.user_trigger": "(用户触发)",
121938
- "skillact.model_trigger": "(模型调用)",
121939
- "skillact.nested_trigger": "(嵌套调用)",
121940
- "skillact.activated": "▶ 已激活 skill:",
121941
- "mediaurl.audio": "音频",
121942
- "mediaurl.image": "图片",
121943
- "mediaurl.video": "视频",
121944
- "transcript.attachments": "{count} 个附件",
121945
- "transcript.assistant": "助手:",
121946
- "transcript.thinking": "思考:",
121947
- "transcript.tool_name": "工具 {name}:",
121948
- "transcript.activated_skill": "已激活技能:{name}",
121949
- "transcript.more_history": "↑ 还有 {count} 条历史消息",
121950
- "compaction.done": "压缩完成",
121951
- "compaction.canceled": "压缩已取消",
121952
- "compaction.in_progress": "正在压缩上下文...",
121953
- "planmode.plan": "计划模式",
121954
- "planmode.fusionplan": "融合计划模式",
121955
- "todo.title": " 待办",
121956
- "todo.more_items": " … 还有 {count} 项",
121957
- "textinput.footer": "Enter 提交 · Esc 取消",
121958
- "textinput.empty_hint": "输入不能为空。",
121959
- "editor.auto_detect": "自动检测 ($VISUAL / $EDITOR)",
121960
- "editor.select_title": "选择外部编辑器",
121961
- "editorkey.loop_paused": "循环已暂停。输入 /loop <提示词> 恢复或修改。",
121962
- "editorkey.cancel_compaction_failed": "取消压缩失败: {msg}",
121963
- "editorkey.editor_not_configured": "未配置编辑器。请设置 $VISUAL / $EDITOR,或运行 /editor <命令>。",
121964
- "editorkey.external_editor_failed": "外部编辑器失败: {msg}",
121965
- "streamingui.turn_complete_title": "Scream Code 任务完成",
121966
- "streamingui.compacting": "压缩上下文",
121967
- "tc.approved_session": "已批准(当前会话)",
121968
- "tc.approved": "已批准",
121969
- "tc.rejected": "已拒绝",
121970
- "tc.cancelled": "已取消",
121971
- "tc.error_prefix": "错误:",
121972
- "dialog.cc_session_connected": "已连接 CC 会话 ({id})。",
121973
- "dialog.create_session_failed": "创建会话失败",
121974
- "dialog.cc_managed": "CC 会话由 cc-connect 管理,请在聊天通道中操作。",
121975
- "dialog.memo_injected": "已注入备忘录 #{id}",
121976
- "dialog.approval_title": "Scream Code 需要审批",
121977
- "dialog.question_title": "Scream Code 需要您的回答",
121978
- "bgagent.started_bg": "{subject} 已在后台启动",
121979
- "bgagent.completed_bg": "{subject} 已在后台完成",
121980
- "bgagent.failed_bg": "{subject} 在后台失败",
121981
- "tmux.extended_keys_off": "tmux extended-keys 已关闭。修改后的 Enter 键可能无法正常工作。请在 ~/.tmux.conf 中添加 `set -g extended-keys on` 并重启 tmux。",
121982
- "tmux.extended_keys_format_xterm": "tmux extended-keys-format 为 xterm。Scream Code 在 csi-u 模式下工作最佳。请在 ~/.tmux.conf 中添加 `set -g extended-keys-format csi-u` 并重启 tmux。",
121983
- "hookresult.blocked": "已阻止",
121984
- "hookresult.empty": "(空)",
121985
- "anomaly.rapid_refire": "上次压缩结束仅 {elapsed} 秒后再次触发自动压缩。",
121986
- "anomaly.first_step_blowup": "会话首次自动压缩时上下文已达 {pct}%,可能存在巨型文件读取或初始 prompt 过大。",
121987
- "replayhook.blocked": "已阻止",
121988
- "replayhook.empty": "(空)",
121989
- "cronmsg.missed_reminder": "错过的定时提醒",
121990
- "cronmsg.reminder_fired": "定时提醒触发",
121991
- "cronmsg.one_time": "一次性",
121992
- "cronmsg.coalesced": "{count} 次合并触发",
121993
- "cronmsg.missed": "{count} 次错过",
121994
- "cronmsg.final_delivery": "最终投递",
121995
- "thinking.in_progress": "思考中...",
121996
- "shell.more_lines": "...(还有 {count} 行,按 ctrl+o 展开)",
121997
- "ccconnect.note_botfather": "需先在 @BotFather 创建 bot",
121998
- "ccconnect.note_napcat": "需要 NapCat/OneBot",
121999
- "ccconnect.note_wecom": "需要公网 IP",
122000
- "ccconnect.config_comment_attachment": "# 全局:允许/禁止图片和文件回传到聊天(on = 开启,off = 关闭)",
122001
- "ccconnect.reconfigured": "{name} 已配置(配置不会丢失)",
122002
- "ccconnect.config_path": "配置文件:{path}",
122003
- "ccconnect.config_done": "✔ {name} 通道配置完成",
122004
- "ccconnect.config_written": "配置文件已写入:{path}",
122005
- "ccconnect.quick_ref": "📋 常用管理指令(建议复制保存):",
122006
- "ccconnect.pm2_status": " pm2 status 查看运行状态(online = 正常)",
122007
- "ccconnect.pm2_restart": " pm2 restart cc-connect 重启服务",
122008
- "ccconnect.pm2_stop": " pm2 stop cc-connect 停止服务",
122009
- "ccconnect.pm2_logs": " pm2 logs cc-connect 查看日志",
122010
- "ccconnect.pm2_delete": " pm2 delete cc-connect 完全删除",
122011
- "ccconnect.reconfigure_warning": " ⚠ 不要再次运行 /cc-connect 并选择相同平台,否则会覆盖已有配置!",
122012
- "ccconnect.reconfigure_change": " 如需更换平台,请先删除 C:\\Users\\<用户名>\\.cc-connect\\config.toml",
122013
- "ccconnect.init_steps": "📋 初始化步骤(仅首次配置时需要,按顺序执行):",
122014
- "ccconnect.step_platform_auth": " 第 1 步:平台认证{note}",
122015
- "ccconnect.once_tag": "(一次性)",
122016
- "ccconnect.step_n": " 第 {num} 步:{label}{once}",
122017
- "ccconnect.auto_done": " ✅ 已自动完成,无需手动操作 ({command})",
122018
- "ccconnect.more_commands": "更多指令 ({method}):",
122019
- "ccconnect.attachment_hint": "💡 激活附件回传(让 Agent 能发图片和文件):",
122020
- "ccconnect.bind_setup": " 在聊天窗口发送 /bind setup",
122021
- "ccconnect.autostart_hint": "💡 开机自启已通过 Startup 文件夹中的 cc-connect-startup.bat 实现。",
122022
- "ccconnect.manual_restart": " 如需手动重启服务:pm2 resurrect",
122023
- "ccconnect.not_installed": "cc-connect 未安装",
122024
- "ccconnect.install_guide": "请先在终端运行:\n\n npm install -g cc-connect\n\n安装完成后重新输入 /cc-connect 配置平台。",
122025
- "ccconnect.already_configured": "{name} ✔ 已配置",
122026
- "ccconnect.picker_title": "cc-connect 快速通道配置",
122027
- "ccconnect.picker_hint": "选择要连接的平台,配置将自动写入 ~/.cc-connect/config.toml",
122028
- "market.gsap_name": "GSAP 动画技能包",
122029
- "market.gsap_desc": "GreenSock 动画平台全套参考手册,含核心 API、Timeline、ScrollTrigger、插件、React 集成等 8 个技能",
122030
- "market.design_card_name": "Claude Design Card",
122031
- "market.design_card_desc": "14 种设计卡片生成(封面/图文/社交分享/长篇排版),Parchment × Swiss 双风格体系",
122032
- "market.superpowers_name": "Superpowers 开发技能包",
122033
- "market.superpowers_desc": "14 个开发方法论技能:TDD、系统调试、代码审查、子代理驱动开发、并行代理、头脑风暴等",
122034
- "market.scrapling_name": "Scrapling 网页爬取",
122035
- "market.scrapling_desc": "基于 Scrapling 的智能爬虫技能,支持 Cloudflare/WAF 绕过、登录会话、自动抓取解析",
122036
- "market.astock_name": "A 股数据分析",
122037
- "market.astock_desc": "A 股市场数据查询分析,27 个接口覆盖行情/研报/资金流/新闻/基本面,含 4 套内置研究流程",
122038
- "market.humanizer_name": "Humanizer AI 文本去味",
122039
- "market.humanizer_desc": "去除 AI 写作痕迹:30 种 AI 模式检测 × 5 大类 × 语音校准,输出纯正人类文风",
122040
- "market.patent_name": "Patent Disclosure 专利交底书",
122041
- "market.patent_desc": "专利交底书自动生成:专利点挖掘 → 国知局查新 → 脱敏成文 → 自检闭环,Mermaid 附图,输出 .docx",
122042
- "market.contract_name": "Contract Review Pro 合同审查",
122043
- "market.contract_desc": "专业合同审查:7 步工作流 × 5 强制关 × 15 类风险标签 × 六维评估,输出批注合同+法律意见书+分析备忘录,支持 30 种合同类型",
122044
- "market.academic_name": "Academic Research 学术研究",
122045
- "market.academic_desc": "完整学术研究管线:深度研究(13 Agent 团队 × 7 种模式)+ 学术写作(12 Agent 管线)+ 同行评审(7 Agent 多视角审稿),全流程覆盖",
122046
- "market.headroom_name": "Headroom 压缩优化",
122047
- "market.headroom_desc": "在内容送达 LLM 前压缩工具输出、日志、文件和 RAG 块,节省 60-95% Token,答案质量不变",
122048
- "market.xiaohu_wechat_name": "小壶公众号排版",
122049
- "market.xiaohu_wechat_desc": "Markdown → 微信兼容 HTML → 推送草稿箱,30 套主题 + 可视化画廊,一键排版发布",
122050
- "market.huashu_name": "花束设计",
122051
- "market.huashu_desc": "HTML 原生设计技能:高保真原型 / 幻灯片 / 动画 + 20 设计哲学 + 5 维评审 + MP4 导出",
122052
- "market.html_video_name": "HTML Video 视频生成",
122053
- "market.html_video_desc": "HTML 转 MP4:可插拔渲染引擎 + 21 套模板 + AI 配乐,全程本地,零渲染费用",
122054
- "market.xiaohu_translate_name": "小壶视频翻译",
122055
- "market.xiaohu_translate_desc": "外语视频自动配中文字幕:下载 / 转写 / 翻译 / 润色 / 烧录一条龙,全程本地",
122056
- "market.videocut_name": "视频剪辑 Agent",
122057
- "market.videocut_desc": "Claude Code Skills 驱动的视频剪辑 Agent:口播剪辑 / 字幕导入 / 画质高清化",
122058
- "market.taste_name": "Taste Skill 设计品味",
122059
- "market.taste_desc": "给 AI 好品味:阻止生成无聊通用的设计,输出有质感的方案",
122060
- "market.vtake_name": "VTake 视频剪辑",
122061
- "market.vtake_desc": "Agent Skills 驱动的视频剪辑工具",
122062
- "market.remotion_name": "Remotion 视频技能",
122063
- "market.remotion_desc": "Remotion(React 视频框架)官方技能包",
122064
- "market.html_anything_name": "HTML Anything 全能设计",
122065
- "market.html_anything_desc": "75 个技能 × 9 种场景:杂志 / 幻灯片 / 海报 / 小红书 / 数据报告 / 原型,零 API 密钥",
122066
- "market.guizang_name": "归藏社交卡片",
122067
- "market.guizang_desc": "小红书轮播图 + 公众号封面:28 种布局 × 10 套主题,Editorial × Swiss 视觉体系,单文件 HTML → PNG",
122068
- "prompts.logout_title": "选择要登出的提供商",
122069
- "prompts.no_wire_provider": "目录中没有支持该 wire 类型的提供商。",
122070
- "prompts.select_provider": "选择提供商",
122071
- "prompts.wire_openai": "OpenAI 兼容协议",
122072
- "prompts.wire_openai_desc": "适用于 DeepSeek、OpenAI、Groq 等",
122073
- "prompts.wire_anthropic": "Anthropic 协议",
122074
- "prompts.wire_anthropic_desc": "适用于 Claude 系列模型",
122075
- "prompts.thinking_off": "关闭思考",
122076
- "prompts.thinking_low": "低强度思考",
122077
- "prompts.thinking_medium": "中强度思考",
122078
- "prompts.thinking_high": "高强度思考",
122079
- "prompts.image_off": "关闭识图",
122080
- "prompts.image_off_desc": "模型不支持图片输入时请选择此项",
122081
- "prompts.image_on": "开启识图",
122082
- "prompts.image_on_desc": "模型支持图片输入时开启,允许发送图片",
122083
- "prompts.video_off": "关闭视频",
122084
- "prompts.video_off_desc": "模型不支持视频输入时请选择此项",
122085
- "prompts.video_on": "开启视频",
122086
- "prompts.video_on_desc": "模型支持视频输入时开启,允许发送视频",
122087
- "prompts.audio_off": "关闭音频",
122088
- "prompts.audio_off_desc": "模型不支持音频输入时请选择此项",
122089
- "prompts.audio_on": "开启音频",
122090
- "prompts.audio_on_desc": "模型支持音频输入时开启,允许发送音频",
122091
- "prompts.wire_type_title": "选择兼容协议",
122092
- "prompts.wire_type_hint": "选择模型服务商的 API 协议类型",
122093
- "prompts.thinking_title": "思考模式",
122094
- "prompts.thinking_hint": "选择模型思考强度(需要模型支持)",
122095
- "prompts.image_title": "多模态配置 · 图片输入",
122096
- "prompts.video_title": "多模态配置 · 视频输入",
122097
- "prompts.audio_title": "多模态配置 · 音频输入",
122098
- "prompts.modal_off_hint": "模型不支持请选择关闭",
122099
- "info.mcp_load_failed": "加载 MCP 服务器失败:{msg}",
122100
- "config.plan_cleared": "计划已清除",
122101
- "config.yolo_already_on": "YES 模式已开启",
122102
- "config.yolo_on": "YES 模式:开启",
122103
- "config.yolo_on_desc": "工作区工具自动批准。",
122104
- "config.yolo_already_off": "YES 模式已关闭",
122105
- "config.yolo_off": "YES 模式:关闭",
122106
- "config.yolo_toggle_on": "YES 模式:开启",
122107
- "config.yolo_toggle_on_desc": "工作区工具已自动批准。",
122108
- "config.auto_already_on": "自动模式已开启",
122109
- "config.auto_on": "自动模式:开启",
122110
- "config.auto_on_desc": "工具自动批准。代理不会提问。",
122111
- "config.auto_already_off": "自动模式已关闭",
122112
- "config.auto_off": "自动模式:关闭",
122113
- "config.auto_toggle_on": "自动模式:开启",
122114
- "config.auto_toggle_on_desc": "工具自动批准。代理不会提问。",
122115
- "settings.title": "设置",
122116
- "settings.model": "模型",
122117
- "settings.model_desc": "切换当前模型和思考模式。",
122118
- "settings.language": "语言 Language",
122119
- "settings.language_desc": "切换界面语言 / Switch interface language",
122120
- "settings.permission": "权限",
122121
- "settings.permission_desc": "选择工具操作的批准方式。",
122122
- "settings.theme": "主题",
122123
- "settings.theme_desc": "更改终端 UI 主题。",
122124
- "settings.editor": "编辑器",
122125
- "settings.editor_desc": "设置外部编辑器命令。",
122126
- "settings.usage": "用量",
122127
- "settings.usage_desc": "显示会话 token、上下文窗口和计划配额。",
122128
- "dispatch.session_picker_failed": "打开会话选择器失败:{error}",
122129
- "dispatch.tasks_browser_failed": "打开任务浏览器失败:{error}",
122130
- "dispatch.usage_failed": "显示使用情况失败:{error}",
122131
- "dispatch.status_failed": "显示状态报告失败:{error}",
122132
- "constant.llm_not_set": "LLM 未设置,运行 /config 自定义模型配置",
122133
- "constant.no_active_session": "没有活动会话。运行 /config 自定义模型配置。",
122134
- "constant.ctrl_d_hint": "再次按 Ctrl+D 退出",
122135
- "constant.ctrl_c_hint": "再次按 Ctrl+C 退出",
122136
- "tui.resume_warning": "警告:{warning}",
122137
- "tui.organizing_memory": "正在整理会话记忆...",
122138
- "tui.skill_failed": "Skill \"{skill}\" 执行失败:{message}",
122139
- "tui.replay_no_new_session": "历史回放期间无法启动新会话。",
122140
- "adapter.task_label": "任务 {taskId}",
122141
- "knowledge.path_placeholder": "/path/to/doc.md 或 /path/to/docs",
122142
- "knowledge.ingest_summary": "总计: {chunks} chunks, {events} events, {entities} entities",
122143
- "knowledge.empty_store": "知识库为空,请先用 /knowledge 摄入文档",
122144
- "knowledge.web_opened": "知识图谱已打开: {url}",
122145
- "cc.clean_config.detail": " ~/.cc-connect(含会话记录、配置、日志)",
122146
- "registry.auto_desc": "切换自动权限模式",
122147
- "registry.yolo_desc": "切换至自动批准模式(yolo)",
122148
- "registry.wolfpack_desc": "切换群狼协作模式,自动批准+批量并发",
122149
- "registry.sessions_desc": "浏览并恢复会话",
122150
- "registry.goal_desc": "查看/管理自动目标",
122151
- "registry.loop_desc": "循环模式(无状态重试,配 --verify 验证结果)",
122152
- "registry.memory_desc": "浏览、搜索、注入记忆备忘录",
122153
- "registry.knowledge_desc": "管理本地知识库(摄入/搜索/删除/统计)",
122154
- "registry.new_desc": "在当前工作区开启新会话",
122155
- "registry.model_desc": "切换 LLM 模型",
122156
- "mcp.desktop_desc": "macOS 桌面自动化:截图/点击/键入/滚动/窗口管理(Background delivery,无需聚焦)",
122157
- "mcp.browser_desc": "浏览器自动化:46 个工具,支持导航/点击/填表/截图/性能分析/内存调试/扩展管理",
122158
- "kw.title": "Scream 知识图谱",
122159
- "kw.entity": "实体",
122160
- "kw.event": "事件",
122161
- "kw.relation": "关系",
122162
- "kw.search_placeholder": "搜索...",
122163
- "kw.btn_reset": "重置",
122164
- "kw.btn_expand": "全部",
122165
- "registry.compact_desc": "压缩对话上下文",
122166
- "registry.make_skill_desc": "从当前会话沉淀工作流为 Skill",
122167
- "registry.plan_desc": "切换计划模式",
122168
- "registry.fusionplan_desc": "切换融合计划模式(多子代理并行规划)",
122169
- "registry.tasks_desc": "浏览后台任务",
122170
- "registry.help_desc": "显示可用命令和快捷键",
122171
- "registry.status_desc": "显示当前会话和运行时状态",
122172
- "registry.usage_desc": "显示 token 用量和上下文窗口",
122173
- "registry.btw_desc": "在不中断对话的情况下快速提问",
122174
- "registry.like_desc": "设置你的偏好(昵称、语气、其他偏好)",
122175
- "registry.mcp_desc": "管理 MCP 服务器(安装/停用/卸载)",
122176
- "registry.skill_desc": "技能中心,管理 Skill 技能,含激活、安装、卸载等",
122177
- "registry.cc_desc": "操控你的cc(启动/关闭/重启)",
122178
- "registry.cc_connect_desc": "cc-connect 快速通道配置(需先安装)",
122179
- "registry.revoke_desc": "撤回上一次对话(可指定轮数,如 /revoke 3)",
122180
- "registry.fork_desc": "复制当前会话并新开分支",
122181
- "registry.title_desc": "设置或显示会话标题",
122182
- "registry.config_desc": "浏览并配置模型(远程拉取最新目录)",
122183
- "registry.permission_desc": "选择权限模式",
122184
- "registry.theme_desc": "设置终端 UI 主题",
122185
- "registry.language_desc": "切换界面语言 / Switch interface language",
122186
- "registry.editor_desc": "设置外部编辑器",
122187
- "registry.settings_desc": "打开 TUI 设置",
122188
- "registry.init_desc": "分析代码库并生成 AGENTS.md",
122189
- "registry.export_md_desc": "导出当前会话为 Markdown",
122190
- "registry.export_debug_desc": "导出当前会话为调试 ZIP 存档",
122191
- "registry.update_desc": "手动更新 Scream Code 到最新版本",
122192
- "registry.version_desc": "显示版本信息",
122193
- "registry.logout_desc": "删除已配置的模型",
122194
- "registry.exit_desc": "退出应用",
122195
- "kw.hint_drag": "拖拽平移 · 滚轮缩放 · 单击展开/收起 · 双击详情",
122196
- "kw.detail_name": "名称",
122197
- "kw.detail_type": "类型",
122198
- "kw.detail_category": "分类",
122199
- "kw.detail_weight": "权重",
122200
- "kw.detail_description": "描述",
122201
- "kw.detail_keywords": "关键词",
122202
- "kw.detail_related": "关联",
122203
- "kw.btn_collapse": "收起",
122204
- "kw.btn_expand_all": "全部展开",
122205
- "kw.btn_collapse_all": "全部收起",
122206
- "kw.loading": "加载中",
122207
- "kw.loading_timeout": "数据未在 8 秒内返回,请检查终端",
122208
- "kw.no_data": "无法加载",
122209
- "kw.no_data_hint": "请先用 /knowledge 摄入文档",
122210
- "kw.no_results": "无匹配结果",
122211
- "kw.back": "返回",
122212
- "kw.root_label": "根",
122213
- "kw.close": "关闭",
122214
- "tui.invalid_config": "~/.scream-code/tui.toml 中的 TUI 配置无效;使用默认配置。",
122215
- "goal.storm_breaker": "Storm Breaker(风暴守护者)",
122216
- "goalpanel.goal_placeholder": "<目标描述>",
122217
- "wolfpack.on": "WolfPack 模式:开启",
122218
- "wolfpack.on_desc": "批量并发代理已激活。",
122219
- "wolfpack.off": "WolfPack 模式:关闭",
122220
- "badge.plan": "计划",
122221
- "badge.fusion": "融合计划",
122222
- "badge.wolfpack": "群狼",
122223
- "badge.loop": "循环",
122224
- "badge.goal": "目标",
122225
- "badge.auto": "自动",
122226
- "badge.yes": "YES",
122227
- "kw.lang_toggle": "English",
122228
- "kw.embedding_downloading": "向量模型下载中…",
122229
- "kw.embedding_failed": "向量模型加载失败,请返回菜单选择重新下载(建议科学上网)",
122230
- "kw.embedding_ready": "向量模型已就绪",
122231
- "kw.embedding_not_downloaded": "向量模型未下载(选择「下载向量模型」手动下载)",
122232
- "kw.embedding_already_installed": "向量模型已安装,无需重新下载"
122233
- },
122234
- en: {
122235
- "status.not_set": "Not set",
122236
- "status.none": "None",
122237
- "status.model_name": "Model",
122238
- "status.work_dir": "Work dir",
122239
- "status.permission_mode": "Permission",
122240
- "status.plan_mode": "Plan mode",
122241
- "status.session_id": "Session ID",
122242
- "status.session_title": "Session title",
122243
- "status.status_warning": "Status warning",
122244
- "status.context_window": "Context window",
122245
- "status.no_context_data": "No context window data available.",
122246
- "tasks.no_session": "No active session.",
122247
- "tasks.load_failed": "Failed to load tasks: {msg}",
122248
- "tasks.refresh_output_failed": "Failed to refresh output: {msg}",
122249
- "tasks.refresh_failed": "Refresh failed: {msg}",
122250
- "tasks.already_stopped": "{name} is already stopped — no need to stop.",
122251
- "tasks.refreshing": "Refreshing…",
122252
- "tasks.stopping": "Stopping {name}…",
122253
- "tasks.user_stopped": "User initiated stop",
122254
- "tasks.stop_failed": "Stop failed: {msg}",
122255
- "tasks.open_output_failed": "Cannot open output: {msg}",
122256
- "status.idle": "○ Idle",
122257
- "status.thinking": "Thinking",
122258
- "status.composing": "Writing",
122259
- "status.tool": "Running",
122260
- "status.waiting": "Waiting",
122261
- "status.verifying": "Verifying",
122262
- "approval.allow_once": "Allow Once",
122263
- "approval.allow_session": "Allow Session",
122264
- "approval.deny": "Deny",
122265
- "approval.deny_feedback": "Deny & Feedback",
122266
- "approval.revise": "Revise",
122267
- "approval.approve": "Approve",
122268
- "approval.edit": "Edit ",
122269
- "approval.file": "File",
122270
- "approval.stop_task": "Stop task:",
122271
- "approval.start": "Start ",
122272
- "approval.agent": "Agent",
122273
- "approval.invoke_skill": "Invoke skill ",
122274
- "approval.fetch": "Fetch ",
122275
- "approval.search": "Search:",
122276
- "approval.todo_update": "Update todo list ({count} items)",
122277
- "approval.background": "Background",
122278
- "approval.danger.recursive_delete": "Recursive delete",
122279
- "approval.danger.pipe_to_shell": "Pipe to shell",
122280
- "approval.danger.dd_write": "dd write",
122281
- "approval.danger.raw_device": "Write to raw device",
122282
- "approval.danger.fork_bomb": "Fork bomb",
122283
- "approval.stop_task_prefix": "Stop task ",
122284
- "approval.header.command": "Execute this command?",
122285
- "approval.header.file_write": "Write this file?",
122286
- "approval.header.file_edit": "Apply these edits?",
122287
- "approval.header.stop_task": "Stop this task?",
122288
- "approval.header.plan": "Build according to this plan?",
122289
- "approval.header.generic": "Approve {name}?",
122290
- "approval.feedback_hint": "Enter feedback · ↵ to submit.",
122291
- "common.cancel": "Cancel",
122292
- "common.confirm": "Confirm",
122293
- "common.submit": "Submit",
122294
- "common.back": "Back",
122295
- "common.close": "Close",
122296
- "common.delete": "Delete",
122297
- "common.install": "Install",
122298
- "common.uninstall": "Uninstall",
122299
- "common.restart": "Restart",
122300
- "common.start": "Start",
122301
- "common.stop": "Stop",
122302
- "common.off": "Off",
122303
- "common.on": "On",
122304
- "common.done": "Done",
122305
- "common.fail": "Failed",
122306
- "common.running": "Running",
122307
- "common.not_set": "Not set",
122308
- "error.path_empty": "Path cannot be empty",
122309
- "error.path_not_exist": "Path does not exist: {path}",
122310
- "error.unsupported_format": "Only .md, .markdown, .txt files are supported",
122311
- "error.image_not_supported": "Current model does not support image input.",
122312
- "error.video_not_supported": "Current model does not support video input.",
122313
- "error.network_timeout": "Network timeout. Check your connection or try with a proxy.",
122314
- "error.load_failed": "Load failed: {msg}",
122315
- "error.internal": "Internal error",
122316
- "error.no_session": "No active session.",
122317
- "footer.shift_tab": "shift+tab: Plan mode",
122318
- "footer.model": "/model: Switch model",
122319
- "footer.ctrl_s": "ctrl+s: Interrupt",
122320
- "footer.compact": "/compact: Compress context",
122321
- "footer.ctrl_o": "ctrl+o: Expand tool output",
122322
- "footer.tasks": "/tasks: Background tasks",
122323
- "footer.shift_enter": "shift+enter: New line",
122324
- "footer.init": "/init: Generate AGENTS.md",
122325
- "footer.at": "@: Mention files",
122326
- "footer.ctrl_c": "ctrl+c: Cancel",
122327
- "footer.skill": "/skill: Skill center",
122328
- "footer.help": "/help: Show commands",
122329
- "footer.config": "/config: Configure your model provider",
122330
- "footer.reminder": "Let Scream schedule tasks, e.g. \"remind me to pick up the package in 2 hours\"",
122331
- "footer.context": "Context: {pct} ({tokens}/{maxTokens})",
122332
- "footer.context_short": "Context: {pct}",
122333
- "footer.tasks_running": "{count} tasks running",
122334
- "footer.agents_running": "{count} agents running",
122335
- "lifecycle.memory_countdown": "No activity for 15 min, about to extract session memories",
122336
- "lifecycle.memory_cancel_hint": "Press Ctrl+W to cancel (auto-starts in {seconds}s)",
122337
- "lifecycle.memory_cancelled": "Memory extraction cancelled",
122338
- "lifecycle.memory_processing": "Extracting session memories...",
122339
- "lifecycle.memory_done": "Extracted {count} memories to notebook",
122340
- "lifecycle.memory_none": "No new memories to extract",
122341
- "lifecycle.memory_failed": "Memory extraction failed, try again later",
122342
- "input.replay_blocked": "Cannot send input while session history is replaying.",
122343
- "input.send_failed": "Send failed: {message}",
122344
- "input.guide_failed": "Guide failed: {message}",
122345
- "welcome.config": "/config Configure model",
122346
- "welcome.sessions": "/sessions Resume session",
122347
- "welcome.quick_menu": "/ Open quick menu",
122348
- "welcome.just_now": "just now",
122349
- "welcome.minutes_ago": "{minutes}m ago",
122350
- "welcome.hours_ago": "{hours}h ago",
122351
- "welcome.days_ago": "{days}d ago",
122352
- "welcome.no_recent": "No recent sessions",
122353
- "welcome.recent": "Recent sessions",
122354
- "welcome.like_active": "like active",
122355
- "welcome.like_inactive": "like not loaded",
122356
- "loading.ai": "AI is loading...",
122357
- "loading.waking": "Waking core...",
122358
- "loading.press_enter": "Press ENTER to wake core",
122359
- "loading.quit_hint": "Hold Ctrl+C to quit Scream Code",
122360
- "language.picker_title": "Language / 语言",
122361
- "language.picker_hint": "↑↓ Select · Enter confirm · Esc cancel",
122362
- "language.unchanged": "Language unchanged: \"{locale}\".",
122363
- "language.save_failed": "Failed to save language: {error}",
122364
- "language.switched": "Language switched to {locale}",
122365
- "language.restart_hint": "Restart scream-code for all UI text to take effect",
122366
- "knowledge.chunking": "Chunking file...",
122367
- "knowledge.embedding_chunks": "Embedding chunks: {index}/{total}",
122368
- "knowledge.extracting": "Extracting events: {index}/{total}",
122369
- "knowledge.embedding_events": "Embedding events: {index}/{total}",
122370
- "knowledge.embedding_entities": "Embedding entities...",
122371
- "knowledge.embedding_relations": "Embedding relations...",
122372
- "knowledge.error": "Error: {msg}",
122373
- "knowledge.ingest": "Ingest files",
122374
- "knowledge.ingest_desc": "Enter a markdown/txt file or folder path [Ingestion calls LLM for event extraction; for large files, consider a cost-effective model]",
122375
- "knowledge.ingesting": "Starting ingest...",
122376
- "knowledge.ingest_done": "Ingest complete",
122377
- "knowledge.ingest_fail": "Ingest failed",
122378
- "knowledge.batch_done": "Batch ingest complete",
122379
- "knowledge.batch_partial": "Batch ingest complete (some failed)",
122380
- "knowledge.succeeded": "Succeeded: {count} files",
122381
- "knowledge.failed": "Failed: {count} files",
122382
- "knowledge.failed_files": "Failed files:",
122383
- "knowledge.file_label": "File",
122384
- "knowledge.docs_title": "Knowledge Documents",
122385
- "knowledge.empty": "Knowledge base is empty. Use /knowledge to ingest documents first.",
122386
- "knowledge.search": "Search",
122387
- "knowledge.search_desc": "Enter a query to test multi-hop retrieval",
122388
- "knowledge.search_placeholder": "e.g. Who are the competitors of Company A?",
122389
- "knowledge.searching": "Searching...",
122390
- "knowledge.search_done": "Search complete",
122391
- "knowledge.search_fail": "Search failed",
122392
- "knowledge.search_result": "Search Results",
122393
- "knowledge.no_hits": "Query \"{query}\" matched no chunks",
122394
- "knowledge.vector_degraded": "Vector model not ready, using keyword search mode. If download failed, try enabling a proxy and restart.",
122395
- "knowledge.query_label": "Query",
122396
- "knowledge.no_title": "(untitled)",
122397
- "knowledge.source_label": "Source",
122398
- "knowledge.delete": "Delete",
122399
- "knowledge.delete_desc": "Delete a document (cascades to related data)",
122400
- "knowledge.delete_pick": "Select a document to delete",
122401
- "knowledge.cascade_warning": "Deletion is irreversible. Related chunks/events/entities will be cascade-deleted (Esc to cancel)",
122402
- "knowledge.cascade_delete": "Cascade delete",
122403
- "knowledge.confirm_delete": "Confirm Delete",
122404
- "knowledge.confirm_delete_name": "Delete \"{name}\"?",
122405
- "knowledge.no_delete_data": "Go back without deleting anything",
122406
- "knowledge.no_delete": "No documents to delete",
122407
- "knowledge.delete_fail_not_found": "Delete failed: document not found",
122408
- "knowledge.deleted": "Deleted",
122409
- "knowledge.doc_removed": "Document removed from knowledge base",
122410
- "knowledge.cancelled": "Cancelled",
122411
- "knowledge.no_delete_doc": "No documents deleted",
122412
- "knowledge.stats": "Knowledge Base Stats",
122413
- "knowledge.stats_desc": "View knowledge base statistics",
122414
- "knowledge.stats_note": "Notes",
122415
- "knowledge.stats_sources": "Ingested files/sources",
122416
- "knowledge.stats_documents": "Document metadata records",
122417
- "knowledge.stats_chunks": "Chunks (split by heading)",
122418
- "knowledge.stats_events": "LLM-extracted fusion events",
122419
- "knowledge.stats_entities": "Deduplicated entities",
122420
- "knowledge.ingest_full": "Ingest knowledge from markdown/txt files or folders (chunk + extract events + extract entities)",
122421
- "knowledge.doc_list": "Document List",
122422
- "knowledge.doc_list_desc": "View all ingested documents",
122423
- "knowledge.search_effect": "Enter a query to test multi-hop retrieval",
122424
- "knowledge.web": "Graph",
122425
- "knowledge.web_desc": "View interactive knowledge graph in browser",
122426
- "knowledge.download_model": "Download vector model",
122427
- "knowledge.download_model_desc": "Manually download the bge-small-zh-v1.5 model (~95 MB) to enable semantic search",
122428
- "knowledge.download_model_installed": " (installed)",
122429
- "knowledge.download_model_retry_hint": "Return to the menu and select Download vector model to retry. A proxy is recommended.",
122430
- "knowledge.menu_title": "SAG Knowledge Base",
122431
- "knowledge.menu_hint": "Select an action (Esc to exit)",
122432
- "knowledge.op_failed": "Operation failed: {msg}",
122433
- "init.select_title": "Select AGENTS.md location",
122434
- "init.select_hint": "Current: {currentDir} · Project root: {projectRoot}",
122435
- "init.current_dir": "Current directory",
122436
- "init.current_dir_desc": "Generate and analyze current directory only",
122437
- "init.project_root": "Project root",
122438
- "init.project_root_desc": "Start from current directory, let AI explore upward to find root",
122439
- "init.cancelled": "Initialization cancelled",
122440
- "loop.permission_auto": "Permissions switched to auto (no approvals during loop).",
122441
- "loop.disabled": "Loop mode disabled.",
122442
- "loop.prompt_updated": "Loop prompt updated.",
122443
- "loop.fixed_prompt": "Prompt fixed; will be resent after each iteration.",
122444
- "loop.next_prompt": "The next prompt will be resent after each iteration.",
122445
- "loop.enabled": "Loop mode enabled",
122446
- "loop.hint_reset": "Tip: The same prompt is resent each iteration; AI has no memory of previous output.",
122447
- "loop.hint_goal": "Use /goal when you need to adapt strategy based on previous failures.",
122448
- "loop.conflict_goal": "An active goal (/goal) is running. /loop and /goal conflict:\nloop resets context each iteration, breaking goal iteration.\nDisable the goal first with /goal off.",
122449
- "loop.status_off": "Loop: off",
122450
- "loop.status_on": "Loop: on ({limit})",
122451
- "loop.status_repeating": "Loop: on (repeating prompt)",
122452
- "loop.status_waiting": "Loop: on (waiting for next prompt)",
122453
- "loop.title": "/loop mode",
122454
- "loop.limit_label": "Limit:",
122455
- "loop.verify_label": "Verify command:",
122456
- "loop.verify_hint": " (pass to stop).",
122457
- "loop.help_desc": "Stateless retry: resend the same prompt each iteration; AI has no memory of previous output. Pair with --verify to let an objective exit code decide when to stop.",
122458
- "loop.help_usage": "Usage: /loop [count|duration] [prompt] [--verify \"verify command\"]",
122459
- "loop.help_example_count": "· /loop 10 [prompt] — limit to 10 iterations",
122460
- "loop.help_example_duration": "· /loop 5m [prompt] — limit to 5 minutes",
122461
- "loop.help_example_combo": "· /loop 1h30m [prompt] — combined duration limit",
122462
- "loop.help_example_verify": "· /loop 10 fix lint --verify \"pnpm lint\" — run verify after each iteration, stop on pass",
122463
- "loop.help_suitable": "Suitable: waiting for CI, health-check polling, idempotent tasks that may fail and need retries.",
122464
- "loop.help_unsuitable": "Not suitable: tasks requiring strategy adjustment based on previous failures → use /goal (AI iterates with working notes).",
122465
- "loop.help_esc_hint": "Press Esc to pause current iteration; enter /loop again to disable loop.",
122466
- "loop.conflict_goal_title": "Storm Breaker",
122467
- "loop.command_ref": "/loop command reference:",
122468
- "loop.help_toggle": "· /loop — toggle loop on/off",
122469
- "loop.help_verify_short": "· /loop 10 ... --verify \"command\" — run verify after each iteration, stop on pass",
122470
- "goal.need_desc": "Please provide a goal description, e.g. /goal implement login",
122471
- "goal.no_active": "No active goal.",
122472
- "goal.no_resumable": "No resumable goal. Use /goal <objective> to set a new one.",
122473
- "goal.set": "🎯 Goal set: {objective}",
122474
- "goal.paused": "🎯 Goal paused. Use /goal resume to resume.",
122475
- "goal.resumed": "🎯 Goal resumed.",
122476
- "goal.cancelled": "🎯 Goal cancelled.",
122477
- "goal.conflict_loop": "Loop mode (/loop) is active. /goal and /loop conflict:\nloop resets context each iteration, breaking goal iteration.\nDisable loop first.",
122478
- "goal.create_failed": "Failed to create goal: {msg}",
122479
- "goal.pause_failed": "Failed to pause goal: {msg}",
122480
- "goal.resume_failed": "Failed to resume goal: {msg}",
122481
- "goal.cancel_failed": "Failed to cancel goal: {msg}",
122482
- "goal.status_failed": "Failed to get goal status: {msg}",
122483
- "goal.resume_hint": "Continue the current goal.",
122484
- "update.timeout": "Timed out, possibly due to network issues.",
122485
- "update.network_hint": "Check your network and retry (users in China may need a proxy).",
122486
- "update.network_error": "Failed: network error. Check your connection and retry.",
122487
- "update.network_hint_retry": "(Users in China may need a proxy. Retry if you get network errors.)",
122488
- "update.failed": "Failed: {msg}",
122489
- "update.signal": "Signal",
122490
- "update.exit_code": "Exit code",
122491
- "update.idle_only": "Please run updates when idle.",
122492
- "update.checking": "Checking for updates...",
122493
- "update.already_latest": "Already on latest version ({version})",
122494
- "update.updating": "Updating to {version}...",
122495
- "update.npm_install": "Installing latest version via npm...",
122496
- "update.install_label": "Install scream-code",
122497
- "update.done": "Update complete. Restart Scream Code to use the new version.",
122498
- "mcp.connecting": "⏳ Connecting",
122499
- "mcp.connected": "🔌 Connected",
122500
- "mcp.failed": "❌ Failed",
122501
- "mcp.disabled": "⏸ Disabled",
122502
- "mcp.auth_required": "🔐 Auth required",
122503
- "mcp.load_failed": "Failed to load MCP server: {msg}",
122504
- "mcp.install_success": "{name} installed and started.",
122505
- "mcp.install_fail": "{name} installation failed.",
122506
- "mcp.uninstall_confirm": "Uninstall \"{name}\"?",
122507
- "mcp.already_installed": "{name} is already installed.",
122508
- "mcp.disabled_done": "{name} disabled.",
122509
- "mcp.uninstalled": "{name} uninstalled.",
122510
- "mcp.no_session": "Please create or resume a session first.",
122511
- "mcp.manage_title": "MCP Management ({count} connected)",
122512
- "mcp.no_installed": "No MCP servers installed",
122513
- "mcp.recommended": "Recommended MCP (Enter to install)",
122514
- "mcp.installed": "Installed",
122515
- "mcp.install_enter": "Enter to install",
122516
- "mcp.confirm_uninstall": "Confirm Uninstall",
122517
- "mcp.uninstall_yes": "Yes, uninstall",
122518
- "mcp.installing": "Installing",
122519
- "mcp.configuring": "Configuring",
122520
- "mcp.network_timeout": "Network timeout. Check your connection or try with a proxy.",
122521
- "mcp.install_failed": "Install failed: {msg}",
122522
- "mcp.disable_failed": "Disable failed: {msg}",
122523
- "mcp.detected_starting": "Detected installation, starting...",
122524
- "mcp.start_failed": "Start failed: {msg}",
122525
- "mcp.uninstall_done": "Uninstalled.",
122526
- "mcp.uninstall_failed": "Uninstall failed: {msg}",
122527
- "mcp.footer_hint": "Enter install/toggle d uninstall Esc back",
122528
- "mcp.macos_only": "macOS only",
122529
- "cc.start": "Start",
122530
- "cc.stop": "Stop",
122531
- "cc.restart": "Restart",
122532
- "cc.uninstall": "Uninstall",
122533
- "cc.start_desc": "Start cc-connect daemon",
122534
- "cc.stop_desc": "Stop cc-connect daemon",
122535
- "cc.restart_desc": "Restart cc-connect daemon",
122536
- "cc.uninstall_desc": "Completely uninstall cc-connect (daemon + config + npm package)",
122537
- "cc.manage_title": "cc-connect Daemon Management",
122538
- "cc.operating": "{label} cc-connect...",
122539
- "cc.started": "cc-connect {label}",
122540
- "cc.start_failed": "{label} failed: {output}",
122541
- "cc.will_clean": "The following will be cleaned up:",
122542
- "cc.clean_daemon": "· Stop and uninstall {label} daemon",
122543
- "cc.clean_config": "· Delete config directory{detail}",
122544
- "cc.current_version": "· Current version: {version}",
122545
- "cc.install_path": "· Install path: {path}",
122546
- "cc.clean_pm2": "· Remove pm2 process + startup items (startup.bat / schtasks)",
122547
- "cc.clean_residual": "· Clean {count} residual files (launchd/systemd/pm2 logs)",
122548
- "cc.not_detected": "cc-connect installation not detected",
122549
- "cc.not_detected_desc": "cc-connect was not detected at the default npm global path. Uninstall aborted. Please report this to scream for manual cleanup guidance.",
122550
- "cc.uninstalling": "Uninstalling cc-connect…",
122551
- "cc.stop_daemon": "Stop daemon",
122552
- "cc.delete_label": "Delete",
122553
- "cc.clean_files": "Clean residual files",
122554
- "cc.uninstall_done": "cc-connect completely uninstalled",
122555
- "cc.uninstall_partial": "Some steps failed, see details below",
122556
- "cc.uninstalled": "cc-connect uninstalled",
122557
- "cc.restart_hint": "Restart Scream Code to ensure cc-connect state is fully cleared.",
122558
- "cc.uninstall_partial_label": "Uninstall partially failed",
122559
- "cc.residual": "Residual",
122560
- "cc.confirm_uninstall": "Completely uninstall cc-connect?",
122561
- "cc.uninstall_irreversible": "This cannot be undone. All cc-connect data will be removed.",
122562
- "cc.confirm_uninstall_btn": "Confirm Uninstall",
122563
- "auth.fetching_models": "Fetching latest model catalog...",
122564
- "auth.no_providers": "No model providers configured.",
122565
- "auth.deleted": "Deleted provider: {name}",
122566
- "auth.input_api_url": "Enter provider API URL",
122567
- "auth.api_url_hint": "e.g. https://api.deepseek.com (paste supported)",
122568
- "auth.input_api_key": "Enter API Key",
122569
- "auth.api_key_hint": "Key saved to ~/.scream/config.toml (paste supported, Esc to cancel)",
122570
- "auth.input_model": "Enter model name",
122571
- "auth.model_hint": "e.g. deepseek-v4-flash",
122572
- "auth.input_context": "Enter max context length (tokens)",
122573
- "auth.context_hint": "Default 131072, DeepSeek V4: 1000000",
122574
- "auth.connected": "Connected: {name}",
122575
- "like.priority": "User preferences set via /like have the highest priority and must be followed in every response.",
122576
- "like.nickname": "Set nickname",
122577
- "like.nickname_hint": "What should I call you? Leave empty to skip.",
122578
- "like.nickname_example": "e.g. Alex",
122579
- "like.tone": "Set response tone",
122580
- "like.tone_hint": "e.g. friendly, professional, humorous, concise (leave empty to skip)",
122581
- "like.tone_example": "e.g. friendly yet professional",
122582
- "like.other": "Other preferences",
122583
- "like.other_hint": "e.g. more examples, conclusion first, avoid jargon (leave empty to skip)",
122584
- "like.other_example": "e.g. Answer in English, avoid abbreviations",
122585
- "like.cancelled": "/like setup cancelled",
122586
- "like.saved": "Preferences saved (takes effect in next session)",
122587
- "revoke.streaming": "Cannot revoke during streaming — press Esc or Ctrl-C to cancel first.",
122588
- "revoke.usage": "Usage: /revoke [count], where count is a positive integer.",
122589
- "revoke.nothing": "Nothing to revoke.",
122590
- "revoke.failed": "Revoke failed: {msg}",
122591
- "btw.usage": "/btw usage",
122592
- "btw.desc": "Ask a quick question without interrupting the current conversation.",
122593
- "btw.example1": "Example: /btw How many packages does this project have?",
122594
- "btw.example2": "Example: /btw When does useEffect cleanup run?",
122595
- "btw.no_session": "Please create or resume a session before using /btw.",
122596
- "session.exporting_md": "Exporting session as Markdown…",
122597
- "session.no_messages": "No messages to export.",
122598
- "session.exporting": "Exporting session…",
122599
- "memory.inject_prefix": "[The user injected the following history from the memory notebook]",
122600
- "memory.history_title": "History Memo",
122601
- "memory.requirement": "Requirement",
122602
- "memory.plan": "Plan",
122603
- "memory.plan_none": "(none)",
122604
- "memory.result": "Result",
122605
- "memory.pitfall": "Pitfalls",
122606
- "memory.pitfall_none": "None",
122607
- "memory.experience": "Lessons learned",
122608
- "memory.experience_none": "None",
122609
- "memory.source_session": "Source session",
122610
- "memory.record_time": "Recorded at",
122611
- "memory.inject_hint": "Please refer to the above experience when handling the current task. Pay special attention to pitfalls — do not repeat those errors.",
122612
- "makeskill.wait": "Please wait for the current response to finish before using /make-skill",
122613
- "dialog.nav": "↑↓ Navigate",
122614
- "dialog.page": "←→ Page",
122615
- "dialog.select": "Enter Select",
122616
- "dialog.cancel": "Esc Cancel",
122617
- "dialog.search_placeholder": "(type to search)",
122618
- "session.title": "Sessions",
122619
- "session.loading": "Loading sessions...",
122620
- "session_picker.empty": "No sessions found. Press Escape to close.",
122621
- "session_picker.cc_restricted": "CC sessions cannot be switched or deleted. Use the file path below to manage manually",
122622
- "session.picker_title": "Sessions ",
122623
- "session.delete_confirm": "⚠️ Press Enter to confirm delete, Esc to cancel",
122624
- "session.picker_hint": "(↑↓ Navigate, Enter Select, d Delete, Esc Cancel)",
122625
- "model.nav_model": "↑↓ Model",
122626
- "model.nav_thinking": "←→ Thinking",
122627
- "model.nav_page": "PgUp/PgDn Page",
122628
- "model.nav_select": "Enter Switch model",
122629
- "model.nav_cancel": "Esc Cancel",
122630
- "model.search_placeholder": "(type to search)",
122631
- "model.select_title": " Select Model",
122632
- "model.search_label": " Search: ",
122633
- "model.thinking_global": " Thinking (Global)",
122634
- "model.multimodal": " Multimodal",
122635
- "model.image": "Image",
122636
- "model.supported": "✓ Supported",
122637
- "model.not_supported": "✗ Not supported",
122638
- "model.video": "Video",
122639
- "model.audio": "Audio",
122640
- "help.toggle_plan": "Toggle plan mode",
122641
- "help.toggle_output": "Toggle tool output expansion",
122642
- "help.interrupt": "Interrupt — insert follow-up prompt during streaming",
122643
- "help.newline": "Insert newline",
122644
- "help.cancel_stream": "Cancel stream / Clear input",
122645
- "help.exit": "Exit (when input is empty)",
122646
- "help.close_dialog": "Close dialog / Cancel stream",
122647
- "help.browse_history": "Browse input history",
122648
- "help.submit": "Submit",
122649
- "help.title": " Help ",
122650
- "help.close_hint": "Esc / Enter / q Close · ↑↓ Scroll",
122651
- "help.welcome_msg": "Scream is ready to help! Send a message to get started.",
122652
- "help.shortcuts": "Keyboard Shortcuts",
122653
- "help.slash_commands": "Slash Commands",
122654
- "help.showing_range": "Showing {start}-{end} / {total}",
122655
- "question.other": "Other",
122656
- "question.unanswered": "Not answered",
122657
- "question.check_before_submit": "Review your answers before submitting",
122658
- "question.ready_to_submit": "Ready to submit your answers?",
122659
- "question.partial_unanswered": "Some questions are not answered yet.",
122660
- "question.submit": "Submit",
122661
- "question.cancel": "Cancel",
122662
- "question.label": " Question",
122663
- "question.input_hint": " Type your answer, then press Enter to save.",
122664
- "question.more_lines": "more lines",
122665
- "question.showing_range": "Showing {start}-{end} / {total}",
122666
- "question.input_placeholder": "Enter answer",
122667
- "question.save_hint": "↵ Save",
122668
- "question.tab_switch": "tab Switch",
122669
- "question.esc_cancel": "esc Cancel",
122670
- "question.arrow_select": "▲/▼ Select",
122671
- "question.tab_arrow_switch": "←/→/tab Switch",
122672
- "question.enter_confirm": "↵ Confirm",
122673
- "question.toggle": "Toggle",
122674
- "question.choose": "Select",
122675
- "memory.just_now": "just now",
122676
- "memory.minutes_ago": "{minutes}m ago",
122677
- "memory.hours_ago": "{hours}h ago",
122678
- "memory.days_ago": "{days}d ago",
122679
- "memory.compaction_extract": "Compaction",
122680
- "memory.manual_record": "Manual",
122681
- "memory.exit_extract": "Exit extraction",
122682
- "memory.search_label": "Search: ",
122683
- "memory.notebook_title": "Memory Notebook ",
122684
- "memory.esc_clear_search": "(Esc clear search)",
122685
- "memory.nav_hint": "(↑↓ Navigate, Enter View, i Inject, d Delete, / Search, Esc Close)",
122686
- "memory.loading": "Loading...",
122687
- "memory.no_match": "No memories matching \"{query}\".",
122688
- "memory.empty": "No memories yet.",
122689
- "memory.auto_extract_hint": " Memories are extracted automatically when compacting or exiting a session.",
122690
- "memory.deleting": "Delete: ",
122691
- "memory.delete_confirm_hint": " Press Enter to confirm delete, Esc to cancel",
122692
- "memory.showing_range": "{start}-{end} / {total} items",
122693
- "memory.id_label": "ID: ",
122694
- "memory.source_label": "Source: ",
122695
- "memory.project_label": "Project: ",
122696
- "memory.tags_label": "Tags: ",
122697
- "memory.plan_label": "Plan: ",
122698
- "memory.requirement_label": "Requirement: ",
122699
- "memory.result_label": "Result: ",
122700
- "memory.session_label": "Session: ",
122701
- "memory.pitfall_label": "Pitfalls: ",
122702
- "memory.experience_label": "Experience: ",
122703
- "memory.detail_nav_hint": " Enter/Esc Back | i Inject | d Delete",
122704
- "skill.no_session": "Please create or resume a session before using the Skill center.",
122705
- "skill.loading": "Loading Skill center…",
122706
- "skill.center_title": "Skill Center",
122707
- "skill.no_skills": "No skills installed and no skill packages available.",
122708
- "skill.footer_hint": "Enter activate/install · d uninstall · i install & inject · Esc back",
122709
- "skill.installed": "Installed Skills",
122710
- "skill.installable": "Available Skill Packages",
122711
- "skill.not_installed": "Not installed",
122712
- "skill.no_session_activate": "Not connected to a session. Please create or resume one first.",
122713
- "skill.not_found": "Skill not found",
122714
- "skill.installing_package": "Installing skill package…",
122715
- "skill.installed_injected": "Installed and injected into current session.",
122716
- "skill.plugin_installed": "Plugin installed",
122717
- "skill.no_manual_skill": "Installed successfully, but this package has no manually activatable skills.",
122718
- "skill.install_failed": "Install failed.",
122719
- "skill.install_failed_msg": "Install failed: {msg}",
122720
- "skill.select_activate": "Select a Skill to activate",
122721
- "skill.select_hint": "Enter to activate · Esc to go back",
122722
- "skill.uninstall_whole_pkg": "Will uninstall the entire package ({count} skills). Cannot remove individual skills.",
122723
- "skill.uninstall_single": "Will uninstall the entire Skill package",
122724
- "skill.uninstalling": "Uninstalling",
122725
- "skill.uninstalled": "Uninstalled.",
122726
- "skill.plugin_uninstalled": "Plugin uninstalled",
122727
- "skill.plugin_removed": "This plugin's skills have been removed from the current session. No restart needed.",
122728
- "skill.uninstall_failed": "Uninstall failed.",
122729
- "skill.uninstall_failed_msg": "Uninstall failed: {msg}",
122730
- "skill.deleting_skill": "Will delete the skill directory and sub-skills",
122731
- "skill.deleting": "Deleting",
122732
- "skill.deleted": "Deleted.",
122733
- "skill.skill_deleted": "Skill deleted",
122734
- "skill.skill_removed": "This skill and its sub-skills have been removed from the current session.",
122735
- "skill.delete_failed": "Delete failed.",
122736
- "skill.delete_failed_msg": "Delete failed: {msg}",
122737
- "skill.confirm_uninstall": "Uninstall \"{label}\"?",
122738
- "skill.uninstall_reversible": "You can reinstall from the Skill center later",
122739
- "skill.uninstall_yes": "Yes, uninstall",
122740
- "toolcall.bg_agent_lost": "Background agent lost (session restarted before completion)",
122741
- "toolcall.bg_agent_terminated": "Background agent terminated",
122742
- "toolcall.bg_agent_failed": "Background agent failed",
122743
- "toolcall.current_plan": "Current Plan",
122744
- "toolcall.approved": "Approved: {chosen}",
122745
- "toolcall.approved_label": "Approved",
122746
- "toolcall.input_unavailable": "Could not collect your input",
122747
- "toolcall.input_collected": "Collected your answer",
122748
- "toolcall.waiting_input": "Waiting for your input",
122749
- "toolcall.used": "Used",
122750
- "toolcall.truncated": "Truncated",
122751
- "toolcall.in_use": "Using",
122752
- "toolcall.sub_agent_named": "Sub agent {name} ({id})",
122753
- "toolcall.sub_agent": "Sub agent ({id})",
122754
- "toolcall.more_tools": "{count} more tool calls...",
122755
- "toolcall.agent_used": "{name} used {tool}",
122756
- "toolcall.agent_in_use": "{name} using {tool}",
122757
- "toolcall.starting": "Starting…",
122758
- "toolcall.running": "Running",
122759
- "toolcall.completed": "Completed",
122760
- "toolcall.tool_count": "{count} tools",
122761
- "toolcall.failed": "Failed",
122762
- "toolcall.bg_running": "Background",
122763
- "toolcall.truncation_notice": "Tool call arguments truncated due to max_tokens — call not executed.",
122764
- "toolcall.lines_hidden": "...({hidden} more lines, {total} total, press ctrl+o to expand)",
122765
- "toolcall.preparing_changes": "Preparing changes{path}...{bytes} · Elapsed {elapsed}",
122766
- "toolcall.rejected": "Rejected",
122767
- "toolcall.suggestion": "Suggestion",
122768
- "toolcall.question_ignored": "User ignored the question.",
122769
- "toolcall.question_label": "Q",
122770
- "readgroup.reading": "Reading {count} files…",
122771
- "readgroup.read": "Read {count} files",
122772
- "readgroup.failed_suffix": " · failed",
122773
- "readgroup.lines_suffix": " · {count} lines",
122774
- "readgroup.failed_count": " · {count} failed",
122775
- "readgroup.reading_suffix": " · reading…",
122776
- "readgroup.conflict_suffix": "conflict",
122777
- "handler.oauth_page_opened": "Opened authorization page for {serverName} in browser",
122778
- "handler.mcp_sync_failed": "Failed to sync MCP server status: {message}",
122779
- "handler.loop_limit_time": "time",
122780
- "handler.loop_limit_count": "iteration",
122781
- "handler.loop_limit_reached": "Loop {reason} limit reached{suffix}, loop mode disabled.",
122782
- "handler.loop_verify_passed": "✓ Verification passed, loop ended ({iteration} iterations).",
122783
- "handler.loop_verify_not_passed": ", verification not passed",
122784
- "handler.max_tokens_truncated": "Model hit max_tokens limit — tool calls truncated before execution.",
122785
- "handler.max_tokens_no_tool": "Model hit max_tokens limit — no tool calls issued.",
122786
- "handler.max_tokens_hint": "If this limit is unsuitable for your model, set `max_output_size` for the model alias in scream-code config.",
122787
- "handler.user_interrupted": "User interrupted",
122788
- "handler.max_steps_reached": "Per-turn step limit reached (max_steps)",
122789
- "handler.step_interrupted": "Step interrupted ({reason})",
122790
- "handler.warning_prefix": "Warning: {message}",
122791
- "handler.mcp_server_failed": "MCP server \"{name}\" failed{error}",
122792
- "handler.mcp_server_needs_auth": "MCP server \"{name}\" requires OAuth authentication, run /mcp",
122793
- "handler.mcp_server_disabled": "MCP server \"{name}\" disabled",
122794
- "handler.mcp_server_connecting": "MCP server \"{name}\" connecting…",
122795
- "handler.skill_activated": "Skill activated: {skillName}",
122796
- "handler.storm_breaker_title": "Storm Breaker",
122797
- "handler.storm_breaker_detail": "Abnormal compaction cadence detected: {detail}Possible tool-call loop or excessive output. Check recent conversation steps.",
122798
- "session.not_found": "Session \"{sessionId}\" not found.",
122799
- "session.wrong_dir": "Session \"{sessionId}\" was created in a different directory.\n cd \"{workDir}\" && scream -r {sessionId}",
122800
- "session.no_resumable": "No resumable session in \"{workDir}\"; starting a new session.",
122801
- "session.init_failed": "Session initialization failed.",
122802
- "session.already_in": "Already in this session.",
122803
- "session.switch_streaming": "Cannot switch session during streaming — press Esc or Ctrl-C first.",
122804
- "session.switch_replaying": "Cannot switch session during history replay.",
122805
- "session.resume_failed": "Failed to resume session {sessionId}: {msg}",
122806
- "session.resumed": "Session resumed ({sessionId}).",
122807
- "session.replay_failed": "Failed to replay session history: {msg}",
122808
- "session.resume_warning": "Warning: {warning}",
122809
- "session.new_replaying": "Cannot start a new session during history replay.",
122810
- "session.new_failed": "Failed to start new session: {msg}",
122811
- "session.setup_failed": "Post-creation setup failed: {msg}",
122812
- "session.new_started": "New session started ({sessionId}).",
122813
- "replay.history_unavailable": "Session history is unavailable.",
122814
- "replay.history_failed": "Failed to replay session history: {message}",
122815
- "replay.skill_activated": "Skill activated: {skillName}",
122816
- "replay.yes_mode_on": "YES mode: ON",
122817
- "replay.yes_mode_on_detail": "All operations will be auto-approved. Use with caution.",
122818
- "replay.yes_mode_off": "YES mode: OFF",
122819
- "replay.permission_mode": "Permission mode: {mode}",
122820
- "replay.approved_session": "Approved (this session)",
122821
- "replay.approved": "Approved",
122822
- "replay.rejected": "Rejected",
122823
- "replay.cancelled": "Cancelled",
122824
- "replay.plan_revise": "Plan returned for revision",
122825
- "replay.plan_rejected": "Plan review rejected",
122826
- "replay.plan_cancelled": "Plan review cancelled",
122827
- "replay.feedback_prefix": "Feedback: {feedback}",
122828
- "replay.bg_failed_suffix": " failed in background",
122829
- "replay.bg_lost_suffix": " lost in background",
122830
- "replay.bg_stopped_suffix": " stopped",
122831
- "skill.source_label": "Source:",
122832
- "skill.plugin_label": "Plugin:",
122833
- "taskbrowser.running": "running",
122834
- "taskbrowser.awaiting": "awaiting",
122835
- "taskbrowser.completed": "completed",
122836
- "taskbrowser.interrupted": "interrupted",
122837
- "taskbrowser.total": "total",
122838
- "taskbrowser.stop": "Stop",
122839
- "taskbrowser.confirm": "Confirm",
122840
- "taskbrowser.cancel": "Cancel",
122841
- "taskbrowser.select": "Select",
122842
- "taskbrowser.output": "Output",
122843
- "taskbrowser.stop_action": "Stop",
122844
- "taskbrowser.refresh": "Refresh",
122845
- "taskbrowser.filter": "Filter",
122846
- "taskbrowser.exit": "Exit",
122847
- "taskbrowser.no_active": "No active tasks. Tab = show all.",
122848
- "taskbrowser.no_tasks": "No background tasks in this session.",
122849
- "taskbrowser.select_task": "Select a task from the list.",
122850
- "taskbrowser.detail": "Detail",
122851
- "taskbrowser.task_id": "Task ID: ",
122852
- "taskbrowser.status": "Status: ",
122853
- "taskbrowser.description": "Desc: ",
122854
- "taskbrowser.command": "Command: ",
122855
- "taskbrowser.running_time": "Running",
122856
- "taskbrowser.completed_time": "Completed",
122857
- "taskbrowser.time": "Time: ",
122858
- "taskbrowser.process_id": "PID: ",
122859
- "taskbrowser.exit_code": "Exit code: ",
122860
- "taskbrowser.stop_reason": "Stop reason: ",
122861
- "taskbrowser.timed_out": "Timed out: ",
122862
- "taskbrowser.yes": "Yes",
122863
- "taskbrowser.awaiting_label": "Awaiting: ",
122864
- "subagent.desc_coder": "General software engineering",
122865
- "subagent.desc_reviewer": "Code review, bug & API contract violations",
122866
- "subagent.desc_writer": "Content production & research reports",
122867
- "subagent.desc_explore": "Quick codebase exploration (read-only)",
122868
- "subagent.desc_oracle": "Deep debugging & architecture decisions",
122869
- "subagent.desc_plan": "Implementation planning & architecture design (read-only)",
122870
- "subagent.desc_verify": "Run build/test/lint to verify changes",
122871
- "subagent.follow_main": "Follow main model",
122872
- "subagent.follow_main_desc": "Use the main agent's current model (default)",
122873
- "subagent.title": "Subagent Model Binding",
122874
- "subagent.hint": "↑↓ Select subagent · Enter bind model · Esc cancel",
122875
- "subagent.bind_title": "Bind {profile}",
122876
- "subagent.model_hint": "↑↓ Select model · Enter confirm · Esc back",
122877
- "subagent.save_failed": "Save failed: {msg}",
122878
- "kdoctree.no_title": "(untitled)",
122879
- "kdoctree.empty": "(empty)",
122880
- "kdoctree.move": "Move",
122881
- "kdoctree.expand": "Expand",
122882
- "kdoctree.collapse": "Collapse",
122883
- "kdoctree.top_bottom": "Top/Bot",
122884
- "kdoctree.back": "Back",
122885
- "usage.no_token": "No token usage recorded yet.",
122886
- "usage.input": "Input",
122887
- "usage.output": "Output",
122888
- "usage.total": "Total",
122889
- "usage.managed_title": "Managed Usage",
122890
- "usage.no_data": "No usage data available.",
122891
- "usage.used": "used",
122892
- "usage.session_title": "Session Usage",
122893
- "usage.context_window": "Context Window",
122894
- "usage.subagent_title": "Sub-Agent Usage",
122895
- "usage.panel_title": " Usage ",
122896
- "agentgroup.n_agent_done": "{total} {name} agent(s) done",
122897
- "agentgroup.n_agents_done": "{total} agent(s) done",
122898
- "agentgroup.running_n_agents": "Running {total} agent(s)",
122899
- "agentgroup.done": "done",
122900
- "agentgroup.failed": "failed",
122901
- "agentgroup.running": "running",
122902
- "agentgroup.running_n_agents_mixed": "Running {total} agent(s) ({parts})",
122903
- "agentgroup.no_desc": "(no description)",
122904
- "agentgroup.error": "Error: ",
122905
- "agentgroup.initializing": "Initializing…",
122906
- "agentgroup.check_done": "✓ Done",
122907
- "agentgroup.cross_failed": "✗ Failed",
122908
- "agentgroup.bg_running": "◐ Background",
122909
- "mcppanel.connected": "Connected",
122910
- "mcppanel.pending": "Pending",
122911
- "mcppanel.needs_auth": "Auth required",
122912
- "mcppanel.failed": "Failed",
122913
- "mcppanel.disabled": "Disabled",
122914
- "mcppanel.tools_available": "{count} tool(s) available",
122915
- "mcppanel.servers": "Servers",
122916
- "mcppanel.no_config": "No MCP servers configured. Run /mcp to add one.",
122917
- "mcppanel.name": "Name",
122918
- "mcppanel.status": "Status",
122919
- "mcppanel.transport": "Transport",
122920
- "mcppanel.tools": "Tools",
122921
- "mcppanel.error": "Error: ",
122922
- "mcppanel.action": "Action: ",
122923
- "mcppanel.run_mcp": "Run /mcp to manage servers.",
122924
- "goalpanel.active": "▶ Running",
122925
- "goalpanel.complete": "✅ Complete",
122926
- "goalpanel.blocked": "🚫 Blocked",
122927
- "goalpanel.paused": "⏸ Paused",
122928
- "goalpanel.no_goal": "No goal set",
122929
- "goalpanel.create_goal": "Create and start a goal",
122930
- "goalpanel.pause_goal": "Pause current goal",
122931
- "goalpanel.resume_goal": "Resume paused goal",
122932
- "goalpanel.cancel_goal": "Cancel current goal",
122933
- "goalpanel.no_stop_condition": " No stop condition — runs until evaluated complete.",
122934
- "kresult.empty": "(empty)",
122935
- "kresult.line": "Line",
122936
- "kresult.page": "Page",
122937
- "kresult.top_bottom": "Top/Bot",
122938
- "kresult.back": "Back",
122939
- "looplimit.usage": "Usage: /loop [count|duration] [prompt]. Examples: /loop 10, /loop 5m, /loop 10 keep optimizing",
122940
- "looplimit.verify_usage": "Verify command must be quoted, e.g.: --verify \"pnpm lint\"",
122941
- "looplimit.iteration_must_be_positive": "Loop iteration count must be a positive integer.",
122942
- "looplimit.duration_must_be_positive": "Loop duration must be a positive number.",
122943
- "looplimit.duration_unit_invalid": "Loop duration unit must be seconds, minutes, or hours.",
122944
- "looplimit.iterations": "{count} iterations",
122945
- "looplimit.remaining_iterations": "{remaining}/{initial} remaining",
122946
- "looplimit.expired": "Expired",
122947
- "looplimit.remaining_duration": "{duration} remaining",
122948
- "looplimit.hours": "{count} hours",
122949
- "looplimit.minutes": "{count} minutes",
122950
- "looplimit.seconds": "{count} seconds",
122951
- "export.thinking": "Thinking",
122952
- "export.image": "[Image]",
122953
- "export.audio": "[Audio]",
122954
- "export.video": "[Video]",
122955
- "export.tool_call": "#### Tool call: {name}",
122956
- "export.tool_result": "Tool result: {name}",
122957
- "export.unknown": "Unknown",
122958
- "export.turn": "## Turn {number}",
122959
- "export.user": "### User",
122960
- "export.assistant": "### Assistant",
122961
- "export.system": "### System",
122962
- "export.overview": "## Overview",
122963
- "export.topic": "- **Topic**: {topic}",
122964
- "export.topic_empty": "- **Topic**: (empty)",
122965
- "export.conversation_stats": "- **Conversation**: {turns} turns | {toolCalls} tool calls",
122966
- "export.session_title": "# Scream Session Export",
122967
- "bgtask.agent_task": "Agent task",
122968
- "bgtask.bash_task": "Bash task",
122969
- "bgtask.started_bg": "{subject} started in background",
122970
- "bgtask.awaiting_approval": "{subject} awaiting approval",
122971
- "bgtask.completed_bg": "{subject} completed in background",
122972
- "bgtask.failed_bg": "{subject} failed in background",
122973
- "bgtask.killed": "{subject} stopped",
122974
- "bgtask.lost": "{subject} lost",
122975
- "bgtask.stopped_reason": "Stopped — {reason}",
122976
- "bgtask.stopped": "Stopped",
122977
- "bgtask.waiting": "Waiting: {reason}",
122978
- "bgtask.session_restarted": "Session restarted before completion",
122979
- "bgtask.timed_out": "Timed out",
122980
- "mcpstatus.failed": "{count} failed",
122981
- "mcpstatus.needs_auth": "{count} need auth",
122982
- "mcpstatus.connecting": "{count} connecting",
122983
- "mcpstatus.connected": "{count} connected",
122984
- "mcpstatus.disabled_count": "{count} disabled",
122985
- "mcpstatus.summary": "MCP servers: {detail}",
122986
- "mcpstatus.more_summary": "MCP servers: {count} more ({detail})",
122987
- "permission.manual": "Manual",
122988
- "permission.manual_desc": "Ask before risky operations like running commands or editing files. Read/search tools run directly; session approval rules apply.",
122989
- "permission.auto": "Auto",
122990
- "permission.auto_desc": "Run fully without interaction. Tool operations are auto-approved; agent questions are skipped so it can decide on its own.",
122991
- "permission.yolo_desc": "Auto-approve tool operations and plan transitions. The agent will still explicitly ask when it needs your input.",
122992
- "permission.select_title": "Select permission mode",
122993
- "theme.auto": "Auto (follow terminal)",
122994
- "theme.dark": "Dark",
122995
- "theme.light": "Light",
122996
- "theme.select_title": "Select theme",
122997
- "taskviewer.no_output": "[no output captured]",
122998
- "taskviewer.key_line": "line",
122999
- "taskviewer.key_page": "page",
123000
- "taskviewer.key_top_bottom": "top/bot",
123001
- "approvalpreview.key_line": "line",
123002
- "approvalpreview.key_page": "page",
123003
- "approvalpreview.key_top_bottom": "top/bot",
123004
- "approvalpreview.key_back": "back",
123005
- "apikey.footer": "Enter submit · Esc cancel",
123006
- "apikey.title": "Enter API key for {name}",
123007
- "apikey.subtitle": "Your key will be saved to ~/.scream-code/config.toml",
123008
- "apikey.empty_hint": "API key cannot be empty.",
123009
- "planbox.title_prefix": " Plan: ",
123010
- "planbox.title_fallback": " Plan ",
123011
- "planbox.more_lines": "...({count} more lines, press ctrl+e to expand)",
123012
- "skillact.user_trigger": "(user triggered)",
123013
- "skillact.model_trigger": "(model invoked)",
123014
- "skillact.nested_trigger": "(nested call)",
123015
- "skillact.activated": "▶ Activated skill: ",
123016
- "mediaurl.audio": "Audio",
123017
- "mediaurl.image": "Image",
123018
- "mediaurl.video": "Video",
123019
- "transcript.attachments": "{count} attachment(s)",
123020
- "transcript.assistant": "Assistant: ",
123021
- "transcript.thinking": "Thinking: ",
123022
- "transcript.tool_name": "Tool {name}: ",
123023
- "transcript.activated_skill": "Activated skill: {name}",
123024
- "transcript.more_history": "↑ {count} more history message(s)",
123025
- "compaction.done": "Compaction complete",
123026
- "compaction.canceled": "Compaction cancelled",
123027
- "compaction.in_progress": "Compacting context...",
123028
- "planmode.plan": "Plan mode",
123029
- "planmode.fusionplan": "Fusion plan mode",
123030
- "todo.title": " Todo",
123031
- "todo.more_items": " … {count} more item(s)",
123032
- "textinput.footer": "Enter submit · Esc cancel",
123033
- "textinput.empty_hint": "Input cannot be empty.",
123034
- "editor.auto_detect": "Auto detect ($VISUAL / $EDITOR)",
123035
- "editor.select_title": "Select external editor",
123036
- "editorkey.loop_paused": "Loop paused. Enter /loop <prompt> to resume or modify.",
123037
- "editorkey.cancel_compaction_failed": "Cancel compaction failed: {msg}",
123038
- "editorkey.editor_not_configured": "Editor not configured. Set $VISUAL / $EDITOR, or run /editor <command>.",
123039
- "editorkey.external_editor_failed": "External editor failed: {msg}",
123040
- "streamingui.turn_complete_title": "Scream Code task complete",
123041
- "streamingui.compacting": "Compacting context",
123042
- "tc.approved_session": "Approved (this session)",
123043
- "tc.approved": "Approved",
123044
- "tc.rejected": "Rejected",
123045
- "tc.cancelled": "Cancelled",
123046
- "tc.error_prefix": "Error: ",
123047
- "dialog.cc_session_connected": "Connected to CC session ({id}).",
123048
- "dialog.create_session_failed": "Failed to create session",
123049
- "dialog.cc_managed": "CC session managed by cc-connect. Please operate from the chat channel.",
123050
- "dialog.memo_injected": "Injected memo #{id}",
123051
- "dialog.approval_title": "Scream Code requires approval",
123052
- "dialog.question_title": "Scream Code needs your answer",
123053
- "bgagent.started_bg": "{subject} started in background",
123054
- "bgagent.completed_bg": "{subject} completed in background",
123055
- "bgagent.failed_bg": "{subject} failed in background",
123056
- "tmux.extended_keys_off": "tmux extended-keys is off. Modified Enter key may not work correctly. Add `set -g extended-keys on` to ~/.tmux.conf and restart tmux.",
123057
- "tmux.extended_keys_format_xterm": "tmux extended-keys-format is xterm. Scream Code works best in csi-u mode. Add `set -g extended-keys-format csi-u` to ~/.tmux.conf and restart tmux.",
123058
- "hookresult.blocked": " blocked",
123059
- "hookresult.empty": "(empty)",
123060
- "anomaly.rapid_refire": "Auto-compaction re-triggered {elapsed}s after previous compaction ended.",
123061
- "anomaly.first_step_blowup": "Context reached {pct}% at first auto-compaction — possibly a giant file read or oversized initial prompt.",
123062
- "replayhook.blocked": " blocked",
123063
- "replayhook.empty": "(empty)",
123064
- "cronmsg.missed_reminder": "Missed reminder",
123065
- "cronmsg.reminder_fired": "Reminder fired",
123066
- "cronmsg.one_time": "One-time",
123067
- "cronmsg.coalesced": "{count} coalesced fire(s)",
123068
- "cronmsg.missed": "{count} missed",
123069
- "cronmsg.final_delivery": "Final delivery",
123070
- "thinking.in_progress": "Thinking...",
123071
- "shell.more_lines": "...({count} more lines, press ctrl+o to expand)",
123072
- "ccconnect.note_botfather": "Create a bot at @BotFather first",
123073
- "ccconnect.note_napcat": "Requires NapCat/OneBot",
123074
- "ccconnect.note_wecom": "Requires public IP",
123075
- "ccconnect.config_comment_attachment": "# Global: allow/disallow image & file backhaul to chat (on = enabled, off = disabled)",
123076
- "ccconnect.reconfigured": "{name} already configured (config preserved)",
123077
- "ccconnect.config_path": "Config file: {path}",
123078
- "ccconnect.config_done": "✔ {name} channel configured",
123079
- "ccconnect.config_written": "Config file written: {path}",
123080
- "ccconnect.quick_ref": "📋 Common management commands (recommended to save):",
123081
- "ccconnect.pm2_status": " pm2 status Check status (online = OK)",
123082
- "ccconnect.pm2_restart": " pm2 restart cc-connect Restart service",
123083
- "ccconnect.pm2_stop": " pm2 stop cc-connect Stop service",
123084
- "ccconnect.pm2_logs": " pm2 logs cc-connect View logs",
123085
- "ccconnect.pm2_delete": " pm2 delete cc-connect Fully delete",
123086
- "ccconnect.reconfigure_warning": " ⚠ Do not run /cc-connect again with the same platform, or existing config will be overwritten!",
123087
- "ccconnect.reconfigure_change": " To switch platforms, delete C:\\Users\\<username>\\.cc-connect\\config.toml first",
123088
- "ccconnect.init_steps": "📋 Initialization steps (first-time setup only, follow in order):",
123089
- "ccconnect.step_platform_auth": " Step 1: Platform auth{note}",
123090
- "ccconnect.once_tag": "(one-time)",
123091
- "ccconnect.step_n": " Step {num}: {label}{once}",
123092
- "ccconnect.auto_done": " ✅ Auto-completed, no manual action needed ({command})",
123093
- "ccconnect.more_commands": "More commands ({method}):",
123094
- "ccconnect.attachment_hint": "💡 Enable attachment backhaul (let Agent send images & files):",
123095
- "ccconnect.bind_setup": " Send /bind setup in chat",
123096
- "ccconnect.autostart_hint": "💡 Auto-start on boot via cc-connect-startup.bat in Startup folder.",
123097
- "ccconnect.manual_restart": " To manually restart service: pm2 resurrect",
123098
- "ccconnect.not_installed": "cc-connect not installed",
123099
- "ccconnect.install_guide": "Run in terminal first:\n\n npm install -g cc-connect\n\nAfter installation, run /cc-connect again to configure.",
123100
- "ccconnect.already_configured": "{name} ✔ Configured",
123101
- "ccconnect.picker_title": "cc-connect Quick Channel Setup",
123102
- "ccconnect.picker_hint": "Select a platform to connect; config will be auto-written to ~/.cc-connect/config.toml",
123103
- "market.gsap_name": "GSAP Animation Skill Pack",
123104
- "market.gsap_desc": "Complete GreenSock Animation Platform reference, incl. core API, Timeline, ScrollTrigger, plugins, React integration — 8 skills",
123105
- "market.design_card_name": "Claude Design Card",
123106
- "market.design_card_desc": "14 design card generators (cover/photo/social/long-form), Parchment × Swiss dual-style system",
123107
- "market.superpowers_name": "Superpowers Dev Skill Pack",
123108
- "market.superpowers_desc": "14 dev methodology skills: TDD, system debugging, code review, subagent-driven dev, parallel agents, brainstorming, etc.",
123109
- "market.scrapling_name": "Scrapling Web Scraper",
123110
- "market.scrapling_desc": "Smart scraper based on Scrapling, supports Cloudflare/WAF bypass, login sessions, auto-extraction",
123111
- "market.astock_name": "A-Share Data Analysis",
123112
- "market.astock_desc": "A-share market data query & analysis, 27 APIs covering quotes/reports/capital flow/news/fundamentals, 4 built-in research workflows",
123113
- "market.humanizer_name": "Humanizer AI Text De-AI",
123114
- "market.humanizer_desc": "Remove AI writing traces: 30 AI pattern detection × 5 categories × voice calibration, output pure human style",
123115
- "market.patent_name": "Patent Disclosure Skill",
123116
- "market.patent_desc": "Auto-generate patent disclosures: patent point mining → CNIPA novelty search → desensitized write-up → self-check loop, Mermaid diagrams, .docx output",
123117
- "market.contract_name": "Contract Review Pro",
123118
- "market.contract_desc": "Professional contract review: 7-step workflow × 5 mandatory gates × 15 risk tags × 6-dimension assessment, annotated contract + legal opinion + analysis memo, 30 contract types",
123119
- "market.academic_name": "Academic Research Skills",
123120
- "market.academic_desc": "Full academic research pipeline: deep research (13-agent team × 7 modes) + academic writing (12-agent pipeline) + peer review (7-agent multi-perspective), end-to-end",
123121
- "market.headroom_name": "Headroom Compression Optimizer",
123122
- "market.headroom_desc": "Compress tool output, logs, files & RAG chunks before sending to LLM, save 60-95% tokens, answer quality preserved",
123123
- "market.xiaohu_wechat_name": "Xiaohu WeChat Formatter",
123124
- "market.xiaohu_wechat_desc": "Markdown → WeChat-compatible HTML → push to draft box, 30 themes + visual gallery, one-click formatting & publishing",
123125
- "market.huashu_name": "Huashu Design",
123126
- "market.huashu_desc": "Native HTML design skill: hi-fi prototypes / slides / animations + 20 design philosophies + 5-dim review + MP4 export",
123127
- "market.html_video_name": "HTML Video Generator",
123128
- "market.html_video_desc": "HTML to MP4: pluggable render engine + 21 templates + AI scoring, fully local, zero render cost",
123129
- "market.xiaohu_translate_name": "Xiaohu Video Translator",
123130
- "market.xiaohu_translate_desc": "Auto Chinese subtitles for foreign videos: download / transcribe / translate / polish / burn-in, fully local",
123131
- "market.videocut_name": "Video Editing Agent",
123132
- "market.videocut_desc": "Claude Code Skills-driven video editing agent: talking-head cuts / subtitle import / quality upscaling",
123133
- "market.taste_name": "Taste Skill Design Taste",
123134
- "market.taste_desc": "Give AI good taste: prevent boring generic designs, output quality solutions",
123135
- "market.vtake_name": "VTake Video Editing",
123136
- "market.vtake_desc": "Agent Skills-driven video editing tool",
123137
- "market.remotion_name": "Remotion Video Skill",
123138
- "market.remotion_desc": "Remotion (React video framework) official skill pack",
123139
- "market.html_anything_name": "HTML Anything All-in-One Design",
123140
- "market.html_anything_desc": "75 skills × 9 scenarios: magazine / slides / poster / Xiaohongshu / data report / prototype, zero API keys",
123141
- "market.guizang_name": "Guizang Social Card",
123142
- "market.guizang_desc": "Xiaohongshu carousel + WeChat cover: 28 layouts × 10 themes, Editorial × Swiss visual system, single-file HTML → PNG",
123143
- "prompts.logout_title": "Select provider to log out",
123144
- "prompts.no_wire_provider": "No providers supporting this wire type in the catalog.",
123145
- "prompts.select_provider": "Select provider",
123146
- "prompts.wire_openai": "OpenAI compatible protocol",
123147
- "prompts.wire_openai_desc": "For DeepSeek, OpenAI, Groq, etc.",
123148
- "prompts.wire_anthropic": "Anthropic protocol",
123149
- "prompts.wire_anthropic_desc": "For Claude series models",
123150
- "prompts.thinking_off": "Thinking off",
123151
- "prompts.thinking_low": "Low thinking",
123152
- "prompts.thinking_medium": "Medium thinking",
123153
- "prompts.thinking_high": "High thinking",
123154
- "prompts.image_off": "Image off",
123155
- "prompts.image_off_desc": "Select this when the model does not support image input",
123156
- "prompts.image_on": "Image on",
123157
- "prompts.image_on_desc": "Enable when model supports image input, allows sending images",
123158
- "prompts.video_off": "Video off",
123159
- "prompts.video_off_desc": "Select this when the model does not support video input",
123160
- "prompts.video_on": "Video on",
123161
- "prompts.video_on_desc": "Enable when model supports video input, allows sending videos",
123162
- "prompts.audio_off": "Audio off",
123163
- "prompts.audio_off_desc": "Select this when the model does not support audio input",
123164
- "prompts.audio_on": "Audio on",
123165
- "prompts.audio_on_desc": "Enable when model supports audio input, allows sending audio",
123166
- "prompts.wire_type_title": "Select compatible protocol",
123167
- "prompts.wire_type_hint": "Select the model provider's API protocol type",
123168
- "prompts.thinking_title": "Thinking mode",
123169
- "prompts.thinking_hint": "Select thinking intensity (requires model support)",
123170
- "prompts.image_title": "Multimodal config · Image input",
123171
- "prompts.video_title": "Multimodal config · Video input",
123172
- "prompts.audio_title": "Multimodal config · Audio input",
123173
- "prompts.modal_off_hint": "Select off if model does not support it",
123174
- "info.mcp_load_failed": "Failed to load MCP server: {msg}",
123175
- "config.plan_cleared": "Plan cleared",
123176
- "config.yolo_already_on": "YES mode is already on",
123177
- "config.yolo_on": "YES mode: on",
123178
- "config.yolo_on_desc": "Workspace tools auto-approved.",
123179
- "config.yolo_already_off": "YES mode is already off",
123180
- "config.yolo_off": "YES mode: off",
123181
- "config.yolo_toggle_on": "YES mode: on",
123182
- "config.yolo_toggle_on_desc": "Workspace tools have been auto-approved.",
123183
- "config.auto_already_on": "Auto mode is already on",
123184
- "config.auto_on": "Auto mode: on",
123185
- "config.auto_on_desc": "Tools auto-approved. Agent will not ask questions.",
123186
- "config.auto_already_off": "Auto mode is already off",
123187
- "config.auto_off": "Auto mode: off",
123188
- "config.auto_toggle_on": "Auto mode: on",
123189
- "config.auto_toggle_on_desc": "Tools auto-approved. Agent will not ask questions.",
123190
- "settings.title": "Settings",
123191
- "settings.model": "Model",
123192
- "settings.model_desc": "Switch current model and thinking mode.",
123193
- "settings.language": "Language",
123194
- "settings.language_desc": "Switch interface language",
123195
- "settings.permission": "Permission",
123196
- "settings.permission_desc": "Choose how tool actions are approved.",
123197
- "settings.theme": "Theme",
123198
- "settings.theme_desc": "Change terminal UI theme.",
123199
- "settings.editor": "Editor",
123200
- "settings.editor_desc": "Set external editor command.",
123201
- "settings.usage": "Usage",
123202
- "settings.usage_desc": "Show session tokens, context window, and plan quota.",
123203
- "dispatch.session_picker_failed": "Failed to open session picker: {error}",
123204
- "dispatch.tasks_browser_failed": "Failed to open tasks browser: {error}",
123205
- "dispatch.usage_failed": "Failed to show usage: {error}",
123206
- "dispatch.status_failed": "Failed to show status report: {error}",
123207
- "constant.llm_not_set": "LLM not set, run /config to configure model",
123208
- "constant.no_active_session": "No active session. Run /config to configure model.",
123209
- "constant.ctrl_d_hint": "Press Ctrl+D again to exit",
123210
- "constant.ctrl_c_hint": "Press Ctrl+C again to exit",
123211
- "tui.resume_warning": "Warning: {warning}",
123212
- "tui.organizing_memory": "Organizing session memory...",
123213
- "tui.skill_failed": "Skill \"{skill}\" failed: {message}",
123214
- "tui.replay_no_new_session": "Cannot start a new session during history replay.",
123215
- "adapter.task_label": "Task {taskId}",
123216
- "knowledge.path_placeholder": "/path/to/doc.md or /path/to/docs",
123217
- "knowledge.ingest_summary": "Total: {chunks} chunks, {events} events, {entities} entities",
123218
- "knowledge.empty_store": "Knowledge base is empty, please ingest documents with /knowledge first",
123219
- "knowledge.web_opened": "Knowledge graph opened: {url}",
123220
- "cc.clean_config.detail": " ~/.cc-connect (includes session records, config, logs)",
123221
- "registry.auto_desc": "Toggle auto permission mode",
123222
- "registry.yolo_desc": "Toggle auto-approve mode (yolo)",
123223
- "registry.wolfpack_desc": "Toggle wolfpack mode, auto-approve + batch concurrency",
123224
- "registry.sessions_desc": "Browse and restore sessions",
123225
- "registry.goal_desc": "View/manage auto goals",
123226
- "registry.loop_desc": "Loop mode (stateless retry, with --verify for results)",
123227
- "registry.memory_desc": "Browse, search, inject memory memos",
123228
- "registry.knowledge_desc": "Manage local knowledge base (ingest/search/delete/stats)",
123229
- "registry.new_desc": "Start a new session in the current workspace",
123230
- "registry.model_desc": "Switch LLM model",
123231
- "mcp.desktop_desc": "macOS desktop automation: screenshot/click/type/scroll/window management (Background delivery, no focus needed)",
123232
- "mcp.browser_desc": "Browser automation: 46 tools, supports navigation/click/fill/screenshot/performance/memory debugging/extension management",
123233
- "kw.title": "Scream Knowledge Graph",
123234
- "kw.entity": "Entities",
123235
- "kw.event": "Events",
123236
- "kw.relation": "Relations",
123237
- "kw.search_placeholder": "Search...",
123238
- "kw.btn_reset": "Reset",
123239
- "kw.btn_expand": "All",
123240
- "registry.compact_desc": "Compact conversation context",
123241
- "registry.make_skill_desc": "Distill workflow from current session into a Skill",
123242
- "registry.plan_desc": "Toggle plan mode",
123243
- "registry.fusionplan_desc": "Toggle fusion plan mode (multi-agent parallel planning)",
123244
- "registry.tasks_desc": "Browse background tasks",
123245
- "registry.help_desc": "Show available commands and shortcuts",
123246
- "registry.status_desc": "Show current session and runtime status",
123247
- "registry.usage_desc": "Show token usage and context window",
123248
- "registry.btw_desc": "Quick question without interrupting conversation",
123249
- "registry.like_desc": "Set your preferences (nickname, tone, other)",
123250
- "registry.mcp_desc": "Manage MCP servers (install/disable/uninstall)",
123251
- "registry.skill_desc": "Skill center, manage Skills including activate, install, uninstall",
123252
- "registry.cc_desc": "Control your cc (start/stop/restart)",
123253
- "registry.cc_connect_desc": "cc-connect quick channel setup (requires installation)",
123254
- "registry.revoke_desc": "Undo last conversation round (specify rounds, e.g. /revoke 3)",
123255
- "registry.fork_desc": "Copy current session and start a new branch",
123256
- "registry.title_desc": "Set or show session title",
123257
- "registry.config_desc": "Browse and configure models (fetch latest directory remotely)",
123258
- "registry.permission_desc": "Select permission mode",
123259
- "registry.theme_desc": "Set terminal UI theme",
123260
- "registry.language_desc": "Switch interface language",
123261
- "registry.editor_desc": "Set external editor",
123262
- "registry.settings_desc": "Open TUI settings",
123263
- "registry.init_desc": "Analyze codebase and generate AGENTS.md",
123264
- "registry.export_md_desc": "Export current session as Markdown",
123265
- "registry.export_debug_desc": "Export current session as debug ZIP archive",
123266
- "registry.update_desc": "Manually update Scream Code to latest version",
123267
- "registry.version_desc": "Show version info",
123268
- "registry.logout_desc": "Remove configured models",
123269
- "registry.exit_desc": "Exit application",
123270
- "kw.hint_drag": "Drag to pan · Scroll to zoom · Click to expand/collapse · Double-click for details",
123271
- "kw.detail_name": "Name",
123272
- "kw.detail_type": "Type",
123273
- "kw.detail_category": "Category",
123274
- "kw.detail_weight": "Weight",
123275
- "kw.detail_description": "Description",
123276
- "kw.detail_keywords": "Keywords",
123277
- "kw.detail_related": "Related",
123278
- "kw.btn_collapse": "Collapse",
123279
- "kw.btn_expand_all": "Expand All",
123280
- "kw.btn_collapse_all": "Collapse All",
123281
- "kw.loading": "Loading",
123282
- "kw.loading_timeout": "Data did not return within 8 seconds, please check the terminal",
123283
- "kw.no_data": "Failed to load",
123284
- "kw.no_data_hint": "Please ingest documents with /knowledge first",
123285
- "kw.no_results": "No matching results",
123286
- "kw.back": "Back",
123287
- "kw.root_label": "Root",
123288
- "kw.close": "Close",
123289
- "tui.invalid_config": "Invalid TUI config in ~/.scream-code/tui.toml; using defaults.",
123290
- "goal.storm_breaker": "Storm Breaker",
123291
- "goalpanel.goal_placeholder": "<goal description>",
123292
- "wolfpack.on": "WolfPack mode: on",
123293
- "wolfpack.on_desc": "Batch concurrent agents activated.",
123294
- "wolfpack.off": "WolfPack mode: off",
123295
- "badge.plan": "Plan",
123296
- "badge.fusion": "Fusion",
123297
- "badge.wolfpack": "Wolfpack",
123298
- "badge.loop": "Loop",
123299
- "badge.goal": "Goal",
123300
- "badge.auto": "Auto",
123301
- "badge.yes": "YES",
123302
- "kw.lang_toggle": "中文",
123303
- "kw.embedding_downloading": "Vector model downloading…",
123304
- "kw.embedding_failed": "Vector model load failed. Return to the menu and select Download to retry.",
123305
- "kw.embedding_ready": "Vector model ready",
123306
- "kw.embedding_not_downloaded": "Vector model not downloaded (select Download vector model)",
123307
- "kw.embedding_already_installed": "Vector model already installed, no need to re-download"
123308
- }
123309
- };
123310
- function detectSystemLocale() {
123311
- const env = process.env;
123312
- const envLang = (env["LC_ALL"] || env["LC_MESSAGES"] || env["LANG"] || env["LANGUAGE"] || "").toLowerCase();
123313
- if (envLang.startsWith("zh")) return "zh";
123314
- if (envLang.length > 0) return "en";
123315
- try {
123316
- if (Intl.DateTimeFormat().resolvedOptions().locale.toLowerCase().startsWith("zh")) return "zh";
123317
- } catch {}
123318
- if (process.platform === "win32") {
123319
- if ((env["LANG"] || "").toLowerCase().startsWith("zh")) return "zh";
123320
- }
123321
- return "en";
123322
- }
123323
- let currentLocale = detectSystemLocale();
123324
- function getLocale() {
123325
- return currentLocale;
123326
- }
123327
- function setLocale(locale) {
123328
- if (dictionaries[locale]) currentLocale = locale;
123329
- }
123330
- function t(key, params) {
123331
- let text = dictionaries[currentLocale][key] ?? dictionaries.zh[key] ?? key;
123332
- if (params) for (const [k, v] of Object.entries(params)) text = text.replaceAll(`{${k}}`, String(v));
123333
- return text;
123334
- }
123335
- //#endregion
123336
121127
  //#region ../../packages/node-sdk/src/auth.ts
123337
121128
  var ScreamAuthFacade = class {
123338
121129
  options;
@@ -123553,6 +121344,12 @@ var SDKRpcClient = class {
123553
121344
  agentId: this.interactiveAgentId
123554
121345
  });
123555
121346
  }
121347
+ async getWolfpackMode(input) {
121348
+ return (await this.getRpc()).getWolfpackMode({
121349
+ sessionId: input.sessionId,
121350
+ agentId: this.interactiveAgentId
121351
+ });
121352
+ }
123556
121353
  async getPlan(input) {
123557
121354
  return (await this.getRpc()).getPlan({
123558
121355
  sessionId: input.sessionId,
@@ -123602,7 +121399,7 @@ var SDKRpcClient = class {
123602
121399
  async getStatus(input) {
123603
121400
  const rpc = await this.getRpc();
123604
121401
  const agentId = this.interactiveAgentId;
123605
- const [config, context, permission, plan, usage] = await Promise.all([
121402
+ const [config, context, permission, plan, usage, wolfpackMode] = await Promise.all([
123606
121403
  rpc.getConfig({
123607
121404
  sessionId: input.sessionId,
123608
121405
  agentId
@@ -123622,6 +121419,10 @@ var SDKRpcClient = class {
123622
121419
  rpc.getUsage({
123623
121420
  sessionId: input.sessionId,
123624
121421
  agentId
121422
+ }),
121423
+ rpc.getWolfpackMode({
121424
+ sessionId: input.sessionId,
121425
+ agentId
123625
121426
  })
123626
121427
  ]);
123627
121428
  const maxContextTokens = config.modelCapabilities?.max_context_tokens ?? 0;
@@ -123634,6 +121435,7 @@ var SDKRpcClient = class {
123634
121435
  permission: permission.mode,
123635
121436
  planMode: plan !== null,
123636
121437
  planStrategy: plan?.strategy,
121438
+ wolfpackMode,
123637
121439
  contextTokens,
123638
121440
  maxContextTokens,
123639
121441
  contextUsage,
@@ -124703,7 +122505,7 @@ function optionalBuildString(value) {
124703
122505
  return typeof value === "string" && value.length > 0 ? value : void 0;
124704
122506
  }
124705
122507
  const SCREAM_BUILD_INFO = {
124706
- version: optionalBuildString("0.9.7"),
122508
+ version: optionalBuildString("0.10.0"),
124707
122509
  channel: optionalBuildString(""),
124708
122510
  commit: optionalBuildString(""),
124709
122511
  buildTarget: optionalBuildString("darwin-arm64")
@@ -125687,13 +123489,6 @@ const BUILTIN_SLASH_COMMANDS = [
125687
123489
  return trimmed === "" || trimmed === "status" || trimmed === "pause" || trimmed === "off" ? "always" : "idle-only";
125688
123490
  }
125689
123491
  },
125690
- {
125691
- name: "loop",
125692
- aliases: [],
125693
- description: "registry.loop_desc",
125694
- priority: 121,
125695
- availability: "always"
125696
- },
125697
123492
  {
125698
123493
  name: "memory",
125699
123494
  aliases: ["memo", "mem"],
@@ -126135,7 +123930,7 @@ function resolveConnectCatalogRequest(args) {
126135
123930
  }
126136
123931
  //#endregion
126137
123932
  //#region src/tui/components/dialogs/api-key-input-dialog.ts
126138
- function getFooter$1() {
123933
+ function getFooter() {
126139
123934
  return t("apikey.footer");
126140
123935
  }
126141
123936
  function maskInputLine(raw) {
@@ -126190,7 +123985,7 @@ var ApiKeyInputDialogComponent = class extends Container {
126190
123985
  const titleStyled = chalk.bold.hex(this.colors.textStrong)(this.title);
126191
123986
  const subtitleText = this.emptyHinted ? t("apikey.empty_hint") : this.subtitle;
126192
123987
  const subtitleStyled = chalk.hex(this.colors.textDim)(subtitleText);
126193
- const footerStyled = chalk.hex(this.colors.textDim)(getFooter$1());
123988
+ const footerStyled = chalk.hex(this.colors.textDim)(getFooter());
126194
123989
  const titleLine = truncateToWidth(titleStyled, innerWidth, "…");
126195
123990
  const subtitleLine = truncateToWidth(subtitleStyled, innerWidth, "…");
126196
123991
  const footerLine = truncateToWidth(footerStyled, innerWidth, "…");
@@ -126688,98 +124483,6 @@ var ModelSelectorComponent = class extends Container {
126688
124483
  }
126689
124484
  };
126690
124485
  //#endregion
126691
- //#region src/tui/components/dialogs/text-input-dialog.ts
126692
- function getFooter() {
126693
- return t("textinput.footer");
126694
- }
126695
- function maskText(text) {
126696
- return text.split(/((?:\[[0-9;]*m|_pi:c))/).map((part, i) => i % 2 === 1 ? part : part.replaceAll(/./g, "•")).join("");
126697
- }
126698
- var TextInputDialogComponent = class extends Container {
126699
- focused = false;
126700
- input;
126701
- onDone;
126702
- opts;
126703
- done = false;
126704
- emptyHinted = false;
126705
- constructor(onDone, opts) {
126706
- super();
126707
- this.onDone = onDone;
126708
- this.opts = opts;
126709
- this.input = new Input();
126710
- if (opts.initialValue !== void 0) this.input.setValue(opts.initialValue);
126711
- this.input.onSubmit = (value) => {
126712
- this.submit(value);
126713
- };
126714
- }
126715
- handleInput(data) {
126716
- if (this.done) return;
126717
- if (matchesKey(data, Key.escape) || matchesKey(data, Key.ctrl("c")) || matchesKey(data, Key.ctrl("d"))) {
126718
- this.cancel();
126719
- return;
126720
- }
126721
- if (this.emptyHinted) this.emptyHinted = false;
126722
- this.input.handleInput(data);
126723
- }
126724
- invalidate() {
126725
- super.invalidate();
126726
- this.input.invalidate();
126727
- }
126728
- render(width) {
126729
- this.input.focused = this.focused && !this.done;
126730
- const safeWidth = Math.max(28, width);
126731
- const innerWidth = Math.max(10, safeWidth - 4);
126732
- const pad = " ";
126733
- const border = (s) => chalk.hex(this.opts.colors.primary)(s);
126734
- const titleLine = truncateToWidth(chalk.bold.hex(this.opts.colors.textStrong)(this.opts.title), innerWidth, "…");
126735
- const subtitleText = this.emptyHinted ? t("textinput.empty_hint") : this.opts.subtitle ?? "";
126736
- const subtitleLine = truncateToWidth(chalk.hex(this.opts.colors.textDim)(subtitleText), innerWidth, "…");
126737
- const footerLine = truncateToWidth(chalk.hex(this.opts.colors.textDim)(getFooter()), innerWidth, "…");
126738
- const rawInputLine = this.input.render(innerWidth)[0] ?? "> ";
126739
- const contentLines = [
126740
- titleLine,
126741
- "",
126742
- subtitleLine,
126743
- "",
126744
- this.opts.masked && this.input.getValue() !== "" ? maskText(rawInputLine) : rawInputLine,
126745
- "",
126746
- footerLine
126747
- ];
126748
- const lines = [
126749
- "",
126750
- border("╭" + "─".repeat(safeWidth - 2) + "╮"),
126751
- border("│") + " ".repeat(safeWidth - 2) + border("│")
126752
- ];
126753
- for (const content of contentLines) {
126754
- const vis = visibleWidth(content);
126755
- const rightPad = Math.max(0, innerWidth - vis);
126756
- lines.push(border("│") + pad + content + " ".repeat(rightPad) + border("│"));
126757
- }
126758
- lines.push(border("│") + " ".repeat(safeWidth - 2) + border("│"));
126759
- lines.push(border("╰" + "─".repeat(safeWidth - 2) + "╯"));
126760
- lines.push("");
126761
- return lines;
126762
- }
126763
- submit(value) {
126764
- if (this.done) return;
126765
- const trimmed = value.trim();
126766
- if (trimmed.length === 0 && !this.opts.allowEmpty) {
126767
- this.emptyHinted = true;
126768
- return;
126769
- }
126770
- this.done = true;
126771
- this.onDone({
126772
- kind: "ok",
126773
- value: trimmed
126774
- });
126775
- }
126776
- cancel() {
126777
- if (this.done) return;
126778
- this.done = true;
126779
- this.onDone({ kind: "cancel" });
126780
- }
126781
- };
126782
- //#endregion
126783
124486
  //#region src/tui/commands/prompts.ts
126784
124487
  function promptLogoutProviderSelection(host, options, currentValue) {
126785
124488
  return new Promise((resolve) => {
@@ -127524,14 +125227,6 @@ var ThemeSelectorComponent = class extends ChoicePickerComponent {
127524
125227
  }
127525
125228
  };
127526
125229
  //#endregion
127527
- //#region src/tui/loop-state.ts
127528
- function resolveLoopSubstate(state) {
127529
- if (!state.loopModeEnabled) return "idle";
127530
- if (state.loopVerifying) return "verifying";
127531
- if (state.loopPrompt === void 0) return "paused";
127532
- return "running";
127533
- }
127534
- //#endregion
127535
125230
  //#region src/tui/utils/shimmer.ts
127536
125231
  const SHIMMER_SPEED_CELLS_PER_S = 30;
127537
125232
  const PADDING = 10;
@@ -127583,8 +125278,6 @@ function tierFor(intensity) {
127583
125278
  }
127584
125279
  const shimmerDefaultCache = /* @__PURE__ */ new WeakMap();
127585
125280
  function defaultPalette(colors) {
127586
- const cached = shimmerDefaultCache.get(colors);
127587
- if (cached) return cached;
127588
125281
  const p = {
127589
125282
  low: colors.textDim,
127590
125283
  mid: colors.textMuted,
@@ -128010,9 +125703,9 @@ function pickContextColor(usage, colors) {
128010
125703
  return colors.textDim;
128011
125704
  }
128012
125705
  const BRAND_COLORS = [
128013
- "#72A4E9",
128014
- "#A78BFA",
128015
- "#34D399"
125706
+ "#ccfb23",
125707
+ "#56D4DD",
125708
+ "#FF6B9D"
128016
125709
  ];
128017
125710
  const GRADIENT_CYCLE_MS = 4e3;
128018
125711
  const SPINNER_FRAMES$1 = [
@@ -128155,20 +125848,7 @@ var FooterComponent = class {
128155
125848
  const isFusion = state.planMode === "fusionplan";
128156
125849
  left.push(chalk.hex(isFusion ? colors.fusionPlanMode : colors.planMode).bold(isFusion ? t("badge.fusion") : t("badge.plan")));
128157
125850
  }
128158
- if (state.wolfpackMode) left.push(chalk.hex(colors.primary).bold(t("badge.wolfpack")));
128159
- if (state.loopModeEnabled) {
128160
- const iter = state.loopIteration;
128161
- const limit = state.loopLimit;
128162
- let badge = t("badge.loop");
128163
- if (limit?.kind === "iterations") badge = `${t("badge.loop")} ${iter}/${limit.initial}`;
128164
- else if (limit?.kind === "duration") {
128165
- const remainMs = Math.max(0, limit.deadlineMs - Date.now());
128166
- badge = remainMs >= 6e4 ? `${t("badge.loop")} ${Math.ceil(remainMs / 6e4)}m` : `${t("badge.loop")} ${Math.max(1, Math.ceil(remainMs / 1e3))}s`;
128167
- }
128168
- if (resolveLoopSubstate(state) === "verifying") badge += " · " + t("status.verifying");
128169
- if (state.loopLastVerifyPassed === false) badge += " · ✗";
128170
- left.push(chalk.hex(colors.primary).bold(badge));
128171
- }
125851
+ if (state.wolfpackMode) left.push(chalk.hex(colors.wolfpackMode).bold(t("badge.wolfpack")));
128172
125852
  if (state.goalActive) left.push(chalk.hex(colors.primary).bold(t("badge.goal")));
128173
125853
  const model = shortenModel(modelDisplayName(state));
128174
125854
  if (model) if (state.streamingPhase === "thinking") left.push(shimmerText(model, colors));
@@ -128402,41 +126082,40 @@ function parseColorFgBg(value) {
128402
126082
  * WCAG AA.
128403
126083
  */
128404
126084
  const dark = {
128405
- green: "#4EC87E",
128406
- blue: "#72A4E9",
128407
- cyan: "#5BC0BE",
126085
+ yellowGreen: "#ccfb23",
126086
+ pink400: "#FF6B9D",
126087
+ cyan400: "#56D4DD",
126088
+ amber400: "#E8A838",
126089
+ amber500: "#FFA726",
128408
126090
  gray50: "#F5F5F5",
128409
126091
  gray100: "#E0E0E0",
128410
126092
  gray500: "#888888",
128411
126093
  gray600: "#767676",
128412
126094
  gray700: "#5A5A5A",
128413
- greenLight: "#7AD99B",
126095
+ yellowGreenLight: "#E0F5A0",
128414
126096
  red: "#E85454",
128415
126097
  redLight: "#F08585",
128416
- amber400: "#E8A838",
128417
- gold400: "#FBD700",
128418
- tangerine400: "#FF5401",
128419
- orange300: "#FFCB6B"
126098
+ gold400: "#FFD166"
128420
126099
  };
128421
126100
  const light = {
128422
- green: "#0E7A38",
128423
- blue: "#2563EB",
128424
- cyan: "#00838F",
126101
+ yellowGreen700: "#4B7A06",
126102
+ pink700: "#C2185B",
126103
+ cyan800: "#006978",
128425
126104
  gray900: "#1A1A1A",
128426
126105
  gray700: "#454545",
128427
126106
  gray600: "#5F5F5F",
128428
126107
  gray500: "#737373",
128429
126108
  red: "#B91C1C",
128430
126109
  amber800: "#92660A",
128431
- gold700: "#8C7600",
128432
- tangerine700: "#B33A00",
126110
+ amber700: "#9A6B00",
128433
126111
  orange700: "#9A4A00"
128434
126112
  };
128435
126113
  const darkColors = {
128436
- primary: dark.green,
128437
- accent: dark.tangerine400,
128438
- planMode: "#00FFFF",
128439
- fusionPlanMode: "#ffff66",
126114
+ primary: dark.yellowGreen,
126115
+ accent: dark.pink400,
126116
+ planMode: dark.cyan400,
126117
+ fusionPlanMode: dark.amber500,
126118
+ wolfpackMode: "#C084FC",
128440
126119
  text: dark.gray100,
128441
126120
  textStrong: dark.gray50,
128442
126121
  textDim: dark.gray500,
@@ -128446,27 +126125,28 @@ const darkColors = {
128446
126125
  mdCodeBlockBorder: "#5C6370",
128447
126126
  mdQuote: "#7F848E",
128448
126127
  border: dark.gray700,
128449
- borderFocus: dark.gold400,
128450
- success: dark.green,
126128
+ borderFocus: dark.yellowGreenLight,
126129
+ success: dark.yellowGreen,
128451
126130
  warning: dark.amber400,
128452
126131
  error: dark.red,
128453
- diffAdded: dark.green,
126132
+ diffAdded: dark.yellowGreen,
128454
126133
  diffRemoved: dark.red,
128455
- diffAddedStrong: dark.greenLight,
126134
+ diffAddedStrong: dark.yellowGreenLight,
128456
126135
  diffRemovedStrong: dark.redLight,
128457
126136
  diffGutter: dark.gray600,
128458
126137
  diffMeta: dark.gray500,
128459
- roleUser: dark.orange300,
126138
+ roleUser: dark.gold400,
128460
126139
  roleAssistant: dark.gray100,
128461
126140
  roleThinking: dark.gray500,
128462
126141
  roleTool: dark.amber400,
128463
126142
  status: dark.gray500
128464
126143
  };
128465
126144
  const lightColors = {
128466
- primary: light.green,
128467
- accent: light.tangerine700,
128468
- planMode: "#00838F",
128469
- fusionPlanMode: "#8C7600",
126145
+ primary: light.yellowGreen700,
126146
+ accent: light.pink700,
126147
+ planMode: light.cyan800,
126148
+ fusionPlanMode: light.amber700,
126149
+ wolfpackMode: "#7C3AED",
128470
126150
  text: light.gray900,
128471
126151
  textStrong: light.gray900,
128472
126152
  textDim: light.gray700,
@@ -128476,13 +126156,13 @@ const lightColors = {
128476
126156
  mdCodeBlockBorder: "#848484",
128477
126157
  mdQuote: "#616161",
128478
126158
  border: light.gray500,
128479
- borderFocus: light.gold700,
128480
- success: light.green,
126159
+ borderFocus: light.yellowGreen700,
126160
+ success: light.yellowGreen700,
128481
126161
  warning: light.amber800,
128482
126162
  error: light.red,
128483
- diffAdded: light.green,
126163
+ diffAdded: light.yellowGreen700,
128484
126164
  diffRemoved: light.red,
128485
- diffAddedStrong: light.green,
126165
+ diffAddedStrong: light.yellowGreen700,
128486
126166
  diffRemovedStrong: light.red,
128487
126167
  diffGutter: light.gray500,
128488
126168
  diffMeta: light.gray600,
@@ -128830,10 +126510,27 @@ function buildStatusReportLines(options) {
128830
126510
  }
128831
126511
  //#endregion
128832
126512
  //#region src/tui/commands/info.ts
126513
+ const INFO_PANEL_DISMISS_MS = 1e4;
126514
+ let activeInfoPanel;
126515
+ let activeInfoTimer;
126516
+ function dismissInfoPanel(state) {
126517
+ if (activeInfoTimer !== void 0) {
126518
+ clearTimeout(activeInfoTimer);
126519
+ activeInfoTimer = void 0;
126520
+ }
126521
+ if (activeInfoPanel !== void 0) {
126522
+ state.transcriptContainer.removeChild(activeInfoPanel);
126523
+ activeInfoPanel = void 0;
126524
+ state.ui.requestRender();
126525
+ }
126526
+ }
126527
+ function clearInfoPanelState(state) {
126528
+ dismissInfoPanel(state);
126529
+ }
128833
126530
  async function showUsage(host) {
128834
126531
  const sessionUsage = await loadSessionUsageReport(host);
128835
126532
  const managedUsage = await loadManagedUsageReport(host);
128836
- const panel = new UsagePanelComponent(buildUsageReportLines({
126533
+ const lines = buildUsageReportLines({
128837
126534
  colors: host.state.theme.colors,
128838
126535
  sessionUsage: sessionUsage.usage,
128839
126536
  sessionUsageError: sessionUsage.error,
@@ -128843,14 +126540,20 @@ async function showUsage(host) {
128843
126540
  managedUsage: managedUsage?.usage,
128844
126541
  managedUsageError: managedUsage?.error,
128845
126542
  subagentUsage: host.state.appState.subagentUsage
128846
- }), host.state.theme.colors.primary);
126543
+ });
126544
+ dismissInfoPanel(host.state);
126545
+ const panel = new UsagePanelComponent(lines, host.state.theme.colors.primary);
128847
126546
  host.state.transcriptContainer.addChild(panel);
126547
+ activeInfoPanel = panel;
126548
+ activeInfoTimer = setTimeout(() => {
126549
+ dismissInfoPanel(host.state);
126550
+ }, INFO_PANEL_DISMISS_MS);
128848
126551
  host.state.ui.requestRender();
128849
126552
  }
128850
126553
  async function showStatusReport(host) {
128851
126554
  const [runtimeStatus, managedUsage] = await Promise.all([loadRuntimeStatusReport(host), loadManagedUsageReport(host)]);
128852
126555
  const appState = host.state.appState;
128853
- const panel = new UsagePanelComponent(buildStatusReportLines({
126556
+ const lines = buildStatusReportLines({
128854
126557
  colors: host.state.theme.colors,
128855
126558
  version: appState.version,
128856
126559
  model: appState.model,
@@ -128868,8 +126571,14 @@ async function showStatusReport(host) {
128868
126571
  statusError: runtimeStatus.error,
128869
126572
  managedUsage: managedUsage?.usage,
128870
126573
  managedUsageError: managedUsage?.error
128871
- }), host.state.theme.colors.primary, " Status ");
126574
+ });
126575
+ dismissInfoPanel(host.state);
126576
+ const panel = new UsagePanelComponent(lines, host.state.theme.colors.primary, " Status ");
128872
126577
  host.state.transcriptContainer.addChild(panel);
126578
+ activeInfoPanel = panel;
126579
+ activeInfoTimer = setTimeout(() => {
126580
+ dismissInfoPanel(host.state);
126581
+ }, INFO_PANEL_DISMISS_MS);
128873
126582
  host.state.ui.requestRender();
128874
126583
  }
128875
126584
  async function loadSessionUsageReport(host) {
@@ -129650,8 +127359,22 @@ function buildExportMarkdown(input) {
129650
127359
  async function handleTitleCommand(host, args) {
129651
127360
  const title = args.trim();
129652
127361
  if (title.length === 0) {
129653
- const current = host.state.appState.sessionTitle;
129654
- host.showStatus(current !== null && current.length > 0 ? `Session title: ${current}` : `Session title: (not set) — id: ${host.state.appState.sessionId}`);
127362
+ const session = host.session;
127363
+ if (session === void 0) {
127364
+ host.showError(getNoActiveSessionMessage());
127365
+ return;
127366
+ }
127367
+ const newTitle = await promptTitleInput(host, host.state.appState.sessionTitle ?? "");
127368
+ if (newTitle === void 0 || newTitle.length === 0) return;
127369
+ try {
127370
+ await host.harness.renameSession({
127371
+ id: session.id,
127372
+ title: newTitle
127373
+ });
127374
+ host.showStatus(`Session title set to: ${newTitle}`);
127375
+ } catch (error) {
127376
+ host.showError(`Failed to set title: ${formatErrorMessage(error)}`);
127377
+ }
129655
127378
  return;
129656
127379
  }
129657
127380
  const session = host.session;
@@ -129666,12 +127389,26 @@ async function handleTitleCommand(host, args) {
129666
127389
  title: newTitle
129667
127390
  });
129668
127391
  } catch (error) {
129669
- const msg = formatErrorMessage(error);
129670
- host.showError(`Failed to set title: ${msg}`);
127392
+ host.showError(`Failed to set title: ${formatErrorMessage(error)}`);
129671
127393
  return;
129672
127394
  }
129673
127395
  host.showStatus(`Session title set to: ${newTitle}`);
129674
127396
  }
127397
+ function promptTitleInput(host, current) {
127398
+ const { promise, resolve } = Promise.withResolvers();
127399
+ const dialog = new TextInputDialogComponent((result) => {
127400
+ host.restoreEditor();
127401
+ resolve(result.kind === "ok" ? result.value : void 0);
127402
+ }, {
127403
+ title: t("title.dialog_title"),
127404
+ initialValue: current,
127405
+ placeholder: t("title.placeholder"),
127406
+ allowEmpty: false,
127407
+ colors: host.state.theme.colors
127408
+ });
127409
+ host.mountEditorReplacement(dialog);
127410
+ return promise;
127411
+ }
129675
127412
  async function handleForkCommand(host, args) {
129676
127413
  const session = host.session;
129677
127414
  if (session === void 0) {
@@ -129968,9 +127705,8 @@ var GoalStatusMessageComponent = class {
129968
127705
  };
129969
127706
  //#endregion
129970
127707
  //#region src/tui/utils/goal-loop-conflict.ts
129971
- function detectGoalLoopConflict(state, action) {
129972
- if (action === "enable_loop" && state.goalActive) return "goal_active";
129973
- if (action === "enable_goal" && state.loopModeEnabled) return "loop_active";
127708
+ function detectGoalConflict(state, _action) {
127709
+ if (state.goalActive) return "goal_active";
129974
127710
  return null;
129975
127711
  }
129976
127712
  //#endregion
@@ -130045,19 +127781,55 @@ async function createGoal(host, parsed) {
130045
127781
  host.showError(t("error.no_session"));
130046
127782
  return;
130047
127783
  }
130048
- if (detectGoalLoopConflict(host.state.appState, "enable_goal") === "loop_active") {
127784
+ if (detectGoalConflict(host.state.appState, "enable_goal") === "goal_active") {
130049
127785
  host.showNotice(t("goal.storm_breaker"), t("goal.conflict_loop"));
130050
127786
  return;
130051
127787
  }
127788
+ await showGoalConfigWizard(host, session, parsed.objective, parsed.replace);
127789
+ }
127790
+ async function showGoalConfigWizard(host, session, objective, replace) {
127791
+ const { TextInputDialogComponent } = await import("./text-input-dialog-Yyssn7t3.mjs");
127792
+ const turnInput = await promptNumber(host, TextInputDialogComponent, {
127793
+ title: t("goal.wizard_title", { objective }),
127794
+ subtitle: t("goal.budget_turns_hint"),
127795
+ placeholder: "10"
127796
+ });
127797
+ if (turnInput === void 0) return;
127798
+ const tokenInput = await promptNumber(host, TextInputDialogComponent, {
127799
+ title: t("goal.wizard_title", { objective }),
127800
+ subtitle: t("goal.budget_tokens_hint"),
127801
+ placeholder: "200000"
127802
+ });
127803
+ if (tokenInput === void 0) return;
127804
+ const timeInput = await promptNumber(host, TextInputDialogComponent, {
127805
+ title: t("goal.wizard_title", { objective }),
127806
+ subtitle: t("goal.budget_time_hint"),
127807
+ placeholder: "30"
127808
+ });
127809
+ if (timeInput === void 0) return;
130052
127810
  try {
130053
- await session.createGoal(parsed.objective, { replace: parsed.replace });
130054
- host.showStatus(t("goal.set", { objective: parsed.objective }));
127811
+ await session.createGoal(objective, { replace });
127812
+ const budgets = [];
127813
+ if (turnInput > 0) budgets.push({
127814
+ value: turnInput,
127815
+ unit: "turns"
127816
+ });
127817
+ if (tokenInput > 0) budgets.push({
127818
+ value: tokenInput,
127819
+ unit: "tokens"
127820
+ });
127821
+ if (timeInput > 0) budgets.push({
127822
+ value: timeInput,
127823
+ unit: "minutes"
127824
+ });
127825
+ for (const b of budgets) await session.setGoalBudget(b.value, b.unit);
127826
+ host.showStatus(t("goal.set", { objective }));
130055
127827
  if (!isBusy(host.state.appState)) host.sendQueuedMessage(session, {
130056
- text: parsed.objective,
127828
+ text: objective,
130057
127829
  agentId: void 0
130058
127830
  });
130059
127831
  else host.state.queuedMessages.push({
130060
- text: parsed.objective,
127832
+ text: objective,
130061
127833
  agentId: void 0
130062
127834
  });
130063
127835
  } catch (error) {
@@ -130065,6 +127837,27 @@ async function createGoal(host, parsed) {
130065
127837
  host.showError(t("goal.create_failed", { msg: message }));
130066
127838
  }
130067
127839
  }
127840
+ /** Prompt user for a non-negative integer. Returns undefined on cancel. */
127841
+ function promptNumber(host, TextInputDialogComponent, opts) {
127842
+ return new Promise((resolve) => {
127843
+ const dialog = new TextInputDialogComponent((result) => {
127844
+ host.restoreEditor();
127845
+ if (result.kind !== "ok") {
127846
+ resolve(void 0);
127847
+ return;
127848
+ }
127849
+ const parsed = parseInt(result.value.trim(), 10);
127850
+ resolve(Number.isNaN(parsed) || parsed < 0 ? 0 : parsed);
127851
+ }, {
127852
+ title: opts.title,
127853
+ subtitle: opts.subtitle,
127854
+ placeholder: opts.placeholder,
127855
+ allowEmpty: true,
127856
+ colors: host.state.theme.colors
127857
+ });
127858
+ host.mountEditorReplacement(dialog);
127859
+ });
127860
+ }
130068
127861
  async function pauseGoal(host) {
130069
127862
  const session = host.session;
130070
127863
  if (session === void 0) {
@@ -130155,6 +127948,14 @@ function dismissGoalPanel(host) {
130155
127948
  host.state.ui.requestRender();
130156
127949
  }
130157
127950
  }
127951
+ /** Clear goal panel state on session switch to prevent stale timer/panel leaks. */
127952
+ function clearGoalState() {
127953
+ if (activeGoalTimer !== void 0) {
127954
+ clearTimeout(activeGoalTimer);
127955
+ activeGoalTimer = void 0;
127956
+ }
127957
+ activeGoalPanel = void 0;
127958
+ }
130158
127959
  const BREATHE_CYCLE_MS = 2e3;
130159
127960
  let startTime = Date.now();
130160
127961
  /**
@@ -130179,16 +127980,29 @@ function getBreathingFrame() {
130179
127980
  //#region src/tui/components/chrome/welcome.ts
130180
127981
  const HUE_STOPS$1 = 24;
130181
127982
  const SUB_STEPS$1 = 5;
130182
- function getWelcomeTips() {
130183
- return [
130184
- t("welcome.config"),
130185
- t("welcome.sessions"),
130186
- t("welcome.quick_menu")
130187
- ];
130188
- }
130189
- const WELCOME_SESSION_SLOTS = 3;
130190
- const LEFT_COLUMN_WIDTH = 22;
130191
127983
  const MIN_BOX_WIDTH = 50;
127984
+ const FULL_LOGO_MIN_WIDTH = 87;
127985
+ const LOGO$1 = [
127986
+ "███████╗ ██████╗██████╗ ███████╗ █████╗ ███╗ ███╗ ██████╗ ██████╗ ██████╗ ███████╗",
127987
+ "██╔════╝██╔════╝██╔══██╗██╔════╝██╔══██╗████╗ ████║ ██╔════╝██╔═══██╗██╔══██╗██╔════╝",
127988
+ "███████╗██║ ██████╔╝█████╗ ███████║██╔████╔██║ ██║ ██║ ██║██║ ██║█████╗ ",
127989
+ "╚════██║██║ ██╔══██╗██╔══╝ ██╔══██║██║╚██╔╝██║ ██║ ██║ ██║██║ ██║██╔══╝ ",
127990
+ "███████║╚██████╗██║ ██║███████╗██║ ██║██║ ╚═╝ ██║ ╚██████╗╚██████╔╝██████╔╝███████╗",
127991
+ "╚══════╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝"
127992
+ ];
127993
+ const SHADOW_CHARS$1 = new Set([
127994
+ "╚",
127995
+ "═",
127996
+ "╝",
127997
+ "║",
127998
+ "╔",
127999
+ "╗",
128000
+ "╠",
128001
+ "╣",
128002
+ "╦",
128003
+ "╩",
128004
+ "╬"
128005
+ ]);
130192
128006
  const LOGO_FRAMES = [
130193
128007
  ["██▄▄▄██", "▐█▄▀▄█▌"],
130194
128008
  ["██▄▄▄██", "▐▄▄▀▄▄▌"],
@@ -130266,15 +128080,6 @@ function buildBreathingPalette$1(primaryHex, hueStops, subSteps) {
130266
128080
  }
130267
128081
  return palette;
130268
128082
  }
130269
- function formatTimeAgo(timestamp) {
130270
- const seconds = Math.floor((Date.now() - timestamp) / 1e3);
130271
- if (seconds < 60) return t("welcome.just_now");
130272
- const minutes = Math.floor(seconds / 60);
130273
- if (minutes < 60) return t("welcome.minutes_ago", { minutes });
130274
- const hours = Math.floor(minutes / 60);
130275
- if (hours < 24) return t("welcome.hours_ago", { hours });
130276
- return t("welcome.days_ago", { days: Math.floor(hours / 24) });
130277
- }
130278
128083
  function padSpaces(n) {
130279
128084
  return " ".repeat(Math.max(0, n));
130280
128085
  }
@@ -130285,6 +128090,31 @@ function centerText(text, width) {
130285
128090
  const rightPad = width - visLen - leftPad;
130286
128091
  return " ".repeat(leftPad) + text + " ".repeat(rightPad);
130287
128092
  }
128093
+ /**
128094
+ * Colour a single logo line matching the loading splash scheme:
128095
+ * - `█` blocks → white (the "font")
128096
+ * - shadow chars → breathing primary colour (the "stroke")
128097
+ * - others → dim grey
128098
+ */
128099
+ function renderLogoLine(line, boxColor, dim, white) {
128100
+ let out = "";
128101
+ for (const ch of line) {
128102
+ if (ch === " ") {
128103
+ out += " ";
128104
+ continue;
128105
+ }
128106
+ if (ch === "█") {
128107
+ out += white(ch);
128108
+ continue;
128109
+ }
128110
+ if (SHADOW_CHARS$1.has(ch)) {
128111
+ out += boxColor(ch);
128112
+ continue;
128113
+ }
128114
+ out += dim(ch);
128115
+ }
128116
+ return out;
128117
+ }
130288
128118
  var WelcomeComponent = class {
130289
128119
  state;
130290
128120
  colors;
@@ -130292,13 +128122,11 @@ var WelcomeComponent = class {
130292
128122
  breatheTimer = null;
130293
128123
  breatheTimeout = null;
130294
128124
  breathePalette;
130295
- recentSessions;
130296
128125
  borderTitle = null;
130297
- constructor(state, colors, ui, recentSessions = []) {
128126
+ constructor(state, colors, ui) {
130298
128127
  this.state = state;
130299
128128
  this.colors = colors;
130300
128129
  this.ui = ui;
130301
- this.recentSessions = recentSessions;
130302
128130
  this.breathePalette = buildBreathingPalette$1(colors.primary, HUE_STOPS$1, SUB_STEPS$1);
130303
128131
  this.startBreathing();
130304
128132
  }
@@ -130328,13 +128156,10 @@ var WelcomeComponent = class {
130328
128156
  const breatheColor = this.breatheTimer !== null ? this.breathePalette[breatheFrame] ?? this.colors.primary : this.colors.primary;
130329
128157
  const boxColor = chalk.hex(breatheColor);
130330
128158
  const dim = chalk.hex(this.colors.textDim);
130331
- const muted = chalk.hex(this.colors.textMuted);
130332
- const titleColor = chalk.bold.hex(breatheColor);
128159
+ const white = chalk.hex("#FFFFFF");
130333
128160
  const boxWidth = Math.max(MIN_BOX_WIDTH, width);
130334
128161
  const innerWidth = boxWidth - 2;
130335
- const showRightColumn = innerWidth >= 55;
130336
- const leftCol = showRightColumn ? LEFT_COLUMN_WIDTH : innerWidth;
130337
- const rightCol = showRightColumn ? Math.max(10, innerWidth - leftCol - 1) : 0;
128162
+ const useFullLogo = boxWidth >= FULL_LOGO_MIN_WIDTH;
130338
128163
  const isLoggedOut = !this.state.model;
130339
128164
  const activeModel = this.state.availableModels[this.state.model];
130340
128165
  const modelValue = isLoggedOut ? chalk.hex(this.colors.warning)(t("common.not_set")) : activeModel?.displayName ?? activeModel?.model ?? this.state.model;
@@ -130342,83 +128167,43 @@ var WelcomeComponent = class {
130342
128167
  const likeValue = Boolean((like.nickname ?? "").trim() || (like.tone ?? "").trim() || (like.other ?? "").trim()) ? chalk.hex(this.colors.success)(t("welcome.like_active")) : chalk.hex(this.colors.textDim)(t("welcome.like_inactive"));
130343
128168
  let versionValue;
130344
128169
  if (this.state.hasNewVersion && this.state.latestVersion !== null) versionValue = chalk.hex(this.colors.warning)(this.state.version) + " " + dim("(" + this.state.latestVersion + ")");
130345
- else versionValue = this.state.version;
130346
- const frame = LOGO_FRAMES[this.breatheTimer !== null ? Math.floor(breatheFrame / 24) % LOGO_FRAMES.length : 0];
130347
- const logo = [boxColor(frame[0]), boxColor(frame[1])];
130348
- const tipLines = [];
130349
- for (const tip of getWelcomeTips()) tipLines.push(` ${dim("•")} ${muted(tip)}`);
130350
- const sessionLines = [];
130351
- const sessions = this.recentSessions.slice(0, WELCOME_SESSION_SLOTS);
130352
- if (sessions.length === 0) sessionLines.push(` ${dim("•")} ${muted(t("welcome.no_recent"))}`);
130353
- else for (const session of sessions) {
130354
- const name = session.title ?? session.id;
130355
- const timeAgo = formatTimeAgo(session.updatedAt);
130356
- sessionLines.push(` ${dim("•")} ${muted(name)} ${dim(`(${timeAgo})`)}`);
130357
- }
130358
- let leftRows;
130359
- let rightRows = [];
130360
- let separatorRow = -1;
130361
- if (showRightColumn) {
130362
- rightRows = [
130363
- ` ${titleColor("Tips")}`,
130364
- ...tipLines,
130365
- boxColor("─".repeat(rightCol)),
130366
- ` ${titleColor(t("welcome.recent"))}`,
130367
- ...sessionLines
130368
- ];
130369
- separatorRow = 1 + tipLines.length;
130370
- const leftContent = [
130371
- "",
130372
- centerText(logo[0], leftCol),
130373
- centerText(logo[1], leftCol),
130374
- "",
130375
- centerText(dim(versionValue), leftCol),
130376
- centerText(dim(modelValue), leftCol),
130377
- centerText(likeValue, leftCol)
130378
- ];
130379
- const topPad = Math.max(0, Math.floor((rightRows.length - leftContent.length) / 2));
130380
- const bottomPad = Math.max(0, rightRows.length - leftContent.length - topPad);
130381
- leftRows = [
130382
- ...Array(topPad).fill(""),
130383
- ...leftContent,
130384
- ...Array(bottomPad).fill("")
130385
- ];
130386
- } else leftRows = [
130387
- "",
130388
- centerText(logo[0], leftCol),
130389
- centerText(logo[1], leftCol),
130390
- "",
130391
- centerText(dim(versionValue), leftCol),
130392
- centerText(dim(modelValue), leftCol),
130393
- centerText(likeValue, leftCol),
130394
- ""
130395
- ];
128170
+ else versionValue = dim(this.state.version);
130396
128171
  const borderTitle = this.borderTitle ?? "";
130397
128172
  const contentWidth = boxWidth - 2;
130398
128173
  let topBorder;
130399
128174
  if (borderTitle) {
130400
128175
  const titleVis = visibleWidth(borderTitle);
130401
- const textPad = Math.floor((leftCol - titleVis) / 2);
130402
- const leftDash = Math.max(0, textPad - 2);
130403
128176
  const titleText = `─ ${borderTitle} ─`;
130404
128177
  const titleBlockVis = titleVis + 4;
128178
+ const leftDash = Math.max(0, Math.floor((contentWidth - titleBlockVis) / 2));
130405
128179
  const rightDash = Math.max(0, contentWidth - leftDash - titleBlockVis);
130406
128180
  topBorder = boxColor("╭" + "─".repeat(leftDash) + titleText + "─".repeat(rightDash) + "╮");
130407
128181
  } else topBorder = boxColor("╭" + "─".repeat(contentWidth) + "╮");
130408
128182
  const lines = [""];
130409
- const boxOffset = "";
130410
- lines.push(boxOffset + topBorder);
130411
- const totalRows = Math.max(leftRows.length, rightRows.length);
130412
- for (let i = 0; i < totalRows; i++) {
130413
- const left = this.#fitToWidth(leftRows[i] ?? "", leftCol);
130414
- if (showRightColumn) {
130415
- const right = this.#fitToWidth(rightRows[i] ?? "", rightCol);
130416
- const sep = i === separatorRow ? boxColor("") : boxColor("│");
130417
- lines.push(boxOffset + boxColor("│") + left + sep + right + boxColor("│"));
130418
- } else lines.push(boxOffset + boxColor("│") + left + boxColor("│"));
130419
- }
130420
- if (showRightColumn) lines.push(boxOffset + boxColor("" + "─".repeat(leftCol) + "┴" + "─".repeat(rightCol) + ""));
130421
- else lines.push(boxOffset + boxColor("" + "─".repeat(leftCol) + ""));
128183
+ lines.push(topBorder);
128184
+ const separator = dim(" · ");
128185
+ const helpValue = dim(t("welcome.help_hint"));
128186
+ if (useFullLogo) {
128187
+ lines.push(boxColor("│") + padSpaces(innerWidth) + boxColor(""));
128188
+ for (const line of LOGO$1) {
128189
+ const rendered = renderLogoLine(line, boxColor, dim, white);
128190
+ lines.push(boxColor("") + this.#fitToWidth(centerText(rendered, innerWidth), innerWidth) + boxColor("│"));
128191
+ }
128192
+ lines.push(boxColor("│") + padSpaces(innerWidth) + boxColor("│"));
128193
+ const infoLine = centerText(versionValue + separator + modelValue + separator + likeValue + separator + helpValue, innerWidth);
128194
+ lines.push(boxColor("") + this.#fitToWidth(infoLine, innerWidth) + boxColor(""));
128195
+ lines.push(boxColor("") + padSpaces(innerWidth) + boxColor(""));
128196
+ } else {
128197
+ const frame = LOGO_FRAMES[this.breatheTimer !== null ? Math.floor(breatheFrame / 24) % LOGO_FRAMES.length : 0];
128198
+ lines.push(boxColor("│") + padSpaces(innerWidth) + boxColor("│"));
128199
+ lines.push(boxColor("│") + centerText(boxColor(frame[0]), innerWidth) + boxColor("│"));
128200
+ lines.push(boxColor("│") + centerText(boxColor(frame[1]), innerWidth) + boxColor("│"));
128201
+ lines.push(boxColor("│") + padSpaces(innerWidth) + boxColor("│"));
128202
+ const infoLine = centerText(versionValue + separator + modelValue + separator + likeValue + separator + helpValue, innerWidth);
128203
+ lines.push(boxColor("│") + this.#fitToWidth(infoLine, innerWidth) + boxColor("│"));
128204
+ lines.push(boxColor("│") + padSpaces(innerWidth) + boxColor("│"));
128205
+ }
128206
+ lines.push(boxColor("╰" + "─".repeat(innerWidth) + "╯"));
130422
128207
  lines.push("");
130423
128208
  return lines;
130424
128209
  }
@@ -133675,6 +131460,7 @@ function isRevokeContextEntry(entry) {
133675
131460
  case "user":
133676
131461
  case "assistant":
133677
131462
  case "tool_call":
131463
+ case "tool_result":
133678
131464
  case "thinking":
133679
131465
  case "skill_activation": return true;
133680
131466
  case "status": return entry.turnId !== void 0;
@@ -135538,6 +133324,21 @@ function getFallbackSkillMarketplace() {
135538
133324
  ];
135539
133325
  }
135540
133326
  //#endregion
133327
+ //#region src/tui/utils/component-capabilities.ts
133328
+ function isExpandable(obj) {
133329
+ return typeof obj === "object" && obj !== null && "setExpanded" in obj && typeof obj.setExpanded === "function";
133330
+ }
133331
+ function isPlanExpandable(obj) {
133332
+ return typeof obj === "object" && obj !== null && "setPlanExpanded" in obj && typeof obj.setPlanExpanded === "function";
133333
+ }
133334
+ function hasDispose(value) {
133335
+ return typeof value === "object" && value !== null && "dispose" in value && typeof value.dispose === "function";
133336
+ }
133337
+ function disposeChildren(container) {
133338
+ for (const child of container.children) if (hasDispose(child)) child.dispose();
133339
+ container.clear();
133340
+ }
133341
+ //#endregion
135541
133342
  //#region src/tui/commands/skill-center.ts
135542
133343
  const SKILL_DESC_MAX = 60;
135543
133344
  async function handleSkillCommand(host, _args) {
@@ -135611,6 +133412,10 @@ var SkillCenterLoadingComponent = class extends Container {
135611
133412
  stop() {
135612
133413
  this.loader.stop();
135613
133414
  }
133415
+ dispose() {
133416
+ this.cancelled = true;
133417
+ this.stop();
133418
+ }
135614
133419
  };
135615
133420
  async function loadActivatableSkills(host) {
135616
133421
  const session = host.session;
@@ -135902,6 +133707,7 @@ var BtwOverlayComponent = class extends Container {
135902
133707
  requestRender;
135903
133708
  onDismiss;
135904
133709
  focused = false;
133710
+ disposed = false;
135905
133711
  spinnerFrame = 0;
135906
133712
  spinnerInterval;
135907
133713
  status = "loading";
@@ -135927,6 +133733,7 @@ var BtwOverlayComponent = class extends Container {
135927
133733
  }
135928
133734
  }
135929
133735
  setAnswer(text) {
133736
+ if (this.disposed) return;
135930
133737
  this.answer = text;
135931
133738
  this.status = "done";
135932
133739
  this.markdown = new Markdown(text.trim(), 0, 0, this.markdownTheme);
@@ -135934,6 +133741,7 @@ var BtwOverlayComponent = class extends Container {
135934
133741
  this.requestRender();
135935
133742
  }
135936
133743
  setError(error) {
133744
+ if (this.disposed) return;
135937
133745
  this.answer = error;
135938
133746
  this.status = "error";
135939
133747
  this.stopSpinner();
@@ -135955,6 +133763,10 @@ var BtwOverlayComponent = class extends Container {
135955
133763
  cleanup() {
135956
133764
  this.stopSpinner();
135957
133765
  }
133766
+ dispose() {
133767
+ this.disposed = true;
133768
+ this.stopSpinner();
133769
+ }
135958
133770
  render(width) {
135959
133771
  const c = this.colors;
135960
133772
  const lines = [];
@@ -136000,299 +133812,6 @@ async function handleBtwCommand(host, args) {
136000
133812
  }
136001
133813
  }
136002
133814
  //#endregion
136003
- //#region src/tui/utils/loop-limit.ts
136004
- const TIME_UNITS_MS = {
136005
- s: 1e3,
136006
- sec: 1e3,
136007
- secs: 1e3,
136008
- second: 1e3,
136009
- seconds: 1e3,
136010
- m: 6e4,
136011
- min: 6e4,
136012
- mins: 6e4,
136013
- minute: 6e4,
136014
- minutes: 6e4,
136015
- h: 36e5,
136016
- hr: 36e5,
136017
- hrs: 36e5,
136018
- hour: 36e5,
136019
- hours: 36e5
136020
- };
136021
- function getLoopUsage() {
136022
- return t("looplimit.usage");
136023
- }
136024
- /**
136025
- * 将 `/loop` 参数解析为可选的前置限制和可选的内联提示词。
136026
- * 看起来像限制(以数字或正负号开头)但解析失败的 token 视为硬错误;
136027
- * 其他内容都视为提示词文本,因此 `/loop` 后面跟普通 prose 会开启无限制循环。
136028
- * 失败时返回错误信息字符串。
136029
- */
136030
- function getVerifyUsage() {
136031
- return t("looplimit.verify_usage");
136032
- }
136033
- function extractVerifyFlag(input) {
136034
- const match = input.match(/--verify\s+["']([^"']+)["']/);
136035
- if (match && match[1]) {
136036
- const command = match[1];
136037
- const remaining = input.replace(match[0], "").replace(/\s{2,}/g, " ").trim();
136038
- return {
136039
- verifier: { command },
136040
- remaining
136041
- };
136042
- }
136043
- if (/\b--verify\b/.test(input)) return getVerifyUsage();
136044
- }
136045
- function parseLoopLimitArgs(args) {
136046
- const trimmed = args.trim();
136047
- if (!trimmed) return {};
136048
- const extracted = extractVerifyFlag(trimmed);
136049
- if (typeof extracted === "string") return extracted;
136050
- const verifier = extracted?.verifier;
136051
- const remaining = extracted ? extracted.remaining : trimmed;
136052
- if (!remaining) return verifier ? { verifier } : {};
136053
- const firstSpace = remaining.search(/\s/);
136054
- const firstToken = firstSpace === -1 ? remaining : remaining.slice(0, firstSpace);
136055
- const rest = firstSpace === -1 ? "" : remaining.slice(firstSpace + 1).trim();
136056
- const token = firstToken.toLowerCase();
136057
- if (!/^[+-]?\d/.test(token)) return {
136058
- prompt: remaining,
136059
- verifier
136060
- };
136061
- if (/^[+-]?\d+$/.test(token)) {
136062
- if (token.startsWith("-")) return t("looplimit.iteration_must_be_positive");
136063
- if (rest) {
136064
- const restTokens = rest.split(/\s+/);
136065
- const firstRestToken = restTokens[0];
136066
- if (firstRestToken !== void 0) {
136067
- const unitMs = TIME_UNITS_MS[firstRestToken.toLowerCase()];
136068
- if (unitMs !== void 0) {
136069
- const limit = makeDuration(token, unitMs);
136070
- if (typeof limit === "string") return limit;
136071
- return {
136072
- limit,
136073
- prompt: restTokens.slice(1).join(" ").trim() || void 0,
136074
- verifier
136075
- };
136076
- }
136077
- }
136078
- }
136079
- const limit = makeIterations(token);
136080
- if (typeof limit === "string") return limit;
136081
- return {
136082
- limit,
136083
- prompt: rest || void 0,
136084
- verifier
136085
- };
136086
- }
136087
- const duration = parseCompoundDuration(token);
136088
- if (duration !== void 0) {
136089
- if (typeof duration === "string") return duration;
136090
- return {
136091
- limit: duration,
136092
- prompt: rest || void 0,
136093
- verifier
136094
- };
136095
- }
136096
- return getLoopUsage();
136097
- }
136098
- function makeIterations(amountText) {
136099
- const amount = Number(amountText);
136100
- if (!Number.isSafeInteger(amount) || amount <= 0) return t("looplimit.iteration_must_be_positive");
136101
- return {
136102
- kind: "iterations",
136103
- iterations: amount
136104
- };
136105
- }
136106
- function makeDuration(amountText, unitMs) {
136107
- const amount = Number(amountText);
136108
- if (!Number.isSafeInteger(amount) || amount <= 0) return t("looplimit.duration_must_be_positive");
136109
- return {
136110
- kind: "duration",
136111
- durationMs: amount * unitMs
136112
- };
136113
- }
136114
- function parseCompoundDuration(token) {
136115
- if (!/^(?:\d+[a-z]+)+$/.test(token)) return void 0;
136116
- const segments = token.match(/\d+[a-z]+/g);
136117
- if (!segments) return void 0;
136118
- let totalMs = 0;
136119
- for (const segment of segments) {
136120
- const match = /^(\d+)([a-z]+)$/.exec(segment);
136121
- if (!match) return getLoopUsage();
136122
- const unitName = match[2];
136123
- if (unitName === void 0) return getLoopUsage();
136124
- const unitMs = TIME_UNITS_MS[unitName];
136125
- if (unitMs === void 0) return t("looplimit.duration_unit_invalid");
136126
- const amount = Number(match[1]);
136127
- if (!Number.isSafeInteger(amount) || amount <= 0) return t("looplimit.duration_must_be_positive");
136128
- totalMs += amount * unitMs;
136129
- }
136130
- if (totalMs <= 0) return t("looplimit.duration_must_be_positive");
136131
- return {
136132
- kind: "duration",
136133
- durationMs: totalMs
136134
- };
136135
- }
136136
- function createLoopLimitRuntime(config, nowMs = Date.now()) {
136137
- if (!config) return void 0;
136138
- if (config.kind === "iterations") return {
136139
- kind: "iterations",
136140
- initial: config.iterations,
136141
- remaining: config.iterations
136142
- };
136143
- return {
136144
- kind: "duration",
136145
- durationMs: config.durationMs,
136146
- deadlineMs: nowMs + config.durationMs
136147
- };
136148
- }
136149
- function consumeLoopLimitIteration(limit, nowMs = Date.now()) {
136150
- if (!limit) return true;
136151
- if (limit.kind === "duration") return nowMs < limit.deadlineMs;
136152
- if (limit.remaining <= 0) return false;
136153
- limit.remaining -= 1;
136154
- return true;
136155
- }
136156
- function isLoopLimitExpired(limit, nowMs = Date.now()) {
136157
- if (!limit) return false;
136158
- if (limit.kind === "duration") return nowMs >= limit.deadlineMs;
136159
- return limit.remaining <= 0;
136160
- }
136161
- function describeLoopLimit(config) {
136162
- if (config.kind === "iterations") return t("looplimit.iterations", { count: config.iterations });
136163
- return formatDuration$1(config.durationMs);
136164
- }
136165
- function describeLoopLimitRuntime(limit, nowMs = Date.now()) {
136166
- if (limit.kind === "iterations") return t("looplimit.remaining_iterations", {
136167
- remaining: limit.remaining,
136168
- initial: limit.initial
136169
- });
136170
- const remainingMs = limit.deadlineMs - nowMs;
136171
- if (remainingMs <= 0) return t("looplimit.expired");
136172
- return t("looplimit.remaining_duration", { duration: formatDuration$1(remainingMs) });
136173
- }
136174
- function formatDuration$1(durationMs) {
136175
- if (durationMs % 36e5 === 0) return t("looplimit.hours", { count: durationMs / 36e5 });
136176
- if (durationMs % 6e4 === 0) return t("looplimit.minutes", { count: durationMs / 6e4 });
136177
- return t("looplimit.seconds", { count: durationMs / 1e3 });
136178
- }
136179
- //#endregion
136180
- //#region src/tui/commands/loop.ts
136181
- const DEFAULT_VERIFY_TIMEOUT_MS = 6e4;
136182
- function makeVerifier(command) {
136183
- return {
136184
- command,
136185
- timeoutMs: DEFAULT_VERIFY_TIMEOUT_MS
136186
- };
136187
- }
136188
- /**
136189
- * 循环模式不能每轮等用户审批,开启时若处于 manual 权限,自动切到 auto。
136190
- * 失败时不阻塞 loop 开启,仅静默跳过。
136191
- */
136192
- async function ensureAutoPermission(host) {
136193
- if (host.state.appState.permissionMode !== "manual") return;
136194
- try {
136195
- await host.requireSession().setPermission("auto");
136196
- host.setAppState({ permissionMode: "auto" });
136197
- host.showStatus(t("loop.permission_auto"));
136198
- } catch {}
136199
- }
136200
- /**
136201
- * 循环模式(无状态重试)。
136202
- *
136203
- * 定位:自动重试机 + 客观验证门。每轮重发同一条 prompt,AI 不记得上一轮
136204
- * 的输出。适合配 `--verify` 验证命令,让客观 exit code 决定循环何时结束。
136205
- *
136206
- * 适合场景:任务与上次结果无关(等 CI、轮询健康检查、等服务起来、单次
136207
- * 可能失败需要重试几次的幂等任务)。
136208
- *
136209
- * 不适合:任务需要根据上次失败调整策略 → 用 /goal(AI 带工作笔记迭代)。
136210
- *
136211
- * 行为:
136212
- * - /loop (未开启)显示帮助
136213
- * - /loop (已开启)关闭循环模式
136214
- * - /loop 10 [提示词] 开启循环,限制 10 次
136215
- * - /loop 5m [提示词] 开启循环,限制 5 分钟
136216
- * - /loop <提示词> (已暂停)恢复循环并使用该提示词
136217
- * - /loop 10 ... --verify "命令" 每轮后跑验证命令,通过即停
136218
- */
136219
- async function handleLoopCommand(host, args) {
136220
- const trimmed = args.trim();
136221
- if (host.state.appState.loopModeEnabled) {
136222
- if (!trimmed) {
136223
- disableLoopMode(host, t("loop.disabled"));
136224
- return;
136225
- }
136226
- const parsed = parseLoopLimitArgs(args);
136227
- if (typeof parsed === "string") {
136228
- host.showError(parsed);
136229
- return;
136230
- }
136231
- const wasPaused = host.state.appState.loopPrompt === void 0;
136232
- const loopLimit = parsed.limit ? createLoopLimitRuntime(parsed.limit) : host.state.appState.loopLimit;
136233
- const loopPrompt = parsed.prompt ?? host.state.appState.loopPrompt;
136234
- const loopVerifier = parsed.verifier ? makeVerifier(parsed.verifier.command) : host.state.appState.loopVerifier;
136235
- host.setAppState({
136236
- loopLimit,
136237
- loopPrompt,
136238
- loopVerifier
136239
- });
136240
- if (wasPaused && loopPrompt !== void 0) host.sendNormalUserInput(loopPrompt);
136241
- else host.showStatus(t("loop.prompt_updated"));
136242
- return;
136243
- }
136244
- if (!trimmed) {
136245
- host.showNotice(t("loop.title"), t("loop.help_desc") + "\n\n" + t("loop.help_usage") + "\n" + t("loop.help_example_count") + "\n" + t("loop.help_example_duration") + "\n" + t("loop.help_example_combo") + "\n" + t("loop.help_example_verify") + "\n\n" + t("loop.help_suitable") + "\n" + t("loop.help_unsuitable") + "\n\n" + t("loop.help_esc_hint"));
136246
- return;
136247
- }
136248
- if (host.state.appState.model.trim().length === 0) {
136249
- host.showError(getLlmNotSetMessage());
136250
- return;
136251
- }
136252
- if (host.session === void 0) {
136253
- host.showError(getNoActiveSessionMessage());
136254
- return;
136255
- }
136256
- const parsed = parseLoopLimitArgs(args);
136257
- if (typeof parsed === "string") {
136258
- host.showError(parsed);
136259
- return;
136260
- }
136261
- if (detectGoalLoopConflict(host.state.appState, "enable_loop") === "goal_active") {
136262
- host.showNotice(t("loop.conflict_goal_title"), t("loop.conflict_goal"));
136263
- return;
136264
- }
136265
- const loopLimit = createLoopLimitRuntime(parsed.limit);
136266
- host.setAppState({
136267
- loopModeEnabled: true,
136268
- loopPrompt: void 0,
136269
- loopLimit,
136270
- loopVerifier: parsed.verifier ? makeVerifier(parsed.verifier.command) : void 0,
136271
- loopIteration: 0,
136272
- loopLastVerifyPassed: void 0,
136273
- loopVerifying: false
136274
- });
136275
- await ensureAutoPermission(host);
136276
- const limitSuffix = parsed.limit ? ` ${t("loop.limit_label")}${describeLoopLimit(parsed.limit)}。` : "";
136277
- const remainingSuffix = loopLimit ? ` ${describeLoopLimitRuntime(loopLimit)}。` : "";
136278
- const verifierSuffix = parsed.verifier ? ` ${t("loop.verify_label")}${parsed.verifier.command}${t("loop.verify_hint")}` : "";
136279
- const promptBehavior = parsed.prompt ? t("loop.fixed_prompt") : t("loop.next_prompt");
136280
- host.showNotice(t("loop.enabled"), `${promptBehavior}${limitSuffix}${remainingSuffix}${verifierSuffix}\n\n` + t("loop.hint_reset") + t("loop.hint_goal") + "\n\n" + t("loop.command_ref") + "\n" + t("loop.help_toggle") + "\n" + t("loop.help_example_count") + "\n" + t("loop.help_example_duration") + "\n" + t("loop.help_example_combo") + "\n" + t("loop.help_verify_short") + "\n" + t("loop.help_esc_hint"));
136281
- if (parsed.prompt) host.sendNormalUserInput(parsed.prompt);
136282
- }
136283
- function disableLoopMode(host, message) {
136284
- host.setAppState({
136285
- loopModeEnabled: false,
136286
- loopPrompt: void 0,
136287
- loopLimit: void 0,
136288
- loopVerifier: void 0,
136289
- loopIteration: 0,
136290
- loopLastVerifyPassed: void 0,
136291
- loopVerifying: false
136292
- });
136293
- if (message) host.showStatus(message);
136294
- }
136295
- //#endregion
136296
133815
  //#region src/tui/commands/like.ts
136297
133816
  function promptTextInput$1(host, title, opts) {
136298
133817
  const { promise, resolve } = Promise.withResolvers();
@@ -136457,6 +133976,7 @@ async function startManualEmbeddingDownload() {
136457
133976
  * 白底简约科技风:灰色小点星云 + 细黑线条 + 放大显示文字。
136458
133977
  */
136459
133978
  const activeServers = /* @__PURE__ */ new Set();
133979
+ const activeTimers = /* @__PURE__ */ new Set();
136460
133980
  function registerServer(server) {
136461
133981
  activeServers.add(server);
136462
133982
  server.on("close", () => {
@@ -136464,6 +133984,8 @@ function registerServer(server) {
136464
133984
  });
136465
133985
  }
136466
133986
  function closeAllServers() {
133987
+ for (const timer of activeTimers) clearInterval(timer);
133988
+ activeTimers.clear();
136467
133989
  for (const server of activeServers) server.close();
136468
133990
  }
136469
133991
  process.on("exit", closeAllServers);
@@ -137679,8 +135201,10 @@ async function handleWeb(host) {
137679
135201
  const timer = setInterval(() => {
137680
135202
  res.write(": ping\n\n");
137681
135203
  }, 15e3);
135204
+ activeTimers.add(timer);
137682
135205
  res.on("close", () => {
137683
135206
  clearInterval(timer);
135207
+ activeTimers.delete(timer);
137684
135208
  server.close();
137685
135209
  });
137686
135210
  res.write(": ok\n\n");
@@ -138586,9 +136110,6 @@ async function handleBuiltInSlashCommand(host, name, args) {
138586
136110
  case "wolfpack":
138587
136111
  await handleWolfpackCommand(host, args);
138588
136112
  return;
138589
- case "loop":
138590
- await handleLoopCommand(host, args);
138591
- return;
138592
136113
  case "revoke":
138593
136114
  await handleRevokeCommand(host, args);
138594
136115
  return;
@@ -139444,6 +136965,18 @@ var EditorKeyboardController = class {
139444
136965
  host.hideSessionPicker();
139445
136966
  return;
139446
136967
  }
136968
+ if (host.state.activeDialog === "memory-picker") {
136969
+ host.hideMemoryPicker();
136970
+ return;
136971
+ }
136972
+ if (host.state.activeDialog === "help") {
136973
+ host.hideHelpPanel();
136974
+ return;
136975
+ }
136976
+ if (host.state.activeDialog === "overlay") {
136977
+ host.restoreEditor();
136978
+ return;
136979
+ }
139447
136980
  if (host.state.appState.isCompacting) {
139448
136981
  this.cancelCurrentCompaction();
139449
136982
  return;
@@ -139452,10 +136985,6 @@ var EditorKeyboardController = class {
139452
136985
  this.cancelCurrentStream();
139453
136986
  return;
139454
136987
  }
139455
- if (host.state.appState.loopModeEnabled && host.state.appState.loopPrompt) {
139456
- host.setAppState({ loopPrompt: void 0 });
139457
- host.showStatus(t("editorkey.loop_paused"));
139458
- }
139459
136988
  };
139460
136989
  editor.onShiftTab = () => {
139461
136990
  if (host.session === void 0) {
@@ -139879,35 +137408,6 @@ function formatDuration(ms) {
139879
137408
  return `${(ms / 1e3).toFixed(1)}s`;
139880
137409
  }
139881
137410
  //#endregion
139882
- //#region src/tui/utils/loop-verifier.ts
139883
- const execAsync = promisify(exec);
139884
- async function runShellVerifier(config, cwd) {
139885
- const start = Date.now();
139886
- try {
139887
- const { stdout, stderr } = await execAsync(config.command, {
139888
- cwd,
139889
- timeout: config.timeoutMs,
139890
- maxBuffer: 1024 * 1024
139891
- });
139892
- return {
139893
- passed: true,
139894
- output: trimOutput(stdout + stderr),
139895
- durationMs: Date.now() - start
139896
- };
139897
- } catch (err) {
139898
- const e = err;
139899
- return {
139900
- passed: false,
139901
- output: trimOutput((e.stdout ?? "") + (e.stderr ?? "")),
139902
- durationMs: Date.now() - start,
139903
- exitCode: e.killed ? -1 : e.code ?? 1
139904
- };
139905
- }
139906
- }
139907
- function trimOutput(text) {
139908
- return text.slice(-2e3);
139909
- }
139910
- //#endregion
139911
137411
  //#region src/tui/utils/transcript-id.ts
139912
137412
  let transcriptIdCounter = 0;
139913
137413
  function nextTranscriptId() {
@@ -140256,69 +137756,6 @@ var SessionEventHandler = class {
140256
137756
  if (todos.length > 0 && todos.every((t) => t.status === "done")) this.host.streamingUI.setTodoList([]);
140257
137757
  this.host.streamingUI.resetToolUi();
140258
137758
  this.host.streamingUI.finalizeTurn(sendQueued);
140259
- this.maybeScheduleLoopAutoSubmit();
140260
- }
140261
- maybeScheduleLoopAutoSubmit() {
140262
- const { loopModeEnabled, loopPrompt, loopLimit } = this.host.state.appState;
140263
- if (!loopModeEnabled || loopPrompt === void 0) return;
140264
- if (isLoopLimitExpired(loopLimit)) {
140265
- const reason = loopLimit?.kind === "duration" ? t("handler.loop_limit_time") : t("handler.loop_limit_count");
140266
- this.disableLoop(t("handler.loop_limit_reached", {
140267
- reason,
140268
- suffix: ""
140269
- }));
140270
- return;
140271
- }
140272
- setTimeout(() => {
140273
- this.advanceLoopIteration(loopPrompt);
140274
- }, 800);
140275
- }
140276
- disableLoop(message) {
140277
- this.host.setAppState({
140278
- loopModeEnabled: false,
140279
- loopPrompt: void 0,
140280
- loopLimit: void 0,
140281
- loopVerifier: void 0,
140282
- loopIteration: 0,
140283
- loopLastVerifyPassed: void 0,
140284
- loopVerifying: false
140285
- });
140286
- this.host.showStatus(message);
140287
- }
140288
- async advanceLoopIteration(loopPrompt) {
140289
- const state = this.host.state.appState;
140290
- if (!state.loopModeEnabled || state.loopPrompt !== loopPrompt || state.streamingPhase !== "idle") return;
140291
- const currentIteration = state.loopIteration + 1;
140292
- this.host.setAppState({ loopIteration: currentIteration });
140293
- const verifier = state.loopVerifier;
140294
- if (verifier) {
140295
- this.host.setAppState({ loopVerifying: true });
140296
- const result = await runShellVerifier(verifier, state.workDir);
140297
- const after = this.host.state.appState;
140298
- if (!after.loopModeEnabled || after.loopPrompt !== loopPrompt) {
140299
- this.host.setAppState({ loopVerifying: false });
140300
- return;
140301
- }
140302
- if (result.passed) {
140303
- this.host.setAppState({ loopVerifying: false });
140304
- this.disableLoop(t("handler.loop_verify_passed", { iteration: currentIteration }));
140305
- return;
140306
- }
140307
- this.host.setAppState({
140308
- loopVerifying: false,
140309
- loopLastVerifyPassed: false
140310
- });
140311
- }
140312
- if (!consumeLoopLimitIteration(this.host.state.appState.loopLimit)) {
140313
- const reason = this.host.state.appState.loopLimit?.kind === "duration" ? t("handler.loop_limit_time") : t("handler.loop_limit_count");
140314
- const suffix = verifier ? t("handler.loop_verify_not_passed") : "";
140315
- this.disableLoop(t("handler.loop_limit_reached", {
140316
- reason,
140317
- suffix
140318
- }));
140319
- return;
140320
- }
140321
- this.host.sendNormalUserInput(loopPrompt);
140322
137759
  }
140323
137760
  handleStepBegin(event) {
140324
137761
  this.host.streamingUI.flushNow();
@@ -140463,6 +137900,7 @@ var SessionEventHandler = class {
140463
137900
  if (event.contextTokens !== void 0) patch.contextTokens = event.contextTokens;
140464
137901
  if (event.maxContextTokens !== void 0) patch.maxContextTokens = event.maxContextTokens;
140465
137902
  if (event.planMode !== void 0) patch.planMode = event.planMode ? event.planStrategy === "fusion" ? "fusionplan" : "plan" : "off";
137903
+ if (event.wolfpackMode !== void 0) patch.wolfpackMode = event.wolfpackMode;
140466
137904
  if (event.permission !== void 0) patch.permissionMode = event.permission;
140467
137905
  if (Object.keys(patch).length > 0) this.host.setAppState(patch);
140468
137906
  }
@@ -141513,17 +138951,6 @@ var CompactionComponent = class extends Container {
141513
138951
  }
141514
138952
  };
141515
138953
  //#endregion
141516
- //#region src/tui/utils/component-capabilities.ts
141517
- function isExpandable(obj) {
141518
- return typeof obj === "object" && obj !== null && "setExpanded" in obj && typeof obj.setExpanded === "function";
141519
- }
141520
- function isPlanExpandable(obj) {
141521
- return typeof obj === "object" && obj !== null && "setPlanExpanded" in obj && typeof obj.setPlanExpanded === "function";
141522
- }
141523
- function hasDispose(value) {
141524
- return typeof value === "object" && value !== null && "dispose" in value && typeof value.dispose === "function";
141525
- }
141526
- //#endregion
141527
138954
  //#region src/tui/utils/terminal-notification.ts
141528
138955
  function notifyTerminalOnce(state, key, notification) {
141529
138956
  const { enabled, condition } = state.appState.notifications;
@@ -142144,6 +139571,16 @@ var StreamingUIController = class {
142144
139571
  const completed = new ToolCallComponent(matchedCall, result, state.theme.colors, state.ui, state.theme.markdownTheme, state.appState.workDir);
142145
139572
  if (state.toolOutputExpanded) completed.setExpanded(true);
142146
139573
  if (state.planExpanded) completed.setPlanExpanded(true);
139574
+ const entry = {
139575
+ id: nextTranscriptId(),
139576
+ kind: "tool_result",
139577
+ turnId: this._currentTurnId,
139578
+ renderMode: "plain",
139579
+ content: typeof result === "string" ? result : result.output ?? "",
139580
+ toolCallData: matchedCall
139581
+ };
139582
+ this.host.pushTranscriptEntry(entry);
139583
+ this.host.transcriptController.registerLiveComponent(completed, entry);
142147
139584
  state.transcriptContainer.addChild(completed);
142148
139585
  state.ui.requestRender();
142149
139586
  }
@@ -143435,6 +140872,7 @@ var CommittedMessageComponent = class {
143435
140872
  return new Text(` ${chalk.hex(colors.textDim)(text)}`, 0, 0).render(width);
143436
140873
  }
143437
140874
  case "welcome": return [];
140875
+ case "tool_result": return [];
143438
140876
  }
143439
140877
  }
143440
140878
  };
@@ -143615,7 +141053,7 @@ var TranscriptController = class TranscriptController {
143615
141053
  renderWelcome() {
143616
141054
  const { state } = this.host;
143617
141055
  this.welcomeComponent?.stopBreathing();
143618
- const welcome = new WelcomeComponent(state.appState, state.theme.colors, state.ui, state.appState.recentSessions);
141056
+ const welcome = new WelcomeComponent(state.appState, state.theme.colors, state.ui);
143619
141057
  welcome.borderTitle = "Scream Code";
143620
141058
  this.welcomeComponent = welcome;
143621
141059
  if (state.editor.hasFirstInputFired()) welcome.stopBreathing();
@@ -143637,8 +141075,7 @@ var TranscriptController = class TranscriptController {
143637
141075
  this.committedComponent = void 0;
143638
141076
  this.liveComponentToEntry.clear();
143639
141077
  this.pendingComponents.clear();
143640
- for (const child of state.transcriptContainer.children) if (hasDispose(child)) child.dispose();
143641
- state.transcriptContainer.clear();
141078
+ disposeChildren(state.transcriptContainer);
143642
141079
  this.clearTerminalInlineImages();
143643
141080
  state.todoPanel.clear();
143644
141081
  state.todoPanelContainer.clear();
@@ -144302,7 +141739,7 @@ var LifecycleController = class LifecycleController {
144302
141739
  }
144303
141740
  resolveActivityPaneMode() {
144304
141741
  const { state } = this.host;
144305
- if (state.activeDialog === "session-picker" || state.activeDialog === "memory-picker") return "hidden";
141742
+ if (state.activeDialog !== null) return "hidden";
144306
141743
  if (state.livePane.pendingApproval !== null) return "hidden";
144307
141744
  if (state.appState.isCompacting) return "hidden";
144308
141745
  if (state.livePane.pendingQuestion !== null) return "hidden";
@@ -144801,10 +142238,6 @@ var InputController = class {
144801
142238
  this.dispatchUserInput(text, session);
144802
142239
  }
144803
142240
  dispatchUserInput(text, session) {
144804
- if (this.host.state.appState.loopModeEnabled && !this.host.state.appState.loopPrompt) {
144805
- this.host.setAppState({ loopPrompt: text });
144806
- consumeLoopLimitIteration(this.host.state.appState.loopLimit);
144807
- }
144808
142241
  const extraction = extractMediaAttachments(text, this.host.imageStore);
144809
142242
  if (!this.validateMediaCapabilities(extraction)) return;
144810
142243
  if (extraction.hasMedia) this.sendMessage(session, text, {
@@ -144852,6 +142285,7 @@ var InputController = class {
144852
142285
  this.#stopBreathing();
144853
142286
  const colorToken = isPlan ? planMode === "fusionplan" ? this.host.state.theme.colors.fusionPlanMode : this.host.state.theme.colors.planMode : this.host.state.theme.colors.primary;
144854
142287
  this.host.state.editor.borderColor = (s) => chalk.hex(colorToken)(s);
142288
+ this.host.state.editor.borderHex = colorToken;
144855
142289
  this.host.state.ui.requestRender();
144856
142290
  }
144857
142291
  }
@@ -144883,6 +142317,7 @@ var InputController = class {
144883
142317
  }
144884
142318
  const colorToken = this.host.state.theme.colors.primary;
144885
142319
  this.host.state.editor.borderColor = (s) => chalk.hex(colorToken)(s);
142320
+ this.host.state.editor.borderHex = colorToken;
144886
142321
  this.host.state.ui.requestRender();
144887
142322
  }
144888
142323
  #startBreathing() {
@@ -144897,6 +142332,7 @@ var InputController = class {
144897
142332
  this.breatheTimer = setInterval(() => {
144898
142333
  const hex = hslToHex((baseHue + getBreathingFrame() / BREATHE_FRAMES * 360) % 360, 90, 70);
144899
142334
  editor.borderColor = (s) => chalk.hex(hex)(s);
142335
+ editor.borderHex = hex;
144900
142336
  ui.requestRender();
144901
142337
  }, BREATHE_INTERVAL_MS);
144902
142338
  if (this.breatheTimeout === null) this.breatheTimeout = setTimeout(() => {
@@ -145202,6 +142638,7 @@ function createRenderBatcher(doRender) {
145202
142638
  let pendingForce = false;
145203
142639
  let batchDepth = 0;
145204
142640
  let batchNeedsRender = false;
142641
+ let batchForce = false;
145205
142642
  const scheduleRender = (force) => {
145206
142643
  pendingForce ||= force;
145207
142644
  if (scheduled) return;
@@ -145217,6 +142654,7 @@ function createRenderBatcher(doRender) {
145217
142654
  requestRender(force = false) {
145218
142655
  if (batchDepth > 0) {
145219
142656
  batchNeedsRender = true;
142657
+ batchForce ||= force;
145220
142658
  return;
145221
142659
  }
145222
142660
  scheduleRender(force);
@@ -145229,7 +142667,9 @@ function createRenderBatcher(doRender) {
145229
142667
  batchDepth--;
145230
142668
  if (batchDepth === 0 && batchNeedsRender) {
145231
142669
  batchNeedsRender = false;
145232
- scheduleRender(pendingForce);
142670
+ const force = batchForce;
142671
+ batchForce = false;
142672
+ scheduleRender(force || pendingForce);
145233
142673
  }
145234
142674
  }
145235
142675
  }
@@ -145590,6 +143030,8 @@ var CustomEditor = class extends Editor {
145590
143030
  thinking = false;
145591
143031
  /** Current thinking effort level (e.g. low, medium, high). Used to annotate the think label. */
145592
143032
  thinkingLevel = "off";
143033
+ /** Current border colour hex — kept in sync with borderColor by the host. */
143034
+ borderHex = "";
145593
143035
  consumingPaste = false;
145594
143036
  consumeBuffer = "";
145595
143037
  /**
@@ -145648,7 +143090,7 @@ var CustomEditor = class extends Editor {
145648
143090
  const withPrompt = injectPromptSymbol(firstContent);
145649
143091
  if (withPrompt !== void 0) lines[firstContentIdx] = withPrompt;
145650
143092
  }
145651
- if (this.thinking) injectThinkLabel(lines, width, this.thinkingLevel, this.borderColor ?? ((s) => s));
143093
+ if (this.thinking) injectThinkLabel(lines, width, this.thinkingLevel, this.borderColor ?? ((s) => s), this.borderHex);
145652
143094
  return lines;
145653
143095
  }
145654
143096
  handleInput(data) {
@@ -145780,25 +143222,35 @@ function injectPromptSymbol(line) {
145780
143222
  for (let i = 0; i < 2; i++) if (line[i] !== " ") return void 0;
145781
143223
  return "> " + line.slice(2);
145782
143224
  }
145783
- const THINK_LABEL = " Think ";
145784
143225
  const THINK_LABEL_MIN_WIDTH = 14;
143226
+ function isLightBg(hex) {
143227
+ const r = parseInt(hex.slice(1, 3), 16);
143228
+ const g = parseInt(hex.slice(3, 5), 16);
143229
+ const b = parseInt(hex.slice(5, 7), 16);
143230
+ return (.299 * r + .587 * g + .114 * b) / 255 > .5;
143231
+ }
145785
143232
  /**
145786
- * Embed a small "think" label into the top border line of the editor.
143233
+ * Embed a small "think" badge into the top border line of the editor.
145787
143234
  * The label only appears when the active model has thinking enabled.
145788
143235
  * Works with pi-tui's flat two-line design (no side borders).
143236
+ *
143237
+ * The badge uses the border colour as background with black text for
143238
+ * maximum contrast against the bright border colours (yellow-green,
143239
+ * cyan, amber) used across themes.
145789
143240
  */
145790
- function injectThinkLabel(lines, width, thinkingLevel, paint) {
143241
+ function injectThinkLabel(lines, width, thinkingLevel, paint, borderHex) {
145791
143242
  if (width < THINK_LABEL_MIN_WIDTH) return;
145792
143243
  const topIdx = lines.findIndex((line) => {
145793
143244
  const plain = stripSgr(line);
145794
143245
  return plain.length > 0 && plain[0] === "─";
145795
143246
  });
145796
143247
  if (topIdx === -1) return;
145797
- const labelBlock = `─${thinkingLevel !== "off" ? ` Think ${thinkingLevel} ` : THINK_LABEL}─`;
145798
- const labelVis = visibleWidth(labelBlock);
145799
- const leftDashCount = width - 1 - labelVis;
143248
+ const label = thinkingLevel !== "off" ? ` Think ${thinkingLevel} ` : " Think ";
143249
+ const badge = borderHex ? chalk.bgHex(borderHex).hex(isLightBg(borderHex) ? "#000000" : "#FFFFFF")(label) : chalk.bgBlack.white(label);
143250
+ const badgeVis = visibleWidth(badge);
143251
+ const leftDashCount = width - 1 - badgeVis;
145800
143252
  if (leftDashCount < 1) return;
145801
- lines[topIdx] = paint("─".repeat(leftDashCount) + labelBlock + "─");
143253
+ lines[topIdx] = paint("─".repeat(leftDashCount)) + badge + paint("─");
145802
143254
  }
145803
143255
  //#endregion
145804
143256
  //#region src/tui/utils/terminal-state.ts
@@ -146587,7 +144039,8 @@ var SessionManager = class {
146587
144039
  sessionId: session.id,
146588
144040
  model: status.model ?? "",
146589
144041
  thinkingLevel: status.thinkingLevel,
146590
- planMode: status.planMode ? "plan" : "off",
144042
+ planMode: status.planMode ? status.planStrategy === "fusion" ? "fusionplan" : "plan" : "off",
144043
+ wolfpackMode: status.wolfpackMode,
146591
144044
  contextTokens: status.contextTokens,
146592
144045
  maxContextTokens: status.maxContextTokens,
146593
144046
  contextUsage: status.contextUsage,
@@ -146626,6 +144079,20 @@ var SessionManager = class {
146626
144079
  this.host.appendApprovalTranscriptEntry(request, response);
146627
144080
  }));
146628
144081
  session.setQuestionHandler(createQuestionAskHandler(this.host.questionController));
144082
+ if (this.host.reverseRpcDisposers.length === 0) this.host.reverseRpcDisposers.push(...registerReverseRPCHandlers(this.host.approvalController, this.host.questionController, {
144083
+ showApprovalPanel: (payload) => {
144084
+ this.host.showApprovalPanel(payload);
144085
+ },
144086
+ hideApprovalPanel: () => {
144087
+ this.host.hideApprovalPanel();
144088
+ },
144089
+ showQuestionDialog: (payload) => {
144090
+ this.host.showQuestionDialog(payload);
144091
+ },
144092
+ hideQuestionDialog: () => {
144093
+ this.host.hideQuestionDialog();
144094
+ }
144095
+ }));
146629
144096
  }
146630
144097
  async fetchSessions() {
146631
144098
  this.host.state.loadingSessions = true;
@@ -147284,6 +144751,7 @@ var HelpPanelComponent = class extends Container {
147284
144751
  accent.bold(t("help.title")) + muted(` · ${t("help.close_hint")}`),
147285
144752
  "",
147286
144753
  ` ${dim(t("help.welcome_msg"))}`,
144754
+ ` ${muted(t("help.hidden_commands"))}`,
147287
144755
  "",
147288
144756
  ` ${chalk.bold(t("help.shortcuts"))}`,
147289
144757
  ...shortcuts.map((s) => ` ${kbdColor(s.keys.padEnd(kbdWidth))} ${dim(s.description)}`),
@@ -148506,15 +145974,16 @@ var DialogManager = class {
148506
145974
  }
148507
145975
  mountEditorReplacement(panel) {
148508
145976
  this.host.exitFullScreenTakeover();
148509
- this.host.state.editorContainer.clear();
145977
+ disposeChildren(this.host.state.editorContainer);
148510
145978
  this.host.state.editorContainer.addChild(panel);
148511
145979
  this.host.state.ui.setFocus(panel);
148512
145980
  this.host.state.ui.requestRender();
148513
145981
  }
148514
145982
  restoreEditor() {
148515
- this.host.state.editorContainer.clear();
145983
+ disposeChildren(this.host.state.editorContainer);
148516
145984
  this.host.state.editorContainer.addChild(this.host.state.editor);
148517
145985
  this.host.state.ui.setFocus(this.host.state.editor);
145986
+ this.host.state.activeDialog = null;
148518
145987
  this.host.state.ui.requestRender();
148519
145988
  }
148520
145989
  showHelpPanel(commands) {
@@ -148738,13 +146207,6 @@ function createInitialAppState(input) {
148738
146207
  goalContinuationCount: 0,
148739
146208
  ccConnectActive: false,
148740
146209
  wolfpackMode: input.cliOptions.wolfpack === true,
148741
- loopModeEnabled: false,
148742
- loopPrompt: void 0,
148743
- loopLimit: void 0,
148744
- loopVerifier: void 0,
148745
- loopIteration: 0,
148746
- loopLastVerifyPassed: void 0,
148747
- loopVerifying: false,
148748
146210
  recentSessions: [],
148749
146211
  subagentUsage: {}
148750
146212
  };
@@ -149194,6 +146656,8 @@ var ScreamTUI = class {
149194
146656
  }
149195
146657
  clearTranscriptAndRedraw() {
149196
146658
  this.sessionEventHandler.stopAllMcpServerStatusSpinners();
146659
+ clearGoalState();
146660
+ clearInfoPanelState(this.state);
149197
146661
  this.state.terminal.write("\x1B[3J");
149198
146662
  this.transcriptController.clearAndRedraw();
149199
146663
  this.state.ui.requestRender(true);
@@ -149233,7 +146697,7 @@ var ScreamTUI = class {
149233
146697
  this.lifecycleController.applyTheme(theme, resolved);
149234
146698
  }
149235
146699
  swapEditor(component) {
149236
- this.state.editorContainer.clear();
146700
+ disposeChildren(this.state.editorContainer);
149237
146701
  this.state.editorContainer.addChild(component);
149238
146702
  this.state.ui.setFocus(component);
149239
146703
  this.state.ui.requestRender();
@@ -149244,9 +146708,11 @@ var ScreamTUI = class {
149244
146708
  mountEditorReplacement(panel) {
149245
146709
  this.exitFullScreenTakeover();
149246
146710
  this.swapEditor(panel);
146711
+ this.state.activeDialog = "overlay";
149247
146712
  }
149248
146713
  restoreEditor() {
149249
146714
  this.swapEditor(this.state.editor);
146715
+ this.state.activeDialog = null;
149250
146716
  }
149251
146717
  showHelpPanel() {
149252
146718
  this.dialogManager.showHelpPanel(this.getSlashCommands());
@@ -149311,14 +146777,14 @@ const SHEEN_INTERVAL_MS = 60;
149311
146777
  const LOADING_DURATION_MS = 1500;
149312
146778
  const THEME_PRIMARY = {
149313
146779
  dark: [
149314
- 78,
149315
- 200,
149316
- 126
146780
+ 204,
146781
+ 251,
146782
+ 35
149317
146783
  ],
149318
146784
  light: [
149319
- 14,
146785
+ 75,
149320
146786
  122,
149321
- 56
146787
+ 6
149322
146788
  ]
149323
146789
  };
149324
146790
  const BLOCK_RGB = [
@@ -150473,6 +147939,11 @@ async function runStreamJson(opts) {
150473
147939
  sessionId: session?.id,
150474
147940
  error: msg
150475
147941
  });
147942
+ for (const [, pending] of pendingApprovals) pending.resolve({
147943
+ decision: "rejected",
147944
+ feedback: "会话已重置"
147945
+ });
147946
+ pendingApprovals.clear();
150476
147947
  session?.close().catch(() => {});
150477
147948
  harness.deleteSession(sessionKey).catch(() => {});
150478
147949
  session = void 0;
@@ -150501,8 +147972,9 @@ async function runStreamJson(opts) {
150501
147972
  await harness.close();
150502
147973
  } catch {}
150503
147974
  if (injectedAgentsMd) try {
150504
- if (originalAgentsMd === void 0) await rm(agentsMdPath, { force: true });
150505
- else await writeFile(agentsMdPath, originalAgentsMd, "utf-8");
147975
+ if (originalAgentsMd === void 0) {
147976
+ if (existsSync(agentsMdPath)) unlinkSync(agentsMdPath);
147977
+ } else writeFileSync(agentsMdPath, originalAgentsMd, "utf-8");
150506
147978
  } catch {}
150507
147979
  }
150508
147980
  }