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.
- package/README.md +54 -11
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +62 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -11
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +0 -4
- package/dist/services/ai/providers/anthropic-messages.d.ts.map +1 -1
- package/dist/services/ai/providers/anthropic-messages.js +11 -17
- package/dist/services/ai/providers/openai-chat-completion.d.ts.map +1 -1
- package/dist/services/ai/providers/openai-chat-completion.js +11 -17
- package/dist/services/ai/providers/openai-responses.d.ts.map +1 -1
- package/dist/services/ai/providers/openai-responses.js +11 -17
- package/dist/services/api-handlers.d.ts +4 -0
- package/dist/services/api-handlers.d.ts.map +1 -1
- package/dist/services/api-handlers.js +155 -1
- package/dist/services/auto-capture.js +2 -2
- package/dist/services/client.d.ts +1 -16
- package/dist/services/client.d.ts.map +1 -1
- package/dist/services/client.js +0 -35
- package/dist/services/context.d.ts +1 -7
- package/dist/services/context.d.ts.map +1 -1
- package/dist/services/context.js +6 -14
- package/dist/services/deduplication-service.d.ts.map +1 -1
- package/dist/services/deduplication-service.js +1 -3
- package/dist/services/logger.js +1 -1
- package/dist/services/user-memory-learning.d.ts.map +1 -1
- package/dist/services/user-memory-learning.js +122 -84
- package/dist/services/user-profile/profile-context.d.ts +2 -0
- package/dist/services/user-profile/profile-context.d.ts.map +1 -0
- package/dist/services/user-profile/profile-context.js +40 -0
- package/dist/services/user-profile/types.d.ts +51 -0
- package/dist/services/user-profile/types.d.ts.map +1 -0
- package/dist/services/user-profile/types.js +1 -0
- package/dist/services/user-profile/user-profile-manager.d.ts +22 -0
- package/dist/services/user-profile/user-profile-manager.d.ts.map +1 -0
- package/dist/services/user-profile/user-profile-manager.js +267 -0
- package/dist/services/web-server-worker.js +29 -1
- package/dist/types/index.d.ts +1 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/web/app.js +249 -29
- package/dist/web/index.html +31 -5
- package/dist/web/styles.css +309 -0
- 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
|
|
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: "
|
|
56
|
-
memory({ mode: "search", query: "
|
|
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
|
+

|
|
69
|
+
|
|
70
|
+
**User Profile Viewer:**
|
|
71
|
+
|
|
72
|
+

|
|
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
|
|
153
|
+
### User Profile System
|
|
154
|
+
|
|
155
|
+
Builds structured user profile from conversation history (default: every 10 prompts):
|
|
125
156
|
|
|
126
|
-
|
|
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
|
-
|
|
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: "
|
|
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
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
|
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;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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 [
|
|
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
|
|
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
|
|
413
|
-
|
|
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:
|
|
416
|
-
|
|
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
|
-
|
|
423
|
-
|
|
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
|
}
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":";
|
|
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;
|
|
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 (
|
|
157
|
-
|
|
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
|
-
|
|
172
|
-
|
|
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
|
-
|
|
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;
|
|
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 (
|
|
162
|
-
|
|
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
|
-
|
|
177
|
-
|
|
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
|
-
|
|
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;
|
|
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 (
|
|
172
|
-
|
|
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
|
-
|
|
187
|
-
|
|
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
|
-
|
|
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":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,UAAU,WAAW,CAAC,CAAC,GAAG,GAAG;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,MAAM;IACd,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,OAAO;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,iBAAiB,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAwCD,wBAAsB,cAAc,IAAI,OAAO,CAC7C,WAAW,CAAC;IAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CACrD,CAgDA;AAED,wBAAsB,kBAAkB,CACtC,GAAG,CAAC,EAAE,MAAM,EACZ,IAAI,GAAE,MAAU,EAChB,QAAQ,GAAE,MAAW,EACrB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,EAC1B,cAAc,GAAE,OAAc,GAC7B,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"api-handlers.d.ts","sourceRoot":"","sources":["../../src/services/api-handlers.ts"],"names":[],"mappings":"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"}
|