opencode-mem 2.3.6 → 2.4.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 (34) hide show
  1. package/dist/config.d.ts +0 -1
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +4 -38
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +38 -80
  6. package/dist/services/ai/providers/anthropic-messages.d.ts.map +1 -1
  7. package/dist/services/ai/providers/anthropic-messages.js +11 -7
  8. package/dist/services/ai/providers/base-provider.d.ts +3 -3
  9. package/dist/services/ai/providers/base-provider.d.ts.map +1 -1
  10. package/dist/services/ai/providers/openai-chat-completion.d.ts.map +1 -1
  11. package/dist/services/ai/providers/openai-chat-completion.js +11 -6
  12. package/dist/services/ai/providers/openai-responses.d.ts.map +1 -1
  13. package/dist/services/ai/providers/openai-responses.js +4 -2
  14. package/dist/services/ai/validators/user-profile-validator.d.ts +0 -1
  15. package/dist/services/ai/validators/user-profile-validator.d.ts.map +1 -1
  16. package/dist/services/ai/validators/user-profile-validator.js +0 -17
  17. package/dist/services/api-handlers.d.ts +32 -3
  18. package/dist/services/api-handlers.d.ts.map +1 -1
  19. package/dist/services/api-handlers.js +89 -13
  20. package/dist/services/auto-capture.js +11 -4
  21. package/dist/services/logger.d.ts.map +1 -1
  22. package/dist/services/logger.js +3 -1
  23. package/dist/services/sqlite/connection-manager.d.ts.map +1 -1
  24. package/dist/services/user-memory-learning.js +9 -14
  25. package/dist/services/user-profile/types.d.ts +0 -5
  26. package/dist/services/user-profile/types.d.ts.map +1 -1
  27. package/dist/services/user-profile/user-profile-manager.d.ts.map +1 -1
  28. package/dist/services/user-profile/user-profile-manager.js +0 -7
  29. package/dist/services/user-prompt/user-prompt-manager.d.ts +2 -0
  30. package/dist/services/user-prompt/user-prompt-manager.d.ts.map +1 -1
  31. package/dist/services/user-prompt/user-prompt-manager.js +21 -0
  32. package/dist/web/app.js +196 -114
  33. package/dist/web/styles.css +202 -122
  34. package/package.json +1 -1
