bingocode 1.1.200-beta.0 → 1.1.200-beta.1

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.200-beta.0",
3
+ "version": "1.1.200-beta.1",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "claude": "bin/claude-win.cjs",
@@ -97,9 +97,6 @@ export const ProviderPanel: React.FC<{
97
97
  const [currentSlotName, setCurrentSlotName] = useState<string>('main');
98
98
  const [slotLoadingMsg, setSlotLoadingMsg] = useState<string>('');
99
99
 
100
- // VS Code link status
101
- const [vscodeLinked, setVscodeLinked] = useState(false);
102
- const [vscodeLinkedPaths, setVscodeLinkedPaths] = useState<string[]>([]);
103
100
 
104
101
 
105
102
  const base = apiUrl.replace(/\/+$/, '');
@@ -147,16 +144,6 @@ export const ProviderPanel: React.FC<{
147
144
  loadPresets();
148
145
  }, [loadProviders, loadPresets]);
149
146
 
150
- // Fetch VS Code link status on mount
151
- useEffect(() => {
152
- axios.get(`${base}/api/providers/link-vscode`)
153
- .then(r => {
154
- setVscodeLinked(r.data.linked);
155
- setVscodeLinkedPaths(r.data.paths || []);
156
- })
157
- .catch(() => {});
158
- }, [base]);
159
-
160
147
  // Key processing for Page Up/Down and Arrow keys in scrolling lists
