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.
- package/dist/config.d.ts +0 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -38
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -80
- package/dist/services/ai/providers/anthropic-messages.d.ts.map +1 -1
- package/dist/services/ai/providers/anthropic-messages.js +11 -7
- package/dist/services/ai/providers/base-provider.d.ts +3 -3
- package/dist/services/ai/providers/base-provider.d.ts.map +1 -1
- package/dist/services/ai/providers/openai-chat-completion.d.ts.map +1 -1
- package/dist/services/ai/providers/openai-chat-completion.js +11 -6
- package/dist/services/ai/providers/openai-responses.d.ts.map +1 -1
- package/dist/services/ai/providers/openai-responses.js +4 -2
- package/dist/services/ai/validators/user-profile-validator.d.ts +0 -1
- package/dist/services/ai/validators/user-profile-validator.d.ts.map +1 -1
- package/dist/services/ai/validators/user-profile-validator.js +0 -17
- package/dist/services/api-handlers.d.ts +32 -3
- package/dist/services/api-handlers.d.ts.map +1 -1
- package/dist/services/api-handlers.js +89 -13
- package/dist/services/auto-capture.js +11 -4
- package/dist/services/logger.d.ts.map +1 -1
- package/dist/services/logger.js +3 -1
- package/dist/services/sqlite/connection-manager.d.ts.map +1 -1
- package/dist/services/user-memory-learning.js +9 -14
- package/dist/services/user-profile/types.d.ts +0 -5
- package/dist/services/user-profile/types.d.ts.map +1 -1
- package/dist/services/user-profile/user-profile-manager.d.ts.map +1 -1
- package/dist/services/user-profile/user-profile-manager.js +0 -7
- package/dist/services/user-prompt/user-prompt-manager.d.ts +2 -0
- package/dist/services/user-prompt/user-prompt-manager.d.ts.map +1 -1
- package/dist/services/user-prompt/user-prompt-manager.js +21 -0
- package/dist/web/app.js +196 -114
- package/dist/web/styles.css +202 -122
- package/package.json +1 -1
package/dist/config.d.ts
CHANGED
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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.
|
|
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,
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
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
|
|
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;
|
|
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(),
|
|
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
|
|
11
|
-
maxIterations
|
|
12
|
-
iterationTimeout
|
|
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;
|
|
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;
|
|
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
|
-
|
|
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(),
|
|
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;
|
|
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
|
-
|
|
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(),
|
|
33
|
+
const timeout = setTimeout(() => controller.abort(), iterationTimeout);
|
|
32
34
|
try {
|
|
33
35
|
const tool = ToolSchemaConverter.toResponsesAPI(toolSchema);
|
|
34
36
|
const requestBody = {
|
|
@@ -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;
|
|
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
|
-
|
|
66
|
-
|
|
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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"}
|