@waynesutton/agent-memory 0.0.1-alpha.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 (200) 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 +1003 -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 +80 -0
  160. package/prds/API-REFERENCE.md +935 -0
  161. package/prds/SETUP.md +682 -0
  162. package/src/cli/index.ts +254 -0
  163. package/src/cli/parsers/claude-code.ts +80 -0
  164. package/src/cli/parsers/codex.ts +45 -0
  165. package/src/cli/parsers/conductor.ts +47 -0
  166. package/src/cli/parsers/cursor.ts +55 -0
  167. package/src/cli/parsers/index.ts +30 -0
  168. package/src/cli/parsers/opencode.ts +84 -0
  169. package/src/cli/parsers/parsers.test.ts +201 -0
  170. package/src/cli/parsers/pi.ts +47 -0
  171. package/src/cli/parsers/types.ts +26 -0
  172. package/src/cli/parsers/vscode-copilot.ts +78 -0
  173. package/src/cli/parsers/zed.ts +47 -0
  174. package/src/cli/sync.ts +110 -0
  175. package/src/cli/type-extractor.test.ts +241 -0
  176. package/src/cli/type-extractor.ts +331 -0
  177. package/src/client/http.ts +415 -0
  178. package/src/client/index.ts +519 -0
  179. package/src/component/_generated/api.ts +14 -0
  180. package/src/component/_generated/dataModel.ts +20 -0
  181. package/src/component/_generated/server.ts +64 -0
  182. package/src/component/actions.ts +558 -0
  183. package/src/component/apiKeyMutations.ts +175 -0
  184. package/src/component/apiKeyQueries.ts +156 -0
  185. package/src/component/checksum.test.ts +31 -0
  186. package/src/component/checksum.ts +13 -0
  187. package/src/component/convex.config.ts +5 -0
  188. package/src/component/cronActions.ts +52 -0
  189. package/src/component/cronQueries.ts +42 -0
  190. package/src/component/crons.ts +34 -0
  191. package/src/component/format.test.ts +133 -0
  192. package/src/component/format.ts +232 -0
  193. package/src/component/mutations.ts +824 -0
  194. package/src/component/queries.ts +684 -0
  195. package/src/component/schema.ts +207 -0
  196. package/src/mcp/server.ts +695 -0
  197. package/src/shared.ts +251 -0
  198. package/src/test.ts +32 -0
  199. package/tsconfig.json +21 -0
  200. package/vitest.config.ts +8 -0
