opencode-mem 2.0.1 → 2.2.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 (45) hide show
  1. package/README.md +54 -11
  2. package/dist/config.d.ts +5 -0
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +62 -6
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +18 -11
  7. package/dist/plugin.d.ts.map +1 -1
  8. package/dist/plugin.js +0 -4
  9. package/dist/services/ai/providers/anthropic-messages.d.ts.map +1 -1
  10. package/dist/services/ai/providers/anthropic-messages.js +11 -17
  11. package/dist/services/ai/providers/openai-chat-completion.d.ts.map +1 -1
  12. package/dist/services/ai/providers/openai-chat-completion.js +11 -17
  13. package/dist/services/ai/providers/openai-responses.d.ts.map +1 -1
  14. package/dist/services/ai/providers/openai-responses.js +11 -17
  15. package/dist/services/api-handlers.d.ts +4 -0
  16. package/dist/services/api-handlers.d.ts.map +1 -1
  17. package/dist/services/api-handlers.js +155 -1
  18. package/dist/services/auto-capture.js +2 -2
  19. package/dist/services/client.d.ts +1 -16
  20. package/dist/services/client.d.ts.map +1 -1
  21. package/dist/services/client.js +0 -35
  22. package/dist/services/context.d.ts +1 -7
  23. package/dist/services/context.d.ts.map +1 -1
  24. package/dist/services/context.js +6 -14
  25. package/dist/services/deduplication-service.d.ts.map +1 -1
  26. package/dist/services/deduplication-service.js +1 -3
  27. package/dist/services/logger.js +1 -1
  28. package/dist/services/user-memory-learning.d.ts.map +1 -1
  29. package/dist/services/user-memory-learning.js +122 -84
  30. package/dist/services/user-profile/profile-context.d.ts +2 -0
  31. package/dist/services/user-profile/profile-context.d.ts.map +1 -0
  32. package/dist/services/user-profile/profile-context.js +40 -0
  33. package/dist/services/user-profile/types.d.ts +51 -0
  34. package/dist/services/user-profile/types.d.ts.map +1 -0
  35. package/dist/services/user-profile/types.js +1 -0
  36. package/dist/services/user-profile/user-profile-manager.d.ts +22 -0
  37. package/dist/services/user-profile/user-profile-manager.d.ts.map +1 -0
  38. package/dist/services/user-profile/user-profile-manager.js +267 -0
  39. package/dist/services/web-server-worker.js +29 -1
  40. package/dist/types/index.d.ts +1 -3
  41. package/dist/types/index.d.ts.map +1 -1
  42. package/dist/web/app.js +249 -29
  43. package/dist/web/index.html +31 -5
  44. package/dist/web/styles.css +309 -0
  45. package/package.json +1 -1
package/README.md CHANGED
@@ -14,7 +14,7 @@ OpenCode Memory provides AI coding agents with the ability to remember and recal
14
14
  - **Dual Memory Scopes**: Separate user-level and project-level memory contexts
15
15
  - **Unified Timeline**: Browse memories and prompts together with linking support
16
16
  - **Prompt-Memory Linking**: Bidirectional links between prompts and generated memories
17
- - **User Learning System**: Analyzes user patterns and preferences from conversation history
17
+ - **User Profile System**: Structured learning with preferences, patterns, workflows, and skill assessment
18
18
  - **Web Interface**: Full-featured UI for memory management and search
19
19
  - **Auto-Capture System**: Intelligent prompt-based memory extraction
20
20
  - **Multi-Provider AI**: Support for OpenAI, Anthropic, and OpenAI-compatible APIs
@@ -52,15 +52,25 @@ bun run build
52
52
  ### Basic Usage
53
53
 
54
54
  ```typescript
55
- memory({ mode: "add", content: "User prefers TypeScript", scope: "user" })
56
- memory({ mode: "search", query: "coding preferences", scope: "user" })
55
+ memory({ mode: "add", content: "Project uses microservices", scope: "project" })
56
+ memory({ mode: "search", query: "architecture decisions", scope: "project" })
57
57
  memory({ mode: "profile" })
58
58
  ```
59
59
 
60
+ **Note**: User-scoped `add` is deprecated in v2.2+. Use profile system instead.
61
+
60
62
  ### Web Interface
61
63
 
