@serjm/deepseek-code 0.3.1

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 (216) hide show
  1. package/CONTRIBUTING.md +73 -0
  2. package/README.md +194 -0
  3. package/README.ru.md +194 -0
  4. package/dist/api/index.d.ts +77 -0
  5. package/dist/api/index.d.ts.map +1 -0
  6. package/dist/api/index.js +263 -0
  7. package/dist/api/index.js.map +1 -0
  8. package/dist/cli/headless.d.ts +22 -0
  9. package/dist/cli/headless.d.ts.map +1 -0
  10. package/dist/cli/headless.js +122 -0
  11. package/dist/cli/headless.js.map +1 -0
  12. package/dist/cli/index.d.ts +3 -0
  13. package/dist/cli/index.d.ts.map +1 -0
  14. package/dist/cli/index.js +90 -0
  15. package/dist/cli/index.js.map +1 -0
  16. package/dist/cli/interactive.d.ts +18 -0
  17. package/dist/cli/interactive.d.ts.map +1 -0
  18. package/dist/cli/interactive.js +75 -0
  19. package/dist/cli/interactive.js.map +1 -0
  20. package/dist/commands/index.d.ts +30 -0
  21. package/dist/commands/index.d.ts.map +1 -0
  22. package/dist/commands/index.js +964 -0
  23. package/dist/commands/index.js.map +1 -0
  24. package/dist/config/defaults.d.ts +37 -0
  25. package/dist/config/defaults.d.ts.map +1 -0
  26. package/dist/config/defaults.js +39 -0
  27. package/dist/config/defaults.js.map +1 -0
  28. package/dist/config/loader.d.ts +4 -0
  29. package/dist/config/loader.d.ts.map +1 -0
  30. package/dist/config/loader.js +76 -0
  31. package/dist/config/loader.js.map +1 -0
  32. package/dist/core/agent-loop.d.ts +111 -0
  33. package/dist/core/agent-loop.d.ts.map +1 -0
  34. package/dist/core/agent-loop.js +485 -0
  35. package/dist/core/agent-loop.js.map +1 -0
  36. package/dist/core/checkpoint.d.ts +10 -0
  37. package/dist/core/checkpoint.d.ts.map +1 -0
  38. package/dist/core/checkpoint.js +83 -0
  39. package/dist/core/checkpoint.js.map +1 -0
  40. package/dist/core/extensions.d.ts +55 -0
  41. package/dist/core/extensions.d.ts.map +1 -0
  42. package/dist/core/extensions.js +113 -0
  43. package/dist/core/extensions.js.map +1 -0
  44. package/dist/core/git.d.ts +68 -0
  45. package/dist/core/git.d.ts.map +1 -0
  46. package/dist/core/git.js +148 -0
  47. package/dist/core/git.js.map +1 -0
  48. package/dist/core/hooks.d.ts +37 -0
  49. package/dist/core/hooks.d.ts.map +1 -0
  50. package/dist/core/hooks.js +77 -0
  51. package/dist/core/hooks.js.map +1 -0
  52. package/dist/core/i18n.d.ts +90 -0
  53. package/dist/core/i18n.d.ts.map +1 -0
  54. package/dist/core/i18n.js +253 -0
  55. package/dist/core/i18n.js.map +1 -0
  56. package/dist/core/lsp.d.ts +74 -0
  57. package/dist/core/lsp.d.ts.map +1 -0
  58. package/dist/core/lsp.js +239 -0
  59. package/dist/core/lsp.js.map +1 -0
  60. package/dist/core/mcp.d.ts +49 -0
  61. package/dist/core/mcp.d.ts.map +1 -0
  62. package/dist/core/mcp.js +195 -0
  63. package/dist/core/mcp.js.map +1 -0
  64. package/dist/core/memory.d.ts +38 -0
  65. package/dist/core/memory.d.ts.map +1 -0
  66. package/dist/core/memory.js +231 -0
  67. package/dist/core/memory.js.map +1 -0
  68. package/dist/core/metrics.d.ts +36 -0
  69. package/dist/core/metrics.d.ts.map +1 -0
  70. package/dist/core/metrics.js +111 -0
  71. package/dist/core/metrics.js.map +1 -0
  72. package/dist/core/review.d.ts +27 -0
  73. package/dist/core/review.d.ts.map +1 -0
  74. package/dist/core/review.js +201 -0
  75. package/dist/core/review.js.map +1 -0
  76. package/dist/core/sandbox.d.ts +52 -0
  77. package/dist/core/sandbox.d.ts.map +1 -0
  78. package/dist/core/sandbox.js +140 -0
  79. package/dist/core/sandbox.js.map +1 -0
  80. package/dist/core/scheduler.d.ts +56 -0
  81. package/dist/core/scheduler.d.ts.map +1 -0
  82. package/dist/core/scheduler.js +167 -0
  83. package/dist/core/scheduler.js.map +1 -0
  84. package/dist/core/session.d.ts +49 -0
  85. package/dist/core/session.d.ts.map +1 -0
  86. package/dist/core/session.js +127 -0
  87. package/dist/core/session.js.map +1 -0
  88. package/dist/core/skills.d.ts +36 -0
  89. package/dist/core/skills.d.ts.map +1 -0
  90. package/dist/core/skills.js +90 -0
  91. package/dist/core/skills.js.map +1 -0
  92. package/dist/core/subagent.d.ts +45 -0
  93. package/dist/core/subagent.d.ts.map +1 -0
  94. package/dist/core/subagent.js +130 -0
  95. package/dist/core/subagent.js.map +1 -0
  96. package/dist/core/themes.d.ts +35 -0
  97. package/dist/core/themes.d.ts.map +1 -0
  98. package/dist/core/themes.js +188 -0
  99. package/dist/core/themes.js.map +1 -0
  100. package/dist/tools/bash.d.ts +3 -0
  101. package/dist/tools/bash.d.ts.map +1 -0
  102. package/dist/tools/bash.js +92 -0
  103. package/dist/tools/bash.js.map +1 -0
  104. package/dist/tools/chrome-manager.d.ts +35 -0
  105. package/dist/tools/chrome-manager.d.ts.map +1 -0
  106. package/dist/tools/chrome-manager.js +163 -0
  107. package/dist/tools/chrome-manager.js.map +1 -0
  108. package/dist/tools/chrome.d.ts +78 -0
  109. package/dist/tools/chrome.d.ts.map +1 -0
  110. package/dist/tools/chrome.js +1058 -0
  111. package/dist/tools/chrome.js.map +1 -0
  112. package/dist/tools/edit.d.ts +3 -0
  113. package/dist/tools/edit.d.ts.map +1 -0
  114. package/dist/tools/edit.js +81 -0
  115. package/dist/tools/edit.js.map +1 -0
  116. package/dist/tools/glob.d.ts +3 -0
  117. package/dist/tools/glob.d.ts.map +1 -0
  118. package/dist/tools/glob.js +41 -0
  119. package/dist/tools/glob.js.map +1 -0
  120. package/dist/tools/grep.d.ts +3 -0
  121. package/dist/tools/grep.d.ts.map +1 -0
  122. package/dist/tools/grep.js +74 -0
  123. package/dist/tools/grep.js.map +1 -0
  124. package/dist/tools/path-safety.d.ts +3 -0
  125. package/dist/tools/path-safety.d.ts.map +1 -0
  126. package/dist/tools/path-safety.js +19 -0
  127. package/dist/tools/path-safety.js.map +1 -0
  128. package/dist/tools/read.d.ts +3 -0
  129. package/dist/tools/read.d.ts.map +1 -0
  130. package/dist/tools/read.js +58 -0
  131. package/dist/tools/read.js.map +1 -0
  132. package/dist/tools/registry.d.ts +4 -0
  133. package/dist/tools/registry.d.ts.map +1 -0
  134. package/dist/tools/registry.js +43 -0
  135. package/dist/tools/registry.js.map +1 -0
  136. package/dist/tools/types.d.ts +47 -0
  137. package/dist/tools/types.d.ts.map +1 -0
  138. package/dist/tools/types.js +90 -0
  139. package/dist/tools/types.js.map +1 -0
  140. package/dist/tools/write.d.ts +3 -0
  141. package/dist/tools/write.d.ts.map +1 -0
  142. package/dist/tools/write.js +51 -0
  143. package/dist/tools/write.js.map +1 -0
  144. package/dist/ui/activity-cards.d.ts +50 -0
  145. package/dist/ui/activity-cards.d.ts.map +1 -0
  146. package/dist/ui/activity-cards.js +185 -0
  147. package/dist/ui/activity-cards.js.map +1 -0
  148. package/dist/ui/app.d.ts +9 -0
  149. package/dist/ui/app.d.ts.map +1 -0
  150. package/dist/ui/app.js +852 -0
  151. package/dist/ui/app.js.map +1 -0
  152. package/dist/ui/chat-view.d.ts +10 -0
  153. package/dist/ui/chat-view.d.ts.map +1 -0
  154. package/dist/ui/chat-view.js +94 -0
  155. package/dist/ui/chat-view.js.map +1 -0
  156. package/dist/ui/error-boundary.d.ts +13 -0
  157. package/dist/ui/error-boundary.d.ts.map +1 -0
  158. package/dist/ui/error-boundary.js +16 -0
  159. package/dist/ui/error-boundary.js.map +1 -0
  160. package/dist/ui/fade-in.d.ts +8 -0
  161. package/dist/ui/fade-in.d.ts.map +1 -0
  162. package/dist/ui/fade-in.js +14 -0
  163. package/dist/ui/fade-in.js.map +1 -0
  164. package/dist/ui/input-bar.d.ts +16 -0
  165. package/dist/ui/input-bar.d.ts.map +1 -0
  166. package/dist/ui/input-bar.js +269 -0
  167. package/dist/ui/input-bar.js.map +1 -0
  168. package/dist/ui/markdown-view.d.ts +9 -0
  169. package/dist/ui/markdown-view.d.ts.map +1 -0
  170. package/dist/ui/markdown-view.js +240 -0
  171. package/dist/ui/markdown-view.js.map +1 -0
  172. package/dist/ui/matrix-rain.d.ts +2 -0
  173. package/dist/ui/matrix-rain.d.ts.map +1 -0
  174. package/dist/ui/matrix-rain.js +134 -0
  175. package/dist/ui/matrix-rain.js.map +1 -0
  176. package/dist/ui/reasoning-view.d.ts +12 -0
  177. package/dist/ui/reasoning-view.d.ts.map +1 -0
  178. package/dist/ui/reasoning-view.js +34 -0
  179. package/dist/ui/reasoning-view.js.map +1 -0
  180. package/dist/ui/results-panel.d.ts +11 -0
  181. package/dist/ui/results-panel.d.ts.map +1 -0
  182. package/dist/ui/results-panel.js +17 -0
  183. package/dist/ui/results-panel.js.map +1 -0
  184. package/dist/ui/setup-wizard.d.ts +30 -0
  185. package/dist/ui/setup-wizard.d.ts.map +1 -0
  186. package/dist/ui/setup-wizard.js +166 -0
  187. package/dist/ui/setup-wizard.js.map +1 -0
  188. package/dist/ui/status-bar.d.ts +14 -0
  189. package/dist/ui/status-bar.d.ts.map +1 -0
  190. package/dist/ui/status-bar.js +63 -0
  191. package/dist/ui/status-bar.js.map +1 -0
  192. package/dist/ui/tool-activity-card.d.ts +9 -0
  193. package/dist/ui/tool-activity-card.d.ts.map +1 -0
  194. package/dist/ui/tool-activity-card.js +172 -0
  195. package/dist/ui/tool-activity-card.js.map +1 -0
  196. package/dist/ui/tool-call-view.d.ts +9 -0
  197. package/dist/ui/tool-call-view.d.ts.map +1 -0
  198. package/dist/ui/tool-call-view.js +149 -0
  199. package/dist/ui/tool-call-view.js.map +1 -0
  200. package/dist/utils/clipboard.d.ts +6 -0
  201. package/dist/utils/clipboard.d.ts.map +1 -0
  202. package/dist/utils/clipboard.js +56 -0
  203. package/dist/utils/clipboard.js.map +1 -0
  204. package/dist/utils/ignore.d.ts +6 -0
  205. package/dist/utils/ignore.d.ts.map +1 -0
  206. package/dist/utils/ignore.js +40 -0
  207. package/dist/utils/ignore.js.map +1 -0
  208. package/dist/utils/logger.d.ts +4 -0
  209. package/dist/utils/logger.d.ts.map +1 -0
  210. package/dist/utils/logger.js +13 -0
  211. package/dist/utils/logger.js.map +1 -0
  212. package/dist/utils/string-width.d.ts +6 -0
  213. package/dist/utils/string-width.d.ts.map +1 -0
  214. package/dist/utils/string-width.js +37 -0
  215. package/dist/utils/string-width.js.map +1 -0
  216. package/package.json +68 -0
