claude-sessions 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 (48) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +140 -0
  3. package/data/model-pricing.json +113 -0
  4. package/dist/cost-calculator.d.ts +49 -0
  5. package/dist/cost-calculator.d.ts.map +1 -0
  6. package/dist/cost-calculator.js +429 -0
  7. package/dist/cost-calculator.js.map +1 -0
  8. package/dist/index.d.ts +28 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +65 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/projects-service.d.ts +106 -0
  13. package/dist/projects-service.d.ts.map +1 -0
  14. package/dist/projects-service.js +317 -0
  15. package/dist/projects-service.js.map +1 -0
  16. package/dist/session-cache-store.d.ts +48 -0
  17. package/dist/session-cache-store.d.ts.map +1 -0
  18. package/dist/session-cache-store.js +231 -0
  19. package/dist/session-cache-store.js.map +1 -0
  20. package/dist/session-cache.d.ts +266 -0
  21. package/dist/session-cache.d.ts.map +1 -0
  22. package/dist/session-cache.js +1294 -0
  23. package/dist/session-cache.js.map +1 -0
  24. package/dist/session-parser.d.ts +265 -0
  25. package/dist/session-parser.d.ts.map +1 -0
  26. package/dist/session-parser.js +555 -0
  27. package/dist/session-parser.js.map +1 -0
  28. package/dist/session-reader.d.ts +87 -0
  29. package/dist/session-reader.d.ts.map +1 -0
  30. package/dist/session-reader.js +279 -0
  31. package/dist/session-reader.js.map +1 -0
  32. package/dist/tasks-service.d.ts +100 -0
  33. package/dist/tasks-service.d.ts.map +1 -0
  34. package/dist/tasks-service.js +290 -0
  35. package/dist/tasks-service.js.map +1 -0
  36. package/dist/teams-service.d.ts +30 -0
  37. package/dist/teams-service.d.ts.map +1 -0
  38. package/dist/teams-service.js +85 -0
  39. package/dist/teams-service.js.map +1 -0
  40. package/dist/types.d.ts +87 -0
  41. package/dist/types.d.ts.map +1 -0
  42. package/dist/types.js +7 -0
  43. package/dist/types.js.map +1 -0
  44. package/dist/utils/path-utils.d.ts +80 -0
  45. package/dist/utils/path-utils.d.ts.map +1 -0
  46. package/dist/utils/path-utils.js +355 -0
  47. package/dist/utils/path-utils.js.map +1 -0
  48. package/package.json +42 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects-service.d.ts","sourceRoot":"","sources":["../src/projects-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,317 @@
