opencode-mem 1.0.0 → 2.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.
- package/README.md +80 -477
- package/dist/config.d.ts +5 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +46 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -88
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +1 -8
- package/dist/services/ai/ai-provider-factory.d.ts +8 -0
- package/dist/services/ai/ai-provider-factory.d.ts.map +1 -0
- package/dist/services/ai/ai-provider-factory.js +25 -0
- package/dist/services/ai/providers/anthropic-messages.d.ts +13 -0
- package/dist/services/ai/providers/anthropic-messages.d.ts.map +1 -0
- package/dist/services/ai/providers/anthropic-messages.js +176 -0
- package/dist/services/ai/providers/base-provider.d.ts +21 -0
- package/dist/services/ai/providers/base-provider.d.ts.map +1 -0
- package/dist/services/ai/providers/base-provider.js +6 -0
- package/dist/services/ai/providers/openai-chat-completion.d.ts +12 -0
- package/dist/services/ai/providers/openai-chat-completion.d.ts.map +1 -0
- package/dist/services/ai/providers/openai-chat-completion.js +181 -0
- package/dist/services/ai/providers/openai-responses.d.ts +14 -0
- package/dist/services/ai/providers/openai-responses.d.ts.map +1 -0
- package/dist/services/ai/providers/openai-responses.js +191 -0
- package/dist/services/ai/session/ai-session-manager.d.ts +21 -0
- package/dist/services/ai/session/ai-session-manager.d.ts.map +1 -0
- package/dist/services/ai/session/ai-session-manager.js +165 -0
- package/dist/services/ai/session/session-types.d.ts +43 -0
- package/dist/services/ai/session/session-types.d.ts.map +1 -0
- package/dist/services/ai/session/session-types.js +1 -0
- package/dist/services/ai/tools/tool-schema.d.ts +41 -0
- package/dist/services/ai/tools/tool-schema.d.ts.map +1 -0
- package/dist/services/ai/tools/tool-schema.js +24 -0
- package/dist/services/api-handlers.d.ts +11 -3
- package/dist/services/api-handlers.d.ts.map +1 -1
- package/dist/services/api-handlers.js +143 -30
- package/dist/services/auto-capture.d.ts +1 -30
- package/dist/services/auto-capture.d.ts.map +1 -1
- package/dist/services/auto-capture.js +199 -396
- package/dist/services/cleanup-service.d.ts +3 -0
- package/dist/services/cleanup-service.d.ts.map +1 -1
- package/dist/services/cleanup-service.js +31 -4
- package/dist/services/client.d.ts +1 -0
- package/dist/services/client.d.ts.map +1 -1
- package/dist/services/client.js +3 -11
- package/dist/services/sqlite/connection-manager.d.ts.map +1 -1
- package/dist/services/sqlite/connection-manager.js +8 -4
- package/dist/services/user-memory-learning.d.ts +3 -0
- package/dist/services/user-memory-learning.d.ts.map +1 -0
- package/dist/services/user-memory-learning.js +157 -0
- package/dist/services/user-prompt/user-prompt-manager.d.ts +38 -0
- package/dist/services/user-prompt/user-prompt-manager.d.ts.map +1 -0
- package/dist/services/user-prompt/user-prompt-manager.js +164 -0
- package/dist/services/web-server-worker.js +27 -6
- package/dist/services/web-server.d.ts.map +1 -1
- package/dist/services/web-server.js +0 -5
- package/dist/types/index.d.ts +5 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/web/app.js +210 -120
- package/dist/web/index.html +14 -10
- package/dist/web/styles.css +326 -1
- package/package.json +4 -1
- package/dist/services/compaction.d.ts +0 -92
- package/dist/services/compaction.d.ts.map +0 -1
- package/dist/services/compaction.js +0 -421
- package/dist/services/sqlite-client.d.ts +0 -116
- package/dist/services/sqlite-client.d.ts.map +0 -1
- package/dist/services/sqlite-client.js +0 -284
- package/dist/services/web-server-lock.d.ts +0 -12
- package/dist/services/web-server-lock.d.ts.map +0 -1
- package/dist/services/web-server-lock.js +0 -157
- package/dist/web/favicon.svg +0 -14
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export class ToolSchemaConverter {
|
|
2
|
+
static toResponsesAPI(chatCompletionTool) {
|
|
3
|
+
return {
|
|
4
|
+
type: "function",
|
|
5
|
+
name: chatCompletionTool.function.name,
|
|
6
|
+
description: chatCompletionTool.function.description,
|
|
7
|
+
parameters: chatCompletionTool.function.parameters,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
static toAnthropic(chatCompletionTool) {
|
|
11
|
+
return {
|
|
12
|
+
name: chatCompletionTool.function.name,
|
|
13
|
+
description: chatCompletionTool.function.description,
|
|
14
|
+
input_schema: chatCompletionTool.function.parameters,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
static fromChatCompletion(tool) {
|
|
18
|
+
return {
|
|
19
|
+
chatCompletion: tool,
|
|
20
|
+
responsesAPI: this.toResponsesAPI(tool),
|
|
21
|
+
anthropic: this.toAnthropic(tool),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -40,7 +40,7 @@ export declare function handleListTags(): Promise<ApiResponse<{
|
|
|
40
40
|
user: TagInfo[];
|
|
41
41
|
project: TagInfo[];
|
|
42
42
|
}>>;
|
|
43
|
-
export declare function handleListMemories(tag?: string, page?: number, pageSize?: number): Promise<ApiResponse<PaginatedResponse<Memory>>>;
|
|
43
|
+
export declare function handleListMemories(tag?: string, page?: number, pageSize?: number, scope?: "user" | "project", includePrompts?: boolean): Promise<ApiResponse<PaginatedResponse<Memory | any>>>;
|
|
44
44
|
export declare function handleAddMemory(data: {
|
|
45
45
|
content: string;
|
|
46
46
|
containerTag: string;
|
|
@@ -54,8 +54,10 @@ export declare function handleAddMemory(data: {
|
|
|
54
54
|
}): Promise<ApiResponse<{
|
|
55
55
|
id: string;
|
|
56
56
|
}>>;
|
|
57
|
-
export declare function handleDeleteMemory(id: string): Promise<ApiResponse<
|
|
58
|
-
|
|
57
|
+
export declare function handleDeleteMemory(id: string, cascade?: boolean): Promise<ApiResponse<{
|
|
58
|
+
deletedPrompt: boolean;
|
|
59
|
+
}>>;
|
|
60
|
+
export declare function handleBulkDelete(ids: string[], cascade?: boolean): Promise<ApiResponse<{
|
|
59
61
|
deleted: number;
|
|
60
62
|
}>>;
|
|
61
63
|
export declare function handleUpdateMemory(id: string, data: {
|
|
@@ -98,5 +100,11 @@ export declare function handleRunMigration(strategy: "fresh-start" | "re-embed")
|
|
|
98
100
|
duration: number;
|
|
99
101
|
error?: string;
|
|
100
102
|
}>>;
|
|
103
|
+
export declare function handleDeletePrompt(id: string, cascade?: boolean): Promise<ApiResponse<{
|
|
104
|
+
deletedMemory: boolean;
|
|
105
|
+
}>>;
|
|
106
|
+
export declare function handleBulkDeletePrompts(ids: string[], cascade?: boolean): Promise<ApiResponse<{
|
|
107
|
+
deleted: number;
|
|
108
|
+
}>>;
|
|
101
109
|
export {};
|
|
102
110
|
//# 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;
|
|
1
|
+
{"version":3,"file":"api-handlers.d.ts","sourceRoot":"","sources":["../../src/services/api-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { shardManager } from "./sqlite/shard-manager.js";
|
|
|
3
3
|
import { vectorSearch } from "./sqlite/vector-search.js";
|
|
4
4
|
import { connectionManager } from "./sqlite/connection-manager.js";
|
|
5
5
|
import { log } from "./logger.js";
|
|
6
|
+
import { userPromptManager } from "./user-prompt/user-prompt-manager.js";
|
|
6
7
|
function safeToISOString(timestamp) {
|
|
7
8
|
try {
|
|
8
9
|
if (timestamp === null || timestamp === undefined) {
|
|
@@ -82,17 +83,25 @@ export async function handleListTags() {
|
|
|
82
83
|
return { success: false, error: String(error) };
|
|
83
84
|
}
|
|
84
85
|
}
|
|
85
|
-
export async function handleListMemories(tag, page = 1, pageSize = 20) {
|
|
86
|
+
export async function handleListMemories(tag, page = 1, pageSize = 20, scope, includePrompts = true) {
|
|
86
87
|
try {
|
|
87
88
|
await embeddingService.warmup();
|
|
88
|
-
let
|
|
89
|
+
let allMemories = [];
|
|
89
90
|
if (tag) {
|
|
90
|
-
const { scope, hash } = extractScopeFromTag(tag);
|
|
91
|
-
const shards = shardManager.getAllShards(
|
|
91
|
+
const { scope: tagScope, hash } = extractScopeFromTag(tag);
|
|
92
|
+
const shards = shardManager.getAllShards(tagScope, hash);
|
|
92
93
|
for (const shard of shards) {
|
|
93
94
|
const db = connectionManager.getConnection(shard.dbPath);
|
|
94
95
|
const memories = vectorSearch.listMemories(db, tag, 10000);
|
|
95
|
-
|
|
96
|
+
allMemories.push(...memories);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else if (scope) {
|
|
100
|
+
const shards = shardManager.getAllShards(scope, "");
|
|
101
|
+
for (const shard of shards) {
|
|
102
|
+
const db = connectionManager.getConnection(shard.dbPath);
|
|
103
|
+
const memories = vectorSearch.getAllMemories(db);
|
|
104
|
+
allMemories.push(...memories.filter((m) => m.container_tag?.includes(`_${scope}_`)));
|
|
96
105
|
}
|
|
97
106
|
}
|
|
98
107
|
else {
|
|
@@ -102,34 +111,86 @@ export async function handleListMemories(tag, page = 1, pageSize = 20) {
|
|
|
102
111
|
for (const shard of allShards) {
|
|
103
112
|
const db = connectionManager.getConnection(shard.dbPath);
|
|
104
113
|
const memories = vectorSearch.getAllMemories(db);
|
|
105
|
-
|
|
114
|
+
allMemories.push(...memories);
|
|
106
115
|
}
|
|
107
116
|
}
|
|
108
|
-
const
|
|
109
|
-
|
|
117
|
+
const memoriesWithType = allMemories.map((r) => {
|
|
118
|
+
const metadata = safeJSONParse(r.metadata);
|
|
119
|
+
return {
|
|
120
|
+
type: "memory",
|
|
121
|
+
id: r.id,
|
|
122
|
+
content: r.content,
|
|
123
|
+
memoryType: r.type,
|
|
124
|
+
scope: r.container_tag?.includes("_user_") ? "user" : "project",
|
|
125
|
+
createdAt: Number(r.created_at),
|
|
126
|
+
updatedAt: r.updated_at ? Number(r.updated_at) : undefined,
|
|
127
|
+
metadata,
|
|
128
|
+
linkedPromptId: metadata?.promptId,
|
|
129
|
+
displayName: r.display_name,
|
|
130
|
+
userName: r.user_name,
|
|
131
|
+
userEmail: r.user_email,
|
|
132
|
+
projectPath: r.project_path,
|
|
133
|
+
projectName: r.project_name,
|
|
134
|
+
gitRepoUrl: r.git_repo_url,
|
|
135
|
+
isPinned: r.is_pinned === 1,
|
|
136
|
+
};
|
|
137
|
+
});
|
|
138
|
+
let timeline = memoriesWithType;
|
|
139
|
+
if (includePrompts && scope === "project") {
|
|
140
|
+
const prompts = userPromptManager.getCapturedPrompts(tag);
|
|
141
|
+
const promptsWithType = prompts.map((p) => ({
|
|
142
|
+
type: "prompt",
|
|
143
|
+
id: p.id,
|
|
144
|
+
sessionId: p.sessionId,
|
|
145
|
+
content: p.content,
|
|
146
|
+
createdAt: p.createdAt,
|
|
147
|
+
projectPath: p.projectPath,
|
|
148
|
+
linkedMemoryId: p.linkedMemoryId,
|
|
149
|
+
}));
|
|
150
|
+
timeline = [...memoriesWithType, ...promptsWithType];
|
|
151
|
+
}
|
|
152
|
+
timeline.sort((a, b) => b.createdAt - a.createdAt);
|
|
153
|
+
const total = timeline.length;
|
|
110
154
|
const totalPages = Math.ceil(total / pageSize);
|
|
111
155
|
const offset = (page - 1) * pageSize;
|
|
112
|
-
const paginatedResults =
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
156
|
+
const paginatedResults = timeline.slice(offset, offset + pageSize);
|
|
157
|
+
const items = paginatedResults.map((item) => {
|
|
158
|
+
if (item.type === "memory") {
|
|
159
|
+
return {
|
|
160
|
+
type: "memory",
|
|
161
|
+
id: item.id,
|
|
162
|
+
content: item.content,
|
|
163
|
+
memoryType: item.memoryType,
|
|
164
|
+
scope: item.scope,
|
|
165
|
+
createdAt: safeToISOString(item.createdAt),
|
|
166
|
+
updatedAt: item.updatedAt ? safeToISOString(item.updatedAt) : undefined,
|
|
167
|
+
metadata: item.metadata,
|
|
168
|
+
linkedPromptId: item.linkedPromptId,
|
|
169
|
+
displayName: item.displayName,
|
|
170
|
+
userName: item.userName,
|
|
171
|
+
userEmail: item.userEmail,
|
|
172
|
+
projectPath: item.projectPath,
|
|
173
|
+
projectName: item.projectName,
|
|
174
|
+
gitRepoUrl: item.gitRepoUrl,
|
|
175
|
+
isPinned: item.isPinned,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
return {
|
|
180
|
+
type: "prompt",
|
|
181
|
+
id: item.id,
|
|
182
|
+
sessionId: item.sessionId,
|
|
183
|
+
content: item.content,
|
|
184
|
+
createdAt: safeToISOString(item.createdAt),
|
|
185
|
+
projectPath: item.projectPath,
|
|
186
|
+
linkedMemoryId: item.linkedMemoryId,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
});
|
|
129
190
|
return {
|
|
130
191
|
success: true,
|
|
131
192
|
data: {
|
|
132
|
-
items
|
|
193
|
+
items,
|
|
133
194
|
total,
|
|
134
195
|
page,
|
|
135
196
|
pageSize,
|
|
@@ -181,7 +242,7 @@ export async function handleAddMemory(data) {
|
|
|
181
242
|
return { success: false, error: String(error) };
|
|
182
243
|
}
|
|
183
244
|
}
|
|
184
|
-
export async function handleDeleteMemory(id) {
|
|
245
|
+
export async function handleDeleteMemory(id, cascade = false) {
|
|
185
246
|
try {
|
|
186
247
|
if (!id) {
|
|
187
248
|
return { success: false, error: "id is required" };
|
|
@@ -189,13 +250,22 @@ export async function handleDeleteMemory(id) {
|
|
|
189
250
|
const userShards = shardManager.getAllShards("user", "");
|
|
190
251
|
const projectShards = shardManager.getAllShards("project", "");
|
|
191
252
|
const allShards = [...userShards, ...projectShards];
|
|
253
|
+
let deletedPrompt = false;
|
|
192
254
|
for (const shard of allShards) {
|
|
193
255
|
const db = connectionManager.getConnection(shard.dbPath);
|
|
194
256
|
const memory = vectorSearch.getMemoryById(db, id);
|
|
195
257
|
if (memory) {
|
|
258
|
+
if (cascade) {
|
|
259
|
+
const metadata = safeJSONParse(memory.metadata);
|
|
260
|
+
const linkedPromptId = metadata?.promptId;
|
|
261
|
+
if (linkedPromptId) {
|
|
262
|
+
userPromptManager.deletePrompt(linkedPromptId);
|
|
263
|
+
deletedPrompt = true;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
196
266
|
vectorSearch.deleteVector(db, id);
|
|
197
267
|
shardManager.decrementVectorCount(shard.id);
|
|
198
|
-
return { success: true };
|
|
268
|
+
return { success: true, data: { deletedPrompt } };
|
|
199
269
|
}
|
|
200
270
|
}
|
|
201
271
|
return { success: false, error: "Memory not found" };
|
|
@@ -205,14 +275,14 @@ export async function handleDeleteMemory(id) {
|
|
|
205
275
|
return { success: false, error: String(error) };
|
|
206
276
|
}
|
|
207
277
|
}
|
|
208
|
-
export async function handleBulkDelete(ids) {
|
|
278
|
+
export async function handleBulkDelete(ids, cascade = false) {
|
|
209
279
|
try {
|
|
210
280
|
if (!ids || ids.length === 0) {
|
|
211
281
|
return { success: false, error: "ids array is required" };
|
|
212
282
|
}
|
|
213
283
|
let deleted = 0;
|
|
214
284
|
for (const id of ids) {
|
|
215
|
-
const result = await handleDeleteMemory(id);
|
|
285
|
+
const result = await handleDeleteMemory(id, cascade);
|
|
216
286
|
if (result.success) {
|
|
217
287
|
deleted++;
|
|
218
288
|
}
|
|
@@ -492,3 +562,46 @@ export async function handleRunMigration(strategy) {
|
|
|
492
562
|
return { success: false, error: String(error) };
|
|
493
563
|
}
|
|
494
564
|
}
|
|
565
|
+
export async function handleDeletePrompt(id, cascade = false) {
|
|
566
|
+
try {
|
|
567
|
+
if (!id) {
|
|
568
|
+
return { success: false, error: "id is required" };
|
|
569
|
+
}
|
|
570
|
+
const prompt = userPromptManager.getPromptById(id);
|
|
571
|
+
if (!prompt) {
|
|
572
|
+
return { success: false, error: "Prompt not found" };
|
|
573
|
+
}
|
|
574
|
+
let deletedMemory = false;
|
|
575
|
+
if (cascade && prompt.linkedMemoryId) {
|
|
576
|
+
const result = await handleDeleteMemory(prompt.linkedMemoryId, false);
|
|
577
|
+
if (result.success) {
|
|
578
|
+
deletedMemory = true;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
userPromptManager.deletePrompt(id);
|
|
582
|
+
return { success: true, data: { deletedMemory } };
|
|
583
|
+
}
|
|
584
|
+
catch (error) {
|
|
585
|
+
log("handleDeletePrompt: error", { error: String(error) });
|
|
586
|
+
return { success: false, error: String(error) };
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
export async function handleBulkDeletePrompts(ids, cascade = false) {
|
|
590
|
+
try {
|
|
591
|
+
if (!ids || ids.length === 0) {
|
|
592
|
+
return { success: false, error: "ids array is required" };
|
|
593
|
+
}
|
|
594
|
+
let deleted = 0;
|
|
595
|
+
for (const id of ids) {
|
|
596
|
+
const result = await handleDeletePrompt(id, cascade);
|
|
597
|
+
if (result.success) {
|
|
598
|
+
deleted++;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
return { success: true, data: { deleted } };
|
|
602
|
+
}
|
|
603
|
+
catch (error) {
|
|
604
|
+
log("handleBulkDeletePrompts: error", { error: String(error) });
|
|
605
|
+
return { success: false, error: String(error) };
|
|
606
|
+
}
|
|
607
|
+
}
|
|
@@ -1,32 +1,3 @@
|
|
|
1
1
|
import type { PluginInput } from "@opencode-ai/plugin";
|
|
2
|
-
|
|
3
|
-
sessionID: string;
|
|
4
|
-
lastCaptureTokens: number;
|
|
5
|
-
lastCaptureTime: number;
|
|
6
|
-
lastCapturedMessageIndex: number;
|
|
7
|
-
}
|
|
8
|
-
export declare class AutoCaptureService {
|
|
9
|
-
private buffers;
|
|
10
|
-
private capturing;
|
|
11
|
-
private tokenThreshold;
|
|
12
|
-
private minTokens;
|
|
13
|
-
private enabled;
|
|
14
|
-
private maxMemories;
|
|
15
|
-
constructor();
|
|
16
|
-
isEnabled(): boolean;
|
|
17
|
-
getDisabledReason(): string | null;
|
|
18
|
-
toggle(): boolean;
|
|
19
|
-
getOrCreateBuffer(sessionID: string): CaptureBuffer;
|
|
20
|
-
checkTokenThreshold(sessionID: string, totalTokens: number): boolean;
|
|
21
|
-
getSystemPrompt(hasContext: boolean): string;
|
|
22
|
-
markCapturing(sessionID: string): void;
|
|
23
|
-
clearBuffer(sessionID: string): void;
|
|
24
|
-
getStats(sessionID: string): {
|
|
25
|
-
lastCaptureTokens: number;
|
|
26
|
-
timeSinceCapture: number;
|
|
27
|
-
} | null;
|
|
28
|
-
cleanup(sessionID: string): void;
|
|
29
|
-
}
|
|
30
|
-
export declare function performAutoCapture(ctx: PluginInput, service: AutoCaptureService, sessionID: string, directory: string): Promise<void>;
|
|
31
|
-
export {};
|
|
2
|
+
export declare function performAutoCapture(ctx: PluginInput, sessionID: string, directory: string): Promise<void>;
|
|
32
3
|
//# sourceMappingURL=auto-capture.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-capture.d.ts","sourceRoot":"","sources":["../../src/services/auto-capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-capture.d.ts","sourceRoot":"","sources":["../../src/services/auto-capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAcvD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA+Ff"}
|