agent-common 1.1.1 → 1.1.2
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 +7 -2
- package/dist/dashboard.d.ts +4 -0
- package/dist/dashboard.d.ts.map +1 -1
- package/dist/dashboard.js +11 -1
- package/dist/dashboard.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/transport/guard.d.ts +29 -0
- package/dist/transport/guard.d.ts.map +1 -0
- package/dist/transport/guard.js +115 -0
- package/dist/transport/guard.js.map +1 -0
- package/dist/transport/rest.d.ts.map +1 -1
- package/dist/transport/rest.js +1 -11
- package/dist/transport/rest.js.map +1 -1
- package/dist/transport/ws.d.ts.map +1 -1
- package/dist/transport/ws.js +10 -1
- package/dist/transport/ws.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -5,15 +5,20 @@ Shared foundation for `agent-*` MCP servers (`agent-comm`, `agent-tasks`, `agent
|
|
|
5
5
|
## What it provides
|
|
6
6
|
|
|
7
7
|
- **storage** — better-sqlite3 wrapper with WAL pragmas, transaction helper, migration runner
|
|
8
|
-
- **transport/rest** — node:http router with `:param` matching, JSON helper,
|
|
8
|
+
- **transport/rest** — node:http router with `:param` matching, JSON helper, body reader, static file serving
|
|
9
|
+
- **transport/guard** — shared request policy: loopback-only `Host` (DNS rebinding), loopback / same-origin / `file://` `Origin` (no wildcard CORS, `null` rejected), `application/json` required for state-changing bodies
|
|
9
10
|
- **transport/ws** — WebSocket server with full-state-on-connect, DB-fingerprint polling for cross-process delta updates, ping/pong heartbeat, max-connection cap
|
|
10
11
|
- **transport/mcp** — JSON-RPC over stdio, tool dispatcher, `ToolDefinition` type
|
|
11
12
|
- **domain/events** — typed in-process EventBus with wildcard subscribers
|
|
12
13
|
- **domain/cleanup** — base `CleanupService` with retention timer, startup reset hook
|
|
13
|
-
- **dashboard** — auto-start with port leader-election (graceful skip if port in use)
|
|
14
|
+
- **dashboard** — auto-start with port leader-election (graceful skip if port in use); binds `127.0.0.1` and guards every request and WebSocket upgrade
|
|
14
15
|
- **package-meta** — runtime read of `name` + `version` from a consumer's `package.json`
|
|
15
16
|
- **fts** — FTS5 virtual table + trigger boilerplate, search helper with LIKE fallback
|
|
16
17
|
|
|
18
|
+
## Network exposure
|
|
19
|
+
|
|
20
|
+
Dashboards bind `127.0.0.1` by default. Consumers expose an opt-in override as `AGENT_<NAME>_HOST` (e.g. `AGENT_COMM_HOST=0.0.0.0`) and pass it to `startDashboard({ host })`. A specific non-loopback address is added to the accepted `Host` names; a wildcard address accepts any `Host`, so only use it on a trusted network. Extra browser origins can be admitted with `startDashboard({ allowedOrigins })`.
|
|
21
|
+
|
|
17
22
|
## Who uses it
|
|
18
23
|
|
|
19
24
|
Internal: the four `agent-*` MCP servers. The package is host-agnostic — no `~/.claude` paths or Claude-specific config baked in.
|
package/dist/dashboard.d.ts
CHANGED
|
@@ -7,6 +7,10 @@ export interface DashboardServer {
|
|
|
7
7
|
}
|
|
8
8
|
export interface DashboardOptions {
|
|
9
9
|
port: number;
|
|
10
|
+
/** Listen address (default `127.0.0.1`). `0.0.0.0` exposes the dashboard to the network. */
|
|
11
|
+
host?: string;
|
|
12
|
+
/** Extra exact Origin values accepted besides loopback, same-origin and `file://`. */
|
|
13
|
+
allowedOrigins?: string[];
|
|
10
14
|
handler: (req: IncomingMessage, res: ServerResponse) => void | Promise<void>;
|
|
11
15
|
/** Optional callback after the HTTP server is listening, to attach a WebSocket. */
|
|
12
16
|
onListen?: (httpServer: Server) => {
|
package/dist/dashboard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAaA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAG5D,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,4FAA4F;IAC5F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,mFAAmF;IACnF,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK;QAAE,KAAK,IAAI,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5D,sFAAsF;IACtF,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAkD/E;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAY/F"}
|
package/dist/dashboard.js
CHANGED
|
@@ -5,15 +5,24 @@
|
|
|
5
5
|
// the first process to bind wins; subsequent processes get EADDRINUSE and
|
|
6
6
|
// gracefully skip (the existing dashboard is already serving). This lets
|
|
7
7
|
// every MCP client process call `startDashboard()` without coordination.
|
|
8
|
+
//
|
|
9
|
+
// Binds 127.0.0.1 by default and runs every request (and WebSocket upgrade)
|
|
10
|
+
// through the shared request guard. Consumers expose an opt-in override via
|
|
11
|
+
// an `AGENT_<NAME>_HOST` env var passed as `host`.
|
|
8
12
|
// =============================================================================
|
|
9
13
|
import { createServer } from 'http';
|
|
14
|
+
import { attachRequestGuard, createRequestGuard } from './transport/guard.js';
|
|
10
15
|
/**
|
|
11
16
|
* Start a dashboard HTTP server. Resolves to a `DashboardServer` on success.
|
|
12
17
|
* Rejects with an error whose `code === 'EADDRINUSE'` when the port is taken.
|
|
13
18
|
*/
|
|
14
19
|
export function startDashboard(opts) {
|
|
20
|
+
const host = opts.host || '127.0.0.1';
|
|
21
|
+
const guard = createRequestGuard({ bindHost: host, allowedOrigins: opts.allowedOrigins });
|
|
15
22
|
return new Promise((resolve, reject) => {
|
|
16
23
|
const httpServer = createServer((req, res) => {
|
|
24
|
+
if (guard.handle(req, res))
|
|
25
|
+
return;
|
|
17
26
|
Promise.resolve(opts.handler(req, res)).catch((err) => {
|
|
18
27
|
process.stderr.write('[agent-common] Dashboard handler error: ' +
|
|
19
28
|
(err instanceof Error ? err.message : String(err)) +
|
|
@@ -24,11 +33,12 @@ export function startDashboard(opts) {
|
|
|
24
33
|
}
|
|
25
34
|
});
|
|
26
35
|
});
|
|
36
|
+
attachRequestGuard(httpServer, guard);
|
|
27
37
|
let attached;
|
|
28
38
|
httpServer.on('error', (err) => {
|
|
29
39
|
reject(err);
|
|
30
40
|
});
|
|
31
|
-
httpServer.listen(opts.port, () => {
|
|
41
|
+
httpServer.listen(opts.port, host, () => {
|
|
32
42
|
try {
|
|
33
43
|
attached = opts.onListen?.(httpServer);
|
|
34
44
|
}
|
package/dist/dashboard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,sCAAsC;AACtC,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,yEAAyE;AACzE,yEAAyE;AACzE,gFAAgF;AAEhF,OAAO,EAAE,YAAY,EAAe,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export * from './types.js';
|
|
|
2
2
|
export * from './storage/database.js';
|
|
3
3
|
export * from './storage/fts.js';
|
|
4
4
|
export * from './transport/rest.js';
|
|
5
|
+
export * from './transport/guard.js';
|
|
5
6
|
export * from './transport/rate-limit.js';
|
|
6
7
|
export * from './transport/ws.js';
|
|
7
8
|
export * from './transport/mcp.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,7 @@ export * from './types.js';
|
|
|
5
5
|
export * from './storage/database.js';
|
|
6
6
|
export * from './storage/fts.js';
|
|
7
7
|
export * from './transport/rest.js';
|
|
8
|
+
export * from './transport/guard.js';
|
|
8
9
|
export * from './transport/rate-limit.js';
|
|
9
10
|
export * from './transport/ws.js';
|
|
10
11
|
export * from './transport/mcp.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,4BAA4B;AAC5B,gFAAgF;AAEhF,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,4BAA4B;AAC5B,gFAAgF;AAEhF,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse, Server } from 'http';
|
|
2
|
+
export declare const LOOPBACK_HOSTNAMES: ReadonlySet<string>;
|
|
3
|
+
export interface RequestGuardOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Address the server listens on (default `127.0.0.1`). A non-loopback
|
|
6
|
+
* address adds itself to the accepted Host names; a wildcard address
|
|
7
|
+
* (`0.0.0.0`, `::`) accepts any Host header.
|
|
8
|
+
*/
|
|
9
|
+
bindHost?: string;
|
|
10
|
+
/** Extra exact Origin values to accept (e.g. `https://my-tool.example`). */
|
|
11
|
+
allowedOrigins?: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface RequestGuard {
|
|
14
|
+
/** True when the Host header names an accepted host. */
|
|
15
|
+
checkHost(host: string | undefined): boolean;
|
|
16
|
+
/** True when the Origin header is absent or accepted for a request sent to `host`. */
|
|
17
|
+
checkOrigin(origin: string | undefined, host: string | undefined): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Apply the full policy to an HTTP request. Returns true when the request
|
|
20
|
+
* was answered (rejected, or a CORS preflight) and must not reach a handler.
|
|
21
|
+
*/
|
|
22
|
+
handle(req: IncomingMessage, res: ServerResponse): boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare function createRequestGuard(options?: RequestGuardOptions): RequestGuard;
|
|
25
|
+
/** Associate a guard with an HTTP server so WebSocket upgrades on it use the same policy. */
|
|
26
|
+
export declare function attachRequestGuard(server: Server, guard: RequestGuard): void;
|
|
27
|
+
/** The guard attached to `server`, or the default loopback-only guard. */
|
|
28
|
+
export declare function requestGuardFor(server: Server): RequestGuard;
|
|
29
|
+
//# sourceMappingURL=guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/transport/guard.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpE,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAgD,CAAC;AAMpG,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAC7C,sFAAsF;IACtF,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAC3E;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC;CAC5D;AA6BD,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,YAAY,CA0DlF;AAID,6FAA6F;AAC7F,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAE5E;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAE5D"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// agent-common — Request guard
|
|
3
|
+
//
|
|
4
|
+
// Shared Host / Origin / Content-Type policy for every dashboard request and
|
|
5
|
+
// WebSocket upgrade:
|
|
6
|
+
// - Host header must name a loopback host (or the explicitly bound host),
|
|
7
|
+
// which defeats DNS rebinding.
|
|
8
|
+
// - Origin, when present, must be loopback http(s), the same host the
|
|
9
|
+
// request was sent to, the Electron renderer origin `file://`, or an
|
|
10
|
+
// explicitly allowed origin. `null` and unparsable origins are rejected.
|
|
11
|
+
// - State-changing requests with a body must be `application/json`, so
|
|
12
|
+
// CORS-safelisted `text/plain` form posts never reach a handler.
|
|
13
|
+
// - Allowed cross-origin callers get their Origin reflected (no wildcard).
|
|
14
|
+
// =============================================================================
|
|
15
|
+
export const LOOPBACK_HOSTNAMES = new Set(['localhost', '127.0.0.1', '[::1]']);
|
|
16
|
+
const WILDCARD_BIND_HOSTS = new Set(['0.0.0.0', '::', '[::]']);
|
|
17
|
+
const MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
|
|
18
|
+
const HOST_HEADER_RE = /^[a-z0-9.\-[\]:]+$/i;
|
|
19
|
+
function hostnameOf(host) {
|
|
20
|
+
if (!host || !HOST_HEADER_RE.test(host))
|
|
21
|
+
return null;
|
|
22
|
+
try {
|
|
23
|
+
return new URL(`http://${host}`).hostname;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function reject(res, status, error) {
|
|
30
|
+
res.writeHead(status, {
|
|
31
|
+
'Content-Type': 'application/json',
|
|
32
|
+
'X-Content-Type-Options': 'nosniff',
|
|
33
|
+
});
|
|
34
|
+
res.end(JSON.stringify({ error }));
|
|
35
|
+
}
|
|
36
|
+
function hasBody(req) {
|
|
37
|
+
const length = req.headers['content-length'];
|
|
38
|
+
return (length !== undefined && length !== '0') || req.headers['transfer-encoding'] !== undefined;
|
|
39
|
+
}
|
|
40
|
+
function isJson(req) {
|
|
41
|
+
const type = req.headers['content-type'];
|
|
42
|
+
return typeof type === 'string' && type.split(';')[0].trim().toLowerCase() === 'application/json';
|
|
43
|
+
}
|
|
44
|
+
export function createRequestGuard(options = {}) {
|
|
45
|
+
const bindHost = (options.bindHost ?? '127.0.0.1').toLowerCase();
|
|
46
|
+
const anyHost = WILDCARD_BIND_HOSTS.has(bindHost);
|
|
47
|
+
const allowedHosts = new Set(LOOPBACK_HOSTNAMES);
|
|
48
|
+
if (!anyHost)
|
|
49
|
+
allowedHosts.add(bindHost.includes(':') ? `[${bindHost}]` : bindHost);
|
|
50
|
+
const allowedOrigins = new Set(options.allowedOrigins ?? []);
|
|
51
|
+
function checkHost(host) {
|
|
52
|
+
const hostname = hostnameOf(host);
|
|
53
|
+
if (hostname === null)
|
|
54
|
+
return false;
|
|
55
|
+
return anyHost || allowedHosts.has(hostname);
|
|
56
|
+
}
|
|
57
|
+
function checkOrigin(origin, host) {
|
|
58
|
+
if (origin === undefined)
|
|
59
|
+
return true;
|
|
60
|
+
if (origin === 'file://' || allowedOrigins.has(origin))
|
|
61
|
+
return true;
|
|
62
|
+
let url;
|
|
63
|
+
try {
|
|
64
|
+
url = new URL(origin);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:')
|
|
70
|
+
return false;
|
|
71
|
+
if (url.origin !== origin.toLowerCase())
|
|
72
|
+
return false;
|
|
73
|
+
return LOOPBACK_HOSTNAMES.has(url.hostname) || url.host === host?.toLowerCase();
|
|
74
|
+
}
|
|
75
|
+
function handle(req, res) {
|
|
76
|
+
const host = req.headers.host;
|
|
77
|
+
const origin = req.headers.origin;
|
|
78
|
+
if (!checkHost(host)) {
|
|
79
|
+
reject(res, 403, 'Forbidden host');
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
if (!checkOrigin(origin, host)) {
|
|
83
|
+
reject(res, 403, 'Forbidden origin');
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
if (origin !== undefined) {
|
|
87
|
+
res.setHeader('Access-Control-Allow-Origin', origin);
|
|
88
|
+
res.setHeader('Vary', 'Origin');
|
|
89
|
+
}
|
|
90
|
+
if (req.method === 'OPTIONS') {
|
|
91
|
+
res.writeHead(204, {
|
|
92
|
+
'Access-Control-Allow-Methods': 'GET, POST, PUT, PATCH, DELETE, OPTIONS',
|
|
93
|
+
'Access-Control-Allow-Headers': 'Content-Type',
|
|
94
|
+
});
|
|
95
|
+
res.end();
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
if (MUTATING_METHODS.has(req.method ?? '') && hasBody(req) && !isJson(req)) {
|
|
99
|
+
reject(res, 415, 'Content-Type must be application/json');
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
return { checkHost, checkOrigin, handle };
|
|
105
|
+
}
|
|
106
|
+
const serverGuards = new WeakMap();
|
|
107
|
+
/** Associate a guard with an HTTP server so WebSocket upgrades on it use the same policy. */
|
|
108
|
+
export function attachRequestGuard(server, guard) {
|
|
109
|
+
serverGuards.set(server, guard);
|
|
110
|
+
}
|
|
111
|
+
/** The guard attached to `server`, or the default loopback-only guard. */
|
|
112
|
+
export function requestGuardFor(server) {
|
|
113
|
+
return serverGuards.get(server) ?? createRequestGuard();
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/transport/guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rest.d.ts","sourceRoot":"","sources":["../../src/transport/rest.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAK5D,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQ7C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,CACzB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC3B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAS1B,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IACjE,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,wBAAgB,IAAI,CAClB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,OAAO,EACb,MAAM,SAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,IAAI,
|
|
1
|
+
{"version":3,"file":"rest.d.ts","sourceRoot":"","sources":["../../src/transport/rest.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAK5D,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQ7C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,CACzB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC3B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAS1B,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IACjE,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,wBAAgB,IAAI,CAClB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,OAAO,EACb,MAAM,SAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,IAAI,CAON;AAED,wBAAgB,QAAQ,CACtB,GAAG,EAAE,eAAe,EACpB,QAAQ,SAAY,GACnB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA2BlC;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CA8DhE;AAED,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,wBAAgB,WAAW,CACzB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,kBAAuB,GAC/B,IAAI,CA4EN"}
|
package/dist/transport/rest.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
// Lightweight HTTP router using only node:http. Provides:
|
|
5
5
|
// - route(method, path, handler) with :param matching
|
|
6
|
-
// - json() helper with CORS
|
|
6
|
+
// - json() helper with nosniff headers (CORS is the request guard's job)
|
|
7
7
|
// - readBody() with size limit + JSON object validation
|
|
8
8
|
// - serveStatic() with traversal + symlink protection
|
|
9
9
|
// - createRouter() returns a request handler that dispatches routes
|
|
@@ -24,7 +24,6 @@ export const MIME_TYPES = {
|
|
|
24
24
|
export function json(res, data, status = 200, options = {}) {
|
|
25
25
|
res.writeHead(status, {
|
|
26
26
|
'Content-Type': 'application/json',
|
|
27
|
-
'Access-Control-Allow-Origin': '*',
|
|
28
27
|
'X-Content-Type-Options': 'nosniff',
|
|
29
28
|
...options.extraHeaders,
|
|
30
29
|
});
|
|
@@ -77,15 +76,6 @@ export function createRouter(options = {}) {
|
|
|
77
76
|
routes.push({ method, pattern: new RegExp(`^${pattern}$`), paramNames, handler });
|
|
78
77
|
}
|
|
79
78
|
async function handle(req, res) {
|
|
80
|
-
if (req.method === 'OPTIONS') {
|
|
81
|
-
res.writeHead(204, {
|
|
82
|
-
'Access-Control-Allow-Origin': '*',
|
|
83
|
-
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
|
|
84
|
-
'Access-Control-Allow-Headers': 'Content-Type',
|
|
85
|
-
});
|
|
86
|
-
res.end();
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
79
|
const url = new URL(req.url ?? '/', `http://${req.headers.host}`);
|
|
90
80
|
const pathname = url.pathname;
|
|
91
81
|
for (const r of routes) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../src/transport/rest.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gCAAgC;AAChC,EAAE;AACF,0DAA0D;AAC1D,wDAAwD;AACxD,
|
|
1
|
+
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../src/transport/rest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/transport/ws.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/transport/ws.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,KAAK,EAAmB,MAAM,EAAE,MAAM,MAAM,CAAC;AAGpD,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,eAAe,CAAC;IACrB,mDAAmD;IACnD,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IACzD,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,eAAe,EAAE,MAAM,CAAC,CAAC;IACzB;;;;;OAKG;IACH,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChE,0EAA0E;IAC1E,YAAY,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,KAAK,OAAO,GAAG,IAAI,CAAC;IAC9F,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4CAA4C;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CACnC;AAOD,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,QAAQ,CAgK7F"}
|
package/dist/transport/ws.js
CHANGED
|
@@ -14,8 +14,12 @@
|
|
|
14
14
|
// Optional:
|
|
15
15
|
// - onMessage(ws, msg): handle custom client-to-server message types
|
|
16
16
|
// beyond the built-in `refresh`. Return true if handled.
|
|
17
|
+
//
|
|
18
|
+
// Upgrades are checked against the request guard attached to the HTTP server
|
|
19
|
+
// (loopback-only default), so foreign origins cannot open a socket.
|
|
17
20
|
// =============================================================================
|
|
18
21
|
import { WebSocketServer, WebSocket } from 'ws';
|
|
22
|
+
import { requestGuardFor } from './guard.js';
|
|
19
23
|
export function setupWebSocket(opts) {
|
|
20
24
|
const maxConnections = opts.maxConnections ?? 50;
|
|
21
25
|
const maxMessageSize = opts.maxMessageSize ?? 4096;
|
|
@@ -25,7 +29,12 @@ export function setupWebSocket(opts) {
|
|
|
25
29
|
((err) => {
|
|
26
30
|
process.stderr.write('[agent-common] WS error: ' + (err instanceof Error ? err.message : String(err)) + '\n');
|
|
27
31
|
});
|
|
28
|
-
const
|
|
32
|
+
const guard = requestGuardFor(opts.httpServer);
|
|
33
|
+
const wss = new WebSocketServer({
|
|
34
|
+
server: opts.httpServer,
|
|
35
|
+
maxPayload: maxMessageSize,
|
|
36
|
+
verifyClient: ({ origin, req }) => guard.checkHost(req.headers.host) && guard.checkOrigin(origin || undefined, req.headers.host),
|
|
37
|
+
});
|
|
29
38
|
wss.on('error', (err) => {
|
|
30
39
|
logError(err);
|
|
31
40
|
});
|
package/dist/transport/ws.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/transport/ws.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,qCAAqC;AACrC,EAAE;AACF,mEAAmE;AACnE,4EAA4E;AAC5E,4EAA4E;AAC5E,0EAA0E;AAC1E,4EAA4E;AAC5E,uEAAuE;AACvE,+DAA+D;AAC/D,yEAAyE;AACzE,2BAA2B;AAC3B,EAAE;AACF,YAAY;AACZ,uEAAuE;AACvE,6DAA6D;AAC7D,gFAAgF;AAEhF,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/transport/ws.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-common",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "Shared foundation for agent-* MCP servers — SQLite, REST, WebSocket, MCP, cleanup, events, dashboard scaffolding",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"better-sqlite3": "12.8.0",
|
|
27
|
-
"ws": "8.
|
|
27
|
+
"ws": "8.22.0"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
30
|
"better-sqlite3": ">=11",
|