@foxden-app/foxclaw 0.5.60 → 0.5.61

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/.env.example CHANGED
@@ -38,9 +38,9 @@ TELEGRAM_PREVIEW_THROTTLE_MS=800
38
38
  # Set to false if you prefer to keep "read files / edited files / ran command"
39
39
  # detail cards in the chat history.
40
40
  # TELEGRAM_DELETE_TOOL_DETAILS_AFTER_FINAL=true
41
- # Delete time-sensitive interactive panels such as /auth and /threads after 30 minutes.
41
+ # Delete time-sensitive interactive panels such as /auth, /setup, and /threads after 5 minutes.
42
42
  # The timer restarts whenever the panel is refreshed. Set to 0 to disable.
43
- # TELEGRAM_PANEL_TTL_MS=1800000
43
+ # TELEGRAM_PANEL_TTL_MS=300000
44
44
  THREAD_LIST_LIMIT=10
45
45
  CODEX_CLI_BIN=/absolute/path/to/codex
46
46
 
package/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  All notable FoxClaw changes are listed here. Each release note is bilingual so GitHub Releases and the npm package are useful to both Chinese and English readers.
4
4
 
5
+ ## 0.5.61 - 2026-06-21
6
+
7
+ ### 中文
8
+ - 将 `/auth`、`/setup`、`/threads` 等交互面板的默认自动清理时间从 30 分钟改为 5 分钟,并把 `/where`、旧 model/access 设置面板和 `/config` 面板纳入同一类时效清理。
9
+ - `/config` 现在明确定位为 FoxClaw 自身设置面板,新增“最终回复后删除操作明细”开关;可通过按钮或 `/config delete_tool_details <on|off>` 修改,并写回 `TELEGRAM_DELETE_TOOL_DETAILS_AFTER_FINAL`。
10
+ - `/config` 展示当前 `TELEGRAM_DELETE_TOOL_DETAILS_AFTER_FINAL` 和 `TELEGRAM_PANEL_TTL_MS`,方便确认聊天清理策略是否生效。
11
+
12
+ ### English
13
+ - Changed the default cleanup timeout for interactive panels such as `/auth`, `/setup`, and `/threads` from 30 minutes to 5 minutes, and applied the same stale-panel cleanup to `/where`, legacy model/access settings panels, and `/config`.
14
+ - `/config` is now the FoxClaw runtime settings panel and includes a "delete operation details after final reply" toggle. It can be changed via the button or `/config delete_tool_details <on|off>`, writing `TELEGRAM_DELETE_TOOL_DETAILS_AFTER_FINAL`.
15
+ - `/config` shows the current `TELEGRAM_DELETE_TOOL_DETAILS_AFTER_FINAL` and `TELEGRAM_PANEL_TTL_MS` values so cleanup behavior is visible.
16
+
5
17
  ## 0.5.60 - 2026-06-21
6
18
 
7
19
  ### 中文
