@waynesutton/agent-memory 0.0.1

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 (201) hide show
  1. package/.claude/settings.json +9 -0
  2. package/.claude/settings.local.json +7 -0
  3. package/AGENTS.md +113 -0
  4. package/CLAUDE.md +79 -0
  5. package/README.md +1 -0
  6. package/dist/cli/index.d.ts +3 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +192 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/cli/parsers/claude-code.d.ts +3 -0
  11. package/dist/cli/parsers/claude-code.d.ts.map +1 -0
  12. package/dist/cli/parsers/claude-code.js +75 -0
  13. package/dist/cli/parsers/claude-code.js.map +1 -0
  14. package/dist/cli/parsers/codex.d.ts +3 -0
  15. package/dist/cli/parsers/codex.d.ts.map +1 -0
  16. package/dist/cli/parsers/codex.js +42 -0
  17. package/dist/cli/parsers/codex.js.map +1 -0
  18. package/dist/cli/parsers/conductor.d.ts +3 -0
  19. package/dist/cli/parsers/conductor.d.ts.map +1 -0
  20. package/dist/cli/parsers/conductor.js +43 -0
  21. package/dist/cli/parsers/conductor.js.map +1 -0
  22. package/dist/cli/parsers/cursor.d.ts +3 -0
  23. package/dist/cli/parsers/cursor.d.ts.map +1 -0
  24. package/dist/cli/parsers/cursor.js +50 -0
  25. package/dist/cli/parsers/cursor.js.map +1 -0
  26. package/dist/cli/parsers/index.d.ts +12 -0
  27. package/dist/cli/parsers/index.d.ts.map +1 -0
  28. package/dist/cli/parsers/index.js +27 -0
  29. package/dist/cli/parsers/index.js.map +1 -0
  30. package/dist/cli/parsers/opencode.d.ts +3 -0
  31. package/dist/cli/parsers/opencode.d.ts.map +1 -0
  32. package/dist/cli/parsers/opencode.js +72 -0
  33. package/dist/cli/parsers/opencode.js.map +1 -0
  34. package/dist/cli/parsers/parsers.test.d.ts +2 -0
  35. package/dist/cli/parsers/parsers.test.d.ts.map +1 -0
  36. package/dist/cli/parsers/parsers.test.js +151 -0
  37. package/dist/cli/parsers/parsers.test.js.map +1 -0
  38. package/dist/cli/parsers/pi.d.ts +3 -0
  39. package/dist/cli/parsers/pi.d.ts.map +1 -0
  40. package/dist/cli/parsers/pi.js +43 -0
  41. package/dist/cli/parsers/pi.js.map +1 -0
  42. package/dist/cli/parsers/types.d.ts +25 -0
  43. package/dist/cli/parsers/types.d.ts.map +1 -0
  44. package/dist/cli/parsers/types.js +2 -0
  45. package/dist/cli/parsers/types.js.map +1 -0
  46. package/dist/cli/parsers/vscode-copilot.d.ts +3 -0
  47. package/dist/cli/parsers/vscode-copilot.d.ts.map +1 -0
  48. package/dist/cli/parsers/vscode-copilot.js +69 -0
  49. package/dist/cli/parsers/vscode-copilot.js.map +1 -0
  50. package/dist/cli/parsers/zed.d.ts +3 -0
  51. package/dist/cli/parsers/zed.d.ts.map +1 -0
  52. package/dist/cli/parsers/zed.js +43 -0
  53. package/dist/cli/parsers/zed.js.map +1 -0
  54. package/dist/cli/sync.d.ts +21 -0
  55. package/dist/cli/sync.d.ts.map +1 -0
  56. package/dist/cli/sync.js +78 -0
  57. package/dist/cli/sync.js.map +1 -0
  58. package/dist/cli/type-extractor.d.ts +25 -0
  59. package/dist/cli/type-extractor.d.ts.map +1 -0
  60. package/dist/cli/type-extractor.js +254 -0
  61. package/dist/cli/type-extractor.js.map +1 -0
  62. package/dist/cli/type-extractor.test.d.ts +2 -0
  63. package/dist/cli/type-extractor.test.d.ts.map +1 -0
  64. package/dist/cli/type-extractor.test.js +173 -0
  65. package/dist/cli/type-extractor.test.js.map +1 -0
  66. package/dist/client/http.d.ts +44 -0
  67. package/dist/client/http.d.ts.map +1 -0
  68. package/dist/client/http.js +311 -0
  69. package/dist/client/http.js.map +1 -0
  70. package/dist/client/index.d.ts +158 -0
  71. package/dist/client/index.d.ts.map +1 -0
  72. package/dist/client/index.js +256 -0
  73. package/dist/client/index.js.map +1 -0
  74. package/dist/component/_generated/api.d.ts +12 -0
  75. package/dist/component/_generated/api.d.ts.map +1 -0
  76. package/dist/component/_generated/api.js +13 -0
  77. package/dist/component/_generated/api.js.map +1 -0
  78. package/dist/component/_generated/dataModel.d.ts +18 -0
  79. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  80. package/dist/component/_generated/dataModel.js +11 -0
  81. package/dist/component/_generated/dataModel.js.map +1 -0
  82. package/dist/component/_generated/server.d.ts +42 -0
  83. package/dist/component/_generated/server.d.ts.map +1 -0
  84. package/dist/component/_generated/server.js +39 -0
  85. package/dist/component/_generated/server.js.map +1 -0
  86. package/dist/component/actions.d.ts +42 -0
  87. package/dist/component/actions.d.ts.map +1 -0
  88. package/dist/component/actions.js +405 -0
  89. package/dist/component/actions.js.map +1 -0
  90. package/dist/component/apiKeyMutations.d.ts +29 -0
  91. package/dist/component/apiKeyMutations.d.ts.map +1 -0
  92. package/dist/component/apiKeyMutations.js +149 -0
  93. package/dist/component/apiKeyMutations.js.map +1 -0
  94. package/dist/component/apiKeyQueries.d.ts +37 -0
  95. package/dist/component/apiKeyQueries.d.ts.map +1 -0
  96. package/dist/component/apiKeyQueries.js +127 -0
  97. package/dist/component/apiKeyQueries.js.map +1 -0
  98. package/dist/component/checksum.d.ts +6 -0
  99. package/dist/component/checksum.d.ts.map +1 -0
  100. package/dist/component/checksum.js +14 -0
  101. package/dist/component/checksum.js.map +1 -0
  102. package/dist/component/checksum.test.d.ts +2 -0
  103. package/dist/component/checksum.test.d.ts.map +1 -0
  104. package/dist/component/checksum.test.js +27 -0
  105. package/dist/component/checksum.test.js.map +1 -0
  106. package/dist/component/convex.config.d.ts +3 -0
  107. package/dist/component/convex.config.d.ts.map +1 -0
  108. package/dist/component/convex.config.js +4 -0
  109. package/dist/component/convex.config.js.map +1 -0
  110. package/dist/component/cronActions.d.ts +3 -0
  111. package/dist/component/cronActions.d.ts.map +1 -0
  112. package/dist/component/cronActions.js +38 -0
  113. package/dist/component/cronActions.js.map +1 -0
  114. package/dist/component/cronQueries.d.ts +6 -0
  115. package/dist/component/cronQueries.d.ts.map +1 -0
  116. package/dist/component/cronQueries.js +38 -0
  117. package/dist/component/cronQueries.js.map +1 -0
  118. package/dist/component/crons.d.ts +3 -0
  119. package/dist/component/crons.d.ts.map +1 -0
  120. package/dist/component/crons.js +18 -0
  121. package/dist/component/crons.js.map +1 -0
  122. package/dist/component/format.d.ts +11 -0
  123. package/dist/component/format.d.ts.map +1 -0
  124. package/dist/component/format.js +175 -0
  125. package/dist/component/format.js.map +1 -0
  126. package/dist/component/format.test.d.ts +2 -0
  127. package/dist/component/format.test.d.ts.map +1 -0
  128. package/dist/component/format.test.js +118 -0
  129. package/dist/component/format.test.js.map +1 -0
  130. package/dist/component/mutations.d.ts +158 -0
  131. package/dist/component/mutations.d.ts.map +1 -0
  132. package/dist/component/mutations.js +745 -0
  133. package/dist/component/mutations.js.map +1 -0
  134. package/dist/component/queries.d.ts +94 -0
  135. package/dist/component/queries.d.ts.map +1 -0
  136. package/dist/component/queries.js +574 -0
  137. package/dist/component/queries.js.map +1 -0
  138. package/dist/component/schema.d.ts +278 -0
  139. package/dist/component/schema.d.ts.map +1 -0
  140. package/dist/component/schema.js +161 -0
  141. package/dist/component/schema.js.map +1 -0
  142. package/dist/mcp/server.d.ts +11 -0
  143. package/dist/mcp/server.d.ts.map +1 -0
  144. package/dist/mcp/server.js +571 -0
  145. package/dist/mcp/server.js.map +1 -0
  146. package/dist/shared.d.ts +126 -0
  147. package/dist/shared.d.ts.map +1 -0
  148. package/dist/shared.js +67 -0
  149. package/dist/shared.js.map +1 -0
  150. package/dist/test.d.ts +23 -0
  151. package/dist/test.d.ts.map +1 -0
  152. package/dist/test.js +21 -0
  153. package/dist/test.js.map +1 -0
  154. package/eslint.config.js +15 -0
  155. package/example/convex/convex.config.ts +7 -0
  156. package/example/convex/memory.ts +129 -0
  157. package/llms.md +175 -0
  158. package/llms.txt +126 -0
  159. package/package.json +72 -0
  160. package/prds/API-REFERENCE.md +935 -0
  161. package/prds/README.md +988 -0
  162. package/prds/SETUP.md +682 -0
  163. package/src/cli/index.ts +254 -0
  164. package/src/cli/parsers/claude-code.ts +80 -0
  165. package/src/cli/parsers/codex.ts +45 -0
  166. package/src/cli/parsers/conductor.ts +47 -0
  167. package/src/cli/parsers/cursor.ts +55 -0
  168. package/src/cli/parsers/index.ts +30 -0
  169. package/src/cli/parsers/opencode.ts +84 -0
  170. package/src/cli/parsers/parsers.test.ts +201 -0
  171. package/src/cli/parsers/pi.ts +47 -0
  172. package/src/cli/parsers/types.ts +26 -0
  173. package/src/cli/parsers/vscode-copilot.ts +78 -0
  174. package/src/cli/parsers/zed.ts +47 -0
  175. package/src/cli/sync.ts +110 -0
  176. package/src/cli/type-extractor.test.ts +241 -0
  177. package/src/cli/type-extractor.ts +331 -0
  178. package/src/client/http.ts +415 -0
  179. package/src/client/index.ts +519 -0
  180. package/src/component/_generated/api.ts +14 -0
  181. package/src/component/_generated/dataModel.ts +20 -0
  182. package/src/component/_generated/server.ts +64 -0
  183. package/src/component/actions.ts +558 -0
  184. package/src/component/apiKeyMutations.ts +175 -0
  185. package/src/component/apiKeyQueries.ts +156 -0
  186. package/src/component/checksum.test.ts +31 -0
  187. package/src/component/checksum.ts +13 -0
  188. package/src/component/convex.config.ts +5 -0
  189. package/src/component/cronActions.ts +52 -0
  190. package/src/component/cronQueries.ts +42 -0
  191. package/src/component/crons.ts +34 -0
  192. package/src/component/format.test.ts +133 -0
  193. package/src/component/format.ts +232 -0
  194. package/src/component/mutations.ts +824 -0
  195. package/src/component/queries.ts +684 -0
  196. package/src/component/schema.ts +207 -0
  197. package/src/mcp/server.ts +695 -0
  198. package/src/shared.ts +251 -0
  199. package/src/test.ts +32 -0
  200. package/tsconfig.json +21 -0
  201. package/vitest.config.ts +8 -0
