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.
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/src/bridge.mjs +2 -1
- package/src/tray.ps1 +1 -1
- package/ui/app.js +5 -1
- package/ui/i18n/en.json +3 -1
- package/ui/i18n/ru.json +3 -1
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bridgerator",
|
|
3
|
-
"version": "1.1.
|
|
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.
|
|
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.
|
|
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="
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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",
|