@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.
Files changed (83) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +3 -3
  3. package/README.zh.md +1 -1
  4. package/dist/config/schema.d.ts +3 -1
  5. package/dist/config/schema.d.ts.map +1 -1
  6. package/dist/graph/client-factory.d.ts.map +1 -1
  7. package/dist/graph/client-factory.js +4 -1
  8. package/dist/graph/client-factory.js.map +1 -1
  9. package/dist/graph/graphify-mcp-client.d.ts +33 -0
  10. package/dist/graph/graphify-mcp-client.d.ts.map +1 -1
  11. package/dist/graph/graphify-mcp-client.js +66 -5
  12. package/dist/graph/graphify-mcp-client.js.map +1 -1
  13. package/dist/index.d.ts +3 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +10 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/integrations/dsh-harness-installer.d.ts +2 -0
  18. package/dist/integrations/dsh-harness-installer.d.ts.map +1 -1
  19. package/dist/integrations/dsh-harness-installer.js +9 -3
  20. package/dist/integrations/dsh-harness-installer.js.map +1 -1
  21. package/dist/integrations/host-adapter-install.d.ts +19 -0
  22. package/dist/integrations/host-adapter-install.d.ts.map +1 -0
  23. package/dist/integrations/host-adapter-install.js +75 -0
  24. package/dist/integrations/host-adapter-install.js.map +1 -0
  25. package/dist/integrations/host-adapter.d.ts +5 -0
  26. package/dist/integrations/host-adapter.d.ts.map +1 -1
  27. package/dist/integrations/host-adapter.js.map +1 -1
  28. package/dist/integrations/skill-installer.d.ts.map +1 -1
  29. package/dist/integrations/skill-installer.js +3 -1
  30. package/dist/integrations/skill-installer.js.map +1 -1
  31. package/dist/security/rbac.d.ts +39 -0
  32. package/dist/security/rbac.d.ts.map +1 -0
  33. package/dist/security/rbac.js +213 -0
  34. package/dist/security/rbac.js.map +1 -0
  35. package/dist/security/token-auth.d.ts +15 -2
  36. package/dist/security/token-auth.d.ts.map +1 -1
  37. package/dist/security/token-auth.js +86 -5
  38. package/dist/security/token-auth.js.map +1 -1
  39. package/dist/surfaces/cli/index.js +79 -4
  40. package/dist/surfaces/cli/index.js.map +1 -1
  41. package/dist/surfaces/cli/init.d.ts +3 -0
  42. package/dist/surfaces/cli/init.d.ts.map +1 -1
  43. package/dist/surfaces/cli/init.js +31 -2
  44. package/dist/surfaces/cli/init.js.map +1 -1
  45. package/dist/surfaces/cli/output.d.ts.map +1 -1
  46. package/dist/surfaces/cli/output.js +7 -3
  47. package/dist/surfaces/cli/output.js.map +1 -1
  48. package/dist/surfaces/cli/runtime/graph.d.ts +13 -0
  49. package/dist/surfaces/cli/runtime/graph.d.ts.map +1 -1
  50. package/dist/surfaces/cli/runtime/graph.js +97 -9
  51. package/dist/surfaces/cli/runtime/graph.js.map +1 -1
  52. package/dist/surfaces/cli/runtime/routing.d.ts +1 -1
  53. package/dist/surfaces/cli/runtime/routing.d.ts.map +1 -1
  54. package/dist/surfaces/cli/runtime/routing.js +12 -2
  55. package/dist/surfaces/cli/runtime/routing.js.map +1 -1
  56. package/dist/surfaces/cli/runtime/types.d.ts +3 -0
  57. package/dist/surfaces/cli/runtime/types.d.ts.map +1 -1
  58. package/dist/surfaces/cli/runtime.d.ts +1 -1
  59. package/dist/surfaces/cli/runtime.d.ts.map +1 -1
  60. package/dist/surfaces/cli/runtime.js +3 -2
  61. package/dist/surfaces/cli/runtime.js.map +1 -1
  62. package/dist/surfaces/mcp/server.d.ts +2 -0
  63. package/dist/surfaces/mcp/server.d.ts.map +1 -1
  64. package/dist/surfaces/mcp/server.js +77 -37
  65. package/dist/surfaces/mcp/server.js.map +1 -1
  66. package/dist/surfaces/mcp/tool-handlers.d.ts.map +1 -1
  67. package/dist/surfaces/mcp/tool-handlers.js +2 -0
  68. package/dist/surfaces/mcp/tool-handlers.js.map +1 -1
  69. package/dist/surfaces/team/diagnose.d.ts +18 -0
  70. package/dist/surfaces/team/diagnose.d.ts.map +1 -0
  71. package/dist/surfaces/team/diagnose.js +57 -0
  72. package/dist/surfaces/team/diagnose.js.map +1 -0
  73. package/dist/surfaces/team/ops.d.ts +16 -0
  74. package/dist/surfaces/team/ops.d.ts.map +1 -0
  75. package/dist/surfaces/team/ops.js +137 -0
  76. package/dist/surfaces/team/ops.js.map +1 -0
  77. package/dist/surfaces/team/server.d.ts +48 -0
  78. package/dist/surfaces/team/server.d.ts.map +1 -0
  79. package/dist/surfaces/team/server.js +393 -0
  80. package/dist/surfaces/team/server.js.map +1 -0
  81. package/dsh/plugin.mjs +180 -46
  82. package/package.json +7 -6
  83. 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":";;AAyBA,sEAoEC;AAED,0DAEC;AAED,wDAgCC;AAED,oEAoBC;AAzJD,qCAAuC;AACvC,oDAAmE;AACnE,gEAAoF;AACpF,2CAIqB;AAErB,SAAS,QAAQ,CAAC,IAAc,EAAE,IAAY;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC;AAED,SAAS,YAAY,CAAC,IAAc,EAAE,IAAY;IAChD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YACtC,IAAI,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,6BAA6B,CAC3C,OAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QAChF,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,aAAa,GAA6B,EAAE,CAAC;IACnD,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG;QACb,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,GAAG,YAAY,CAAC,IAAI,EAAE,cAAc,CAAC;KACtC,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAA,qCAAqB,EAAC,GAAG,CAAC,CAAC;QAC1C,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,MAAM,CAAC,IAAI;YAAE,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;IAC7D,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,IAAA,qCAAqB,EAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;YAC1C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;gBAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IAC/F,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IAC9F,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;IACpG,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACrD,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAClC,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,IAAI,GAAwB;QAChC,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAA,sBAAY,EAAC,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC;IAEF,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAC5D,OAAO;QACL,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3E,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,uBAAuB,CAAC,IAAc;IAC1D,OAAO,IAAA,iCAAqB,EAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAgB,sBAAsB,CAAC,IAAc;IAMnD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,WAAW,CAAC;IAC3D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,aAAa,CAAC;IAC1D,IAAI,CAAC,IAAA,oBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,MAAM,GACV,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,yBAAyB;QACrC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;IAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAChE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,gBAAgB,CAAC;IAC9D,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,gBAAgB,CAAC;IAClE,MAAM,KAAK,GAAG,IAAA,6BAAa,EAAC,OAAO,EAAE,MAAM,EAAE;QAC3C,IAAI,EAAE,OAAO;QACb,MAAM;QACN,QAAQ;QACR,UAAU;KACX,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACvD,CAAC;AAED,SAAgB,4BAA4B,CAAC,UAIzC,EAAE;IACJ,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,2BAA2B,CAAC;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC;IAC3C,OAAO;QACL,WAAW,EAAE;YACX,SAAS,EAAE,UAAU;YACrB,WAAW,EAAE,QAAQ;YACrB,SAAS,EAAE,OAAO,CAAC,MAAM,IAAI,yBAAyB;YACtD,SAAS,EAAE,MAAM;YACjB,cAAc,EAAE,oCAAoC;YACpD,gBAAgB,EAAE,IAAI;YACtB,eAAe,EAAE,IAAI;SACtB;QACD,QAAQ,EACN,oKAAoK;KACvK,CAAC;AACJ,CAAC"}
@@ -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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"}