@roarpeng/graphflow 1.14.0 → 1.15.0
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/CHANGELOG.md +26 -0
- package/README.md +3 -3
- package/README.zh.md +1 -1
- package/dist/config/schema.d.ts +3 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/graph/client-factory.d.ts.map +1 -1
- package/dist/graph/client-factory.js +4 -1
- package/dist/graph/client-factory.js.map +1 -1
- package/dist/graph/graphify-mcp-client.d.ts +33 -0
- package/dist/graph/graphify-mcp-client.d.ts.map +1 -1
- package/dist/graph/graphify-mcp-client.js +66 -5
- package/dist/graph/graphify-mcp-client.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/dsh-harness-installer.d.ts +2 -0
- package/dist/integrations/dsh-harness-installer.d.ts.map +1 -1
- package/dist/integrations/dsh-harness-installer.js +9 -3
- package/dist/integrations/dsh-harness-installer.js.map +1 -1
- package/dist/integrations/host-adapter-install.d.ts +19 -0
- package/dist/integrations/host-adapter-install.d.ts.map +1 -0
- package/dist/integrations/host-adapter-install.js +75 -0
- package/dist/integrations/host-adapter-install.js.map +1 -0
- package/dist/integrations/host-adapter.d.ts +5 -0
- package/dist/integrations/host-adapter.d.ts.map +1 -1
- package/dist/integrations/host-adapter.js.map +1 -1
- package/dist/integrations/skill-installer.d.ts.map +1 -1
- package/dist/integrations/skill-installer.js +3 -1
- package/dist/integrations/skill-installer.js.map +1 -1
- package/dist/security/rbac.d.ts +39 -0
- package/dist/security/rbac.d.ts.map +1 -0
- package/dist/security/rbac.js +213 -0
- package/dist/security/rbac.js.map +1 -0
- package/dist/security/token-auth.d.ts +15 -2
- package/dist/security/token-auth.d.ts.map +1 -1
- package/dist/security/token-auth.js +86 -5
- package/dist/security/token-auth.js.map +1 -1
- package/dist/surfaces/cli/index.js +79 -4
- package/dist/surfaces/cli/index.js.map +1 -1
- package/dist/surfaces/cli/init.d.ts +3 -0
- package/dist/surfaces/cli/init.d.ts.map +1 -1
- package/dist/surfaces/cli/init.js +31 -2
- package/dist/surfaces/cli/init.js.map +1 -1
- package/dist/surfaces/cli/output.d.ts.map +1 -1
- package/dist/surfaces/cli/output.js +7 -3
- package/dist/surfaces/cli/output.js.map +1 -1
- package/dist/surfaces/cli/runtime/graph.d.ts +13 -0
- package/dist/surfaces/cli/runtime/graph.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime/graph.js +97 -9
- package/dist/surfaces/cli/runtime/graph.js.map +1 -1
- package/dist/surfaces/cli/runtime/routing.d.ts +1 -1
- package/dist/surfaces/cli/runtime/routing.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime/routing.js +12 -2
- package/dist/surfaces/cli/runtime/routing.js.map +1 -1
- package/dist/surfaces/cli/runtime/types.d.ts +3 -0
- package/dist/surfaces/cli/runtime/types.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime.d.ts +1 -1
- package/dist/surfaces/cli/runtime.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime.js +3 -2
- package/dist/surfaces/cli/runtime.js.map +1 -1
- package/dist/surfaces/mcp/server.d.ts +2 -0
- package/dist/surfaces/mcp/server.d.ts.map +1 -1
- package/dist/surfaces/mcp/server.js +77 -37
- package/dist/surfaces/mcp/server.js.map +1 -1
- package/dist/surfaces/mcp/tool-handlers.d.ts.map +1 -1
- package/dist/surfaces/mcp/tool-handlers.js +2 -0
- package/dist/surfaces/mcp/tool-handlers.js.map +1 -1
- package/dist/surfaces/team/diagnose.d.ts +18 -0
- package/dist/surfaces/team/diagnose.d.ts.map +1 -0
- package/dist/surfaces/team/diagnose.js +57 -0
- package/dist/surfaces/team/diagnose.js.map +1 -0
- package/dist/surfaces/team/ops.d.ts +16 -0
- package/dist/surfaces/team/ops.d.ts.map +1 -0
- package/dist/surfaces/team/ops.js +137 -0
- package/dist/surfaces/team/ops.js.map +1 -0
- package/dist/surfaces/team/server.d.ts +48 -0
- package/dist/surfaces/team/server.d.ts.map +1 -0
- package/dist/surfaces/team/server.js +393 -0
- package/dist/surfaces/team/server.js.map +1 -0
- package/dsh/plugin.mjs +180 -46
- package/package.json +7 -6
- package/plugin.json +1 -1
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readTeamServerOptionsFromArgv = readTeamServerOptionsFromArgv;
|
|
4
|
+
exports.startTeamServerFromArgv = startTeamServerFromArgv;
|
|
5
|
+
exports.issueTeamTokenFromArgv = issueTeamTokenFromArgv;
|
|
6
|
+
exports.buildTeamClientExampleConfig = buildTeamClientExampleConfig;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const rbac_js_1 = require("../../security/rbac.js");
|
|
9
|
+
const token_auth_js_1 = require("../../security/token-auth.js");
|
|
10
|
+
const server_js_1 = require("./server.js");
|
|
11
|
+
function readFlag(argv, name) {
|
|
12
|
+
const index = argv.indexOf(name);
|
|
13
|
+
return index >= 0 ? argv[index + 1]?.trim() : undefined;
|
|
14
|
+
}
|
|
15
|
+
function collectFlags(argv, name) {
|
|
16
|
+
const values = [];
|
|
17
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
18
|
+
if (argv[index] === name) {
|
|
19
|
+
const value = argv[index + 1]?.trim();
|
|
20
|
+
if (value)
|
|
21
|
+
values.push(value);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return values;
|
|
25
|
+
}
|
|
26
|
+
function readTeamServerOptionsFromArgv(argv = process.argv.slice(2)) {
|
|
27
|
+
const rawPort = readFlag(argv, "--port");
|
|
28
|
+
const port = rawPort ? Number.parseInt(rawPort, 10) : undefined;
|
|
29
|
+
if (port !== undefined && (!Number.isInteger(port) || port < 0 || port > 65535)) {
|
|
30
|
+
throw new Error("--port must be an integer between 0 and 65535");
|
|
31
|
+
}
|
|
32
|
+
const bearerRoleMap = {};
|
|
33
|
+
const bearerTokens = [];
|
|
34
|
+
const tagged = [
|
|
35
|
+
...(process.env.GRAPHFLOW_TEAM_TOKEN ? [process.env.GRAPHFLOW_TEAM_TOKEN] : []),
|
|
36
|
+
...collectFlags(argv, "--http-token"),
|
|
37
|
+
];
|
|
38
|
+
for (const raw of tagged) {
|
|
39
|
+
const parsed = (0, token_auth_js_1.parseRoleTaggedBearer)(raw);
|
|
40
|
+
bearerTokens.push(parsed.token);
|
|
41
|
+
if (parsed.role)
|
|
42
|
+
bearerRoleMap[parsed.token] = parsed.role;
|
|
43
|
+
}
|
|
44
|
+
for (const raw of collectFlags(argv, "--role-map")) {
|
|
45
|
+
const parsed = (0, token_auth_js_1.parseRoleTaggedBearer)(raw);
|
|
46
|
+
if (parsed.role) {
|
|
47
|
+
bearerRoleMap[parsed.token] = parsed.role;
|
|
48
|
+
if (!bearerTokens.includes(parsed.token))
|
|
49
|
+
bearerTokens.push(parsed.token);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const jwtSecret = readFlag(argv, "--http-jwt-secret") ?? process.env.GRAPHFLOW_TEAM_JWT_SECRET;
|
|
53
|
+
const publicKeyFile = readFlag(argv, "--http-public-key-file");
|
|
54
|
+
const issuer = readFlag(argv, "--http-oidc-issuer") ?? process.env.GRAPHFLOW_TEAM_OIDC_ISSUER;
|
|
55
|
+
const audience = readFlag(argv, "--http-oidc-audience") ?? process.env.GRAPHFLOW_TEAM_OIDC_AUDIENCE;
|
|
56
|
+
const requiredScope = readFlag(argv, "--http-required-scope");
|
|
57
|
+
const allowedTenants = collectFlags(argv, "--allow-tenant");
|
|
58
|
+
const host = readFlag(argv, "--host");
|
|
59
|
+
const requireAuthFlag = argv.includes("--require-auth")
|
|
60
|
+
? true
|
|
61
|
+
: argv.includes("--allow-anonymous")
|
|
62
|
+
? false
|
|
63
|
+
: undefined;
|
|
64
|
+
const auth = {
|
|
65
|
+
...(bearerTokens.length > 0 ? { bearerTokens } : {}),
|
|
66
|
+
...(Object.keys(bearerRoleMap).length > 0 ? { bearerRoleMap } : {}),
|
|
67
|
+
...(jwtSecret ? { jwtSecret } : {}),
|
|
68
|
+
...(publicKeyFile ? { publicKeyPem: (0, node_fs_1.readFileSync)(publicKeyFile, "utf8") } : {}),
|
|
69
|
+
...(issuer ? { issuer } : {}),
|
|
70
|
+
...(audience ? { audience } : {}),
|
|
71
|
+
...(requiredScope ? { requiredScope } : {}),
|
|
72
|
+
...(allowedTenants.length > 0 ? { allowedTenants } : {}),
|
|
73
|
+
};
|
|
74
|
+
const endpoint = readFlag(argv, "--endpoint");
|
|
75
|
+
const storeRoot = readFlag(argv, "--store");
|
|
76
|
+
const auditPath = readFlag(argv, "--audit-path");
|
|
77
|
+
const allowedHosts = collectFlags(argv, "--allow-host");
|
|
78
|
+
const allowedOrigins = collectFlags(argv, "--allow-origin");
|
|
79
|
+
return {
|
|
80
|
+
...(host ? { host } : {}),
|
|
81
|
+
...(port !== undefined ? { port } : {}),
|
|
82
|
+
...(endpoint ? { endpoint } : {}),
|
|
83
|
+
...(storeRoot ? { storeRoot } : {}),
|
|
84
|
+
...(allowedHosts.length > 0 ? { allowedHosts } : {}),
|
|
85
|
+
...(allowedOrigins.length > 0 ? { allowedOrigins } : {}),
|
|
86
|
+
...(Object.keys(auth).length > 0 ? { auth } : {}),
|
|
87
|
+
...(auditPath ? { auditPath } : {}),
|
|
88
|
+
...(requireAuthFlag !== undefined ? { requireAuth: requireAuthFlag } : {}),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async function startTeamServerFromArgv(argv) {
|
|
92
|
+
return (0, server_js_1.startTeamMemoryServer)(readTeamServerOptionsFromArgv(argv));
|
|
93
|
+
}
|
|
94
|
+
function issueTeamTokenFromArgv(argv) {
|
|
95
|
+
const subject = readFlag(argv, "--subject") ?? "team-user";
|
|
96
|
+
const roleRaw = readFlag(argv, "--role") ?? "contributor";
|
|
97
|
+
if (!(0, rbac_js_1.isTeamRole)(roleRaw)) {
|
|
98
|
+
throw new Error("--role must be viewer, contributor, or admin");
|
|
99
|
+
}
|
|
100
|
+
const secret = readFlag(argv, "--secret") ??
|
|
101
|
+
process.env.GRAPHFLOW_TEAM_JWT_SECRET ??
|
|
102
|
+
process.env.GRAPHFLOW_MCP_HTTP_JWT_SECRET;
|
|
103
|
+
if (!secret) {
|
|
104
|
+
throw new Error("JWT secret required: pass --secret or set GRAPHFLOW_TEAM_JWT_SECRET");
|
|
105
|
+
}
|
|
106
|
+
const ttlRaw = readFlag(argv, "--ttl");
|
|
107
|
+
const ttlSeconds = ttlRaw ? Number.parseInt(ttlRaw, 10) : 86400;
|
|
108
|
+
if (!Number.isInteger(ttlSeconds) || ttlSeconds <= 0) {
|
|
109
|
+
throw new Error("--ttl must be a positive integer (seconds)");
|
|
110
|
+
}
|
|
111
|
+
const issuer = readFlag(argv, "--issuer") ?? "graphflow-team";
|
|
112
|
+
const audience = readFlag(argv, "--audience") ?? "graphflow-team";
|
|
113
|
+
const token = (0, token_auth_js_1.issueLocalJwt)(subject, secret, {
|
|
114
|
+
role: roleRaw,
|
|
115
|
+
issuer,
|
|
116
|
+
audience,
|
|
117
|
+
ttlSeconds,
|
|
118
|
+
});
|
|
119
|
+
return { token, subject, role: roleRaw, ttlSeconds };
|
|
120
|
+
}
|
|
121
|
+
function buildTeamClientExampleConfig(options = {}) {
|
|
122
|
+
const endpoint = options.endpoint ?? "http://127.0.0.1:8787/mcp";
|
|
123
|
+
const tenant = options.tenant ?? "default";
|
|
124
|
+
return {
|
|
125
|
+
graphPolicy: {
|
|
126
|
+
transport: "mcp-http",
|
|
127
|
+
mcpEndpoint: endpoint,
|
|
128
|
+
mcpApiKey: options.apiKey ?? "${GRAPHFLOW_TEAM_TOKEN}",
|
|
129
|
+
mcpTenant: tenant,
|
|
130
|
+
graphStorePath: "graphflow-out/graphflow-graph.json",
|
|
131
|
+
maxContextTokens: 1500,
|
|
132
|
+
enableAutoBuild: true,
|
|
133
|
+
},
|
|
134
|
+
_comment: "Point mcpApiKey at a viewer|contributor|admin bearer or an HS256 JWT issued by `graphflow team issue-token`. Loopback solo use stays transport: auto with no auth.",
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops.js","sourceRoot":"","sources":["../../../src/surfaces/team/ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type Server as HttpServer } from "node:http";
|
|
2
|
+
import { type TeamRole } from "../../security/rbac.js";
|
|
3
|
+
import { type TokenAuthConfig } from "../../security/token-auth.js";
|
|
4
|
+
export interface TeamHttpAuthOptions extends TokenAuthConfig {
|
|
5
|
+
allowedTenants?: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
export interface TeamMemoryServerOptions {
|
|
8
|
+
host?: string;
|
|
9
|
+
port?: number;
|
|
10
|
+
endpoint?: string;
|
|
11
|
+
/** Root directory for per-tenant graph + skill-pack files. */
|
|
12
|
+
storeRoot?: string;
|
|
13
|
+
allowedHosts?: string[];
|
|
14
|
+
allowedOrigins?: string[];
|
|
15
|
+
signal?: AbortSignal;
|
|
16
|
+
auth?: TeamHttpAuthOptions;
|
|
17
|
+
auditPath?: string;
|
|
18
|
+
/**
|
|
19
|
+
* When true (default for non-loopback), credentials + RBAC are required.
|
|
20
|
+
* Loopback stays local-first unless auth is explicitly configured.
|
|
21
|
+
*/
|
|
22
|
+
requireAuth?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface StartedTeamMemoryServer {
|
|
25
|
+
httpServer: HttpServer;
|
|
26
|
+
url: string;
|
|
27
|
+
endpoint: string;
|
|
28
|
+
host: string;
|
|
29
|
+
port: number;
|
|
30
|
+
storeRoot: string;
|
|
31
|
+
requireAuth: boolean;
|
|
32
|
+
rbac: true;
|
|
33
|
+
close(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
export interface TeamHealthResult {
|
|
36
|
+
ok: true;
|
|
37
|
+
service: "graphflow-team-memory";
|
|
38
|
+
tenant: string;
|
|
39
|
+
role: TeamRole | "local";
|
|
40
|
+
rbac: true;
|
|
41
|
+
authMode: "none" | "bearer" | "jwt";
|
|
42
|
+
nodeCount: number;
|
|
43
|
+
edgeCount: number;
|
|
44
|
+
skillPackRevision: number | null;
|
|
45
|
+
}
|
|
46
|
+
export declare function isLoopbackHost(host: string): boolean;
|
|
47
|
+
export declare function startTeamMemoryServer(options?: TeamMemoryServerOptions): Promise<StartedTeamMemoryServer>;
|
|
48
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/surfaces/team/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,MAAM,IAAI,UAAU,EAAuB,MAAM,WAAW,CAAC;AAO/G,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC1D,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,UAAU,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,uBAAuB,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAsBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGpD;AAoMD,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,uBAAuB,CAAC,CAmOlC"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isLoopbackHost = isLoopbackHost;
|
|
4
|
+
exports.startTeamMemoryServer = startTeamMemoryServer;
|
|
5
|
+
const node_http_1 = require("node:http");
|
|
6
|
+
const node_fs_1 = require("node:fs");
|
|
7
|
+
const node_path_1 = require("node:path");
|
|
8
|
+
const graphify_file_client_js_1 = require("../../graph/graphify-file-client.js");
|
|
9
|
+
const team_governance_js_1 = require("../../graph/team-governance.js");
|
|
10
|
+
const evidence_js_1 = require("../../learning/evidence.js");
|
|
11
|
+
const rbac_js_1 = require("../../security/rbac.js");
|
|
12
|
+
const token_auth_js_1 = require("../../security/token-auth.js");
|
|
13
|
+
function normalizeHttpEndpoint(endpoint) {
|
|
14
|
+
const value = endpoint?.trim() || "/mcp";
|
|
15
|
+
if (!value.startsWith("/"))
|
|
16
|
+
throw new Error("Team memory endpoint must begin with '/'");
|
|
17
|
+
if (value.includes("*") || value.includes("?"))
|
|
18
|
+
throw new Error("Team memory endpoint must be an exact path");
|
|
19
|
+
return value.endsWith("/") && value !== "/" ? value.slice(0, -1) : value;
|
|
20
|
+
}
|
|
21
|
+
function isLoopbackHost(host) {
|
|
22
|
+
const normalized = host.trim().toLowerCase().replace(/^\[|\]$/g, "");
|
|
23
|
+
return normalized === "localhost" || normalized === "127.0.0.1" || normalized === "::1";
|
|
24
|
+
}
|
|
25
|
+
function writeHttpJson(res, status, body) {
|
|
26
|
+
res.statusCode = status;
|
|
27
|
+
res.setHeader("Content-Type", "application/json");
|
|
28
|
+
res.end(JSON.stringify(body));
|
|
29
|
+
}
|
|
30
|
+
function writeJsonRpcError(res, status, requestId, message, code = -32600) {
|
|
31
|
+
writeHttpJson(res, status, {
|
|
32
|
+
jsonrpc: "2.0",
|
|
33
|
+
id: requestId,
|
|
34
|
+
error: { code, message },
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function validateHttpOrigin(req, allowedOrigins) {
|
|
38
|
+
const origin = req.headers.origin;
|
|
39
|
+
if (typeof origin !== "string" || origin.length === 0)
|
|
40
|
+
return true;
|
|
41
|
+
return Boolean(allowedOrigins?.some((allowed) => allowed.toLowerCase() === origin.toLowerCase()));
|
|
42
|
+
}
|
|
43
|
+
function validateHttpHost(req, host, allowedHosts) {
|
|
44
|
+
const header = req.headers.host;
|
|
45
|
+
if (!header)
|
|
46
|
+
return false;
|
|
47
|
+
if (!allowedHosts?.length) {
|
|
48
|
+
const hostname = header.split(":", 2)[0] ?? "";
|
|
49
|
+
return isLoopbackHost(host) && isLoopbackHost(hostname);
|
|
50
|
+
}
|
|
51
|
+
const normalized = header.toLowerCase();
|
|
52
|
+
return allowedHosts.some((allowed) => allowed.toLowerCase() === normalized);
|
|
53
|
+
}
|
|
54
|
+
function requestTenant(req, auth) {
|
|
55
|
+
const value = req.headers["x-graphflow-tenant"];
|
|
56
|
+
const raw = Array.isArray(value) ? value[0] : value;
|
|
57
|
+
const tenant = raw?.trim() || "default";
|
|
58
|
+
if (!/^[A-Za-z0-9._-]{1,64}$/.test(tenant)) {
|
|
59
|
+
throw new Error("tenant is not allowed");
|
|
60
|
+
}
|
|
61
|
+
if (auth?.allowedTenants?.length && !auth.allowedTenants.includes(tenant)) {
|
|
62
|
+
throw new Error("tenant is not allowed");
|
|
63
|
+
}
|
|
64
|
+
return tenant;
|
|
65
|
+
}
|
|
66
|
+
function sanitizeTenant(tenant) {
|
|
67
|
+
return tenant.replace(/[^A-Za-z0-9._-]/g, "_");
|
|
68
|
+
}
|
|
69
|
+
async function readJsonBody(req) {
|
|
70
|
+
const chunks = [];
|
|
71
|
+
for await (const chunk of req) {
|
|
72
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
73
|
+
}
|
|
74
|
+
const raw = Buffer.concat(chunks).toString("utf8").trim();
|
|
75
|
+
if (!raw)
|
|
76
|
+
return {};
|
|
77
|
+
return JSON.parse(raw);
|
|
78
|
+
}
|
|
79
|
+
function tenantStorePaths(storeRoot, tenant) {
|
|
80
|
+
const root = (0, node_path_1.join)(storeRoot, sanitizeTenant(tenant));
|
|
81
|
+
(0, node_fs_1.mkdirSync)(root, { recursive: true });
|
|
82
|
+
return {
|
|
83
|
+
graph: (0, node_path_1.join)(root, "graph.json"),
|
|
84
|
+
skills: (0, node_path_1.join)(root, "skills.json"),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function readSkillPack(path) {
|
|
88
|
+
try {
|
|
89
|
+
if (!(0, node_fs_1.existsSync)(path))
|
|
90
|
+
return undefined;
|
|
91
|
+
const parsed = JSON.parse((0, node_fs_1.readFileSync)(path, "utf8"));
|
|
92
|
+
if (!parsed || typeof parsed !== "object")
|
|
93
|
+
return undefined;
|
|
94
|
+
return parsed;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function writeSkillPack(path, pack) {
|
|
101
|
+
const previous = readSkillPack(path);
|
|
102
|
+
const next = {
|
|
103
|
+
revision: (previous?.revision ?? 0) + 1,
|
|
104
|
+
updatedAt: new Date().toISOString(),
|
|
105
|
+
pack,
|
|
106
|
+
};
|
|
107
|
+
(0, node_fs_1.writeFileSync)(path, `${JSON.stringify(next, null, 2)}\n`, "utf8");
|
|
108
|
+
return next;
|
|
109
|
+
}
|
|
110
|
+
function authModeOf(auth) {
|
|
111
|
+
if (auth?.jwtSecret || auth?.publicKeyPem)
|
|
112
|
+
return "jwt";
|
|
113
|
+
if (auth?.bearerTokens?.length || (auth?.bearerRoleMap && Object.keys(auth.bearerRoleMap).length > 0)) {
|
|
114
|
+
return "bearer";
|
|
115
|
+
}
|
|
116
|
+
return "none";
|
|
117
|
+
}
|
|
118
|
+
async function dispatchTeamMethod(method, params, store, skillPath) {
|
|
119
|
+
switch (method) {
|
|
120
|
+
case "graph.upsert_nodes": {
|
|
121
|
+
await store.upsertNodes(params.nodes ?? []);
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
case "graph.upsert_edges": {
|
|
125
|
+
await store.upsertEdges(params.edges ?? []);
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
case "graph.query_subgraph": {
|
|
129
|
+
const query = String(params.query ?? "");
|
|
130
|
+
return { nodes: await store.queryByKeyword(query) };
|
|
131
|
+
}
|
|
132
|
+
case "graph.get_nodes": {
|
|
133
|
+
return { nodes: await store.getNodesByIds(params.ids ?? []) };
|
|
134
|
+
}
|
|
135
|
+
case "graph.get_neighbors": {
|
|
136
|
+
const direction = params.direction === "out" || params.direction === "in" || params.direction === "both"
|
|
137
|
+
? params.direction
|
|
138
|
+
: "both";
|
|
139
|
+
return {
|
|
140
|
+
neighbors: await store.getNeighbors(params.nodeIds ?? [], params.relations, direction),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
case "graph.delete_node": {
|
|
144
|
+
await store.deleteNode(String(params.id ?? ""));
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
case "graph.delete_edge": {
|
|
148
|
+
await store.deleteEdge(String(params.from ?? ""), String(params.to ?? ""), params.relation);
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
case "graph.read_snapshot": {
|
|
152
|
+
return store.readSnapshot();
|
|
153
|
+
}
|
|
154
|
+
case "skill.sync_push": {
|
|
155
|
+
const stored = writeSkillPack(skillPath, params.pack ?? params);
|
|
156
|
+
return { revision: stored.revision, updatedAt: stored.updatedAt };
|
|
157
|
+
}
|
|
158
|
+
case "skill.sync_pull": {
|
|
159
|
+
const stored = readSkillPack(skillPath);
|
|
160
|
+
return { pack: stored?.pack ?? null, revision: stored?.revision ?? null, updatedAt: stored?.updatedAt ?? null };
|
|
161
|
+
}
|
|
162
|
+
case "artifact.import": {
|
|
163
|
+
await store.upsertNodes(params.nodes ?? []);
|
|
164
|
+
await store.upsertEdges(params.edges ?? []);
|
|
165
|
+
const snapshot = store.readSnapshot();
|
|
166
|
+
return { nodeCount: snapshot.nodes.length, edgeCount: snapshot.edges.length, imported: true };
|
|
167
|
+
}
|
|
168
|
+
case "governance.quarantine": {
|
|
169
|
+
const ids = params.nodeIds ?? [];
|
|
170
|
+
return (0, team_governance_js_1.propagateQuarantine)(store, ids, {
|
|
171
|
+
...(typeof params.actor === "string" ? { actor: params.actor } : {}),
|
|
172
|
+
...(typeof params.reason === "string" ? { reason: params.reason } : {}),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
case "governance.review": {
|
|
176
|
+
return (0, team_governance_js_1.approveGraphNode)(store, String(params.nodeId ?? ""), String(params.role ?? "admin"), params.decision === "rejected" ? "rejected" : "approved", typeof params.reason === "string" ? params.reason : undefined);
|
|
177
|
+
}
|
|
178
|
+
case "team.health": {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
default:
|
|
182
|
+
throw new Error(`Unknown Graphify method: ${method}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async function startTeamMemoryServer(options = {}) {
|
|
186
|
+
const host = options.host ?? "127.0.0.1";
|
|
187
|
+
const requestedPort = options.port ?? Number(process.env.GRAPHFLOW_TEAM_PORT ?? 0);
|
|
188
|
+
const endpoint = normalizeHttpEndpoint(options.endpoint ?? process.env.GRAPHFLOW_TEAM_ENDPOINT);
|
|
189
|
+
const storeRoot = (0, node_path_1.resolve)(options.storeRoot ?? process.env.GRAPHFLOW_TEAM_STORE ?? ".graphflow/team-store");
|
|
190
|
+
const loopback = isLoopbackHost(host);
|
|
191
|
+
const hasCredentials = (0, token_auth_js_1.credentialsConfigured)(options.auth);
|
|
192
|
+
const requireAuth = options.requireAuth ?? (!loopback || hasCredentials);
|
|
193
|
+
if (!loopback && !options.allowedHosts?.length) {
|
|
194
|
+
throw new Error(`Refusing to bind team memory HTTP to non-loopback ${host} without explicit allowedHosts`);
|
|
195
|
+
}
|
|
196
|
+
if (requireAuth && !hasCredentials) {
|
|
197
|
+
throw new Error("Team memory server requires auth for this bind (bearer token or JWT). " +
|
|
198
|
+
"Pass --http-token <role:token> or --http-jwt-secret, or bind loopback without credentials.");
|
|
199
|
+
}
|
|
200
|
+
if (!loopback && hasCredentials) {
|
|
201
|
+
const roles = Object.values(options.auth?.bearerRoleMap ?? {});
|
|
202
|
+
const jwtReady = Boolean(options.auth?.jwtSecret || options.auth?.publicKeyPem);
|
|
203
|
+
if (!jwtReady && roles.length === 0) {
|
|
204
|
+
throw new Error("Non-loopback team serve requires RBAC role assignment: use --http-token viewer|contributor|admin:<token> " +
|
|
205
|
+
"or issue JWTs with a role / memory:* scope.");
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
(0, node_fs_1.mkdirSync)(storeRoot, { recursive: true });
|
|
209
|
+
const auditPath = options.auditPath ?? (0, node_path_1.join)(storeRoot, "team-http-audit.jsonl");
|
|
210
|
+
const httpServer = (0, node_http_1.createServer)((req, res) => {
|
|
211
|
+
void (async () => {
|
|
212
|
+
if (!validateHttpHost(req, host, options.allowedHosts)) {
|
|
213
|
+
writeJsonRpcError(res, 403, null, "Invalid GraphFlow team HTTP Host");
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
if (!validateHttpOrigin(req, options.allowedOrigins)) {
|
|
217
|
+
writeJsonRpcError(res, 403, null, "Origin is not allowed by GraphFlow team HTTP");
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
let tenant = "default";
|
|
221
|
+
try {
|
|
222
|
+
tenant = requestTenant(req, options.auth);
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
writeJsonRpcError(res, 403, null, error instanceof Error ? error.message : "tenant rejected");
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
let authentication = { authenticated: true, subject: "local" };
|
|
229
|
+
if (requireAuth) {
|
|
230
|
+
authentication = await (0, token_auth_js_1.verifyAccessToken)(req.headers.authorization, options.auth ?? {});
|
|
231
|
+
if (!authentication.authenticated) {
|
|
232
|
+
(0, evidence_js_1.appendGovernanceAudit)(auditPath, {
|
|
233
|
+
actor: "anonymous",
|
|
234
|
+
action: "team.auth.reject",
|
|
235
|
+
subject: req.url ?? endpoint,
|
|
236
|
+
tenant,
|
|
237
|
+
data: { reason: authentication.reason },
|
|
238
|
+
});
|
|
239
|
+
writeJsonRpcError(res, 401, null, authentication.reason ?? "authentication rejected");
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const url = new URL(req.url ?? "/", "http://graphflow.invalid");
|
|
244
|
+
const healthPath = url.pathname === "/health" || url.pathname === `${endpoint}/health`;
|
|
245
|
+
const rpcPath = url.pathname === endpoint || (endpoint === "/mcp" && url.pathname === "/");
|
|
246
|
+
if (req.method === "GET" && healthPath) {
|
|
247
|
+
const paths = tenantStorePaths(storeRoot, tenant);
|
|
248
|
+
const store = new graphify_file_client_js_1.GraphifyFileClient(paths.graph);
|
|
249
|
+
const snapshot = store.readSnapshot();
|
|
250
|
+
const pack = readSkillPack(paths.skills);
|
|
251
|
+
const health = {
|
|
252
|
+
ok: true,
|
|
253
|
+
service: "graphflow-team-memory",
|
|
254
|
+
tenant,
|
|
255
|
+
role: authentication.role ?? "local",
|
|
256
|
+
rbac: true,
|
|
257
|
+
authMode: authModeOf(options.auth),
|
|
258
|
+
nodeCount: snapshot.nodes.length,
|
|
259
|
+
edgeCount: snapshot.edges.length,
|
|
260
|
+
skillPackRevision: pack?.revision ?? null,
|
|
261
|
+
};
|
|
262
|
+
if (requireAuth) {
|
|
263
|
+
try {
|
|
264
|
+
(0, rbac_js_1.assertAuthorized)((0, rbac_js_1.authorizeTeamMethod)(authentication.role, "team.health"));
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
const message = error instanceof Error ? error.message : "RBAC denied";
|
|
268
|
+
writeJsonRpcError(res, 403, null, message);
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
writeHttpJson(res, 200, health);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
if (!rpcPath) {
|
|
276
|
+
writeJsonRpcError(res, 404, null, `Unknown GraphFlow team HTTP endpoint: ${url.pathname}`);
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
if (req.method !== "POST") {
|
|
280
|
+
writeJsonRpcError(res, 405, null, "GraphFlow team memory accepts POST JSON-RPC");
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
let parsed;
|
|
284
|
+
try {
|
|
285
|
+
const body = await readJsonBody(req);
|
|
286
|
+
parsed = (body && typeof body === "object" ? body : {});
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
writeJsonRpcError(res, 400, null, "Invalid JSON body");
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
const requestId = parsed.id ?? null;
|
|
293
|
+
const method = typeof parsed.method === "string" ? parsed.method : "";
|
|
294
|
+
if (!method) {
|
|
295
|
+
writeJsonRpcError(res, 400, requestId, "JSON-RPC method is required");
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
if (requireAuth) {
|
|
299
|
+
try {
|
|
300
|
+
(0, rbac_js_1.assertAuthorized)((0, rbac_js_1.authorizeTeamMethod)(authentication.role, method));
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
const message = error instanceof rbac_js_1.TeamAuthorizationError || error instanceof Error
|
|
304
|
+
? error.message
|
|
305
|
+
: "RBAC denied";
|
|
306
|
+
(0, evidence_js_1.appendGovernanceAudit)(auditPath, {
|
|
307
|
+
actor: authentication.subject ?? "anonymous",
|
|
308
|
+
action: "team.rbac.deny",
|
|
309
|
+
subject: method,
|
|
310
|
+
tenant,
|
|
311
|
+
data: { reason: message, role: authentication.role ?? null },
|
|
312
|
+
});
|
|
313
|
+
writeJsonRpcError(res, 403, requestId, message);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
const paths = tenantStorePaths(storeRoot, tenant);
|
|
318
|
+
const store = new graphify_file_client_js_1.GraphifyFileClient(paths.graph);
|
|
319
|
+
const auditEvent = (0, evidence_js_1.appendGovernanceAudit)(auditPath, {
|
|
320
|
+
actor: authentication.subject ?? "local",
|
|
321
|
+
action: `team.${method}`,
|
|
322
|
+
subject: `${tenant}:${method}`,
|
|
323
|
+
tenant,
|
|
324
|
+
data: { role: authentication.role ?? "local" },
|
|
325
|
+
});
|
|
326
|
+
res.setHeader("x-graphflow-audit-seq", String(auditEvent.seq));
|
|
327
|
+
res.setHeader("x-graphflow-tenant", tenant);
|
|
328
|
+
if (authentication.role) {
|
|
329
|
+
res.setHeader("x-graphflow-role", authentication.role);
|
|
330
|
+
}
|
|
331
|
+
try {
|
|
332
|
+
if (method === "team.health") {
|
|
333
|
+
const snapshot = store.readSnapshot();
|
|
334
|
+
const pack = readSkillPack(paths.skills);
|
|
335
|
+
const health = {
|
|
336
|
+
ok: true,
|
|
337
|
+
service: "graphflow-team-memory",
|
|
338
|
+
tenant,
|
|
339
|
+
role: authentication.role ?? "local",
|
|
340
|
+
rbac: true,
|
|
341
|
+
authMode: authModeOf(options.auth),
|
|
342
|
+
nodeCount: snapshot.nodes.length,
|
|
343
|
+
edgeCount: snapshot.edges.length,
|
|
344
|
+
skillPackRevision: pack?.revision ?? null,
|
|
345
|
+
};
|
|
346
|
+
writeHttpJson(res, 200, { jsonrpc: "2.0", id: requestId, result: health });
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
const result = await dispatchTeamMethod(method, parsed.params && typeof parsed.params === "object" ? parsed.params : {}, store, paths.skills);
|
|
350
|
+
writeHttpJson(res, 200, { jsonrpc: "2.0", id: requestId, result });
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
const message = error instanceof Error ? error.message : "team method failed";
|
|
354
|
+
writeJsonRpcError(res, 200, requestId, message, -32000);
|
|
355
|
+
}
|
|
356
|
+
})().catch((error) => {
|
|
357
|
+
if (!res.headersSent) {
|
|
358
|
+
writeJsonRpcError(res, 500, null, "Unexpected GraphFlow team HTTP error");
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
res.destroy();
|
|
362
|
+
}
|
|
363
|
+
console.error("[GraphFlow team] Unexpected HTTP error:", error);
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
if (options.signal) {
|
|
367
|
+
options.signal.addEventListener("abort", () => {
|
|
368
|
+
void httpServer.close();
|
|
369
|
+
}, { once: true });
|
|
370
|
+
}
|
|
371
|
+
await new Promise((resolveListen, reject) => {
|
|
372
|
+
httpServer.once("error", reject);
|
|
373
|
+
httpServer.listen(requestedPort, host, resolveListen);
|
|
374
|
+
});
|
|
375
|
+
const address = httpServer.address();
|
|
376
|
+
if (!address || typeof address === "string") {
|
|
377
|
+
throw new Error("GraphFlow team HTTP listener did not return a TCP address");
|
|
378
|
+
}
|
|
379
|
+
return {
|
|
380
|
+
httpServer,
|
|
381
|
+
url: `http://${host === "::1" ? `[${host}]` : host}:${address.port}${endpoint}`,
|
|
382
|
+
endpoint,
|
|
383
|
+
host,
|
|
384
|
+
port: address.port,
|
|
385
|
+
storeRoot,
|
|
386
|
+
requireAuth,
|
|
387
|
+
rbac: true,
|
|
388
|
+
async close() {
|
|
389
|
+
await new Promise((resolveClose) => httpServer.close(() => resolveClose()));
|
|
390
|
+
},
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/surfaces/team/server.ts"],"names":[],"mappings":"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"}
|