opencode-graphiti 0.1.4 → 0.1.6

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 (84) hide show
  1. package/README.md +10 -17
  2. package/esm/deno.d.ts +47 -0
  3. package/esm/deno.d.ts.map +1 -0
  4. package/esm/deno.js +41 -0
  5. package/esm/src/config.d.ts.map +1 -1
  6. package/esm/src/config.js +4 -2
  7. package/esm/src/handlers/chat.d.ts +2 -1
  8. package/esm/src/handlers/chat.d.ts.map +1 -1
  9. package/esm/src/handlers/chat.js +89 -49
  10. package/esm/src/handlers/compacting.d.ts +1 -0
  11. package/esm/src/handlers/compacting.d.ts.map +1 -1
  12. package/esm/src/handlers/compacting.js +2 -1
  13. package/esm/src/handlers/event.d.ts +2 -2
  14. package/esm/src/handlers/event.d.ts.map +1 -1
  15. package/esm/src/handlers/event.js +52 -1
  16. package/esm/src/handlers/system.d.ts +11 -0
  17. package/esm/src/handlers/system.d.ts.map +1 -0
  18. package/esm/src/handlers/system.js +18 -0
  19. package/esm/src/index.d.ts.map +1 -1
  20. package/esm/src/index.js +8 -2
  21. package/esm/src/services/client.d.ts +8 -1
  22. package/esm/src/services/client.d.ts.map +1 -1
  23. package/esm/src/services/client.js +32 -2
  24. package/esm/src/services/compaction.d.ts +10 -0
  25. package/esm/src/services/compaction.d.ts.map +1 -1
  26. package/esm/src/services/compaction.js +106 -18
  27. package/esm/src/services/context-limit.d.ts +2 -8
  28. package/esm/src/services/context-limit.d.ts.map +1 -1
  29. package/esm/src/services/context-limit.js +3 -1
  30. package/esm/src/services/context.d.ts +27 -2
  31. package/esm/src/services/context.d.ts.map +1 -1
  32. package/esm/src/services/context.js +107 -13
  33. package/esm/src/services/logger.d.ts.map +1 -1
  34. package/esm/src/services/logger.js +1 -2
  35. package/esm/src/session.d.ts +6 -25
  36. package/esm/src/session.d.ts.map +1 -1
  37. package/esm/src/session.js +4 -7
  38. package/esm/src/types/index.d.ts +8 -2
  39. package/esm/src/types/index.d.ts.map +1 -1
  40. package/package.json +25 -3
  41. package/script/deno.d.ts +47 -0
  42. package/script/deno.d.ts.map +1 -0
  43. package/script/deno.js +43 -0
  44. package/script/src/config.d.ts.map +1 -1
  45. package/script/src/config.js +4 -2
  46. package/script/src/handlers/chat.d.ts +2 -1
  47. package/script/src/handlers/chat.d.ts.map +1 -1
  48. package/script/src/handlers/chat.js +88 -48
  49. package/script/src/handlers/compacting.d.ts +1 -0
  50. package/script/src/handlers/compacting.d.ts.map +1 -1
  51. package/script/src/handlers/compacting.js +2 -1
  52. package/script/src/handlers/event.d.ts +2 -2
  53. package/script/src/handlers/event.d.ts.map +1 -1
  54. package/script/src/handlers/event.js +52 -1
  55. package/script/src/handlers/system.d.ts +11 -0
  56. package/script/src/handlers/system.d.ts.map +1 -0
  57. package/script/src/handlers/system.js +21 -0
  58. package/script/src/index.d.ts.map +1 -1
  59. package/script/src/index.js +8 -2
  60. package/script/src/services/client.d.ts +8 -1
  61. package/script/src/services/client.d.ts.map +1 -1
  62. package/script/src/services/client.js +35 -2
  63. package/script/src/services/compaction.d.ts +10 -0
  64. package/script/src/services/compaction.d.ts.map +1 -1
  65. package/script/src/services/compaction.js +108 -17
  66. package/script/src/services/context-limit.d.ts +2 -8
  67. package/script/src/services/context-limit.d.ts.map +1 -1
  68. package/script/src/services/context-limit.js +3 -1
  69. package/script/src/services/context.d.ts +27 -2
  70. package/script/src/services/context.d.ts.map +1 -1
  71. package/script/src/services/context.js +118 -14
  72. package/script/src/services/logger.d.ts.map +1 -1
  73. package/script/src/services/logger.js +1 -35
  74. package/script/src/session.d.ts +6 -25
  75. package/script/src/session.d.ts.map +1 -1
  76. package/script/src/session.js +4 -7
  77. package/script/src/types/index.d.ts +8 -2
  78. package/script/src/types/index.d.ts.map +1 -1
  79. package/esm/_dnt.shims.d.ts +0 -6
  80. package/esm/_dnt.shims.d.ts.map +0 -1
  81. package/esm/_dnt.shims.js +0 -61
  82. package/script/_dnt.shims.d.ts +0 -6
  83. package/script/_dnt.shims.d.ts.map +0 -1
  84. package/script/_dnt.shims.js +0 -65
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.GraphitiClient = void 0;
4
7
  const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
