@tianshu-ai/local-bridge 0.8.0 → 0.9.0
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/dist/settings-window.js +257 -0
- package/dist/settings-window.js.map +1 -0
- package/dist/tray.js +47 -7
- package/dist/tray.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
// A native settings window for the tray, per platform, using each OS's
|
|
2
|
+
// own GUI toolkit — no bundled runtime, no extra install (the same
|
|
3
|
+
// philosophy as the macOS Swift menu-bar app).
|
|
4
|
+
//
|
|
5
|
+
// Windows → PowerShell + System.Windows.Forms (ships with Windows)
|
|
6
|
+
// macOS → AppleScript dialogs (osascript, ships with macOS)
|
|
7
|
+
// Linux → fall back to opening the JSON in the default editor
|
|
8
|
+
//
|
|
9
|
+
// The window reads the current config.json, lets the user edit the same
|
|
10
|
+
// fields the Swift app exposes (server / token / browser+engine+headless
|
|
11
|
+
// / shell / device), and writes config.json back on Save. Runs the GUI
|
|
12
|
+
// as a detached child so it doesn't block the tray.
|
|
13
|
+
import { spawn } from "node:child_process";
|
|
14
|
+
import fs from "node:fs";
|
|
15
|
+
import os from "node:os";
|
|
16
|
+
import path from "node:path";
|
|
17
|
+
/**
|
|
18
|
+
* Open a native settings window. Best-effort, non-blocking. On success
|
|
19
|
+
* the GUI writes the edited config to `configPath` itself; the caller
|
|
20
|
+
* can re-read config after the window closes (or just on next Start).
|
|
21
|
+
*
|
|
22
|
+
* Returns true if a native window was launched, false if we fell back
|
|
23
|
+
* to opening the raw file (Linux / unsupported).
|
|
24
|
+
*/
|
|
25
|
+
export function openSettingsWindow(configPath, current) {
|
|
26
|
+
if (process.platform === "win32") {
|
|
27
|
+
return openWindowsForm(configPath, current);
|
|
28
|
+
}
|
|
29
|
+
if (process.platform === "darwin") {
|
|
30
|
+
return openMacDialogs(configPath, current);
|
|
31
|
+
}
|
|
32
|
+
return false; // Linux: caller opens the file instead
|
|
33
|
+
}
|
|
34
|
+
// ─── Windows: PowerShell + WinForms ─────────────────────────────────
|
|
35
|
+
function openWindowsForm(configPath, cur) {
|
|
36
|
+
const scriptPath = path.join(os.tmpdir(), `tsbridge-settings-${process.pid}.ps1`);
|
|
37
|
+
const ps = renderWindowsPs1(configPath, cur);
|
|
38
|
+
try {
|
|
39
|
+
fs.writeFileSync(scriptPath, ps, "utf8");
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
// -STA is required for WinForms; -WindowStyle Hidden hides the PS
|
|
46
|
+
// console so only the form shows.
|
|
47
|
+
const child = spawn("powershell.exe", [
|
|
48
|
+
"-NoProfile",
|
|
49
|
+
"-ExecutionPolicy",
|
|
50
|
+
"Bypass",
|
|
51
|
+
"-STA",
|
|
52
|
+
"-WindowStyle",
|
|
53
|
+
"Hidden",
|
|
54
|
+
"-File",
|
|
55
|
+
scriptPath,
|
|
56
|
+
], { stdio: "ignore", detached: true, windowsHide: true });
|
|
57
|
+
// Swallow spawn errors (e.g. powershell missing) so they don't crash
|
|
58
|
+
// the tray process; the caller falls back to opening the raw file.
|
|
59
|
+
child.on("error", () => { });
|
|
60
|
+
child.unref();
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** PowerShell-single-quote-escape a JS string. */
|
|
68
|
+
function psq(s) {
|
|
69
|
+
return `'${String(s).replace(/'/g, "''")}'`;
|
|
70
|
+
}
|
|
71
|
+
function renderWindowsPs1(configPath, cur) {
|
|
72
|
+
// The script builds a WinForms dialog, prefilled with current values,
|
|
73
|
+
// and on OK writes config.json (merging into whatever is already there
|
|
74
|
+
// so we don't clobber unknown keys).
|
|
75
|
+
const cfgPathLit = psq(configPath);
|
|
76
|
+
return `
|
|
77
|
+
Add-Type -AssemblyName System.Windows.Forms
|
|
78
|
+
Add-Type -AssemblyName System.Drawing
|
|
79
|
+
|
|
80
|
+
$configPath = ${cfgPathLit}
|
|
81
|
+
|
|
82
|
+
$form = New-Object System.Windows.Forms.Form
|
|
83
|
+
$form.Text = 'Tianshu Bridge — Settings'
|
|
84
|
+
$form.Size = New-Object System.Drawing.Size(460, 380)
|
|
85
|
+
$form.StartPosition = 'CenterScreen'
|
|
86
|
+
$form.FormBorderStyle = 'FixedDialog'
|
|
87
|
+
$form.MaximizeBox = $false
|
|
88
|
+
$form.MinimizeBox = $false
|
|
89
|
+
|
|
90
|
+
function New-Label($text, $y) {
|
|
91
|
+
$l = New-Object System.Windows.Forms.Label
|
|
92
|
+
$l.Text = $text
|
|
93
|
+
$l.Location = New-Object System.Drawing.Point(16, $y)
|
|
94
|
+
$l.Size = New-Object System.Drawing.Size(120, 20)
|
|
95
|
+
$form.Controls.Add($l)
|
|
96
|
+
return $l
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
# Server
|
|
100
|
+
New-Label 'Server URL' 20 | Out-Null
|
|
101
|
+
$server = New-Object System.Windows.Forms.TextBox
|
|
102
|
+
$server.Location = New-Object System.Drawing.Point(140, 18)
|
|
103
|
+
$server.Size = New-Object System.Drawing.Size(290, 20)
|
|
104
|
+
$server.Text = ${psq(cur.server)}
|
|
105
|
+
$form.Controls.Add($server)
|
|
106
|
+
|
|
107
|
+
# Token
|
|
108
|
+
New-Label 'Token' 52 | Out-Null
|
|
109
|
+
$token = New-Object System.Windows.Forms.TextBox
|
|
110
|
+
$token.Location = New-Object System.Drawing.Point(140, 50)
|
|
111
|
+
$token.Size = New-Object System.Drawing.Size(290, 20)
|
|
112
|
+
$token.Text = ${psq(cur.token)}
|
|
113
|
+
$form.Controls.Add($token)
|
|
114
|
+
|
|
115
|
+
# Device
|
|
116
|
+
New-Label 'Device (optional)' 84 | Out-Null
|
|
117
|
+
$device = New-Object System.Windows.Forms.TextBox
|
|
118
|
+
$device.Location = New-Object System.Drawing.Point(140, 82)
|
|
119
|
+
$device.Size = New-Object System.Drawing.Size(290, 20)
|
|
120
|
+
$device.Text = ${psq(cur.device)}
|
|
121
|
+
$form.Controls.Add($device)
|
|
122
|
+
|
|
123
|
+
# Browser enabled
|
|
124
|
+
$browser = New-Object System.Windows.Forms.CheckBox
|
|
125
|
+
$browser.Text = 'Expose browser tools'
|
|
126
|
+
$browser.Location = New-Object System.Drawing.Point(140, 116)
|
|
127
|
+
$browser.Size = New-Object System.Drawing.Size(290, 20)
|
|
128
|
+
$browser.Checked = $${cur.browser ? "true" : "false"}
|
|
129
|
+
$form.Controls.Add($browser)
|
|
130
|
+
|
|
131
|
+
# Engine
|
|
132
|
+
New-Label 'Browser engine' 148 | Out-Null
|
|
133
|
+
$engine = New-Object System.Windows.Forms.ComboBox
|
|
134
|
+
$engine.Location = New-Object System.Drawing.Point(140, 146)
|
|
135
|
+
$engine.Size = New-Object System.Drawing.Size(150, 20)
|
|
136
|
+
$engine.DropDownStyle = 'DropDownList'
|
|
137
|
+
[void]$engine.Items.Add('own')
|
|
138
|
+
[void]$engine.Items.Add('stealth')
|
|
139
|
+
$engine.SelectedItem = ${psq(cur.engine)}
|
|
140
|
+
$form.Controls.Add($engine)
|
|
141
|
+
|
|
142
|
+
# Headless
|
|
143
|
+
$headless = New-Object System.Windows.Forms.CheckBox
|
|
144
|
+
$headless.Text = 'Headless (no browser window)'
|
|
145
|
+
$headless.Location = New-Object System.Drawing.Point(140, 178)
|
|
146
|
+
$headless.Size = New-Object System.Drawing.Size(290, 20)
|
|
147
|
+
$headless.Checked = $${cur.headless ? "true" : "false"}
|
|
148
|
+
$form.Controls.Add($headless)
|
|
149
|
+
|
|
150
|
+
# Shell
|
|
151
|
+
$shell = New-Object System.Windows.Forms.CheckBox
|
|
152
|
+
$shell.Text = 'Expose shell (exec + file sync) — runs commands on this machine'
|
|
153
|
+
$shell.Location = New-Object System.Drawing.Point(140, 210)
|
|
154
|
+
$shell.Size = New-Object System.Drawing.Size(300, 34)
|
|
155
|
+
$shell.Checked = $${cur.shell ? "true" : "false"}
|
|
156
|
+
$form.Controls.Add($shell)
|
|
157
|
+
|
|
158
|
+
# Buttons
|
|
159
|
+
$ok = New-Object System.Windows.Forms.Button
|
|
160
|
+
$ok.Text = 'Save'
|
|
161
|
+
$ok.Location = New-Object System.Drawing.Point(250, 300)
|
|
162
|
+
$ok.Size = New-Object System.Drawing.Size(85, 28)
|
|
163
|
+
$ok.DialogResult = [System.Windows.Forms.DialogResult]::OK
|
|
164
|
+
$form.Controls.Add($ok)
|
|
165
|
+
$form.AcceptButton = $ok
|
|
166
|
+
|
|
167
|
+
$cancel = New-Object System.Windows.Forms.Button
|
|
168
|
+
$cancel.Text = 'Cancel'
|
|
169
|
+
$cancel.Location = New-Object System.Drawing.Point(345, 300)
|
|
170
|
+
$cancel.Size = New-Object System.Drawing.Size(85, 28)
|
|
171
|
+
$cancel.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
|
|
172
|
+
$form.Controls.Add($cancel)
|
|
173
|
+
$form.CancelButton = $cancel
|
|
174
|
+
|
|
175
|
+
$result = $form.ShowDialog()
|
|
176
|
+
if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
|
|
177
|
+
# Merge into existing config so unknown keys survive.
|
|
178
|
+
$cfg = @{}
|
|
179
|
+
if (Test-Path $configPath) {
|
|
180
|
+
try { $cfg = Get-Content $configPath -Raw | ConvertFrom-Json -AsHashtable } catch { $cfg = @{} }
|
|
181
|
+
}
|
|
182
|
+
if ($null -eq $cfg) { $cfg = @{} }
|
|
183
|
+
$cfg['server'] = $server.Text
|
|
184
|
+
$cfg['token'] = $token.Text
|
|
185
|
+
$cfg['device'] = $device.Text
|
|
186
|
+
$cfg['browser'] = [bool]$browser.Checked
|
|
187
|
+
$cfg['engine'] = [string]$engine.SelectedItem
|
|
188
|
+
$cfg['headless'] = [bool]$headless.Checked
|
|
189
|
+
$cfg['shell'] = [bool]$shell.Checked
|
|
190
|
+
$dir = Split-Path -Parent $configPath
|
|
191
|
+
if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Path $dir -Force | Out-Null }
|
|
192
|
+
($cfg | ConvertTo-Json -Depth 10) | Set-Content -Path $configPath -Encoding UTF8
|
|
193
|
+
}
|
|
194
|
+
`;
|
|
195
|
+
}
|
|
196
|
+
// ─── macOS: AppleScript dialogs ─────────────────────────────────────
|
|
197
|
+
//
|
|
198
|
+
// A lightweight multi-field settings flow via osascript. Not as slick as
|
|
199
|
+
// the Swift app's form, but keeps parity if someone runs the CLI tray on
|
|
200
|
+
// macOS instead of the .app. Presents fields sequentially.
|
|
201
|
+
function openMacDialogs(configPath, cur) {
|
|
202
|
+
// Keep it simple + non-blocking: one AppleScript that chains dialogs
|
|
203
|
+
// and writes the JSON via `defaults`-free plain file write in the
|
|
204
|
+
// script tail. We build the whole thing as one osascript -e program.
|
|
205
|
+
const script = renderMacOsa(configPath, cur);
|
|
206
|
+
try {
|
|
207
|
+
const child = spawn("osascript", ["-e", script], {
|
|
208
|
+
stdio: "ignore",
|
|
209
|
+
detached: true,
|
|
210
|
+
});
|
|
211
|
+
child.on("error", () => { });
|
|
212
|
+
child.unref();
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/** AppleScript-double-quote-escape. */
|
|
220
|
+
function asq(s) {
|
|
221
|
+
return `"${String(s).replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
222
|
+
}
|
|
223
|
+
function renderMacOsa(configPath, cur) {
|
|
224
|
+
// Prompt for server + token + engine + toggles, then shell out to a
|
|
225
|
+
// tiny writer. Fields are gathered with `display dialog`; booleans via
|
|
226
|
+
// `choose from list`. This is intentionally minimal.
|
|
227
|
+
const p = asq(configPath);
|
|
228
|
+
return [
|
|
229
|
+
`set cfgPath to ${p}`,
|
|
230
|
+
`set srv to text returned of (display dialog "Server URL" default answer ${asq(cur.server)})`,
|
|
231
|
+
`set tok to text returned of (display dialog "Token (blank for none)" default answer ${asq(cur.token)})`,
|
|
232
|
+
`set dev to text returned of (display dialog "Device (optional)" default answer ${asq(cur.device)})`,
|
|
233
|
+
`set eng to (choose from list {"own", "stealth"} default items {${asq(cur.engine)}} with prompt "Browser engine")`,
|
|
234
|
+
`if eng is false then return`,
|
|
235
|
+
`set engv to item 1 of eng`,
|
|
236
|
+
`set opts to (choose from list {"browser", "headless", "shell"} default items {${[
|
|
237
|
+
cur.browser ? '"browser"' : "",
|
|
238
|
+
cur.headless ? '"headless"' : "",
|
|
239
|
+
cur.shell ? '"shell"' : "",
|
|
240
|
+
]
|
|
241
|
+
.filter(Boolean)
|
|
242
|
+
.join(", ")}} with prompt "Enable which options?" with multiple selections allowed)`,
|
|
243
|
+
`if opts is false then set opts to {}`,
|
|
244
|
+
`set br to "false"`,
|
|
245
|
+
`set hl to "false"`,
|
|
246
|
+
`set sh to "false"`,
|
|
247
|
+
`repeat with o in opts`,
|
|
248
|
+
` if (o as string) is "browser" then set br to "true"`,
|
|
249
|
+
` if (o as string) is "headless" then set hl to "true"`,
|
|
250
|
+
` if (o as string) is "shell" then set sh to "true"`,
|
|
251
|
+
`end repeat`,
|
|
252
|
+
`set json to "{\\"server\\":\\"" & srv & "\\",\\"token\\":\\"" & tok & "\\",\\"device\\":\\"" & dev & "\\",\\"browser\\":" & br & ",\\"engine\\":\\"" & engv & "\\",\\"headless\\":" & hl & ",\\"shell\\":" & sh & "}"`,
|
|
253
|
+
`do shell script "mkdir -p " & quoted form of (do shell script "dirname " & quoted form of cfgPath)`,
|
|
254
|
+
`do shell script "cat > " & quoted form of cfgPath & " <<'TSEOF'\n" & json & "\nTSEOF"`,
|
|
255
|
+
].join("\n");
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=settings-window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-window.js","sourceRoot":"","sources":["../src/settings-window.ts"],"names":[],"mappings":"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"}
|
package/dist/tray.js
CHANGED
|
@@ -35,8 +35,8 @@ function configPath() {
|
|
|
35
35
|
function logPath() {
|
|
36
36
|
return path.join(configDir(), "bridge.log");
|
|
37
37
|
}
|
|
38
|
-
function
|
|
39
|
-
|
|
38
|
+
function defaultConfig() {
|
|
39
|
+
return {
|
|
40
40
|
server: "ws://localhost:3110/ws",
|
|
41
41
|
token: "",
|
|
42
42
|
browser: true,
|
|
@@ -45,6 +45,9 @@ function loadConfig() {
|
|
|
45
45
|
shell: false,
|
|
46
46
|
device: "",
|
|
47
47
|
};
|
|
48
|
+
}
|
|
49
|
+
function loadConfig() {
|
|
50
|
+
const defaults = defaultConfig();
|
|
48
51
|
try {
|
|
49
52
|
const raw = JSON.parse(fs.readFileSync(configPath(), "utf8"));
|
|
50
53
|
return { ...defaults, ...raw };
|
|
@@ -53,6 +56,21 @@ function loadConfig() {
|
|
|
53
56
|
return defaults;
|
|
54
57
|
}
|
|
55
58
|
}
|
|
59
|
+
/** Ensure config.json exists on disk so "Edit settings" always has a
|
|
60
|
+
* file to open (first run hasn't Started the bridge yet, so nothing
|
|
61
|
+
* has written it). Returns the path. Best-effort. */
|
|
62
|
+
function ensureConfigFile() {
|
|
63
|
+
const p = configPath();
|
|
64
|
+
try {
|
|
65
|
+
if (!fs.existsSync(p)) {
|
|
66
|
+
fs.writeFileSync(p, JSON.stringify(defaultConfig(), null, 2) + "\n");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
/* best-effort */
|
|
71
|
+
}
|
|
72
|
+
return p;
|
|
73
|
+
}
|
|
56
74
|
// ─── tray icons ─────────────────────────────────────────────────────
|
|
57
75
|
//
|
|
58
76
|
// systray2 wants a base64 icon string: .ico on Windows, .png elsewhere.
|
|
@@ -211,7 +229,7 @@ export async function runTray() {
|
|
|
211
229
|
title: "Edit settings (config.json)…",
|
|
212
230
|
tooltip: "Open the config file",
|
|
213
231
|
enabled: true,
|
|
214
|
-
click: () => openPath(
|
|
232
|
+
click: () => openPath(ensureConfigFile()),
|
|
215
233
|
};
|
|
216
234
|
const logItem = {
|
|
217
235
|
title: "Open log",
|
|
@@ -296,13 +314,35 @@ export async function runTray() {
|
|
|
296
314
|
});
|
|
297
315
|
}
|
|
298
316
|
// ─── util ───────────────────────────────────────────────────────────
|
|
299
|
-
/** Open a file
|
|
317
|
+
/** Open a file with the OS default handler (cross-platform).
|
|
318
|
+
* Windows: `cmd /c start "" file` is flaky under a detached spawn and
|
|
319
|
+
* fails if the file type has no association, so open the file's default
|
|
320
|
+
* editor via a small chain — try the shell association, then notepad as
|
|
321
|
+
* a guaranteed fallback for our .json/.log text files. */
|
|
300
322
|
function openPath(target) {
|
|
301
323
|
const plat = process.platform;
|
|
302
|
-
const cmd = plat === "win32" ? "cmd" : plat === "darwin" ? "open" : "xdg-open";
|
|
303
|
-
const args = plat === "win32" ? ["/c", "start", "", target] : [target];
|
|
304
324
|
try {
|
|
305
|
-
|
|
325
|
+
if (plat === "win32") {
|
|
326
|
+
// `explorer <file>` opens with the registered handler; if none,
|
|
327
|
+
// fall back to notepad (always present) for our text files.
|
|
328
|
+
const child = spawn("cmd", ["/d", "/s", "/c", "start", "", target], {
|
|
329
|
+
stdio: "ignore",
|
|
330
|
+
detached: true,
|
|
331
|
+
windowsHide: true,
|
|
332
|
+
});
|
|
333
|
+
child.on("error", () => {
|
|
334
|
+
try {
|
|
335
|
+
spawn("notepad", [target], { stdio: "ignore", detached: true }).unref();
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
/* give up */
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
child.unref();
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
const cmd = plat === "darwin" ? "open" : "xdg-open";
|
|
345
|
+
spawn(cmd, [target], { stdio: "ignore", detached: true }).unref();
|
|
306
346
|
}
|
|
307
347
|
catch {
|
|
308
348
|
/* best-effort */
|
package/dist/tray.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tray.js","sourceRoot":"","sources":["../src/tray.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,0EAA0E;AAC1E,2EAA2E;AAC3E,yEAAyE;AACzE,6EAA6E;AAC7E,yEAAyE;AACzE,uEAAuE;AACvE,eAAe;AACf,EAAE;AACF,0EAA0E;AAC1E,2DAA2D;AAE3D,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"tray.js","sourceRoot":"","sources":["../src/tray.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tianshu-ai/local-bridge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Local bridge for tianshu — dial into a tianshu server over WebSocket and expose your machine's tools (browser, files, shell) to the agent via reverse-MCP.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|