package/dist/config.js CHANGED
@@ -78,7 +78,7 @@ export function loadConfig() {
78
78
  telegramPollIntervalMs: intEnv('TELEGRAM_POLL_INTERVAL_MS', 1200),
79
79
  telegramPreviewThrottleMs: intEnv('TELEGRAM_PREVIEW_THROTTLE_MS', 800),
80
80
  telegramDeleteToolDetailsAfterFinal: boolEnv('TELEGRAM_DELETE_TOOL_DETAILS_AFTER_FINAL', true),
81
- telegramPanelTtlMs: intEnv('TELEGRAM_PANEL_TTL_MS', 30 * 60_000),
81
+ telegramPanelTtlMs: intEnv('TELEGRAM_PANEL_TTL_MS', 5 * 60_000),
82
82
  threadListLimit: intEnv('THREAD_LIST_LIMIT', 10),
83
83
  statusPath: DEFAULT_STATUS_PATH,
84
84
  logPath: DEFAULT_LOG_PATH,
@@ -352,7 +352,7 @@ export declare class BridgeSessionCore {
352
352
  private handleFeaturesCommand;
353
353
  private handleConfigCommand;
354
354
  private handleConfigToggleCallback;
355
- private setAuthAutoDeleteNeedsRepair;
355
+ private setFoxClawBooleanConfig;
356
356
  private formatConfigToggleUpdate;
357
357
  private handleRequirementsCommand;
358
358
  private handleProviderCommand;
@@ -1088,9 +1088,9 @@ export class BridgeSessionCore {
1088
1088
  await this.handleSetupCallback(event, setupMatch[1], setupMatch[2], locale);
1089
1089
  return;
1090
1090
  }
1091
- const configMatch = /^config:auth_auto_delete:(on|off)$/.exec(event.data);
1091
+ const configMatch = /^config:(auth_auto_delete|delete_tool_details):(on|off)$/.exec(event.data);
1092
1092
  if (configMatch) {
1093
- await this.handleConfigToggleCallback(event, configMatch[1] === 'on', locale);
1093
+ await this.handleConfigToggleCallback(event, configMatch[1], configMatch[2] === 'on', locale);
1094
1094
  return;
1095
1095
  }
1096
1096
  const voiceMatch = /^voice:([a-f0-9]+)$/.exec(event.data);
@@ -5583,46 +5583,73 @@ export class BridgeSessionCore {
5583
5583
  await this.sendMessage(scopeId, t(locale, 'config_auth_auto_delete_usage'));
5584
5584
  return;
5585
5585
  }
5586
- const update = await this.setAuthAutoDeleteNeedsRepair(enabled);
5586
+ const update = await this.setFoxClawBooleanConfig('auth_auto_delete', enabled);
5587
5587
  const binding = this.store.getBinding(scopeId);
5588
5588
  const result = await this.app.readConfig(binding?.cwd ?? this.config.defaultCwd, true);
5589
- await this.sendMessage(scopeId, `${this.formatConfigToggleUpdate(locale, update)}\n\n${formatConfigMessage(locale, result, this.config, this.store.getCodexAuthPoolStats())}`, configKeyboard(locale, this.config));
5589
+ const sentMessageId = await this.sendMessage(scopeId, `${this.formatConfigToggleUpdate(locale, update)}\n\n${formatConfigMessage(locale, result, this.config, this.store.getCodexAuthPoolStats())}`, configKeyboard(locale, this.config));
5590
+ this.scheduleStalePanelDeletion(scopeId, sentMessageId);
5591
+ return;
5592
+ }
5593
+ if (['delete_tool_details', 'delete-tool-details', 'tool_details', 'tool-details'].includes(action)) {
5594
+ const enabled = parseConfigBooleanArg(args[1]);
5595
+ if (enabled === null) {
5596
+ await this.sendMessage(scopeId, t(locale, 'config_delete_tool_details_usage'));
5597
+ return;
5598
+ }
5599
+ const update = await this.setFoxClawBooleanConfig('delete_tool_details', enabled);
5600
+ const binding = this.store.getBinding(scopeId);
5601
+ const result = await this.app.readConfig(binding?.cwd ?? this.config.defaultCwd, true);
5602
+ const sentMessageId = await this.sendMessage(scopeId, `${this.formatConfigToggleUpdate(locale, update)}\n\n${formatConfigMessage(locale, result, this.config, this.store.getCodexAuthPoolStats())}`, configKeyboard(locale, this.config));
5603
+ this.scheduleStalePanelDeletion(scopeId, sentMessageId);
5590
5604
  return;
5591
5605
  }
5592
5606
  const binding = this.store.getBinding(scopeId);
5593
5607
  const result = await this.app.readConfig(binding?.cwd ?? this.config.defaultCwd, true);
5594
- await this.sendMessage(scopeId, formatConfigMessage(locale, result, this.config, this.store.getCodexAuthPoolStats()), configKeyboard(locale, this.config));
5608
+ const sentMessageId = await this.sendMessage(scopeId, formatConfigMessage(locale, result, this.config, this.store.getCodexAuthPoolStats()), configKeyboard(locale, this.config));
5609
+ this.scheduleStalePanelDeletion(scopeId, sentMessageId);
5595
5610
  }