package/dist/config.d.ts CHANGED
@@ -10,7 +10,6 @@ export declare const CONFIG: {
10
10
  maxProfileItems: number;
11
11
  injectProfile: boolean;
12
12
  containerTagPrefix: string;
13
- keywordPatterns: string[];
14
13
  autoCaptureEnabled: boolean;
15
14
  autoCaptureMaxIterations: number;
16
15
  autoCaptureIterationTimeout: number;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAyXA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;oBA0Bb,aAAa,GACb,kBAAkB,GAClB,WAAW;;;;;;;;;;;;;;;;;;;CAyBhB,CAAC;AAEF,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAuVA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;oBAwBb,aAAa,GACb,kBAAkB,GAClB,WAAW;;;;;;;;;;;;;;;;;;;CAyBhB,CAAC;AAEF,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
package/dist/config.js CHANGED
@@ -14,24 +14,6 @@ if (!existsSync(CONFIG_DIR)) {
14
14
  if (!existsSync(DATA_DIR)) {
15
15
  mkdirSync(DATA_DIR, { recursive: true });
16
16
  }
17
- const DEFAULT_KEYWORD_PATTERNS = [
18
- "remember",
19
- "memorize",
20
- "save\\s+this",
21
- "note\\s+this",
22
- "keep\\s+in\\s+mind",
23
- "don'?t\\s+forget",
24
- "learn\\s+this",
25
- "store\\s+this",
26
- "record\\s+this",
27
- "make\\s+a\\s+note",
28
- "take\\s+note",
29
- "jot\\s+down",
30
- "commit\\s+to\\s+memory",
31
- "remember\\s+that",
32
- "never\\s+forget",
33
- "always\\s+remember",
34
- ];
35
17
  const DEFAULTS = {
36
18
  storagePath: join(DATA_DIR, "data"),
37
19
  embeddingModel: "Xenova/nomic-embed-text-v1",
@@ -41,7 +23,6 @@ const DEFAULTS = {
41
23
  maxProfileItems: 5,
42
24
  injectProfile: true,
43
25
  containerTagPrefix: "opencode",
44
- keywordPatterns: [],
45
26
  autoCaptureEnabled: true,
46
27
  autoCaptureMaxIterations: 5,
47
28
  autoCaptureIterationTimeout: 30000,
@@ -61,15 +42,6 @@ const DEFAULTS = {
61
42
  userProfileConfidenceDecayDays: 30,
62
43
  userProfileChangelogRetentionCount: 5,
63
44
  };
64
- function isValidRegex(pattern) {
65
- try {
66
- new RegExp(pattern);
67
- return true;
68
- }
69
- catch {
70
- return false;
71
- }
72
- }
73
45
  function expandPath(path) {
74
46
  if (path.startsWith("~/")) {
75
47
  return join(homedir(), path.slice(2));
@@ -268,11 +240,7 @@ const CONFIG_TEMPLATE = `{
268
240
  // ============================================
269
241
 
270
242
  // Inject user profile into AI context (preferences, patterns, workflows)
271
- "injectProfile": true,
272
-
273
- // Additional regex patterns to trigger manual memory capture
274
- // Default patterns: "remember", "memorize", "save this", "note this", etc.
275
- "keywordPatterns": []
243
+ "injectProfile": true
276
244
  }
277
245
  `;
278
246
  function ensureConfigExists() {
@@ -316,16 +284,14 @@ export const CONFIG = {
316
284
  embeddingDimensions: fileConfig.embeddingDimensions ??
317
285
  getEmbeddingDimensions(fileConfig.embeddingModel ?? DEFAULTS.embeddingModel),
318
286
  embeddingApiUrl: fileConfig.embeddingApiUrl,
319
- embeddingApiKey: fileConfig.embeddingApiKey ?? process.env.OPENAI_API_KEY,
287
+ embeddingApiKey: fileConfig.embeddingApiUrl
288
+ ? (fileConfig.embeddingApiKey ?? process.env.OPENAI_API_KEY)
289
+ : undefined,
320
290
  similarityThreshold: fileConfig.similarityThreshold ?? DEFAULTS.similarityThreshold,
321
291
  maxMemories: fileConfig.maxMemories ?? DEFAULTS.maxMemories,
322
292
  maxProfileItems: fileConfig.maxProfileItems ?? DEFAULTS.maxProfileItems,
323
293
  injectProfile: fileConfig.injectProfile ?? DEFAULTS.injectProfile,
324
294
  containerTagPrefix: fileConfig.containerTagPrefix ?? DEFAULTS.containerTagPrefix,
325
- keywordPatterns: [
326
- ...DEFAULT_KEYWORD_PATTERNS,
327
- ...(fileConfig.keywordPatterns ?? []).filter(isValidRegex),
328
- ],
329
295
  autoCaptureEnabled: fileConfig.autoCaptureEnabled ?? DEFAULTS.autoCaptureEnabled,
330
296
  autoCaptureMaxIterations: fileConfig.autoCaptureMaxIterations ?? DEFAULTS.autoCaptureMaxIterations,
331
297
  autoCaptureIterationTimeout: fileConfig.autoCaptureIterationTimeout ?? DEFAULTS.autoCaptureIterationTimeout,
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAC;AA0C/D,eAAO,MAAM,iBAAiB,EAAE,MA0e/B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAC;AAiB/D,eAAO,MAAM,iBAAiB,EAAE,MA6c/B,CAAC"}
package/dist/index.js CHANGED
@@ -9,30 +9,9 @@ import { userPromptManager } from "./services/user-prompt/user-prompt-manager.js
9
9
  import { startWebServer, WebServer } from "./services/web-server.js";
10
10
  import { isConfigured, CONFIG } from "./config.js";
11
11
  import { log } from "./services/logger.js";
12
- const CODE_BLOCK_PATTERN = /```[\s\S]*?```/g;
13
- const INLINE_CODE_PATTERN = /`[^`]+`/g;
14
- const MEMORY_KEYWORD_PATTERN = new RegExp(`\\b(${CONFIG.keywordPatterns.join("|")})\\b`, "i");
15
- const MEMORY_NUDGE_MESSAGE = `[MEMORY TRIGGER DETECTED]
16
- The user wants you to remember something. You MUST use the \`memory\` tool with \`mode: "add"\` to save this information.
17
-
18
- Extract the key information the user wants remembered and save it as a concise, searchable memory.
19
- - Use \`scope: "project"\` for project-specific knowledge (e.g., "run lint with tests", architecture decisions)
20
- - Choose an appropriate \`type\`: "preference", "project-config", "learned-pattern", etc.
21
-
22
- Note: User preferences are automatically learned through the user profile system. Only store project-specific information.
23
-
24
- DO NOT skip this step. The user explicitly asked you to remember.`;
25
- function removeCodeBlocks(text) {
26
- return text.replace(CODE_BLOCK_PATTERN, "").replace(INLINE_CODE_PATTERN, "");
27
- }
28
- function detectMemoryKeyword(text) {
29
- const textWithoutCode = removeCodeBlocks(text);
30
- return MEMORY_KEYWORD_PATTERN.test(textWithoutCode);
31
- }
32
12
  export const OpenCodeMemPlugin = async (ctx) => {
33
13
  const { directory } = ctx;
34
14
  const tags = getTags(directory);
35
- const injectedSessions = new Set();
36
15
  let webServer = null;
37
16
  if (!isConfigured()) {
38
17
  log("Plugin disabled - memory system not configured");
@@ -129,47 +108,41 @@ export const OpenCodeMemPlugin = async (ctx) => {
129
108
  if (!userMessage.trim())
130
109
  return;
131
110
  userPromptManager.savePrompt(input.sessionID, output.message.id, directory, userMessage);
132
- if (detectMemoryKeyword(userMessage)) {
133
- const nudgePart = {
134
- id: `memory-nudge-${Date.now()}`,
135
- sessionID: input.sessionID,
136
- messageID: output.message.id,
137
- type: "text",
138
- text: MEMORY_NUDGE_MESSAGE,
139
- synthetic: true,
140
- };
141
- output.parts.push(nudgePart);
142
- }
143
- const isFirstMessage = !injectedSessions.has(input.sessionID);
144
- if (isFirstMessage) {
145
- injectedSessions.add(input.sessionID);
146
- const projectMemoriesListResult = await memoryClient.listMemories(tags.project.tag, CONFIG.maxMemories);
147
- const projectMemoriesList = projectMemoriesListResult.success
148
- ? projectMemoriesListResult
149
- : { memories: [] };
150
- const projectMemories = {
151
- results: (projectMemoriesList.memories || []).map((m) => ({
152
- id: m.id,
153
- memory: m.summary,
154
- similarity: 1,
155
- title: m.title,
156
- metadata: m.metadata,
157
- })),
158
- total: projectMemoriesList.memories?.length || 0,
159
- timing: 0,
160
- };
161
- const userId = tags.user.userEmail || null;
162
- const memoryContext = formatContextForPrompt(userId, projectMemories);
163
- if (memoryContext) {
164
- const contextPart = {
165
- id: `memory-context-${Date.now()}`,
166
- sessionID: input.sessionID,
167
- messageID: output.message.id,
168
- type: "text",
169
- text: memoryContext,
170
- synthetic: true,
111
+ const searchResult = await memoryClient.searchMemories(userMessage, tags.project.tag);
112
+ if (searchResult.success && searchResult.results.length > 0) {
113
+ const relevantMemories = searchResult.results
114
+ .filter((m) => {
115
+ const memorySessionId = m.metadata?.sessionID;
116
+ const isFromOtherSession = memorySessionId !== input.sessionID;
117
+ const isRelevant = m.similarity > 0.65;
118
+ return isFromOtherSession && isRelevant;
119
+ })
120
+ .slice(0, 3);
121
+ if (relevantMemories.length > 0) {
122
+ const projectMemories = {
123
+ results: relevantMemories.map((m) => ({
124
+ id: m.id,
125
+ memory: m.memory,
126
+ similarity: m.similarity,
127
+ title: m.displayName,
128
+ metadata: m.metadata,
129
+ })),
130
+ total: relevantMemories.length,
131
+ timing: 0,
171
132
  };
172
- output.parts.unshift(contextPart);
133
+ const userId = tags.user.userEmail || null;
134
+ const memoryContext = formatContextForPrompt(userId, projectMemories);
135
+ if (memoryContext) {
136
+ const contextPart = {
137
+ id: `memory-context-${Date.now()}`,
138
+ sessionID: input.sessionID,
139
+ messageID: output.message.id,
140
+ type: "text",
141
+ text: memoryContext,
142
+ synthetic: true,
143
+ };
144
+ output.parts.unshift(contextPart);
145
+ }
173
146
  }
174
147
  }
175
148
  }
@@ -191,11 +164,9 @@ export const OpenCodeMemPlugin = async (ctx) => {
191
164
  },
192
165
  tool: {
193
166
  memory: tool({
194
- description: "Manage and query the local persistent memory system. Use 'search' to find relevant memories, 'add' to store new knowledge, 'profile' to view user profile, 'list' to see recent memories, 'forget' to remove a memory.",
167
+ description: "Manage and query local persistent memory. Use 'search' to find relevant memories, 'add' to store new knowledge (MATCH USER LANGUAGE), 'profile' to view user preferences, 'list' to see recent memories, 'forget' to remove a memory.",
195
168
  args: {
196
- mode: tool.schema
197
- .enum(["add", "search", "profile", "list", "forget", "help", "capture-now"])
198
- .optional(),
169
+ mode: tool.schema.enum(["add", "search", "profile", "list", "forget", "help"]).optional(),
199
170
  content: tool.schema.string().optional(),
200
171
  query: tool.schema.string().optional(),
201
172
  type: tool.schema.string().optional(),
@@ -226,12 +197,12 @@ export const OpenCodeMemPlugin = async (ctx) => {
226
197
  commands: [
227
198
  {
228
199
  command: "add",
229
- description: "Store a new project memory",
200
+ description: "Store a new project memory (MATCH USER LANGUAGE)",
230
201
  args: ["content", "type?"],
231
202
  },
232
203
  {
233
204
  command: "search",
234
- description: "Search project memories",
205
+ description: "Search project memories (MATCH USER LANGUAGE)",
235
206
  args: ["query"],
236
207
  },
237
208
  {
@@ -249,11 +220,6 @@ export const OpenCodeMemPlugin = async (ctx) => {
249
220
  description: "Remove a project memory",
250
221
  args: ["memoryId"],
251
222
  },
252
- {
253
- command: "capture-now",
254
- description: "Manually trigger memory capture for current session",
255
- args: [],
256
- },
257
223
  ],
258
224
  note: "User preferences are automatically learned through the user profile system. Only project-specific memories can be added manually.",
259
225
  typeGuidance: "Choose appropriate type: preference, architecture, workflow, bug-fix, configuration, pattern, request, context, etc. Be specific and descriptive with categories.",
@@ -377,14 +343,6 @@ export const OpenCodeMemPlugin = async (ctx) => {
377
343
  message: `Memory ${args.memoryId} removed`,
378
344
  });
379
345
  }
380
- case "capture-now": {
381
- const sessionID = toolCtx.sessionID;
382
- await performAutoCapture(ctx, sessionID, directory);
383
- return JSON.stringify({
384
- success: true,
385
- message: "Manual capture triggered",
386
- });
387
- }
388
346
  default:
389
347
  return JSON.stringify({
390
348
  success: false,
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-messages.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/providers/anthropic-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AA4BvF,qBAAa,yBAA0B,SAAQ,cAAc;IAC3D,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB;IAK3D,eAAe,IAAI,MAAM;IAIzB,eAAe,IAAI,OAAO;IAIpB,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;IA2K1B,OAAO,CAAC,cAAc;CAavB"}
1
+ {"version":3,"file":"anthropic-messages.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/providers/anthropic-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AA4BvF,qBAAa,yBAA0B,SAAQ,cAAc;IAC3D,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB;IAK3D,eAAe,IAAI,MAAM;IAIzB,eAAe,IAAI,OAAO;IAIpB,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;IAiL1B,OAAO,CAAC,cAAc;CAavB"}
@@ -44,11 +44,12 @@ export class AnthropicMessagesProvider extends BaseAIProvider {
44
44
  });
45
45
  messages.push({ role: "user", content: userPrompt });
46
46
  let iterations = 0;
47
- const maxIterations = this.config.maxIterations;
47
+ const maxIterations = this.config.maxIterations ?? 5;
48
+ const iterationTimeout = this.config.iterationTimeout ?? 30000;
48
49
  while (iterations < maxIterations) {
49
50
  iterations++;
50
51
  const controller = new AbortController();
51
- const timeout = setTimeout(() => controller.abort(), this.config.iterationTimeout);
52
+ const timeout = setTimeout(() => controller.abort(), iterationTimeout);
52
53
  try {
53
54
  const tool = ToolSchemaConverter.toAnthropic(toolSchema);
54
55
  const requestBody = {
@@ -57,13 +58,16 @@ export class AnthropicMessagesProvider extends BaseAIProvider {
57
58
  messages,
58
59
  tools: [tool],
59
60
  };
61
+ const headers = {
62
+ "Content-Type": "application/json",
63
+ "anthropic-version": "2023-06-01",
64
+ };
65
+ if (this.config.apiKey) {
66
+ headers["x-api-key"] = this.config.apiKey;
67
+ }
60
68
  const response = await fetch(`${this.config.apiUrl}/messages`, {
61
69
  method: "POST",
62
- headers: {
63
- "Content-Type": "application/json",
64
- "x-api-key": this.config.apiKey,
65
- "anthropic-version": "2023-06-01",
66
- },
70
+ headers,
67
71
  body: JSON.stringify(requestBody),
68
72
  signal: controller.signal,
69
73
  });
@@ -7,9 +7,9 @@ export interface ToolCallResult {
7
7
  export interface ProviderConfig {
8
8
  model: string;
9
9
  apiUrl: string;
10
- apiKey: string;
11
- maxIterations: number;
12
- iterationTimeout: number;
10
+ apiKey?: string;
11
+ maxIterations?: number;
12
+ iterationTimeout?: number;
13
13
  }
14
14
  export declare abstract class BaseAIProvider {
15
15
  protected config: ProviderConfig;
@@ -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,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;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
+ {"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;CAC3B;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;IAwCnC,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;CAkO3B"}
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;IAwCnC,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;CAyO3B"}
@@ -108,10 +108,12 @@ export class OpenAIChatCompletionProvider extends BaseAIProvider {
108
108
  });
109
109
  messages.push({ role: "user", content: userPrompt });
110
110
  let iterations = 0;
111
- while (iterations < this.config.maxIterations) {
111
+ const maxIterations = this.config.maxIterations ?? 5;
112
+ const iterationTimeout = this.config.iterationTimeout ?? 30000;
113
+ while (iterations < maxIterations) {
112
114
  iterations++;
113
115
  const controller = new AbortController();
114
- const timeout = setTimeout(() => controller.abort(), this.config.iterationTimeout);
116
+ const timeout = setTimeout(() => controller.abort(), iterationTimeout);
115
117
  try {
116
118
  const requestBody = {
117
119
  model: this.config.model,
@@ -120,12 +122,15 @@ export class OpenAIChatCompletionProvider extends BaseAIProvider {
120
122
  tool_choice: { type: "function", function: { name: toolSchema.function.name } },
121
123
  temperature: 0.3,
122
124
  };
125
+ const headers = {
126
+ "Content-Type": "application/json",
127
+ };
128
+ if (this.config.apiKey) {
129
+ headers.Authorization = `Bearer ${this.config.apiKey}`;
130
+ }
123
131
  const response = await fetch(`${this.config.apiUrl}/chat/completions`, {
124
132
  method: "POST",
125
- headers: {
126
- "Content-Type": "application/json",
127
- Authorization: `Bearer ${this.config.apiKey}`,
128
- },
133
+ headers,
129
134
  body: JSON.stringify(requestBody),
130
135
  signal: controller.signal,
131
136
  });
@@ -1 +1 @@
1
- {"version":3,"file":"openai-responses.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/providers/openai-responses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAsBvF,qBAAa,uBAAwB,SAAQ,cAAc;IACzD,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB;IAK3D,eAAe,IAAI,MAAM;IAIzB,eAAe,IAAI,OAAO;IAIpB,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;IAuH1B,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,gBAAgB;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,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAsBvF,qBAAa,uBAAwB,SAAQ,cAAc;IACzD,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB;IAK3D,eAAe,IAAI,MAAM;IAIzB,eAAe,IAAI,OAAO;IAIpB,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;IAyH1B,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,gBAAgB;CAsBzB"}
@@ -25,10 +25,12 @@ export class OpenAIResponsesProvider extends BaseAIProvider {
25
25
  let conversationId = session.conversationId;
26
26
  let currentPrompt = userPrompt;
27
27
  let iterations = 0;
28
- while (iterations < this.config.maxIterations) {
28
+ const maxIterations = this.config.maxIterations ?? 5;
29
+ const iterationTimeout = this.config.iterationTimeout ?? 30000;
30
+ while (iterations < maxIterations) {
29
31
  iterations++;
30
32
  const controller = new AbortController();
31
- const timeout = setTimeout(() => controller.abort(), this.config.iterationTimeout);
33
+ const timeout = setTimeout(() => controller.abort(), iterationTimeout);
32
34
  try {
33
35
  const tool = ToolSchemaConverter.toResponsesAPI(toolSchema);
34
36
  const requestBody = {
@@ -9,6 +9,5 @@ export declare class UserProfileValidator {
9
9
  private static validatePreferences;
10
10
  private static validatePatterns;
11
11
  private static validateWorkflows;
12
- private static validateSkillLevel;
13
12
  }
14
13
  //# sourceMappingURL=user-profile-validator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-profile-validator.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/validators/user-profile-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAED,qBAAa,oBAAoB;IAC/B,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,gBAAgB;IA0C5C,OAAO,CAAC,MAAM,CAAC,mBAAmB;IA6BlC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAqB/B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAuBhC,OAAO,CAAC,MAAM,CAAC,kBAAkB;CAalC"}
1
+ {"version":3,"file":"user-profile-validator.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/validators/user-profile-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAED,qBAAa,oBAAoB;IAC/B,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,gBAAgB;IAsC5C,OAAO,CAAC,MAAM,CAAC,mBAAmB;IA6BlC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAqB/B,OAAO,CAAC,MAAM,CAAC,iBAAiB;CAsBjC"}
@@ -31,10 +31,6 @@ export class UserProfileValidator {
31
31
  const workflowErrors = this.validateWorkflows(data.workflows);
32
32
  errors.push(...workflowErrors);
33
33
  }
34
- if (data.skillLevel) {
35
- const skillErrors = this.validateSkillLevel(data.skillLevel);
36
- errors.push(...skillErrors);
37
- }
38
34
  if (errors.length > 0) {
39
35
  return { valid: false, errors };
40
36
  }
@@ -112,17 +108,4 @@ export class UserProfileValidator {
112
108
  }
113
109
  return errors;
114
110
  }
115
- static validateSkillLevel(skillLevel) {
116
- const errors = [];
117
- if (typeof skillLevel !== "object") {
118
- return ["skillLevel must be an object"];
119
- }
120
- if (!skillLevel.overall || typeof skillLevel.overall !== "string") {
121
- errors.push("skillLevel.overall is missing or invalid");
122
- }
123
- if (!skillLevel.domains || typeof skillLevel.domains !== "object") {
124
- errors.push("skillLevel.domains must be an object");
125
- }
126
- return errors;
127
- }
128
111
  }
@@ -62,9 +62,38 @@ export declare function handleUpdateMemory(id: string, data: {
62
62
  content?: string;
63
63
  type?: MemoryType;
64
64
  }): Promise<ApiResponse<void>>;
65
- export declare function handleSearch(query: string, tag?: string, page?: number, pageSize?: number): Promise<ApiResponse<PaginatedResponse<Memory & {
66
- similarity: number;
67
- }>>>;
65
+ interface FormattedPrompt {
66
+ type: "prompt";
67
+ id: string;
68
+ sessionId: string;
69
+ content: string;
70
+ createdAt: string;
71
+ projectPath: string | null;
72
+ linkedMemoryId: string | null;
73
+ similarity?: number;
74
+ isContext?: boolean;
75
+ }
76
+ interface FormattedMemory {
77
+ type: "memory";
78
+ id: string;
79
+ content: string;
80
+ memoryType?: string;
81
+ createdAt: string;
82
+ updatedAt?: string;
83
+ similarity?: number;
84
+ metadata?: Record<string, unknown>;
85
+ displayName?: string;
86
+ userName?: string;
87
+ userEmail?: string;
88
+ projectPath?: string;
89
+ projectName?: string;
90
+ gitRepoUrl?: string;
91
+ isPinned?: boolean;
92
+ linkedPromptId?: string;
93
+ isContext?: boolean;
94
+ }
95
+ type SearchResultItem = FormattedPrompt | FormattedMemory;
96
+ export declare function handleSearch(query: string, tag?: string, page?: number, pageSize?: number): Promise<ApiResponse<PaginatedResponse<SearchResultItem>>>;
68
97
  export declare function handleStats(): Promise<ApiResponse<{
69
98
  total: number;
70
99
  byScope: {
@@ -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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"}