@aitytech/agentkits-memory 1.0.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 (116) hide show
  1. package/README.md +250 -0
  2. package/dist/cache-manager.d.ts +134 -0
  3. package/dist/cache-manager.d.ts.map +1 -0
  4. package/dist/cache-manager.js +407 -0
  5. package/dist/cache-manager.js.map +1 -0
  6. package/dist/cli/save.d.ts +20 -0
  7. package/dist/cli/save.d.ts.map +1 -0
  8. package/dist/cli/save.js +94 -0
  9. package/dist/cli/save.js.map +1 -0
  10. package/dist/cli/setup.d.ts +18 -0
  11. package/dist/cli/setup.d.ts.map +1 -0
  12. package/dist/cli/setup.js +163 -0
  13. package/dist/cli/setup.js.map +1 -0
  14. package/dist/cli/viewer.d.ts +21 -0
  15. package/dist/cli/viewer.d.ts.map +1 -0
  16. package/dist/cli/viewer.js +182 -0
  17. package/dist/cli/viewer.js.map +1 -0
  18. package/dist/hnsw-index.d.ts +111 -0
  19. package/dist/hnsw-index.d.ts.map +1 -0
  20. package/dist/hnsw-index.js +781 -0
  21. package/dist/hnsw-index.js.map +1 -0
  22. package/dist/hooks/cli.d.ts +20 -0
  23. package/dist/hooks/cli.d.ts.map +1 -0
  24. package/dist/hooks/cli.js +102 -0
  25. package/dist/hooks/cli.js.map +1 -0
  26. package/dist/hooks/context.d.ts +31 -0
  27. package/dist/hooks/context.d.ts.map +1 -0
  28. package/dist/hooks/context.js +64 -0
  29. package/dist/hooks/context.js.map +1 -0
  30. package/dist/hooks/index.d.ts +16 -0
  31. package/dist/hooks/index.d.ts.map +1 -0
  32. package/dist/hooks/index.js +20 -0
  33. package/dist/hooks/index.js.map +1 -0
  34. package/dist/hooks/observation.d.ts +30 -0
  35. package/dist/hooks/observation.d.ts.map +1 -0
  36. package/dist/hooks/observation.js +79 -0
  37. package/dist/hooks/observation.js.map +1 -0
  38. package/dist/hooks/service.d.ts +102 -0
  39. package/dist/hooks/service.d.ts.map +1 -0
  40. package/dist/hooks/service.js +454 -0
  41. package/dist/hooks/service.js.map +1 -0
  42. package/dist/hooks/session-init.d.ts +30 -0
  43. package/dist/hooks/session-init.d.ts.map +1 -0
  44. package/dist/hooks/session-init.js +54 -0
  45. package/dist/hooks/session-init.js.map +1 -0
  46. package/dist/hooks/summarize.d.ts +30 -0
  47. package/dist/hooks/summarize.d.ts.map +1 -0
  48. package/dist/hooks/summarize.js +74 -0
  49. package/dist/hooks/summarize.js.map +1 -0
  50. package/dist/hooks/types.d.ts +193 -0
  51. package/dist/hooks/types.d.ts.map +1 -0
  52. package/dist/hooks/types.js +137 -0
  53. package/dist/hooks/types.js.map +1 -0
  54. package/dist/index.d.ts +173 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +564 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/mcp/index.d.ts +9 -0
  59. package/dist/mcp/index.d.ts.map +1 -0
  60. package/dist/mcp/index.js +9 -0
  61. package/dist/mcp/index.js.map +1 -0
  62. package/dist/mcp/server.d.ts +22 -0
  63. package/dist/mcp/server.d.ts.map +1 -0
  64. package/dist/mcp/server.js +368 -0
  65. package/dist/mcp/server.js.map +1 -0
  66. package/dist/mcp/tools.d.ts +14 -0
  67. package/dist/mcp/tools.d.ts.map +1 -0
  68. package/dist/mcp/tools.js +110 -0
  69. package/dist/mcp/tools.js.map +1 -0
  70. package/dist/mcp/types.d.ts +100 -0
  71. package/dist/mcp/types.d.ts.map +1 -0
  72. package/dist/mcp/types.js +9 -0
  73. package/dist/mcp/types.js.map +1 -0
  74. package/dist/migration.d.ts +77 -0
  75. package/dist/migration.d.ts.map +1 -0
  76. package/dist/migration.js +457 -0
  77. package/dist/migration.js.map +1 -0
  78. package/dist/sqljs-backend.d.ts +128 -0
  79. package/dist/sqljs-backend.d.ts.map +1 -0
  80. package/dist/sqljs-backend.js +623 -0
  81. package/dist/sqljs-backend.js.map +1 -0
  82. package/dist/types.d.ts +481 -0
  83. package/dist/types.d.ts.map +1 -0
  84. package/dist/types.js +73 -0
  85. package/dist/types.js.map +1 -0
  86. package/hooks.json +46 -0
  87. package/package.json +67 -0
  88. package/src/__tests__/index.test.ts +407 -0
  89. package/src/__tests__/sqljs-backend.test.ts +410 -0
  90. package/src/cache-manager.ts +515 -0
  91. package/src/cli/save.ts +109 -0
  92. package/src/cli/setup.ts +203 -0
  93. package/src/cli/viewer.ts +218 -0
  94. package/src/hnsw-index.ts +1013 -0
  95. package/src/hooks/__tests__/handlers.test.ts +298 -0
  96. package/src/hooks/__tests__/integration.test.ts +431 -0
  97. package/src/hooks/__tests__/service.test.ts +487 -0
  98. package/src/hooks/__tests__/types.test.ts +341 -0
  99. package/src/hooks/cli.ts +121 -0
  100. package/src/hooks/context.ts +77 -0
  101. package/src/hooks/index.ts +23 -0
  102. package/src/hooks/observation.ts +102 -0
  103. package/src/hooks/service.ts +582 -0
  104. package/src/hooks/session-init.ts +70 -0
  105. package/src/hooks/summarize.ts +89 -0
  106. package/src/hooks/types.ts +365 -0
  107. package/src/index.ts +755 -0
  108. package/src/mcp/__tests__/server.test.ts +181 -0
  109. package/src/mcp/index.ts +9 -0
  110. package/src/mcp/server.ts +441 -0
  111. package/src/mcp/tools.ts +113 -0
  112. package/src/mcp/types.ts +109 -0
  113. package/src/migration.ts +574 -0
  114. package/src/sql.js.d.ts +70 -0
  115. package/src/sqljs-backend.ts +789 -0
  116. package/src/types.ts +715 -0
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Hook Types for AgentKits Memory
3
+ *
4
+ * Lightweight hook system for auto-capturing Claude Code sessions.
5
+ * Based on claude-mem patterns but simplified for project-scoped storage.
6
+ *
7
+ * @module @agentkits/memory/hooks/types
8
+ */
9
+ /**
10
+ * Raw input from Claude Code hooks (via stdin JSON)
11
+ */
12
+ export interface ClaudeCodeHookInput {
13
+ /** Claude's session ID */
14
+ session_id?: string;
15
+ /** Current working directory */
16
+ cwd?: string;
17
+ /** User's prompt (UserPromptSubmit) */
18
+ prompt?: string;
19
+ /** Tool name (PostToolUse) */
20
+ tool_name?: string;
21
+ /** Tool input parameters (PostToolUse) */
22
+ tool_input?: unknown;
23
+ /** Tool response/output (PostToolUse) */
24
+ tool_result?: unknown;
25
+ /** Path to conversation transcript (Stop) */
26
+ transcript_path?: string;
27
+ /** Stop reason (Stop) */
28
+ stop_reason?: string;
29
+ }
30
+ /**
31
+ * Normalized hook input for handlers
32
+ */
33
+ export interface NormalizedHookInput {
34
+ /** Session ID */
35
+ sessionId: string;
36
+ /** Project directory */
37
+ cwd: string;
38
+ /** Project name (derived from cwd) */
39
+ project: string;
40
+ /** User's prompt */
41
+ prompt?: string;
42
+ /** Tool name */
43
+ toolName?: string;
44
+ /** Tool input */
45
+ toolInput?: unknown;
46
+ /** Tool response */
47
+ toolResponse?: unknown;
48
+ /** Transcript path */
49
+ transcriptPath?: string;
50
+ /** Stop reason */
51
+ stopReason?: string;
52
+ /** Timestamp */
53
+ timestamp: number;
54
+ }
55
+ /**
56
+ * Hook execution result
57
+ */
58
+ export interface HookResult {
59
+ /** Continue processing (always true for us) */
60
+ continue: boolean;
61
+ /** Suppress output to Claude */
62
+ suppressOutput: boolean;
63
+ /** Additional context to inject (SessionStart only) */
64
+ additionalContext?: string;
65
+ /** Error message if failed */
66
+ error?: string;
67
+ }
68
+ /**
69
+ * Hook-specific output for Claude Code
70
+ */
71
+ export interface HookSpecificOutput {
72
+ hookEventName: string;
73
+ additionalContext?: string;
74
+ }
75
+ /**
76
+ * Full hook response for Claude Code
77
+ */
78
+ export interface ClaudeCodeHookResponse {
79
+ continue?: boolean;
80
+ suppressOutput?: boolean;
81
+ hookSpecificOutput?: HookSpecificOutput;
82
+ }
83
+ /**
84
+ * Hook event types
85
+ */
86
+ export type HookEventType = 'context' | 'session-init' | 'observation' | 'summarize';
87
+ /**
88
+ * Event handler interface
89
+ */
90
+ export interface EventHandler {
91
+ /** Execute the hook handler */
92
+ execute(input: NormalizedHookInput): Promise<HookResult>;
93
+ }
94
+ /**
95
+ * Captured observation from tool usage
96
+ */
97
+ export interface Observation {
98
+ /** Unique ID */
99
+ id: string;
100
+ /** Session ID */
101
+ sessionId: string;
102
+ /** Project name */
103
+ project: string;
104
+ /** Tool name */
105
+ toolName: string;
106
+ /** Tool input (JSON) */
107
+ toolInput: string;
108
+ /** Tool response (JSON, truncated) */
109
+ toolResponse: string;
110
+ /** Working directory */
111
+ cwd: string;
112
+ /** Timestamp */
113
+ timestamp: number;
114
+ /** Observation type */
115
+ type: ObservationType;
116
+ /** Brief title (auto-generated) */
117
+ title?: string;
118
+ }
119
+ /**
120
+ * Observation types based on tool usage
121
+ */
122
+ export type ObservationType = 'read' | 'write' | 'execute' | 'search' | 'other';
123
+ /**
124
+ * Session record for tracking
125
+ */
126
+ export interface SessionRecord {
127
+ /** Database ID */
128
+ id: number;
129
+ /** Claude's session ID */
130
+ sessionId: string;
131
+ /** Project name */
132
+ project: string;
133
+ /** First user prompt */
134
+ prompt: string;
135
+ /** Session start time */
136
+ startedAt: number;
137
+ /** Session end time */
138
+ endedAt?: number;
139
+ /** Number of observations */
140
+ observationCount: number;
141
+ /** Auto-generated summary */
142
+ summary?: string;
143
+ /** Status */
144
+ status: 'active' | 'completed' | 'abandoned';
145
+ }
146
+ /**
147
+ * Context to inject on session start
148
+ */
149
+ export interface MemoryContext {
150
+ /** Recent observations */
151
+ recentObservations: Observation[];
152
+ /** Previous sessions */
153
+ previousSessions: SessionRecord[];
154
+ /** Project-specific patterns */
155
+ patterns?: string[];
156
+ /** Recent decisions */
157
+ decisions?: string[];
158
+ /** Formatted markdown */
159
+ markdown: string;
160
+ }
161
+ /**
162
+ * Generate observation ID
163
+ */
164
+ export declare function generateObservationId(): string;
165
+ /**
166
+ * Get project name from cwd
167
+ */
168
+ export declare function getProjectName(cwd: string): string;
169
+ /**
170
+ * Determine observation type from tool name
171
+ */
172
+ export declare function getObservationType(toolName: string): ObservationType;
173
+ /**
174
+ * Generate observation title from tool usage
175
+ */
176
+ export declare function generateObservationTitle(toolName: string, toolInput: unknown): string;
177
+ /**
178
+ * Truncate string to max length
179
+ */
180
+ export declare function truncate(str: string, maxLength?: number): string;
181
+ /**
182
+ * Standard hook response (continue, no output)
183
+ */
184
+ export declare const STANDARD_RESPONSE: ClaudeCodeHookResponse;
185
+ /**
186
+ * Format hook response for stdout
187
+ */
188
+ export declare function formatResponse(result: HookResult): string;
189
+ /**
190
+ * Parse stdin input from Claude Code
191
+ */
192
+ export declare function parseHookInput(stdin: string): NormalizedHookInput;
193
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hooks/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Hook Types for AgentKits Memory
3
+ *
4
+ * Lightweight hook system for auto-capturing Claude Code sessions.
5
+ * Based on claude-mem patterns but simplified for project-scoped storage.
6
+ *
7
+ * @module @agentkits/memory/hooks/types
8
+ */
9
+ // ===== Utility Functions =====
10
+ /**
11
+ * Generate observation ID
12
+ */
13
+ export function generateObservationId() {
14
+ const timestamp = Date.now().toString(36);
15
+ const random = Math.random().toString(36).substring(2, 6);
16
+ return `obs_${timestamp}_${random}`;
17
+ }
18
+ /**
19
+ * Get project name from cwd
20
+ */
21
+ export function getProjectName(cwd) {
22
+ const parts = cwd.split(/[/\\]/);
23
+ return parts[parts.length - 1] || 'unknown';
24
+ }
25
+ /**
26
+ * Determine observation type from tool name
27
+ */
28
+ export function getObservationType(toolName) {
29
+ const readTools = ['Read', 'Glob', 'Grep', 'LS'];
30
+ const writeTools = ['Write', 'Edit', 'NotebookEdit'];
31
+ const executeTools = ['Bash', 'Task', 'Skill'];
32
+ const searchTools = ['WebSearch', 'WebFetch'];
33
+ if (readTools.includes(toolName))
34
+ return 'read';
35
+ if (writeTools.includes(toolName))
36
+ return 'write';
37
+ if (executeTools.includes(toolName))
38
+ return 'execute';
39
+ if (searchTools.includes(toolName))
40
+ return 'search';
41
+ return 'other';
42
+ }
43
+ /**
44
+ * Generate observation title from tool usage
45
+ */
46
+ export function generateObservationTitle(toolName, toolInput) {
47
+ try {
48
+ const input = typeof toolInput === 'string' ? JSON.parse(toolInput) : toolInput;
49
+ switch (toolName) {
50
+ case 'Read':
51
+ return `Read ${input?.file_path || input?.path || 'file'}`;
52
+ case 'Write':
53
+ return `Write ${input?.file_path || input?.path || 'file'}`;
54
+ case 'Edit':
55
+ return `Edit ${input?.file_path || input?.path || 'file'}`;
56
+ case 'Bash':
57
+ const cmd = input?.command || '';
58
+ return `Run: ${cmd.substring(0, 50)}${cmd.length > 50 ? '...' : ''}`;
59
+ case 'Glob':
60
+ return `Find ${input?.pattern || 'files'}`;
61
+ case 'Grep':
62
+ return `Search "${input?.pattern || ''}"`;
63
+ case 'Task':
64
+ return `Task: ${input?.description || 'agent'}`;
65
+ case 'WebSearch':
66
+ return `Search: ${input?.query || ''}`;
67
+ case 'WebFetch':
68
+ return `Fetch: ${input?.url || ''}`;
69
+ default:
70
+ return `${toolName}`;
71
+ }
72
+ }
73
+ catch {
74
+ return toolName;
75
+ }
76
+ }
77
+ /**
78
+ * Truncate string to max length
79
+ */
80
+ export function truncate(str, maxLength = 1000) {
81
+ if (str.length <= maxLength)
82
+ return str;
83
+ return str.substring(0, maxLength) + '...[truncated]';
84
+ }
85
+ /**
86
+ * Standard hook response (continue, no output)
87
+ */
88
+ export const STANDARD_RESPONSE = {
89
+ continue: true,
90
+ suppressOutput: true,
91
+ };
92
+ /**
93
+ * Format hook response for stdout
94
+ */
95
+ export function formatResponse(result) {
96
+ if (result.additionalContext) {
97
+ return JSON.stringify({
98
+ hookSpecificOutput: {
99
+ hookEventName: 'SessionStart',
100
+ additionalContext: result.additionalContext,
101
+ },
102
+ });
103
+ }
104
+ return JSON.stringify(STANDARD_RESPONSE);
105
+ }
106
+ /**
107
+ * Parse stdin input from Claude Code
108
+ */
109
+ export function parseHookInput(stdin) {
110
+ try {
111
+ const raw = JSON.parse(stdin);
112
+ const cwd = raw.cwd || process.cwd();
113
+ return {
114
+ sessionId: raw.session_id || `session_${Date.now()}`,
115
+ cwd,
116
+ project: getProjectName(cwd),
117
+ prompt: raw.prompt,
118
+ toolName: raw.tool_name,
119
+ toolInput: raw.tool_input,
120
+ toolResponse: raw.tool_result,
121
+ transcriptPath: raw.transcript_path,
122
+ stopReason: raw.stop_reason,
123
+ timestamp: Date.now(),
124
+ };
125
+ }
126
+ catch {
127
+ // Fallback for empty or invalid input
128
+ const cwd = process.cwd();
129
+ return {
130
+ sessionId: `session_${Date.now()}`,
131
+ cwd,
132
+ project: getProjectName(cwd),
133
+ timestamp: Date.now(),
134
+ };
135
+ }
136
+ }
137
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/hooks/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * @agentkits/memory - Project-Scoped Memory System
3
+ *
4
+ * Provides persistent memory for Claude Code sessions within a project.
5
+ * Stores data in .claude/memory/memory.db using SQLite with optional
6
+ * HNSW vector indexing for semantic search.
7
+ *
8
+ * @module @agentkits/memory
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { ProjectMemoryService } from '@agentkits/memory';
13
+ *
14
+ * // Initialize memory for current project
15
+ * const memory = new ProjectMemoryService('.claude/memory');
16
+ * await memory.initialize();
17
+ *
18
+ * // Store an entry
19
+ * await memory.store({
20
+ * key: 'auth-pattern',
21
+ * content: 'Use JWT with refresh tokens for authentication',
22
+ * namespace: 'patterns',
23
+ * tags: ['auth', 'security'],
24
+ * });
25
+ *
26
+ * // Query entries
27
+ * const patterns = await memory.query({
28
+ * type: 'hybrid',
29
+ * namespace: 'patterns',
30
+ * tags: ['auth'],
31
+ * limit: 10,
32
+ * });
33
+ *
34
+ * // Semantic search (if embeddings enabled)
35
+ * const similar = await memory.semanticSearch('how to authenticate users', 5);
36
+ *
37
+ * // Session management
38
+ * await memory.startSession();
39
+ * await memory.checkpoint('Completed authentication setup');
40
+ * await memory.endSession('Successfully implemented auth');
41
+ * ```
42
+ */
43
+ import { EventEmitter } from 'node:events';
44
+ import { IMemoryBackend, MemoryEntry, MemoryEntryInput, MemoryEntryUpdate, MemoryQuery, SearchResult, SearchOptions, BackendStats, HealthCheckResult, EmbeddingGenerator, SessionInfo, MigrationResult } from './types.js';
45
+ export * from './types.js';
46
+ export { SqlJsBackend } from './sqljs-backend.js';
47
+ export { CacheManager, TieredCacheManager } from './cache-manager.js';
48
+ export { HNSWIndex } from './hnsw-index.js';
49
+ export { MemoryMigrator, migrateMarkdownMemory } from './migration.js';
50
+ /**
51
+ * Configuration for ProjectMemoryService
52
+ */
53
+ export interface ProjectMemoryConfig {
54
+ /** Base directory for memory storage (default: .claude/memory) */
55
+ baseDir: string;
56
+ /** Database filename (default: memory.db) */
57
+ dbFilename: string;
58
+ /** Enable HNSW vector indexing */
59
+ enableVectorIndex: boolean;
60
+ /** Vector dimensions for embeddings (default: 384 for local models) */
61
+ dimensions: number;
62
+ /** Embedding generator function (optional) */
63
+ embeddingGenerator?: EmbeddingGenerator;
64
+ /** Enable caching */
65
+ cacheEnabled: boolean;
66
+ /** Cache size (number of entries) */
67
+ cacheSize: number;
68
+ /** Cache TTL in milliseconds */
69
+ cacheTtl: number;
70
+ /** Auto-persist interval in milliseconds */
71
+ autoPersistInterval: number;
72
+ /** Maximum entries before cleanup */
73
+ maxEntries: number;
74
+ /** Enable verbose logging */
75
+ verbose: boolean;
76
+ }
77
+ /**
78
+ * Project-Scoped Memory Service
79
+ *
80
+ * High-level interface for project memory that provides:
81
+ * - Persistent storage in .claude/memory/memory.db
82
+ * - Session tracking and checkpoints
83
+ * - Optional semantic search with HNSW indexing
84
+ * - Migration from existing markdown files
85
+ * - Backward-compatible markdown exports
86
+ */
87
+ export declare class ProjectMemoryService extends EventEmitter implements IMemoryBackend {
88
+ private config;
89
+ private backend;
90
+ private cache;
91
+ private vectorIndex;
92
+ private initialized;
93
+ private currentSession;
94
+ constructor(baseDirOrConfig?: string | Partial<ProjectMemoryConfig>);
95
+ initialize(): Promise<void>;
96
+ shutdown(): Promise<void>;
97
+ store(entry: MemoryEntry): Promise<void>;
98
+ get(id: string): Promise<MemoryEntry | null>;
99
+ getByKey(namespace: string, key: string): Promise<MemoryEntry | null>;
100
+ update(id: string, update: MemoryEntryUpdate): Promise<MemoryEntry | null>;
101
+ delete(id: string): Promise<boolean>;
102
+ query(query: MemoryQuery): Promise<MemoryEntry[]>;
103
+ search(embedding: Float32Array, options: SearchOptions): Promise<SearchResult[]>;
104
+ bulkInsert(entries: MemoryEntry[]): Promise<void>;
105
+ bulkDelete(ids: string[]): Promise<number>;
106
+ count(namespace?: string): Promise<number>;
107
+ listNamespaces(): Promise<string[]>;
108
+ clearNamespace(namespace: string): Promise<number>;
109
+ getStats(): Promise<BackendStats>;
110
+ healthCheck(): Promise<HealthCheckResult>;
111
+ /**
112
+ * Store an entry from simple input
113
+ */
114
+ storeEntry(input: MemoryEntryInput): Promise<MemoryEntry>;
115
+ /**
116
+ * Semantic search by content string
117
+ */
118
+ semanticSearch(content: string, k?: number, threshold?: number): Promise<SearchResult[]>;
119
+ /**
120
+ * Get entries by namespace (convenience method)
121
+ */
122
+ getByNamespace(namespace: string, limit?: number): Promise<MemoryEntry[]>;
123
+ /**
124
+ * Get or create an entry
125
+ */
126
+ getOrCreate(namespace: string, key: string, creator: () => MemoryEntryInput | Promise<MemoryEntryInput>): Promise<MemoryEntry>;
127
+ /**
128
+ * Start a new session
129
+ */
130
+ startSession(): Promise<SessionInfo>;
131
+ /**
132
+ * Get current session
133
+ */
134
+ getCurrentSession(): SessionInfo | null;
135
+ /**
136
+ * Create a checkpoint in current session
137
+ */
138
+ checkpoint(description: string): Promise<void>;
139
+ /**
140
+ * End current session
141
+ */
142
+ endSession(summary?: string): Promise<SessionInfo | null>;
143
+ /**
144
+ * Get recent sessions
145
+ */
146
+ getRecentSessions(limit?: number): Promise<SessionInfo[]>;
147
+ /**
148
+ * Migrate from existing markdown memory files
149
+ */
150
+ migrateFromMarkdown(options?: {
151
+ generateEmbeddings?: boolean;
152
+ }): Promise<MigrationResult>;
153
+ /**
154
+ * Export namespace to markdown (for git-friendly backup)
155
+ */
156
+ exportToMarkdown(namespace: string, outputPath?: string): Promise<string>;
157
+ /**
158
+ * Export all namespaces to markdown
159
+ */
160
+ exportAllToMarkdown(): Promise<string[]>;
161
+ private ensureInitialized;
162
+ private rebuildVectorIndex;
163
+ }
164
+ /**
165
+ * Create a memory service for the current project
166
+ */
167
+ export declare function createProjectMemory(baseDir?: string, options?: Partial<ProjectMemoryConfig>): ProjectMemoryService;
168
+ /**
169
+ * Create a memory service with embedding support
170
+ */
171
+ export declare function createEmbeddingMemory(baseDir: string, embeddingGenerator: EmbeddingGenerator, dimensions?: number): ProjectMemoryService;
172
+ export default ProjectMemoryService;
173
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}