@@ -0,0 +1,195 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { existsSync } from 'node:fs';
4
+ import { homedir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { EventEmitter } from 'node:events';
7
+ export class MCPServer extends EventEmitter {
8
+ config;
9
+ process = null;
10
+ messageId = 0;
11
+ pending = new Map();
12
+ buffer = '';
13
+ _tools = [];
14
+ connected = false;
15
+ constructor(config) {
16
+ super();
17
+ this.config = config;
18
+ }
19
+ get tools() {
20
+ return this._tools;
21
+ }
22
+ get isConnected() {
23
+ return this.connected;
24
+ }
25
+ async connect() {
26
+ if (this.connected)
27
+ return;
28
+ return new Promise((resolve, reject) => {
29
+ const env = { ...process.env, ...this.config.env };
30
+ this.process = spawn(this.config.command, this.config.args ?? [], {
31
+ env,
32
+ stdio: ['pipe', 'pipe', 'pipe'],
33
+ windowsHide: true,
34
+ });
35
+ const timeout = setTimeout(() => {
36
+ reject(new Error(`MCP server "${this.config.name}" connection timeout`));
37
+ }, 10000);
38
+ this.process.stdout.on('data', (data) => {
39
+ this.buffer += data.toString();
40
+ this.processBuffer();
41
+ });
42
+ this.process.stderr.on('data', (data) => {
43
+ this.emit('stderr', data.toString());
44
+ });
45
+ this.process.on('error', (err) => {
46
+ clearTimeout(timeout);
47
+ reject(err);
48
+ });
49
+ this.process.on('exit', (code) => {
50
+ this.connected = false;
51
+ this.emit('exit', code);
52
+ });
53
+ // Initialize by listing tools
54
+ this.sendRequest('tools/list', {}).then((result) => {
55
+ clearTimeout(timeout);
56
+ const tools = result.tools ?? [];
57
+ this._tools = this.filterTools(tools);
58
+ this.connected = true;
59
+ resolve();
60
+ }).catch((err) => {
61
+ clearTimeout(timeout);
62
+ reject(err);
63
+ });
64
+ });
65
+ }
66
+ async callTool(name, args) {
67
+ if (!this.connected) {
68
+ throw new Error(`MCP server "${this.config.name}" is not connected`);
69
+ }
70
+ return this.sendRequest('tools/call', { name, arguments: args });
71
+ }
72
+ async disconnect() {
73
+ if (this.process) {
74
+ this.process.kill();
75
+ this.process = null;
76
+ }
77
+ this.connected = false;
78
+ }
79
+ filterTools(tools) {
80
+ let filtered = tools;
81
+ if (this.config.includeTools && this.config.includeTools.length > 0) {
82
+ filtered = filtered.filter(t => this.config.includeTools.includes(t.name));
83
+ }
84
+ if (this.config.excludeTools && this.config.excludeTools.length > 0) {
85
+ filtered = filtered.filter(t => !this.config.excludeTools.includes(t.name));
86
+ }
87
+ return filtered.map(t => ({ ...t, serverName: this.config.name }));
88
+ }
89
+ sendRequest(method, params) {
90
+ return new Promise((resolve, reject) => {
91
+ const id = ++this.messageId;
92
+ const msg = {
93
+ jsonrpc: '2.0',
94
+ id,
95
+ method,
96
+ params,
97
+ };
98
+ this.pending.set(id, { resolve, reject });
99
+ this.process.stdin.write(JSON.stringify(msg) + '\n');
100
+ });
101
+ }
102
+ processBuffer() {
103
+ const lines = this.buffer.split('\n');
104
+ this.buffer = lines.pop() ?? '';
105
+ for (const line of lines) {
106
+ if (!line.trim())
107
+ continue;
108
+ try {
109
+ const msg = JSON.parse(line);
110
+ if (msg.id && this.pending.has(msg.id)) {
111
+ const { resolve, reject } = this.pending.get(msg.id);
112
+ this.pending.delete(msg.id);
113
+ if (msg.error) {
114
+ reject(new Error(msg.error.message));
115
+ }
116
+ else {
117
+ resolve(msg.result);
118
+ }
119
+ }
120
+ else if (msg.method) {
121
+ // Server-initiated notification
122
+ this.emit('notification', msg);
123
+ }
124
+ }
125
+ catch {
126
+ // Ignore malformed JSON
127
+ }
128
+ }
129
+ }
130
+ }
131
+ export class MCPManager {
132
+ servers = new Map();
133
+ async addServer(config) {
134
+ const existing = this.servers.get(config.name);
135
+ if (existing) {
136
+ await existing.disconnect();
137
+ }
138
+ const server = new MCPServer(config);
139
+ this.servers.set(config.name, server);
140
+ return server;
141
+ }
142
+ async removeServer(name) {
143
+ const server = this.servers.get(name);
144
+ if (server) {
145
+ await server.disconnect();
146
+ this.servers.delete(name);
147
+ }
148
+ }
149
+ getServer(name) {
150
+ return this.servers.get(name);
151
+ }
152
+ getAllTools() {
153
+ const tools = [];
154
+ for (const server of this.servers.values()) {
155
+ tools.push(...server.tools);
156
+ }
157
+ return tools;
158
+ }
159
+ async connectAll() {
160
+ const promises = [];
161
+ for (const server of this.servers.values()) {
162
+ promises.push(server.connect().catch(() => {
163
+ // Silently ignore MCP connection errors — they are non-fatal
164
+ }));
165
+ }
166
+ await Promise.all(promises);
167
+ }
168
+ async disconnectAll() {
169
+ const promises = [];
170
+ for (const [name, server] of this.servers) {
171
+ promises.push(server.disconnect());
172
+ this.servers.delete(name);
173
+ }
174
+ await Promise.all(promises);
175
+ }
176
+ async loadConfig(configPath) {
177
+ const paths = [
178
+ configPath,
179
+ join(process.cwd(), '.deepseek-code', 'mcp.json'),
180
+ join(homedir(), '.deepseek-code', 'mcp.json'),
181
+ ].filter(Boolean);
182
+ for (const p of paths) {
183
+ if (existsSync(p)) {
184
+ const content = await readFile(p, 'utf-8');
185
+ const configs = JSON.parse(content);
186
+ for (const cfg of configs) {
187
+ await this.addServer(cfg);
188
+ }
189
+ }
190
+ }
191
+ }
192
+ }
193
+ // Singleton
194
+ export const mcpManager = new MCPManager();
195
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/core/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { DeepSeekConfig } from '../config/defaults.js';
2
+ export interface MemoryEntry {
3
+ name: string;
4
+ description: string;
5
+ type: 'user' | 'feedback' | 'project' | 'reference';
6
+ content: string;
7
+ createdAt: string;
8
+ updatedAt: string;
9
+ }
10
+ export interface MemoryIndexEntry {
11
+ name: string;
12
+ file: string;
13
+ description: string;
14
+ }
15
+ export declare function ensureMemoryDir(): Promise<void>;
16
+ export declare function saveMemory(entry: Omit<MemoryEntry, 'createdAt' | 'updatedAt'>): Promise<void>;
17
+ export declare function listMemories(): Promise<MemoryIndexEntry[]>;
18
+ export declare function readMemory(name: string): Promise<MemoryEntry | null>;
19
+ export declare function deleteMemory(name: string): Promise<boolean>;
20
+ export declare function searchMemories(query: string): Promise<MemoryIndexEntry[]>;
21
+ /**
22
+ * Initialize the embeddings API client.
23
+ */
24
+ export declare function initEmbeddings(config: DeepSeekConfig): void;
25
+ /**
26
+ * Compute cosine similarity between two vectors.
27
+ */
28
+ declare function cosineSimilarity(a: number[], b: number[]): number;
29
+ /**
30
+ * Search memories using semantic similarity (embeddings).
31
+ * Falls back to substring search if embeddings are not available.
32
+ * Returns up to `topK` results sorted by relevance.
33
+ */
34
+ export declare function semanticSearchMemories(query: string, topK?: number): Promise<Array<MemoryIndexEntry & {
35
+ score: number;
36
+ }>>;
37
+ export { cosineSimilarity };
38
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/core/memory.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAE3D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAcD,wBAAsB,eAAe,IAAK,OAAO,CAAC,IAAI,CAAC,CAKtD;AAED,wBAAsB,UAAU,CAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCpG;AAED,wBAAsB,YAAY,IAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA2BjE;AAED,wBAAsB,UAAU,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAS3E;AAED,wBAAsB,YAAY,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAWlE;AAED,wBAAsB,cAAc,CAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAShF;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAE5D;AAED;;GAEG;AACH,iBAAS,gBAAgB,CAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAU3D;AAYD;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAU,GACf,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAuCtD;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAA"}
@@ -0,0 +1,231 @@
1
+ import { readFile, writeFile, mkdir, readdir, unlink } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { join, basename, extname } from 'node:path';
5
+ import { DeepSeekAPI } from '../api/index.js';
6
+ function sanitizeFileName(name) {
7
+ return name.toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_|_$/g, '') + '.md';
8
+ }
9
+ function getMemoryDir() {
10
+ return join(homedir(), '.deepseek-code', 'memory');
11
+ }
12
+ function getIndexFile() {
13
+ return join(getMemoryDir(), 'MEMORY.md');
14
+ }
15
+ export async function ensureMemoryDir() {
16
+ const memoryDir = getMemoryDir();
17
+ if (!existsSync(memoryDir)) {
18
+ await mkdir(memoryDir, { recursive: true });
19
+ }
20
+ }
21
+ export async function saveMemory(entry) {
22
+ await ensureMemoryDir();
23
+ const now = new Date().toISOString();
24
+ const fileName = sanitizeFileName(entry.name);
25
+ const filePath = join(getMemoryDir(), fileName);
26
+ const fullEntry = {
27
+ ...entry,
28
+ createdAt: now,
29
+ updatedAt: now,
30
+ };
31
+ // Check if file exists to preserve createdAt
32
+ if (existsSync(filePath)) {
33
+ const existing = await readMemoryFile(filePath);
34
+ if (existing) {
35
+ fullEntry.createdAt = existing.createdAt;
36
+ }
37
+ }
38
+ const content = `---
39
+ name: ${entry.name}
40
+ description: ${entry.description}
41
+ type: ${entry.type}
42
+ ---
43
+
44
+ ${entry.content}
45
+ `;
46
+ await writeFile(filePath, content, 'utf-8');
47
+ await updateIndex(entry.name, fileName, entry.description);
48
+ }
49
+ export async function listMemories() {
50
+ await ensureMemoryDir();
51
+ const indexFile = getIndexFile();
52
+ if (!existsSync(indexFile)) {
53
+ return [];
54
+ }
55
+ try {
56
+ const content = await readFile(indexFile, 'utf-8');
57
+ const entries = [];
58
+ for (const line of content.split('\n').filter(Boolean)) {
59
+ const match = line.match(/- \[(.+?)\]\((.+?)\) — (.+)/);
60
+ if (match) {
61
+ entries.push({
62
+ name: match[1],
63
+ file: match[2],
64
+ description: match[3],
65
+ });
66
+ }
67
+ }
68
+ return entries;
69
+ }
70
+ catch {
71
+ return [];
72
+ }
73
+ }
74
+ export async function readMemory(name) {
75
+ const fileName = sanitizeFileName(name);
76
+ const filePath = join(getMemoryDir(), fileName);
77
+ if (!existsSync(filePath)) {
78
+ return null;
79
+ }
80
+ return readMemoryFile(filePath);
81
+ }
82
+ export async function deleteMemory(name) {
83
+ const fileName = sanitizeFileName(name);
84
+ const filePath = join(getMemoryDir(), fileName);
85
+ if (!existsSync(filePath)) {
86
+ return false;
87
+ }
88
+ await unlink(filePath);
89
+ await rebuildIndex();
90
+ return true;
91
+ }
92
+ export async function searchMemories(query) {
93
+ const all = await listMemories();
94
+ const lowerQuery = query.toLowerCase();
95
+ return all.filter(entry => entry.name.toLowerCase().includes(lowerQuery) ||
96
+ entry.description.toLowerCase().includes(lowerQuery));
97
+ }
98
+ // ─── Semantic Search via Embeddings ──────────────────────────────────────────
99
+ let embedApi = null;
100
+ /**
101
+ * Initialize the embeddings API client.
102
+ */
103
+ export function initEmbeddings(config) {
104
+ embedApi = new DeepSeekAPI(config);
105
+ }
106
+ /**
107
+ * Compute cosine similarity between two vectors.
108
+ */
109
+ function cosineSimilarity(a, b) {
110
+ if (a.length !== b.length)
111
+ return 0;
112
+ let dot = 0;
113
+ let magA = 0;
114
+ let magB = 0;
115
+ for (let i = 0; i < a.length; i++) {
116
+ dot += a[i] * b[i];
117
+ magA += a[i] * a[i];
118
+ magB += b[i] * b[i];
119
+ }
120
+ const denom = Math.sqrt(magA) * Math.sqrt(magB);
121
+ return denom === 0 ? 0 : dot / denom;
122
+ }
123
+ /**
124
+ * Get embedding vector for a text string via DeepSeek API.
125
+ */
126
+ async function getEmbedding(text) {
127
+ if (!embedApi) {
128
+ throw new Error('Embeddings API not initialized. Call initEmbeddings(config) first.');
129
+ }
130
+ return embedApi.getEmbedding(text);
131
+ }
132
+ /**
133
+ * Search memories using semantic similarity (embeddings).
134
+ * Falls back to substring search if embeddings are not available.
135
+ * Returns up to `topK` results sorted by relevance.
136
+ */
137
+ export async function semanticSearchMemories(query, topK = 5) {
138
+ if (!embedApi) {
139
+ // Fallback to substring search
140
+ const results = await searchMemories(query);
141
+ return results.slice(0, topK).map(r => ({ ...r, score: 1 }));
142
+ }
143
+ try {
144
+ const [queryEmbedding, allEntries] = await Promise.all([
145
+ getEmbedding(query),
146
+ listMemories(),
147
+ ]);
148
+ // Get embeddings for all memory entries
149
+ const entryEmbeddings = await Promise.all(allEntries.map(async (entry) => {
150
+ const fullEntry = await readMemory(entry.name);
151
+ const text = fullEntry ? `${fullEntry.description}\n${fullEntry.content}` : entry.description;
152
+ try {
153
+ const embedding = await getEmbedding(text.slice(0, 2000)); // Limit to 2000 chars
154
+ return { entry, embedding, score: cosineSimilarity(queryEmbedding, embedding) };
155
+ }
156
+ catch {
157
+ return { entry, embedding: [], score: 0 };
158
+ }
159
+ }));
160
+ // Sort by similarity score descending
161
+ entryEmbeddings.sort((a, b) => b.score - a.score);
162
+ return entryEmbeddings.slice(0, topK).map(e => ({
163
+ ...e.entry,
164
+ score: e.score,
165
+ }));
166
+ }
167
+ catch {
168
+ // Fallback to substring search on error
169
+ const results = await searchMemories(query);
170
+ return results.slice(0, topK).map(r => ({ ...r, score: 1 }));
171
+ }
172
+ }
173
+ export { cosineSimilarity };
174
+ async function readMemoryFile(filePath) {
175
+ try {
176
+ const content = await readFile(filePath, 'utf-8');
177
+ // Parse frontmatter
178
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
179
+ if (!frontmatterMatch)
180
+ return null;
181
+ const frontmatter = {};
182
+ for (const line of frontmatterMatch[1].split('\n')) {
183
+ const [key, ...rest] = line.split(':');
184
+ if (key && rest.length > 0) {
185
+ frontmatter[key.trim()] = rest.join(':').trim();
186
+ }
187
+ }
188
+ return {
189
+ name: frontmatter.name ?? basename(filePath, extname(filePath)),
190
+ description: frontmatter.description ?? '',
191
+ type: frontmatter.type ?? 'reference',
192
+ content: frontmatterMatch[2].trim(),
193
+ createdAt: frontmatter.createdAt ?? '',
194
+ updatedAt: frontmatter.updatedAt ?? '',
195
+ };
196
+ }
197
+ catch {
198
+ return null;
199
+ }
200
+ }
201
+ async function updateIndex(name, fileName, description) {
202
+ await ensureMemoryDir();
203
+ let lines = [];
204
+ const indexFile = getIndexFile();
205
+ if (existsSync(indexFile)) {
206
+ const content = await readFile(indexFile, 'utf-8');
207
+ lines = content.split('\n').filter(Boolean);
208
+ // Remove existing entry with same name
209
+ lines = lines.filter(line => !line.includes(`[${name}]`));
210
+ }
211
+ lines.push(`- [${name}](${fileName}) — ${description}`);
212
+ // Sort alphabetically
213
+ lines.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
214
+ await writeFile(indexFile, lines.join('\n') + '\n', 'utf-8');
215
+ }
216
+ async function rebuildIndex() {
217
+ await ensureMemoryDir();
218
+ const memoryDir = getMemoryDir();
219
+ const files = await readdir(memoryDir);
220
+ const mdFiles = files.filter(f => f.endsWith('.md') && f !== 'MEMORY.md');
221
+ const entries = [];
222
+ for (const file of mdFiles) {
223
+ const entry = await readMemoryFile(join(memoryDir, file));
224
+ if (entry) {
225
+ entries.push(`- [${entry.name}](${file}) — ${entry.description}`);
226
+ }
227
+ }
228
+ entries.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
229
+ await writeFile(getIndexFile(), entries.join('\n') + '\n', 'utf-8');
230
+ }
231
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/core/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export interface TokenUsage {
2
+ input: number;
3
+ output: number;
4
+ total: number;
5
+ }
6
+ export declare class MetricsCollector {
7
+ private startTime;
8
+ private _toolCalls;
9
+ private _inputTokens;
10
+ private _outputTokens;
11
+ private _lastInputTokens;
12
+ private toolTimings;
13
+ private toolCallLog;
14
+ get toolCalls(): number;
15
+ get inputTokens(): number;
16
+ get outputTokens(): number;
17
+ get totalTokens(): number;
18
+ get elapsedMs(): number;
19
+ recordToolCallStart(toolName: string): void;
20
+ recordToolCallEnd(toolName: string, success?: boolean): void;
21
+ recordTokens(input: number, output: number): void;
22
+ /**
23
+ * Get current context window usage as % of max context.
24
+ * Uses last API request's prompt_tokens — the actual size of the current window.
25
+ */
26
+ getCurrentWindowPercent(maxContext?: number): number;
27
+ estimatedCostUSD(model?: string): number;
28
+ getTokenUsage(): TokenUsage;
29
+ /**
30
+ * Get context usage percentage based on model's max context (default 128k for deepseek-chat)
31
+ */
32
+ getContextUsagePercent(maxContext?: number): number;
33
+ getSummary(model?: string): string;
34
+ reset(): void;
35
+ }
36
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/core/metrics.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,YAAY,CAAY;IAChC,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,WAAW,CAA+D;IAClF,OAAO,CAAC,WAAW,CAAkE;IAErF,IAAI,SAAS,IAAK,MAAM,CAEvB;IAED,IAAI,WAAW,IAAK,MAAM,CAEzB;IAED,IAAI,YAAY,IAAK,MAAM,CAE1B;IAED,IAAI,WAAW,IAAK,MAAM,CAEzB;IAED,IAAI,SAAS,IAAK,MAAM,CAEvB;IAED,mBAAmB,CAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI5C,iBAAiB,CAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,GAAG,IAAI;IAUnE,YAAY,CAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAMlD;;;OAGG;IACH,uBAAuB,CAAE,UAAU,GAAE,MAAgB,GAAG,MAAM;IAK9D,gBAAgB,CAAE,KAAK,GAAE,MAAwB,GAAG,MAAM;IAM1D,aAAa,IAAK,UAAU;IAQ5B;;OAEG;IACH,sBAAsB,CAAE,UAAU,GAAE,MAAgB,GAAG,MAAM;IAK7D,UAAU,CAAE,KAAK,GAAE,MAAwB,GAAG,MAAM;IA8BpD,KAAK,IAAK,IAAI;CASf"}
@@ -0,0 +1,111 @@
1
+ import { MODEL_PRICING } from '../config/defaults.js';
2
+ export class MetricsCollector {
3
+ startTime = Date.now();
4
+ _toolCalls = 0;
5
+ _inputTokens = 0;
6
+ _outputTokens = 0;
7
+ _lastInputTokens = 0;
8
+ toolTimings = new Map();
9
+ toolCallLog = [];
10
+ get toolCalls() {
11
+ return this._toolCalls;
12
+ }
13
+ get inputTokens() {
14
+ return this._inputTokens;
15
+ }
16
+ get outputTokens() {
17
+ return this._outputTokens;
18
+ }
19
+ get totalTokens() {
20
+ return this._inputTokens + this._outputTokens;
21
+ }
22
+ get elapsedMs() {
23
+ return Date.now() - this.startTime;
24
+ }
25
+ recordToolCallStart(toolName) {
26
+ this.toolTimings.set(toolName, { start: Date.now() });
27
+ }
28
+ recordToolCallEnd(toolName, success = true) {
29
+ const entry = this.toolTimings.get(toolName);
30
+ if (entry) {
31
+ const duration = Date.now() - entry.start;
32
+ entry.duration = duration;
33
+ this._toolCalls++;
34
+ this.toolCallLog.push({ tool: toolName, duration, success });
35
+ }
36
+ }
37
+ recordTokens(input, output) {
38
+ this._inputTokens += input;
39
+ this._outputTokens += output;
40
+ if (input > 0)
41
+ this._lastInputTokens = input;
42
+ }
43
+ /**
44
+ * Get current context window usage as % of max context.
45
+ * Uses last API request's prompt_tokens — the actual size of the current window.
46
+ */
47
+ getCurrentWindowPercent(maxContext = 128_000) {
48
+ if (maxContext <= 0 || this._lastInputTokens === 0)
49
+ return 0;
50
+ return Math.min(100, Math.round((this._lastInputTokens / maxContext) * 100));
51
+ }
52
+ estimatedCostUSD(model = 'deepseek-chat') {
53
+ const pricing = MODEL_PRICING[model] ?? MODEL_PRICING['deepseek-chat'];
54
+ return (this._inputTokens / 1_000_000) * pricing.inputPer1M +
55
+ (this._outputTokens / 1_000_000) * pricing.outputPer1M;
56
+ }
57
+ getTokenUsage() {
58
+ return {
59
+ input: this._inputTokens,
60
+ output: this._outputTokens,
61
+ total: this.totalTokens,
62
+ };
63
+ }
64
+ /**
65
+ * Get context usage percentage based on model's max context (default 128k for deepseek-chat)
66
+ */
67
+ getContextUsagePercent(maxContext = 128_000) {
68
+ if (maxContext <= 0)
69
+ return 0;
70
+ return Math.min(100, Math.round((this.totalTokens / maxContext) * 100));
71
+ }
72
+ getSummary(model = 'deepseek-chat') {
73
+ const elapsed = Math.round(this.elapsedMs / 1000);
74
+ const mins = Math.floor(elapsed / 60);
75
+ const secs = elapsed % 60;
76
+ const cost = this.estimatedCostUSD(model);
77
+ const costStr = cost > 0 ? ` · $${cost.toFixed(4)}` : '';
78
+ let summary = '\n\n━━━ Execution Summary ━━━\n';
79
+ summary += `Tool uses: ${this._toolCalls} · Tokens: ${this.totalTokens.toLocaleString()} (in: ${this._inputTokens.toLocaleString()}, out: ${this._outputTokens.toLocaleString()})${costStr} · Time: ${mins}m ${secs}s\n`;
80
+ // Add compact tool breakdown if there were calls
81
+ if (this.toolCallLog.length > 0) {
82
+ // Group by tool name for compact display
83
+ const groups = new Map();
84
+ for (const call of this.toolCallLog) {
85
+ const g = groups.get(call.tool) ?? { count: 0, totalDuration: 0, success: 0, fail: 0 };
86
+ g.count++;
87
+ g.totalDuration += call.duration;
88
+ if (call.success) {
89
+ g.success++;
90
+ }
91
+ else {
92
+ g.fail++;
93
+ }
94
+ groups.set(call.tool, g);
95
+ }
96
+ summary += `Tools: ${Array.from(groups.entries()).map(([name, g]) => `${name} ×${g.count}${g.fail > 0 ? ` (${g.success}✓ ${g.fail}✗)` : ''}`).join(', ')}\n`;
97
+ }
98
+ summary += '━━━━━━━━━━━━━━━━━━━━━━━━━━\n';
99
+ return summary;
100
+ }
101
+ reset() {
102
+ this.startTime = Date.now();
103
+ this._toolCalls = 0;
104
+ this._inputTokens = 0;
105
+ this._outputTokens = 0;
106
+ this._lastInputTokens = 0;
107
+ this.toolTimings.clear();
108
+ this.toolCallLog = [];
109
+ }
110
+ }
111
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/core/metrics.ts"],"names":[],"mappings":"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"}