@haisto/opencode-mem 2.14.3-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/README.md +165 -0
  2. package/dist/config.d.ts +62 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +457 -0
  5. package/dist/index.d.ts +3 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +486 -0
  8. package/dist/plugin.d.ts +9 -0
  9. package/dist/plugin.d.ts.map +1 -0
  10. package/dist/plugin.js +5 -0
  11. package/dist/services/ai/ai-provider-factory.d.ts +8 -0
  12. package/dist/services/ai/ai-provider-factory.d.ts.map +1 -0
  13. package/dist/services/ai/ai-provider-factory.js +28 -0
  14. package/dist/services/ai/opencode-provider.d.ts +36 -0
  15. package/dist/services/ai/opencode-provider.d.ts.map +1 -0
  16. package/dist/services/ai/opencode-provider.js +92 -0
  17. package/dist/services/ai/provider-config.d.ts +17 -0
  18. package/dist/services/ai/provider-config.d.ts.map +1 -0
  19. package/dist/services/ai/provider-config.js +14 -0
  20. package/dist/services/ai/providers/anthropic-messages.d.ts +12 -0
  21. package/dist/services/ai/providers/anthropic-messages.d.ts.map +1 -0
  22. package/dist/services/ai/providers/anthropic-messages.js +184 -0
  23. package/dist/services/ai/providers/base-provider.d.ts +25 -0
  24. package/dist/services/ai/providers/base-provider.d.ts.map +1 -0
  25. package/dist/services/ai/providers/base-provider.js +23 -0
  26. package/dist/services/ai/providers/google-gemini.d.ts +16 -0
  27. package/dist/services/ai/providers/google-gemini.d.ts.map +1 -0
  28. package/dist/services/ai/providers/google-gemini.js +228 -0
  29. package/dist/services/ai/providers/openai-chat-completion.d.ts +14 -0
  30. package/dist/services/ai/providers/openai-chat-completion.d.ts.map +1 -0
  31. package/dist/services/ai/providers/openai-chat-completion.js +318 -0
  32. package/dist/services/ai/providers/openai-responses.d.ts +14 -0
  33. package/dist/services/ai/providers/openai-responses.d.ts.map +1 -0
  34. package/dist/services/ai/providers/openai-responses.js +182 -0
  35. package/dist/services/ai/session/ai-session-manager.d.ts +21 -0
  36. package/dist/services/ai/session/ai-session-manager.d.ts.map +1 -0
  37. package/dist/services/ai/session/ai-session-manager.js +166 -0
  38. package/dist/services/ai/session/session-types.d.ts +43 -0
  39. package/dist/services/ai/session/session-types.d.ts.map +1 -0
  40. package/dist/services/ai/session/session-types.js +1 -0
  41. package/dist/services/ai/tools/tool-schema.d.ts +41 -0
  42. package/dist/services/ai/tools/tool-schema.d.ts.map +1 -0
  43. package/dist/services/ai/tools/tool-schema.js +24 -0
  44. package/dist/services/ai/validators/user-profile-validator.d.ts +13 -0
  45. package/dist/services/ai/validators/user-profile-validator.d.ts.map +1 -0
  46. package/dist/services/ai/validators/user-profile-validator.js +111 -0
  47. package/dist/services/api-handlers.d.ts +164 -0
  48. package/dist/services/api-handlers.d.ts.map +1 -0
  49. package/dist/services/api-handlers.js +927 -0
  50. package/dist/services/auto-capture.d.ts +3 -0
  51. package/dist/services/auto-capture.d.ts.map +1 -0
  52. package/dist/services/auto-capture.js +309 -0
  53. package/dist/services/cleanup-service.d.ts +23 -0
  54. package/dist/services/cleanup-service.d.ts.map +1 -0
  55. package/dist/services/cleanup-service.js +102 -0
  56. package/dist/services/client.d.ts +119 -0
  57. package/dist/services/client.d.ts.map +1 -0
  58. package/dist/services/client.js +257 -0
  59. package/dist/services/context.d.ts +11 -0
  60. package/dist/services/context.d.ts.map +1 -0
  61. package/dist/services/context.js +34 -0
  62. package/dist/services/deduplication-service.d.ts +30 -0
  63. package/dist/services/deduplication-service.d.ts.map +1 -0
  64. package/dist/services/deduplication-service.js +124 -0
  65. package/dist/services/embedding.d.ts +15 -0
  66. package/dist/services/embedding.d.ts.map +1 -0
  67. package/dist/services/embedding.js +127 -0
  68. package/dist/services/jsonc.d.ts +7 -0
  69. package/dist/services/jsonc.d.ts.map +1 -0
  70. package/dist/services/jsonc.js +76 -0
  71. package/dist/services/language-detector.d.ts +3 -0
  72. package/dist/services/language-detector.d.ts.map +1 -0
  73. package/dist/services/language-detector.js +33 -0
  74. package/dist/services/logger.d.ts +11 -0
  75. package/dist/services/logger.d.ts.map +1 -0
  76. package/dist/services/logger.js +97 -0
  77. package/dist/services/migration-service.d.ts +42 -0
  78. package/dist/services/migration-service.d.ts.map +1 -0
  79. package/dist/services/migration-service.js +250 -0
  80. package/dist/services/privacy.d.ts +3 -0
  81. package/dist/services/privacy.d.ts.map +1 -0
  82. package/dist/services/privacy.js +7 -0
  83. package/dist/services/secret-resolver.d.ts +2 -0
  84. package/dist/services/secret-resolver.d.ts.map +1 -0
  85. package/dist/services/secret-resolver.js +55 -0
  86. package/dist/services/sqlite/connection-manager.d.ts +13 -0
  87. package/dist/services/sqlite/connection-manager.d.ts.map +1 -0
  88. package/dist/services/sqlite/connection-manager.js +74 -0
  89. package/dist/services/sqlite/shard-manager.d.ts +23 -0
  90. package/dist/services/sqlite/shard-manager.d.ts.map +1 -0
  91. package/dist/services/sqlite/shard-manager.js +288 -0
  92. package/dist/services/sqlite/sqlite-bootstrap.d.ts +2 -0
  93. package/dist/services/sqlite/sqlite-bootstrap.d.ts.map +1 -0
  94. package/dist/services/sqlite/sqlite-bootstrap.js +8 -0
  95. package/dist/services/sqlite/types.d.ts +42 -0
  96. package/dist/services/sqlite/types.d.ts.map +1 -0
  97. package/dist/services/sqlite/types.js +1 -0
  98. package/dist/services/sqlite/vector-search.d.ts +29 -0
  99. package/dist/services/sqlite/vector-search.d.ts.map +1 -0
  100. package/dist/services/sqlite/vector-search.js +279 -0
  101. package/dist/services/tags.d.ts +24 -0
  102. package/dist/services/tags.d.ts.map +1 -0
  103. package/dist/services/tags.js +145 -0
  104. package/dist/services/user-memory-learning.d.ts +3 -0
  105. package/dist/services/user-memory-learning.d.ts.map +1 -0
  106. package/dist/services/user-memory-learning.js +235 -0
  107. package/dist/services/user-profile/profile-context.d.ts +2 -0
  108. package/dist/services/user-profile/profile-context.d.ts.map +1 -0
  109. package/dist/services/user-profile/profile-context.js +40 -0
  110. package/dist/services/user-profile/profile-utils.d.ts +3 -0
  111. package/dist/services/user-profile/profile-utils.d.ts.map +1 -0
  112. package/dist/services/user-profile/profile-utils.js +45 -0
  113. package/dist/services/user-profile/types.d.ts +46 -0
  114. package/dist/services/user-profile/types.d.ts.map +1 -0
  115. package/dist/services/user-profile/types.js +1 -0
  116. package/dist/services/user-profile/user-profile-manager.d.ts +23 -0
  117. package/dist/services/user-profile/user-profile-manager.d.ts.map +1 -0
  118. package/dist/services/user-profile/user-profile-manager.js +337 -0
  119. package/dist/services/user-prompt/user-prompt-manager.d.ts +41 -0
  120. package/dist/services/user-prompt/user-prompt-manager.d.ts.map +1 -0
  121. package/dist/services/user-prompt/user-prompt-manager.js +192 -0
  122. package/dist/services/vector-backends/backend-factory.d.ts +3 -0
  123. package/dist/services/vector-backends/backend-factory.d.ts.map +1 -0
  124. package/dist/services/vector-backends/backend-factory.js +104 -0
  125. package/dist/services/vector-backends/exact-scan-backend.d.ts +39 -0
  126. package/dist/services/vector-backends/exact-scan-backend.d.ts.map +1 -0
  127. package/dist/services/vector-backends/exact-scan-backend.js +63 -0
  128. package/dist/services/vector-backends/types.d.ts +51 -0
  129. package/dist/services/vector-backends/types.d.ts.map +1 -0
  130. package/dist/services/vector-backends/types.js +1 -0
  131. package/dist/services/vector-backends/usearch-backend.d.ts +47 -0
  132. package/dist/services/vector-backends/usearch-backend.d.ts.map +1 -0
  133. package/dist/services/vector-backends/usearch-backend.js +174 -0
  134. package/dist/services/web-server-worker.d.ts +2 -0
  135. package/dist/services/web-server-worker.d.ts.map +1 -0
  136. package/dist/services/web-server-worker.js +283 -0
  137. package/dist/services/web-server.d.ts +31 -0
  138. package/dist/services/web-server.d.ts.map +1 -0
  139. package/dist/services/web-server.js +356 -0
  140. package/dist/types/index.d.ts +19 -0
  141. package/dist/types/index.d.ts.map +1 -0
  142. package/dist/types/index.js +1 -0
  143. package/dist/web/app.d.ts +2 -0
  144. package/dist/web/app.d.ts.map +1 -0
  145. package/dist/web/app.js +1238 -0
  146. package/dist/web/favicon.ico +0 -0
  147. package/dist/web/i18n.d.ts +2 -0
  148. package/dist/web/i18n.d.ts.map +1 -0
  149. package/dist/web/i18n.js +312 -0
  150. package/dist/web/index.html +293 -0
  151. package/dist/web/styles.css +1786 -0
  152. package/package.json +78 -0
