@xfabric/memory 0.1.0

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 (121) hide show
  1. package/dist/chunking/index.d.ts +3 -0
  2. package/dist/chunking/index.d.ts.map +1 -0
  3. package/dist/chunking/index.js +3 -0
  4. package/dist/chunking/index.js.map +1 -0
  5. package/dist/chunking/markdown.d.ts +13 -0
  6. package/dist/chunking/markdown.d.ts.map +1 -0
  7. package/dist/chunking/markdown.js +106 -0
  8. package/dist/chunking/markdown.js.map +1 -0
  9. package/dist/chunking/session.d.ts +24 -0
  10. package/dist/chunking/session.d.ts.map +1 -0
  11. package/dist/chunking/session.js +173 -0
  12. package/dist/chunking/session.js.map +1 -0
  13. package/dist/index.d.ts +18 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +24 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/memory-manager.d.ts +189 -0
  18. package/dist/memory-manager.d.ts.map +1 -0
  19. package/dist/memory-manager.js +1055 -0
  20. package/dist/memory-manager.js.map +1 -0
  21. package/dist/providers/gemini.d.ts +6 -0
  22. package/dist/providers/gemini.d.ts.map +1 -0
  23. package/dist/providers/gemini.js +73 -0
  24. package/dist/providers/gemini.js.map +1 -0
  25. package/dist/providers/index.d.ts +20 -0
  26. package/dist/providers/index.d.ts.map +1 -0
  27. package/dist/providers/index.js +102 -0
  28. package/dist/providers/index.js.map +1 -0
  29. package/dist/providers/local.d.ts +14 -0
  30. package/dist/providers/local.d.ts.map +1 -0
  31. package/dist/providers/local.js +73 -0
  32. package/dist/providers/local.js.map +1 -0
  33. package/dist/providers/openai.d.ts +6 -0
  34. package/dist/providers/openai.d.ts.map +1 -0
  35. package/dist/providers/openai.js +48 -0
  36. package/dist/providers/openai.js.map +1 -0
  37. package/dist/providers/types.d.ts +62 -0
  38. package/dist/providers/types.d.ts.map +1 -0
  39. package/dist/providers/types.js +2 -0
  40. package/dist/providers/types.js.map +1 -0
  41. package/dist/search/fts.d.ts +11 -0
  42. package/dist/search/fts.d.ts.map +1 -0
  43. package/dist/search/fts.js +50 -0
  44. package/dist/search/fts.js.map +1 -0
  45. package/dist/search/hybrid.d.ts +16 -0
  46. package/dist/search/hybrid.d.ts.map +1 -0
  47. package/dist/search/hybrid.js +83 -0
  48. package/dist/search/hybrid.js.map +1 -0
  49. package/dist/search/index.d.ts +4 -0
  50. package/dist/search/index.d.ts.map +1 -0
  51. package/dist/search/index.js +4 -0
  52. package/dist/search/index.js.map +1 -0
  53. package/dist/search/vector.d.ts +25 -0
  54. package/dist/search/vector.d.ts.map +1 -0
  55. package/dist/search/vector.js +152 -0
  56. package/dist/search/vector.js.map +1 -0
  57. package/dist/storage/index.d.ts +4 -0
  58. package/dist/storage/index.d.ts.map +1 -0
  59. package/dist/storage/index.js +4 -0
  60. package/dist/storage/index.js.map +1 -0
  61. package/dist/storage/schema.d.ts +24 -0
  62. package/dist/storage/schema.d.ts.map +1 -0
  63. package/dist/storage/schema.js +175 -0
  64. package/dist/storage/schema.js.map +1 -0
  65. package/dist/storage/sqlite-vec.d.ts +22 -0
  66. package/dist/storage/sqlite-vec.d.ts.map +1 -0
  67. package/dist/storage/sqlite-vec.js +85 -0
  68. package/dist/storage/sqlite-vec.js.map +1 -0
  69. package/dist/storage/sqlite.d.ts +206 -0
  70. package/dist/storage/sqlite.d.ts.map +1 -0
  71. package/dist/storage/sqlite.js +352 -0
  72. package/dist/storage/sqlite.js.map +1 -0
  73. package/dist/sync/index.d.ts +4 -0
  74. package/dist/sync/index.d.ts.map +1 -0
  75. package/dist/sync/index.js +4 -0
  76. package/dist/sync/index.js.map +1 -0
  77. package/dist/sync/minimatch.d.ts +6 -0
  78. package/dist/sync/minimatch.d.ts.map +1 -0
  79. package/dist/sync/minimatch.js +60 -0
  80. package/dist/sync/minimatch.js.map +1 -0
  81. package/dist/sync/session-monitor.d.ts +50 -0
  82. package/dist/sync/session-monitor.d.ts.map +1 -0
  83. package/dist/sync/session-monitor.js +126 -0
  84. package/dist/sync/session-monitor.js.map +1 -0
  85. package/dist/sync/watcher.d.ts +44 -0
  86. package/dist/sync/watcher.d.ts.map +1 -0
  87. package/dist/sync/watcher.js +110 -0
  88. package/dist/sync/watcher.js.map +1 -0
  89. package/dist/tools/index.d.ts +3 -0
  90. package/dist/tools/index.d.ts.map +1 -0
  91. package/dist/tools/index.js +3 -0
  92. package/dist/tools/index.js.map +1 -0
  93. package/dist/tools/memory-get.d.ts +32 -0
  94. package/dist/tools/memory-get.d.ts.map +1 -0
  95. package/dist/tools/memory-get.js +53 -0
  96. package/dist/tools/memory-get.js.map +1 -0
  97. package/dist/tools/memory-search.d.ts +32 -0
  98. package/dist/tools/memory-search.d.ts.map +1 -0
  99. package/dist/tools/memory-search.js +56 -0
  100. package/dist/tools/memory-search.js.map +1 -0
  101. package/dist/types.d.ts +350 -0
  102. package/dist/types.d.ts.map +1 -0
  103. package/dist/types.js +15 -0
  104. package/dist/types.js.map +1 -0
  105. package/dist/utils/concurrency.d.ts +25 -0
  106. package/dist/utils/concurrency.d.ts.map +1 -0
  107. package/dist/utils/concurrency.js +59 -0
  108. package/dist/utils/concurrency.js.map +1 -0
  109. package/dist/utils/hash.d.ts +9 -0
  110. package/dist/utils/hash.d.ts.map +1 -0
  111. package/dist/utils/hash.js +16 -0
  112. package/dist/utils/hash.js.map +1 -0
  113. package/dist/utils/index.d.ts +4 -0
  114. package/dist/utils/index.d.ts.map +1 -0
  115. package/dist/utils/index.js +4 -0
  116. package/dist/utils/index.js.map +1 -0
  117. package/dist/utils/retry.d.ts +22 -0
  118. package/dist/utils/retry.d.ts.map +1 -0
  119. package/dist/utils/retry.js +48 -0
  120. package/dist/utils/retry.js.map +1 -0
  121. package/package.json +67 -0
