@tianshu-ai/tianshu 0.9.0 → 0.9.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/package.json
CHANGED
|
@@ -806,9 +806,32 @@ function publishEffectivePublicUrl() {
|
|
|
806
806
|
console.warn(`[tianshu] failed to publish effectivePublicUrl: ${err instanceof Error ? err.message : String(err)}`);
|
|
807
807
|
}
|
|
808
808
|
}
|
|
809
|
+
let shuttingDown = false;
|
|
809
810
|
const shutdown = (signal) => {
|
|
811
|
+
if (shuttingDown)
|
|
812
|
+
return;
|
|
813
|
+
shuttingDown = true;
|
|
810
814
|
// eslint-disable-next-line no-console
|
|
811
815
|
console.log(`[tianshu] received ${signal}, shutting down`);
|
|
816
|
+
// Force-close every live WebSocket. `wss.close()` alone only stops
|
|
817
|
+
// ACCEPTING new sockets — it leaves existing ones open, so:
|
|
818
|
+
// (a) `server.close()`'s callback never fires (open conns keep the
|
|
819
|
+
// server "in use"), so this process never exits, and
|
|
820
|
+
// (b) a connected Local Bridge stays glued to this dying process:
|
|
821
|
+
// it keeps re-registering into the OLD process's in-memory
|
|
822
|
+
// registry (logs show 'bridge registered') while the NEW
|
|
823
|
+
// process — the one the UI talks to — never sees it, so its
|
|
824
|
+
// tools vanish from the panel after a restart.
|
|
825
|
+
// Terminating the sockets makes the bridge observe a `close` and
|
|
826
|
+
// reconnect to the fresh process, re-registering there.
|
|
827
|
+
for (const client of wss.clients) {
|
|
828
|
+
try {
|
|
829
|
+
client.terminate();
|
|
830
|
+
}
|
|
831
|
+
catch {
|
|
832
|
+
/* ignore */
|
|
833
|
+
}
|
|
834
|
+
}
|
|
812
835
|
wss.close();
|
|
813
836
|
server.close(() => {
|
|
814
837
|
globalOps.closePool();
|
|
@@ -816,6 +839,10 @@ const shutdown = (signal) => {
|
|
|
816
839
|
void pluginRegistry;
|
|
817
840
|
process.exit(0);
|
|
818
841
|
});
|
|
842
|
+
// Belt-and-braces: if server.close() still hasn't fired (a straggler
|
|
843
|
+
// keep-alive HTTP socket, etc.), force the exit so a restart never
|
|
844
|
+
// leaves a zombie old process holding connections.
|
|
845
|
+
setTimeout(() => process.exit(0), 3000).unref();
|
|
819
846
|
};
|
|
820
847
|
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
821
848
|
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAInB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAInB,MAAM,wBAAwB,CAAC;AAoChC,QAAA,MAAM,MAAM,EAAE,kBA6Hb,CAAC;AAEF,eAAO,MAAM,QAAQ,4EAA+B,CAAC;AACrD,eAAO,MAAM,UAAU,0CAAkC,CAAC;eAC3C,MAAM"}
|
|
@@ -260,9 +260,18 @@ function buildViewImageTool(userId, userHomeDir) {
|
|
|
260
260
|
function socketUserId(socket) {
|
|
261
261
|
return socket.userId ?? "";
|
|
262
262
|
}
|
|
263
|
+
var registriesByTenant = /* @__PURE__ */ new Map();
|
|
264
|
+
function registryForTenant(tenantId) {
|
|
265
|
+
let reg = registriesByTenant.get(tenantId);
|
|
266
|
+
if (!reg) {
|
|
267
|
+
reg = new BridgeRegistry();
|
|
268
|
+
registriesByTenant.set(tenantId, reg);
|
|
269
|
+
}
|
|
270
|
+
return reg;
|
|
271
|
+
}
|
|
263
272
|
var plugin = {
|
|
264
273
|
activate(ctx) {
|
|
265
|
-
const registry =
|
|
274
|
+
const registry = registryForTenant(ctx.tenantId);
|
|
266
275
|
const onRegister = (msg, socket) => {
|
|
267
276
|
const userId = socketUserId(socket);
|
|
268
277
|
if (!userId) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/protocol.ts", "../src/registry.ts", "../src/toolset.ts", "../src/server.ts"],
|
|
4
|
-
"sourcesContent": ["// Reverse-MCP wire protocol.\n//\n// Transport: the existing authenticated chat WebSocket (`/ws`). The\n// bridge client connects with `Authorization: Bearer <token>` so the\n// host's identity resolver chain already knows (tenantId, userId) \u2014 we\n// never invent our own auth here. On top of that channel we exchange a\n// THIN envelope around standard MCP JSON-RPC, so the same payloads can\n// later move to a dedicated endpoint (route 2) unchanged.\n//\n// Direction is inverted vs. normal MCP: the SERVER is the JSON-RPC\n// client (sends tools/list, tools/call), the dialed-in BRIDGE is the\n// JSON-RPC server (executes locally, replies).\n//\n// Message types (all ride the shared /ws channel):\n// client \u2192 server:\n// reverse_mcp_register { deviceId, tools: McpToolDescriptor[] }\n// reverse_mcp_response { id, result? , error? } // JSON-RPC reply\n// reverse_mcp_unregister { } // graceful bye\n// server \u2192 client:\n// reverse_mcp_request { id, method, params } // JSON-RPC call\n// reverse_mcp_registered { ok, deviceId } // ack\n\nexport const MSG = {\n register: \"reverse_mcp_register\",\n unregister: \"reverse_mcp_unregister\",\n response: \"reverse_mcp_response\",\n request: \"reverse_mcp_request\",\n registered: \"reverse_mcp_registered\",\n} as const;\n\n/** A tool the bridge advertises at register time. Mirrors the MCP\n * `Tool` shape (name + description + JSON-schema input). */\nexport interface McpToolDescriptor {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n}\n\n/** client \u2192 server: announce this device + the tools it offers. */\nexport interface RegisterMsg {\n type: typeof MSG.register;\n deviceId: string;\n /** Human label for the device, shown in the panel. */\n label?: string;\n tools: McpToolDescriptor[];\n}\n\n/** server \u2192 client: a JSON-RPC request to execute locally. */\nexport interface RequestMsg {\n type: typeof MSG.request;\n id: string;\n method: string; // e.g. \"tools/call\"\n params?: Record<string, unknown>;\n}\n\n/** client \u2192 server: a JSON-RPC reply. */\nexport interface ResponseMsg {\n type: typeof MSG.response;\n id: string;\n result?: unknown;\n error?: { code: number; message: string };\n}\n\n/** Standard MCP `tools/call` params. */\nexport interface ToolsCallParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\n/** Standard MCP `tools/call` result: a list of content blocks. We\n * flatten text blocks for the agent. */\nexport interface ToolsCallResult {\n content?: Array<{ type: string; text?: string; [k: string]: unknown }>;\n isError?: boolean;\n}\n", "// In-memory registry of dialed-in bridge connections, scoped to one\n// tenant (the plugin activates per tenant, closing over ctx.tenantId).\n//\n// A connection is identified by (userId, deviceId). Each holds the live\n// WebSocket, the advertised tool list, and a map of in-flight JSON-RPC\n// calls awaiting their reply. Everything is best-effort and self-heals:\n// a dropped socket removes the connection; a timed-out call rejects.\n\nimport type { WebSocket } from \"ws\";\nimport { MSG, type McpToolDescriptor, type RequestMsg } from \"./protocol.js\";\n\ninterface Pending {\n resolve: (result: unknown) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\nexport interface BridgeConn {\n userId: string;\n deviceId: string;\n label: string;\n socket: WebSocket;\n tools: McpToolDescriptor[];\n connectedAt: number;\n pending: Map<string, Pending>;\n}\n\nconst CALL_TIMEOUT_MS = 60_000;\n\nexport class BridgeRegistry {\n // key = `${userId}\\u0000${deviceId}`\n private readonly conns = new Map<string, BridgeConn>();\n private seq = 0;\n\n private key(userId: string, deviceId: string): string {\n return `${userId}\\u0000${deviceId}`;\n }\n\n /** Register (or replace) a connection for a device. If the same\n * (user, device) reconnects, the old socket's pending calls are\n * rejected and it is replaced. */\n register(args: {\n userId: string;\n deviceId: string;\n label?: string;\n socket: WebSocket;\n tools: McpToolDescriptor[];\n }): BridgeConn {\n const k = this.key(args.userId, args.deviceId);\n const existing = this.conns.get(k);\n if (existing && existing.socket !== args.socket) {\n this.dropPending(existing, \"replaced by a new connection\");\n }\n const conn: BridgeConn = {\n userId: args.userId,\n deviceId: args.deviceId,\n label: args.label || args.deviceId,\n socket: args.socket,\n tools: args.tools,\n connectedAt: Date.now(),\n pending: existing?.pending ?? new Map(),\n };\n this.conns.set(k, conn);\n return conn;\n }\n\n /** Remove whatever connection owns this socket (on close/unregister). */\n removeBySocket(socket: WebSocket): void {\n for (const [k, c] of this.conns) {\n if (c.socket === socket) {\n this.dropPending(c, \"connection closed\");\n this.conns.delete(k);\n }\n }\n }\n\n remove(userId: string, deviceId: string): void {\n const k = this.key(userId, deviceId);\n const c = this.conns.get(k);\n if (c) {\n this.dropPending(c, \"unregistered\");\n this.conns.delete(k);\n }\n }\n\n /** All connections for a user (a user may run several devices). */\n forUser(userId: string): BridgeConn[] {\n return [...this.conns.values()].filter((c) => c.userId === userId);\n }\n\n /** Every connection in this (tenant-scoped) registry. */\n all(): BridgeConn[] {\n return [...this.conns.values()];\n }\n\n /** Resolve a pending JSON-RPC reply arriving from a bridge. */\n settle(socket: WebSocket, id: string, result: unknown, error?: { message: string }): void {\n for (const c of this.conns.values()) {\n if (c.socket !== socket) continue;\n const p = c.pending.get(id);\n if (!p) return;\n c.pending.delete(id);\n clearTimeout(p.timer);\n if (error) p.reject(new Error(error.message));\n else p.resolve(result);\n return;\n }\n }\n\n /** Send a JSON-RPC request to a specific connection and await the\n * reply (or timeout). */\n call(conn: BridgeConn, method: string, params?: Record<string, unknown>): Promise<unknown> {\n const id = `${Date.now()}-${++this.seq}`;\n const req: RequestMsg = { type: MSG.request, id, method, params };\n return new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n conn.pending.delete(id);\n reject(new Error(`bridge call timed out after ${CALL_TIMEOUT_MS}ms (${method})`));\n }, CALL_TIMEOUT_MS);\n conn.pending.set(id, { resolve, reject, timer });\n try {\n conn.socket.send(JSON.stringify(req));\n } catch (err) {\n conn.pending.delete(id);\n clearTimeout(timer);\n reject(err instanceof Error ? err : new Error(String(err)));\n }\n });\n }\n\n private dropPending(conn: BridgeConn, reason: string): void {\n for (const p of conn.pending.values()) {\n clearTimeout(p.timer);\n p.reject(new Error(`bridge ${reason}`));\n }\n conn.pending.clear();\n }\n}\n", "// A ToolsetProvider backed by the dialed-in bridge connections. The\n// host calls listTools() every agent turn, so tools appear/disappear as\n// bridges connect/disconnect with no plugin reactivation.\n//\n// Each bridge tool becomes an AgentTool named `bridge_<device>_<tool>`.\n// `available()` hides it from users who don't own that bridge; the\n// tenant scope is already fixed (this provider is created per-tenant).\n// `execute()` does the async JSON-RPC round-trip to the owning device.\n//\n// Screenshots / images: a bridge tool result may carry MCP image\n// blocks (base64). To keep the agent context small we DON'T inline\n// those bytes into the tool result. Instead we save each image under\n// the user's dir and return only its PATH + dimensions. The agent then\n// calls `bridge_view_image(path)` on demand \u2014 that tool inlines the\n// bytes as an ImageContent for the vision model, one turn, controlled.\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type {\n AgentTool,\n AgentToolContext,\n ToolResult,\n ToolsetProvider,\n} from \"@tianshu-ai/plugin-sdk\";\nimport { okResult, errorResult } from \"@tianshu-ai/plugin-sdk\";\nimport type { BridgeRegistry, BridgeConn } from \"./registry.js\";\nimport type { McpToolDescriptor, ToolsCallResult } from \"./protocol.js\";\n\nconst SHOTS_DIR = \"bridge-screenshots\";\nconst EXT_BY_MIME: Record<string, string> = {\n \"image/png\": \"png\",\n \"image/jpeg\": \"jpg\",\n \"image/webp\": \"webp\",\n \"image/gif\": \"gif\",\n};\n\n/** Sanitise a device/tool id into a tool-name-safe token. */\nfunction slug(s: string): string {\n return s.replace(/[^a-zA-Z0-9]+/g, \"_\").replace(/^_+|_+$/g, \"\").toLowerCase();\n}\n\n/** Fully-qualified agent tool name for a bridge tool. */\nexport function toolName(deviceId: string, tool: string): string {\n return `bridge_${slug(deviceId)}_${slug(tool)}`;\n}\n\n/** Save any image blocks in a tools/call result under the user's dir,\n * returning their workspace-relative paths. Keeps bytes OUT of the\n * agent context. */\nfunction saveImageBlocks(\n res: ToolsCallResult,\n userHome: string,\n): string[] {\n const saved: string[] = [];\n const dir = path.join(userHome, SHOTS_DIR);\n for (const c of res.content ?? []) {\n if (c.type !== \"image\") continue;\n const data = typeof c.data === \"string\" ? c.data : \"\";\n if (!data) continue;\n const mime = typeof c.mimeType === \"string\" ? c.mimeType : \"image/png\";\n const ext = EXT_BY_MIME[mime] ?? \"png\";\n try {\n fs.mkdirSync(dir, { recursive: true });\n const rel = path.join(SHOTS_DIR, `${Date.now()}-${saved.length}.${ext}`);\n fs.writeFileSync(path.join(userHome, rel), Buffer.from(data, \"base64\"));\n saved.push(rel);\n } catch {\n /* best-effort; skip on write failure */\n }\n }\n return saved;\n}\n\n/** Flatten a tools/call result for the agent: text blocks joined, and\n * image blocks saved to disk with their PATHS surfaced (not bytes). */\nfunction renderResult(res: ToolsCallResult, userHome: string): ToolResult {\n const textParts = (res.content ?? [])\n .map((c) => (typeof c.text === \"string\" ? c.text : \"\"))\n .filter(Boolean);\n const savedImages = saveImageBlocks(res, userHome);\n let text = textParts.join(\"\\n\").trim();\n if (savedImages.length) {\n const note =\n `Saved ${savedImages.length} image(s) to your workspace:\\n` +\n savedImages.map((p) => ` - ${p}`).join(\"\\n\") +\n `\\nTo look at one, call bridge_view_image with its path.`;\n text = text ? `${text}\\n${note}` : note;\n }\n text = text || \"(no content)\";\n return res.isError ? errorResult(text, res) : okResult(text, res);\n}\n\nexport function makeBridgeToolset(args: {\n registry: BridgeRegistry;\n /** Resolve a user's workspace dir (from PluginContext.userHomeDir). */\n userHomeDir: (userId: string) => string;\n log: { info: (m: string) => void; warn: (m: string) => void };\n}): ToolsetProvider {\n const { registry, userHomeDir } = args;\n return {\n name: \"bridge\",\n listTools(): AgentTool[] {\n const tools: AgentTool[] = [];\n const conns = registry.all();\n // One view_image tool per user with a bridge (user-scoped via\n // available()), so the agent can inline a saved screenshot when\n // it actually needs to see it.\n const usersWithBridge = new Set(conns.map((c) => c.userId));\n for (const uid of usersWithBridge) {\n tools.push(buildViewImageTool(uid, userHomeDir));\n }\n for (const conn of conns) {\n for (const t of conn.tools) {\n tools.push(buildTool(registry, userHomeDir, conn.userId, conn.deviceId, t));\n }\n }\n return tools;\n },\n };\n}\n\nfunction buildTool(\n registry: BridgeRegistry,\n userHomeDir: (userId: string) => string,\n userId: string,\n deviceId: string,\n desc: McpToolDescriptor,\n): AgentTool {\n const parameters =\n desc.inputSchema && typeof desc.inputSchema === \"object\"\n ? (desc.inputSchema as Record<string, unknown>)\n : { type: \"object\", properties: {}, additionalProperties: true };\n return {\n schema: {\n name: toolName(deviceId, desc.name),\n description:\n (desc.description ?? `Local bridge tool \"${desc.name}\" on device \"${deviceId}\".`) +\n ` (Runs on the user's own machine via the Local Bridge device \"${deviceId}\".)`,\n parameters: parameters as never,\n },\n available(ctx: AgentToolContext): boolean {\n return ctx.userId === userId;\n },\n async execute(rawArgs: Record<string, unknown>, ctx: AgentToolContext): Promise<ToolResult> {\n if (ctx.userId !== userId) {\n return errorResult(\"This bridge tool belongs to a different user.\");\n }\n const conn = registry.forUser(userId).find((c) => c.deviceId === deviceId);\n if (!conn) {\n return errorResult(\n `Local Bridge device \"${deviceId}\" is not connected. Start the bridge client and try again.`,\n );\n }\n try {\n const result = await registry.call(conn, \"tools/call\", {\n name: desc.name,\n arguments: rawArgs,\n });\n return renderResult((result ?? {}) as ToolsCallResult, userHomeDir(userId));\n } catch (err) {\n return errorResult(\n `Local Bridge call failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n },\n };\n}\n\n/** On-demand image viewer: read a previously-saved bridge image and\n * return it as an ImageContent so the vision model sees it THIS turn.\n * This is the only place bytes enter the agent context. */\nfunction buildViewImageTool(\n userId: string,\n userHomeDir: (userId: string) => string,\n): AgentTool {\n return {\n schema: {\n name: \"bridge_view_image\",\n description:\n \"Look at an image the Local Bridge saved to your workspace (e.g. a browser screenshot). \" +\n \"Pass the workspace-relative path returned by a bridge tool (like bridge-screenshots/....png). \" +\n \"The image is shown to you for this turn only.\",\n parameters: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Workspace-relative path of the saved image, e.g. bridge-screenshots/1720000000000-0.png\",\n },\n },\n required: [\"path\"],\n } as never,\n },\n available(ctx: AgentToolContext): boolean {\n return ctx.userId === userId;\n },\n async execute(rawArgs: Record<string, unknown>, ctx: AgentToolContext): Promise<ToolResult> {\n if (ctx.userId !== userId) return errorResult(\"Not your bridge image.\");\n const rel = String(rawArgs.path ?? \"\").trim();\n // Path-safety: must stay under the user's SHOTS_DIR.\n const home = userHomeDir(userId);\n const abs = path.resolve(home, rel);\n const shotsRoot = path.resolve(home, SHOTS_DIR);\n if (!abs.startsWith(shotsRoot + path.sep)) {\n return errorResult(`Path must be under ${SHOTS_DIR}/. Got: ${rel}`);\n }\n let buf: Buffer;\n try {\n buf = fs.readFileSync(abs);\n } catch {\n return errorResult(`Image not found: ${rel}`);\n }\n const ext = path.extname(abs).slice(1).toLowerCase();\n const mimeType =\n ext === \"jpg\" || ext === \"jpeg\" ? \"image/jpeg\" : ext === \"webp\" ? \"image/webp\" : ext === \"gif\" ? \"image/gif\" : \"image/png\";\n return {\n ok: true,\n text: `Showing ${rel}.`,\n images: [{ base64: buf.toString(\"base64\"), mimeType }],\n };\n },\n };\n}\n", "// reverse-mcp plugin \u2014 server side.\n//\n// A bridge client connects to the existing authenticated chat\n// WebSocket (`/ws`) with `Authorization: Bearer <token>`, so the host's\n// identity resolver chain has already established (tenantId, userId) and\n// stamped `userId` on the socket. The client then sends\n// `reverse_mcp_register` advertising the tools it can run locally; the\n// agent calls them via a ToolsetProvider that does a JSON-RPC round-trip\n// back over the same socket (`reverse_mcp_request` / `_response`).\n//\n// This is route 1 (reuse /ws) + scheme 1a (Bearer session token): zero\n// new endpoints, auth reused. The envelope is a thin wrapper around\n// standard MCP JSON-RPC so it can later move to a dedicated endpoint.\n\nimport type {\n PluginContext,\n PluginServerExports,\n PluginServerModule,\n PluginRouteHandler,\n PluginWsHandler,\n BridgeTokenCapability,\n} from \"@tianshu-ai/plugin-sdk\";\nimport type { WebSocket } from \"ws\";\nimport { BridgeRegistry } from \"./registry.js\";\nimport { makeBridgeToolset } from \"./toolset.js\";\nimport {\n MSG,\n type McpToolDescriptor,\n type RegisterMsg,\n type ResponseMsg,\n} from \"./protocol.js\";\n\n/** Read the identity the host stamped on the chat socket. */\nfunction socketUserId(socket: WebSocket): string {\n return (socket as unknown as { userId?: string }).userId ?? \"\";\n}\n\nconst plugin: PluginServerModule = {\n activate(ctx: PluginContext): PluginServerExports {\n const registry = new BridgeRegistry();\n\n // client \u2192 server: register a device + its tools.\n const onRegister: PluginWsHandler = (msg, socket) => {\n const userId = socketUserId(socket);\n if (!userId) {\n socket.send(\n JSON.stringify({ type: MSG.registered, ok: false, error: \"no user identity on socket\" }),\n );\n return;\n }\n const m = msg as unknown as RegisterMsg;\n const deviceId = typeof m.deviceId === \"string\" && m.deviceId ? m.deviceId : \"default\";\n const tools: McpToolDescriptor[] = Array.isArray(m.tools)\n ? m.tools.filter((t) => t && typeof t.name === \"string\")\n : [];\n registry.register({ userId, deviceId, label: m.label, socket, tools });\n ctx.log.info(\n `bridge registered: user=${userId} device=${deviceId} tools=${tools.length}`,\n );\n socket.send(JSON.stringify({ type: MSG.registered, ok: true, deviceId }));\n // Let panels refresh.\n ctx.broadcast(\"connections_changed\", { userId });\n };\n\n // client \u2192 server: a JSON-RPC reply to a request we sent.\n const onResponse: PluginWsHandler = (msg, socket) => {\n const m = msg as unknown as ResponseMsg;\n if (typeof m.id !== \"string\") return;\n registry.settle(socket, m.id, m.result, m.error);\n };\n\n // client \u2192 server: graceful unregister.\n const onUnregister: PluginWsHandler = (_msg, socket) => {\n registry.removeBySocket(socket);\n ctx.broadcast(\"connections_changed\", {});\n };\n\n // Clean up when a bridge socket drops. wsHandlers don't get a\n // close event, so we can't hook it here directly; instead the\n // registry.settle/forUser paths tolerate dead sockets, and a\n // dropped socket is pruned on the next failed send. (A future\n // core hook can call removeBySocket on close.)\n\n const toolset = makeBridgeToolset({\n registry,\n userHomeDir: (uid: string) => ctx.userHomeDir(uid),\n log: ctx.log,\n });\n\n // Panel/debug: list this user's connected devices + tool counts.\n const listConnections: PluginRouteHandler = (req, res) => {\n const userId = (req as { ctx?: { userId?: string } }).ctx?.userId ?? \"\";\n if (!userId) return void res.status(401).json({ error: \"no user context\" });\n const conns = registry.forUser(userId).map((c) => ({\n deviceId: c.deviceId,\n label: c.label,\n connectedAt: c.connectedAt,\n tools: c.tools.map((t) => t.name),\n }));\n res.json({ connections: conns });\n };\n\n // Panel: everything needed to start a local bridge \u2014 the WS URL,\n // a freshly-minted connection token, and a ready-to-run command.\n const connectInfo: PluginRouteHandler = (req, res) => {\n const userId = (req as { ctx?: { userId?: string } }).ctx?.userId ?? \"\";\n if (!userId) return void res.status(401).json({ error: \"no user context\" });\n // Derive the public wss:// URL from the incoming request so it\n // works behind a tunnel/proxy (Cloudflare sets X-Forwarded-*).\n const fwdProto =\n (req.headers[\"x-forwarded-proto\"] as string | undefined)?.split(\",\")[0]?.trim();\n const host =\n (req.headers[\"x-forwarded-host\"] as string | undefined) ||\n (req.headers.host as string | undefined) ||\n \"localhost\";\n const secure = fwdProto ? fwdProto === \"https\" : false;\n const wsScheme = secure ? \"wss\" : \"ws\";\n const wsUrl = `${wsScheme}://${host}/ws`;\n\n const minter = ctx.capabilities.get<BridgeTokenCapability>(\"host.bridgeToken\");\n const grant = minter?.mint(userId) ?? {\n token: \"\",\n authEnabled: false,\n expiresAt: null,\n };\n const tokenArg = grant.authEnabled ? ` --token ${grant.token}` : \"\";\n // Base command (no capability flags). The panel appends the\n // capability/engine flags the user selects (e.g.\n // `--browser-engine stealth`), so capability exposure is chosen\n // by the user on their own machine, not toggled remotely.\n const baseCommand = `npx @tianshu-ai/local-bridge --server ${wsUrl}${tokenArg}`;\n res.json({\n wsUrl,\n authEnabled: grant.authEnabled,\n token: grant.token,\n expiresAt: grant.expiresAt,\n baseCommand,\n command: baseCommand,\n });\n };\n\n ctx.log.info(\"reverse-mcp activated\");\n return {\n wsHandlers: {\n onRegister,\n onResponse,\n onUnregister,\n },\n toolsetProviders: {\n BridgeToolset: toolset,\n },\n routes: {\n listConnections,\n connectInfo,\n },\n };\n },\n async deactivate() {\n /* connections are per-socket; they drop when the sockets close */\n },\n};\n\nexport const activate = plugin.activate.bind(plugin);\nexport const deactivate = plugin.deactivate?.bind(plugin);\nexport default plugin;\n"],
|
|
5
|
-
"mappings": ";;;AAsBO,IAAM,MAAM;AAAA,EACjB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AACd;;;ACDA,IAAM,kBAAkB;AAEjB,IAAM,iBAAN,MAAqB;AAAA;AAAA,EAET,QAAQ,oBAAI,IAAwB;AAAA,EAC7C,MAAM;AAAA,EAEN,IAAI,QAAgB,UAA0B;AACpD,WAAO,GAAG,MAAM,KAAS,QAAQ;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAMM;AACb,UAAM,IAAI,KAAK,IAAI,KAAK,QAAQ,KAAK,QAAQ;AAC7C,UAAM,WAAW,KAAK,MAAM,IAAI,CAAC;AACjC,QAAI,YAAY,SAAS,WAAW,KAAK,QAAQ;AAC/C,WAAK,YAAY,UAAU,8BAA8B;AAAA,IAC3D;AACA,UAAM,OAAmB;AAAA,MACvB,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,MACf,OAAO,KAAK,SAAS,KAAK;AAAA,MAC1B,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK,IAAI;AAAA,MACtB,SAAS,UAAU,WAAW,oBAAI,IAAI;AAAA,IACxC;AACA,SAAK,MAAM,IAAI,GAAG,IAAI;AACtB,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,eAAe,QAAyB;AACtC,eAAW,CAAC,GAAG,CAAC,KAAK,KAAK,OAAO;AAC/B,UAAI,EAAE,WAAW,QAAQ;AACvB,aAAK,YAAY,GAAG,mBAAmB;AACvC,aAAK,MAAM,OAAO,CAAC;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,QAAgB,UAAwB;AAC7C,UAAM,IAAI,KAAK,IAAI,QAAQ,QAAQ;AACnC,UAAM,IAAI,KAAK,MAAM,IAAI,CAAC;AAC1B,QAAI,GAAG;AACL,WAAK,YAAY,GAAG,cAAc;AAClC,WAAK,MAAM,OAAO,CAAC;AAAA,IACrB;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ,QAA8B;AACpC,WAAO,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM;AAAA,EACnE;AAAA;AAAA,EAGA,MAAoB;AAClB,WAAO,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC;AAAA,EAChC;AAAA;AAAA,EAGA,OAAO,QAAmB,IAAY,QAAiB,OAAmC;AACxF,eAAW,KAAK,KAAK,MAAM,OAAO,GAAG;AACnC,UAAI,EAAE,WAAW,OAAQ;AACzB,YAAM,IAAI,EAAE,QAAQ,IAAI,EAAE;AAC1B,UAAI,CAAC,EAAG;AACR,QAAE,QAAQ,OAAO,EAAE;AACnB,mBAAa,EAAE,KAAK;AACpB,UAAI,MAAO,GAAE,OAAO,IAAI,MAAM,MAAM,OAAO,CAAC;AAAA,UACvC,GAAE,QAAQ,MAAM;AACrB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,KAAK,MAAkB,QAAgB,QAAoD;AACzF,UAAM,KAAK,GAAG,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AACtC,UAAM,MAAkB,EAAE,MAAM,IAAI,SAAS,IAAI,QAAQ,OAAO;AAChE,WAAO,IAAI,QAAiB,CAAC,SAAS,WAAW;AAC/C,YAAM,QAAQ,WAAW,MAAM;AAC7B,aAAK,QAAQ,OAAO,EAAE;AACtB,eAAO,IAAI,MAAM,+BAA+B,eAAe,OAAO,MAAM,GAAG,CAAC;AAAA,MAClF,GAAG,eAAe;AAClB,WAAK,QAAQ,IAAI,IAAI,EAAE,SAAS,QAAQ,MAAM,CAAC;AAC/C,UAAI;AACF,aAAK,OAAO,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,MACtC,SAAS,KAAK;AACZ,aAAK,QAAQ,OAAO,EAAE;AACtB,qBAAa,KAAK;AAClB,eAAO,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,MAC5D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,YAAY,MAAkB,QAAsB;AAC1D,eAAW,KAAK,KAAK,QAAQ,OAAO,GAAG;AACrC,mBAAa,EAAE,KAAK;AACpB,QAAE,OAAO,IAAI,MAAM,UAAU,MAAM,EAAE,CAAC;AAAA,IACxC;AACA,SAAK,QAAQ,MAAM;AAAA,EACrB;AACF;;;ACzHA,OAAO,QAAQ;AACf,OAAO,UAAU;AAOjB,SAAS,UAAU,mBAAmB;AAItC,IAAM,YAAY;AAClB,IAAM,cAAsC;AAAA,EAC1C,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AACf;AAGA,SAAS,KAAK,GAAmB;AAC/B,SAAO,EAAE,QAAQ,kBAAkB,GAAG,EAAE,QAAQ,YAAY,EAAE,EAAE,YAAY;AAC9E;AAGO,SAAS,SAAS,UAAkB,MAAsB;AAC/D,SAAO,UAAU,KAAK,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC;AAC/C;AAKA,SAAS,gBACP,KACA,UACU;AACV,QAAM,QAAkB,CAAC;AACzB,QAAM,MAAM,KAAK,KAAK,UAAU,SAAS;AACzC,aAAW,KAAK,IAAI,WAAW,CAAC,GAAG;AACjC,QAAI,EAAE,SAAS,QAAS;AACxB,UAAM,OAAO,OAAO,EAAE,SAAS,WAAW,EAAE,OAAO;AACnD,QAAI,CAAC,KAAM;AACX,UAAM,OAAO,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;AAC3D,UAAM,MAAM,YAAY,IAAI,KAAK;AACjC,QAAI;AACF,SAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AACrC,YAAM,MAAM,KAAK,KAAK,WAAW,GAAG,KAAK,IAAI,CAAC,IAAI,MAAM,MAAM,IAAI,GAAG,EAAE;AACvE,SAAG,cAAc,KAAK,KAAK,UAAU,GAAG,GAAG,OAAO,KAAK,MAAM,QAAQ,CAAC;AACtE,YAAM,KAAK,GAAG;AAAA,IAChB,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAIA,SAAS,aAAa,KAAsB,UAA8B;AACxE,QAAM,aAAa,IAAI,WAAW,CAAC,GAChC,IAAI,CAAC,MAAO,OAAO,EAAE,SAAS,WAAW,EAAE,OAAO,EAAG,EACrD,OAAO,OAAO;AACjB,QAAM,cAAc,gBAAgB,KAAK,QAAQ;AACjD,MAAI,OAAO,UAAU,KAAK,IAAI,EAAE,KAAK;AACrC,MAAI,YAAY,QAAQ;AACtB,UAAM,OACJ,SAAS,YAAY,MAAM;AAAA,IAC3B,YAAY,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,EAAE,KAAK,IAAI,IAC5C;AAAA;AACF,WAAO,OAAO,GAAG,IAAI;AAAA,EAAK,IAAI,KAAK;AAAA,EACrC;AACA,SAAO,QAAQ;AACf,SAAO,IAAI,UAAU,YAAY,MAAM,GAAG,IAAI,SAAS,MAAM,GAAG;AAClE;AAEO,SAAS,kBAAkB,MAKd;AAClB,QAAM,EAAE,UAAU,YAAY,IAAI;AAClC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAyB;AACvB,YAAM,QAAqB,CAAC;AAC5B,YAAM,QAAQ,SAAS,IAAI;AAI3B,YAAM,kBAAkB,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAC1D,iBAAW,OAAO,iBAAiB;AACjC,cAAM,KAAK,mBAAmB,KAAK,WAAW,CAAC;AAAA,MACjD;AACA,iBAAW,QAAQ,OAAO;AACxB,mBAAW,KAAK,KAAK,OAAO;AAC1B,gBAAM,KAAK,UAAU,UAAU,aAAa,KAAK,QAAQ,KAAK,UAAU,CAAC,CAAC;AAAA,QAC5E;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,UACP,UACA,aACA,QACA,UACA,MACW;AACX,QAAM,aACJ,KAAK,eAAe,OAAO,KAAK,gBAAgB,WAC3C,KAAK,cACN,EAAE,MAAM,UAAU,YAAY,CAAC,GAAG,sBAAsB,KAAK;AACnE,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM,SAAS,UAAU,KAAK,IAAI;AAAA,MAClC,cACG,KAAK,eAAe,sBAAsB,KAAK,IAAI,gBAAgB,QAAQ,QAC5E,iEAAiE,QAAQ;AAAA,MAC3E;AAAA,IACF;AAAA,IACA,UAAU,KAAgC;AACxC,aAAO,IAAI,WAAW;AAAA,IACxB;AAAA,IACA,MAAM,QAAQ,SAAkC,KAA4C;AAC1F,UAAI,IAAI,WAAW,QAAQ;AACzB,eAAO,YAAY,+CAA+C;AAAA,MACpE;AACA,YAAM,OAAO,SAAS,QAAQ,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,aAAa,QAAQ;AACzE,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,UACL,wBAAwB,QAAQ;AAAA,QAClC;AAAA,MACF;AACA,UAAI;AACF,cAAM,SAAS,MAAM,SAAS,KAAK,MAAM,cAAc;AAAA,UACrD,MAAM,KAAK;AAAA,UACX,WAAW;AAAA,QACb,CAAC;AACD,eAAO,aAAc,UAAU,CAAC,GAAuB,YAAY,MAAM,CAAC;AAAA,MAC5E,SAAS,KAAK;AACZ,eAAO;AAAA,UACL,6BAA6B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAC/E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKA,SAAS,mBACP,QACA,aACW;AACX,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aACE;AAAA,MAGF,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,UAAU,CAAC,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,IACA,UAAU,KAAgC;AACxC,aAAO,IAAI,WAAW;AAAA,IACxB;AAAA,IACA,MAAM,QAAQ,SAAkC,KAA4C;AAC1F,UAAI,IAAI,WAAW,OAAQ,QAAO,YAAY,wBAAwB;AACtE,YAAM,MAAM,OAAO,QAAQ,QAAQ,EAAE,EAAE,KAAK;AAE5C,YAAM,OAAO,YAAY,MAAM;AAC/B,YAAM,MAAM,KAAK,QAAQ,MAAM,GAAG;AAClC,YAAM,YAAY,KAAK,QAAQ,MAAM,SAAS;AAC9C,UAAI,CAAC,IAAI,WAAW,YAAY,KAAK,GAAG,GAAG;AACzC,eAAO,YAAY,sBAAsB,SAAS,WAAW,GAAG,EAAE;AAAA,MACpE;AACA,UAAI;AACJ,UAAI;AACF,cAAM,GAAG,aAAa,GAAG;AAAA,MAC3B,QAAQ;AACN,eAAO,YAAY,oBAAoB,GAAG,EAAE;AAAA,MAC9C;AACA,YAAM,MAAM,KAAK,QAAQ,GAAG,EAAE,MAAM,CAAC,EAAE,YAAY;AACnD,YAAM,WACJ,QAAQ,SAAS,QAAQ,SAAS,eAAe,QAAQ,SAAS,eAAe,QAAQ,QAAQ,cAAc;AACjH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,WAAW,GAAG;AAAA,QACpB,QAAQ,CAAC,EAAE,QAAQ,IAAI,SAAS,QAAQ,GAAG,SAAS,CAAC;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AACF;;;AC7LA,SAAS,aAAa,QAA2B;AAC/C,SAAQ,OAA0C,UAAU;AAC9D;AAEA,IAAM,SAA6B;AAAA,EACjC,SAAS,KAAyC;
|
|
4
|
+
"sourcesContent": ["// Reverse-MCP wire protocol.\n//\n// Transport: the existing authenticated chat WebSocket (`/ws`). The\n// bridge client connects with `Authorization: Bearer <token>` so the\n// host's identity resolver chain already knows (tenantId, userId) \u2014 we\n// never invent our own auth here. On top of that channel we exchange a\n// THIN envelope around standard MCP JSON-RPC, so the same payloads can\n// later move to a dedicated endpoint (route 2) unchanged.\n//\n// Direction is inverted vs. normal MCP: the SERVER is the JSON-RPC\n// client (sends tools/list, tools/call), the dialed-in BRIDGE is the\n// JSON-RPC server (executes locally, replies).\n//\n// Message types (all ride the shared /ws channel):\n// client \u2192 server:\n// reverse_mcp_register { deviceId, tools: McpToolDescriptor[] }\n// reverse_mcp_response { id, result? , error? } // JSON-RPC reply\n// reverse_mcp_unregister { } // graceful bye\n// server \u2192 client:\n// reverse_mcp_request { id, method, params } // JSON-RPC call\n// reverse_mcp_registered { ok, deviceId } // ack\n\nexport const MSG = {\n register: \"reverse_mcp_register\",\n unregister: \"reverse_mcp_unregister\",\n response: \"reverse_mcp_response\",\n request: \"reverse_mcp_request\",\n registered: \"reverse_mcp_registered\",\n} as const;\n\n/** A tool the bridge advertises at register time. Mirrors the MCP\n * `Tool` shape (name + description + JSON-schema input). */\nexport interface McpToolDescriptor {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n}\n\n/** client \u2192 server: announce this device + the tools it offers. */\nexport interface RegisterMsg {\n type: typeof MSG.register;\n deviceId: string;\n /** Human label for the device, shown in the panel. */\n label?: string;\n tools: McpToolDescriptor[];\n}\n\n/** server \u2192 client: a JSON-RPC request to execute locally. */\nexport interface RequestMsg {\n type: typeof MSG.request;\n id: string;\n method: string; // e.g. \"tools/call\"\n params?: Record<string, unknown>;\n}\n\n/** client \u2192 server: a JSON-RPC reply. */\nexport interface ResponseMsg {\n type: typeof MSG.response;\n id: string;\n result?: unknown;\n error?: { code: number; message: string };\n}\n\n/** Standard MCP `tools/call` params. */\nexport interface ToolsCallParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\n/** Standard MCP `tools/call` result: a list of content blocks. We\n * flatten text blocks for the agent. */\nexport interface ToolsCallResult {\n content?: Array<{ type: string; text?: string; [k: string]: unknown }>;\n isError?: boolean;\n}\n", "// In-memory registry of dialed-in bridge connections, scoped to one\n// tenant (the plugin activates per tenant, closing over ctx.tenantId).\n//\n// A connection is identified by (userId, deviceId). Each holds the live\n// WebSocket, the advertised tool list, and a map of in-flight JSON-RPC\n// calls awaiting their reply. Everything is best-effort and self-heals:\n// a dropped socket removes the connection; a timed-out call rejects.\n\nimport type { WebSocket } from \"ws\";\nimport { MSG, type McpToolDescriptor, type RequestMsg } from \"./protocol.js\";\n\ninterface Pending {\n resolve: (result: unknown) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\nexport interface BridgeConn {\n userId: string;\n deviceId: string;\n label: string;\n socket: WebSocket;\n tools: McpToolDescriptor[];\n connectedAt: number;\n pending: Map<string, Pending>;\n}\n\nconst CALL_TIMEOUT_MS = 60_000;\n\nexport class BridgeRegistry {\n // key = `${userId}\\u0000${deviceId}`\n private readonly conns = new Map<string, BridgeConn>();\n private seq = 0;\n\n private key(userId: string, deviceId: string): string {\n return `${userId}\\u0000${deviceId}`;\n }\n\n /** Register (or replace) a connection for a device. If the same\n * (user, device) reconnects, the old socket's pending calls are\n * rejected and it is replaced. */\n register(args: {\n userId: string;\n deviceId: string;\n label?: string;\n socket: WebSocket;\n tools: McpToolDescriptor[];\n }): BridgeConn {\n const k = this.key(args.userId, args.deviceId);\n const existing = this.conns.get(k);\n if (existing && existing.socket !== args.socket) {\n this.dropPending(existing, \"replaced by a new connection\");\n }\n const conn: BridgeConn = {\n userId: args.userId,\n deviceId: args.deviceId,\n label: args.label || args.deviceId,\n socket: args.socket,\n tools: args.tools,\n connectedAt: Date.now(),\n pending: existing?.pending ?? new Map(),\n };\n this.conns.set(k, conn);\n return conn;\n }\n\n /** Remove whatever connection owns this socket (on close/unregister). */\n removeBySocket(socket: WebSocket): void {\n for (const [k, c] of this.conns) {\n if (c.socket === socket) {\n this.dropPending(c, \"connection closed\");\n this.conns.delete(k);\n }\n }\n }\n\n remove(userId: string, deviceId: string): void {\n const k = this.key(userId, deviceId);\n const c = this.conns.get(k);\n if (c) {\n this.dropPending(c, \"unregistered\");\n this.conns.delete(k);\n }\n }\n\n /** All connections for a user (a user may run several devices). */\n forUser(userId: string): BridgeConn[] {\n return [...this.conns.values()].filter((c) => c.userId === userId);\n }\n\n /** Every connection in this (tenant-scoped) registry. */\n all(): BridgeConn[] {\n return [...this.conns.values()];\n }\n\n /** Resolve a pending JSON-RPC reply arriving from a bridge. */\n settle(socket: WebSocket, id: string, result: unknown, error?: { message: string }): void {\n for (const c of this.conns.values()) {\n if (c.socket !== socket) continue;\n const p = c.pending.get(id);\n if (!p) return;\n c.pending.delete(id);\n clearTimeout(p.timer);\n if (error) p.reject(new Error(error.message));\n else p.resolve(result);\n return;\n }\n }\n\n /** Send a JSON-RPC request to a specific connection and await the\n * reply (or timeout). */\n call(conn: BridgeConn, method: string, params?: Record<string, unknown>): Promise<unknown> {\n const id = `${Date.now()}-${++this.seq}`;\n const req: RequestMsg = { type: MSG.request, id, method, params };\n return new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n conn.pending.delete(id);\n reject(new Error(`bridge call timed out after ${CALL_TIMEOUT_MS}ms (${method})`));\n }, CALL_TIMEOUT_MS);\n conn.pending.set(id, { resolve, reject, timer });\n try {\n conn.socket.send(JSON.stringify(req));\n } catch (err) {\n conn.pending.delete(id);\n clearTimeout(timer);\n reject(err instanceof Error ? err : new Error(String(err)));\n }\n });\n }\n\n private dropPending(conn: BridgeConn, reason: string): void {\n for (const p of conn.pending.values()) {\n clearTimeout(p.timer);\n p.reject(new Error(`bridge ${reason}`));\n }\n conn.pending.clear();\n }\n}\n", "// A ToolsetProvider backed by the dialed-in bridge connections. The\n// host calls listTools() every agent turn, so tools appear/disappear as\n// bridges connect/disconnect with no plugin reactivation.\n//\n// Each bridge tool becomes an AgentTool named `bridge_<device>_<tool>`.\n// `available()` hides it from users who don't own that bridge; the\n// tenant scope is already fixed (this provider is created per-tenant).\n// `execute()` does the async JSON-RPC round-trip to the owning device.\n//\n// Screenshots / images: a bridge tool result may carry MCP image\n// blocks (base64). To keep the agent context small we DON'T inline\n// those bytes into the tool result. Instead we save each image under\n// the user's dir and return only its PATH + dimensions. The agent then\n// calls `bridge_view_image(path)` on demand \u2014 that tool inlines the\n// bytes as an ImageContent for the vision model, one turn, controlled.\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type {\n AgentTool,\n AgentToolContext,\n ToolResult,\n ToolsetProvider,\n} from \"@tianshu-ai/plugin-sdk\";\nimport { okResult, errorResult } from \"@tianshu-ai/plugin-sdk\";\nimport type { BridgeRegistry, BridgeConn } from \"./registry.js\";\nimport type { McpToolDescriptor, ToolsCallResult } from \"./protocol.js\";\n\nconst SHOTS_DIR = \"bridge-screenshots\";\nconst EXT_BY_MIME: Record<string, string> = {\n \"image/png\": \"png\",\n \"image/jpeg\": \"jpg\",\n \"image/webp\": \"webp\",\n \"image/gif\": \"gif\",\n};\n\n/** Sanitise a device/tool id into a tool-name-safe token. */\nfunction slug(s: string): string {\n return s.replace(/[^a-zA-Z0-9]+/g, \"_\").replace(/^_+|_+$/g, \"\").toLowerCase();\n}\n\n/** Fully-qualified agent tool name for a bridge tool. */\nexport function toolName(deviceId: string, tool: string): string {\n return `bridge_${slug(deviceId)}_${slug(tool)}`;\n}\n\n/** Save any image blocks in a tools/call result under the user's dir,\n * returning their workspace-relative paths. Keeps bytes OUT of the\n * agent context. */\nfunction saveImageBlocks(\n res: ToolsCallResult,\n userHome: string,\n): string[] {\n const saved: string[] = [];\n const dir = path.join(userHome, SHOTS_DIR);\n for (const c of res.content ?? []) {\n if (c.type !== \"image\") continue;\n const data = typeof c.data === \"string\" ? c.data : \"\";\n if (!data) continue;\n const mime = typeof c.mimeType === \"string\" ? c.mimeType : \"image/png\";\n const ext = EXT_BY_MIME[mime] ?? \"png\";\n try {\n fs.mkdirSync(dir, { recursive: true });\n const rel = path.join(SHOTS_DIR, `${Date.now()}-${saved.length}.${ext}`);\n fs.writeFileSync(path.join(userHome, rel), Buffer.from(data, \"base64\"));\n saved.push(rel);\n } catch {\n /* best-effort; skip on write failure */\n }\n }\n return saved;\n}\n\n/** Flatten a tools/call result for the agent: text blocks joined, and\n * image blocks saved to disk with their PATHS surfaced (not bytes). */\nfunction renderResult(res: ToolsCallResult, userHome: string): ToolResult {\n const textParts = (res.content ?? [])\n .map((c) => (typeof c.text === \"string\" ? c.text : \"\"))\n .filter(Boolean);\n const savedImages = saveImageBlocks(res, userHome);\n let text = textParts.join(\"\\n\").trim();\n if (savedImages.length) {\n const note =\n `Saved ${savedImages.length} image(s) to your workspace:\\n` +\n savedImages.map((p) => ` - ${p}`).join(\"\\n\") +\n `\\nTo look at one, call bridge_view_image with its path.`;\n text = text ? `${text}\\n${note}` : note;\n }\n text = text || \"(no content)\";\n return res.isError ? errorResult(text, res) : okResult(text, res);\n}\n\nexport function makeBridgeToolset(args: {\n registry: BridgeRegistry;\n /** Resolve a user's workspace dir (from PluginContext.userHomeDir). */\n userHomeDir: (userId: string) => string;\n log: { info: (m: string) => void; warn: (m: string) => void };\n}): ToolsetProvider {\n const { registry, userHomeDir } = args;\n return {\n name: \"bridge\",\n listTools(): AgentTool[] {\n const tools: AgentTool[] = [];\n const conns = registry.all();\n // One view_image tool per user with a bridge (user-scoped via\n // available()), so the agent can inline a saved screenshot when\n // it actually needs to see it.\n const usersWithBridge = new Set(conns.map((c) => c.userId));\n for (const uid of usersWithBridge) {\n tools.push(buildViewImageTool(uid, userHomeDir));\n }\n for (const conn of conns) {\n for (const t of conn.tools) {\n tools.push(buildTool(registry, userHomeDir, conn.userId, conn.deviceId, t));\n }\n }\n return tools;\n },\n };\n}\n\nfunction buildTool(\n registry: BridgeRegistry,\n userHomeDir: (userId: string) => string,\n userId: string,\n deviceId: string,\n desc: McpToolDescriptor,\n): AgentTool {\n const parameters =\n desc.inputSchema && typeof desc.inputSchema === \"object\"\n ? (desc.inputSchema as Record<string, unknown>)\n : { type: \"object\", properties: {}, additionalProperties: true };\n return {\n schema: {\n name: toolName(deviceId, desc.name),\n description:\n (desc.description ?? `Local bridge tool \"${desc.name}\" on device \"${deviceId}\".`) +\n ` (Runs on the user's own machine via the Local Bridge device \"${deviceId}\".)`,\n parameters: parameters as never,\n },\n available(ctx: AgentToolContext): boolean {\n return ctx.userId === userId;\n },\n async execute(rawArgs: Record<string, unknown>, ctx: AgentToolContext): Promise<ToolResult> {\n if (ctx.userId !== userId) {\n return errorResult(\"This bridge tool belongs to a different user.\");\n }\n const conn = registry.forUser(userId).find((c) => c.deviceId === deviceId);\n if (!conn) {\n return errorResult(\n `Local Bridge device \"${deviceId}\" is not connected. Start the bridge client and try again.`,\n );\n }\n try {\n const result = await registry.call(conn, \"tools/call\", {\n name: desc.name,\n arguments: rawArgs,\n });\n return renderResult((result ?? {}) as ToolsCallResult, userHomeDir(userId));\n } catch (err) {\n return errorResult(\n `Local Bridge call failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n },\n };\n}\n\n/** On-demand image viewer: read a previously-saved bridge image and\n * return it as an ImageContent so the vision model sees it THIS turn.\n * This is the only place bytes enter the agent context. */\nfunction buildViewImageTool(\n userId: string,\n userHomeDir: (userId: string) => string,\n): AgentTool {\n return {\n schema: {\n name: \"bridge_view_image\",\n description:\n \"Look at an image the Local Bridge saved to your workspace (e.g. a browser screenshot). \" +\n \"Pass the workspace-relative path returned by a bridge tool (like bridge-screenshots/....png). \" +\n \"The image is shown to you for this turn only.\",\n parameters: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Workspace-relative path of the saved image, e.g. bridge-screenshots/1720000000000-0.png\",\n },\n },\n required: [\"path\"],\n } as never,\n },\n available(ctx: AgentToolContext): boolean {\n return ctx.userId === userId;\n },\n async execute(rawArgs: Record<string, unknown>, ctx: AgentToolContext): Promise<ToolResult> {\n if (ctx.userId !== userId) return errorResult(\"Not your bridge image.\");\n const rel = String(rawArgs.path ?? \"\").trim();\n // Path-safety: must stay under the user's SHOTS_DIR.\n const home = userHomeDir(userId);\n const abs = path.resolve(home, rel);\n const shotsRoot = path.resolve(home, SHOTS_DIR);\n if (!abs.startsWith(shotsRoot + path.sep)) {\n return errorResult(`Path must be under ${SHOTS_DIR}/. Got: ${rel}`);\n }\n let buf: Buffer;\n try {\n buf = fs.readFileSync(abs);\n } catch {\n return errorResult(`Image not found: ${rel}`);\n }\n const ext = path.extname(abs).slice(1).toLowerCase();\n const mimeType =\n ext === \"jpg\" || ext === \"jpeg\" ? \"image/jpeg\" : ext === \"webp\" ? \"image/webp\" : ext === \"gif\" ? \"image/gif\" : \"image/png\";\n return {\n ok: true,\n text: `Showing ${rel}.`,\n images: [{ base64: buf.toString(\"base64\"), mimeType }],\n };\n },\n };\n}\n", "// reverse-mcp plugin \u2014 server side.\n//\n// A bridge client connects to the existing authenticated chat\n// WebSocket (`/ws`) with `Authorization: Bearer <token>`, so the host's\n// identity resolver chain has already established (tenantId, userId) and\n// stamped `userId` on the socket. The client then sends\n// `reverse_mcp_register` advertising the tools it can run locally; the\n// agent calls them via a ToolsetProvider that does a JSON-RPC round-trip\n// back over the same socket (`reverse_mcp_request` / `_response`).\n//\n// This is route 1 (reuse /ws) + scheme 1a (Bearer session token): zero\n// new endpoints, auth reused. The envelope is a thin wrapper around\n// standard MCP JSON-RPC so it can later move to a dedicated endpoint.\n\nimport type {\n PluginContext,\n PluginServerExports,\n PluginServerModule,\n PluginRouteHandler,\n PluginWsHandler,\n BridgeTokenCapability,\n} from \"@tianshu-ai/plugin-sdk\";\nimport type { WebSocket } from \"ws\";\nimport { BridgeRegistry } from \"./registry.js\";\nimport { makeBridgeToolset } from \"./toolset.js\";\nimport {\n MSG,\n type McpToolDescriptor,\n type RegisterMsg,\n type ResponseMsg,\n} from \"./protocol.js\";\n\n/** Read the identity the host stamped on the chat socket. */\nfunction socketUserId(socket: WebSocket): string {\n return (socket as unknown as { userId?: string }).userId ?? \"\";\n}\n\n// Bridge connections are live WebSockets held in memory, keyed to the\n// socket. The plugin re-activates whenever the tenant's plugin set is\n// invalidated (any enable/disable/config PATCH, plugins refresh, etc.),\n// which used to create a FRESH empty BridgeRegistry each time \u2014 so an\n// already-connected bridge (registered into the old instance) became\n// invisible to the new toolset + /connections route, even though the\n// socket was still open and re-registering. Key the registry by tenant\n// at module scope so it SURVIVES re-activation and the live connections\n// (and their tool lists) persist. Cleared only when the process exits.\nconst registriesByTenant = new Map<string, BridgeRegistry>();\n\nfunction registryForTenant(tenantId: string): BridgeRegistry {\n let reg = registriesByTenant.get(tenantId);\n if (!reg) {\n reg = new BridgeRegistry();\n registriesByTenant.set(tenantId, reg);\n }\n return reg;\n}\n\nconst plugin: PluginServerModule = {\n activate(ctx: PluginContext): PluginServerExports {\n // Reused across re-activations so live bridge connections aren't\n // orphaned when the tenant's plugin registry is invalidated.\n const registry = registryForTenant(ctx.tenantId);\n\n // client \u2192 server: register a device + its tools.\n const onRegister: PluginWsHandler = (msg, socket) => {\n const userId = socketUserId(socket);\n if (!userId) {\n socket.send(\n JSON.stringify({ type: MSG.registered, ok: false, error: \"no user identity on socket\" }),\n );\n return;\n }\n const m = msg as unknown as RegisterMsg;\n const deviceId = typeof m.deviceId === \"string\" && m.deviceId ? m.deviceId : \"default\";\n const tools: McpToolDescriptor[] = Array.isArray(m.tools)\n ? m.tools.filter((t) => t && typeof t.name === \"string\")\n : [];\n registry.register({ userId, deviceId, label: m.label, socket, tools });\n ctx.log.info(\n `bridge registered: user=${userId} device=${deviceId} tools=${tools.length}`,\n );\n socket.send(JSON.stringify({ type: MSG.registered, ok: true, deviceId }));\n // Let panels refresh.\n ctx.broadcast(\"connections_changed\", { userId });\n };\n\n // client \u2192 server: a JSON-RPC reply to a request we sent.\n const onResponse: PluginWsHandler = (msg, socket) => {\n const m = msg as unknown as ResponseMsg;\n if (typeof m.id !== \"string\") return;\n registry.settle(socket, m.id, m.result, m.error);\n };\n\n // client \u2192 server: graceful unregister.\n const onUnregister: PluginWsHandler = (_msg, socket) => {\n registry.removeBySocket(socket);\n ctx.broadcast(\"connections_changed\", {});\n };\n\n // Clean up when a bridge socket drops. wsHandlers don't get a\n // close event, so we can't hook it here directly; instead the\n // registry.settle/forUser paths tolerate dead sockets, and a\n // dropped socket is pruned on the next failed send. (A future\n // core hook can call removeBySocket on close.)\n\n const toolset = makeBridgeToolset({\n registry,\n userHomeDir: (uid: string) => ctx.userHomeDir(uid),\n log: ctx.log,\n });\n\n // Panel/debug: list this user's connected devices + tool counts.\n const listConnections: PluginRouteHandler = (req, res) => {\n const userId = (req as { ctx?: { userId?: string } }).ctx?.userId ?? \"\";\n if (!userId) return void res.status(401).json({ error: \"no user context\" });\n const conns = registry.forUser(userId).map((c) => ({\n deviceId: c.deviceId,\n label: c.label,\n connectedAt: c.connectedAt,\n tools: c.tools.map((t) => t.name),\n }));\n res.json({ connections: conns });\n };\n\n // Panel: everything needed to start a local bridge \u2014 the WS URL,\n // a freshly-minted connection token, and a ready-to-run command.\n const connectInfo: PluginRouteHandler = (req, res) => {\n const userId = (req as { ctx?: { userId?: string } }).ctx?.userId ?? \"\";\n if (!userId) return void res.status(401).json({ error: \"no user context\" });\n // Derive the public wss:// URL from the incoming request so it\n // works behind a tunnel/proxy (Cloudflare sets X-Forwarded-*).\n const fwdProto =\n (req.headers[\"x-forwarded-proto\"] as string | undefined)?.split(\",\")[0]?.trim();\n const host =\n (req.headers[\"x-forwarded-host\"] as string | undefined) ||\n (req.headers.host as string | undefined) ||\n \"localhost\";\n const secure = fwdProto ? fwdProto === \"https\" : false;\n const wsScheme = secure ? \"wss\" : \"ws\";\n const wsUrl = `${wsScheme}://${host}/ws`;\n\n const minter = ctx.capabilities.get<BridgeTokenCapability>(\"host.bridgeToken\");\n const grant = minter?.mint(userId) ?? {\n token: \"\",\n authEnabled: false,\n expiresAt: null,\n };\n const tokenArg = grant.authEnabled ? ` --token ${grant.token}` : \"\";\n // Base command (no capability flags). The panel appends the\n // capability/engine flags the user selects (e.g.\n // `--browser-engine stealth`), so capability exposure is chosen\n // by the user on their own machine, not toggled remotely.\n const baseCommand = `npx @tianshu-ai/local-bridge --server ${wsUrl}${tokenArg}`;\n res.json({\n wsUrl,\n authEnabled: grant.authEnabled,\n token: grant.token,\n expiresAt: grant.expiresAt,\n baseCommand,\n command: baseCommand,\n });\n };\n\n ctx.log.info(\"reverse-mcp activated\");\n return {\n wsHandlers: {\n onRegister,\n onResponse,\n onUnregister,\n },\n toolsetProviders: {\n BridgeToolset: toolset,\n },\n routes: {\n listConnections,\n connectInfo,\n },\n };\n },\n async deactivate() {\n /* connections are per-socket; they drop when the sockets close */\n },\n};\n\nexport const activate = plugin.activate.bind(plugin);\nexport const deactivate = plugin.deactivate?.bind(plugin);\nexport default plugin;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|