opencode-graphiti 0.0.0-development

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 (179) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +358 -0
  3. package/esm/_dnt.polyfills.d.ts +166 -0
  4. package/esm/_dnt.polyfills.d.ts.map +1 -0
  5. package/esm/_dnt.polyfills.js +177 -0
  6. package/esm/_dnt.shims.d.ts +6 -0
  7. package/esm/_dnt.shims.d.ts.map +1 -0
  8. package/esm/_dnt.shims.js +61 -0
  9. package/esm/deno.d.ts +45 -0
  10. package/esm/deno.d.ts.map +1 -0
  11. package/esm/deno.js +39 -0
  12. package/esm/mod.d.ts +3 -0
  13. package/esm/mod.d.ts.map +1 -0
  14. package/esm/mod.js +2 -0
  15. package/esm/package.json +3 -0
  16. package/esm/src/config.d.ts +20 -0
  17. package/esm/src/config.d.ts.map +1 -0
  18. package/esm/src/config.js +246 -0
  19. package/esm/src/handlers/chat.d.ts +14 -0
  20. package/esm/src/handlers/chat.d.ts.map +1 -0
  21. package/esm/src/handlers/chat.js +60 -0
  22. package/esm/src/handlers/compacting.d.ts +9 -0
  23. package/esm/src/handlers/compacting.d.ts.map +1 -0
  24. package/esm/src/handlers/compacting.js +30 -0
  25. package/esm/src/handlers/event.d.ts +22 -0
  26. package/esm/src/handlers/event.d.ts.map +1 -0
  27. package/esm/src/handlers/event.js +287 -0
  28. package/esm/src/handlers/messages.d.ts +9 -0
  29. package/esm/src/handlers/messages.d.ts.map +1 -0
  30. package/esm/src/handlers/messages.js +93 -0
  31. package/esm/src/index.d.ts +5 -0
  32. package/esm/src/index.d.ts.map +1 -0
  33. package/esm/src/index.js +153 -0
  34. package/esm/src/services/batch-drain.d.ts +23 -0
  35. package/esm/src/services/batch-drain.d.ts.map +1 -0
  36. package/esm/src/services/batch-drain.js +217 -0
  37. package/esm/src/services/connection-manager.d.ts +104 -0
  38. package/esm/src/services/connection-manager.d.ts.map +1 -0
  39. package/esm/src/services/connection-manager.js +621 -0
  40. package/esm/src/services/constants.d.ts +7 -0
  41. package/esm/src/services/constants.d.ts.map +1 -0
  42. package/esm/src/services/constants.js +6 -0
  43. package/esm/src/services/context-limit.d.ts +3 -0
  44. package/esm/src/services/context-limit.d.ts.map +1 -0
  45. package/esm/src/services/context-limit.js +44 -0
  46. package/esm/src/services/event-extractor.d.ts +29 -0
  47. package/esm/src/services/event-extractor.d.ts.map +1 -0
  48. package/esm/src/services/event-extractor.js +659 -0
  49. package/esm/src/services/graphiti-async.d.ts +22 -0
  50. package/esm/src/services/graphiti-async.d.ts.map +1 -0
  51. package/esm/src/services/graphiti-async.js +219 -0
  52. package/esm/src/services/graphiti-mcp.d.ts +57 -0
  53. package/esm/src/services/graphiti-mcp.d.ts.map +1 -0
  54. package/esm/src/services/graphiti-mcp.js +194 -0
  55. package/esm/src/services/logger.d.ts +9 -0
  56. package/esm/src/services/logger.d.ts.map +1 -0
  57. package/esm/src/services/logger.js +104 -0
  58. package/esm/src/services/opencode-warning.d.ts +8 -0
  59. package/esm/src/services/opencode-warning.d.ts.map +1 -0
  60. package/esm/src/services/opencode-warning.js +104 -0
  61. package/esm/src/services/redis-cache.d.ts +27 -0
  62. package/esm/src/services/redis-cache.d.ts.map +1 -0
  63. package/esm/src/services/redis-cache.js +215 -0
  64. package/esm/src/services/redis-client.d.ts +89 -0
  65. package/esm/src/services/redis-client.d.ts.map +1 -0
  66. package/esm/src/services/redis-client.js +906 -0
  67. package/esm/src/services/redis-events.d.ts +46 -0
  68. package/esm/src/services/redis-events.d.ts.map +1 -0
  69. package/esm/src/services/redis-events.js +517 -0
  70. package/esm/src/services/redis-snapshot.d.ts +16 -0
  71. package/esm/src/services/redis-snapshot.d.ts.map +1 -0
  72. package/esm/src/services/redis-snapshot.js +184 -0
  73. package/esm/src/services/render-utils.d.ts +23 -0
  74. package/esm/src/services/render-utils.d.ts.map +1 -0
  75. package/esm/src/services/render-utils.js +149 -0
  76. package/esm/src/services/runtime-teardown.d.ts +23 -0
  77. package/esm/src/services/runtime-teardown.d.ts.map +1 -0
  78. package/esm/src/services/runtime-teardown.js +119 -0
  79. package/esm/src/services/sdk-normalize.d.ts +55 -0
  80. package/esm/src/services/sdk-normalize.d.ts.map +1 -0
  81. package/esm/src/services/sdk-normalize.js +61 -0
  82. package/esm/src/session.d.ts +74 -0
  83. package/esm/src/session.d.ts.map +1 -0
  84. package/esm/src/session.js +694 -0
  85. package/esm/src/types/index.d.ts +120 -0
  86. package/esm/src/types/index.d.ts.map +1 -0
  87. package/esm/src/types/index.js +28 -0
  88. package/esm/src/utils.d.ts +27 -0
  89. package/esm/src/utils.d.ts.map +1 -0
  90. package/esm/src/utils.js +76 -0
  91. package/package.json +59 -0
  92. package/script/_dnt.polyfills.d.ts +166 -0
  93. package/script/_dnt.polyfills.d.ts.map +1 -0
  94. package/script/_dnt.polyfills.js +180 -0
  95. package/script/_dnt.shims.d.ts +6 -0
  96. package/script/_dnt.shims.d.ts.map +1 -0
  97. package/script/_dnt.shims.js +65 -0
  98. package/script/deno.d.ts +45 -0
  99. package/script/deno.d.ts.map +1 -0
  100. package/script/deno.js +41 -0
  101. package/script/mod.d.ts +3 -0
  102. package/script/mod.d.ts.map +1 -0
  103. package/script/mod.js +6 -0
  104. package/script/package.json +3 -0
  105. package/script/src/config.d.ts +20 -0
  106. package/script/src/config.d.ts.map +1 -0
  107. package/script/src/config.js +256 -0
  108. package/script/src/handlers/chat.d.ts +14 -0
  109. package/script/src/handlers/chat.d.ts.map +1 -0
  110. package/script/src/handlers/chat.js +63 -0
  111. package/script/src/handlers/compacting.d.ts +9 -0
  112. package/script/src/handlers/compacting.d.ts.map +1 -0
  113. package/script/src/handlers/compacting.js +33 -0
  114. package/script/src/handlers/event.d.ts +22 -0
  115. package/script/src/handlers/event.d.ts.map +1 -0
  116. package/script/src/handlers/event.js +290 -0
  117. package/script/src/handlers/messages.d.ts +9 -0
  118. package/script/src/handlers/messages.d.ts.map +1 -0
  119. package/script/src/handlers/messages.js +96 -0
  120. package/script/src/index.d.ts +5 -0
  121. package/script/src/index.d.ts.map +1 -0
  122. package/script/src/index.js +159 -0
  123. package/script/src/services/batch-drain.d.ts +23 -0
  124. package/script/src/services/batch-drain.d.ts.map +1 -0
  125. package/script/src/services/batch-drain.js +221 -0
  126. package/script/src/services/connection-manager.d.ts +104 -0
  127. package/script/src/services/connection-manager.d.ts.map +1 -0
  128. package/script/src/services/connection-manager.js +635 -0
  129. package/script/src/services/constants.d.ts +7 -0
  130. package/script/src/services/constants.d.ts.map +1 -0
  131. package/script/src/services/constants.js +9 -0
  132. package/script/src/services/context-limit.d.ts +3 -0
  133. package/script/src/services/context-limit.d.ts.map +1 -0
  134. package/script/src/services/context-limit.js +47 -0
  135. package/script/src/services/event-extractor.d.ts +29 -0
  136. package/script/src/services/event-extractor.d.ts.map +1 -0
  137. package/script/src/services/event-extractor.js +669 -0
  138. package/script/src/services/graphiti-async.d.ts +22 -0
  139. package/script/src/services/graphiti-async.d.ts.map +1 -0
  140. package/script/src/services/graphiti-async.js +223 -0
  141. package/script/src/services/graphiti-mcp.d.ts +57 -0
  142. package/script/src/services/graphiti-mcp.d.ts.map +1 -0
  143. package/script/src/services/graphiti-mcp.js +198 -0
  144. package/script/src/services/logger.d.ts +9 -0
  145. package/script/src/services/logger.d.ts.map +1 -0
  146. package/script/src/services/logger.js +142 -0
  147. package/script/src/services/opencode-warning.d.ts +8 -0
  148. package/script/src/services/opencode-warning.d.ts.map +1 -0
  149. package/script/src/services/opencode-warning.js +114 -0
  150. package/script/src/services/redis-cache.d.ts +27 -0
  151. package/script/src/services/redis-cache.d.ts.map +1 -0
  152. package/script/src/services/redis-cache.js +219 -0
  153. package/script/src/services/redis-client.d.ts +89 -0
  154. package/script/src/services/redis-client.d.ts.map +1 -0
  155. package/script/src/services/redis-client.js +943 -0
  156. package/script/src/services/redis-events.d.ts +46 -0
  157. package/script/src/services/redis-events.d.ts.map +1 -0
  158. package/script/src/services/redis-events.js +535 -0
  159. package/script/src/services/redis-snapshot.d.ts +16 -0
  160. package/script/src/services/redis-snapshot.d.ts.map +1 -0
  161. package/script/src/services/redis-snapshot.js +189 -0
  162. package/script/src/services/render-utils.d.ts +23 -0
  163. package/script/src/services/render-utils.d.ts.map +1 -0
  164. package/script/src/services/render-utils.js +165 -0
  165. package/script/src/services/runtime-teardown.d.ts +23 -0
  166. package/script/src/services/runtime-teardown.d.ts.map +1 -0
  167. package/script/src/services/runtime-teardown.js +155 -0
  168. package/script/src/services/sdk-normalize.d.ts +55 -0
  169. package/script/src/services/sdk-normalize.d.ts.map +1 -0
  170. package/script/src/services/sdk-normalize.js +67 -0
  171. package/script/src/session.d.ts +74 -0
  172. package/script/src/session.d.ts.map +1 -0
  173. package/script/src/session.js +698 -0
  174. package/script/src/types/index.d.ts +120 -0
  175. package/script/src/types/index.d.ts.map +1 -0
  176. package/script/src/types/index.js +33 -0
  177. package/script/src/utils.d.ts +27 -0
  178. package/script/src/utils.d.ts.map +1 -0
  179. package/script/src/utils.js +87 -0
