@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
@@ -0,0 +1,341 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ const ROOT = path.join(os.homedir(), ".deepseek-cli");
6
+ const PLUGINS_DIR = path.join(ROOT, "plugins");
7
+ const REGISTRY_PATH = path.join(ROOT, "plugins.json");
8
+ export function pluginsDir() {
9
+ return PLUGINS_DIR;
10
+ }
11
+ export function pluginDir(name) {
12
+ return path.join(PLUGINS_DIR, name);
13
+ }
14
+ function loadRegistry() {
15
+ try {
16
+ if (fs.existsSync(REGISTRY_PATH)) {
17
+ const parsed = JSON.parse(fs.readFileSync(REGISTRY_PATH, "utf8"));
18
+ if (Array.isArray(parsed.plugins))
19
+ return parsed;
20
+ }
21
+ }
22
+ catch {
23
+ // Corrupt registry: start fresh rather than crashing.
24
+ }
25
+ return { plugins: [] };
26
+ }
27
+ function saveRegistry(registry) {
28
+ fs.mkdirSync(ROOT, { recursive: true });
29
+ fs.writeFileSync(REGISTRY_PATH, JSON.stringify(registry, null, 2), "utf8");
30
+ }
31
+ export function listPlugins() {
32
+ return loadRegistry().plugins.slice().sort((a, b) => a.name.localeCompare(b.name));
33
+ }
34
+ export function findPlugin(name) {
35
+ return loadRegistry().plugins.find((p) => p.name === name);
36
+ }
37
+ /** Skill directories contributed by enabled, installed plugins. */
38
+ export function enabledPluginSkillSources() {
39
+ const sources = [];
40
+ for (const plugin of loadRegistry().plugins) {
41
+ if (!plugin.enabled)
42
+ continue;
43
+ const dir = resolveSkillsDir(pluginDir(plugin.name));
44
+ if (dir && fs.existsSync(dir))
45
+ sources.push({ dir, plugin: plugin.name });
46
+ }
47
+ return sources;
48
+ }
49
+ function isGitSource(source) {
50
+ return (/^https?:\/\//i.test(source) ||
51
+ /^git@/i.test(source) ||
52
+ /^ssh:\/\//i.test(source) ||
53
+ source.endsWith(".git"));
54
+ }
55
+ function deriveNameFromSource(source) {
56
+ const cleaned = source.replace(/\.git$/i, "").replace(/[/\\]+$/, "");
57
+ const base = cleaned.split(/[/\\:]/).filter(Boolean).pop() ?? "plugin";
58
+ return base.toLowerCase().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "") || "plugin";
59
+ }
60
+ function readManifest(dir) {
61
+ const candidates = [
62
+ path.join(dir, "plugin.json"),
63
+ path.join(dir, ".deepseek-plugin", "plugin.json"),
64
+ path.join(dir, "deepseek-plugin.json"),
65
+ ];
66
+ for (const file of candidates) {
67
+ if (!fs.existsSync(file))
68
+ continue;
69
+ try {
70
+ const parsed = JSON.parse(fs.readFileSync(file, "utf8"));
71
+ if (parsed && typeof parsed.name === "string" && parsed.name.trim())
72
+ return parsed;
73
+ }
74
+ catch {
75
+ // try next candidate
76
+ }
77
+ }
78
+ return null;
79
+ }
80
+ function resolveSkillsDir(dir) {
81
+ const manifest = readManifest(dir);
82
+ const rel = manifest?.skills ?? "skills";
83
+ const resolved = path.join(dir, rel);
84
+ return fs.existsSync(resolved) ? resolved : null;
85
+ }
86
+ function countSkillFiles(dir) {
87
+ const skillsDir = resolveSkillsDir(dir);
88
+ if (!skillsDir)
89
+ return 0;
90
+ try {
91
+ return fs.readdirSync(skillsDir).filter((f) => f.endsWith(".md")).length;
92
+ }
93
+ catch {
94
+ return 0;
95
+ }
96
+ }
97
+ function cloneOrCopy(source, dest) {
98
+ if (isGitSource(source)) {
99
+ try {
100
+ execFileSync("git", ["clone", "--depth", "1", source, dest], { stdio: "pipe" });
101
+ }
102
+ catch (err) {
103
+ const detail = err instanceof Error && "stderr" in err ? String(err.stderr) : "";
104
+ throw new Error(`git clone failed: ${detail.trim() || err.message}`);
105
+ }
106
+ }
107
+ else {
108
+ const abs = path.resolve(source);
109
+ if (!fs.existsSync(abs) || !fs.statSync(abs).isDirectory()) {
110
+ throw new Error(`local source is not a directory: ${source}`);
111
+ }
112
+ fs.cpSync(abs, dest, {
113
+ recursive: true,
114
+ filter: (src) => !/(^|[/\\])(\.git|node_modules)([/\\]|$)/.test(src),
115
+ });
116
+ }
117
+ }
118
+ export function installPlugin(source) {
119
+ fs.mkdirSync(PLUGINS_DIR, { recursive: true });
120
+ // Stage into a temp dir so we can read the manifest before committing a name.
121
+ const tmp = path.join(PLUGINS_DIR, `.tmp-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
122
+ try {
123
+ cloneOrCopy(source, tmp);
124
+ const manifest = readManifest(tmp);
125
+ const name = (manifest?.name ?? deriveNameFromSource(source))
126
+ .toLowerCase()
127
+ .replace(/[^a-z0-9_-]+/g, "-")
128
+ .replace(/^-+|-+$/g, "");
129
+ if (!name)
130
+ throw new Error("could not determine a valid plugin name.");
131
+ const registry = loadRegistry();
132
+ if (registry.plugins.some((p) => p.name === name)) {
133
+ throw new Error(`plugin '${name}' is already installed. Remove it first with /plugin remove ${name}.`);
134
+ }
135
+ const dest = pluginDir(name);
136
+ if (fs.existsSync(dest))
137
+ fs.rmSync(dest, { recursive: true, force: true });
138
+ fs.renameSync(tmp, dest);
139
+ const skillCount = countSkillFiles(dest);
140
+ if (!manifest && skillCount === 0) {
141
+ // Not obviously a plugin — roll back to avoid clutter.
142
+ fs.rmSync(dest, { recursive: true, force: true });
143
+ throw new Error("no plugin.json manifest and no skills/ found — does not look like a plugin.");
144
+ }
145
+ const plugin = {
146
+ name,
147
+ version: manifest?.version ?? "0.0.0",
148
+ description: manifest?.description ?? "(no description)",
149
+ source,
150
+ installedAt: new Date().toISOString(),
151
+ enabled: true,
152
+ };
153
+ registry.plugins.push(plugin);
154
+ saveRegistry(registry);
155
+ return { plugin, skillCount };
156
+ }
157
+ finally {
158
+ if (fs.existsSync(tmp))
159
+ fs.rmSync(tmp, { recursive: true, force: true });
160
+ }
161
+ }
162
+ export function removePlugin(name) {
163
+ const registry = loadRegistry();
164
+ const index = registry.plugins.findIndex((p) => p.name === name);
165
+ if (index === -1)
166
+ return false;
167
+ registry.plugins.splice(index, 1);
168
+ saveRegistry(registry);
169
+ const dir = pluginDir(name);
170
+ if (fs.existsSync(dir))
171
+ fs.rmSync(dir, { recursive: true, force: true });
172
+ return true;
173
+ }
174
+ export function setPluginEnabled(name, enabled) {
175
+ const registry = loadRegistry();
176
+ const plugin = registry.plugins.find((p) => p.name === name);
177
+ if (!plugin)
178
+ return false;
179
+ plugin.enabled = enabled;
180
+ saveRegistry(registry);
181
+ return true;
182
+ }
183
+ export function updatePlugin(name) {
184
+ const plugin = findPlugin(name);
185
+ if (!plugin)
186
+ return { updated: false, message: `plugin '${name}' is not installed.` };
187
+ if (!isGitSource(plugin.source)) {
188
+ return { updated: false, message: `plugin '${name}' was installed from a local path; reinstall to update.` };
189
+ }
190
+ const dir = pluginDir(name);
191
+ try {
192
+ execFileSync("git", ["-C", dir, "pull", "--ff-only"], { stdio: "pipe" });
193
+ }
194
+ catch (err) {
195
+ const detail = err instanceof Error && "stderr" in err ? String(err.stderr) : "";
196
+ return { updated: false, message: `git pull failed: ${detail.trim() || err.message}` };
197
+ }
198
+ // Refresh metadata from the manifest after pulling.
199
+ const manifest = readManifest(dir);
200
+ if (manifest) {
201
+ const registry = loadRegistry();
202
+ const entry = registry.plugins.find((p) => p.name === name);
203
+ if (entry) {
204
+ entry.version = manifest.version ?? entry.version;
205
+ entry.description = manifest.description ?? entry.description;
206
+ saveRegistry(registry);
207
+ }
208
+ }
209
+ return { updated: true, message: `plugin '${name}' updated.` };
210
+ }
211
+ export function pluginSkillCount(name) {
212
+ return countSkillFiles(pluginDir(name));
213
+ }
214
+ export function scaffoldPlugin(rawName) {
215
+ const name = rawName
216
+ .toLowerCase()
217
+ .replace(/[^a-z0-9_-]+/g, "-")
218
+ .replace(/^-+|-+$/g, "");
219
+ if (!name)
220
+ throw new Error("plugin name must contain letters or numbers.");
221
+ if (findPlugin(name))
222
+ throw new Error(`plugin '${name}' is already installed.`);
223
+ const dir = pluginDir(name);
224
+ if (fs.existsSync(dir))
225
+ throw new Error(`directory already exists: ${dir}`);
226
+ const skillsDir = path.join(dir, "skills");
227
+ fs.mkdirSync(skillsDir, { recursive: true });
228
+ const manifest = {
229
+ name,
230
+ version: "0.1.0",
231
+ description: `${name} plugin`,
232
+ author: "",
233
+ skills: "skills",
234
+ };
235
+ fs.writeFileSync(path.join(dir, "plugin.json"), JSON.stringify(manifest, null, 2) + "\n", "utf8");
236
+ const title = name
237
+ .split(/[-_]/g)
238
+ .filter(Boolean)
239
+ .map((part) => part[0].toUpperCase() + part.slice(1))
240
+ .join(" ");
241
+ const skillFile = path.join(skillsDir, `${name}.md`);
242
+ const skill = [
243
+ "---",
244
+ `name: ${name}`,
245
+ `description: ${title} skill`,
246
+ "---",
247
+ "",
248
+ `You are the /${name} skill.`,
249
+ "",
250
+ "User input:",
251
+ "{{input}}",
252
+ "",
253
+ "Instructions:",
254
+ "- Describe exactly what this skill should do.",
255
+ "- Mention which files or commands it should inspect when relevant.",
256
+ "- Keep the final answer concise and actionable.",
257
+ "",
258
+ ].join("\n");
259
+ fs.writeFileSync(skillFile, skill, "utf8");
260
+ const registry = loadRegistry();
261
+ registry.plugins.push({
262
+ name,
263
+ version: manifest.version ?? "0.1.0",
264
+ description: manifest.description ?? "",
265
+ source: `scaffold:${dir}`,
266
+ installedAt: new Date().toISOString(),
267
+ enabled: true,
268
+ });
269
+ saveRegistry(registry);
270
+ return { name, dir, skillFile };
271
+ }
272
+ /** The configured marketplace index (URL or local path), or null. */
273
+ export function marketplaceSource() {
274
+ return process.env.DEEPSEEK_PLUGIN_REGISTRY?.trim() || null;
275
+ }
276
+ async function readMarketplaceRaw(src) {
277
+ if (/^https?:\/\//i.test(src)) {
278
+ const controller = new AbortController();
279
+ const timer = setTimeout(() => controller.abort(), 20_000);
280
+ try {
281
+ const res = await fetch(src, {
282
+ signal: controller.signal,
283
+ headers: { "User-Agent": "deepseek-cli/0.1" },
284
+ });
285
+ if (!res.ok)
286
+ throw new Error(`HTTP ${res.status} ${res.statusText}`);
287
+ return await res.text();
288
+ }
289
+ finally {
290
+ clearTimeout(timer);
291
+ }
292
+ }
293
+ return fs.readFileSync(path.resolve(src), "utf8");
294
+ }
295
+ export async function fetchMarketplace() {
296
+ const src = marketplaceSource();
297
+ if (!src) {
298
+ throw new Error("no marketplace configured. Set DEEPSEEK_PLUGIN_REGISTRY to an index.json URL or path.");
299
+ }
300
+ let parsed;
301
+ try {
302
+ parsed = JSON.parse(await readMarketplaceRaw(src));
303
+ }
304
+ catch (err) {
305
+ throw new Error(`could not load marketplace from ${src}: ${err.message}`);
306
+ }
307
+ const list = Array.isArray(parsed) ? parsed : parsed?.plugins;
308
+ if (!Array.isArray(list)) {
309
+ throw new Error("marketplace index must be a JSON array or an object with a 'plugins' array.");
310
+ }
311
+ return list
312
+ .filter((e) => !!e && typeof e.name === "string" && typeof e.source === "string")
313
+ .map((e) => ({
314
+ name: e.name,
315
+ source: e.source,
316
+ description: e.description,
317
+ version: e.version,
318
+ author: e.author,
319
+ }));
320
+ }
321
+ export async function searchMarketplace(query) {
322
+ const all = await fetchMarketplace();
323
+ const q = query.trim().toLowerCase();
324
+ if (!q)
325
+ return all;
326
+ return all.filter((e) => e.name.toLowerCase().includes(q) || (e.description ?? "").toLowerCase().includes(q));
327
+ }
328
+ /** Resolve an install argument to a concrete source (direct URL/path or marketplace name). */
329
+ export async function resolveInstallSource(arg) {
330
+ const trimmed = arg.trim();
331
+ if (isGitSource(trimmed))
332
+ return { source: trimmed, via: "direct" };
333
+ if (fs.existsSync(path.resolve(trimmed)))
334
+ return { source: trimmed, via: "direct" };
335
+ const all = await fetchMarketplace();
336
+ const entry = all.find((e) => e.name.toLowerCase() === trimmed.toLowerCase());
337
+ if (entry)
338
+ return { source: entry.source, via: "marketplace" };
339
+ throw new Error(`'${trimmed}' is not a git URL, local path, or a known marketplace plugin. Try /plugin search.`);
340
+ }
341
+ //# sourceMappingURL=plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export const PROJECT_MEMORY_FILES = ["DEEPSEEK.md", "CLAUDE.md", "AGENTS.md"];
4
+ const ROOT_MARKERS = [
5
+ "package.json",
6
+ ".git",
7
+ "pyproject.toml",
8
+ "Cargo.toml",
9
+ "go.mod",
10
+ "pom.xml",
11
+ "build.gradle",
12
+ "build.gradle.kts",
13
+ ];
14
+ const MAX_MEMORY_CHARS_PER_FILE = 30_000;
15
+ export function findProjectRoot(cwd) {
16
+ let current = path.resolve(cwd);
17
+ while (true) {
18
+ if (ROOT_MARKERS.some((marker) => fs.existsSync(path.join(current, marker)))) {
19
+ return current;
20
+ }
21
+ const parent = path.dirname(current);
22
+ if (parent === current)
23
+ return path.resolve(cwd);
24
+ current = parent;
25
+ }
26
+ }
27
+ function dirsFromRootToCwd(root, cwd) {
28
+ const resolvedRoot = path.resolve(root);
29
+ const resolvedCwd = path.resolve(cwd);
30
+ const relative = path.relative(resolvedRoot, resolvedCwd);
31
+ if (relative.startsWith("..") || path.isAbsolute(relative)) {
32
+ return [resolvedRoot];
33
+ }
34
+ const dirs = [resolvedRoot];
35
+ let current = resolvedRoot;
36
+ for (const part of relative.split(path.sep).filter(Boolean)) {
37
+ current = path.join(current, part);
38
+ dirs.push(current);
39
+ }
40
+ return dirs;
41
+ }
42
+ function readTextFile(file) {
43
+ try {
44
+ const stat = fs.statSync(file);
45
+ if (!stat.isFile())
46
+ return null;
47
+ return fs.readFileSync(file, "utf8");
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ export function findProjectMemoryFiles(cwd) {
54
+ const root = findProjectRoot(cwd);
55
+ const files = [];
56
+ for (const dir of dirsFromRootToCwd(root, cwd)) {
57
+ for (const name of PROJECT_MEMORY_FILES) {
58
+ const file = path.join(dir, name);
59
+ if (fs.existsSync(file))
60
+ files.push(file);
61
+ }
62
+ }
63
+ return { root, files };
64
+ }
65
+ export function loadProjectMemory(cwd) {
66
+ const { root, files } = findProjectMemoryFiles(cwd);
67
+ const sections = [];
68
+ for (const file of files) {
69
+ const raw = readTextFile(file);
70
+ if (!raw)
71
+ continue;
72
+ const relativePath = path.relative(root, file) || path.basename(file);
73
+ const clipped = raw.length > MAX_MEMORY_CHARS_PER_FILE
74
+ ? raw.slice(0, MAX_MEMORY_CHARS_PER_FILE) + "\n...[project instructions truncated]"
75
+ : raw;
76
+ sections.push(`--- ${relativePath} ---\n${clipped.trim()}`);
77
+ }
78
+ return {
79
+ root,
80
+ files,
81
+ content: sections.join("\n\n"),
82
+ };
83
+ }
84
+ export function formatProjectMemoryForPrompt(cwd) {
85
+ const memory = loadProjectMemory(cwd);
86
+ if (!memory.content)
87
+ return "";
88
+ return [
89
+ "Project instructions:",
90
+ "The following files are maintained by the user/project. Follow them when working in this repository.",
91
+ memory.content,
92
+ ].join("\n");
93
+ }
94
+ export function projectMemoryTarget(cwd) {
95
+ return path.join(findProjectRoot(cwd), "DEEPSEEK.md");
96
+ }
97
+ /** Append a quick note under a "## Notes" section in DEEPSEEK.md (creating it if needed). */
98
+ export function appendProjectMemory(cwd, note) {
99
+ const target = projectMemoryTarget(cwd);
100
+ const line = `- ${note.trim()}`;
101
+ let body = fs.existsSync(target) ? fs.readFileSync(target, "utf8") : "# Project Notes\n";
102
+ const idx = body.indexOf("## Notes");
103
+ if (idx === -1) {
104
+ body = body.trimEnd() + "\n\n## Notes\n" + line + "\n";
105
+ }
106
+ else {
107
+ const headerEnd = body.indexOf("\n", idx);
108
+ const insertAt = headerEnd === -1 ? body.length : headerEnd + 1;
109
+ body = body.slice(0, insertAt) + line + "\n" + body.slice(insertAt);
110
+ }
111
+ fs.writeFileSync(target, body, "utf8");
112
+ return target;
113
+ }
114
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ import crypto from "node:crypto";
5
+ const SESSIONS_DIR = path.join(os.homedir(), ".deepseek-cli", "sessions");
6
+ function sessionPath(cwd) {
7
+ const hash = crypto.createHash("sha256").update(path.resolve(cwd)).digest("hex").slice(0, 16);
8
+ return path.join(SESSIONS_DIR, `${hash}.json`);
9
+ }
10
+ export function loadSession(cwd) {
11
+ try {
12
+ const file = sessionPath(cwd);
13
+ if (!fs.existsSync(file))
14
+ return null;
15
+ const raw = fs.readFileSync(file, "utf8");
16
+ const data = JSON.parse(raw);
17
+ // Basic validation.
18
+ if (!data || !Array.isArray(data.messages))
19
+ return null;
20
+ return {
21
+ messages: data.messages,
22
+ totalUsage: data.totalUsage || { promptTokens: 0, completionTokens: 0, totalTokens: 0 },
23
+ contextSummary: typeof data.contextSummary === "string" ? data.contextSummary : null,
24
+ compressedAt: typeof data.compressedAt === "string" ? data.compressedAt : null,
25
+ todos: Array.isArray(data.todos) ? data.todos : [],
26
+ };
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ export function saveSession(cwd, data) {
33
+ try {
34
+ fs.mkdirSync(SESSIONS_DIR, { recursive: true });
35
+ fs.writeFileSync(sessionPath(cwd), JSON.stringify(data, null, 2), "utf8");
36
+ }
37
+ catch {
38
+ // Silently ignore save errors — don't break the UX.
39
+ }
40
+ }
41
+ export function deleteSession(cwd) {
42
+ try {
43
+ const file = sessionPath(cwd);
44
+ if (fs.existsSync(file)) {
45
+ fs.unlinkSync(file);
46
+ return true;
47
+ }
48
+ return false;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ export function sessionsDir() {
55
+ return SESSIONS_DIR;
56
+ }
57
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}