161
148
  useEffect(() => {
162
149
  const handler = (buf: Buffer) => {
@@ -331,7 +318,6 @@ export const ProviderPanel: React.FC<{
331
318
  { label: 'Add Provider', value: 'add' },
332
319
  { label: 'Edit Provider (Name/Key)', value: 'edit' },
333
320
  { label: 'Configure Slots', value: 'slots' },
334
- { label: vscodeLinked ? `Disconnect from VS Code (${vscodeLinkedPaths.length} editor(s))` : 'Connect to VS Code', value: 'link_vscode' },
335
321
  { label: 'Connectivity Test', value: 'test' },
336
322
  { label: 'Delete Provider', value: 'delete' },
337
323
  { label: 'Refresh', value: 'refresh' },
@@ -360,34 +346,7 @@ export const ProviderPanel: React.FC<{
360
346
  setStage('slot_config');
361
347
  setListOffset(0);
362
348
  break;
363
- case 'link_vscode':
364
- setOpMsg(null);
365
- setErr(null);
366
- if (vscodeLinked) {
367
- // Unlink
368
- axios.delete(`${base}/api/providers/link-vscode`)
369
- .then(() => {
370
- setVscodeLinked(false);
371
- setVscodeLinkedPaths([]);
372
- setOpMsg('Disconnected from VS Code.');
373
- })
374
- .catch(e => {
375
- setErr((e as any)?.response?.data?.message || (e as any)?.message || 'Failed to disconnect VS Code');
376
- });
377
- } else {
378
- // Link
379
- axios.post(`${base}/api/providers/link-vscode`)
380
- .then(r => {
381
- setVscodeLinked(true);
382
- setVscodeLinkedPaths(r.data.paths || []);
383
- setOpMsg(`Connected to VS Code (${(r.data.paths || []).length} editor(s)).`);
384
- })
385
- .catch(e => {
386
- setErr((e as any)?.response?.data?.message || (e as any)?.message || 'Failed to connect VS Code');
387
- });
388
- }
389
- break;
390
- case 'test':
349
+ case 'test':
391
350
  setStage('test_select');
392
351
  setListOffset(0);
393
352
  break;
@@ -229,6 +229,9 @@ const i18nMap = {
229
229
  bypassPermsLabel: 'Bypass',
230
230
  bypassPermsOn: '已开启',
231
231
  bypassPermsOff: '已关闭',
232
+ vscodeLabel: 'Connect to VS Code',
233
+ vscodeOn: '已连接',
234
+ vscodeOff: '未连接',
232
235
  },
233
236
  en: {
234
237
  menu: {
@@ -268,6 +271,9 @@ const i18nMap = {
268
271
  bypassPermsLabel: 'Bypass',
269
272
  bypassPermsOn: 'Enabled',
270
273
  bypassPermsOff: 'Disabled',
274
+ vscodeLabel: 'Connect to VS Code',
275
+ vscodeOn: 'Connected',
276
+ vscodeOff: 'Disconnected',
271
277
  },
272
278
  ja: {
273
279
  menu: {
@@ -307,6 +313,9 @@ const i18nMap = {
307
313
  bypassPermsLabel: 'Bypass',
308
314
  bypassPermsOn: '有効',
309
315
  bypassPermsOff: '無効',
316
+ vscodeLabel: 'Connect to VS Code',
317
+ vscodeOn: '接続済',
318
+ vscodeOff: '未接続',
310
319
  },
311
320
  };
312
321
 
@@ -429,6 +438,9 @@ export const CliMenuManager: React.FC = () => {
429
438
  if (typeof bSettings.bypassPermsEnabled === 'boolean') {
430
439
  setBypassPermsEnabled(bSettings.bypassPermsEnabled);
431
440
  }
441
+ if (typeof bSettings.vscodeLinked === 'boolean') {
442
+ setVscodeLinked(bSettings.vscodeLinked);
443
+ }
432
444
  } catch {}
433
445
  }, []);
434
446
 
@@ -488,6 +500,7 @@ export const CliMenuManager: React.FC = () => {
488
500
  const [settingsCursor, setSettingsCursor] = useState(0);
489
501
  const [autoModeEnabled, setAutoModeEnabled] = useState(false);
490
502
  const [bypassPermsEnabled, setBypassPermsEnabled] = useState(false);
503
+ const [vscodeLinked, setVscodeLinked] = useState(false);
491
504
 
492
505
  // Top toolbar state
493
506
  const [animEnabled, setAnimEnabled] = useState(true);
@@ -875,7 +888,7 @@ export const CliMenuManager: React.FC = () => {
875
888
  if (!showHelp && page === 'settings') {
876
889
  if (settingsStage === 'list') {
877
890
  // +1 for the fixed Language row prepended before settingData entries
878
- const totalRows = 3 + (settingData && typeof settingData === 'object' ? Object.keys(settingData).length : 0);
891
+ const totalRows = 4 + (settingData && typeof settingData === 'object' ? Object.keys(settingData).length : 0);
879
892
  const visible = Math.max(1, MID_H - 2);
880
893
  if (key.downArrow || input === 'j') {
881
894
  setSettingsCursor(c => Math.min(totalRows - 1, c + 1));
@@ -923,12 +936,33 @@ export const CliMenuManager: React.FC = () => {
923
936
  }
924
937
  return next;
925
938
  });
939
+ } else if (settingsCursor === 3) {
940
+ // Row 3: toggle VS Code link
941
+ const port = (process.env.BINGO_PORT ? parseInt(process.env.BINGO_PORT) : 3456) || 3456;
942
+ const apiBase = process.env.BASE_API_URL || `http://127.0.0.1:${port}`;
943
+ setVscodeLinked(prev => {
944
+ const next = !prev;
945
+ try {
946
+ writeBingoSettings({ vscodeLinked: next });
947
+ } catch {
948
+ return prev;
949
+ }
950
+ const http = require('http');
951
+ if (next) {
952
+ http.request(`${apiBase}/api/providers/link-vscode`, { method: 'POST' })
953
+ .on('error', () => {}).end();
954
+ } else {
955
+ http.request(`${apiBase}/api/providers/link-vscode`, { method: 'DELETE' })
956
+ .on('error', () => {}).end();
957
+ }
958
+ return next;
959
+ });
926
960
  }
927
961
  }
928
962
  }
929
963
  // langPicker stage: ESC handled above; selection via SelectInput onSelect
930
964
  }
931
- }, [menuItems, page, historyMenuStage, historyList, historyHasMore, navIndex, sessionMessages, settingData, MID_H, MSGS_PAGE_SIZE, showHelp, theme, settingsStage, settingsCursor, autoModeEnabled, bypassPermsEnabled]);
965
+ }, [menuItems, page, historyMenuStage, historyList, historyHasMore, navIndex, sessionMessages, settingData, MID_H, MSGS_PAGE_SIZE, showHelp, theme, settingsStage, settingsCursor, autoModeEnabled, bypassPermsEnabled, vscodeLinked]);
932
966
 
933
967
  function cleanText(text: string): string {
934
968
  return String(text ?? '').replace(/[\n\r]+/g, ' ').replace(/\u001b\[[0-9;]*m/g, '').trim();
@@ -1412,6 +1446,7 @@ export const CliMenuManager: React.FC = () => {
1412
1446
  { key: '__lang', label: tS.langLabel, value: currentLangLabel, interactive: true },
1413
1447
  { key: '__autoMode', label: tS.autoModeLabel, value: autoModeEnabled ? tS.autoModeOn : tS.autoModeOff, interactive: true },
1414
1448
  { key: '__bypassPerms', label: tS.bypassPermsLabel, value: bypassPermsEnabled ? tS.bypassPermsOn : tS.bypassPermsOff, interactive: true },
1449
+ { key: '__vscode', label: tS.vscodeLabel, value: vscodeLinked ? tS.vscodeOn : tS.vscodeOff, interactive: true },
1415
1450
  ];
1416
1451
  const dataEntries = settingData && typeof settingData === 'object' ? Object.entries(settingData) : [];
1417
1452
  const dataRows: SettingRow[] = dataEntries.map(([k, v]) => ({