5596
- async handleConfigToggleCallback(event, enabled, locale) {
5597
- const update = await this.setAuthAutoDeleteNeedsRepair(enabled);
5611
+ async handleConfigToggleCallback(event, key, enabled, locale) {
5612
+ const update = await this.setFoxClawBooleanConfig(key, enabled);
5598
5613
  await this.messaging.answerCallback(event.callbackQueryId, t(locale, 'decision_recorded'));
5599
5614
  const binding = this.store.getBinding(event.scopeId);
5600
5615
  const result = await this.app.readConfig(binding?.cwd ?? this.config.defaultCwd, true);
5601
5616
  const message = `${this.formatConfigToggleUpdate(locale, update)}\n\n${formatConfigMessage(locale, result, this.config, this.store.getCodexAuthPoolStats())}`;
5602
5617
  if (event.messageId !== null) {
5603
5618
  await this.editMessage(event.scopeId, event.messageId, message, configKeyboard(locale, this.config));
5619
+ this.scheduleStalePanelDeletion(event.scopeId, event.messageId);
5604
5620
  }
5605
5621
  else {
5606
- await this.sendMessage(event.scopeId, message, configKeyboard(locale, this.config));
5622
+ const sentMessageId = await this.sendMessage(event.scopeId, message, configKeyboard(locale, this.config));
5623
+ this.scheduleStalePanelDeletion(event.scopeId, sentMessageId);
5607
5624
  }
5608
5625
  }
5609
- async setAuthAutoDeleteNeedsRepair(enabled) {
5610
- this.config.authAutoDeleteNeedsRepair = enabled;
5626
+ async setFoxClawBooleanConfig(key, enabled) {
5627
+ const envKey = key === 'auth_auto_delete'
5628
+ ? 'AUTH_AUTO_DELETE_NEEDS_REPAIR'
5629
+ : 'TELEGRAM_DELETE_TOOL_DETAILS_AFTER_FINAL';
5630
+ if (key === 'auth_auto_delete') {
5631
+ this.config.authAutoDeleteNeedsRepair = enabled;
5632
+ }
5633
+ else {
5634
+ this.config.telegramDeleteToolDetailsAfterFinal = enabled;
5635
+ }
5611
5636
  const envPath = this.config.envPath;
5612
5637
  if (!envPath) {
5613
- return { enabled, envPath: null, envUpdated: false, envError: null };
5638
+ return { key, enabled, envKey, envPath: null, envUpdated: false, envError: null };
5614
5639
  }
5615
5640
  try {
5616
- await writeEnvBoolean(envPath, 'AUTH_AUTO_DELETE_NEEDS_REPAIR', enabled);
5617
- return { enabled, envPath, envUpdated: true, envError: null };
5641
+ await writeEnvBoolean(envPath, envKey, enabled);
5642
+ return { key, enabled, envKey, envPath, envUpdated: true, envError: null };
5618
5643
  }
5619
5644
  catch (error) {
5620
- this.logger.warn('config.env_update_failed', { key: 'AUTH_AUTO_DELETE_NEEDS_REPAIR', envPath, error: toErrorMeta(error) });
5621
- return { enabled, envPath, envUpdated: false, envError: formatUserError(error) };
5645
+ this.logger.warn('config.env_update_failed', { key: envKey, envPath, error: toErrorMeta(error) });
5646
+ return { key, enabled, envKey, envPath, envUpdated: false, envError: formatUserError(error) };
5622
5647
  }
5623
5648
  }
5624
5649
  formatConfigToggleUpdate(locale, update) {
5625
- const lines = [t(locale, 'config_auth_auto_delete_updated', { value: t(locale, update.enabled ? 'yes' : 'no') })];
5650
+ const lines = [t(locale, update.key === 'auth_auto_delete' ? 'config_auth_auto_delete_updated' : 'config_delete_tool_details_updated', {
5651
+ value: t(locale, update.enabled ? 'yes' : 'no'),
5652
+ })];
5626
5653
  if (update.envError) {
5627
5654
  lines.push(t(locale, 'config_env_update_failed', { value: update.envPath ?? t(locale, 'unknown'), error: update.envError }));
5628
5655
  }
@@ -7207,9 +7234,11 @@ export class BridgeSessionCore {
7207
7234
  }
7208
7235
  if (messageId !== undefined) {
7209
7236
  await this.editMessage(scopeId, messageId, text, whereKeyboard(locale, false));
7237
+ this.scheduleStalePanelDeletion(scopeId, messageId);
7210
7238
  return;
7211
7239
  }
7212
- await this.sendMessage(scopeId, text, whereKeyboard(locale, false));
7240
+ const sentMessageId = await this.sendMessage(scopeId, text, whereKeyboard(locale, false));
7241
+ this.scheduleStalePanelDeletion(scopeId, sentMessageId);
7213
7242
  return;
7214
7243
  }
7215
7244
  const readyBinding = await this.ensureThreadReady(scopeId, binding);
@@ -7221,9 +7250,11 @@ export class BridgeSessionCore {
7221
7250
  }
7222
7251
  if (messageId !== undefined) {
7223
7252
  await this.editMessage(scopeId, messageId, text, whereKeyboard(locale, false));
7253
+ this.scheduleStalePanelDeletion(scopeId, messageId);
7224
7254
  return;
7225
7255
  }
7226
- await this.sendMessage(scopeId, text, whereKeyboard(locale, false));
7256
+ const sentMessageId = await this.sendMessage(scopeId, text, whereKeyboard(locale, false));
7257
+ this.scheduleStalePanelDeletion(scopeId, sentMessageId);
7227
7258
  return;
7228
7259
  }
7229
7260
  let text = formatWhereMessage(locale, thread, settings, this.config.defaultCwd, access, fastStatus);
@@ -7232,9 +7263,11 @@ export class BridgeSessionCore {
7232
7263
  }
7233
7264
  if (messageId !== undefined) {
7234
7265
  await this.editMessage(scopeId, messageId, text, whereKeyboard(locale, true));
7266
+ this.scheduleStalePanelDeletion(scopeId, messageId);
7235
7267
  return;
7236
7268
  }
7237
- await this.sendMessage(scopeId, text, whereKeyboard(locale, true));
7269
+ const sentMessageId = await this.sendMessage(scopeId, text, whereKeyboard(locale, true));
7270
+ this.scheduleStalePanelDeletion(scopeId, sentMessageId);
7238
7271
  }
