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.
- package/esm/_dnt.polyfills.d.ts +99 -0
- package/esm/_dnt.polyfills.d.ts.map +1 -1
- package/esm/_dnt.polyfills.js +127 -1
- package/esm/_dnt.shims.d.ts +6 -0
- package/esm/_dnt.shims.d.ts.map +1 -0
- package/esm/_dnt.shims.js +61 -0
- package/esm/src/config.d.ts +14 -7
- package/esm/src/config.d.ts.map +1 -1
- package/esm/src/config.js +103 -30
- package/esm/src/index.d.ts.map +1 -1
- package/esm/src/index.js +12 -6
- package/esm/src/services/client.d.ts +15 -30
- package/esm/src/services/client.d.ts.map +1 -1
- package/esm/src/services/client.js +86 -126
- package/esm/src/services/connection-manager.d.ts +97 -0
- package/esm/src/services/connection-manager.d.ts.map +1 -0
- package/esm/src/services/connection-manager.js +535 -0
- package/esm/src/services/logger.d.ts +2 -0
- package/esm/src/services/logger.d.ts.map +1 -1
- package/esm/src/services/logger.js +29 -3
- package/esm/src/utils.d.ts.map +1 -1
- package/esm/src/utils.js +10 -2
- package/package.json +2 -2
- package/script/_dnt.polyfills.d.ts +99 -0
- package/script/_dnt.polyfills.d.ts.map +1 -1
- package/script/_dnt.polyfills.js +128 -0
- package/script/_dnt.shims.d.ts +6 -0
- package/script/_dnt.shims.d.ts.map +1 -0
- package/script/_dnt.shims.js +65 -0
- package/script/src/config.d.ts +14 -7
- package/script/src/config.d.ts.map +1 -1
- package/script/src/config.js +106 -63
- package/script/src/index.d.ts.map +1 -1
- package/script/src/index.js +12 -6
- package/script/src/services/client.d.ts +15 -30
- package/script/src/services/client.d.ts.map +1 -1
- package/script/src/services/client.js +86 -129
- package/script/src/services/connection-manager.d.ts +97 -0
- package/script/src/services/connection-manager.d.ts.map +1 -0
- package/script/src/services/connection-manager.js +549 -0
- package/script/src/services/logger.d.ts +2 -0
- package/script/src/services/logger.d.ts.map +1 -1
- package/script/src/services/logger.js +65 -7
- package/script/src/utils.d.ts.map +1 -1
- 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
|
|
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
|
|
14
|
-
* and persisting episodes with basic reconnection handling.
|
|
8
|
+
* Graphiti domain adapter over the connection manager.
|
|
15
9
|
*/
|
|
16
10
|
class GraphitiClient {
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
return false;
|
|
23
|
+
else {
|
|
24
|
+
this.toolCaller = endpointOrManager;
|
|
79
25
|
}
|
|
80
26
|
}
|
|
81
|
-
|
|
82
|
-
|
|
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
|
|
91
|
-
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
|
125
|
-
this.
|
|
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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"}
|