@kavienw/deepseek-cli 0.1.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 (64) hide show
  1. package/README.md +470 -0
  2. package/dist/agent.js +864 -0
  3. package/dist/agent.js.map +1 -0
  4. package/dist/attachments.js +54 -0
  5. package/dist/attachments.js.map +1 -0
  6. package/dist/btw.js +52 -0
  7. package/dist/btw.js.map +1 -0
  8. package/dist/client.js +88 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/commands.js +922 -0
  11. package/dist/commands.js.map +1 -0
  12. package/dist/config.js +98 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/hooks.js +90 -0
  15. package/dist/hooks.js.map +1 -0
  16. package/dist/index.js +149 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/mcp.js +408 -0
  19. package/dist/mcp.js.map +1 -0
  20. package/dist/permissions.js +30 -0
  21. package/dist/permissions.js.map +1 -0
  22. package/dist/plugins.js +341 -0
  23. package/dist/plugins.js.map +1 -0
  24. package/dist/project.js +114 -0
  25. package/dist/project.js.map +1 -0
  26. package/dist/session.js +57 -0
  27. package/dist/session.js.map +1 -0
  28. package/dist/skills.js +147 -0
  29. package/dist/skills.js.map +1 -0
  30. package/dist/todo.js +67 -0
  31. package/dist/todo.js.map +1 -0
  32. package/dist/tools/bash.js +61 -0
  33. package/dist/tools/bash.js.map +1 -0
  34. package/dist/tools/diff.js +26 -0
  35. package/dist/tools/diff.js.map +1 -0
  36. package/dist/tools/edit.js +73 -0
  37. package/dist/tools/edit.js.map +1 -0
  38. package/dist/tools/glob.js +47 -0
  39. package/dist/tools/glob.js.map +1 -0
  40. package/dist/tools/grep.js +133 -0
  41. package/dist/tools/grep.js.map +1 -0
  42. package/dist/tools/index.js +60 -0
  43. package/dist/tools/index.js.map +1 -0
  44. package/dist/tools/read.js +62 -0
  45. package/dist/tools/read.js.map +1 -0
  46. package/dist/tools/setThinking.js +46 -0
  47. package/dist/tools/setThinking.js.map +1 -0
  48. package/dist/tools/task.js +40 -0
  49. package/dist/tools/task.js.map +1 -0
  50. package/dist/tools/todo.js +73 -0
  51. package/dist/tools/todo.js.map +1 -0
  52. package/dist/tools/types.js +2 -0
  53. package/dist/tools/types.js.map +1 -0
  54. package/dist/tools/webFetch.js +64 -0
  55. package/dist/tools/webFetch.js.map +1 -0
  56. package/dist/tools/webSearch.js +200 -0
  57. package/dist/tools/webSearch.js.map +1 -0
  58. package/dist/tools/write.js +46 -0
  59. package/dist/tools/write.js.map +1 -0
  60. package/dist/ui/render.js +248 -0
  61. package/dist/ui/render.js.map +1 -0
  62. package/dist/ui/repl.js +429 -0
  63. package/dist/ui/repl.js.map +1 -0
  64. package/package.json +48 -0