7239
7272
  async handleThreadListNavigationCallback(event, action, locale) {
7240
7273
  const state = this.threadListPresentationState.get(event.scopeId) ?? {
@@ -7342,9 +7375,11 @@ export class BridgeSessionCore {
7342
7375
  const keyboard = buildModelSettingsKeyboard(locale, models, settings);
7343
7376
  if (messageId !== undefined) {
7344
7377
  await this.editHtmlMessage(scopeId, messageId, text, keyboard);
7378
+ this.scheduleStalePanelDeletion(scopeId, messageId);
7345
7379
  return;
7346
7380
  }
7347
- await this.sendHtmlMessage(scopeId, text, keyboard);
7381
+ const sentMessageId = await this.sendHtmlMessage(scopeId, text, keyboard);
7382
+ this.scheduleStalePanelDeletion(scopeId, sentMessageId);
7348
7383
  }
7349
7384
  async showSetupPanel(scopeId, focus, messageId, locale = this.localeForChat(scopeId)) {
7350
7385
  const models = await this.app.listModels();
@@ -7375,9 +7410,11 @@ export class BridgeSessionCore {
7375
7410
  const keyboard = buildAccessSettingsKeyboard(locale, access);
7376
7411
  if (messageId !== undefined) {
7377
7412
  await this.editHtmlMessage(scopeId, messageId, text, keyboard);
7413
+ this.scheduleStalePanelDeletion(scopeId, messageId);
7378
7414
  return;
7379
7415
  }
7380
- await this.sendHtmlMessage(scopeId, text, keyboard);
7416
+ const sentMessageId = await this.sendHtmlMessage(scopeId, text, keyboard);
7417
+ this.scheduleStalePanelDeletion(scopeId, sentMessageId);
7381
7418
  }
7382
7419
  async handleSettingsCallback(event, kind, rawValue, locale) {
7383
7420
  await this.handleSetupCallback(event, kind, rawValue, locale);
@@ -9359,6 +9396,12 @@ function formatConfigMessage(locale, result, appConfig, authPoolStats) {
9359
9396
  value: t(locale, appConfig.authAutoDeleteNeedsRepair ? 'yes' : 'no'),
9360
9397
  }));
9361
9398
  lines.push(`AUTH_AUTO_DELETE_NEEDS_REPAIR=${appConfig.authAutoDeleteNeedsRepair ? 'true' : 'false'}`);
9399
+ lines.push(t(locale, 'config_delete_tool_details_after_final', {
9400
+ value: t(locale, appConfig.telegramDeleteToolDetailsAfterFinal ? 'yes' : 'no'),
9401
+ }));
9402
+ lines.push(`TELEGRAM_DELETE_TOOL_DETAILS_AFTER_FINAL=${appConfig.telegramDeleteToolDetailsAfterFinal ? 'true' : 'false'}`);
9403
+ lines.push(t(locale, 'config_panel_ttl', { value: formatDurationMs(locale, appConfig.telegramPanelTtlMs) }));
9404
+ lines.push(`TELEGRAM_PANEL_TTL_MS=${appConfig.telegramPanelTtlMs}`);
9362
9405
  lines.push(formatCodexAuthPoolSummary(locale, authPoolStats));
9363
9406
  return lines.join('\n');
9364
9407
  }
@@ -9373,11 +9416,32 @@ function isInvalidCodexAuthDeleteReason(reason) {
9373
9416
  return reason === AUTH_DELETE_REASON_NEEDS_REPAIR;
9374
9417
  }
9375
9418
  function configKeyboard(locale, appConfig) {
9376
- const enabled = appConfig.authAutoDeleteNeedsRepair;
9377
- return [[{
9378
- text: t(locale, enabled ? 'button_config_auth_auto_delete_off' : 'button_config_auth_auto_delete_on'),
9379
- callback_data: `config:auth_auto_delete:${enabled ? 'off' : 'on'}`,
9380
- }]];
9419
+ const authAutoDeleteEnabled = appConfig.authAutoDeleteNeedsRepair;
9420
+ const deleteToolDetailsEnabled = appConfig.telegramDeleteToolDetailsAfterFinal;
9421
+ return [
9422
+ [{
9423
+ text: t(locale, authAutoDeleteEnabled ? 'button_config_auth_auto_delete_off' : 'button_config_auth_auto_delete_on'),
9424
+ callback_data: `config:auth_auto_delete:${authAutoDeleteEnabled ? 'off' : 'on'}`,
9425
+ }],
9426
+ [{
9427
+ text: t(locale, deleteToolDetailsEnabled ? 'button_config_delete_tool_details_off' : 'button_config_delete_tool_details_on'),
9428
+ callback_data: `config:delete_tool_details:${deleteToolDetailsEnabled ? 'off' : 'on'}`,
9429
+ }],
9430
+ ];
9431
+ }
9432
+ function formatDurationMs(locale, value) {
9433
+ if (value <= 0) {
9434
+ return locale === 'zh' ? '关闭' : 'disabled';
9435
+ }
9436
+ if (value % 60_000 === 0) {
9437
+ const minutes = value / 60_000;
9438
+ return locale === 'zh' ? `${minutes} 分钟` : `${minutes} min`;
9439
+ }
9440
+ if (value % 1000 === 0) {
9441
+ const seconds = value / 1000;
9442
+ return locale === 'zh' ? `${seconds} 秒` : `${seconds} sec`;
9443
+ }
9444
+ return `${value}ms`;
9381
9445
  }
9382
9446
  function parseConfigBooleanArg(value) {
9383
9447
  const normalized = value?.trim().toLowerCase();
package/dist/i18n.d.ts CHANGED
@@ -282,6 +282,8 @@ declare const MESSAGES: {
282
282
  readonly button_auth_filter_attention: "Attention";
283
283
  readonly button_config_auth_auto_delete_on: "Auto-delete on";
284
284
  readonly button_config_auth_auto_delete_off: "Auto-delete off";
285
+ readonly button_config_delete_tool_details_on: "Delete tool details";
286
+ readonly button_config_delete_tool_details_off: "Keep tool details";
285
287
  readonly another_turn_running: "Another turn is already running. Use /interrupt, /takeover, /queue, or wait.";
286
288
  readonly working: "Working...";
287
289
  readonly usage_open: "Usage: /open <n>";
@@ -617,6 +619,10 @@ declare const MESSAGES: {
617
619
  readonly config_auth_auto_delete_needs_repair: "Auto-delete unrecoverable auth candidates: {value}";
618
620
  readonly config_auth_auto_delete_updated: "Auto-delete unrecoverable auth candidates set to: {value}";
619
621
  readonly config_auth_auto_delete_usage: "Usage: /config auth_auto_delete <on|off>";
622
+ readonly config_delete_tool_details_after_final: "Delete operation details after final reply: {value}";
623
+ readonly config_delete_tool_details_updated: "Delete operation details after final reply set to: {value}";
624
+ readonly config_delete_tool_details_usage: "Usage: /config delete_tool_details <on|off>";
625
+ readonly config_panel_ttl: "Interactive panel cleanup: {value}";
620
626
  readonly config_env_update_failed: "Runtime setting changed, but updating {value} failed: {error}";
621
627
  readonly requirements_title: "Config requirements";
622
628
  readonly requirements_empty: "No config requirements are configured.";
@@ -982,6 +988,8 @@ declare const MESSAGES: {
982
988
  readonly button_auth_filter_attention: "需关注";
983
989
  readonly button_config_auth_auto_delete_on: "开启自动剔除";
984
990
  readonly button_config_auth_auto_delete_off: "关闭自动剔除";
991
+ readonly button_config_delete_tool_details_on: "删除操作明细";
992
+ readonly button_config_delete_tool_details_off: "保留操作明细";
985
993
  readonly another_turn_running: "已经有一个回复在进行中。请先等待,或使用 /interrupt、/takeover、/queue。";
986
994
  readonly working: "处理中...";
987
995
  readonly usage_open: "用法:/open <编号>";
@@ -1317,6 +1325,10 @@ declare const MESSAGES: {
1317
1325
  readonly config_auth_auto_delete_needs_repair: "自动剔除无法恢复的 auth 候选:{value}";
1318
1326
  readonly config_auth_auto_delete_updated: "自动剔除无法恢复的 auth 候选已设置为:{value}";
1319
1327
  readonly config_auth_auto_delete_usage: "用法:/config auth_auto_delete <on|off>";
1328
+ readonly config_delete_tool_details_after_final: "最终回复后删除操作明细:{value}";
1329
+ readonly config_delete_tool_details_updated: "最终回复后删除操作明细已设置为:{value}";
1330
+ readonly config_delete_tool_details_usage: "用法:/config delete_tool_details <on|off>";
1331
+ readonly config_panel_ttl: "交互面板自动清理:{value}";
1320
1332
  readonly config_env_update_failed: "运行时设置已改变,但更新 {value} 失败:{error}";
1321
1333
  readonly requirements_title: "配置要求";
1322
1334
  readonly requirements_empty: "当前没有配置要求。";
package/dist/i18n.js CHANGED
@@ -280,6 +280,8 @@ const MESSAGES = {
280
280
  button_auth_filter_attention: 'Attention',
281
281
  button_config_auth_auto_delete_on: 'Auto-delete on',
282
282
  button_config_auth_auto_delete_off: 'Auto-delete off',
283
+ button_config_delete_tool_details_on: 'Delete tool details',
284
+ button_config_delete_tool_details_off: 'Keep tool details',
283
285
  another_turn_running: 'Another turn is already running. Use /interrupt, /takeover, /queue, or wait.',
284
286
  working: 'Working...',
285
287
  usage_open: 'Usage: /open <n>',
@@ -615,6 +617,10 @@ const MESSAGES = {
615
617
  config_auth_auto_delete_needs_repair: 'Auto-delete unrecoverable auth candidates: {value}',
616
618
  config_auth_auto_delete_updated: 'Auto-delete unrecoverable auth candidates set to: {value}',
617
619
  config_auth_auto_delete_usage: 'Usage: /config auth_auto_delete <on|off>',
620
+ config_delete_tool_details_after_final: 'Delete operation details after final reply: {value}',
621
+ config_delete_tool_details_updated: 'Delete operation details after final reply set to: {value}',
622
+ config_delete_tool_details_usage: 'Usage: /config delete_tool_details <on|off>',
623
+ config_panel_ttl: 'Interactive panel cleanup: {value}',
618
624
  config_env_update_failed: 'Runtime setting changed, but updating {value} failed: {error}',
619
625
  requirements_title: 'Config requirements',
620
626
  requirements_empty: 'No config requirements are configured.',
@@ -980,6 +986,8 @@ const MESSAGES = {
980
986
  button_auth_filter_attention: '需关注',
981
987
  button_config_auth_auto_delete_on: '开启自动剔除',
982
988
  button_config_auth_auto_delete_off: '关闭自动剔除',
989
+ button_config_delete_tool_details_on: '删除操作明细',
990
+ button_config_delete_tool_details_off: '保留操作明细',
983
991
  another_turn_running: '已经有一个回复在进行中。请先等待,或使用 /interrupt、/takeover、/queue。',
984
992
  working: '处理中...',
985
993
  usage_open: '用法:/open <编号>',
@@ -1315,6 +1323,10 @@ const MESSAGES = {
1315
1323
  config_auth_auto_delete_needs_repair: '自动剔除无法恢复的 auth 候选:{value}',
1316
1324
  config_auth_auto_delete_updated: '自动剔除无法恢复的 auth 候选已设置为:{value}',
1317
1325
  config_auth_auto_delete_usage: '用法:/config auth_auto_delete <on|off>',
1326
+ config_delete_tool_details_after_final: '最终回复后删除操作明细:{value}',
1327
+ config_delete_tool_details_updated: '最终回复后删除操作明细已设置为:{value}',
1328
+ config_delete_tool_details_usage: '用法:/config delete_tool_details <on|off>',
1329
+ config_panel_ttl: '交互面板自动清理:{value}',
1318
1330
  config_env_update_failed: '运行时设置已改变,但更新 {value} 失败:{error}',
1319
1331
  requirements_title: '配置要求',
1320
1332
  requirements_empty: '当前没有配置要求。',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foxden-app/foxclaw",
3
- "version": "0.5.60",
3
+ "version": "0.5.61",
4
4
  "description": "Foxden local execution claw for controlling Codex from trusted chat interfaces.",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",