@@ -0,0 +1,254 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { basename, relative } from "node:path";
3
+ import { computeChecksum } from "../component/checksum.js";
4
+ // ── Public API ───────────────────────────────────────────────────────
5
+ /**
6
+ * Extract TypeScript type definitions from files matching a glob pattern
7
+ * and convert them into ParsedMemory objects suitable for agent-memory.
8
+ *
9
+ * Uses `types-not-docs` under the hood to generate markdown from types.
10
+ */
11
+ export async function extractTypeMemories(opts) {
12
+ const cwd = opts.cwd ?? process.cwd();
13
+ const priority = opts.priority ?? 0.6;
14
+ const extraTags = opts.tags ?? [];
15
+ const exclude = opts.exclude ?? [
16
+ "**/node_modules/**",
17
+ "**/dist/**",
18
+ "**/_generated/**",
19
+ "**/*.test.ts",
20
+ "**/*.spec.ts",
21
+ ];
22
+ // Dynamic import — keeps types-not-docs optional at install time
23
+ const fg = await import("fast-glob");
24
+ const files = await fg.default(opts.globPattern, {
25
+ cwd,
26
+ absolute: true,
27
+ ignore: exclude,
28
+ });
29
+ if (files.length === 0) {
30
+ return { memories: [], filesProcessed: 0 };
31
+ }
32
+ // Generate markdown from type definitions
33
+ const markdown = await generateTypeDocumentation(files);
34
+ if (!markdown.trim()) {
35
+ return { memories: [], filesProcessed: files.length };
36
+ }
37
+ // Split the generated markdown into individual type memories
38
+ const sections = splitByHeadings(markdown, files, cwd);
39
+ const memories = sections.map((section) => ({
40
+ title: `types/${section.title}`,
41
+ content: section.content,
42
+ memoryType: "reference",
43
+ scope: "project",
44
+ tags: ["typescript", "types", "auto-generated", ...extraTags],
45
+ paths: section.sourcePaths,
46
+ priority,
47
+ source: "ingest-types",
48
+ checksum: computeChecksum(section.content),
49
+ }));
50
+ return { memories, filesProcessed: files.length };
51
+ }
52
+ // ── Type documentation generation ────────────────────────────────────
53
+ /**
54
+ * Generate markdown documentation from TypeScript files using types-not-docs.
55
+ * Falls back to a built-in extractor if types-not-docs is not installed.
56
+ */
57
+ async function generateTypeDocumentation(files) {
58
+ try {
59
+ // Try types-not-docs first (optional dependency)
60
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
61
+ const tnd = await import(/* webpackIgnore: true */ "types-not-docs");
62
+ if (typeof tnd.generateDocs === "function") {
63
+ return tnd.generateDocs(files);
64
+ }
65
+ if (typeof tnd.default === "function") {
66
+ return tnd.default(files);
67
+ }
68
+ }
69
+ catch {
70
+ // types-not-docs not installed — use built-in extractor
71
+ }
72
+ // Built-in fallback: extract exported types/interfaces/functions from TS files
73
+ return await builtInTypeExtractor(files);
74
+ }
75
+ /**
76
+ * Built-in TypeScript type extractor that doesn't require external dependencies.
77
+ * Parses exported types, interfaces, type aliases, and function signatures.
78
+ */
79
+ async function builtInTypeExtractor(files) {
80
+ const sections = [];
81
+ for (const filePath of files) {
82
+ const source = await readFile(filePath, "utf-8");
83
+ const extracted = extractExportedTypes(source, filePath);
84
+ if (extracted) {
85
+ sections.push(extracted);
86
+ }
87
+ }
88
+ return sections.join("\n\n");
89
+ }
90
+ /**
91
+ * Extract exported type definitions from a single TypeScript file.
92
+ */
93
+ function extractExportedTypes(source, filePath) {
94
+ const lines = source.split("\n");
95
+ const blocks = [];
96
+ let currentBlock = [];
97
+ let braceDepth = 0;
98
+ let inExport = false;
99
+ let currentKind = "";
100
+ let currentName = "";
101
+ let pendingJsDoc = [];
102
+ function flushBlock() {
103
+ if (currentName && currentBlock.length > 0) {
104
+ blocks.push(formatBlock(currentKind, currentName, currentBlock));
105
+ }
106
+ inExport = false;
107
+ currentBlock = [];
108
+ braceDepth = 0;
109
+ currentKind = "";
110
+ currentName = "";
111
+ }
112
+ function countBraces(line) {
113
+ for (const ch of line) {
114
+ if (ch === "{")
115
+ braceDepth++;
116
+ if (ch === "}")
117
+ braceDepth--;
118
+ }
119
+ }
120
+ for (let i = 0; i < lines.length; i++) {
121
+ const line = lines[i];
122
+ const trimmed = line.trim();
123
+ // Collect JSDoc comments (only when not inside an export block)
124
+ if (!inExport && trimmed.startsWith("/**")) {
125
+ pendingJsDoc = [line];
126
+ if (!trimmed.endsWith("*/")) {
127
+ for (let j = i + 1; j < lines.length; j++) {
128
+ pendingJsDoc.push(lines[j]);
129
+ if (lines[j].trim().endsWith("*/")) {
130
+ i = j;
131
+ break;
132
+ }
133
+ }
134
+ }
135
+ continue;
136
+ }
137
+ // Match exported type definitions
138
+ if (!inExport) {
139
+ const exportMatch = trimmed.match(/^export\s+(interface|type|function|const|class|enum|abstract\s+class)\s+(\w+)/);
140
+ if (exportMatch) {
141
+ currentKind = exportMatch[1];
142
+ currentName = exportMatch[2];
143
+ currentBlock = [...pendingJsDoc, line];
144
+ pendingJsDoc = [];
145
+ braceDepth = 0;
146
+ countBraces(line);
147
+ // Check if statement is complete on this line
148
+ const isComplete =
149
+ // Single-line with no braces, ending in semicolon (type alias)
150
+ (braceDepth === 0 && !line.includes("{") && trimmed.endsWith(";")) ||
151
+ // Single-line with balanced braces
152
+ (braceDepth === 0 && line.includes("{"));
153
+ if (isComplete) {
154
+ flushBlock();
155
+ }
156
+ else {
157
+ inExport = true;
158
+ }
159
+ continue;
160
+ }
161
+ // No match — clear pending JSDoc
162
+ if (trimmed && !trimmed.startsWith("//") && !trimmed.startsWith("*")) {
163
+ pendingJsDoc = [];
164
+ }
165
+ continue;
166
+ }
167
+ // Inside a multi-line export — keep collecting
168
+ currentBlock.push(line);
169
+ countBraces(line);
170
+ if (braceDepth <= 0) {
171
+ flushBlock();
172
+ }
173
+ }
174
+ // Flush any remaining block
175
+ if (inExport) {
176
+ flushBlock();
177
+ }
178
+ if (blocks.length === 0)
179
+ return null;
180
+ const fileName = basename(filePath);
181
+ return `## ${fileName}\n\n${blocks.join("\n\n")}`;
182
+ }
183
+ function formatBlock(kind, name, lines) {
184
+ const code = lines.join("\n").trim();
185
+ return `### ${name}\n\n\`${kind}\`\n\n\`\`\`typescript\n${code}\n\`\`\``;
186
+ }
187
+ /**
188
+ * Split generated markdown into sections by ## headings.
189
+ * Each ## heading becomes a separate memory entry.
190
+ */
191
+ function splitByHeadings(markdown, sourceFiles, cwd) {
192
+ const lines = markdown.split("\n");
193
+ const sections = [];
194
+ let currentTitle = "";
195
+ let currentLines = [];
196
+ const relPaths = sourceFiles.map((f) => relative(cwd, f));
197
+ for (const line of lines) {
198
+ const h2Match = line.match(/^##\s+(.+)$/);
199
+ if (h2Match) {
200
+ // Flush previous section
201
+ if (currentTitle && currentLines.length > 0) {
202
+ const content = currentLines.join("\n").trim();
203
+ if (content) {
204
+ sections.push({
205
+ title: sanitizeTitle(currentTitle),
206
+ content,
207
+ sourcePaths: findMatchingPaths(currentTitle, relPaths),
208
+ });
209
+ }
210
+ }
211
+ currentTitle = h2Match[1];
212
+ currentLines = [];
213
+ }
214
+ else {
215
+ currentLines.push(line);
216
+ }
217
+ }
218
+ // Flush last section
219
+ if (currentTitle && currentLines.length > 0) {
220
+ const content = currentLines.join("\n").trim();
221
+ if (content) {
222
+ sections.push({
223
+ title: sanitizeTitle(currentTitle),
224
+ content,
225
+ sourcePaths: findMatchingPaths(currentTitle, relPaths),
226
+ });
227
+ }
228
+ }
229
+ // Fallback: if no ## headings, treat the whole thing as one section
230
+ if (sections.length === 0 && markdown.trim()) {
231
+ sections.push({
232
+ title: "api-reference",
233
+ content: markdown.trim(),
234
+ sourcePaths: relPaths,
235
+ });
236
+ }
237
+ return sections;
238
+ }
239
+ function sanitizeTitle(title) {
240
+ return title
241
+ .toLowerCase()
242
+ .replace(/\.tsx?$/, "")
243
+ .replace(/[^a-z0-9-_./]/g, "-")
244
+ .replace(/-+/g, "-")
245
+ .replace(/^-|-$/g, "");
246
+ }
247
+ function findMatchingPaths(title, relPaths) {
248
+ // Try to match the heading (usually a filename) back to source paths
249
+ const match = relPaths.filter((p) => p.includes(title) ||
250
+ basename(p, ".ts") === title ||
251
+ basename(p, ".tsx") === title);
252
+ return match.length > 0 ? match : relPaths.slice(0, 1);
253
+ }
254
+ //# sourceMappingURL=type-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-extractor.js","sourceRoot":"","sources":["../../src/cli/type-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=type-extractor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-extractor.test.d.ts","sourceRoot":"","sources":["../../src/cli/type-extractor.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,173 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtemp, mkdir, writeFile, rm } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { tmpdir } from "node:os";
5
+ import { extractTypeMemories } from "./type-extractor.js";
6
+ let tempDir;
7
+ beforeEach(async () => {
8
+ tempDir = await mkdtemp(join(tmpdir(), "agent-memory-types-test-"));
9
+ });
10
+ afterEach(async () => {
11
+ await rm(tempDir, { recursive: true, force: true });
12
+ });
13
+ describe("extractTypeMemories", () => {
14
+ it("extracts exported interfaces", async () => {
15
+ await writeFile(join(tempDir, "models.ts"), `
16
+ export interface User {
17
+ id: string;
18
+ name: string;
19
+ email: string;
20
+ createdAt: number;
21
+ }
22
+
23
+ export interface Post {
24
+ id: string;
25
+ title: string;
26
+ content: string;
27
+ authorId: string;
28
+ }
29
+ `);
30
+ const result = await extractTypeMemories({
31
+ globPattern: "**/*.ts",
32
+ cwd: tempDir,
33
+ });
34
+ expect(result.filesProcessed).toBe(1);
35
+ expect(result.memories.length).toBeGreaterThanOrEqual(1);
36
+ const allContent = result.memories.map((m) => m.content).join("\n");
37
+ expect(allContent).toContain("User");
38
+ expect(allContent).toContain("Post");
39
+ for (const memory of result.memories) {
40
+ expect(memory.memoryType).toBe("reference");
41
+ expect(memory.scope).toBe("project");
42
+ expect(memory.source).toBe("ingest-types");
43
+ expect(memory.tags).toContain("typescript");
44
+ expect(memory.tags).toContain("types");
45
+ expect(memory.tags).toContain("auto-generated");
46
+ expect(memory.checksum).toBeTruthy();
47
+ expect(memory.title).toMatch(/^types\//);
48
+ }
49
+ });
50
+ it("extracts exported type aliases", async () => {
51
+ await writeFile(join(tempDir, "types.ts"), `
52
+ export type Status = "active" | "inactive" | "pending";
53
+
54
+ export type UserId = string;
55
+ `);
56
+ const result = await extractTypeMemories({
57
+ globPattern: "**/*.ts",
58
+ cwd: tempDir,
59
+ });
60
+ expect(result.filesProcessed).toBe(1);
61
+ expect(result.memories.length).toBeGreaterThanOrEqual(1);
62
+ const allContent = result.memories.map((m) => m.content).join("\n");
63
+ expect(allContent).toContain("Status");
64
+ });
65
+ it("extracts exported functions", async () => {
66
+ await writeFile(join(tempDir, "utils.ts"), `
67
+ /** Compute hash of a string */
68
+ export function computeHash(input: string): string {
69
+ return input;
70
+ }
71
+
72
+ export const double = (n: number): number => n * 2;
73
+ `);
74
+ const result = await extractTypeMemories({
75
+ globPattern: "**/*.ts",
76
+ cwd: tempDir,
77
+ });
78
+ expect(result.filesProcessed).toBe(1);
79
+ const allContent = result.memories.map((m) => m.content).join("\n");
80
+ expect(allContent).toContain("computeHash");
81
+ });
82
+ it("returns empty for no matching files", async () => {
83
+ const result = await extractTypeMemories({
84
+ globPattern: "**/*.ts",
85
+ cwd: tempDir,
86
+ });
87
+ expect(result.filesProcessed).toBe(0);
88
+ expect(result.memories).toHaveLength(0);
89
+ });
90
+ it("returns empty for files with no exports", async () => {
91
+ await writeFile(join(tempDir, "internal.ts"), `
92
+ const x = 42;
93
+ function helper() { return x; }
94
+ `);
95
+ const result = await extractTypeMemories({
96
+ globPattern: "**/*.ts",
97
+ cwd: tempDir,
98
+ });
99
+ expect(result.filesProcessed).toBe(1);
100
+ expect(result.memories).toHaveLength(0);
101
+ });
102
+ it("handles multiple files", async () => {
103
+ await mkdir(join(tempDir, "src"));
104
+ await writeFile(join(tempDir, "src", "auth.ts"), `export interface Session { token: string; userId: string; }`);
105
+ await writeFile(join(tempDir, "src", "db.ts"), `export interface DatabaseConfig { host: string; port: number; }`);
106
+ const result = await extractTypeMemories({
107
+ globPattern: "src/**/*.ts",
108
+ cwd: tempDir,
109
+ });
110
+ expect(result.filesProcessed).toBe(2);
111
+ expect(result.memories.length).toBeGreaterThanOrEqual(2);
112
+ const allContent = result.memories.map((m) => m.content).join("\n");
113
+ expect(allContent).toContain("Session");
114
+ expect(allContent).toContain("DatabaseConfig");
115
+ });
116
+ it("respects exclude patterns", async () => {
117
+ await mkdir(join(tempDir, "src"));
118
+ await mkdir(join(tempDir, "dist"));
119
+ await writeFile(join(tempDir, "src", "api.ts"), `export interface Api { endpoint: string; }`);
120
+ await writeFile(join(tempDir, "dist", "api.ts"), `export interface Api { endpoint: string; }`);
121
+ const result = await extractTypeMemories({
122
+ globPattern: "**/*.ts",
123
+ cwd: tempDir,
124
+ exclude: ["**/dist/**"],
125
+ });
126
+ expect(result.filesProcessed).toBe(1);
127
+ });
128
+ it("applies custom tags", async () => {
129
+ await writeFile(join(tempDir, "schema.ts"), `export interface Table { id: string; }`);
130
+ const result = await extractTypeMemories({
131
+ globPattern: "**/*.ts",
132
+ cwd: tempDir,
133
+ tags: ["convex", "schema"],
134
+ });
135
+ expect(result.memories.length).toBeGreaterThanOrEqual(1);
136
+ for (const memory of result.memories) {
137
+ expect(memory.tags).toContain("convex");
138
+ expect(memory.tags).toContain("schema");
139
+ }
140
+ });
141
+ it("applies custom priority", async () => {
142
+ await writeFile(join(tempDir, "core.ts"), `export interface CoreConfig { debug: boolean; }`);
143
+ const result = await extractTypeMemories({
144
+ globPattern: "**/*.ts",
145
+ cwd: tempDir,
146
+ priority: 0.9,
147
+ });
148
+ expect(result.memories.length).toBeGreaterThanOrEqual(1);
149
+ for (const memory of result.memories) {
150
+ expect(memory.priority).toBe(0.9);
151
+ }
152
+ });
153
+ it("extracts JSDoc comments with types", async () => {
154
+ await writeFile(join(tempDir, "documented.ts"), `
155
+ /** Configuration for the application */
156
+ export interface AppConfig {
157
+ /** The port to listen on */
158
+ port: number;
159
+ /** Whether to enable debug mode */
160
+ debug: boolean;
161
+ }
162
+ `);
163
+ const result = await extractTypeMemories({
164
+ globPattern: "**/*.ts",
165
+ cwd: tempDir,
166
+ });
167
+ expect(result.memories.length).toBeGreaterThanOrEqual(1);
168
+ const allContent = result.memories.map((m) => m.content).join("\n");
169
+ expect(allContent).toContain("AppConfig");
170
+ expect(allContent).toContain("Configuration for the application");
171
+ });
172
+ });
173
+ //# sourceMappingURL=type-extractor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-extractor.test.js","sourceRoot":"","sources":["../../src/cli/type-extractor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type HttpRouter } from "convex/server";
2
+ import type { api } from "../component/_generated/api.js";
3
+ type ComponentApi = typeof api;
4
+ export interface MemoryHttpApiConfig {
5
+ /** Allowed CORS origins. Defaults to ["*"]. */
6
+ corsOrigins?: string[];
7
+ }
8
+ /**
9
+ * Generates read-only HTTP endpoint handlers that a Convex app mounts
10
+ * on its own `httpRouter`. Each request is authenticated via an API key
11
+ * (Bearer token) and rate-limited using the component's built-in
12
+ * fixed-window token bucket.
13
+ *
14
+ * Usage in the consuming app's `convex/http.ts`:
15
+ *
16
+ * ```typescript
17
+ * import { httpRouter } from "convex/server";
18
+ * import { MemoryHttpApi } from "@waynesutton/agent-memory/http";
19
+ * import { components } from "./_generated/api";
20
+ *
21
+ * const http = httpRouter();
22
+ * const memoryApi = new MemoryHttpApi(components.agentMemory);
23
+ * memoryApi.mount(http, "/api/memory");
24
+ * export default http;
25
+ * ```
26
+ */
27
+ export declare class MemoryHttpApi {
28
+ private component;
29
+ private cors;
30
+ constructor(component: ComponentApi, config?: MemoryHttpApiConfig);
31
+ /**
32
+ * Validates the Bearer token, checks rate limits, and returns the
33
+ * validated key info. Returns an error Response if auth or rate
34
+ * limiting fails.
35
+ */
36
+ private authenticate;
37
+ /**
38
+ * Registers all read-only memory API routes on the given httpRouter
39
+ * under the specified prefix (e.g. "/api/memory").
40
+ */
41
+ mount(http: HttpRouter, prefix: string): void;
42
+ }
43
+ export {};
44
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/client/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAO1D,KAAK,YAAY,GAAG,OAAO,GAAG,CAAC;AAE/B,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AA2CD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,IAAI,CAAyB;gBAEzB,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,mBAAmB;IAOjE;;;;OAIG;YACW,YAAY;IA8D1B;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAiQ9C"}