1
+ "use strict";
2
+ /**
3
+ * Projects Service
4
+ *
5
+ * Comprehensive API for session projects from ~/.claude/projects/
6
+ * Provides:
7
+ * - List all projects
8
+ * - Get project sessions
9
+ * - Get project git info
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.ProjectsService = void 0;
46
+ exports.createProjectsService = createProjectsService;
47
+ const fs = __importStar(require("fs"));
48
+ const path = __importStar(require("path"));
49
+ const child_process_1 = require("child_process");
50
+ const path_utils_1 = require("./utils/path-utils");
51
+ const cost_calculator_1 = require("./cost-calculator");
52
+ const session_cache_1 = require("./session-cache");
53
+ // ============================================================================
54
+ // Service Implementation
55
+ // ============================================================================
56
+ class ProjectsService {
57
+ costCalculator;
58
+ sessionCache;
59
+ constructor(options) {
60
+ this.costCalculator = new cost_calculator_1.CostCalculator();
61
+ this.sessionCache = options?.sessionCache || null;
62
+ }
63
+ /**
64
+ * List all projects with session counts and metadata.
65
+ */
66
+ listProjects(options) {
67
+ const projectsDir = (0, path_utils_1.getProjectsDir)();
68
+ if (!fs.existsSync(projectsDir))
69
+ return [];
70
+ const entries = fs.readdirSync(projectsDir, { withFileTypes: true });
71
+ const projects = [];
72
+ for (const entry of entries) {
73
+ if (!entry.isDirectory())
74
+ continue;
75
+ const projectDir = path.join(projectsDir, entry.name);
76
+ const files = fs.readdirSync(projectDir)
77
+ .filter(f => f.endsWith('.jsonl') && !f.startsWith('agent-'));
78
+ if (files.length === 0)
79
+ continue;
80
+ const decodedPath = (0, path_utils_1.decodePath)(entry.name);
81
+ let lastActivity;
82
+ let totalSize = 0;
83
+ for (const file of files) {
84
+ try {
85
+ const stats = fs.statSync(path.join(projectDir, file));
86
+ if (!lastActivity || stats.mtime > lastActivity) {
87
+ lastActivity = stats.mtime;
88
+ }
89
+ totalSize += stats.size;
90
+ }
91
+ catch {
92
+ // Skip files we can't stat
93
+ }
94
+ }
95
+ const hasClaudeMd = fs.existsSync(path.join(decodedPath, 'CLAUDE.md'));
96
+ const isGitProject = fs.existsSync(path.join(decodedPath, '.git'));
97
+ let git = null;
98
+ if (isGitProject) {
99
+ git = this.getGitInfo(decodedPath);
100
+ }
101
+ projects.push({
102
+ path: decodedPath,
103
+ encodedPath: entry.name,
104
+ sessionCount: files.length,
105
+ lastActivity,
106
+ storageSize: totalSize,
107
+ hasClaudeMd,
108
+ isGitProject,
109
+ git,
110
+ });
111
+ }
112
+ projects.sort((a, b) => {
113
+ const aTime = a.lastActivity?.getTime() || 0;
114
+ const bTime = b.lastActivity?.getTime() || 0;
115
+ return bTime - aTime;
116
+ });
117
+ return projects;
118
+ }
119
+ /**
120
+ * List sessions for a project with detailed metadata.
121
+ */
122
+ listProjectSessions(projectPath, options) {
123
+ const projectKey = (0, path_utils_1.legacyEncodeProjectPath)(projectPath);
124
+ const projectDir = path.join((0, path_utils_1.getProjectsDir)(), projectKey);
125
+ if (!fs.existsSync(projectDir))
126
+ return [];
127
+ const files = fs.readdirSync(projectDir)
128
+ .filter(f => f.endsWith('.jsonl') && !f.startsWith('agent-'));
129
+ const ACTIVE_THRESHOLD_MS = 10 * 60 * 1000; // 10 minutes
130
+ const now = Date.now();
131
+ const sessions = [];
132
+ for (const file of files) {
133
+ const sessionId = file.replace('.jsonl', '');
134
+ const filePath = path.join(projectDir, file);
135
+ let stats;
136
+ try {
137
+ stats = fs.statSync(filePath);
138
+ }
139
+ catch {
140
+ continue;
141
+ }
142
+ const isActive = now - stats.mtime.getTime() < ACTIVE_THRESHOLD_MS;
143
+ if (options?.activeOnly && !isActive)
144
+ continue;
145
+ const session = {
146
+ sessionId,
147
+ projectPath,
148
+ projectKey,
149
+ filePath,
150
+ fileSize: stats.size,
151
+ lastModified: stats.mtime,
152
+ isActive,
153
+ };
154
+ // Enrich from cache if available
155
+ if (this.sessionCache) {
156
+ const cacheData = this.sessionCache.getSessionDataFromMemory(filePath)
157
+ || this.sessionCache.getSessionDataSync(filePath);
158
+ if (cacheData) {
159
+ const realPrompts = cacheData.userPrompts.filter(session_cache_1.isRealUserPrompt);
160
+ session.userPromptCount = realPrompts.length;
161
+ session.taskCount = cacheData.tasks.length;
162
+ session.agentCount = cacheData.subagents.length;
163
+ session.model = cacheData.model;
164
+ session.numTurns = cacheData.numTurns;
165
+ session.forkedFromSessionId = cacheData.forkedFromSessionId;
166
+ session.usage = cacheData.usage;
167
+ session.modelUsage = cacheData.modelUsage;
168
+ // Calculate cost
169
+ session.totalCostUsd = cacheData.totalCostUsd || cacheData.cumulativeCostUsd || 0;
170
+ if (!session.totalCostUsd && cacheData.usage.inputTokens > 0) {
171
+ session.totalCostUsd = this.costCalculator.calculateCost(cacheData.usage, cacheData.model || '').totalCost;
172
+ }
173
+ // Last user message
174
+ const lastPrompt = realPrompts[realPrompts.length - 1];
175
+ if (lastPrompt?.text) {
176
+ const words = lastPrompt.text.split(/\s+/);
177
+ session.lastUserMessage = words.length > 100
178
+ ? words.slice(0, 100).join(' ') + '...'
179
+ : lastPrompt.text;
180
+ }
181
+ }
182
+ }
183
+ sessions.push(session);
184
+ }
185
+ // Sort
186
+ const sortBy = options?.sortBy || 'lastModified';
187
+ const sortOrder = options?.sortOrder || 'desc';
188
+ const multiplier = sortOrder === 'desc' ? -1 : 1;
189
+ sessions.sort((a, b) => {
190
+ switch (sortBy) {
191
+ case 'size':
192
+ return multiplier * (a.fileSize - b.fileSize);
193
+ case 'cost':
194
+ return multiplier * ((a.totalCostUsd || 0) - (b.totalCostUsd || 0));
195
+ default:
196
+ return multiplier * (a.lastModified.getTime() - b.lastModified.getTime());
197
+ }
198
+ });
199
+ // Apply pagination
200
+ const offset = options?.offset || 0;
201
+ const limit = options?.limit || sessions.length;
202
+ return sessions.slice(offset, offset + limit);
203
+ }
204
+ /**
205
+ * Get git info for a project directory.
206
+ */
207
+ getGitInfo(projectPath) {
208
+ if (!fs.existsSync(projectPath))
209
+ return null;
210
+ const execGit = (args) => {
211
+ try {
212
+ return (0, child_process_1.execFileSync)('git', args, {
213
+ cwd: projectPath,
214
+ encoding: 'utf-8',
215
+ timeout: 5000,
216
+ stdio: ['pipe', 'pipe', 'pipe'],
217
+ }).trim();
218
+ }
219
+ catch {
220
+ return null;
221
+ }
222
+ };
223
+ try {
224
+ // Check if inside a git repo
225
+ const topLevel = execGit(['rev-parse', '--is-inside-work-tree']);
226
+ if (topLevel !== 'true')
227
+ return null;
228
+ // Current branch
229
+ let branch = execGit(['rev-parse', '--abbrev-ref', 'HEAD']);
230
+ if (branch === 'HEAD')
231
+ branch = null; // detached HEAD
232
+ // HEAD commit
233
+ const headCommit = execGit(['rev-parse', '--short', 'HEAD']);
234
+ // Check bare repo
235
+ const isBare = execGit(['rev-parse', '--is-bare-repository']) === 'true';
236
+ // Worktree detection
237
+ const gitDir = execGit(['rev-parse', '--git-dir']);
238
+ const isWorktree = gitDir !== null && gitDir.includes('.git/worktrees');
239
+ let mainWorktreePath = null;
240
+ if (isWorktree) {
241
+ mainWorktreePath = execGit(['rev-parse', '--path-format=absolute', '--git-common-dir']);
242
+ if (mainWorktreePath && mainWorktreePath.endsWith('/.git')) {
243
+ mainWorktreePath = mainWorktreePath.slice(0, -5);
244
+ }
245
+ else if (mainWorktreePath && mainWorktreePath.endsWith('\\.git')) {
246
+ mainWorktreePath = mainWorktreePath.slice(0, -5);
247
+ }
248
+ }
249
+ // List worktrees
250
+ const worktrees = [];
251
+ const worktreeOutput = execGit(['worktree', 'list', '--porcelain']);
252
+ if (worktreeOutput) {
253
+ const entries = worktreeOutput.split('\n\n').filter(Boolean);
254
+ for (const entry of entries) {
255
+ const lines = entry.split('\n');
256
+ let wtPath = '';
257
+ let wtBranch = null;
258
+ let wtHead = '';
259
+ for (const line of lines) {
260
+ if (line.startsWith('worktree '))
261
+ wtPath = line.slice(9);
262
+ else if (line.startsWith('HEAD '))
263
+ wtHead = line.slice(5, 12); // short hash
264
+ else if (line.startsWith('branch ')) {
265
+ wtBranch = line.slice(7);
266
+ if (wtBranch.startsWith('refs/heads/'))
267
+ wtBranch = wtBranch.slice(11);
268
+ }
269
+ }
270
+ if (wtPath) {
271
+ const normalizedWtPath = wtPath.replace(/\\/g, '/');
272
+ const normalizedProjectPath = projectPath.replace(/\\/g, '/');
273
+ worktrees.push({
274
+ path: wtPath,
275
+ branch: wtBranch,
276
+ head: wtHead,
277
+ isCurrent: normalizedWtPath === normalizedProjectPath,
278
+ });
279
+ }
280
+ }
281
+ }
282
+ // Remotes
283
+ const remotes = [];
284
+ const remoteOutput = execGit(['remote', '-v']);
285
+ if (remoteOutput) {
286
+ for (const line of remoteOutput.split('\n')) {
287
+ const match = line.match(/^(\S+)\s+(\S+)\s+\((fetch|push)\)/);
288
+ if (match) {
289
+ remotes.push({
290
+ name: match[1],
291
+ url: match[2],
292
+ type: match[3],
293
+ });
294
+ }
295
+ }
296
+ }
297
+ return {
298
+ initialized: true,
299
+ branch,
300
+ isBare,
301
+ isWorktree,
302
+ mainWorktreePath,
303
+ worktrees,
304
+ remotes,
305
+ headCommit,
306
+ };
307
+ }
308
+ catch {
309
+ return null;
310
+ }
311
+ }
312
+ }
313
+ exports.ProjectsService = ProjectsService;
314
+ function createProjectsService(options) {
315
+ return new ProjectsService(options);
316
+ }
317
+ //# sourceMappingURL=projects-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects-service.js","sourceRoot":"","sources":["../src/projects-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Session Cache Store — LMDB-backed storage adapter
3
+ *
4
+ * Replaces the old Memory Map + .cache.gz disk files with a single
5
+ * memory-mapped LMDB database. Reads are synchronous and instant
6
+ * (served directly from mmap'd pages by the OS), writes are async
7
+ * and auto-batched by lmdb-js.
8
+ *
9
+ * Storage layout:
10
+ * ~/.claude-sessions/session-cache/
11
+ * session-cache.lmdb
12
+ * ├── sessions (sub-db) # key: sessionPath → value: SessionCacheData
13
+ * ├── raw (sub-db) # key: sessionPath → value: RawMessagesCache
14
+ * └── meta (sub-db) # key: "stats"|"version" → value: metadata
15
+ */
16
+ import type { SessionCacheData, RawMessagesCache } from './session-cache';
17
+ export declare class SessionCacheStore {
18
+ private env;
19
+ private sessionsDb;
20
+ private rawDb;
21
+ private metaDb;
22
+ private _closed;
23
+ private _path;
24
+ constructor(cacheDir?: string);
25
+ getSessionData(sessionPath: string): SessionCacheData | undefined;
26
+ putSessionData(sessionPath: string, data: SessionCacheData): Promise<void>;
27
+ removeSessionData(sessionPath: string): Promise<void>;
28
+ getRawMessages(sessionPath: string): RawMessagesCache | undefined;
29
+ putRawMessages(sessionPath: string, data: RawMessagesCache): Promise<void>;
30
+ removeRawMessages(sessionPath: string): Promise<void>;
31
+ allSessions(): IterableIterator<{
32
+ key: string;
33
+ value: SessionCacheData;
34
+ }>;
35
+ get sessionCount(): number;
36
+ get rawCount(): number;
37
+ getMeta(key: string): any;
38
+ putMeta(key: string, value: any): Promise<void>;
39
+ clear(sessionPath?: string): Promise<void>;
40
+ compact(): Promise<{
41
+ beforeSize: number;
42
+ afterSize: number;
43
+ }>;
44
+ getPath(): string;
45
+ close(): void;
46
+ get closed(): boolean;
47
+ }
48
+ //# sourceMappingURL=session-cache-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-cache-store.d.ts","sourceRoot":"","sources":["../src/session-cache-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAQ1E,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAAe;IAC1B,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;gBAEV,QAAQ,CAAC,EAAE,MAAM;IA+C7B,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI3D,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1E,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI3D,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1E,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1D,WAAW,IAAI,gBAAgB,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,gBAAgB,CAAA;KAAE,CAAC;IAM1E,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAID,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG;IAInB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU1C,OAAO,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAgDnE,OAAO,IAAI,MAAM;IAIjB,KAAK,IAAI,IAAI;IAOb,IAAI,MAAM,IAAI,OAAO,CAEpB;CACF"}
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ /**
3
+ * Session Cache Store — LMDB-backed storage adapter
4
+ *
5
+ * Replaces the old Memory Map + .cache.gz disk files with a single
6
+ * memory-mapped LMDB database. Reads are synchronous and instant
7
+ * (served directly from mmap'd pages by the OS), writes are async
8
+ * and auto-batched by lmdb-js.
9
+ *
10
+ * Storage layout:
11
+ * ~/.claude-sessions/session-cache/
12
+ * session-cache.lmdb
13
+ * ├── sessions (sub-db) # key: sessionPath → value: SessionCacheData
14
+ * ├── raw (sub-db) # key: sessionPath → value: RawMessagesCache
15
+ * └── meta (sub-db) # key: "stats"|"version" → value: metadata
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.SessionCacheStore = void 0;
52
+ const lmdb_1 = require("lmdb");
53
+ const path = __importStar(require("path"));
54
+ const fs = __importStar(require("fs"));
55
+ const DEFAULT_CACHE_DIR = path.join(process.env.CLAUDE_SESSIONS_CACHE_DIR ||
56
+ path.join(require('os').homedir(), '.claude-sessions'), 'session-cache');
57
+ class SessionCacheStore {
58
+ env;
59
+ sessionsDb;
60
+ rawDb;
61
+ metaDb;
62
+ _closed = false;
63
+ _path;
64
+ constructor(cacheDir) {
65
+ const dir = cacheDir || DEFAULT_CACHE_DIR;
66
+ this._path = dir;
67
+ if (!fs.existsSync(dir)) {
68
+ fs.mkdirSync(dir, { recursive: true });
69
+ }
70
+ // Startup cleanup: if a previous compact flagged for file deletion,
71
+ // delete the old data.mdb before opening LMDB so it creates a fresh file.
72
+ const compactFlag = path.join(dir, '.compact-pending');
73
+ if (fs.existsSync(compactFlag)) {
74
+ const dataFile = path.join(dir, 'data.mdb');
75
+ const lockFile = path.join(dir, 'lock.mdb');
76
+ for (const f of [dataFile, lockFile]) {
77
+ try {
78
+ fs.unlinkSync(f);
79
+ }
80
+ catch { /* ok — may not exist */ }
81
+ }
82
+ try {
83
+ for (const f of fs.readdirSync(dir)) {
84
+ if (f.endsWith('.old')) {
85
+ try {
86
+ fs.unlinkSync(path.join(dir, f));
87
+ }
88
+ catch { /* ok */ }
89
+ }
90
+ }
91
+ }
92
+ catch { /* ok */ }
93
+ try {
94
+ fs.unlinkSync(compactFlag);
95
+ }
96
+ catch { /* ok */ }
97
+ }
98
+ this.env = (0, lmdb_1.open)({
99
+ path: dir,
100
+ compression: true,
101
+ maxDbs: 3,
102
+ mapSize: 2 * 1024 * 1024 * 1024,
103
+ });
104
+ this.sessionsDb = this.env.openDB('sessions', {
105
+ encoding: 'msgpack',
106
+ });
107
+ this.rawDb = this.env.openDB('raw', {
108
+ encoding: 'msgpack',
109
+ });
110
+ this.metaDb = this.env.openDB('meta', {
111
+ encoding: 'msgpack',
112
+ });
113
+ }
114
+ // ─── Session Data ────────────────────────────────────────
115
+ getSessionData(sessionPath) {
116
+ return this.sessionsDb.get(sessionPath);
117
+ }
118
+ async putSessionData(sessionPath, data) {
119
+ await this.sessionsDb.put(sessionPath, data);
120
+ }
121
+ async removeSessionData(sessionPath) {
122
+ await this.sessionsDb.remove(sessionPath);
123
+ }
124
+ // ─── Raw Messages ────────────────────────────────────────
125
+ getRawMessages(sessionPath) {
126
+ return this.rawDb.get(sessionPath);
127
+ }
128
+ async putRawMessages(sessionPath, data) {
129
+ await this.rawDb.put(sessionPath, data);
130
+ }
131
+ async removeRawMessages(sessionPath) {
132
+ await this.rawDb.remove(sessionPath);
133
+ }
134
+ // ─── Iteration ───────────────────────────────────────────
135
+ *allSessions() {
136
+ for (const { key, value } of this.sessionsDb.getRange()) {
137
+ yield { key: key, value };
138
+ }
139
+ }
140
+ get sessionCount() {
141
+ return this.sessionsDb.getCount();
142
+ }
143
+ get rawCount() {
144
+ return this.rawDb.getCount();
145
+ }
146
+ // ─── Meta ────────────────────────────────────────────────
147
+ getMeta(key) {
148
+ return this.metaDb.get(key);
149
+ }
150
+ async putMeta(key, value) {
151
+ await this.metaDb.put(key, value);
152
+ }
153
+ // ─── Housekeeping ────────────────────────────────────────
154
+ async clear(sessionPath) {
155
+ if (sessionPath) {
156
+ await this.sessionsDb.remove(sessionPath);
157
+ await this.rawDb.remove(sessionPath);
158
+ }
159
+ else {
160
+ await this.sessionsDb.clearAsync();
161
+ await this.rawDb.clearAsync();
162
+ }
163
+ }
164
+ async compact() {
165
+ const dataFile = path.join(this._path, 'data.mdb');
166
+ let beforeSize = 0;
167
+ try {
168
+ beforeSize = fs.statSync(dataFile).size;
169
+ }
170
+ catch { /* ok */ }
171
+ await this.sessionsDb.clearAsync();
172
+ await this.rawDb.clearAsync();
173
+ await this.metaDb.clearAsync();
174
+ let deleted = false;
175
+ this.close();
176
+ await new Promise(resolve => setTimeout(resolve, 500));
177
+ try {
178
+ fs.unlinkSync(dataFile);
179
+ try {
180
+ fs.unlinkSync(path.join(this._path, 'lock.mdb'));
181
+ }
182
+ catch { /* ok */ }
183
+ deleted = true;
184
+ }
185
+ catch {
186
+ const compactFlag = path.join(this._path, '.compact-pending');
187
+ fs.writeFileSync(compactFlag, new Date().toISOString());
188
+ }
189
+ try {
190
+ for (const f of fs.readdirSync(this._path)) {
191
+ if (f.endsWith('.old')) {
192
+ try {
193
+ fs.unlinkSync(path.join(this._path, f));
194
+ }
195
+ catch { /* ok */ }
196
+ }
197
+ }
198
+ }
199
+ catch { /* ok */ }
200
+ this._closed = false;
201
+ this.env = (0, lmdb_1.open)({
202
+ path: this._path,
203
+ compression: true,
204
+ maxDbs: 3,
205
+ mapSize: 2 * 1024 * 1024 * 1024,
206
+ });
207
+ this.sessionsDb = this.env.openDB('sessions', { encoding: 'msgpack' });
208
+ this.rawDb = this.env.openDB('raw', { encoding: 'msgpack' });
209
+ this.metaDb = this.env.openDB('meta', { encoding: 'msgpack' });
210
+ let afterSize = 0;
211
+ try {
212
+ afterSize = fs.statSync(dataFile).size;
213
+ }
214
+ catch { /* ok */ }
215
+ return { beforeSize, afterSize };
216
+ }
217
+ getPath() {
218
+ return this._path;
219
+ }
220
+ close() {
221
+ if (!this._closed) {
222
+ this._closed = true;
223
+ this.env.close();
224
+ }
225
+ }
226
+ get closed() {
227
+ return this._closed;
228
+ }
229
+ }
230
+ exports.SessionCacheStore = SessionCacheStore;
231
+ //# sourceMappingURL=session-cache-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-cache-store.js","sourceRoot":"","sources":["../src/session-cache-store.ts"],"names":[],"mappings":"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"}