opencode-mem 2.7.3 → 2.7.5
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 +11 -9
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -2
- package/dist/services/ai/providers/base-provider.d.ts +1 -0
- package/dist/services/ai/providers/base-provider.d.ts.map +1 -1
- package/dist/services/ai/providers/openai-chat-completion.d.ts.map +1 -1
- package/dist/services/ai/providers/openai-chat-completion.js +11 -2
- package/dist/services/api-handlers.d.ts +12 -3
- package/dist/services/api-handlers.d.ts.map +1 -1
- package/dist/services/api-handlers.js +79 -40
- package/dist/services/privacy.d.ts +0 -1
- package/dist/services/privacy.d.ts.map +1 -1
- package/dist/services/privacy.js +0 -3
- package/dist/services/sqlite/vector-search.d.ts +1 -0
- package/dist/services/sqlite/vector-search.d.ts.map +1 -1
- package/dist/services/sqlite/vector-search.js +10 -0
- package/dist/services/web-server-worker.js +9 -3
- package/dist/types/index.d.ts +0 -31
- package/dist/types/index.d.ts.map +1 -1
- package/dist/web/app.js +52 -83
- package/package.json +12 -4
package/README.md
CHANGED
|
@@ -28,7 +28,7 @@ Add to your OpenCode configuration at `~/.config/opencode/opencode.json`:
|
|
|
28
28
|
|
|
29
29
|
```jsonc
|
|
30
30
|
{
|
|
31
|
-
"plugins": ["opencode-mem"]
|
|
31
|
+
"plugins": ["opencode-mem"],
|
|
32
32
|
}
|
|
33
33
|
```
|
|
34
34
|
|
|
@@ -37,10 +37,10 @@ The plugin downloads automatically on next startup. macOS users with Apple Silic
|
|
|
37
37
|
## Usage Examples
|
|
38
38
|
|
|
39
39
|
```typescript
|
|
40
|
-
memory({ mode: "add", content: "Project uses microservices architecture" })
|
|
41
|
-
memory({ mode: "search", query: "architecture decisions" })
|
|
42
|
-
memory({ mode: "profile" })
|
|
43
|
-
memory({ mode: "list", limit: 10 })
|
|
40
|
+
memory({ mode: "add", content: "Project uses microservices architecture" });
|
|
41
|
+
memory({ mode: "search", query: "architecture decisions" });
|
|
42
|
+
memory({ mode: "profile" });
|
|
43
|
+
memory({ mode: "list", limit: 10 });
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
Access the web interface at `http://127.0.0.1:4747` for visual memory browsing and management.
|
|
@@ -57,24 +57,26 @@ Configure at `~/.config/opencode/opencode-mem.jsonc`:
|
|
|
57
57
|
"embeddingModel": "Xenova/nomic-embed-text-v1",
|
|
58
58
|
"webServerEnabled": true,
|
|
59
59
|
"webServerPort": 4747,
|
|
60
|
-
|
|
60
|
+
|
|
61
61
|
"autoCaptureEnabled": true,
|
|
62
62
|
"autoCaptureLanguage": "auto",
|
|
63
63
|
"memoryProvider": "openai-chat",
|
|
64
64
|
"memoryModel": "gpt-4o-mini",
|
|
65
65
|
"memoryApiUrl": "https://api.openai.com/v1",
|
|
66
66
|
"memoryApiKey": "sk-...",
|
|
67
|
-
|
|
67
|
+
"memoryTemperature": 0.3,
|
|
68
|
+
|
|
68
69
|
"showAutoCaptureToasts": true,
|
|
69
70
|
"showUserProfileToasts": true,
|
|
70
71
|
"showErrorToasts": true,
|
|
71
|
-
|
|
72
|
+
|
|
72
73
|
"userProfileAnalysisInterval": 10,
|
|
73
|
-
"maxMemories": 10
|
|
74
|
+
"maxMemories": 10,
|
|
74
75
|
}
|
|
75
76
|
```
|
|
76
77
|
|
|
77
78
|
**API Key Formats:**
|
|
79
|
+
|
|
78
80
|
```jsonc
|
|
79
81
|
"memoryApiKey": "sk-..."
|
|
80
82
|
"memoryApiKey": "file://~/.config/opencode/api-key.txt"
|
package/dist/config.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export declare const CONFIG: {
|
|
|
20
20
|
memoryModel: string | undefined;
|
|
21
21
|
memoryApiUrl: string | undefined;
|
|
22
22
|
memoryApiKey: string | undefined;
|
|
23
|
+
memoryTemperature: number | false | undefined;
|
|
23
24
|
aiSessionRetentionDays: number;
|
|
24
25
|
webServerEnabled: boolean;
|
|
25
26
|
webServerPort: number;
|
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":"AAwYA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;oBA2Bb,aAAa,GACb,kBAAkB,GAClB,WAAW;;;;;;;;;;;;;;;;;;;;;;;CA6BhB,CAAC;AAEF,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
|
package/dist/config.js
CHANGED
|
@@ -198,13 +198,18 @@ const CONFIG_TEMPLATE = `{
|
|
|
198
198
|
|
|
199
199
|
// Maximum iterations for multi-turn AI analysis (for openai-responses and anthropic)
|
|
200
200
|
"autoCaptureMaxIterations": 5,
|
|
201
|
-
|
|
201
|
+
|
|
202
202
|
// Timeout per iteration in milliseconds (30 seconds default)
|
|
203
203
|
"autoCaptureIterationTimeout": 30000,
|
|
204
|
-
|
|
204
|
+
|
|
205
205
|
// Days to keep AI session history before cleanup
|
|
206
206
|
"aiSessionRetentionDays": 7,
|
|
207
207
|
|
|
208
|
+
// Temperature for AI API requests (set to false to omit parameter for models that don't support it)
|
|
209
|
+
// Some reasoning models (like o1, o3, gpt-5) don't support temperature parameter
|
|
210
|
+
// Set to false and add "memoryTemperature": false in config when using such models
|
|
211
|
+
"memoryTemperature": 0.3,
|
|
212
|
+
|
|
208
213
|
// Language for auto-capture summaries (default: "auto" for auto-detection)
|
|
209
214
|
// Options: "auto", "en", "id", "zh", "ja", "es", "fr", "de", "ru", "pt", "ar", "ko"
|
|
210
215
|
// "autoCaptureLanguage": "auto",
|
|
@@ -331,6 +336,7 @@ export const CONFIG = {
|
|
|
331
336
|
memoryModel: fileConfig.memoryModel,
|
|
332
337
|
memoryApiUrl: fileConfig.memoryApiUrl,
|
|
333
338
|
memoryApiKey: resolveSecretValue(fileConfig.memoryApiKey),
|
|
339
|
+
memoryTemperature: fileConfig.memoryTemperature,
|
|
334
340
|
aiSessionRetentionDays: fileConfig.aiSessionRetentionDays ?? DEFAULTS.aiSessionRetentionDays,
|
|
335
341
|
webServerEnabled: fileConfig.webServerEnabled ?? DEFAULTS.webServerEnabled,
|
|
336
342
|
webServerPort: fileConfig.webServerPort ?? DEFAULTS.webServerPort,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-provider.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/providers/base-provider.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"base-provider.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/providers/base-provider.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CACpC;AAED,8BAAsB,cAAc;IAClC,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC;gBAErB,MAAM,EAAE,cAAc;IAIlC,QAAQ,CAAC,eAAe,CACtB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,GAAG,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;IAE1B,QAAQ,CAAC,eAAe,IAAI,MAAM;IAElC,QAAQ,CAAC,eAAe,IAAI,OAAO;CACpC"}
|
|
@@ -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;AAqBlE,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;IAI1B,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,iCAAiC;IAoCnC,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;
|
|
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;AAqBlE,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;IAI1B,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,iCAAiC;IAoCnC,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;CAwP3B"}
|
|
@@ -116,8 +116,10 @@ export class OpenAIChatCompletionProvider extends BaseAIProvider {
|
|
|
116
116
|
messages,
|
|
117
117
|
tools: [toolSchema],
|
|
118
118
|
tool_choice: { type: "function", function: { name: toolSchema.function.name } },
|
|
119
|
-
temperature: 0.3,
|
|
120
119
|
};
|
|
120
|
+
if (this.config.memoryTemperature !== false) {
|
|
121
|
+
requestBody.temperature = this.config.memoryTemperature ?? 0.3;
|
|
122
|
+
}
|
|
121
123
|
const headers = {
|
|
122
124
|
"Content-Type": "application/json",
|
|
123
125
|
};
|
|
@@ -138,9 +140,16 @@ export class OpenAIChatCompletionProvider extends BaseAIProvider {
|
|
|
138
140
|
error: errorText,
|
|
139
141
|
iteration: iterations,
|
|
140
142
|
});
|
|
143
|
+
let errorMessage = `API error: ${response.status} - ${errorText}`;
|
|
144
|
+
if (response.status === 400 &&
|
|
145
|
+
errorText.includes("unsupported_value") &&
|
|
146
|
+
errorText.includes("temperature")) {
|
|
147
|
+
errorMessage =
|
|
148
|
+
'Your model does not support the temperature parameter. Add "memoryTemperature": false to your config file to disable it.';
|
|
149
|
+
}
|
|
141
150
|
return {
|
|
142
151
|
success: false,
|
|
143
|
-
error:
|
|
152
|
+
error: errorMessage,
|
|
144
153
|
iterations,
|
|
145
154
|
};
|
|
146
155
|
}
|
|
@@ -146,10 +146,19 @@ export declare function handleDetectTagMigration(): Promise<ApiResponse<{
|
|
|
146
146
|
needsMigration: boolean;
|
|
147
147
|
count: number;
|
|
148
148
|
}>>;
|
|
149
|
-
|
|
150
|
-
success: boolean;
|
|
149
|
+
interface MigrationProgress {
|
|
151
150
|
processed: number;
|
|
152
|
-
|
|
151
|
+
total: number;
|
|
152
|
+
currentBatch: number;
|
|
153
|
+
totalBatches: number;
|
|
154
|
+
isComplete: boolean;
|
|
155
|
+
errors: string[];
|
|
156
|
+
}
|
|
157
|
+
export declare function handleGetTagMigrationProgress(): Promise<ApiResponse<MigrationProgress>>;
|
|
158
|
+
export declare function handleRunTagMigrationBatch(batchSize?: number): Promise<ApiResponse<{
|
|
159
|
+
processed: number;
|
|
160
|
+
total: number;
|
|
161
|
+
hasMore: boolean;
|
|
153
162
|
}>>;
|
|
154
163
|
export {};
|
|
155
164
|
//# 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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"}
|
|
@@ -800,9 +800,19 @@ export async function handleDetectTagMigration() {
|
|
|
800
800
|
return { success: false, error: String(error) };
|
|
801
801
|
}
|
|
802
802
|
}
|
|
803
|
-
|
|
803
|
+
let migrationProgress = {
|
|
804
|
+
processed: 0,
|
|
805
|
+
total: 0,
|
|
806
|
+
currentBatch: 0,
|
|
807
|
+
totalBatches: 0,
|
|
808
|
+
isComplete: true,
|
|
809
|
+
errors: [],
|
|
810
|
+
};
|
|
811
|
+
export async function handleGetTagMigrationProgress() {
|
|
812
|
+
return { success: true, data: migrationProgress };
|
|
813
|
+
}
|
|
814
|
+
export async function handleRunTagMigrationBatch(batchSize = 5) {
|
|
804
815
|
try {
|
|
805
|
-
const startTime = Date.now();
|
|
806
816
|
const { AIProviderFactory } = await import("./ai/ai-provider-factory.js");
|
|
807
817
|
const providerConfig = {
|
|
808
818
|
model: CONFIG.memoryModel,
|
|
@@ -813,54 +823,83 @@ export async function handleRunTagMigration() {
|
|
|
813
823
|
};
|
|
814
824
|
const provider = AIProviderFactory.createProvider(CONFIG.memoryProvider, providerConfig);
|
|
815
825
|
const projectShards = shardManager.getAllShards("project", "");
|
|
816
|
-
let
|
|
826
|
+
let batchProcessed = 0;
|
|
827
|
+
const allMemories = [];
|
|
817
828
|
for (const shard of projectShards) {
|
|
818
829
|
const db = connectionManager.getConnection(shard.dbPath);
|
|
819
830
|
const memories = db.prepare("SELECT * FROM memories").all();
|
|
820
831
|
for (const m of memories) {
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
832
|
+
allMemories.push({ memory: m, shard });
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
if (migrationProgress.total === 0) {
|
|
836
|
+
migrationProgress.total = allMemories.length;
|
|
837
|
+
migrationProgress.totalBatches = Math.ceil(allMemories.length / batchSize);
|
|
838
|
+
migrationProgress.isComplete = false;
|
|
839
|
+
}
|
|
840
|
+
const startIdx = migrationProgress.processed;
|
|
841
|
+
const endIdx = Math.min(startIdx + batchSize, allMemories.length);
|
|
842
|
+
for (let i = startIdx; i < endIdx; i++) {
|
|
843
|
+
const item = allMemories[i];
|
|
844
|
+
if (!item)
|
|
845
|
+
continue;
|
|
846
|
+
const { memory: m, shard } = item;
|
|
847
|
+
const db = connectionManager.getConnection(shard.dbPath);
|
|
848
|
+
try {
|
|
849
|
+
let currentTags = m.tags
|
|
850
|
+
? m.tags
|
|
851
|
+
.split(",")
|
|
852
|
+
.map((t) => t.trim().toLowerCase())
|
|
853
|
+
.filter((t) => t)
|
|
854
|
+
: [];
|
|
855
|
+
if (currentTags.length === 0) {
|
|
856
|
+
const prompt = `Generate 2-4 short technical tags for this memory content:\n\n${m.content}\n\nReturn ONLY a comma-separated list of tags.`;
|
|
857
|
+
const result = await provider.executeToolCall("You are a technical tagger.", prompt, {
|
|
858
|
+
type: "function",
|
|
859
|
+
function: {
|
|
860
|
+
name: "save_tags",
|
|
861
|
+
description: "Save generated tags",
|
|
862
|
+
parameters: {
|
|
863
|
+
type: "object",
|
|
864
|
+
properties: { tags: { type: "array", items: { type: "string" } } },
|
|
865
|
+
required: ["tags"],
|
|
840
866
|
},
|
|
841
|
-
},
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
867
|
+
},
|
|
868
|
+
}, `migration_${m.id}`);
|
|
869
|
+
if (result.success && result.data?.tags) {
|
|
870
|
+
currentTags = result.data.tags;
|
|
871
|
+
db.prepare("UPDATE memories SET tags = ? WHERE id = ?").run(currentTags.join(","), m.id);
|
|
846
872
|
}
|
|
847
|
-
const vector = await embeddingService.embedWithTimeout(m.content);
|
|
848
|
-
const vectorBuffer = new Uint8Array(vector.buffer);
|
|
849
|
-
db.prepare("UPDATE memories SET vector = ?, updated_at = ? WHERE id = ?").run(vectorBuffer, Date.now(), m.id);
|
|
850
|
-
db.prepare("INSERT OR REPLACE INTO vec_memories (memory_id, embedding) VALUES (?, ?)").run(m.id, vectorBuffer);
|
|
851
|
-
if (currentTags.length > 0) {
|
|
852
|
-
const tagsVector = await embeddingService.embedWithTimeout(currentTags.join(", "));
|
|
853
|
-
const tagsVectorBuffer = new Uint8Array(tagsVector.buffer);
|
|
854
|
-
db.prepare("INSERT OR REPLACE INTO vec_tags (memory_id, embedding) VALUES (?, ?)").run(m.id, tagsVectorBuffer);
|
|
855
|
-
}
|
|
856
|
-
processed++;
|
|
857
873
|
}
|
|
858
|
-
|
|
859
|
-
|
|
874
|
+
const vector = await embeddingService.embedWithTimeout(m.content);
|
|
875
|
+
const vectorBuffer = new Uint8Array(vector.buffer);
|
|
876
|
+
db.prepare("UPDATE memories SET vector = ?, updated_at = ? WHERE id = ?").run(vectorBuffer, Date.now(), m.id);
|
|
877
|
+
db.prepare("DELETE FROM vec_memories WHERE memory_id = ?").run(m.id);
|
|
878
|
+
db.prepare("INSERT INTO vec_memories (memory_id, embedding) VALUES (?, ?)").run(m.id, vectorBuffer);
|
|
879
|
+
if (currentTags.length > 0) {
|
|
880
|
+
const tagsVector = await embeddingService.embedWithTimeout(currentTags.join(", "));
|
|
881
|
+
const tagsVectorBuffer = new Uint8Array(tagsVector.buffer);
|
|
882
|
+
db.prepare("DELETE FROM vec_tags WHERE memory_id = ?").run(m.id);
|
|
883
|
+
db.prepare("INSERT INTO vec_tags (memory_id, embedding) VALUES (?, ?)").run(m.id, tagsVectorBuffer);
|
|
860
884
|
}
|
|
885
|
+
migrationProgress.processed++;
|
|
886
|
+
batchProcessed++;
|
|
887
|
+
}
|
|
888
|
+
catch (e) {
|
|
889
|
+
const errorMsg = String(e);
|
|
890
|
+
migrationProgress.errors.push(errorMsg);
|
|
891
|
+
log("Migration error for memory", { id: m.id, error: errorMsg });
|
|
861
892
|
}
|
|
862
893
|
}
|
|
863
|
-
|
|
894
|
+
migrationProgress.currentBatch++;
|
|
895
|
+
const hasMore = migrationProgress.processed < migrationProgress.total;
|
|
896
|
+
if (!hasMore) {
|
|
897
|
+
migrationProgress.isComplete = true;
|
|
898
|
+
}
|
|
899
|
+
return {
|
|
900
|
+
success: true,
|
|
901
|
+
data: { processed: migrationProgress.processed, total: migrationProgress.total, hasMore },
|
|
902
|
+
};
|
|
864
903
|
}
|
|
865
904
|
catch (error) {
|
|
866
905
|
return { success: false, error: String(error) };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"privacy.d.ts","sourceRoot":"","sources":["../../src/services/privacy.ts"],"names":[],"mappings":"AAAA,wBAAgB,
|
|
1
|
+
{"version":3,"file":"privacy.d.ts","sourceRoot":"","sources":["../../src/services/privacy.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGvD"}
|
package/dist/services/privacy.js
CHANGED
|
@@ -5,6 +5,7 @@ export declare class VectorSearch {
|
|
|
5
5
|
searchInShard(shard: ShardInfo, queryVector: Float32Array, containerTag: string, limit: number, queryText?: string): SearchResult[];
|
|
6
6
|
searchAcrossShards(shards: ShardInfo[], queryVector: Float32Array, containerTag: string, limit: number, similarityThreshold: number, queryText?: string): Promise<SearchResult[]>;
|
|
7
7
|
deleteVector(db: Database, memoryId: string): void;
|
|
8
|
+
updateVector(db: Database, memoryId: string, vector: Float32Array, tagsVector?: Float32Array): void;
|
|
8
9
|
listMemories(db: Database, containerTag: string, limit: number): any[];
|
|
9
10
|
getAllMemories(db: Database): any[];
|
|
10
11
|
getMemoryById(db: Database, memoryId: string): any | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vector-search.d.ts","sourceRoot":"","sources":["../../../src/services/sqlite/vector-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExE,qBAAa,YAAY;IACvB,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI;IA0CtD,aAAa,CACX,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,YAAY,EACzB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,GACjB,YAAY,EAAE;IA0FX,kBAAkB,CACtB,MAAM,EAAE,SAAS,EAAE,EACnB,WAAW,EAAE,YAAY,EACzB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,mBAAmB,EAAE,MAAM,EAC3B,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC;IAiB1B,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMlD,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE;IAWtE,cAAc,CAAC,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE;IAKnC,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI;IAKzD,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAMxD,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM;IAMrC,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE;IAepC,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK/C,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;CAIlD;AAED,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"vector-search.d.ts","sourceRoot":"","sources":["../../../src/services/sqlite/vector-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExE,qBAAa,YAAY;IACvB,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI;IA0CtD,aAAa,CACX,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,YAAY,EACzB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,GACjB,YAAY,EAAE;IA0FX,kBAAkB,CACtB,MAAM,EAAE,SAAS,EAAE,EACnB,WAAW,EAAE,YAAY,EACzB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,mBAAmB,EAAE,MAAM,EAC3B,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC;IAiB1B,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMlD,YAAY,CACV,EAAE,EAAE,QAAQ,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,EACpB,UAAU,CAAC,EAAE,YAAY,GACxB,IAAI;IAkBP,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE;IAWtE,cAAc,CAAC,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE;IAKnC,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI;IAKzD,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAMxD,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM;IAMrC,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE;IAepC,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK/C,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;CAIlD;AAED,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|
|
@@ -113,6 +113,16 @@ export class VectorSearch {
|
|
|
113
113
|
db.prepare(`DELETE FROM vec_tags WHERE memory_id = ?`).run(memoryId);
|
|
114
114
|
db.prepare(`DELETE FROM memories WHERE id = ?`).run(memoryId);
|
|
115
115
|
}
|
|
116
|
+
updateVector(db, memoryId, vector, tagsVector) {
|
|
117
|
+
const vectorBuffer = new Uint8Array(vector.buffer);
|
|
118
|
+
db.prepare(`DELETE FROM vec_memories WHERE memory_id = ?`).run(memoryId);
|
|
119
|
+
db.prepare(`INSERT INTO vec_memories (memory_id, embedding) VALUES (?, ?)`).run(memoryId, vectorBuffer);
|
|
120
|
+
if (tagsVector) {
|
|
121
|
+
const tagsVectorBuffer = new Uint8Array(tagsVector.buffer);
|
|
122
|
+
db.prepare(`DELETE FROM vec_tags WHERE memory_id = ?`).run(memoryId);
|
|
123
|
+
db.prepare(`INSERT INTO vec_tags (memory_id, embedding) VALUES (?, ?)`).run(memoryId, tagsVectorBuffer);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
116
126
|
listMemories(db, containerTag, limit) {
|
|
117
127
|
const stmt = db.prepare(`
|
|
118
128
|
SELECT * FROM memories
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
2
|
import { join, dirname } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { handleListTags, handleListMemories, handleAddMemory, handleDeleteMemory, handleBulkDelete, handleUpdateMemory, handleSearch, handleStats, handlePinMemory, handleUnpinMemory, handleRunCleanup, handleRunDeduplication, handleDetectMigration, handleRunMigration, handleDetectTagMigration,
|
|
4
|
+
import { handleListTags, handleListMemories, handleAddMemory, handleDeleteMemory, handleBulkDelete, handleUpdateMemory, handleSearch, handleStats, handlePinMemory, handleUnpinMemory, handleRunCleanup, handleRunDeduplication, handleDetectMigration, handleRunMigration, handleDetectTagMigration, handleRunTagMigrationBatch, handleGetTagMigrationProgress, handleDeletePrompt, handleBulkDeletePrompts, handleGetUserProfile, handleGetProfileChangelog, handleGetProfileSnapshot, handleRefreshProfile, } from "./api-handlers.js";
|
|
5
5
|
const __filename = fileURLToPath(import.meta.url);
|
|
6
6
|
const __dirname = dirname(__filename);
|
|
7
7
|
let server = null;
|
|
@@ -111,8 +111,14 @@ async function handleRequest(req) {
|
|
|
111
111
|
const result = await handleDetectTagMigration();
|
|
112
112
|
return jsonResponse(result);
|
|
113
113
|
}
|
|
114
|
-
if (path === "/api/migration/tags/run" && method === "POST") {
|
|
115
|
-
const
|
|
114
|
+
if (path === "/api/migration/tags/run-batch" && method === "POST") {
|
|
115
|
+
const body = (await req.json());
|
|
116
|
+
const batchSize = body?.batchSize || 5;
|
|
117
|
+
const result = await handleRunTagMigrationBatch(batchSize);
|
|
118
|
+
return jsonResponse(result);
|
|
119
|
+
}
|
|
120
|
+
if (path === "/api/migration/tags/progress" && method === "GET") {
|
|
121
|
+
const result = await handleGetTagMigrationProgress();
|
|
116
122
|
return jsonResponse(result);
|
|
117
123
|
}
|
|
118
124
|
if (path === "/api/migration/run" && method === "POST") {
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,35 +1,4 @@
|
|
|
1
|
-
export type MemoryScope = "user" | "project";
|
|
2
1
|
export type MemoryType = string;
|
|
3
|
-
export type ConversationRole = "user" | "assistant" | "system" | "tool";
|
|
4
|
-
export type ConversationContentPart = {
|
|
5
|
-
type: "text";
|
|
6
|
-
text: string;
|
|
7
|
-
} | {
|
|
8
|
-
type: "image_url";
|
|
9
|
-
imageUrl: {
|
|
10
|
-
url: string;
|
|
11
|
-
};
|
|
12
|
-
};
|
|
13
|
-
export interface ConversationToolCall {
|
|
14
|
-
id: string;
|
|
15
|
-
type: "function";
|
|
16
|
-
function: {
|
|
17
|
-
name: string;
|
|
18
|
-
arguments: string;
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
export interface ConversationMessage {
|
|
22
|
-
role: ConversationRole;
|
|
23
|
-
content: string | ConversationContentPart[];
|
|
24
|
-
name?: string;
|
|
25
|
-
tool_calls?: ConversationToolCall[];
|
|
26
|
-
tool_call_id?: string;
|
|
27
|
-
}
|
|
28
|
-
export interface ConversationIngestResponse {
|
|
29
|
-
id: string;
|
|
30
|
-
conversationId: string;
|
|
31
|
-
status: string;
|
|
32
|
-
}
|
|
33
2
|
export interface MemoryMetadata {
|
|
34
3
|
type?: MemoryType;
|
|
35
4
|
source?: "manual" | "auto-capture" | "import" | "api";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE,QAAQ,GAAG,cAAc,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,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,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,kBAAkB,GAAG,WAAW,CAAC"}
|
package/dist/web/app.js
CHANGED
|
@@ -30,7 +30,13 @@ function renderMarkdown(markdown) {
|
|
|
30
30
|
|
|
31
31
|
async function fetchAPI(endpoint, options = {}) {
|
|
32
32
|
try {
|
|
33
|
-
const
|
|
33
|
+
const controller = new AbortController();
|
|
34
|
+
const timeoutId = setTimeout(() => controller.abort(), 60000);
|
|
35
|
+
const response = await fetch(API_BASE + endpoint, {
|
|
36
|
+
...options,
|
|
37
|
+
signal: controller.signal,
|
|
38
|
+
});
|
|
39
|
+
clearTimeout(timeoutId);
|
|
34
40
|
const data = await response.json();
|
|
35
41
|
return data;
|
|
36
42
|
} catch (error) {
|
|
@@ -73,40 +79,6 @@ function populateTagDropdowns() {
|
|
|
73
79
|
});
|
|
74
80
|
}
|
|
75
81
|
|
|
76
|
-
async function loadMemories() {
|
|
77
|
-
showRefreshIndicator(true);
|
|
78
|
-
|
|
79
|
-
let endpoint = `/api/memories?page=${state.currentPage}&pageSize=${state.pageSize}&includePrompts=true`;
|
|
80
|
-
|
|
81
|
-
if (state.isSearching && state.searchQuery) {
|
|
82
|
-
endpoint = `/api/search?q=${encodeURIComponent(state.searchQuery)}&page=${state.currentPage}&pageSize=${state.pageSize}`;
|
|
83
|
-
if (state.selectedTag) {
|
|
84
|
-
endpoint += `&tag=${encodeURIComponent(state.selectedTag)}`;
|
|
85
|
-
}
|
|
86
|
-
} else {
|
|
87
|
-
if (state.selectedTag) {
|
|
88
|
-
endpoint += `&tag=${encodeURIComponent(state.selectedTag)}`;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const result = await fetchAPI(endpoint);
|
|
93
|
-
|
|
94
|
-
showRefreshIndicator(false);
|
|
95
|
-
|
|
96
|
-
if (result.success) {
|
|
97
|
-
state.memories = result.data.items;
|
|
98
|
-
state.totalPages = result.data.totalPages;
|
|
99
|
-
state.totalItems = result.data.total;
|
|
100
|
-
state.currentPage = result.data.page;
|
|
101
|
-
|
|
102
|
-
renderMemories();
|
|
103
|
-
updatePagination();
|
|
104
|
-
updateSectionTitle();
|
|
105
|
-
} else {
|
|
106
|
-
showError(result.error || "Failed to load memories");
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
82
|
function renderMemories() {
|
|
111
83
|
const container = document.getElementById("memories-list");
|
|
112
84
|
|
|
@@ -437,23 +409,6 @@ async function addMemory(e) {
|
|
|
437
409
|
}
|
|
438
410
|
}
|
|
439
411
|
|
|
440
|
-
function performSearch() {
|
|
441
|
-
const input = document.getElementById("search-input").value.trim();
|
|
442
|
-
|
|
443
|
-
if (!input) {
|
|
444
|
-
clearSearch();
|
|
445
|
-
return;
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
state.searchQuery = input;
|
|
449
|
-
state.isSearching = true;
|
|
450
|
-
state.currentPage = 1;
|
|
451
|
-
|
|
452
|
-
document.getElementById("clear-search-btn").classList.remove("hidden");
|
|
453
|
-
|
|
454
|
-
loadMemories();
|
|
455
|
-
}
|
|
456
|
-
|
|
457
412
|
async function loadMemories() {
|
|
458
413
|
showRefreshIndicator(true);
|
|
459
414
|
|
|
@@ -655,23 +610,6 @@ function changePage(delta) {
|
|
|
655
610
|
loadMemories();
|
|
656
611
|
}
|
|
657
612
|
|
|
658
|
-
function handleAddScopeChange() {
|
|
659
|
-
const tagDropdown = document.getElementById("add-tag");
|
|
660
|
-
|
|
661
|
-
tagDropdown.innerHTML = '<option value="">Select tag</option>';
|
|
662
|
-
|
|
663
|
-
const tags = state.tags.project;
|
|
664
|
-
tags.forEach((tagInfo) => {
|
|
665
|
-
const displayText = tagInfo.displayName || tagInfo.tag;
|
|
666
|
-
const shortDisplay =
|
|
667
|
-
displayText.length > 50 ? displayText.substring(0, 50) + "..." : displayText;
|
|
668
|
-
const option = document.createElement("option");
|
|
669
|
-
option.value = tagInfo.tag;
|
|
670
|
-
option.textContent = shortDisplay;
|
|
671
|
-
tagDropdown.appendChild(option);
|
|
672
|
-
});
|
|
673
|
-
}
|
|
674
|
-
|
|
675
613
|
function showToast(message, type = "success") {
|
|
676
614
|
const toast = document.getElementById("toast");
|
|
677
615
|
toast.textContent = message;
|
|
@@ -809,24 +747,55 @@ async function runTagMigration() {
|
|
|
809
747
|
const progress = document.getElementById("tag-migration-progress");
|
|
810
748
|
|
|
811
749
|
actions.classList.add("hidden");
|
|
812
|
-
status.textContent = "
|
|
813
|
-
progress.style.width = "
|
|
750
|
+
status.textContent = "Starting migration...";
|
|
751
|
+
progress.style.width = "0%";
|
|
814
752
|
|
|
815
|
-
|
|
753
|
+
let totalProcessed = 0;
|
|
754
|
+
let hasMore = true;
|
|
755
|
+
let attempts = 0;
|
|
756
|
+
const maxAttempts = 1000;
|
|
816
757
|
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
758
|
+
while (hasMore && attempts < maxAttempts) {
|
|
759
|
+
attempts++;
|
|
760
|
+
const result = await fetchAPI("/api/migration/tags/run-batch", {
|
|
761
|
+
method: "POST",
|
|
762
|
+
headers: { "Content-Type": "application/json" },
|
|
763
|
+
body: JSON.stringify({ batchSize: 3 }),
|
|
764
|
+
});
|
|
765
|
+
|
|
766
|
+
if (!result.success) {
|
|
767
|
+
status.textContent = "Migration failed: " + result.error;
|
|
768
|
+
actions.classList.remove("hidden");
|
|
769
|
+
return;
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
totalProcessed = result.data.processed;
|
|
773
|
+
hasMore = result.data.hasMore;
|
|
774
|
+
const total = result.data.total;
|
|
775
|
+
const percent = total > 0 ? Math.round((totalProcessed / total) * 100) : 0;
|
|
776
|
+
|
|
777
|
+
progress.style.width = percent + "%";
|
|
778
|
+
status.textContent = `Processing memories... ${totalProcessed}/${total} (${percent}%)`;
|
|
779
|
+
|
|
780
|
+
if (hasMore) {
|
|
781
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
if (attempts >= maxAttempts) {
|
|
786
|
+
status.textContent = "Migration stopped: maximum attempts reached";
|
|
828
787
|
actions.classList.remove("hidden");
|
|
788
|
+
return;
|
|
829
789
|
}
|
|
790
|
+
|
|
791
|
+
progress.style.width = "100%";
|
|
792
|
+
status.textContent = `Successfully tagged ${totalProcessed} memories!`;
|
|
793
|
+
showToast("Migration complete", "success");
|
|
794
|
+
setTimeout(() => {
|
|
795
|
+
document.getElementById("tag-migration-overlay").classList.add("hidden");
|
|
796
|
+
loadMemories();
|
|
797
|
+
loadStats();
|
|
798
|
+
}, 2000);
|
|
830
799
|
}
|
|
831
800
|
|
|
832
801
|
function showMigrationWarning(data) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-mem",
|
|
3
|
-
"version": "2.7.
|
|
3
|
+
"version": "2.7.5",
|
|
4
4
|
"description": "OpenCode plugin that gives coding agents persistent memory using local vector database",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/plugin.js",
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
"dev": "tsc --watch",
|
|
11
11
|
"typecheck": "tsc --noEmit",
|
|
12
12
|
"format": "prettier --write \"src/**/*.{ts,js,css,html}\"",
|
|
13
|
-
"format:check": "prettier --check \"src/**/*.{ts,js,css,html}\""
|
|
13
|
+
"format:check": "prettier --check \"src/**/*.{ts,js,css,html}\"",
|
|
14
|
+
"prepare": "husky"
|
|
14
15
|
},
|
|
15
16
|
"keywords": [
|
|
16
17
|
"opencode",
|
|
@@ -39,7 +40,9 @@
|
|
|
39
40
|
"sqlite-vec": "^0.1.7-alpha.2"
|
|
40
41
|
},
|
|
41
42
|
"devDependencies": {
|
|
42
|
-
"@types/bun": "
|
|
43
|
+
"@types/bun": "^1.3.8",
|
|
44
|
+
"husky": "^9.1.7",
|
|
45
|
+
"lint-staged": "^16.2.7",
|
|
43
46
|
"prettier": "^3.4.2",
|
|
44
47
|
"typescript": "^5.7.3"
|
|
45
48
|
},
|
|
@@ -53,5 +56,10 @@
|
|
|
53
56
|
"files": [
|
|
54
57
|
"dist",
|
|
55
58
|
"package.json"
|
|
56
|
-
]
|
|
59
|
+
],
|
|
60
|
+
"lint-staged": {
|
|
61
|
+
"*.{ts,tsx,js,jsx,css,html,json,md}": [
|
|
62
|
+
"prettier --write"
|
|
63
|
+
]
|
|
64
|
+
}
|
|
57
65
|
}
|