bridgerator 1.1.2 → 1.1.3

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.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "bridgerator",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "bridgerator",
9
- "version": "1.1.2",
9
+ "version": "1.1.3",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@modelcontextprotocol/sdk": "^1.29.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bridgerator",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "description": "Connect ChatGPT to your Windows PC: files, search and terminal through an outbound-only bridge with folder limits. No inbound ports, no admin rights.",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/src/bridge.mjs CHANGED
@@ -512,7 +512,7 @@ export async function startDesktopCommander(cfg, log = console.log, { ask: askAr
512
512
  const conf = gate.settings();
513
513
  return {
514
514
  state: out.paused ? 'paused' : out.linkState, name: cfg.deviceName || out.linkName, version: VERSION, paused: out.paused,
515
- email: out.email || '', plan: out.plan || null, banner: bannerNow(), setupDone: cfg.setupDone === true,
515
+ email: out.email || '', plan: out.plan || null, banner: bannerNow(), setupDone: cfg.setupDone === true, allowOpened: cfg.chatgptAllowOpened === true,
516
516
  settings: {
517
517
  confirm: conf, allowedDirectories: cfg.allowedDirectories || [], readOnlyDirectories: cfg.readOnlyDirectories || [],
518
518
  theme: popup().theme, language: cfg.language || 'en', localHistory: cfg.localHistory === true, telemetry: cfg.telemetryEnabled !== false,
@@ -594,6 +594,7 @@ export async function startDesktopCommander(cfg, log = console.log, { ask: askAr
594
594
  return { restored: r.flatMap((x) => x.restored), skipped: r.flatMap((x) => x.skipped) };
595
595
  }
596
596
  case 'undo.clear': snapshots?.clear(); return true;
597
+ case 'chatgptAllowOpened': patchConfig({ chatgptAllowOpened: true }); return true;
597
598
  case 'dismissBanner': { const b = planBanner(out.plan); if (b.dismissible) patchConfig({ planBannerDismissed: dismissFor(b) }); out.onPlan?.(); return true; }
598
599
  case 'testNotification': return ask({ head: 'Test notification', text: 'This is how Bridgerator asks before risky actions. Nothing will run.', buttons: [['allow', 'Allow', ''], ['allow10', 'Allow 10 min', ''], ['always', 'Allow always', ''], ['deny', 'Deny', 'deny']], secs: 60, auto: 'closes', ...popup() });
599
600
  case 'checkUpdate': {
package/src/tray.ps1 CHANGED
@@ -73,7 +73,7 @@ $account = if ($env:BR_ACCOUNT -match '^https://[a-z0-9.-]+(:\d+)?/app$') { $env
73
73
  $siteHost = ([Uri]$account).Host
74
74
  $send = { param($o) [BrIO]::Send(($o | ConvertTo-Json -Compress -Depth 6)) }
75
75
  # Links from the window / menu: only our own site (the main one, or the linked one), opened in the default browser.
76
- $openUrl = { param($u) try { $x = [Uri]$u; if ($x.Scheme -eq 'https' -and ($x.Host -eq 'bridgerator.recondeck.com' -or $x.Host -eq $siteHost) -and -not $x.UserInfo) { Start-Process $x.AbsoluteUri } } catch {} }
76
+ $openUrl = { param($u) try { $x = [Uri]$u; if ($x.Scheme -eq 'https' -and ($x.Host -eq 'bridgerator.recondeck.com' -or $x.Host -eq $siteHost -or ($x.Host -eq 'chatgpt.com' -and $x.AbsolutePath -like '/settings/*')) -and -not $x.UserInfo) { Start-Process $x.AbsoluteUri } } catch {} }
77
77
  $openAccount = { & $openUrl $account }
78
78
  $g0 = [Drawing.Graphics]::FromHwnd([IntPtr]::Zero); $script:dpi = $g0.DpiX / 96.0; $g0.Dispose()
79
79
  if ($env:BR_DPI) { $script:dpi = [double]$env:BR_DPI } # test harness: simulate scaling
package/ui/app.js CHANGED
@@ -171,6 +171,9 @@ function awakeLine() {
171
171
  const k = s.keepAwake === false ? 'status.awakeOff' : a.on ? 'status.awakeOn' : a.want && !a.ac ? 'status.awakeBattery' : 'status.awakeIdle';
172
172
  return `<div class="awake-line ${a.on ? 'on' : ''}"><span class="dot ${a.on ? 'online' : 'offline'}"></span>${esc(t(k))}</div>`;
173
173
  }
174
+ // The Bridgerator app's "Permission" page in ChatGPT (App ID of the store app). Owner 26.10: on first use ChatGPT
175
+ // asks before most actions ("Allow low-risk"); one switch to "Allow all" stops that, like Desktop Commander.
176
+ const CHATGPT_PERMISSIONS = 'https://chatgpt.com/settings/plugins-settings/plugin_asdk_app_6ad78d4a3c408191a9215fd304394c4a/permissions';
174
177
  P.home = () => {
175
178
  const st = state.state || 'offline';
176
179
  const c = state.queue || {};
@@ -193,7 +196,7 @@ P.home = () => {
193
196
  <a class="card tile" href="#recent"><span class="k">${esc(t('status.cardLast'))}</span><span class="v">${esc(last ? ago(last.t) : t('status.never'))}</span><span class="s" title="${esc(last ? `${last.tool} · ${last.target}` : '')}">${esc(last ? [last.tool, lastTarget(last.target)].filter(Boolean).join(' · ') : t('status.noActions'))}</span></a>
194
197
  </div>
195
198
  <section class="card steps" aria-label="${esc(t('aria.getStarted'))}">
196
- <div class="step ok"><span class="check ok">${CHECK(12, 3.5)}</span><span class="grow t">${esc(t('status.step1'))}</span></div>
199
+ <div class="step ${state.allowOpened ? 'ok' : ''}"><span class="check ${state.allowOpened ? 'ok' : 'next'}">${state.allowOpened ? CHECK(12, 3.5) : ''}</span><div class="stack"><span class="t">${esc(t('status.stepAllow'))}</span>${state.allowOpened ? '' : `<span class="h">${esc(t('status.stepAllowHint'))}</span>`}</div>${state.allowOpened ? '' : `<button class="btn btn-secondary w112" data-act="chatgptAllow">${esc(t('status.stepAllowBtn'))}</button>`}</div>
197
200
  <div class="step ${state.setupDone ? 'ok' : ''}"><span class="check ${state.setupDone ? 'ok' : 'next'}">${state.setupDone ? CHECK(12, 3.5) : ''}</span><div class="stack"><span class="t">${esc(t('status.step2'))}</span>${state.setupDone ? '' : `<span class="h">${esc(t('status.step2Hint'))} <span class="mono">${esc(t('status.step2Phrase'))}</span></span>`}</div>${state.setupDone ? '' : `<button class="btn btn-secondary w112" data-copy="${esc(t('status.step2Phrase'))}">${esc(t('status.copyPhrase'))}</button>`}</div>
198
201
  <div class="step ${anyTodo ? 'ok' : ''}"><span class="check ${anyTodo ? 'ok' : state.setupDone ? 'next' : ''}">${anyTodo ? CHECK(12, 3.5) : ''}</span><div class="stack"><span class="t">${esc(t('status.step3'))}</span>${anyTodo ? '' : `<span class="h">${esc(t('status.step3Hint'))} <span class="mono">${esc(t('talk.work'))}</span></span>`}</div>${anyTodo ? '' : `<a class="btn btn-secondary w112" href="#queue">${esc(t('status.openQueue'))}</a>`}</div>
199
202
  </section></main>`;
@@ -788,6 +791,7 @@ document.addEventListener('click', async (e) => {
788
791
  case 'support': return rpc('openUrl', { url: 'https://bridgerator.recondeck.com/support' }).catch(fail);
789
792
  case 'plan': return rpc('openUrl', { url: state.banner?.url || state.plan?.renewUrl || 'https://bridgerator.recondeck.com/app' }).catch(fail);
790
793
  case 'dismissBanner': return rpc('dismissBanner').then(() => refresh(), fail);
794
+ case 'chatgptAllow': return rpc('openUrl', { url: CHATGPT_PERMISSIONS }).then(() => rpc('chatgptAllowOpened')).then(() => refresh(), fail);
791
795
  case 'pause': case 'resume': return rpc(d.act).then(() => refresh(), fail);
792
796
  case 'addTask': return taskDialog(null);
793
797
  case 'allowAll': return setSetting('allowedDirectories', []);
package/ui/i18n/en.json CHANGED
@@ -57,7 +57,9 @@
57
57
  "agoMin": "{n} min ago",
58
58
  "agoHour": "{n} h ago",
59
59
  "agoDay": "{n} d ago",
60
- "step1": "Link this PC to your account",
60
+ "stepAllow": "Let ChatGPT work without asking each time",
61
+ "stepAllowHint": "In ChatGPT: Bridgerator → Permission → Allow all",
62
+ "stepAllowBtn": "Open",
61
63
  "step2": "Set up with ChatGPT",
62
64
  "step2Hint": "In ChatGPT, say:",
63
65
  "step2Phrase": "Set up Bridgerator",
package/ui/i18n/ru.json CHANGED
@@ -57,7 +57,9 @@
57
57
  "agoMin": "{n} мин назад",
58
58
  "agoHour": "{n} ч назад",
59
59
  "agoDay": "{n} дн. назад",
60
- "step1": "Привязать ПК к аккаунту",
60
+ "stepAllow": "ChatGPT работает без лишних вопросов",
61
+ "stepAllowHint": "В ChatGPT: Bridgerator → Permission → Allow all",
62
+ "stepAllowBtn": "Открыть",
61
63
  "step2": "Настроить вместе с ChatGPT",
62
64
  "step2Hint": "Скажите в ChatGPT:",
63
65
  "step2Phrase": "Set up Bridgerator",