62
64
  Access at `http://127.0.0.1:4747` to browse memories, view prompt-memory links, and manage your memory database.
63
65
 
66
+ **Project Memory Timeline:**
67
+
68
+ ![Project Memory Timeline](.github/screenshot-project-memory.png)
69
+
70
+ **User Profile Viewer:**
71
+
72
+ ![User Profile Viewer](.github/screenshot-user-profile.png)
73
+
64
74
  ### Configuration
65
75
 
66
76
  Configuration file: `~/.config/opencode/opencode-mem.jsonc`
@@ -75,10 +85,28 @@ Configuration file: `~/.config/opencode/opencode-mem.jsonc`
75
85
  "memoryProvider": "openai-chat",
76
86
  "memoryModel": "gpt-4",
77
87
  "memoryApiUrl": "https://api.openai.com/v1",
78
- "memoryApiKey": "sk-..."
88
+ "memoryApiKey": "sk-...",
89
+ "userMemoryAnalysisInterval": 10,
90
+ "userProfileMaxPreferences": 20,
91
+ "userProfileMaxPatterns": 15,
92
+ "userProfileMaxWorkflows": 10,
93
+ "userProfileConfidenceDecayDays": 30,
94
+ "userProfileChangelogRetentionCount": 5
79
95
  }
80
96
  ```
81
97
 
98
+ ## Breaking Changes (v2.2)
99
+
100
+ **User-scoped memories deprecated in favor of structured user profiles:**
101
+
102
+ - Removed: User-scoped `addMemory` (now returns error)
103
+ - Changed: `memory({ mode: "profile" })` returns new structure (preferences/patterns/workflows/skillLevel)
104
+ - Added: 5 new config options for profile management
105
+ - New behavior: User learning creates/updates structured profile instead of individual memories
106
+ - Migration: Existing user memories remain readable but new ones cannot be created
107
+
108
+ **Migration required**: Update code using `mode: "profile"` to handle new structure.
109
+
82
110
  ## Breaking Changes (v2.0)
83
111
 
84
112
  **Token-based auto-capture has been replaced with prompt-based system:**
@@ -98,6 +126,7 @@ For detailed documentation, see the [Wiki](https://github.com/tickernelz/opencod
98
126
  - [Installation Guide](https://github.com/tickernelz/opencode-mem/wiki/Installation-Guide)
99
127
  - [Quick Start](https://github.com/tickernelz/opencode-mem/wiki/Quick-Start)
100
128
  - [Configuration Guide](https://github.com/tickernelz/opencode-mem/wiki/Configuration-Guide)
129
+ - [User Profile System](https://github.com/tickernelz/opencode-mem/wiki/User-Profile)
101
130
  - [Memory Operations](https://github.com/tickernelz/opencode-mem/wiki/Memory-Operations)
102
131
  - [Auto-Capture System](https://github.com/tickernelz/opencode-mem/wiki/Auto-Capture-System)
103
132
  - [Web Interface](https://github.com/tickernelz/opencode-mem/wiki/Web-Interface)
@@ -121,18 +150,21 @@ Automatically extracts memories from conversations:
121
150
  3. Links memory to source prompt
122
151
  4. Skips non-technical conversations
123
152
 
124
- ### User Learning System
153
+ ### User Profile System
154
+
155
+ Builds structured user profile from conversation history (default: every 10 prompts):
125
156
 
126
- Analyzes batches of prompts to identify patterns (default: every 10 prompts):
157
+ - **Preferences**: Code style, communication style, tool preferences (with confidence scores)
158
+ - **Patterns**: Recurring topics, problem domains, technical interests (with frequency tracking)
159
+ - **Workflows**: Development sequences, habits, learning style
160
+ - **Skill Level**: Overall and per-domain assessment
127
161
 
128
- - Coding style preferences
129
- - Communication patterns
130
- - Tool preferences
131
- - Skill level indicators
162
+ Profile includes versioning, changelog, and confidence decay mechanism.
132
163
 
133
164
  ### Web Interface
134
165
 
135
166
  - Unified timeline of memories and prompts
167
+ - User profile viewer with changelog
136
168
  - Visual prompt-memory link indicators
137
169
  - Cascade delete for linked items
138
170
  - Bulk operations
@@ -144,7 +176,7 @@ Analyzes batches of prompts to identify patterns (default: every 10 prompts):
144
176
  ### Memory Tool
145
177
 
146
178
  ```typescript