@@ -0,0 +1,50 @@
1
+ import type { SessionEvent } from "../types.js";
2
+ export type SessionMonitorOptions = {
3
+ /** Path to the JSONL session file */
4
+ sessionPath: string;
5
+ /** Callback for new session events */
6
+ onEvent: (event: SessionEvent) => void;
7
+ /** Poll interval in milliseconds */
8
+ pollIntervalMs?: number;
9
+ };
10
+ /**
11
+ * Monitor a JSONL session file for new messages
12
+ */
13
+ export declare class SessionMonitor {
14
+ private readonly sessionId;
15
+ private readonly options;
16
+ private lastOffset;
17
+ private lastMtime;
18
+ private pollTimer;
19
+ private monitoring;
20
+ constructor(sessionId: string, options: SessionMonitorOptions);
21
+ /**
22
+ * Check if the monitor is currently active
23
+ */
24
+ get isMonitoring(): boolean;
25
+ /**
26
+ * Start monitoring the session file
27
+ */
28
+ start(): void;
29
+ /**
30
+ * Stop monitoring the session file
31
+ */
32
+ stop(): void;
33
+ /**
34
+ * Check for new content in the session file
35
+ */
36
+ private checkForUpdates;
37
+ /**
38
+ * Process a parsed JSONL message
39
+ */
40
+ private processMessage;
41
+ /**
42
+ * Extract text content from a message
43
+ */
44
+ private extractContent;
45
+ /**
46
+ * Reset the read position (useful for reprocessing)
47
+ */
48
+ reset(): void;
49
+ }
50
+ //# sourceMappingURL=session-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-monitor.d.ts","sourceRoot":"","sources":["../../src/sync/session-monitor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,qBAAqB,GAAG;IAClC,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,oCAAoC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAWF;;GAEG;AACH,qBAAa,cAAc;IAOvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,UAAU,CAAS;gBAGR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,qBAAqB;IAGjD;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAeb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACH,OAAO,CAAC,eAAe;IA0CvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAqBtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}
@@ -0,0 +1,126 @@
1
+ import { readFileSync, statSync, existsSync } from "node:fs";
2
+ /**
3
+ * Monitor a JSONL session file for new messages
4
+ */
5
+ export class SessionMonitor {
6
+ sessionId;
7
+ options;
8
+ lastOffset = 0;
9
+ lastMtime = 0;
10
+ pollTimer = null;
11
+ monitoring = false;
12
+ constructor(sessionId, options) {
13
+ this.sessionId = sessionId;
14
+ this.options = options;
15
+ }
16
+ /**
17
+ * Check if the monitor is currently active
18
+ */
19
+ get isMonitoring() {
20
+ return this.monitoring;
21
+ }
22
+ /**
23
+ * Start monitoring the session file
24
+ */
25
+ start() {
26
+ if (this.monitoring) {
27
+ return;
28
+ }
29
+ this.monitoring = true;
30
+ this.pollTimer = setInterval(() => this.checkForUpdates(), this.options.pollIntervalMs ?? 1000);
31
+ // Initial check
32
+ this.checkForUpdates();
33
+ }
34
+ /**
35
+ * Stop monitoring the session file
36
+ */
37
+ stop() {
38
+ if (this.pollTimer) {
39
+ clearInterval(this.pollTimer);
40
+ this.pollTimer = null;
41
+ }
42
+ this.monitoring = false;
43
+ }
44
+ /**
45
+ * Check for new content in the session file
46
+ */
47
+ checkForUpdates() {
48
+ const { sessionPath } = this.options;
49
+ if (!existsSync(sessionPath)) {
50
+ return;
51
+ }
52
+ try {
53
+ const stat = statSync(sessionPath);
54
+ // Skip if file hasn't changed
55
+ if (stat.mtimeMs === this.lastMtime && stat.size <= this.lastOffset) {
56
+ return;
57
+ }
58
+ this.lastMtime = stat.mtimeMs;
59
+ // Read only the new content
60
+ const content = readFileSync(sessionPath, "utf-8");
61
+ const newContent = content.slice(this.lastOffset);
62
+ this.lastOffset = content.length;
63
+ if (!newContent.trim()) {
64
+ return;
65
+ }
66
+ // Parse JSONL lines
67
+ const lines = newContent.split("\n").filter((line) => line.trim());
68
+ for (const line of lines) {
69
+ try {
70
+ const msg = JSON.parse(line);
71
+ this.processMessage(msg);
72
+ }
73
+ catch {
74
+ // Skip invalid JSON lines
75
+ }
76
+ }
77
+ }
78
+ catch (err) {
79
+ // File might be temporarily unavailable
80
+ }
81
+ }
82
+ /**
83
+ * Process a parsed JSONL message
84
+ */
85
+ processMessage(msg) {
86
+ if (msg.type !== "message" || !msg.role || !msg.message) {
87
+ return;
88
+ }
89
+ const content = this.extractContent(msg.message);
90
+ if (!content) {
91
+ return;
92
+ }
93
+ const event = {
94
+ type: "message",
95
+ sessionId: this.sessionId,
96
+ role: msg.role,
97
+ content,
98
+ timestamp: msg.timestamp ? new Date(msg.timestamp).getTime() : Date.now(),
99
+ };
100
+ this.options.onEvent(event);
101
+ }
102
+ /**
103
+ * Extract text content from a message
104
+ */
105
+ extractContent(message) {
106
+ if (!message?.content) {
107
+ return null;
108
+ }
109
+ if (typeof message.content === "string") {
110
+ return message.content;
111
+ }
112
+ // Handle array of content blocks
113
+ const textParts = message.content
114
+ .filter((block) => block.type === "text" && block.text)
115
+ .map((block) => block.text);
116
+ return textParts.length > 0 ? textParts.join("\n") : null;
117
+ }
118
+ /**
119
+ * Reset the read position (useful for reprocessing)
120
+ */
121
+ reset() {
122
+ this.lastOffset = 0;
123
+ this.lastMtime = 0;
124
+ }
125
+ }
126
+ //# sourceMappingURL=session-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-monitor.js","sourceRoot":"","sources":["../../src/sync/session-monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { FileChangeEvent } from "../types.js";
2
+ export type FileWatcherOptions = {
3
+ /** Debounce delay in milliseconds */
4
+ debounceMs: number;
5
+ /** Glob patterns to match (relative to root) */
6
+ patterns: string[];
7
+ /** Callback for file events */
8
+ onEvent: (event: FileChangeEvent) => void;
9
+ /** Ignored patterns */
10
+ ignored?: string[];
11
+ };
12
+ /**
13
+ * File watcher using chokidar with debouncing
14
+ */
15
+ export declare class FileWatcher {
16
+ private readonly rootDir;
17
+ private readonly options;
18
+ private watcher;
19
+ private debounceTimers;
20
+ private pendingEvents;
21
+ private watching;
22
+ constructor(rootDir: string, options: FileWatcherOptions);
23
+ /**
24
+ * Check if the watcher is currently active
25
+ */
26
+ get isWatching(): boolean;
27
+ /**
28
+ * Start watching for file changes
29
+ */
30
+ start(): Promise<void>;
31
+ /**
32
+ * Stop watching for file changes
33
+ */
34
+ stop(): Promise<void>;
35
+ /**
36
+ * Check if a path matches any of the watch patterns
37
+ */
38
+ private matchesPatterns;
39
+ /**
40
+ * Handle a file event with debouncing
41
+ */
42
+ private handleEvent;
43
+ }
44
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,+BAA+B;IAC/B,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1C,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,qBAAa,WAAW;IAOpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,QAAQ,CAAS;gBAGN,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,kBAAkB;IAG9C;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,WAAW;CAqCpB"}
@@ -0,0 +1,110 @@
1
+ import { watch } from "chokidar";
2
+ import { relative } from "node:path";
3
+ import { minimatch } from "./minimatch.js";
4
+ /**
5
+ * File watcher using chokidar with debouncing
6
+ */
7
+ export class FileWatcher {
8
+ rootDir;
9
+ options;
10
+ watcher = null;
11
+ debounceTimers = new Map();
12
+ pendingEvents = new Map();
13
+ watching = false;
14
+ constructor(rootDir, options) {
15
+ this.rootDir = rootDir;
16
+ this.options = options;
17
+ }
18
+ /**
19
+ * Check if the watcher is currently active
20
+ */
21
+ get isWatching() {
22
+ return this.watching;
23
+ }
24
+ /**
25
+ * Start watching for file changes
26
+ */
27
+ async start() {
28
+ if (this.watcher) {
29
+ return;
30
+ }
31
+ // Watch the root directory, filter by patterns in event handler
32
+ this.watcher = watch(this.rootDir, {
33
+ persistent: true,
34
+ ignoreInitial: true,
35
+ ignored: this.options.ignored,
36
+ depth: 99,
37
+ });
38
+ this.watcher.on("add", (path) => this.handleEvent("add", path));
39
+ this.watcher.on("change", (path) => this.handleEvent("change", path));
40
+ this.watcher.on("unlink", (path) => this.handleEvent("unlink", path));
41
+ // Wait for initial scan to complete
42
+ await new Promise((resolve) => {
43
+ this.watcher.on("ready", () => {
44
+ this.watching = true;
45
+ resolve();
46
+ });
47
+ });
48
+ }
49
+ /**
50
+ * Stop watching for file changes
51
+ */
52
+ async stop() {
53
+ if (!this.watcher) {
54
+ return;
55
+ }
56
+ // Clear all pending timers
57
+ for (const timer of this.debounceTimers.values()) {
58
+ clearTimeout(timer);
59
+ }
60
+ this.debounceTimers.clear();
61
+ this.pendingEvents.clear();
62
+ await this.watcher.close();
63
+ this.watcher = null;
64
+ this.watching = false;
65
+ }
66
+ /**
67
+ * Check if a path matches any of the watch patterns
68
+ */
69
+ matchesPatterns(relPath) {
70
+ return this.options.patterns.some((pattern) => minimatch(relPath, pattern));
71
+ }
72
+ /**
73
+ * Handle a file event with debouncing
74
+ */
75
+ handleEvent(type, absPath) {
76
+ const relPath = relative(this.rootDir, absPath);
77
+ // Filter by glob patterns
78
+ if (!this.matchesPatterns(relPath)) {
79
+ return;
80
+ }
81
+ // Clear existing timer for this path
82
+ const existingTimer = this.debounceTimers.get(relPath);
83
+ if (existingTimer) {
84
+ clearTimeout(existingTimer);
85
+ }
86
+ // Update pending event type (unlink takes precedence, then change, then add)
87
+ const currentPending = this.pendingEvents.get(relPath);
88
+ if (type === "unlink" || !currentPending) {
89
+ this.pendingEvents.set(relPath, type);
90
+ }
91
+ else if (type === "change" && currentPending === "add") {
92
+ // Keep add if we get a change right after
93
+ this.pendingEvents.set(relPath, "add");
94
+ }
95
+ else {
96
+ this.pendingEvents.set(relPath, type);
97
+ }
98
+ // Set new debounce timer
99
+ const timer = setTimeout(() => {
100
+ const eventType = this.pendingEvents.get(relPath);
101
+ if (eventType) {
102
+ this.pendingEvents.delete(relPath);
103
+ this.debounceTimers.delete(relPath);
104
+ this.options.onEvent({ type: eventType, path: relPath });
105
+ }
106
+ }, this.options.debounceMs);
107
+ this.debounceTimers.set(relPath, timer);
108
+ }
109
+ }
110
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { memorySearch, createMemorySearchToolDef } from "./memory-search.js";
2
+ export { memoryGet, createMemoryGetToolDef } from "./memory-get.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { memorySearch, createMemorySearchToolDef } from "./memory-search.js";
2
+ export { memoryGet, createMemoryGetToolDef } from "./memory-get.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { MemoryGetParams, MemoryGetResponse } from "../types.js";
2
+ import type { MemoryManager } from "../memory-manager.js";
3
+ /**
4
+ * Memory get tool function
5
+ */
6
+ export declare function memoryGet(manager: MemoryManager, params: MemoryGetParams): Promise<MemoryGetResponse>;
7
+ /**
8
+ * Create a memory get tool definition
9
+ */
10
+ export declare function createMemoryGetToolDef(): {
11
+ name: string;
12
+ description: string;
13
+ inputSchema: {
14
+ type: "object";
15
+ properties: {
16
+ path: {
17
+ type: string;
18
+ description: string;
19
+ };
20
+ from: {
21
+ type: string;
22
+ description: string;
23
+ };
24
+ lines: {
25
+ type: string;
26
+ description: string;
27
+ };
28
+ };
29
+ required: string[];
30
+ };
31
+ };
32
+ //# sourceMappingURL=memory-get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-get.d.ts","sourceRoot":"","sources":["../../src/tools/memory-get.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAqB5B;AAED;;GAEG;AACH,wBAAgB,sBAAsB;;;;;;;;;;;;;;;;;;;;;EAwBrC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Memory get tool function
3
+ */
4
+ export async function memoryGet(manager, params) {
5
+ try {
6
+ const result = await manager.readFile({
7
+ relPath: params.path,
8
+ from: params.from,
9
+ lines: params.lines,
10
+ });
11
+ return {
12
+ success: true,
13
+ content: result.content,
14
+ path: params.path,
15
+ startLine: result.startLine,
16
+ endLine: result.endLine,
17
+ };
18
+ }
19
+ catch (err) {
20
+ return {
21
+ success: false,
22
+ error: err instanceof Error ? err.message : String(err),
23
+ };
24
+ }
25
+ }
26
+ /**
27
+ * Create a memory get tool definition
28
+ */
29
+ export function createMemoryGetToolDef() {
30
+ return {
31
+ name: "memory_get",
32
+ description: "Read content from a specific file in the agent's memory. Use after memory_search to retrieve full context.",
33
+ inputSchema: {
34
+ type: "object",
35
+ properties: {
36
+ path: {
37
+ type: "string",
38
+ description: "Relative path to the memory file",
39
+ },
40
+ from: {
41
+ type: "number",
42
+ description: "Starting line number (1-indexed, default: 1)",
43
+ },
44
+ lines: {
45
+ type: "number",
46
+ description: "Number of lines to read (default: entire file)",
47
+ },
48
+ },
49
+ required: ["path"],
50
+ },
51
+ };
52
+ }
53
+ //# sourceMappingURL=memory-get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-get.js","sourceRoot":"","sources":["../../src/tools/memory-get.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAsB,EACtB,MAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC;YACpC,OAAO,EAAE,MAAM,CAAC,IAAI;YACpB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,4GAA4G;QAC9G,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kCAAkC;iBAChD;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8CAA8C;iBAC5D;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gDAAgD;iBAC9D;aACF;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { MemorySearchParams, MemorySearchResponse } from "../types.js";
2
+ import type { MemoryManager } from "../memory-manager.js";
3
+ /**
4
+ * Memory search tool function
5
+ */
6
+ export declare function memorySearch(manager: MemoryManager, params: MemorySearchParams): Promise<MemorySearchResponse>;
7
+ /**
8
+ * Create a memory search tool definition
9
+ */
10
+ export declare function createMemorySearchToolDef(): {
11
+ name: string;
12
+ description: string;
13
+ inputSchema: {
14
+ type: "object";
15
+ properties: {
16
+ query: {
17
+ type: string;
18
+ description: string;
19
+ };
20
+ maxResults: {
21
+ type: string;
22
+ description: string;
23
+ };
24
+ minScore: {
25
+ type: string;
26
+ description: string;
27
+ };
28
+ };
29
+ required: string[];
30
+ };
31
+ };
32
+ //# sourceMappingURL=memory-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-search.d.ts","sourceRoot":"","sources":["../../src/tools/memory-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,oBAAoB,CAAC,CAyB/B;AAED;;GAEG;AACH,wBAAgB,yBAAyB;;;;;;;;;;;;;;;;;;;;;EAwBxC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Memory search tool function
3
+ */
4
+ export async function memorySearch(manager, params) {
5
+ try {
6
+ const results = await manager.search(params.query, {
7
+ maxResults: params.maxResults,
8
+ minScore: params.minScore,
9
+ });
10
+ const providerInfo = manager.getProviderInfo();
11
+ return {
12
+ success: true,
13
+ results,
14
+ meta: {
15
+ provider: providerInfo.provider,
16
+ model: providerInfo.model,
17
+ fallbackFrom: providerInfo.fallbackFrom,
18
+ fallbackReason: providerInfo.fallbackReason,
19
+ },
20
+ };
21
+ }
22
+ catch (err) {
23
+ return {
24
+ success: false,
25
+ error: err instanceof Error ? err.message : String(err),
26
+ };
27
+ }
28
+ }
29
+ /**
30
+ * Create a memory search tool definition
31
+ */
32
+ export function createMemorySearchToolDef() {
33
+ return {
34
+ name: "memory_search",
35
+ description: "Search the agent's memory for relevant information. Returns snippets from indexed markdown files.",
36
+ inputSchema: {
37
+ type: "object",
38
+ properties: {
39
+ query: {
40
+ type: "string",
41
+ description: "The search query",
42
+ },
43
+ maxResults: {
44
+ type: "number",
45
+ description: "Maximum number of results to return (default: 10)",
46
+ },
47
+ minScore: {
48
+ type: "number",
49
+ description: "Minimum relevance score threshold (0-1, default: 0.35)",
50
+ },
51
+ },
52
+ required: ["query"],
53
+ },
54
+ };
55
+ }
56
+ //# sourceMappingURL=memory-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-search.js","sourceRoot":"","sources":["../../src/tools/memory-search.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAsB,EACtB,MAA0B;IAE1B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;YACjD,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAE/C,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO;YACP,IAAI,EAAE;gBACJ,QAAQ,EAAE,YAAY,CAAC,QAAQ;gBAC/B,KAAK,EAAE,YAAY,CAAC,KAAK;gBACzB,YAAY,EAAE,YAAY,CAAC,YAAY;gBACvC,cAAc,EAAE,YAAY,CAAC,cAAc;aAC5C;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,mGAAmG;QACrG,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kBAAkB;iBAChC;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,mDAAmD;iBACjE;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,wDAAwD;iBACtE;aACF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF,CAAC;AACJ,CAAC"}