@@ -0,0 +1,405 @@
1
+ import { action } from "./_generated/server.js";
2
+ import { internal } from "./_generated/api.js";
3
+ import { v } from "convex/values";
4
+ import { memoryTypeValidator, scopeValidator, } from "./schema.js";
5
+ // ── Return validators ───────────────────────────────────────────────
6
+ const memoryDocValidator = v.object({
7
+ _id: v.string(),
8
+ _creationTime: v.float64(),
9
+ projectId: v.string(),
10
+ scope: scopeValidator,
11
+ userId: v.optional(v.string()),
12
+ agentId: v.optional(v.string()),
13
+ sessionId: v.optional(v.string()),
14
+ title: v.string(),
15
+ content: v.string(),
16
+ memoryType: memoryTypeValidator,
17
+ tags: v.array(v.string()),
18
+ paths: v.optional(v.array(v.string())),
19
+ priority: v.optional(v.float64()),
20
+ source: v.optional(v.string()),
21
+ lastSyncedAt: v.optional(v.float64()),
22
+ checksum: v.string(),
23
+ archived: v.boolean(),
24
+ embeddingId: v.optional(v.string()),
25
+ accessCount: v.optional(v.float64()),
26
+ lastAccessedAt: v.optional(v.float64()),
27
+ positiveCount: v.optional(v.float64()),
28
+ negativeCount: v.optional(v.float64()),
29
+ });
30
+ const ingestEventValidator = v.union(v.literal("added"), v.literal("updated"), v.literal("deleted"), v.literal("skipped"));
31
+ // ── generateEmbedding ───────────────────────────────────────────────
32
+ export const generateEmbedding = action({
33
+ args: {
34
+ memoryId: v.string(),
35
+ embeddingApiKey: v.string(),
36
+ model: v.optional(v.string()),
37
+ },
38
+ returns: v.null(),
39
+ handler: async (ctx, args) => {
40
+ const model = args.model ?? "text-embedding-3-small";
41
+ const memory = await ctx.runQuery(internal.queries.get, {
42
+ memoryId: args.memoryId,
43
+ });
44
+ if (!memory)
45
+ throw new Error(`Memory not found: ${args.memoryId}`);
46
+ const response = await fetch("https://api.openai.com/v1/embeddings", {
47
+ method: "POST",
48
+ headers: {
49
+ Authorization: `Bearer ${args.embeddingApiKey}`,
50
+ "Content-Type": "application/json",
51
+ },
52
+ body: JSON.stringify({
53
+ input: `${memory.title}\n\n${memory.content}`,
54
+ model,
55
+ }),
56
+ });
57
+ if (!response.ok) {
58
+ const error = await response.text();
59
+ throw new Error(`Embedding API error: ${response.status} ${error}`);
60
+ }
61
+ const data = (await response.json());
62
+ const embedding = data.data[0].embedding;
63
+ await ctx.runMutation(internal.mutations.storeEmbedding, {
64
+ memoryId: args.memoryId,
65
+ embedding,
66
+ model,
67
+ dimensions: embedding.length,
68
+ });
69
+ return null;
70
+ },
71
+ });
72
+ // ── semanticSearch ──────────────────────────────────────────────────
73
+ export const semanticSearch = action({
74
+ args: {
75
+ projectId: v.string(),
76
+ query: v.string(),
77
+ embeddingApiKey: v.optional(v.string()),
78
+ limit: v.optional(v.float64()),
79
+ },
80
+ returns: v.array(memoryDocValidator),
81
+ handler: async (ctx, args) => {
82
+ const limit = args.limit ?? 10;
83
+ if (!args.embeddingApiKey) {
84
+ return await ctx.runQuery(internal.queries.search, {
85
+ projectId: args.projectId,
86
+ query: args.query,
87
+ limit,
88
+ });
89
+ }
90
+ const response = await fetch("https://api.openai.com/v1/embeddings", {
91
+ method: "POST",
92
+ headers: {
93
+ Authorization: `Bearer ${args.embeddingApiKey}`,
94
+ "Content-Type": "application/json",
95
+ },
96
+ body: JSON.stringify({
97
+ input: args.query,
98
+ model: "text-embedding-3-small",
99
+ }),
100
+ });
101
+ if (!response.ok) {
102
+ return await ctx.runQuery(internal.queries.search, {
103
+ projectId: args.projectId,
104
+ query: args.query,
105
+ limit,
106
+ });
107
+ }
108
+ const data = (await response.json());
109
+ const queryEmbedding = data.data[0].embedding;
110
+ const vectorResults = await ctx.vectorSearch("embeddings", "by_embedding", {
111
+ vector: queryEmbedding,
112
+ limit: limit * 2,
113
+ });
114
+ const memories = [];
115
+ for (const result of vectorResults) {
116
+ const embedding = await ctx.runQuery(internal.queries.getEmbeddingMemory, {
117
+ embeddingId: result._id,
118
+ });
119
+ if (embedding &&
120
+ embedding.projectId === args.projectId &&
121
+ !embedding.archived) {
122
+ memories.push(embedding);
123
+ if (memories.length >= limit)
124
+ break;
125
+ }
126
+ }
127
+ return memories;
128
+ },
129
+ });
130
+ // ── embedAll ────────────────────────────────────────────────────────
131
+ export const embedAll = action({
132
+ args: {
133
+ projectId: v.string(),
134
+ embeddingApiKey: v.string(),
135
+ model: v.optional(v.string()),
136
+ },
137
+ returns: v.object({
138
+ embedded: v.float64(),
139
+ skipped: v.float64(),
140
+ }),
141
+ handler: async (ctx, args) => {
142
+ const memories = await ctx.runQuery(internal.queries.listUnembedded, {
143
+ projectId: args.projectId,
144
+ });
145
+ let embedded = 0;
146
+ let skipped = 0;
147
+ for (const memory of memories) {
148
+ try {
149
+ await ctx.runAction(internal.actions.generateEmbedding, {
150
+ memoryId: memory._id,
151
+ embeddingApiKey: args.embeddingApiKey,
152
+ model: args.model,
153
+ });
154
+ embedded++;
155
+ }
156
+ catch {
157
+ skipped++;
158
+ }
159
+ }
160
+ return { embedded, skipped };
161
+ },
162
+ });
163
+ // ── ingest (intelligent memory pipeline) ────────────────────────────
164
+ //
165
+ // This is the core "smart memory" feature inspired by mem0.
166
+ // It takes raw text (conversations, notes, etc.) and:
167
+ // 1. Extracts discrete facts/learnings via LLM
168
+ // 2. Searches existing memories for overlap
169
+ // 3. Decides per-fact: ADD, UPDATE, DELETE, or SKIP
170
+ // 4. Returns a structured changelog
171
+ export const ingest = action({
172
+ args: {
173
+ projectId: v.string(),
174
+ content: v.string(), // raw text to extract memories from
175
+ scope: v.optional(scopeValidator),
176
+ userId: v.optional(v.string()),
177
+ agentId: v.optional(v.string()),
178
+ sessionId: v.optional(v.string()),
179
+ llmApiKey: v.string(), // OpenAI-compatible API key
180
+ llmModel: v.optional(v.string()),
181
+ llmBaseUrl: v.optional(v.string()),
182
+ embeddingApiKey: v.optional(v.string()),
183
+ customExtractionPrompt: v.optional(v.string()),
184
+ customUpdatePrompt: v.optional(v.string()),
185
+ },
186
+ returns: v.object({
187
+ results: v.array(v.object({
188
+ memoryId: v.string(),
189
+ content: v.string(),
190
+ event: ingestEventValidator,
191
+ previousContent: v.optional(v.string()),
192
+ })),
193
+ totalProcessed: v.float64(),
194
+ }),
195
+ handler: async (ctx, args) => {
196
+ const scope = args.scope ?? "project";
197
+ const llmModel = args.llmModel ?? "gpt-4.1-nano";
198
+ const llmBaseUrl = args.llmBaseUrl ?? "https://api.openai.com/v1";
199
+ // Load project settings for custom prompts
200
+ const projectSettings = await ctx.runQuery(internal.queries.getProjectSettings, { projectId: args.projectId });
201
+ const extractionPrompt = args.customExtractionPrompt ??
202
+ projectSettings?.settings.factExtractionPrompt ??
203
+ DEFAULT_EXTRACTION_PROMPT;
204
+ const updatePrompt = args.customUpdatePrompt ??
205
+ projectSettings?.settings.updateDecisionPrompt ??
206
+ DEFAULT_UPDATE_PROMPT;
207
+ // Step 1: Extract facts from input via LLM
208
+ const facts = await extractFacts(args.content, extractionPrompt, args.llmApiKey, llmModel, llmBaseUrl);
209
+ if (facts.length === 0) {
210
+ return { results: [], totalProcessed: 0 };
211
+ }
212
+ // Step 2: Load existing memories for dedup comparison
213
+ const existingMemories = await ctx.runQuery(internal.queries.listForIngest, { projectId: args.projectId, limit: 200 });
214
+ // Step 3: For each fact, decide action via LLM
215
+ const decisions = await decideActions(facts, existingMemories, updatePrompt, args.llmApiKey, llmModel, llmBaseUrl);
216
+ // Step 4: Execute decisions
217
+ const results = [];
218
+ for (const decision of decisions) {
219
+ switch (decision.action) {
220
+ case "ADD": {
221
+ const memoryId = await ctx.runMutation(internal.mutations.ingestCreateMemory, {
222
+ projectId: args.projectId,
223
+ scope,
224
+ userId: args.userId,
225
+ agentId: args.agentId,
226
+ sessionId: args.sessionId,
227
+ title: decision.title,
228
+ content: decision.content,
229
+ memoryType: decision.memoryType ?? "learning",
230
+ tags: decision.tags ?? [],
231
+ source: "ingest",
232
+ });
233
+ // Generate embedding if API key available
234
+ if (args.embeddingApiKey) {
235
+ try {
236
+ await ctx.runAction(internal.actions.generateEmbedding, {
237
+ memoryId,
238
+ embeddingApiKey: args.embeddingApiKey,
239
+ });
240
+ }
241
+ catch {
242
+ // Non-fatal: embedding generation failure shouldn't block ingest
243
+ }
244
+ }
245
+ results.push({
246
+ memoryId,
247
+ content: decision.content,
248
+ event: "added",
249
+ });
250
+ break;
251
+ }
252
+ case "UPDATE": {
253
+ if (!decision.existingMemoryId)
254
+ break;
255
+ const existing = existingMemories.find((m) => m._id === decision.existingMemoryId);
256
+ await ctx.runMutation(internal.mutations.ingestUpdateMemory, {
257
+ memoryId: decision.existingMemoryId,
258
+ content: decision.content,
259
+ });
260
+ results.push({
261
+ memoryId: decision.existingMemoryId,
262
+ content: decision.content,
263
+ event: "updated",
264
+ previousContent: existing?.content,
265
+ });
266
+ break;
267
+ }
268
+ case "DELETE": {
269
+ if (!decision.existingMemoryId)
270
+ break;
271
+ const deletedMemory = existingMemories.find((m) => m._id === decision.existingMemoryId);
272
+ await ctx.runMutation(internal.mutations.ingestDeleteMemory, {
273
+ memoryId: decision.existingMemoryId,
274
+ });
275
+ results.push({
276
+ memoryId: decision.existingMemoryId,
277
+ content: deletedMemory?.content ?? "",
278
+ event: "deleted",
279
+ previousContent: deletedMemory?.content,
280
+ });
281
+ break;
282
+ }
283
+ default:
284
+ results.push({
285
+ memoryId: "",
286
+ content: decision.content,
287
+ event: "skipped",
288
+ });
289
+ }
290
+ }
291
+ return { results, totalProcessed: facts.length };
292
+ },
293
+ });
294
+ // ── LLM helpers for ingest pipeline ─────────────────────────────────
295
+ const DEFAULT_EXTRACTION_PROMPT = `You are a memory extraction system. Extract discrete, actionable facts from the following text.
296
+
297
+ Rules:
298
+ - Each fact should be a single, self-contained piece of information
299
+ - Include preferences, decisions, corrections, patterns, and learnings
300
+ - Exclude trivial or ephemeral information (greetings, acknowledgments)
301
+ - Return facts as a JSON array of strings
302
+ - Each fact should be 1-3 sentences maximum
303
+
304
+ Return ONLY a JSON array of strings, no other text.`;
305
+ const DEFAULT_UPDATE_PROMPT = `You are a memory management system. Given new facts and existing memories, decide what to do with each new fact.
306
+
307
+ For each new fact, return one of:
308
+ - ADD: Create a new memory (no existing memory covers this)
309
+ - UPDATE: Merge with an existing memory (specify which one by ID and provide merged content)
310
+ - DELETE: Remove an existing memory because the new fact contradicts/invalidates it
311
+ - NONE: Skip this fact (already covered by existing memories)
312
+
313
+ Also assign each ADD/UPDATE a:
314
+ - title: short descriptive title (2-6 words)
315
+ - memoryType: one of "instruction", "learning", "reference", "feedback", "journal"
316
+ - tags: relevant tags as array of strings
317
+
318
+ Return a JSON array of decision objects.`;
319
+ async function callLLM(messages, apiKey, model, baseUrl) {
320
+ const response = await fetch(`${baseUrl}/chat/completions`, {
321
+ method: "POST",
322
+ headers: {
323
+ Authorization: `Bearer ${apiKey}`,
324
+ "Content-Type": "application/json",
325
+ },
326
+ body: JSON.stringify({
327
+ model,
328
+ messages,
329
+ temperature: 0.1,
330
+ max_tokens: 4096,
331
+ }),
332
+ });
333
+ if (!response.ok) {
334
+ const error = await response.text();
335
+ throw new Error(`LLM API error: ${response.status} ${error}`);
336
+ }
337
+ const data = (await response.json());
338
+ return data.choices[0].message.content;
339
+ }
340
+ function extractJson(text) {
341
+ // Strip markdown code fences if present
342
+ const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/);
343
+ if (fenced)
344
+ return fenced[1].trim();
345
+ // Strip <think> tags
346
+ const cleaned = text.replace(/<think>[\s\S]*?<\/think>/g, "").trim();
347
+ // Try to find JSON array or object
348
+ const jsonMatch = cleaned.match(/(\[[\s\S]*\]|\{[\s\S]*\})/);
349
+ return jsonMatch ? jsonMatch[1] : cleaned;
350
+ }
351
+ async function extractFacts(content, prompt, apiKey, model, baseUrl) {
352
+ const response = await callLLM([
353
+ { role: "system", content: prompt },
354
+ { role: "user", content },
355
+ ], apiKey, model, baseUrl);
356
+ try {
357
+ const parsed = JSON.parse(extractJson(response));
358
+ if (Array.isArray(parsed)) {
359
+ return parsed.map((item) => typeof item === "string" ? item : JSON.stringify(item));
360
+ }
361
+ return [];
362
+ }
363
+ catch {
364
+ return [];
365
+ }
366
+ }
367
+ async function decideActions(facts, existingMemories, prompt, apiKey, model, baseUrl) {
368
+ const existingStr = existingMemories
369
+ .map((m) => `[ID: ${m._id}] [${m.memoryType}] ${m.title}: ${m.content.slice(0, 200)}`)
370
+ .join("\n");
371
+ const factsStr = facts.map((f, i) => `${i + 1}. ${f}`).join("\n");
372
+ const userMessage = `## Existing Memories\n${existingStr || "(none)"}\n\n## New Facts\n${factsStr}`;
373
+ const response = await callLLM([
374
+ { role: "system", content: prompt },
375
+ { role: "user", content: userMessage },
376
+ ], apiKey, model, baseUrl);
377
+ try {
378
+ const parsed = JSON.parse(extractJson(response));
379
+ if (!Array.isArray(parsed))
380
+ return [];
381
+ return parsed
382
+ .filter((d) => d && typeof d === "object" && d.action && d.content)
383
+ .map((d) => ({
384
+ action: d.action,
385
+ content: String(d.content),
386
+ title: String(d.title ?? "untitled"),
387
+ existingMemoryId: d.existingMemoryId
388
+ ? String(d.existingMemoryId)
389
+ : undefined,
390
+ memoryType: d.memoryType ? String(d.memoryType) : undefined,
391
+ tags: Array.isArray(d.tags) ? d.tags.map(String) : undefined,
392
+ }));
393
+ }
394
+ catch {
395
+ // If LLM returns unparseable response, treat all facts as ADDs
396
+ return facts.map((f, i) => ({
397
+ action: "ADD",
398
+ content: f,
399
+ title: `fact-${i + 1}`,
400
+ memoryType: "learning",
401
+ tags: [],
402
+ }));
403
+ }
404
+ }
405
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/component/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EACL,mBAAmB,EACnB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,uEAAuE;AAEvE,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE;IAC1B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,KAAK,EAAE,cAAc;IACrB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/B,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,UAAU,EAAE,mBAAmB;IAC/B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACzB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACjC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9B,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACnC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACpC,cAAc,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACvC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACtC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;CACvC,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAClC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAClB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CACrB,CAAC;AAEF,uEAAuE;AAEvE,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;IACtC,IAAI,EAAE;QACJ,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;QAC3B,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC9B;IACD,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE;IACjB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,wBAAwB,CAAC;QAErD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE;YACtD,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEnE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,sCAAsC,EAAE;YACnE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,eAAe,EAAE;gBAC/C,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,OAAO,EAAE;gBAC7C,KAAK;aACN,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEzC,MAAM,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE;YACvD,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS;YACT,KAAK;YACL,UAAU,EAAE,SAAS,CAAC,MAAM;SAC7B,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC,CAAC;AAEH,uEAAuE;AAEvE,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;IACnC,IAAI,EAAE;QACJ,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACvC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;KAC/B;IACD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;IACpC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAE/B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE;gBACjD,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,sCAAsC,EAAE;YACnE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,eAAe,EAAE;gBAC/C,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,wBAAwB;aAChC,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE;gBACjD,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;QACF,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE9C,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,YAAY,EAAE,cAAc,EAAE;YACzE,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,KAAK,GAAG,CAAC;SACjB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE;gBACxE,WAAW,EAAE,MAAM,CAAC,GAAwB;aAC7C,CAAC,CAAC;YACH,IACE,SAAS;gBACT,SAAS,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS;gBACtC,CAAC,SAAS,CAAC,QAAQ,EACnB,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACzB,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK;oBAAE,MAAM;YACtC,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC,CAAC;AAEH,uEAAuE;AAEvE,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC;IAC7B,IAAI,EAAE;QACJ,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;QAC3B,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC9B;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;QACrB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;KACrB,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE;YACnE,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QAEH,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE;oBACtD,QAAQ,EAAE,MAAM,CAAC,GAAG;oBACpB,eAAe,EAAE,IAAI,CAAC,eAAe;oBACrC,KAAK,EAAE,IAAI,CAAC,KAAK;iBAClB,CAAC,CAAC;gBACH,QAAQ,EAAE,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;CACF,CAAC,CAAC;AAEH,uEAAuE;AACvE,EAAE;AACF,4DAA4D;AAC5D,sDAAsD;AACtD,+CAA+C;AAC/C,4CAA4C;AAC5C,oDAAoD;AACpD,oCAAoC;AAEpC,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC;IAC3B,IAAI,EAAE;QACJ,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,oCAAoC;QACzD,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;QACjC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC/B,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,4BAA4B;QACnD,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAClC,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACvC,sBAAsB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9C,kBAAkB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC3C;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,OAAO,EAAE,CAAC,CAAC,KAAK,CACd,CAAC,CAAC,MAAM,CAAC;YACP,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;YACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;YACnB,KAAK,EAAE,oBAAoB;YAC3B,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACxC,CAAC,CACH;QACD,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE;KAC5B,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,2BAA2B,CAAC;QAElE,2CAA2C;QAC3C,MAAM,eAAe,GAAG,MAAM,GAAG,CAAC,QAAQ,CACxC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EACnC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAC9B,CAAC;QAEF,MAAM,gBAAgB,GACpB,IAAI,CAAC,sBAAsB;YAC3B,eAAe,EAAE,QAAQ,CAAC,oBAAoB;YAC9C,yBAAyB,CAAC;QAE5B,MAAM,YAAY,GAChB,IAAI,CAAC,kBAAkB;YACvB,eAAe,EAAE,QAAQ,CAAC,oBAAoB;YAC9C,qBAAqB,CAAC;QAExB,2CAA2C;QAC3C,MAAM,KAAK,GAAG,MAAM,YAAY,CAC9B,IAAI,CAAC,OAAO,EACZ,gBAAgB,EAChB,IAAI,CAAC,SAAS,EACd,QAAQ,EACR,UAAU,CACX,CAAC;QAEF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;QAC5C,CAAC;QAED,sDAAsD;QACtD,MAAM,gBAAgB,GAAG,MAAM,GAAG,CAAC,QAAQ,CACzC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAC9B,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAC1C,CAAC;QAEF,+CAA+C;QAC/C,MAAM,SAAS,GAAG,MAAM,aAAa,CACnC,KAAK,EACL,gBAAgB,EAChB,YAAY,EACZ,IAAI,CAAC,SAAS,EACd,QAAQ,EACR,UAAU,CACX,CAAC;QAEF,4BAA4B;QAC5B,MAAM,OAAO,GAKR,EAAE,CAAC;QAER,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACxB,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,WAAW,CACpC,QAAQ,CAAC,SAAS,CAAC,kBAAkB,EACrC;wBACE,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,KAAK;wBACL,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;wBACrB,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,UAAU;wBAC7C,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;wBACzB,MAAM,EAAE,QAAQ;qBACjB,CACF,CAAC;oBAEF,0CAA0C;oBAC1C,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;wBACzB,IAAI,CAAC;4BACH,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE;gCACtD,QAAQ;gCACR,eAAe,EAAE,IAAI,CAAC,eAAe;6BACtC,CAAC,CAAC;wBACL,CAAC;wBAAC,MAAM,CAAC;4BACP,iEAAiE;wBACnE,CAAC;oBACH,CAAC;oBAED,OAAO,CAAC,IAAI,CAAC;wBACX,QAAQ;wBACR,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,KAAK,EAAE,OAAO;qBACf,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBAED,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,IAAI,CAAC,QAAQ,CAAC,gBAAgB;wBAAE,MAAM;oBACtC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CACpC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,gBAAgB,CAChD,CAAC;oBAEF,MAAM,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,kBAAkB,EAAE;wBAC3D,QAAQ,EAAE,QAAQ,CAAC,gBAAgB;wBACnC,OAAO,EAAE,QAAQ,CAAC,OAAO;qBAC1B,CAAC,CAAC;oBAEH,OAAO,CAAC,IAAI,CAAC;wBACX,QAAQ,EAAE,QAAQ,CAAC,gBAAgB;wBACnC,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,KAAK,EAAE,SAAS;wBAChB,eAAe,EAAE,QAAQ,EAAE,OAAO;qBACnC,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBAED,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,IAAI,CAAC,QAAQ,CAAC,gBAAgB;wBAAE,MAAM;oBACtC,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CACzC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,gBAAgB,CAChD,CAAC;oBAEF,MAAM,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,kBAAkB,EAAE;wBAC3D,QAAQ,EAAE,QAAQ,CAAC,gBAAgB;qBACpC,CAAC,CAAC;oBAEH,OAAO,CAAC,IAAI,CAAC;wBACX,QAAQ,EAAE,QAAQ,CAAC,gBAAgB;wBACnC,OAAO,EAAE,aAAa,EAAE,OAAO,IAAI,EAAE;wBACrC,KAAK,EAAE,SAAS;wBAChB,eAAe,EAAE,aAAa,EAAE,OAAO;qBACxC,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBAED;oBACE,OAAO,CAAC,IAAI,CAAC;wBACX,QAAQ,EAAE,EAAE;wBACZ,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,KAAK,EAAE,SAAS;qBACjB,CAAC,CAAC;YACP,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IACnD,CAAC;CACF,CAAC,CAAC;AAEH,uEAAuE;AAEvE,MAAM,yBAAyB,GAAG;;;;;;;;;oDASkB,CAAC;AAErD,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;yCAaW,CAAC;AAW1C,KAAK,UAAU,OAAO,CACpB,QAAkD,EAClD,MAAc,EACd,KAAa,EACb,OAAe;IAEf,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,mBAAmB,EAAE;QAC1D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,EAAE;YACjC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK;YACL,QAAQ;YACR,WAAW,EAAE,GAAG;YAChB,UAAU,EAAE,IAAI;SACjB,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;IACF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;AACzC,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,wCAAwC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC1D,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEpC,qBAAqB;IACrB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAErE,mCAAmC;IACnC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC7D,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,OAAe,EACf,MAAc,EACd,MAAc,EACd,KAAa,EACb,OAAe;IAEf,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B;QACE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE;QACnC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;KAC1B,EACD,MAAM,EACN,KAAK,EACL,OAAO,CACR,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAa,EAAE,EAAE,CAClC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CACvD,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,KAAe,EACf,gBAKE,EACF,MAAc,EACd,MAAc,EACd,KAAa,EACb,OAAe;IAEf,MAAM,WAAW,GAAG,gBAAgB;SACjC,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAC5E;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElE,MAAM,WAAW,GAAG,yBAAyB,WAAW,IAAI,QAAQ,qBAAqB,QAAQ,EAAE,CAAC;IAEpG,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B;QACE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE;QACnC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE;KACvC,EACD,MAAM,EACN,KAAK,EACL,OAAO,CACR,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QAEtC,OAAO,MAAM;aACV,MAAM,CACL,CAAC,CAAM,EAAE,EAAE,CACT,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CACtD;aACA,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;YAChB,MAAM,EAAE,CAAC,CAAC,MAA8C;YACxD,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1B,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,UAAU,CAAC;YACpC,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;gBAClC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC;gBAC5B,CAAC,CAAC,SAAS;YACb,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;YAC3D,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;SAC7D,CAAC,CAAC,CAAC;IACR,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;QAC/D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1B,MAAM,EAAE,KAAc;YACtB,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;YACtB,UAAU,EAAE,UAAU;YACtB,IAAI,EAAE,EAAE;SACT,CAAC,CAAC,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ export declare const createApiKey: import("convex/server").RegisteredMutation<"public", {
2
+ rateLimitOverride?: {
3
+ requestsPerWindow: number;
4
+ windowMs: number;
5
+ } | undefined;
6
+ expiresAt?: number | undefined;
7
+ projectId: string;
8
+ name: string;
9
+ permissions: string[];
10
+ }, Promise<{
11
+ key: string;
12
+ keyHash: string;
13
+ }>>;
14
+ export declare const revokeApiKey: import("convex/server").RegisteredMutation<"public", {
15
+ keyHash: string;
16
+ }, Promise<null>>;
17
+ export declare const consumeRateLimit: import("convex/server").RegisteredMutation<"public", {
18
+ requestsPerWindow: number;
19
+ windowMs: number;
20
+ keyHash: string;
21
+ }, Promise<{
22
+ allowed: boolean;
23
+ remaining: number;
24
+ retryAfterMs: number;
25
+ }>>;
26
+ export declare const cleanupRateLimitTokens: import("convex/server").RegisteredMutation<"internal", {}, Promise<{
27
+ deleted: number;
28
+ }>>;
29
+ //# sourceMappingURL=apiKeyMutations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiKeyMutations.d.ts","sourceRoot":"","sources":["../../src/component/apiKeyMutations.ts"],"names":[],"mappings":"AAgCA,eAAO,MAAM,YAAY;;;;;;;;;;;;GAiCvB,CAAC;AAIH,eAAO,MAAM,YAAY;;iBAgBvB,CAAC;AAMH,eAAO,MAAM,gBAAgB;;;;;;;;GA2D3B,CAAC;AAMH,eAAO,MAAM,sBAAsB;;GAkBjC,CAAC"}
@@ -0,0 +1,149 @@
1
+ import { mutation } from "./_generated/server.js";
2
+ import { v } from "convex/values";
3
+ // ── Hash helper ─────────────────────────────────────────────────────
4
+ // Simple FNV-1a based hash for API key storage.
5
+ // We use the same checksum function as the rest of the component
6
+ // for consistency. For API keys the security model is "bearer token
7
+ // stored in database" — the hash prevents plaintext key exposure
8
+ // if the database is inspected, but the real security boundary is
9
+ // Convex's deployment isolation.
10
+ function hashKey(key) {
11
+ let hash = 2166136261;
12
+ for (let i = 0; i < key.length; i++) {
13
+ hash ^= key.charCodeAt(i);
14
+ hash = Math.imul(hash, 16777619);
15
+ }
16
+ return (hash >>> 0).toString(16).padStart(8, "0");
17
+ }
18
+ function generateKey() {
19
+ // Generate a URL-safe random key with "am_" prefix
20
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
21
+ let key = "am_";
22
+ for (let i = 0; i < 40; i++) {
23
+ key += chars.charAt(Math.floor(Math.random() * chars.length));
24
+ }
25
+ return key;
26
+ }
27
+ // ── createApiKey ────────────────────────────────────────────────────
28
+ export const createApiKey = mutation({
29
+ args: {
30
+ projectId: v.string(),
31
+ name: v.string(),
32
+ permissions: v.array(v.string()),
33
+ rateLimitOverride: v.optional(v.object({
34
+ requestsPerWindow: v.float64(),
35
+ windowMs: v.float64(),
36
+ })),
37
+ expiresAt: v.optional(v.float64()),
38
+ },
39
+ returns: v.object({
40
+ key: v.string(), // plaintext key — only returned once
41
+ keyHash: v.string(),
42
+ }),
43
+ handler: async (ctx, args) => {
44
+ const key = generateKey();
45
+ const keyHash = hashKey(key);
46
+ await ctx.db.insert("apiKeys", {
47
+ keyHash,
48
+ projectId: args.projectId,
49
+ name: args.name,
50
+ permissions: args.permissions,
51
+ rateLimitOverride: args.rateLimitOverride,
52
+ expiresAt: args.expiresAt,
53
+ revoked: false,
54
+ });
55
+ return { key, keyHash };
56
+ },
57
+ });
58
+ // ── revokeApiKey ────────────────────────────────────────────────────
59
+ export const revokeApiKey = mutation({
60
+ args: {
61
+ keyHash: v.string(),
62
+ },
63
+ returns: v.null(),
64
+ handler: async (ctx, args) => {
65
+ const existing = await ctx.db
66
+ .query("apiKeys")
67
+ .withIndex("by_key", (q) => q.eq("keyHash", args.keyHash))
68
+ .first();
69
+ if (!existing)
70
+ throw new Error(`API key not found: ${args.keyHash}`);
71
+ await ctx.db.patch(existing._id, { revoked: true });
72
+ return null;
73
+ },
74
+ });
75
+ // ── consumeRateLimit ────────────────────────────────────────────────
76
+ // Atomically checks and increments the rate limit counter.
77
+ // Returns whether the request is allowed and how many tokens remain.
78
+ export const consumeRateLimit = mutation({
79
+ args: {
80
+ keyHash: v.string(),
81
+ requestsPerWindow: v.float64(),
82
+ windowMs: v.float64(),
83
+ },
84
+ returns: v.object({
85
+ allowed: v.boolean(),
86
+ remaining: v.float64(),
87
+ retryAfterMs: v.float64(),
88
+ }),
89
+ handler: async (ctx, args) => {
90
+ const now = Date.now();
91
+ const windowStart = Math.floor(now / args.windowMs) * args.windowMs;
92
+ // Look for existing token record for this window
93
+ const existing = await ctx.db
94
+ .query("rateLimitTokens")
95
+ .withIndex("by_key_window", (q) => q.eq("keyHash", args.keyHash).eq("windowStart", windowStart))
96
+ .first();
97
+ if (!existing) {
98
+ // First request in this window
99
+ await ctx.db.insert("rateLimitTokens", {
100
+ keyHash: args.keyHash,
101
+ windowStart,
102
+ tokenCount: 1,
103
+ });
104
+ return {
105
+ allowed: true,
106
+ remaining: args.requestsPerWindow - 1,
107
+ retryAfterMs: 0,
108
+ };
109
+ }
110
+ if (existing.tokenCount >= args.requestsPerWindow) {
111
+ // Rate limited
112
+ const windowEnd = windowStart + args.windowMs;
113
+ return {
114
+ allowed: false,
115
+ remaining: 0,
116
+ retryAfterMs: windowEnd - now,
117
+ };
118
+ }
119
+ // Consume a token
120
+ await ctx.db.patch(existing._id, {
121
+ tokenCount: existing.tokenCount + 1,
122
+ });
123
+ return {
124
+ allowed: true,
125
+ remaining: args.requestsPerWindow - existing.tokenCount - 1,
126
+ retryAfterMs: 0,
127
+ };
128
+ },
129
+ });
130
+ // ── cleanupRateLimitTokens (internal, used by cron) ─────────────────
131
+ import { internalMutation } from "./_generated/server.js";
132
+ export const cleanupRateLimitTokens = internalMutation({
133
+ args: {},
134
+ returns: v.object({ deleted: v.float64() }),
135
+ handler: async (ctx) => {
136
+ // Delete token records older than 1 hour (well past any window)
137
+ const cutoff = Date.now() - 60 * 60 * 1000;
138
+ const old = await ctx.db.query("rateLimitTokens").take(500);
139
+ let deleted = 0;
140
+ for (const record of old) {
141
+ if (record.windowStart < cutoff) {
142
+ await ctx.db.delete(record._id);
143
+ deleted++;
144
+ }
145
+ }
146
+ return { deleted };
147
+ },
148
+ });
149
+ //# sourceMappingURL=apiKeyMutations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiKeyMutations.js","sourceRoot":"","sources":["../../src/component/apiKeyMutations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export declare const validateApiKey: import("convex/server").RegisteredQuery<"public", {
2
+ key: string;
3
+ }, Promise<{
4
+ valid: false;
5
+ reason: string;
6
+ keyHash?: undefined;
7
+ projectId?: undefined;
8
+ permissions?: undefined;
9
+ rateLimit?: undefined;
10
+ } | {
11
+ valid: true;
12
+ keyHash: string;
13
+ projectId: any;
14
+ permissions: any;
15
+ rateLimit: {
16
+ requestsPerWindow: number;
17
+ windowMs: number;
18
+ };
19
+ reason?: undefined;
20
+ }>>;
21
+ export declare const listApiKeys: import("convex/server").RegisteredQuery<"public", {
22
+ projectId: string;
23
+ }, Promise<{
24
+ _id: string;
25
+ keyHash: any;
26
+ projectId: any;
27
+ name: any;
28
+ permissions: any;
29
+ rateLimitOverride: any;
30
+ lastUsedAt: any;
31
+ expiresAt: any;
32
+ revoked: any;
33
+ }[]>>;
34
+ export declare const updateKeyLastUsed: import("convex/server").RegisteredMutation<"public", {
35
+ keyHash: string;
36
+ }, Promise<null>>;
37
+ //# sourceMappingURL=apiKeyQueries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiKeyQueries.d.ts","sourceRoot":"","sources":["../../src/component/apiKeyQueries.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;GAmEzB,CAAC;AAKH,eAAO,MAAM,WAAW;;;SA+BO,MAAM;;;;;;;;;KAWnC,CAAC;AAOH,eAAO,MAAM,iBAAiB;;iBAiB5B,CAAC"}