@@ -0,0 +1,22 @@
1
+ import type { BatchDrainService } from "./batch-drain.js";
2
+ import type { GraphitiMcpClient } from "./graphiti-mcp.js";
3
+ import type { RedisCacheService } from "./redis-cache.js";
4
+ export declare class GraphitiAsyncService {
5
+ private readonly graphiti;
6
+ private readonly cache;
7
+ private readonly drain;
8
+ private readonly drainRetryDelayMs;
9
+ private readonly drainInFlight;
10
+ private readonly drainRetryTimers;
11
+ private readonly drainRecoveryTimers;
12
+ private readonly refreshInFlight;
13
+ private readonly primerInFlight;
14
+ constructor(graphiti: GraphitiMcpClient, cache: RedisCacheService, drain: BatchDrainService, drainRetryDelayMs?: number);
15
+ private armDrainRetry;
16
+ private armDrainRecovery;
17
+ private clearDrainRecovery;
18
+ schedulePrimer(groupId: string): void;
19
+ scheduleCacheRefresh(groupId: string, query: string): void;
20
+ scheduleDrain(groupId: string): void;
21
+ }
22
+ //# sourceMappingURL=graphiti-async.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphiti-async.d.ts","sourceRoot":"","sources":["../../../src/src/services/graphiti-async.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,qBAAa,oBAAoB;IAiB7B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAnBpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoC;IAClE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAG7B;IACJ,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAMhC;IACJ,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;IACpE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoC;gBAGhD,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,iBAAiB,EACxB,iBAAiB,SAAQ;IAG5C,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,kBAAkB;IAO1B,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAuBrC,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAuE1D,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CA2CrC"}
@@ -0,0 +1,219 @@
1
+ import { logger } from "./logger.js";
2
+ export class GraphitiAsyncService {
3
+ constructor(graphiti, cache, drain, drainRetryDelayMs = 1_000) {
4
+ Object.defineProperty(this, "graphiti", {
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true,
8
+ value: graphiti
9
+ });
10
+ Object.defineProperty(this, "cache", {
11
+ enumerable: true,
12
+ configurable: true,
13
+ writable: true,
14
+ value: cache
15
+ });
16
+ Object.defineProperty(this, "drain", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: drain
21
+ });
22
+ Object.defineProperty(this, "drainRetryDelayMs", {
23
+ enumerable: true,
24
+ configurable: true,
25
+ writable: true,
26
+ value: drainRetryDelayMs
27
+ });
28
+ Object.defineProperty(this, "drainInFlight", {
29
+ enumerable: true,
30
+ configurable: true,
31
+ writable: true,
32
+ value: new Map()
33
+ });
34
+ Object.defineProperty(this, "drainRetryTimers", {
35
+ enumerable: true,
36
+ configurable: true,
37
+ writable: true,
38
+ value: new Map()
39
+ });
40
+ Object.defineProperty(this, "drainRecoveryTimers", {
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true,
44
+ value: new Map()
45
+ });
46
+ Object.defineProperty(this, "refreshInFlight", {
47
+ enumerable: true,
48
+ configurable: true,
49
+ writable: true,
50
+ value: new Map()
51
+ });
52
+ Object.defineProperty(this, "primerInFlight", {
53
+ enumerable: true,
54
+ configurable: true,
55
+ writable: true,
56
+ value: new Map()
57
+ });
58
+ }
59
+ armDrainRetry(groupId) {
60
+ if (this.drainRetryTimers.has(groupId))
61
+ return;
62
+ const timer = setTimeout(() => {
63
+ this.drainRetryTimers.delete(groupId);
64
+ this.scheduleDrain(groupId);
65
+ }, this.drainRetryDelayMs);
66
+ this.drainRetryTimers.set(groupId, timer);
67
+ }
68
+ armDrainRecovery(groupId, run) {
69
+ const existing = this.drainRecoveryTimers.get(groupId);
70
+ if (existing?.run === run)
71
+ return;
72
+ if (existing)
73
+ clearTimeout(existing.timer);
74
+ const timer = setTimeout(() => {
75
+ const recovery = this.drainRecoveryTimers.get(groupId);
76
+ if (!recovery || recovery.run !== run)
77
+ return;
78
+ this.drainRecoveryTimers.delete(groupId);
79
+ if (this.drainInFlight.get(groupId) !== run)
80
+ return;
81
+ this.drainInFlight.delete(groupId);
82
+ this.scheduleDrain(groupId);
83
+ }, this.drainRetryDelayMs);
84
+ this.drainRecoveryTimers.set(groupId, { run, timer });
85
+ }
86
+ clearDrainRecovery(groupId, run) {
87
+ const recovery = this.drainRecoveryTimers.get(groupId);
88
+ if (!recovery || recovery.run !== run)
89
+ return;
90
+ clearTimeout(recovery.timer);
91
+ this.drainRecoveryTimers.delete(groupId);
92
+ }
93
+ schedulePrimer(groupId) {
94
+ if (this.primerInFlight.has(groupId))
95
+ return;
96
+ const run = (async () => {
97
+ const existing = await this.cache.get(groupId);
98
+ if (existing)
99
+ return;
100
+ const episodes = await this.graphiti.getEpisodes({ groupId, lastN: 5 });
101
+ if (episodes.length === 0)
102
+ return;
103
+ const entry = {
104
+ query: "primer",
105
+ refreshedAt: Date.now(),
106
+ nodes: [],
107
+ nodeRefs: [],
108
+ episodeSummaries: episodes.map((episode) => `${episode.name}: ${episode.content}`.slice(0, 240)),
109
+ };
110
+ await this.cache.set(groupId, entry);
111
+ })().catch((err) => logger.warn("Graphiti primer failed", err)).finally(() => this.primerInFlight.delete(groupId));
112
+ this.primerInFlight.set(groupId, run);
113
+ }
114
+ scheduleCacheRefresh(groupId, query) {
115
+ const normalized = query.trim();
116
+ if (!normalized)
117
+ return;
118
+ const key = groupId;
119
+ if (this.refreshInFlight.has(key)) {
120
+ void this.cache.rememberRefreshQuery(groupId, normalized).catch((err) => logger.warn("Graphiti refresh query update failed", err));
121
+ return;
122
+ }
123
+ const run = (async () => {
124
+ await this.cache.rememberRefreshQuery(groupId, normalized);
125
+ const [facts, result] = await Promise.all([
126
+ this.graphiti.searchMemoryFacts({
127
+ query: normalized,
128
+ groupIds: [groupId],
129
+ maxFacts: 8,
130
+ }),
131
+ this.graphiti.searchNodesWithStatus({
132
+ query: normalized,
133
+ groupIds: [groupId],
134
+ maxNodes: 12,
135
+ }),
136
+ ]);
137
+ if (result.degraded)
138
+ return;
139
+ const [meta, current] = await Promise.all([
140
+ this.cache.getMeta(groupId),
141
+ this.cache.get(groupId),
142
+ ]);
143
+ const latestQuery = meta?.lastQuery ?? current?.query;
144
+ if (latestQuery &&
145
+ latestQuery.trim().toLowerCase() !== normalized.toLowerCase()) {
146
+ return;
147
+ }
148
+ const { nodes } = result;
149
+ await this.cache.set(groupId, {
150
+ query: normalized,
151
+ refreshedAt: Date.now(),
152
+ nodes,
153
+ episodeSummaries: facts.map((fact) => {
154
+ const source = fact.source_node?.name?.trim();
155
+ const target = fact.target_node?.name?.trim();
156
+ const relation = [source, target].filter(Boolean).join(" → ");
157
+ return relation ? `${relation}: ${fact.fact}` : fact.fact;
158
+ }),
159
+ nodeRefs: nodes.map((node) => node.uuid),
160
+ });
161
+ })().catch((err) => logger.warn("Graphiti cache refresh failed", err))
162
+ .finally(async () => {
163
+ this.refreshInFlight.delete(key);
164
+ try {
165
+ const latestQuery = (await this.cache.getMeta(groupId))?.lastQuery;
166
+ if (latestQuery &&
167
+ latestQuery.trim().toLowerCase() !== normalized.toLowerCase()) {
168
+ this.scheduleCacheRefresh(groupId, latestQuery);
169
+ }
170
+ }
171
+ catch (err) {
172
+ logger.warn("Graphiti follow-up cache refresh failed", err);
173
+ }
174
+ });
175
+ this.refreshInFlight.set(key, run);
176
+ }
177
+ scheduleDrain(groupId) {
178
+ const inFlight = this.drainInFlight.get(groupId);
179
+ if (inFlight) {
180
+ this.armDrainRecovery(groupId, inFlight);
181
+ return;
182
+ }
183
+ const retryTimer = this.drainRetryTimers.get(groupId);
184
+ if (retryTimer) {
185
+ clearTimeout(retryTimer);
186
+ this.drainRetryTimers.delete(groupId);
187
+ }
188
+ const run = (async () => {
189
+ let shouldRefresh = false;
190
+ while (true) {
191
+ const result = await this.drain.drainGroup(groupId, this.graphiti);
192
+ if (result.status === "success" || result.status === "dead-letter") {
193
+ shouldRefresh = true;
194
+ continue;
195
+ }
196
+ if (result.status === "backoff" || result.status === "retry") {
197
+ this.armDrainRetry(groupId);
198
+ }
199
+ break;
200
+ }
201
+ if (shouldRefresh) {
202
+ const [current, meta] = await Promise.all([
203
+ this.cache.get(groupId),
204
+ this.cache.getMeta(groupId),
205
+ ]);
206
+ const refreshQuery = meta?.lastQuery || current?.query;
207
+ if (refreshQuery)
208
+ this.scheduleCacheRefresh(groupId, refreshQuery);
209
+ }
210
+ })().catch((err) => logger.warn("Graphiti drain failed", err)).finally(() => {
211
+ this.clearDrainRecovery(groupId, run);
212
+ if (this.drainInFlight.get(groupId) === run) {
213
+ this.drainInFlight.delete(groupId);
214
+ }
215
+ });
216
+ this.drainInFlight.set(groupId, run);
217
+ this.armDrainRecovery(groupId, run);
218
+ }
219
+ }
@@ -0,0 +1,57 @@
1
+ import { type GraphitiToolCaller } from "./connection-manager.js";
2
+ import type { GraphitiEpisode, GraphitiFact, GraphitiNode } from "../types/index.js";
3
+ export type GraphitiNodeSearchResult = {
4
+ nodes: GraphitiNode[];
5
+ degraded: boolean;
6
+ };
7
+ export declare class GraphitiMcpClient {
8
+ private readonly toolCaller;
9
+ constructor(endpointOrManager: string | GraphitiToolCaller);
10
+ start(): void;
11
+ stop(): Promise<void>;
12
+ connect(): Promise<boolean>;
13
+ ready(timeoutMs?: number): Promise<boolean>;
14
+ parseToolResult(result: unknown): unknown;
15
+ parseWrappedArray<T>(result: unknown, wrappedKey: string): T[] | null;
16
+ addMemory(params: {
17
+ name: string;
18
+ episodeBody: string;
19
+ groupId?: string;
20
+ source?: "text" | "json" | "message";
21
+ sourceDescription?: string;
22
+ }): Promise<void>;
23
+ addEpisode(params: {
24
+ name: string;
25
+ episodeBody: string;
26
+ groupId?: string;
27
+ source?: "text" | "json" | "message";
28
+ sourceDescription?: string;
29
+ }): Promise<void>;
30
+ searchMemoryFacts(params: {
31
+ query: string;
32
+ groupIds?: string[];
33
+ maxFacts?: number;
34
+ }): Promise<GraphitiFact[]>;
35
+ searchFacts(params: {
36
+ query: string;
37
+ groupIds?: string[];
38
+ maxFacts?: number;
39
+ }): Promise<GraphitiFact[]>;
40
+ searchNodes(params: {
41
+ query: string;
42
+ groupIds?: string[];
43
+ maxNodes?: number;
44
+ }): Promise<GraphitiNode[]>;
45
+ searchNodesWithStatus(params: {
46
+ query: string;
47
+ groupIds?: string[];
48
+ maxNodes?: number;
49
+ }): Promise<GraphitiNodeSearchResult>;
50
+ getEpisodes(params: {
51
+ groupId?: string;
52
+ lastN?: number;
53
+ }): Promise<GraphitiEpisode[]>;
54
+ getStatus(): Promise<boolean>;
55
+ private callTool;
56
+ }
57
+ //# sourceMappingURL=graphiti-mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphiti-mcp.d.ts","sourceRoot":"","sources":["../../../src/src/services/graphiti-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,kBAAkB,EAIxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,YAAY,EACb,MAAM,mBAAmB,CAAC;AAK3B,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;gBAEpC,iBAAiB,EAAE,MAAM,GAAG,kBAAkB;IAM1D,KAAK,IAAI,IAAI;IAIP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAgB3B,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIjD,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;IAyBzC,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI;IAY/D,SAAS,CAAC,MAAM,EAAE;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BX,UAAU,CAAC,MAAM,EAAE;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,GAAG,OAAO,CAAC,IAAI,CAAC;IAIX,iBAAiB,CAAC,MAAM,EAAE;QAC9B,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA6BrB,WAAW,CAAC,MAAM,EAAE;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAIrB,WAAW,CAAC,MAAM,EAAE;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAKrB,qBAAqB,CAAC,MAAM,EAAE;QAClC,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAgC/B,WAAW,CAAC,MAAM,EAAE;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA8BxB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;YASrB,QAAQ;CAOvB"}
@@ -0,0 +1,194 @@
1
+ import { GraphitiConnectionManager, GraphitiOfflineError, GraphitiSessionExpiredError, GraphitiTransportError, isGraphitiOfflineError, isGraphitiTimeoutError, } from "./connection-manager.js";
2
+ import { logger } from "./logger.js";
3
+ import { notifyGraphitiAvailabilityIssue } from "./opencode-warning.js";
4
+ import { normalizeEpisode } from "./sdk-normalize.js";
5
+ export class GraphitiMcpClient {
6
+ constructor(endpointOrManager) {
7
+ Object.defineProperty(this, "toolCaller", {
8
+ enumerable: true,
9
+ configurable: true,
10
+ writable: true,
11
+ value: void 0
12
+ });
13
+ this.toolCaller = typeof endpointOrManager === "string"
14
+ ? new GraphitiConnectionManager({ endpoint: endpointOrManager })
15
+ : endpointOrManager;
16
+ }
17
+ start() {
18
+ this.toolCaller.start();
19
+ }
20
+ async stop() {
21
+ await this.toolCaller.stop();
22
+ }
23
+ async connect() {
24
+ try {
25
+ this.toolCaller.start();
26
+ }
27
+ catch (err) {
28
+ if (isGraphitiOfflineError(err)) {
29
+ throw new GraphitiOfflineError(err.state, err.message ||
30
+ "Graphiti client has been stopped and cannot be restarted");
31
+ }
32
+ throw err;
33
+ }
34
+ return await this.toolCaller.ready();
35
+ }
36
+ async ready(timeoutMs) {
37
+ return await this.toolCaller.ready(timeoutMs);
38
+ }
39
+ parseToolResult(result) {
40
+ const typedResult = result;
41
+ const content = typedResult.content;
42
+ if (!Array.isArray(content) || content.length === 0)
43
+ return result;
44
+ const text = content.find((item) => item?.type === "text")?.text;
45
+ if (text === undefined)
46
+ return result;
47
+ if (typeof text !== "string") {
48
+ try {
49
+ return JSON.parse(String(text));
50
+ }
51
+ catch {
52
+ return text;
53
+ }
54
+ }
55
+ try {
56
+ return JSON.parse(text);
57
+ }
58
+ catch {
59
+ return text;
60
+ }
61
+ }
62
+ parseWrappedArray(result, wrappedKey) {
63
+ if (Array.isArray(result))
64
+ return result;
65
+ if (result &&
66
+ typeof result === "object" &&
67
+ Array.isArray(result[wrappedKey])) {
68
+ return result[wrappedKey];
69
+ }
70
+ return null;
71
+ }
72
+ async addMemory(params) {
73
+ try {
74
+ await this.callTool("add_memory", {
75
+ name: params.name,
76
+ episode_body: params.episodeBody,
77
+ group_id: params.groupId,
78
+ source: params.source ?? "text",
79
+ source_description: params.sourceDescription ?? "",
80
+ });
81
+ }
82
+ catch (err) {
83
+ if (isGraphitiOfflineError(err) ||
84
+ isGraphitiTimeoutError(err) ||
85
+ err instanceof GraphitiTransportError ||
86
+ err instanceof GraphitiSessionExpiredError) {
87
+ notifyGraphitiAvailabilityIssue("Graphiti unavailable; memory was not saved.", {
88
+ operation: "addMemory",
89
+ err,
90
+ });
91
+ }
92
+ throw err;
93
+ }
94
+ }
95
+ async addEpisode(params) {
96
+ await this.addMemory(params);
97
+ }
98
+ async searchMemoryFacts(params) {
99
+ try {
100
+ const result = await this.callTool("search_memory_facts", {
101
+ query: params.query,
102
+ group_ids: params.groupIds,
103
+ max_facts: params.maxFacts ?? 10,
104
+ });
105
+ return this.parseWrappedArray(result, "facts") ?? [];
106
+ }
107
+ catch (err) {
108
+ if (isGraphitiTimeoutError(err) ||
109
+ isGraphitiOfflineError(err) ||
110
+ err instanceof GraphitiTransportError ||
111
+ err instanceof GraphitiSessionExpiredError) {
112
+ notifyGraphitiAvailabilityIssue("Graphiti unavailable; continuing without memory facts.", {
113
+ operation: "searchMemoryFacts",
114
+ err,
115
+ });
116
+ return [];
117
+ }
118
+ logger.error("searchMemoryFacts error", err);
119
+ return [];
120
+ }
121
+ }
122
+ async searchFacts(params) {
123
+ return await this.searchMemoryFacts(params);
124
+ }
125
+ async searchNodes(params) {
126
+ const result = await this.searchNodesWithStatus(params);
127
+ return result.nodes;
128
+ }
129
+ async searchNodesWithStatus(params) {
130
+ try {
131
+ const result = await this.callTool("search_nodes", {
132
+ query: params.query,
133
+ group_ids: params.groupIds,
134
+ max_nodes: params.maxNodes ?? 10,
135
+ });
136
+ return {
137
+ nodes: this.parseWrappedArray(result, "nodes") ?? [],
138
+ degraded: false,
139
+ };
140
+ }
141
+ catch (err) {
142
+ if (isGraphitiTimeoutError(err) ||
143
+ isGraphitiOfflineError(err) ||
144
+ err instanceof GraphitiTransportError ||
145
+ err instanceof GraphitiSessionExpiredError) {
146
+ notifyGraphitiAvailabilityIssue("Graphiti unavailable; continuing without memory nodes.", {
147
+ operation: "searchNodes",
148
+ err,
149
+ });
150
+ return { nodes: [], degraded: true };
151
+ }
152
+ logger.error("searchNodes error", err);
153
+ return { nodes: [], degraded: true };
154
+ }
155
+ }
156
+ async getEpisodes(params) {
157
+ try {
158
+ const result = await this.callTool("get_episodes", {
159
+ group_id: params.groupId,
160
+ last_n: params.lastN,
161
+ });
162
+ const raw = this.parseWrappedArray(result, "episodes") ??
163
+ [];
164
+ return raw.map(normalizeEpisode);
165
+ }
166
+ catch (err) {
167
+ if (isGraphitiTimeoutError(err) ||
168
+ isGraphitiOfflineError(err) ||
169
+ err instanceof GraphitiTransportError ||
170
+ err instanceof GraphitiSessionExpiredError) {
171
+ notifyGraphitiAvailabilityIssue("Graphiti unavailable; continuing without episode history.", {
172
+ operation: "getEpisodes",
173
+ err,
174
+ });
175
+ return [];
176
+ }
177
+ logger.error("getEpisodes error", err);
178
+ return [];
179
+ }
180
+ }
181
+ async getStatus() {
182
+ try {
183
+ await this.callTool("get_status", {});
184
+ return true;
185
+ }
186
+ catch {
187
+ return false;
188
+ }
189
+ }
190
+ async callTool(name, args) {
191
+ const result = await this.toolCaller.callTool(name, args);
192
+ return this.parseToolResult(result);
193
+ }
194
+ }
@@ -0,0 +1,9 @@
1
+ export declare const setLoggerDebugOverride: (value: boolean | undefined) => void;
2
+ export declare const setLoggerSilentOverride: (value: boolean) => void;
3
+ export declare const logger: {
4
+ info: (...args: unknown[]) => void;
5
+ warn: (...args: unknown[]) => void;
6
+ error: (...args: unknown[]) => void;
7
+ debug: (...args: unknown[]) => void;
8
+ };
9
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/src/services/logger.ts"],"names":[],"mappings":"AA2EA,eAAO,MAAM,sBAAsB,GAAI,OAAO,OAAO,GAAG,SAAS,KAAG,IAEnE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,IAExD,CAAC;AAEF,eAAO,MAAM,MAAM;oBACD,OAAO,EAAE;oBAIT,OAAO,EAAE;qBAWR,OAAO,EAAE;qBAIT,OAAO,EAAE;CAI3B,CAAC"}
@@ -0,0 +1,104 @@
1
+ import * as dntShim from "../../_dnt.shims.js";
2
+ import { logStructuredWarning, shouldSuppressConsoleWarningsDuringTests, } from "./opencode-warning.js";
3
+ const console = globalThis.console;
4
+ const PREFIX = "[graphiti]";
5
+ let debugOverride;
6
+ let silentOverride = false;
7
+ const serializeLogArg = (value) => {
8
+ if (value instanceof Error) {
9
+ return {
10
+ name: value.name,
11
+ message: value.message,
12
+ stack: value.stack,
13
+ };
14
+ }
15
+ return value;
16
+ };
17
+ const stringifyLogArg = (value) => {
18
+ if (typeof value === "string")
19
+ return value;
20
+ if (value instanceof Error)
21
+ return value.message;
22
+ if (typeof value === "number" || typeof value === "boolean" ||
23
+ typeof value === "bigint") {
24
+ return String(value);
25
+ }
26
+ if (value === null)
27
+ return "null";
28
+ if (value === undefined)
29
+ return "undefined";
30
+ try {
31
+ return JSON.stringify(value);
32
+ }
33
+ catch {
34
+ return String(value);
35
+ }
36
+ };
37
+ const toWarningPayload = (args) => {
38
+ if (args.length === 0)
39
+ return { message: "Graphiti warning" };
40
+ const [first, ...rest] = args;
41
+ if (typeof first === "string") {
42
+ return rest.length === 0
43
+ ? { message: first }
44
+ : { message: first, extra: { data: rest.map(serializeLogArg) } };
45
+ }
46
+ return {
47
+ message: stringifyLogArg(first),
48
+ ...(rest.length === 0 ? {} : {
49
+ extra: {
50
+ data: [serializeLogArg(first), ...rest.map(serializeLogArg)],
51
+ },
52
+ }),
53
+ };
54
+ };
55
+ const isDebugEnabled = () => {
56
+ if (debugOverride !== undefined)
57
+ return debugOverride;
58
+ try {
59
+ return !!dntShim.Deno.env.get("GRAPHITI_DEBUG");
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ };
65
+ export const setLoggerDebugOverride = (value) => {
66
+ debugOverride = value;
67
+ };
68
+ export const setLoggerSilentOverride = (value) => {
69
+ silentOverride = value;
70
+ };
71
+ export const logger = {
72
+ info: (...args) => {
73
+ if (silentOverride)
74
+ return;
75
+ if (isDebugEnabled())
76
+ console.log(PREFIX, ...args);
77
+ },
78
+ warn: (...args) => {
79
+ if (silentOverride)
80
+ return;
81
+ const payload = toWarningPayload(args);
82
+ try {
83
+ if (logStructuredWarning(payload.message, payload.extra))
84
+ return;
85
+ }
86
+ catch {
87
+ // Fall back to console below when structured warning scheduling fails.
88
+ }
89
+ if (shouldSuppressConsoleWarningsDuringTests())
90
+ return;
91
+ console.warn(PREFIX, ...args);
92
+ },
93
+ error: (...args) => {
94
+ if (silentOverride)
95
+ return;
96
+ console.error(PREFIX, ...args);
97
+ },
98
+ debug: (...args) => {
99
+ if (silentOverride)
100
+ return;
101
+ if (isDebugEnabled())
102
+ console.debug(PREFIX, ...args);
103
+ },
104
+ };
@@ -0,0 +1,8 @@
1
+ export declare const shouldSuppressConsoleWarningsDuringTests: () => boolean;
2
+ export declare const setOpenCodeClient: (client: unknown) => void;
3
+ export declare const setWarningTaskScheduler: (scheduler: ((callback: () => void) => void) | undefined) => void;
4
+ export declare const setSuppressConsoleWarningsDuringTestsOverride: (value: boolean | undefined) => void;
5
+ export declare const logStructuredWarning: (message: string, extra?: unknown) => boolean;
6
+ export declare const showWarningToast: (message: string, extra?: unknown) => boolean;
7
+ export declare const notifyGraphitiAvailabilityIssue: (message: string, extra?: unknown) => void;
8
+ //# sourceMappingURL=opencode-warning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-warning.d.ts","sourceRoot":"","sources":["../../../src/src/services/opencode-warning.ts"],"names":[],"mappings":"AAoCA,eAAO,MAAM,wCAAwC,QAAO,OAM3D,CAAC;AA6FF,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,OAAO,KACd,IAEF,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,WAAW,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,KACtD,IAIF,CAAC;AAEF,eAAO,MAAM,6CAA6C,GACxD,OAAO,OAAO,GAAG,SAAS,KACzB,IAEF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,MAAM,EACf,QAAQ,OAAO,KACd,OAEF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,EAAE,QAAQ,OAAO,KAAG,OAEnE,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAC1C,SAAS,MAAM,EACf,QAAQ,OAAO,KACd,IAMF,CAAC"}