opencode-graphiti 0.1.10 → 0.1.12

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 (45) hide show
  1. package/esm/_dnt.polyfills.d.ts +99 -0
  2. package/esm/_dnt.polyfills.d.ts.map +1 -1
  3. package/esm/_dnt.polyfills.js +127 -1
  4. package/esm/_dnt.shims.d.ts +6 -0
  5. package/esm/_dnt.shims.d.ts.map +1 -0
  6. package/esm/_dnt.shims.js +61 -0
  7. package/esm/src/config.d.ts +14 -7
  8. package/esm/src/config.d.ts.map +1 -1
  9. package/esm/src/config.js +103 -30
  10. package/esm/src/index.d.ts.map +1 -1
  11. package/esm/src/index.js +12 -6
  12. package/esm/src/services/client.d.ts +15 -30
  13. package/esm/src/services/client.d.ts.map +1 -1
  14. package/esm/src/services/client.js +86 -126
  15. package/esm/src/services/connection-manager.d.ts +97 -0
  16. package/esm/src/services/connection-manager.d.ts.map +1 -0
  17. package/esm/src/services/connection-manager.js +535 -0
  18. package/esm/src/services/logger.d.ts +2 -0
  19. package/esm/src/services/logger.d.ts.map +1 -1
  20. package/esm/src/services/logger.js +29 -3
  21. package/esm/src/utils.d.ts.map +1 -1
  22. package/esm/src/utils.js +10 -2
  23. package/package.json +2 -2
  24. package/script/_dnt.polyfills.d.ts +99 -0
  25. package/script/_dnt.polyfills.d.ts.map +1 -1
  26. package/script/_dnt.polyfills.js +128 -0
  27. package/script/_dnt.shims.d.ts +6 -0
  28. package/script/_dnt.shims.d.ts.map +1 -0
  29. package/script/_dnt.shims.js +65 -0
  30. package/script/src/config.d.ts +14 -7
  31. package/script/src/config.d.ts.map +1 -1
  32. package/script/src/config.js +106 -63
  33. package/script/src/index.d.ts.map +1 -1
  34. package/script/src/index.js +12 -6
  35. package/script/src/services/client.d.ts +15 -30
  36. package/script/src/services/client.d.ts.map +1 -1
  37. package/script/src/services/client.js +86 -129
  38. package/script/src/services/connection-manager.d.ts +97 -0
  39. package/script/src/services/connection-manager.d.ts.map +1 -0
  40. package/script/src/services/connection-manager.js +549 -0
  41. package/script/src/services/logger.d.ts +2 -0
  42. package/script/src/services/logger.d.ts.map +1 -1
  43. package/script/src/services/logger.js +65 -7
  44. package/script/src/utils.d.ts.map +1 -1
  45. package/script/src/utils.js +10 -2
@@ -1,138 +1,41 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.GraphitiClient = void 0;
7
- const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
8
- const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/client/streamableHttp.js");
9
- const deno_js_1 = __importDefault(require("../../deno.js"));
4
+ const connection_manager_js_1 = require("./connection-manager.js");
10
5
  const logger_js_1 = require("./logger.js");
11
6
  const sdk_normalize_js_1 = require("./sdk-normalize.js");
12
7
  /**
13
- * Graphiti MCP client wrapper for connecting, querying,
14
- * and persisting episodes with basic reconnection handling.
8
+ * Graphiti domain adapter over the connection manager.
15
9
  */