5
8
  const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/client/streamableHttp.js");
9
+ const deno_js_1 = __importDefault(require("../../deno.js"));
6
10
  const logger_js_1 = require("./logger.js");
7
11
  /**
8
12
  * Graphiti MCP client wrapper for connecting, querying,
@@ -38,12 +42,18 @@ class GraphitiClient {
38
42
  value: void 0
39
43
  });
40
44
  this.endpoint = endpoint;
41
- this.client = new index_js_1.Client({ name: "opencode-graphiti", version: "0.1.4" });
45
+ this.client = new index_js_1.Client({
46
+ name: deno_js_1.default.name,
47
+ version: deno_js_1.default.version,
48
+ });
42
49
  this.transport = new streamableHttp_js_1.StreamableHTTPClientTransport(new URL(endpoint));
43
50
  }
44
51
  /** Create a fresh MCP Client and Transport pair. */
45
52
  createClientAndTransport() {
46
- this.client = new index_js_1.Client({ name: "opencode-graphiti", version: "0.1.4" });
53
+ this.client = new index_js_1.Client({
54
+ name: deno_js_1.default.name,
55
+ version: deno_js_1.default.version,
56
+ });
47
57
  this.transport = new streamableHttp_js_1.StreamableHTTPClientTransport(new URL(this.endpoint));
48
58
  }
49
59
  /**
@@ -211,6 +221,29 @@ class GraphitiClient {
211
221
  return [];
212
222
  }
213
223
  }
224
+ /**
225
+ * Retrieve recent episodes for a group.
226
+ */
227
+ async getEpisodes(params) {
228
+ try {
229
+ const result = await this.callTool("get_episodes", {
230
+ group_id: params.groupId,
231
+ last_n: params.lastN,
232
+ });
233
+ if (Array.isArray(result))
234
+ return result;
235
+ if (result &&
236
+ typeof result === "object" &&
237
+ Array.isArray(result.episodes)) {
238
+ return result.episodes;
239
+ }
240
+ return [];
241
+ }
242
+ catch (err) {
243
+ logger_js_1.logger.error("getEpisodes error:", err);
244
+ return [];
245
+ }
246
+ }
214
247
  /**
215
248
  * Check whether the Graphiti MCP server is reachable.
216
249
  */
@@ -1,4 +1,13 @@
1
1
  import type { GraphitiFact, GraphitiNode } from "../types/index.js";
2
+ export declare const classifyFacts: (facts: GraphitiFact[], now: Date) => {
3
+ decisions: GraphitiFact[];
4
+ active: GraphitiFact[];
5
+ background: GraphitiFact[];
6
+ };
7
+ export declare const takeFactsWithinBudget: (facts: GraphitiFact[], budget: number, formatOptions: {
8
+ factStaleDays: number;
9
+ now: Date;
10
+ }) => GraphitiFact[];
2
11
  /**
3
12
  * Persist a compaction summary episode when enabled.
4
13
  */
@@ -38,5 +47,6 @@ export declare function getCompactionContext(params: {
38
47
  user?: string;
39
48
  };
40
49
  contextStrings: string[];
50
+ factStaleDays?: number;
41
51
  }): Promise<string[]>;
42
52
  //# sourceMappingURL=compaction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../src/src/services/compaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAIpE;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,MAAM,EAAE;QACN,UAAU,EAAE,CAAC,IAAI,EAAE;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;YACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC;SAC5B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACrB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBhB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,MAAM,EAAE;QACN,WAAW,EAAE,CAAC,IAAI,EAAE;YAClB,KAAK,EAAE,MAAM,CAAC;YACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;YACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QAC9B,WAAW,EAAE,CAAC,IAAI,EAAE;YAClB,KAAK,EAAE,MAAM,CAAC;YACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;YACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;KAC/B,CAAC;IACF,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgIpB"}
