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 @@
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,223 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphitiAsyncService = void 0;
4
+ const logger_js_1 = require("./logger.js");
5
+ class GraphitiAsyncService {
6
+ constructor(graphiti, cache, drain, drainRetryDelayMs = 1_000) {
7
+ Object.defineProperty(this, "graphiti", {
8
+ enumerable: true,
9
+ configurable: true,
10
+ writable: true,
11
+ value: graphiti
12
+ });
13
+ Object.defineProperty(this, "cache", {
14
+ enumerable: true,
15
+ configurable: true,
16
+ writable: true,
17
+ value: cache
18
+ });
19
+ Object.defineProperty(this, "drain", {
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true,
23
+ value: drain
24
+ });
25
+ Object.defineProperty(this, "drainRetryDelayMs", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: drainRetryDelayMs
30
+ });
31
+ Object.defineProperty(this, "drainInFlight", {
32
+ enumerable: true,
33
+ configurable: true,
34
+ writable: true,
35
+ value: new Map()
36
+ });
37
+ Object.defineProperty(this, "drainRetryTimers", {
38
+ enumerable: true,
39
+ configurable: true,
40
+ writable: true,
41
+ value: new Map()
42
+ });
43
+ Object.defineProperty(this, "drainRecoveryTimers", {
44
+ enumerable: true,
45
+ configurable: true,
46
+ writable: true,
47
+ value: new Map()
48
+ });
49
+ Object.defineProperty(this, "refreshInFlight", {
50
+ enumerable: true,
51
+ configurable: true,
52
+ writable: true,
53
+ value: new Map()
54
+ });
55
+ Object.defineProperty(this, "primerInFlight", {
56
+ enumerable: true,
57
+ configurable: true,
58
+ writable: true,
59
+ value: new Map()
60
+ });
61
+ }
62
+ armDrainRetry(groupId) {
63
+ if (this.drainRetryTimers.has(groupId))
64
+ return;
65
+ const timer = setTimeout(() => {
66
+ this.drainRetryTimers.delete(groupId);
67
+ this.scheduleDrain(groupId);
68
+ }, this.drainRetryDelayMs);
69
+ this.drainRetryTimers.set(groupId, timer);
70
+ }
71
+ armDrainRecovery(groupId, run) {
72
+ const existing = this.drainRecoveryTimers.get(groupId);
73
+ if (existing?.run === run)
74
+ return;
75
+ if (existing)
76
+ clearTimeout(existing.timer);
77
+ const timer = setTimeout(() => {
78
+ const recovery = this.drainRecoveryTimers.get(groupId);
79
+ if (!recovery || recovery.run !== run)
80
+ return;
81
+ this.drainRecoveryTimers.delete(groupId);
82
+ if (this.drainInFlight.get(groupId) !== run)
83
+ return;
84
+ this.drainInFlight.delete(groupId);
85
+ this.scheduleDrain(groupId);
86
+ }, this.drainRetryDelayMs);
87
+ this.drainRecoveryTimers.set(groupId, { run, timer });
88
+ }
89
+ clearDrainRecovery(groupId, run) {
90
+ const recovery = this.drainRecoveryTimers.get(groupId);
91
+ if (!recovery || recovery.run !== run)
92
+ return;
93
+ clearTimeout(recovery.timer);
94
+ this.drainRecoveryTimers.delete(groupId);
95
+ }
96
+ schedulePrimer(groupId) {
97
+ if (this.primerInFlight.has(groupId))
98
+ return;
99
+ const run = (async () => {
100
+ const existing = await this.cache.get(groupId);
101
+ if (existing)
102
+ return;
103
+ const episodes = await this.graphiti.getEpisodes({ groupId, lastN: 5 });
104
+ if (episodes.length === 0)
105
+ return;
106
+ const entry = {
107
+ query: "primer",
108
+ refreshedAt: Date.now(),
109
+ nodes: [],
110
+ nodeRefs: [],
111
+ episodeSummaries: episodes.map((episode) => `${episode.name}: ${episode.content}`.slice(0, 240)),
112
+ };
113
+ await this.cache.set(groupId, entry);
114
+ })().catch((err) => logger_js_1.logger.warn("Graphiti primer failed", err)).finally(() => this.primerInFlight.delete(groupId));
115
+ this.primerInFlight.set(groupId, run);
116
+ }
117
+ scheduleCacheRefresh(groupId, query) {
118
+ const normalized = query.trim();
119
+ if (!normalized)
120
+ return;
121
+ const key = groupId;
122
+ if (this.refreshInFlight.has(key)) {
123
+ void this.cache.rememberRefreshQuery(groupId, normalized).catch((err) => logger_js_1.logger.warn("Graphiti refresh query update failed", err));
124
+ return;
125
+ }
126
+ const run = (async () => {
127
+ await this.cache.rememberRefreshQuery(groupId, normalized);
128
+ const [facts, result] = await Promise.all([
129
+ this.graphiti.searchMemoryFacts({
130
+ query: normalized,
131
+ groupIds: [groupId],
132
+ maxFacts: 8,
133
+ }),
134
+ this.graphiti.searchNodesWithStatus({
135
+ query: normalized,
136
+ groupIds: [groupId],
137
+ maxNodes: 12,
138
+ }),
139
+ ]);
140
+ if (result.degraded)
141
+ return;
142
+ const [meta, current] = await Promise.all([
143
+ this.cache.getMeta(groupId),
144
+ this.cache.get(groupId),
145
+ ]);
146
+ const latestQuery = meta?.lastQuery ?? current?.query;
147
+ if (latestQuery &&
148
+ latestQuery.trim().toLowerCase() !== normalized.toLowerCase()) {
149
+ return;
150
+ }
151
+ const { nodes } = result;
152
+ await this.cache.set(groupId, {
153
+ query: normalized,
154
+ refreshedAt: Date.now(),
155
+ nodes,
156
+ episodeSummaries: facts.map((fact) => {
157
+ const source = fact.source_node?.name?.trim();
158
+ const target = fact.target_node?.name?.trim();
159
+ const relation = [source, target].filter(Boolean).join(" → ");
160
+ return relation ? `${relation}: ${fact.fact}` : fact.fact;
161
+ }),
162
+ nodeRefs: nodes.map((node) => node.uuid),
163
+ });
164
+ })().catch((err) => logger_js_1.logger.warn("Graphiti cache refresh failed", err))
165
+ .finally(async () => {
166
+ this.refreshInFlight.delete(key);
167
+ try {
168
+ const latestQuery = (await this.cache.getMeta(groupId))?.lastQuery;
169
+ if (latestQuery &&
170
+ latestQuery.trim().toLowerCase() !== normalized.toLowerCase()) {
171
+ this.scheduleCacheRefresh(groupId, latestQuery);
172
+ }
173
+ }
174
+ catch (err) {
175
+ logger_js_1.logger.warn("Graphiti follow-up cache refresh failed", err);
176
+ }
177
+ });
178
+ this.refreshInFlight.set(key, run);
179
+ }
180
+ scheduleDrain(groupId) {
181
+ const inFlight = this.drainInFlight.get(groupId);
182
+ if (inFlight) {
183
+ this.armDrainRecovery(groupId, inFlight);
184
+ return;
185
+ }
186
+ const retryTimer = this.drainRetryTimers.get(groupId);
187
+ if (retryTimer) {
188
+ clearTimeout(retryTimer);
189
+ this.drainRetryTimers.delete(groupId);
190
+ }
191
+ const run = (async () => {
192
+ let shouldRefresh = false;
193
+ while (true) {
194
+ const result = await this.drain.drainGroup(groupId, this.graphiti);
195
+ if (result.status === "success" || result.status === "dead-letter") {
196
+ shouldRefresh = true;
197
+ continue;
198
+ }
199
+ if (result.status === "backoff" || result.status === "retry") {
200
+ this.armDrainRetry(groupId);
201
+ }
202
+ break;
203
+ }
204
+ if (shouldRefresh) {
205
+ const [current, meta] = await Promise.all([
206
+ this.cache.get(groupId),
207
+ this.cache.getMeta(groupId),
208
+ ]);
209
+ const refreshQuery = meta?.lastQuery || current?.query;
210
+ if (refreshQuery)
211
+ this.scheduleCacheRefresh(groupId, refreshQuery);
212
+ }
213
+ })().catch((err) => logger_js_1.logger.warn("Graphiti drain failed", err)).finally(() => {
214
+ this.clearDrainRecovery(groupId, run);
215
+ if (this.drainInFlight.get(groupId) === run) {
216
+ this.drainInFlight.delete(groupId);
217
+ }
218
+ });
219
+ this.drainInFlight.set(groupId, run);
220
+ this.armDrainRecovery(groupId, run);
221
+ }
222
+ }
223
+ exports.GraphitiAsyncService = GraphitiAsyncService;
@@ -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,198 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphitiMcpClient = void 0;
4
+ const connection_manager_js_1 = require("./connection-manager.js");
5
+ const logger_js_1 = require("./logger.js");
6
+ const opencode_warning_js_1 = require("./opencode-warning.js");
7
+ const sdk_normalize_js_1 = require("./sdk-normalize.js");
8
+ class GraphitiMcpClient {
9
+ constructor(endpointOrManager) {
10
+ Object.defineProperty(this, "toolCaller", {
11
+ enumerable: true,
12
+ configurable: true,
13
+ writable: true,
14
+ value: void 0
15
+ });
16
+ this.toolCaller = typeof endpointOrManager === "string"
17
+ ? new connection_manager_js_1.GraphitiConnectionManager({ endpoint: endpointOrManager })
18
+ : endpointOrManager;
19
+ }
20
+ start() {
21
+ this.toolCaller.start();
22
+ }
23
+ async stop() {
24
+ await this.toolCaller.stop();
25
+ }
26
+ async connect() {
27
+ try {
28
+ this.toolCaller.start();
29
+ }
30
+ catch (err) {
31
+ if ((0, connection_manager_js_1.isGraphitiOfflineError)(err)) {
32
+ throw new connection_manager_js_1.GraphitiOfflineError(err.state, err.message ||
33
+ "Graphiti client has been stopped and cannot be restarted");
34
+ }
35
+ throw err;
36
+ }
37
+ return await this.toolCaller.ready();
38
+ }
39
+ async ready(timeoutMs) {
40
+ return await this.toolCaller.ready(timeoutMs);
41
+ }
42
+ parseToolResult(result) {
43
+ const typedResult = result;
44
+ const content = typedResult.content;
45
+ if (!Array.isArray(content) || content.length === 0)
46
+ return result;
47
+ const text = content.find((item) => item?.type === "text")?.text;
48
+ if (text === undefined)
49
+ return result;
50
+ if (typeof text !== "string") {
51
+ try {
52
+ return JSON.parse(String(text));
53
+ }
54
+ catch {
55
+ return text;
56
+ }
57
+ }
58
+ try {
59
+ return JSON.parse(text);
60
+ }
61
+ catch {
62
+ return text;
63
+ }
64
+ }
65
+ parseWrappedArray(result, wrappedKey) {
66
+ if (Array.isArray(result))
67
+ return result;
68
+ if (result &&
69
+ typeof result === "object" &&
70
+ Array.isArray(result[wrappedKey])) {
71
+ return result[wrappedKey];
72
+ }
73
+ return null;
74
+ }
75
+ async addMemory(params) {
76
+ try {
77
+ await this.callTool("add_memory", {
78
+ name: params.name,
79
+ episode_body: params.episodeBody,
80
+ group_id: params.groupId,
81
+ source: params.source ?? "text",
82
+ source_description: params.sourceDescription ?? "",
83
+ });
84
+ }
85
+ catch (err) {
86
+ if ((0, connection_manager_js_1.isGraphitiOfflineError)(err) ||
87
+ (0, connection_manager_js_1.isGraphitiTimeoutError)(err) ||
88
+ err instanceof connection_manager_js_1.GraphitiTransportError ||
89
+ err instanceof connection_manager_js_1.GraphitiSessionExpiredError) {
90
+ (0, opencode_warning_js_1.notifyGraphitiAvailabilityIssue)("Graphiti unavailable; memory was not saved.", {
91
+ operation: "addMemory",
92
+ err,
93
+ });
94
+ }
95
+ throw err;
96
+ }
97
+ }
98
+ async addEpisode(params) {
99
+ await this.addMemory(params);
100
+ }
101
+ async searchMemoryFacts(params) {
102
+ try {
103
+ const result = await this.callTool("search_memory_facts", {
104
+ query: params.query,
105
+ group_ids: params.groupIds,
106
+ max_facts: params.maxFacts ?? 10,
107
+ });
108
+ return this.parseWrappedArray(result, "facts") ?? [];
109
+ }
110
+ catch (err) {
111
+ if ((0, connection_manager_js_1.isGraphitiTimeoutError)(err) ||
112
+ (0, connection_manager_js_1.isGraphitiOfflineError)(err) ||
113
+ err instanceof connection_manager_js_1.GraphitiTransportError ||
114
+ err instanceof connection_manager_js_1.GraphitiSessionExpiredError) {
115
+ (0, opencode_warning_js_1.notifyGraphitiAvailabilityIssue)("Graphiti unavailable; continuing without memory facts.", {
116
+ operation: "searchMemoryFacts",
117
+ err,
118
+ });
119
+ return [];
120
+ }
121
+ logger_js_1.logger.error("searchMemoryFacts error", err);
122
+ return [];
123
+ }
124
+ }
125
+ async searchFacts(params) {
126
+ return await this.searchMemoryFacts(params);
127
+ }
128
+ async searchNodes(params) {
129
+ const result = await this.searchNodesWithStatus(params);
130
+ return result.nodes;
131
+ }
132
+ async searchNodesWithStatus(params) {
133
+ try {
134
+ const result = await this.callTool("search_nodes", {
135
+ query: params.query,
136
+ group_ids: params.groupIds,
137
+ max_nodes: params.maxNodes ?? 10,
138
+ });
139
+ return {
140
+ nodes: this.parseWrappedArray(result, "nodes") ?? [],
141
+ degraded: false,
142
+ };
143
+ }
144
+ catch (err) {
145
+ if ((0, connection_manager_js_1.isGraphitiTimeoutError)(err) ||
146
+ (0, connection_manager_js_1.isGraphitiOfflineError)(err) ||
147
+ err instanceof connection_manager_js_1.GraphitiTransportError ||
148
+ err instanceof connection_manager_js_1.GraphitiSessionExpiredError) {
149
+ (0, opencode_warning_js_1.notifyGraphitiAvailabilityIssue)("Graphiti unavailable; continuing without memory nodes.", {
150
+ operation: "searchNodes",
151
+ err,
152
+ });
153
+ return { nodes: [], degraded: true };
154
+ }
155
+ logger_js_1.logger.error("searchNodes error", err);
156
+ return { nodes: [], degraded: true };
157
+ }
158
+ }
159
+ async getEpisodes(params) {
160
+ try {
161
+ const result = await this.callTool("get_episodes", {
162
+ group_id: params.groupId,
163
+ last_n: params.lastN,
164
+ });
165
+ const raw = this.parseWrappedArray(result, "episodes") ??
166
+ [];
167
+ return raw.map(sdk_normalize_js_1.normalizeEpisode);
168
+ }
169
+ catch (err) {
170
+ if ((0, connection_manager_js_1.isGraphitiTimeoutError)(err) ||
171
+ (0, connection_manager_js_1.isGraphitiOfflineError)(err) ||
172
+ err instanceof connection_manager_js_1.GraphitiTransportError ||
173
+ err instanceof connection_manager_js_1.GraphitiSessionExpiredError) {
174
+ (0, opencode_warning_js_1.notifyGraphitiAvailabilityIssue)("Graphiti unavailable; continuing without episode history.", {
175
+ operation: "getEpisodes",
176
+ err,
177
+ });
178
+ return [];
179
+ }
180
+ logger_js_1.logger.error("getEpisodes error", err);
181
+ return [];
182
+ }
183
+ }
184
+ async getStatus() {
185
+ try {
186
+ await this.callTool("get_status", {});
187
+ return true;
188
+ }
189
+ catch {
190
+ return false;
191
+ }
192
+ }
193
+ async callTool(name, args) {
194
+ const result = await this.toolCaller.callTool(name, args);
195
+ return this.parseToolResult(result);
196
+ }
197
+ }
198
+ exports.GraphitiMcpClient = GraphitiMcpClient;
@@ -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,142 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.logger = exports.setLoggerSilentOverride = exports.setLoggerDebugOverride = void 0;
37
+ const dntShim = __importStar(require("../../_dnt.shims.js"));
38
+ const opencode_warning_js_1 = require("./opencode-warning.js");
39
+ const console = globalThis.console;
40
+ const PREFIX = "[graphiti]";
41
+ let debugOverride;
42
+ let silentOverride = false;
43
+ const serializeLogArg = (value) => {
44
+ if (value instanceof Error) {
45
+ return {
46
+ name: value.name,
47
+ message: value.message,
48
+ stack: value.stack,
49
+ };
50
+ }
51
+ return value;
52
+ };
53
+ const stringifyLogArg = (value) => {
54
+ if (typeof value === "string")
55
+ return value;
56
+ if (value instanceof Error)
57
+ return value.message;
58
+ if (typeof value === "number" || typeof value === "boolean" ||
59
+ typeof value === "bigint") {
60
+ return String(value);
61
+ }
62
+ if (value === null)
63
+ return "null";
64
+ if (value === undefined)
65
+ return "undefined";
66
+ try {
67
+ return JSON.stringify(value);
68
+ }
69
+ catch {
70
+ return String(value);
71
+ }
72
+ };
73
+ const toWarningPayload = (args) => {
74
+ if (args.length === 0)
75
+ return { message: "Graphiti warning" };
76
+ const [first, ...rest] = args;
77
+ if (typeof first === "string") {
78
+ return rest.length === 0
79
+ ? { message: first }
80
+ : { message: first, extra: { data: rest.map(serializeLogArg) } };
81
+ }
82
+ return {
83
+ message: stringifyLogArg(first),
84
+ ...(rest.length === 0 ? {} : {
85
+ extra: {
86
+ data: [serializeLogArg(first), ...rest.map(serializeLogArg)],
87
+ },
88
+ }),
89
+ };
90
+ };
91
+ const isDebugEnabled = () => {
92
+ if (debugOverride !== undefined)
93
+ return debugOverride;
94
+ try {
95
+ return !!dntShim.Deno.env.get("GRAPHITI_DEBUG");
96
+ }
97
+ catch {
98
+ return false;
99
+ }
100
+ };
101
+ const setLoggerDebugOverride = (value) => {
102
+ debugOverride = value;
103
+ };
104
+ exports.setLoggerDebugOverride = setLoggerDebugOverride;
105
+ const setLoggerSilentOverride = (value) => {
106
+ silentOverride = value;
107
+ };
108
+ exports.setLoggerSilentOverride = setLoggerSilentOverride;
109
+ exports.logger = {
110
+ info: (...args) => {
111
+ if (silentOverride)
112
+ return;
113
+ if (isDebugEnabled())
114
+ console.log(PREFIX, ...args);
115
+ },
116
+ warn: (...args) => {
117
+ if (silentOverride)
118
+ return;
119
+ const payload = toWarningPayload(args);
120
+ try {
121
+ if ((0, opencode_warning_js_1.logStructuredWarning)(payload.message, payload.extra))
122
+ return;
123
+ }
124
+ catch {
125
+ // Fall back to console below when structured warning scheduling fails.
126
+ }
127
+ if ((0, opencode_warning_js_1.shouldSuppressConsoleWarningsDuringTests)())
128
+ return;
129
+ console.warn(PREFIX, ...args);
130
+ },
131
+ error: (...args) => {
132
+ if (silentOverride)
133
+ return;
134
+ console.error(PREFIX, ...args);
135
+ },
136
+ debug: (...args) => {
137
+ if (silentOverride)
138
+ return;
139
+ if (isDebugEnabled())
140
+ console.debug(PREFIX, ...args);
141
+ },
142
+ };
@@ -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"}