16
10
  class GraphitiClient {
17
- /**
18
- * Create a Graphiti client bound to the given MCP endpoint URL.
19
- */
20
- constructor(endpoint) {
21
- Object.defineProperty(this, "client", {
22
- enumerable: true,
23
- configurable: true,
24
- writable: true,
25
- value: void 0
26
- });
27
- Object.defineProperty(this, "transport", {
11
+ constructor(endpointOrManager) {
12
+ Object.defineProperty(this, "toolCaller", {
28
13
  enumerable: true,
29
14
  configurable: true,
30
15
  writable: true,
31
16
  value: void 0
32
17
  });
33
- Object.defineProperty(this, "connected", {
34
- enumerable: true,
35
- configurable: true,
36
- writable: true,
37
- value: false
38
- });
39
- Object.defineProperty(this, "endpoint", {
40
- enumerable: true,
41
- configurable: true,
42
- writable: true,
43
- value: void 0
44
- });
45
- this.endpoint = endpoint;
46
- this.client = new index_js_1.Client({
47
- name: deno_js_1.default.name,
48
- version: deno_js_1.default.version,
49
- });
50
- this.transport = new streamableHttp_js_1.StreamableHTTPClientTransport(new URL(endpoint));
51
- }
52
- /** Create a fresh MCP Client and Transport pair. */
53
- createClientAndTransport() {
54
- this.client = new index_js_1.Client({
55
- name: deno_js_1.default.name,
56
- version: deno_js_1.default.version,
57
- });
58
- this.transport = new streamableHttp_js_1.StreamableHTTPClientTransport(new URL(this.endpoint));
59
- }
60
- /**
61
- * Establish a connection to the Graphiti MCP server.
62
- * Creates a fresh Client/Transport if a previous attempt failed.
63
- */
64
- async connect() {
65
- if (this.connected)
66
- return true;
67
- // If a previous connect() tainted the Client's internal state,
68
- // create fresh instances so the retry starts cleanly.
69
- this.createClientAndTransport();
70
- try {
71
- await this.client.connect(this.transport);
72
- this.connected = true;
73
- logger_js_1.logger.info("Connected to Graphiti MCP server at", this.endpoint);
74
- return true;
18
+ if (typeof endpointOrManager === "string") {
19
+ this.toolCaller = new connection_manager_js_1.GraphitiConnectionManager({
20
+ endpoint: endpointOrManager,
21
+ });
75
22
  }
76
- catch (err) {
77
- logger_js_1.logger.error("Failed to connect to Graphiti:", err);
78
- return false;
23
+ else {
24
+ this.toolCaller = endpointOrManager;
79
25
  }
80
26
  }
81
- /**
82
- * Close the underlying MCP client connection.
83
- */
84
- async disconnect() {
85
- if (this.connected) {
86
- await this.client.close();
87
- this.connected = false;
88
- }
27
+ start() {
28
+ this.toolCaller.start();
89
29
  }
90
- async callTool(name, args) {
91
- if (!this.connected) {
92
- const ok = await this.connect();
93
- if (!ok)
94
- throw new Error("Not connected to Graphiti");
95
- }
96
- // Sanitize arguments: omit task_id (and others) if null or undefined
97
- const sanitizedArgs = Object.fromEntries(Object.entries(args).filter(([_, v]) => v !== null && v !== undefined));
98
- try {
99
- const result = await this.client.callTool({
100
- name,
101
- arguments: sanitizedArgs,
102
- });
103
- return this.parseToolResult(result);
104
- }
105
- catch (err) {
106
- if (this.isSessionExpired(err)) {
107
- logger_js_1.logger.warn("Graphiti session expired, reconnecting...");
108
- await this.reconnect();
109
- const result = await this.client.callTool({
110
- name,
111
- arguments: sanitizedArgs,
112
- });
113
- return this.parseToolResult(result);
114
- }
115
- throw err;
116
- }
30
+ async stop() {
31
+ await this.toolCaller.stop();
117
32
  }
118
- isSessionExpired(err) {
119
- return !!(err &&
120
- typeof err === "object" &&
121
- "code" in err &&
122
- err.code === 404);
33
+ async connect() {
34
+ this.toolCaller.start();
35
+ return await this.toolCaller.ready();
123
36
  }
124
- async reconnect() {
125
- this.connected = false;
126
- try {
127
- await this.client.close();
128
- }
129
- catch {
130
- // ignore close errors on stale client
131
- }
132
- this.createClientAndTransport();
133
- await this.client.connect(this.transport);
134
- this.connected = true;
135
- logger_js_1.logger.info("Reconnected to Graphiti MCP server");
37
+ async ready(timeoutMs) {
38
+ return await this.toolCaller.ready(timeoutMs);
136
39
  }
137
40
  /**
138
41
  * Parse MCP tool results into JSON when possible.
@@ -161,19 +64,6 @@ class GraphitiClient {
161
64
  return text;
162
65
  }
163
66
  }
164
- /**
165
- * Add an episode to Graphiti memory.
166
- */
167
- async addEpisode(params) {
168
- await this.callTool("add_memory", {
169
- name: params.name,
170
- episode_body: params.episodeBody,
171
- group_id: params.groupId,
172
- source: params.source || "text",
173
- source_description: params.sourceDescription || "",
174
- });
175
- logger_js_1.logger.debug("Added episode:", params.name);
176
- }
177
67
  /**
178
68
  * Extract an array from a tool result that may be a bare array or a
179
69
  * wrapped-array response object (`{ [key]: T[] }`).
@@ -190,6 +80,30 @@ class GraphitiClient {
190
80
  }
191
81
  return null;
192
82
  }
83
+ /**
84
+ * Add an episode to Graphiti memory.
85
+ */
86
+ async addEpisode(params) {
87
+ try {
88
+ await this.callTool("add_memory", {
89
+ name: params.name,
90
+ episode_body: params.episodeBody,
91
+ group_id: params.groupId,
92
+ source: params.source || "text",
93
+ source_description: params.sourceDescription || "",
94
+ });
95
+ logger_js_1.logger.debug("Added episode:", params.name);
96
+ }
97
+ catch (err) {
98
+ if ((0, connection_manager_js_1.isGraphitiOfflineError)(err) ||
99
+ (0, connection_manager_js_1.isGraphitiTimeoutError)(err) ||
100
+ err instanceof connection_manager_js_1.GraphitiTransportError ||
101
+ err instanceof connection_manager_js_1.GraphitiSessionExpiredError) {
102
+ logger_js_1.logger.warn("addEpisode failed due to Graphiti availability issue", err);
103
+ }
104
+ throw err;
105
+ }
106
+ }
193
107
  /**
194
108
  * Search Graphiti facts matching the provided query.
195
109
  */
@@ -203,6 +117,19 @@ class GraphitiClient {
203
117
  return this.parseWrappedArray(result, "facts") ?? [];
204
118
  }
205
119
  catch (err) {
120
+ if ((0, connection_manager_js_1.isGraphitiTimeoutError)(err)) {
121
+ logger_js_1.logger.warn("searchFacts request timed out; returning no facts");
122
+ return [];
123
+ }
124
+ if ((0, connection_manager_js_1.isGraphitiOfflineError)(err)) {
125
+ logger_js_1.logger.warn("searchFacts unavailable; returning no facts");
126
+ return [];
127
+ }
128
+ if (err instanceof connection_manager_js_1.GraphitiTransportError ||
129
+ err instanceof connection_manager_js_1.GraphitiSessionExpiredError) {
130
+ logger_js_1.logger.warn("searchFacts unavailable during reconnect; returning no facts");
131
+ return [];
132
+ }
206
133
  logger_js_1.logger.error("searchFacts error:", err);
207
134
  return [];
208
135
  }
@@ -220,6 +147,19 @@ class GraphitiClient {
220
147
  return this.parseWrappedArray(result, "nodes") ?? [];
221
148
  }
222
149
  catch (err) {
150
+ if ((0, connection_manager_js_1.isGraphitiTimeoutError)(err)) {
151
+ logger_js_1.logger.warn("searchNodes request timed out; returning no nodes");
152
+ return [];
153
+ }
154
+ if ((0, connection_manager_js_1.isGraphitiOfflineError)(err)) {
155
+ logger_js_1.logger.warn("searchNodes unavailable; returning no nodes");
156
+ return [];
157
+ }
158
+ if (err instanceof connection_manager_js_1.GraphitiTransportError ||
159
+ err instanceof connection_manager_js_1.GraphitiSessionExpiredError) {
160
+ logger_js_1.logger.warn("searchNodes unavailable during reconnect; returning no nodes");
161
+ return [];
162
+ }
223
163
  logger_js_1.logger.error("searchNodes error:", err);
224
164
  return [];
225
165
  }
@@ -238,6 +178,19 @@ class GraphitiClient {
238
178
  return raw.map(sdk_normalize_js_1.normalizeEpisode);
239
179
  }
240
180
  catch (err) {
181
+ if ((0, connection_manager_js_1.isGraphitiTimeoutError)(err)) {
182
+ logger_js_1.logger.warn("getEpisodes request timed out; returning no episodes");
183
+ return [];
184
+ }
185
+ if ((0, connection_manager_js_1.isGraphitiOfflineError)(err)) {
186
+ logger_js_1.logger.warn("getEpisodes unavailable; returning no episodes");
187
+ return [];
188
+ }
189
+ if (err instanceof connection_manager_js_1.GraphitiTransportError ||
190
+ err instanceof connection_manager_js_1.GraphitiSessionExpiredError) {
191
+ logger_js_1.logger.warn("getEpisodes unavailable during reconnect; returning no episodes");
192
+ return [];
193
+ }
241
194
  logger_js_1.logger.error("getEpisodes error:", err);
242
195
  return [];
243
196
  }
@@ -254,5 +207,9 @@ class GraphitiClient {
254
207
  return false;
255
208
  }
256
209
  }
210
+ async callTool(name, args) {
211
+ const result = await this.toolCaller.callTool(name, args);
212
+ return this.parseToolResult(result);
213
+ }
257
214
  }
258
215
  exports.GraphitiClient = GraphitiClient;
@@ -0,0 +1,97 @@
1
+ export type GraphitiConnectionState = "connecting" | "connected" | "offline" | "closing";
2
+ type TimerHandle = ReturnType<typeof setTimeout> | number;
3
+ export declare class GraphitiOfflineError extends Error {
4
+ readonly state: "offline" | "closing";
5
+ readonly kind = "offline";
6
+ constructor(state: "offline" | "closing", message?: string);
7
+ }
8
+ export declare class GraphitiQueueTimeoutError extends Error {
9
+ readonly kind = "queue-timeout";
10
+ constructor(message?: string);
11
+ }
12
+ export declare class GraphitiRequestTimeoutError extends Error {
13
+ readonly kind = "request-timeout";
14
+ constructor(message?: string);
15
+ }
16
+ export declare class GraphitiTransportError extends Error {
17
+ readonly kind = "transport-failure";
18
+ constructor(message?: string);
19
+ }
20
+ export declare class GraphitiSessionExpiredError extends Error {
21
+ readonly kind = "session-expired";
22
+ constructor(message?: string);
23
+ }
24
+ export declare function isGraphitiOfflineError(err: unknown): err is GraphitiOfflineError;
25
+ export declare function isGraphitiTimeoutError(err: unknown): err is GraphitiQueueTimeoutError | GraphitiRequestTimeoutError;
26
+ export type GraphitiToolRequest = {
27
+ name: string;
28
+ arguments?: Record<string, unknown>;
29
+ };
30
+ export interface GraphitiConnection {
31
+ connect(): Promise<void>;
32
+ close(): Promise<void>;
33
+ callTool(request: GraphitiToolRequest): Promise<unknown>;
34
+ }
35
+ export interface GraphitiToolCaller {
36
+ start(): void;
37
+ stop(): Promise<void>;
38
+ ready(timeoutMs?: number): Promise<boolean>;
39
+ callTool(name: string, args: Record<string, unknown>, deadlineMs?: number): Promise<unknown>;
40
+ }
41
+ type ConnectionFactory = (endpoint: string) => GraphitiConnection;
42
+ type GraphitiConnectionManagerOptions = {
43
+ endpoint: string;
44
+ requestDeadlineMs?: number;
45
+ queueCapacity?: number;
46
+ startupTimeoutMs?: number;
47
+ reconnectInitialDelayMs?: number;
48
+ reconnectMaxDelayMs?: number;
49
+ reconnectMultiplier?: number;
50
+ reconnectJitter?: number;
51
+ connectionFactory?: ConnectionFactory;
52
+ random?: () => number;
53
+ setTimer?: (callback: () => void, delayMs: number) => TimerHandle;
54
+ clearTimer?: (timer: TimerHandle) => void;
55
+ };
56
+ export declare class GraphitiConnectionManager implements GraphitiToolCaller {
57
+ private readonly endpoint;
58
+ private readonly requestDeadlineMs;
59
+ private readonly queueCapacity;
60
+ private readonly startupTimeoutMs;
61
+ private readonly reconnectInitialDelayMs;
62
+ private readonly reconnectMaxDelayMs;
63
+ private readonly reconnectMultiplier;
64
+ private readonly reconnectJitter;
65
+ private readonly connectionFactory;
66
+ private readonly random;
67
+ private readonly setTimerImpl;
68
+ private readonly clearTimerImpl;
69
+ private state;
70
+ private connection;
71
+ private connectPromise;
72
+ private reconnectTimer;
73
+ private pendingRequests;
74
+ private readyWaiters;
75
+ private reconnectDelayMs;
76
+ private started;
77
+ private flushingQueue;
78
+ constructor(options: GraphitiConnectionManagerOptions);
79
+ getState(): GraphitiConnectionState;
80
+ start(): void;
81
+ stop(): Promise<void>;
82
+ ready(timeoutMs?: number): Promise<boolean>;
83
+ callTool(name: string, args: Record<string, unknown>, deadlineMs?: number): Promise<unknown>;
84
+ reconnect(): Promise<boolean>;
85
+ private performReconnect;
86
+ private executeConnectedCall;
87
+ private enqueueRequest;
88
+ private flushPendingQueue;
89
+ private removePendingRequest;
90
+ private clearPendingTimer;
91
+ private rejectAllPending;
92
+ private scheduleReconnect;
93
+ private cancelReconnectTimer;
94
+ private resolveReadyWaiters;
95
+ }
96
+ export {};
97
+ //# sourceMappingURL=connection-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../../src/src/services/connection-manager.ts"],"names":[],"mappings":"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"}