147
- memory({ mode: "add", content: "...", scope: "user|project" })
179
+ memory({ mode: "add", content: "...", scope: "project" })
148
180
  memory({ mode: "search", query: "...", scope: "user|project" })
149
181
  memory({ mode: "list", scope: "user|project", limit: 10 })
150
182
  memory({ mode: "profile" })
@@ -154,14 +186,25 @@ memory({ mode: "auto-capture-stats" })
154
186
  memory({ mode: "capture-now" })
155
187
  ```
156
188
 
189
+ **Note**: `scope: "user"` for `add` mode is deprecated in v2.2+.
190
+
157
191
  ### REST API
158
192
 
193
+ **Memory & Prompt Management:**
159
194
  - `GET /api/memories?scope=project&includePrompts=true` - List memories/prompts
160
195
  - `POST /api/memories` - Create memory
161
196
  - `PUT /api/memories/:id` - Update memory
162
197
  - `DELETE /api/memories/:id?cascade=true` - Delete memory (and linked prompt)
163
198
  - `DELETE /api/prompts/:id?cascade=true` - Delete prompt (and linked memory)
164
199
  - `POST /api/search` - Vector search
200
+
201
+ **User Profile:**
202
+ - `GET /api/profile` - Get user profile
203
+ - `GET /api/profile/changelog?limit=5` - Get profile changelog
204
+ - `GET /api/profile/snapshot/:changelogId` - Get profile snapshot
205
+ - `POST /api/profile/refresh` - Force profile refresh
206
+
207
+ **Maintenance:**
165
208
  - `POST /api/cleanup` - Run cleanup
166
209
  - `POST /api/deduplicate` - Run deduplication
167
210
 
package/dist/config.d.ts CHANGED
@@ -28,6 +28,11 @@ export declare const CONFIG: {
28
28
  deduplicationEnabled: boolean;
29
29
  deduplicationSimilarityThreshold: number;
30
30
  userMemoryAnalysisInterval: number;
31
+ userProfileMaxPreferences: number;
32
+ userProfileMaxPatterns: number;
33
+ userProfileMaxWorkflows: number;
34
+ userProfileConfidenceDecayDays: number;
35
+ userProfileChangelogRetentionCount: number;
31
36
  };
32
37
  export declare function isConfigured(): boolean;
33
38
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAmTA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;oBAwBb,aAAa,GACb,kBAAkB,GAClB,WAAW;;;;;;;;;;;;;;CAiBhB,CAAC;AAEF,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AA2WA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;oBAwBb,aAAa,GACb,kBAAkB,GAClB,WAAW;;;;;;;;;;;;;;;;;;;CAyBhB,CAAC;AAEF,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
package/dist/config.js CHANGED
@@ -56,6 +56,11 @@ const DEFAULTS = {
56
56
  deduplicationEnabled: true,
57
57
  deduplicationSimilarityThreshold: 0.9,
58
58
  userMemoryAnalysisInterval: 10,
59
+ userProfileMaxPreferences: 20,
60
+ userProfileMaxPatterns: 15,
61
+ userProfileMaxWorkflows: 10,
62
+ userProfileConfidenceDecayDays: 30,
63
+ userProfileChangelogRetentionCount: 5,
59
64
  };
60
65
  function isValidRegex(pattern) {
61
66
  try {
@@ -121,18 +126,32 @@ const CONFIG_TEMPLATE = `{
121
126
  // Web Server Settings
122
127
  // ============================================
123
128
 
129
+ // Enable web UI for managing memories (accessible at http://localhost:4747)
124
130
  "webServerEnabled": true,
131
+
132
+ // Port for web UI server
125
133
  "webServerPort": 4747,
134
+
135
+ // Host address for web UI (use 127.0.0.1 for local only, 0.0.0.0 for network access)
126
136
  "webServerHost": "127.0.0.1",
127
137
 
128
138
  // ============================================
129
139
  // Database Settings
130
140
  // ============================================
131
141
 
142
+ // Maximum vectors per database shard (auto-creates new shard when limit reached)
132
143
  "maxVectorsPerShard": 50000,
144
+
145
+ // Automatically delete old memories based on retention period
133
146
  "autoCleanupEnabled": true,
147
+
148
+ // Days to keep memories before auto-cleanup (only if autoCleanupEnabled is true)
134
149
  "autoCleanupRetentionDays": 30,
150
+
151
+ // Automatically detect and remove duplicate memories
135
152
  "deduplicationEnabled": true,
153
+
154
+ // Similarity threshold (0-1) for detecting duplicates (higher = stricter)
136
155
  "deduplicationSimilarityThreshold": 0.90,
137
156
 
138
157
  // ============================================
@@ -178,37 +197,69 @@ const CONFIG_TEMPLATE = `{
178
197
  // "memoryApiUrl": "https://api.groq.com/openai/v1"
179
198
  // "memoryApiKey": "gsk_..."
180
199
 
181
- // Multi-iteration settings (for openai-responses and anthropic)
200
+ // Maximum iterations for multi-turn AI analysis (for openai-responses and anthropic)
182
201
  "autoCaptureMaxIterations": 5,
202
+
203
+ // Timeout per iteration in milliseconds (30 seconds default)
183
204
  "autoCaptureIterationTimeout": 30000,
184
205
 
185
- // Session management
206
+ // Days to keep AI session history before cleanup
186
207
  "aiSessionRetentionDays": 7,
187
208
 
188
209
  // ============================================
189
210
  // User Memory Learning
190
211
  // ============================================
191
212
 
192
- // Analyze user prompts every N prompts to learn patterns and preferences
213
+ // Analyze user prompts every N prompts to build/update your user profile
193
214
  // When N uncaptured prompts accumulate, AI will analyze them to identify:
194
- // - User preferences (code style, communication style)
195
- // - User patterns (recurring topics, problem domains)
196
- // - User workflows (development habits, sequences)
215
+ // - User preferences (code style, communication style, tool preferences)
216
+ // - User patterns (recurring topics, problem domains, technical interests)
217
+ // - User workflows (development habits, sequences, learning style)
218
+ // - Skill level (overall and per-domain assessment)
197
219
  "userMemoryAnalysisInterval": 10,
198
220
 
221
+ // Maximum number of preferences to keep in user profile (sorted by confidence)
222
+ // Preferences are things like "prefers code without comments", "likes concise responses"
223
+ "userProfileMaxPreferences": 20,
224
+
225
+ // Maximum number of patterns to keep in user profile (sorted by frequency)
226
+ // Patterns are recurring topics like "often asks about database optimization"
227
+ "userProfileMaxPatterns": 15,
228
+
229
+ // Maximum number of workflows to keep in user profile (sorted by frequency)
230
+ // Workflows are sequences like "usually asks for tests after implementation"
231
+ "userProfileMaxWorkflows": 10,
232
+
233
+ // Days before preference confidence starts to decay (if not reinforced)
234
+ // Preferences that aren't seen again will gradually lose confidence and be removed
235
+ "userProfileConfidenceDecayDays": 30,
236
+
237
+ // Number of profile versions to keep in changelog (for rollback/debugging)
238
+ // Older versions are automatically cleaned up
239
+ "userProfileChangelogRetentionCount": 5,
240
+
199
241
  // ============================================
200
242
  // Search Settings
201
243
  // ============================================
202
244
 
245
+ // Minimum similarity score (0-1) for memory search results
203
246
  "similarityThreshold": 0.6,
247
+
248
+ // Maximum number of user-scoped memories to return in search
204
249
  "maxMemories": 5,
250
+
251
+ // Maximum number of project-scoped memories to return in search
205
252
  "maxProjectMemories": 10,
206
253
 
207
254
  // ============================================
208
255
  // Advanced Settings
209
256
  // ============================================
210
257
 
258
+ // Inject user profile into AI context (preferences, patterns, workflows)
211
259
  "injectProfile": true,
260
+
261
+ // Additional regex patterns to trigger manual memory capture
262
+ // Default patterns: "remember", "memorize", "save this", "note this", etc.
212
263
  "keywordPatterns": []
213
264
  }
214
265
  `;
@@ -278,6 +329,11 @@ export const CONFIG = {
278
329
  deduplicationEnabled: fileConfig.deduplicationEnabled ?? DEFAULTS.deduplicationEnabled,
279
330
  deduplicationSimilarityThreshold: fileConfig.deduplicationSimilarityThreshold ?? DEFAULTS.deduplicationSimilarityThreshold,
280
331
  userMemoryAnalysisInterval: fileConfig.userMemoryAnalysisInterval ?? DEFAULTS.userMemoryAnalysisInterval,
332
+ userProfileMaxPreferences: fileConfig.userProfileMaxPreferences ?? DEFAULTS.userProfileMaxPreferences,
333
+ userProfileMaxPatterns: fileConfig.userProfileMaxPatterns ?? DEFAULTS.userProfileMaxPatterns,
334
+ userProfileMaxWorkflows: fileConfig.userProfileMaxWorkflows ?? DEFAULTS.userProfileMaxWorkflows,
335
+ userProfileConfidenceDecayDays: fileConfig.userProfileConfidenceDecayDays ?? DEFAULTS.userProfileConfidenceDecayDays,
336
+ userProfileChangelogRetentionCount: fileConfig.userProfileChangelogRetentionCount ?? DEFAULTS.userProfileChangelogRetentionCount,
281
337
  };
282
338
  export function isConfigured() {
283
339
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAC;AAyC/D,eAAO,MAAM,iBAAiB,EAAE,MA+kB/B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAC;AAyC/D,eAAO,MAAM,iBAAiB,EAAE,MAulB/B,CAAC"}
package/dist/index.js CHANGED
@@ -109,7 +109,6 @@ export const OpenCodeMemPlugin = async (ctx) => {
109
109
  "chat.message": async (input, output) => {
110
110
  if (!isConfigured())
111
111
  return;
112
- const start = Date.now();
113
112
  try {
114
113
  const textParts = output.parts.filter((p) => p.type === "text");
115
114
  if (textParts.length === 0)
@@ -184,12 +183,10 @@ export const OpenCodeMemPlugin = async (ctx) => {
184
183
  return;
185
184
  }
186
185
  }
187
- const [profileResult, userMemoriesResult, projectMemoriesListResult] = await Promise.all([
188
- memoryClient.getProfile(tags.user.tag, userMessage),
186
+ const [userMemoriesResult, projectMemoriesListResult] = await Promise.all([
189
187
  memoryClient.searchMemories(userMessage, tags.user.tag),
190
188
  memoryClient.listMemories(tags.project.tag, CONFIG.maxProjectMemories),
191
189
  ]);
192
- const profile = profileResult.success ? profileResult : null;
193
190
  const userMemories = userMemoriesResult.success ? userMemoriesResult : { results: [] };
194
191
  const projectMemoriesList = projectMemoriesListResult.success
195
192
  ? projectMemoriesListResult
@@ -205,7 +202,8 @@ export const OpenCodeMemPlugin = async (ctx) => {
205
202
  total: projectMemoriesList.memories?.length || 0,
206
203
  timing: 0,
207
204
  };
208
- const memoryContext = formatContextForPrompt(profile, userMemories, projectMemories);
205
+ const userId = tags.user.userEmail || null;
206
+ const memoryContext = formatContextForPrompt(userId, userMemories, projectMemories);
209
207
  if (memoryContext) {
210
208
  const contextPart = {
211
209
  id: `memory-context-${Date.now()}`,
@@ -409,18 +407,27 @@ export const OpenCodeMemPlugin = async (ctx) => {
409
407
  });
410
408
  }
411
409
  case "profile": {
412
- const result = await memoryClient.getProfile(tags.user.tag, args.query);
413
- if (!result.success) {
410
+ const { userProfileManager } = await import("./services/user-profile/user-profile-manager.js");
411
+ const userId = tags.user.userEmail || "unknown";
412
+ const profile = userProfileManager.getActiveProfile(userId);
413
+ if (!profile) {
414
414
  return JSON.stringify({
415
- success: false,
416
- error: result.error || "Failed to fetch profile",
415
+ success: true,
416
+ profile: null,
417
+ message: "No user profile found",
417
418
  });
418
419
  }
420
+ const profileData = JSON.parse(profile.profileData);
419
421
  return JSON.stringify({
420
422
  success: true,
421
423
  profile: {
422
- static: result.profile?.static || [],
423
- dynamic: result.profile?.dynamic || [],
424
+ preferences: profileData.preferences,
425
+ patterns: profileData.patterns,
426
+ workflows: profileData.workflows,
427
+ skillLevel: profileData.skillLevel,
428
+ version: profile.version,
429
+ lastAnalyzed: profile.lastAnalyzedAt,
430
+ totalPromptsAnalyzed: profile.totalPromptsAnalyzed,
424
431
  },
425
432
  });
426
433
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":";AAOA,QAAA,MAAQ,iBAAiB,sCAA+B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC7B,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":";AACA,QAAA,MAAQ,iBAAiB,sCAA+B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC7B,eAAe,iBAAiB,CAAC"}
package/dist/plugin.js CHANGED
@@ -1,8 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import { fileURLToPath } from "node:url";
3
- import { dirname } from "node:path";
4
- const __filename = fileURLToPath(import.meta.url);
5
- const __dirname = dirname(__filename);
6
2
  const { OpenCodeMemPlugin } = await import("./index.js");
7
3
  export { OpenCodeMemPlugin };
8
4
  export default OpenCodeMemPlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-messages.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/providers/anthropic-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AA2BvF,qBAAa,yBAA0B,SAAQ,cAAc;IAC3D,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB;IAK3D,eAAe,IAAI,MAAM;IAIzB,eAAe,IAAI,OAAO;IAIpB,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;IAmJ1B,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,gBAAgB;CA+BzB"}
1
+ {"version":3,"file":"anthropic-messages.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/providers/anthropic-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AA2BvF,qBAAa,yBAA0B,SAAQ,cAAc;IAC3D,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB;IAK3D,eAAe,IAAI,MAAM;IAIzB,eAAe,IAAI,OAAO;IAIpB,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;IAmJ1B,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,gBAAgB;CAsBzB"}
@@ -153,24 +153,18 @@ export class AnthropicMessagesProvider extends BaseAIProvider {
153
153
  if (!data || typeof data !== "object") {
154
154
  throw new Error("Response is not an object");
155
155
  }
156
- if (data.memories && Array.isArray(data.memories)) {
157
- const validMemories = data.memories.filter((m) => {
158
- return (m &&
159
- typeof m === "object" &&
160
- typeof m.summary === "string" &&
161
- m.summary.trim().length > 0 &&
162
- (m.scope === "user" || m.scope === "project") &&
163
- typeof m.type === "string" &&
164
- m.type.trim().length > 0);
165
- });
166
- if (validMemories.length === 0) {
167
- throw new Error("No valid memories in response");
168
- }
169
- return { memories: validMemories };
156
+ if (Array.isArray(data)) {
157
+ throw new Error("Response cannot be an array");
170
158
  }
171
- if (data.summary && typeof data.summary === "string" && data.summary.trim().length > 0) {
172
- return data;
159
+ const keys = Object.keys(data);
160
+ if (keys.length === 0) {
161
+ throw new Error("Response object is empty");
162
+ }
163
+ for (const key of keys) {
164
+ if (data[key] === undefined || data[key] === null) {
165
+ throw new Error(`Response field '${key}' is null or undefined`);
166
+ }
173
167
  }
174
- throw new Error("Invalid response format: missing summary or memories field");
168
+ return data;
175
169
  }
176
170
  }
@@ -1 +1 @@
1
- {"version":3,"file":"openai-chat-completion.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/providers/openai-chat-completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAkBlE,qBAAa,4BAA6B,SAAQ,cAAc;IAC9D,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB;IAK3D,eAAe,IAAI,MAAM;IAIzB,eAAe,IAAI,OAAO;IAIpB,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;IA2K1B,OAAO,CAAC,gBAAgB;CA+BzB"}
1
+ {"version":3,"file":"openai-chat-completion.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/providers/openai-chat-completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAkBlE,qBAAa,4BAA6B,SAAQ,cAAc;IAC9D,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB;IAK3D,eAAe,IAAI,MAAM;IAIzB,eAAe,IAAI,OAAO;IAIpB,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;IA2K1B,OAAO,CAAC,gBAAgB;CAsBzB"}
@@ -158,24 +158,18 @@ export class OpenAIChatCompletionProvider extends BaseAIProvider {
158
158
  if (!data || typeof data !== "object") {
159
159
  throw new Error("Response is not an object");
160
160
  }
161
- if (data.memories && Array.isArray(data.memories)) {
162
- const validMemories = data.memories.filter((m) => {
163
- return (m &&
164
- typeof m === "object" &&
165
- typeof m.summary === "string" &&
166
- m.summary.trim().length > 0 &&
167
- (m.scope === "user" || m.scope === "project") &&
168
- typeof m.type === "string" &&
169
- m.type.trim().length > 0);
170
- });
171
- if (validMemories.length === 0) {
172
- throw new Error("No valid memories in response");
173
- }
174
- return { memories: validMemories };
161
+ if (Array.isArray(data)) {
162
+ throw new Error("Response cannot be an array");
175
163
  }
176
- if (data.summary && typeof data.summary === "string" && data.summary.trim().length > 0) {
177
- return data;
164
+ const keys = Object.keys(data);
165
+ if (keys.length === 0) {
166
+ throw new Error("Response object is empty");
167
+ }
168
+ for (const key of keys) {
169
+ if (data[key] === undefined || data[key] === null) {
170
+ throw new Error(`Response field '${key}' is null or undefined`);
171
+ }
178
172
  }
179
- throw new Error("Invalid response format: missing summary or memories field");
173
+ return data;
180
174
  }
181
175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"openai-responses.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/providers/openai-responses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAsBvF,qBAAa,uBAAwB,SAAQ,cAAc;IACzD,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB;IAK3D,eAAe,IAAI,MAAM;IAIzB,eAAe,IAAI,OAAO;IAIpB,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;IAuH1B,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,gBAAgB;CA+BzB"}
1
+ {"version":3,"file":"openai-responses.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/providers/openai-responses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAsBvF,qBAAa,uBAAwB,SAAQ,cAAc;IACzD,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB;IAK3D,eAAe,IAAI,MAAM;IAIzB,eAAe,IAAI,OAAO;IAIpB,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;IAuH1B,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,gBAAgB;CAsBzB"}
@@ -168,24 +168,18 @@ export class OpenAIResponsesProvider extends BaseAIProvider {
168
168
  if (!data || typeof data !== "object") {
169
169
  throw new Error("Response is not an object");
170
170
  }
171
- if (data.memories && Array.isArray(data.memories)) {
172
- const validMemories = data.memories.filter((m) => {
173
- return (m &&
174
- typeof m === "object" &&
175
- typeof m.summary === "string" &&
176
- m.summary.trim().length > 0 &&
177
- (m.scope === "user" || m.scope === "project") &&
178
- typeof m.type === "string" &&
179
- m.type.trim().length > 0);
180
- });
181
- if (validMemories.length === 0) {
182
- throw new Error("No valid memories in response");
183
- }
184
- return { memories: validMemories };
171
+ if (Array.isArray(data)) {
172
+ throw new Error("Response cannot be an array");
185
173
  }
186
- if (data.summary && typeof data.summary === "string" && data.summary.trim().length > 0) {
187
- return data;
174
+ const keys = Object.keys(data);
175
+ if (keys.length === 0) {
176
+ throw new Error("Response object is empty");
177
+ }
178
+ for (const key of keys) {
179
+ if (data[key] === undefined || data[key] === null) {
180
+ throw new Error(`Response field '${key}' is null or undefined`);
181
+ }
188
182
  }
189
- throw new Error("Invalid response format: missing summary or memories field");
183
+ return data;
190
184
  }
191
185
  }
@@ -106,5 +106,9 @@ export declare function handleDeletePrompt(id: string, cascade?: boolean): Promi
106
106
  export declare function handleBulkDeletePrompts(ids: string[], cascade?: boolean): Promise<ApiResponse<{
107
107
  deleted: number;
108
108
  }>>;
109
+ export declare function handleGetUserProfile(userId?: string): Promise<ApiResponse<any>>;
110
+ export declare function handleGetProfileChangelog(profileId: string, limit?: number): Promise<ApiResponse<any[]>>;
111
+ export declare function handleGetProfileSnapshot(changelogId: string): Promise<ApiResponse<any>>;
112
+ export declare function handleRefreshProfile(userId?: string): Promise<ApiResponse<any>>;
109
113
  export {};
110
114
  //# sourceMappingURL=api-handlers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-handlers.d.ts","sourceRoot":"","sources":["../../src/services/api-handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-handlers.d.ts","sourceRoot":"","sources":["../../src/services/api-handlers.ts"],"names":[],"mappings":"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"}