@haisto/opencode-mem 2.14.3-beta.4 → 2.14.3-beta.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"google-gemini.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/providers/google-gemini.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;AAIlE;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,cAAc;IACtD,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;IA4BjB,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;CA2N3B"}
1
+ {"version":3,"file":"google-gemini.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/providers/google-gemini.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;AAIlE;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,cAAc;IACtD,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;IA4BjB,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;CAiO3B"}
@@ -193,6 +193,15 @@ export class GoogleGeminiProvider extends BaseAIProvider {
193
193
  if (toolCall.function.name === toolSchema.function.name) {
194
194
  try {
195
195
  const parsed = JSON.parse(toolCall.function.arguments);
196
+ // Recover when the model double-encodes arrays as JSON strings
197
+ for (const key of ["preferences", "patterns", "workflows"]) {
198
+ if (typeof parsed[key] === "string") {
199
+ try {
200
+ parsed[key] = JSON.parse(parsed[key]);
201
+ }
202
+ catch { /* keep as-is */ }
203
+ }
204
+ }
196
205
  const result = UserProfileValidator.validate(parsed);
197
206
  if (!result.valid)
198
207
  throw new Error(result.errors.join(", "));
@@ -202,13 +211,13 @@ export class GoogleGeminiProvider extends BaseAIProvider {
202
211
  catch (validationError) {
203
212
  const errorMessage = `Validation failed: ${String(validationError)}`;
204
213
  this.addToolResponse(session.id, contents, toolCall.id, JSON.stringify({ success: false, error: errorMessage }));
205
- return { success: false, error: errorMessage, iterations };
214
+ break;
206
215
  }
207
216
  }
208
217
  }
209
218
  }
210
219
  // Retry if no tool call was made
211
- const retryPrompt = "Please use the save_memories tool as instructed.";
220
+ const retryPrompt = `Please use the ${toolSchema.function.name} tool as instructed.`;
212
221
  const retrySequence = this.aiSessionManager.getLastSequence(session.id) + 1;
213
222
  this.aiSessionManager.addMessage({
214
223
  aiSessionId: session.id,
@@ -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,EACL,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,cAAc,EAEpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAgElE,qBAAa,4BAA6B,SAAQ,cAAc;IAC9D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;gBAExC,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB;IAKtE,eAAe,IAAI,MAAM;IAIzB,eAAe,IAAI,OAAO;IAI1B,OAAO,CAAC,eAAe;IAqBvB,SAAS,CAAC,iCAAiC,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;IAwCzE,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;CAmS3B"}
1
+ {"version":3,"file":"openai-chat-completion.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/providers/openai-chat-completion.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,cAAc,EAEpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAgElE,qBAAa,4BAA6B,SAAQ,cAAc;IAC9D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;gBAExC,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB;IAKtE,eAAe,IAAI,MAAM;IAIzB,eAAe,IAAI,OAAO;IAI1B,OAAO,CAAC,eAAe;IAqBvB,SAAS,CAAC,iCAAiC,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;IAwCzE,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;CAoS3B"}
@@ -245,7 +245,16 @@ export class OpenAIChatCompletionProvider extends BaseAIProvider {
245
245
  const toolCallId = toolCall.id;
246
246
  if (toolCall.function.name === toolSchema.function.name) {
247
247
  try {
248
- const parsed = JSON.parse(toolCall.function.arguments);
248
+ let parsed = JSON.parse(toolCall.function.arguments);
249
+ // Recover when the model double-encodes arrays as JSON strings
250
+ for (const key of ["preferences", "patterns", "workflows"]) {
251
+ if (typeof parsed[key] === "string") {
252
+ try {
253
+ parsed[key] = JSON.parse(parsed[key]);
254
+ }
255
+ catch { /* keep as-is */ }
256
+ }
257
+ }
249
258
  const result = UserProfileValidator.validate(parsed);
250
259
  if (!result.valid) {
251
260
  throw new Error(result.errors.join(", "));
@@ -271,11 +280,7 @@ export class OpenAIChatCompletionProvider extends BaseAIProvider {
271
280
  });
272
281
  const errorMessage = `Validation failed: ${String(validationError)}`;
273
282
  this.addToolResponse(session.id, messages, toolCallId, JSON.stringify({ success: false, error: errorMessage }));
274
- return {
275
- success: false,
276
- error: errorMessage,
277
- iterations,
278
- };
283
+ break;
279
284
  }
280
285
  }
281
286
  const wrongToolMessage = `Wrong tool called. Please use ${toolSchema.function.name} instead.`;
@@ -284,7 +289,7 @@ export class OpenAIChatCompletionProvider extends BaseAIProvider {
284
289
  }
285
290
  }
286
291
  const retrySequence = this.aiSessionManager.getLastSequence(session.id) + 1;
287
- const retryPrompt = "Please use the save_memories tool to extract and save the memories from the conversation as instructed.";
292
+ const retryPrompt = `Please use the ${toolSchema.function.name} tool as instructed.`;
288
293
  this.aiSessionManager.addMessage({
289
294
  aiSessionId: session.id,
290
295
  sequence: retrySequence,
@@ -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,EAAwB,MAAM,oBAAoB,CAAC;AAC/F,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;IA0H1B,OAAO,CAAC,eAAe;IA+BvB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,gBAAgB;CAsBzB"}
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,EAAwB,MAAM,oBAAoB,CAAC;AAC/F,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;IA0H1B,OAAO,CAAC,eAAe;IAqCvB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,gBAAgB;CAsBzB"}
@@ -127,6 +127,15 @@ export class OpenAIResponsesProvider extends BaseAIProvider {
127
127
  if (item.arguments) {
128
128
  try {
129
129
  const parsed = JSON.parse(item.arguments);
130
+ // Recover when the model double-encodes arrays as JSON strings
131
+ for (const key of ["preferences", "patterns", "workflows"]) {
132
+ if (typeof parsed[key] === "string") {
133
+ try {
134
+ parsed[key] = JSON.parse(parsed[key]);
135
+ }
136
+ catch { /* keep as-is */ }
137
+ }
138
+ }
130
139
  return parsed;
131
140
  }
132
141
  catch (error) {
@@ -142,6 +142,9 @@ export declare function handleGetUserProfile(userId?: string): Promise<ApiRespon
142
142
  export declare function handleGetProfileChangelog(profileId: string, limit?: number): Promise<ApiResponse<any[]>>;
143
143
  export declare function handleGetProfileSnapshot(changelogId: string): Promise<ApiResponse<any>>;
144
144
  export declare function handleRefreshProfile(userId?: string): Promise<ApiResponse<any>>;
145
+ export declare function handleDeleteProfilePreferences(body: any): Promise<ApiResponse<any>>;
146
+ export declare function handleDeleteProfilePatterns(body: any): Promise<ApiResponse<any>>;
147
+ export declare function handleDeleteProfileWorkflows(body: any): Promise<ApiResponse<any>>;
145
148
  export declare function handleDetectTagMigration(): Promise<ApiResponse<{
146
149
  needsMigration: boolean;
147
150
  count: number;
@@ -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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"}
@@ -809,6 +809,57 @@ export async function handleRefreshProfile(userId) {
809
809
  return { success: false, error: String(error) };
810
810
  }
811
811
  }
812
+ export async function handleDeleteProfilePreferences(body) {
813
+ try {
814
+ const { profileId, indexes } = body;
815
+ if (!profileId)
816
+ return { success: false, error: "profileId is required" };
817
+ if (!Array.isArray(indexes) || indexes.length === 0) {
818
+ return { success: false, error: "indexes must be a non-empty array" };
819
+ }
820
+ const { userProfileManager } = await import("./user-profile/user-profile-manager.js");
821
+ userProfileManager.deletePreferences(profileId, indexes);
822
+ return { success: true, data: { message: `Deleted ${indexes.length} preference(s)` } };
823
+ }
824
+ catch (error) {
825
+ log("handleDeleteProfilePreferences: error", { error: String(error) });
826
+ return { success: false, error: String(error) };
827
+ }
828
+ }
829
+ export async function handleDeleteProfilePatterns(body) {
830
+ try {
831
+ const { profileId, indexes } = body;
832
+ if (!profileId)
833
+ return { success: false, error: "profileId is required" };
834
+ if (!Array.isArray(indexes) || indexes.length === 0) {
835
+ return { success: false, error: "indexes must be a non-empty array" };
836
+ }
837
+ const { userProfileManager } = await import("./user-profile/user-profile-manager.js");
838
+ userProfileManager.deletePatterns(profileId, indexes);
839
+ return { success: true, data: { message: `Deleted ${indexes.length} pattern(s)` } };
840
+ }
841
+ catch (error) {
842
+ log("handleDeleteProfilePatterns: error", { error: String(error) });
843
+ return { success: false, error: String(error) };
844
+ }
845
+ }
846
+ export async function handleDeleteProfileWorkflows(body) {
847
+ try {
848
+ const { profileId, indexes } = body;
849
+ if (!profileId)
850
+ return { success: false, error: "profileId is required" };
851
+ if (!Array.isArray(indexes) || indexes.length === 0) {
852
+ return { success: false, error: "indexes must be a non-empty array" };
853
+ }
854
+ const { userProfileManager } = await import("./user-profile/user-profile-manager.js");
855
+ userProfileManager.deleteWorkflows(profileId, indexes);
856
+ return { success: true, data: { message: `Deleted ${indexes.length} workflow(s)` } };
857
+ }
858
+ catch (error) {
859
+ log("handleDeleteProfileWorkflows: error", { error: String(error) });
860
+ return { success: false, error: String(error) };
861
+ }
862
+ }
812
863
  export async function handleDetectTagMigration() {
813
864
  try {
814
865
  const projectShards = shardManager.getAllShards("project", "");
@@ -7,6 +7,13 @@ export declare class UserProfileManager {
7
7
  getActiveProfile(userId: string): UserProfile | null;
8
8
  createProfile(userId: string, displayName: string, userName: string, userEmail: string, profileData: UserProfileData, promptsAnalyzed: number): string;
9
9
  updateProfile(profileId: string, profileData: UserProfileData, additionalPromptsAnalyzed: number, changeSummary: string): void;
10
+ /**
11
+ * Delete specific preferences by their array indices.
12
+ * Indices are sorted descending so splice doesn't shift unspliced indexes.
13
+ */
14
+ deletePreferences(profileId: string, indexes: number[]): void;
15
+ deletePatterns(profileId: string, indexes: number[]): void;
16
+ deleteWorkflows(profileId: string, indexes: number[]): void;
10
17
  private addChangelog;
11
18
  private cleanupOldChangelogs;
12
19
  getProfileChangelogs(profileId: string, limit?: number): UserProfileChangelog[];
@@ -1 +1 @@
1
- {"version":3,"file":"user-profile-manager.d.ts","sourceRoot":"","sources":["../../../src/services/user-profile/user-profile-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AASrF,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAe;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;IAQhC,OAAO,CAAC,YAAY;IA0CpB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAapD,aAAa,CACX,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,eAAe,EAC5B,eAAe,EAAE,MAAM,GACtB,MAAM;IAoCT,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,eAAe,EAC5B,yBAAyB,EAAE,MAAM,EACjC,aAAa,EAAE,MAAM,GACpB,IAAI;IAmCP,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,oBAAoB;IAiB5B,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,oBAAoB,EAAE;IAYnF,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IA+F7C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKtC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAOrD,oBAAoB,IAAI,WAAW,EAAE;IAMrC,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,cAAc;IAYtB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe;IAsG/F,OAAO,CAAC,WAAW;CAWpB;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
1
+ {"version":3,"file":"user-profile-manager.d.ts","sourceRoot":"","sources":["../../../src/services/user-profile/user-profile-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AASrF,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAe;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;IAQhC,OAAO,CAAC,YAAY;IA0CpB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAapD,aAAa,CACX,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,eAAe,EAC5B,eAAe,EAAE,MAAM,GACtB,MAAM;IAoCT,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,eAAe,EAC5B,yBAAyB,EAAE,MAAM,EACjC,aAAa,EAAE,MAAM,GACpB,IAAI;IAmCP;;;OAGG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAgB7D,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAgB1D,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAgB3D,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,oBAAoB;IAiB5B,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,oBAAoB,EAAE;IAYnF,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IA+F7C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKtC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAOrD,oBAAoB,IAAI,WAAW,EAAE;IAMrC,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,cAAc;IAYtB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe;IAsG/F,OAAO,CAAC,WAAW;CAWpB;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
@@ -100,6 +100,49 @@ export class UserProfileManager {
100
100
  this.addChangelog(profileId, newVersion, "update", changeSummary, cleanedData);
101
101
  this.cleanupOldChangelogs(profileId);
102
102
  }
103
+ /**
104
+ * Delete specific preferences by their array indices.
105
+ * Indices are sorted descending so splice doesn't shift unspliced indexes.
106
+ */
107
+ deletePreferences(profileId, indexes) {
108
+ const profile = this.getProfileById(profileId);
109
+ if (!profile)
110
+ throw new Error(`Profile not found: ${profileId}`);
111
+ const data = JSON.parse(profile.profileData);
112
+ const sorted = [...indexes].sort((a, b) => b - a);
113
+ for (const idx of sorted) {
114
+ if (idx >= 0 && idx < data.preferences.length) {
115
+ data.preferences.splice(idx, 1);
116
+ }
117
+ }
118
+ this.updateProfile(profileId, data, 0, `Deleted ${indexes.length} preference(s)`);
119
+ }
120
+ deletePatterns(profileId, indexes) {
121
+ const profile = this.getProfileById(profileId);
122
+ if (!profile)
123
+ throw new Error(`Profile not found: ${profileId}`);
124
+ const data = JSON.parse(profile.profileData);
125
+ const sorted = [...indexes].sort((a, b) => b - a);
126
+ for (const idx of sorted) {
127
+ if (idx >= 0 && idx < data.patterns.length) {
128
+ data.patterns.splice(idx, 1);
129
+ }
130
+ }
131
+ this.updateProfile(profileId, data, 0, `Deleted ${indexes.length} pattern(s)`);
132
+ }
133
+ deleteWorkflows(profileId, indexes) {
134
+ const profile = this.getProfileById(profileId);
135
+ if (!profile)
136
+ throw new Error(`Profile not found: ${profileId}`);
137
+ const data = JSON.parse(profile.profileData);
138
+ const sorted = [...indexes].sort((a, b) => b - a);
139
+ for (const idx of sorted) {
140
+ if (idx >= 0 && idx < data.workflows.length) {
141
+ data.workflows.splice(idx, 1);
142
+ }
143
+ }
144
+ this.updateProfile(profileId, data, 0, `Deleted ${indexes.length} workflow(s)`);
145
+ }
103
146
  addChangelog(profileId, version, changeType, changeSummary, profileData) {
104
147
  const id = `changelog_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
105
148
  const now = Date.now();
@@ -1 +1 @@
1
- {"version":3,"file":"web-server.d.ts","sourceRoot":"","sources":["../../src/services/web-server.ts"],"names":[],"mappings":"AAiCA,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,OAAO,CAAC,kBAAkB,CAAsC;gBAEpD,MAAM,EAAE,eAAe;IAInC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YASd,MAAM;IAgCpB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,mBAAmB;YAOb,eAAe;IA+BvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,SAAS,IAAI,OAAO;IAIpB,aAAa,IAAI,OAAO;IAIxB,MAAM,IAAI,MAAM;IAIV,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;YAchC,aAAa;IAuN3B,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,YAAY;CAWrB;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAIhF"}
1
+ {"version":3,"file":"web-server.d.ts","sourceRoot":"","sources":["../../src/services/web-server.ts"],"names":[],"mappings":"AAoCA,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,OAAO,CAAC,kBAAkB,CAAsC;gBAEpD,MAAM,EAAE,eAAe;IAInC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YASd,MAAM;IAgCpB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,mBAAmB;YAOb,eAAe;IA+BvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,SAAS,IAAI,OAAO;IAIpB,aAAa,IAAI,OAAO;IAIxB,MAAM,IAAI,MAAM;IAIV,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;YAchC,aAAa;IAyO3B,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,YAAY;CAWrB;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAIhF"}
@@ -2,7 +2,7 @@ import { readFileSync } from "node:fs";
2
2
  import { join, dirname } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import { log } from "./logger.js";
5
- 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
+ import { handleListTags, handleListMemories, handleAddMemory, handleDeleteMemory, handleBulkDelete, handleUpdateMemory, handleSearch, handleStats, handlePinMemory, handleUnpinMemory, handleRunCleanup, handleRunDeduplication, handleDetectMigration, handleRunMigration, handleDetectTagMigration, handleRunTagMigrationBatch, handleGetTagMigrationProgress, handleDeletePrompt, handleBulkDeletePrompts, handleGetUserProfile, handleGetProfileChangelog, handleGetProfileSnapshot, handleRefreshProfile, handleDeleteProfilePreferences, handleDeleteProfilePatterns, handleDeleteProfileWorkflows, } from "./api-handlers.js";
6
6
  const __filename = fileURLToPath(import.meta.url);
7
7
  const __dirname = dirname(__filename);
8
8
  export class WebServer {
@@ -303,6 +303,21 @@ export class WebServer {
303
303
  const result = await handleRefreshProfile(userId);
304
304
  return this.jsonResponse(result);
305
305
  }
306
+ if (path === "/api/user-profile/preferences/delete" && method === "POST") {
307
+ const body = (await req.json());
308
+ const result = await handleDeleteProfilePreferences(body);
309
+ return this.jsonResponse(result);
310
+ }
311
+ if (path === "/api/user-profile/patterns/delete" && method === "POST") {
312
+ const body = (await req.json());
313
+ const result = await handleDeleteProfilePatterns(body);
314
+ return this.jsonResponse(result);
315
+ }
316
+ if (path === "/api/user-profile/workflows/delete" && method === "POST") {
317
+ const body = (await req.json());
318
+ const result = await handleDeleteProfileWorkflows(body);
319
+ return this.jsonResponse(result);
320
+ }
306
321
  return new Response("Not Found", { status: 404 });
307
322
  }
308
323
  catch (error) {
package/dist/web/app.js CHANGED
@@ -12,6 +12,9 @@ const state = {
12
12
  searchQuery: "",
13
13
  isSearching: false,
14
14
  selectedMemories: new Set(),
15
+ selectedPreferences: new Set(),
16
+ selectedPatterns: new Set(),
17
+ selectedWorkflows: new Set(),
15
18
  autoRefreshInterval: null,
16
19
  userProfile: null,
17
20
  };
@@ -951,12 +954,27 @@ function renderUserProfile() {
951
954
  preferences.length === 0
952
955
  ? `<p class="empty-text">${t("empty-preferences")}</p>`
953
956
  : `
957
+ ${
958
+ state.selectedPreferences.size > 0
959
+ ? `
960
+ <div class="pref-delete-bar">
961
+ <span class="pref-count">${t("text-selected", { count: state.selectedPreferences.size })}</span>
962
+ <span class="pref-bar-actions">
963
+ <button class="pref-bar-btn" data-action="select-all-prefs"><i data-lucide="check-square" class="icon-sm"></i> ${t("btn-select-all")}</button>
964
+ <button class="pref-bar-btn" data-action="deselect-all-prefs"><i data-lucide="square" class="icon-sm"></i> ${t("btn-deselect-all")}</button>
965
+ <button class="pref-bar-btn" data-action="delete-prefs">
966
+ <i data-lucide="trash-2" class="icon-sm"></i> ${t("pref-delete-selected")}
967
+ </button>
968
+ </span>
969
+ </div>`
970
+ : ""
971
+ }
954
972
  <div class="cards-grid">
955
973
  ${preferences
956
974
  .sort((a, b) => (b.confidence || 0) - (a.confidence || 0))
957
975
  .map(
958
- (p) => `
959
- <div class="compact-card preference-card">
976
+ (p, index) => `
977
+ <div class="compact-card preference-card ${state.selectedPreferences.has(index) ? "preference-selected" : ""}" data-index="${index}">
960
978
  <div class="card-top">
961
979
  <span class="category-tag">${escapeHtml(p.category || t("label-general"))}</span>
962
980
  <div class="confidence-ring" style="--p:${Math.round((p.confidence || 0) * 100)}">
@@ -992,11 +1010,26 @@ function renderUserProfile() {
992
1010
  patterns.length === 0
993
1011
  ? `<p class="empty-text">${t("empty-patterns")}</p>`
994
1012
  : `
1013
+ ${
1014
+ state.selectedPatterns.size > 0
1015
+ ? `
1016
+ <div class="pref-delete-bar">
1017
+ <span class="pref-count">${t("text-selected", { count: state.selectedPatterns.size })}</span>
1018
+ <span class="pref-bar-actions">
1019
+ <button class="pref-bar-btn" data-action="select-all-patterns"><i data-lucide="check-square" class="icon-sm"></i> ${t("btn-select-all")}</button>
1020
+ <button class="pref-bar-btn" data-action="deselect-all-patterns"><i data-lucide="square" class="icon-sm"></i> ${t("btn-deselect-all")}</button>
1021
+ <button class="pref-bar-btn" data-action="delete-patterns">
1022
+ <i data-lucide="trash-2" class="icon-sm"></i> ${t("pattern-delete-selected")}
1023
+ </button>
1024
+ </span>
1025
+ </div>`
1026
+ : ""
1027
+ }
995
1028
  <div class="cards-grid">
996
1029
  ${patterns
997
1030
  .map(
998
- (p) => `
999
- <div class="compact-card pattern-card">
1031
+ (p, index) => `
1032
+ <div class="compact-card pattern-card ${state.selectedPatterns.has(index) ? "pattern-selected" : ""}" data-index="${index}">
1000
1033
  <div class="card-top">
1001
1034
  <span class="category-tag">${escapeHtml(p.category || t("label-general"))}</span>
1002
1035
  </div>
@@ -1024,11 +1057,26 @@ function renderUserProfile() {
1024
1057
  workflows.length === 0
1025
1058
  ? `<p class="empty-text">${t("empty-workflows")}</p>`
1026
1059
  : `
1060
+ ${
1061
+ state.selectedWorkflows.size > 0
1062
+ ? `
1063
+ <div class="pref-delete-bar">
1064
+ <span class="pref-count">${t("text-selected", { count: state.selectedWorkflows.size })}</span>
1065
+ <span class="pref-bar-actions">
1066
+ <button class="pref-bar-btn" data-action="select-all-workflows"><i data-lucide="check-square" class="icon-sm"></i> ${t("btn-select-all")}</button>
1067
+ <button class="pref-bar-btn" data-action="deselect-all-workflows"><i data-lucide="square" class="icon-sm"></i> ${t("btn-deselect-all")}</button>
1068
+ <button class="pref-bar-btn" data-action="delete-workflows">
1069
+ <i data-lucide="trash-2" class="icon-sm"></i> ${t("workflow-delete-selected")}
1070
+ </button>
1071
+ </span>
1072
+ </div>`
1073
+ : ""
1074
+ }
1027
1075
  <div class="workflows-grid">
1028
1076
  ${workflows
1029
1077
  .map(
1030
- (w) => `
1031
- <div class="workflow-row">
1078
+ (w, index) => `
1079
+ <div class="workflow-row ${state.selectedWorkflows.has(index) ? "workflow-selected" : ""}" data-index="${index}">
1032
1080
  <div class="workflow-title">${escapeHtml(w.description || "")}</div>
1033
1081
  <div class="workflow-steps-horizontal">
1034
1082
  ${(w.steps || [])
@@ -1110,6 +1158,110 @@ async function refreshProfile() {
1110
1158
  }
1111
1159
  }
1112
1160
 
1161
+ function selectAllPreferences() {
1162
+ document.querySelectorAll(".preference-card[data-index]").forEach((card) => {
1163
+ state.selectedPreferences.add(parseInt(card.dataset.index));
1164
+ });
1165
+ renderUserProfile();
1166
+ }
1167
+
1168
+ function deselectAllPreferences() {
1169
+ state.selectedPreferences.clear();
1170
+ renderUserProfile();
1171
+ }
1172
+
1173
+ async function confirmDeletePreferences() {
1174
+ if (state.selectedPreferences.size === 0) return;
1175
+ if (!confirm(t("confirm-delete-prefs", { count: state.selectedPreferences.size }))) return;
1176
+
1177
+ const result = await fetchAPI("/api/user-profile/preferences/delete", {
1178
+ method: "POST",
1179
+ headers: { "Content-Type": "application/json" },
1180
+ body: JSON.stringify({
1181
+ profileId: state.userProfile.id,
1182
+ indexes: Array.from(state.selectedPreferences),
1183
+ }),
1184
+ });
1185
+
1186
+ if (result.success) {
1187
+ state.selectedPreferences.clear();
1188
+ showToast(t("toast-delete-prefs-success"), "success");
1189
+ await loadUserProfile();
1190
+ } else {
1191
+ showToast(result.error || t("toast-update-failed"), "error");
1192
+ }
1193
+ }
1194
+
1195
+ // --- Pattern selection & delete ---
1196
+ function selectAllPatterns() {
1197
+ document.querySelectorAll(".pattern-card[data-index]").forEach((card) => {
1198
+ state.selectedPatterns.add(parseInt(card.dataset.index));
1199
+ });
1200
+ renderUserProfile();
1201
+ }
1202
+
1203
+ function deselectAllPatterns() {
1204
+ state.selectedPatterns.clear();
1205
+ renderUserProfile();
1206
+ }
1207
+
1208
+ async function confirmDeletePatterns() {
1209
+ if (state.selectedPatterns.size === 0) return;
1210
+ if (!confirm(t("confirm-delete-patterns", { count: state.selectedPatterns.size }))) return;
1211
+
1212
+ const result = await fetchAPI("/api/user-profile/patterns/delete", {
1213
+ method: "POST",
1214
+ headers: { "Content-Type": "application/json" },
1215
+ body: JSON.stringify({
1216
+ profileId: state.userProfile.id,
1217
+ indexes: Array.from(state.selectedPatterns),
1218
+ }),
1219
+ });
1220
+
1221
+ if (result.success) {
1222
+ state.selectedPatterns.clear();
1223
+ showToast(t("toast-delete-patterns-success"), "success");
1224
+ await loadUserProfile();
1225
+ } else {
1226
+ showToast(result.error || t("toast-update-failed"), "error");
1227
+ }
1228
+ }
1229
+
1230
+ // --- Workflow selection & delete ---
1231
+ function selectAllWorkflows() {
1232
+ document.querySelectorAll(".workflow-row[data-index]").forEach((card) => {
1233
+ state.selectedWorkflows.add(parseInt(card.dataset.index));
1234
+ });
1235
+ renderUserProfile();
1236
+ }
1237
+
1238
+ function deselectAllWorkflows() {
1239
+ state.selectedWorkflows.clear();
1240
+ renderUserProfile();
1241
+ }
1242
+
1243
+ async function confirmDeleteWorkflows() {
1244
+ if (state.selectedWorkflows.size === 0) return;
1245
+ if (!confirm(t("confirm-delete-workflows", { count: state.selectedWorkflows.size }))) return;
1246
+
1247
+ const result = await fetchAPI("/api/user-profile/workflows/delete", {
1248
+ method: "POST",
1249
+ headers: { "Content-Type": "application/json" },
1250
+ body: JSON.stringify({
1251
+ profileId: state.userProfile.id,
1252
+ indexes: Array.from(state.selectedWorkflows),
1253
+ }),
1254
+ });
1255
+
1256
+ if (result.success) {
1257
+ state.selectedWorkflows.clear();
1258
+ showToast(t("toast-delete-workflows-success"), "success");
1259
+ await loadUserProfile();
1260
+ } else {
1261
+ showToast(result.error || t("toast-update-failed"), "error");
1262
+ }
1263
+ }
1264
+
1113
1265
  function switchView(view) {
1114
1266
  state.currentView = view;
1115
1267
 
@@ -1178,6 +1330,59 @@ document.addEventListener("DOMContentLoaded", async () => {
1178
1330
  document.getElementById("changelog-modal").classList.add("hidden");
1179
1331
  });
1180
1332
 
1333
+ // Event delegation for profile selection & delete (survives innerHTML replacement)
1334
+ document.getElementById("profile-content")?.addEventListener("click", (e) => {
1335
+ const prefCard = e.target.closest(".preference-card");
1336
+ if (prefCard && prefCard.dataset.index !== undefined) {
1337
+ const idx = parseInt(prefCard.dataset.index);
1338
+ if (state.selectedPreferences.has(idx)) {
1339
+ state.selectedPreferences.delete(idx);
1340
+ } else {
1341
+ state.selectedPreferences.add(idx);
1342
+ }
1343
+ renderUserProfile();
1344
+ return;
1345
+ }
1346
+
1347
+ const patternCard = e.target.closest(".pattern-card");
1348
+ if (patternCard && patternCard.dataset.index !== undefined) {
1349
+ const idx = parseInt(patternCard.dataset.index);
1350
+ if (state.selectedPatterns.has(idx)) {
1351
+ state.selectedPatterns.delete(idx);
1352
+ } else {
1353
+ state.selectedPatterns.add(idx);
1354
+ }
1355
+ renderUserProfile();
1356
+ return;
1357
+ }
1358
+
1359
+ const workflowRow = e.target.closest(".workflow-row");
1360
+ if (workflowRow && workflowRow.dataset.index !== undefined) {
1361
+ const idx = parseInt(workflowRow.dataset.index);
1362
+ if (state.selectedWorkflows.has(idx)) {
1363
+ state.selectedWorkflows.delete(idx);
1364
+ } else {
1365
+ state.selectedWorkflows.add(idx);
1366
+ }
1367
+ renderUserProfile();
1368
+ return;
1369
+ }
1370
+
1371
+ const actionBtn = e.target.closest("[data-action]");
1372
+ if (actionBtn) {
1373
+ const action = actionBtn.dataset.action;
1374
+ if (action === "select-all-prefs") selectAllPreferences();
1375
+ else if (action === "deselect-all-prefs") deselectAllPreferences();
1376
+ else if (action === "delete-prefs") confirmDeletePreferences();
1377
+ else if (action === "select-all-patterns") selectAllPatterns();
1378
+ else if (action === "deselect-all-patterns") deselectAllPatterns();
1379
+ else if (action === "delete-patterns") confirmDeletePatterns();
1380
+ else if (action === "select-all-workflows") selectAllWorkflows();
1381
+ else if (action === "deselect-all-workflows") deselectAllWorkflows();
1382
+ else if (action === "delete-workflows") confirmDeleteWorkflows();
1383
+ }
1384
+ });
1385
+
1181
1386
  document.getElementById("lang-toggle").addEventListener("click", () => {
1182
1387
  const newLang = getLanguage() === "en" ? "zh" : "en";
1183
1388
  setLanguage(newLang);
package/dist/web/i18n.js CHANGED
@@ -55,6 +55,19 @@ const translations = {
55
55
  "toast-delete-failed": "Failed to delete memory",
56
56
  "toast-update-success": "Memory updated successfully",
57
57
  "toast-update-failed": "Failed to update memory",
58
+ "pref-delete-selected": "Delete Selected",
59
+ "pref-no-selection": "Click a preference card to select it",
60
+ "confirm-delete-prefs": "Delete {count} selected preference(s)?",
61
+ "toast-delete-prefs-success": "Preferences deleted successfully",
62
+ "toast-delete-prefs-failed": "Failed to delete preferences",
63
+ "pattern-delete-selected": "Delete Selected",
64
+ "confirm-delete-patterns": "Delete {count} selected pattern(s)?",
65
+ "toast-delete-patterns-success": "Patterns deleted successfully",
66
+ "toast-delete-patterns-failed": "Failed to delete patterns",
67
+ "workflow-delete-selected": "Delete Selected",
68
+ "confirm-delete-workflows": "Delete {count} selected workflow(s)?",
69
+ "toast-delete-workflows-success": "Workflows deleted successfully",
70
+ "toast-delete-workflows-failed": "Failed to delete workflows",
58
71
  "toast-cleanup-success": "Cleanup completed successfully",
59
72
  "toast-cleanup-failed": "Cleanup failed",
60
73
  "toast-dedup-success": "Deduplication completed successfully",
@@ -180,6 +193,19 @@ const translations = {
180
193
  "toast-delete-failed": "删除记忆失败",
181
194
  "toast-update-success": "记忆更新成功",
182
195
  "toast-update-failed": "更新记忆失败",
196
+ "pref-delete-selected": "删除选中",
197
+ "pref-no-selection": "点击偏好卡片可选中",
198
+ "confirm-delete-prefs": "删除选中的 {count} 条偏好设置?",
199
+ "toast-delete-prefs-success": "偏好设置已删除",
200
+ "toast-delete-prefs-failed": "删除偏好设置失败",
201
+ "pattern-delete-selected": "删除选中",
202
+ "confirm-delete-patterns": "删除选中的 {count} 条行为模式?",
203
+ "toast-delete-patterns-success": "行为模式已删除",
204
+ "toast-delete-patterns-failed": "删除行为模式失败",
205
+ "workflow-delete-selected": "删除选中",
206
+ "confirm-delete-workflows": "删除选中的 {count} 条工作流程?",
207
+ "toast-delete-workflows-success": "工作流程已删除",
208
+ "toast-delete-workflows-failed": "删除工作流程失败",
183
209
  "toast-cleanup-success": "清理完成",
184
210
  "toast-cleanup-failed": "清理失败",
185
211
  "toast-dedup-success": "去重完成",
@@ -1787,3 +1787,125 @@ textarea:focus-visible {
1787
1787
  height: 20px;
1788
1788
  margin: 0;
1789
1789
  }
1790
+
1791
+ /* --- Preference selection & delete bar --- */
1792
+ .preference-card {
1793
+ cursor: pointer;
1794
+ user-select: none;
1795
+ }
1796
+
1797
+ .preference-card.preference-selected {
1798
+ border-color: var(--om-accent-blue);
1799
+ border-width: 2px;
1800
+ background: var(--om-blue-tint);
1801
+ box-shadow: 0 0 0 1px var(--om-blue-border-tint);
1802
+ }
1803
+
1804
+ .pref-delete-bar {
1805
+ display: flex;
1806
+ align-items: center;
1807
+ justify-content: space-between;
1808
+ padding: 10px 14px;
1809
+ margin-bottom: 12px;
1810
+ background: var(--om-danger-bg);
1811
+ border: 1px solid var(--om-accent-red);
1812
+ border-left: 3px solid var(--om-accent-red);
1813
+ font-size: 12px;
1814
+ }
1815
+
1816
+ .pref-delete-bar .pref-count {
1817
+ color: var(--om-accent-red);
1818
+ font-weight: bold;
1819
+ }
1820
+
1821
+ .pref-bar-actions {
1822
+ display: flex;
1823
+ align-items: center;
1824
+ gap: 6px;
1825
+ }
1826
+
1827
+ .pref-bar-btn {
1828
+ background: none;
1829
+ border: 1px solid var(--om-accent-red);
1830
+ color: var(--om-accent-red);
1831
+ font-size: 11px;
1832
+ padding: 4px 10px;
1833
+ cursor: pointer;
1834
+ font-family: inherit;
1835
+ display: inline-flex;
1836
+ align-items: center;
1837
+ gap: 4px;
1838
+ transition: all 0.15s;
1839
+ }
1840
+
1841
+ .pref-bar-btn:hover {
1842
+ background: var(--om-accent-red);
1843
+ color: var(--om-text-inverse);
1844
+ }
1845
+
1846
+ .pref-delete-bar .btn-danger {
1847
+ background: var(--om-accent-red);
1848
+ color: var(--om-text-inverse);
1849
+ border: none;
1850
+ padding: 6px 14px;
1851
+ font-size: 11px;
1852
+ cursor: pointer;
1853
+ display: inline-flex;
1854
+ align-items: center;
1855
+ gap: 6px;
1856
+ transition: background 0.2s;
1857
+ }
1858
+
1859
+ .pref-delete-bar .btn-danger:hover {
1860
+ background: var(--om-danger-bg);
1861
+ color: var(--om-accent-red);
1862
+ outline: 1px solid var(--om-accent-red);
1863
+ }
1864
+
1865
+ .pref-bar-actions {
1866
+ display: flex;
1867
+ align-items: center;
1868
+ gap: 6px;
1869
+ }
1870
+
1871
+ .pref-bar-btn {
1872
+ background: none;
1873
+ border: 1px solid var(--om-accent-red);
1874
+ color: var(--om-accent-red);
1875
+ font-size: 11px;
1876
+ padding: 4px 10px;
1877
+ cursor: pointer;
1878
+ font-family: inherit;
1879
+ transition: all 0.15s;
1880
+ }
1881
+
1882
+ .pref-bar-btn:hover {
1883
+ background: var(--om-accent-red);
1884
+ color: var(--om-text-inverse);
1885
+ }
1886
+
1887
+ /* --- Pattern selection & delete bar --- */
1888
+ .pattern-card {
1889
+ cursor: pointer;
1890
+ user-select: none;
1891
+ }
1892
+
1893
+ .pattern-card.pattern-selected {
1894
+ border-color: var(--om-accent-blue);
1895
+ border-width: 2px;
1896
+ background: var(--om-blue-tint);
1897
+ box-shadow: 0 0 0 1px var(--om-blue-border-tint);
1898
+ }
1899
+
1900
+ /* --- Workflow selection & delete bar --- */
1901
+ .workflow-row {
1902
+ cursor: pointer;
1903
+ user-select: none;
1904
+ }
1905
+
1906
+ .workflow-row.workflow-selected {
1907
+ border-color: var(--om-accent-blue);
1908
+ border-width: 2px;
1909
+ background: var(--om-blue-tint);
1910
+ box-shadow: 0 0 0 1px var(--om-blue-border-tint);
1911
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haisto/opencode-mem",
3
- "version": "2.14.3-beta.4",
3
+ "version": "2.14.3-beta.6",
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",