@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,166 @@
1
+ import { getDatabase } from "../../sqlite/sqlite-bootstrap.js";
2
+ import { join } from "node:path";
3
+ import { connectionManager } from "../../sqlite/connection-manager.js";
4
+ import { CONFIG } from "../../../config.js";
5
+ const Database = getDatabase();
6
+ const AI_SESSIONS_DB_NAME = "ai-sessions.db";
7
+ export class AISessionManager {
8
+ db;
9
+ dbPath;
10
+ sessionRetentionMs;
11
+ constructor() {
12
+ this.dbPath = join(CONFIG.storagePath, AI_SESSIONS_DB_NAME);
13
+ this.db = connectionManager.getConnection(this.dbPath);
14
+ this.sessionRetentionMs = CONFIG.aiSessionRetentionDays * 24 * 60 * 60 * 1000;
15
+ this.initDatabase();
16
+ }
17
+ initDatabase() {
18
+ this.db.run(`
19
+ CREATE TABLE IF NOT EXISTS ai_sessions (
20
+ id TEXT PRIMARY KEY,
21
+ provider TEXT NOT NULL,
22
+ session_id TEXT NOT NULL,
23
+ conversation_id TEXT,
24
+ metadata TEXT,
25
+ created_at INTEGER NOT NULL,
26
+ updated_at INTEGER NOT NULL,
27
+ expires_at INTEGER NOT NULL
28
+ )
29
+ `);
30
+ this.db.run("CREATE INDEX IF NOT EXISTS idx_ai_sessions_session_id ON ai_sessions(session_id)");
31
+ this.db.run("CREATE INDEX IF NOT EXISTS idx_ai_sessions_expires_at ON ai_sessions(expires_at)");
32
+ this.db.run("CREATE INDEX IF NOT EXISTS idx_ai_sessions_provider ON ai_sessions(provider)");
33
+ this.db.run(`
34
+ CREATE TABLE IF NOT EXISTS ai_messages (
35
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
36
+ ai_session_id TEXT NOT NULL,
37
+ sequence INTEGER NOT NULL,
38
+ role TEXT NOT NULL,
39
+ content TEXT NOT NULL,
40
+ tool_calls TEXT,
41
+ tool_call_id TEXT,
42
+ content_blocks TEXT,
43
+ created_at INTEGER NOT NULL,
44
+ FOREIGN KEY (ai_session_id) REFERENCES ai_sessions(id) ON DELETE CASCADE
45
+ )
46
+ `);
47
+ this.db.run("CREATE INDEX IF NOT EXISTS idx_ai_messages_session ON ai_messages(ai_session_id, sequence)");
48
+ this.db.run("CREATE INDEX IF NOT EXISTS idx_ai_messages_role ON ai_messages(ai_session_id, role)");
49
+ }
50
+ getSession(sessionId, provider) {
51
+ const stmt = this.db.prepare(`
52
+ SELECT * FROM ai_sessions
53
+ WHERE session_id = ? AND provider = ? AND expires_at > ?
54
+ `);
55
+ const row = stmt.get(sessionId, provider, Date.now());
56
+ if (!row)
57
+ return null;
58
+ return this.rowToSession(row);
59
+ }
60
+ createSession(params) {
61
+ const id = `sess_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
62
+ const now = Date.now();
63
+ const expiresAt = now + this.sessionRetentionMs;
64
+ this.db.run(`
65
+ INSERT INTO ai_sessions (
66
+ id, provider, session_id, conversation_id,
67
+ metadata, created_at, updated_at, expires_at
68
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
69
+ `, [
70
+ id,
71
+ params.provider,
72
+ params.sessionId,
73
+ params.conversationId || null,
74
+ JSON.stringify(params.metadata || {}),
75
+ now,
76
+ now,
77
+ expiresAt,
78
+ ]);
79
+ return this.getSession(params.sessionId, params.provider);
80
+ }
81
+ updateSession(sessionId, provider, updates) {
82
+ const fields = [];
83
+ const values = [];
84
+ if (updates.conversationId !== undefined) {
85
+ fields.push("conversation_id = ?");
86
+ values.push(updates.conversationId);
87
+ }
88
+ if (updates.metadata !== undefined) {
89
+ fields.push("metadata = ?");
90
+ values.push(JSON.stringify(updates.metadata));
91
+ }
92
+ fields.push("updated_at = ?");
93
+ values.push(Date.now());
94
+ values.push(sessionId);
95
+ values.push(provider);
96
+ this.db.run(`
97
+ UPDATE ai_sessions
98
+ SET ${fields.join(", ")}
99
+ WHERE session_id = ? AND provider = ?
100
+ `, values);
101
+ }
102
+ cleanupExpiredSessions() {
103
+ const result = this.db.run(`DELETE FROM ai_sessions WHERE expires_at < ?`, [Date.now()]);
104
+ return result.changes;
105
+ }
106
+ deleteSession(sessionId, provider) {
107
+ this.db.run(`DELETE FROM ai_sessions WHERE session_id = ? AND provider = ?`, [
108
+ sessionId,
109
+ provider,
110
+ ]);
111
+ }
112
+ addMessage(message) {
113
+ this.db.run(`INSERT INTO ai_messages (
114
+ ai_session_id, sequence, role, content,
115
+ tool_calls, tool_call_id, content_blocks, created_at
116
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [
117
+ message.aiSessionId,
118
+ message.sequence,
119
+ message.role,
120
+ message.content,
121
+ message.toolCalls ? JSON.stringify(message.toolCalls) : null,
122
+ message.toolCallId || null,
123
+ message.contentBlocks ? JSON.stringify(message.contentBlocks) : null,
124
+ Date.now(),
125
+ ]);
126
+ }
127
+ getMessages(aiSessionId) {
128
+ const stmt = this.db.prepare("SELECT * FROM ai_messages WHERE ai_session_id = ? ORDER BY sequence ASC");
129
+ const rows = stmt.all(aiSessionId);
130
+ return rows.map(this.rowToMessage);
131
+ }
132
+ getLastSequence(aiSessionId) {
133
+ const stmt = this.db.prepare("SELECT MAX(sequence) as max_seq FROM ai_messages WHERE ai_session_id = ?");
134
+ const row = stmt.get(aiSessionId);
135
+ return row?.max_seq ?? -1;
136
+ }
137
+ clearMessages(aiSessionId) {
138
+ this.db.run("DELETE FROM ai_messages WHERE ai_session_id = ?", [aiSessionId]);
139
+ }
140
+ rowToSession(row) {
141
+ return {
142
+ id: row.id,
143
+ provider: row.provider,
144
+ sessionId: row.session_id,
145
+ conversationId: row.conversation_id,
146
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
147
+ createdAt: row.created_at,
148
+ updatedAt: row.updated_at,
149
+ expiresAt: row.expires_at,
150
+ };
151
+ }
152
+ rowToMessage(row) {
153
+ return {
154
+ id: row.id,
155
+ aiSessionId: row.ai_session_id,
156
+ sequence: row.sequence,
157
+ role: row.role,
158
+ content: row.content,
159
+ toolCalls: row.tool_calls ? JSON.parse(row.tool_calls) : undefined,
160
+ toolCallId: row.tool_call_id,
161
+ contentBlocks: row.content_blocks ? JSON.parse(row.content_blocks) : undefined,
162
+ createdAt: row.created_at,
163
+ };
164
+ }
165
+ }
166
+ export const aiSessionManager = new AISessionManager();
@@ -0,0 +1,43 @@
1
+ export type AIProviderType = "openai-chat" | "openai-responses" | "anthropic" | "google-gemini";
2
+ export interface AIMessage {
3
+ id?: number;
4
+ aiSessionId: string;
5
+ sequence: number;
6
+ role: "system" | "user" | "assistant" | "tool";
7
+ content: string;
8
+ toolCalls?: Array<{
9
+ id: string;
10
+ type: "function";
11
+ function: {
12
+ name: string;
13
+ arguments: string;
14
+ };
15
+ }>;
16
+ toolCallId?: string;
17
+ contentBlocks?: Array<{
18
+ type: string;
19
+ [key: string]: any;
20
+ }>;
21
+ createdAt: number;
22
+ }
23
+ export interface AISession {
24
+ id: string;
25
+ provider: AIProviderType;
26
+ sessionId: string;
27
+ conversationId?: string;
28
+ metadata?: Record<string, any>;
29
+ createdAt: number;
30
+ updatedAt: number;
31
+ expiresAt: number;
32
+ }
33
+ export interface SessionCreateParams {
34
+ provider: AIProviderType;
35
+ sessionId: string;
36
+ conversationId?: string;
37
+ metadata?: Record<string, any>;
38
+ }
39
+ export interface SessionUpdateParams {
40
+ conversationId?: string;
41
+ metadata?: Record<string, any>;
42
+ }
43
+ //# sourceMappingURL=session-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-types.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/session/session-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,kBAAkB,GAAG,WAAW,GAAG,eAAe,CAAC;AAEhG,MAAM,WAAW,SAAS;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,UAAU,CAAC;QACjB,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/C,CAAC,CAAC;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,KAAK,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC,CAAC;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,41 @@
1
+ export interface ChatCompletionTool {
2
+ type: "function";
3
+ function: {
4
+ name: string;
5
+ description: string;
6
+ parameters: {
7
+ type: string;
8
+ properties: Record<string, any>;
9
+ required: string[];
10
+ };
11
+ };
12
+ }
13
+ export interface ResponsesAPITool {
14
+ type: "function";
15
+ name: string;
16
+ description: string;
17
+ parameters: {
18
+ type: string;
19
+ properties: Record<string, any>;
20
+ required: string[];
21
+ };
22
+ }
23
+ export interface AnthropicTool {
24
+ name: string;
25
+ description: string;
26
+ input_schema: {
27
+ type: string;
28
+ properties: Record<string, any>;
29
+ required: string[];
30
+ };
31
+ }
32
+ export declare class ToolSchemaConverter {
33
+ static toResponsesAPI(chatCompletionTool: ChatCompletionTool): ResponsesAPITool;
34
+ static toAnthropic(chatCompletionTool: ChatCompletionTool): AnthropicTool;
35
+ static fromChatCompletion(tool: ChatCompletionTool): {
36
+ chatCompletion: ChatCompletionTool;
37
+ responsesAPI: ResponsesAPITool;
38
+ anthropic: AnthropicTool;
39
+ };
40
+ }
41
+ //# sourceMappingURL=tool-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-schema.d.ts","sourceRoot":"","sources":["../../../../src/services/ai/tools/tool-schema.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE;YACV,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;SACpB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AAED,qBAAa,mBAAmB;IAC9B,MAAM,CAAC,cAAc,CAAC,kBAAkB,EAAE,kBAAkB,GAAG,gBAAgB;IAS/E,MAAM,CAAC,WAAW,CAAC,kBAAkB,EAAE,kBAAkB,GAAG,aAAa;IAQzE,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,GAAG;QACnD,cAAc,EAAE,kBAAkB,CAAC;QACnC,YAAY,EAAE,gBAAgB,CAAC;QAC/B,SAAS,EAAE,aAAa,CAAC;KAC1B;CAOF"}
@@ -0,0 +1,24 @@
1
+ export class ToolSchemaConverter {
2
+ static toResponsesAPI(chatCompletionTool) {
3
+ return {
4
+ type: "function",
5
+ name: chatCompletionTool.function.name,
6
+ description: chatCompletionTool.function.description,
7
+ parameters: chatCompletionTool.function.parameters,
8
+ };
9
+ }
10
+ static toAnthropic(chatCompletionTool) {
11
+ return {
12
+ name: chatCompletionTool.function.name,
13
+ description: chatCompletionTool.function.description,
14
+ input_schema: chatCompletionTool.function.parameters,
15
+ };
16
+ }
17
+ static fromChatCompletion(tool) {
18
+ return {
19
+ chatCompletion: tool,
20
+ responsesAPI: this.toResponsesAPI(tool),
21
+ anthropic: this.toAnthropic(tool),
22
+ };
23
+ }
24
+ }
@@ -0,0 +1,13 @@
1
+ import type { UserProfileData } from "../../user-profile/types.js";
2
+ export interface ValidationResult {
3
+ valid: boolean;
4
+ errors: string[];
5
+ data?: UserProfileData;
6
+ }
7
+ export declare class UserProfileValidator {
8
+ static validate(data: any): ValidationResult;
9
+ private static validatePreferences;
10
+ private static validatePatterns;
11
+ private static validateWorkflows;
12
+ }
13
+ //# sourceMappingURL=user-profile-validator.d.ts.map
@@ -0,0 +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;IAsC5C,OAAO,CAAC,MAAM,CAAC,mBAAmB;IA6BlC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAqB/B,OAAO,CAAC,MAAM,CAAC,iBAAiB;CAsBjC"}
@@ -0,0 +1,111 @@
1
+ export class UserProfileValidator {
2
+ static validate(data) {
3
+ const errors = [];
4
+ if (!data || typeof data !== "object") {
5
+ return { valid: false, errors: ["Response is not an object"] };
6
+ }
7
+ if (Array.isArray(data)) {
8
+ return { valid: false, errors: ["Response cannot be an array"] };
9
+ }
10
+ const keys = Object.keys(data);
11
+ if (keys.length === 0) {
12
+ return { valid: false, errors: ["Response object is empty"] };
13
+ }
14
+ for (const key of keys) {
15
+ if (data[key] === undefined || data[key] === null) {
16
+ errors.push(`Field '${key}' is null or undefined`);
17
+ }
18
+ }
19
+ if (errors.length > 0) {
20
+ return { valid: false, errors };
21
+ }
22
+ if (data.preferences) {
23
+ const prefErrors = this.validatePreferences(data.preferences);
24
+ errors.push(...prefErrors);
25
+ }
26
+ if (data.patterns) {
27
+ const patternErrors = this.validatePatterns(data.patterns);
28
+ errors.push(...patternErrors);
29
+ }
30
+ if (data.workflows) {
31
+ const workflowErrors = this.validateWorkflows(data.workflows);
32
+ errors.push(...workflowErrors);
33
+ }
34
+ if (errors.length > 0) {
35
+ return { valid: false, errors };
36
+ }
37
+ return { valid: true, errors: [], data: data };
38
+ }
39
+ static validatePreferences(preferences) {
40
+ const errors = [];
41
+ if (!Array.isArray(preferences)) {
42
+ return ["preferences must be an array"];
43
+ }
44
+ for (let i = 0; i < preferences.length; i++) {
45
+ const pref = preferences[i];
46
+ if (!pref || typeof pref !== "object") {
47
+ errors.push(`preferences[${i}] is not an object`);
48
+ continue;
49
+ }
50
+ if (!pref.category || typeof pref.category !== "string") {
51
+ errors.push(`preferences[${i}].category is missing or invalid`);
52
+ }
53
+ if (!pref.description || typeof pref.description !== "string") {
54
+ errors.push(`preferences[${i}].description is missing or invalid`);
55
+ }
56
+ if (typeof pref.confidence !== "number") {
57
+ errors.push(`preferences[${i}].confidence is missing or invalid`);
58
+ }
59
+ if (!Array.isArray(pref.evidence)) {
60
+ errors.push(`preferences[${i}].evidence must be an array`);
61
+ }
62
+ else if (pref.evidence.length === 0) {
63
+ errors.push(`preferences[${i}].evidence cannot be empty`);
64
+ }
65
+ }
66
+ return errors;
67
+ }
68
+ static validatePatterns(patterns) {
69
+ const errors = [];
70
+ if (!Array.isArray(patterns)) {
71
+ return ["patterns must be an array"];
72
+ }
73
+ for (let i = 0; i < patterns.length; i++) {
74
+ const pattern = patterns[i];
75
+ if (!pattern || typeof pattern !== "object") {
76
+ errors.push(`patterns[${i}] is not an object`);
77
+ continue;
78
+ }
79
+ if (!pattern.category || typeof pattern.category !== "string") {
80
+ errors.push(`patterns[${i}].category is missing or invalid`);
81
+ }
82
+ if (!pattern.description || typeof pattern.description !== "string") {
83
+ errors.push(`patterns[${i}].description is missing or invalid`);
84
+ }
85
+ }
86
+ return errors;
87
+ }
88
+ static validateWorkflows(workflows) {
89
+ const errors = [];
90
+ if (!Array.isArray(workflows)) {
91
+ return ["workflows must be an array"];
92
+ }
93
+ for (let i = 0; i < workflows.length; i++) {
94
+ const workflow = workflows[i];
95
+ if (!workflow || typeof workflow !== "object") {
96
+ errors.push(`workflows[${i}] is not an object`);
97
+ continue;
98
+ }
99
+ if (!workflow.description || typeof workflow.description !== "string") {
100
+ errors.push(`workflows[${i}].description is missing or invalid`);
101
+ }
102
+ if (!Array.isArray(workflow.steps)) {
103
+ errors.push(`workflows[${i}].steps must be an array`);
104
+ }
105
+ else if (workflow.steps.length === 0) {
106
+ errors.push(`workflows[${i}].steps cannot be empty`);
107
+ }
108
+ }
109
+ return errors;
110
+ }
111
+ }
@@ -0,0 +1,164 @@
1
+ import type { MemoryType } from "../types/index.js";
2
+ interface ApiResponse<T = any> {
3
+ success: boolean;
4
+ data?: T;
5
+ error?: string;
6
+ }
7
+ interface Memory {
8
+ id: string;
9
+ content: string;
10
+ type?: string;
11
+ tags?: string[];
12
+ createdAt: string;
13
+ updatedAt?: string;
14
+ metadata?: Record<string, unknown>;
15
+ displayName?: string;
16
+ userName?: string;
17
+ userEmail?: string;
18
+ projectPath?: string;
19
+ projectName?: string;
20
+ gitRepoUrl?: string;
21
+ isPinned?: boolean;
22
+ }
23
+ interface TagInfo {
24
+ tag: string;
25
+ tags?: string[];
26
+ displayName?: string;
27
+ userName?: string;
28
+ userEmail?: string;
29
+ projectPath?: string;
30
+ projectName?: string;
31
+ gitRepoUrl?: string;
32
+ }
33
+ interface PaginatedResponse<T> {
34
+ items: T[];
35
+ total: number;
36
+ page: number;
37
+ pageSize: number;
38
+ totalPages: number;
39
+ }
40
+ export declare function handleListTags(): Promise<ApiResponse<{
41
+ project: TagInfo[];
42
+ }>>;
43
+ export declare function handleListMemories(tag?: string, page?: number, pageSize?: number, includePrompts?: boolean): Promise<ApiResponse<PaginatedResponse<Memory | any>>>;
44
+ export declare function handleAddMemory(data: {
45
+ content: string;
46
+ containerTag: string;
47
+ type?: MemoryType;
48
+ tags?: string[];
49
+ displayName?: string;
50
+ userName?: string;
51
+ userEmail?: string;
52
+ projectPath?: string;
53
+ projectName?: string;
54
+ gitRepoUrl?: string;
55
+ }): Promise<ApiResponse<{
56
+ id: string;
57
+ }>>;
58
+ export declare function handleDeleteMemory(id: string, cascade?: boolean): Promise<ApiResponse<{
59
+ deletedPrompt: boolean;
60
+ }>>;
61
+ export declare function handleBulkDelete(ids: string[], cascade?: boolean): Promise<ApiResponse<{
62
+ deleted: number;
63
+ }>>;
64
+ export declare function handleUpdateMemory(id: string, data: {
65
+ content?: string;
66
+ type?: MemoryType;
67
+ tags?: string[];
68
+ }): Promise<ApiResponse<void>>;
69
+ interface FormattedPrompt {
70
+ type: "prompt";
71
+ id: string;
72
+ sessionId: string;
73
+ content: string;
74
+ createdAt: string;
75
+ projectPath: string | null;
76
+ linkedMemoryId: string | null;
77
+ similarity?: number;
78
+ isContext?: boolean;
79
+ }
80
+ interface FormattedMemory {
81
+ type: "memory";
82
+ id: string;
83
+ content: string;
84
+ memoryType?: string;
85
+ tags?: string[];
86
+ createdAt: string;
87
+ updatedAt?: string;
88
+ similarity?: number;
89
+ metadata?: Record<string, unknown>;
90
+ displayName?: string;
91
+ userName?: string;
92
+ userEmail?: string;
93
+ projectPath?: string;
94
+ projectName?: string;
95
+ gitRepoUrl?: string;
96
+ isPinned?: boolean;
97
+ linkedPromptId?: string;
98
+ isContext?: boolean;
99
+ }
100
+ type SearchResultItem = FormattedPrompt | FormattedMemory;
101
+ export declare function handleSearch(query: string, tag?: string, page?: number, pageSize?: number): Promise<ApiResponse<PaginatedResponse<SearchResultItem>>>;
102
+ export declare function handleStats(): Promise<ApiResponse<{
103
+ total: number;
104
+ byScope: {
105
+ user: number;
106
+ project: number;
107
+ };
108
+ byType: Record<string, number>;
109
+ }>>;
110
+ export declare function handlePinMemory(id: string): Promise<ApiResponse<void>>;
111
+ export declare function handleUnpinMemory(id: string): Promise<ApiResponse<void>>;
112
+ export declare function handleRunCleanup(): Promise<ApiResponse<{
113
+ deletedCount: number;
114
+ userCount: number;
115
+ projectCount: number;
116
+ }>>;
117
+ export declare function handleRunDeduplication(): Promise<ApiResponse<{
118
+ exactDuplicatesDeleted: number;
119
+ nearDuplicateGroups: any[];
120
+ }>>;
121
+ export declare function handleDetectMigration(): Promise<ApiResponse<{
122
+ needsMigration: boolean;
123
+ configDimensions: number;
124
+ configModel: string;
125
+ shardMismatches: any[];
126
+ }>>;
127
+ export declare function handleRunMigration(strategy: "fresh-start" | "re-embed"): Promise<ApiResponse<{
128
+ success: boolean;
129
+ strategy: string;
130
+ deletedShards: number;
131
+ reEmbeddedMemories: number;
132
+ duration: number;
133
+ error?: string;
134
+ }>>;
135
+ export declare function handleDeletePrompt(id: string, cascade?: boolean): Promise<ApiResponse<{
136
+ deletedMemory: boolean;
137
+ }>>;
138
+ export declare function handleBulkDeletePrompts(ids: string[], cascade?: boolean): Promise<ApiResponse<{
139
+ deleted: number;
140
+ }>>;
141
+ export declare function handleGetUserProfile(userId?: string): Promise<ApiResponse<any>>;
142
+ export declare function handleGetProfileChangelog(profileId: string, limit?: number): Promise<ApiResponse<any[]>>;
143
+ export declare function handleGetProfileSnapshot(changelogId: string): Promise<ApiResponse<any>>;
144
+ export declare function handleRefreshProfile(userId?: string): Promise<ApiResponse<any>>;
145
+ export declare function handleDetectTagMigration(): Promise<ApiResponse<{
146
+ needsMigration: boolean;
147
+ count: number;
148
+ }>>;
149
+ interface MigrationProgress {
150
+ processed: number;
151
+ total: number;
152
+ currentBatch: number;
153
+ totalBatches: number;
154
+ isComplete: boolean;
155
+ errors: string[];
156
+ }
157
+ export declare function handleGetTagMigrationProgress(): Promise<ApiResponse<MigrationProgress>>;
158
+ export declare function handleRunTagMigrationBatch(batchSize?: number): Promise<ApiResponse<{
159
+ processed: number;
160
+ total: number;
161
+ hasMore: boolean;
162
+ }>>;
163
+ export {};
164
+ //# sourceMappingURL=api-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-handlers.d.ts","sourceRoot":"","sources":["../../src/services/api-handlers.ts"],"names":[],"mappings":"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"}