package/dist/mcp.js ADDED
@@ -0,0 +1,408 @@
1
+ import { spawn } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { findProjectRoot } from "./project.js";
6
+ const CONFIG_DIR = path.join(os.homedir(), ".deepseek-cli");
7
+ const GLOBAL_MCP_PATH = path.join(CONFIG_DIR, "mcp.json");
8
+ const PROTOCOL_VERSION = "2024-11-05";
9
+ const DEFAULT_TIMEOUT_MS = 30_000;
10
+ let loadedInfos = [];
11
+ let loadedErrors = [];
12
+ const clients = new Map();
13
+ export function globalMcpPath() {
14
+ return GLOBAL_MCP_PATH;
15
+ }
16
+ export function projectMcpPath(cwd) {
17
+ return path.join(findProjectRoot(cwd), ".deepseek", "mcp.json");
18
+ }
19
+ export function claudeMcpPath(cwd) {
20
+ return path.join(findProjectRoot(cwd), ".mcp.json");
21
+ }
22
+ export function mcpStatus() {
23
+ return { infos: [...loadedInfos], errors: [...loadedErrors] };
24
+ }
25
+ export function createMcpTemplate(cwd, scope = "project") {
26
+ const file = scope === "global" ? GLOBAL_MCP_PATH : projectMcpPath(cwd);
27
+ if (fs.existsSync(file))
28
+ return { path: file, created: false };
29
+ fs.mkdirSync(path.dirname(file), { recursive: true });
30
+ const template = {
31
+ servers: {
32
+ // Replace this with a real MCP stdio server.
33
+ example: {
34
+ command: "node",
35
+ args: ["/absolute/path/to/mcp-server.js"],
36
+ disabled: true,
37
+ },
38
+ },
39
+ };
40
+ fs.writeFileSync(file, JSON.stringify(template, null, 2) + "\n", "utf8");
41
+ return { path: file, created: true };
42
+ }
43
+ function readJson(file) {
44
+ try {
45
+ if (!fs.existsSync(file))
46
+ return {};
47
+ const parsed = JSON.parse(fs.readFileSync(file, "utf8"));
48
+ return parsed && typeof parsed === "object" ? parsed : {};
49
+ }
50
+ catch {
51
+ return {};
52
+ }
53
+ }
54
+ function serversFromConfig(config) {
55
+ return { ...(config.mcpServers ?? {}), ...(config.servers ?? {}) };
56
+ }
57
+ function loadConfig(cwd) {
58
+ const root = findProjectRoot(cwd);
59
+ const globalConfig = serversFromConfig(readJson(GLOBAL_MCP_PATH));
60
+ const claudeProjectConfig = serversFromConfig(readJson(path.join(root, ".mcp.json")));
61
+ const projectConfig = serversFromConfig(readJson(projectMcpPath(cwd)));
62
+ return { ...globalConfig, ...claudeProjectConfig, ...projectConfig };
63
+ }
64
+ function sanitizeToolPart(value) {
65
+ return value.replace(/[^a-zA-Z0-9_-]+/g, "_").replace(/^_+|_+$/g, "") || "tool";
66
+ }
67
+ function mcpToolName(serverName, remoteName) {
68
+ return `mcp__${sanitizeToolPart(serverName)}__${sanitizeToolPart(remoteName)}`.slice(0, 64);
69
+ }
70
+ function textFromMcpResult(result) {
71
+ const content = result?.content;
72
+ if (Array.isArray(content)) {
73
+ return content.map((item) => {
74
+ if (!item || typeof item !== "object")
75
+ return String(item);
76
+ const record = item;
77
+ if (typeof record.text === "string")
78
+ return record.text;
79
+ if (typeof record.data === "string")
80
+ return record.data;
81
+ return JSON.stringify(record);
82
+ }).join("\n");
83
+ }
84
+ if (typeof content === "string")
85
+ return content;
86
+ if (result === undefined)
87
+ return "";
88
+ return JSON.stringify(result, null, 2);
89
+ }
90
+ class McpStdioClient {
91
+ serverName;
92
+ config;
93
+ baseCwd;
94
+ child = null;
95
+ nextId = 1;
96
+ buffer = "";
97
+ pending = new Map();
98
+ initialized = false;
99
+ constructor(serverName, config, baseCwd) {
100
+ this.serverName = serverName;
101
+ this.config = config;
102
+ this.baseCwd = baseCwd;
103
+ }
104
+ timeoutMs() {
105
+ return Math.min(Math.max(this.config.timeoutMs ?? DEFAULT_TIMEOUT_MS, 1000), 600_000);
106
+ }
107
+ start() {
108
+ if (this.child)
109
+ return;
110
+ if (!this.config.command)
111
+ throw new Error(`MCP server ${this.serverName} has no command.`);
112
+ const cwd = this.config.cwd ? path.resolve(this.baseCwd, this.config.cwd) : this.baseCwd;
113
+ this.child = spawn(this.config.command, this.config.args ?? [], {
114
+ cwd,
115
+ env: { ...process.env, ...(this.config.env ?? {}) },
116
+ stdio: ["pipe", "pipe", "pipe"],
117
+ });
118
+ this.child.stdout.setEncoding("utf8");
119
+ this.child.stdout.on("data", (chunk) => this.onData(chunk));
120
+ this.child.stderr.setEncoding("utf8");
121
+ this.child.on("exit", () => {
122
+ this.child = null;
123
+ this.initialized = false;
124
+ for (const [, pending] of this.pending) {
125
+ clearTimeout(pending.timer);
126
+ pending.reject(new Error(`MCP server ${this.serverName} exited.`));
127
+ }
128
+ this.pending.clear();
129
+ });
130
+ }
131
+ onData(chunk) {
132
+ this.buffer += chunk;
133
+ while (true) {
134
+ const newline = this.buffer.indexOf("\n");
135
+ if (newline === -1)
136
+ return;
137
+ const raw = this.buffer.slice(0, newline).trim();
138
+ this.buffer = this.buffer.slice(newline + 1);
139
+ if (!raw)
140
+ continue;
141
+ let message;
142
+ try {
143
+ message = JSON.parse(raw);
144
+ }
145
+ catch {
146
+ continue;
147
+ }
148
+ if (message.id === undefined)
149
+ continue;
150
+ const id = Number(message.id);
151
+ const pending = this.pending.get(id);
152
+ if (!pending)
153
+ continue;
154
+ this.pending.delete(id);
155
+ clearTimeout(pending.timer);
156
+ if (message.error) {
157
+ pending.reject(new Error(message.error.message ?? `MCP error ${message.error.code ?? "unknown"}`));
158
+ }
159
+ else {
160
+ pending.resolve(message.result);
161
+ }
162
+ }
163
+ }
164
+ request(method, params) {
165
+ this.start();
166
+ const child = this.child;
167
+ if (!child)
168
+ return Promise.reject(new Error(`Could not start MCP server ${this.serverName}.`));
169
+ const id = this.nextId++;
170
+ const payload = JSON.stringify({ jsonrpc: "2.0", id, method, params }) + "\n";
171
+ return new Promise((resolve, reject) => {
172
+ const timer = setTimeout(() => {
173
+ this.pending.delete(id);
174
+ reject(new Error(`MCP request timed out: ${this.serverName}.${method}`));
175
+ }, this.timeoutMs());
176
+ this.pending.set(id, { resolve, reject, timer });
177
+ child.stdin.write(payload, "utf8");
178
+ });
179
+ }
180
+ notify(method, params) {
181
+ this.start();
182
+ this.child?.stdin.write(JSON.stringify({ jsonrpc: "2.0", method, params }) + "\n", "utf8");
183
+ }
184
+ async initialize() {
185
+ if (this.initialized)
186
+ return;
187
+ await this.request("initialize", {
188
+ protocolVersion: PROTOCOL_VERSION,
189
+ capabilities: {},
190
+ clientInfo: { name: "deepseek-cli", version: "0.1.0" },
191
+ });
192
+ this.notify("notifications/initialized");
193
+ this.initialized = true;
194
+ }
195
+ async listTools() {
196
+ await this.initialize();
197
+ const result = await this.request("tools/list", {});
198
+ const tools = result?.tools;
199
+ return Array.isArray(tools) ? tools.filter((tool) => {
200
+ return !!tool && typeof tool.name === "string";
201
+ }) : [];
202
+ }
203
+ async callTool(name, args) {
204
+ await this.initialize();
205
+ const result = await this.request("tools/call", { name, arguments: args });
206
+ return textFromMcpResult(result);
207
+ }
208
+ shutdown() {
209
+ this.child?.kill();
210
+ this.child = null;
211
+ }
212
+ }
213
+ /** Parse one or more SSE `data:` blocks and return the JSON-RPC message for `id`. */
214
+ function parseSseJson(text, id) {
215
+ const candidates = [];
216
+ for (const block of text.split(/\r?\n\r?\n/)) {
217
+ const data = block
218
+ .split(/\r?\n/)
219
+ .filter((line) => line.startsWith("data:"))
220
+ .map((line) => line.slice(5).trim())
221
+ .join("\n");
222
+ if (!data)
223
+ continue;
224
+ try {
225
+ candidates.push(JSON.parse(data));
226
+ }
227
+ catch {
228
+ // ignore non-JSON event payloads
229
+ }
230
+ }
231
+ if (id !== undefined) {
232
+ const matched = candidates.find((c) => Number(c.id) === Number(id));
233
+ if (matched)
234
+ return matched;
235
+ }
236
+ return candidates.find((c) => c.result !== undefined || c.error !== undefined) ?? candidates[0] ?? null;
237
+ }
238
+ /** MCP client over Streamable HTTP (POST JSON-RPC; JSON or SSE responses). */
239
+ class McpHttpClient {
240
+ serverName;
241
+ url;
242
+ headers;
243
+ timeoutMs;
244
+ sessionId = null;
245
+ nextId = 1;
246
+ initialized = false;
247
+ constructor(serverName, url, headers, timeoutMs) {
248
+ this.serverName = serverName;
249
+ this.url = url;
250
+ this.headers = headers;
251
+ this.timeoutMs = timeoutMs;
252
+ }
253
+ async rpc(method, params, isNotification = false) {
254
+ const id = isNotification ? undefined : this.nextId++;
255
+ const payload = isNotification
256
+ ? { jsonrpc: "2.0", method, params }
257
+ : { jsonrpc: "2.0", id, method, params };
258
+ const controller = new AbortController();
259
+ const timer = setTimeout(() => controller.abort(), this.timeoutMs);
260
+ let res;
261
+ try {
262
+ res = await fetch(this.url, {
263
+ method: "POST",
264
+ headers: {
265
+ "Content-Type": "application/json",
266
+ Accept: "application/json, text/event-stream",
267
+ ...(this.sessionId ? { "Mcp-Session-Id": this.sessionId } : {}),
268
+ ...this.headers,
269
+ },
270
+ body: JSON.stringify(payload),
271
+ signal: controller.signal,
272
+ });
273
+ }
274
+ finally {
275
+ clearTimeout(timer);
276
+ }
277
+ const sid = res.headers.get("mcp-session-id");
278
+ if (sid)
279
+ this.sessionId = sid;
280
+ if (isNotification) {
281
+ await res.text().catch(() => "");
282
+ return undefined;
283
+ }
284
+ if (!res.ok) {
285
+ const body = await res.text().catch(() => "");
286
+ throw new Error(`HTTP ${res.status} ${res.statusText} ${body.slice(0, 200)}`.trim());
287
+ }
288
+ const contentType = res.headers.get("content-type") ?? "";
289
+ const text = await res.text();
290
+ const message = contentType.includes("text/event-stream")
291
+ ? parseSseJson(text, id)
292
+ : JSON.parse(text);
293
+ if (!message)
294
+ throw new Error(`No JSON-RPC response for ${method}`);
295
+ if (message.error) {
296
+ throw new Error(message.error.message ?? `MCP error ${message.error.code ?? "unknown"}`);
297
+ }
298
+ return message.result;
299
+ }
300
+ async initialize() {
301
+ if (this.initialized)
302
+ return;
303
+ await this.rpc("initialize", {
304
+ protocolVersion: PROTOCOL_VERSION,
305
+ capabilities: {},
306
+ clientInfo: { name: "deepseek-cli", version: "0.1.0" },
307
+ });
308
+ await this.rpc("notifications/initialized", undefined, true);
309
+ this.initialized = true;
310
+ }
311
+ async listTools() {
312
+ await this.initialize();
313
+ const result = await this.rpc("tools/list", {});
314
+ const tools = result?.tools;
315
+ return Array.isArray(tools)
316
+ ? tools.filter((tool) => !!tool && typeof tool.name === "string")
317
+ : [];
318
+ }
319
+ async callTool(name, args) {
320
+ await this.initialize();
321
+ const result = await this.rpc("tools/call", { name, arguments: args });
322
+ return textFromMcpResult(result);
323
+ }
324
+ shutdown() {
325
+ // Stateless HTTP — nothing to tear down.
326
+ }
327
+ }
328
+ function toolFromMcp(client, serverName, remote) {
329
+ const toolName = mcpToolName(serverName, remote.name);
330
+ const description = remote.description || `MCP tool ${remote.name} from ${serverName}`;
331
+ const info = { toolName, serverName, remoteName: remote.name, description };
332
+ const tool = {
333
+ name: toolName,
334
+ description: `[MCP:${serverName}] ${description}`,
335
+ needsApproval: true,
336
+ parameters: remote.inputSchema ?? { type: "object", properties: {} },
337
+ preview(args) {
338
+ const argText = Object.keys(args).length > 0 ? ` ${JSON.stringify(args).slice(0, 160)}` : "";
339
+ return `mcp ${serverName}.${remote.name}${argText}`;
340
+ },
341
+ async run(args) {
342
+ try {
343
+ const output = await client.callTool(remote.name, args);
344
+ return {
345
+ content: output || `(MCP ${serverName}.${remote.name} returned no content)`,
346
+ summary: `mcp ${serverName}.${remote.name}`,
347
+ };
348
+ }
349
+ catch (err) {
350
+ return {
351
+ content: `Error calling MCP tool ${serverName}.${remote.name}: ${err.message}`,
352
+ summary: `mcp ${serverName}.${remote.name} failed`,
353
+ isError: true,
354
+ };
355
+ }
356
+ },
357
+ };
358
+ return { tool, info };
359
+ }
360
+ export async function loadMcpTools(cwd) {
361
+ shutdownMcp();
362
+ loadedInfos = [];
363
+ loadedErrors = [];
364
+ const tools = [];
365
+ const servers = loadConfig(cwd);
366
+ for (const [serverName, config] of Object.entries(servers)) {
367
+ if (!config || config.disabled)
368
+ continue;
369
+ const isHttp = config.type === "http" || config.type === "sse" || (!!config.url && !config.command);
370
+ let client;
371
+ if (isHttp) {
372
+ if (!config.url) {
373
+ loadedErrors.push(`${serverName}: missing url for http transport`);
374
+ continue;
375
+ }
376
+ const timeoutMs = Math.min(Math.max(config.timeoutMs ?? DEFAULT_TIMEOUT_MS, 1000), 600_000);
377
+ client = new McpHttpClient(serverName, config.url, config.headers ?? {}, timeoutMs);
378
+ }
379
+ else {
380
+ if (!config.command) {
381
+ loadedErrors.push(`${serverName}: missing command (or url for http transport)`);
382
+ continue;
383
+ }
384
+ client = new McpStdioClient(serverName, config, cwd);
385
+ }
386
+ clients.set(serverName, client);
387
+ try {
388
+ const remoteTools = await client.listTools();
389
+ for (const remote of remoteTools) {
390
+ const wrapped = toolFromMcp(client, serverName, remote);
391
+ tools.push(wrapped.tool);
392
+ loadedInfos.push(wrapped.info);
393
+ }
394
+ }
395
+ catch (err) {
396
+ loadedErrors.push(`${serverName}: ${err.message}`);
397
+ client.shutdown();
398
+ clients.delete(serverName);
399
+ }
400
+ }
401
+ return { tools, infos: [...loadedInfos], errors: [...loadedErrors] };
402
+ }
403
+ export function shutdownMcp() {
404
+ for (const client of clients.values())
405
+ client.shutdown();
406
+ clients.clear();
407
+ }
408
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { select } from "@inquirer/prompts";
2
+ import { chalk } from "./ui/render.js";
3
+ export function createPermissionManager(opts) {
4
+ const sessionAllow = new Set(opts.preApproved);
5
+ return {
6
+ isAllowed(toolName) {
7
+ return opts.autoApprove || sessionAllow.has(toolName);
8
+ },
9
+ allowForSession(toolName) {
10
+ sessionAllow.add(toolName);
11
+ },
12
+ async request(toolName, previewLine) {
13
+ console.log();
14
+ console.log(chalk.yellow(" ⚠ Permission required") + chalk.dim(` — ${toolName}`));
15
+ console.log(" " + chalk.white(previewLine));
16
+ const decision = await select({
17
+ message: "Allow this action?",
18
+ choices: [
19
+ { name: "Yes, once", value: "approve" },
20
+ { name: `Yes, and don't ask again for ${toolName} this session`, value: "always" },
21
+ { name: "No, and tell the model what to do differently", value: "deny" },
22
+ ],
23
+ });
24
+ if (decision === "always")
25
+ sessionAllow.add(toolName);
26
+ return decision;
27
+ },
28
+ };
29
+ }
30
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAavC,MAAM,UAAU,uBAAuB,CAAC,IAKvC;IACC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS,IAAI,CAAC,WAAW,CAAC,CAAC;IAEvD,OAAO;QACL,SAAS,CAAC,QAAQ;YAChB,OAAO,IAAI,CAAC,WAAW,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxD,CAAC;QACD,eAAe,CAAC,QAAQ;YACtB,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW;YACjC,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC;YACnF,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;YAE7C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAqB;gBAChD,OAAO,EAAE,oBAAoB;gBAC7B,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE;oBACvC,EAAE,IAAI,EAAE,gCAAgC,QAAQ,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE;oBAClF,EAAE,IAAI,EAAE,+CAA+C,EAAE,KAAK,EAAE,MAAM,EAAE;iBACzE;aACF,CAAC,CAAC;YACH,IAAI,QAAQ,KAAK,QAAQ;gBAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtD,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}