@@ -0,0 +1,235 @@
1
+ import { getTags } from "./tags.js";
2
+ import { log } from "./logger.js";
3
+ import { CONFIG } from "../config.js";
4
+ import { userPromptManager } from "./user-prompt/user-prompt-manager.js";
5
+ import { userProfileManager } from "./user-profile/user-profile-manager.js";
6
+ let isLearningRunning = false;
7
+ export async function performUserProfileLearning(ctx, directory) {
8
+ if (isLearningRunning)
9
+ return;
10
+ isLearningRunning = true;
11
+ try {
12
+ const count = userPromptManager.countUnanalyzedForUserLearning();
13
+ const threshold = CONFIG.userProfileAnalysisInterval;
14
+ if (count < threshold) {
15
+ return;
16
+ }
17
+ const prompts = userPromptManager.getPromptsForUserLearning(threshold);
18
+ if (prompts.length === 0) {
19
+ return;
20
+ }
21
+ const tags = getTags(directory);
22
+ const userId = tags.user.userEmail || "unknown";
23
+ const existingProfile = userProfileManager.getActiveProfile(userId);
24
+ const context = buildUserAnalysisContext(prompts, existingProfile);
25
+ const updatedProfileData = await analyzeUserProfile(context, existingProfile);
26
+ if (!updatedProfileData) {
27
+ userPromptManager.markMultipleAsUserLearningCaptured(prompts.map((p) => p.id));
28
+ return;
29
+ }
30
+ if (existingProfile) {
31
+ const changeSummary = generateChangeSummary(JSON.parse(existingProfile.profileData), updatedProfileData);
32
+ userProfileManager.updateProfile(existingProfile.id, updatedProfileData, prompts.length, changeSummary);
33
+ userProfileManager.applyConfidenceDecay(existingProfile.id);
34
+ }
35
+ else {
36
+ userProfileManager.createProfile(userId, tags.user.displayName || "Unknown", tags.user.userName || "unknown", tags.user.userEmail || "unknown", updatedProfileData, prompts.length);
37
+ }
38
+ userPromptManager.markMultipleAsUserLearningCaptured(prompts.map((p) => p.id));
39
+ if (CONFIG.showUserProfileToasts) {
40
+ await ctx.client?.tui
41
+ .showToast({
42
+ body: {
43
+ title: "User Profile Updated",
44
+ message: `Analyzed ${prompts.length} prompts and updated your profile`,
45
+ variant: "success",
46
+ duration: 3000,
47
+ },
48
+ })
49
+ .catch(() => { });
50
+ }
51
+ }
52
+ finally {
53
+ isLearningRunning = false;
54
+ }
55
+ }
56
+ function generateChangeSummary(oldProfile, newProfile) {
57
+ const changes = [];
58
+ const prefDiff = newProfile.preferences.length - oldProfile.preferences.length;
59
+ if (prefDiff > 0)
60
+ changes.push(`+${prefDiff} preferences`);
61
+ const patternDiff = newProfile.patterns.length - oldProfile.patterns.length;
62
+ if (patternDiff > 0)
63
+ changes.push(`+${patternDiff} patterns`);
64
+ const workflowDiff = newProfile.workflows.length - oldProfile.workflows.length;
65
+ if (workflowDiff > 0)
66
+ changes.push(`+${workflowDiff} workflows`);
67
+ return changes.length > 0 ? changes.join(", ") : "Profile refinement";
68
+ }
69
+ function buildUserAnalysisContext(prompts, existingProfile) {
70
+ const existingProfileSection = existingProfile
71
+ ? `
72
+ ## Existing User Profile
73
+
74
+ ${existingProfile.profileData}
75
+
76
+ **Instructions**: Merge new insights with the existing profile. Update confidence scores for reinforced patterns, add new patterns, and refine existing ones.`
77
+ : `
78
+ **Instructions**: Create a new user profile from scratch based on the prompts below.`;
79
+ return `# User Profile Analysis
80
+
81
+ Analyze ${prompts.length} user prompts to ${existingProfile ? "update" : "create"} the user profile.
82
+
83
+ ${existingProfileSection}
84
+
85
+ ## Recent Prompts
86
+
87
+ ${prompts.map((p, i) => `${i + 1}. ${p.content}`).join("\n\n")}
88
+
89
+ ## Analysis Guidelines
90
+
91
+ Identify and ${existingProfile ? "update" : "create"}:
92
+
93
+ 1. **Preferences** (max ${CONFIG.userProfileMaxPreferences})
94
+ - Code style, communication style, tool preferences
95
+ - Assign confidence 0.5-1.0 based on evidence strength
96
+ - Include 1-3 example prompts as evidence
97
+
98
+ 2. **Patterns** (max ${CONFIG.userProfileMaxPatterns})
99
+ - Recurring topics, problem domains, technical interests
100
+ - Track frequency of occurrence
101
+
102
+ 3. **Workflows** (max ${CONFIG.userProfileMaxWorkflows})
103
+ - Development sequences, habits, learning style
104
+ - Break down into steps if applicable
105
+
106
+ ${existingProfile ? "Merge with existing profile, incrementing frequencies and updating confidence scores." : "Create initial profile with conservative confidence scores."}`;
107
+ }
108
+ async function analyzeUserProfile(context, existingProfile) {
109
+ if (CONFIG.opencodeProvider && CONFIG.opencodeModel) {
110
+ const { isProviderConnected, getV2Client, generateStructuredOutput } = await import("./ai/opencode-provider.js");
111
+ if (!isProviderConnected(CONFIG.opencodeProvider)) {
112
+ throw new Error(`opencode provider '${CONFIG.opencodeProvider}' is not connected. Check your opencode provider configuration.`);
113
+ }
114
+ const v2Client = getV2Client();
115
+ if (!v2Client) {
116
+ throw new Error("opencode-mem: v2 client not initialized; cannot perform user-profile learning");
117
+ }
118
+ const systemPrompt = `You are a user behavior analyst for a coding assistant.
119
+
120
+ Your task is to analyze user prompts and ${existingProfile ? "update" : "create"} a comprehensive user profile.
121
+
122
+ CRITICAL: Detect the language used by the user in their prompts. You MUST output all descriptions, categories, and text in the SAME language as the user's prompts.
123
+
124
+ Use the update_user_profile tool to save the ${existingProfile ? "updated" : "new"} profile.`;
125
+ const { z } = await import("zod");
126
+ const schema = z.object({
127
+ preferences: z.array(z.object({
128
+ category: z.string(),
129
+ description: z.string(),
130
+ confidence: z.number(),
131
+ evidence: z.array(z.string()),
132
+ })),
133
+ patterns: z.array(z.object({
134
+ category: z.string(),
135
+ description: z.string(),
136
+ })),
137
+ workflows: z.array(z.object({
138
+ description: z.string(),
139
+ steps: z.array(z.string()),
140
+ })),
141
+ });
142
+ const result = await generateStructuredOutput({
143
+ client: v2Client,
144
+ providerID: CONFIG.opencodeProvider,
145
+ modelID: CONFIG.opencodeModel,
146
+ systemPrompt,
147
+ userPrompt: context,
148
+ schema,
149
+ });
150
+ if (existingProfile) {
151
+ const existingData = JSON.parse(existingProfile.profileData);
152
+ return userProfileManager.mergeProfileData(existingData, result);
153
+ }
154
+ return result;
155
+ }
156
+ if (!CONFIG.memoryModel || !CONFIG.memoryApiUrl) {
157
+ log("User Profile Config Check Failed:", {
158
+ memoryModel: CONFIG.memoryModel,
159
+ memoryApiUrl: CONFIG.memoryApiUrl,
160
+ memoryApiKey: CONFIG.memoryApiKey,
161
+ });
162
+ throw new Error("External API not configured for user memory learning");
163
+ }
164
+ const { AIProviderFactory } = await import("./ai/ai-provider-factory.js");
165
+ const { buildMemoryProviderConfig } = await import("./ai/provider-config.js");
166
+ const providerConfig = buildMemoryProviderConfig(CONFIG);
167
+ const provider = AIProviderFactory.createProvider(CONFIG.memoryProvider, providerConfig);
168
+ const systemPrompt = `You are a user behavior analyst for a coding assistant.
169
+
170
+ Your task is to analyze user prompts and ${existingProfile ? "update" : "create"} a comprehensive user profile.
171
+
172
+ CRITICAL: Detect the language used by the user in their prompts. You MUST output all descriptions, categories, and text in the SAME language as the user's prompts.
173
+
174
+ Use the update_user_profile tool to save the ${existingProfile ? "updated" : "new"} profile.`;
175
+ const toolSchema = {
176
+ type: "function",
177
+ function: {
178
+ name: "update_user_profile",
179
+ description: existingProfile
180
+ ? "Update existing user profile with new insights"
181
+ : "Create new user profile",
182
+ parameters: {
183
+ type: "object",
184
+ properties: {
185
+ preferences: {
186
+ type: "array",
187
+ items: {
188
+ type: "object",
189
+ properties: {
190
+ category: { type: "string" },
191
+ description: { type: "string" },
192
+ confidence: { type: "number", minimum: 0, maximum: 1 },
193
+ evidence: { type: "array", items: { type: "string" }, maxItems: 3 },
194
+ },
195
+ required: ["category", "description", "confidence", "evidence"],
196
+ },
197
+ },
198
+ patterns: {
199
+ type: "array",
200
+ items: {
201
+ type: "object",
202
+ properties: {
203
+ category: { type: "string" },
204
+ description: { type: "string" },
205
+ },
206
+ required: ["category", "description"],
207
+ },
208
+ },
209
+ workflows: {
210
+ type: "array",
211
+ items: {
212
+ type: "object",
213
+ properties: {
214
+ description: { type: "string" },
215
+ steps: { type: "array", items: { type: "string" } },
216
+ },
217
+ required: ["description", "steps"],
218
+ },
219
+ },
220
+ },
221
+ required: ["preferences", "patterns", "workflows"],
222
+ },
223
+ },
224
+ };
225
+ const result = await provider.executeToolCall(systemPrompt, context, toolSchema, `user-profile-${Date.now()}`);
226
+ if (!result.success || !result.data) {
227
+ throw new Error(result.error || "Failed to analyze user profile");
228
+ }
229
+ const rawData = result.data;
230
+ if (existingProfile) {
231
+ const existingData = JSON.parse(existingProfile.profileData);
232
+ return userProfileManager.mergeProfileData(existingData, rawData);
233
+ }
234
+ return rawData;
235
+ }
@@ -0,0 +1,2 @@
1
+ export declare function getUserProfileContext(userId: string): string | null;
2
+ //# sourceMappingURL=profile-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-context.d.ts","sourceRoot":"","sources":["../../../src/services/user-profile/profile-context.ts"],"names":[],"mappings":"AAGA,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA6CnE"}
@@ -0,0 +1,40 @@
1
+ import { userProfileManager } from "./user-profile-manager.js";
2
+ export function getUserProfileContext(userId) {
3
+ const profile = userProfileManager.getActiveProfile(userId);
4
+ if (!profile) {
5
+ return null;
6
+ }
7
+ const profileData = JSON.parse(profile.profileData);
8
+ const parts = [];
9
+ if (profileData.preferences.length > 0) {
10
+ parts.push("User Preferences:");
11
+ profileData.preferences
12
+ .sort((a, b) => b.confidence - a.confidence)
13
+ .slice(0, 5)
14
+ .forEach((pref) => {
15
+ parts.push(`- [${pref.category}] ${pref.description}`);
16
+ });
17
+ }
18
+ if (profileData.patterns.length > 0) {
19
+ parts.push("\nUser Patterns:");
20
+ profileData.patterns
21
+ .sort((a, b) => b.frequency - a.frequency)
22
+ .slice(0, 5)
23
+ .forEach((pattern) => {
24
+ parts.push(`- [${pattern.category}] ${pattern.description}`);
25
+ });
26
+ }
27
+ if (profileData.workflows.length > 0) {
28
+ parts.push("\nUser Workflows:");
29
+ profileData.workflows
30
+ .sort((a, b) => b.frequency - a.frequency)
31
+ .slice(0, 3)
32
+ .forEach((workflow) => {
33
+ parts.push(`- ${workflow.description}`);
34
+ });
35
+ }
36
+ if (parts.length === 0) {
37
+ return null;
38
+ }
39
+ return parts.join("\n");
40
+ }
@@ -0,0 +1,3 @@
1
+ export declare const safeArray: <T>(arr: any) => T[];
2
+ export declare const safeObject: <T extends object>(obj: any, fallback: T) => T;
3
+ //# sourceMappingURL=profile-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-utils.d.ts","sourceRoot":"","sources":["../../../src/services/user-profile/profile-utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,KAAK,GAAG,KAAG,CAAC,EA0BxC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,MAAM,EAAE,KAAK,GAAG,EAAE,UAAU,CAAC,KAAG,CAWpE,CAAC"}
@@ -0,0 +1,45 @@
1
+ export const safeArray = (arr) => {
2
+ if (!arr)
3
+ return [];
4
+ let result = arr;
5
+ if (typeof result === "string") {
6
+ try {
7
+ result = JSON.parse(result);
8
+ }
9
+ catch {
10
+ try {
11
+ result = JSON.parse(result.trim().replace(/,$/, ""));
12
+ }
13
+ catch {
14
+ return [];
15
+ }
16
+ }
17
+ }
18
+ if (!Array.isArray(result))
19
+ return [];
20
+ const flattened = [];
21
+ const walk = (item) => {
22
+ if (Array.isArray(item)) {
23
+ item.forEach(walk);
24
+ }
25
+ else if (item) {
26
+ flattened.push(item);
27
+ }
28
+ };
29
+ walk(result);
30
+ return flattened;
31
+ };
32
+ export const safeObject = (obj, fallback) => {
33
+ if (!obj)
34
+ return fallback;
35
+ let result = obj;
36
+ if (typeof result === "string") {
37
+ try {
38
+ result = JSON.parse(result);
39
+ }
40
+ catch {
41
+ return fallback;
42
+ }
43
+ }
44
+ return result && typeof result === "object" && !Array.isArray(result) ? result : fallback;
45
+ };
@@ -0,0 +1,46 @@
1
+ export interface UserProfilePreference {
2
+ category: string;
3
+ description: string;
4
+ confidence: number;
5
+ evidence: string[];
6
+ lastUpdated: number;
7
+ }
8
+ export interface UserProfilePattern {
9
+ category: string;
10
+ description: string;
11
+ frequency: number;
12
+ lastSeen: number;
13
+ }
14
+ export interface UserProfileWorkflow {
15
+ description: string;
16
+ steps: string[];
17
+ frequency: number;
18
+ }
19
+ export interface UserProfileData {
20
+ preferences: UserProfilePreference[];
21
+ patterns: UserProfilePattern[];
22
+ workflows: UserProfileWorkflow[];
23
+ }
24
+ export interface UserProfile {
25
+ id: string;
26
+ userId: string;
27
+ displayName: string;
28
+ userName: string;
29
+ userEmail: string;
30
+ profileData: string;
31
+ version: number;
32
+ createdAt: number;
33
+ lastAnalyzedAt: number;
34
+ totalPromptsAnalyzed: number;
35
+ isActive: boolean;
36
+ }
37
+ export interface UserProfileChangelog {
38
+ id: string;
39
+ profileId: string;
40
+ version: number;
41
+ changeType: string;
42
+ changeSummary: string;
43
+ profileDataSnapshot: string;
44
+ createdAt: number;
45
+ }
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/user-profile/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,qBAAqB,EAAE,CAAC;IACrC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import type { UserProfile, UserProfileChangelog, UserProfileData } from "./types.js";
2
+ export declare class UserProfileManager {
3
+ private db;
4
+ private readonly dbPath;
5
+ constructor();
6
+ private initDatabase;
7
+ getActiveProfile(userId: string): UserProfile | null;
8
+ createProfile(userId: string, displayName: string, userName: string, userEmail: string, profileData: UserProfileData, promptsAnalyzed: number): string;
9
+ updateProfile(profileId: string, profileData: UserProfileData, additionalPromptsAnalyzed: number, changeSummary: string): void;
10
+ private addChangelog;
11
+ private cleanupOldChangelogs;
12
+ getProfileChangelogs(profileId: string, limit?: number): UserProfileChangelog[];
13
+ applyConfidenceDecay(profileId: string): void;
14
+ deleteProfile(profileId: string): void;
15
+ getProfileById(profileId: string): UserProfile | null;
16
+ getAllActiveProfiles(): UserProfile[];
17
+ private rowToProfile;
18
+ private rowToChangelog;
19
+ mergeProfileData(existing: UserProfileData, updates: Partial<UserProfileData>): UserProfileData;
20
+ private ensureArray;
21
+ }
22
+ export declare const userProfileManager: UserProfileManager;
23
+ //# sourceMappingURL=user-profile-manager.d.ts.map
@@ -0,0 +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;IAqE7C,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;IA6F/F,OAAO,CAAC,WAAW;CAWpB;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}