scream-code 0.9.6 → 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.
- package/README.md +3 -3
- package/dist/{app-dyIrf9Iq.mjs → app-Bda9iKUb.mjs} +453 -2981
- package/dist/main.mjs +1 -1
- package/dist/text-input-dialog-Yyssn7t3.mjs +7 -0
- package/dist/text-input-dialog-os5jWxGT.mjs +2285 -0
- package/icon.ico +0 -0
- package/package.json +2 -2
|
@@ -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 {
|
|
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,
|
|
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 "@
|
|
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 =
|
|
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(-
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
"#
|
|
128014
|
-
"#
|
|
128015
|
-
"#
|
|
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.
|
|
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
|
-
|
|
128406
|
-
|
|
128407
|
-
|
|
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
|
-
|
|
126095
|
+
yellowGreenLight: "#E0F5A0",
|
|
128414
126096
|
red: "#E85454",
|
|
128415
126097
|
redLight: "#F08585",
|
|
128416
|
-
|
|
128417
|
-
gold400: "#FBD700",
|
|
128418
|
-
tangerine400: "#FF5401",
|
|
128419
|
-
orange300: "#FFCB6B"
|
|
126098
|
+
gold400: "#FFD166"
|
|
128420
126099
|
};
|
|
128421
126100
|
const light = {
|
|
128422
|
-
|
|
128423
|
-
|
|
128424
|
-
|
|
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
|
-
|
|
128432
|
-
tangerine700: "#B33A00",
|
|
126110
|
+
amber700: "#9A6B00",
|
|
128433
126111
|
orange700: "#9A4A00"
|
|
128434
126112
|
};
|
|
128435
126113
|
const darkColors = {
|
|
128436
|
-
primary: dark.
|
|
128437
|
-
accent: dark.
|
|
128438
|
-
planMode:
|
|
128439
|
-
fusionPlanMode:
|
|
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.
|
|
128450
|
-
success: dark.
|
|
126128
|
+
borderFocus: dark.yellowGreenLight,
|
|
126129
|
+
success: dark.yellowGreen,
|
|
128451
126130
|
warning: dark.amber400,
|
|
128452
126131
|
error: dark.red,
|
|
128453
|
-
diffAdded: dark.
|
|
126132
|
+
diffAdded: dark.yellowGreen,
|
|
128454
126133
|
diffRemoved: dark.red,
|
|
128455
|
-
diffAddedStrong: dark.
|
|
126134
|
+
diffAddedStrong: dark.yellowGreenLight,
|
|
128456
126135
|
diffRemovedStrong: dark.redLight,
|
|
128457
126136
|
diffGutter: dark.gray600,
|
|
128458
126137
|
diffMeta: dark.gray500,
|
|
128459
|
-
roleUser: dark.
|
|
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.
|
|
128467
|
-
accent: light.
|
|
128468
|
-
planMode:
|
|
128469
|
-
fusionPlanMode:
|
|
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.
|
|
128480
|
-
success: light.
|
|
126159
|
+
borderFocus: light.yellowGreen700,
|
|
126160
|
+
success: light.yellowGreen700,
|
|
128481
126161
|
warning: light.amber800,
|
|
128482
126162
|
error: light.red,
|
|
128483
|
-
diffAdded: light.
|
|
126163
|
+
diffAdded: light.yellowGreen700,
|
|
128484
126164
|
diffRemoved: light.red,
|
|
128485
|
-
diffAddedStrong: light.
|
|
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
|
|
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
|
-
})
|
|
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
|
|
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
|
-
})
|
|
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
|
|
129654
|
-
|
|
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
|
-
|
|
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
|
|
129972
|
-
if (
|
|
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 (
|
|
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(
|
|
130054
|
-
|
|
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:
|
|
127828
|
+
text: objective,
|
|
130057
127829
|
agentId: void 0
|
|
130058
127830
|
});
|
|
130059
127831
|
else host.state.queuedMessages.push({
|
|
130060
|
-
text:
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
130410
|
-
|
|
130411
|
-
const
|
|
130412
|
-
|
|
130413
|
-
|
|
130414
|
-
|
|
130415
|
-
const
|
|
130416
|
-
|
|
130417
|
-
|
|
130418
|
-
|
|
130419
|
-
|
|
130420
|
-
|
|
130421
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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"
|
|
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
|
|
145798
|
-
const
|
|
145799
|
-
const
|
|
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) +
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
149315
|
-
|
|
149316
|
-
|
|
146780
|
+
204,
|
|
146781
|
+
251,
|
|
146782
|
+
35
|
|
149317
146783
|
],
|
|
149318
146784
|
light: [
|
|
149319
|
-
|
|
146785
|
+
75,
|
|
149320
146786
|
122,
|
|
149321
|
-
|
|
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)
|
|
150505
|
-
|
|
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
|
}
|