1
+ {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../src/src/services/compaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA0BpE,eAAO,MAAM,aAAa,GACxB,OAAO,YAAY,EAAE,EACrB,KAAK,IAAI,KACR;IACD,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,YAAY,EAAE,CAAC;CA4B5B,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,OAAO,YAAY,EAAE,EACrB,QAAQ,MAAM,EACd,eAAe;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,KAClD,YAAY,EAoBd,CAAC;AAEF;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,MAAM,EAAE;QACN,UAAU,EAAE,CAAC,IAAI,EAAE;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;YACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC;SAC5B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACrB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBhB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,MAAM,EAAE;QACN,WAAW,EAAE,CAAC,IAAI,EAAE;YAClB,KAAK,EAAE,MAAM,CAAC;YACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;YACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QAC9B,WAAW,EAAE,CAAC,IAAI,EAAE;YAClB,KAAK,EAAE,MAAM,CAAC;YACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;YACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;KAC/B,CAAC;IACF,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA0KpB"}
@@ -1,9 +1,76 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.takeFactsWithinBudget = exports.classifyFacts = void 0;
3
4
  exports.handleCompaction = handleCompaction;
4
5
  exports.getCompactionContext = getCompactionContext;
5
6
  const context_js_1 = require("./context.js");
6
7
  const logger_js_1 = require("./logger.js");
8
+ const DAY_MS = 24 * 60 * 60 * 1000;
9
+ const DECISION_KEYWORDS = [
10
+ "decided",
11
+ "must",
12
+ "should",
13
+ "prefer",
14
+ "constraint",
15
+ "require",
16
+ "chose",
17
+ "always",
18
+ "never",
19
+ "schema",
20
+ "architecture",
21
+ "agreed",
22
+ "design",
23
+ "selected",
24
+ ];
25
+ const classifyFacts = (facts, now) => {
26
+ const decisions = [];
27
+ const active = [];
28
+ const background = [];
29
+ const cutoff = now.getTime() - 7 * DAY_MS;
30
+ for (const fact of facts) {
31
+ const text = fact.fact.toLowerCase();
32
+ // Use word boundary regex to match whole words only
33
+ const hasDecisionKeyword = DECISION_KEYWORDS.some((keyword) => {
34
+ const regex = new RegExp(`\\b${keyword}\\b`, "i");
35
+ return regex.test(text);
36
+ });
37
+ if (hasDecisionKeyword) {
38
+ decisions.push(fact);
39
+ continue;
40
+ }
41
+ const validAt = fact.valid_at ? Date.parse(fact.valid_at) : NaN;
42
+ if (!Number.isNaN(validAt) && validAt >= cutoff) {
43
+ active.push(fact);
44
+ continue;
45
+ }
46
+ background.push(fact);
47
+ }
48
+ return { decisions, active, background };
49
+ };
50
+ exports.classifyFacts = classifyFacts;
51
+ const takeFactsWithinBudget = (facts, budget, formatOptions) => {
52
+ if (budget <= 0 || facts.length === 0)
53
+ return [];
54
+ const classified = (0, exports.classifyFacts)(facts, formatOptions.now);
55
+ const prioritized = [
56
+ ...classified.decisions,
57
+ ...classified.active,
58
+ ...classified.background,
59
+ ];
60
+ const lines = (0, context_js_1.formatFactLines)(prioritized, formatOptions);
61
+ const selected = [];
62
+ let remaining = budget;
63
+ for (let i = 0; i < lines.length; i++) {
64
+ const line = lines[i];
65
+ const length = line.length + 1;
66
+ if (remaining - length < 0)
67
+ continue;
68
+ selected.push(prioritized[i]);
69
+ remaining -= length;
70
+ }
71
+ return selected;
72
+ };
73
+ exports.takeFactsWithinBudget = takeFactsWithinBudget;
7
74
  /**
8
75
  * Persist a compaction summary episode when enabled.
9
76
  */
@@ -30,6 +97,8 @@ async function handleCompaction(params) {
30
97
  */
31
98
  async function getCompactionContext(params) {
32
99
  const { client, characterBudget, groupIds, contextStrings } = params;
100
+ const now = new Date();
101
+ const factStaleDays = params.factStaleDays ?? 30;
33
102
  try {
34
103
  const queryText = contextStrings.slice(0, 3).join(" ").slice(0, 500);
35
104
  if (!queryText.trim())
@@ -70,14 +139,40 @@ async function getCompactionContext(params) {
70
139
  userFacts.length === 0 && userNodes.length === 0) {
71
140
  return [];
72
141
  }
73
- const buildSection = (header, facts, nodes) => {
142
+ const formatOptions = { factStaleDays, now };
143
+ const projectContext = (0, context_js_1.deduplicateContext)({
144
+ facts: projectFacts,
145
+ nodes: projectNodes,
146
+ });
147
+ const userContext = (0, context_js_1.deduplicateContext)({
148
+ facts: userFacts,
149
+ nodes: userNodes,
150
+ });
151
+ const buildSection = (header, facts, nodes, budget) => {
74
152
  const lines = [];
75
153
  lines.push(header);
76
154
  lines.push("<instruction>Background context only; do not reference in titles, summaries, or opening responses unless directly relevant.</instruction>");
77
- if (facts.length > 0) {
78
- lines.push("<facts>");
79
- lines.push(...(0, context_js_1.formatFactLines)(facts));
80
- lines.push("</facts>");
155
+ const classified = (0, exports.classifyFacts)(facts, now);
156
+ const decisionBudget = Math.floor(budget * 0.4);
157
+ const activeBudget = Math.floor(budget * 0.35);
158
+ const backgroundBudget = budget - decisionBudget - activeBudget;
159
+ const selectedDecisions = (0, exports.takeFactsWithinBudget)(classified.decisions, decisionBudget, formatOptions);
160
+ const selectedActive = (0, exports.takeFactsWithinBudget)(classified.active, activeBudget, formatOptions);
161
+ const selectedBackground = (0, exports.takeFactsWithinBudget)(classified.background, backgroundBudget, formatOptions);
162
+ if (selectedDecisions.length > 0) {
163
+ lines.push("<decisions>");
164
+ lines.push(...(0, context_js_1.formatFactLines)(selectedDecisions, formatOptions));
165
+ lines.push("</decisions>");
166
+ }
167
+ if (selectedActive.length > 0) {
168
+ lines.push("<active_context>");
169
+ lines.push(...(0, context_js_1.formatFactLines)(selectedActive, formatOptions));
170
+ lines.push("</active_context>");
171
+ }
172
+ if (selectedBackground.length > 0) {
173
+ lines.push("<background>");
174
+ lines.push(...(0, context_js_1.formatFactLines)(selectedBackground, formatOptions));
175
+ lines.push("</background>");
81
176
  }
82
177
  if (nodes.length > 0) {
83
178
  lines.push("<nodes>");
@@ -86,25 +181,19 @@ async function getCompactionContext(params) {
86
181
  }
87
182
  return lines.join("\n");
88
183
  };
89
- const projectSection = buildSection('<memory source="project">', projectFacts, projectNodes);
90
- const userSection = buildSection('<memory source="user">', userFacts, userNodes);
91
184
  const headerLines = [
92
185
  "<summary>",
93
- "<current_goal>",
94
- "- ",
95
- "</current_goal>",
96
- "",
97
- "<work_completed>",
186
+ "<decisions>",
98
187
  "- ",
99
- "</work_completed>",
188
+ "</decisions>",
100
189
  "",
101
- "<remaining_tasks>",
190
+ "<active_context>",
102
191
  "- ",
103
- "</remaining_tasks>",
192
+ "</active_context>",
104
193
  "",
105
- "<constraints_decisions>",
194
+ "<background>",
106
195
  "- ",
107
- "</constraints_decisions>",
196
+ "</background>",
108
197
  "",
109
198
  "<persistent_memory>",
110
199
  ];
@@ -113,6 +202,8 @@ async function getCompactionContext(params) {
113
202
  const remainingBudget = Math.max(characterBudget - base.length, 0);
114
203
  const projectBudget = Math.floor(remainingBudget * 0.7);
115
204
  const userBudget = remainingBudget - projectBudget;
205
+ const projectSection = buildSection('<memory source="project">', projectContext.facts, projectContext.nodes, projectBudget);
206
+ const userSection = buildSection('<memory source="user">', userContext.facts, userContext.nodes, userBudget);
116
207
  const truncatedProject = projectSection.slice(0, projectBudget);
117
208
  const truncatedUser = userSection.slice(0, userBudget);
118
209
  const sections = [header];
@@ -1,11 +1,5 @@
1
- export interface ProviderListClient {
2
- provider: {
3
- list: (options?: {
4
- directory?: string;
5
- }) => Promise<unknown>;
6
- };
7
- }
8
- export declare function resolveContextLimit(providerID: string, modelID: string, client: ProviderListClient, directory: string): Promise<number>;
1
+ import type { OpencodeClient } from "@opencode-ai/sdk";
2
+ export declare function resolveContextLimit(providerID: string, modelID: string, client: OpencodeClient, directory: string): Promise<number>;
9
3
  /**
10
4
  * Calculate the character budget for memory injection
11
5
  * (5% of context limit * 4 chars/token).
@@ -1 +1 @@
1
- {"version":3,"file":"context-limit.d.ts","sourceRoot":"","sources":["../../../src/src/services/context-limit.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE;QACR,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;YAAE,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAC9D,CAAC;CACH;AAID,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,kBAAkB,EAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAErE"}
1
+ {"version":3,"file":"context-limit.d.ts","sourceRoot":"","sources":["../../../src/src/services/context-limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOvD,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAiCjB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAErE"}
@@ -11,7 +11,9 @@ async function resolveContextLimit(providerID, modelID, client, directory) {
11
11
  if (cached)
12
12
  return cached;
13
13
  try {
14
- const providers = await client.provider.list({ directory });
14
+ const providers = await client.provider.list({
15
+ query: { directory },
16
+ });
15
17
  const list = providers.providers ?? [];
16
18
  for (const provider of list) {
17
19
  const providerInfo = provider;
@@ -1,8 +1,33 @@
1
1
  import type { GraphitiFact, GraphitiNode } from "../types/index.js";
2
- export declare const formatFactLines: (facts: GraphitiFact[]) => string[];
2
+ export declare const parseDate: (value?: string) => Date | null;
3
+ export declare const isFactInvalid: (fact: GraphitiFact, now: Date) => boolean;
4
+ export declare const annotateStaleFact: (fact: GraphitiFact, now: Date, factStaleDays: number) => GraphitiFact;
5
+ export declare const sortFactsByRecency: (facts: GraphitiFact[]) => GraphitiFact[];
6
+ export declare const filterAndAnnotateFacts: (facts: GraphitiFact[], options?: {
7
+ factStaleDays?: number;
8
+ now?: Date;
9
+ }) => GraphitiFact[];
10
+ export declare const formatFactLine: (fact: GraphitiFact) => string;
11
+ export declare const formatFactLines: (facts: GraphitiFact[], options?: {
12
+ factStaleDays?: number;
13
+ now?: Date;
14
+ }) => string[];
3
15
  export declare const formatNodeLines: (nodes: GraphitiNode[]) => string[];
16
+ export declare const deduplicateFactsByUuid: (facts: GraphitiFact[]) => GraphitiFact[];
17
+ export declare const deduplicateNodesByUuid: (nodes: GraphitiNode[]) => GraphitiNode[];
18
+ export declare const removeNodesReferencedByFacts: (facts: GraphitiFact[], nodes: GraphitiNode[]) => GraphitiNode[];
19
+ export declare const deduplicateContext: (params: {
20
+ facts: GraphitiFact[];
21
+ nodes: GraphitiNode[];
22
+ }) => {
23
+ facts: GraphitiFact[];
24
+ nodes: GraphitiNode[];
25
+ };
4
26
  /**
5
27
  * Format Graphiti facts and nodes into a user-facing context block.
6
28
  */
7
- export declare function formatMemoryContext(facts: GraphitiFact[], nodes: GraphitiNode[]): string;
29
+ export declare function formatMemoryContext(facts: GraphitiFact[], nodes: GraphitiNode[], options?: {
30
+ factStaleDays?: number;
31
+ now?: Date;
32
+ }): string;
8
33
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/src/services/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEpE,eAAO,MAAM,eAAe,GAAI,OAAO,YAAY,EAAE,KAAG,MAAM,EAO1D,CAAC;AAEL,eAAO,MAAM,eAAe,GAAI,OAAO,YAAY,EAAE,KAAG,MAAM,EAK1D,CAAC;AAEL;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EAAE,EACrB,KAAK,EAAE,YAAY,EAAE,GACpB,MAAM,CA0BR"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/src/services/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAIpE,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,KAAG,IAAI,GAAG,IAKjD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,MAAM,YAAY,EAAE,KAAK,IAAI,KAAG,OAQ7D,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,MAAM,YAAY,EAClB,KAAK,IAAI,EACT,eAAe,MAAM,KACpB,YAUF,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,OAAO,YAAY,EAAE,KAAG,YAAY,EAWtE,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,OAAO,YAAY,EAAE,EACrB,UAAU;IACR,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,KACA,YAAY,EAMd,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM,YAAY,KAAG,MAMnD,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,OAAO,YAAY,EAAE,EACrB,UAAU;IACR,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,KACA,MAAM,EAGR,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,OAAO,YAAY,EAAE,KAAG,MAAM,EAK1D,CAAC;AAEL,eAAO,MAAM,sBAAsB,GACjC,OAAO,YAAY,EAAE,KACpB,YAAY,EASd,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,OAAO,YAAY,EAAE,KACpB,YAAY,EASd,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,OAAO,YAAY,EAAE,EACrB,OAAO,YAAY,EAAE,KACpB,YAAY,EAOd,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,QAAQ;IACzC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB,KAAG;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAA;CAQjD,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EAAE,EACrB,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,CAAC,EAAE;IACR,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GACA,MAAM,CA6BR"}
@@ -1,43 +1,147 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.formatNodeLines = exports.formatFactLines = void 0;
3
+ exports.deduplicateContext = exports.removeNodesReferencedByFacts = exports.deduplicateNodesByUuid = exports.deduplicateFactsByUuid = exports.formatNodeLines = exports.formatFactLines = exports.formatFactLine = exports.filterAndAnnotateFacts = exports.sortFactsByRecency = exports.annotateStaleFact = exports.isFactInvalid = exports.parseDate = void 0;
4
4
  exports.formatMemoryContext = formatMemoryContext;
5
- const formatFactLines = (facts) => facts.map((fact) => {
5
+ const DAY_MS = 24 * 60 * 60 * 1000;
6
+ const parseDate = (value) => {
7
+ if (!value)
8
+ return null;
9
+ const parsed = Date.parse(value);
10
+ if (Number.isNaN(parsed))
11
+ return null;
12
+ return new Date(parsed);
13
+ };
14
+ exports.parseDate = parseDate;
15
+ const isFactInvalid = (fact, now) => {
16
+ const invalidAt = (0, exports.parseDate)(fact.invalid_at);
17
+ if (invalidAt && invalidAt.getTime() < now.getTime())
18
+ return true;
19
+ const validAt = (0, exports.parseDate)(fact.valid_at);
20
+ if (validAt && validAt.getTime() > now.getTime())
21
+ return true;
22
+ return false;
23
+ };
24
+ exports.isFactInvalid = isFactInvalid;
25
+ const annotateStaleFact = (fact, now, factStaleDays) => {
26
+ const validAt = (0, exports.parseDate)(fact.valid_at);
27
+ if (!validAt)
28
+ return fact;
29
+ const ageDays = Math.floor((now.getTime() - validAt.getTime()) / DAY_MS);
30
+ if (ageDays < 0)
31
+ return fact;
32
+ if (ageDays < factStaleDays)
33
+ return fact;
34
+ return {
35
+ ...fact,
36
+ fact: `[stale: ${ageDays} days ago] ${fact.fact}`,
37
+ };
38
+ };
39
+ exports.annotateStaleFact = annotateStaleFact;
40
+ const sortFactsByRecency = (facts) => {
41
+ const indexed = facts.map((fact, index) => ({
42
+ fact,
43
+ index,
44
+ time: (0, exports.parseDate)(fact.valid_at)?.getTime() ?? -Infinity,
45
+ }));
46
+ indexed.sort((a, b) => {
47
+ if (a.time !== b.time)
48
+ return b.time - a.time;
49
+ return a.index - b.index;
50
+ });
51
+ return indexed.map((entry) => entry.fact);
52
+ };
53
+ exports.sortFactsByRecency = sortFactsByRecency;
54
+ const filterAndAnnotateFacts = (facts, options) => {
55
+ const now = options?.now ?? new Date();
56
+ const factStaleDays = options?.factStaleDays ?? 30;
57
+ const filtered = facts.filter((fact) => !(0, exports.isFactInvalid)(fact, now));
58
+ const sorted = (0, exports.sortFactsByRecency)(filtered);
59
+ return sorted.map((fact) => (0, exports.annotateStaleFact)(fact, now, factStaleDays));
60
+ };
61
+ exports.filterAndAnnotateFacts = filterAndAnnotateFacts;
62
+ const formatFactLine = (fact) => {
6
63
  const entities = [];
7
64
  if (fact.source_node?.name)
8
65
  entities.push(fact.source_node.name);
9
66
  if (fact.target_node?.name)
10
67
  entities.push(fact.target_node.name);
11
68
  const entityStr = entities.length > 0 ? ` [${entities.join(" -> ")}]` : "";
12
- return `<fact>${fact.fact}${entityStr}</fact>`;
13
- });
69
+ return `- ${fact.fact}${entityStr}`;
70
+ };
71
+ exports.formatFactLine = formatFactLine;
72
+ const formatFactLines = (facts, options) => {
73
+ const annotated = (0, exports.filterAndAnnotateFacts)(facts, options);
74
+ return annotated.map((fact) => (0, exports.formatFactLine)(fact));
75
+ };
14
76
  exports.formatFactLines = formatFactLines;
15
77
  const formatNodeLines = (nodes) => nodes.map((node) => {
16
78
  const labels = node.labels?.length ? ` (${node.labels.join(", ")})` : "";
17
79
  const summary = node.summary ? `: ${node.summary}` : "";
18
- return `<node>${node.name}${labels}${summary}</node>`;
80
+ return `- **${node.name}**${labels}${summary}`;
19
81
  });
20
82
  exports.formatNodeLines = formatNodeLines;
83
+ const deduplicateFactsByUuid = (facts) => {
84
+ const seen = new Set();
85
+ const deduped = [];
86
+ for (const fact of facts) {
87
+ if (seen.has(fact.uuid))
88
+ continue;
89
+ seen.add(fact.uuid);
90
+ deduped.push(fact);
91
+ }
92
+ return deduped;
93
+ };
94
+ exports.deduplicateFactsByUuid = deduplicateFactsByUuid;
95
+ const deduplicateNodesByUuid = (nodes) => {
96
+ const seen = new Set();
97
+ const deduped = [];
98
+ for (const node of nodes) {
99
+ if (seen.has(node.uuid))
100
+ continue;
101
+ seen.add(node.uuid);
102
+ deduped.push(node);
103
+ }
104
+ return deduped;
105
+ };
106
+ exports.deduplicateNodesByUuid = deduplicateNodesByUuid;
107
+ const removeNodesReferencedByFacts = (facts, nodes) => {
108
+ const factNodeUuids = new Set();
109
+ for (const fact of facts) {
110
+ if (fact.source_node?.uuid)
111
+ factNodeUuids.add(fact.source_node.uuid);
112
+ if (fact.target_node?.uuid)
113
+ factNodeUuids.add(fact.target_node.uuid);
114
+ }
115
+ return nodes.filter((node) => !factNodeUuids.has(node.uuid));
116
+ };
117
+ exports.removeNodesReferencedByFacts = removeNodesReferencedByFacts;
118
+ const deduplicateContext = (params) => {
119
+ const dedupedFacts = (0, exports.deduplicateFactsByUuid)(params.facts);
120
+ const dedupedNodes = (0, exports.deduplicateNodesByUuid)(params.nodes);
121
+ const filteredNodes = (0, exports.removeNodesReferencedByFacts)(dedupedFacts, dedupedNodes);
122
+ return { facts: dedupedFacts, nodes: filteredNodes };
123
+ };
124
+ exports.deduplicateContext = deduplicateContext;
21
125
  /**
22
126
  * Format Graphiti facts and nodes into a user-facing context block.
23
127
  */
24
- function formatMemoryContext(facts, nodes) {
128
+ function formatMemoryContext(facts, nodes, options) {
25
129
  if (facts.length === 0 && nodes.length === 0) {
26
130
  return "";
27
131
  }
28
132
  const sections = [];
29
- sections.push("<memory>");
30
- sections.push("<instruction>Background context only; do not reference in titles, summaries, or opening responses unless directly relevant.</instruction>");
133
+ sections.push("# Persistent Memory (from Graphiti Knowledge Graph)");
134
+ sections.push("The following information was retrieved from your persistent memory.");
135
+ sections.push("Use this context to inform your responses, but do not mention it unless asked.");
31
136
  if (facts.length > 0) {
32
- sections.push("<facts>");
33
- sections.push(...(0, exports.formatFactLines)(facts));
34
- sections.push("</facts>");
137
+ sections.push("");
138
+ sections.push("## Known Facts");
139
+ sections.push(...(0, exports.formatFactLines)(facts, options));
35
140
  }
36
141
  if (nodes.length > 0) {
37
- sections.push("<nodes>");
142
+ sections.push("");
143
+ sections.push("## Known Entities");
38
144
  sections.push(...(0, exports.formatNodeLines)(nodes));
39
- sections.push("</nodes>");
40
145
  }
41
- sections.push("</memory>");
42
146
  return sections.join("\n");
43
147
  }
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/src/services/logger.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,MAAM;oBACD,OAAO,EAAE;oBAGT,OAAO,EAAE;qBAGR,OAAO,EAAE;qBAGT,OAAO,EAAE;CAG3B,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/src/services/logger.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,MAAM;oBACD,OAAO,EAAE;oBAGT,OAAO,EAAE;qBAGR,OAAO,EAAE;qBAGT,OAAO,EAAE;CAG3B,CAAC"}
@@ -1,45 +1,11 @@
1
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
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
38
5
  Object.defineProperty(exports, "__esModule", { value: true });
39
6
  exports.logger = void 0;
40
- const dntShim = __importStar(require("../../_dnt.shims.js"));
41
7
  const node_process_1 = __importDefault(require("node:process"));
42
- const console = dntShim.dntGlobalThis.console;
8
+ const console = globalThis.console;
43
9
  const PREFIX = "[graphiti]";
44
10
  exports.logger = {
45
11
  info: (...args) => {
@@ -1,3 +1,4 @@
1
+ import type { OpencodeClient } from "@opencode-ai/sdk";
1
2
  import type { GraphitiClient } from "./services/client.js";
2
3
  /**
3
4
  * Per-session state tracked by the plugin.
@@ -9,8 +10,10 @@ export type SessionState = {
9
10
  userGroupId: string;
10
11
  /** Whether memories have been injected into this session yet. */
11
12
  injectedMemories: boolean;
12
- /** Message count at last memory injection. */
13
- lastInjectionMessageCount: number;
13
+ /** Fact UUIDs included in the last memory injection. */
14
+ lastInjectionFactUuids: Set<string>;
15
+ /** Cached formatted memory context for system prompt injection. */
16
+ cachedMemoryContext?: string;
14
17
  /** Count of messages observed in this session. */
15
18
  messageCount: number;
16
19
  /** Buffered message strings awaiting flush. */
@@ -20,28 +23,6 @@ export type SessionState = {
20
23
  /** True when this session is the primary (non-subagent) session. */
21
24
  isMain: boolean;
22
25
  };
23
- /**
24
- * Minimal SDK client interface needed for session operations.
25
- */
26
- export interface SdkSessionClient {
27
- session: {
28
- /** Retrieve session metadata by ID. */
29
- get: (args: {
30
- path: {
31
- id: string;
32
- };
33
- }) => Promise<unknown>;
34
- /** List recent messages for a session. */
35
- messages: (args: {
36
- sessionID: string;
37
- limit?: number;
38
- }) => Promise<unknown>;
39
- };
40
- }
41
- /**
42
- * Manages session lifecycle, parent ID resolution, message buffering,
43
- * and flushing of pending messages to Graphiti.
44
- */
45
26
  /**
46
27
  * Tracks per-session state, parent resolution, message buffering,
47
28
  * and flushing pending messages to Graphiti.
@@ -55,7 +36,7 @@ export declare class SessionManager {
55
36
  private parentIdCache;
56
37
  private pendingAssistantMessages;
57
38
  private bufferedAssistantMessageIds;
58
- constructor(defaultGroupId: string, defaultUserGroupId: string, sdkClient: SdkSessionClient, graphitiClient: GraphitiClient);
39
+ constructor(defaultGroupId: string, defaultUserGroupId: string, sdkClient: OpencodeClient, graphitiClient: GraphitiClient);
59
40
  /** Get the current session state, if present. */
60
41
  getState(sessionId: string): SessionState | undefined;
61
42
  /** Persist session state for the given session ID. */
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/src/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI3D;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,wDAAwD;IACxD,sBAAsB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,qBAAa,cAAc;IAUvB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAZjC,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,wBAAwB,CAG5B;IACJ,OAAO,CAAC,2BAA2B,CAAqB;gBAGrC,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,MAAM,EAC1B,SAAS,EAAE,cAAc,EACzB,cAAc,EAAE,cAAc;IAGjD,iDAAiD;IACjD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIrD,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAItD,gDAAgD;IAChD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAI7D,qDAAqD;IAC/C,eAAe,CACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAsBrC,yDAAyD;IACnD,mBAAmB,CACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IA0B7D,yDAAyD;IACnD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5D,6DAA6D;IAC7D,mBAAmB,CACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,IAAI;IAKP,gEAAgE;IAChE,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAKlE;;OAEG;IACH,wBAAwB,CACtB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,IAAI;IAwCP,+EAA+E;IACzE,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EACzB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAgFhB,iDAAiD;IACjD,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAKlE,uCAAuC;IACvC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;YAexB,2BAA2B;CAiC1C"}
@@ -3,10 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SessionManager = void 0;
4
4
  const logger_js_1 = require("./services/logger.js");
5
5
  const utils_js_1 = require("./utils.js");
6
- /**
7
- * Manages session lifecycle, parent ID resolution, message buffering,
8
- * and flushing of pending messages to Graphiti.
9
- */
10
6
  /**
11
7
  * Tracks per-session state, parent resolution, message buffering,
12
8
  * and flushing pending messages to Graphiti.
@@ -113,7 +109,8 @@ class SessionManager {
113
109
  groupId: this.defaultGroupId,
114
110
  userGroupId: this.defaultUserGroupId,
115
111
  injectedMemories: false,
116
- lastInjectionMessageCount: 0,
112
+ lastInjectionFactUuids: new Set(),
113
+ cachedMemoryContext: undefined,
117
114
  messageCount: 0,
118
115
  pendingMessages: [],
119
116
  contextLimit: 200_000,
@@ -274,8 +271,8 @@ class SessionManager {
274
271
  async fetchLatestAssistantMessage(sessionId) {
275
272
  try {
276
273
  const response = await this.sdkClient.session.messages({
277
- sessionID: sessionId,
278
- limit: 20,
274
+ path: { id: sessionId },
275
+ query: { limit: 20 },
279
276
  });
280
277
  const payload = response && typeof response === "object" &&
281
278
  "data" in response