@epoch-agent/infra 0.4.0 → 0.5.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/dist/index.d.ts +70 -3
- package/dist/index.js +11 -2
- package/dist/locales/en.yaml +43 -17
- package/dist/locales/zh.yaml +43 -17
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -350,8 +350,75 @@ declare function managedSettingsPath(os?: NodeJS.Platform): string;
|
|
|
350
350
|
* 留在那边的唯一出路是复制一份正则 —— 于是「同一个文件的读写策略只能有一份」
|
|
351
351
|
* 这句话在第三个写者出现的当天就破了。
|
|
352
352
|
*/
|
|
353
|
-
/**
|
|
354
|
-
|
|
353
|
+
/**
|
|
354
|
+
* 「不设上限」这一档的表示法:**`0`**。
|
|
355
|
+
*
|
|
356
|
+
* 选 `0` 而不是 `undefined` / `null`,是因为这个数要穿过六层(yaml → schema →
|
|
357
|
+
* 协议 → 服务端 → 表单 → 引擎),而那几层里已经有一个 `undefined` 了、意思是
|
|
358
|
+
* **「这一格没给,跟上层走」**(角色 frontmatter 的 `maxTurns?`、`RunInput.maxTurns`)。
|
|
359
|
+
* 再让 `undefined` 兼任「无上限」,两个意思就在同一个格子里打架:一个没写
|
|
360
|
+
* `maxTurns:` 的角色到底是「跟全局」还是「不限」,读代码的人分不出来。
|
|
361
|
+
*
|
|
362
|
+
* `0` 没有这个问题,因为**「跑 0 轮」本来就不是一个有意义的值** —— 它在旧口径下
|
|
363
|
+
* 是非法输入(`z.int().positive()`),所以拿它当哨兵不会撞掉任何一个真实语义。
|
|
364
|
+
*/
|
|
365
|
+
declare const UNLIMITED_TURNS = 0;
|
|
366
|
+
/**
|
|
367
|
+
* 一条用户消息底下最多几次模型请求(一轮工具往返 = 1 次)。**缺省不设上限。**
|
|
368
|
+
*
|
|
369
|
+
* ## 这是全仓**唯一**一个轮次默认值(2026-09-04)
|
|
370
|
+
*
|
|
371
|
+
* 在这之前它有四份互不相识的字面量:配置 schema 的 `.default(50)`、`AgentLoop`
|
|
372
|
+
* 构造时的兜底 `50`、下面这个模板串里的 `50`、定时任务 `SCHEDULE_DEFAULTS` 的
|
|
373
|
+
* `20`,再加上内置角色 `explore` / `review` 各自的 `8` / `10`。改一处的下场是
|
|
374
|
+
* 「设置页显示 200、派出去的子 agent 却跑 8 轮就停」,而那种不一致在屏幕上表现成
|
|
375
|
+
* 一个突兀的 `max-turns`,没人查得到它来自哪一份。
|
|
376
|
+
*
|
|
377
|
+
* 所以:**要改轮次预算,只改这一个数**;其余每一处都 import 它。用户侧对应的
|
|
378
|
+
* 那一格是 `config.yaml` 的 `maxTurns`(设置页「单轮最多几步」),它没有上限,
|
|
379
|
+
* 而从 2026-09-06 起也没有**下限**:缺省就是 {@link UNLIMITED_TURNS}。
|
|
380
|
+
*
|
|
381
|
+
* ## 2026-09-06:200 → 不设上限
|
|
382
|
+
*
|
|
383
|
+
* 200 拦掉的绝大多数不是跑飞,是「这个任务本来就要 300 轮」。而撞顶的代价不止是
|
|
384
|
+
* 停下来:`agent-session.ts` 只把跑完的这一轮折成一条文本进历史
|
|
385
|
+
* (`assistantTurnText`),所以用户说「继续」时模型拿到的是文摘、不是真的工具
|
|
386
|
+
* 记录 —— 撞得越频繁这笔损耗越贵,而它恰恰在**长任务**上最频繁。
|
|
387
|
+
*
|
|
388
|
+
* ⚠️ **这笔改动明知地拆掉了唯一默认生效的失控闸门。** 剩下的守卫各有各的盲区,
|
|
389
|
+
* 别把它们读成等价替代:
|
|
390
|
+
*
|
|
391
|
+
* | 守卫 | 它拦得住什么 | 盲区 |
|
|
392
|
+
* | ----------------------- | -------------------------------- | -------------------------------- |
|
|
393
|
+
* | `StallDetector` | 连续 5 次**同工具同参数** | 两个工具交替、每次参数不同的循环 |
|
|
394
|
+
* | `budget` 段 | 花到线就停 | **缺省无上限**,要用户自己配 |
|
|
395
|
+
* | 定时任务的 `maxBudgetUsd` | 无人值守那条路上的跑飞 | 只在定时任务上必填 |
|
|
396
|
+
* | 用户按 Esc | 一切 | 只在有人看着屏幕时存在 |
|
|
397
|
+
*
|
|
398
|
+
* 判据是:撞顶每天都发生,跑飞不是;而跑飞真发生时,钱是比轮次准的那把尺子 ——
|
|
399
|
+
* 同一条判据 2026-09-04 已经在定时任务上判过一次(`SCHEDULE_DEFAULTS` 那段)。
|
|
400
|
+
* 要一道轮次闸门的人自己写一格 `maxTurns:`,那正是这一格现在的意思。
|
|
401
|
+
*
|
|
402
|
+
* 放在 infra 而不是 core:这一层零内部依赖,core / runtime / server 都 import 得到,
|
|
403
|
+
* 而下面那个 `DEFAULT_YAML` 本来就住在这儿。
|
|
404
|
+
*/
|
|
405
|
+
declare const DEFAULT_MAX_TURNS = 0;
|
|
406
|
+
/**
|
|
407
|
+
* 把用户侧那个数折成引擎里 `for (turn = 1..limit)` 用的界。
|
|
408
|
+
*
|
|
409
|
+
* {@link UNLIMITED_TURNS} → `Infinity`,其余原样。**转换只发生在这一个函数里** ——
|
|
410
|
+
* 让 `0` 一路流到循环里的下场是 `for (turn = 1; turn <= 0; turn++)` 一轮都不跑,
|
|
411
|
+
* 而那是「无上限」的**反面**,且失败形态是静默的(模型一句话都不说就收工)。
|
|
412
|
+
*/
|
|
413
|
+
declare function turnLimitOf(maxTurns: number): number;
|
|
414
|
+
/**
|
|
415
|
+
* 从零初始化时的最小配置。
|
|
416
|
+
*
|
|
417
|
+
* ⚠️ **不写 `maxTurns:`**(2026-09-06):缺省已经是「不设上限」,模板里写一行
|
|
418
|
+
* `maxTurns: 0` 等于替用户在盘上按下一个他没按过的选择 —— 设置页的来源层徽标会
|
|
419
|
+
* 把它报成「用户级」,而用户从没碰过那一格。要设上限的人自己加这一行。
|
|
420
|
+
*/
|
|
421
|
+
declare const DEFAULT_YAML: "provider:\n type: openai\n apiKey: ''\nmodel: gpt-4o-mini\n";
|
|
355
422
|
/** 就地替换一个顶层标量字段,保留文件里的其他内容和注释 */
|
|
356
423
|
declare function setScalar(yaml: string, key: string, value: string): string;
|
|
357
424
|
/**
|
|
@@ -3182,4 +3249,4 @@ interface SecretWriteResult {
|
|
|
3182
3249
|
*/
|
|
3183
3250
|
declare function writeProviderSecret(name: string, value: string, fallbackEnvPath: string): Promise<SecretWriteResult>;
|
|
3184
3251
|
|
|
3185
|
-
export { type ArtifactHandle, type BubblewrapOptions, CLAUDE_DIR_NAME, CODE_EXEC_ROOTS, type CatalogLoad, type CommandSegment, type Confinement, type CreateSecretStoreOptions, DEFAULT_LANG, DEFAULT_YAML, DENIAL_SIGNATURES, type DangerCheckOptions, type DangerMatch, type DangerPlatform, type DiagnosticCollector, ENVELOPE_PREFIX, EXEC_PATH_AS_NODE_ENV, type FailureKind, type FailureVerdict, type I18nDiagnostic, IS_WINDOWS, type IsolatedCommand, type IsolationBackend, type IsolationOptions, type JobHandle, type JobInfo, type JobKind, type JobReadResult, type JobSpec, type JobStatus, type JobWaitResult, type KillProcessTreeOptions, type KillSignalOptions, type KillablePty, LANGS, type Lang, type LogEntry, type LogLevel, type MigrateOptions, type MigrateResult, type Migration, type OnExisting, type OwnedProcessTable, PROJECT_DIR_NAME, type ParseIssue, type ParseOutcome, type ParsedCommand, PlaintextStore, type ProcessTable, RUNNER_FAILURE_RULES, type ResolveRipgrepOptions, type RipgrepMode, type RipgrepResolution, type RunnerFailureRules, SECRET_MODE, SECRET_SERVICE, SHELL_KINDS, SIGKILL_TIMEOUT_MS, type SandboxEnforcement, type SandboxMode, type SandboxPolicy, type SeatbeltOptions, type SecretBackendId, SecretCatalog, type SecretStore, type SecretWriteResult, type ShellFlavor, type ShellInvocation, type ShellKind, type SqliteDatabase, type StampedPid, type StartLongLivedOptions, type StreamDecoder, TOOLCHAIN_CACHE_DIRS, type TrackedProcess, WINDOWS_HIDE_FLAGS, agentsDir, allJobs, appendJob, approvalsPath, artifactsDir, assertValidSecretName, automationDir, automationLogsDir, automationWorkDir, budgetStatePath, buildBwrapArgs, buildProfile, checkDangerousCommand, checkObfuscation, checkpointsDir, classifyFailure, claudeUserSettingsPath, clearAllJobs, closeAllDatabases, collectProcessTree, collectProcessTreeStamped, commandsDir, complianceDir, configPath, confine, countCodePoints, createLogger, createProcessTable, createSecretStore, createStreamDecoder, currentLang, dbPath, detectBackend, detectConsoleEncoding, encodingForCodePage, envPath, formatIssues, generateDataKey, getDataKey, getDefaultShell, getJob, getPythonCommand, getSecretStore, getSecretValues, hasSideEffectChannel, headCodePoints, hooksPath, i18nDiagnostics, isEnvelope, isInWorkspace, isLang, isReadOnlyCommand, isSensitiveKey, isolate, issueDetails, jobDetail, keepHeadAndTail, keybindingsPath, killAllTrackedProcesses, killPids, killProcessTree, killStampedPids, killTrackedProcess, listJobs, listStoredSecretNames, loadCatalog, localesDir, managedSettingsPath, marketplacesPath, maskApiKey, maskSensitive, mcpAuthPath, mcpConfigPath, mcpSchemaCachePath, memoriesDir, migrate, migrateEnvSecrets, normalizeForMatch, openArtifact, openDatabase, openEnvelope, parseDataKey, parseEnvText, parseLenient, parseShellCommand, parseStrict, placeholdersOf, pluginsDir, pluginsStatePath, policiesDir, powershellCommandArg, prefetchProviderSecrets, probeBubblewrap, probeSeatbelt, probeShell, processFallbackTable, processTableFor, projectClaudeLocalSettingsPath, projectClaudeSettingsPath, projectCommandsDir, projectComplianceDir, projectHooksPath, projectLocalSettingsPath, projectPoliciesDir, projectSchemasDir, projectSettingsPath, projectSkillsDir, readConfigYaml, readJob, readKey, refCount, registerJob, rekeyJobs, releaseDatabase, removeEnvVarText, resetI18n, resetRipgrepCache, resetSecretState, resolveHomeDir, resolveLang, resolveProfile, resolveRipgrep, resolveShellKind, ripgrepInstallHint, safeInit, sandboxModeForLevel, schemaVersion, sealEnvelope, setDataKey, setEnvVarText, setLang, setLogLevel, setScalar, setSecretStore, setSecretValues, setSectionField, setShell, shellPtyArgs, shellSpawnArgs, skillsDir, splitWords, startLongLivedProcess, stopJob, stripShellWrapper, systemLocaleSignals, t, tailCodePoints, touchJob, trackForeignProcess, trackedProcessCount, trustPath, trustedImportsPath, uiDateLocale, unknownKeyIssues, unsetScalar, unsetSectionField, waitJob, withTimeout, workspacesPath, worktreesDir, writeArtifact, writeConfigYaml, writeEnvFile, writeProviderSecret };
|
|
3252
|
+
export { type ArtifactHandle, type BubblewrapOptions, CLAUDE_DIR_NAME, CODE_EXEC_ROOTS, type CatalogLoad, type CommandSegment, type Confinement, type CreateSecretStoreOptions, DEFAULT_LANG, DEFAULT_MAX_TURNS, DEFAULT_YAML, DENIAL_SIGNATURES, type DangerCheckOptions, type DangerMatch, type DangerPlatform, type DiagnosticCollector, ENVELOPE_PREFIX, EXEC_PATH_AS_NODE_ENV, type FailureKind, type FailureVerdict, type I18nDiagnostic, IS_WINDOWS, type IsolatedCommand, type IsolationBackend, type IsolationOptions, type JobHandle, type JobInfo, type JobKind, type JobReadResult, type JobSpec, type JobStatus, type JobWaitResult, type KillProcessTreeOptions, type KillSignalOptions, type KillablePty, LANGS, type Lang, type LogEntry, type LogLevel, type MigrateOptions, type MigrateResult, type Migration, type OnExisting, type OwnedProcessTable, PROJECT_DIR_NAME, type ParseIssue, type ParseOutcome, type ParsedCommand, PlaintextStore, type ProcessTable, RUNNER_FAILURE_RULES, type ResolveRipgrepOptions, type RipgrepMode, type RipgrepResolution, type RunnerFailureRules, SECRET_MODE, SECRET_SERVICE, SHELL_KINDS, SIGKILL_TIMEOUT_MS, type SandboxEnforcement, type SandboxMode, type SandboxPolicy, type SeatbeltOptions, type SecretBackendId, SecretCatalog, type SecretStore, type SecretWriteResult, type ShellFlavor, type ShellInvocation, type ShellKind, type SqliteDatabase, type StampedPid, type StartLongLivedOptions, type StreamDecoder, TOOLCHAIN_CACHE_DIRS, type TrackedProcess, UNLIMITED_TURNS, WINDOWS_HIDE_FLAGS, agentsDir, allJobs, appendJob, approvalsPath, artifactsDir, assertValidSecretName, automationDir, automationLogsDir, automationWorkDir, budgetStatePath, buildBwrapArgs, buildProfile, checkDangerousCommand, checkObfuscation, checkpointsDir, classifyFailure, claudeUserSettingsPath, clearAllJobs, closeAllDatabases, collectProcessTree, collectProcessTreeStamped, commandsDir, complianceDir, configPath, confine, countCodePoints, createLogger, createProcessTable, createSecretStore, createStreamDecoder, currentLang, dbPath, detectBackend, detectConsoleEncoding, encodingForCodePage, envPath, formatIssues, generateDataKey, getDataKey, getDefaultShell, getJob, getPythonCommand, getSecretStore, getSecretValues, hasSideEffectChannel, headCodePoints, hooksPath, i18nDiagnostics, isEnvelope, isInWorkspace, isLang, isReadOnlyCommand, isSensitiveKey, isolate, issueDetails, jobDetail, keepHeadAndTail, keybindingsPath, killAllTrackedProcesses, killPids, killProcessTree, killStampedPids, killTrackedProcess, listJobs, listStoredSecretNames, loadCatalog, localesDir, managedSettingsPath, marketplacesPath, maskApiKey, maskSensitive, mcpAuthPath, mcpConfigPath, mcpSchemaCachePath, memoriesDir, migrate, migrateEnvSecrets, normalizeForMatch, openArtifact, openDatabase, openEnvelope, parseDataKey, parseEnvText, parseLenient, parseShellCommand, parseStrict, placeholdersOf, pluginsDir, pluginsStatePath, policiesDir, powershellCommandArg, prefetchProviderSecrets, probeBubblewrap, probeSeatbelt, probeShell, processFallbackTable, processTableFor, projectClaudeLocalSettingsPath, projectClaudeSettingsPath, projectCommandsDir, projectComplianceDir, projectHooksPath, projectLocalSettingsPath, projectPoliciesDir, projectSchemasDir, projectSettingsPath, projectSkillsDir, readConfigYaml, readJob, readKey, refCount, registerJob, rekeyJobs, releaseDatabase, removeEnvVarText, resetI18n, resetRipgrepCache, resetSecretState, resolveHomeDir, resolveLang, resolveProfile, resolveRipgrep, resolveShellKind, ripgrepInstallHint, safeInit, sandboxModeForLevel, schemaVersion, sealEnvelope, setDataKey, setEnvVarText, setLang, setLogLevel, setScalar, setSecretStore, setSecretValues, setSectionField, setShell, shellPtyArgs, shellSpawnArgs, skillsDir, splitWords, startLongLivedProcess, stopJob, stripShellWrapper, systemLocaleSignals, t, tailCodePoints, touchJob, trackForeignProcess, trackedProcessCount, trustPath, trustedImportsPath, turnLimitOf, uiDateLocale, unknownKeyIssues, unsetScalar, unsetSectionField, waitJob, withTimeout, workspacesPath, worktreesDir, writeArtifact, writeConfigYaml, writeEnvFile, writeProviderSecret };
|
package/dist/index.js
CHANGED
|
@@ -156,7 +156,16 @@ function managedSettingsPath(os = platform()) {
|
|
|
156
156
|
if (os === "darwin") return join("/Library", "Application Support", "epoch", FILE);
|
|
157
157
|
return join("/etc", "epoch", FILE);
|
|
158
158
|
}
|
|
159
|
-
var
|
|
159
|
+
var UNLIMITED_TURNS = 0;
|
|
160
|
+
var DEFAULT_MAX_TURNS = UNLIMITED_TURNS;
|
|
161
|
+
function turnLimitOf(maxTurns) {
|
|
162
|
+
return maxTurns === UNLIMITED_TURNS ? Number.POSITIVE_INFINITY : maxTurns;
|
|
163
|
+
}
|
|
164
|
+
var DEFAULT_YAML = `provider:
|
|
165
|
+
type: openai
|
|
166
|
+
apiKey: ''
|
|
167
|
+
model: gpt-4o-mini
|
|
168
|
+
`;
|
|
160
169
|
function setScalar(yaml, key, value) {
|
|
161
170
|
const pattern = new RegExp(`^${key}:.*$`, "m");
|
|
162
171
|
if (pattern.test(yaml)) return yaml.replace(pattern, `${key}: ${value}`);
|
|
@@ -3552,4 +3561,4 @@ function message2(err) {
|
|
|
3552
3561
|
* Modifications Copyright 2024-2026 bowen
|
|
3553
3562
|
*/
|
|
3554
3563
|
|
|
3555
|
-
export { CLAUDE_DIR_NAME, CODE_EXEC_ROOTS, DEFAULT_LANG, DEFAULT_YAML, DENIAL_SIGNATURES, ENVELOPE_PREFIX, EXEC_PATH_AS_NODE_ENV, IS_WINDOWS, LANGS, PROJECT_DIR_NAME, PlaintextStore, RUNNER_FAILURE_RULES, SECRET_MODE, SECRET_SERVICE, SHELL_KINDS, SIGKILL_TIMEOUT_MS, SecretCatalog, TOOLCHAIN_CACHE_DIRS, WINDOWS_HIDE_FLAGS, agentsDir, allJobs, appendJob, approvalsPath, artifactsDir, assertValidSecretName, automationDir, automationLogsDir, automationWorkDir, budgetStatePath, buildBwrapArgs, buildProfile, checkDangerousCommand, checkObfuscation, checkpointsDir, classifyFailure, claudeUserSettingsPath, clearAllJobs, closeAllDatabases, collectProcessTree, collectProcessTreeStamped, commandsDir, complianceDir, configPath, confine, countCodePoints, createLogger, createProcessTable, createSecretStore, createStreamDecoder, currentLang, dbPath, detectBackend, detectConsoleEncoding, encodingForCodePage, envPath, formatIssues, generateDataKey, getDataKey, getDefaultShell, getJob, getPythonCommand, getSecretStore, getSecretValues, hasSideEffectChannel, headCodePoints, hooksPath, i18nDiagnostics, isEnvelope, isInWorkspace, isLang, isReadOnlyCommand, isSensitiveKey, isolate, issueDetails, jobDetail, keepHeadAndTail, keybindingsPath, killAllTrackedProcesses, killPids, killProcessTree, killStampedPids, killTrackedProcess, listJobs, listStoredSecretNames, loadCatalog, localesDir, managedSettingsPath, marketplacesPath, maskApiKey, maskSensitive, mcpAuthPath, mcpConfigPath, mcpSchemaCachePath, memoriesDir, migrate, migrateEnvSecrets, normalizeForMatch, openArtifact, openDatabase, openEnvelope, parseDataKey, parseEnvText, parseLenient, parseShellCommand, parseStrict, placeholdersOf, pluginsDir, pluginsStatePath, policiesDir, powershellCommandArg, prefetchProviderSecrets, probeBubblewrap, probeSeatbelt, probeShell, processFallbackTable, processTableFor, projectClaudeLocalSettingsPath, projectClaudeSettingsPath, projectCommandsDir, projectComplianceDir, projectHooksPath, projectLocalSettingsPath, projectPoliciesDir, projectSchemasDir, projectSettingsPath, projectSkillsDir, readConfigYaml, readJob, readKey, refCount, registerJob, rekeyJobs, releaseDatabase, removeEnvVarText, resetI18n, resetRipgrepCache, resetSecretState, resolveHomeDir, resolveLang, resolveProfile, resolveRipgrep, resolveShellKind, ripgrepInstallHint, safeInit, sandboxModeForLevel, schemaVersion, sealEnvelope, setDataKey, setEnvVarText, setLang, setLogLevel, setScalar, setSecretStore, setSecretValues, setSectionField, setShell, shellPtyArgs, shellSpawnArgs, skillsDir, splitWords, startLongLivedProcess, stopJob, stripShellWrapper, systemLocaleSignals, t, tailCodePoints, touchJob, trackForeignProcess, trackedProcessCount, trustPath, trustedImportsPath, uiDateLocale, unknownKeyIssues, unsetScalar, unsetSectionField, waitJob, withTimeout, workspacesPath, worktreesDir, writeArtifact, writeConfigYaml, writeEnvFile, writeProviderSecret };
|
|
3564
|
+
export { CLAUDE_DIR_NAME, CODE_EXEC_ROOTS, DEFAULT_LANG, DEFAULT_MAX_TURNS, DEFAULT_YAML, DENIAL_SIGNATURES, ENVELOPE_PREFIX, EXEC_PATH_AS_NODE_ENV, IS_WINDOWS, LANGS, PROJECT_DIR_NAME, PlaintextStore, RUNNER_FAILURE_RULES, SECRET_MODE, SECRET_SERVICE, SHELL_KINDS, SIGKILL_TIMEOUT_MS, SecretCatalog, TOOLCHAIN_CACHE_DIRS, UNLIMITED_TURNS, WINDOWS_HIDE_FLAGS, agentsDir, allJobs, appendJob, approvalsPath, artifactsDir, assertValidSecretName, automationDir, automationLogsDir, automationWorkDir, budgetStatePath, buildBwrapArgs, buildProfile, checkDangerousCommand, checkObfuscation, checkpointsDir, classifyFailure, claudeUserSettingsPath, clearAllJobs, closeAllDatabases, collectProcessTree, collectProcessTreeStamped, commandsDir, complianceDir, configPath, confine, countCodePoints, createLogger, createProcessTable, createSecretStore, createStreamDecoder, currentLang, dbPath, detectBackend, detectConsoleEncoding, encodingForCodePage, envPath, formatIssues, generateDataKey, getDataKey, getDefaultShell, getJob, getPythonCommand, getSecretStore, getSecretValues, hasSideEffectChannel, headCodePoints, hooksPath, i18nDiagnostics, isEnvelope, isInWorkspace, isLang, isReadOnlyCommand, isSensitiveKey, isolate, issueDetails, jobDetail, keepHeadAndTail, keybindingsPath, killAllTrackedProcesses, killPids, killProcessTree, killStampedPids, killTrackedProcess, listJobs, listStoredSecretNames, loadCatalog, localesDir, managedSettingsPath, marketplacesPath, maskApiKey, maskSensitive, mcpAuthPath, mcpConfigPath, mcpSchemaCachePath, memoriesDir, migrate, migrateEnvSecrets, normalizeForMatch, openArtifact, openDatabase, openEnvelope, parseDataKey, parseEnvText, parseLenient, parseShellCommand, parseStrict, placeholdersOf, pluginsDir, pluginsStatePath, policiesDir, powershellCommandArg, prefetchProviderSecrets, probeBubblewrap, probeSeatbelt, probeShell, processFallbackTable, processTableFor, projectClaudeLocalSettingsPath, projectClaudeSettingsPath, projectCommandsDir, projectComplianceDir, projectHooksPath, projectLocalSettingsPath, projectPoliciesDir, projectSchemasDir, projectSettingsPath, projectSkillsDir, readConfigYaml, readJob, readKey, refCount, registerJob, rekeyJobs, releaseDatabase, removeEnvVarText, resetI18n, resetRipgrepCache, resetSecretState, resolveHomeDir, resolveLang, resolveProfile, resolveRipgrep, resolveShellKind, ripgrepInstallHint, safeInit, sandboxModeForLevel, schemaVersion, sealEnvelope, setDataKey, setEnvVarText, setLang, setLogLevel, setScalar, setSecretStore, setSecretValues, setSectionField, setShell, shellPtyArgs, shellSpawnArgs, skillsDir, splitWords, startLongLivedProcess, stopJob, stripShellWrapper, systemLocaleSignals, t, tailCodePoints, touchJob, trackForeignProcess, trackedProcessCount, trustPath, trustedImportsPath, turnLimitOf, uiDateLocale, unknownKeyIssues, unsetScalar, unsetSectionField, waitJob, withTimeout, workspacesPath, worktreesDir, writeArtifact, writeConfigYaml, writeEnvFile, writeProviderSecret };
|
package/dist/locales/en.yaml
CHANGED
|
@@ -25,7 +25,7 @@ flags:
|
|
|
25
25
|
prompt_tool_missing: '--permission-prompt-tool points at a program that does not exist: {value}'
|
|
26
26
|
prompt_tool_missing_hint: 'Resolved to: {abs}. To run an interpreter, write both parts together, e.g. --permission-prompt-tool "node ./approver.js"'
|
|
27
27
|
not_a_number: '{flag} is not a valid value: {raw}'
|
|
28
|
-
|
|
28
|
+
want_turn_limit: Expects 0 or a positive integer, e.g. --max-turns 5; 0 means no turn limit
|
|
29
29
|
want_positive: Expects a positive number, e.g. 0.50
|
|
30
30
|
cli:
|
|
31
31
|
program_description: Epoch Agent CLI
|
|
@@ -37,7 +37,7 @@ cli:
|
|
|
37
37
|
opt_no_open: Do not open a browser
|
|
38
38
|
opt_json: Print one JSON line on stdout (url / host / port / token) and route every other message to stderr. For host programs spawning the CLI, pair it with --port 0 so no port has to be hardcoded
|
|
39
39
|
opt_plugins: Expose the plugins page in the UI (off by default). Installing a plugin writes into ~/.epoch/plugins/ and the next run loads it, so this is opt-in; the marketplace list is whatever you added with epoch plugin marketplace add, and remote sources stay off
|
|
40
|
-
|
|
40
|
+
no_provider_warn: '⚠ No provider is configured on this machine: the UI still comes up, but no session can run. Configure an API key under Settings → Models & Providers in the UI (or run epoch model), then restart this command'
|
|
41
41
|
err_port: 'The port has to be a number: {value}'
|
|
42
42
|
missing_root: The frontend build was not found, so this run only serves REST / SSE and the page is a placeholder. Run pnpm build once and try again
|
|
43
43
|
browser_failed: (could not open a browser automatically; copy the address above)
|
|
@@ -208,7 +208,7 @@ cli:
|
|
|
208
208
|
opt_allow_tool: Skip approval for this tool while unattended; repeatable
|
|
209
209
|
opt_allow_operation: Skip approval for this operation type while unattended; repeatable
|
|
210
210
|
opt_allow_rule: Skip approval for operations matching this rule while unattended; repeatable (e.g. terminal(git status))
|
|
211
|
-
opt_max_turns: Maximum turns (default
|
|
211
|
+
opt_max_turns: Maximum turns (unlimited by default, same as interactive — the real limit here is the mandatory budget)
|
|
212
212
|
opt_budget: 'Required: the most this single run may spend, in USD'
|
|
213
213
|
opt_timeout: Wall-clock timeout in minutes (default 15) — the only limit that catches a hung command
|
|
214
214
|
opt_disabled: Create it stopped instead of enabling it right away
|
|
@@ -265,7 +265,7 @@ web:
|
|
|
265
265
|
rewind_no_checkpoint: no checkpoint for turn {turn}
|
|
266
266
|
settings_write_bad_request: the body needs key (the dotted path of the setting), layer (one of {layers}) and value (string / number / boolean)
|
|
267
267
|
settings_write_unknown_key: 'that key cannot be written this way: either it is not on the writable list at all (the fallback chain, for one — it is an ordered chain, not a scalar), or the key only writes to the user layer while the request asked for project-local. The project layers accept permissions / model / maxTurns only; anything else lands as an "unknown setting" in the startup diagnostics'
|
|
268
|
-
settings_write_bad_value: that value is outside this setting's domain (maxTurns must be a positive integer, for one), so nothing was written
|
|
268
|
+
settings_write_bad_value: that value is outside this setting's domain (maxTurns must be 0 or a positive integer, for one), so nothing was written
|
|
269
269
|
settings_write_unwritable: this layer does not recognise how {path} is written (or the file is already broken), so it was left alone — please edit that file yourself
|
|
270
270
|
settings_write_io: 'writing {path} failed: possibly no write permission, or the directory could not be created'
|
|
271
271
|
model_bad_request: model must be a non-empty string (a model name, or provider/model); pass null to go back to the configured one
|
|
@@ -274,6 +274,8 @@ web:
|
|
|
274
274
|
provider_unknown: No provider named "{name}" is supported — the selectable set is a fixed list, so the one you are holding may be stale. Refresh and look again.
|
|
275
275
|
provider_key_not_applicable: '{name} does not use an API key — one stored here would never be read, and that provider already works as is'
|
|
276
276
|
provider_key_empty: No key received — paste it into the box and save. (There is no way to revoke an already-stored key from here yet; delete it from ~/.epoch or your keychain.)
|
|
277
|
+
model_default_has_provider: This route is only open while the machine has no provider configured. A provider is up now, so change the model from the "Models & Providers" pane in Settings.
|
|
278
|
+
model_default_empty: No model name received — pick one or type one, then save.
|
|
277
279
|
mcp_add_lan_exposed: 'MCP servers cannot be added in this mode — the server was bound outside the loopback interface with --host, so we cannot tell whether the browser sending this request is on this machine. Adding one writes "which executable to launch" into mcp.json; that server is started right away, and every future epoch run on this machine (including the CLI and the TUI) starts it too. Two ways forward: edit that file directly on the machine running the server, or drop --host and restart.'
|
|
278
280
|
mcp_add_bad_transport: Transport must be one of stdio / sse / http
|
|
279
281
|
mcp_add_bad_name: The server name "{name}" cannot be used — it becomes part of the tool name verbatim, so only names starting with a letter or digit and made of letters, digits, _ and - are accepted (48 max). A hand-written mcp.json is not subject to this; only names added from the UI are.
|
|
@@ -402,6 +404,7 @@ web:
|
|
|
402
404
|
search: Search sessions
|
|
403
405
|
automation: Automation
|
|
404
406
|
automation_pending: '{count} scheduled tasks are missing a grant; they will stall again on the next run'
|
|
407
|
+
automation_running: A manual run is in flight
|
|
405
408
|
settings: Settings
|
|
406
409
|
host_menu: Host menu
|
|
407
410
|
cost: Spend
|
|
@@ -467,7 +470,8 @@ web:
|
|
|
467
470
|
files: Workspace changes
|
|
468
471
|
files_note: Files this session created or modified in the workspace.
|
|
469
472
|
files_empty: This session has not changed any file in the workspace
|
|
470
|
-
|
|
473
|
+
no_space_title: This session has no workspace
|
|
474
|
+
no_space_why: With no workspace there are no workspace changes to show. Sessions left over from a previous process land here too — workspace binding only lives in process memory.
|
|
471
475
|
loading: Loading the list…
|
|
472
476
|
thin: 'Rows replayed after a refresh only carry the path and the write count: file contents are not persisted, so they cannot be opened.'
|
|
473
477
|
created: created
|
|
@@ -523,7 +527,7 @@ web:
|
|
|
523
527
|
objective_hint: Write one sentence for "what counts as done", e.g. wire the inspector to background task output, with pnpm check green
|
|
524
528
|
budget_label: Budget
|
|
525
529
|
budget_hint: Leave empty for {n} rounds (max {max})
|
|
526
|
-
budget_warn:
|
|
530
|
+
budget_warn: Lowering it below the rounds already used turns the goal into "blocked" right away, which is also how you say "that is far enough". The other way round, adding budget to a goal that ran out lets it carry on immediately.
|
|
527
531
|
evidence_label: Evidence
|
|
528
532
|
evidence_hint: On what grounds is this done? If you cannot say, it is not done.
|
|
529
533
|
act_edit: Reword
|
|
@@ -570,6 +574,7 @@ web:
|
|
|
570
574
|
fold_tools: '{count} calls'
|
|
571
575
|
fold_files: '{count} files'
|
|
572
576
|
fold_thoughts: '{count} thoughts'
|
|
577
|
+
fold_replies: '{count} replies'
|
|
573
578
|
fold_show: Show
|
|
574
579
|
fold_hide: Hide
|
|
575
580
|
gate: '{tool} is stopped here waiting for your decision. The chain below cannot pass this gate until then.'
|
|
@@ -681,6 +686,8 @@ web:
|
|
|
681
686
|
plan_readonly_forced: you asked for read-only throughout
|
|
682
687
|
note_label: 'Say what to change:'
|
|
683
688
|
note_placeholder: e.g. only touch core for now, leave tui alone
|
|
689
|
+
q_tabs: Questions in this set
|
|
690
|
+
q_tab_answered: answered
|
|
684
691
|
q_free: 'None of these — my own answer:'
|
|
685
692
|
q_free_placeholder: (optional) filling this in makes it the answer
|
|
686
693
|
q_submit: Submit
|
|
@@ -712,6 +719,7 @@ web:
|
|
|
712
719
|
aborted: “{title}” was stopped mid-run
|
|
713
720
|
filtered: “{title}” was refused by the model
|
|
714
721
|
compliance: “{title}” ran into a content compliance limit
|
|
722
|
+
truncated: “{title}” had its reply cut off before it finished
|
|
715
723
|
budget: “{title}” hit the budget cap and stopped early
|
|
716
724
|
failed: “{title}” hit an error
|
|
717
725
|
go: View
|
|
@@ -827,6 +835,7 @@ web:
|
|
|
827
835
|
pane_memory: Memory & context
|
|
828
836
|
pane_spend: Usage & spend
|
|
829
837
|
history_only: 'This session is history only — no engine is running it yet. Opening an old session just replays the conversation; the engine is built when you send your next message. This pane asks that engine for its current state, so there is nothing to show yet: go back to the session, send a message, and it will be picked back up.'
|
|
838
|
+
no_provider_elsewhere: No model provider is configured on this machine, so no engine can be built and this pane has nothing to show. Configure an API key under "Models & Providers" on the left.
|
|
830
839
|
pane_budget: Budget
|
|
831
840
|
pane_tools: Tools
|
|
832
841
|
pane_about: About
|
|
@@ -873,6 +882,12 @@ web:
|
|
|
873
882
|
set:
|
|
874
883
|
no_session: No session yet. The two project-level settings layers follow the workspace, and the workspace is bound per session — with no session there is no "which .epoch/settings.json" to answer.
|
|
875
884
|
loading: Reading setting provenance…
|
|
885
|
+
no_provider_lede: No model provider is configured on this machine — no engine can be built, so the "winning layer" rows on this pane cannot be read. Start by configuring an API key below.
|
|
886
|
+
no_provider_restart: 'Restart epoch web once after saving: the provider is wired up at startup, so this run will not pick it up on its own.'
|
|
887
|
+
no_provider_model: ⚠ The next start switches to whichever provider you configured a key for, but the model name does not follow (it defaults to gpt-4o-mini). If you configured anything other than OpenAI, pick one of that provider's models above and press "Save model" — otherwise the first message after restarting will fail with an unknown model. Written to ~/.epoch/config.yaml (layer 2, user).
|
|
888
|
+
no_provider_model_save: Save model
|
|
889
|
+
no_provider_model_saving: Saving…
|
|
890
|
+
no_provider_model_saved: Written to {path}. Restart epoch web once and this machine will use it.
|
|
876
891
|
unset: Not set
|
|
877
892
|
why: Why this value
|
|
878
893
|
chain_win: wins
|
|
@@ -903,7 +918,7 @@ web:
|
|
|
903
918
|
k_context_length: Context window (tokens)
|
|
904
919
|
h_context_length: Only used as a fallback when the model metadata cannot be read; when it can, metadata wins and a configured value has no effect. The compression line below uses the window the engine actually runs on.
|
|
905
920
|
k_max_turns: Max steps per turn
|
|
906
|
-
h_max_turns: How many tool calls the model may make in one turn. On reaching the cap it stops and finishes its answer.
|
|
921
|
+
h_max_turns: How many tool calls the model may make in one turn. On reaching the cap it stops and finishes its answer. 0 = unlimited (the default); only the budget and the context window are holding the line then.
|
|
907
922
|
k_compression_enabled: Compact when nearly full
|
|
908
923
|
h_compression_enabled: Compaction rewrites earlier messages into a summary; the originals stay in the session store and the model can search them back. A note is left in the thread afterwards.
|
|
909
924
|
k_compression_threshold: Compact at
|
|
@@ -959,11 +974,11 @@ web:
|
|
|
959
974
|
sb_process: Process isolation only ({platform})
|
|
960
975
|
sb_absent: Not probed
|
|
961
976
|
sb_absent_d: The isolation layer itself did not come up, so it cannot even report what it found. This is not the same as "process isolation only".
|
|
962
|
-
sb_absent_long: The isolation layer did not come up, so it cannot even report what it found. This is not the same as "process isolation only"
|
|
977
|
+
sb_absent_long: 'The isolation layer did not come up, so it cannot even report what it found. This is not the same as "process isolation only": that one was checked, this one could not be.'
|
|
963
978
|
sb_os_isolated: '{backend} on {platform} really does hold it in; there is nothing more to explain here.'
|
|
964
979
|
sb_backend_unavailable: '{platform} should have an implementation, but the probe failed — the backend is there and will not start.'
|
|
965
980
|
sb_backend_missing: '{platform} has an implementation but the dependency is missing: Linux needs bubblewrap, or the kernel may have disabled unprivileged user namespaces.'
|
|
966
|
-
sb_platform_unsupported: '{platform} has no
|
|
981
|
+
sb_platform_unsupported: '{platform} has no OS-level sandbox.'
|
|
967
982
|
sb_switch: Sandbox switch
|
|
968
983
|
sb_switch_on: 'on'
|
|
969
984
|
sb_switch_off: 'off'
|
|
@@ -1033,7 +1048,7 @@ web:
|
|
|
1033
1048
|
policy_n: '{count} rules'
|
|
1034
1049
|
policy_skipped: '{dir} was not loaded at all — that workspace is untrusted.'
|
|
1035
1050
|
policy_skipped_why: 'Not "deny only": not one rule was read.'
|
|
1036
|
-
policy_asym:
|
|
1051
|
+
policy_asym: In an untrusted workspace permissions keep only the deny list, while policy is dropped wholesale — the two are handled differently.
|
|
1037
1052
|
g_audit: What it decided
|
|
1038
1053
|
audit_lede: Verdicts made by the permission layer this run, newest first.
|
|
1039
1054
|
audit_scope: Only decisions the permission layer actually made — not every risky action.
|
|
@@ -1086,6 +1101,8 @@ web:
|
|
|
1086
1101
|
search: Search names, descriptions, tool names
|
|
1087
1102
|
no_session: No session yet. These three panes follow the session — the "Project" layer depends on which workspace it is bound to.
|
|
1088
1103
|
loading: Loading…
|
|
1104
|
+
desc_more: More
|
|
1105
|
+
desc_less: Less
|
|
1089
1106
|
experts_lede: An identity is a prompt, a tool set and a turn limit. The main agent hands work off with delegate_task; each sub-agent runs under its own identity in a separate context and only hands back the conclusion.
|
|
1090
1107
|
skills_lede: 'Skills are progressively disclosed: only the one line below enters the context, and the body is read only when the model decides it is relevant. The number at the end of each row is what that line costs every turn — rows that are held out of the index say so instead.'
|
|
1091
1108
|
connectors_lede: Connectors are where tools come from. The built-in ones ship with the program and cannot fail to connect; the MCP ones are yours to configure, which is why they carry a state.
|
|
@@ -1104,7 +1121,7 @@ web:
|
|
|
1104
1121
|
g_plugin_skills: Brought in by installed plugins; their names are prefixed with the plugin name.
|
|
1105
1122
|
g_project_skills: From this repository .epoch/skills/. They travel with the repository.
|
|
1106
1123
|
g_host_skills: Shipped by the application this engine is embedded in; their names carry the prefix that application chose. They are upgraded together with that application, so they are read-only here.
|
|
1107
|
-
g_builtin_conn: Tool plugins compiled into the program.
|
|
1124
|
+
g_builtin_conn: Tool plugins compiled into the program. They ship with it and need no configuration.
|
|
1108
1125
|
g_mcp_note: What you configured in ~/.epoch/mcp.json. Their tool names carry an mcp__<server>__ prefix.
|
|
1109
1126
|
g_host_conn: Shipped by the application this engine is embedded in. They are not in your mcp.json, so you can neither edit nor remove them — only that application own UI can. Their names carry the prefix it chose, so their tool names start with mcp__<prefix>__<server>__.
|
|
1110
1127
|
g_plugin_conn: Brought in by an installed plugin, from the mcp.json at its own root. Names are prefixed with the plugin name, so their tool names start with mcp__<plugin>__<server>__. You cannot edit their contents, but epoch plugin list tells you which plugin brought them and epoch plugin disable turns the whole thing off.
|
|
@@ -1199,7 +1216,7 @@ web:
|
|
|
1199
1216
|
plug_market_remove_yes: Remove
|
|
1200
1217
|
plug_market_remove_failed: Could not remove it
|
|
1201
1218
|
plug_restart: Plugins changed during this run; those changes have not taken effect
|
|
1202
|
-
plug_restart_why: 'Extensions are loaded at startup, so anything just installed / updated / uninstalled only counts from the next run — this run''s command table, hooks and identity table are unchanged. To make them take effect: restart the service running this interface (Ctrl+C in the terminal, then run epoch web again). If this interface is embedded in another program, only that program can do the rebuild — there is no "apply now" button on this page
|
|
1219
|
+
plug_restart_why: 'Extensions are loaded at startup, so anything just installed / updated / uninstalled only counts from the next run — this run''s command table, hooks and identity table are unchanged. To make them take effect: restart the service running this interface (Ctrl+C in the terminal, then run epoch web again). If this interface is embedded in another program, only that program can do the rebuild — there is no "apply now" button on this page.'
|
|
1203
1220
|
plug_state_active: In effect
|
|
1204
1221
|
plug_state_pending: Installed; this run has not loaded it
|
|
1205
1222
|
plug_state_disabled: Disabled (epoch plugin enable turns it back on)
|
|
@@ -1314,7 +1331,7 @@ web:
|
|
|
1314
1331
|
role_add_skills: Skill allowlist (one per line)
|
|
1315
1332
|
role_add_skills_hint: 'Empty = unrestricted, every skill on the capability page enters its index. Listing names restricts the index to those. Copy the names off the Skills column ("prefix:" included for plugin- and host-provided ones). ⚠️ This only controls what the index lists — it is not a wall: this identity can still read the body of a skill that was left out.'
|
|
1316
1333
|
role_add_turns: Turn limit
|
|
1317
|
-
role_add_turns_hint: Empty = follow the global setting.
|
|
1334
|
+
role_add_turns_hint: Empty = follow the global setting. 0 = no turn limit for this role.
|
|
1318
1335
|
role_add_scope: 'This creates a .md file in ~/.epoch/agents/ — not just for this conversation, and not just for this process: every future epoch run on this machine (including the CLI and the TUI) will see it. ⚠️ Both passages above enter the model context ("when to delegate to it" on every single turn), so what you write here carries the same weight as what you say in a conversation.'
|
|
1319
1336
|
role_add_submit: Create it
|
|
1320
1337
|
role_add_submitting: Writing…
|
|
@@ -1513,6 +1530,10 @@ web:
|
|
|
1513
1530
|
next_at: Next {when}
|
|
1514
1531
|
last_at: Last {status} · {when}
|
|
1515
1532
|
run_now: Run once now
|
|
1533
|
+
run_running: Running…
|
|
1534
|
+
running: Running “{name}”
|
|
1535
|
+
running_for: '{dur} so far'
|
|
1536
|
+
running_hint: This is a real run, so it may take a few minutes. The result and any missing grants will show up right here.
|
|
1516
1537
|
enable: Enable
|
|
1517
1538
|
disable: Disable
|
|
1518
1539
|
edit: Edit
|
|
@@ -1560,7 +1581,7 @@ web:
|
|
|
1560
1581
|
f_permission: Permission level
|
|
1561
1582
|
f_bypass_ack: 'I understand: this task will do anything without asking inside {workDir}, including deleting files and running arbitrary commands.'
|
|
1562
1583
|
f_turns: Max turns
|
|
1563
|
-
f_turns_hint: How many times the model may call a tool in one turn
|
|
1584
|
+
f_turns_hint: How many times the model may call a tool in one turn. On hitting the cap it stops and finishes its answer. 0 = no turn limit. Defaults to the number in Settings.
|
|
1564
1585
|
f_timeout: Timeout (minutes)
|
|
1565
1586
|
f_timeout_note: The only ruler that catches "a command hung" — turns and spend both stop growing there. 24 hours at most.
|
|
1566
1587
|
f_budget: Max spend per run (USD)
|
|
@@ -1612,7 +1633,7 @@ web:
|
|
|
1612
1633
|
permission_unknown: 'Unknown permission level: {detail}'
|
|
1613
1634
|
work_dir_missing: 'This directory does not exist: {detail}'
|
|
1614
1635
|
budget_missing: Enter a number above 0 (currently {detail})
|
|
1615
|
-
max_turns_invalid: Must be a whole number
|
|
1636
|
+
max_turns_invalid: Must be 0 or a positive whole number (currently {detail}) — 0 means no turn limit
|
|
1616
1637
|
timeout_invalid: Must be positive and at most 24 hours (currently {detail} ms)
|
|
1617
1638
|
trigger_time_invalid: The time must be written HH:mm (currently {detail})
|
|
1618
1639
|
trigger_weekdays_empty: Pick at least one day
|
|
@@ -1791,7 +1812,7 @@ schedule:
|
|
|
1791
1812
|
permission_unknown: 'unknown permission level: {detail}'
|
|
1792
1813
|
work_dir_missing: 'working directory does not exist: {detail}'
|
|
1793
1814
|
budget_missing: --budget is required and must be positive (got {detail})
|
|
1794
|
-
max_turns_invalid: --max-turns must be
|
|
1815
|
+
max_turns_invalid: --max-turns must be 0 or a positive integer (got {detail}) — 0 means no turn limit
|
|
1795
1816
|
timeout_invalid: --timeout must be positive and at most 24 hours (got {detail} ms)
|
|
1796
1817
|
trigger_time_invalid: the time must be HH:mm (got {detail})
|
|
1797
1818
|
trigger_weekdays_empty: the weekly schedule needs at least one day
|
|
@@ -2230,6 +2251,7 @@ terminal_setup:
|
|
|
2230
2251
|
restore_failed: Restore failed — {detail}
|
|
2231
2252
|
revert_nowhere: Nothing to revert — we never wrote anything for this terminal
|
|
2232
2253
|
tui:
|
|
2254
|
+
no_provider: 'Could not start: the provider is unavailable; run epoch model to configure one'
|
|
2233
2255
|
common:
|
|
2234
2256
|
unavailable: '{what} unavailable: the host did not inject this capability'
|
|
2235
2257
|
unknown: unknown
|
|
@@ -2677,7 +2699,7 @@ run:
|
|
|
2677
2699
|
opt_output_format: Format for stdout ({formats}). --json is an alias for json
|
|
2678
2700
|
opt_input_format: Format for stdin ({formats}). stream-json enters long-running mode
|
|
2679
2701
|
opt_permission_prompt_tool: Hand every operation that needs confirmation to this external program (equivalent to trusting it completely)
|
|
2680
|
-
opt_max_turns: Max tool-loop turns for this call, overriding maxTurns in the config
|
|
2702
|
+
opt_max_turns: Max tool-loop turns for this call, overriding maxTurns in the config (0 = unlimited for this call)
|
|
2681
2703
|
opt_max_budget: Stop this call once it spends more than this (stacks with the cross-session budget)
|
|
2682
2704
|
opt_no_stream: Do not stream; print everything once it finishes
|
|
2683
2705
|
opt_verbose: Print every startup diagnostic (by default only the non-OK ones)
|
|
@@ -2698,6 +2720,8 @@ run:
|
|
|
2698
2720
|
resume_not_id_hint: 'If that was a message rather than an id, use a form other than epoch --resume "message": epoch -r -- "message" treats it as a positional argument, or run epoch sessions list first to find the id'
|
|
2699
2721
|
tui_entry_missing: 'Startup failed: cannot find the TUI entry tui-entry — run pnpm build first'
|
|
2700
2722
|
tui_spawn_failed: 'TUI failed to start: {message}'
|
|
2723
|
+
no_query_noninteractive: 'Nothing to send to the model: this is a non-interactive environment (pipe / redirect / CI), or a machine-readable output was requested (--json / --output-format) — neither can enter interactive mode'
|
|
2724
|
+
no_query_hint: 'Pass what you want to ask as a positional argument: epoch "your question"; or pipe material in: cat file | epoch "analyze this"'
|
|
2701
2725
|
mcp:
|
|
2702
2726
|
state_not_applicable: not needed (stdio)
|
|
2703
2727
|
state_bearer: static Authorization header
|
|
@@ -2858,6 +2882,7 @@ agents:
|
|
|
2858
2882
|
tools_declared: 'Tools (declared): {tools}'
|
|
2859
2883
|
tools_inherited: 'Tools (declared): inherits every tool the main agent has'
|
|
2860
2884
|
max_turns: 'Turn limit: {n}'
|
|
2885
|
+
max_turns_unlimited: 'Turn limit: none'
|
|
2861
2886
|
prompt_head: 'Role prompt:'
|
|
2862
2887
|
prompt_none: 'Role prompt: none (only the sub-agent identity line is swapped; the rest of the general prompt stays)'
|
|
2863
2888
|
empty: No roles available (delegate_task is not registered when the provider cannot start)
|
|
@@ -3445,6 +3470,7 @@ agent_run:
|
|
|
3445
3470
|
compliance_output: This reply ran into a content compliance limit ({categories}), so output stopped.
|
|
3446
3471
|
compliance_input: Your message ran into a content compliance limit ({categories}); the request was not sent and nothing was billed.
|
|
3447
3472
|
compliance_input_masked: Your message contained wording that runs into a content compliance limit ({categories}), so it was masked before being sent — the model did not see the text exactly as it appears on your screen.
|
|
3473
|
+
truncated: The reply above is **cut off** — the model hit its output length limit; it did not stop on its own. Raise max output tokens, or ask it to answer in parts.
|
|
3448
3474
|
stalled: 'Detected a loop: {info}. The task was terminated.'
|
|
3449
3475
|
stall_info: '{tool}({args}) was called {count} turns in a row, which looks like a loop'
|
|
3450
3476
|
max_turns: Reached the maximum of {max} turns; the task was terminated unfinished.
|
package/dist/locales/zh.yaml
CHANGED
|
@@ -25,7 +25,7 @@ flags:
|
|
|
25
25
|
prompt_tool_missing: '--permission-prompt-tool 指向的程序不存在: {value}'
|
|
26
26
|
prompt_tool_missing_hint: '解析成: {abs}。要跑一个解释器就连着写,例如 --permission-prompt-tool "node ./approver.js"'
|
|
27
27
|
not_a_number: '{flag} 不是合法的值: {raw}'
|
|
28
|
-
|
|
28
|
+
want_turn_limit: 要 0 或正整数,例如 --max-turns 5;0 = 不限轮次
|
|
29
29
|
want_positive: 要一个正数,例如 0.50
|
|
30
30
|
cli:
|
|
31
31
|
program_description: Epoch Agent CLI 智能体
|
|
@@ -37,7 +37,7 @@ cli:
|
|
|
37
37
|
opt_no_open: 不自动打开浏览器
|
|
38
38
|
opt_json: stdout 只打一行 JSON(url / host / port / token),其余提示改走 stderr。宿主程序拉起时用,配 --port 0 就不必写死端口
|
|
39
39
|
opt_plugins: 在界面上开出插件页(默认关)。装插件会往 ~/.epoch/plugins/ 落东西、下一程加载,所以是显式开的;市场清单取你自己 epoch plugin marketplace add 加过的那些,远程来源仍然关着
|
|
40
|
-
|
|
40
|
+
no_provider_warn: ⚠ 这台机器还没有可用的 provider:界面照旧起得来,但一个会话都开不了。在界面上「设置 → 模型与 Provider」配一把 API key(或者跑 epoch model),配完重启这条命令
|
|
41
41
|
err_port: 端口必须是数字:{value}
|
|
42
42
|
missing_root: 前端产物没找到,本次只提供 REST / SSE,打开是占位页。跑一次 pnpm build 再试
|
|
43
43
|
browser_failed: (没能自动打开浏览器,复制上面那条地址即可)
|
|
@@ -208,7 +208,7 @@ cli:
|
|
|
208
208
|
opt_allow_tool: 无人值守时这个工具免确认,可重复给
|
|
209
209
|
opt_allow_operation: 无人值守时这类操作免确认,可重复给
|
|
210
210
|
opt_allow_rule: 无人值守时命中这条规则的操作免确认,可重复给(如 terminal(git status))
|
|
211
|
-
opt_max_turns:
|
|
211
|
+
opt_max_turns: 最多跑几轮(缺省不限,和交互式同值 —— 这一层真正的闸门是必填的预算)
|
|
212
212
|
opt_budget: 必填:这一次运行最多花多少美元
|
|
213
213
|
opt_timeout: 墙钟超时(分钟,缺省 15)—— 唯一能拦住「一条命令挂住了」的那把尺子
|
|
214
214
|
opt_disabled: 建好之后先停着,不立刻启用
|
|
@@ -265,7 +265,7 @@ web:
|
|
|
265
265
|
rewind_no_checkpoint: 没有第 {turn} 轮的检查点
|
|
266
266
|
settings_write_bad_request: 请求体要有 key(设置项的点分路径)、layer({layers} 之一)和 value(字符串 / 数字 / 布尔)
|
|
267
267
|
settings_write_unknown_key: 这个键这样改不了:要么它压根不在可写名单里(比如降级链 —— 它是一条有序的链,不是一个标量),要么这个键只写得进用户级、而请求写的是项目本地。项目级那两层只认 permissions / model / maxTurns,别的键写进去会被启动诊断报成「未知配置项」
|
|
268
|
-
settings_write_bad_value: 这个值不合这一项的值域(比如 maxTurns
|
|
268
|
+
settings_write_bad_value: 这个值不合这一项的值域(比如 maxTurns 要 0 或正整数),没有写进去
|
|
269
269
|
settings_write_unwritable: '{path} 这份文件这一层认不出它的写法(或者它已经坏了),没有覆盖它 —— 请自己编辑那个文件'
|
|
270
270
|
settings_write_io: 写 {path} 失败:可能是没有写权限,或者那个目录建不出来
|
|
271
271
|
model_bad_request: model 必须是非空字符串(模型名,或 provider/模型名);要回到配置里那个就给 null
|
|
@@ -274,6 +274,8 @@ web:
|
|
|
274
274
|
provider_unknown: 不支持名为「{name}」的 provider —— 可选的那几家是一份固定清单,你手上这份可能已经旧了,刷新一下再看
|
|
275
275
|
provider_key_not_applicable: '{name} 不用 API key —— 配一把进去也不会有人读它,这家现在就是通的'
|
|
276
276
|
provider_key_empty: 没收到 key —— 把它粘进那个框再保存。(想撤掉已经配好的那把,这一版还没有入口,去 ~/.epoch 或者钥匙串里删)
|
|
277
|
+
model_default_has_provider: 这条路只在「这台机器还没配 provider」时开着。现在 provider 已经起来了,改模型走设置页「模型与 Provider」那一行。
|
|
278
|
+
model_default_empty: 没收到模型名 —— 先挑一个或者敲一个再保存。
|
|
277
279
|
mcp_add_lan_exposed: 这一档下加不了 MCP server —— 服务是用 --host 绑到回环之外的,而我们没法确认发出这一下的浏览器就在这台机器上。加一台等于往 mcp.json 里写一条「启动哪个可执行文件」,而那台当场就会被起起来,往后这台机器上每一次跑 epoch(含 CLI 和 TUI)也都会照着它起。出路两条:到跑着服务的那台机器上直接改那个文件;或者去掉 --host 重启一次。
|
|
278
280
|
mcp_add_bad_transport: 传输类型只能是 stdio / sse / http
|
|
279
281
|
mcp_add_bad_name: server 名「{name}」不能用 —— 它会原样变成工具名的一部分,所以只收字母数字开头、由字母数字和 _ - 组成的名字(最长 48)。手写 mcp.json 不受这条管,这条只管从界面加的
|
|
@@ -402,6 +404,7 @@ web:
|
|
|
402
404
|
search: 搜索会话
|
|
403
405
|
automation: 自动化
|
|
404
406
|
automation_pending: 有 {count} 条定时任务欠着授权,到点了会再卡一次
|
|
407
|
+
automation_running: 有一次「先跑一次」正在跑
|
|
405
408
|
settings: 设置
|
|
406
409
|
host_menu: 宿主菜单
|
|
407
410
|
cost: 花费
|
|
@@ -467,7 +470,8 @@ web:
|
|
|
467
470
|
files: 工作区改动
|
|
468
471
|
files_note: 这个会话在工作区里新建或改过的文件。
|
|
469
472
|
files_empty: 这个会话还没改过工作区里的文件
|
|
470
|
-
|
|
473
|
+
no_space_title: 这个会话没有工作区
|
|
474
|
+
no_space_why: 没有工作区就没有「工作区改动」这回事。上一个进程留下的会话也会落在这儿 —— 工作区绑定只活在进程内存里。
|
|
471
475
|
loading: 正在取清单…
|
|
472
476
|
thin: 刷新之后回放出来的那些行只剩路径和次数:文件内容不落盘,所以点不开。
|
|
473
477
|
created: 新建
|
|
@@ -523,7 +527,7 @@ web:
|
|
|
523
527
|
objective_hint: 写一句「什么算做完」,比如:把检视面板接上后台任务的输出,且 pnpm check 全绿
|
|
524
528
|
budget_label: 预算
|
|
525
529
|
budget_hint: 不填就是 {n} 轮(上限 {max})
|
|
526
|
-
budget_warn:
|
|
530
|
+
budget_warn: 调小到已用轮次之下会当场把它变成「卡住了」,这也是「就到这儿吧」的一种说法。反过来,给一个「预算用完」的目标加预算会直接放它继续。
|
|
527
531
|
evidence_label: 完成依据
|
|
528
532
|
evidence_hint: 凭什么算完成?说不出来就说明还没完成。
|
|
529
533
|
act_edit: 改措辞
|
|
@@ -570,6 +574,7 @@ web:
|
|
|
570
574
|
fold_tools: '{count} 次调用'
|
|
571
575
|
fold_files: '{count} 个文件'
|
|
572
576
|
fold_thoughts: 思考 {count} 段
|
|
577
|
+
fold_replies: 回复 {count} 段
|
|
573
578
|
fold_show: 展开
|
|
574
579
|
fold_hide: 收起
|
|
575
580
|
gate: '{tool} 停在这里等你裁决。下面那条链要过了闸才继续。'
|
|
@@ -681,6 +686,8 @@ web:
|
|
|
681
686
|
plan_readonly_forced: 你要求了全程只读
|
|
682
687
|
note_label: 要改的话,说一句:
|
|
683
688
|
note_placeholder: 比如:先只动 core,别碰 tui
|
|
689
|
+
q_tabs: 这一组问题
|
|
690
|
+
q_tab_answered: 已答
|
|
684
691
|
q_free: 都不对,我自己写:
|
|
685
692
|
q_free_placeholder: (可选)填了就以这一句为答案
|
|
686
693
|
q_submit: 提交
|
|
@@ -712,6 +719,7 @@ web:
|
|
|
712
719
|
aborted: 《{title}》被中止了
|
|
713
720
|
filtered: 《{title}》被模型拒答了
|
|
714
721
|
compliance: 《{title}》触了内容合规限制
|
|
722
|
+
truncated: 《{title}》的回复被截断了,没说完
|
|
715
723
|
budget: 《{title}》触了预算上限,提前收工
|
|
716
724
|
failed: 《{title}》出错了
|
|
717
725
|
go: 查看
|
|
@@ -827,6 +835,7 @@ web:
|
|
|
827
835
|
pane_memory: 记忆与上下文
|
|
828
836
|
pane_spend: 用量与花费
|
|
829
837
|
history_only: 这段会话只剩历史,引擎还没装起来 —— 点开一段旧会话只回放对话,装引擎要等你发下一条消息。这一屏问的是那台引擎此刻的状态,所以现在没有东西可看:回到会话里发一条,它会自己接回来。
|
|
838
|
+
no_provider_elsewhere: 这台机器还没有可用的模型 provider,所以引擎一个都装不起来,这一屏没有东西可看。去左边「模型与 Provider」那一节配一把 API key。
|
|
830
839
|
pane_budget: 预算
|
|
831
840
|
pane_tools: 工具
|
|
832
841
|
pane_about: 关于
|
|
@@ -873,6 +882,12 @@ web:
|
|
|
873
882
|
set:
|
|
874
883
|
no_session: 还没有会话。项目级那两层设置跟着工作区走,而工作区按会话绑 —— 没有会话就没有「哪一份 .epoch/settings.json」可说。
|
|
875
884
|
loading: 正在读取设置来源…
|
|
885
|
+
no_provider_lede: 这台机器还没有可用的模型 provider —— 引擎一个都装不起来,所以这一屏那几行「赢在哪一层」读不出来。先在下面配一把 API key。
|
|
886
|
+
no_provider_restart: 存完之后要重启一次 epoch web 才生效:provider 是启动时装配的,这一程不会自己接上。
|
|
887
|
+
no_provider_model: ⚠ 下次启动会自动切到你配了 key 的那一家,但模型名不会跟着换(默认是 gpt-4o-mini)。配的不是 OpenAI 的话,在上面挑一个这家的模型再按「保存模型」—— 不然重启后第一句话就会报模型不存在。写进 ~/.epoch/config.yaml(② 用户级)。
|
|
888
|
+
no_provider_model_save: 保存模型
|
|
889
|
+
no_provider_model_saving: 存模型…
|
|
890
|
+
no_provider_model_saved: 已写进 {path}。重启一次 epoch web 之后这台机器就用它了。
|
|
876
891
|
unset: 未设置
|
|
877
892
|
why: 为什么是这个值
|
|
878
893
|
chain_win: 生效
|
|
@@ -903,7 +918,7 @@ web:
|
|
|
903
918
|
k_context_length: 上下文窗口(token)
|
|
904
919
|
h_context_length: 只在模型元数据查不到时才用这个值兜底;查得到就以元数据为准,填了也不生效。下面那条压缩线算的是引擎真在用的那个窗口。
|
|
905
920
|
k_max_turns: 单轮最多几步
|
|
906
|
-
h_max_turns: 一轮里模型最多调用几次工具。到顶就停下来把话说完。
|
|
921
|
+
h_max_turns: 一轮里模型最多调用几次工具。到顶就停下来把话说完。0 = 不限(缺省),此时只有预算和上下文窗口在兜底。
|
|
907
922
|
k_compression_enabled: 快满时自动压缩
|
|
908
923
|
h_compression_enabled: 压缩会把早期消息重写成一份摘要,原文仍在会话库里、模型能搜回来。压完在对话流里留一条记录。
|
|
909
924
|
k_compression_threshold: 压到几成开始
|
|
@@ -959,11 +974,11 @@ web:
|
|
|
959
974
|
sb_process: 仅进程隔离({platform})
|
|
960
975
|
sb_absent: 未探测
|
|
961
976
|
sb_absent_d: 隔离层自己没起来,连探测到了什么都说不出。这不等于「仅进程隔离」。
|
|
962
|
-
sb_absent_long:
|
|
977
|
+
sb_absent_long: 隔离层没起来,所以连探测到了什么都说不出。这不等于「仅进程隔离」:那一档是查清楚了,这一档是没查出来。
|
|
963
978
|
sb_os_isolated: '{platform} 上的 {backend} 真把它关起来了,这一档没什么要解释的。'
|
|
964
979
|
sb_backend_unavailable: '{platform} 本该有实现,但探测没过 —— 后端在,调不起来。'
|
|
965
980
|
sb_backend_missing: '{platform} 上有实现,但依赖没装:Linux 要 bubblewrap,也可能是内核禁了非特权用户命名空间。'
|
|
966
|
-
sb_platform_unsupported: '{platform}
|
|
981
|
+
sb_platform_unsupported: '{platform} 上没有 OS 级沙箱。'
|
|
967
982
|
sb_switch: 沙箱开关
|
|
968
983
|
sb_switch_on: 开
|
|
969
984
|
sb_switch_off: 关
|
|
@@ -1033,7 +1048,7 @@ web:
|
|
|
1033
1048
|
policy_n: '{count} 条'
|
|
1034
1049
|
policy_skipped: '{dir} 整份没加载 —— 那个工作区不受信任。'
|
|
1035
1050
|
policy_skipped_why: 不是「只留 deny」,是一条都没读。
|
|
1036
|
-
policy_asym:
|
|
1051
|
+
policy_asym: 未信任的工作区里,权限只留 deny 那一张表,策略却是整份不加载 —— 这两处的处理不一样。
|
|
1037
1052
|
g_audit: 判过什么
|
|
1038
1053
|
audit_lede: 权限层这一程的裁决,最新的在最前面。
|
|
1039
1054
|
audit_scope: 只记权限层做过的裁决,不是所有危险动作。
|
|
@@ -1086,6 +1101,8 @@ web:
|
|
|
1086
1101
|
search: 搜名字、描述、工具名
|
|
1087
1102
|
no_session: 还没有会话。这三栏是跟着会话走的 —— 「项目」那一层要看它绑的是哪个工作区。
|
|
1088
1103
|
loading: 正在取…
|
|
1104
|
+
desc_more: 展开
|
|
1105
|
+
desc_less: 收起
|
|
1089
1106
|
experts_lede: 身份是一段 prompt、一个工具集、一个轮数上限。主 agent 用 delegate_task 把活派出去,每个子 agent 以自己的身份跑在独立的上下文里,只把结论交回来。
|
|
1090
1107
|
skills_lede: 技能是渐进披露的:平时只有下面那一行进上下文,模型觉得用得上才去读正文。行尾那个数就是那一行每一轮的常驻开销 —— 真被挡在索引外的那几条,行尾会直说。
|
|
1091
1108
|
connectors_lede: 连接器是工具的来源。内置那几个随程序装好,不会连不上;MCP 那些是你自己配的,所以它们带状态。
|
|
@@ -1104,7 +1121,7 @@ web:
|
|
|
1104
1121
|
g_plugin_skills: 装的插件带进来的,名字前面会加上插件名。
|
|
1105
1122
|
g_project_skills: 这个仓库 .epoch/skills/ 下的,跟着仓库走。
|
|
1106
1123
|
g_host_skills: 装着这个引擎的那个应用自己带的,名字前面会加上它给的前缀。它随那个应用一起升级,所以在这儿是只读的。
|
|
1107
|
-
g_builtin_conn:
|
|
1124
|
+
g_builtin_conn: 编进程序里的工具插件,装好就有,不用配。
|
|
1108
1125
|
g_mcp_note: 你在 ~/.epoch/mcp.json 里配的。它们的工具名带 mcp__<服务器名>__ 前缀。
|
|
1109
1126
|
g_host_conn: 装着这个引擎的那个应用自己带的,不在你的 mcp.json 里,所以你既改不了也删不掉 —— 要管得去那个应用自己的界面。它们的名字带上了它给的前缀,工具名因此是 mcp__<前缀>__<服务器名>__ 开头。
|
|
1110
1127
|
g_plugin_conn: 装的插件在自己根目录下那份 mcp.json 里带的。名字前面加了插件名,工具名因此是 mcp__<插件名>__<服务器名>__ 开头。内容改不了,但 epoch plugin list 查得到是谁带来的,epoch plugin disable 能整个停掉。
|
|
@@ -1199,7 +1216,7 @@ web:
|
|
|
1199
1216
|
plug_market_remove_yes: 移除
|
|
1200
1217
|
plug_market_remove_failed: 移除不了
|
|
1201
1218
|
plug_restart: 这一程动过插件,那些改动还没生效
|
|
1202
|
-
plug_restart_why: 扩展物是在启动时加载的,所以刚装 / 更新 / 卸载的那些要下一程才算数 —— 这一程的命令表、hook、身份表一个字都没变。要它们生效:重启跑着这个界面的那个服务(终端里 Ctrl+C,再跑一次 epoch web)。如果这个界面是嵌在别的程序里的,那次重建只有那个程序做得到 ——
|
|
1219
|
+
plug_restart_why: 扩展物是在启动时加载的,所以刚装 / 更新 / 卸载的那些要下一程才算数 —— 这一程的命令表、hook、身份表一个字都没变。要它们生效:重启跑着这个界面的那个服务(终端里 Ctrl+C,再跑一次 epoch web)。如果这个界面是嵌在别的程序里的,那次重建只有那个程序做得到 —— 这一页上没有一个「立即生效」的按钮。
|
|
1203
1220
|
plug_state_active: 已生效
|
|
1204
1221
|
plug_state_pending: 装完了,这一程还没加载它
|
|
1205
1222
|
plug_state_disabled: 已停用(epoch plugin enable 打开)
|
|
@@ -1314,7 +1331,7 @@ web:
|
|
|
1314
1331
|
role_add_skills: 技能白名单(一行一个)
|
|
1315
1332
|
role_add_skills_hint: 留空 = 不限,能力页上那些技能全都进它的索引。写了就只列这几条。名字照能力页技能那一栏抄(插件和宿主的带「前缀:」)。⚠️ 它只管索引里列不列得出,不是一道墙 —— 没列出的技能,这个身份照样读得到正文。
|
|
1316
1333
|
role_add_turns: 轮次上限
|
|
1317
|
-
role_add_turns_hint: 留空 =
|
|
1334
|
+
role_add_turns_hint: 留空 = 跟全局那一格。填 0 = 这个角色不限轮次。
|
|
1318
1335
|
role_add_scope: 这会在 ~/.epoch/agents/ 里建一个 .md —— 不只是这一段对话,也不只是这个进程:这台机器上以后每一次跑 epoch(含 CLI 和 TUI)都会看到它。⚠️ 上面那两段文字会进模型的上下文(「什么时候派给它」那一句每一轮都进),所以写进去的东西和你在对话里说的话一样有分量。
|
|
1319
1336
|
role_add_submit: 建出来
|
|
1320
1337
|
role_add_submitting: 写入中…
|
|
@@ -1510,6 +1527,10 @@ web:
|
|
|
1510
1527
|
next_at: 下次 {when}
|
|
1511
1528
|
last_at: 上次 {status} · {when}
|
|
1512
1529
|
run_now: 先跑一次
|
|
1530
|
+
run_running: 跑着呢…
|
|
1531
|
+
running: 正在跑「{name}」
|
|
1532
|
+
running_for: 已经 {dur}
|
|
1533
|
+
running_hint: 它跑的是真的一轮,可能要几分钟。跑完这儿会列出结果和缺的授权。
|
|
1513
1534
|
enable: 启用
|
|
1514
1535
|
disable: 停用
|
|
1515
1536
|
edit: 编辑
|
|
@@ -1557,7 +1578,7 @@ web:
|
|
|
1557
1578
|
f_permission: 权限档
|
|
1558
1579
|
f_bypass_ack: 我明白:这个任务将在 {workDir} 里不经确认地做任何事,包括删文件和跑任意命令。
|
|
1559
1580
|
f_turns: 最多轮次
|
|
1560
|
-
f_turns_hint:
|
|
1581
|
+
f_turns_hint: 一轮里模型最多调用几次工具。到顶就停下来把话说完。填 0 = 不限轮次。缺省跟设置里那一格。
|
|
1561
1582
|
f_timeout: 超时(分钟)
|
|
1562
1583
|
f_timeout_note: 唯一能拦住「一条命令挂住了」的那把尺子。最多 24 小时。
|
|
1563
1584
|
f_budget: 这一次最多花多少(美元)
|
|
@@ -1609,7 +1630,7 @@ web:
|
|
|
1609
1630
|
permission_unknown: 这个权限档不认识:{detail}
|
|
1610
1631
|
work_dir_missing: 这个目录不存在:{detail}
|
|
1611
1632
|
budget_missing: 填一个大于 0 的数(现在是 {detail})
|
|
1612
|
-
max_turns_invalid: 要是
|
|
1633
|
+
max_turns_invalid: 要是 0 或正整数(现在是 {detail})—— 0 表示不限轮次
|
|
1613
1634
|
timeout_invalid: 要是正数,而且不超过 24 小时(现在是 {detail} 毫秒)
|
|
1614
1635
|
trigger_time_invalid: 时刻要写成 HH:mm(现在是 {detail})
|
|
1615
1636
|
trigger_weekdays_empty: 至少选一天
|
|
@@ -1788,7 +1809,7 @@ schedule:
|
|
|
1788
1809
|
permission_unknown: 权限档不认识:{detail}
|
|
1789
1810
|
work_dir_missing: 工作目录不存在:{detail}
|
|
1790
1811
|
budget_missing: --budget 必填,而且要是正数(现在是 {detail})
|
|
1791
|
-
max_turns_invalid: --max-turns 要是
|
|
1812
|
+
max_turns_invalid: --max-turns 要是 0 或正整数(现在是 {detail})—— 0 表示不限轮次
|
|
1792
1813
|
timeout_invalid: --timeout 要是正数且不超过 24 小时(现在是 {detail} 毫秒)
|
|
1793
1814
|
trigger_time_invalid: 时刻要写成 HH:mm(现在是 {detail})
|
|
1794
1815
|
trigger_weekdays_empty: 每周档至少要选一天
|
|
@@ -2226,6 +2247,7 @@ terminal_setup:
|
|
|
2226
2247
|
restore_failed: 还原失败 —— {detail}
|
|
2227
2248
|
revert_nowhere: 没有可回滚的配置 —— 这台终端我们没写过东西
|
|
2228
2249
|
tui:
|
|
2250
|
+
no_provider: 启动失败:provider 不可用,运行 epoch model 配置
|
|
2229
2251
|
common:
|
|
2230
2252
|
unavailable: '{what}不可用:宿主没有注入这项能力'
|
|
2231
2253
|
unknown: 未知
|
|
@@ -2673,7 +2695,7 @@ run:
|
|
|
2673
2695
|
opt_output_format: stdout 的格式({formats})。--json 是 json 的别名
|
|
2674
2696
|
opt_input_format: stdin 的格式({formats})。stream-json 进长驻模式
|
|
2675
2697
|
opt_permission_prompt_tool: 把每一次需要确认的操作交给这个外部程序裁决(等同于完全信任它)
|
|
2676
|
-
opt_max_turns: 本次调用最多几轮工具循环,压过配置里的 maxTurns
|
|
2698
|
+
opt_max_turns: 本次调用最多几轮工具循环,压过配置里的 maxTurns(0 = 这次不限)
|
|
2677
2699
|
opt_max_budget: 本次调用花超这个金额就停(与跨会话预算叠加)
|
|
2678
2700
|
opt_no_stream: 不流式输出,等跑完一次性打印
|
|
2679
2701
|
opt_verbose: 打印全部启动诊断(默认只打非 OK 的)
|
|
@@ -2694,6 +2716,8 @@ run:
|
|
|
2694
2716
|
resume_not_id_hint: 如果那不是 id 而是要发的消息,写成 epoch --resume "消息" 之外的形式:epoch -r -- "消息" 会把它当位置参数,或先 epoch sessions list 查 id
|
|
2695
2717
|
tui_entry_missing: 启动失败:找不到 TUI 入口 tui-entry,请先运行 pnpm build
|
|
2696
2718
|
tui_spawn_failed: 'TUI 启动失败: {message}'
|
|
2719
|
+
no_query_noninteractive: 没有要发给模型的内容:当前是非交互环境(管道 / 重定向 / CI),或指定了机器可读输出(--json / --output-format),都进不了交互模式
|
|
2720
|
+
no_query_hint: 把要问的内容作为位置参数给:epoch "你的问题";或用管道喂素材:cat 文件 | epoch "分析这段"
|
|
2697
2721
|
mcp:
|
|
2698
2722
|
state_not_applicable: 不需要(stdio)
|
|
2699
2723
|
state_bearer: 静态 Authorization header
|
|
@@ -2854,6 +2878,7 @@ agents:
|
|
|
2854
2878
|
tools_declared: '工具(声明): {tools}'
|
|
2855
2879
|
tools_inherited: '工具(声明): 继承主 agent 的全部可用工具'
|
|
2856
2880
|
max_turns: '轮次上限: {n}'
|
|
2881
|
+
max_turns_unlimited: '轮次上限: 不限'
|
|
2857
2882
|
prompt_head: '角色 prompt:'
|
|
2858
2883
|
prompt_none: '角色 prompt: 无(只换掉子 agent 的身份行,其余沿用通用 prompt)'
|
|
2859
2884
|
empty: 没有可用角色(provider 起不来时 delegate_task 不会注册)
|
|
@@ -3441,6 +3466,7 @@ agent_run:
|
|
|
3441
3466
|
compliance_output: 这段回复触及内容合规限制({categories}),已停止输出。
|
|
3442
3467
|
compliance_input: 你的消息触及内容合规限制({categories}),本次请求未发送,未计费。
|
|
3443
3468
|
compliance_input_masked: 你的消息里有触及内容合规限制({categories})的词,已打码后再发给模型 —— 模型看到的不是你屏幕上这句的原文。
|
|
3469
|
+
truncated: 上面这段回复是**半截的** —— 模型的输出长度上限到了,它不是自己说完收工的。请调高 max output tokens,或让它分几次说。
|
|
3444
3470
|
stalled: 检测到死循环:{info}。任务已终止。
|
|
3445
3471
|
stall_info: 连续 {count} 轮调用 {tool}({args}),检测到死循环
|
|
3446
3472
|
max_turns: 已达到最大轮次 {max},任务未完成即终止。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@epoch-agent/infra",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "epoch-agent 基础设施:路径真源、SQLite 连接与迁移、日志、平台兼容、命令安全表",
|
|
6
6
|
"repository": {
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
},
|
|
37
37
|
"optionalDependencies": {
|
|
38
38
|
"@epoch-agent/vendor-ripgrep-darwin-arm64": "14.2.1",
|
|
39
|
-
"@epoch-agent/vendor-ripgrep-
|
|
40
|
-
"@epoch-agent/vendor-ripgrep-
|
|
39
|
+
"@epoch-agent/vendor-ripgrep-win32-x64": "14.2.1",
|
|
40
|
+
"@epoch-agent/vendor-ripgrep-darwin-x64": "14.2.1"
|
|
41
41
|
},
|
|
42
42
|
"engines": {
|
|
43
43
|
"node": ">=22.0.0"
|