sensorium-mcp 2.16.87 → 2.16.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/watcher-server.d.ts
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Watcher MCP server — lightweight standby server that agents call
|
|
3
3
|
* during sensorium updates instead of sleeping 600 seconds.
|
|
4
4
|
*
|
|
5
|
-
* Run via: npx sensorium-mcp --watcher
|
|
5
|
+
* Run via: npx sensorium-mcp --watcher (stdio)
|
|
6
|
+
* npx sensorium-mcp --watcher --watcher-port 3848 (HTTP)
|
|
6
7
|
*
|
|
7
8
|
* Registers a single tool `await_server_ready` that polls for the
|
|
8
9
|
* removal of ~/.remote-copilot-mcp/maintenance.flag.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher-server.d.ts","sourceRoot":"","sources":["../src/watcher-server.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"watcher-server.d.ts","sourceRoot":"","sources":["../src/watcher-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAoMH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUxD"}
|
package/dist/watcher-server.js
CHANGED
|
@@ -2,14 +2,18 @@
|
|
|
2
2
|
* Watcher MCP server — lightweight standby server that agents call
|
|
3
3
|
* during sensorium updates instead of sleeping 600 seconds.
|
|
4
4
|
*
|
|
5
|
-
* Run via: npx sensorium-mcp --watcher
|
|
5
|
+
* Run via: npx sensorium-mcp --watcher (stdio)
|
|
6
|
+
* npx sensorium-mcp --watcher --watcher-port 3848 (HTTP)
|
|
6
7
|
*
|
|
7
8
|
* Registers a single tool `await_server_ready` that polls for the
|
|
8
9
|
* removal of ~/.remote-copilot-mcp/maintenance.flag.
|
|
9
10
|
*/
|
|
10
11
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
11
12
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
12
|
-
import {
|
|
13
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
14
|
+
import { CallToolRequestSchema, isInitializeRequest, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
15
|
+
import { randomUUID } from "node:crypto";
|
|
16
|
+
import { createServer } from "node:http";
|
|
13
17
|
import { existsSync } from "fs";
|
|
14
18
|
import { join } from "path";
|
|
15
19
|
import { homedir } from "os";
|
|
@@ -19,7 +23,8 @@ const MAX_WAIT_MS = 600_000;
|
|
|
19
23
|
function sleep(ms) {
|
|
20
24
|
return new Promise((r) => setTimeout(r, ms));
|
|
21
25
|
}
|
|
22
|
-
|
|
26
|
+
/** Create a watcher Server instance with the await_server_ready tool. */
|
|
27
|
+
function createWatcherMcpServer() {
|
|
23
28
|
const server = new Server({ name: "sensorium-watcher", version: "1.0.0" }, { capabilities: { tools: {} } });
|
|
24
29
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
25
30
|
tools: [
|
|
@@ -66,7 +71,132 @@ export async function startWatcherServer() {
|
|
|
66
71
|
};
|
|
67
72
|
}
|
|
68
73
|
});
|
|
69
|
-
|
|
70
|
-
|
|
74
|
+
return server;
|
|
75
|
+
}
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Arg parsing
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
/** Parse --watcher-port from process.argv. Returns undefined if not set. */
|
|
80
|
+
function parseWatcherPort() {
|
|
81
|
+
const idx = process.argv.indexOf("--watcher-port");
|
|
82
|
+
if (idx === -1 || idx + 1 >= process.argv.length)
|
|
83
|
+
return undefined;
|
|
84
|
+
const port = parseInt(process.argv[idx + 1], 10);
|
|
85
|
+
return Number.isNaN(port) ? undefined : port;
|
|
86
|
+
}
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
// HTTP transport helpers
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
function parseBody(req) {
|
|
91
|
+
return new Promise((resolve, reject) => {
|
|
92
|
+
const chunks = [];
|
|
93
|
+
req.on("data", (c) => chunks.push(c));
|
|
94
|
+
req.on("end", () => {
|
|
95
|
+
try {
|
|
96
|
+
resolve(JSON.parse(Buffer.concat(chunks).toString()));
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
reject(e);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
req.on("error", reject);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/** Start the watcher in HTTP mode on the given port. */
|
|
106
|
+
async function startWatcherHttp(port) {
|
|
107
|
+
const transports = new Map();
|
|
108
|
+
const httpServer = createServer(async (req, res) => {
|
|
109
|
+
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
110
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
|
|
111
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type, mcp-session-id");
|
|
112
|
+
res.setHeader("Access-Control-Expose-Headers", "mcp-session-id");
|
|
113
|
+
if (req.method === "OPTIONS") {
|
|
114
|
+
res.writeHead(204);
|
|
115
|
+
res.end();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (req.url !== "/mcp") {
|
|
119
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
120
|
+
res.end("Not Found");
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
124
|
+
try {
|
|
125
|
+
if (req.method === "POST") {
|
|
126
|
+
const body = await parseBody(req);
|
|
127
|
+
// Existing session
|
|
128
|
+
const existing = sessionId ? transports.get(sessionId) : undefined;
|
|
129
|
+
if (existing) {
|
|
130
|
+
await existing.handleRequest(req, res, body);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// New session — initialize handshake
|
|
134
|
+
if (isInitializeRequest(body)) {
|
|
135
|
+
const transport = new StreamableHTTPServerTransport({
|
|
136
|
+
sessionIdGenerator: () => randomUUID(),
|
|
137
|
+
onsessioninitialized: (sid) => { transports.set(sid, transport); },
|
|
138
|
+
});
|
|
139
|
+
transport.onclose = () => {
|
|
140
|
+
const sid = transport.sessionId;
|
|
141
|
+
if (sid)
|
|
142
|
+
transports.delete(sid);
|
|
143
|
+
};
|
|
144
|
+
const server = createWatcherMcpServer();
|
|
145
|
+
await server.connect(transport);
|
|
146
|
+
await transport.handleRequest(req, res, body);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
150
|
+
res.end(JSON.stringify({ jsonrpc: "2.0", error: { code: -32000, message: "Bad Request" }, id: null }));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (req.method === "GET") {
|
|
154
|
+
const t = sessionId ? transports.get(sessionId) : undefined;
|
|
155
|
+
if (!t) {
|
|
156
|
+
res.writeHead(400, { "Content-Type": "text/plain" });
|
|
157
|
+
res.end("Invalid session");
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
await t.handleRequest(req, res);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (req.method === "DELETE") {
|
|
164
|
+
const t = sessionId ? transports.get(sessionId) : undefined;
|
|
165
|
+
if (t) {
|
|
166
|
+
await t.handleRequest(req, res);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
res.writeHead(400, { "Content-Type": "text/plain" });
|
|
170
|
+
res.end("Invalid session");
|
|
171
|
+
}
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
res.writeHead(405, { "Content-Type": "text/plain" });
|
|
175
|
+
res.end("Method Not Allowed");
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
if (!res.headersSent) {
|
|
179
|
+
res.writeHead(500, { "Content-Type": "application/json" });
|
|
180
|
+
res.end(JSON.stringify({ jsonrpc: "2.0", error: { code: -32603, message: "Internal error" }, id: null }));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
httpServer.listen(port, "127.0.0.1", () => {
|
|
185
|
+
console.error(`Watcher MCP server running on http://127.0.0.1:${port}/mcp`);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
// ---------------------------------------------------------------------------
|
|
189
|
+
// Public entry point
|
|
190
|
+
// ---------------------------------------------------------------------------
|
|
191
|
+
export async function startWatcherServer() {
|
|
192
|
+
const port = parseWatcherPort();
|
|
193
|
+
if (port) {
|
|
194
|
+
await startWatcherHttp(port);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
const server = createWatcherMcpServer();
|
|
198
|
+
const transport = new StdioServerTransport();
|
|
199
|
+
await server.connect(transport);
|
|
200
|
+
}
|
|
71
201
|
}
|
|
72
202
|
//# sourceMappingURL=watcher-server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher-server.js","sourceRoot":"","sources":["../src/watcher-server.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"watcher-server.js","sourceRoot":"","sources":["../src/watcher-server.ts"],"names":[],"mappings":"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"}
|