@tianshu-ai/local-bridge 0.5.0 → 0.6.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 +37 -0
- package/dist/index.js +22 -2
- package/dist/index.js.map +1 -1
- package/dist/local-tools.js +402 -0
- package/dist/local-tools.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -86,6 +86,8 @@ tsbridge version # print the installed version
|
|
|
86
86
|
| `--device <id>` | stable device id (default: hostname) |
|
|
87
87
|
| `--label <name>` | human label shown in the panel |
|
|
88
88
|
| `--no-browser` | don't expose browser tools |
|
|
89
|
+
| `--shell` | expose the shell exec + file sync tools (OFF by default) |
|
|
90
|
+
| `--shell-root <dir>` | fixed root dir that jails `exec` + `sync_up`/`sync_down` (default: `~/.tianshu_shell`) |
|
|
89
91
|
| `--headless` | run the browser without a window (default: headful) |
|
|
90
92
|
| `--cdp <url>` | connect to an already-running Chrome's CDP endpoint (default probe `http://127.0.0.1:9222`; `off` to skip) |
|
|
91
93
|
| `--chrome-channel <ch>` | which installed browser to launch: `chrome` (default), `msedge`, … |
|
|
@@ -119,6 +121,41 @@ the underlying browser differs:
|
|
|
119
121
|
- **stealth** — `cloakbrowser-mcp`: the same toolset on CloakBrowser
|
|
120
122
|
stealth Chromium (source-level anti-bot-detection patches).
|
|
121
123
|
|
|
124
|
+
### Shell + file sync
|
|
125
|
+
|
|
126
|
+
When `--shell` is passed, the bridge also exposes three **native**
|
|
127
|
+
tools that run directly on your machine. Their names, parameters and
|
|
128
|
+
result shapes mirror tianshu's server-side `openshell` plugin, so an
|
|
129
|
+
agent written against openshell works unchanged against a bridge device.
|
|
130
|
+
|
|
131
|
+
**All three are jailed to a single fixed root directory**
|
|
132
|
+
(`~/.tianshu_shell` by default, override with `--shell-root`). `exec`'s
|
|
133
|
+
cwd + `workdir`, `sync_up`'s read base, and `sync_down`'s write dest all
|
|
134
|
+
resolve *inside* that root; any path that escapes it is rejected.
|
|
135
|
+
|
|
136
|
+
- **`exec`** — run a shell command via `bash -c`, cwd inside the root.
|
|
137
|
+
Params: `command`, optional `workdir` (relative to the root, defaults
|
|
138
|
+
to the root itself), optional `timeout_ms` (default 300s, cap 1800s).
|
|
139
|
+
Output is truncated at 200 lines / 8000 bytes per stream. Returns
|
|
140
|
+
`{ ok, exit_code, stdout, stderr, truncated, duration_ms, timed_out }`.
|
|
141
|
+
- **`sync_up`** — read files/dirs under the root and return their bytes
|
|
142
|
+
(base64) *up* to the agent. Params: `paths[]` (relative to the root,
|
|
143
|
+
directories walked recursively). Per-file cap 8 MiB, ≤500 files/call.
|
|
144
|
+
- **`sync_down`** — receive files (base64) from the agent and write them
|
|
145
|
+
*down* under the root. Params: `files: [{ path, base64 }]`. Parent
|
|
146
|
+
dirs are created; existing files overwritten.
|
|
147
|
+
|
|
148
|
+
Transport is base64-in-args over the existing reverse-MCP `tools/call`
|
|
149
|
+
channel — no protocol changes.
|
|
150
|
+
|
|
151
|
+
> **Security:** `exec` runs commands with your user's permissions, but
|
|
152
|
+
> is confined to the `--shell-root` directory (default `~/.tianshu_shell`)
|
|
153
|
+
> — the agent can't `cd` or read/write outside it via these tools. It is
|
|
154
|
+
> not a kernel sandbox (a determined command could still reach the wider
|
|
155
|
+
> fs), so only connect a bridge to a tianshu server you trust. Because of
|
|
156
|
+
> this, shell is **off by default** — add `--shell` only when you want the
|
|
157
|
+
> agent to run commands + move files on your machine.
|
|
158
|
+
|
|
122
159
|
## Protocol
|
|
123
160
|
|
|
124
161
|
The bridge speaks the reverse-MCP protocol defined authoritatively in the
|
package/dist/index.js
CHANGED
|
@@ -14,6 +14,11 @@
|
|
|
14
14
|
// --device <id> stable device id (default: hostname)
|
|
15
15
|
// --label <name> human label shown in the panel (default: device id)
|
|
16
16
|
// --no-browser don't expose browser tools
|
|
17
|
+
// --shell expose the shell exec + file sync tools
|
|
18
|
+
// (OFF by default; runs commands on your machine)
|
|
19
|
+
// --shell-root <dir> fixed root dir that jails exec + sync
|
|
20
|
+
// (default: ~/.tianshu_shell)
|
|
21
|
+
// (default: ~/.tianshu_shell)
|
|
17
22
|
// --browser-engine own | stealth (default: own)
|
|
18
23
|
// own = your system/running Chrome (no download,
|
|
19
24
|
// real cookies+fingerprint)
|
|
@@ -35,6 +40,7 @@
|
|
|
35
40
|
import os from "node:os";
|
|
36
41
|
import { BridgeConnection } from "./connection.js";
|
|
37
42
|
import { connectMcpChild, bridgeOutputDir } from "./mcp-child.js";
|
|
43
|
+
import { localTools, defaultShellRoot } from "./local-tools.js";
|
|
38
44
|
import { runUpdate, installedVersion } from "./update.js";
|
|
39
45
|
import { installApp } from "./install-app.js";
|
|
40
46
|
/** Is a Chrome already listening on this CDP endpoint? */
|
|
@@ -108,7 +114,13 @@ async function main() {
|
|
|
108
114
|
const channel = typeof args["chrome-channel"] === "string" ? args["chrome-channel"] : "chrome";
|
|
109
115
|
const userDataDir = typeof args["user-data-dir"] === "string" ? args["user-data-dir"] : "";
|
|
110
116
|
const browserOn = args["no-browser"] !== true;
|
|
117
|
+
// Shell (exec + file sync) is OFF by default — it runs arbitrary
|
|
118
|
+
// commands on the user's own machine, so it must be opted into
|
|
119
|
+
// explicitly with --shell. (--no-shell is still accepted as a
|
|
120
|
+
// harmless no-op for back-compat with older invocations.)
|
|
121
|
+
const shellOn = args["shell"] === true && args["no-shell"] !== true;
|
|
111
122
|
const engine = args["browser-engine"] === "stealth" ? "stealth" : "own";
|
|
123
|
+
const shellRoot = typeof args["shell-root"] === "string" ? args["shell-root"] : defaultShellRoot();
|
|
112
124
|
const tools = [];
|
|
113
125
|
if (browserOn) {
|
|
114
126
|
if (engine === "stealth") {
|
|
@@ -164,8 +176,16 @@ async function main() {
|
|
|
164
176
|
}
|
|
165
177
|
}
|
|
166
178
|
}
|
|
179
|
+
// Native local tools: shell exec + file sync. Run directly on this
|
|
180
|
+
// machine (no child MCP), mirroring the openshell plugin's
|
|
181
|
+
// exec / sync_up / sync_down surface.
|
|
182
|
+
if (shellOn) {
|
|
183
|
+
const log = (m) => console.log(`[local-bridge] ${m}`);
|
|
184
|
+
tools.push(...localTools({ root: shellRoot, log }));
|
|
185
|
+
log(`shell: exec + sync_up/sync_down enabled, jailed to ${shellRoot}`);
|
|
186
|
+
}
|
|
167
187
|
if (tools.length === 0) {
|
|
168
|
-
console.error("[local-bridge] no tools enabled — nothing to expose. Remove --no-browser
|
|
188
|
+
console.error("[local-bridge] no tools enabled — nothing to expose. Remove --no-browser, or add --shell, and try again.");
|
|
169
189
|
process.exit(2);
|
|
170
190
|
}
|
|
171
191
|
const conn = new BridgeConnection({
|
|
@@ -183,7 +203,7 @@ async function main() {
|
|
|
183
203
|
: cdpUrl
|
|
184
204
|
? `own: connect(${cdpUrl}) or ${channel}`
|
|
185
205
|
: `own: ${channel}`;
|
|
186
|
-
console.log(`[local-bridge] starting — device="${deviceId}", ${tools.length} tools, browser=${browserDesc}`);
|
|
206
|
+
console.log(`[local-bridge] starting — device="${deviceId}", ${tools.length} tools, browser=${browserDesc}, shell=${shellOn ? "on" : "off"}`);
|
|
187
207
|
conn.start();
|
|
188
208
|
const shutdown = () => {
|
|
189
209
|
console.log("\n[local-bridge] shutting down…");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
// Native local tools exposed by the bridge — shell exec + file sync.
|
|
2
|
+
//
|
|
3
|
+
// These run DIRECTLY on the user's machine (unlike the browser tools,
|
|
4
|
+
// which proxy a child MCP server). They mirror the tool surface of
|
|
5
|
+
// tianshu's server-side `openshell` plugin (tool names, params, and
|
|
6
|
+
// result shapes) so an agent written against openshell's exec /
|
|
7
|
+
// sync_up / sync_down "just works" when the sandbox backend is a
|
|
8
|
+
// local-bridge device instead of a server sandbox.
|
|
9
|
+
//
|
|
10
|
+
// Semantics differ because the bridge is a CLIENT on the user's own
|
|
11
|
+
// box, with no tenant/project/task context and no server-side
|
|
12
|
+
// filesystem. ALL activity is jailed to a single fixed root directory
|
|
13
|
+
// (~/.tianshu_shell by default): exec's cwd + workdir, sync_up's read
|
|
14
|
+
// base, and sync_down's write dest all resolve within it, and any path
|
|
15
|
+
// that escapes the root is rejected.
|
|
16
|
+
// - exec : `bash -c <command>` on THIS machine, cwd inside root.
|
|
17
|
+
// - sync_up : read files under root → return their bytes (base64)
|
|
18
|
+
// to the agent. "up" = from your machine up to the agent.
|
|
19
|
+
// - sync_down : receive bytes (base64) from the agent → write them
|
|
20
|
+
// under root. "down" = from the agent down onto your box.
|
|
21
|
+
//
|
|
22
|
+
// Transport is base64-in-args/result over the existing reverse-MCP
|
|
23
|
+
// `tools/call` channel — no protocol changes, no server changes. Keep
|
|
24
|
+
// payloads modest; there's a hard per-file cap below.
|
|
25
|
+
import { spawn } from "node:child_process";
|
|
26
|
+
import fs from "node:fs";
|
|
27
|
+
import fsp from "node:fs/promises";
|
|
28
|
+
import os from "node:os";
|
|
29
|
+
import path from "node:path";
|
|
30
|
+
// ─── tunables (mirroring openshell where it makes sense) ─────────────
|
|
31
|
+
const DEFAULT_EXEC_TIMEOUT_MS = 5 * 60_000;
|
|
32
|
+
const MAX_EXEC_TIMEOUT_MS = 30 * 60_000;
|
|
33
|
+
const STDOUT_LINE_CAP = 200;
|
|
34
|
+
const STDOUT_BYTE_CAP = 8_000;
|
|
35
|
+
// Base64 in a JSON-RPC frame is memory-bound; cap per-file bytes so a
|
|
36
|
+
// stray `sync_up({paths:['huge.iso']})` can't OOM the bridge or blow
|
|
37
|
+
// the WS frame. 8 MiB raw ≈ 11 MiB base64.
|
|
38
|
+
const MAX_FILE_BYTES = 8 * 1024 * 1024;
|
|
39
|
+
// Guard directory walks so a recursive sync_up of `~` can't fan out
|
|
40
|
+
// unbounded.
|
|
41
|
+
const MAX_SYNC_FILES = 500;
|
|
42
|
+
// ─── shared helpers ──────────────────────────────────────────────────
|
|
43
|
+
function clampTimeout(raw) {
|
|
44
|
+
if (typeof raw !== "number" || !Number.isFinite(raw) || raw <= 0) {
|
|
45
|
+
return DEFAULT_EXEC_TIMEOUT_MS;
|
|
46
|
+
}
|
|
47
|
+
return Math.min(Math.max(Math.trunc(raw), 1), MAX_EXEC_TIMEOUT_MS);
|
|
48
|
+
}
|
|
49
|
+
function truncate(text) {
|
|
50
|
+
const lines = text.split("\n");
|
|
51
|
+
if (lines.length > STDOUT_LINE_CAP) {
|
|
52
|
+
const head = lines.slice(0, STDOUT_LINE_CAP).join("\n");
|
|
53
|
+
return {
|
|
54
|
+
value: `${head}\n... (${lines.length - STDOUT_LINE_CAP} more lines truncated)`,
|
|
55
|
+
truncated: true,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (text.length > STDOUT_BYTE_CAP) {
|
|
59
|
+
return {
|
|
60
|
+
value: `${text.slice(0, STDOUT_BYTE_CAP)}\n... (${text.length - STDOUT_BYTE_CAP} more bytes truncated)`,
|
|
61
|
+
truncated: true,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return { value: text, truncated: false };
|
|
65
|
+
}
|
|
66
|
+
/** Wrap a JSON object as the single text content block the reverse-MCP
|
|
67
|
+
* contract expects. Mirrors openshell tools returning a plain object;
|
|
68
|
+
* here we JSON-encode it into a text block. */
|
|
69
|
+
function jsonResult(obj, isError = false) {
|
|
70
|
+
return { content: [{ type: "text", text: JSON.stringify(obj, null, 2) }], isError };
|
|
71
|
+
}
|
|
72
|
+
/** Resolve an agent-supplied path against a fixed base, refusing any
|
|
73
|
+
* result that escapes the base (path traversal / absolute paths that
|
|
74
|
+
* point elsewhere). Returns null if the path escapes. */
|
|
75
|
+
function resolveWithin(base, rel) {
|
|
76
|
+
const resolvedBase = path.resolve(base);
|
|
77
|
+
// Treat the input as relative to base even if it's absolute-looking;
|
|
78
|
+
// strip leading slashes so 'sync_down' can't be told to write /etc.
|
|
79
|
+
const cleaned = rel.replace(/^[/\\]+/, "");
|
|
80
|
+
const full = path.resolve(resolvedBase, cleaned);
|
|
81
|
+
const withSep = resolvedBase.endsWith(path.sep) ? resolvedBase : resolvedBase + path.sep;
|
|
82
|
+
if (full !== resolvedBase && !full.startsWith(withSep))
|
|
83
|
+
return null;
|
|
84
|
+
return full;
|
|
85
|
+
}
|
|
86
|
+
// ─── exec ────────────────────────────────────────────────────────────
|
|
87
|
+
export function ExecTool(opts) {
|
|
88
|
+
return {
|
|
89
|
+
descriptor: {
|
|
90
|
+
name: "exec",
|
|
91
|
+
description: `Run a shell command on THIS machine (the local-bridge device), via \`bash -c <command>\`.
|
|
92
|
+
|
|
93
|
+
All shell activity is confined to a fixed root directory: ${opts.root}. The command runs
|
|
94
|
+
there by default; a \`workdir\` must stay inside that root (paths escaping it are rejected).
|
|
95
|
+
|
|
96
|
+
Default timeout: ${DEFAULT_EXEC_TIMEOUT_MS / 1000}s. Raise \`timeout_ms\` for long tasks; cap ${MAX_EXEC_TIMEOUT_MS / 1000}s.
|
|
97
|
+
Outputs are truncated at ${STDOUT_LINE_CAP} lines / ${STDOUT_BYTE_CAP} bytes per stream — pipe to a file and read it back if you need the full output.
|
|
98
|
+
Runs with the bridge user's own permissions on their real machine — but is jailed to the root dir above.`,
|
|
99
|
+
inputSchema: {
|
|
100
|
+
type: "object",
|
|
101
|
+
properties: {
|
|
102
|
+
command: {
|
|
103
|
+
type: "string",
|
|
104
|
+
description: "Shell command. Equivalent to `bash -c <command>` on the bridge host, inside the shell root.",
|
|
105
|
+
},
|
|
106
|
+
workdir: {
|
|
107
|
+
type: "string",
|
|
108
|
+
description: `Working dir, relative to the shell root (${opts.root}). Defaults to the root itself. Must stay within it.`,
|
|
109
|
+
},
|
|
110
|
+
timeout_ms: {
|
|
111
|
+
type: "integer",
|
|
112
|
+
minimum: 1,
|
|
113
|
+
maximum: MAX_EXEC_TIMEOUT_MS,
|
|
114
|
+
description: `Override per-call timeout. Hard cap ${MAX_EXEC_TIMEOUT_MS}ms.`,
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
required: ["command"],
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
async run(args) {
|
|
121
|
+
const command = String(args.command ?? "");
|
|
122
|
+
if (!command) {
|
|
123
|
+
return jsonResult({ ok: false, exit_code: -1, stdout: "", stderr: "command is required", truncated: false, duration_ms: 0, timed_out: false }, true);
|
|
124
|
+
}
|
|
125
|
+
// Resolve the working dir inside the jail root. An escaping
|
|
126
|
+
// workdir is a hard error (don't silently fall back — the agent
|
|
127
|
+
// asked to run somewhere it isn't allowed).
|
|
128
|
+
const workdirArg = typeof args.workdir === "string" && args.workdir ? args.workdir : ".";
|
|
129
|
+
const workdir = resolveWithin(opts.root, workdirArg);
|
|
130
|
+
if (!workdir) {
|
|
131
|
+
return jsonResult({ ok: false, exit_code: -1, stdout: "", stderr: `workdir escapes shell root ${opts.root}`, truncated: false, duration_ms: 0, timed_out: false }, true);
|
|
132
|
+
}
|
|
133
|
+
const timeoutMs = clampTimeout(args.timeout_ms);
|
|
134
|
+
const started = Date.now();
|
|
135
|
+
// Ensure the root exists so the very first exec doesn't fail on a
|
|
136
|
+
// missing cwd.
|
|
137
|
+
try {
|
|
138
|
+
fs.mkdirSync(opts.root, { recursive: true });
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
/* best-effort; spawn will surface a real error */
|
|
142
|
+
}
|
|
143
|
+
return await new Promise((resolve) => {
|
|
144
|
+
let stdout = "";
|
|
145
|
+
let stderr = "";
|
|
146
|
+
let timedOut = false;
|
|
147
|
+
let settled = false;
|
|
148
|
+
const child = spawn("bash", ["-c", command], {
|
|
149
|
+
cwd: fs.existsSync(workdir) ? workdir : opts.root,
|
|
150
|
+
env: process.env,
|
|
151
|
+
});
|
|
152
|
+
const timer = setTimeout(() => {
|
|
153
|
+
timedOut = true;
|
|
154
|
+
child.kill("SIGKILL");
|
|
155
|
+
}, timeoutMs);
|
|
156
|
+
child.stdout?.on("data", (d) => {
|
|
157
|
+
stdout += d.toString();
|
|
158
|
+
});
|
|
159
|
+
child.stderr?.on("data", (d) => {
|
|
160
|
+
stderr += d.toString();
|
|
161
|
+
});
|
|
162
|
+
const finish = (exitCode) => {
|
|
163
|
+
if (settled)
|
|
164
|
+
return;
|
|
165
|
+
settled = true;
|
|
166
|
+
clearTimeout(timer);
|
|
167
|
+
const so = truncate(stdout);
|
|
168
|
+
const se = truncate(stderr);
|
|
169
|
+
resolve(jsonResult({
|
|
170
|
+
ok: exitCode === 0 && !timedOut,
|
|
171
|
+
exit_code: exitCode,
|
|
172
|
+
stdout: so.value,
|
|
173
|
+
stderr: timedOut ? `${se.value}${se.value ? "\n" : ""}[local-bridge] killed after ${timeoutMs}ms timeout` : se.value,
|
|
174
|
+
truncated: so.truncated || se.truncated,
|
|
175
|
+
duration_ms: Date.now() - started,
|
|
176
|
+
timed_out: timedOut,
|
|
177
|
+
}));
|
|
178
|
+
};
|
|
179
|
+
child.on("error", (err) => {
|
|
180
|
+
if (settled)
|
|
181
|
+
return;
|
|
182
|
+
settled = true;
|
|
183
|
+
clearTimeout(timer);
|
|
184
|
+
resolve(jsonResult({ ok: false, exit_code: -1, stdout: truncate(stdout).value, stderr: `spawn failed: ${err.message}`, truncated: false, duration_ms: Date.now() - started, timed_out: false }, true));
|
|
185
|
+
});
|
|
186
|
+
child.on("close", (code) => finish(code ?? -1));
|
|
187
|
+
});
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
// ─── sync_up (local machine → agent) ─────────────────────────────────
|
|
192
|
+
/** Recursively collect files under a resolved path (or the single file
|
|
193
|
+
* itself). Returns [relPathFromBase, absPath] pairs. */
|
|
194
|
+
async function collectFiles(base, absStart, relStart) {
|
|
195
|
+
const out = [];
|
|
196
|
+
const stat = await fsp.stat(absStart);
|
|
197
|
+
if (stat.isFile()) {
|
|
198
|
+
out.push({ rel: relStart, abs: absStart });
|
|
199
|
+
return out;
|
|
200
|
+
}
|
|
201
|
+
if (!stat.isDirectory())
|
|
202
|
+
return out;
|
|
203
|
+
const walk = async (dirAbs, dirRel) => {
|
|
204
|
+
const entries = await fsp.readdir(dirAbs, { withFileTypes: true });
|
|
205
|
+
for (const e of entries) {
|
|
206
|
+
if (out.length >= MAX_SYNC_FILES)
|
|
207
|
+
return;
|
|
208
|
+
const childAbs = path.join(dirAbs, e.name);
|
|
209
|
+
const childRel = path.posix.join(dirRel, e.name);
|
|
210
|
+
if (e.isDirectory()) {
|
|
211
|
+
await walk(childAbs, childRel);
|
|
212
|
+
}
|
|
213
|
+
else if (e.isFile()) {
|
|
214
|
+
out.push({ rel: childRel, abs: childAbs });
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
await walk(absStart, relStart);
|
|
219
|
+
return out;
|
|
220
|
+
}
|
|
221
|
+
export function SyncUpTool(opts) {
|
|
222
|
+
return {
|
|
223
|
+
descriptor: {
|
|
224
|
+
name: "sync_up",
|
|
225
|
+
description: `Upload files / directories FROM this machine UP to the agent (the "up" direction: your box → tianshu).
|
|
226
|
+
|
|
227
|
+
Reads the given paths inside the shell root and returns their contents (base64) so the agent
|
|
228
|
+
can write them into its own workspace / sandbox. Directories are read recursively.
|
|
229
|
+
|
|
230
|
+
Paths are resolved relative to the shell root (${opts.root}); paths that escape it are rejected.
|
|
231
|
+
Per-file cap ${Math.round(MAX_FILE_BYTES / 1024 / 1024)}MiB; at most ${MAX_SYNC_FILES} files per call.
|
|
232
|
+
|
|
233
|
+
Use this to hand local files to the agent instead of pasting their contents into a command.`,
|
|
234
|
+
inputSchema: {
|
|
235
|
+
type: "object",
|
|
236
|
+
properties: {
|
|
237
|
+
paths: {
|
|
238
|
+
type: "array",
|
|
239
|
+
items: { type: "string" },
|
|
240
|
+
minItems: 1,
|
|
241
|
+
description: `Files and/or directories to read, relative to the shell root (${opts.root}).`,
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
required: ["paths"],
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
async run(args) {
|
|
248
|
+
const raw = args.paths;
|
|
249
|
+
if (!Array.isArray(raw) || raw.length === 0) {
|
|
250
|
+
return jsonResult({ ok: false, error: "paths must be a non-empty string array" }, true);
|
|
251
|
+
}
|
|
252
|
+
const files = [];
|
|
253
|
+
const skipped = [];
|
|
254
|
+
for (const p of raw) {
|
|
255
|
+
const rel = String(p);
|
|
256
|
+
const abs = resolveWithin(opts.root, rel);
|
|
257
|
+
if (!abs) {
|
|
258
|
+
skipped.push({ path: rel, reason: `path escapes shell root ${opts.root}` });
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
let collected;
|
|
262
|
+
try {
|
|
263
|
+
collected = await collectFiles(opts.root, abs, rel.replace(/^[/\\]+/, ""));
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
skipped.push({ path: rel, reason: err instanceof Error ? err.message : String(err) });
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
for (const f of collected) {
|
|
270
|
+
if (files.length >= MAX_SYNC_FILES) {
|
|
271
|
+
skipped.push({ path: f.rel, reason: `exceeded ${MAX_SYNC_FILES}-file limit` });
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
const st = await fsp.stat(f.abs);
|
|
276
|
+
if (st.size > MAX_FILE_BYTES) {
|
|
277
|
+
skipped.push({ path: f.rel, reason: `file ${st.size}B exceeds ${MAX_FILE_BYTES}B cap` });
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
const buf = await fsp.readFile(f.abs);
|
|
281
|
+
files.push({ path: f.rel, base64: buf.toString("base64"), bytes: st.size });
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
skipped.push({ path: f.rel, reason: err instanceof Error ? err.message : String(err) });
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return jsonResult({
|
|
289
|
+
ok: skipped.length === 0,
|
|
290
|
+
base: opts.root,
|
|
291
|
+
encoding: "base64",
|
|
292
|
+
files,
|
|
293
|
+
skipped,
|
|
294
|
+
notice: "Each file's `base64` is its raw content. Decode and write it into your workspace at the same relative `path`.",
|
|
295
|
+
});
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
// ─── sync_down (agent → local machine) ───────────────────────────────
|
|
300
|
+
export function SyncDownTool(opts) {
|
|
301
|
+
return {
|
|
302
|
+
descriptor: {
|
|
303
|
+
name: "sync_down",
|
|
304
|
+
description: `Download files FROM the agent DOWN onto this machine (the "down" direction: tianshu → your box).
|
|
305
|
+
|
|
306
|
+
Writes the given files into the shell root (${opts.root}). Each file is
|
|
307
|
+
{ path: <relative path>, base64: <content> }. Existing files are overwritten. Parent dirs
|
|
308
|
+
are created. Paths that escape the root are rejected.
|
|
309
|
+
|
|
310
|
+
Per-file cap ${Math.round(MAX_FILE_BYTES / 1024 / 1024)}MiB; at most ${MAX_SYNC_FILES} files per call.
|
|
311
|
+
|
|
312
|
+
Use this AFTER the agent produces artefacts you want on your local machine.`,
|
|
313
|
+
inputSchema: {
|
|
314
|
+
type: "object",
|
|
315
|
+
properties: {
|
|
316
|
+
files: {
|
|
317
|
+
type: "array",
|
|
318
|
+
items: {
|
|
319
|
+
type: "object",
|
|
320
|
+
properties: {
|
|
321
|
+
path: { type: "string", description: "Relative destination path within the sync dir." },
|
|
322
|
+
base64: { type: "string", description: "File content, base64-encoded." },
|
|
323
|
+
},
|
|
324
|
+
required: ["path", "base64"],
|
|
325
|
+
},
|
|
326
|
+
minItems: 1,
|
|
327
|
+
description: "Files to write onto the bridge host.",
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
required: ["files"],
|
|
331
|
+
},
|
|
332
|
+
},
|
|
333
|
+
async run(args) {
|
|
334
|
+
const raw = args.files;
|
|
335
|
+
if (!Array.isArray(raw) || raw.length === 0) {
|
|
336
|
+
return jsonResult({ ok: false, error: "files must be a non-empty array of {path, base64}" }, true);
|
|
337
|
+
}
|
|
338
|
+
if (raw.length > MAX_SYNC_FILES) {
|
|
339
|
+
return jsonResult({ ok: false, error: `too many files (${raw.length} > ${MAX_SYNC_FILES})` }, true);
|
|
340
|
+
}
|
|
341
|
+
try {
|
|
342
|
+
await fsp.mkdir(opts.root, { recursive: true });
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
return jsonResult({ ok: false, error: `cannot create shell root: ${err instanceof Error ? err.message : String(err)}` }, true);
|
|
346
|
+
}
|
|
347
|
+
const written = [];
|
|
348
|
+
const skipped = [];
|
|
349
|
+
for (const entry of raw) {
|
|
350
|
+
const rel = String(entry.path ?? "");
|
|
351
|
+
const b64 = String(entry.base64 ?? "");
|
|
352
|
+
if (!rel) {
|
|
353
|
+
skipped.push({ path: "(missing)", reason: "path is required" });
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
const abs = resolveWithin(opts.root, rel);
|
|
357
|
+
if (!abs) {
|
|
358
|
+
skipped.push({ path: rel, reason: `path escapes shell root ${opts.root}` });
|
|
359
|
+
continue;
|
|
360
|
+
}
|
|
361
|
+
let buf;
|
|
362
|
+
try {
|
|
363
|
+
buf = Buffer.from(b64, "base64");
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
skipped.push({ path: rel, reason: "invalid base64" });
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
if (buf.length > MAX_FILE_BYTES) {
|
|
370
|
+
skipped.push({ path: rel, reason: `file ${buf.length}B exceeds ${MAX_FILE_BYTES}B cap` });
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
try {
|
|
374
|
+
await fsp.mkdir(path.dirname(abs), { recursive: true });
|
|
375
|
+
await fsp.writeFile(abs, buf);
|
|
376
|
+
written.push({ path: rel, bytes: buf.length });
|
|
377
|
+
}
|
|
378
|
+
catch (err) {
|
|
379
|
+
skipped.push({ path: rel, reason: err instanceof Error ? err.message : String(err) });
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return jsonResult({
|
|
383
|
+
ok: skipped.length === 0,
|
|
384
|
+
dest: opts.root,
|
|
385
|
+
written,
|
|
386
|
+
skipped,
|
|
387
|
+
notice: `Wrote ${written.length} file(s) under ${opts.root} on the bridge host.`,
|
|
388
|
+
});
|
|
389
|
+
},
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
// ─── factory ─────────────────────────────────────────────────────────
|
|
393
|
+
/** The fixed default shell root: ~/.tianshu_shell. All exec + sync
|
|
394
|
+
* activity is jailed here. Override with --shell-root. */
|
|
395
|
+
export function defaultShellRoot() {
|
|
396
|
+
return path.join(os.homedir(), ".tianshu_shell");
|
|
397
|
+
}
|
|
398
|
+
/** Build the native local tool set (shell + sync), jailed to opts.root. */
|
|
399
|
+
export function localTools(opts) {
|
|
400
|
+
return [ExecTool(opts), SyncUpTool(opts), SyncDownTool(opts)];
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=local-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-tools.js","sourceRoot":"","sources":["../src/local-tools.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.6.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": {
|