bingocode 1.1.145 → 1.1.146

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bingocode",
3
- "version": "1.1.145",
3
+ "version": "1.1.146",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "claude": "bin/claude-win.cjs",
@@ -115,8 +115,11 @@ const i18nMap = {
115
115
  settingsTitle: '设置',
116
116
  langLabel: '语言',
117
117
  langPickerTitle: '选择语言',
118
- settingsHint: '↑/k ↓/j 滚动 · ↩ 编辑 · ESC 返回',
118
+ settingsHint: '↑/k ↓/j 滚动 · ↩ 切换 · ESC 返回',
119
119
  langOptions: LANG_OPTIONS,
120
+ autoModeLabel: 'Auto Mode',
121
+ autoModeOn: '已开启',
122
+ autoModeOff: '已关闭',
120
123
  },
121
124
  en: {
122
125
  menu: {
@@ -148,8 +151,11 @@ const i18nMap = {
148
151
  settingsTitle: 'Settings',
149
152
  langLabel: 'Language',
150
153
  langPickerTitle: 'Select Language',
151
- settingsHint: '↑/k ↓/j scroll · ↩ edit · ESC back',
154
+ settingsHint: '↑/k ↓/j scroll · ↩ toggle · ESC back',
152
155
  langOptions: LANG_OPTIONS,
156
+ autoModeLabel: 'Auto Mode',
157
+ autoModeOn: 'Enabled',
158
+ autoModeOff: 'Disabled',
153
159
  },
154
160
  ja: {
155
161
  menu: {
@@ -181,8 +187,11 @@ const i18nMap = {
181
187
  settingsTitle: '設定',
182
188
  langLabel: '言語',
183
189
  langPickerTitle: '言語を選択',
184
- settingsHint: '↑/k ↓/j スクロール · ↩ 編集 · ESC 戻る',
190
+ settingsHint: '↑/k ↓/j スクロール · ↩ 切替 · ESC 戻る',
185
191
  langOptions: LANG_OPTIONS,
192
+ autoModeLabel: 'Auto Mode',
193
+ autoModeOn: '有効',
194
+ autoModeOff: '無効',
186
195
  },
187
196
  };
188
197
 
@@ -299,6 +308,9 @@ export const CliMenuManager: React.FC = () => {
299
308
  }
300
309
  if (typeof cfg.uiAnimEnabled === 'boolean') setAnimEnabled(cfg.uiAnimEnabled);
301
310
  if (typeof cfg.uiTipsEnabled === 'boolean') setTipsEnabled(cfg.uiTipsEnabled);
311
+ const gbFeatures = cfg.cachedGrowthBookFeatures ?? {};
312
+ const autoModeCfg = gbFeatures['tengu_auto_mode_config'] as { enabled?: string } | undefined;
313
+ setAutoModeEnabled(autoModeCfg?.enabled === 'enabled');
302
314
  } catch (e) {
303
315
  // Silently fail if config has issues
304
316
  }
@@ -349,6 +361,7 @@ export const CliMenuManager: React.FC = () => {
349
361
  const [setErr, setSetErr] = useState<string | null>(null);
350
362
  const [settingsStage, setSettingsStage] = useState<'list' | 'langPicker'>('list');
351
363
  const [settingsCursor, setSettingsCursor] = useState(0);
364
+ const [autoModeEnabled, setAutoModeEnabled] = useState(false);
352
365
 
353
366
  // Top toolbar state
354
367
  const [animEnabled, setAnimEnabled] = useState(true);
@@ -744,7 +757,7 @@ export const CliMenuManager: React.FC = () => {
744
757
  if (!showHelp && page === 'settings') {
745
758
  if (settingsStage === 'list') {
746
759
  // +1 for the fixed Language row prepended before settingData entries
747
- const totalRows = 1 + (settingData && typeof settingData === 'object' ? Object.keys(settingData).length : 0);
760
+ const totalRows = 2 + (settingData && typeof settingData === 'object' ? Object.keys(settingData).length : 0);
748
761
  const visible = Math.max(1, MID_H - 2);
749
762
  if (key.downArrow || input === 'j') {
750
763
  setSettingsCursor(c => Math.min(totalRows - 1, c + 1));
@@ -758,12 +771,29 @@ export const CliMenuManager: React.FC = () => {
758
771
  // Row 0 is the interactive Language row
759
772
  if (settingsCursor === 0) {
760
773
  setSettingsStage('langPicker');
774
+ } else if (settingsCursor === 1) {
775
+ // Row 1: toggle Auto Mode, persist to ~/.claude.json
776
+ setAutoModeEnabled(prev => {
777
+ const next = !prev;
778
+ try {
779
+ saveGlobalConfig(current => ({
780
+ ...current,
781
+ cachedGrowthBookFeatures: {
782
+ ...current.cachedGrowthBookFeatures,
783
+ tengu_auto_mode_config: next
784
+ ? { enabled: 'enabled', allowModels: ['*'] }
785
+ : { enabled: 'disabled' },
786
+ },
787
+ }));
788
+ } catch {}
789
+ return next;
790
+ });
761
791
  }
762
792
  }
763
793
  }
764
794
  // langPicker stage: ESC handled above; selection via SelectInput onSelect
765
795
  }
766
- }, [menuItems, page, historyMenuStage, historyList, historyHasMore, navIndex, sessionMessages, settingData, MID_H, MSGS_PAGE_SIZE, showHelp, theme, settingsStage, settingsCursor]);
796
+ }, [menuItems, page, historyMenuStage, historyList, historyHasMore, navIndex, sessionMessages, settingData, MID_H, MSGS_PAGE_SIZE, showHelp, theme, settingsStage, settingsCursor, autoModeEnabled]);
767
797
 
768
798
  function cleanText(text: string): string {
769
799
  return String(text ?? '').replace(/[\n\r]+/g, ' ').replace(/\u001b\[[0-9;]*m/g, '').trim();
@@ -1249,6 +1279,7 @@ export const CliMenuManager: React.FC = () => {
1249
1279
  type SettingRow = { key: string; label: string; value: string; interactive: boolean };
1250
1280
  const fixedRows: SettingRow[] = [
1251
1281
  { key: '__lang', label: tS.langLabel, value: currentLangLabel, interactive: true },
1282
+ { key: '__autoMode', label: tS.autoModeLabel, value: autoModeEnabled ? tS.autoModeOn : tS.autoModeOff, interactive: true },
1252
1283
  ];
1253
1284
  const dataEntries = settingData && typeof settingData === 'object' ? Object.entries(settingData) : [];
1254
1285
  const dataRows: SettingRow[] = dataEntries.map(([k, v]) => ({
@@ -176,7 +176,7 @@ export function modelSupportsAutoMode(model: string): boolean {
176
176
  const rawLower = model.toLowerCase()
177
177
  if (
178
178
  config?.allowModels?.some(
179
- am => am.toLowerCase() === rawLower || am.toLowerCase() === m,
179
+ am => am === '*' || am.toLowerCase() === rawLower || am.toLowerCase() === m,
180
180
  )
181
181
  ) {
182
182
  return true