@tianshu-ai/local-bridge 0.3.0 → 0.4.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/README.md +12 -3
- package/dist/index.js +19 -16
- package/dist/index.js.map +1 -1
- package/dist/update.js +105 -0
- package/dist/update.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ your machine tianshu server
|
|
|
15
15
|
┌──────────────┐ outbound WSS ┌──────────────────┐
|
|
16
16
|
│ local-bridge │ ────────────────▶ │ /ws (Local Bridge │
|
|
17
17
|
│ • browser │ register tools │ plugin) │
|
|
18
|
-
│
|
|
18
|
+
│ tools │ ◀──── tools/call ─│ → agent uses │
|
|
19
19
|
└──────────────┘ ──── result ─────▶ │ your tools │
|
|
20
20
|
└──────────────────┘
|
|
21
21
|
```
|
|
@@ -46,6 +46,14 @@ tsbridge --server ws://localhost:3110/ws
|
|
|
46
46
|
|
|
47
47
|
> The `tsbridge` and `tianshu-local-bridge` commands are equivalent.
|
|
48
48
|
|
|
49
|
+
### Keeping it updated
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
tsbridge update # check npm for a newer version
|
|
53
|
+
tsbridge update --yes # check and self-update (npm i -g …@latest)
|
|
54
|
+
tsbridge version # print the installed version
|
|
55
|
+
```
|
|
56
|
+
|
|
49
57
|
### Flags
|
|
50
58
|
|
|
51
59
|
| flag | meaning |
|
|
@@ -54,7 +62,7 @@ tsbridge --server ws://localhost:3110/ws
|
|
|
54
62
|
| `--token <token>` | connection token from the Local Bridge panel |
|
|
55
63
|
| `--device <id>` | stable device id (default: hostname) |
|
|
56
64
|
| `--label <name>` | human label shown in the panel |
|
|
57
|
-
| `--no-browser` | expose
|
|
65
|
+
| `--no-browser` | don't expose browser tools |
|
|
58
66
|
| `--headless` | run the browser without a window (default: headful) |
|
|
59
67
|
| `--cdp <url>` | connect to an already-running Chrome's CDP endpoint (default probe `http://127.0.0.1:9222`; `off` to skip) |
|
|
60
68
|
| `--chrome-channel <ch>` | which installed browser to launch: `chrome` (default), `msedge`, … |
|
|
@@ -77,10 +85,11 @@ To expose your everyday browser, start Chrome with a debugging port:
|
|
|
77
85
|
|
|
78
86
|
## Tools
|
|
79
87
|
|
|
80
|
-
- `echo` — connectivity check.
|
|
81
88
|
- `browser_navigate` / `browser_get_text` / `browser_click` /
|
|
82
89
|
`browser_screenshot` — drive your real local Chrome (via CDP connect
|
|
83
90
|
or system-Chrome launch; automation-detection softened).
|
|
91
|
+
- With `--browser-engine stealth`, the full Playwright-MCP toolset
|
|
92
|
+
(snapshot / fill_form / evaluate / tabs / …) pointed at CloakBrowser.
|
|
84
93
|
|
|
85
94
|
## Protocol
|
|
86
95
|
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
// --token <token> connection token from the Local Bridge panel
|
|
14
14
|
// --device <id> stable device id (default: hostname)
|
|
15
15
|
// --label <name> human label shown in the panel (default: device id)
|
|
16
|
-
// --no-browser don't expose browser tools
|
|
16
|
+
// --no-browser don't expose browser tools
|
|
17
17
|
// --browser-engine own | stealth (default: own)
|
|
18
18
|
// own = your system/running Chrome (no download,
|
|
19
19
|
// real cookies+fingerprint)
|
|
@@ -29,7 +29,7 @@ import os from "node:os";
|
|
|
29
29
|
import { BridgeConnection } from "./connection.js";
|
|
30
30
|
import { makeBrowserTools } from "./browser.js";
|
|
31
31
|
import { connectMcpChild } from "./mcp-child.js";
|
|
32
|
-
import {
|
|
32
|
+
import { runUpdate, installedVersion } from "./update.js";
|
|
33
33
|
function parseArgs(argv) {
|
|
34
34
|
const out = {};
|
|
35
35
|
for (let i = 0; i < argv.length; i++) {
|
|
@@ -49,12 +49,23 @@ function parseArgs(argv) {
|
|
|
49
49
|
return out;
|
|
50
50
|
}
|
|
51
51
|
async function main() {
|
|
52
|
-
|
|
52
|
+
// First positional (not starting with --) selects a subcommand.
|
|
53
|
+
const argv = process.argv.slice(2);
|
|
54
|
+
const sub = argv.find((a) => !a.startsWith("--"));
|
|
55
|
+
const args = parseArgs(argv);
|
|
56
|
+
if (sub === "update") {
|
|
57
|
+
process.exit(await runUpdate(args.yes === true || args.y === true));
|
|
58
|
+
}
|
|
59
|
+
if (sub === "version" || args.version === true || args.v === true) {
|
|
60
|
+
process.stdout.write(`@tianshu-ai/local-bridge v${installedVersion()}\n`);
|
|
61
|
+
process.exit(0);
|
|
62
|
+
}
|
|
53
63
|
const server = typeof args.server === "string" ? args.server : "";
|
|
54
64
|
if (!server) {
|
|
55
65
|
console.error("error: --server <wss://host/ws> is required");
|
|
56
66
|
console.error("example: tsbridge --server wss://tianshu.example.com/ws --token ***");
|
|
57
67
|
console.error("install: npm i -g @tianshu-ai/local-bridge (then run `tsbridge`)");
|
|
68
|
+
console.error("commands: tsbridge update [--yes] | tsbridge version");
|
|
58
69
|
process.exit(2);
|
|
59
70
|
}
|
|
60
71
|
const token = typeof args.token === "string" ? args.token : undefined;
|
|
@@ -66,21 +77,9 @@ async function main() {
|
|
|
66
77
|
const cdpUrl = cdpArg === "off" ? "" : cdpArg;
|
|
67
78
|
const channel = typeof args["chrome-channel"] === "string" ? args["chrome-channel"] : "chrome";
|
|
68
79
|
const userDataDir = typeof args["user-data-dir"] === "string" ? args["user-data-dir"] : "";
|
|
69
|
-
// Always ship a trivial echo tool so the round-trip can be verified
|
|
70
|
-
// without a browser install.
|
|
71
|
-
const echo = {
|
|
72
|
-
descriptor: {
|
|
73
|
-
name: "echo",
|
|
74
|
-
description: "Echo the given text back (bridge connectivity check).",
|
|
75
|
-
inputSchema: { type: "object", properties: { text: { type: "string" } }, required: ["text"] },
|
|
76
|
-
},
|
|
77
|
-
async run(a) {
|
|
78
|
-
return textResult(String(a.text ?? ""));
|
|
79
|
-
},
|
|
80
|
-
};
|
|
81
80
|
const browserOn = args["no-browser"] !== true;
|
|
82
81
|
const engine = args["browser-engine"] === "stealth" ? "stealth" : "own";
|
|
83
|
-
const tools = [
|
|
82
|
+
const tools = [];
|
|
84
83
|
if (browserOn) {
|
|
85
84
|
if (engine === "stealth") {
|
|
86
85
|
// Full Playwright-MCP toolset pointed at CloakBrowser stealth
|
|
@@ -109,6 +108,10 @@ async function main() {
|
|
|
109
108
|
}));
|
|
110
109
|
}
|
|
111
110
|
}
|
|
111
|
+
if (tools.length === 0) {
|
|
112
|
+
console.error("[local-bridge] no tools enabled — nothing to expose. Remove --no-browser (or enable a capability) and try again.");
|
|
113
|
+
process.exit(2);
|
|
114
|
+
}
|
|
112
115
|
const conn = new BridgeConnection({
|
|
113
116
|
server,
|
|
114
117
|
token,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,yEAAyE;AACzE,mDAAmD;AACnD,EAAE;AACF,yCAAyC;AACzC,sCAAsC;AACtC,+DAA+D;AAC/D,sBAAsB;AACtB,sFAAsF;AACtF,EAAE;AACF,SAAS;AACT,2DAA2D;AAC3D,oEAAoE;AACpE,4DAA4D;AAC5D,2EAA2E;AAC3E,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/update.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// `tsbridge update` — check npm for a newer @tianshu-ai/local-bridge and
|
|
2
|
+
// optionally self-update the global install.
|
|
3
|
+
//
|
|
4
|
+
// Check-only by default; pass --yes to actually run the install. Uses
|
|
5
|
+
// the npm registry JSON API (no auth) for the check, and `npm i -g` for
|
|
6
|
+
// the apply so it works regardless of how the CLI was installed.
|
|
7
|
+
import { createRequire } from "node:module";
|
|
8
|
+
import { spawn } from "node:child_process";
|
|
9
|
+
const PKG = "@tianshu-ai/local-bridge";
|
|
10
|
+
const REGISTRY = "https://registry.npmjs.org";
|
|
11
|
+
/** Installed version, read from this package's own package.json. */
|
|
12
|
+
export function installedVersion() {
|
|
13
|
+
try {
|
|
14
|
+
const require = createRequire(import.meta.url);
|
|
15
|
+
// dist/update.js → ../package.json
|
|
16
|
+
const pkg = require("../package.json");
|
|
17
|
+
return pkg.version ?? "0.0.0";
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return "0.0.0";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** Fetch the latest published version + dist-tags from npm. */
|
|
24
|
+
async function fetchLatest() {
|
|
25
|
+
try {
|
|
26
|
+
const res = await fetch(`${REGISTRY}/${encodeURIComponent(PKG).replace("%40", "@")}/latest`, {
|
|
27
|
+
headers: { accept: "application/json" },
|
|
28
|
+
signal: AbortSignal.timeout(10_000),
|
|
29
|
+
});
|
|
30
|
+
if (!res.ok)
|
|
31
|
+
return null;
|
|
32
|
+
const json = (await res.json());
|
|
33
|
+
return json.version ?? null;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Semver-ish compare: returns true if `remote` is strictly newer than
|
|
40
|
+
* `local`. Handles plain x.y.z; prerelease tags compare lexically as a
|
|
41
|
+
* best-effort tiebreak. */
|
|
42
|
+
function isNewer(remote, local) {
|
|
43
|
+
const parse = (v) => {
|
|
44
|
+
const [core, pre] = v.split("-", 2);
|
|
45
|
+
const nums = core.split(".").map((n) => parseInt(n, 10) || 0);
|
|
46
|
+
return { nums, pre: pre ?? "" };
|
|
47
|
+
};
|
|
48
|
+
const a = parse(remote);
|
|
49
|
+
const b = parse(local);
|
|
50
|
+
for (let i = 0; i < 3; i++) {
|
|
51
|
+
const x = a.nums[i] ?? 0;
|
|
52
|
+
const y = b.nums[i] ?? 0;
|
|
53
|
+
if (x !== y)
|
|
54
|
+
return x > y;
|
|
55
|
+
}
|
|
56
|
+
// equal core: a release (no pre) beats a prerelease; else lexical
|
|
57
|
+
if (a.pre === b.pre)
|
|
58
|
+
return false;
|
|
59
|
+
if (!a.pre)
|
|
60
|
+
return true;
|
|
61
|
+
if (!b.pre)
|
|
62
|
+
return false;
|
|
63
|
+
return a.pre > b.pre;
|
|
64
|
+
}
|
|
65
|
+
function runNpmInstall() {
|
|
66
|
+
return new Promise((resolve) => {
|
|
67
|
+
const child = spawn("npm", ["install", "-g", `${PKG}@latest`], {
|
|
68
|
+
stdio: "inherit",
|
|
69
|
+
shell: process.platform === "win32",
|
|
70
|
+
});
|
|
71
|
+
child.on("close", (code) => resolve(code ?? 1));
|
|
72
|
+
child.on("error", () => resolve(1));
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/** Run the update subcommand. `apply` = actually install the new version. */
|
|
76
|
+
export async function runUpdate(apply) {
|
|
77
|
+
const local = installedVersion();
|
|
78
|
+
process.stdout.write(`[tsbridge] installed: v${local}\n`);
|
|
79
|
+
process.stdout.write(`[tsbridge] checking ${REGISTRY} for a newer ${PKG}…\n`);
|
|
80
|
+
const latest = await fetchLatest();
|
|
81
|
+
if (!latest) {
|
|
82
|
+
process.stderr.write("[tsbridge] could not reach the npm registry.\n");
|
|
83
|
+
return 1;
|
|
84
|
+
}
|
|
85
|
+
if (!isNewer(latest, local)) {
|
|
86
|
+
process.stdout.write(`[tsbridge] up to date (latest is v${latest}).\n`);
|
|
87
|
+
return 0;
|
|
88
|
+
}
|
|
89
|
+
process.stdout.write(`[tsbridge] a newer version is available: v${latest}\n`);
|
|
90
|
+
if (!apply) {
|
|
91
|
+
process.stdout.write(`[tsbridge] to update, run:\n npm i -g ${PKG}@latest\n or:\n tsbridge update --yes\n`);
|
|
92
|
+
return 0;
|
|
93
|
+
}
|
|
94
|
+
process.stdout.write(`[tsbridge] updating v${local} → v${latest}…\n`);
|
|
95
|
+
const code = await runNpmInstall();
|
|
96
|
+
if (code === 0) {
|
|
97
|
+
process.stdout.write(`[tsbridge] updated to v${latest}. Restart any running bridge.\n`);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
process.stderr.write(`[tsbridge] update failed (npm exit ${code}). Try manually: npm i -g ${PKG}@latest\n` +
|
|
101
|
+
` (a permission error usually means you need sudo, or a Node version manager's global dir.)\n`);
|
|
102
|
+
}
|
|
103
|
+
return code;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.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.4.1",
|
|
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": {
|